From 4567de815610538e7986b710017507920b80a0bb Mon Sep 17 00:00:00 2001 From: Jason Cooke Date: Tue, 30 Jul 2019 21:22:30 +1200 Subject: [PATCH 001/226] docs: fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f04d2a4..8b480a41 100644 --- a/README.md +++ b/README.md @@ -145,7 +145,7 @@ Using external libraries Since PlotDevice scripts are pure Python, the entirety of the [stdlib](http://docs.python.org/2/library/) and [PyPI](https://pypi.python.org/pypi) -are avaliable to you. In addition, a wide array of PlotDevice Libraries have been contributed +are available to you. In addition, a wide array of PlotDevice Libraries have been contributed by the community to solve more visualization-specific problems. #### Installing PlotDevice Libraries From 9068c04dac0093cd529aa3c9c5ec13563d9e7e6d Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Thu, 23 Jun 2022 15:55:34 -0400 Subject: [PATCH 002/226] get cli running on monterey --- .../English.lproj/PlotDeviceScript.xib | 90 +++++++++---------- app/deps/build.py | 2 +- app/deps/vendor/Makefile | 32 ++----- app/plotdevice | 4 +- plotdevice/__init__.py | 4 +- plotdevice/context.py | 34 +++---- plotdevice/gfx/__init__.py | 2 +- plotdevice/gfx/atoms.py | 7 +- plotdevice/gfx/bezier.py | 6 +- plotdevice/gfx/colors.py | 8 +- plotdevice/gfx/geometry.py | 6 +- plotdevice/gfx/image.py | 6 +- plotdevice/gfx/text.py | 4 +- plotdevice/gfx/typography.py | 2 +- plotdevice/gui/document.py | 14 ++- plotdevice/gui/editor.py | 10 +++ plotdevice/gui/preferences.py | 1 + plotdevice/gui/views.py | 6 ++ plotdevice/gui/widgets.py | 9 +- plotdevice/lib/__init__.py | 2 +- plotdevice/lib/foundry.py | 30 +++---- plotdevice/lib/io.py | 2 +- plotdevice/lib/pathmatics.py | 16 ++-- plotdevice/run/console.py | 10 ++- plotdevice/run/sandbox.py | 2 +- plotdevice/util/__init__.py | 26 +++--- plotdevice/util/readers.py | 10 +-- setup.py | 8 +- tests/drawing.py | 4 +- 29 files changed, 188 insertions(+), 169 deletions(-) diff --git a/app/Resources/English.lproj/PlotDeviceScript.xib b/app/Resources/English.lproj/PlotDeviceScript.xib index 6f6db857..64c0a4aa 100644 --- a/app/Resources/English.lproj/PlotDeviceScript.xib +++ b/app/Resources/English.lproj/PlotDeviceScript.xib @@ -1,8 +1,9 @@ - - + + - + + @@ -18,24 +19,24 @@ - + - + - + - + @@ -46,12 +47,12 @@ - + - - + + @@ -60,18 +61,19 @@ + - + - + @@ -80,16 +82,16 @@ - + - + - + @@ -98,14 +100,14 @@ - + - + @@ -341,11 +344,11 @@ - + - - + @@ -373,7 +376,7 @@ - + @@ -382,7 +385,7 @@ - + @@ -428,7 +431,7 @@ - + @@ -437,7 +440,7 @@ - + @@ -445,11 +448,11 @@ - + - - + @@ -472,7 +475,7 @@ - + @@ -484,11 +487,11 @@ - + - + @@ -500,11 +503,11 @@ - + - + @@ -513,7 +516,7 @@ - + @@ -527,7 +530,7 @@ - + @@ -536,7 +539,7 @@ - - + @@ -562,7 +565,7 @@ - + @@ -571,7 +574,7 @@ - + @@ -580,7 +583,7 @@ - + @@ -589,7 +592,7 @@ - + @@ -598,17 +601,14 @@ - + - - - - + diff --git a/app/deps/build.py b/app/deps/build.py index 398e4fe7..94ee4d91 100644 --- a/app/deps/build.py +++ b/app/deps/build.py @@ -63,7 +63,7 @@ def install_extensions(ext_root): # Copy all build results to plotdevice/lib dir for extension in glob("%s/*/build/lib*"%DEPS): - cmd = 'cp -R -p %s/* %s' % (extension, ext_root) + cmd = 'cp -pR %s/* %s' % (extension, ext_root) result = call(cmd, shell=True) if result > 0: lib_name = dirname(dirname(extension)) diff --git a/app/deps/vendor/Makefile b/app/deps/vendor/Makefile index b1879f53..881ad659 100644 --- a/app/deps/vendor/Makefile +++ b/app/deps/vendor/Makefile @@ -1,15 +1,11 @@ # interpretter info gathered from $PYTHON environment variable -PYTHON ?= /usr/bin/python +PYTHON ?= python3 PY_VERSION = $(shell $(PYTHON) -c 'import sys; print("py%i%i"%sys.version_info[:2])') # dependencies to be fetched HTTP_MODULES = requests cachecontrol lockfile -VENV_VERSION = 13.1.0 -VENV_SRC = virtualenv-$(VENV_VERSION).tar.gz -VENV_URL = https://pypi.python.org/packages/source/v/virtualenv/$(VENV_SRC) - -OBJC_VERSION = 3.0.4 +OBJC_VERSION = 8.5 OBJC_SRC = pyobjc-$(OBJC_VERSION)-$(PY_VERSION).tar.gz OBJC_URL = http://plotdevice.io/wheelhouse/$(OBJC_SRC) @@ -23,8 +19,8 @@ HTTP = $(DSTROOT)/$(firstword $(HTTP_MODULES)) # commands CURL = @curl -L --progress-bar -f -VIRTUALENV = $(BUILD)/virtualenv-$(VENV_VERSION)/virtualenv.py -PIP = $(ENV)/bin/pip --isolated -q install +# VIRTUALENV = $(BUILD)/virtualenv-$(VENV_VERSION)/virtualenv.py +PIP = $(ENV)/bin/pip3 --isolated # ---------------------------------------------------------------------------------------- # @@ -52,22 +48,11 @@ wheels: clean $(ENV) # ---------------------------------------------------------------------------------------- # -# fetch the current version of virtualenv (which we mostly use for its copy of pip) -$(VENV_SRC): - @echo $(VENV_URL) - $(CURL) $(VENV_URL) -o $@ - # fetch the cached wheelhouse archive from plotdevice.io (or build it if necessary) $(OBJC_SRC): @echo $(OBJC_URL) -$(CURL) $(OBJC_URL) -o $@ || $(MAKE) wheels -# unpack the virtualenv sdist in the build dir -$(VIRTUALENV): $(VENV_SRC) - @mkdir -p $(BUILD) - tar xzf $(VENV_SRC) -C $(BUILD) - touch $@ - # unpack the archived wheels in the build dir $(WHEELHOUSE): $(OBJC_SRC) @mkdir -p $(BUILD) @@ -75,14 +60,15 @@ $(WHEELHOUSE): $(OBJC_SRC) touch $@ # create a virtual environment at build/env -$(ENV): $(VIRTUALENV) - $(PYTHON) $(VIRTUALENV) -q $@ +$(ENV): + $(PYTHON) -m venv $@ + $(PIP) install --upgrade pip # create a sitedir from the contents of build/wheelhouse $(PYOBJC): $(WHEELHOUSE) $(ENV) - $(PIP) --target=$@ --no-index --find-links=$(WHEELHOUSE) "pyobjc" + $(PIP) install --target=$@ --no-index --find-links=$(WHEELHOUSE) "pyobjc" # fetch the current versions of our helper modules $(HTTP): $(ENV) - $(PIP) --target=$(DSTROOT) $(HTTP_MODULES) + $(PIP) install --target=$(DSTROOT) $(HTTP_MODULES) rm -rf $(DSTROOT)/*.dist-info diff --git a/app/plotdevice b/app/plotdevice index b54d91b1..53085c71 100755 --- a/app/plotdevice +++ b/app/plotdevice @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # encoding: utf-8 """ plotdevice.py @@ -149,7 +149,7 @@ def parse_args(): # if it's a multiframe pdf, check for a telltale "{n}" to determine whether # it's a `single' doc or a sequence of numbered pdf files - opts.single = bool(opts.first= set(kwargs) and len(args)>1 and all(Color.recognized(c) for c in args): bg = Gradient(*args, **kwargs) @@ -274,7 +274,7 @@ def moveto(self, *coords): """ (x,y) = parse_coords(coords, [Point]) if self._path is None: - raise DeviceError, "No active path. Use bezier() or beginpath() first." + raise DeviceError("No active path. Use bezier() or beginpath() first.") self._path.moveto(x,y) def lineto(self, *coords, **kwargs): @@ -288,7 +288,7 @@ def lineto(self, *coords, **kwargs): close = kwargs.pop('close', False) (x,y) = parse_coords(coords, [Point]) if self._path is None: - raise DeviceError, "No active path. Use bezier() or beginpath() first." + raise DeviceError("No active path. Use bezier() or beginpath() first.") self._path.lineto(x, y) if close: self._path.closepath() @@ -308,7 +308,7 @@ def curveto(self, *coords, **kwargs): (x1,y1), (x2,y2), (x3,y3) = parse_coords(coords, [Point,Point,Point]) if self._path is None: - raise DeviceError, "No active path. Use bezier() or beginpath() first." + raise DeviceError("No active path. Use bezier() or beginpath() first.") self._path.curveto(x1, y1, x2, y2, x3, y3) if close: self._path.closepath() @@ -346,7 +346,7 @@ def arcto(self, *coords, **kwargs): (x1,y1) = parse_coords(coords, [Point]) if self._path is None: - raise DeviceError, "No active path. Use bezier() or beginpath() first." + raise DeviceError("No active path. Use bezier() or beginpath() first.") self._path.arcto(x1, y1, x2, y2, radius, ccw) if close: self._path.closepath() @@ -509,14 +509,14 @@ def beginpath(self, x=None, y=None): def closepath(self): if self._path is None: - raise DeviceError, "No active path. Use bezier() or beginpath() first." + raise DeviceError("No active path. Use bezier() or beginpath() first.") if not self._pathclosed: self._path.closepath() self._pathclosed = True def endpath(self, **kwargs): if self._path is None: - raise DeviceError, "No active path. Use bezier() or beginpath() first." + raise DeviceError("No active path. Use bezier() or beginpath() first.") if self._autoclosepath: self.closepath() p = self._path @@ -558,8 +558,8 @@ def pop(self): try: self._transform = Transform(self._transformstack[0]) del self._transformstack[0] - except IndexError, e: - raise DeviceError, "pop: too many pops!" + except IndexError as e: + raise DeviceError("pop: too many pops!") def transform(self, mode=None, matrix=None): """Change the transform mode or begin a `with`-statement-scoped set of transformations @@ -797,7 +797,7 @@ def fill(self, *args, **kwargs): if isinstance(args[0], Image): clr = Pattern(args[0]) self.canvas.clear(args[0]) - elif isinstance(args[0],basestring) and (args[0].startswith('http') or exists(expanduser(args[0]))): + elif isinstance(args[0],str) and (args[0].startswith('http') or exists(expanduser(args[0]))): clr = Pattern(args[0]) elif set(Gradient.kwargs) >= set(kwargs) and len(args)>1 and all(Color.recognized(c) for c in args): clr = Gradient(*args, **kwargs) @@ -882,7 +882,7 @@ def capstyle(self, style=None): """Legacy command. Equivalent to: pen(caps=style)""" if style is not None: if style not in (BUTT, ROUND, SQUARE): - raise DeviceError, 'Line cap style should be BUTT, ROUND or SQUARE.' + raise DeviceError('Line cap style should be BUTT, ROUND or SQUARE.') self._penstyle = self._penstyle._replace(cap=style) return self._penstyle.cap @@ -890,7 +890,7 @@ def joinstyle(self, style=None): """Legacy command. Equivalent to: pen(joins=style)""" if style is not None: if style not in (MITER, ROUND, BEVEL): - raise DeviceError, 'Line join style should be MITER, ROUND or BEVEL.' + raise DeviceError('Line join style should be MITER, ROUND or BEVEL.') self._penstyle = self._penstyle._replace(join=style) return self._penstyle.join @@ -1478,7 +1478,7 @@ def export(self, fname, fps=None, loop=None, bitrate=1.0, cmyk=False): To export a movie: with export('anim.mov', fps=30, bitrate=1.8) as movie: - for i in xrange(100): + for i in range(100): with movie.frame: ... # draw the next frame @@ -1537,7 +1537,7 @@ def measure(self, obj=None, width=None, height=None, **kwargs): If `obj` if a file() object, PlotDevice will treat it as an image file and return its pixel dimensions. """ - if isinstance(obj, basestring): + if isinstance(obj, str): obj = Text(obj, 0, 0, width, height, **kwargs) if hasattr(obj, 'metrics'): @@ -1711,8 +1711,8 @@ def pop(self): try: del self._stack[0] self._container = self._stack[0] - except IndexError, e: - raise DeviceError, "pop: too many canvas pops!" + except IndexError as e: + raise DeviceError("pop: too many canvas pops!") def draw(self): if self.background is not None: diff --git a/plotdevice/gfx/__init__.py b/plotdevice/gfx/__init__.py index 3c9f45ee..aac4d80f 100644 --- a/plotdevice/gfx/__init__.py +++ b/plotdevice/gfx/__init__.py @@ -43,7 +43,7 @@ def _cg_port(): for module in modules: ns.update( (a,getattr(module,a)) for a in module.__all__ ) globals().update(ns) -__all__ = ns.keys() +__all__ = list(ns.keys()) # called by a Context to do the dependency injection™ def bind(ctx): diff --git a/plotdevice/gfx/atoms.py b/plotdevice/gfx/atoms.py index 12079a27..1a55fc04 100644 --- a/plotdevice/gfx/atoms.py +++ b/plotdevice/gfx/atoms.py @@ -59,9 +59,8 @@ def __init__(cls, name, bases, dct): for attr, val in info.items(): setattr(cls, attr, val) -class Grob(object): +class Grob(object, metaclass=Bequest): """A GRaphic OBject is the base class for all drawing primitives.""" - __metaclass__ = Bequest ctxAttrs = ('_grid',) def __init__(self, **kwargs): @@ -167,7 +166,7 @@ def __init__(self, **kwargs): x, y = kwargs.get('x',0), kwargs.get('y',0) h = kwargs.get('h',kwargs.get('height',None)) w = kwargs.get('w',kwargs.get('width',None)) - if isinstance(w, basestring): + if isinstance(w, str): w = None # ignore width if it's passing a font style self._frame = Region(x,y,w,h) @@ -339,7 +338,7 @@ def __init__(self, **kwargs): super(StyleMixin, self).__init__(**kwargs) # ignore `width` if it's a column-width rather than typeface width - if not isinstance(kwargs.get('width', ''), basestring): + if not isinstance(kwargs.get('width', ''), str): kwargs = dict(kwargs) del kwargs['width'] diff --git a/plotdevice/gfx/bezier.py b/plotdevice/gfx/bezier.py index 47d8b209..2baed96b 100644 --- a/plotdevice/gfx/bezier.py +++ b/plotdevice/gfx/bezier.py @@ -216,7 +216,7 @@ def poly(self, x, y, radius, sides=4, points=None): # rotate the origin slightly so the polygon sits on an edge theta = pi/2 + (0 if sides%2 else 1*pi/sides) - angles = [2*pi * i/sides - theta for i in xrange(sides)] + angles = [2*pi * i/sides - theta for i in range(sides)] # walk around the circle adding points with proper scale/origin points = [ [radius*cos(theta)+x, radius*sin(theta)+y] for theta in angles] @@ -298,7 +298,7 @@ def arrow(self, x, y, width=100, type=NORMAL): def __getitem__(self, index): if isinstance(index, slice): # slice-based access - pts = [self._nsBezierPath.elementAtIndex_associatedPoints_(i) for i in xrange(*index.indices(len(self)))] + pts = [self._nsBezierPath.elementAtIndex_associatedPoints_(i) for i in range(*index.indices(len(self)))] return [Curve(cmd, el) for cmd,el in pts] else: # index-based access @@ -498,7 +498,7 @@ def points(self, amount=100): count = int(amount) # make sure we don't choke on a float delta = 1.0/max(1, count-1) # div by count-1 so the last point is at t=1.0 - for i in xrange(count): + for i in range(count): yield pathmatics.point(self, delta*i) def addpoint(self, t): diff --git a/plotdevice/gfx/colors.py b/plotdevice/gfx/colors.py index 4754e5fa..eb094147 100644 --- a/plotdevice/gfx/colors.py +++ b/plotdevice/gfx/colors.py @@ -54,7 +54,7 @@ def __init__(self, *args, **kwargs): return elif params == 1 and isinstance(args[0], NSColor): # NSColor object clr = args[0] - elif params>=1 and isinstance(args[0], basestring): + elif params>=1 and isinstance(args[0], str): r, g, b, a = Color._parse(args[0]) # Hex string or named color if args[1:]: a = args[1] @@ -300,7 +300,7 @@ def recognized(cls, blob): if isinstance(blob, Color): return True - valid_str = lambda s: isinstance(s, basestring) and (s.strip() in _CSS_COLORS or \ + valid_str = lambda s: isinstance(s, str) and (s.strip() in _CSS_COLORS or \ re.match(r'#?[a-z0-9]{3,8}$', s.strip()) ) if isinstance(blob, (tuple, list)): demoded = [b for b in blob if b not in (RGB,HSV,CMYK,GREY)] @@ -312,7 +312,7 @@ def recognized(cls, blob): return True if len(demoded)==2 and numlike(demoded[1]): return True - elif isinstance(blob, basestring): + elif isinstance(blob, str): return valid_str(blob) @classmethod @@ -351,7 +351,7 @@ def __init__(self, img): self._nsColor = img._nsColor else: from .image import Image - img = Image(img) if isinstance(img, basestring) else img + img = Image(img) if isinstance(img, str) else img self._nsColor = NSColor.colorWithPatternImage_(img._nsImage) # fill() and stroke() both cache the previous canvas state by creating a _rollback attr. diff --git a/plotdevice/gfx/geometry.py b/plotdevice/gfx/geometry.py index a35fed40..736ab991 100644 --- a/plotdevice/gfx/geometry.py +++ b/plotdevice/gfx/geometry.py @@ -254,7 +254,7 @@ def _parse(self, coords): # try to unpack a full rect or at least an origin from the args try: self.origin, self.size = parse_coords(coords, [Point,Size]) - except Exception, e_orig: + except Exception as e_orig: try: self.origin, self.width = parse_coords(coords, [Point,float]) except: @@ -265,7 +265,7 @@ def _parse(self, coords): @trim_zeroes def __repr__(self): - vals = [getattr(self, attr) for attr in 'x','y','w','h'] + vals = [getattr(self, attr) for attr in ('x','y','w','h')] dims = ["%.3f"%d if numlike(d) else repr(d) for d in vals] return 'Region(x=%s, y=%s, w=%s, h=%s)' % tuple(dims) @@ -390,7 +390,7 @@ def parse_coords(coords, types): objs = [] # splice in a Point + Size for any Regions passed in the args - for i in xrange(len(stream)-1,-1,-1): + for i in range(len(stream)-1,-1,-1): if isinstance(stream[i], Region): stream[i:i+1] = [stream[i].origin, stream[i].size] diff --git a/plotdevice/gfx/image.py b/plotdevice/gfx/image.py index 321d2cc5..833edcca 100644 --- a/plotdevice/gfx/image.py +++ b/plotdevice/gfx/image.py @@ -70,7 +70,7 @@ def __init__(self, *args, **kwargs): self._nsImage.setFlipped_(True) elif hasattr(src, '_nsImage'): self._nsImage = src._nsImage - elif isinstance(src, basestring): + elif isinstance(src, str): self._nsImage = self._lazyload(path=src) else: invalid = "Not a valid image source: %r" % type(src) @@ -342,7 +342,7 @@ def frame(self): files. For example, to generate 'output-0001.png' through 'output-0100.png': with export('output.png') as seq: - for i in xrange(100): + for i in range(100): with seq.frame: ... # draw the next image in the sequence @@ -351,7 +351,7 @@ def frame(self): generate files named '01-output.png' through '100-output.png': with export('{2}-output.png') as seq: - for i in xrange(100): + for i in range(100): with seq.frame: ... # draw the next image in the sequence """ diff --git a/plotdevice/gfx/text.py b/plotdevice/gfx/text.py index 62febf87..31f8adff 100644 --- a/plotdevice/gfx/text.py +++ b/plotdevice/gfx/text.py @@ -68,7 +68,7 @@ def __init__(self, *args, **kwargs): self._nodes = {} # look for a string as the first positional arg or an xml/str kwarg - if args and isinstance(args[0], basestring): + if args and isinstance(args[0], str): kwargs['str'], args = args[0], args[1:] # merge in any numlike positional args to define bounds @@ -130,7 +130,7 @@ def append(self, txt=None, **kwargs): if txt is not None and not attrib_txt: # convert non-textual `str` args to strings - if not isinstance(txt, basestring) and not is_xml: + if not isinstance(txt, str) and not is_xml: txt = repr(txt) # try to insulate people from the need to use a unicode constant for any text diff --git a/plotdevice/gfx/typography.py b/plotdevice/gfx/typography.py index b4f76217..9d660c96 100644 --- a/plotdevice/gfx/typography.py +++ b/plotdevice/gfx/typography.py @@ -370,7 +370,7 @@ def style(self, name, *args, **kwargs): spec.update(fontspec(*args, **kwargs)) color = kwargs.get('fill') if color and not isinstance(color, Color): - if isinstance(color, (basestring, int, float, long)): + if isinstance(color, (str, int, float, long)): color = (color,) color = Color(*color) if color: diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index 8dee70c6..aa6e6c6f 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -5,6 +5,7 @@ import traceback import random import time +import objc from io import open from objc import super @@ -128,6 +129,7 @@ class ScriptController(NSWindowController): # .path def _get_path(self): return self.vm.path + @objc.python_method def _set_path(self, pth): self.vm.path = pth path = property(_get_path, _set_path) @@ -135,6 +137,7 @@ def _set_path(self, pth): # .source def _get_source(self): return self.editorView.source if self.editorView else self.vm.source + @objc.python_method def _set_source(self, src): self.vm.source = src if self.editorView: @@ -187,7 +190,8 @@ def awakeFromNib(self): # place the statusView in the title bar frame = win.frame() - win.contentView().superview().addSubview_(self.statusView) + # win.contentView().superview().addSubview_(self.statusView) + win.contentView().addSubview_(self.statusView) self.statusView.setFrame_( ((frame.size.width-104,frame.size.height-22), (100,22)) ) # sign up for autoresume on quit-and-relaunch (but only if this isn't console.py) @@ -393,6 +397,7 @@ def step(self): if not ok: self.stopScript() + @objc.python_method def invoke(self, method): """Call a method defined in the script's global namespace and update the ui appropriately @@ -416,7 +421,7 @@ def invoke(self, method): if result.ok and redraw: try: self.currentView.setCanvas(self.vm.canvas) - except DeviceError, e: + except DeviceError as e: return self.crash() if not result.ok and method in (None, "setup"): self.stopScript() @@ -425,6 +430,7 @@ def invoke(self, method): return result.ok + @objc.python_method def echo(self, output): """Pass a list of (isStdErr, txt) tuples to the output window""" for isErr, data in output: @@ -470,6 +476,7 @@ def exportAsMovie_(self, sender): return NSBeep() self.exportSheet.beginExport('movie') + @objc.python_method def exportInit(self, kind, fname, opts): """Begin actual export (invoked by self.exportSheet unless sheet was cancelled)""" if self.animationTimer is not None: @@ -493,6 +500,7 @@ def exportInit(self, kind, fname, opts): self.vm.source = self.source self.vm.export(kind, fname, opts) + @objc.python_method def exportFrame(self, status, canvas=None): """Handle a newly rendered frame (and any console output it generated)""" if status.output: @@ -503,11 +511,13 @@ def exportFrame(self, status, canvas=None): # blit the canvas to the graphics view ^ (but only every other frame) self.currentView.setCanvas(canvas) + @objc.python_method def exportProgress(self, written, total, cancelled): """Update the progress meter in the StatusView (invoked by self.vm.session)""" if self.statusView: self.statusView.updateExport_total_(written, total) + @objc.python_method def exportStatus(self, event): """Handle an export-lifecycle event (invoked by self.vm.session)""" diff --git a/plotdevice/gui/editor.py b/plotdevice/gui/editor.py index 418a1999..483ce3df 100644 --- a/plotdevice/gui/editor.py +++ b/plotdevice/gui/editor.py @@ -3,6 +3,7 @@ import re import json import cgi +import objc from io import open from objc import super from pprint import pprint @@ -183,6 +184,8 @@ def mouseExited_(self, e): def _get_source(self): return self.webview.stringByEvaluatingJavaScriptFromString_('editor.source();') + + @objc.python_method def _set_source(self, src): self.js(u'editor.source', args(src)) source = property(_get_source, _set_source) @@ -209,6 +212,7 @@ def blur(self): def clearErrors(self): self.js('editor.mark', args(None)) + @objc.python_method def report(self, crashed, script): if not crashed: self.js('editor.mark', args(None)) @@ -217,6 +221,7 @@ def report(self, crashed, script): err_lines = [line-1 for fn, line, env, src in reversed(traceback) if fn==script] self.js('editor.mark', args("\n".join(exc), err_lines)) + @objc.python_method def js(self, cmd, args=''): op = '%s(%s);'%(cmd,args) if self._wakeup: @@ -298,6 +303,7 @@ def cancelRun(self): menu = mm.itemWithTitle_("Python") menu.submenu().performActionForItemAtIndex_(3) + @objc.python_method def edits(self, count): # inform the undo manager of the changes um = self._undo_mgr @@ -316,6 +322,7 @@ def edits(self, count): def syncUndoState_(self, count): pass # this would be useful if only it got called for redo as well as undo... + @objc.python_method def setSearchPasteboard(self, query): if not query: return @@ -324,6 +331,7 @@ def setSearchPasteboard(self, query): pb.setString_forType_(query, NSStringPboardType) self.flash("Edit") + @objc.python_method def flash(self, menuname): # when a menu item's key command was entered in the editor, flash the menu # bar to give a hint of where the command lives @@ -407,6 +415,7 @@ def _attrs(self, stream=None): def changeColor_(self, clr): pass # ignore system color panel + @objc.python_method def append(self, txt, stream='message'): if not txt: return defer_endl = txt.endswith(u'\n') @@ -428,6 +437,7 @@ def clear(self, timestamp=False): timestamp = NSDate.date().descriptionWithCalendarFormat_timeZone_locale_("%Y-%m-%d %H:%M:%S", None, locale) self.append(timestamp+"\n", 'info') + @objc.python_method def report(self, crashed, frames): if not hasattr(self, '_begin'): return diff --git a/plotdevice/gui/preferences.py b/plotdevice/gui/preferences.py index 4e6a098f..8e0c7e29 100644 --- a/plotdevice/gui/preferences.py +++ b/plotdevice/gui/preferences.py @@ -110,6 +110,7 @@ def awakeFromNib(self): self.checkBindings() self.checkUpdater() + @objc.python_method def _notify(self, notification): nc = NSNotificationCenter.defaultCenter() nc.postNotificationName_object_(notification, None) diff --git a/plotdevice/gui/views.py b/plotdevice/gui/views.py index 1229afe0..a70c888e 100644 --- a/plotdevice/gui/views.py +++ b/plotdevice/gui/views.py @@ -2,6 +2,7 @@ import sys import os import traceback +import objc from ..lib.cocoa import * from ..gfx import Color @@ -102,6 +103,7 @@ def awakeFromNib(self): self.setFrameSize_(self.placeholder.size()) self.layer().setContents_(self.placeholder) + @objc.python_method def setCanvas(self, canvas): # set the scroller color based on the background bg = canvas.background @@ -143,11 +145,14 @@ def setCanvas(self, canvas): def _get_zoom(self): return self._zoom + + @objc.python_method def _set_zoom(self, zoom): self._zoom = zoom self.setCanvas(self.canvas) zoom = property(_get_zoom, _set_zoom) + @objc.python_method def findNearestZoomIndex(self, zoom): """Returns the nearest zoom level, and whether we found a direct, exact match or a fuzzy match.""" @@ -265,6 +270,7 @@ def init(self): # self.wheeldelta = 0.0 return self + @objc.python_method def setCanvas(self, canvas): self.canvas = canvas self.setNeedsDisplay_(True) diff --git a/plotdevice/gui/widgets.py b/plotdevice/gui/widgets.py index 61332865..520b1eaf 100644 --- a/plotdevice/gui/widgets.py +++ b/plotdevice/gui/widgets.py @@ -109,11 +109,12 @@ def booleanChanged_(self, sender): self.script.runScript() def buttonClicked_(self, sender): - print "out of service" + print("out of service") # var = self.script.vm.vars[sender.tag()] # self.script.vm.call(var.name) # self.script.runScript() + @objc.python_method def buildInterface(self, vars): self.vars = vars self.clearInterface() @@ -149,6 +150,7 @@ def buildInterface(self, vars): cnt += 1 self.panel.setFrame_display_animate_( ((px,py),(pw,ph)), True, True ) + @objc.python_method def _addLabel(self, v, y, cnt): control = NSTextField.alloc().init() control.setFrame_(((0,y),(100,13))) @@ -161,6 +163,7 @@ def _addLabel(self, v, y, cnt): control.setTextColor_(NSColor.whiteColor()) self.panel.contentView().addSubview_(control) + @objc.python_method def _addSlider(self, v, y, cnt): control = NSSlider.alloc().init() control.setMaxValue_(v.max) @@ -175,6 +178,7 @@ def _addSlider(self, v, y, cnt): control.setAction_(objc.selector(self.numberChanged_, signature="v@:@@")) self.panel.contentView().addSubview_(control) + @objc.python_method def _addTextField(self, v, y, cnt): control = NSTextField.alloc().init() control.setStringValue_(v.value) @@ -187,6 +191,7 @@ def _addTextField(self, v, y, cnt): control.setAction_(objc.selector(self.textChanged_, signature="v@:@@")) self.panel.contentView().addSubview_(control) + @objc.python_method def _addSwitch(self, v, y, cnt): control = NSButton.alloc().init() control.setButtonType_(NSSwitchButton) @@ -209,6 +214,7 @@ def _addSwitch(self, v, y, cnt): control.setAction_(objc.selector(self.booleanChanged_, signature="v@:@@")) self.panel.contentView().addSubview_(control) + @objc.python_method def _addButton(self, v, y, cnt): control = NSButton.alloc().init() control.setFrame_(((108, y-2),(172,16))) @@ -249,6 +255,7 @@ def awakeFromNib(self): self.last = None + @objc.python_method def beginExport(self, kind): # configure the accessory controls if kind=='image': diff --git a/plotdevice/lib/__init__.py b/plotdevice/lib/__init__.py index b62eca3f..74410c37 100644 --- a/plotdevice/lib/__init__.py +++ b/plotdevice/lib/__init__.py @@ -7,7 +7,7 @@ if not glob('%s/*.so'%dirname(__file__)): sys.path.append(abspath('%s/../../build/lib/'%dirname(__file__))) sys.path.append(abspath('%s/plotdevice/lib'%sys.path[-1])) - import io, pathmatics, foundry # make sure the c-extensions are accessible + from . import io, pathmatics, foundry # make sure the c-extensions are accessible except ImportError: missing = "Missing C extensions (cPathmatics.so & friends) in %s" % abspath(dirname(__file__)) raise ImportError(missing) diff --git a/plotdevice/lib/foundry.py b/plotdevice/lib/foundry.py index ab0783f5..3a790466 100644 --- a/plotdevice/lib/foundry.py +++ b/plotdevice/lib/foundry.py @@ -6,7 +6,7 @@ import difflib from operator import itemgetter, attrgetter from collections import namedtuple, OrderedDict as odict, defaultdict as ddict -from .cocoa import * +from cocoa import * from ..util import numlike import cFoundry @@ -100,10 +100,10 @@ def font_axes(*args, **kwargs): # validate the weight and width args (if any) if 'weight' in spec and not weighty(spec['weight']): - print 'Font: unknown weight "%s"' % spec.pop('weight') + print('Font: unknown weight "%s"' % spec.pop('weight')) if spec.get('width') is not None and not widthy(spec['width']): - print 'Font: unknown width "%s"' % spec.pop('width') + print('Font: unknown width "%s"' % spec.pop('width')) # look for a postscript name passed as `face` or `fontname` and validate it if basis and not font_exists(basis): @@ -122,7 +122,7 @@ def font_axes(*args, **kwargs): # existing Font object for k,v in item._spec.items(): spec.setdefault(k,v) - elif isinstance(item, basestring): + elif isinstance(item, str): # name-like values item = item.decode('utf-8') if isinstance(item,char_type) else item if fammy(item): @@ -396,7 +396,7 @@ def facey(word): return word in _fm.availableFonts() or NSFont.fontWithName_size_(word,9) def widthy(word): - return sanitized(word) in wid_corpus+wid_abbrevs.keys() + return sanitized(word) in wid_corpus + list(wid_abbrevs.keys()) def weighty(word): return sanitized(word) in wgt_corpus @@ -430,7 +430,7 @@ def standardized(axis, val): for i,names in enumerate(std_weights): if weight in names: return weight.title(), i - print weight, 'not in', std_weights + print(weight, 'not in', std_weights) elif axis=='width': width = sanitized(val) width = sanitized(wid_abbrevs.get(width, width)) @@ -442,22 +442,22 @@ def standardized(axis, val): idx += 0 if idx<0 else 1 return width.title(), idx else: - print [width],"not in", wid_corpus + print([width],"not in", wid_corpus) def parse_display_name(dname): """Try to extract style attributes from the font's display name""" # break the string on spaces and on lc/uc transitions - elts = filter(None, re.sub(r'(?<=[^ ])([A-Z][a-z]+)',r' \1',dname).split(' ')) + elts = list(filter(None, re.sub(r'(?<=[^ ])([A-Z][a-z]+)',r' \1',dname).split(' '))) # disregard the first italic-y word in the name (if any) - for i in xrange(len(elts)-1,-1,-1): + for i in range(len(elts)-1,-1,-1): # look for full italic/oblique/slanted spellings first if italicky(elts[i], strict=True): elts.pop(i) break else: # if one wasn't found, settle for an it/a/l/ic/s fragment - for i in xrange(len(elts)-1,-1,-1): + for i in range(len(elts)-1,-1,-1): if italicky(elts[i], strict=False): elts.pop(i) break @@ -465,7 +465,7 @@ def parse_display_name(dname): # next search for width-y words width = None wid_val = 0 - for i in xrange(len(elts)-2,-1,-1): + for i in range(len(elts)-2,-1,-1): # first look for modifier+width combinations prefix, suffix = elts[i:i+2] if widthy(prefix+suffix) and sanitized(prefix) in wid_mods: @@ -478,7 +478,7 @@ def parse_display_name(dname): break else: # otherwise just look for a single-word width (leave width==None if no match) - for i in xrange(len(elts)-1,-1,-1): + for i in range(len(elts)-1,-1,-1): if widthy(elts[i]): width = elts[i] _, wid_val = standardized('width', width) @@ -490,7 +490,7 @@ def parse_display_name(dname): # search for weighty words in what's left weight = None wgt_val = 5 - for i in xrange(len(elts)-2,-1,-1): + for i in range(len(elts)-2,-1,-1): # first look for modifier+weight combinations prefix, suffix = elts[i:i+2] if weighty(prefix+suffix) and sanitized(prefix) in wgt_mods: @@ -501,7 +501,7 @@ def parse_display_name(dname): break else: # otherwise just look for a single-word weight (leave weight==None if no match) - for i in xrange(len(elts)-1,-1,-1): + for i in range(len(elts)-1,-1,-1): if weighty(elts[i]): weight = elts[i] _, wgt_val = standardized('weight', weight) @@ -602,7 +602,7 @@ def score(axis, f): scores = {} for f in faces: - scores[f] = sum([score(axis,f) for axis in 'italic', 'wgt', 'wid', 'variant']) + scores[f] = sum([score(axis,f) for axis in ('italic', 'wgt', 'wid', 'variant')]) candidates = [dict(score=s, face=f, ps=f.psname) for f,s in scores.items()] candidates.sort(key=itemgetter('score'), reverse=True) diff --git a/plotdevice/lib/io.py b/plotdevice/lib/io.py index e459b407..130ad226 100644 --- a/plotdevice/lib/io.py +++ b/plotdevice/lib/io.py @@ -134,7 +134,7 @@ def add(self, canvas): self.writer = AnimatedGif.alloc() self.writer.initWithFile_size_fps_loop_(self.fname, dims, self.fps, self.loop) else: - print 'unrecognized output format: %s' % self.format + print('unrecognized output format: %s' % self.format) return self.shutdown() self.writer.addFrame_(image) self.added += 1 diff --git a/plotdevice/lib/pathmatics.py b/plotdevice/lib/pathmatics.py index 47e62b62..048c9664 100644 --- a/plotdevice/lib/pathmatics.py +++ b/plotdevice/lib/pathmatics.py @@ -1,6 +1,6 @@ import objc from collections import namedtuple -from .cocoa import CGPathRelease +from cocoa import CGPathRelease import cPathmatics @@ -18,7 +18,7 @@ def convert_path(ns_path): try: # Faster C versions. - from cPathmatics import fast_inverse_sqrt, angle, distance, coordinates + from .cPathmatics import fast_inverse_sqrt, angle, distance, coordinates isqrt = inverse_sqrt = fast_inverse_sqrt except ImportError: from math import degrees, atan2 @@ -303,7 +303,7 @@ def _locate(path, t, segments=None): segments = path.segmentlengths(relative=True) if len(segments) == 0: - raise DeviceError, "The given path is empty" + raise DeviceError("The given path is empty") for i, el in enumerate(path): if i == 0 or el.cmd == MOVETO: @@ -353,7 +353,7 @@ def point(path, t, segments=None): from ..gfx.bezier import Curve if len(path) == 0: - raise DeviceError, "The given path is empty" + raise DeviceError("The given path is empty") i, t, closeto = _locate(path, t, segments=segments) @@ -372,7 +372,7 @@ def point(path, t, segments=None): x, y, c1x, c1y, c2x, c2y = curvepoint(t, x0, y0, x1, y1, x2, y2, x3, y3) return Curve(CURVETO, ((c1x, c1y), (c2x, c2y), (x, y))) else: - raise DeviceError, "Unknown cmd for p1 %s" % p1 + raise DeviceError("Unknown cmd for p1 %s" % p1) def points(path, amount=100): """Returns an iterator with a list of calculated points for the path. @@ -395,7 +395,7 @@ def points(path, amount=100): """ if len(path) == 0: - raise DeviceError, "The given path is empty" + raise DeviceError("The given path is empty") # The delta value is divided by amount - 1, because we also want the last point (t=1.0) # If I wouldn't use amount - 1, I fall one point short of the end. @@ -590,7 +590,7 @@ def insert_point(path, t): pt_x, pt_y, pt_c1x, pt_c1y, pt_c2x, pt_c2y, pt_h1x, pt_h1y, pt_h2x, pt_h2y = \ curvepoint(t, x0, y0, x1, y1, x2, y2, x3, y3, True) else: - raise DeviceError, "Locate should not return a MOVETO" + raise DeviceError("Locate should not return a MOVETO") new_path = Bezier(None) new_path.moveto(path[0].x, path[0].y) @@ -610,7 +610,7 @@ def insert_point(path, t): else: new_path.closepath() else: - raise DeviceError, "Didn't expect pt_cmd %s here" % pt_cmd + raise DeviceError("Didn't expect pt_cmd %s here" % pt_cmd) else: if path[j].cmd == MOVETO: diff --git a/plotdevice/run/console.py b/plotdevice/run/console.py index e21afb9d..079a2a75 100755 --- a/plotdevice/run/console.py +++ b/plotdevice/run/console.py @@ -68,9 +68,9 @@ def applicationDidFinishLaunching_(self, note): if self.mode=='windowed': # load the viewer ui from the nib in plotdevice/rsrc - nib = NSData.dataWithContentsOfFile_(rsrc_path('viewer.nib')) - ui = NSNib.alloc().initWithNibData_bundle_(nib, None) - ok, objs = ui.instantiateNibWithOwner_topLevelObjects_(self, None) + bundle = NSBundle.bundleWithPath_(rsrc_path()) + ui = NSNib.alloc().initWithNibNamed_bundle_("viewer", bundle) + ok, objs = ui.instantiateWithOwner_topLevelObjects_(self, None) NSApp().setMainMenu_(self.menu) # configure the window script-controller, and update-watcher @@ -200,6 +200,7 @@ def runFullscreen_(self, sender): def windowWillClose_(self, note): NSApp().terminate_(self) + @objc.python_method def echo(self, output): STDERR.write(ERASER) for isErr, data in output: @@ -210,11 +211,13 @@ def echo(self, output): STDERR.write(self._buf) STDERR.flush() + @objc.python_method def exportFrame(self, status, canvas=None): super(ConsoleScript, self).exportFrame(status, canvas) if not status.ok: NSApp().delegate().done() + @objc.python_method def exportStatus(self, event): super(ConsoleScript, self).exportStatus(event) @@ -230,6 +233,7 @@ def exportStatus(self, event): self._buf = '' NSApp().delegate().done() + @objc.python_method def exportProgress(self, written, total, cancelled): super(ConsoleScript, self).exportProgress(written, total, cancelled) diff --git a/plotdevice/run/sandbox.py b/plotdevice/run/sandbox.py index 725917a3..c35e45f5 100644 --- a/plotdevice/run/sandbox.py +++ b/plotdevice/run/sandbox.py @@ -215,7 +215,7 @@ def call(self, method=None): # default to running the script itself if a method (e.g., compile) isn't specified. if not method: def execScript(): - exec self._code in self.namespace + exec(self._code, self.namespace) method = execScript elif callable(self.namespace.get(method, None)): method = self.namespace[method] diff --git a/plotdevice/util/__init__.py b/plotdevice/util/__init__.py index 8e780bde..90a46036 100644 --- a/plotdevice/util/__init__.py +++ b/plotdevice/util/__init__.py @@ -25,8 +25,8 @@ def grid(cols, rows, colSize=1, rowSize=1, shuffled=False): rect(x,y, 10,10) """ # Prefer using generators. - rowRange = xrange(int(rows)) - colRange = xrange(int(cols)) + rowRange = range(int(rows)) + colRange = range(int(cols)) # Shuffled needs a real list, though. if (shuffled): rowRange = list(rowRange) @@ -78,8 +78,8 @@ def files(path="*", case=True): For a case insensitive search, call files() with case=False """ from iglob import iglob - if type(path)==unicode: - path.encode('utf-8') + # if type(path)==unicode: + # path.encode('utf-8') path = os.path.expanduser(path) return list(iglob(path.decode('utf-8'), case=case)) @@ -98,7 +98,7 @@ def _as_sequence(seq): return list(seq) def _as_before(orig, lst): - return "".join(lst) if isinstance(orig, basestring) else list(lst) + return "".join(lst) if isinstance(orig, str) else list(lst) def _getter(seq, names): from operator import itemgetter, attrgetter @@ -154,17 +154,17 @@ def _copy_attr(v): return tuple(v) elif isinstance(v, list): return list(v) - elif isinstance(v, (int, str, unicode, float, bool, long)): + elif isinstance(v, (int, str, float, bool)): return v else: - raise DeviceError, "Don't know how to copy '%s'." % v + raise DeviceError("Don't know how to copy '%s'." % v) def _copy_attrs(source, target, attrs): for attr in attrs: try: setattr(target, attr, _copy_attr(getattr(source, attr))) - except AttributeError, e: - print "missing attr: %r"% attr, hasattr(source, attr), hasattr(target, attr) + except AttributeError as e: + print("missing attr: %r"% attr, hasattr(source, attr), hasattr(target, attr)) raise e ### tuple/list de-nester ### @@ -249,8 +249,8 @@ def __init__(self, *args, **kw): def __getattr__(self, key): try: return self[key] - except KeyError, k: - raise AttributeError, k + except KeyError as k: + raise AttributeError(k) def __setattr__(self, key, value): # this test allows attributes to be set in the __init__ method @@ -261,8 +261,8 @@ def __setattr__(self, key, value): def __delattr__(self, key): try: del self[key] - except KeyError, k: - raise AttributeError, k + except KeyError as k: + raise AttributeError(k) ### autorelease pool manager ### diff --git a/plotdevice/util/readers.py b/plotdevice/util/readers.py index c68ae2a6..c8579396 100644 --- a/plotdevice/util/readers.py +++ b/plotdevice/util/readers.py @@ -16,7 +16,7 @@ from xml.parsers import expat # http -from urlparse import urlparse +from urllib.parse import urlparse from Foundation import NSDateFormatter, NSLocale, NSTimeZone, NSDate @@ -57,7 +57,7 @@ def __init__(self, txt, offset=0): # parse the input xml string try: self._expat.Parse(self._xml, True) - except expat.ExpatError, e: + except expat.ExpatError as e: self._expat_error(e) @property @@ -73,7 +73,7 @@ def _expat_error(self, e): if line.startswith(HEAD): line = line[len(HEAD):] col -= len(HEAD) - err = re.sub(ur'column \d+', 'column %i'%col, err) + err = re.sub(r'column \d+', 'column %i'%col, err) if line.endswith(TAIL): line = line[:-len(TAIL)] @@ -102,7 +102,7 @@ def _expat_error(self, e): raise DeviceError(xmlfail) def log(self, s=None, indent=0): - if not isinstance(s, basestring): + if not isinstance(s, str): if s is None: return self._log self._log = int(s) @@ -110,7 +110,7 @@ def log(self, s=None, indent=0): if not self._log: return if indent<0: self._log-=1 msg = (u' '*self._log)+(s if s.startswith('<') else repr(s)[1:]) - print msg.encode('utf-8') + print(msg.encode('utf-8')) if indent>0: self._log+=1 def _enter(self, name, attrs): diff --git a/setup.py b/setup.py index 73eddd88..8f305a24 100644 --- a/setup.py +++ b/setup.py @@ -19,10 +19,10 @@ # - cFoundry, cPathmatics, cIO, & PyObjC (included in the "app/deps" folder) # - Sparkle.framework (auto-downloaded only for `dist` builds) -from __future__ import print_function import os, sys, json, re -from distutils.dir_util import remove_tree from setuptools import setup, find_packages +from distutils.dir_util import remove_tree +from distutils.command.build_py import build_py from pkg_resources import DistributionNotFound from os.path import join, exists, dirname, basename, abspath, getmtime import plotdevice @@ -192,10 +192,6 @@ def run(self): remove_tree('plotdevice.egg-info') os.unlink('MANIFEST.in') -try: - from distutils.command.build_py import build_py_2to3 as build_py -except ImportError: - from distutils.command.build_py import build_py class BuildCommand(build_py): def run(self): # if 'build' was called explicitly, flag that requests etc. should be fetched diff --git a/tests/drawing.py b/tests/drawing.py index 9b0a0300..0faf851e 100644 --- a/tests/drawing.py +++ b/tests/drawing.py @@ -64,13 +64,13 @@ def test_paths_compound1(self): # draw twelve overlapping lines separately translate(5,5) - for i in xrange(12): + for i in range(12): line(0, i*10, i*15, 120) # draw them as a single compound-path translate(0, 140) with bezier(): - for i in xrange(12): + for i in range(12): line(0, i*10, i*15, 120) @reference('drawing/paths-compound2.png') From 8c145d9d2fdc4b60c8c5fe1b916fbc77a3008527 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Thu, 23 Jun 2022 19:55:33 -0400 Subject: [PATCH 003/226] get xcode build working --- PlotDevice.xcodeproj/project.pbxproj | 157 ++++++++++++------ .../{English.lproj => en.lproj}/AskString.xib | 28 ++-- .../{English.lproj => en.lproj}/Credits.rtf | 0 .../InfoPlist.strings | 0 .../{English.lproj => en.lproj}/MainMenu.xib | 14 +- .../PlotDeviceDocument.xib | 134 +++++++-------- .../PlotDevicePreferences.xib | 100 ++++++----- .../PlotDeviceScript.xib | 0 .../placeholder.pdf | Bin app/Resources/ui/js/editor.js | 11 +- app/info.plist | 12 +- app/python.xcconfig | 10 +- plotdevice/gfx/text.py | 8 +- plotdevice/gfx/typography.py | 3 +- plotdevice/gui/document.py | 1 + plotdevice/gui/editor.py | 13 +- plotdevice/gui/preferences.py | 5 + plotdevice/lib/__init__.py | 2 + plotdevice/run/sandbox.py | 2 +- plotdevice/util/__init__.py | 2 +- plotdevice/util/kgp.py | 6 +- plotdevice/util/ottobot.py | 6 +- setup.py | 4 +- 23 files changed, 291 insertions(+), 227 deletions(-) rename app/Resources/{English.lproj => en.lproj}/AskString.xib (75%) rename app/Resources/{English.lproj => en.lproj}/Credits.rtf (100%) rename app/Resources/{English.lproj => en.lproj}/InfoPlist.strings (100%) rename app/Resources/{English.lproj => en.lproj}/MainMenu.xib (98%) rename app/Resources/{English.lproj => en.lproj}/PlotDeviceDocument.xib (82%) rename app/Resources/{English.lproj => en.lproj}/PlotDevicePreferences.xib (85%) rename app/Resources/{English.lproj => en.lproj}/PlotDeviceScript.xib (100%) rename app/Resources/{English.lproj => en.lproj}/placeholder.pdf (100%) diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 1d20784f..61de4875 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -17,6 +17,8 @@ 2A66ECED18A99328002903DE /* jquery-2.1.0.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECE018A992BD002903DE /* jquery-2.1.0.js */; }; 2A66ECEE18A99328002903DE /* keybindings.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECE118A992BD002903DE /* keybindings.js */; }; 2A66ECEF18A99328002903DE /* underscore-1.5.2.min.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECE218A992BD002903DE /* underscore-1.5.2.min.js */; }; + 2A79B146286508220074E96A /* Python3.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A79B144286507000074E96A /* Python3.framework */; }; + 2A79B147286508220074E96A /* Python3.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2A79B144286507000074E96A /* Python3.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 2A7AF5C818D2AFAA00F8FFC2 /* examples in Resources */ = {isa = PBXBuildFile; fileRef = 2A7AF5C718D2AFAA00F8FFC2 /* examples */; }; 2A93AE751903326E00C6144D /* placeholder.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 2A93AE731903326E00C6144D /* placeholder.pdf */; }; 2ABBB2FA1854018B001C4E0A /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2ABBB2F91854018B001C4E0A /* AVFoundation.framework */; }; @@ -67,6 +69,17 @@ name = "Copy Editor Scripts"; runOnlyForDeploymentPostprocessing = 0; }; + 2A79B148286508220074E96A /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 2A79B147286508220074E96A /* Python3.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; 2ABDB76F1867D9560069EFC3 /* Copy 'plotdevice' Tool */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -93,8 +106,6 @@ 2A294467185E575F00E9F650 /* document.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = document.py; sourceTree = ""; }; 2A294468185E575F00E9F650 /* preferences.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = preferences.py; sourceTree = ""; }; 2A32957218C59D0A00EEDD1C /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; - 2A32957418C59D0A00EEDD1C /* fsevents.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = fsevents.py; sourceTree = ""; }; - 2A32957518C59D0A00EEDD1C /* geometry.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = geometry.py; sourceTree = ""; }; 2A32957718C59D0A00EEDD1C /* io.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = io.py; sourceTree = ""; }; 2A32957918C59D0A00EEDD1C /* pathmatics.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pathmatics.py; sourceTree = ""; }; 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; @@ -106,9 +117,17 @@ 2A66ECE018A992BD002903DE /* jquery-2.1.0.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = "jquery-2.1.0.js"; path = "Resources/ui/js/jquery-2.1.0.js"; sourceTree = ""; }; 2A66ECE118A992BD002903DE /* keybindings.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = keybindings.js; path = Resources/ui/js/keybindings.js; sourceTree = ""; }; 2A66ECE218A992BD002903DE /* underscore-1.5.2.min.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = "underscore-1.5.2.min.js"; path = "Resources/ui/js/underscore-1.5.2.min.js"; sourceTree = ""; }; + 2A79B1392864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = Resources/en.lproj/AskString.xib; sourceTree = ""; }; + 2A79B13A2864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + 2A79B13B2864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 2A79B13C2864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = Resources/en.lproj/MainMenu.xib; sourceTree = ""; }; + 2A79B13D2864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = Resources/en.lproj/PlotDeviceDocument.xib; sourceTree = ""; }; + 2A79B13E2864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = Resources/en.lproj/PlotDevicePreferences.xib; sourceTree = ""; }; + 2A79B13F2864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = Resources/en.lproj/PlotDeviceScript.xib; sourceTree = ""; }; + 2A79B1402864FDAF0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = Resources/en.lproj/placeholder.pdf; sourceTree = ""; }; + 2A79B144286507000074E96A /* Python3.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python3.framework; path = Library/Frameworks/Python3.framework; sourceTree = DEVELOPER_DIR; }; 2A7AF5C718D2AFAA00F8FFC2 /* examples */ = {isa = PBXFileReference; lastKnownFileType = folder; path = examples; sourceTree = ""; }; 2A827CC91859E9FE00A126BA /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 2A93AE741903326E00C6144D /* English */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = English; path = Resources/English.lproj/placeholder.pdf; sourceTree = ""; }; 2A98FCAD1B3C6BFC00ABF2C9 /* python.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = python.xcconfig; path = app/python.xcconfig; sourceTree = ""; }; 2ABBB2F91854018B001C4E0A /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 2ABBB2FB18540246001C4E0A /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; @@ -124,31 +143,20 @@ 2AC07CBA18EF8E7D00B75879 /* colors.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = colors.py; sourceTree = ""; }; 2AC07CBD18EF8E7D00B75879 /* effects.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = effects.py; sourceTree = ""; }; 2AC07CC118EF8E7D00B75879 /* image.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = image.py; sourceTree = ""; }; - 2AC07CC318EF8E7D00B75879 /* transform.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = transform.py; sourceTree = ""; }; 2AC07CC518EF8E7D00B75879 /* typography.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = typography.py; sourceTree = ""; }; 2AC07CD818EF8EC500B75879 /* context.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = context.py; sourceTree = ""; }; 2AC07CE218EF9B2400B75879 /* atoms.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = atoms.py; sourceTree = ""; }; 2AC5187F18636C9F007FB066 /* sandbox.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = sandbox.py; sourceTree = ""; }; - 2AD0A9B6186E552700D1F6DE /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Resources/English.lproj/PlotDeviceScript.xib; sourceTree = ""; }; 2AE5AD291862366300CCDD45 /* editor.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = editor.py; sourceTree = ""; }; 2AE5AD2C1862386400CCDD45 /* widgets.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = widgets.py; sourceTree = ""; }; - 2AEE843A18B3285600CF91D4 /* foundry.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = foundry.py; sourceTree = ""; }; 2AEE843D18B5603900CF91D4 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; 2AEE846318BEC25B00CF91D4 /* iglob.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = iglob.py; sourceTree = ""; }; - 611CC48210BA8B9E00B55455 /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = English.lproj/Credits.rtf; sourceTree = ""; }; - 611CC48A10BA8B9E00B55455 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 611CC49310BA8B9E00B55455 /* PlotDevice.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = PlotDevice.icns; path = Resources/PlotDevice.icns; sourceTree = ""; }; 611CC49410BA8B9E00B55455 /* PlotDeviceFile.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = PlotDeviceFile.icns; path = Resources/PlotDeviceFile.icns; sourceTree = ""; }; 611CC4AF10BA8C1B00B55455 /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; - 611CC4BB10BA8C1B00B55455 /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; - 611CC4BC10BA8C1B00B55455 /* pathmatics.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pathmatics.py; sourceTree = ""; }; 611CC4D710BA8C1B00B55455 /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; 611CC4D910BA8C1B00B55455 /* kgp.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = kgp.py; sourceTree = ""; }; 611CC4DA10BA8C1B00B55455 /* ottobot.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = ottobot.py; sourceTree = ""; }; - 611CC59F10BA908C00B55455 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Resources/English.lproj/PlotDeviceDocument.xib; sourceTree = ""; }; - 611CC5A710BA919A00B55455 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Resources/English.lproj/PlotDevicePreferences.xib; sourceTree = ""; }; - 611CC67F10BAA08300B55455 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Resources/English.lproj/MainMenu.xib; sourceTree = ""; }; - 611CC68610BAA0A600B55455 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Resources/English.lproj/AskString.xib; sourceTree = ""; }; 6155D9F213E2B79E00675A92 /* CHANGES.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CHANGES.md; sourceTree = ""; }; 6155D9F313E2B79E00675A92 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.md; sourceTree = ""; }; 8D15AC370486D014006FF6A4 /* PlotDevice.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PlotDevice.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -163,6 +171,7 @@ 2ABBB2FE185402AC001C4E0A /* CoreMedia.framework in Frameworks */, 2ABBB2FA1854018B001C4E0A /* AVFoundation.framework in Frameworks */, 2A15C42D18A1FA14006BDFF0 /* WebKit.framework in Frameworks */, + 2A79B146286508220074E96A /* Python3.framework in Frameworks */, 2A591FF0185C17D200D1833D /* Security.framework in Frameworks */, 8D15AC340486D014006FF6A4 /* Cocoa.framework in Frameworks */, ); @@ -222,8 +231,6 @@ isa = PBXGroup; children = ( 2A32957218C59D0A00EEDD1C /* __init__.py */, - 2A32957418C59D0A00EEDD1C /* fsevents.py */, - 2A32957518C59D0A00EEDD1C /* geometry.py */, 2A32957718C59D0A00EEDD1C /* io.py */, 2A32957918C59D0A00EEDD1C /* pathmatics.py */, ); @@ -280,6 +287,7 @@ 2A37F4C3FDCFA73011CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( + 2A79B144286507000074E96A /* Python3.framework */, 2AEE843D18B5603900CF91D4 /* CoreText.framework */, 2A15C42C18A1FA14006BDFF0 /* WebKit.framework */, 2A591FEF185C17D200D1833D /* Security.framework */, @@ -314,7 +322,6 @@ 2AC07CBA18EF8E7D00B75879 /* colors.py */, 2AC07CBD18EF8E7D00B75879 /* effects.py */, 2AC07CC118EF8E7D00B75879 /* image.py */, - 2AC07CC318EF8E7D00B75879 /* transform.py */, 2AC07CC518EF8E7D00B75879 /* typography.py */, ); path = gfx; @@ -327,7 +334,6 @@ 2AC07CD818EF8EC500B75879 /* context.py */, 2AC07CB518EF8E7D00B75879 /* gfx */, 2A32957118C59D0A00EEDD1C /* lib */, - 611CC4BA10BA8C1B00B55455 /* geo */, 611CC4C410BA8C1B00B55455 /* gui */, 2A294457185E539400E9F650 /* run */, 611CC4D610BA8C1B00B55455 /* util */, @@ -335,15 +341,6 @@ path = plotdevice; sourceTree = ""; }; - 611CC4BA10BA8C1B00B55455 /* geo */ = { - isa = PBXGroup; - children = ( - 611CC4BB10BA8C1B00B55455 /* __init__.py */, - 611CC4BC10BA8C1B00B55455 /* pathmatics.py */, - ); - path = geo; - sourceTree = ""; - }; 611CC4C410BA8C1B00B55455 /* gui */ = { isa = PBXGroup; children = ( @@ -363,7 +360,6 @@ children = ( 611CC4D710BA8C1B00B55455 /* __init__.py */, 2AEE846318BEC25B00CF91D4 /* iglob.py */, - 2AEE843A18B3285600CF91D4 /* foundry.py */, 611CC4D910BA8C1B00B55455 /* kgp.py */, 611CC4DA10BA8C1B00B55455 /* ottobot.py */, ); @@ -385,6 +381,7 @@ 2AF8981419953CA1005A49A5 /* Manually Update Examples */, 8D15AC300486D014006FF6A4 /* Sources */, 8D15AC330486D014006FF6A4 /* Frameworks */, + 2A79B148286508220074E96A /* Embed Frameworks */, ); buildRules = ( ); @@ -402,16 +399,15 @@ 2A37F4A9FDCFA73011CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0510; + LastUpgradeCheck = 1340; }; buildConfigurationList = C05733CB08A9546B00998B17 /* Build configuration list for PBXProject "PlotDevice" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 1; knownRegions = ( en, Base, - English, ); mainGroup = 2A37F4AAFDCFA73011CA2CEA /* PlotDevice */; projectDirPath = ""; @@ -493,7 +489,7 @@ 2A93AE731903326E00C6144D /* placeholder.pdf */ = { isa = PBXVariantGroup; children = ( - 2A93AE741903326E00C6144D /* English */, + 2A79B1402864FDAF0074E96A /* en */, ); name = placeholder.pdf; sourceTree = ""; @@ -501,7 +497,7 @@ 2AD0A9B5186E552700D1F6DE /* PlotDeviceScript.xib */ = { isa = PBXVariantGroup; children = ( - 2AD0A9B6186E552700D1F6DE /* English */, + 2A79B13F2864FDAE0074E96A /* en */, ); name = PlotDeviceScript.xib; sourceTree = ""; @@ -509,7 +505,7 @@ 611CC48110BA8B9E00B55455 /* Credits.rtf */ = { isa = PBXVariantGroup; children = ( - 611CC48210BA8B9E00B55455 /* English */, + 2A79B13A2864FDAE0074E96A /* en */, ); name = Credits.rtf; path = Resources; @@ -518,7 +514,7 @@ 611CC48910BA8B9E00B55455 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( - 611CC48A10BA8B9E00B55455 /* English */, + 2A79B13B2864FDAE0074E96A /* en */, ); name = InfoPlist.strings; path = Resources; @@ -527,7 +523,7 @@ 611CC59E10BA908C00B55455 /* PlotDeviceDocument.xib */ = { isa = PBXVariantGroup; children = ( - 611CC59F10BA908C00B55455 /* English */, + 2A79B13D2864FDAE0074E96A /* en */, ); name = PlotDeviceDocument.xib; sourceTree = ""; @@ -535,7 +531,7 @@ 611CC5A610BA919A00B55455 /* PlotDevicePreferences.xib */ = { isa = PBXVariantGroup; children = ( - 611CC5A710BA919A00B55455 /* English */, + 2A79B13E2864FDAE0074E96A /* en */, ); name = PlotDevicePreferences.xib; sourceTree = ""; @@ -543,7 +539,7 @@ 611CC67E10BAA08300B55455 /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( - 611CC67F10BAA08300B55455 /* English */, + 2A79B13C2864FDAE0074E96A /* en */, ); name = MainMenu.xib; sourceTree = ""; @@ -551,7 +547,7 @@ 611CC68510BAA0A600B55455 /* AskString.xib */ = { isa = PBXVariantGroup; children = ( - 611CC68610BAA0A600B55455 /* English */, + 2A79B1392864FDAE0074E96A /* en */, ); name = AskString.xib; sourceTree = ""; @@ -563,24 +559,24 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**"; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = ""; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - ); INFOPLIST_FILE = app/info.plist; INSTALL_PATH = /Applications; - LIBRARY_SEARCH_PATHS = "$(inherited)"; - MACOSX_DEPLOYMENT_TARGET = 10.9; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.14; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = io.plotdevice.PlotDevice; PRODUCT_NAME = PlotDevice; SDKROOT = macosx; }; @@ -590,21 +586,21 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; CONFIGURATION_BUILD_DIR = dist; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**"; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = ""; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - ); INFOPLIST_FILE = app/info.plist; INSTALL_PATH = /Applications; - LIBRARY_SEARCH_PATHS = "$(inherited)"; - MACOSX_DEPLOYMENT_TARGET = 10.9; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.14; OTHER_LDFLAGS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = io.plotdevice.PlotDevice; PRODUCT_NAME = PlotDevice; SDKROOT = macosx; }; @@ -614,7 +610,35 @@ isa = XCBuildConfiguration; baseConfigurationReference = 2A98FCAD1B3C6BFC00ABF2C9 /* python.xcconfig */; buildSettings = { - MACOSX_DEPLOYMENT_TARGET = 10.9; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = PlotDevice; SDKROOT = macosx; @@ -625,7 +649,34 @@ isa = XCBuildConfiguration; baseConfigurationReference = 2A98FCAD1B3C6BFC00ABF2C9 /* python.xcconfig */; buildSettings = { - MACOSX_DEPLOYMENT_TARGET = 10.9; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; PRODUCT_NAME = PlotDevice; SDKROOT = macosx; }; diff --git a/app/Resources/English.lproj/AskString.xib b/app/Resources/en.lproj/AskString.xib similarity index 75% rename from app/Resources/English.lproj/AskString.xib rename to app/Resources/en.lproj/AskString.xib index 1bf752f3..3c964f4b 100644 --- a/app/Resources/English.lproj/AskString.xib +++ b/app/Resources/en.lproj/AskString.xib @@ -1,8 +1,9 @@ - - + + - - + + + @@ -13,18 +14,18 @@ - - + + - + - + @@ -33,16 +34,16 @@ - + - + - - + @@ -204,7 +205,7 @@ - + @@ -213,7 +214,7 @@ - + @@ -274,7 +275,7 @@ - + @@ -283,7 +284,7 @@ - + @@ -291,11 +292,11 @@ - + - - + @@ -313,12 +314,13 @@ + - + @@ -330,11 +332,11 @@ - + - + @@ -346,11 +348,11 @@ - + - + @@ -359,7 +361,7 @@ - + @@ -376,7 +378,7 @@ - + @@ -385,7 +387,7 @@ - - + @@ -411,7 +413,7 @@ - + @@ -420,7 +422,7 @@ - + @@ -429,7 +431,7 @@ - + @@ -438,7 +440,7 @@ - + @@ -447,35 +449,33 @@ - + - - - + - + - + - + - + - - - + @@ -517,16 +517,17 @@ DQ + - + - - + @@ -552,9 +553,10 @@ DQ + - + diff --git a/app/Resources/English.lproj/PlotDevicePreferences.xib b/app/Resources/en.lproj/PlotDevicePreferences.xib similarity index 85% rename from app/Resources/English.lproj/PlotDevicePreferences.xib rename to app/Resources/en.lproj/PlotDevicePreferences.xib index d90dcc0a..f05d4665 100644 --- a/app/Resources/English.lproj/PlotDevicePreferences.xib +++ b/app/Resources/en.lproj/PlotDevicePreferences.xib @@ -1,8 +1,9 @@ - - + + - - + + + @@ -22,26 +23,26 @@ - + - + - + - - + + - - + + @@ -49,8 +50,8 @@ - - + + @@ -58,8 +59,8 @@ - - + + @@ -76,8 +77,8 @@ - - + + @@ -88,8 +89,8 @@ - - + + @@ -106,8 +107,8 @@ - - + + @@ -115,8 +116,8 @@ - - + + @@ -135,19 +136,17 @@ - - - + - - + + - - + + @@ -155,8 +154,8 @@ - - - - + - - + + - - - - @@ -216,21 +211,22 @@ + - + - + - + - + @@ -248,7 +244,7 @@ - + @@ -257,7 +253,7 @@ - -
.* Aa \\b
'.replace(/>\s+/g,">");var a=function(m,l,n){var o=g.createElement("div");o.innerHTML=i;this.element=o.firstChild;this.$init();this.setEditor(m)};(function(){this.setEditor=function(l){l.searchBox=this;l.container.appendChild(this.element);this.editor=l};this.$initElements=function(l){this.searchBox=l.querySelector(".ace_search_form");this.replaceBox=l.querySelector(".ace_replace_form");this.searchOptions=l.querySelector(".ace_search_options");this.regExpOption=l.querySelector("[action=toggleRegexpMode]");this.caseSensitiveOption=l.querySelector("[action=toggleCaseSensitive]");this.wholeWordOption=l.querySelector("[action=toggleWholeWords]");this.searchInput=this.searchBox.querySelector(".ace_search_field");this.replaceInput=this.replaceBox.querySelector(".ace_search_field")};this.$init=function(){var m=this.element;this.$initElements(m);var l=this;b.addListener(m,"mousedown",function(n){setTimeout(function(){l.activeInput.focus()},0);b.stopPropagation(n)});b.addListener(m,"click",function(p){var n=p.target||p.srcElement;var o=n.getAttribute("action");if(o&&l[o]){l[o]()}else{if(l.$searchBarKb.commands[o]){l.$searchBarKb.commands[o].exec(l)}}b.stopPropagation(p)});b.addCommandKeyListener(m,function(q,o,p){var n=f.keyCodeToString(p);var r=l.$searchBarKb.findKeyCommand(o,n);if(r&&r.exec){r.exec(l);b.stopEvent(q)}});this.$onChange=c.delayedCall(function(){l.find(false,false)});b.addListener(this.searchInput,"input",function(){l.$onChange.schedule(20)});b.addListener(this.searchInput,"focus",function(){l.activeInput=l.searchInput;l.searchInput.value&&l.highlight()});b.addListener(this.replaceInput,"focus",function(){l.activeInput=l.replaceInput;l.searchInput.value&&l.highlight()})};this.$closeSearchBarKb=new j([{bindKey:"Esc",name:"closeSearchBar",exec:function(l){l.searchBox.hide()}}]);this.$searchBarKb=new j();this.$searchBarKb.bindKeys({"Ctrl-f|Command-f|Ctrl-H|Command-Option-F":function(m){var l=m.isReplace=!m.isReplace;m.replaceBox.style.display=l?"":"none";m[l?"replaceInput":"searchInput"].focus()},"Ctrl-G|Command-G":function(l){l.findNext()},"Ctrl-Shift-G|Command-Shift-G":function(l){l.findPrev()},esc:function(l){setTimeout(function(){l.hide()})},Return:function(l){if(l.activeInput==l.replaceInput){l.replace()}l.findNext()},"Shift-Return":function(l){if(l.activeInput==l.replaceInput){l.replace()}l.findPrev()},Tab:function(l){(l.activeInput==l.replaceInput?l.searchInput:l.replaceInput).focus()}});this.$searchBarKb.addCommands([{name:"toggleRegexpMode",bindKey:{win:"Alt-R|Alt-/",mac:"Ctrl-Alt-R|Ctrl-Alt-/"},exec:function(l){l.regExpOption.checked=!l.regExpOption.checked;l.$syncOptions()}},{name:"toggleCaseSensitive",bindKey:{win:"Alt-C|Alt-I",mac:"Ctrl-Alt-R|Ctrl-Alt-I"},exec:function(l){l.caseSensitiveOption.checked=!l.caseSensitiveOption.checked;l.$syncOptions()}},{name:"toggleWholeWords",bindKey:{win:"Alt-B|Alt-W",mac:"Ctrl-Alt-B|Ctrl-Alt-W"},exec:function(l){l.wholeWordOption.checked=!l.wholeWordOption.checked;l.$syncOptions()}}]);this.$syncOptions=function(){g.setCssClass(this.regExpOption,"checked",this.regExpOption.checked);g.setCssClass(this.wholeWordOption,"checked",this.wholeWordOption.checked);g.setCssClass(this.caseSensitiveOption,"checked",this.caseSensitiveOption.checked);this.find(false,false)};this.highlight=function(l){this.editor.session.highlight(l||this.editor.$search.$options.re);this.editor.renderer.updateBackMarkers()};this.find=function(o,m){var n=this.editor.find(this.searchInput.value,{skipCurrent:o,backwards:m,wrap:true,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked});var l=!n&&this.searchInput.value;g.setCssClass(this.searchBox,"ace_nomatch",l);this.editor._emit("findSearchBox",{match:!l});this.highlight()};this.findNext=function(){this.find(true,false)};this.findPrev=function(){this.find(true,true)};this.replace=function(){if(!this.editor.getReadOnly()){this.editor.replace(this.replaceInput.value)}};this.replaceAndFindNext=function(){if(!this.editor.getReadOnly()){this.editor.replace(this.replaceInput.value);this.findNext()}};this.replaceAll=function(){if(!this.editor.getReadOnly()){this.editor.replaceAll(this.replaceInput.value)}};this.hide=function(){this.element.style.display="none";this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);this.editor.focus()};this.show=function(l,m){this.element.style.display="";this.replaceBox.style.display=m?"":"none";this.isReplace=m;if(l){this.searchInput.value=l}this.searchInput.focus();this.searchInput.select();this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb)}}).call(a.prototype);h.SearchBox=a;h.Search=function(l,m){var n=l.searchBox||new a(l);n.show(l.session.getTextRange(),m)}});(function(){window.require(["ace/ext/searchbox"],function(){})})();define("ace/ext/settings_menu",["require","exports","module","ace/ext/menu_tools/generate_settings_menu","ace/ext/menu_tools/overlay_page","ace/editor"],function(c,a,e){var b=c("./menu_tools/generate_settings_menu").generateSettingsMenu;var f=c("./menu_tools/overlay_page").overlayPage;function d(g){var h=document.getElementById("ace_settingsmenu");if(!h){f(g,b(g),"0","0","0")}}e.exports.init=function(h){var g=c("ace/editor").Editor;g.prototype.showSettingsMenu=function(){d(this)}}});define("ace/ext/menu_tools/generate_settings_menu",["require","exports","module","ace/ext/menu_tools/element_generator","ace/ext/menu_tools/add_editor_menu_options","ace/ext/menu_tools/get_set_functions"],function(f,c,g){var e=f("./element_generator");var b=f("./add_editor_menu_options").addEditorMenuOptions;var a=f("./get_set_functions").getSetFunctions;g.exports.generateSettingsMenu=function d(i){var k=[];function l(){k.sort(function(q,p){var o=q.getAttribute("contains");var r=p.getAttribute("contains");return o.localeCompare(r)})}function h(){var o=document.createElement("div");o.setAttribute("id","ace_settingsmenu");k.forEach(function(p){o.appendChild(p)});return o}function m(r,o,q,s){var p;var t=document.createElement("div");t.setAttribute("contains",q);t.setAttribute("class","ace_optionsMenuEntry");t.setAttribute("style","clear: both;");t.appendChild(e.createLabel(q.replace(/^set/,"").replace(/([A-Z])/g," $1").trim(),q));if(Array.isArray(s)){p=e.createSelection(q,s,o);p.addEventListener("change",function(v){try{i.menuOptions[v.target.id].forEach(function(w){if(w.textContent!==v.target.textContent){delete w.selected}});r[v.target.id](v.target.value)}catch(u){throw new Error(u)}})}else{if(typeof s==="boolean"){p=e.createCheckbox(q,s,o);p.addEventListener("change",function(v){try{r[v.target.id](!!v.target.checked)}catch(u){throw new Error(u)}})}else{p=e.createInput(q,s,o);p.addEventListener("change",function(v){try{if(v.target.value==="true"){r[v.target.id](true)}else{if(v.target.value==="false"){r[v.target.id](false)}else{r[v.target.id](v.target.value)}}}catch(u){throw new Error(u)}})}}p.style.cssText="float:right;";t.appendChild(p);return t}function n(r,s,o,q){var t=i.menuOptions[r];var p=s[q]();if(typeof p=="object"){p=p.$id}t.forEach(function(u){if(u.value===p){u.selected="selected"}});return m(s,o,r,t)}function j(r){var q=r.functionName;var t=r.parentObj;var o=r.parentName;var u;var p=q.replace(/^set/,"get");if(i.menuOptions[q]!==undefined){k.push(n(q,t,o,p))}else{if(typeof t[p]==="function"){try{u=t[p]();if(typeof u==="object"){u=u.$id}k.push(m(t,o,q,u))}catch(s){}}}}b(i);a(i).forEach(function(o){j(o)});l();return h()}});define("ace/ext/menu_tools/element_generator",["require","exports","module"],function(d,a,f){f.exports.createOption=function c(k){var j;var i=document.createElement("option");for(j in k){if(k.hasOwnProperty(j)){if(j==="selected"){i.setAttribute(j,k[j])}else{i[j]=k[j]}}}return i};f.exports.createCheckbox=function h(l,k,i){var j=document.createElement("input");j.setAttribute("type","checkbox");j.setAttribute("id",l);j.setAttribute("name",l);j.setAttribute("value",k);j.setAttribute("class",i);if(k){j.setAttribute("checked","checked")}return j};f.exports.createInput=function b(l,k,i){var j=document.createElement("input");j.setAttribute("type","text");j.setAttribute("id",l);j.setAttribute("name",l);j.setAttribute("value",k);j.setAttribute("class",i);return j};f.exports.createLabel=function e(k,j){var i=document.createElement("label");i.setAttribute("for",j);i.textContent=k;return i};f.exports.createSelection=function g(l,j,i){var k=document.createElement("select");k.setAttribute("id",l);k.setAttribute("name",l);k.setAttribute("class",i);j.forEach(function(m){k.appendChild(f.exports.createOption(m))});return k}});define("ace/ext/menu_tools/add_editor_menu_options",["require","exports","module","ace/ext/modelist","ace/ext/themelist"],function(c,b,d){d.exports.addEditorMenuOptions=function a(f){var g=c("../modelist");var e=c("../themelist");f.menuOptions={setNewLineMode:[{textContent:"unix",value:"unix"},{textContent:"windows",value:"windows"},{textContent:"auto",value:"auto"}],setTheme:[],setMode:[],setKeyboardHandler:[{textContent:"ace",value:""},{textContent:"vim",value:"ace/keyboard/vim"},{textContent:"emacs",value:"ace/keyboard/emacs"}]};f.menuOptions.setTheme=e.themes.map(function(h){return{textContent:h.caption,value:h.theme}});f.menuOptions.setMode=g.modes.map(function(h){return{textContent:h.name,value:h.mode}})}});define("ace/ext/modelist",["require","exports","module"],function(f,g,e){var d=[];function l(p){var q=k.text;var r=p.split(/[\/\\]/).pop();for(var o=0;o 0!"}if(m==this.$splits){return}else{if(m>this.$splits){while(this.$splitsm){l=this.$editors[this.$splits-1];this.$container.removeChild(l.container);this.$splits--}}}this.resize()};this.getSplits=function(){return this.$splits};this.getEditor=function(l){return this.$editors[l]};this.getCurrentEditor=function(){return this.$cEditor};this.focus=function(){this.$cEditor.focus()};this.blur=function(){this.$cEditor.blur()};this.setTheme=function(l){this.$editors.forEach(function(m){m.setTheme(l)})};this.setKeyboardHandler=function(l){this.$editors.forEach(function(m){m.setKeyboardHandler(l)})};this.forEach=function(m,l){this.$editors.forEach(m,l)};this.$fontSize="";this.setFontSize=function(l){this.$fontSize=l;this.forEach(function(m){m.setFontSize(l)})};this.$cloneSession=function(o){var m=new a(o.getDocument(),o.getMode());var n=o.getUndoManager();if(n){var l=new j(n,m);m.setUndoManager(l)}m.$informUndoManager=b.delayedCall(function(){m.$deltas=[]});m.setTabSize(o.getTabSize());m.setUseSoftTabs(o.getUseSoftTabs());m.setOverwrite(o.getOverwrite());m.setBreakpoints(o.getBreakpoints());m.setUseWrapMode(o.getUseWrapMode());m.setUseWorker(o.getUseWorker());m.setWrapLimitRange(o.$wrapLimitRange.min,o.$wrapLimitRange.max);m.$foldData=o.$cloneFoldData();return m};this.setSession=function(o,l){var m;if(l==null){m=this.$cEditor}else{m=this.$editors[l]}var n=this.$editors.some(function(p){return p.session===o});if(n){o=this.$cloneSession(o)}m.setSession(o);return o};this.getOrientation=function(){return this.$orientation};this.setOrientation=function(l){if(this.$orientation==l){return}this.$orientation=l;this.resize()};this.resize=function(){var p=this.$container.clientWidth;var m=this.$container.clientHeight;var o;if(this.$orientation==this.BESIDE){var q=p/this.$splits;for(var n=0;n");if(!m){k.push("")}j.$renderLine(k,n,true,false);k.push("\n")}var p="
"+k.join("")+"
";j.destroy();return{css:i+o.cssText,html:p,session:s}};b.exports=e;b.exports.highlight=e});(function(){window.require(["ace/ext/static_highlight"],function(){})})();define("ace/ext/statusbar",["require","exports","module","ace/lib/dom","ace/lib/lang"],function(c,b,d){var f=c("ace/lib/dom");var e=c("ace/lib/lang");var a=function(i,g){this.element=f.createElement("div");this.element.className="ace_status-indicator";this.element.style.cssText="display: inline-block;";g.appendChild(this.element);var h=e.delayedCall(function(){this.updateStatus(i)}.bind(this));i.on("changeStatus",function(){h.schedule(100)});i.on("changeSelection",function(){h.schedule(100)})};(function(){this.updateStatus=function(h){var g=[];function j(m,l){m&&g.push(m,l||"|")}if(h.$vimModeHandler){j(h.$vimModeHandler.getStatusText())}else{if(h.commands.recording){j("REC")}}var k=h.selection.lead;j(k.row+":"+k.column," ");if(!h.selection.isEmpty()){var i=h.getSelectionRange();j("("+(i.end.row-i.start.row)+":"+(i.end.column-i.start.column)+")")}g.pop();this.element.textContent=g.join("")}}).call(a.prototype);b.StatusBar=a});(function(){window.require(["ace/ext/statusbar"],function(){})})();define("ace/ext/textarea",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/net","ace/ace","ace/theme/textmate","ace/mode/text"],function(d,f,b){var a=d("../lib/event");var h=d("../lib/useragent");var j=d("../lib/net");var c=d("../ace");d("../theme/textmate");b.exports=f=c;var i=function(p,n,q){var o=p.style[q];if(!o){if(window.getComputedStyle){o=window.getComputedStyle(p,"").getPropertyValue(q)}else{o=p.currentStyle[q]}}if(!o||o=="auto"||o=="intrinsic"){o=n.style[q]}return o};function g(p,o){for(var n in o){p.style[n]=o[n]}}function m(r,p){if(r.type!="textarea"){throw new Error("Textarea required!")}var n=r.parentNode;var o=document.createElement("div");var s=function(){var v="position:relative;";["margin-top","margin-left","margin-right","margin-bottom"].forEach(function(w){v+=w+":"+i(r,o,w)+";"});var u=i(r,o,"width")||(r.clientWidth+"px");var t=i(r,o,"height")||(r.clientHeight+"px");v+="height:"+t+";width:"+u+";";v+="display:inline-block;";o.setAttribute("style",v)};a.addListener(window,"resize",s);s();n.insertBefore(o,r.nextSibling);while(n!==document){if(n.tagName.toUpperCase()==="FORM"){var q=n.onsubmit;n.onsubmit=function(t){r.value=p();if(q){q.call(this,t)}};break}n=n.parentNode}return o}f.transformTextarea=function(s,w){var u;var o=m(s,function(){return u.getValue()});s.style.display="none";o.style.background="white";var p=document.createElement("div");g(p,{top:"0px",left:"0px",right:"0px",bottom:"0px",border:"1px solid gray",position:"absolute"});o.appendChild(p);var q=document.createElement("div");g(q,{position:"absolute",right:"0px",bottom:"0px",background:"red",cursor:"nw-resize",borderStyle:"solid",borderWidth:"9px 8px 10px 9px",width:"2px",borderColor:"lightblue gray gray lightblue",zIndex:101});var v=document.createElement("div");var r={top:"0px",left:"20%",right:"0px",bottom:"0px",position:"absolute",padding:"5px",zIndex:100,color:"white",display:"none",overflow:"auto",fontSize:"14px",boxShadow:"-5px 2px 3px gray"};if(!h.isOldIE){r.backgroundColor="rgba(0, 0, 0, 0.6)"}else{r.backgroundColor="#333"}g(v,r);o.appendChild(v);var x={};var t=c.edit(p);u=t.getSession();u.setValue(s.value||s.innerHTML);t.focus();o.appendChild(q);l(t,p,v,c,x,w);e(v,q,t,x);var n="";a.addListener(q,"mousemove",function(B){var A=this.getBoundingClientRect();var z=B.clientX-A.left,C=B.clientY-A.top;if(z+C<(A.width+A.height)/2){this.style.cursor="pointer";n="toggle"}else{n="resize";this.style.cursor="nw-resize"}});a.addListener(q,"mousedown",function(B){if(n=="toggle"){t.setDisplaySettings();return}o.style.zIndex=100000;var A=o.getBoundingClientRect();var z=A.width+A.left-B.clientX;var y=A.height+A.top-B.clientY;a.capture(q,function(C){o.style.width=C.clientX-A.left+z+"px";o.style.height=C.clientY-A.top+y+"px";t.resize()},function(){})});return t};function k(n,o,p){j.loadScript(n,function(){d([o],p)})}function l(q,n,t,o,v,u){var s=q.getSession();var r=q.renderer;u=u||k;function p(w){return w==="true"||w==true}q.setDisplaySettings=function(x){if(x==null){x=t.style.display=="none"}if(x){t.style.display="block";t.hideButton.focus();q.on("focus",function w(){q.removeListener("focus",w);t.style.display="none"})}else{q.focus()}};q.$setOption=q.setOption;q.setOption=function(w,x){if(v[w]==x){return}switch(w){case"mode":if(x!="text"){u("mode-"+x+".js","ace/mode/"+x,function(){var y=d("../mode/"+x).Mode;s.setMode(new y())})}else{s.setMode(new (d("../mode/text").Mode))}break;case"theme":if(x!="textmate"){u("theme-"+x+".js","ace/theme/"+x,function(){q.setTheme("ace/theme/"+x)})}else{q.setTheme("ace/theme/textmate")}break;case"fontSize":n.style.fontSize=x;break;case"keybindings":switch(x){case"vim":q.setKeyboardHandler("ace/keyboard/vim");break;case"emacs":q.setKeyboardHandler("ace/keyboard/emacs");break;default:q.setKeyboardHandler(null)}break;case"softWrap":switch(x){case"off":s.setUseWrapMode(false);r.setPrintMarginColumn(80);break;case"40":s.setUseWrapMode(true);s.setWrapLimitRange(40,40);r.setPrintMarginColumn(40);break;case"80":s.setUseWrapMode(true);s.setWrapLimitRange(80,80);r.setPrintMarginColumn(80);break;case"free":s.setUseWrapMode(true);s.setWrapLimitRange(null,null);r.setPrintMarginColumn(80);break}break;default:q.$setOption(w,p(x))}v[w]=x};q.getOption=function(w){return v[w]};q.getOptions=function(){return v};q.setOptions(f.options);return q}function e(A,o,v,C){var n=null;var u={mode:"Mode:",gutter:"Display Gutter:",theme:"Theme:",fontSize:"Font Size:",softWrap:"Soft Wrap:",keybindings:"Keyboard",showPrintMargin:"Show Print Margin:",useSoftTabs:"Use Soft Tabs:",showInvisibles:"Show Invisibles"};var z={mode:{text:"Plain",javascript:"JavaScript",xml:"XML",html:"HTML",css:"CSS",scss:"SCSS",python:"Python",php:"PHP",java:"Java",ruby:"Ruby",c_cpp:"C/C++",coffee:"CoffeeScript",json:"json",perl:"Perl",clojure:"Clojure",ocaml:"OCaml",csharp:"C#",haxe:"haXe",svg:"SVG",textile:"Textile",groovy:"Groovy",liquid:"Liquid",Scala:"Scala"},theme:{clouds:"Clouds",clouds_midnight:"Clouds Midnight",cobalt:"Cobalt",crimson_editor:"Crimson Editor",dawn:"Dawn",eclipse:"Eclipse",idle_fingers:"Idle Fingers",kr_theme:"Kr Theme",merbivore:"Merbivore",merbivore_soft:"Merbivore Soft",mono_industrial:"Mono Industrial",monokai:"Monokai",pastel_on_dark:"Pastel On Dark",solarized_dark:"Solarized Dark",solarized_light:"Solarized Light",textmate:"Textmate",twilight:"Twilight",vibrant_ink:"Vibrant Ink"},gutter:n,fontSize:{"10px":"10px","11px":"11px","12px":"12px","14px":"14px","16px":"16px"},softWrap:{off:"Off",40:"40",80:"80",free:"Free"},keybindings:{ace:"ace",vim:"vim",emacs:"emacs"},showPrintMargin:n,useSoftTabs:n,showInvisibles:n};var B=[];B.push("");function p(D,F,H,E){if(!H){D.push("");return}D.push("")}for(var t in C){B.push("");B.push("")}B.push("
SettingValue
",u[t],"");p(B,t,z[t],C[t]);B.push("
");A.innerHTML=B.join("");var w=function(E){var D=E.currentTarget;v.setOption(D.title,D.value)};var y=function(E){var D=E.currentTarget;v.setOption(D.title,D.checked)};var x=A.getElementsByTagName("select");for(var r=0;r0&&!(h%p)&&!(l%p)){w[p]=(w[p]||0)+1}v[l]=(v[l]||0)+1}h=l;while(sj.score){j={score:t,length:s}}}if(j.score&&j.score>1.4){var e=j.length}if(o>k+1){return{ch:"\t",length:e}}if(k+1>o){return{ch:" ",length:e}}};a.detectIndentation=function(g){var f=g.getLines(0,1000);var e=a.$detectIndentation(f)||{};if(e.ch){g.setUseSoftTabs(e.ch==" ")}if(e.length){g.setTabSize(e.length)}return e};a.trimTrailingSpace=function(k,f){var m=k.getDocument();var n=m.getAllLines();var g=f?-1:0;for(var h=0,e=n.length;hg){m.removeInLine(h,j,o.length)}}};a.convertIndentation=function(f,r,x){var q=f.getTabString()[0];var m=f.getTabSize();if(!x){x=m}if(!r){r=q}var h=r=="\t"?r:d.stringRepeat(r,x);var y=f.doc;var e=y.getAllLines();var s={};var g={};for(var v=0,t=e.length;v30){this.$data.shift()}},get:function(q){q=q||1;return this.$data.slice(this.$data.length-q,this.$data.length).reverse().join("\n")},pop:function(){if(this.$data.length>1){this.$data.pop()}return this.get()},rotate:function(){this.$data.unshift(this.$data.pop());return this.get()}}});define("ace/incremental_search",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/search_highlight","ace/commands/incremental_search_commands","ace/lib/dom","ace/commands/command_manager","ace/editor","ace/config"],function(d,h,b){var k=d("./lib/oop");var c=d("./range").Range;var e=d("./search").Search;var l=d("./search_highlight").SearchHighlight;var m=d("./commands/incremental_search_commands");var j=m.IncrementalSearchKeyboardHandler;function g(){this.$options={wrap:false,skipCurrent:false};this.$keyboardHandler=new j(this)}k.inherits(g,e);(function(){this.activate=function(o,n){this.$editor=o;this.$startPos=this.$currentPos=o.getCursorPosition();this.$options.needle="";this.$options.backwards=n;o.keyBinding.addKeyboardHandler(this.$keyboardHandler);this.$originalEditorOnPaste=o.onPaste;o.onPaste=this.onPaste.bind(this);this.$mousedownHandler=o.addEventListener("mousedown",this.onMouseDown.bind(this));this.selectionFix(o);this.statusMessage(true)};this.deactivate=function(o){this.cancelSearch(o);var n=this.$editor;n.keyBinding.removeKeyboardHandler(this.$keyboardHandler);if(this.$mousedownHandler){n.removeEventListener("mousedown",this.$mousedownHandler);delete this.$mousedownHandler}n.onPaste=this.$originalEditorOnPaste;this.message("")};this.selectionFix=function(n){if(n.selection.isEmpty()&&!n.session.$emacsMark){n.clearSelection()}};this.highlight=function(p){var o=this.$editor.session,n=o.$isearchHighlight=o.$isearchHighlight||o.addDynamicMarker(new l(null,"ace_isearch-result","text"));n.setRegexp(p);o._emit("changeBackMarker")};this.cancelSearch=function(n){var o=this.$editor;this.$prevNeedle=this.$options.needle;this.$options.needle="";if(n){o.moveCursorToPosition(this.$startPos);this.$currentPos=this.$startPos}else{o.pushEmacsMark&&o.pushEmacsMark(this.$startPos,false)}this.highlight(null);return c.fromPoints(this.$currentPos,this.$currentPos)};this.highlightAndFindWithNeedle=function(p,n){if(!this.$editor){return null}var o=this.$options;if(n){o.needle=n.call(this,o.needle||"")||""}if(o.needle.length===0){this.statusMessage(true);return this.cancelSearch(true)}o.start=this.$currentPos;var r=this.$editor.session,q=this.find(r);if(q){if(o.backwards){q=c.fromPoints(q.end,q.start)}this.$editor.moveCursorToPosition(q.end);if(p){this.$currentPos=q.end}this.highlight(o.re)}this.statusMessage(q);return q};this.addString=function(n){return this.highlightAndFindWithNeedle(false,function(o){return o+n})};this.removeChar=function(n){return this.highlightAndFindWithNeedle(false,function(o){return o.length>0?o.substring(0,o.length-1):o})};this.next=function(n){n=n||{};this.$options.backwards=!!n.backwards;this.$currentPos=this.$editor.getCursorPosition();return this.highlightAndFindWithNeedle(true,function(o){return n.useCurrentOrPrevSearch&&o.length===0?this.$prevNeedle||"":o})};this.onMouseDown=function(n){this.deactivate();return true};this.onPaste=function(n){this.addString(n)};this.statusMessage=function(o){var n=this.$options,p="";p+=n.backwards?"reverse-":"";p+="isearch: "+n.needle;p+=o?"":" (not found)";this.message(p)};this.message=function(n){if(this.$editor.showCommandLine){this.$editor.showCommandLine(n);this.$editor.focus()}else{console.log(n)}}}).call(g.prototype);h.IncrementalSearch=g;var f=d("./lib/dom");f.importCssString&&f.importCssString(".ace_marker-layer .ace_isearch-result { position: absolute; z-index: 6; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;}div.ace_isearch-result { border-radius: 4px; background-color: rgba(255, 200, 0, 0.5); box-shadow: 0 0 4px rgb(255, 200, 0);}.ace_dark div.ace_isearch-result { background-color: rgb(100, 110, 160); box-shadow: 0 0 4px rgb(80, 90, 140);}","incremental-search-highlighting");var a=d("./commands/command_manager");(function(){this.setupIncrementalSearch=function(n,p){if(this.usesIncrementalSearch==p){return}this.usesIncrementalSearch=p;var o=m.iSearchStartCommands;var q=p?"addCommands":"removeCommands";this[q](o)}}).call(a.CommandManager.prototype);var i=d("./editor").Editor;d("./config").defineOptions(i.prototype,"editor",{useIncrementalSearch:{set:function(n){this.keyBinding.$handlers.forEach(function(o){if(o.setupIncrementalSearch){o.setupIncrementalSearch(this,n)}});this._emit("incrementalSearchSettingChanged",{isEnabled:n})}}})});define("ace/commands/incremental_search_commands",["require","exports","module","ace/config","ace/lib/oop","ace/keyboard/hash_handler","ace/commands/occur_commands"],function(c,a,d){var b=c("../config");var h=c("../lib/oop");var g=c("../keyboard/hash_handler").HashHandler;var f=c("./occur_commands").occurStartCommand;a.iSearchStartCommands=[{name:"iSearch",bindKey:{win:"Ctrl-F",mac:"Command-F"},exec:function(j,i){b.loadModule(["core","ace/incremental_search"],function(l){var k=l.iSearch=l.iSearch||new l.IncrementalSearch();k.activate(j,i.backwards);if(i.jumpToFirstMatch){k.next(i)}})},readOnly:true},{name:"iSearchBackwards",exec:function(i,j){i.execCommand("iSearch",{backwards:true})},readOnly:true},{name:"iSearchAndGo",bindKey:{win:"Ctrl-K",mac:"Command-G"},exec:function(i,j){i.execCommand("iSearch",{jumpToFirstMatch:true,useCurrentOrPrevSearch:true})},readOnly:true},{name:"iSearchBackwardsAndGo",bindKey:{win:"Ctrl-Shift-K",mac:"Command-Shift-G"},exec:function(i){i.execCommand("iSearch",{jumpToFirstMatch:true,backwards:true,useCurrentOrPrevSearch:true})},readOnly:true}];a.iSearchCommands=[{name:"restartSearch",bindKey:{win:"Ctrl-F",mac:"Command-F"},exec:function(i){i.cancelSearch(true)},readOnly:true,isIncrementalSearchCommand:true},{name:"searchForward",bindKey:{win:"Ctrl-S|Ctrl-K",mac:"Ctrl-S|Command-G"},exec:function(i,j){j.useCurrentOrPrevSearch=true;i.next(j)},readOnly:true,isIncrementalSearchCommand:true},{name:"searchBackward",bindKey:{win:"Ctrl-R|Ctrl-Shift-K",mac:"Ctrl-R|Command-Shift-G"},exec:function(i,j){j.useCurrentOrPrevSearch=true;j.backwards=true;i.next(j)},readOnly:true,isIncrementalSearchCommand:true},{name:"extendSearchTerm",exec:function(i,j){i.addString(j)},readOnly:true,isIncrementalSearchCommand:true},{name:"extendSearchTermSpace",bindKey:"space",exec:function(i){i.addString(" ")},readOnly:true,isIncrementalSearchCommand:true},{name:"shrinkSearchTerm",bindKey:"backspace",exec:function(i){i.removeChar()},readOnly:true,isIncrementalSearchCommand:true},{name:"confirmSearch",bindKey:"return",exec:function(i){i.deactivate()},readOnly:true,isIncrementalSearchCommand:true},{name:"cancelSearch",bindKey:"esc|Ctrl-G",exec:function(i){i.deactivate(true)},readOnly:true,isIncrementalSearchCommand:true},{name:"occurisearch",bindKey:"Ctrl-O",exec:function(i){var j=h.mixin({},i.$options);i.deactivate();f.exec(i.$editor,j)},readOnly:true,isIncrementalSearchCommand:true},{name:"yankNextWord",bindKey:"Ctrl-w",exec:function(k){var j=k.$editor,i=j.selection.getRangeOfMovements(function(m){m.moveCursorWordRight()}),l=j.session.getTextRange(i);k.addString(l)},readOnly:true,isIncrementalSearchCommand:true},{name:"yankNextChar",bindKey:"Ctrl-Alt-y",exec:function(k){var j=k.$editor,i=j.selection.getRangeOfMovements(function(m){m.moveCursorRight()}),l=j.session.getTextRange(i);k.addString(l)},readOnly:true,isIncrementalSearchCommand:true},{name:"recenterTopBottom",bindKey:"Ctrl-l",exec:function(i){i.$editor.execCommand("recenterTopBottom")},readOnly:true,isIncrementalSearchCommand:true}];function e(i){this.$iSearch=i}h.inherits(e,g);(function(){this.attach=function(k){var j=this.$iSearch;g.call(this,a.iSearchCommands,k.commands.platform);this.$commandExecHandler=k.commands.addEventListener("exec",function(l){if(!l.command.isIncrementalSearchCommand){return undefined}l.stopPropagation();l.preventDefault();return l.command.exec(j,l.args||{})})};this.detach=function(j){if(!this.$commandExecHandler){return}j.commands.removeEventListener("exec",this.$commandExecHandler);delete this.$commandExecHandler};var i=this.handleKeyboard;this.handleKeyboard=function(n,l,k,o){if(((l===1||l===8)&&k==="v")||(l===1&&k==="y")){return null}var m=i.call(this,n,l,k,o);if(m.command){return m}if(l==-1){var j=this.commands.extendSearchTerm;if(j){return{command:j,args:k}}}return{command:"null",passEvent:l==0||l==4}}}).call(e.prototype);a.IncrementalSearchKeyboardHandler=e});define("ace/commands/occur_commands",["require","exports","module","ace/config","ace/occur","ace/keyboard/hash_handler","ace/lib/oop"],function(d,f,b){var c=d("../config"),a=d("../occur").Occur;var j={name:"occur",exec:function(m,l){var n=!!m.session.$occur;var k=new a().enter(m,l);if(k&&!n){i.installIn(m)}},readOnly:true};var e=[{name:"occurexit",bindKey:"esc|Ctrl-G",exec:function(l){var k=l.session.$occur;if(!k){return}k.exit(l,{});if(!l.session.$occur){i.uninstallFrom(l)}},readOnly:true},{name:"occuraccept",bindKey:"enter",exec:function(l){var k=l.session.$occur;if(!k){return}k.exit(l,{translatePosition:true});if(!l.session.$occur){i.uninstallFrom(l)}},readOnly:true}];var g=d("../keyboard/hash_handler").HashHandler;var h=d("../lib/oop");function i(){}h.inherits(i,g);(function(){this.isOccurHandler=true;this.attach=function(l){g.call(this,e,l.commands.platform);this.$editor=l};var k=this.handleKeyboard;this.handleKeyboard=function(o,m,l,p){var n=k.call(this,o,m,l,p);return(n&&n.command)?n:undefined}}).call(i.prototype);i.installIn=function(l){var k=new this();l.keyBinding.addKeyboardHandler(k);l.commands.addCommands(e)};i.uninstallFrom=function(l){l.commands.removeCommands(e);var k=l.getKeyboardHandler();if(k.isOccurHandler){l.keyBinding.removeKeyboardHandler(k)}};f.occurStartCommand=j});define("ace/occur",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/edit_session","ace/search_highlight","ace/lib/dom"],function(e,h,c){var i=e("./lib/oop");var d=e("./range").Range;var f=e("./search").Search;var a=e("./edit_session").EditSession;var j=e("./search_highlight").SearchHighlight;function b(){}i.inherits(b,f);(function(){this.enter=function(m,l){if(!l.needle){return false}var n=m.getCursorPosition();this.displayOccurContent(m,l);var k=this.originalToOccurPosition(m.session,n);m.moveCursorToPosition(k);return true};this.exit=function(m,l){var n=l.translatePosition&&m.getCursorPosition();var k=n&&this.occurToOriginalPosition(m.session,n);this.displayOriginalContent(m);if(k){m.moveCursorToPosition(k)}return true};this.highlight=function(l,m){var k=l.$occurHighlight=l.$occurHighlight||l.addDynamicMarker(new j(null,"ace_occur-highlight","text"));k.setRegexp(m);l._emit("changeBackMarker")};this.displayOccurContent=function(n,m){this.$originalSession=n.session;var o=this.matchingLines(n.session,m);var k=o.map(function(p){return p.content});var l=new a(k.join("\n"));l.$occur=this;l.$occurMatchingLines=o;n.setSession(l);this.$useEmacsStyleLineStart=this.$originalSession.$useEmacsStyleLineStart;l.$useEmacsStyleLineStart=this.$useEmacsStyleLineStart;this.highlight(l,m.re);l._emit("changeBackMarker")};this.displayOriginalContent=function(k){k.setSession(this.$originalSession);this.$originalSession.$useEmacsStyleLineStart=this.$useEmacsStyleLineStart};this.originalToOccurPosition=function(m,o){var k=m.$occurMatchingLines;var n={row:0,column:0};if(!k){return n}for(var l=0;l1){if(b.inputBuffer.idle&&h[j]){return h[j]}var i=b.inputBuffer.push(k,j);return{command:"null",passEvent:!i}}else{if(j.length==1&&(l===0||l==4)){return{command:"null",passEvent:true}}else{if(j=="esc"&&l===0){return{command:a.stop}}}}}else{if(j=="ctrl-w"){return{command:"removewordleft"}}}}}},attach:function(i){i.on("click",e.onCursorMove);if(d.currentMode!=="insert"){b.coreCommands.stop.exec(i)}i.$vimModeHandler=this;this.updateMacCompositionHandlers(i,true)},detach:function(i){i.removeListener("click",e.onCursorMove);d.noMode(i);d.currentMode="normal";this.updateMacCompositionHandlers(i,false)},actions:b.actions,getStatusText:function(){if(d.currentMode=="insert"){return"INSERT"}if(d.onVisualMode){return(d.onVisualLineMode?"VISUAL LINE ":"VISUAL ")+b.inputBuffer.status}return b.inputBuffer.status}};e.onCursorMove=function(i){b.onCursorMove(i.editor,i);e.onCursorMove.scheduled=false}});define("ace/keyboard/vim/commands",["require","exports","module","ace/lib/lang","ace/keyboard/vim/maps/util","ace/keyboard/vim/maps/motions","ace/keyboard/vim/maps/operators","ace/keyboard/vim/maps/aliases","ace/keyboard/vim/registers"],function(h,x,b){var y=h("../../lib/lang");var a=h("./maps/util");var q=h("./maps/motions");var r=h("./maps/operators");var n=h("./maps/aliases");var u=h("./registers");var m=1;var j=2;var c=3;var s=4;var v=8;var i=function i(A,B,z){while(0B.$size.scrollerHeight){A=B.$size.scrollerHeight/2}if(B.scrollTop>C-A){B.session.setScrollTop(C-A)}if(B.scrollTop+B.$size.scrollerHeight1){C=C=="return"?"\n":C=="tab"?"\t":C}i(function(){A.insert(C)},B||1);A.navigateLeft()}}},R:{fn:function(A,z,B,C){a.insertMode(A);A.setOverwrite(true)}},"~":{fn:function(A,z,B){i(function(){var C=A.selection.getRange();if(C.isEmpty()){C.end.column++}var D=A.session.getTextRange(C);var E=D.toUpperCase();if(E==D){A.navigateRight()}else{A.session.replace(C,E)}},B||1)}},"*":{fn:function(A,z,C,D){A.selection.selectWord();A.findNext();d(A);var B=A.selection.getRange();A.selection.setSelectionRange(B,true)}},"#":{fn:function(A,z,C,D){A.selection.selectWord();A.findPrevious();d(A);var B=A.selection.getRange();A.selection.setSelectionRange(B,true)}},m:{param:true,fn:function(B,z,C,E){var A=B.session;var D=A.vimMarkers||(A.vimMarkers={});var F=B.getCursorPosition();if(!D[E]){D[E]=B.session.doc.createAnchor(F)}D[E].setPosition(F.row,F.column,true)}},n:{fn:function(B,z,D,E){var A=B.getLastSearchOptions();A.backwards=false;B.selection.moveCursorRight();B.selection.clearSelection();B.findNext(A);d(B);var C=B.selection.getRange();C.end.row=C.start.row;C.end.column=C.start.column;B.selection.setSelectionRange(C,true)}},N:{fn:function(B,z,D,E){var A=B.getLastSearchOptions();A.backwards=true;B.findPrevious(A);d(B);var C=B.selection.getRange();C.end.row=C.start.row;C.end.column=C.start.column;B.selection.setSelectionRange(C,true)}},v:{fn:function(A,z,B,C){A.selection.selectRight();a.visualMode(A,false)},acceptsMotion:true},V:{fn:function(A,z,B,D){var C=A.getCursorPosition().row;A.selection.moveTo(C,0);A.selection.selectLineEnd();A.selection.visualLineStart=C;a.visualMode(A,true)},acceptsMotion:true},Y:{fn:function(A,z,B,C){a.copyLine(A)}},p:{fn:function(A,z,C,E){var B=u._default;A.setOverwrite(false);if(B.isLine){var F=A.getCursorPosition();F.column=A.session.getLine(F.row).length;var D=y.stringRepeat("\n"+B.text,C||1);A.session.insert(F,D);A.moveCursorTo(F.row+1,0)}else{A.navigateRight();A.insert(y.stringRepeat(B.text,C||1));A.navigateLeft()}A.setOverwrite(true);A.selection.clearSelection()}},P:{fn:function(A,z,C,E){var B=u._default;A.setOverwrite(false);if(B.isLine){var F=A.getCursorPosition();F.column=0;var D=y.stringRepeat(B.text+"\n",C||1);A.session.insert(F,D);A.moveCursorToPosition(F)}else{A.insert(y.stringRepeat(B.text,C||1))}A.setOverwrite(true);A.selection.clearSelection()}},J:{fn:function(E,C,D,A){var F=E.session;C=E.getSelectionRange();var G={row:C.start.row,column:C.start.column};D=D||C.end.row-C.start.row;var H=Math.min(G.row+(D||1),F.getLength()-1);C.start.column=F.getLine(G.row).length;C.end.column=F.getLine(H).length;C.end.row=H;var I="";for(var B=G.row;B1){C=".,.+"+B+C}if(A.showCommandLine){A.showCommandLine(C)}}},"/":{fn:function(A,z,B,C){if(A.showCommandLine){A.showCommandLine("/")}}},"?":{fn:function(A,z,B,C){if(A.showCommandLine){A.showCommandLine("?")}}},".":{fn:function(A,z,C,D){a.onInsertReplaySequence=o.lastInsertCommands;var B=o.previous;if(B){o.exec(A,B.action,B.param)}}},"ctrl-x":{fn:function(A,z,B,C){A.modifyNumber(-(B||1))}},"ctrl-a":{fn:function(A,z,B,C){A.modifyNumber(B||1)}}};var o=x.inputBuffer={accepting:[m,j,c,s],currentCmd:null,currentCount:"",status:"",operator:null,motion:null,lastInsertCommands:[],push:function(D,C,G){var B=this.status;var E=true;this.idle=false;var F=this.waitingForParam;if(/^numpad\d+$/i.test(C)){C=C.substr(6)}if(F){this.exec(D,F,C)}else{if(!(C==="0"&&!this.currentCount.length)&&(/^\d+$/.test(C)&&this.isAccepting(m))){this.currentCount+=C;this.currentCmd=m;this.accepting=[m,j,c,s]}else{if(!this.operator&&this.isAccepting(j)&&r[C]){this.operator={ch:C,count:this.getCount()};this.currentCmd=j;this.accepting=[m,c,s];this.exec(D,{operator:this.operator})}else{if(q[C]&&this.isAccepting(c)){this.currentCmd=c;var A={operator:this.operator,motion:{ch:C,count:this.getCount()}};if(q[C].param){this.waitForParam(A)}else{this.exec(D,A)}}else{if(n[C]&&this.isAccepting(c)){n[C].operator.count=this.getCount();this.exec(D,n[C])}else{if(k[C]&&this.isAccepting(s)){var z={action:{fn:k[C].fn,count:this.getCount()}};if(k[C].param){this.waitForParam(z)}else{this.exec(D,z)}if(k[C].acceptsMotion){this.idle=false}}else{if(this.operator){this.operator.count=this.getCount();this.exec(D,{operator:this.operator},C)}else{E=C.length==1;this.reset()}}}}}}}if(this.waitingForParam||this.motion||this.operator){this.status+=C}else{if(this.currentCount){this.status=this.currentCount}else{if(this.status){this.status=""}}}if(this.status!=B){D._emit("changeStatus")}return E},waitForParam:function(z){this.waitingForParam=z},getCount:function(){var z=this.currentCount;this.currentCount="";return z&&parseInt(z,10)},exec:function(F,D,A){var B=D.motion;var z=D.operator;var H=D.action;if(!A){A=D.param}if(z){this.previous={action:D,param:A}}if(z&&!F.selection.isEmpty()){if(r[z.ch].selFn){r[z.ch].selFn(F,F.getSelectionRange(),z.count,A);this.reset()}return}else{if(!B&&!H&&z&&A){r[z.ch].fn(F,null,z.count,A);this.reset()}else{if(B){var C=function(I){if(I&&typeof I==="function"){if(B.count&&!E.handlesCount){i(I,B.count,[F,null,B.count,A])}else{I(F,null,B.count,A)}}};var E=q[B.ch];var G=E.sel;if(!z){if((a.onVisualMode||a.onVisualLineMode)&&G){C(E.sel)}else{C(E.nav)}}else{if(G){i(function(){C(E.sel);r[z.ch].fn(F,F.getSelectionRange(),z.count,A)},z.count||1)}}this.reset()}else{if(H){H.fn(F,F.getSelectionRange(),H.count,A);this.reset()}}}}l(F)},isAccepting:function(z){return this.accepting.indexOf(z)!==-1},reset:function(){this.operator=null;this.motion=null;this.currentCount="";this.status="";this.accepting=[m,j,c,s];this.idle=true;this.waitingForParam=null}};function e(z){o.previous={action:{action:{fn:z}}}}x.coreCommands={start:{exec:function f(z){a.insertMode(z);e(f)}},startBeginning:{exec:function g(z){z.navigateLineStart();a.insertMode(z);e(g)}},stop:{exec:function p(z){o.reset();a.onVisualMode=false;a.onVisualLineMode=false;o.lastInsertCommands=a.normalMode(z)}},append:{exec:function t(z){var B=z.getCursorPosition();var A=z.session.getLine(B.row).length;if(A){z.navigateRight()}a.insertMode(z);e(t)}},appendEnd:{exec:function w(z){z.navigateLineEnd();a.insertMode(z);e(w)}}};var l=x.onCursorMove=function(z,D){if(a.currentMode==="insert"||l.running){return}else{if(!z.selection.isEmpty()){l.running=true;if(a.onVisualLineMode){var C=z.selection.visualLineStart;var E=z.getCursorPosition().row;if(C<=E){var B=z.session.getLine(E);z.selection.moveTo(C,0);z.selection.selectTo(E,B.length)}else{var B=z.session.getLine(C);z.selection.moveTo(C,B.length);z.selection.selectTo(E,0)}}l.running=false;return}else{if(D&&(a.onVisualLineMode||a.onVisualMode)){z.selection.clearSelection();a.normalMode(z)}l.running=true;var F=z.getCursorPosition();var A=z.session.getLine(F.row).length;if(A&&F.column===A){z.navigateLeft()}l.running=false}}}});define("ace/keyboard/vim/maps/util",["require","exports","module","ace/keyboard/vim/registers","ace/lib/dom"],function(c,b,d){var a=c("../registers");var e=c("../../../lib/dom");e.importCssString(".insert-mode .ace_cursor{ border-left: 2px solid #333333;}.ace_dark.insert-mode .ace_cursor{ border-left: 2px solid #eeeeee;}.normal-mode .ace_cursor{ border: 0!important; background-color: red; opacity: 0.5;}","vimMode");d.exports={onVisualMode:false,onVisualLineMode:false,currentMode:"normal",noMode:function(f){f.unsetStyle("insert-mode");f.unsetStyle("normal-mode");if(f.commands.recording){f.commands.toggleRecording(f)}f.setOverwrite(false)},insertMode:function(f){this.currentMode="insert";f.setStyle("insert-mode");f.unsetStyle("normal-mode");f.setOverwrite(false);f.keyBinding.$data.buffer="";f.keyBinding.$data.state="insertMode";this.onVisualMode=false;this.onVisualLineMode=false;if(this.onInsertReplaySequence){f.commands.macro=this.onInsertReplaySequence;f.commands.replay(f);this.onInsertReplaySequence=null;this.normalMode(f)}else{f._emit("changeStatus");if(!f.commands.recording){f.commands.toggleRecording(f)}}},normalMode:function(f){this.currentMode="normal";f.unsetStyle("insert-mode");f.setStyle("normal-mode");f.clearSelection();var g;if(!f.getOverwrite()){g=f.getCursorPosition();if(g.column>0){f.navigateLeft()}}f.setOverwrite(true);f.keyBinding.$data.buffer="";f.keyBinding.$data.state="start";this.onVisualMode=false;this.onVisualLineMode=false;f._emit("changeStatus");if(f.commands.recording){f.commands.toggleRecording(f);return f.commands.macro}else{return[]}},visualMode:function(g,f){if((this.onVisualLineMode&&f)||(this.onVisualMode&&!f)){this.normalMode(g);return}g.setStyle("insert-mode");g.unsetStyle("normal-mode");g._emit("changeStatus");if(f){this.onVisualLineMode=true}else{this.onVisualMode=true;this.onVisualLineMode=false}},getRightNthChar:function(h,j,g,k){var f=h.getSession().getLine(j.row);var i=f.substr(j.column+1).split(g);return k~!@#$%^&*|+=\[\]{}`~?]/;var n=/[.\/\\()\"'-:,.;<>~!@#$%^&*|+=\[\]{}`~?]/;var a=/\s/;var l=function(q,s){var r=q.selection;this.range=r.getRange();s=s||r.selectionLead;this.row=s.row;this.col=s.column;var p=q.session.getLine(this.row);var t=q.session.getLength();this.ch=p[this.col]||"\n";this.skippedLines=0;this.next=function(){this.ch=p[++this.col]||this.handleNewLine(1);return this.ch};this.prev=function(){this.ch=p[--this.col]||this.handleNewLine(-1);return this.ch};this.peek=function(u){var v=p[this.col+u];if(v){return v}if(u==-1){return"\n"}if(this.col==p.length-1){return"\n"}return q.session.getLine(this.row+1)[0]||"\n"};this.handleNewLine=function(u){if(u==1){if(this.col==p.length){return"\n"}if(this.row==t-1){return""}this.col=0;this.row++;p=q.session.getLine(this.row);this.skippedLines++;return p[0]||"\n"}if(u==-1){if(this.row===0){return""}this.row--;p=q.session.getLine(this.row);this.col=p.length;this.skippedLines--;return"\n"}};this.debug=function(){console.log(p.substring(0,this.col)+"|"+this.ch+"'"+this.col+"'"+p.substr(this.col+1))}};var f=g("../../../search").Search;var o=new f();function k(q,r,p){o.$options.needle=r;o.$options.backwards=p==-1;return o.find(q.session)}var e=g("../../../range").Range;var m={};c.exports={w:new d(function(p){var q=new l(p);if(q.ch&&n.test(q.ch)){while(q.ch&&n.test(q.ch)){q.next()}}else{while(q.ch&&!j.test(q.ch)){q.next()}}while(q.ch&&a.test(q.ch)&&q.skippedLines<2){q.next()}q.skippedLines==2&&q.prev();return{column:q.col,row:q.row}}),W:new d(function(p){var q=new l(p);while(q.ch&&!(a.test(q.ch)&&!a.test(q.peek(1)))&&q.skippedLines<2){q.next()}if(q.skippedLines==2){q.prev()}else{q.next()}return{column:q.col,row:q.row}}),b:new d(function(p){var q=new l(p);q.prev();while(q.ch&&a.test(q.ch)&&q.skippedLines>-2){q.prev()}if(q.ch&&n.test(q.ch)){while(q.ch&&n.test(q.ch)){q.prev()}}else{while(q.ch&&!j.test(q.ch)){q.prev()}}q.ch&&q.next();return{column:q.col,row:q.row}}),B:new d(function(p){var q=new l(p);q.prev();while(q.ch&&!(!a.test(q.ch)&&a.test(q.peek(-1)))&&q.skippedLines>-2){q.prev()}if(q.skippedLines==-2){q.next()}return{column:q.col,row:q.row}}),e:new d(function(p){var q=new l(p);q.next();while(q.ch&&a.test(q.ch)){q.next()}if(q.ch&&n.test(q.ch)){while(q.ch&&n.test(q.ch)){q.next()}}else{while(q.ch&&!j.test(q.ch)){q.next()}}q.ch&&q.prev();return{column:q.col,row:q.row}}),E:new d(function(p){var q=new l(p);q.next();while(q.ch&&!(!a.test(q.ch)&&a.test(q.peek(1)))){q.next()}return{column:q.col,row:q.row}}),l:{nav:function(q){var s=q.getCursorPosition();var p=s.column;var r=q.session.getLine(s.row).length;if(r&&p!==r){q.navigateRight()}},sel:function(q){var s=q.getCursorPosition();var p=s.column;var r=q.session.getLine(s.row).length;if(r&&p!==r){q.selection.selectRight()}}},h:{nav:function(p){var q=p.getCursorPosition();if(q.column>0){p.navigateLeft()}},sel:function(p){var q=p.getCursorPosition();if(q.column>0){p.selection.selectLeft()}}},H:{nav:function(p){var q=p.renderer.getScrollTopRow();p.moveCursorTo(q)},sel:function(p){var q=p.renderer.getScrollTopRow();p.selection.selectTo(q)}},M:{nav:function(q){var p=q.renderer.getScrollTopRow();var s=q.renderer.getScrollBottomRow();var r=p+((s-p)/2);q.moveCursorTo(r)},sel:function(q){var p=q.renderer.getScrollTopRow();var s=q.renderer.getScrollBottomRow();var r=p+((s-p)/2);q.selection.selectTo(r)}},L:{nav:function(p){var q=p.renderer.getScrollBottomRow();p.moveCursorTo(q)},sel:function(p){var q=p.renderer.getScrollBottomRow();p.selection.selectTo(q)}},k:{nav:function(p){p.navigateUp()},sel:function(p){p.selection.selectUp()}},j:{nav:function(p){p.navigateDown()},sel:function(p){p.selection.selectDown()}},i:{param:true,sel:function(r,q,s,u){switch(u){case"w":r.selection.selectWord();break;case"W":r.selection.selectAWord();break;case"(":case"{":case"[":var t=r.getCursorPosition();var p=r.session.$findClosingBracket(u,t,/paren/);if(!p){return}var v=r.session.$findOpeningBracket(r.session.$brackets[u],t,/paren/);if(!v){return}v.column++;r.selection.setSelectionRange(e.fromPoints(v,p));break;case"'":case'"':case"/":var p=k(r,u,1);if(!p){return}var v=k(r,u,-1);if(!v){return}r.selection.setSelectionRange(e.fromPoints(v.end,p.start));break}}},a:{param:true,sel:function(r,q,s,u){switch(u){case"w":r.selection.selectAWord();break;case"W":r.selection.selectAWord();break;case"(":case"{":case"[":var t=r.getCursorPosition();var p=r.session.$findClosingBracket(u,t,/paren/);if(!p){return}var v=r.session.$findOpeningBracket(r.session.$brackets[u],t,/paren/);if(!v){return}p.column++;r.selection.setSelectionRange(e.fromPoints(v,p));break;case"'":case'"':case"/":var p=k(r,u,1);if(!p){return}var v=k(r,u,-1);if(!v){return}p.column++;r.selection.setSelectionRange(e.fromPoints(v.start,p.end));break}}},f:new d({param:true,handlesCount:true,getPos:function(t,q,u,w,p,r){if(!r){m={ch:"f",param:w}}var v=t.getCursorPosition();var s=i.getRightNthChar(t,v,w,u||1);if(typeof s==="number"){v.column+=s+(p?2:1);return v}}}),F:new d({param:true,handlesCount:true,getPos:function(t,q,u,w,p,r){if(!r){m={ch:"F",param:w}}var v=t.getCursorPosition();var s=i.getLeftNthChar(t,v,w,u||1);if(typeof s==="number"){v.column-=s+1;return v}}}),t:new d({param:true,handlesCount:true,getPos:function(t,q,u,w,p,r){if(!r){m={ch:"t",param:w}}var v=t.getCursorPosition();var s=i.getRightNthChar(t,v,w,u||1);if(r&&s==0&&!(u>1)){var s=i.getRightNthChar(t,v,w,2)}if(typeof s==="number"){v.column+=s+(p?1:0);return v}}}),T:new d({param:true,handlesCount:true,getPos:function(t,q,u,w,p,r){if(!r){m={ch:"T",param:w}}var v=t.getCursorPosition();var s=i.getLeftNthChar(t,v,w,u||1);if(r&&s==0&&!(u>1)){var s=i.getLeftNthChar(t,v,w,2)}if(typeof s==="number"){v.column-=s;return v}}}),";":new d({handlesCount:true,getPos:function(s,q,t,u,p){var r=m.ch;if(!r){return}return c.exports[r].getPos(s,q,t,m.param,p,true)}}),",":new d({handlesCount:true,getPos:function(t,r,u,v,q){var s=m.ch;if(!s){return}var p=s.toUpperCase();s=s===p?s.toLowerCase():p;return c.exports[s].getPos(t,r,u,m.param,q,true)}}),"^":{nav:function(p){p.navigateLineStart()},sel:function(p){p.selection.selectLineStart()}},"$":{handlesCount:true,nav:function(q,p,r,s){if(r>1){q.navigateDown(r-1)}q.navigateLineEnd()},sel:function(q,p,r,s){if(r>1){q.selection.moveCursorBy(r-1,0)}q.selection.selectLineEnd()}},"0":new d(function(p){return{row:p.selection.lead.row,column:0}}),G:{nav:function(q,p,r,s){if(!r&&r!==0){r=q.session.getLength()}q.gotoLine(r)},sel:function(q,p,r,s){if(!r&&r!==0){r=q.session.getLength()}q.selection.selectTo(r,0)}},g:{param:true,nav:function(q,p,r,s){switch(s){case"m":console.log("Middle line");break;case"e":console.log("End of prev word");break;case"g":q.gotoLine(r||0);case"u":q.gotoLine(r||0);case"U":q.gotoLine(r||0)}},sel:function(q,p,r,s){switch(s){case"m":console.log("Middle line");break;case"e":console.log("End of prev word");break;case"g":q.selection.selectTo(r||0,0)}}},o:{nav:function(q,p,s,t){s=s||1;var r="";while(00){q.navigateUp();q.navigateLineEnd();q.insert(r)}else{q.session.insert({row:0,column:0},r);q.navigateUp()}i.insertMode(q)}}},"%":new d(function(t){var s=/[\[\]{}()]/g;var u=t.getCursorPosition();var r=t.session.getLine(u.row)[u.column];if(!s.test(r)){var p=k(t,s);if(!p){return}u=p.start}var q=t.session.findMatchingBracket({row:u.row,column:u.column+1});return q}),"{":new d(function(p){var q=p.session;var r=q.selection.lead.row;while(r>0&&!/\S/.test(q.getLine(r))){r--}while(/\S/.test(q.getLine(r))){r--}return{column:0,row:r}}),"}":new d(function(q){var r=q.session;var p=r.getLength();var s=r.selection.lead.row;while(s":{selFn:function(h,f,j,k){j=j||1;for(var g=0;g":var l=h.getCursorPosition();h.selection.selectLine();for(var g=0;g>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"paren.lparen",regex:"[\\[\\(\\{]"},{token:"paren.rparen",regex:"[\\]\\)\\}]"},{token:"text",regex:"\\s+"}],define:[{token:"constant.language",regex:"def|class"},{token:"variable.language",regex:"[A-Za-z_][A-Za-z0-9_]*",next:"start"},{token:"text",regex:"\\s+"}],qqstring3:[{token:"constant.language.escape",regex:D},{token:"string",regex:'"{3}',next:"start"},{defaultToken:"string"}],qstring3:[{token:"constant.language.escape",regex:D},{token:"string",regex:"'{3}",next:"start"},{defaultToken:"string"}],qqstring:[{token:"constant.language.escape",regex:D},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"start"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:D},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"start"},{defaultToken:"string"}]}};f.inherits(c,a);b.PlotDeviceHighlightRules=c});define("ace/mode/folding/pythonic",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"],function(b,a,c){var d=b("../../lib/oop");var f=b("./fold_mode").FoldMode;var e=a.FoldMode=function(g){this.foldingStartMarker=new RegExp("([\\[{])(?:\\s*)$|("+g+")(?:\\s*)(?:#.*)?$")};d.inherits(e,f);(function(){this.getFoldWidgetRange=function(j,i,k){var g=j.getLine(k);var h=g.match(this.foldingStartMarker);if(h){if(h[1]){return this.openingBracketBlock(j,h[1],k,h.index)}if(h[2]){return this.indentationBlock(j,k,h.index+h[2].length)}return this.indentationBlock(j,k)}}}).call(e.prototype)});define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(f,i,d){var k=f("../../lib/oop");var h=f("../behaviour").Behaviour;var l=f("../../token_iterator").TokenIterator;var c=f("../../lib/lang");var j=["text","paren.rparen","punctuation.operator"];var e=["text","paren.rparen","punctuation.operator","comment"];var a;var g={};var b=function(n){var o=-1;if(n.multiSelect){o=n.selection.id;if(g.rangeCount!=n.multiSelect.rangeCount){g={rangeCount:n.multiSelect.rangeCount}}}if(g[o]){return a=g[o]}a=g[o]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}};var m=function(){this.add("braces","insertion",function(o,r,u,x,z){var A=u.getCursorPosition();var B=x.doc.getLine(A.row);if(z=="{"){b(u);var y=u.getSelectionRange();var s=x.doc.getTextRange(y);if(s!==""&&s!=="{"&&u.getWrapBehavioursEnabled()){return{text:"{"+s+"}",selection:false}}else{if(m.isSaneInsertion(u,x)){if(/[\]\}\)]/.test(B[A.column])||u.inMultiSelectMode){m.recordAutoInsert(u,x,"}");return{text:"{}",selection:[1,1]}}else{m.recordMaybeInsert(u,x,"{");return{text:"{",selection:[1,1]}}}}}else{if(z=="}"){b(u);var v=B.substring(A.column,A.column+1);if(v=="}"){var n=x.$findOpeningBracket("}",{column:A.column+1,row:A.row});if(n!==null&&m.isAutoInsertedClosing(A,B,z)){m.popAutoInsertedClosing();return{text:"",selection:[1,1]}}}}else{if(z=="\n"||z=="\r\n"){b(u);var q="";if(m.isMaybeInsertedClosing(A,B)){q=c.stringRepeat("}",a.maybeInsertedBrackets);m.clearMaybeInsertedClosing()}var v=B.substring(A.column,A.column+1);if(v==="}"){var w=x.findMatchingBracket({row:A.row,column:A.column+1},"}");if(!w){return null}var t=this.$getIndent(x.getLine(w.row))}else{if(q){var t=this.$getIndent(B)}else{m.clearMaybeInsertedClosing();return}}var p=t+x.getTabString();return{text:"\n"+p+"\n"+t+q,selection:[1,p.length,1,p.length]}}else{m.clearMaybeInsertedClosing()}}}});this.add("braces","deletion",function(s,r,q,t,o){var p=t.doc.getTextRange(o);if(!o.isMultiLine()&&p=="{"){b(q);var n=t.doc.getLine(o.start.row);var u=n.substring(o.end.column,o.end.column+1);if(u=="}"){o.end.column++;return o}else{a.maybeInsertedBrackets--}}});this.add("parens","insertion",function(o,p,r,t,v){if(v=="("){b(r);var u=r.getSelectionRange();var q=t.doc.getTextRange(u);if(q!==""&&r.getWrapBehavioursEnabled()){return{text:"("+q+")",selection:false}}else{if(m.isSaneInsertion(r,t)){m.recordAutoInsert(r,t,")");return{text:"()",selection:[1,1]}}}}else{if(v==")"){b(r);var w=r.getCursorPosition();var x=t.doc.getLine(w.row);var s=x.substring(w.column,w.column+1);if(s==")"){var n=t.$findOpeningBracket(")",{column:w.column+1,row:w.row});if(n!==null&&m.isAutoInsertedClosing(w,x,v)){m.popAutoInsertedClosing();return{text:"",selection:[1,1]}}}}}});this.add("parens","deletion",function(s,r,q,t,o){var p=t.doc.getTextRange(o);if(!o.isMultiLine()&&p=="("){b(q);var n=t.doc.getLine(o.start.row);var u=n.substring(o.start.column+1,o.start.column+2);if(u==")"){o.end.column++;return o}}});this.add("brackets","insertion",function(o,p,r,t,v){if(v=="["){b(r);var u=r.getSelectionRange();var q=t.doc.getTextRange(u);if(q!==""&&r.getWrapBehavioursEnabled()){return{text:"["+q+"]",selection:false}}else{if(m.isSaneInsertion(r,t)){m.recordAutoInsert(r,t,"]");return{text:"[]",selection:[1,1]}}}}else{if(v=="]"){b(r);var w=r.getCursorPosition();var x=t.doc.getLine(w.row);var s=x.substring(w.column,w.column+1);if(s=="]"){var n=t.$findOpeningBracket("]",{column:w.column+1,row:w.row});if(n!==null&&m.isAutoInsertedClosing(w,x,v)){m.popAutoInsertedClosing();return{text:"",selection:[1,1]}}}}}});this.add("brackets","deletion",function(s,r,q,t,o){var p=t.doc.getTextRange(o);if(!o.isMultiLine()&&p=="["){b(q);var n=t.doc.getLine(o.start.row);var u=n.substring(o.start.column+1,o.start.column+2);if(u=="]"){o.end.column++;return o}}});this.add("string_dquotes","insertion",function(o,r,u,y,C){if(C=='"'||C=="'"){b(u);var n=C;var A=u.getSelectionRange();var s=y.doc.getTextRange(A);if(s!==""&&s!=="'"&&s!='"'&&u.getWrapBehavioursEnabled()){return{text:n+s+n,selection:false}}else{var B=u.getCursorPosition();var E=y.doc.getLine(B.row);var D=E.substring(B.column-1,B.column);if(D=="\\"){return null}var w=y.getTokens(A.start.row);var p=0,q;var t=-1;for(var z=0;zA.start.column){break}p+=w[z].value.length}if(!q||(t<0&&q.type!=="comment"&&(q.type!=="string"||((A.start.column!==q.value.length+p-1)&&q.value.lastIndexOf(n)===q.value.length-1)))){if(!m.isSaneInsertion(u,y)){return}return{text:n+n,selection:[1,1]}}else{if(q&&q.type==="string"){var v=E.substring(B.column,B.column+1);if(v==n){return{text:"",selection:[1,1]}}}}}}});this.add("string_dquotes","deletion",function(s,r,q,t,o){var p=t.doc.getTextRange(o);if(!o.isMultiLine()&&(p=='"'||p=="'")){b(q);var n=t.doc.getLine(o.start.row);var u=n.substring(o.start.column+1,o.start.column+2);if(u==p){o.end.column++;return o}}})};m.isSaneInsertion=function(p,q){var r=p.getCursorPosition();var o=new l(q,r.row,r.column);if(!this.$matchTokenType(o.getCurrentToken()||"text",j)){var n=new l(q,r.row,r.column+1);if(!this.$matchTokenType(n.getCurrentToken()||"text",j)){return false}}o.stepForward();return o.getCurrentTokenRow()!==r.row||this.$matchTokenType(o.getCurrentToken()||"text",e)};m.$matchTokenType=function(o,n){return n.indexOf(o.type||o)>-1};m.recordAutoInsert=function(o,p,r){var q=o.getCursorPosition();var n=p.doc.getLine(q.row);if(!this.isAutoInsertedClosing(q,n,a.autoInsertedLineEnd[0])){a.autoInsertedBrackets=0}a.autoInsertedRow=q.row;a.autoInsertedLineEnd=r+n.substr(q.column);a.autoInsertedBrackets++};m.recordMaybeInsert=function(o,p,r){var q=o.getCursorPosition();var n=p.doc.getLine(q.row);if(!this.isMaybeInsertedClosing(q,n)){a.maybeInsertedBrackets=0}a.maybeInsertedRow=q.row;a.maybeInsertedLineStart=n.substr(0,q.column)+r;a.maybeInsertedLineEnd=n.substr(q.column);a.maybeInsertedBrackets++};m.isAutoInsertedClosing=function(p,n,o){return a.autoInsertedBrackets>0&&p.row===a.autoInsertedRow&&o===a.autoInsertedLineEnd[0]&&n.substr(p.column)===a.autoInsertedLineEnd};m.isMaybeInsertedClosing=function(o,n){return a.maybeInsertedBrackets>0&&o.row===a.maybeInsertedRow&&n.substr(o.column)===a.maybeInsertedLineEnd&&n.substr(0,o.column)==a.maybeInsertedLineStart};m.popAutoInsertedClosing=function(){a.autoInsertedLineEnd=a.autoInsertedLineEnd.substr(1);a.autoInsertedBrackets--};m.clearMaybeInsertedClosing=function(){if(a){a.maybeInsertedBrackets=0;a.maybeInsertedRow=-1}};k.inherits(m,h);i.CstyleBehaviour=m});define("ace/snippets/plotdevice",["require","exports","module"],function(b,a,c){a.snippetText='### general purpose\n\nsnippet {\n {"${1:k}":${2:v}, kw$3}\nsnippet kw\n "${1:k}":${2:v}, kw$3\nsnippet dict\n dict(${1:k}=${2:v}, dkw$3)\nsnippet dkw\n ${1:k}=${2:v}, dkw$3\nsnippet t\n True\nsnippet f\n False\nsnippet lorem\n lorem = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."\nsnippet draw\n def draw(state):\n print FRAME$1\nsnippet setup\n def setup(state):\n $1\nsnippet stop\n def stop(state):\n $1\nsnippet anim\n speed(${1:30})$2\n def setup(state):\n pass\n def draw(state):\n print FRAME\n def stop(state):\n pass\n\n\n### Some handy abbreviations borrowed from python.snippets\n\nsnippet imp\n import ${1:module}\nsnippet xi\n ${1:library} = ximport("$1")\nsnippet from\n from ${1:package} import ${2:module}\nsnippet wh\n while ${1:condition}:\n $2\nsnippet with\n with ${1:expr} as ${2:var}:\n $3\n# New Class\nsnippet cl\n class ${1:ClassName}(${2:object}):\n """${3:docstring for $1}"""\n def __init__(self, ${4:arg}):\n ${5:super($1, self).__init__()}\n $6\n# New Function\nsnippet def\n def ${1:fname}($2):\n $3\n# New Method\nsnippet defs\n def ${1:mname}(self, ${2:arg}):\n $3\n# Ifs\nsnippet if\n if ${1:condition}:\n $2\nsnippet el\n else:\n $1\nsnippet ei\n elif ${1:condition}:\n $2\n# For\nsnippet for\n for ${1:item} in ${2:items}:\n $3\nsnippet try\n try:\n ${1:# TODO: write code...}\n except ${2:Exception}, ${3:e}:\n ${4:raise $3}\n# if __name__ == \'__main__\':\nsnippet ifmain\n if __name__ == \'__main__\':\n ${1:main()}\n# __magic__\nsnippet _\n __${1:init}__${2}\n\n\n\n\n\n### signatures for the plotdevice api\n\nsnippet align\n align(${1:LEFT/RIGHT/CENTER/JUSTIFY})\nsnippet alpha\n alpha(${1:1.0})\nsnippet arc\n arc(${1:x}, ${2:y}, ${3:radius}${4:, range=${5:None}, ccw=${6:False}, close=${7:False}})\nsnippet arcto\n arcto(${1:x}, ${2:y}${3:, cx=${4:None}, cy=${5:None}, radius=${6:None}, ccw=${7:False}, close=${8:False}})\nsnippet arrow\n arrow(${1:x}, ${2:y}${3:, width=${4:100}, type=${5:NORMAL/FORTYFIVE}, plot=${6:True}})\nsnippet autoclosepath\n autoclosepath(${1:close=${2:True}})\nsnippet autotext\n autotext(${1:sourceFile})\nsnippet background\n background()\nsnippet beginclip\n beginclip(${1:stencil}${2:, mask=${3:False}, channel=${4:None}})\nsnippet beginpath\n beginpath(${1:${2:x}, ${3:y}})\nsnippet bezier\n bezier(${1:${2:x}, ${3:y}}, close=${4:True}, plot=${5:True})\nsnippet blend\n blend("${1:normal}")\nsnippet capstyle\n capstyle(${1:style=${2:BUTT/ROUND/SQUARE}})\nsnippet choice\n choice(${1:seq})\nsnippet clear\n clear(${1:all})\nsnippet clip\n clip(${1:stencil}${2:, channel="${3:black/white/alpha/red/green/blue}"})\nsnippet mask\n mask(${1:stencil}${2:, channel="${3:black/white/alpha/red/green/blue}"})\nsnippet closepath\n closepath()\nsnippet color\n color("${1:black}")\nsnippet colormode\n colormode(${1:mode=${2:RGB/HSB/CMYK}, range=${3:None}})\nsnippet colorrange\n colorrange(${1:maxval})\nsnippet curveto\n curveto(${1:x1}, ${2:y1}, ${3:x2}, ${4:y2}, ${5:x}, ${6:y}${7:, close=${8:False}})\nsnippet drawpath\n drawpath(${1:path})\nsnippet ellipse\n ellipse(${1:x}, ${2:y}, ${3:width}, ${4:height}${5:, range=${6:None}, ccw=${7:False}, close=${8:False}, plot=${9:True}})\nsnippet endclip\n endclip()\nsnippet endpath\n endpath(${1:plot=${2:True}})\nsnippet export\n export("${1:${2:document}.${3:mov}}"${4:, fps=${5:None}, loop=${6:None}, bitrate=${7:1.0}})\nsnippet files\n files("${1:${2:*}.${3:json}}", case=${4:True}})\nsnippet fill\n fill(${1:"#${2:000}"})\nsnippet findpath\n findpath(${1:points}${2:, curvature=${3:1.0}})\nsnippet findvar\n findvar(${1:name})\nsnippet font\n font("${1:HelveticaNeue-Medium}", ${2:12}})\nsnippet fonts\n fonts(${1:like="${2:akzidenz}", western=${3:True}})\nsnippet fontsize\n fontsize(${1:12})\nsnippet geometry\n geometry(${1:DEGREES/RADIANS/PERCENT})\nsnippet grid\n grid(${1:cols}, ${2:rows}${3:, colSize=${4:1}, rowSize=${5:1}, shuffled=${6:False}})\nsnippet image\n image("${1:image.png}", ${2:x}, ${3:y}${4:, width=${5:None}, height=${6:None}, plot=${7:True}})\nsnippet imagesize\n imagesize("${1:image.png}"${2:, data=${3:None}})\nsnippet joinstyle\n joinstyle(${1:MITER/ROUND/BEVEL})\nsnippet line\n line(${1:x1}, ${2:y1}, ${3:x2}, ${4:y2}${5:, plot=${6:True}})\nsnippet lineheight\n lineheight(${1:None})\nsnippet lineto\n lineto(${1:x}, ${2:y}${3:, close=${4:False}})\nsnippet measure\n measure(${1:obj})\nsnippet moveto\n moveto(${1:x}, ${2:y})\nsnippet nofill\n nofill()\nsnippet nostroke\n nostroke()\nsnippet noshadow\n noshadow()\nsnippet ordered\n ordered(${1:seq})\nsnippet outputmode\n outputmode(${1:RGB/CMYK})\nsnippet oval\n oval(${1:x}, ${2:y}, ${3:width}, ${4:height}${5:, range=${6:None}, ccw=${7:False}, close=${8:False}, plot=${9:True}})\nsnippet pen\n pen(${1:nib})\nsnippet plot\n plot(${1:obj})\nsnippet poly\n poly(${1:x}, ${2:y}, ${3:radius}, ${4:sides=4}${5:, plot=${6:True}})\nsnippet pop\n pop()\nsnippet push\n push()\nsnippet random\n random(${1:v1=${2:None}, v2=${3:None}})\nsnippet read\n read(${1:pth}${2:, format=${3:None}, encoding=${4:utf-8}, cols=${5:None}})\nsnippet rect\n rect(${1:x}, ${2:y}, ${3:width}, ${4:height}${5:, roundness=${6:0.0}, plot=${7:True}})\nsnippet reset\n reset()\nsnippet rotate\n rotate(${1:theta})\nsnippet scale\n scale(${1:x=${2:1}, y=${3:None}})\nsnippet shadow\n shadow(${1:"black"}, blur=${2:10}, offset=${3:10})))\nsnippet shuffled\n shuffled(${2:seq})\nsnippet size\n size(${1:width}, ${2:height}, unit=${4:px}})\nsnippet skew\n skew(${1:horizontal}, ${2:vertical})\nsnippet speed\n speed(${1:fps})\nsnippet star\n star(${1:x}, ${2:y}${3:, points=${4:20}, outer=${5:100}, inner=${6:None}, plot=${7:True}}})\nsnippet stroke\n stroke()\nsnippet strokewidth\n strokewidth(${1:width})\nsnippet text\n text("${1:txt}", ${2:x}, ${3:y}${4:, width=${5:None}, height=${6:None}, outline=${7:False}, plot=${8:True}})\nsnippet textheight\n textheight("${1:txt}"${2:, width=${3:None}})\nsnippet textmetrics\n textmetrics("${1:txt}"${2:, width=${3:None}, height=${4:None}})\nsnippet textpath\n textpath("${1:txt}", ${2:x}, ${3:y}${4:, width=${5:None}, height=${6:None}})\nsnippet textwidth\n textwidth("${1:txt}"${2:, width=${3:None}})\nsnippet transform\n transform()\nsnippet transform()\n with transform(${1:${2:CENTER/CORNER, }${3:...}}):\n $4\nsnippet translate\n translate(${1:x}, ${2:y})\nsnippet ximport\n ${1:libName} = ximport("$1")\n';a.scope="plotdevice"});define("ace/snippets/text",["require","exports","module"],function(b,a,c){a.snippetText="";a.scope="text"});define("ace/theme/ambiance",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-ambiance";a.cssText=".ace-ambiance .ace_gutter {background-color: #3d3d3d;background-image: -moz-linear-gradient(left, #3D3D3D, #333);background-image: -ms-linear-gradient(left, #3D3D3D, #333);background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#3D3D3D), to(#333));background-image: -webkit-linear-gradient(left, #3D3D3D, #333);background-image: -o-linear-gradient(left, #3D3D3D, #333);background-image: linear-gradient(left, #3D3D3D, #333);background-repeat: repeat-x;border-right: 1px solid #4d4d4d;text-shadow: 0px 1px 1px #4d4d4d;color: #222;}.ace-ambiance .ace_gutter-layer {background: repeat left top;}.ace-ambiance .ace_fold-widget {text-align: center;}.ace-ambiance .ace_fold-widget:hover {color: #777;}.ace-ambiance .ace_fold-widget.ace_start,.ace-ambiance .ace_fold-widget.ace_end,.ace-ambiance .ace_fold-widget.ace_closed{background: none;border: none;box-shadow: none;}.ace-ambiance .ace_fold-widget.ace_start:after {content: '\u25be'}.ace-ambiance .ace_fold-widget.ace_end:after {content: '\u25b4'}.ace-ambiance .ace_fold-widget.ace_closed:after {content: '\u2023'}.ace-ambiance .ace_print-margin {border-left: 1px dotted #2D2D2D;right: 0;background: #262626;}.ace-ambiance .ace_scroller {-webkit-box-shadow: inset 0 0 10px black;-moz-box-shadow: inset 0 0 10px black;-o-box-shadow: inset 0 0 10px black;box-shadow: inset 0 0 10px black;}.ace-ambiance {color: #E6E1DC;background-color: #202020;}.ace-ambiance .ace_cursor {border-left: 1px solid #7991E8;}.ace-ambiance .ace_overwrite-cursors .ace_cursor {border: 1px solid #FFE300;background: #766B13;}.ace-ambiance.normal-mode .ace_cursor-layer {z-index: 0;}.ace-ambiance .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20);}.ace-ambiance .ace_marker-layer .ace_selected-word {border-radius: 4px;border: 8px solid #3f475d;box-shadow: 0 0 4px black;}.ace-ambiance .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-ambiance .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25);}.ace-ambiance .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031);}.ace-ambiance .ace_invisible {color: #333;}.ace-ambiance .ace_paren {color: #24C2C7;}.ace-ambiance .ace_keyword {color: #cda869;}.ace-ambiance .ace_keyword.ace_operator {color: #fa8d6a;}.ace-ambiance .ace_punctuation.ace_operator {color: #fa8d6a;}.ace-ambiance .ace_identifier {}.ace-ambiance .ace-statement {color: #cda869;}.ace-ambiance .ace_constant {color: #CF7EA9;}.ace-ambiance .ace_constant.ace_language {color: #CF7EA9;}.ace-ambiance .ace_constant.ace_library {}.ace-ambiance .ace_constant.ace_numeric {color: #78CF8A;}.ace-ambiance .ace_invalid {text-decoration: underline;}.ace-ambiance .ace_invalid.ace_illegal {color:#F8F8F8;background-color: rgba(86, 45, 86, 0.75);}.ace-ambiance .ace_invalid,.ace-ambiance .ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1;}.ace-ambiance .ace_support {color: #9B859D;}.ace-ambiance .ace_support.ace_function {color: #DAD085;}.ace-ambiance .ace_function.ace_buildin {color: #9b859d;}.ace-ambiance .ace_string {color: #8f9d6a;}.ace-ambiance .ace_string.ace_regexp {color: #DAD085;}.ace-ambiance .ace_comment {font-style: italic;color: #555;}.ace-ambiance .ace_comment.ace_doc {}.ace-ambiance .ace_comment.ace_doc.ace_tag {color: #666;font-style: normal;}.ace-ambiance .ace_definition,.ace-ambiance .ace_type {color: #aac6e3;}.ace-ambiance .ace_variable {color: #9999cc;}.ace-ambiance .ace_variable.ace_language {color: #9b859d;}.ace-ambiance .ace_xml-pe {color: #494949;}.ace-ambiance .ace_gutter-layer,.ace-ambiance .ace_text-layer {background-image: url(\"data:image/png;base64,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\");}.ace-ambiance .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/blackboard",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-blackboard";a.cssText="/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: A2C6BAA7-90D0-4147-BBF5-96B0CD92D109) */.ace-blackboard .ace_gutter {background: #0c1021;color: #AEAEAE;}.ace-blackboard .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-blackboard {background-color: #0C1021;color: #F8F8F8;}.ace-blackboard .ace_cursor {color: rgba(255, 255, 255, 0.65);}.ace-blackboard .ace_marker-layer .ace_selection {background: #325087;}.ace-blackboard.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #0C1021;border-radius: 2px;}.ace-blackboard .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-blackboard .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25);}.ace-blackboard .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.059);}.ace-blackboard .ace_gutter-active-line {background-color: rgba(255, 255, 255, 0.059);}.ace-blackboard .ace_marker-layer .ace_selected-word {border: 1px solid #253B76;}.ace-blackboard .ace_fold {background-color: #FBDE2D;border-color: #F8F8F8;}.ace-blackboard .ace_keyword,.ace-blackboard .ace_storage {color: #FBDE2D;}.ace-blackboard .ace_constant {color: #D8FA3C;}.ace-blackboard .ace_support {color: #8DA6CE;}.ace-blackboard .ace_invalid.ace_illegal {color: #F8F8F8;background-color: #9D1E15;}.ace-blackboard .ace_invalid.ace_deprecated {font-style: italic;color: #AB2A1D;}.ace-blackboard .ace_string {color: #61CE3C;}.ace-blackboard .ace_invisible{color:rgba(174, 174, 174, 0.5);}.ace-blackboard .ace_comment {color: #AEAEAE;}.ace-blackboard .ace_meta.ace_tag {color: #7F90AA;}.ace-blackboard .ace_variable,.ace-blackboard .ace_variable.ace_language {color:rgba(255, 100, 0, 1.0);}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/chaos",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-chaos";a.cssText=".ace-chaos .ace_gutter {background: #141414;color: #595959;border-right: 1px solid #282828;}.ace-chaos .ace_gutter-cell.ace_warning {background-image: none;background: #FC0;border-left: none;padding-left: 0;color: #000;}.ace-chaos .ace_gutter-cell.ace_error {background-position: -6px center;background-image: none;background: #F10;border-left: none;padding-left: 0;color: #000;}.ace-chaos .ace_print-margin {border-left: 1px solid #555;right: 0;background: #1D1D1D;}.ace-chaos {background-color: #161616;color: #E6E1DC;}.ace-chaos .ace_cursor {border-left: 2px solid #FFFFFF;}.ace-chaos .ace_cursor.ace_overwrite {border-left: 0px;border-bottom: 1px solid #FFFFFF;}.ace-chaos .ace_marker-layer .ace_selection {background: #494836;}.ace-chaos .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-chaos .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #FCE94F;}.ace-chaos .ace_marker-layer .ace_active-line {background: #333;}.ace-chaos .ace_gutter-active-line {background-color: #222;}.ace-chaos .ace_invisible {color: #404040;}.ace-chaos .ace_keyword {color:#00698F;}.ace-chaos .ace_keyword.ace_operator {color:#FF308F;}.ace-chaos .ace_constant {color:#1EDAFB;}.ace-chaos .ace_constant.ace_language {color:#FDC251;}.ace-chaos .ace_constant.ace_library {color:#8DFF0A;}.ace-chaos .ace_constant.ace_numeric {color:#58C554;}.ace-chaos .ace_invalid {color:#FFFFFF;background-color:#990000;}.ace-chaos .ace_invalid.ace_deprecated {color:#FFFFFF;background-color:#990000;}.ace-chaos .ace_support {color: #999;}.ace-chaos .ace_support.ace_function {color:#00AEEF;}.ace-chaos .ace_function {color:#00AEEF;}.ace-chaos .ace_string {color:#58C554;}.ace-chaos .ace_comment {color:#555;font-style:italic;padding-bottom: 0px;}.ace-chaos .ace_variable {color:#997744;}.ace-chaos .ace_meta.ace_tag {color:#BE53E6;}.ace-chaos .ace_entity.ace_other.ace_attribute-name {color:#FFFF89;}.ace-chaos .ace_markup.ace_underline {text-decoration: underline;}.ace-chaos .ace_fold-widget {text-align: center;}.ace-chaos .ace_fold-widget:hover {color: #777;}.ace-chaos .ace_fold-widget.ace_start,.ace-chaos .ace_fold-widget.ace_end,.ace-chaos .ace_fold-widget.ace_closed{background: none;border: none;box-shadow: none;}.ace-chaos .ace_fold-widget.ace_start:after {content: '\u25be'}.ace-chaos .ace_fold-widget.ace_end:after {content: '\u25b4'}.ace-chaos .ace_fold-widget.ace_closed:after {content: '\u2023'}.ace-chaos .ace_indent-guide {border-right:1px dotted #333;margin-right:-1px;}.ace-chaos .ace_fold { background: #222; border-radius: 3px; color: #7AF; border: none; }.ace-chaos .ace_fold:hover {background: #CCC; color: #000;}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/chrome",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-chrome";a.cssText='.ace-chrome .ace_gutter {background: #ebebeb;color: #333;overflow : hidden;}.ace-chrome .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-chrome {background-color: #FFFFFF;color: black;}.ace-chrome .ace_cursor {color: black;}.ace-chrome .ace_invisible {color: rgb(191, 191, 191);}.ace-chrome .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-chrome .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-chrome .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-chrome .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-chrome .ace_fold {}.ace-chrome .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-chrome .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-chrome .ace_support.ace_type,.ace-chrome .ace_support.ace_class.ace-chrome .ace_support.ace_other {color: rgb(109, 121, 222);}.ace-chrome .ace_variable.ace_parameter {font-style:italic;color:#FD971F;}.ace-chrome .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-chrome .ace_comment {color: #236e24;}.ace-chrome .ace_comment.ace_doc {color: #236e24;}.ace-chrome .ace_comment.ace_doc.ace_tag {color: #236e24;}.ace-chrome .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-chrome .ace_variable {color: rgb(49, 132, 149);}.ace-chrome .ace_xml-pe {color: rgb(104, 104, 91);}.ace-chrome .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-chrome .ace_heading {color: rgb(12, 7, 255);}.ace-chrome .ace_list {color:rgb(185, 6, 144);}.ace-chrome .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-chrome .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-chrome .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-chrome .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-chrome .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-chrome .ace_gutter-active-line {background-color : #dcdcdc;}.ace-chrome .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-chrome .ace_storage,.ace-chrome .ace_keyword,.ace-chrome .ace_meta.ace_tag {color: rgb(147, 15, 128);}.ace-chrome .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-chrome .ace_string {color: #1A1AA6;}.ace-chrome .ace_entity.ace_other.ace_attribute-name {color: #994409;}.ace-chrome .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/clouds",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-clouds";a.cssText='.ace-clouds .ace_gutter {background: #ebebeb;color: #333}.ace-clouds .ace_print-margin {width: 1px;background: #e8e8e8}.ace-clouds {background-color: #FFFFFF;color: #000000}.ace-clouds .ace_cursor {color: #000000}.ace-clouds .ace_marker-layer .ace_selection {background: #BDD5FC}.ace-clouds.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;border-radius: 2px}.ace-clouds .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-clouds .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-clouds .ace_marker-layer .ace_active-line {background: #FFFBD1}.ace-clouds .ace_gutter-active-line {background-color : #dcdcdc}.ace-clouds .ace_marker-layer .ace_selected-word {border: 1px solid #BDD5FC}.ace-clouds .ace_invisible {color: #BFBFBF}.ace-clouds .ace_keyword,.ace-clouds .ace_meta,.ace-clouds .ace_support.ace_constant.ace_property-value {color: #AF956F}.ace-clouds .ace_keyword.ace_operator {color: #484848}.ace-clouds .ace_keyword.ace_other.ace_unit {color: #96DC5F}.ace-clouds .ace_constant.ace_language {color: #39946A}.ace-clouds .ace_constant.ace_numeric {color: #46A609}.ace-clouds .ace_constant.ace_character.ace_entity {color: #BF78CC}.ace-clouds .ace_invalid {background-color: #FF002A}.ace-clouds .ace_fold {background-color: #AF956F;border-color: #000000}.ace-clouds .ace_storage,.ace-clouds .ace_support.ace_class,.ace-clouds .ace_support.ace_function,.ace-clouds .ace_support.ace_other,.ace-clouds .ace_support.ace_type {color: #C52727}.ace-clouds .ace_string {color: #5D90CD}.ace-clouds .ace_comment {color: #BCC8BA}.ace-clouds .ace_entity.ace_name.ace_tag,.ace-clouds .ace_entity.ace_other.ace_attribute-name {color: #606060}.ace-clouds .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/clouds_midnight",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-clouds-midnight";a.cssText=".ace-clouds-midnight .ace_gutter {background: #232323;color: #929292}.ace-clouds-midnight .ace_print-margin {width: 1px;background: #232323}.ace-clouds-midnight {background-color: #191919;color: #929292}.ace-clouds-midnight .ace_cursor {color: #7DA5DC}.ace-clouds-midnight .ace_marker-layer .ace_selection {background: #000000}.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #191919;border-radius: 2px}.ace-clouds-midnight .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-clouds-midnight .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-clouds-midnight .ace_marker-layer .ace_active-line {background: rgba(215, 215, 215, 0.031)}.ace-clouds-midnight .ace_gutter-active-line {background-color: rgba(215, 215, 215, 0.031)}.ace-clouds-midnight .ace_marker-layer .ace_selected-word {border: 1px solid #000000}.ace-clouds-midnight .ace_invisible {color: #BFBFBF}.ace-clouds-midnight .ace_keyword,.ace-clouds-midnight .ace_meta,.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {color: #927C5D}.ace-clouds-midnight .ace_keyword.ace_operator {color: #4B4B4B}.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {color: #366F1A}.ace-clouds-midnight .ace_constant.ace_language {color: #39946A}.ace-clouds-midnight .ace_constant.ace_numeric {color: #46A609}.ace-clouds-midnight .ace_constant.ace_character.ace_entity {color: #A165AC}.ace-clouds-midnight .ace_invalid {color: #FFFFFF;background-color: #E92E2E}.ace-clouds-midnight .ace_fold {background-color: #927C5D;border-color: #929292}.ace-clouds-midnight .ace_storage,.ace-clouds-midnight .ace_support.ace_class,.ace-clouds-midnight .ace_support.ace_function,.ace-clouds-midnight .ace_support.ace_other,.ace-clouds-midnight .ace_support.ace_type {color: #E92E2E}.ace-clouds-midnight .ace_string {color: #5D90CD}.ace-clouds-midnight .ace_comment {color: #3C403B}.ace-clouds-midnight .ace_entity.ace_name.ace_tag,.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {color: #606060}.ace-clouds-midnight .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/cobalt",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-cobalt";a.cssText=".ace-cobalt .ace_gutter {background: #011e3a;color: #fff}.ace-cobalt .ace_print-margin {width: 1px;background: #011e3a}.ace-cobalt {background-color: #002240;color: #FFFFFF}.ace-cobalt .ace_cursor {color: #FFFFFF}.ace-cobalt .ace_marker-layer .ace_selection {background: rgba(179, 101, 57, 0.75)}.ace-cobalt.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #002240;border-radius: 2px}.ace-cobalt .ace_marker-layer .ace_step {background: rgb(127, 111, 19)}.ace-cobalt .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.15)}.ace-cobalt .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.35)}.ace-cobalt .ace_gutter-active-line {background-color: rgba(0, 0, 0, 0.35)}.ace-cobalt .ace_marker-layer .ace_selected-word {border: 1px solid rgba(179, 101, 57, 0.75)}.ace-cobalt .ace_invisible {color: rgba(255, 255, 255, 0.15)}.ace-cobalt .ace_keyword,.ace-cobalt .ace_meta {color: #FF9D00}.ace-cobalt .ace_constant,.ace-cobalt .ace_constant.ace_character,.ace-cobalt .ace_constant.ace_character.ace_escape,.ace-cobalt .ace_constant.ace_other {color: #FF628C}.ace-cobalt .ace_invalid {color: #F8F8F8;background-color: #800F00}.ace-cobalt .ace_support {color: #80FFBB}.ace-cobalt .ace_support.ace_constant {color: #EB939A}.ace-cobalt .ace_fold {background-color: #FF9D00;border-color: #FFFFFF}.ace-cobalt .ace_support.ace_function {color: #FFB054}.ace-cobalt .ace_storage {color: #FFEE80}.ace-cobalt .ace_entity {color: #FFDD00}.ace-cobalt .ace_string {color: #3AD900}.ace-cobalt .ace_string.ace_regexp {color: #80FFC2}.ace-cobalt .ace_comment {font-style: italic;color: #0088FF}.ace-cobalt .ace_heading,.ace-cobalt .ace_markup.ace_heading {color: #C8E4FD;background-color: #001221}.ace-cobalt .ace_list,.ace-cobalt .ace_markup.ace_list {background-color: #130D26}.ace-cobalt .ace_variable {color: #CCCCCC}.ace-cobalt .ace_variable.ace_language {color: #FF80E1}.ace-cobalt .ace_meta.ace_tag {color: #9EFFFF}.ace-cobalt .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/crimson_editor",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssText='.ace-crimson-editor .ace_gutter {background: #ebebeb;color: #333;overflow : hidden;}.ace-crimson-editor .ace_gutter-layer {width: 100%;text-align: right;}.ace-crimson-editor .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-crimson-editor {background-color: #FFFFFF;color: rgb(64, 64, 64);}.ace-crimson-editor .ace_cursor {color: black;}.ace-crimson-editor .ace_invisible {color: rgb(191, 191, 191);}.ace-crimson-editor .ace_identifier {color: black;}.ace-crimson-editor .ace_keyword {color: blue;}.ace-crimson-editor .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-crimson-editor .ace_constant.ace_language {color: rgb(255, 156, 0);}.ace-crimson-editor .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-crimson-editor .ace_invalid {text-decoration: line-through;color: rgb(224, 0, 0);}.ace-crimson-editor .ace_fold {}.ace-crimson-editor .ace_support.ace_function {color: rgb(192, 0, 0);}.ace-crimson-editor .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-crimson-editor .ace_support.ace_type,.ace-crimson-editor .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-crimson-editor .ace_keyword.ace_operator {color: rgb(49, 132, 149);}.ace-crimson-editor .ace_string {color: rgb(128, 0, 128);}.ace-crimson-editor .ace_comment {color: rgb(76, 136, 107);}.ace-crimson-editor .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-crimson-editor .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-crimson-editor .ace_constant.ace_numeric {color: rgb(0, 0, 64);}.ace-crimson-editor .ace_variable {color: rgb(0, 64, 128);}.ace-crimson-editor .ace_xml-pe {color: rgb(104, 104, 91);}.ace-crimson-editor .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-crimson-editor .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-crimson-editor .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-crimson-editor .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-crimson-editor .ace_marker-layer .ace_active-line {background: rgb(232, 242, 254);}.ace-crimson-editor .ace_gutter-active-line {background-color : #dcdcdc;}.ace-crimson-editor .ace_meta.ace_tag {color:rgb(28, 2, 255);}.ace-crimson-editor .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-crimson-editor .ace_string.ace_regex {color: rgb(192, 0, 192);}.ace-crimson-editor .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';a.cssClass="ace-crimson-editor";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/dawn",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-dawn";a.cssText=".ace-dawn .ace_gutter {background: #ebebeb;color: #333}.ace-dawn .ace_print-margin {width: 1px;background: #e8e8e8}.ace-dawn {background-color: #F9F9F9;color: #080808}.ace-dawn .ace_cursor {color: #000000}.ace-dawn .ace_marker-layer .ace_selection {background: rgba(39, 95, 255, 0.30)}.ace-dawn.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #F9F9F9;border-radius: 2px}.ace-dawn .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-dawn .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(75, 75, 126, 0.50)}.ace-dawn .ace_marker-layer .ace_active-line {background: rgba(36, 99, 180, 0.12)}.ace-dawn .ace_gutter-active-line {background-color : #dcdcdc}.ace-dawn .ace_marker-layer .ace_selected-word {border: 1px solid rgba(39, 95, 255, 0.30)}.ace-dawn .ace_invisible {color: rgba(75, 75, 126, 0.50)}.ace-dawn .ace_keyword,.ace-dawn .ace_meta {color: #794938}.ace-dawn .ace_constant,.ace-dawn .ace_constant.ace_character,.ace-dawn .ace_constant.ace_character.ace_escape,.ace-dawn .ace_constant.ace_other {color: #811F24}.ace-dawn .ace_invalid.ace_illegal {text-decoration: underline;font-style: italic;color: #F8F8F8;background-color: #B52A1D}.ace-dawn .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #B52A1D}.ace-dawn .ace_support {color: #691C97}.ace-dawn .ace_support.ace_constant {color: #B4371F}.ace-dawn .ace_fold {background-color: #794938;border-color: #080808}.ace-dawn .ace_list,.ace-dawn .ace_markup.ace_list,.ace-dawn .ace_support.ace_function {color: #693A17}.ace-dawn .ace_storage {font-style: italic;color: #A71D5D}.ace-dawn .ace_string {color: #0B6125}.ace-dawn .ace_string.ace_regexp {color: #CF5628}.ace-dawn .ace_comment {font-style: italic;color: #5A525F}.ace-dawn .ace_heading,.ace-dawn .ace_markup.ace_heading {color: #19356D}.ace-dawn .ace_variable {color: #234A97}.ace-dawn .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/dreamweaver",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-dreamweaver";a.cssText='.ace-dreamweaver .ace_gutter {background: #e8e8e8;color: #333;}.ace-dreamweaver .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-dreamweaver {background-color: #FFFFFF;color: black;}.ace-dreamweaver .ace_fold {background-color: #757AD8;}.ace-dreamweaver .ace_cursor {color: black;}.ace-dreamweaver .ace_invisible {color: rgb(191, 191, 191);}.ace-dreamweaver .ace_storage,.ace-dreamweaver .ace_keyword {color: blue;}.ace-dreamweaver .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-dreamweaver .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-dreamweaver .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-dreamweaver .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-dreamweaver .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-dreamweaver .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-dreamweaver .ace_support.ace_type,.ace-dreamweaver .ace_support.ace_class {color: #009;}.ace-dreamweaver .ace_support.ace_php_tag {color: #f00;}.ace-dreamweaver .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-dreamweaver .ace_string {color: #00F;}.ace-dreamweaver .ace_comment {color: rgb(76, 136, 107);}.ace-dreamweaver .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-dreamweaver .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-dreamweaver .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-dreamweaver .ace_variable {color: #06F}.ace-dreamweaver .ace_xml-pe {color: rgb(104, 104, 91);}.ace-dreamweaver .ace_entity.ace_name.ace_function {color: #00F;}.ace-dreamweaver .ace_heading {color: rgb(12, 7, 255);}.ace-dreamweaver .ace_list {color:rgb(185, 6, 144);}.ace-dreamweaver .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-dreamweaver .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-dreamweaver .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-dreamweaver .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-dreamweaver .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-dreamweaver .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-dreamweaver .ace_meta.ace_tag {color:#009;}.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {color:#060;}.ace-dreamweaver .ace_meta.ace_tag.ace_form {color:#F90;}.ace-dreamweaver .ace_meta.ace_tag.ace_image {color:#909;}.ace-dreamweaver .ace_meta.ace_tag.ace_script {color:#900;}.ace-dreamweaver .ace_meta.ace_tag.ace_style {color:#909;}.ace-dreamweaver .ace_meta.ace_tag.ace_table {color:#099;}.ace-dreamweaver .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-dreamweaver .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/eclipse",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssText='.ace-eclipse .ace_gutter {background: #ebebeb;border-right: 1px solid rgb(159, 159, 159);color: rgb(136, 136, 136);}.ace-eclipse .ace_print-margin {width: 1px;background: #ebebeb;}.ace-eclipse {background-color: #FFFFFF;color: black;}.ace-eclipse .ace_fold {background-color: rgb(60, 76, 114);}.ace-eclipse .ace_cursor {color: black;}.ace-eclipse .ace_storage,.ace-eclipse .ace_keyword,.ace-eclipse .ace_variable {color: rgb(127, 0, 85);}.ace-eclipse .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-eclipse .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-eclipse .ace_function {color: rgb(60, 76, 114);}.ace-eclipse .ace_string {color: rgb(42, 0, 255);}.ace-eclipse .ace_comment {color: rgb(113, 150, 130);}.ace-eclipse .ace_comment.ace_doc {color: rgb(63, 95, 191);}.ace-eclipse .ace_comment.ace_doc.ace_tag {color: rgb(127, 159, 191);}.ace-eclipse .ace_constant.ace_numeric {color: darkblue;}.ace-eclipse .ace_tag {color: rgb(25, 118, 116);}.ace-eclipse .ace_type {color: rgb(127, 0, 127);}.ace-eclipse .ace_xml-pe {color: rgb(104, 104, 91);}.ace-eclipse .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-eclipse .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-eclipse .ace_meta.ace_tag {color:rgb(25, 118, 116);}.ace-eclipse .ace_invisible {color: #ddd;}.ace-eclipse .ace_entity.ace_other.ace_attribute-name {color:rgb(127, 0, 127);}.ace-eclipse .ace_marker-layer .ace_step {background: rgb(255, 255, 0);}.ace-eclipse .ace_marker-layer .ace_active-line {background: rgb(232, 242, 254);}.ace-eclipse .ace_marker-layer .ace_selected-word {border: 1px solid rgb(181, 213, 255);}.ace-eclipse .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';a.cssClass="ace-eclipse";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/github",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-github";a.cssText='/* CSS style content from github\'s default pygments highlighter template.Cursor and selection styles from textmate.css. */.ace-github .ace_gutter {background: #e8e8e8;color: #AAA;}.ace-github {background: #fff;color: #000;}.ace-github .ace_keyword {font-weight: bold;}.ace-github .ace_string {color: #D14;}.ace-github .ace_variable.ace_class {color: teal;}.ace-github .ace_constant.ace_numeric {color: #099;}.ace-github .ace_constant.ace_buildin {color: #0086B3;}.ace-github .ace_support.ace_function {color: #0086B3;}.ace-github .ace_comment {color: #998;font-style: italic;}.ace-github .ace_variable.ace_language {color: #0086B3;}.ace-github .ace_paren {font-weight: bold;}.ace-github .ace_boolean {font-weight: bold;}.ace-github .ace_string.ace_regexp {color: #009926;font-weight: normal;}.ace-github .ace_variable.ace_instance {color: teal;}.ace-github .ace_constant.ace_language {font-weight: bold;}.ace-github .ace_cursor {color: black;}.ace-github .ace_marker-layer .ace_active-line {background: rgb(255, 255, 204);}.ace-github .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-github.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;border-radius: 2px;}/* bold keywords cause cursor issues for some fonts *//* this disables bold style for editor and keeps for static highlighter */.ace-github.ace_nobold .ace_line > span {font-weight: normal !important;}.ace-github .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-github .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-github .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-github .ace_gutter-active-line {background-color : rgba(0, 0, 0, 0.07);}.ace-github .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-github .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-github .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/idle_fingers",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-idle-fingers";a.cssText=".ace-idle-fingers .ace_gutter {background: #3b3b3b;color: #fff}.ace-idle-fingers .ace_print-margin {width: 1px;background: #3b3b3b}.ace-idle-fingers {background-color: #323232;color: #FFFFFF}.ace-idle-fingers .ace_cursor {color: #91FF00}.ace-idle-fingers .ace_marker-layer .ace_selection {background: rgba(90, 100, 126, 0.88)}.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #323232;border-radius: 2px}.ace-idle-fingers .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-idle-fingers .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-idle-fingers .ace_marker-layer .ace_active-line {background: #353637}.ace-idle-fingers .ace_gutter-active-line {background-color: #353637}.ace-idle-fingers .ace_marker-layer .ace_selected-word {border: 1px solid rgba(90, 100, 126, 0.88)}.ace-idle-fingers .ace_invisible {color: #404040}.ace-idle-fingers .ace_keyword,.ace-idle-fingers .ace_meta {color: #CC7833}.ace-idle-fingers .ace_constant,.ace-idle-fingers .ace_constant.ace_character,.ace-idle-fingers .ace_constant.ace_character.ace_escape,.ace-idle-fingers .ace_constant.ace_other,.ace-idle-fingers .ace_support.ace_constant {color: #6C99BB}.ace-idle-fingers .ace_invalid {color: #FFFFFF;background-color: #FF0000}.ace-idle-fingers .ace_fold {background-color: #CC7833;border-color: #FFFFFF}.ace-idle-fingers .ace_support.ace_function {color: #B83426}.ace-idle-fingers .ace_variable.ace_parameter {font-style: italic}.ace-idle-fingers .ace_string {color: #A5C261}.ace-idle-fingers .ace_string.ace_regexp {color: #CCCC33}.ace-idle-fingers .ace_comment {font-style: italic;color: #BC9458}.ace-idle-fingers .ace_meta.ace_tag {color: #FFE5BB}.ace-idle-fingers .ace_entity.ace_name {color: #FFC66D}.ace-idle-fingers .ace_collab.ace_user1 {color: #323232;background-color: #FFF980}.ace-idle-fingers .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/katzenmilch",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-katzenmilch";a.cssText=".ace-katzenmilch .ace_gutter,/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: ) */.ace-katzenmilch .ace_gutter {background: #e8e8e8;color: #333}.ace-katzenmilch .ace_print-margin {width: 1px;background: #e8e8e8}.ace-katzenmilch {background-color: #f3f2f3;color: rgba(15, 0, 9, 1.0)}.ace-katzenmilch .ace_cursor {border-left: 2px solid #100011}.ace-katzenmilch .ace_overwrite-cursors .ace_cursor {border-left: 0px;border-bottom: 1px solid #100011}.ace-katzenmilch .ace_marker-layer .ace_selection {background: rgba(100, 5, 208, 0.27)}.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #f3f2f3;border-radius: 2px}.ace-katzenmilch .ace_marker-layer .ace_step {background: rgb(198, 219, 174)}.ace-katzenmilch .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #000000}.ace-katzenmilch .ace_marker-layer .ace_active-line {background: rgb(232, 242, 254)}.ace-katzenmilch .ace_gutter-active-line {background-color: rgb(232, 242, 254)}.ace-katzenmilch .ace_marker-layer .ace_selected-word {border: 1px solid rgba(100, 5, 208, 0.27)}.ace-katzenmilch .ace_fold {background-color: rgba(2, 95, 73, 0.97);border-color: rgba(15, 0, 9, 1.0)}.ace-katzenmilch .ace_keyword {color: #674Aa8;rbackground-color: rgba(163, 170, 216, 0.055)}.ace-katzenmilch .ace_constant.ace_language {color: #7D7e52;rbackground-color: rgba(189, 190, 130, 0.059)}.ace-katzenmilch .ace_constant.ace_numeric {color: rgba(79, 130, 123, 0.93);rbackground-color: rgba(119, 194, 187, 0.059)}.ace-katzenmilch .ace_constant.ace_character,.ace-katzenmilch .ace_constant.ace_other {color: rgba(2, 95, 105, 1.0);rbackground-color: rgba(127, 34, 153, 0.063)}.ace-katzenmilch .ace_support.ace_function {color: #9D7e62;rbackground-color: rgba(189, 190, 130, 0.039)}.ace-katzenmilch .ace_support.ace_class {color: rgba(239, 106, 167, 1.0);rbackground-color: rgba(239, 106, 167, 0.063)}.ace-katzenmilch .ace_storage {color: rgba(123, 92, 191, 1.0);rbackground-color: rgba(139, 93, 223, 0.051)}.ace-katzenmilch .ace_invalid {color: #DFDFD5;rbackground-color: #CC1B27}.ace-katzenmilch .ace_string {color: #5a5f9b;rbackground-color: rgba(170, 175, 219, 0.035)}.ace-katzenmilch .ace_comment {font-style: italic;color: rgba(64, 79, 80, 0.67);rbackground-color: rgba(95, 15, 255, 0.0078)}.ace-katzenmilch .ace_entity.ace_name.ace_function,.ace-katzenmilch .ace_variable {color: rgba(2, 95, 73, 0.97);rbackground-color: rgba(34, 255, 73, 0.12)}.ace-katzenmilch .ace_variable.ace_language {color: #316fcf;rbackground-color: rgba(58, 175, 255, 0.039)}.ace-katzenmilch .ace_variable.ace_parameter {font-style: italic;color: rgba(51, 150, 159, 0.87);rbackground-color: rgba(5, 214, 249, 0.043)}.ace-katzenmilch .ace_entity.ace_other.ace_attribute-name {color: rgba(73, 70, 194, 0.93);rbackground-color: rgba(73, 134, 194, 0.035)}.ace-katzenmilch .ace_entity.ace_name.ace_tag {color: #3976a2;rbackground-color: rgba(73, 166, 210, 0.039)}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/kr_theme",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-kr-theme";a.cssText=".ace-kr-theme .ace_gutter {background: #1c1917;color: #FCFFE0}.ace-kr-theme .ace_print-margin {width: 1px;background: #1c1917}.ace-kr-theme {background-color: #0B0A09;color: #FCFFE0}.ace-kr-theme .ace_cursor {color: #FF9900}.ace-kr-theme .ace_marker-layer .ace_selection {background: rgba(170, 0, 255, 0.45)}.ace-kr-theme.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #0B0A09;border-radius: 2px}.ace-kr-theme .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-kr-theme .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 177, 111, 0.32)}.ace-kr-theme .ace_marker-layer .ace_active-line {background: #38403D}.ace-kr-theme .ace_gutter-active-line {background-color : #38403D}.ace-kr-theme .ace_marker-layer .ace_selected-word {border: 1px solid rgba(170, 0, 255, 0.45)}.ace-kr-theme .ace_invisible {color: rgba(255, 177, 111, 0.32)}.ace-kr-theme .ace_keyword,.ace-kr-theme .ace_meta {color: #949C8B}.ace-kr-theme .ace_constant,.ace-kr-theme .ace_constant.ace_character,.ace-kr-theme .ace_constant.ace_character.ace_escape,.ace-kr-theme .ace_constant.ace_other {color: rgba(210, 117, 24, 0.76)}.ace-kr-theme .ace_invalid {color: #F8F8F8;background-color: #A41300}.ace-kr-theme .ace_support {color: #9FC28A}.ace-kr-theme .ace_support.ace_constant {color: #C27E66}.ace-kr-theme .ace_fold {background-color: #949C8B;border-color: #FCFFE0}.ace-kr-theme .ace_support.ace_function {color: #85873A}.ace-kr-theme .ace_storage {color: #FFEE80}.ace-kr-theme .ace_string {color: rgba(164, 161, 181, 0.8)}.ace-kr-theme .ace_string.ace_regexp {color: rgba(125, 255, 192, 0.65)}.ace-kr-theme .ace_comment {font-style: italic;color: #706D5B}.ace-kr-theme .ace_variable {color: #D1A796}.ace-kr-theme .ace_list,.ace-kr-theme .ace_markup.ace_list {background-color: #0F0040}.ace-kr-theme .ace_variable.ace_language {color: #FF80E1}.ace-kr-theme .ace_meta.ace_tag {color: #BABD9C}.ace-kr-theme .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/kuroir",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-kuroir";a.cssText="/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: 467560D0-6ACE-4409-82FD-4791420837AC) */.ace-kuroir .ace_gutter {background: #e8e8e8;color: #333;}.ace-kuroir .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-kuroir {background-color: #E8E9E8;color: #363636;}.ace-kuroir .ace_cursor {color: #202020;}.ace-kuroir .ace_marker-layer .ace_selection {background: rgba(245, 170, 0, 0.57);}.ace-kuroir.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #E8E9E8;border-radius: 2px;}.ace-kuroir .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-kuroir .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(0, 0, 0, 0.29);}.ace-kuroir .ace_marker-layer .ace_active-line {background: rgba(203, 220, 47, 0.22);}.ace-kuroir .ace_gutter-active-line {background-color: rgba(203, 220, 47, 0.22);}.ace-kuroir .ace_marker-layer .ace_selected-word {border: 1px solid rgba(245, 170, 0, 0.57);}.ace-kuroir .ace_fold {border-color: #363636;}.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;background-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;font-style:italic;color:#FD1732;background-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;background-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);background-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;background-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/merbivore",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-merbivore";a.cssText=".ace-merbivore .ace_gutter {background: #202020;color: #E6E1DC}.ace-merbivore .ace_print-margin {width: 1px;background: #555651}.ace-merbivore {background-color: #161616;color: #E6E1DC}.ace-merbivore .ace_cursor {color: #FFFFFF}.ace-merbivore .ace_marker-layer .ace_selection {background: #454545}.ace-merbivore.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #161616;border-radius: 2px}.ace-merbivore .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-merbivore .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-merbivore .ace_marker-layer .ace_active-line {background: #333435}.ace-merbivore .ace_gutter-active-line {background-color: #333435}.ace-merbivore .ace_marker-layer .ace_selected-word {border: 1px solid #454545}.ace-merbivore .ace_invisible {color: #404040}.ace-merbivore .ace_entity.ace_name.ace_tag,.ace-merbivore .ace_keyword,.ace-merbivore .ace_meta,.ace-merbivore .ace_meta.ace_tag,.ace-merbivore .ace_storage,.ace-merbivore .ace_support.ace_function {color: #FC6F09}.ace-merbivore .ace_constant,.ace-merbivore .ace_constant.ace_character,.ace-merbivore .ace_constant.ace_character.ace_escape,.ace-merbivore .ace_constant.ace_other,.ace-merbivore .ace_support.ace_type {color: #1EDAFB}.ace-merbivore .ace_constant.ace_character.ace_escape {color: #519F50}.ace-merbivore .ace_constant.ace_language {color: #FDC251}.ace-merbivore .ace_constant.ace_library,.ace-merbivore .ace_string,.ace-merbivore .ace_support.ace_constant {color: #8DFF0A}.ace-merbivore .ace_constant.ace_numeric {color: #58C554}.ace-merbivore .ace_invalid {color: #FFFFFF;background-color: #990000}.ace-merbivore .ace_fold {background-color: #FC6F09;border-color: #E6E1DC}.ace-merbivore .ace_comment {font-style: italic;color: #AD2EA4}.ace-merbivore .ace_entity.ace_other.ace_attribute-name {color: #FFFF89}.ace-merbivore .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/merbivore_soft",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-merbivore-soft";a.cssText=".ace-merbivore-soft .ace_gutter {background: #262424;color: #E6E1DC}.ace-merbivore-soft .ace_print-margin {width: 1px;background: #262424}.ace-merbivore-soft {background-color: #1C1C1C;color: #E6E1DC}.ace-merbivore-soft .ace_cursor {color: #FFFFFF}.ace-merbivore-soft .ace_marker-layer .ace_selection {background: #494949}.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #1C1C1C;border-radius: 2px}.ace-merbivore-soft .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-merbivore-soft .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-merbivore-soft .ace_marker-layer .ace_active-line {background: #333435}.ace-merbivore-soft .ace_gutter-active-line {background-color: #333435}.ace-merbivore-soft .ace_marker-layer .ace_selected-word {border: 1px solid #494949}.ace-merbivore-soft .ace_invisible {color: #404040}.ace-merbivore-soft .ace_entity.ace_name.ace_tag,.ace-merbivore-soft .ace_keyword,.ace-merbivore-soft .ace_meta,.ace-merbivore-soft .ace_meta.ace_tag,.ace-merbivore-soft .ace_storage {color: #FC803A}.ace-merbivore-soft .ace_constant,.ace-merbivore-soft .ace_constant.ace_character,.ace-merbivore-soft .ace_constant.ace_character.ace_escape,.ace-merbivore-soft .ace_constant.ace_other,.ace-merbivore-soft .ace_support.ace_type {color: #68C1D8}.ace-merbivore-soft .ace_constant.ace_character.ace_escape {color: #B3E5B4}.ace-merbivore-soft .ace_constant.ace_language {color: #E1C582}.ace-merbivore-soft .ace_constant.ace_library,.ace-merbivore-soft .ace_string,.ace-merbivore-soft .ace_support.ace_constant {color: #8EC65F}.ace-merbivore-soft .ace_constant.ace_numeric {color: #7FC578}.ace-merbivore-soft .ace_invalid,.ace-merbivore-soft .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #FE3838}.ace-merbivore-soft .ace_fold {background-color: #FC803A;border-color: #E6E1DC}.ace-merbivore-soft .ace_comment,.ace-merbivore-soft .ace_meta {font-style: italic;color: #AC4BB8}.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {color: #EAF1A3}.ace-merbivore-soft .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/mono_industrial",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-mono-industrial";a.cssText=".ace-mono-industrial .ace_gutter {background: #1d2521;color: #C5C9C9}.ace-mono-industrial .ace_print-margin {width: 1px;background: #555651}.ace-mono-industrial {background-color: #222C28;color: #FFFFFF}.ace-mono-industrial .ace_cursor {color: #FFFFFF}.ace-mono-industrial .ace_marker-layer .ace_selection {background: rgba(145, 153, 148, 0.40)}.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #222C28;border-radius: 2px}.ace-mono-industrial .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-mono-industrial .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(102, 108, 104, 0.50)}.ace-mono-industrial .ace_marker-layer .ace_active-line {background: rgba(12, 13, 12, 0.25)}.ace-mono-industrial .ace_gutter-active-line {background-color: rgba(12, 13, 12, 0.25)}.ace-mono-industrial .ace_marker-layer .ace_selected-word {border: 1px solid rgba(145, 153, 148, 0.40)}.ace-mono-industrial .ace_invisible {color: rgba(102, 108, 104, 0.50)}.ace-mono-industrial .ace_string {background-color: #151C19;color: #FFFFFF}.ace-mono-industrial .ace_keyword,.ace-mono-industrial .ace_meta {color: #A39E64}.ace-mono-industrial .ace_constant,.ace-mono-industrial .ace_constant.ace_character,.ace-mono-industrial .ace_constant.ace_character.ace_escape,.ace-mono-industrial .ace_constant.ace_numeric,.ace-mono-industrial .ace_constant.ace_other {color: #E98800}.ace-mono-industrial .ace_entity.ace_name.ace_function,.ace-mono-industrial .ace_keyword.ace_operator,.ace-mono-industrial .ace_variable {color: #A8B3AB}.ace-mono-industrial .ace_invalid {color: #FFFFFF;background-color: rgba(153, 0, 0, 0.68)}.ace-mono-industrial .ace_support.ace_constant {color: #C87500}.ace-mono-industrial .ace_fold {background-color: #A8B3AB;border-color: #FFFFFF}.ace-mono-industrial .ace_support.ace_function {color: #588E60}.ace-mono-industrial .ace_entity.ace_name,.ace-mono-industrial .ace_support.ace_class,.ace-mono-industrial .ace_support.ace_type {color: #5778B6}.ace-mono-industrial .ace_storage {color: #C23B00}.ace-mono-industrial .ace_variable.ace_language,.ace-mono-industrial .ace_variable.ace_parameter {color: #648BD2}.ace-mono-industrial .ace_comment {color: #666C68;background-color: #151C19}.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {color: #909993}.ace-mono-industrial .ace_entity.ace_name.ace_tag {color: #A65EFF}.ace-mono-industrial .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/monokai",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-monokai";a.cssText=".ace-monokai .ace_gutter {background: #2F3129;color: #8F908A}.ace-monokai .ace_print-margin {width: 1px;background: #555651}.ace-monokai {background-color: #272822;color: #F8F8F2}.ace-monokai .ace_cursor {color: #F8F8F0}.ace-monokai .ace_marker-layer .ace_selection {background: #49483E}.ace-monokai.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #272822;border-radius: 2px}.ace-monokai .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-monokai .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #49483E}.ace-monokai .ace_marker-layer .ace_active-line {background: #202020}.ace-monokai .ace_gutter-active-line {background-color: #272727}.ace-monokai .ace_marker-layer .ace_selected-word {border: 1px solid #49483E}.ace-monokai .ace_invisible {color: #52524d}.ace-monokai .ace_entity.ace_name.ace_tag,.ace-monokai .ace_keyword,.ace-monokai .ace_meta.ace_tag,.ace-monokai .ace_storage {color: #F92672}.ace-monokai .ace_punctuation,.ace-monokai .ace_punctuation.ace_tag {color: #fff}.ace-monokai .ace_constant.ace_character,.ace-monokai .ace_constant.ace_language,.ace-monokai .ace_constant.ace_numeric,.ace-monokai .ace_constant.ace_other {color: #AE81FF}.ace-monokai .ace_invalid {color: #F8F8F0;background-color: #F92672}.ace-monokai .ace_invalid.ace_deprecated {color: #F8F8F0;background-color: #AE81FF}.ace-monokai .ace_support.ace_constant,.ace-monokai .ace_support.ace_function {color: #66D9EF}.ace-monokai .ace_fold {background-color: #A6E22E;border-color: #F8F8F2}.ace-monokai .ace_storage.ace_type,.ace-monokai .ace_support.ace_class,.ace-monokai .ace_support.ace_type {font-style: italic;color: #66D9EF}.ace-monokai .ace_entity.ace_name.ace_function,.ace-monokai .ace_entity.ace_other,.ace-monokai .ace_entity.ace_other.ace_attribute-name,.ace-monokai .ace_variable {color: #A6E22E}.ace-monokai .ace_variable.ace_parameter {font-style: italic;color: #FD971F}.ace-monokai .ace_string {color: #E6DB74}.ace-monokai .ace_comment {color: #75715E}.ace-monokai .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/pastel_on_dark",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-pastel-on-dark";a.cssText=".ace-pastel-on-dark .ace_gutter {background: #353030;color: #8F938F}.ace-pastel-on-dark .ace_print-margin {width: 1px;background: #353030}.ace-pastel-on-dark {background-color: #2C2828;color: #8F938F}.ace-pastel-on-dark .ace_cursor {color: #A7A7A7}.ace-pastel-on-dark .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20)}.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #2C2828;border-radius: 2px}.ace-pastel-on-dark .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-pastel-on-dark .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25)}.ace-pastel-on-dark .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031)}.ace-pastel-on-dark .ace_gutter-active-line {background-color: rgba(255, 255, 255, 0.031)}.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {border: 1px solid rgba(221, 240, 255, 0.20)}.ace-pastel-on-dark .ace_invisible {color: rgba(255, 255, 255, 0.25)}.ace-pastel-on-dark .ace_keyword,.ace-pastel-on-dark .ace_meta {color: #757aD8}.ace-pastel-on-dark .ace_constant,.ace-pastel-on-dark .ace_constant.ace_character,.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,.ace-pastel-on-dark .ace_constant.ace_other {color: #4FB7C5}.ace-pastel-on-dark .ace_keyword.ace_operator {color: #797878}.ace-pastel-on-dark .ace_constant.ace_character {color: #AFA472}.ace-pastel-on-dark .ace_constant.ace_language {color: #DE8E30}.ace-pastel-on-dark .ace_constant.ace_numeric {color: #CCCCCC}.ace-pastel-on-dark .ace_invalid,.ace-pastel-on-dark .ace_invalid.ace_illegal {color: #F8F8F8;background-color: rgba(86, 45, 86, 0.75)}.ace-pastel-on-dark .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1}.ace-pastel-on-dark .ace_fold {background-color: #757aD8;border-color: #8F938F}.ace-pastel-on-dark .ace_support.ace_function {color: #AEB2F8}.ace-pastel-on-dark .ace_string {color: #66A968}.ace-pastel-on-dark .ace_string.ace_regexp {color: #E9C062}.ace-pastel-on-dark .ace_comment {color: #A6C6FF}.ace-pastel-on-dark .ace_variable {color: #BEBF55}.ace-pastel-on-dark .ace_variable.ace_language {color: #C1C144}.ace-pastel-on-dark .ace_xml-pe {color: #494949}.ace-pastel-on-dark .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/solarized_dark",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-solarized-dark";a.cssText=".ace-solarized-dark .ace_gutter {background: #01313f;color: #d0edf7}.ace-solarized-dark .ace_print-margin {width: 1px;background: #33555E}.ace-solarized-dark {background-color: #002B36;color: #93A1A1}.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,.ace-solarized-dark .ace_storage {color: #93A1A1}.ace-solarized-dark .ace_cursor,.ace-solarized-dark .ace_string.ace_regexp {color: #D30102}.ace-solarized-dark .ace_marker-layer .ace_active-line,.ace-solarized-dark .ace_marker-layer .ace_selection {background: rgba(255, 255, 255, 0.1)}.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #002B36;border-radius: 2px}.ace-solarized-dark .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-solarized-dark .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(147, 161, 161, 0.50)}.ace-solarized-dark .ace_gutter-active-line {background-color: #0d3440}.ace-solarized-dark .ace_marker-layer .ace_selected-word {border: 1px solid #073642}.ace-solarized-dark .ace_invisible {color: rgba(147, 161, 161, 0.50)}.ace-solarized-dark .ace_keyword,.ace-solarized-dark .ace_meta,.ace-solarized-dark .ace_support.ace_class,.ace-solarized-dark .ace_support.ace_type {color: #859900}.ace-solarized-dark .ace_constant.ace_character,.ace-solarized-dark .ace_constant.ace_other {color: #CB4B16}.ace-solarized-dark .ace_constant.ace_language {color: #B58900}.ace-solarized-dark .ace_constant.ace_numeric {color: #D33682}.ace-solarized-dark .ace_fold {background-color: #268BD2;border-color: #93A1A1}.ace-solarized-dark .ace_entity.ace_name.ace_function,.ace-solarized-dark .ace_entity.ace_name.ace_tag,.ace-solarized-dark .ace_support.ace_function,.ace-solarized-dark .ace_variable,.ace-solarized-dark .ace_variable.ace_language {color: #268BD2}.ace-solarized-dark .ace_string {color: #2AA198}.ace-solarized-dark .ace_comment {font-style: italic;color: #657B83}.ace-solarized-dark .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/solarized_light",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-solarized-light";a.cssText=".ace-solarized-light .ace_gutter {background: #fbf1d3;color: #333}.ace-solarized-light .ace_print-margin {width: 1px;background: #e8e8e8}.ace-solarized-light {background-color: #FDF6E3;color: #586E75}.ace-solarized-light .ace_cursor {color: #000000}.ace-solarized-light .ace_marker-layer .ace_selection {background: rgba(7, 54, 67, 0.09)}.ace-solarized-light.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FDF6E3;border-radius: 2px}.ace-solarized-light .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-solarized-light .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(147, 161, 161, 0.50)}.ace-solarized-light .ace_marker-layer .ace_active-line {background: #EEE8D5}.ace-solarized-light .ace_gutter-active-line {background-color : #EDE5C1}.ace-solarized-light .ace_marker-layer .ace_selected-word {border: 1px solid #073642}.ace-solarized-light .ace_invisible {color: rgba(147, 161, 161, 0.50)}.ace-solarized-light .ace_keyword,.ace-solarized-light .ace_meta,.ace-solarized-light .ace_support.ace_class,.ace-solarized-light .ace_support.ace_type {color: #859900}.ace-solarized-light .ace_constant.ace_character,.ace-solarized-light .ace_constant.ace_other {color: #CB4B16}.ace-solarized-light .ace_constant.ace_language {color: #B58900}.ace-solarized-light .ace_constant.ace_numeric {color: #D33682}.ace-solarized-light .ace_fold {background-color: #268BD2;border-color: #586E75}.ace-solarized-light .ace_entity.ace_name.ace_function,.ace-solarized-light .ace_entity.ace_name.ace_tag,.ace-solarized-light .ace_support.ace_function,.ace-solarized-light .ace_variable,.ace-solarized-light .ace_variable.ace_language {color: #268BD2}.ace-solarized-light .ace_storage {color: #073642}.ace-solarized-light .ace_string {color: #2AA198}.ace-solarized-light .ace_string.ace_regexp {color: #D30102}.ace-solarized-light .ace_comment,.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {color: #93A1A1}.ace-solarized-light .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/terminal",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-terminal-theme";a.cssText=".ace-terminal-theme .ace_gutter {background: #1a0005;color: steelblue}.ace-terminal-theme .ace_print-margin {width: 1px;background: #1a1a1a}.ace-terminal-theme {background-color: black;color: #DEDEDE}.ace-terminal-theme .ace_cursor {color: #9F9F9F}.ace-terminal-theme .ace_marker-layer .ace_selection {background: #424242}.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px black;border-radius: 2px}.ace-terminal-theme .ace_marker-layer .ace_step {background: rgb(0, 0, 0)}.ace-terminal-theme .ace_marker-layer .ace_bracket {background: #090;}.ace-terminal-theme .ace_marker-layer .ace_bracket-start {background: #090;}.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {margin: -1px 0 0 -1px;border: 1px solid #900}.ace-terminal-theme .ace_marker-layer .ace_active-line {background: #2A2A2A}.ace-terminal-theme .ace_gutter-active-line {background-color: #2A112A}.ace-terminal-theme .ace_marker-layer .ace_selected-word {border: 1px solid #424242}.ace-terminal-theme .ace_invisible {color: #343434}.ace-terminal-theme .ace_keyword,.ace-terminal-theme .ace_meta,.ace-terminal-theme .ace_storage,.ace-terminal-theme .ace_storage.ace_type,.ace-terminal-theme .ace_support.ace_type {color: tomato}.ace-terminal-theme .ace_keyword.ace_operator {color: deeppink}.ace-terminal-theme .ace_constant.ace_character,.ace-terminal-theme .ace_constant.ace_language,.ace-terminal-theme .ace_constant.ace_numeric,.ace-terminal-theme .ace_keyword.ace_other.ace_unit,.ace-terminal-theme .ace_support.ace_constant,.ace-terminal-theme .ace_variable.ace_parameter {color: #E78C45}.ace-terminal-theme .ace_constant.ace_other {color: gold}.ace-terminal-theme .ace_invalid {color: yellow;background-color: red}.ace-terminal-theme .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-terminal-theme .ace_fold {background-color: #7AA6DA;border-color: #DEDEDE}.ace-terminal-theme .ace_entity.ace_name.ace_function,.ace-terminal-theme .ace_support.ace_function,.ace-terminal-theme .ace_variable {color: #7AA6DA}.ace-terminal-theme .ace_support.ace_class,.ace-terminal-theme .ace_support.ace_type {color: #E7C547}.ace-terminal-theme .ace_heading,.ace-terminal-theme .ace_string {color: #B9CA4A}.ace-terminal-theme .ace_entity.ace_name.ace_tag,.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,.ace-terminal-theme .ace_meta.ace_tag,.ace-terminal-theme .ace_string.ace_regexp,.ace-terminal-theme .ace_variable {color: #D54E53}.ace-terminal-theme .ace_comment {color: orangered}.ace-terminal-theme .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-tm";a.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;border-radius: 2px;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-tomorrow";a.cssText=".ace-tomorrow .ace_gutter {background: #f6f6f6;color: #4D4D4C}.ace-tomorrow .ace_print-margin {width: 1px;background: #f6f6f6}.ace-tomorrow {background-color: #FFFFFF;color: #4D4D4C}.ace-tomorrow .ace_cursor {color: #AEAFAD}.ace-tomorrow .ace_marker-layer .ace_selection {background: #D6D6D6}.ace-tomorrow.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;border-radius: 2px}.ace-tomorrow .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-tomorrow .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #D1D1D1}.ace-tomorrow .ace_marker-layer .ace_active-line {background: #EFEFEF}.ace-tomorrow .ace_gutter-active-line {background-color : #dcdcdc}.ace-tomorrow .ace_marker-layer .ace_selected-word {border: 1px solid #D6D6D6}.ace-tomorrow .ace_invisible {color: #D1D1D1}.ace-tomorrow .ace_keyword,.ace-tomorrow .ace_meta,.ace-tomorrow .ace_storage,.ace-tomorrow .ace_storage.ace_type,.ace-tomorrow .ace_support.ace_type {color: #8959A8}.ace-tomorrow .ace_keyword.ace_operator {color: #3E999F}.ace-tomorrow .ace_constant.ace_character,.ace-tomorrow .ace_constant.ace_language,.ace-tomorrow .ace_constant.ace_numeric,.ace-tomorrow .ace_keyword.ace_other.ace_unit,.ace-tomorrow .ace_support.ace_constant,.ace-tomorrow .ace_variable.ace_parameter {color: #F5871F}.ace-tomorrow .ace_constant.ace_other {color: #666969}.ace-tomorrow .ace_invalid {color: #FFFFFF;background-color: #C82829}.ace-tomorrow .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #8959A8}.ace-tomorrow .ace_fold {background-color: #4271AE;border-color: #4D4D4C}.ace-tomorrow .ace_entity.ace_name.ace_function,.ace-tomorrow .ace_support.ace_function,.ace-tomorrow .ace_variable {color: #4271AE}.ace-tomorrow .ace_support.ace_class,.ace-tomorrow .ace_support.ace_type {color: #C99E00}.ace-tomorrow .ace_heading,.ace-tomorrow .ace_markup.ace_heading,.ace-tomorrow .ace_string {color: #718C00}.ace-tomorrow .ace_entity.ace_name.ace_tag,.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow .ace_meta.ace_tag,.ace-tomorrow .ace_string.ace_regexp,.ace-tomorrow .ace_variable {color: #C82829}.ace-tomorrow .ace_comment {color: #8E908C}.ace-tomorrow .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow_night",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-tomorrow-night";a.cssText=".ace-tomorrow-night .ace_gutter {background: #25282c;color: #C5C8C6}.ace-tomorrow-night .ace_print-margin {width: 1px;background: #25282c}.ace-tomorrow-night {background-color: #1D1F21;color: #C5C8C6}.ace-tomorrow-night .ace_cursor {color: #AEAFAD}.ace-tomorrow-night .ace_marker-layer .ace_selection {background: #373B41}.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #1D1F21;border-radius: 2px}.ace-tomorrow-night .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #4B4E55}.ace-tomorrow-night .ace_marker-layer .ace_active-line {background: #282A2E}.ace-tomorrow-night .ace_gutter-active-line {background-color: #282A2E}.ace-tomorrow-night .ace_marker-layer .ace_selected-word {border: 1px solid #373B41}.ace-tomorrow-night .ace_invisible {color: #4B4E55}.ace-tomorrow-night .ace_keyword,.ace-tomorrow-night .ace_meta,.ace-tomorrow-night .ace_storage,.ace-tomorrow-night .ace_storage.ace_type,.ace-tomorrow-night .ace_support.ace_type {color: #B294BB}.ace-tomorrow-night .ace_keyword.ace_operator {color: #8ABEB7}.ace-tomorrow-night .ace_constant.ace_character,.ace-tomorrow-night .ace_constant.ace_language,.ace-tomorrow-night .ace_constant.ace_numeric,.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night .ace_support.ace_constant,.ace-tomorrow-night .ace_variable.ace_parameter {color: #DE935F}.ace-tomorrow-night .ace_constant.ace_other {color: #CED1CF}.ace-tomorrow-night .ace_invalid {color: #CED2CF;background-color: #DF5F5F}.ace-tomorrow-night .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-tomorrow-night .ace_fold {background-color: #81A2BE;border-color: #C5C8C6}.ace-tomorrow-night .ace_entity.ace_name.ace_function,.ace-tomorrow-night .ace_support.ace_function,.ace-tomorrow-night .ace_variable {color: #81A2BE}.ace-tomorrow-night .ace_support.ace_class,.ace-tomorrow-night .ace_support.ace_type {color: #F0C674}.ace-tomorrow-night .ace_heading,.ace-tomorrow-night .ace_markup.ace_heading,.ace-tomorrow-night .ace_string {color: #B5BD68}.ace-tomorrow-night .ace_entity.ace_name.ace_tag,.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night .ace_meta.ace_tag,.ace-tomorrow-night .ace_string.ace_regexp,.ace-tomorrow-night .ace_variable {color: #CC6666}.ace-tomorrow-night .ace_comment {color: #969896}.ace-tomorrow-night .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow_night_blue",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-tomorrow-night-blue";a.cssText=".ace-tomorrow-night-blue .ace_gutter {background: #00204b;color: #7388b5}.ace-tomorrow-night-blue .ace_print-margin {width: 1px;background: #00204b}.ace-tomorrow-night-blue {background-color: #002451;color: #FFFFFF}.ace-tomorrow-night-blue .ace_constant.ace_other,.ace-tomorrow-night-blue .ace_cursor {color: #FFFFFF}.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {background: #003F8E}.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #002451;border-radius: 2px}.ace-tomorrow-night-blue .ace_marker-layer .ace_step {background: rgb(127, 111, 19)}.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404F7D}.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {background: #00346E}.ace-tomorrow-night-blue .ace_gutter-active-line {background-color: #022040}.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {border: 1px solid #003F8E}.ace-tomorrow-night-blue .ace_invisible {color: #404F7D}.ace-tomorrow-night-blue .ace_keyword,.ace-tomorrow-night-blue .ace_meta,.ace-tomorrow-night-blue .ace_storage,.ace-tomorrow-night-blue .ace_storage.ace_type,.ace-tomorrow-night-blue .ace_support.ace_type {color: #EBBBFF}.ace-tomorrow-night-blue .ace_keyword.ace_operator {color: #99FFFF}.ace-tomorrow-night-blue .ace_constant.ace_character,.ace-tomorrow-night-blue .ace_constant.ace_language,.ace-tomorrow-night-blue .ace_constant.ace_numeric,.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night-blue .ace_support.ace_constant,.ace-tomorrow-night-blue .ace_variable.ace_parameter {color: #FFC58F}.ace-tomorrow-night-blue .ace_invalid {color: #FFFFFF;background-color: #F99DA5}.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #EBBBFF}.ace-tomorrow-night-blue .ace_fold {background-color: #BBDAFF;border-color: #FFFFFF}.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,.ace-tomorrow-night-blue .ace_support.ace_function,.ace-tomorrow-night-blue .ace_variable {color: #BBDAFF}.ace-tomorrow-night-blue .ace_support.ace_class,.ace-tomorrow-night-blue .ace_support.ace_type {color: #FFEEAD}.ace-tomorrow-night-blue .ace_heading,.ace-tomorrow-night-blue .ace_markup.ace_heading,.ace-tomorrow-night-blue .ace_string {color: #D1F1A9}.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night-blue .ace_meta.ace_tag,.ace-tomorrow-night-blue .ace_string.ace_regexp,.ace-tomorrow-night-blue .ace_variable {color: #FF9DA4}.ace-tomorrow-night-blue .ace_comment {color: #7285B7}.ace-tomorrow-night-blue .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow_night_bright",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-tomorrow-night-bright";a.cssText=".ace-tomorrow-night-bright .ace_gutter {background: #1a1a1a;color: #DEDEDE}.ace-tomorrow-night-bright .ace_print-margin {width: 1px;background: #1a1a1a}.ace-tomorrow-night-bright {background-color: #000000;color: #DEDEDE}.ace-tomorrow-night-bright .ace_cursor {color: #9F9F9F}.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {background: #424242}.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #000000;border-radius: 2px}.ace-tomorrow-night-bright .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #888888}.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {border: 1px solid rgb(110, 119, 0);border-bottom: 0;box-shadow: inset 0 -1px rgb(110, 119, 0);margin: -1px 0 0 -1px;background: rgba(255, 235, 0, 0.1);}.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {background: #2A2A2A}.ace-tomorrow-night-bright .ace_gutter-active-line {background-color: #2A2A2A}.ace-tomorrow-night-bright .ace_stack {background-color: rgb(66, 90, 44)}.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {border: 1px solid #888888}.ace-tomorrow-night-bright .ace_invisible {color: #343434}.ace-tomorrow-night-bright .ace_keyword,.ace-tomorrow-night-bright .ace_meta,.ace-tomorrow-night-bright .ace_storage,.ace-tomorrow-night-bright .ace_storage.ace_type,.ace-tomorrow-night-bright .ace_support.ace_type {color: #C397D8}.ace-tomorrow-night-bright .ace_keyword.ace_operator {color: #70C0B1}.ace-tomorrow-night-bright .ace_constant.ace_character,.ace-tomorrow-night-bright .ace_constant.ace_language,.ace-tomorrow-night-bright .ace_constant.ace_numeric,.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night-bright .ace_support.ace_constant,.ace-tomorrow-night-bright .ace_variable.ace_parameter {color: #E78C45}.ace-tomorrow-night-bright .ace_constant.ace_other {color: #EEEEEE}.ace-tomorrow-night-bright .ace_invalid {color: #CED2CF;background-color: #DF5F5F}.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-tomorrow-night-bright .ace_fold {background-color: #7AA6DA;border-color: #DEDEDE}.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,.ace-tomorrow-night-bright .ace_support.ace_function,.ace-tomorrow-night-bright .ace_variable {color: #7AA6DA}.ace-tomorrow-night-bright .ace_support.ace_class,.ace-tomorrow-night-bright .ace_support.ace_type {color: #E7C547}.ace-tomorrow-night-bright .ace_heading,.ace-tomorrow-night-bright .ace_markup.ace_heading,.ace-tomorrow-night-bright .ace_string {color: #B9CA4A}.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night-bright .ace_meta.ace_tag,.ace-tomorrow-night-bright .ace_string.ace_regexp,.ace-tomorrow-night-bright .ace_variable {color: #D54E53}.ace-tomorrow-night-bright .ace_comment {color: #969896}.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {color: #C2C280;}.ace-tomorrow-night-bright .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow_night_eighties",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-tomorrow-night-eighties";a.cssText=".ace-tomorrow-night-eighties .ace_gutter {background: #272727;color: #CCC}.ace-tomorrow-night-eighties .ace_print-margin {width: 1px;background: #272727}.ace-tomorrow-night-eighties {background-color: #2D2D2D;color: #CCCCCC}.ace-tomorrow-night-eighties .ace_constant.ace_other,.ace-tomorrow-night-eighties .ace_cursor {color: #CCCCCC}.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {background: #515151}.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #2D2D2D;border-radius: 2px}.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #6A6A6A}.ace-tomorrow-night-bright .ace_stack {background: rgb(66, 90, 44)}.ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {background: #393939}.ace-tomorrow-night-eighties .ace_gutter-active-line {background-color: #393939}.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected-word {border: 1px solid #515151}.ace-tomorrow-night-eighties .ace_invisible {color: #6A6A6A}.ace-tomorrow-night-eighties .ace_keyword,.ace-tomorrow-night-eighties .ace_meta,.ace-tomorrow-night-eighties .ace_storage,.ace-tomorrow-night-eighties .ace_storage.ace_type,.ace-tomorrow-night-eighties .ace_support.ace_type {color: #CC99CC}.ace-tomorrow-night-eighties .ace_keyword.ace_operator {color: #66CCCC}.ace-tomorrow-night-eighties .ace_constant.ace_character,.ace-tomorrow-night-eighties .ace_constant.ace_language,.ace-tomorrow-night-eighties .ace_constant.ace_numeric,.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night-eighties .ace_support.ace_constant,.ace-tomorrow-night-eighties .ace_variable.ace_parameter {color: #F99157}.ace-tomorrow-night-eighties .ace_invalid {color: #CDCDCD;background-color: #F2777A}.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {color: #CDCDCD;background-color: #CC99CC}.ace-tomorrow-night-eighties .ace_fold {background-color: #6699CC;border-color: #CCCCCC}.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,.ace-tomorrow-night-eighties .ace_support.ace_function,.ace-tomorrow-night-eighties .ace_variable {color: #6699CC}.ace-tomorrow-night-eighties .ace_support.ace_class,.ace-tomorrow-night-eighties .ace_support.ace_type {color: #FFCC66}.ace-tomorrow-night-eighties .ace_heading,.ace-tomorrow-night-eighties .ace_markup.ace_heading,.ace-tomorrow-night-eighties .ace_string {color: #99CC99}.ace-tomorrow-night-eighties .ace_comment {color: #999999}.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night-eighties .ace_meta.ace_tag,.ace-tomorrow-night-eighties .ace_variable {color: #F2777A}.ace-tomorrow-night-eighties .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/twilight",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-twilight";a.cssText=".ace-twilight .ace_gutter {background: #232323;color: #E2E2E2}.ace-twilight .ace_print-margin {width: 1px;background: #232323}.ace-twilight {background-color: #141414;color: #F8F8F8}.ace-twilight .ace_cursor {color: #A7A7A7}.ace-twilight .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20)}.ace-twilight.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #141414;border-radius: 2px}.ace-twilight .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-twilight .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25)}.ace-twilight .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031)}.ace-twilight .ace_gutter-active-line {background-color: rgba(255, 255, 255, 0.031)}.ace-twilight .ace_marker-layer .ace_selected-word {border: 1px solid rgba(221, 240, 255, 0.20)}.ace-twilight .ace_invisible {color: rgba(255, 255, 255, 0.25)}.ace-twilight .ace_keyword,.ace-twilight .ace_meta {color: #CDA869}.ace-twilight .ace_constant,.ace-twilight .ace_constant.ace_character,.ace-twilight .ace_constant.ace_character.ace_escape,.ace-twilight .ace_constant.ace_other,.ace-twilight .ace_heading,.ace-twilight .ace_markup.ace_heading,.ace-twilight .ace_support.ace_constant {color: #CF6A4C}.ace-twilight .ace_invalid.ace_illegal {color: #F8F8F8;background-color: rgba(86, 45, 86, 0.75)}.ace-twilight .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1}.ace-twilight .ace_support {color: #9B859D}.ace-twilight .ace_fold {background-color: #AC885B;border-color: #F8F8F8}.ace-twilight .ace_support.ace_function {color: #DAD085}.ace-twilight .ace_list,.ace-twilight .ace_markup.ace_list,.ace-twilight .ace_storage {color: #F9EE98}.ace-twilight .ace_entity.ace_name.ace_function,.ace-twilight .ace_meta.ace_tag,.ace-twilight .ace_variable {color: #AC885B}.ace-twilight .ace_string {color: #8F9D6A}.ace-twilight .ace_string.ace_regexp {color: #E9C062}.ace-twilight .ace_comment {font-style: italic;color: #5F5A60}.ace-twilight .ace_variable {color: #7587A6}.ace-twilight .ace_xml-pe {color: #494949}.ace-twilight .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/vibrant_ink",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-vibrant-ink";a.cssText=".ace-vibrant-ink .ace_gutter {background: #1a1a1a;color: #BEBEBE}.ace-vibrant-ink .ace_print-margin {width: 1px;background: #1a1a1a}.ace-vibrant-ink {background-color: #0F0F0F;color: #FFFFFF}.ace-vibrant-ink .ace_cursor {color: #FFFFFF}.ace-vibrant-ink .ace_marker-layer .ace_selection {background: #6699CC}.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #0F0F0F;border-radius: 2px}.ace-vibrant-ink .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-vibrant-ink .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-vibrant-ink .ace_marker-layer .ace_active-line {background: #333333}.ace-vibrant-ink .ace_gutter-active-line {background-color: #333333}.ace-vibrant-ink .ace_marker-layer .ace_selected-word {border: 1px solid #6699CC}.ace-vibrant-ink .ace_invisible {color: #404040}.ace-vibrant-ink .ace_keyword,.ace-vibrant-ink .ace_meta {color: #FF6600}.ace-vibrant-ink .ace_constant,.ace-vibrant-ink .ace_constant.ace_character,.ace-vibrant-ink .ace_constant.ace_character.ace_escape,.ace-vibrant-ink .ace_constant.ace_other {color: #339999}.ace-vibrant-ink .ace_constant.ace_numeric {color: #99CC99}.ace-vibrant-ink .ace_invalid,.ace-vibrant-ink .ace_invalid.ace_deprecated {color: #CCFF33;background-color: #000000}.ace-vibrant-ink .ace_fold {background-color: #FFCC00;border-color: #FFFFFF}.ace-vibrant-ink .ace_entity.ace_name.ace_function,.ace-vibrant-ink .ace_support.ace_function,.ace-vibrant-ink .ace_variable {color: #FFCC00}.ace-vibrant-ink .ace_variable.ace_parameter {font-style: italic}.ace-vibrant-ink .ace_string {color: #66FF00}.ace-vibrant-ink .ace_string.ace_regexp {color: #44B4CC}.ace-vibrant-ink .ace_comment {color: #9933CC}.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {font-style: italic;color: #99CC99}.ace-vibrant-ink .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/xcode",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-xcode";a.cssText="/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: EE3AD170-2B7F-4DE1-B724-C75F13FE0085) */.ace-xcode .ace_gutter {background: #e8e8e8;color: #333}.ace-xcode .ace_print-margin {width: 1px;background: #e8e8e8}.ace-xcode {background-color: #FFFFFF;color: #000000}.ace-xcode .ace_cursor {color: #000000}.ace-xcode .ace_marker-layer .ace_selection {background: #B5D5FF}.ace-xcode.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;border-radius: 2px}.ace-xcode .ace_marker-layer .ace_step {background: rgb(198, 219, 174)}.ace-xcode .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-xcode .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.071)}.ace-xcode .ace_gutter-active-line {background-color: rgba(0, 0, 0, 0.071)}.ace-xcode .ace_marker-layer .ace_selected-word {border: 1px solid #B5D5FF}.ace-xcode .ace_constant.ace_language,.ace-xcode .ace_keyword,.ace-xcode .ace_meta,.ace-xcode .ace_variable.ace_language {color: #C800A4}.ace-xcode .ace_invisible {color: #BFBFBF}.ace-xcode .ace_constant.ace_character,.ace-xcode .ace_constant.ace_other {color: #275A5E}.ace-xcode .ace_constant.ace_numeric {color: #3A00DC}.ace-xcode .ace_entity.ace_other.ace_attribute-name,.ace-xcode .ace_support.ace_constant,.ace-xcode .ace_support.ace_function {color: #450084}.ace-xcode .ace_fold {background-color: #C800A4;border-color: #000000}.ace-xcode .ace_entity.ace_name.ace_tag,.ace-xcode .ace_support.ace_class,.ace-xcode .ace_support.ace_type {color: #790EAD}.ace-xcode .ace_storage {color: #C900A4}.ace-xcode .ace_string {color: #DF0002}.ace-xcode .ace_comment {color: #008E00}.ace-xcode .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)}); \ No newline at end of file +(function(){var g="";var d=(function(){return this})();if(!g&&typeof requirejs!=="undefined"){return}var c=function(h,j,i){if(typeof h!=="string"){if(c.original){c.original.apply(window,arguments)}else{console.error("dropping module because define wasn't a string.");console.trace()}return}if(arguments.length==2){i=j}if(!c.modules){c.modules={};c.payloads={}}c.payloads[h]=i;c.modules[h]=null};var a=function(q,k,p){if(Object.prototype.toString.call(k)==="[object Array]"){var o=[];for(var j=0,h=k.length;j=this.$rowTokens.length){this.$row+=1;if(!e){e=this.$session.getLength()}if(this.$row>=e){this.$row=e-1;return null}this.$rowTokens=this.$session.getTokens(this.$row);this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]};this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]};this.getCurrentTokenRow=function(){return this.$row};this.getCurrentTokenColumn=function(){var f=this.$rowTokens;var e=this.$tokenIndex;var g=f[e].start;if(g!==undefined){return g}g=0;while(e>0){e-=1;g+=f[e].value.length}return g}}).call(d.prototype);a.TokenIterator=d});define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(c,b,d){var e=c("../lib/lang");var a=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(n,l){if(!l){for(var j in n){this.$rules[j]=n[j]}return}for(var j in n){var k=n[j];for(var h=0;hthis.row){return}if(h.start.row==this.row&&h.start.column>this.column){return}var k=this.row;var i=this.column;var l=h.start;var g=h.end;if(m.action==="insertText"){if(l.row===k&&l.column<=i){if(l.column===i&&this.$insertRight){}else{if(l.row===g.row){i+=g.column-l.column}else{i-=l.column;k+=g.row-l.row}}}else{if(l.row!==g.row&&l.row=i){i=l.column}else{i=Math.max(0,i-(g.column-l.column))}}else{if(l.row!==g.row&&l.row=this.document.getLength()){i.row=Math.max(0,this.document.getLength()-1);i.column=this.document.getLine(i.row).length}else{if(h<0){i.row=0;i.column=0}else{i.row=h;i.column=Math.min(this.document.getLine(i.row).length,Math.max(0,g))}}if(g<0){i.column=0}return i}}).call(a.prototype)});define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(c,b,d){var f=c("./lib/oop");var e=c("./lib/event_emitter").EventEmitter;var a=function(i,h){this.running=false;this.lines=[];this.states=[];this.currentLine=0;this.tokenizer=i;var g=this;this.$worker=function(){if(!g.running){return}var n=new Date();var p=g.currentLine;var l=-1;var m=g.doc;while(g.lines[p]){p++}var o=p;var j=m.getLength();var k=0;g.running=false;while(p20){g.running=setTimeout(g.$worker,20);g.currentLine=p;return}}g.currentLine=p;if(o<=l){g.fireUpdateEvent(o,l)}}};(function(){f.implement(this,e);this.setTokenizer=function(g){this.tokenizer=g;this.lines=[];this.states=[];this.start(0)};this.setDocument=function(g){this.doc=g;this.lines=[];this.states=[];this.stop()};this.fireUpdateEvent=function(i,g){var h={first:i,last:g};this._signal("update",{data:h})};this.start=function(g){this.currentLine=Math.min(g||0,this.currentLine,this.doc.getLength());this.lines.splice(this.currentLine,this.lines.length);this.states.splice(this.currentLine,this.states.length);this.stop();this.running=setTimeout(this.$worker,700)};this.scheduleStart=function(){if(!this.running){this.running=setTimeout(this.$worker,700)}};this.$updateOnChange=function(k){var i=k.range;var h=i.start.row;var g=i.end.row-h;if(g===0){this.lines[h]=null}else{if(k.action=="removeText"||k.action=="removeLines"){this.lines.splice(h,g+1,null);this.states.splice(h,g+1,null)}else{var j=Array(g+1);j.unshift(h,1);this.lines.splice.apply(this.lines,j);this.states.splice.apply(this.states,j)}}this.currentLine=Math.min(h,this.currentLine,this.doc.getLength());this.stop()};this.stop=function(){if(this.running){clearTimeout(this.running)}this.running=false};this.getTokens=function(g){return this.lines[g]||this.$tokenizeRow(g)};this.getState=function(g){if(this.currentLine==g){this.$tokenizeRow(g)}return this.states[g]||"start"};this.$tokenizeRow=function(j){var g=this.doc.getLine(j);var i=this.states[j-1];var h=this.tokenizer.getLineTokens(g,i,j);if(this.states[j]+""!==h.state+""){this.states[j]=h.state;this.lines[j+1]=null;if(this.currentLine>j+1){this.currentLine=j+1}}else{if(this.currentLine==j){this.currentLine=j+1}}return this.lines[j]=h.tokens}}).call(a.prototype);b.BackgroundTokenizer=a});define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(b,a,c){var g=b("./lib/lang");var e=b("./lib/oop");var f=b("./range").Range;var d=function(i,h,j){this.setRegexp(i);this.clazz=h;this.type=j||"text"};(function(){this.MAX_RANGES=500;this.setRegexp=function(h){if(this.regExp+""==h+""){return}this.regExp=h;this.cache=[]};this.update=function(p,q,r,l){if(!this.regExp){return}var k=l.firstRow,m=l.lastRow;for(var o=k;o<=m;o++){var h=this.cache[o];if(h==null){h=g.getMatchOffsets(r.getLine(o),this.regExp);if(h.length>this.MAX_RANGES){h=h.slice(0,this.MAX_RANGES)}h=h.map(function(i){return new f(o,i.offset,o,i.offset+i.length)});this.cache[o]=h.length?h:""}for(var n=h.length;n--;){q.drawSingleLineMarker(p,h[n].toScreenRange(r),this.clazz,l)}}}}).call(d.prototype);a.SearchHighlight=d});define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"],function(d,c,e){var g=d("../range").Range;var h=d("./fold_line").FoldLine;var a=d("./fold").Fold;var f=d("../token_iterator").TokenIterator;function b(){this.getFoldAt=function(p,m,l){var o=this.getFoldLine(p);if(!o){return null}var n=o.folds;for(var k=0;k=j){return n}else{if(n.end.row>j){return null}}}return null};this.getNextFoldLine=function(j,k){var m=this.$foldData;var l=0;if(k){l=m.indexOf(k)}if(l==-1){l=0}for(l;l=j){return n}}return null};this.getFoldedRowCount=function(p,n){var m=this.$foldData,k=n-p+1;for(var l=0;l=n){if(q=p){k-=n-q}else{k=0}}break}else{if(j>=p){if(q>=p){k-=j-q}else{k-=j-p+1}}}}return k};this.$addFoldLine=function(i){this.$foldData.push(i);this.$foldData.sort(function(k,j){return k.start.row-j.start.row});return i};this.addFold=function(t,n){var j=this.$foldData;var r=false;var q;if(t instanceof a){q=t}else{q=new a(n,t);q.collapseChildren=n.collapseChildren}this.$clipRangeToDocument(q.range);var w=q.start.row;var k=q.start.column;var l=q.end.row;var p=q.end.column;if(!(w0){this.removeFolds(u);u.forEach(function(i){q.addSubFold(i)})}for(var m=0;m0){this.foldAll(i.start.row+1,i.end.row,i.collapseChildren-1)}i.subFolds=[]};this.expandFolds=function(i){i.forEach(function(j){this.expandFold(j)},this)};this.unfold=function(i,k){var j,m;if(i==null){j=new g(0,0,this.getLength(),0);k=true}else{if(typeof i=="number"){j=new g(i,0,i,this.getLine(i).length)}else{if("row" in i){j=g.fromPoints(i,i)}else{j=i}}}m=this.getFoldsInRangeList(j);if(k){this.removeFolds(m)}else{var l=m;while(l.length){this.expandFolds(l);l=this.getFoldsInRangeList(j)}}if(m.length){return m}};this.isRowFolded=function(i,j){return !!this.getFoldLine(i,j)};this.getRowFoldEnd=function(i,j){var k=this.getFoldLine(i,j);return k?k.end.row:i};this.getRowFoldStart=function(i,j){var k=this.getFoldLine(i,j);return k?k.start.row:i};this.getFoldDisplayLine=function(n,j,o,i,l){if(i==null){i=n.start.row;l=0}if(j==null){j=n.end.row;o=this.getLine(j).length}var m=this.doc;var k="";n.walk(function(s,r,q,p){if(r=k){o=i.end.row;try{var l=this.addFold("...",i);if(l){l.collapseChildren=p}}catch(n){}}}};this.$foldStyles={manual:1,markbegin:1,markbeginend:1};this.$foldStyle="markbegin";this.setFoldStyle=function(i){if(!this.$foldStyles[i]){throw new Error("invalid fold style: "+i+"["+Object.keys(this.$foldStyles).join(", ")+"]")}if(this.$foldStyle==i){return}this.$foldStyle=i;if(i=="manual"){this.unfold()}var j=this.$foldMode;this.$setFolding(null);this.$setFolding(j)};this.$setFolding=function(i){if(this.$foldMode==i){return}this.$foldMode=i;this.removeListener("change",this.$updateFoldWidgets);this._emit("changeAnnotation");if(!i||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[];this.getFoldWidget=i.getFoldWidget.bind(i,this,this.$foldStyle);this.getFoldWidgetRange=i.getFoldWidgetRange.bind(i,this,this.$foldStyle);this.$updateFoldWidgets=this.updateFoldWidgets.bind(this);this.on("change",this.$updateFoldWidgets)};this.getParentFoldRangeData=function(o,l){var n=this.foldWidgets;if(!n||(l&&n[o])){return{}}var m=o-1,j;while(m>=0){var p=n[m];if(p==null){p=n[m]=this.getFoldWidget(m)}if(p=="start"){var k=this.getFoldWidgetRange(m);if(!j){j=k}if(k&&k.end.row>=o){break}}m--}return{range:m!==-1&&k,firstRange:j}};this.onFoldWidgetClick=function(m,l){l=l.domEvent;var j={children:l.shiftKey,all:l.ctrlKey||l.metaKey,siblings:l.altKey};var i=this.$toggleFoldWidget(m,j);if(!i){var k=(l.target||l.srcElement);if(k&&/ace_fold-widget/.test(k.className)){k.className+=" ace_invalid"}}};this.$toggleFoldWidget=function(p,q){if(!this.getFoldWidget){return}var n=this.getFoldWidget(p);var r=this.getLine(p);var i=n==="end"?-1:1;var m=this.getFoldAt(p,i===-1?0:r.length,i);if(m){if(q.children||q.all){this.removeFold(m)}else{this.expandFold(m)}return}var l=this.getFoldWidgetRange(p,true);if(l&&!l.isMultiLine()){m=this.getFoldAt(l.start.row,l.start.column,1);if(m&&l.isEqual(m.range)){this.removeFold(m);return}}if(q.siblings){var k=this.getParentFoldRangeData(p);if(k.range){var o=k.range.start.row+1;var j=k.range.end.row}this.foldAll(o,j,q.all?10000:0)}else{if(q.children){j=l?l.end.row:this.getLength();this.foldAll(p+1,l.end.row,q.all?10000:0)}else{if(l){if(q.all){l.collapseChildren=10000}this.addFold("...",l)}}}return l};this.toggleFoldWidget=function(m){var l=this.selection.getCursor().row;l=this.getRowFoldStart(l);var i=this.$toggleFoldWidget(l,{});if(i){return}var k=this.getParentFoldRangeData(l,true);i=k.range||k.firstRange;if(i){l=i.start.row;var j=this.getFoldAt(l,this.getLine(l).length,1);if(j){this.removeFold(j)}else{this.addFold("...",i)}}};this.updateFoldWidgets=function(l){var n=l.data;var j=n.range;var m=j.start.row;var i=j.end.row-m;if(i===0){this.foldWidgets[m]=null}else{if(n.action=="removeText"||n.action=="removeLines"){this.foldWidgets.splice(m,i+1,null)}else{var k=Array(i+1);k.unshift(m,1);this.foldWidgets.splice.apply(this.foldWidgets,k)}}}}c.Folding=b});define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(b,a,c){var d=b("../range").Range;function e(f,h){this.foldData=f;if(Array.isArray(h)){this.folds=h}else{h=this.folds=[h]}var g=h[h.length-1];this.range=new d(h[0].start.row,h[0].start.column,g.end.row,g.end.column);this.start=this.range.start;this.end=this.range.end;this.folds.forEach(function(i){i.setFoldLine(this)},this)}(function(){this.shiftRow=function(f){this.start.row+=f;this.end.row+=f;this.folds.forEach(function(g){g.start.row+=f;g.end.row+=f})};this.addFold=function(f){if(f.sameRow){if(f.start.rowthis.endRow){throw new Error("Can't add a fold to this FoldLine as it has no connection")}this.folds.push(f);this.folds.sort(function(h,g){return -h.range.compareEnd(g.start.row,g.start.column)});if(this.range.compareEnd(f.start.row,f.start.column)>0){this.end.row=f.end.row;this.end.column=f.end.column}else{if(this.range.compareStart(f.end.row,f.end.column)<0){this.start.row=f.start.row;this.start.column=f.start.column}}}else{if(f.start.row==this.end.row){this.folds.push(f);this.end.row=f.end.row;this.end.column=f.end.column}else{if(f.end.row==this.start.row){this.folds.unshift(f);this.start.row=f.start.row;this.start.column=f.start.column}else{throw new Error("Trying to add fold to FoldRow that doesn't have a matching row")}}}f.foldLine=this};this.containsRow=function(f){return f>=this.start.row&&f<=this.end.row};this.walk=function(p,g,l){var f=0,o=this.folds,m,j,n,k=true;if(g==null){g=this.end.row;l=this.end.column}for(var h=0;h1){l.onMatch=this.$applyToken}else{l.onMatch=l.token}}}if(r>1){if(/\\\d/.test(l.regex)){n=l.regex.replace(/\\([0-9]+)/g,function(i,s){return"\\"+(parseInt(s,10)+q+1)})}else{r=1;n=this.removeCapturingGroups(l.regex)}if(!l.splitRegex&&typeof l.token!="string"){m.push(l)}}f[q]=h;q+=r;j.push(n);if(!l.onMatch){l.onMatch=null}l.__proto__=null}m.forEach(function(i){i.splitRegex=this.createSplitterRegexp(i.regex,k)},this);this.regExps[o]=new RegExp("("+j.join(")|(")+")|($)",k)}};(function(){this.$setMaxTokenCount=function(f){e=f|0};this.$applyToken=function(m){var g=this.splitRegex.exec(m).slice(1);var j=this.token.apply(this,g);if(typeof j==="string"){return[{type:j,value:m}]}var k=[];for(var h=0,f=j.length;hn){var p=w.substring(n,o-u.length);if(j.type==q){j.value+=p}else{if(j.type){r.push(j)}j={type:q,value:p}}}for(var l=0;le){while(n1){if(t[0]!==h){t.unshift(h)}}return{tokens:r,state:t.length?t:h}}}).call(b.prototype);a.Tokenizer=b});define("ace/edit_session/fold",["require","exports","module","ace/range","ace/range_list","ace/lib/oop"],function(d,f,a){var c=d("../range").Range;var g=d("../range_list").RangeList;var h=d("../lib/oop");var j=f.Fold=function(l,m){this.foldLine=null;this.placeholder=m;this.range=l;this.start=l.start;this.end=l.end;this.sameRow=l.start.row==l.end.row;this.subFolds=this.ranges=[]};h.inherits(j,g);(function(){this.toString=function(){return'"'+this.placeholder+'" '+this.range.toString()};this.setFoldLine=function(l){this.foldLine=l;this.subFolds.forEach(function(m){m.setFoldLine(l)})};this.clone=function(){var l=this.range.clone();var m=new j(l,this.placeholder);this.subFolds.forEach(function(n){m.subFolds.push(n.clone())});m.collapseChildren=this.collapseChildren;return m};this.addSubFold=function(p){if(this.range.isEqual(p)){return}if(!this.range.containsRange(p)){throw new Error("A fold can't intersect already existing fold"+p.range+this.range)}i(p,this.start);var t=p.start.row,l=p.start.column;for(var o=0,r=-1;o2){return H%w!=w-1}else{return H%w==0}return true}}function A(G){for(var H=l;H<=z;H++){G(F.getLine(H),H)}}var v=Infinity;A(function(H,I){var G=H.search(/\S/);if(G!==-1){if(GH.length){v=H.length}}});if(o==Infinity){o=v;p=false;B=false}if(E&&o%w!=0){o=Math.floor(o/w)*w}A(B?r:n)};this.toggleBlockComment=function(l,w,s,z){var t=this.blockComment;if(!t){return}if(!t.start&&t[0]){t=t[0]}var r=new i(w,z.row,z.column);var o=r.getCurrentToken();var m=w.selection;var v=w.selection.toOrientedRange();var y,u;if(o&&/comment/.test(o.type)){var x,p;while(o&&/comment/.test(o.type)){var q=o.value.indexOf(t.start);if(q!=-1){var A=r.getCurrentTokenRow();var n=r.getCurrentTokenColumn()+q;x=new e(A,n,A,n+t.start.length);break}o=r.stepBackward()}var r=new i(w,z.row,z.column);var o=r.getCurrentToken();while(o&&/comment/.test(o.type)){var q=o.value.indexOf(t.end);if(q!=-1){var A=r.getCurrentTokenRow();var n=r.getCurrentTokenColumn()+q;p=new e(A,n,A,n+t.end.length);break}o=r.stepForward()}if(p){w.remove(p)}if(x){w.remove(x);y=x.start.row;u=-t.start.length}}else{u=t.start.length;y=s.start.row;w.insert(s.end,t.end);w.insert(s.start,t.start)}if(v.start.row==y){v.start.column+=u}if(v.end.row==y){v.end.column+=u}w.selection.fromOrientedRange(v)};this.getNextLineIndent=function(n,l,m){return this.$getIndent(l)};this.checkOutdent=function(n,l,m){return false};this.autoOutdent=function(l,m,n){};this.$getIndent=function(l){return l.match(/^\s*/)[0]};this.createWorker=function(l){return null};this.createModeDelegates=function(m){this.$embeds=[];this.$modes={};for(var n in m){if(m[n]){this.$embeds.push(n);this.$modes[n]=new m[n]()}}var l=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var n=0;n0){continue}var g=e(o,h.start);if(m===0){return j&&g!==0?-k-2:k}if(g>0||(g===0&&!j)){return k}return -k-1}return -k-1};this.add=function(h){var g=!h.isEmpty();var j=this.pointIndex(h.start,g);if(j<0){j=-j-1}var i=this.pointIndex(h.end,g,j);if(i<0){i=-i-1}else{i++}return this.ranges.splice(j,i-j,h)};this.addList=function(h){var j=[];for(var g=h.length;g--;){j.push.call(j,this.add(h[g]))}return j};this.substractPoint=function(h){var g=this.pointIndex(h);if(g>=0){return this.ranges.splice(g,1)}};this.merge=function(){var m=[];var l=this.ranges;l=l.sort(function(n,i){return e(n.start,i.start)});var j=l[0],g;for(var h=1;h=0};this.containsPoint=function(g){return this.pointIndex(g)>=0};this.rangeAtPoint=function(h){var g=this.pointIndex(h);if(g>=0){return this.ranges[g]}};this.clipRows=function(j,h){var m=this.ranges;if(m[0].start.row>h||m[m.length-1].start.rowu){break}if(g.start.row==u&&g.start.column>=j.column){if(g.start.column==j.column&&this.$insertRight){}else{g.start.column+=q;g.start.row+=t}}if(g.end.row==u&&g.end.column>=j.column){if(g.end.column==j.column&&this.$insertRight){continue}if(g.end.column==j.column&&q>0&&pg.start.column&&g.end.column==h[p+1].start.column){g.end.column-=q}}g.end.column+=q;g.end.row+=t}}if(t!=0&&p ["+this.end.row+"/"+this.end.column+"]")};this.contains=function(g,f){return this.compare(g,f)==0};this.compareRange=function(g){var h,f=g.end,i=g.start;h=this.compare(f.row,f.column);if(h==1){h=this.compare(i.row,i.column);if(h==1){return 2}else{if(h==0){return 1}else{return 0}}}else{if(h==-1){return -2}else{h=this.compare(i.row,i.column);if(h==-1){return -1}else{if(h==1){return 42}else{return 0}}}}};this.comparePoint=function(f){return this.compare(f.row,f.column)};this.containsRange=function(f){return this.comparePoint(f.start)==0&&this.comparePoint(f.end)==0};this.intersects=function(f){var g=this.compareRange(f);return(g==-1||g==0||g==1)};this.isEnd=function(g,f){return this.end.row==g&&this.end.column==f};this.isStart=function(g,f){return this.start.row==g&&this.start.column==f};this.setStart=function(g,f){if(typeof g=="object"){this.start.column=g.column;this.start.row=g.row}else{this.start.row=g;this.start.column=f}};this.setEnd=function(g,f){if(typeof g=="object"){this.end.column=g.column;this.end.row=g.row}else{this.end.row=g;this.end.column=f}};this.inside=function(g,f){if(this.compare(g,f)==0){if(this.isEnd(g,f)||this.isStart(g,f)){return false}else{return true}}return false};this.insideStart=function(g,f){if(this.compare(g,f)==0){if(this.isEnd(g,f)){return false}else{return true}}return false};this.insideEnd=function(g,f){if(this.compare(g,f)==0){if(this.isStart(g,f)){return false}else{return true}}return false};this.compare=function(g,f){if(!this.isMultiLine()){if(g===this.start.row){return fthis.end.column?1:0)}}if(gthis.end.row){return 1}if(this.start.row===g){return f>=this.start.column?0:-1}if(this.end.row===g){return f<=this.end.column?0:1}return 0};this.compareStart=function(g,f){if(this.start.row==g&&this.start.column==f){return -1}else{return this.compare(g,f)}};this.compareEnd=function(g,f){if(this.end.row==g&&this.end.column==f){return 1}else{return this.compare(g,f)}};this.compareInside=function(g,f){if(this.end.row==g&&this.end.column==f){return 1}else{if(this.start.row==g&&this.start.column==f){return -1}else{return this.compare(g,f)}}};this.clipRows=function(h,g){if(this.end.row>g){var f={row:g+1,column:0}}else{if(this.end.rowg){var i={row:g+1,column:0}}else{if(this.start.row=0){var i=o.charAt(n);if(i==j){k-=1;if(k==0){return{row:l.getCurrentTokenRow(),column:n+l.getCurrentTokenColumn()}}}else{if(i==g){k+=1}}n-=1}do{h=l.stepBackward()}while(h&&!p.test(h.type));if(h==null){break}o=h.value;n=o.length-1}return null};this.$findClosingBracket=function(g,m,q){var h=this.$brackets[g];var k=1;var l=new e(this,m.row,m.column);var i=l.getCurrentToken();if(!i){i=l.stepForward()}if(!i){return}if(!q){q=new RegExp("(\\.?"+i.type.replace(".","\\.").replace("lparen",".paren")+")+")}var n=m.column-l.getCurrentTokenColumn();while(true){var o=i.value;var p=o.length;while(ni.row||(j.row==i.row&&j.column>i.column))};this.getRange=function(){var j=this.anchor;var i=this.lead;if(this.isEmpty()){return g.fromPoints(i,i)}if(this.isBackwards()){return g.fromPoints(i,j)}else{return g.fromPoints(j,i)}};this.clearSelection=function(){if(!this.$isEmpty){this.$isEmpty=true;this._emit("changeSelection")}};this.selectAll=function(){var i=this.doc.getLength()-1;this.setSelectionAnchor(0,0);this.moveCursorTo(i,this.doc.getLine(i).length)};this.setRange=this.setSelectionRange=function(i,j){if(j){this.setSelectionAnchor(i.end.row,i.end.column);this.selectTo(i.start.row,i.start.column)}else{this.setSelectionAnchor(i.start.row,i.start.column);this.selectTo(i.end.row,i.end.column)}if(this.getRange().isEmpty()){this.$isEmpty=true}this.$desiredColumn=null};this.$moveSelection=function(i){var j=this.lead;if(this.$isEmpty){this.setSelectionAnchor(j.row,j.column)}i.call(this)};this.selectTo=function(j,i){this.$moveSelection(function(){this.moveCursorTo(j,i)})};this.selectToPosition=function(i){this.$moveSelection(function(){this.moveCursorToPosition(i)})};this.moveTo=function(j,i){this.clearSelection();this.moveCursorTo(j,i)};this.moveToPosition=function(i){this.clearSelection();this.moveCursorToPosition(i)};this.selectUp=function(){this.$moveSelection(this.moveCursorUp)};this.selectDown=function(){this.$moveSelection(this.moveCursorDown)};this.selectRight=function(){this.$moveSelection(this.moveCursorRight)};this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)};this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)};this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)};this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)};this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)};this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)};this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)};this.getWordRange=function(k,i){if(typeof i=="undefined"){var j=k||this.lead;k=j.row;i=j.column}return this.session.getWordRange(k,i)};this.selectWord=function(){this.setSelectionRange(this.getWordRange())};this.selectAWord=function(){var j=this.getCursor();var i=this.session.getAWordRange(j.row,j.column);this.setSelectionRange(i)};this.getLineRange=function(m,k){var i=typeof m=="number"?m:this.lead.row;var j;var l=this.session.getFoldLine(i);if(l){i=l.start.row;j=l.end.row}else{j=i}if(k===true){return new g(i,0,j,this.session.getLine(j).length)}else{return new g(i,0,j+1,0)}};this.selectLine=function(){this.setSelectionRange(this.getLineRange())};this.moveCursorUp=function(){this.moveCursorBy(-1,0)};this.moveCursorDown=function(){this.moveCursorBy(1,0)};this.moveCursorLeft=function(){var k=this.lead.getPosition(),i;if(i=this.session.getFoldAt(k.row,k.column,-1)){this.moveCursorTo(i.start.row,i.start.column)}else{if(k.column==0){if(k.row>0){this.moveCursorTo(k.row-1,this.doc.getLine(k.row-1).length)}}else{var j=this.session.getTabSize();if(this.session.isTabStop(k)&&this.doc.getLine(k.row).slice(k.column-j,k.column).split(" ").length-1==j){this.moveCursorBy(0,-j)}else{this.moveCursorBy(0,-1)}}}};this.moveCursorRight=function(){var k=this.lead.getPosition(),i;if(i=this.session.getFoldAt(k.row,k.column,1)){this.moveCursorTo(i.end.row,i.end.column)}else{if(this.lead.column==this.doc.getLine(this.lead.row).length){if(this.lead.row0){l.column=k}}}this.moveCursorTo(l.row,l.column)};this.moveCursorFileEnd=function(){var j=this.doc.getLength()-1;var i=this.doc.getLine(j).length;this.moveCursorTo(j,i)};this.moveCursorFileStart=function(){this.moveCursorTo(0,0)};this.moveCursorLongWordRight=function(){var n=this.lead.row;var l=this.lead.column;var i=this.doc.getLine(n);var m=i.substring(l);var k;this.session.nonTokenRe.lastIndex=0;this.session.tokenRe.lastIndex=0;var j=this.session.getFoldAt(n,l,1);if(j){this.moveCursorTo(j.end.row,j.end.column);return}if(k=this.session.nonTokenRe.exec(m)){l+=this.session.nonTokenRe.lastIndex;this.session.nonTokenRe.lastIndex=0;m=i.substring(l)}if(l>=i.length){this.moveCursorTo(n,i.length);this.moveCursorRight();if(n0){this.moveCursorWordLeft()}return}if(i=this.session.tokenRe.exec(l)){k-=this.session.tokenRe.lastIndex;this.session.tokenRe.lastIndex=0}this.moveCursorTo(n,k)};this.$shortWordEndIndex=function(n){var j,i=0,m;var l=/\s/;var k=this.session.tokenRe;k.lastIndex=0;if(j=this.session.tokenRe.exec(n)){i=this.session.tokenRe.lastIndex}else{while((m=n[i])&&l.test(m)){i++}if(i<1){k.lastIndex=0;while((m=n[i])&&!k.test(m)){k.lastIndex=0;i++;if(l.test(m)){if(i>2){i--;break}else{while((m=n[i])&&l.test(m)){i++}if(i>2){break}}}}}}k.lastIndex=0;return i};this.moveCursorShortWordRight=function(){var p=this.lead.row;var n=this.lead.column;var j=this.doc.getLine(p);var o=j.substring(n);var m=this.session.getFoldAt(p,n,1);if(m){return this.moveCursorTo(m.end.row,m.end.column)}if(n==j.length){var i=this.doc.getLength();do{p++;o=this.doc.getLine(p)}while(p0&&/^\s*$/.test(i));l=i.length;if(!/\s+$/.test(i)){i=""}}var m=h.stringReverse(i);var j=this.$shortWordEndIndex(m);return this.moveCursorTo(n,l-j)};this.moveCursorWordRight=function(){if(this.session.$selectLongWords){this.moveCursorLongWordRight()}else{this.moveCursorShortWordRight()}};this.moveCursorWordLeft=function(){if(this.session.$selectLongWords){this.moveCursorLongWordLeft()}else{this.moveCursorShortWordLeft()}};this.moveCursorBy=function(l,k){var j=this.session.documentToScreenPosition(this.lead.row,this.lead.column);if(k===0){if(this.$desiredColumn){j.column=this.$desiredColumn}else{this.$desiredColumn=j.column}}var i=this.session.screenToDocumentPosition(j.row+l,j.column);if(l!==0&&k===0&&i.row===this.lead.row&&i.column===this.lead.column){if(this.session.lineWidgets&&this.session.lineWidgets[i.row]){i.row++}}this.moveCursorTo(i.row,i.column+k,k===0)};this.moveCursorToPosition=function(i){this.moveCursorTo(i.row,i.column)};this.moveCursorTo=function(l,k,i){var j=this.session.getFoldAt(l,k,1);if(j){l=j.start.row;k=j.start.column}this.$keepDesiredColumnOnChange=true;this.lead.setPosition(l,k);this.$keepDesiredColumnOnChange=false;if(!i){this.$desiredColumn=null}};this.moveCursorToScreen=function(k,j,i){var l=this.session.screenToDocumentPosition(k,j);this.moveCursorTo(l.row,l.column,i)};this.detach=function(){this.lead.detach();this.anchor.detach();this.session=this.doc=null};this.fromOrientedRange=function(i){this.setSelectionRange(i,i.cursor==i.start);this.$desiredColumn=i.desiredColumn||this.$desiredColumn};this.toOrientedRange=function(i){var j=this.getRange();if(i){i.start.column=j.start.column;i.start.row=j.start.row;i.end.column=j.end.column;i.end.row=j.end.row}else{i=j}i.cursor=this.isBackwards()?i.start:i.end;i.desiredColumn=this.$desiredColumn;return i};this.getRangeOfMovements=function(j){var l=this.getCursor();try{j.call(null,this);var i=this.getCursor();return g.fromPoints(l,i)}catch(k){return g.fromPoints(l,l)}finally{this.moveCursorToPosition(l)}};this.toJSON=function(){if(this.rangeCount){var i=this.ranges.map(function(k){var j=k.clone();j.isBackwards=k.cursor==k.start;return j})}else{var i=this.getRange();i.isBackwards=this.isBackwards()}return i};this.fromJSON=function(l){if(l.start==undefined){if(this.rangeList){this.toSingleRange(l[0]);for(var j=l.length;j--;){var k=g.fromPoints(l[j].start,l[j].end);if(l.isBackwards){k.cursor=k.start}this.addRange(k,true)}return}else{l=l[0]}}if(this.rangeList){this.toSingleRange(l)}this.setSelectionRange(l,l.isBackwards)};this.isEqual=function(k){if((k.length||this.rangeCount)&&k.length!=this.rangeCount){return false}if(!k.length||!this.ranges){return this.getRange().isEqual(k)}for(var j=this.ranges.length;j--;){if(!this.ranges[j].isEqual(k[j])){return false}}return true}}).call(d.prototype);a.Selection=d});define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(c,a,d){var g=c("./lib/lang");var e=c("./lib/oop");var f=c("./range").Range;var b=function(){this.$options={}};(function(){this.set=function(h){e.mixin(this.$options,h);return this};this.getOptions=function(){return g.copyObject(this.$options)};this.setOptions=function(h){this.$options=h};this.find=function(j){var i=this.$matchIterator(j,this.$options);if(!i){return false}var h=null;i.forEach(function(k,n,m){if(!k.start){var l=k.offset+(m||0);h=new f(n,l,n,l+k.length)}else{h=k}return true});return h};this.findAll=function(k){var q=this.$options;if(!q.needle){return[]}this.$assembleRegExp(q);var v=q.range;var h=v?k.getLines(v.start.row,v.end.row):k.doc.getAllLines();var o=[];var x=q.re;if(q.$isMultiLine){var C=x.length;var y=h.length-C;var w;outer:for(var s=x.offset||0;s<=y;s++){for(var A=0;Ar){continue}o.push(w=new f(s,r,s+C-1,n));if(C>2){s=s+C-2}}}else{for(var B=0;Bm&&o[A].end.row==v.end.row){A--}o=o.slice(B,A+1);for(B=0,A=o.length;B=0;q--){if(o(r[q],t,s)){return true}}}}else{var l=function(p,t,s){var r=g.getMatchOffsets(p,m);for(var q=0;q=j;r--){if(s(m.getLine(r),r)){return}}if(p.wrap==false){return}for(r=o,j=h.row;r>=j;r--){if(s(m.getLine(r),r)){return}}}:function(s){var r=h.row;var q=m.getLine(r).substr(h.column);if(s(q,r,h.column)){return}for(r=r+1;r<=o;r++){if(s(m.getLine(r),r)){return}}if(p.wrap==false){return}for(r=j,o=h.row;r<=o;r++){if(s(m.getLine(r),r)){return}}};return{forEach:l}}}).call(b.prototype);a.Search=b});define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/search_highlight","ace/edit_session/folding","ace/edit_session/bracket_match"],function(g,i,c){var l=g("./lib/oop");var b=g("./lib/lang");var e=g("./config");var m=g("./lib/event_emitter").EventEmitter;var n=g("./selection").Selection;var h=g("./mode/text").Mode;var f=g("./range").Range;var j=g("./document").Document;var d=g("./background_tokenizer").BackgroundTokenizer;var k=g("./search_highlight").SearchHighlight;var a=function(p,o){this.$breakpoints=[];this.$decorations=[];this.$frontMarkers={};this.$backMarkers={};this.$markerId=1;this.$undoSelect=true;this.$foldData=[];this.$foldData.toString=function(){return this.join("\n")};this.on("changeFold",this.onChangeFold.bind(this));this.$onChange=this.onChange.bind(this);if(typeof p!="object"||!p.getLine){p=new j(p)}this.setDocument(p);this.selection=new n(this);e.resetOptions(this);this.setMode(o);e._signal("session",this)};(function(){l.implement(this,m);this.setDocument=function(x){if(this.doc){this.doc.removeListener("change",this.$onChange)}this.doc=x;x.on("change",this.$onChange);if(this.bgTokenizer){this.bgTokenizer.setDocument(this.getDocument())}this.resetCaches()};this.getDocument=function(){return this.doc};this.$resetRowCache=function(y){if(!y){this.$docRowCache=[];this.$screenRowCache=[];return}var x=this.$docRowCache.length;var z=this.$getRowCacheIndex(this.$docRowCache,y)+1;if(x>z){this.$docRowCache.splice(z,x);this.$screenRowCache.splice(z,x)}};this.$getRowCacheIndex=function(y,B){var x=0;var A=y.length-1;while(x<=A){var z=(x+A)>>1;var C=y[z];if(B>C){x=z+1}else{if(B=z){break}}}y=A[x];if(!y){return null}y.index=x;y.start=C-y.value.length;return y};this.setUndoManager=function(y){this.$undoManager=y;this.$deltas=[];this.$deltasDoc=[];this.$deltasFold=[];if(this.$informUndoManager){this.$informUndoManager.cancel()}if(y){var x=this;this.$syncInformUndoManager=function(){x.$informUndoManager.cancel();if(x.$deltasFold.length){x.$deltas.push({group:"fold",deltas:x.$deltasFold});x.$deltasFold=[]}if(x.$deltasDoc.length){x.$deltas.push({group:"doc",deltas:x.$deltasDoc});x.$deltasDoc=[]}if(x.$deltas.length>0){y.execute({action:"aceupdate",args:[x.$deltas,x],merge:x.mergeUndoDeltas})}x.mergeUndoDeltas=false;x.$deltas=[]};this.$informUndoManager=b.delayedCall(this.$syncInformUndoManager)}};this.markUndoGroup=function(){if(this.$syncInformUndoManager){this.$syncInformUndoManager()}};this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}};this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager};this.getTabString=function(){if(this.getUseSoftTabs()){return b.stringRepeat(" ",this.getTabSize())}else{return"\t"}};this.setUseSoftTabs=function(x){this.setOption("useSoftTabs",x)};this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs};this.setTabSize=function(x){this.setOption("tabSize",x)};this.getTabSize=function(){return this.$tabSize};this.isTabStop=function(x){return this.$useSoftTabs&&(x.column%this.$tabSize===0)};this.$overwrite=false;this.setOverwrite=function(x){this.setOption("overwrite",x)};this.getOverwrite=function(){return this.$overwrite};this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)};this.addGutterDecoration=function(y,x){if(!this.$decorations[y]){this.$decorations[y]=""}this.$decorations[y]+=" "+x;this._signal("changeBreakpoint",{})};this.removeGutterDecoration=function(y,x){this.$decorations[y]=(this.$decorations[y]||"").replace(" "+x,"");this._signal("changeBreakpoint",{})};this.getBreakpoints=function(){return this.$breakpoints};this.setBreakpoints=function(y){this.$breakpoints=[];for(var x=0;x0){x=!!z.charAt(B-1).match(this.tokenRe)}if(!x){x=!!z.charAt(B).match(this.tokenRe)}if(x){var A=this.tokenRe}else{if(/^\s+$/.test(z.slice(B-1,B+1))){var A=/\s/}else{var A=this.nonTokenRe}}var D=B;if(D>0){do{D--}while(D>=0&&z.charAt(D).match(A));D++}var y=B;while(yx){x=y.screenWidth}});return this.lineWidgetWidth=x};this.$computeWidth=function(y){if(this.$modified||y){this.$modified=false;if(this.$useWrapMode){return this.screenWidth=this.$wrapLimit}var F=this.doc.getAllLines();var x=this.$rowLengthCache;var z=0;var E=0;var D=this.$foldData[E];var B=D?D.start.row:Infinity;var C=F.length;for(var A=0;AB){A=D.end.row+1;if(A>=C){break}D=this.$foldData[E++];B=D?D.start.row:Infinity}if(x[A]==null){x[A]=this.$getStringScreenWidth(F[A])[0]}if(x[A]>z){z=x[A]}}this.screenWidth=z}};this.getLine=function(x){return this.doc.getLine(x)};this.getLines=function(y,x){return this.doc.getLines(y,x)};this.getLength=function(){return this.doc.getLength()};this.getTextRange=function(x){return this.doc.getTextRange(x||this.selection.getRange())};this.insert=function(x,y){return this.doc.insert(x,y)};this.remove=function(x){return this.doc.remove(x)};this.undoChanges=function(A,z){if(!A.length){return}this.$fromUndo=true;var x=null;for(var y=A.length-1;y!=-1;y--){var B=A[y];if(B.group=="doc"){this.doc.revertDeltas(B.deltas);x=this.$getUndoSelection(B.deltas,true,x)}else{B.deltas.forEach(function(C){this.addFolds(C.folds)},this)}}this.$fromUndo=false;x&&this.$undoSelect&&!z&&this.selection.setSelectionRange(x);return x};this.redoChanges=function(A,z){if(!A.length){return}this.$fromUndo=true;var x=null;for(var y=0;yD.end.column){y.start.column+=z}if(y.end.row==D.end.row&&y.end.column>D.end.column){y.end.column+=z}}if(C&&y.start.row>=D.end.row){y.start.row+=C;y.end.row+=C}}y.end=this.insert(y.start,G);if(E.length){var A=D.start;var B=y.start;var C=B.row-A.row;var z=B.column-A.column;this.addFolds(E.map(function(H){H=H.clone();if(H.start.row==A.row){H.start.column+=z}if(H.end.row==A.row){H.end.column+=z}H.start.row+=C;H.end.row+=C;return H}))}return y};this.indentRows=function(y,x,A){A=A.replace(/\t/g,this.getTabString());for(var z=y;z<=x;z++){this.insert({row:z,column:0},A)}};this.outdentRows=function(z){var D=z.collapseRows();var y=new f(0,0,0,0);var C=this.getTabSize();for(var B=D.start.row;B<=D.end.row;++B){var x=this.getLine(B);y.start.row=B;y.end.row=B;for(var A=0;A0){var D=this.getRowFoldEnd(A+z);if(D>this.doc.getLength()-1){return 0}var C=D-A}else{E=this.$clipRowToDocument(E);A=this.$clipRowToDocument(A);var C=A-E+1}}var y=new f(E,0,A,Number.MAX_VALUE);var B=this.getFoldsInRange(y).map(function(F){F=F.clone();F.start.row+=C;F.end.row+=C;return F});var x=z==0?this.doc.getLines(E,A):this.doc.removeLines(E,A);this.doc.insertLines(E+C,x);B.length&&this.addFolds(B);return C};this.moveLinesUp=function(y,x){return this.$moveLines(y,x,-1)};this.moveLinesDown=function(y,x){return this.$moveLines(y,x,1)};this.duplicateLines=function(y,x){return this.$moveLines(y,x,0)};this.$clipRowToDocument=function(x){return Math.max(0,Math.min(x,this.doc.getLength()-1))};this.$clipColumnToRow=function(y,x){if(x<0){return 0}return Math.min(this.doc.getLine(y).length,x)};this.$clipPositionToDocument=function(z,y){y=Math.max(0,y);if(z<0){z=0;y=0}else{var x=this.doc.getLength();if(z>=x){z=x-1;y=this.doc.getLine(x-1).length}else{y=Math.min(this.doc.getLine(z).length,y)}}return{row:z,column:y}};this.$clipRangeToDocument=function(y){if(y.start.row<0){y.start.row=0;y.start.column=0}else{y.start.column=this.$clipColumnToRow(y.start.row,y.start.column)}var x=this.doc.getLength()-1;if(y.end.row>x){y.end.row=x;y.end.column=this.doc.getLine(x).length}else{y.end.column=this.$clipColumnToRow(y.end.row,y.end.column)}return y};this.$wrapLimit=80;this.$useWrapMode=false;this.$wrapLimitRange={min:null,max:null};this.setUseWrapMode=function(y){if(y!=this.$useWrapMode){this.$useWrapMode=y;this.$modified=true;this.$resetRowCache(0);if(y){var x=this.getLength();this.$wrapData=Array(x);this.$updateWrapData(0,x-1)}this._signal("changeWrapMode")}};this.getUseWrapMode=function(){return this.$useWrapMode};this.setWrapLimitRange=function(y,x){if(this.$wrapLimitRange.min!==y||this.$wrapLimitRange.max!==x){this.$wrapLimitRange={min:y,max:x};this.$modified=true;this._signal("changeWrapMode")}};this.adjustWrapLimit=function(A,z){var y=this.$wrapLimitRange;if(y.max<0){y={min:z,max:z}}var x=this.$constrainWrapLimit(A,y.min,y.max);if(x!=this.$wrapLimit&&x>1){this.$wrapLimit=x;this.$modified=true;if(this.$useWrapMode){this.$updateWrapData(0,this.getLength()-1);this.$resetRowCache(0);this._signal("changeWrapLimit")}return true}return false};this.$constrainWrapLimit=function(y,z,x){if(z){y=Math.max(z,y)}if(x){y=Math.min(x,y)}return y};this.getWrapLimit=function(){return this.$wrapLimit};this.setWrapLimit=function(x){this.setWrapLimitRange(x,x)};this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}};this.$updateInternalDataOnChange=function(G){var D=this.$useWrapMode;var F;var B=G.data.action;var A=G.data.range.start.row;var M=G.data.range.end.row;var y=G.data.range.start;var C=G.data.range.end;var x=null;if(B.indexOf("Lines")!=-1){if(B=="insertLines"){M=A+(G.data.lines.length)}else{M=A}F=G.data.lines?G.data.lines.length:M-A}else{F=M-A}this.$updating=true;if(F!=0){if(B.indexOf("remove")!=-1){this[D?"$wrapData":"$rowLengthCache"].splice(A,F);var z=this.$foldData;x=this.getFoldsInRange(G.data.range);this.removeFolds(x);var K=this.getFoldLine(C.row);var L=0;if(K){K.addRemoveChars(C.row,C.column,y.column-C.column);K.shiftRow(-F);var J=this.getFoldLine(A);if(J&&J!==K){J.merge(K);K=J}L=z.indexOf(K)+1}for(L;L=C.row){K.shiftRow(-F)}}M=A}else{var H=Array(F);H.unshift(A,0);var E=D?this.$wrapData:this.$rowLengthCache;E.splice.apply(E,H);var z=this.$foldData;var K=this.getFoldLine(A);var L=0;if(K){var I=K.range.compareInside(y.row,y.column);if(I==0){K=K.split(y.row,y.column);K.shiftRow(F);K.addRemoveChars(M,0,C.column-y.column)}else{if(I==-1){K.addRemoveChars(A,0,C.column-y.column);K.shiftRow(F)}}L=z.indexOf(K)+1}for(L;L=A){K.shiftRow(F)}}}}else{F=Math.abs(G.data.range.start.column-G.data.range.end.column);if(B.indexOf("remove")!=-1){x=this.getFoldsInRange(G.data.range);this.removeFolds(x);F=-F}var K=this.getFoldLine(A);if(K){K.addRemoveChars(A,y.column,F)}}if(D&&this.$wrapData.length!=this.doc.getLength()){console.error("doc.getLength() and $wrapData.length have to be the same!")}this.$updating=false;if(D){this.$updateWrapData(A,M)}else{this.$updateRowLengthCache(A,M)}return x};this.$updateRowLengthCache=function(z,y,x){this.$rowLengthCache[z]=null;this.$rowLengthCache[y]=null};this.$updateWrapData=function(x,D){var F=this.doc.getAllLines();var z=this.getTabSize();var y=this.$wrapData;var E=this.$wrapLimit;var A;var B;var C=x;D=Math.min(D,F.length-1);while(C<=D){B=this.getFoldLine(C,B);if(!B){A=this.$getDisplayTokens(F[C]);y[C]=this.$computeWrapSplits(A,E,z);C++}else{A=[];B.walk(function(L,K,J,G){var H;if(L!=null){H=this.$getDisplayTokens(L,A.length);H[0]=u;for(var I=1;IG){var B=A+G;if(C[B-1]>=s&&C[B]>=s){F(B);continue}if(C[B]==u||C[B]==o){for(B;B!=A-1;B--){if(C[B]==u){break}}if(B>A){F(B);continue}B=A+G;for(B;B>2)),A-1);while(B>z&&C[B]z&&C[B]z&&C[B]==r){B--}}else{while(B>z&&C[B]z){F(++B);continue}B=A+G;F(B)}return E};this.$getDisplayTokens=function(B,A){var x=[];var z;A=A||0;for(var y=0;y39&&D<48)||(D>57&&D<64)){x.push(r)}else{if(D>=4352&&q(D)){x.push(w,v)}else{x.push(w)}}}}}return x};this.$getStringScreenWidth=function(z,B,x){if(B==0){return[0,0]}if(B==null){B=Infinity}x=x||0;var A,y;for(y=0;y=4352&&q(A)){x+=2}else{x+=1}}if(x>B){break}}return[x,y]};this.lineWidgets=null;this.getRowLength=function(y){if(this.lineWidgets){var x=this.lineWidgets[y]&&this.lineWidgets[y].rowCount||0}else{x=0}if(!this.$useWrapMode||!this.$wrapData[y]){return 1+x}else{return this.$wrapData[y].length+1+x}};this.getRowLineCount=function(x){if(!this.$useWrapMode||!this.$wrapData[x]){return 1}else{return this.$wrapData[x].length+1}};this.getScreenLastRowColumn=function(x){var y=this.screenToDocumentPosition(x,Number.MAX_VALUE);return this.documentToScreenColumn(y.row,y.column)};this.getDocumentLastRowColumn=function(x,z){var y=this.documentToScreenRow(x,z);return this.getScreenLastRowColumn(y)};this.getDocumentLastRowColumnPosition=function(x,z){var y=this.documentToScreenRow(x,z);return this.screenToDocumentPosition(y,Number.MAX_VALUE/10)};this.getRowSplitData=function(x){if(!this.$useWrapMode){return undefined}else{return this.$wrapData[x]}};this.getScreenTabSize=function(x){return this.$tabSize-x%this.$tabSize};this.screenToDocumentRow=function(y,x){return this.screenToDocumentPosition(y,x).row};this.screenToDocumentColumn=function(y,x){return this.screenToDocumentPosition(y,x).column};this.screenToDocumentPosition=function(H,I){if(H<0){return{row:0,column:0}}var N;var A=0;var E=0;var C;var M=0;var D=0;var z=this.$screenRowCache;var G=this.$getRowCacheIndex(z,H);var B=z.length;if(B&&G>=0){var M=z[G];var A=this.$docRowCache[G];var x=H>z[B-1]}else{var x=!B}var J=this.getLength()-1;var K=this.getNextFoldLine(A);var F=K?K.start.row:Infinity;while(M<=H){D=this.getRowLength(A);if(M+D>H||A>=J){break}else{M+=D;A++;if(A>F){A=K.end.row+1;K=this.getNextFoldLine(A,K);F=K?K.start.row:Infinity}}if(x){this.$docRowCache.push(A);this.$screenRowCache.push(M)}}if(K&&K.start.row<=A){N=this.getFoldDisplayLine(K);A=K.start.row}else{if(M+D<=H||A>J){return{row:J,column:this.getLine(J).length}}else{N=this.getLine(A);K=null}}if(this.$useWrapMode){var L=this.$wrapData[A];if(L){var y=Math.floor(H-M);C=L[y];if(y>0&&L.length){E=L[y-1]||L[L.length-1];N=N.substring(E)}}}E+=this.$getStringScreenWidth(N,I)[1];if(this.$useWrapMode&&E>=C){E=C-1}if(K){return K.idxToPosition(E)}return{row:A,column:E}};this.documentToScreenPosition=function(A,C){if(typeof C==="undefined"){var K=this.$clipPositionToDocument(A.row,A.column)}else{K=this.$clipPositionToDocument(A,C)}A=K.row;C=K.column;var G=0;var F=null;var H=null;H=this.getFoldAt(A,C,1);if(H){A=H.start.row;C=H.start.column}var I,N=0;var z=this.$docRowCache;var E=this.$getRowCacheIndex(z,A);var B=z.length;if(B&&E>=0){var N=z[E];var G=this.$screenRowCache[E];var y=A>z[B-1]}else{var y=!B}var L=this.getNextFoldLine(N);var D=L?L.start.row:Infinity;while(N=D){I=L.end.row+1;if(I>A){break}L=this.getNextFoldLine(I,L);D=L?L.start.row:Infinity}else{I=N+1}G+=this.getRowLength(N);N=I;if(y){this.$docRowCache.push(N);this.$screenRowCache.push(G)}}var x="";if(L&&N>=D){x=this.getFoldDisplayLine(L,A,C);F=L.start.row}else{x=this.getLine(A).substring(0,C);F=A}if(this.$useWrapMode){var M=this.$wrapData[F];if(M){var J=0;while(x.length>=M[J]){G++;J++}x=x.substring(M[J-1]||0,x.length)}}return{row:G,column:this.$getStringScreenWidth(x)[0]}};this.documentToScreenColumn=function(y,x){return this.documentToScreenPosition(y,x).column};this.documentToScreenRow=function(x,y){return this.documentToScreenPosition(x,y).row};this.getScreenLength=function(){var D=0;var y=null;if(!this.$useWrapMode){D=this.getLength();var A=this.$foldData;for(var z=0;zx){E=y.end.row+1;y=this.$foldData[z++];x=y?y.start.row:Infinity}}}if(this.lineWidgets){D+=this.$getWidgetScreenLength()}return D};this.$setFontMetrics=function(x){};function q(x){if(x<4352){return false}return x>=4352&&x<=4447||x>=4515&&x<=4519||x>=4602&&x<=4607||x>=9001&&x<=9002||x>=11904&&x<=11929||x>=11931&&x<=12019||x>=12032&&x<=12245||x>=12272&&x<=12283||x>=12288&&x<=12350||x>=12353&&x<=12438||x>=12441&&x<=12543||x>=12549&&x<=12589||x>=12593&&x<=12686||x>=12688&&x<=12730||x>=12736&&x<=12771||x>=12784&&x<=12830||x>=12832&&x<=12871||x>=12880&&x<=13054||x>=13056&&x<=19903||x>=19968&&x<=42124||x>=42128&&x<=42182||x>=43360&&x<=43388||x>=44032&&x<=55203||x>=55216&&x<=55238||x>=55243&&x<=55291||x>=63744&&x<=64255||x>=65040&&x<=65049||x>=65072&&x<=65106||x>=65108&&x<=65126||x>=65128&&x<=65131||x>=65281&&x<=65376||x>=65504&&x<=65510}}).call(a.prototype);g("./edit_session/folding").Folding.call(a.prototype);g("./edit_session/bracket_match").BracketMatch.call(a.prototype);e.defineOptions(a.prototype,"session",{wrap:{set:function(p){if(!p||p=="off"){p=false}else{if(p=="free"){p=true}else{if(p=="printMargin"){p=-1}else{if(typeof p=="string"){p=parseInt(p,10)||false}}}}if(this.$wrap==p){return}if(!p){this.setUseWrapMode(false)}else{var o=typeof p=="number"?p:null;this.setWrapLimitRange(o,o);this.setUseWrapMode(true)}this.$wrap=p},get:function(){if(this.getUseWrapMode()){if(this.$wrap==-1){return"printMargin"}if(!this.getWrapLimitRange().min){return"free"}return this.$wrap}return"off"},handlesSet:true},wrapMethod:{set:function(o){o=o=="auto"?this.$mode.type!="text":o!="text";if(o!=this.$wrapAsCode){this.$wrapAsCode=o;if(this.$useWrapMode){this.$modified=true;this.$resetRowCache(0);this.$updateWrapData(0,this.getLength()-1)}}},initialValue:"auto"},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(o){this.$useWorker=o;this.$stopWorker();if(o){this.$startWorker()}},initialValue:true},useSoftTabs:{initialValue:true},tabSize:{set:function(o){if(isNaN(o)||this.$tabSize===o){return}this.$modified=true;this.$rowLengthCache=[];this.$tabSize=o;this._signal("changeTabSize")},initialValue:4,handlesSet:true},overwrite:{set:function(o){this._signal("changeOverwrite")},initialValue:false},newLineMode:{set:function(o){this.doc.setNewLineMode(o)},get:function(){return this.doc.getNewLineMode()},handlesSet:true},mode:{set:function(o){this.setMode(o)},get:function(){return this.$modeId}}});i.EditSession=a});define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(b,a,c){var f=b("../lib/oop");var d=b("../keyboard/hash_handler").HashHandler;var e=b("../lib/event_emitter").EventEmitter;var g=function(i,h){d.call(this,h,i);this.byName=this.commands;this.setDefaultHandler("exec",function(j){return j.command.exec(j.editor,j.args||{})})};f.inherits(g,d);(function(){f.implement(this,e);this.exec=function(l,j,i){if(typeof l==="string"){l=this.commands[l]}if(!l){return false}if(j&&j.$readOnly&&!l.readOnly){return false}var k={editor:j,command:l,args:i};var h=this._emit("exec",k);this._signal("afterExec",k);return h===false?false:true};this.toggleRecording=function(h){if(this.$inReplay){return}h&&h._emit("changeStatus");if(this.recording){this.macro.pop();this.removeEventListener("exec",this.$addCommandToMacro);if(!this.macro.length){this.macro=this.oldMacro}return this.recording=false}if(!this.$addCommandToMacro){this.$addCommandToMacro=function(i){this.macro.push([i.command,i.args])}.bind(this)}this.oldMacro=this.macro;this.macro=[];this.on("exec",this.$addCommandToMacro);return this.recording=true};this.replay=function(h){if(this.$inReplay||!this.macro){return}if(this.recording){return this.toggleRecording(h)}try{this.$inReplay=true;this.macro.forEach(function(i){if(typeof i=="string"){this.exec(i,h)}else{this.exec(i[0],h,i[1])}},this)}finally{this.$inReplay=false}};this.trimMacro=function(h){return h.map(function(i){if(typeof i[0]!="string"){i[0]=i[0].name}if(!i[1]){i=i[0]}return i})}}).call(g.prototype);a.CommandManager=g});define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(c,a,d){var b=c("../lib/keys");var e=c("../lib/event");var f=function(g){this.$editor=g;this.$data={};this.$handlers=[];this.setDefaultHandler(g.commands)};(function(){this.setDefaultHandler=function(g){this.removeKeyboardHandler(this.$defaultHandler);this.$defaultHandler=g;this.addKeyboardHandler(g,0);this.$data={editor:this.$editor}};this.setKeyboardHandler=function(i){var g=this.$handlers;if(g[g.length-1]==i){return}while(g[g.length-1]&&g[g.length-1]!=this.$defaultHandler){this.removeKeyboardHandler(g[g.length-1])}this.addKeyboardHandler(i,1)};this.addKeyboardHandler=function(h,j){if(!h){return}if(typeof h=="function"&&!h.handleKeyboard){h.handleKeyboard=h}var g=this.$handlers.indexOf(h);if(g!=-1){this.$handlers.splice(g,1)}if(j==undefined){this.$handlers.push(h)}else{this.$handlers.splice(j,0,h)}if(g==-1&&h.attach){h.attach(this.$editor)}};this.removeKeyboardHandler=function(h){var g=this.$handlers.indexOf(h);if(g==-1){return false}this.$handlers.splice(g,1);h.detach&&h.detach(this.$editor);return true};this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]};this.$callKeyboardHandlers=function(l,h,n,m){var k;var o=false;var g=this.$editor.commands;for(var j=this.$handlers.length;j--;){k=this.$handlers[j].handleKeyboard(this.$data,l,h,n,m);if(!k||!k.command){continue}if(k.command=="null"){o=true}else{o=g.exec(k.command,this.$editor,k.args,m)}if(o&&m&&l!=-1&&k.passEvent!=true&&k.command.passEvent!=true){e.stopEvent(m)}if(o){break}}return o};this.onCommandKey=function(j,h,i){var g=b.keyCodeToString(i);this.$callKeyboardHandlers(h,g,i,j)};this.onTextInput=function(h){var g=this.$callKeyboardHandlers(-1,h);if(!g){this.$editor.commands.exec("insertstring",this.$editor,h)}}}).call(f.prototype);a.KeyBinding=f});define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(d,b,e){var c=d("../lib/keys");var a=d("../lib/useragent");function f(h,g){this.platform=g||(a.isMac?"mac":"win");this.commands={};this.commandKeyBinding={};if(this.__defineGetter__&&this.__defineSetter__&&typeof console!="undefined"&&console.error){var i=false;var j=function(){if(!i){i=true;console.error("commmandKeyBinding has too many m's. use commandKeyBinding")}};this.__defineGetter__("commmandKeyBinding",function(){j();return this.commandKeyBinding});this.__defineSetter__("commmandKeyBinding",function(k){j();return this.commandKeyBinding=k})}else{this.commmandKeyBinding=this.commandKeyBinding}this.addCommands(h)}(function(){this.addCommand=function(h){if(this.commands[h.name]){this.removeCommand(h)}this.commands[h.name]=h;if(h.bindKey){this._buildKeyHash(h)}};this.removeCommand=function(l){var h=(typeof l==="string"?l:l.name);l=this.commands[h];delete this.commands[h];var j=this.commandKeyBinding;for(var k in j){for(var i in j[k]){if(j[k][i]==l){delete j[k][i]}}}};this.bindKey=function(h,j){if(!h){return}if(typeof j=="function"){this.addCommand({exec:j,bindKey:h,name:j.name||h});return}var i=this.commandKeyBinding;h.split("|").forEach(function(k){var m=this.parseKeys(k,j);var l=m.hashId;(i[l]||(i[l]={}))[m.key]=j},this)};this.addCommands=function(h){h&&Object.keys(h).forEach(function(i){var j=h[i];if(!j){return}if(typeof j==="string"){return this.bindKey(j,i)}if(typeof j==="function"){j={exec:j}}if(typeof j!=="object"){return}if(!j.name){j.name=i}this.addCommand(j)},this)};this.removeCommands=function(h){Object.keys(h).forEach(function(i){this.removeCommand(h[i])},this)};this.bindKeys=function(h){Object.keys(h).forEach(function(i){this.bindKey(i,h[i])},this)};this._buildKeyHash=function(j){var i=j.bindKey;if(!i){return}var h=typeof i=="string"?i:i[this.platform];this.bindKey(h,j)};this.parseKeys=function(m){if(m.indexOf(" ")!=-1){m=m.split(/\s+/).pop()}var o=m.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(i){return i});var k=o.pop();var n=c[k];if(c.FUNCTION_KEYS[n]){k=c.FUNCTION_KEYS[n].toLowerCase()}else{if(!o.length){return{key:k,hashId:-1}}else{if(o.length==1&&o[0]=="shift"){return{key:k.toUpperCase(),hashId:-1}}}}var l=0;for(var j=o.length;j--;){var h=c.KEY_MODS[o[j]];if(h==null){if(typeof console!="undefined"){console.error("invalid modifier "+o[j]+" in "+m)}return false}l|=h}return{key:k,hashId:l}};this.findKeyCommand=function g(j,h){var i=this.commandKeyBinding;return i[j]&&i[j][h]};this.handleKeyboard=function(j,i,h,k){return{command:this.findKeyCommand(i,h)}}}).call(f.prototype);b.HashHandler=f});define("ace/mouse/fold_handler",["require","exports","module"],function(b,a,c){function d(e){e.on("click",function(i){var f=i.getDocumentPosition();var h=e.session;var g=h.getFoldAt(f.row,f.column,1);if(g){if(i.getAccelKey()){h.removeFold(g)}else{h.expandFold(g)}i.stop()}});e.on("gutterclick",function(g){var i=e.renderer.$gutterLayer.getRegion(g);if(i=="foldWidgets"){var h=g.getDocumentPosition().row;var f=e.session;if(f.foldWidgets&&f.foldWidgets[h]){e.session.onFoldWidgetClick(h,g)}if(!e.isFocused()){e.focus()}g.stop()}});e.on("gutterdblclick",function(j){var l=e.renderer.$gutterLayer.getRegion(j);if(l=="foldWidgets"){var k=j.getDocumentPosition().row;var i=e.session;var h=i.getParentFoldRangeData(k,true);var f=h.range||h.firstRange;if(f){k=f.start.row;var g=i.getFoldAt(k,i.getLine(k).length,1);if(g){i.removeFold(g)}else{i.addFold("...",f);e.renderer.scrollCursorIntoView({row:f.start.row,column:0})}}j.stop()}})}a.FoldHandler=d});define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config"],function(c,a,d){var f=c("../lib/lang");var b=c("../config");function e(g,h){return{win:g,mac:h}}a.commands=[{name:"showSettingsMenu",bindKey:e("Ctrl-,","Command-,"),exec:function(g){b.loadModule("ace/ext/settings_menu",function(h){h.init(g);g.showSettingsMenu()})},readOnly:true},{name:"goToNextError",bindKey:e("Alt-E","Ctrl-E"),exec:function(g){b.loadModule("ace/ext/error_marker",function(h){h.showErrorMarker(g,1)})},scrollIntoView:"animate",readOnly:true},{name:"goToPreviousError",bindKey:e("Alt-Shift-E","Ctrl-Shift-E"),exec:function(g){b.loadModule("ace/ext/error_marker",function(h){h.showErrorMarker(g,-1)})},scrollIntoView:"animate",readOnly:true},{name:"selectall",bindKey:e("Ctrl-A","Command-A"),exec:function(g){g.selectAll()},readOnly:true},{name:"centerselection",bindKey:e(null,"Ctrl-L"),exec:function(g){g.centerSelection()},readOnly:true},{name:"gotoline",bindKey:e("Ctrl-L","Command-L"),exec:function(h){var g=parseInt(prompt("Enter line number:"),10);if(!isNaN(g)){h.gotoLine(g)}},readOnly:true},{name:"fold",bindKey:e("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(g){g.session.toggleFold(false)},scrollIntoView:"center",readOnly:true},{name:"unfold",bindKey:e("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(g){g.session.toggleFold(true)},scrollIntoView:"center",readOnly:true},{name:"toggleFoldWidget",bindKey:e("F2","F2"),exec:function(g){g.session.toggleFoldWidget()},scrollIntoView:"center",readOnly:true},{name:"toggleParentFoldWidget",bindKey:e("Alt-F2","Alt-F2"),exec:function(g){g.session.toggleFoldWidget(true)},scrollIntoView:"center",readOnly:true},{name:"foldall",bindKey:e("Ctrl-Alt-0","Ctrl-Command-Option-0"),exec:function(g){g.session.foldAll()},scrollIntoView:"center",readOnly:true},{name:"foldOther",bindKey:e("Alt-0","Command-Option-0"),exec:function(g){g.session.foldAll();g.session.unfold(g.selection.getAllRanges())},scrollIntoView:"center",readOnly:true},{name:"unfoldall",bindKey:e("Alt-Shift-0","Command-Option-Shift-0"),exec:function(g){g.session.unfold()},scrollIntoView:"center",readOnly:true},{name:"findnext",bindKey:e("Ctrl-K","Command-G"),exec:function(g){g.findNext()},readOnly:true},{name:"findprevious",bindKey:e("Ctrl-Shift-K","Command-Shift-G"),exec:function(g){g.findPrevious()},readOnly:true},{name:"selectOrFindNext",bindKey:e("ALt-K","Ctrl-G"),exec:function(g){if(g.selection.isEmpty()){g.selection.selectWord()}else{g.findNext()}},readOnly:true},{name:"selectOrFindPrevious",bindKey:e("Alt-Shift-K","Ctrl-Shift-G"),exec:function(g){if(g.selection.isEmpty()){g.selection.selectWord()}else{g.findPrevious()}},readOnly:true},{name:"find",bindKey:e("Ctrl-F","Command-F"),exec:function(g){b.loadModule("ace/ext/searchbox",function(h){h.Search(g)})},readOnly:true},{name:"overwrite",bindKey:"Insert",exec:function(g){g.toggleOverwrite()},readOnly:true},{name:"selecttostart",bindKey:e("Ctrl-Shift-Home","Command-Shift-Up"),exec:function(g){g.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:true,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:e("Ctrl-Home","Command-Home|Command-Up"),exec:function(g){g.navigateFileStart()},multiSelectAction:"forEach",readOnly:true,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:e("Shift-Up","Shift-Up"),exec:function(g){g.getSelection().selectUp()},multiSelectAction:"forEach",readOnly:true},{name:"golineup",bindKey:e("Up","Up|Ctrl-P"),exec:function(h,g){h.navigateUp(g.times)},multiSelectAction:"forEach",readOnly:true},{name:"selecttoend",bindKey:e("Ctrl-Shift-End","Command-Shift-Down"),exec:function(g){g.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:true,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:e("Ctrl-End","Command-End|Command-Down"),exec:function(g){g.navigateFileEnd()},multiSelectAction:"forEach",readOnly:true,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:e("Shift-Down","Shift-Down"),exec:function(g){g.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"golinedown",bindKey:e("Down","Down|Ctrl-N"),exec:function(h,g){h.navigateDown(g.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selectwordleft",bindKey:e("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(g){g.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"gotowordleft",bindKey:e("Ctrl-Left","Option-Left"),exec:function(g){g.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selecttolinestart",bindKey:e("Alt-Shift-Left","Command-Shift-Left"),exec:function(g){g.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"gotolinestart",bindKey:e("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(g){g.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selectleft",bindKey:e("Shift-Left","Shift-Left"),exec:function(g){g.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"gotoleft",bindKey:e("Left","Left|Ctrl-B"),exec:function(h,g){h.navigateLeft(g.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selectwordright",bindKey:e("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(g){g.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"gotowordright",bindKey:e("Ctrl-Right","Option-Right"),exec:function(g){g.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selecttolineend",bindKey:e("Alt-Shift-Right","Command-Shift-Right"),exec:function(g){g.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"gotolineend",bindKey:e("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(g){g.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selectright",bindKey:e("Shift-Right","Shift-Right"),exec:function(g){g.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"gotoright",bindKey:e("Right","Right|Ctrl-F"),exec:function(h,g){h.navigateRight(g.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(g){g.selectPageDown()},readOnly:true},{name:"pagedown",bindKey:e(null,"Option-PageDown"),exec:function(g){g.scrollPageDown()},readOnly:true},{name:"gotopagedown",bindKey:e("PageDown","PageDown|Ctrl-V"),exec:function(g){g.gotoPageDown()},readOnly:true},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(g){g.selectPageUp()},readOnly:true},{name:"pageup",bindKey:e(null,"Option-PageUp"),exec:function(g){g.scrollPageUp()},readOnly:true},{name:"gotopageup",bindKey:"PageUp",exec:function(g){g.gotoPageUp()},readOnly:true},{name:"scrollup",bindKey:e("Ctrl-Up",null),exec:function(g){g.renderer.scrollBy(0,-2*g.renderer.layerConfig.lineHeight)},readOnly:true},{name:"scrolldown",bindKey:e("Ctrl-Down",null),exec:function(g){g.renderer.scrollBy(0,2*g.renderer.layerConfig.lineHeight)},readOnly:true},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(g){g.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selectlineend",bindKey:"Shift-End",exec:function(g){g.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"togglerecording",bindKey:e("Ctrl-Alt-E","Command-Option-E"),exec:function(g){g.commands.toggleRecording(g)},readOnly:true},{name:"replaymacro",bindKey:e("Ctrl-Shift-E","Command-Shift-E"),exec:function(g){g.commands.replay(g)},readOnly:true},{name:"jumptomatching",bindKey:e("Ctrl-P","Ctrl-Shift-P"),exec:function(g){g.jumpToMatching()},multiSelectAction:"forEach",readOnly:true},{name:"selecttomatching",bindKey:e("Ctrl-Shift-P",null),exec:function(g){g.jumpToMatching(true)},multiSelectAction:"forEach",readOnly:true},{name:"cut",exec:function(h){var g=h.getSelectionRange();h._emit("cut",g);if(!h.selection.isEmpty()){h.session.remove(g);h.clearSelection()}},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"removeline",bindKey:e("Ctrl-D","Command-D"),exec:function(g){g.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:e("Ctrl-Shift-D","Command-Shift-D"),exec:function(g){g.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:e("Ctrl-Alt-S","Command-Alt-S"),exec:function(g){g.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:e("Ctrl-/","Command-/"),exec:function(g){g.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:e("Ctrl-Shift-/","Command-Shift-/"),exec:function(g){g.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:e("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(g){g.modifyNumber(1)},multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:e("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(g){g.modifyNumber(-1)},multiSelectAction:"forEach"},{name:"replace",bindKey:e("Ctrl-H","Command-Option-F"),exec:function(g){b.loadModule("ace/ext/searchbox",function(h){h.Search(g,true)})}},{name:"undo",bindKey:e("Ctrl-Z","Command-Z"),exec:function(g){g.undo()}},{name:"redo",bindKey:e("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(g){g.redo()}},{name:"copylinesup",bindKey:e("Alt-Shift-Up","Command-Option-Up"),exec:function(g){g.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:e("Alt-Up","Option-Up"),exec:function(g){g.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:e("Alt-Shift-Down","Command-Option-Down"),exec:function(g){g.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:e("Alt-Down","Option-Down"),exec:function(g){g.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:e("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(g){g.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:e("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(g){g.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:e("Shift-Delete",null),exec:function(g){if(g.selection.isEmpty()){g.remove("left")}else{return false}},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:e("Alt-Backspace","Command-Backspace"),exec:function(g){g.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:e("Alt-Delete","Ctrl-K"),exec:function(g){g.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:e("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(g){g.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:e("Ctrl-Delete","Alt-Delete"),exec:function(g){g.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:e("Shift-Tab","Shift-Tab"),exec:function(g){g.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:e("Tab","Tab"),exec:function(g){g.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:e("Ctrl-[","Ctrl-["),exec:function(g){g.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:e("Ctrl-]","Ctrl-]"),exec:function(g){g.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(g,h){g.insert(h)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(h,g){h.insert(f.stringRepeat(g.text||"",g.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:e(null,"Ctrl-O"),exec:function(g){g.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:e("Ctrl-T","Ctrl-T"),exec:function(g){g.transposeLetters()},multiSelectAction:function(g){g.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:e("Ctrl-U","Ctrl-U"),exec:function(g){g.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:e("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(g){g.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"}]});define("ace/lib/event_emitter",["require","exports","module"],function(d,b,e){var f={};var a=function(){this.propagationStopped=true};var c=function(){this.defaultPrevented=true};f._emit=f._dispatchEvent=function(g,l){this._eventRegistry||(this._eventRegistry={});this._defaultHandlers||(this._defaultHandlers={});var k=this._eventRegistry[g]||[];var h=this._defaultHandlers[g];if(!k.length&&!h){return}if(typeof l!="object"||!l){l={}}if(!l.type){l.type=g}if(!l.stopPropagation){l.stopPropagation=a}if(!l.preventDefault){l.preventDefault=c}k=k.slice();for(var j=0;j0};this.hasRedo=function(){return this.$redoStack.length>0};this.markClean=function(){this.dirtyCounter=0};this.isClean=function(){return this.dirtyCounter===0}}).call(d.prototype);a.UndoManager=d});define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(b,a,c){var d=b("./dom");a.get=function(e,g){var f=new XMLHttpRequest();f.open("GET",e,true);f.onreadystatechange=function(){if(f.readyState===4){g(f.responseText)}};f.send(null)};a.loadScript=function(g,h){var e=d.getDocumentHead();var f=document.createElement("script");f.src=g;e.appendChild(f);f.onload=f.onreadystatechange=function(j,i){if(i||!f.readyState||f.readyState=="loaded"||f.readyState=="complete"){f=f.onload=f.onreadystatechange=null;if(!i){h()}}}}});define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(e,g,b){var k=e("./lib/oop");var f=e("./lib/dom");var d=e("./config");var p=e("./layer/gutter").Gutter;var n=e("./layer/marker").Marker;var c=e("./layer/text").Text;var o=e("./layer/cursor").Cursor;var l=e("./scrollbar").HScrollBar;var i=e("./scrollbar").VScrollBar;var m=e("./renderloop").RenderLoop;var h=e("./layer/font_metrics").FontMetrics;var q=e("./lib/event_emitter").EventEmitter;var j='.ace_editor {position: relative;overflow: hidden;font-family: \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;font-size: 12px;line-height: normal;direction: ltr;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: text;min-width: 100%;}.ace_dragging, .ace_dragging * {cursor: move !important;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;}.ace_text-input.ace_composition {background: #f8f8f8;color: #111;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;/* setting pointer-events: auto; on node under the mouse, which changesduring scroll, will break mouse wheel scrolling in Safari */pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0px;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-moz-transition: opacity 0.18s;-webkit-transition: opacity 0.18s;-o-transition: opacity 0.18s;-ms-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;-moz-border-radius: 2px;-webkit-border-radius: 2px;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;display: block;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}/*** Dark version for fold widgets*/.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-moz-transition: opacity 0.4s ease 0.05s;-webkit-transition: opacity 0.4s ease 0.05s;-o-transition: opacity 0.4s ease 0.05s;-ms-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-moz-transition: opacity 0.05s ease 0.05s;-webkit-transition: opacity 0.05s ease 0.05s;-o-transition: opacity 0.05s ease 0.05s;-ms-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}';f.importCssString(j,"ace_editor");var a=function(s,u){var r=this;this.container=s||f.createElement("div");this.$keepTextAreaAtCursor=true;f.addCssClass(this.container,"ace_editor");this.setTheme(u);this.$gutter=f.createElement("div");this.$gutter.className="ace_gutter";this.container.appendChild(this.$gutter);this.scroller=f.createElement("div");this.scroller.className="ace_scroller";this.container.appendChild(this.scroller);this.content=f.createElement("div");this.content.className="ace_content";this.scroller.appendChild(this.content);this.$gutterLayer=new p(this.$gutter);this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this));this.$markerBack=new n(this.content);var t=this.$textLayer=new c(this.content);this.canvas=t.element;this.$markerFront=new n(this.content);this.$cursorLayer=new o(this.content);this.$horizScroll=false;this.$vScroll=false;this.scrollBar=this.scrollBarV=new i(this.container,this);this.scrollBarH=new l(this.container,this);this.scrollBarV.addEventListener("scroll",function(v){if(!r.$scrollAnimation){r.session.setScrollTop(v.data-r.scrollMargin.top)}});this.scrollBarH.addEventListener("scroll",function(v){if(!r.$scrollAnimation){r.session.setScrollLeft(v.data-r.scrollMargin.left)}});this.scrollTop=0;this.scrollLeft=0;this.cursorPos={row:0,column:0};this.$fontMetrics=new h(this.container,500);this.$textLayer.$setFontMetrics(this.$fontMetrics);this.$textLayer.addEventListener("changeCharacterSize",function(v){r.updateCharacterSize();r.onResize(true,r.gutterWidth,r.$size.width,r.$size.height);r._signal("changeCharacterSize",v)});this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:true};this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1};this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0};this.$loop=new m(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView);this.$loop.schedule(this.CHANGE_FULL);this.updateCharacterSize();this.setPadding(4);d.resetOptions(this);d._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1;this.CHANGE_MARKER=2;this.CHANGE_GUTTER=4;this.CHANGE_SCROLL=8;this.CHANGE_LINES=16;this.CHANGE_TEXT=32;this.CHANGE_SIZE=64;this.CHANGE_MARKER_BACK=128;this.CHANGE_MARKER_FRONT=256;this.CHANGE_FULL=512;this.CHANGE_H_SCROLL=1024;k.implement(this,q);this.updateCharacterSize=function(){if(this.$textLayer.allowBoldFonts!=this.$allowBoldFonts){this.$allowBoldFonts=this.$textLayer.allowBoldFonts;this.setStyle("ace_nobold",!this.$allowBoldFonts)}this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth();this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight();this.$updatePrintMargin()};this.setSession=function(r){if(this.session){this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode)}this.session=r;if(!r){return}if(this.scrollMargin.top&&r.getScrollTop()<=0){r.setScrollTop(-this.scrollMargin.top)}this.$cursorLayer.setSession(r);this.$markerBack.setSession(r);this.$markerFront.setSession(r);this.$gutterLayer.setSession(r);this.$textLayer.setSession(r);this.$loop.schedule(this.CHANGE_FULL);this.session.$setFontMetrics(this.$fontMetrics);this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this);this.onChangeNewLineMode();this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)};this.updateLines=function(s,r){if(r===undefined){r=Infinity}if(!this.$changedLines){this.$changedLines={firstRow:s,lastRow:r}}else{if(this.$changedLines.firstRow>s){this.$changedLines.firstRow=s}if(this.$changedLines.lastRowthis.layerConfig.lastRow||this.$changedLines.lastRow2){return}else{if(this.resizing>0){this.resizing++}else{this.resizing=w?1:0}}var u=this.container;if(!r){r=u.clientHeight||u.scrollHeight}if(!v){v=u.clientWidth||u.scrollWidth}var t=this.$updateCachedSize(w,s,v,r);if(!this.$size.scrollerHeight||(!v&&!r)){return this.resizing=0}if(w){this.$gutterLayer.$padding=null}if(w){this.$renderChanges(t|this.$changes,true)}else{this.$loop.schedule(t|this.$changes)}if(this.resizing){this.resizing=0}};this.$updateCachedSize=function(x,t,v,r){r-=(this.$extraHeight||0);var u=0;var s=this.$size;var w={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};if(r&&(x||s.height!=r)){s.height=r;u|=this.CHANGE_SIZE;s.scrollerHeight=s.height;if(this.$horizScroll){s.scrollerHeight-=this.scrollBarH.getHeight()}this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px";u=u|this.CHANGE_SCROLL}if(v&&(x||s.width!=v)){u|=this.CHANGE_SIZE;s.width=v;if(t==null){t=this.$showGutter?this.$gutter.offsetWidth:0}this.gutterWidth=t;this.scrollBarH.element.style.left=this.scroller.style.left=t+"px";s.scrollerWidth=Math.max(0,v-t-this.scrollBarV.getWidth());this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px";this.scroller.style.bottom=this.scrollBarH.getHeight()+"px";if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||x){u|=this.CHANGE_FULL}}s.$dirty=!v||!r;if(u){this._signal("resize",w)}return u};this.onGutterResize=function(){var r=this.$showGutter?this.$gutter.offsetWidth:0;if(r!=this.gutterWidth){this.$changes|=this.$updateCachedSize(true,r,this.$size.width,this.$size.height)}if(this.session.getUseWrapMode()&&this.adjustWrapLimit()){this.$loop.schedule(this.CHANGE_FULL)}else{if(this.$size.$dirty){this.$loop.schedule(this.CHANGE_FULL)}else{this.$computeLayerConfig();this.$loop.schedule(this.CHANGE_MARKER)}}};this.adjustWrapLimit=function(){var s=this.$size.scrollerWidth-this.$padding*2;var r=Math.floor(s/this.characterWidth);return this.session.adjustWrapLimit(r,this.$showPrintMargin&&this.$printMarginColumn)};this.setAnimatedScroll=function(r){this.setOption("animatedScroll",r)};this.getAnimatedScroll=function(){return this.$animatedScroll};this.setShowInvisibles=function(r){this.setOption("showInvisibles",r)};this.getShowInvisibles=function(){return this.getOption("showInvisibles")};this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")};this.setDisplayIndentGuides=function(r){this.setOption("displayIndentGuides",r)};this.setShowPrintMargin=function(r){this.setOption("showPrintMargin",r)};this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")};this.setPrintMarginColumn=function(r){this.setOption("printMarginColumn",r)};this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")};this.getShowGutter=function(){return this.getOption("showGutter")};this.setShowGutter=function(r){return this.setOption("showGutter",r)};this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")};this.setFadeFoldWidgets=function(r){this.setOption("fadeFoldWidgets",r)};this.setHighlightGutterLine=function(r){this.setOption("highlightGutterLine",r)};this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")};this.$updateGutterLineHighlight=function(){var t=this.$cursorLayer.$pixelPos;var r=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var s=this.session.selection.getCursor();s.column=0;t=this.$cursorLayer.getPixelPosition(s,true);r*=this.session.getRowLength(s.row)}this.$gutterLineHighlight.style.top=t.top-this.layerConfig.offset+"px";this.$gutterLineHighlight.style.height=r+"px"};this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl){return}if(!this.$printMarginEl){var s=f.createElement("div");s.className="ace_layer ace_print-margin-layer";this.$printMarginEl=f.createElement("div");this.$printMarginEl.className="ace_print-margin";s.appendChild(this.$printMarginEl);this.content.insertBefore(s,this.content.firstChild)}var r=this.$printMarginEl.style;r.left=((this.characterWidth*this.$printMarginColumn)+this.$padding)+"px";r.visibility=this.$showPrintMargin?"visible":"hidden";if(this.session&&this.session.$wrap==-1){this.adjustWrapLimit()}};this.getContainerElement=function(){return this.container};this.getMouseEventTarget=function(){return this.content};this.getTextAreaContainer=function(){return this.container};this.$moveTextAreaToCursor=function(){if(!this.$keepTextAreaAtCursor){return}var t=this.layerConfig;var v=this.$cursorLayer.$pixelPos.top;var r=this.$cursorLayer.$pixelPos.left;v-=t.offset;var u=this.lineHeight;if(v<0||v>t.height-u){return}var s=this.characterWidth;if(this.$composition){var x=this.textarea.value.replace(/^\x01+/,"");s*=(this.session.$getStringScreenWidth(x)[0]+2);u+=2;v-=1}r-=this.scrollLeft;if(r>this.$size.scrollerWidth-s){r=this.$size.scrollerWidth-s}r-=this.scrollBar.width;this.textarea.style.height=u+"px";this.textarea.style.width=s+"px";this.textarea.style.right=Math.max(0,this.$size.scrollerWidth-r-s)+"px";this.textarea.style.bottom=Math.max(0,this.$size.height-v-u)+"px"};this.getFirstVisibleRow=function(){return this.layerConfig.firstRow};this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)};this.getLastFullyVisibleRow=function(){var r=Math.floor((this.layerConfig.height+this.layerConfig.offset)/this.layerConfig.lineHeight);return this.layerConfig.firstRow-1+r};this.getLastVisibleRow=function(){return this.layerConfig.lastRow};this.$padding=null;this.setPadding=function(r){this.$padding=r;this.$textLayer.setPadding(r);this.$cursorLayer.setPadding(r);this.$markerFront.setPadding(r);this.$markerBack.setPadding(r);this.$loop.schedule(this.CHANGE_FULL);this.$updatePrintMargin()};this.setScrollMargin=function(u,r,t,s){var v=this.scrollMargin;v.top=u|0;v.bottom=r|0;v.right=s|0;v.left=t|0;v.v=v.top+v.bottom;v.h=v.left+v.right;if(v.top&&this.scrollTop<=0&&this.session){this.session.setScrollTop(-v.top)}this.updateFull()};this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible};this.setHScrollBarAlwaysVisible=function(r){this.setOption("hScrollBarAlwaysVisible",r)};this.getVScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible};this.setVScrollBarAlwaysVisible=function(r){this.setOption("vScrollBarAlwaysVisible",r)};this.$updateScrollBarV=function(){this.scrollBarV.setScrollHeight(this.layerConfig.maxHeight+this.scrollMargin.v);this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)};this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h);this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)};this.$frozen=false;this.freeze=function(){this.$frozen=true};this.unfreeze=function(){this.$frozen=false};this.$renderChanges=function(s,t){if(this.$changes){s|=this.$changes;this.$changes=0}if((!this.session||!this.container.offsetWidth||this.$frozen)||(!s&&!t)){this.$changes|=s;return}if(this.$size.$dirty){this.$changes|=s;return this.onResize(true)}if(!this.lineHeight){this.$textLayer.checkForSizeChanges()}this._signal("beforeRender");var r=this.layerConfig;if(s&this.CHANGE_FULL||s&this.CHANGE_SIZE||s&this.CHANGE_TEXT||s&this.CHANGE_LINES||s&this.CHANGE_SCROLL||s&this.CHANGE_H_SCROLL){s|=this.$computeLayerConfig();r=this.layerConfig;this.$updateScrollBarV();if(s&this.CHANGE_H_SCROLL){this.$updateScrollBarH()}this.$gutterLayer.element.style.marginTop=(-r.offset)+"px";this.content.style.marginTop=(-r.offset)+"px";this.content.style.width=r.width+2*this.$padding+"px";this.content.style.height=r.minHeight+"px"}if(s&this.CHANGE_H_SCROLL){this.content.style.marginLeft=-this.scrollLeft+"px";this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left"}if(s&this.CHANGE_FULL){this.$textLayer.update(r);if(this.$showGutter){this.$gutterLayer.update(r)}this.$markerBack.update(r);this.$markerFront.update(r);this.$cursorLayer.update(r);this.$moveTextAreaToCursor();this.$highlightGutterLine&&this.$updateGutterLineHighlight();this._signal("afterRender");return}if(s&this.CHANGE_SCROLL){if(s&this.CHANGE_TEXT||s&this.CHANGE_LINES){this.$textLayer.update(r)}else{this.$textLayer.scrollLines(r)}if(this.$showGutter){this.$gutterLayer.update(r)}this.$markerBack.update(r);this.$markerFront.update(r);this.$cursorLayer.update(r);this.$highlightGutterLine&&this.$updateGutterLineHighlight();this.$moveTextAreaToCursor();this._signal("afterRender");return}if(s&this.CHANGE_TEXT){this.$textLayer.update(r);if(this.$showGutter){this.$gutterLayer.update(r)}}else{if(s&this.CHANGE_LINES){if(this.$updateLines()||(s&this.CHANGE_GUTTER)&&this.$showGutter){this.$gutterLayer.update(r)}}else{if(s&this.CHANGE_TEXT||s&this.CHANGE_GUTTER){if(this.$showGutter){this.$gutterLayer.update(r)}}}}if(s&this.CHANGE_CURSOR){this.$cursorLayer.update(r);this.$moveTextAreaToCursor();this.$highlightGutterLine&&this.$updateGutterLineHighlight()}if(s&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)){this.$markerFront.update(r)}if(s&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)){this.$markerBack.update(r)}this._signal("afterRender")};this.$autosize=function(){var r=this.session.getScreenLength()*this.lineHeight;var v=this.$maxLines*this.lineHeight;var u=Math.max((this.$minLines||1)*this.lineHeight,Math.min(v,r))+this.scrollMargin.v+(this.$extraHeight||0);var t=r>v;if(u!=this.desiredHeight||this.$size.height!=this.desiredHeight||t!=this.$vScroll){if(t!=this.$vScroll){this.$vScroll=t;this.scrollBarV.setVisible(t)}var s=this.container.clientWidth;this.container.style.height=u+"px";this.$updateCachedSize(true,this.$gutterWidth,s,u);this.desiredHeight=u}};this.$computeLayerConfig=function(){if(this.$maxLines&&this.lineHeight>1){this.$autosize()}var s=this.session;var B=this.$size;var G=B.height<=2*this.lineHeight;var t=this.session.getScreenLength();var D=t*this.lineHeight;var v=this.scrollTop%this.lineHeight;var x=B.scrollerHeight+this.lineHeight;var I=this.$getLongestLine();var w=!G&&(this.$hScrollBarAlwaysVisible||B.scrollerWidth-I-2*this.$padding<0);var J=this.$horizScroll!==w;if(J){this.$horizScroll=w;this.scrollBarH.setVisible(w)}if(!this.$maxLines&&this.$scrollPastEnd){if(this.scrollTop>D-B.scrollerHeight){D+=Math.min((B.scrollerHeight-this.lineHeight)*this.$scrollPastEnd,this.scrollTop-D+B.scrollerHeight)}}var y=!G&&(this.$vScrollBarAlwaysVisible||B.scrollerHeight-D<0);var z=this.$vScroll!==y;if(z){this.$vScroll=y;this.scrollBarV.setVisible(y)}this.session.setScrollTop(Math.max(-this.scrollMargin.top,Math.min(this.scrollTop,D-B.scrollerHeight+this.scrollMargin.bottom)));this.session.setScrollLeft(Math.max(-this.scrollMargin.left,Math.min(this.scrollLeft,I+2*this.$padding-B.scrollerWidth+this.scrollMargin.right)));var E=Math.ceil(x/this.lineHeight)-1;var r=Math.max(0,Math.round((this.scrollTop-v)/this.lineHeight));var F=r+E;var A,C;var u=this.lineHeight;r=s.screenToDocumentRow(r,0);var H=s.getFoldLine(r);if(H){r=H.start.row}A=s.documentToScreenRow(r,0);C=s.getRowLength(r)*u;F=Math.min(s.screenToDocumentRow(F,0),s.getLength()-1);x=B.scrollerHeight+s.getRowLength(F)*u+C;v=this.scrollTop-A*u;var K=0;if(this.layerConfig.width!=I){K=this.CHANGE_H_SCROLL}if(J||z){K=this.$updateCachedSize(true,this.gutterWidth,B.width,B.height);this._signal("scrollbarVisibilityChanged");if(z){I=this.$getLongestLine()}}this.layerConfig={width:I,padding:this.$padding,firstRow:r,firstRowScreen:A,lastRow:F,lineHeight:u,characterWidth:this.characterWidth,minHeight:x,maxHeight:D,offset:v,gutterOffset:Math.max(0,Math.ceil((v+B.height-B.scrollerHeight)/u)),height:this.$size.scrollerHeight};return K};this.$updateLines=function(){var t=this.$changedLines.firstRow;var s=this.$changedLines.lastRow;this.$changedLines=null;var r=this.layerConfig;if(t>r.lastRow+1){return}if(sz){if(w){z-=w*this.$size.scrollerHeight}if(z===0){z=-this.scrollMargin.top}this.session.setScrollTop(z)}else{if(s+this.$size.scrollerHeight-rt){if(t=1-this.scrollMargin.top){return true}if(r>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight-(this.$size.scrollerHeight-this.lineHeight)*this.$scrollPastEnd<-1+this.scrollMargin.bottom){return true}if(s<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left){return true}if(s>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right){return true}};this.pixelToScreenCoordinates=function(r,w){var t=this.scroller.getBoundingClientRect();var v=(r+this.scrollLeft-t.left-this.$padding)/this.characterWidth;var u=Math.floor((w+this.scrollTop-t.top)/this.lineHeight);var s=Math.round(v);return{row:u,column:s,side:v-s>0?1:-1}};this.screenToTextCoordinates=function(r,v){var t=this.scroller.getBoundingClientRect();var s=Math.round((r+this.scrollLeft-t.left-this.$padding)/this.characterWidth);var u=(v+this.scrollTop-t.top)/this.lineHeight;return this.session.screenToDocumentPosition(u,Math.max(s,0))};this.textToScreenCoordinates=function(u,t){var s=this.scroller.getBoundingClientRect();var w=this.session.documentToScreenPosition(u,t);var r=this.$padding+Math.round(w.column*this.characterWidth);var v=w.row*this.lineHeight;return{pageX:s.left+r-this.scrollLeft,pageY:s.top+v-this.scrollTop}};this.visualizeFocus=function(){f.addCssClass(this.container,"ace_focus")};this.visualizeBlur=function(){f.removeCssClass(this.container,"ace_focus")};this.showComposition=function(r){if(!this.$composition){this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}}this.$keepTextAreaAtCursor=true;f.addCssClass(this.textarea,"ace_composition");this.textarea.style.cssText="";this.$moveTextAreaToCursor()};this.setCompositionText=function(r){this.$moveTextAreaToCursor()};this.hideComposition=function(){if(!this.$composition){return}f.removeCssClass(this.textarea,"ace_composition");this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor;this.textarea.style.cssText=this.$composition.cssText;this.$composition=null};this.setTheme=function(u,s){var r=this;this.$themeId=u;r._dispatchEvent("themeChange",{theme:u});if(!u||typeof u=="string"){var t=u||this.$options.theme.initialValue;d.loadModule(["theme",t],v)}else{v(u)}function v(w){if(r.$themeId!=u){return s&&s()}if(!w.cssClass){return}f.importCssString(w.cssText,w.cssClass,r.container.ownerDocument);if(r.theme){f.removeCssClass(r.container,r.theme.cssClass)}var x="padding" in w?w.padding:"padding" in (r.theme||{})?4:r.$padding;if(r.$padding&&x!=r.$padding){r.setPadding(x)}r.$theme=w.cssClass;r.theme=w;f.addCssClass(r.container,w.cssClass);f.setCssClass(r.container,"ace_dark",w.isDark);if(r.$size){r.$size.width=0;r.$updateSizeAsync()}r._dispatchEvent("themeLoaded",{theme:w});s&&s()}};this.getTheme=function(){return this.$themeId};this.setStyle=function(s,r){f.setCssClass(this.container,s,r!==false)};this.unsetStyle=function(r){f.removeCssClass(this.container,r)};this.setCursorStyle=function(r){if(this.content.style.cursor!=r){this.content.style.cursor=r}};this.setMouseCursor=function(r){this.content.style.cursor=r};this.destroy=function(){this.$textLayer.destroy();this.$cursorLayer.destroy()}}).call(a.prototype);d.defineOptions(a.prototype,"renderer",{animatedScroll:{initialValue:false},showInvisibles:{set:function(r){if(this.$textLayer.setShowInvisibles(r)){this.$loop.schedule(this.CHANGE_TEXT)}},initialValue:false},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:true},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(r){if(typeof r=="number"){this.$printMarginColumn=r}this.$showPrintMargin=!!r;this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(r){this.$gutter.style.display=r?"block":"none";this.$loop.schedule(this.CHANGE_FULL);this.onGutterResize()},initialValue:true},fadeFoldWidgets:{set:function(r){f.setCssClass(this.$gutter,"ace_fade-fold-widgets",r)},initialValue:false},showFoldWidgets:{set:function(r){this.$gutterLayer.setShowFoldWidgets(r)},initialValue:true},showLineNumbers:{set:function(r){this.$gutterLayer.setShowLineNumbers(r);this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:true},displayIndentGuides:{set:function(r){if(this.$textLayer.setDisplayIndentGuides(r)){this.$loop.schedule(this.CHANGE_TEXT)}},initialValue:true},highlightGutterLine:{set:function(r){if(!this.$gutterLineHighlight){this.$gutterLineHighlight=f.createElement("div");this.$gutterLineHighlight.className="ace_gutter-active-line";this.$gutter.appendChild(this.$gutterLineHighlight);return}this.$gutterLineHighlight.style.display=r?"":"none";if(this.$cursorLayer.$pixelPos){this.$updateGutterLineHighlight()}},initialValue:false,value:true},hScrollBarAlwaysVisible:{set:function(r){if(!this.$hScrollBarAlwaysVisible||!this.$horizScroll){this.$loop.schedule(this.CHANGE_SCROLL)}},initialValue:false},vScrollBarAlwaysVisible:{set:function(r){if(!this.$vScrollBarAlwaysVisible||!this.$vScroll){this.$loop.schedule(this.CHANGE_SCROLL)}},initialValue:false},fontSize:{set:function(r){if(typeof r=="number"){r=r+"px"}this.container.style.fontSize=r;this.updateFontSize()},initialValue:12},fontFamily:{set:function(r){this.container.style.fontFamily=r;this.updateFontSize()}},maxLines:{set:function(r){this.updateFull()}},minLines:{set:function(r){this.updateFull()}},scrollPastEnd:{set:function(r){r=+r||0;if(this.$scrollPastEnd==r){return}this.$scrollPastEnd=r;this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:0,handlesSet:true},fixedWidthGutter:{set:function(r){this.$gutterLayer.$fixedWidth=!!r;this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(r){this.setTheme(r)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:true}});g.VirtualRenderer=a});define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/lib/net","ace/lib/event_emitter"],function(e,h,d){var c=e("./lib/lang");var i=e("./lib/oop");var j=e("./lib/net");var m=e("./lib/event_emitter").EventEmitter;var b=(function(){return this})();var l={packaged:false,workerPath:null,modePath:null,themePath:null,basePath:"",suffix:".js",$moduleUrls:{}};h.get=function(n){if(!l.hasOwnProperty(n)){throw new Error("Unknown config key: "+n)}return l[n]};h.set=function(n,o){if(!l.hasOwnProperty(n)){throw new Error("Unknown config key: "+n)}l[n]=o};h.all=function(){return c.copyObject(l)};i.implement(h,m);h.moduleUrl=function(p,o){if(l.$moduleUrls[p]){return l.$moduleUrls[p]}var t=p.split("/");o=o||t[t.length-2]||"";var n=o=="snippets"?"/":"-";var r=t[t.length-1];if(n=="-"){var q=new RegExp("^"+o+"[\\-_]|[\\-_]"+o+"$","g");r=r.replace(q,"")}if((!r||r==o)&&t.length>1){r=t[t.length-2]}var s=l[o+"Path"];if(s==null){s=l.basePath}else{if(n=="/"){o=n=""}}if(s&&s.slice(-1)!="/"){s+="/"}return s+o+n+r+this.get("suffix")};h.setModuleUrl=function(n,o){return l.$moduleUrls[n]=o};h.$loading={};h.loadModule=function(n,q){var o,p;if(Array.isArray(n)){p=n[0];n=n[1]}try{o=e(n)}catch(r){}if(o&&!h.$loading[n]){return q&&q(o)}if(!h.$loading[n]){h.$loading[n]=[]}h.$loading[n].push(q);if(h.$loading[n].length>1){return}var s=function(){e([n],function(t){h._emit("load.module",{name:n,module:t});var u=h.$loading[n];h.$loading[n]=null;u.forEach(function(v){v&&v(t)})})};if(!h.get("packaged")){return s()}j.loadScript(h.moduleUrl(n,p),s)};k(true);function k(p){l.packaged=p||e.packaged||d.packaged||(b.define&&define.packaged);if(!b.document){return""}var o={};var r="";var t=document.getElementsByTagName("script");for(var w=0;wm){p=n.end.row+1;n=j.getNextFoldLine(p,n);m=n?n.start.row:Infinity}if(p>y){while(this.$cells.length>q+1){k=this.$cells.pop();this.element.removeChild(k.element)}break}k=this.$cells[++q];if(!k){k={element:null,textNode:null,foldWidget:null};k.element=h.createElement("div");k.textNode=document.createTextNode("");k.element.appendChild(k.textNode);this.element.appendChild(k.element);this.$cells[q]=k}var l="ace_gutter-cell ";if(t[p]){l+=t[p]}if(o[p]){l+=o[p]}if(this.$annotations[p]){l+=this.$annotations[p].className}if(k.element.className!=l){k.element.className=l}var w=j.getRowLength(p)*C.lineHeight+"px";if(w!=k.element.style.height){k.element.style.height=w}if(x){var B=x[p];if(B==null){B=x[p]=j.getFoldWidget(p)}}if(B){if(!k.foldWidget){k.foldWidget=h.createElement("span");k.element.appendChild(k.foldWidget)}var l="ace_fold-widget ace_"+B;if(B=="start"&&p==m&&pj.right-k.right){return"foldWidgets"}}}).call(d.prototype);a.Gutter=d});define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,g,c){var f=e("../lib/dom");var a=e("../lib/event");var d=e("../lib/useragent");var j=200;var h=200;var k=5;function i(t){var r=t.editor;var L=f.createElement("img");L.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";if(d.isOpera){L.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;"}var M=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];M.forEach(function(y){t[y]=this[y]},this);r.addEventListener("mousedown",this.onMouseDown.bind(t));var z=r.container;var J,B,w;var C,F;var p,A=0;var q;var K;var G;var u;var D;this.onDragStart=function(N){if(this.cancelDrag||!z.draggable){var x=this;setTimeout(function(){x.startSelect();x.captureMouse(N)},0);return N.preventDefault()}F=r.getSelectionRange();var y=N.dataTransfer;y.effectAllowed=r.getReadOnly()?"copy":"copyMove";if(d.isOpera){r.container.appendChild(L);L._top=L.offsetTop}y.setDragImage&&y.setDragImage(L,0,0);if(d.isOpera){r.container.removeChild(L)}y.clearData();y.setData("Text",r.session.getTextRange());K=true;this.setState("drag")};this.onDragEnd=function(y){z.draggable=false;K=false;this.setState(null);if(!r.getReadOnly()){var x=y.dataTransfer.dropEffect;if(!q&&x=="move"){r.session.remove(r.getSelectionRange())}r.renderer.$cursorLayer.setBlinking(true)}this.editor.unsetStyle("ace_dragging")};this.onDragEnter=function(x){if(r.getReadOnly()||!n(x.dataTransfer)){return}if(!J){v()}A++;x.dataTransfer.dropEffect=q=H(x);return a.preventDefault(x)};this.onDragOver=function(x){if(r.getReadOnly()||!n(x.dataTransfer)){return}if(!J){v();A++}if(l!==null){l=null}B=x.clientX;w=x.clientY;x.dataTransfer.dropEffect=q=H(x);return a.preventDefault(x)};this.onDragLeave=function(x){A--;if(A<=0&&J){o();q=null;return a.preventDefault(x)}};this.onDrop=function(N){if(!J){return}var y=N.dataTransfer;if(K){switch(q){case"move":if(F.contains(p.row,p.column)){F={start:p,end:p}}else{F=r.moveText(F,p)}break;case"copy":F=r.moveText(F,p,true);break}}else{var x=y.getData("Text");F={start:p,end:r.session.insert(p,x)};r.focus();q=null}o();return a.preventDefault(N)};a.addListener(z,"dragstart",this.onDragStart.bind(t));a.addListener(z,"dragend",this.onDragEnd.bind(t));a.addListener(z,"dragenter",this.onDragEnter.bind(t));a.addListener(z,"dragover",this.onDragOver.bind(t));a.addListener(z,"dragleave",this.onDragLeave.bind(t));a.addListener(z,"drop",this.onDrop.bind(t));function I(O,N){var y=Date.now();var x=!N||O.row!=N.row;var Q=!N||O.column!=N.column;if(!u||x||Q){r.$blockScrolling+=1;r.moveCursorToPosition(O);r.$blockScrolling-=1;u=y;D={x:B,y:w}}else{var P=b(D.x,D.y,B,w);if(P>k){u=null}else{if(y-u>=h){r.renderer.scrollCursorIntoView();u=null}}}}function s(W,Q){var N=Date.now();var U=r.renderer.layerConfig.lineHeight;var y=r.renderer.layerConfig.characterWidth;var O=r.renderer.scroller.getBoundingClientRect();var R={x:{left:B-O.left,right:O.right-B},y:{top:w-O.top,bottom:O.bottom-w}};var T=Math.min(R.x.left,R.x.right);var P=Math.min(R.y.top,R.y.bottom);var X={row:W.row,column:W.column};if(T/y<=2){X.column+=(R.x.left=j){r.renderer.scrollCursorIntoView(X)}}}else{G=null}}function m(){var x=p;p=r.renderer.screenToTextCoordinates(B,w);I(p,x);s(p,x)}function v(){F=r.selection.toOrientedRange();J=r.session.addMarker(F,"ace_selection",r.getSelectionStyle());r.clearSelection();if(r.isFocused()){r.renderer.$cursorLayer.setBlinking(false)}clearInterval(C);C=setInterval(m,20);A=0;a.addListener(document,"mousemove",E)}function o(){clearInterval(C);r.session.removeMarker(J);J=null;r.$blockScrolling+=1;r.selection.fromOrientedRange(F);r.$blockScrolling-=1;if(r.isFocused()&&!K){r.renderer.$cursorLayer.setBlinking(!r.getReadOnly())}F=null;A=0;G=null;u=null;a.removeListener(document,"mousemove",E)}var l=null;function E(){if(l==null){l=setTimeout(function(){if(l!=null&&J){o()}},20)}}function n(y){var x=y.types;return !x||Array.prototype.some.call(x,function(N){return N=="text/plain"||N=="Text"})}function H(Q){var P=["copy","copymove","all","uninitialized"];var x=["move","copymove","linkmove","all","uninitialized"];var y=d.isMac?Q.altKey:Q.ctrlKey;var O="uninitialized";try{O=Q.dataTransfer.effectAllowed.toLowerCase()}catch(Q){}var N="none";if(y&&P.indexOf(O)>=0){N="copy"}else{if(x.indexOf(O)>=0){N="move"}else{if(P.indexOf(O)>=0){N="copy"}}}return N}}(function(){this.dragWait=function(){var l=Date.now()-this.mousedownEvent.time;if(l>this.editor.getDragDelay()){this.startDrag()}};this.dragWaitEnd=function(){var l=this.editor.container;l.draggable=false;this.startSelect(this.mousedownEvent.getDocumentPosition());this.selectEnd()};this.dragReadyEnd=function(l){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());this.editor.unsetStyle("ace_dragging");this.dragWaitEnd()};this.startDrag=function(){this.cancelDrag=false;var l=this.editor.container;l.draggable=true;this.editor.renderer.$cursorLayer.setBlinking(false);this.editor.setStyle("ace_dragging");this.setState("dragReady")};this.onMouseDrag=function(m){var l=this.editor.container;if(d.isIE&&this.state=="dragReady"){var n=b(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);if(n>3){l.dragDrop()}}if(this.state==="dragWait"){var n=b(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);if(n>0){l.draggable=false;this.startSelect(this.mousedownEvent.getDocumentPosition())}}};this.onMouseDown=function(r){if(!this.$dragEnabled){return}this.mousedownEvent=r;var o=this.editor;var n=r.inSelection();var m=r.getButton();var l=r.domEvent.detail||1;if(l===1&&m===0&&n){if(r.editor.inMultiSelectMode&&(r.getAccelKey()||r.getShiftKey())){return}this.mousedownEvent.time=Date.now();var q=r.domEvent.target||r.domEvent.srcElement;if("unselectable" in q){q.unselectable="on"}if(o.getDragDelay()){if(d.isWebKit){this.cancelDrag=true;var p=o.container;p.draggable=true}this.setState("dragWait")}else{this.startDrag()}this.captureMouse(r,this.onMouseDrag.bind(this));r.defaultPrevented=true}}}).call(i.prototype);function b(m,l,o,n){return Math.sqrt(Math.pow(o-m,2)+Math.pow(n-l,2))}g.DragdropHandler=i});define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(c,b,d){var e=c("../range").Range;var f=c("../lib/dom");var a=function(g){this.element=f.createElement("div");this.element.className="ace_layer ace_marker-layer";g.appendChild(this.element)};(function(){this.$padding=0;this.setPadding=function(g){this.$padding=g};this.setSession=function(g){this.session=g};this.setMarkers=function(g){this.markers=g};this.update=function(i){var i=i||this.config;if(!i){return}this.config=i;var k=[];for(var j in this.markers){var g=this.markers[j];if(!g.range){g.update(k,this,this.session,i);continue}var h=g.range.clipRows(i.firstRow,i.lastRow);if(h.isEmpty()){continue}h=h.toScreenRange(this.session);if(g.renderer){var m=this.$getTop(h.start.row,i);var l=this.$padding+h.start.column*i.characterWidth;g.renderer(k,h,l,m,i)}else{if(g.type=="fullLine"){this.drawFullLineMarker(k,h,g.clazz,i)}else{if(g.type=="screenLine"){this.drawScreenLineMarker(k,h,g.clazz,i)}else{if(h.isMultiLine()){if(g.type=="text"){this.drawTextMarker(k,h,g.clazz,i)}else{this.drawMultiLineMarker(k,h,g.clazz,i)}}else{this.drawSingleLineMarker(k,h,g.clazz+" ace_start",i)}}}}}this.element=f.setInnerHtml(this.element,k.join(""))};this.$getTop=function(h,g){return(h-g.firstRowScreen)*g.lineHeight};this.drawTextMarker=function(j,h,i,g,l){var m=h.start.row;var k=new e(m,h.start.column,m,this.session.getScreenLastRowColumn(m));this.drawSingleLineMarker(j,k,i+" ace_start",g,1,l);m=h.end.row;k=new e(m,0,m,h.end.column);this.drawSingleLineMarker(j,k,i,g,0,l);for(m=h.start.row+1;m");n=this.$getTop(l.end.row,j);var h=l.end.column*j.characterWidth;i.push("
");p=(l.end.row-l.start.row-1)*j.lineHeight;if(p<0){return}n=this.$getTop(l.start.row+1,j);i.push("
")};this.drawSingleLineMarker=function(h,l,n,j,m,g){var p=j.lineHeight;var i=(l.end.column+(m||0)-l.start.column)*j.characterWidth;var o=this.$getTop(l.start.row,j);var k=this.$padding+l.start.column*j.characterWidth;h.push("
")};this.drawFullLineMarker=function(k,h,j,i,m){var l=this.$getTop(h.start.row,i);var g=i.lineHeight;if(h.start.row!=h.end.row){g+=this.$getTop(h.end.row,i)-l}k.push("
")};this.drawScreenLineMarker=function(k,h,j,i,m){var l=this.$getTop(h.start.row,i);var g=i.lineHeight;k.push("
")}}).call(a.prototype);b.Marker=a});define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(c,b,d){var f=c("../lib/event");var a=c("../lib/useragent");var e=b.MouseEvent=function(h,g){this.domEvent=h;this.editor=g;this.x=this.clientX=h.clientX;this.y=this.clientY=h.clientY;this.$pos=null;this.$inSelection=null;this.propagationStopped=false;this.defaultPrevented=false};(function(){this.stopPropagation=function(){f.stopPropagation(this.domEvent);this.propagationStopped=true};this.preventDefault=function(){f.preventDefault(this.domEvent);this.defaultPrevented=true};this.stop=function(){this.stopPropagation();this.preventDefault()};this.getDocumentPosition=function(){if(this.$pos){return this.$pos}this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY);return this.$pos};this.inSelection=function(){if(this.$inSelection!==null){return this.$inSelection}var g=this.editor;var i=g.getSelectionRange();if(i.isEmpty()){this.$inSelection=false}else{var h=this.getDocumentPosition();this.$inSelection=i.contains(h.row,h.column)}return this.$inSelection};this.getButton=function(){return f.getButton(this.domEvent)};this.getShiftKey=function(){return this.domEvent.shiftKey};this.getAccelKey=a.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(e.prototype)});define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,g,b){var h=e("../lib/oop");var f=e("../lib/dom");var a=e("../lib/lang");var c=e("../lib/useragent");var i=e("../lib/event_emitter").EventEmitter;var d=function(j){this.element=f.createElement("div");this.element.className="ace_layer ace_text-layer";j.appendChild(this.element);this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){h.implement(this,i);this.EOF_CHAR="\xB6";this.EOL_CHAR_LF="\xAC";this.EOL_CHAR_CRLF="\xa4";this.EOL_CHAR=this.EOL_CHAR_LF;this.TAB_CHAR="\u2192";this.SPACE_CHAR="\xB7";this.$padding=0;this.$updateEolChar=function(){var j=this.session.doc.getNewLineCharacter()=="\n"?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=j){this.EOL_CHAR=j;return true}};this.setPadding=function(j){this.$padding=j;this.element.style.padding="0 "+j+"px"};this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0};this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0};this.$setFontMetrics=function(j){this.$fontMetrics=j;this.$fontMetrics.on("changeCharacterSize",function(k){this._signal("changeCharacterSize",k)}.bind(this));this.$pollSizeChanges()};this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()};this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()};this.setSession=function(j){this.session=j;this.$computeTabString()};this.showInvisibles=false;this.setShowInvisibles=function(j){if(this.showInvisibles==j){return false}this.showInvisibles=j;this.$computeTabString();return true};this.displayIndentGuides=true;this.setDisplayIndentGuides=function(j){if(this.displayIndentGuides==j){return false}this.displayIndentGuides=j;this.$computeTabString();return true};this.$tabStrings=[];this.onChangeTabSize=this.$computeTabString=function(){var n=this.session.getTabSize();this.tabSize=n;var j=this.$tabStrings=[0];for(var k=1;k"+this.TAB_CHAR+a.stringRepeat("\xa0",k-1)+"")}else{j.push(a.stringRepeat("\xa0",k))}}if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var l="ace_indent-guide";if(this.showInvisibles){l+=" ace_invisible";var o=a.stringRepeat(this.SPACE_CHAR,this.tabSize);var m=this.TAB_CHAR+a.stringRepeat("\xa0",this.tabSize-1)}else{var o=a.stringRepeat("\xa0",this.tabSize);var m=o}this.$tabStrings[" "]=""+o+"";this.$tabStrings["\t"]=""+m+""}};this.updateLines=function(k,m,u){if(this.config.lastRow!=k.lastRow||this.config.firstRow!=k.firstRow){this.scrollLines(k)}this.config=k;var p=Math.max(m,k.firstRow);var r=Math.min(u,k.lastRow);var s=this.element.childNodes;var j=0;for(var t=k.firstRow;tn){t=q.end.row+1;q=this.session.getNextFoldLine(t,q);n=q?q.start.row:Infinity}if(t>r){break}var l=s[j++];if(l){var o=[];this.$renderLine(o,t,!this.$useLineGroups(),t==n?q:false);l.style.height=k.lineHeight*this.session.getRowLength(t)+"px";f.setInnerHtml(l,o.join(""))}t++}};this.scrollLines=function(l){var j=this.config;this.config=l;if(!j||j.lastRow0;n--){m.removeChild(m.firstChild)}}if(j.lastRow>l.lastRow){for(var n=this.session.getFoldedRowCount(l.lastRow+1,j.lastRow);n>0;n--){m.removeChild(m.lastChild)}}if(l.firstRowj.lastRow){var k=this.$renderLinesFragment(l,j.lastRow+1,l.lastRow);m.appendChild(k)}};this.$renderLinesFragment=function(k,l,r){var o=this.element.ownerDocument.createDocumentFragment();var q=l;var p=this.session.getNextFoldLine(q);var m=p?p.start.row:Infinity;while(true){if(q>m){q=p.end.row+1;p=this.session.getNextFoldLine(q,p);m=p?p.start.row:Infinity}if(q>r){break}var j=f.createElement("div");var n=[];this.$renderLine(n,q,false,q==m?p:false);j.innerHTML=n.join("");if(this.$useLineGroups()){j.className="ace_line_group";o.appendChild(j);j.style.height=k.lineHeight*this.session.getRowLength(q)+"px"}else{while(j.firstChild){o.appendChild(j.firstChild)}}q++}return o};this.update=function(k){this.config=k;var l=[];var p=k.firstRow,m=k.lastRow;var o=p;var n=this.session.getNextFoldLine(o);var j=n?n.start.row:Infinity;while(true){if(o>j){o=n.end.row+1;n=this.session.getNextFoldLine(o,n);j=n?n.start.row:Infinity}if(o>m){break}if(this.$useLineGroups()){l.push("
")}this.$renderLine(l,o,false,o==j?n:false);if(this.$useLineGroups()){l.push("
")}o++}this.element=f.setInnerHtml(this.element,l.join(""))};this.$textToken={text:true,rparen:true,lparen:true};this.$renderToken=function(l,p,o,r){var s=this;var j=/\t|&|<|( +)|([\x00-\x1f\x80-\xa0\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g;var q=function(A,v,u,w,t){if(v){return s.showInvisibles?""+a.stringRepeat(s.SPACE_CHAR,A.length)+"":a.stringRepeat("\xa0",A.length)}else{if(A=="&"){return"&"}else{if(A=="<"){return"<"}else{if(A=="\t"){var y=s.session.getScreenTabSize(p+w);p+=y-1;return s.$tabStrings[y]}else{if(A=="\u3000"){var z=s.showInvisibles?"ace_cjk ace_invisible":"ace_cjk";var x=s.showInvisibles?s.SPACE_CHAR:"";p+=1;return""+x+""}else{if(u){return""+s.SPACE_CHAR+""}else{p+=1;return""+A+""}}}}}}};var m=r.replace(j,q);if(!this.$textToken[o.type]){var n="ace_"+o.type.replace(/\./g," ace_");var k="";if(o.type=="fold"){k=" style='width:"+(o.value.length*this.config.characterWidth)+"px;' "}l.push("",m,"")}else{l.push(m)}return p+r.length};this.renderIndentGuide=function(l,k,j){var m=k.search(this.$indentGuideRe);if(m<=0||m>=j){return k}if(k[0]==" "){m-=m%this.tabSize;l.push(a.stringRepeat(this.$tabStrings[" "],m/this.tabSize));return k.substr(m)}else{if(k[0]=="\t"){l.push(a.stringRepeat(this.$tabStrings["\t"],m));return k.substr(m)}}return k};this.$renderWrappedLine=function(j,p,t,k){var q=0;var r=0;var l=t[0];var o=0;for(var n=0;n=l){o=this.$renderToken(j,o,m,s.substring(0,l-q));s=s.substring(l-q);q=l;if(!k){j.push("","
")}r++;o=0;l=t[r]||Number.MAX_VALUE}if(s.length!=0){q+=s.length;o=this.$renderToken(j,o,m,s)}}}};this.$renderSimpleLine=function(n,o){var l=0;var k=o[0];var m=k.value;if(this.displayIndentGuides){m=this.renderIndentGuide(n,m)}if(m){l=this.$renderToken(n,l,k,m)}for(var j=1;j")}if(m.length){var l=this.session.getRowSplitData(o);if(l&&l.length){this.$renderWrappedLine(k,m,l,j)}else{this.$renderSimpleLine(k,m)}}if(this.showInvisibles){if(n){o=n.end.row}k.push("",o==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")}if(!j){k.push("
")}};this.$getFoldLineTokens=function(n,m){var l=this.session;var j=[];function o(s,u,t){var p=0,q=0;while((q+s[p].value.length)(t-u)){r=r.substring(0,t-u)}j.push({type:s[p].type,value:r});q=u+r.length;p+=1}while(qt){j.push({type:s[p].type,value:r.substring(0,t-q)})}else{j.push(s[p])}q+=r.length;p+=1}}var k=l.getTokens(n);m.walk(function(t,s,r,q,p){if(t!=null){j.push({type:"fold",value:t})}else{if(p){k=l.getTokens(s)}if(k.length){o(k,q,r)}}},m.end.row,this.session.getLine(m.end.row).length);return j};this.$useLineGroups=function(){return this.session.getUseWrapMode()};this.destroy=function(){clearInterval(this.$pollSizeChangesTimer);if(this.$measureNode){this.$measureNode.parentNode.removeChild(this.$measureNode)}delete this.$measureNode}}).call(d.prototype);g.Text=d});define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"],function(b,a,c){var e=b("./lib/oop");var f=b("./lib/dom");function d(g){this.isOpen=false;this.$element=null;this.$parentNode=g}(function(){this.$init=function(){this.$element=f.createElement("div");this.$element.className="ace_tooltip";this.$element.style.display="none";this.$parentNode.appendChild(this.$element);return this.$element};this.getElement=function(){return this.$element||this.$init()};this.setText=function(g){f.setInnerText(this.getElement(),g)};this.setHtml=function(g){this.getElement().innerHTML=g};this.setPosition=function(g,h){this.getElement().style.left=g+"px";this.getElement().style.top=h+"px"};this.setClassName=function(g){f.addCssClass(this.getElement(),g)};this.show=function(h,g,i){if(h!=null){this.setText(h)}if(g!=null&&i!=null){this.setPosition(g,i)}if(!this.isOpen){this.getElement().style.display="block";this.isOpen=true}};this.hide=function(){if(this.isOpen){this.getElement().style.display="none";this.isOpen=false}};this.getHeight=function(){return this.getElement().offsetHeight};this.getWidth=function(){return this.getElement().offsetWidth}}).call(d.prototype);a.Tooltip=d});define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(b,a,c){var f=b("../lib/dom");var e;var d=function(g){this.element=f.createElement("div");this.element.className="ace_layer ace_cursor-layer";g.appendChild(this.element);if(e===undefined){e="opacity" in this.element}this.isVisible=false;this.isBlinking=true;this.blinkInterval=1000;this.smoothBlinking=false;this.cursors=[];this.cursor=this.addCursor();f.addCssClass(this.element,"ace_hidden-cursors");this.$updateCursors=this.$updateVisibility.bind(this)};(function(){this.$updateVisibility=function(j){var h=this.cursors;for(var g=h.length;g--;){h[g].style.visibility=j?"":"hidden"}};this.$updateOpacity=function(j){var h=this.cursors;for(var g=h.length;g--;){h[g].style.opacity=j?"":"0"}};this.$padding=0;this.setPadding=function(g){this.$padding=g};this.setSession=function(g){this.session=g};this.setBlinking=function(g){if(g!=this.isBlinking){this.isBlinking=g;this.restartTimer()}};this.setBlinkInterval=function(g){if(g!=this.blinkInterval){this.blinkInterval=g;this.restartTimer()}};this.setSmoothBlinking=function(g){if(g!=this.smoothBlinking&&!e){this.smoothBlinking=g;f.setCssClass(this.element,"ace_smooth-blinking",g);this.$updateCursors(true);this.$updateCursors=(g?this.$updateOpacity:this.$updateVisibility).bind(this);this.restartTimer()}};this.addCursor=function(){var g=f.createElement("div");g.className="ace_cursor";this.element.appendChild(g);this.cursors.push(g);return g};this.removeCursor=function(){if(this.cursors.length>1){var g=this.cursors.pop();g.parentNode.removeChild(g);return g}};this.hideCursor=function(){this.isVisible=false;f.addCssClass(this.element,"ace_hidden-cursors");this.restartTimer()};this.showCursor=function(){this.isVisible=true;f.removeCssClass(this.element,"ace_hidden-cursors");this.restartTimer()};this.restartTimer=function(){var h=this.$updateCursors;clearInterval(this.intervalId);clearTimeout(this.timeoutId);if(this.smoothBlinking){f.removeCssClass(this.element,"ace_smooth-blinking")}h(true);if(!this.isBlinking||!this.blinkInterval||!this.isVisible){return}if(this.smoothBlinking){setTimeout(function(){f.addCssClass(this.element,"ace_smooth-blinking")}.bind(this))}var g=function(){this.timeoutId=setTimeout(function(){h(false)},0.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){h(true);g()},this.blinkInterval);g()};this.getPixelPosition=function(g,h){if(!this.config||!this.session){return{left:0,top:0}}if(!g){g=this.session.selection.getCursor()}var k=this.session.documentToScreenPosition(g);var i=this.$padding+k.column*this.config.characterWidth;var j=(k.row-(h?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:i,top:j}};this.update=function(h){this.config=h;var l=this.session.$selectionMarkers;var j=0,o=0;if(l===undefined||l.length===0){l=[{cursor:null}]}for(var j=0,p=l.length;jh.height+h.offset||m.top<0)&&j>1){continue}var k=(this.cursors[o++]||this.addCursor()).style;k.left=m.left+"px";k.top=m.top+"px";k.width=h.characterWidth+"px";k.height=h.lineHeight+"px"}while(this.cursors.length>o){this.removeCursor()}var g=this.session.getOverwrite();this.$setOverwrite(g);this.$pixelPos=m;this.restartTimer()};this.$setOverwrite=function(g){if(g!=this.overwrite){this.overwrite=g;if(g){f.addCssClass(this.element,"ace_overwrite-cursors")}else{f.removeCssClass(this.element,"ace_overwrite-cursors")}}};this.destroy=function(){clearInterval(this.intervalId);clearTimeout(this.timeoutId)}}).call(d.prototype);a.Cursor=d});define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"],function(e,g,d){var f=e("../lib/dom");var h=e("../lib/oop");var a=e("../lib/event");var i=e("../tooltip").Tooltip;function b(p){var m=p.editor;var k=m.renderer.$gutterLayer;var s=new c(m.container);p.editor.setDefaultHandler("guttermousedown",function(u){if(!m.isFocused()||u.getButton()!=0){return}var w=k.getRegion(u);if(w=="foldWidgets"){return}var v=u.getDocumentPosition().row;var t=m.session.selection;if(u.getShiftKey()){t.selectTo(v,0)}else{if(u.domEvent.detail==2){m.selectAll();return u.preventDefault()}p.$clickSelection=m.selection.getLineRange(v)}p.setState("selectByLines");p.captureMouse(u);return u.preventDefault()});var r,j,l;function q(){var y=j.getDocumentPosition().row;var t=k.$annotations[y];if(!t){return o()}var A=m.session.getLength();if(y==A){var v=m.renderer.pixelToScreenCoordinates(0,j.y).row;var z=j.$pos;if(v>m.session.documentToScreenRow(z.row,z.column)){return o()}}if(l==t){return}l=t.text.join("
");s.setHtml(l);if(l.length){s.show()}m.on("mousewheel",o);if(p.$tooltipFollowsMouse){n(j)}else{var u=k.$cells[y].element;var x=u.getBoundingClientRect();var w=s.getElement().style;w.left=x.right+"px";w.top=x.bottom+"px"}}function o(){if(r){r=clearTimeout(r)}if(l){s.hide();l=null;m.removeEventListener("mousewheel",o)}}function n(t){s.setPosition(t.x,t.y)}p.editor.setDefaultHandler("guttermousemove",function(u){var t=u.domEvent.target||u.domEvent.srcElement;if(f.hasCssClass(t,"ace_fold-widget")){return o()}if(l&&p.$tooltipFollowsMouse){n(u)}j=u;if(r){return}r=setTimeout(function(){r=null;if(j&&!p.isMousePressed){q()}else{o()}},50)});a.addListener(m.renderer.$gutter,"mouseout",function(t){j=null;if(!l||r){return}r=setTimeout(function(){r=null;o()},50)});m.on("changeSession",o)}function c(j){i.call(this,j)}h.inherits(c,i);(function(){this.setPosition=function(k,o){var l=window.innerWidth||document.documentElement.clientWidth;var n=window.innerHeight||document.documentElement.clientHeight;var m=this.getWidth();var j=this.getHeight();k+=15;o+=15;if(k+m>l){k-=(k+m)-l}if(o+j>n){o-=20+j}i.prototype.setPosition.call(this,k,o)}}).call(c.prototype);g.GutterHandler=b});define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(d,f,b){var h=d("./lib/oop");var e=d("./lib/dom");var a=d("./lib/event");var j=d("./lib/event_emitter").EventEmitter;var c=function(k){this.element=e.createElement("div");this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix;this.inner=e.createElement("div");this.inner.className="ace_scrollbar-inner";this.element.appendChild(this.inner);k.appendChild(this.element);this.setVisible(false);this.skipEvent=false;a.addListener(this.element,"scroll",this.onScroll.bind(this));a.addListener(this.element,"mousedown",a.preventDefault)};(function(){h.implement(this,j);this.setVisible=function(k){this.element.style.display=k?"":"none";this.isVisible=k}}).call(c.prototype);var g=function(k,l){c.call(this,k);this.scrollTop=0;l.$scrollbarWidth=this.width=e.scrollbarWidth(k.ownerDocument);this.inner.style.width=this.element.style.width=(this.width||15)+5+"px"};h.inherits(g,c);(function(){this.classSuffix="-v";this.onScroll=function(){if(!this.skipEvent){this.scrollTop=this.element.scrollTop;this._emit("scroll",{data:this.scrollTop})}this.skipEvent=false};this.getWidth=function(){return this.isVisible?this.width:0};this.setHeight=function(k){this.element.style.height=k+"px"};this.setInnerHeight=function(k){this.inner.style.height=k+"px"};this.setScrollHeight=function(k){this.inner.style.height=k+"px"};this.setScrollTop=function(k){if(this.scrollTop!=k){this.skipEvent=true;this.scrollTop=this.element.scrollTop=k}}}).call(g.prototype);var i=function(k,l){c.call(this,k);this.scrollLeft=0;this.height=l.$scrollbarWidth;this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};h.inherits(i,c);(function(){this.classSuffix="-h";this.onScroll=function(){if(!this.skipEvent){this.scrollLeft=this.element.scrollLeft;this._emit("scroll",{data:this.scrollLeft})}this.skipEvent=false};this.getHeight=function(){return this.isVisible?this.height:0};this.setWidth=function(k){this.element.style.width=k+"px"};this.setInnerWidth=function(k){this.inner.style.width=k+"px"};this.setScrollWidth=function(k){this.inner.style.width=k+"px"};this.setScrollLeft=function(k){if(this.scrollLeft!=k){this.skipEvent=true;this.scrollLeft=this.element.scrollLeft=k}}}).call(i.prototype);f.ScrollBar=g;f.ScrollBarV=g;f.ScrollBarH=i;f.VScrollBar=g;f.HScrollBar=i});define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,g,c){var f=e("../lib/dom");var a=e("../lib/event");var d=e("../lib/useragent");var j=0;function i(m){m.$clickSelection=null;var l=m.editor;l.setDefaultHandler("mousedown",this.onMouseDown.bind(m));l.setDefaultHandler("dblclick",this.onDoubleClick.bind(m));l.setDefaultHandler("tripleclick",this.onTripleClick.bind(m));l.setDefaultHandler("quadclick",this.onQuadClick.bind(m));l.setDefaultHandler("mousewheel",this.onMouseWheel.bind(m));var k=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];k.forEach(function(n){m[n]=this[n]},this);m.selectByLines=this.extendSelectionBy.bind(m,"getLineRange");m.selectByWords=this.extendSelectionBy.bind(m,"getWordRange")}(function(){this.onMouseDown=function(o){var m=o.inSelection();var q=o.getDocumentPosition();this.mousedownEvent=o;var n=this.editor;var l=o.getButton();if(l!==0){var p=n.getSelectionRange();var k=p.isEmpty();if(k){n.selection.moveToPosition(q)}n.textInput.onContextMenu(o.domEvent);return}if(m&&!n.isFocused()){n.focus();if(this.$focusTimout&&!this.$clickSelection&&!n.inMultiSelectMode){this.mousedownEvent.time=Date.now();this.setState("focusWait");this.captureMouse(o);return}}this.captureMouse(o);if(!m||this.$clickSelection||o.getShiftKey()||n.inMultiSelectMode){this.startSelect(q)}else{if(m){this.mousedownEvent.time=Date.now();this.startSelect(q)}}return o.preventDefault()};this.startSelect=function(m){m=m||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var k=this.editor;var l=this.mousedownEvent.getShiftKey();if(l){k.selection.selectToPosition(m)}else{if(!this.$clickSelection){k.selection.moveToPosition(m)}}if(k.renderer.scroller.setCapture){k.renderer.scroller.setCapture()}k.setStyle("ace_selecting");this.setState("select")};this.select=function(){var k,l=this.editor;var o=l.renderer.screenToTextCoordinates(this.x,this.y);if(this.$clickSelection){var m=this.$clickSelection.comparePoint(o);if(m==-1){k=this.$clickSelection.end}else{if(m==1){k=this.$clickSelection.start}else{var n=h(this.$clickSelection,o);o=n.cursor;k=n.anchor}}l.selection.setSelectionAnchor(k.row,k.column)}l.selection.selectToPosition(o);l.renderer.scrollCursorIntoView()};this.extendSelectionBy=function(l){var n,o=this.editor;var r=o.renderer.screenToTextCoordinates(this.x,this.y);var m=o.selection[l](r.row,r.column);if(this.$clickSelection){var k=this.$clickSelection.comparePoint(m.start);var q=this.$clickSelection.comparePoint(m.end);if(k==-1&&q<=0){n=this.$clickSelection.end;if(m.end.row!=r.row||m.end.column!=r.column){r=m.start}}else{if(q==1&&k>=0){n=this.$clickSelection.start;if(m.start.row!=r.row||m.start.column!=r.column){r=m.end}}else{if(k==-1&&q==1){r=m.end;n=m.start}else{var p=h(this.$clickSelection,r);r=p.cursor;n=p.anchor}}}o.selection.setSelectionAnchor(n.row,n.column)}o.selection.selectToPosition(r);o.renderer.scrollCursorIntoView()};this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.editor.unsetStyle("ace_selecting");if(this.editor.renderer.scroller.releaseCapture){this.editor.renderer.scroller.releaseCapture()}};this.focusWait=function(){var l=b(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);var k=Date.now();if(l>j||k-this.mousedownEvent.time>this.$focusTimout){this.startSelect(this.mousedownEvent.getDocumentPosition())}};this.onDoubleClick=function(m){var o=m.getDocumentPosition();var l=this.editor;var n=l.session;var k=n.getBracketRange(o);if(k){if(k.isEmpty()){k.start.column--;k.end.column++}this.setState("select")}else{k=l.selection.getWordRange(o.row,o.column);this.setState("selectByWords")}this.$clickSelection=k;this[this.state]&&this[this.state](m)};this.onTripleClick=function(l){var m=l.getDocumentPosition();var k=this.editor;this.setState("selectByLines");this.$clickSelection=k.selection.getLineRange(m.row);this[this.state]&&this[this.state](l)};this.onQuadClick=function(l){var k=this.editor;k.selectAll();this.$clickSelection=k.getSelectionRange();this.setState("selectAll")};this.onMouseWheel=function(o){if(o.getAccelKey()){return}if(o.getShiftKey()&&o.wheelY&&!o.wheelX){o.wheelX=o.wheelY;o.wheelY=0}var l=o.domEvent.timeStamp;var n=l-(this.$lastScrollTime||0);var m=this.editor;var k=m.renderer.isScrollableBy(o.wheelX*o.speed,o.wheelY*o.speed);if(k||n<200){this.$lastScrollTime=l;m.renderer.scrollBy(o.wheelX*o.speed,o.wheelY*o.speed);return o.stop()}}}).call(i.prototype);g.DefaultHandlers=i;function b(l,k,n,m){return Math.sqrt(Math.pow(n-l,2)+Math.pow(m-k,2))}function h(k,m){if(k.start.row==k.end.row){var l=2*m.column-k.start.column-k.end.column}else{if(k.start.row==k.end.row-1&&!k.start.column&&!k.end.column){var l=m.column-4}else{var l=2*m.row-k.start.row-k.end.row}}if(l<0){return{cursor:k.start,anchor:k.end}}else{return{cursor:k.end,anchor:k.start}}}});define("ace/renderloop",["require","exports","module","ace/lib/event"],function(b,a,c){var d=b("./lib/event");var e=function(g,f){this.onRender=g;this.pending=false;this.changes=0;this.window=f||window};(function(){this.schedule=function(g){this.changes=this.changes|g;if(!this.pending&&this.changes){this.pending=true;var f=this;d.nextFrame(function(){f.pending=false;var h;while(h=f.changes){f.changes=0;f.onRender(h)}},this.window)}}}).call(e.prototype);a.RenderLoop=e});define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(f,h,c){var a=f("../lib/event");var d=f("../lib/useragent");var k=f("./default_handlers").DefaultHandlers;var b=f("./default_gutter_handler").GutterHandler;var j=f("./mouse_event").MouseEvent;var i=f("./dragdrop_handler").DragdropHandler;var e=f("../config");var g=function(m){this.editor=m;new k(this);new b(this);new i(this);var n=m.renderer.getMouseEventTarget();a.addListener(n,"click",this.onMouseEvent.bind(this,"click"));a.addListener(n,"mousemove",this.onMouseMove.bind(this,"mousemove"));a.addMultiMouseDownListener(n,[300,300,250],this,"onMouseEvent");if(m.renderer.scrollBarV){a.addMultiMouseDownListener(m.renderer.scrollBarV.inner,[300,300,250],this,"onMouseEvent");a.addMultiMouseDownListener(m.renderer.scrollBarH.inner,[300,300,250],this,"onMouseEvent")}a.addMouseWheelListener(m.container,this.onMouseWheel.bind(this,"mousewheel"));var l=m.renderer.$gutter;a.addListener(l,"mousedown",this.onMouseEvent.bind(this,"guttermousedown"));a.addListener(l,"click",this.onMouseEvent.bind(this,"gutterclick"));a.addListener(l,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick"));a.addListener(l,"mousemove",this.onMouseEvent.bind(this,"guttermousemove"));a.addListener(n,"mousedown",function(o){m.focus()});a.addListener(l,"mousedown",function(o){m.focus();return a.preventDefault(o)})};(function(){this.onMouseEvent=function(l,m){this.editor._emit(l,new j(m,this.editor))};this.onMouseMove=function(l,n){var m=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!m||!m.length){return}this.editor._emit(l,new j(n,this.editor))};this.onMouseWheel=function(l,m){var n=new j(m,this.editor);n.speed=this.$scrollSpeed*2;n.wheelX=m.wheelX;n.wheelY=m.wheelY;this.editor._emit(l,n)};this.setState=function(l){this.state=l};this.captureMouse=function(p,m){this.x=p.x;this.y=p.y;this.isMousePressed=true;var q=this.editor.renderer;if(q.$keepTextAreaAtCursor){q.$keepTextAreaAtCursor=null}var n=this;var s=function(t){n.x=t.clientX;n.y=t.clientY;m&&m(t);n.mouseEvent=new j(t,n.editor);n.$mouseMoved=true};var r=function(t){clearInterval(l);o();n[n.state+"End"]&&n[n.state+"End"](t);n.$clickSelection=null;if(q.$keepTextAreaAtCursor==null){q.$keepTextAreaAtCursor=true;q.$moveTextAreaToCursor()}n.isMousePressed=false;n.$onCaptureMouseMove=n.releaseMouse=null;n.onMouseEvent("mouseup",t)};var o=function(){n[n.state]&&n[n.state]();n.$mouseMoved=false};if(d.isOldIE&&p.domEvent.type=="dblclick"){return setTimeout(function(){r(p)})}n.$onCaptureMouseMove=s;n.releaseMouse=a.capture(this.editor.container,s,r);var l=setInterval(o,20)};this.releaseMouse=null}).call(g.prototype);e.defineOptions(g.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:150},dragEnabled:{initialValue:true},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:true}});h.MouseHandler=g});define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event_emitter"],function(c,e,b){var g=c("../lib/oop");var d=c("../lib/dom");var a=c("../lib/lang");var i=c("../lib/event_emitter").EventEmitter;var h=0;var f=e.FontMetrics=function(k,j){this.el=d.createElement("div");this.$setMeasureNodeStyles(this.el.style,true);this.$main=d.createElement("div");this.$setMeasureNodeStyles(this.$main.style);this.$measureNode=d.createElement("div");this.$setMeasureNodeStyles(this.$measureNode.style);this.el.appendChild(this.$main);this.el.appendChild(this.$measureNode);k.appendChild(this.el);if(!h){this.$testFractionalRect()}this.$measureNode.textContent=a.stringRepeat("X",h);this.$characterSize={width:0,height:0};this.checkForSizeChanges()};(function(){g.implement(this,i);this.$characterSize={width:0,height:0};this.$testFractionalRect=function(){var k=d.createElement("div");this.$setMeasureNodeStyles(k.style);k.style.width="0.2px";document.documentElement.appendChild(k);var j=k.getBoundingClientRect().width;if(j>0&&j<1){h=1}else{h=100}k.parentNode.removeChild(k)};this.$setMeasureNodeStyles=function(k,j){k.width=k.height="auto";k.left=k.top="-100px";k.visibility="hidden";k.position="fixed";k.whiteSpace="pre";k.font="inherit";k.overflow=j?"hidden":"visible"};this.checkForSizeChanges=function(){var k=this.$measureSizes();if(k&&(this.$characterSize.width!==k.width||this.$characterSize.height!==k.height)){this.$measureNode.style.fontWeight="bold";var j=this.$measureSizes();this.$measureNode.style.fontWeight="";this.$characterSize=k;this.charSizes=Object.create(null);this.allowBoldFonts=j&&j.width===k.width&&j.height===k.height;this._emit("changeCharacterSize",{data:k})}};this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer){return this.$pollSizeChangesTimer}var j=this;return this.$pollSizeChangesTimer=setInterval(function(){j.checkForSizeChanges()},500)};this.setPolling=function(j){if(j){this.$pollSizeChanges()}else{if(this.$pollSizeChangesTimer){this.$pollSizeChangesTimer}}};this.$measureSizes=function(){var k=this.$measureNode.getBoundingClientRect();var j={height:k.height,width:k.width/h};if(j.width===0||j.height===0){return null}return j};this.$measureCharWidth=function(j){this.$main.textContent=a.stringRepeat(j,h);var k=this.$main.getBoundingClientRect();return k.width/h};this.getCharacterWidth=function(k){var j=this.charSizes[k];if(j===undefined){this.charSizes[k]=this.$measureCharWidth(k)/this.$characterSize.width}return j};this.destroy=function(){clearInterval(this.$pollSizeChangesTimer);if(this.el&&this.el.parentNode){this.el.parentNode.removeChild(this.el)}}}).call(f.prototype)});define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang"],function(e,h,c){var a=e("../lib/event");var d=e("../lib/useragent");var f=e("../lib/dom");var b=e("../lib/lang");var g=d.isChrome<18;var i=function(z,H){var D=f.createElement("textarea");D.className="ace_text-input";if(d.isTouchPad){D.setAttribute("x-palm-disable-auto-cap",true)}D.wrap="off";D.autocorrect="off";D.autocapitalize="off";D.spellcheck=false;D.style.opacity="0";z.insertBefore(D,z.firstChild);var k="\x01\x01";var n=false;var I=false;var q=false;var m=false;var R="";var o=true;try{var A=document.activeElement===D}catch(M){}a.addListener(D,"blur",function(){H.onBlur();A=false});a.addListener(D,"focus",function(){A=true;H.onFocus();y()});this.focus=function(){D.focus()};this.blur=function(){D.blur()};this.isFocused=function(){return A};var x=b.delayedCall(function(){A&&y(o)});var p=b.delayedCall(function(){if(!m){D.value=k;A&&y()}});function y(V){if(m){return}if(w){S=0;U=V?0:D.value.length-1}else{var S=V?2:1;var U=2}try{D.setSelectionRange(S,U)}catch(T){}}function u(){if(m){return}D.value=k;if(d.isWebKit){p.schedule()}}d.isWebKit||H.addEventListener("changeSelection",function(){if(H.selection.isEmpty()!=o){o=!o;x.schedule()}});u();if(A){H.onFocus()}var E=function(S){return S.selectionStart===0&&S.selectionEnd===S.value.length};if(!D.setSelectionRange&&D.createTextRange){D.setSelectionRange=function(T,U){var S=this.createTextRange();S.collapse(true);S.moveStart("character",T);S.moveEnd("character",U);S.select()};E=function(U){try{var S=U.ownerDocument.selection.createRange()}catch(T){}if(!S||S.parentElement()!=U){return false}return S.text==U.value}}if(d.isOldIE){var J=false;var Q=function(T){if(J){return}var S=D.value;if(m||!S||S==k){return}if(T&&S==k[0]){return t.schedule()}O(S);J=true;u();J=false};var t=b.delayedCall(Q);a.addListener(D,"propertychange",Q);var K={13:1,27:1};a.addListener(D,"keyup",function(S){if(m&&(!D.value||K[S.keyCode])){setTimeout(r,0)}if((D.value.charCodeAt(0)||0)<129){return t.call()}m?N():F()});a.addListener(D,"keydown",function(S){t.schedule(50)})}var P=function(S){if(n){n=false}else{if(I){I=false}else{if(E(D)){H.selectAll();y()}else{if(w){y(H.selection.isEmpty())}}}}};var w=null;this.setInputHandler=function(S){w=S};this.getInputHandler=function(){return w};var v=false;var O=function(S){if(w){S=w(S);w=null}if(q){y();if(S){H.onPaste(S)}q=false}else{if(S==k.charAt(0)){if(v){H.execCommand("del",{source:"ace"})}else{H.execCommand("backspace",{source:"ace"})}}else{if(S.substring(0,2)==k){S=S.substr(2)}else{if(S.charAt(0)==k.charAt(0)){S=S.substr(1)}else{if(S.charAt(S.length-1)==k.charAt(0)){S=S.slice(0,-1)}}}if(S.charAt(S.length-1)==k.charAt(0)){S=S.slice(0,-1)}if(S){H.onTextInput(S)}}}if(v){v=false}};var j=function(T){if(m){return}var S=D.value;O(S);u()};var s=function(U){var T=H.getCopyText();if(!T){a.preventDefault(U);return}var V=U.clipboardData||window.clipboardData;if(V&&!g){var S=V.setData("Text",T);if(S){H.onCut();a.preventDefault(U)}}if(!S){n=true;D.value=T;D.select();setTimeout(function(){n=false;u();y();H.onCut()})}};var B=function(U){var T=H.getCopyText();if(!T){a.preventDefault(U);return}var V=U.clipboardData||window.clipboardData;if(V&&!g){var S=V.setData("Text",T);if(S){H.onCopy();a.preventDefault(U)}}if(!S){I=true;D.value=T;D.select();setTimeout(function(){I=false;u();y();H.onCopy()})}};var l=function(T){var U=T.clipboardData||window.clipboardData;if(U){var S=U.getData("Text");if(S){H.onPaste(S)}if(d.isIE){setTimeout(y)}a.preventDefault(T)}else{D.value="";q=true}};a.addCommandKeyListener(D,H.onCommandKey.bind(H));a.addListener(D,"select",P);a.addListener(D,"input",j);a.addListener(D,"cut",s);a.addListener(D,"copy",B);a.addListener(D,"paste",l);if(!("oncut" in D)||!("oncopy" in D)||!("onpaste" in D)){a.addListener(z,"keydown",function(S){if((d.isMac&&!S.metaKey)||!S.ctrlKey){return}switch(S.keyCode){case 67:B(S);break;case 86:l(S);break;case 88:s(S);break}})}var F=function(S){if(m||!H.onCompositionStart){return}m={};H.onCompositionStart();setTimeout(N,0);H.on("mousedown",r);if(!H.selection.isEmpty()){H.insert("");H.session.markUndoGroup();H.selection.clearSelection()}H.session.markUndoGroup()};var N=function(){if(!m||!H.onCompositionUpdate){return}var T=D.value.replace(/\x01/g,"");if(m.lastValue===T){return}H.onCompositionUpdate(T);if(m.lastValue){H.undo()}m.lastValue=T;if(m.lastValue){var S=H.selection.getRange();H.insert(m.lastValue);H.session.markUndoGroup();m.range=H.selection.getRange();H.selection.setRange(S);H.selection.clearSelection()}};var r=function(T){if(!H.onCompositionEnd){return}var V=m;m=false;var U=setTimeout(function(){U=null;var W=D.value.replace(/\x01/g,"");if(m){return}else{if(W==V.lastValue){u()}else{if(!V.lastValue&&W){u();O(W)}}}});w=function S(W){if(U){clearTimeout(U)}W=W.replace(/\x01/g,"");if(W==V.lastValue){return""}if(V.lastValue&&U){H.undo()}return W};H.onCompositionEnd();H.removeListener("mousedown",r);if(T.type=="compositionend"&&V.range){H.selection.setRange(V.range)}};var G=b.delayedCall(N,50);a.addListener(D,"compositionstart",F);if(d.isGecko){a.addListener(D,"text",function(){G.schedule()})}else{a.addListener(D,"keyup",function(){G.schedule()});a.addListener(D,"keydown",function(){G.schedule()})}a.addListener(D,"compositionend",r);this.getElement=function(){return D};this.setReadOnly=function(S){D.readOnly=S};this.onContextMenu=function(X){v=true;if(!R){R=D.style.cssText}D.style.cssText="z-index:100000;"+(d.isIE?"opacity:0.1;":"");y(H.selection.isEmpty());H._emit("nativecontextmenu",{target:H,domEvent:X});var U=H.container.getBoundingClientRect();var T=f.computedStyle(H.container);var W=U.top+(parseInt(T.borderTopWidth)||0);var V=U.left+(parseInt(U.borderLeftWidth)||0);var Y=U.bottom-W-D.clientHeight;var S=function(Z){D.style.left=Z.clientX-V-2+"px";D.style.top=Math.min(Z.clientY-W-2,Y)+"px"};S(X);if(X.type!="mousedown"){return}if(H.renderer.$keepTextAreaAtCursor){H.renderer.$keepTextAreaAtCursor=null}if(d.isWin){a.capture(H.container,S,C)}};this.onContextMenuClose=C;function C(){setTimeout(function(){if(R){D.style.cssText=R;R=""}if(H.renderer.$keepTextAreaAtCursor==null){H.renderer.$keepTextAreaAtCursor=true;H.renderer.$moveTextAreaToCursor()}},0)}if(!d.isGecko||d.isMac){var L=function(S){H.textInput.onContextMenu(S);C()};a.addListener(H.renderer.scroller,"contextmenu",L);a.addListener(D,"contextmenu",L)}};h.TextInput=i});define("ace/lib/lang",["require","exports","module"],function(b,a,c){a.last=function(f){return f[f.length-1]};a.stringReverse=function(f){return f.split("").reverse().join("")};a.stringRepeat=function(g,h){var f="";while(h>0){if(h&1){f+=g}if(h>>=1){g+=g}}return f};var d=/^\s\s*/;var e=/\s\s*$/;a.stringTrimLeft=function(f){return f.replace(d,"")};a.stringTrimRight=function(f){return f.replace(e,"")};a.copyObject=function(g){var h={};for(var f in g){h[f]=g[f]}return h};a.copyArray=function(j){var h=[];for(var g=0,f=j.length;g1&&!this.inMultiSelectMode){this._signal("multiSelect");this.inMultiSelectMode=true;this.session.$undoSelect=false;this.rangeList.attach(this.session)}return s||this.fromOrientedRange(t)};this.toSingleRange=function(s){s=s||this.ranges[0];var t=this.rangeList.removeAll();if(t.length){this.$onRemoveRange(t)}s&&this.fromOrientedRange(s)};this.substractPoint=function(t){var s=this.rangeList.substractPoint(t);if(s){this.$onRemoveRange(s);return s[0]}};this.mergeOverlappingRanges=function(){var s=this.rangeList.merge();if(s.length){this.$onRemoveRange(s)}else{if(this.ranges[0]){this.fromOrientedRange(this.ranges[0])}}};this.$onAddRange=function(s){this.rangeCount=this.rangeList.ranges.length;this.ranges.unshift(s);this._signal("addRange",{range:s})};this.$onRemoveRange=function(u){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var v=this.rangeList.ranges.pop();u.push(v);this.rangeCount=0}for(var t=u.length;t--;){var s=this.ranges.indexOf(u[t]);this.ranges.splice(s,1)}this._signal("removeRange",{ranges:u});if(this.rangeCount==0&&this.inMultiSelectMode){this.inMultiSelectMode=false;this._signal("singleSelect");this.session.$undoSelect=true;this.rangeList.detach(this.session)}v=v||this.ranges[0];if(v&&!v.isEqual(this.getRange())){this.fromOrientedRange(v)}};this.$initRangeList=function(){if(this.rangeList){return}this.rangeList=new n();this.ranges=[];this.rangeCount=0};this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]};this.splitIntoLines=function(){if(this.rangeCount>1){var t=this.rangeList.ranges;var z=t[t.length-1];var A=o.fromPoints(t[0].start,z.end);this.toSingleRange();this.setSelectionRange(A,z.cursor==z.start)}else{var A=this.getRange();var B=this.isBackwards();var C=A.start.row;var x=A.end.row;if(C==x){if(B){var u=A.end,w=A.start}else{var u=A.start,w=A.end}this.addRange(o.fromPoints(w,w));this.addRange(o.fromPoints(u,u));return}var v=[];var s=this.getLineRange(C,true);s.start.column=A.start.column;v.push(s);for(var y=C+1;y1){var s=this.rangeList.ranges;var w=s[s.length-1];var t=o.fromPoints(s[0].start,w.end);this.toSingleRange();this.setSelectionRange(t,w.cursor==w.start)}else{var v=this.session.documentToScreenPosition(this.selectionLead);var u=this.session.documentToScreenPosition(this.selectionAnchor);var x=this.rectangularRangeBlock(v,u);x.forEach(this.addRange,this)}};this.rectangularRangeBlock=function(t,z,E){var u=[];var w=t.column0){x--}if(x>0){var s=0;while(u[s].isEmpty()){s++}}for(var A=x;A>=s;A--){if(u[A].isEmpty()){u.splice(A,1)}}}return u}}).call(c.prototype);var l=g("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor();this.renderer.updateBackMarkers()};this.addSelectionMarker=function(t){if(!t.cursor){t.cursor=t.end}var s=this.getSelectionStyle();t.marker=this.session.addMarker(t,"ace_selection",s);this.session.$selectionMarkers.push(t);this.session.selectionMarkerCount=this.session.$selectionMarkers.length;return t};this.removeSelectionMarker=function(s){if(!s.marker){return}this.session.removeMarker(s.marker);var t=this.session.$selectionMarkers.indexOf(s);if(t!=-1){this.session.$selectionMarkers.splice(t,1)}this.session.selectionMarkerCount=this.session.$selectionMarkers.length};this.removeSelectionMarkers=function(s){var u=this.session.$selectionMarkers;for(var w=s.length;w--;){var t=s[w];if(!t.marker){continue}this.session.removeMarker(t.marker);var v=u.indexOf(t);if(v!=-1){u.splice(v,1)}}this.session.selectionMarkerCount=u.length};this.$onAddRange=function(s){this.addSelectionMarker(s.range);this.renderer.updateCursor();this.renderer.updateBackMarkers()};this.$onRemoveRange=function(s){this.removeSelectionMarkers(s.ranges);this.renderer.updateCursor();this.renderer.updateBackMarkers()};this.$onMultiSelect=function(s){if(this.inMultiSelectMode){return}this.inMultiSelectMode=true;this.setStyle("ace_multiselect");this.keyBinding.addKeyboardHandler(d.keyboardHandler);this.commands.setDefaultHandler("exec",this.$onMultiSelectExec);this.renderer.updateCursor();this.renderer.updateBackMarkers()};this.$onSingleSelect=function(s){if(this.session.multiSelect.inVirtualMode){return}this.inMultiSelectMode=false;this.unsetStyle("ace_multiselect");this.keyBinding.removeKeyboardHandler(d.keyboardHandler);this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec);this.renderer.updateCursor();this.renderer.updateBackMarkers();this._emit("changeSelection")};this.$onMultiSelectExec=function(u){var v=u.command;var t=u.editor;if(!t.multiSelect){return}if(!v.multiSelectAction){var s=v.exec(t,u.args||{});t.multiSelect.addRange(t.multiSelect.toOrientedRange());t.multiSelect.mergeOverlappingRanges()}else{if(v.multiSelectAction=="forEach"){s=t.forEachSelection(v,u.args)}else{if(v.multiSelectAction=="forEachLine"){s=t.forEachSelection(v,u.args,true)}else{if(v.multiSelectAction=="single"){t.exitMultiSelectMode();s=v.exec(t,u.args||{})}else{s=v.multiSelectAction(t,u.args||{})}}}}return s};this.forEachSelection=function(u,A,z){if(this.inVirtualSelectionMode){return}var B=this.session;var C=this.selection;var v=C.rangeList;var D;var t=C._eventRegistry;C._eventRegistry={};var s=new c(B);this.inVirtualSelectionMode=true;for(var x=v.ranges.length;x--;){if(z){while(x>0&&v.ranges[x].start.row==v.ranges[x-1].end.row){x--}}s.fromOrientedRange(v.ranges[x]);s.id=v.ranges[x].marker;this.selection=B.selection=s;var y=u.exec(this,A||{});if(D!==undefined){D=y}s.toOrientedRange(v.ranges[x])}s.detach();this.selection=B.selection=C;this.inVirtualSelectionMode=false;C._eventRegistry=t;C.mergeOverlappingRanges();var w=this.renderer.$scrollAnimation;this.onCursorChange();this.onSelectionChange();if(w&&w.from==w.to){this.renderer.animateScrolling(w.from)}return D};this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode){return}this.multiSelect.toSingleRange()};this.getSelectedText=function(){var w="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges;var u=[];for(var v=0;vs.length||t.length<2||!t[1]){return this.commands.exec("insertstring",this,x)}for(var v=s.length;v--;){var u=s[v];if(!u.isEmpty()){this.session.remove(u)}this.session.insert(u.start,t[v])}};this.findAll=function(x,u,t){u=u||{};u.needle=x||u.needle;this.$search.set(u);var s=this.$search.findAll(this.session);if(!s.length){return 0}this.$blockScrolling+=1;var w=this.multiSelect;if(!t){w.toSingleRange(s[0])}for(var v=s.length;v--;){w.addRange(s[v],true)}this.$blockScrolling-=1;return s.length};this.selectMoreLines=function(t,A){var w=this.selection.toOrientedRange();var B=w.cursor==w.end;var z=this.session.documentToScreenPosition(w.cursor);if(this.selection.$desiredColumn){z.column=this.selection.$desiredColumn}var x=this.session.screenToDocumentPosition(z.row+t,z.column);if(!w.isEmpty()){var u=this.session.documentToScreenPosition(B?w.end:w.start);var v=this.session.screenToDocumentPosition(u.row+t,u.column)}else{var v=x}if(B){var y=o.fromPoints(x,v);y.cursor=y.start}else{var y=o.fromPoints(v,x);y.cursor=y.end}y.desiredColumn=z.column;if(!this.selection.inMultiSelectMode){this.selection.addRange(w)}else{if(A){var s=w.cursor}}this.selection.addRange(y);if(s){this.selection.substractPoint(s)}};this.transposeSelections=function(t){var y=this.session;var x=y.multiSelect;var w=x.ranges;for(var v=w.length;v--;){var s=w[v];if(s.isEmpty()){var u=y.getWordRange(s.start.row,s.start.column);s.start.row=u.start.row;s.start.column=u.start.column;s.end.row=u.end.row;s.end.column=u.end.column}}x.mergeOverlappingRanges();var z=[];for(var v=w.length;v--;){var s=w[v];z.unshift(y.getTextRange(s))}if(t<0){z.unshift(z.pop())}else{z.push(z.shift())}for(var v=w.length;v--;){var s=w[v];var u=s.clone();y.replace(s,z[v]);s.start.row=u.start.row;s.start.column=u.start.column}};this.selectMore=function(u,v){var y=this.session;var w=y.multiSelect;var s=w.toOrientedRange();if(s.isEmpty()){s=y.getWordRange(s.start.row,s.start.column);s.cursor=u==-1?s.start:s.end;this.multiSelect.addRange(s)}var x=y.getTextRange(s);var t=j(y,x,u);if(t){t.cursor=u==-1?t.start:t.end;this.$blockScrolling+=1;this.session.unfold(t);this.multiSelect.addRange(t);this.$blockScrolling-=1;this.renderer.scrollCursorIntoView(null,0.5)}if(v){this.multiSelect.substractPoint(s.cursor)}};this.alignCursors=function(){var z=this.session;var u=z.multiSelect;var t=u.ranges;if(!t.length){var w=this.selection.getRange();var y=w.start.row,x=w.end.row;var B=y==x;if(B){var A=this.session.getLength();var G;do{G=this.session.getLine(x)}while(/[=:]/.test(G)&&++x0);if(y<0){y=0}if(x>=A){x=A-1}}var F=this.session.doc.removeLines(y,x);F=this.$reAlignText(F,B);this.session.doc.insert({row:y,column:0},F.join("\n")+"\n");if(!B){w.start.column=0;w.end.column=F[F.length-1].length}this.selection.setRange(w)}else{var E=-1;var v=t.filter(function(H){if(H.cursor.row==E){return true}E=H.cursor.row});u.$onRemoveRange(v);var C=0;var D=Infinity;var s=t.map(function(J){var K=J.cursor;var H=z.getLine(K.row);var I=H.substr(K.column).search(/\S/g);if(I==-1){I=0}if(K.column>C){C=K.column}if(IL){z.insert(K,r.stringRepeat(" ",H-L))}else{z.remove(new o(K.row,K.column,K.row,K.column-H+L))}J.start.column=J.end.column=C;J.start.row=J.end.row=K.row;J.cursor=J.end});u.fromOrientedRange(t[0]);this.renderer.updateCursor();this.renderer.updateBackMarkers()}};this.$reAlignText=function(C,v){var s=true,u=true;var x,y,B;return C.map(function(E){var D=E.match(/(\s*)(.*?)(\s*)([=:].*)/);if(!D){return[E]}if(x==null){x=D[1].length;y=D[2].length;B=D[3].length;return D}if(x+y+B!=D[1].length+D[2].length+D[3].length){u=false}if(x!=D[1].length){s=false}if(x>D[1].length){x=D[1].length}if(yD[3].length){B=D[3].length}return D}).map(v?t:s?u?A:t:w);function z(D){return r.stringRepeat(" ",D)}function t(D){return !D[2]?D[0]:z(x)+D[2]+z(y-D[2].length+B)+D[4].replace(/^([=:])\s+/,"$1 ")}function A(D){return !D[2]?D[0]:z(x+y-D[2].length)+D[2]+z(B," ")+D[4].replace(/^([=:])\s+/,"$1 ")}function w(D){return !D[2]?D[0]:z(x)+D[2]+z(B)+D[4].replace(/^([=:])\s+/,"$1 ")}}}).call(l.prototype);function p(t,s){return t.row==s.row&&t.column==s.column}q.onSessionChange=function(u){var t=u.session;if(!t.multiSelect){t.$selectionMarkers=[];t.selection.$initRangeList();t.multiSelect=t.selection}this.multiSelect=t.multiSelect;var s=u.oldSession;if(s){s.multiSelect.removeEventListener("addRange",this.$onAddRange);s.multiSelect.removeEventListener("removeRange",this.$onRemoveRange);s.multiSelect.removeEventListener("multiSelect",this.$onMultiSelect);s.multiSelect.removeEventListener("singleSelect",this.$onSingleSelect)}t.multiSelect.on("addRange",this.$onAddRange);t.multiSelect.on("removeRange",this.$onRemoveRange);t.multiSelect.on("multiSelect",this.$onMultiSelect);t.multiSelect.on("singleSelect",this.$onSingleSelect);if(this.inMultiSelectMode!=t.selection.inMultiSelectMode){if(t.selection.inMultiSelectMode){this.$onMultiSelect()}else{this.$onSingleSelect()}}};function k(s){if(s.$multiselectOnSessionChange){return}s.$onAddRange=s.$onAddRange.bind(s);s.$onRemoveRange=s.$onRemoveRange.bind(s);s.$onMultiSelect=s.$onMultiSelect.bind(s);s.$onSingleSelect=s.$onSingleSelect.bind(s);s.$multiselectOnSessionChange=q.onSessionChange.bind(s);s.$multiselectOnSessionChange(s);s.on("changeSession",s.$multiselectOnSessionChange);s.on("mousedown",e);s.commands.addCommands(d.defaultCommands);i(s)}function i(t){var s=t.textInput.getElement();var v=false;m.addListener(s,"keydown",function(w){if(w.keyCode==18&&!(w.ctrlKey||w.shiftKey||w.metaKey)){if(!v){t.renderer.setMouseCursor("crosshair");v=true}}else{if(v){u()}}});m.addListener(s,"keyup",u);m.addListener(s,"blur",u);function u(w){if(v){t.renderer.setMouseCursor("");v=false}}}q.MultiSelect=k;g("./config").defineOptions(l.prototype,"editor",{enableMultiselect:{set:function(s){k(this);if(s){this.on("changeSession",this.$multiselectOnSessionChange);this.on("mousedown",e)}else{this.off("changeSession",this.$multiselectOnSessionChange);this.off("mousedown",e)}},value:true}})});define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config"],function(h,r,c){h("./lib/fixoldbrowsers");var n=h("./lib/oop");var m=h("./lib/dom");var s=h("./lib/lang");var l=h("./lib/useragent");var b=h("./keyboard/textinput").TextInput;var p=h("./mouse/mouse_handler").MouseHandler;var d=h("./mouse/fold_handler").FoldHandler;var f=h("./keyboard/keybinding").KeyBinding;var a=h("./edit_session").EditSession;var g=h("./search").Search;var o=h("./range").Range;var e=h("./lib/event_emitter").EventEmitter;var j=h("./commands/command_manager").CommandManager;var i=h("./commands/default_commands").commands;var q=h("./config");var k=function(u,v){var t=u.getContainerElement();this.container=t;this.renderer=u;this.commands=new j(l.isMac?"mac":"win",i);this.textInput=new b(u.getTextAreaContainer(),this);this.renderer.textarea=this.textInput.getElement();this.keyBinding=new f(this);this.$mouseHandler=new p(this);new d(this);this.$blockScrolling=0;this.$search=new g().set({wrap:true});this.$historyTracker=this.$historyTracker.bind(this);this.commands.on("exec",this.$historyTracker);this.$initOperationListeners();this._$emitInputEvent=s.delayedCall(function(){this._signal("input",{});this.session.bgTokenizer&&this.session.bgTokenizer.scheduleStart()}.bind(this));this.on("change",function(x,w){w._$emitInputEvent.schedule(31)});this.setSession(v||new a(""));q.resetOptions(this);q._signal("editor",this)};(function(){n.implement(this,e);this.$initOperationListeners=function(){function t(u){return u[u.length-1]}this.selections=[];this.commands.on("exec",function(v){this.startOperation(v);var w=v.command;if(w.aceCommandGroup=="fileJump"){var u=this.prevOp;if(!u||u.command.aceCommandGroup!="fileJump"){this.lastFileJumpPos=t(this.selections)}}else{this.lastFileJumpPos=null}}.bind(this),true);this.commands.on("afterExec",function(u){var v=u.command;if(v.aceCommandGroup=="fileJump"){if(this.lastFileJumpPos&&!this.curOp.selectionChanged){this.selection.fromJSON(this.lastFileJumpPos)}}this.endOperation(u)}.bind(this),true);this.$opResetTimer=s.delayedCall(this.endOperation.bind(this));this.on("change",function(){this.curOp||this.startOperation();this.curOp.docChanged=true}.bind(this),true);this.on("changeSelection",function(){this.curOp||this.startOperation();this.curOp.selectionChanged=true}.bind(this),true)};this.curOp=null;this.prevOp={};this.startOperation=function(u){if(this.curOp){if(!u||this.curOp.command){return}this.prevOp=this.curOp}if(!u){this.previousCommand=null;u={}}this.$opResetTimer.schedule();this.curOp={command:u.command||{},args:u.args,scrollTop:this.renderer.scrollTop};var t=this.curOp.command;if(t&&t.scrollIntoView){this.$blockScrolling++}this.selections.push(this.selection.toJSON())};this.endOperation=function(){if(this.curOp){var v=this.curOp.command;if(v&&v.scrollIntoView){this.$blockScrolling--;switch(v.scrollIntoView){case"center":this.renderer.scrollCursorIntoView(null,0.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var t=this.selection.getRange();var u=this.renderer.layerConfig;if(t.start.row>=u.lastRow||t.end.row<=u.firstRow){this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead)}break;default:break}if(v.scrollIntoView=="animate"){this.renderer.animateScrolling(this.curOp.scrollTop)}}this.prevOp=this.curOp;this.curOp=null}};this.$historyTracker=function(v){if(!this.$mergeUndoDeltas){return}var u=this.prevOp;var t=["backspace","del","insertstring"];var x=u.command&&(v.command.name==u.command.name);if(v.command.name=="insertstring"){var w=v.args;if(this.mergeNextCommand===undefined){this.mergeNextCommand=true}x=x&&this.mergeNextCommand&&(!/\s/.test(w)||/\s/.test(u.args));this.mergeNextCommand=true}else{x=x&&t.indexOf(v.command.name)!==-1}if(this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2000){x=false}if(x){this.session.mergeUndoDeltas=true}else{if(t.indexOf(v.command.name)!==-1){this.sequenceStartTime=Date.now()}}};this.setKeyboardHandler=function(u){if(!u){this.keyBinding.setKeyboardHandler(null)}else{if(typeof u==="string"){this.$keybindingId=u;var t=this;q.loadModule(["keybinding",u],function(v){if(t.$keybindingId==u){t.keyBinding.setKeyboardHandler(v&&v.handler)}})}else{this.$keybindingId=null;this.keyBinding.setKeyboardHandler(u)}}};this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()};this.setSession=function(v){if(this.session==v){return}var u=this.session;if(u){this.session.removeEventListener("change",this.$onDocumentChange);this.session.removeEventListener("changeMode",this.$onChangeMode);this.session.removeEventListener("tokenizerUpdate",this.$onTokenizerUpdate);this.session.removeEventListener("changeTabSize",this.$onChangeTabSize);this.session.removeEventListener("changeWrapLimit",this.$onChangeWrapLimit);this.session.removeEventListener("changeWrapMode",this.$onChangeWrapMode);this.session.removeEventListener("onChangeFold",this.$onChangeFold);this.session.removeEventListener("changeFrontMarker",this.$onChangeFrontMarker);this.session.removeEventListener("changeBackMarker",this.$onChangeBackMarker);this.session.removeEventListener("changeBreakpoint",this.$onChangeBreakpoint);this.session.removeEventListener("changeAnnotation",this.$onChangeAnnotation);this.session.removeEventListener("changeOverwrite",this.$onCursorChange);this.session.removeEventListener("changeScrollTop",this.$onScrollTopChange);this.session.removeEventListener("changeScrollLeft",this.$onScrollLeftChange);var t=this.session.getSelection();t.removeEventListener("changeCursor",this.$onCursorChange);t.removeEventListener("changeSelection",this.$onSelectionChange)}this.session=v;if(v){this.$onDocumentChange=this.onDocumentChange.bind(this);v.addEventListener("change",this.$onDocumentChange);this.renderer.setSession(v);this.$onChangeMode=this.onChangeMode.bind(this);v.addEventListener("changeMode",this.$onChangeMode);this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this);v.addEventListener("tokenizerUpdate",this.$onTokenizerUpdate);this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer);v.addEventListener("changeTabSize",this.$onChangeTabSize);this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this);v.addEventListener("changeWrapLimit",this.$onChangeWrapLimit);this.$onChangeWrapMode=this.onChangeWrapMode.bind(this);v.addEventListener("changeWrapMode",this.$onChangeWrapMode);this.$onChangeFold=this.onChangeFold.bind(this);v.addEventListener("changeFold",this.$onChangeFold);this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this);this.session.addEventListener("changeFrontMarker",this.$onChangeFrontMarker);this.$onChangeBackMarker=this.onChangeBackMarker.bind(this);this.session.addEventListener("changeBackMarker",this.$onChangeBackMarker);this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this);this.session.addEventListener("changeBreakpoint",this.$onChangeBreakpoint);this.$onChangeAnnotation=this.onChangeAnnotation.bind(this);this.session.addEventListener("changeAnnotation",this.$onChangeAnnotation);this.$onCursorChange=this.onCursorChange.bind(this);this.session.addEventListener("changeOverwrite",this.$onCursorChange);this.$onScrollTopChange=this.onScrollTopChange.bind(this);this.session.addEventListener("changeScrollTop",this.$onScrollTopChange);this.$onScrollLeftChange=this.onScrollLeftChange.bind(this);this.session.addEventListener("changeScrollLeft",this.$onScrollLeftChange);this.selection=v.getSelection();this.selection.addEventListener("changeCursor",this.$onCursorChange);this.$onSelectionChange=this.onSelectionChange.bind(this);this.selection.addEventListener("changeSelection",this.$onSelectionChange);this.onChangeMode();this.$blockScrolling+=1;this.onCursorChange();this.$blockScrolling-=1;this.onScrollTopChange();this.onScrollLeftChange();this.onSelectionChange();this.onChangeFrontMarker();this.onChangeBackMarker();this.onChangeBreakpoint();this.onChangeAnnotation();this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit();this.renderer.updateFull()}this._signal("changeSession",{session:v,oldSession:u});u&&u._signal("changeEditor",{oldEditor:this});v&&v._signal("changeEditor",{editor:this})};this.getSession=function(){return this.session};this.setValue=function(t,u){this.session.doc.setValue(t);if(!u){this.selectAll()}else{if(u==1){this.navigateFileEnd()}else{if(u==-1){this.navigateFileStart()}}}return t};this.getValue=function(){return this.session.getValue()};this.getSelection=function(){return this.selection};this.resize=function(t){this.renderer.onResize(t)};this.setTheme=function(u,t){this.renderer.setTheme(u,t)};this.getTheme=function(){return this.renderer.getTheme()};this.setStyle=function(t){this.renderer.setStyle(t)};this.unsetStyle=function(t){this.renderer.unsetStyle(t)};this.getFontSize=function(){return this.getOption("fontSize")||m.computedStyle(this.container,"fontSize")};this.setFontSize=function(t){this.setOption("fontSize",t)};this.$highlightBrackets=function(){if(this.session.$bracketHighlight){this.session.removeMarker(this.session.$bracketHighlight);this.session.$bracketHighlight=null}if(this.$highlightPending){return}var t=this;this.$highlightPending=true;setTimeout(function(){t.$highlightPending=false;var v=t.session.findMatchingBracket(t.getCursorPosition());if(v){var u=new o(v.row,v.column,v.row,v.column+1)}else{if(t.session.$mode.getMatching){var u=t.session.$mode.getMatching(t.session)}}if(u){t.session.$bracketHighlight=t.session.addMarker(u,"ace_bracket","text")}},50)};this.focus=function(){var t=this;setTimeout(function(){t.textInput.focus()});this.textInput.focus()};this.isFocused=function(){return this.textInput.isFocused()};this.blur=function(){this.textInput.blur()};this.onFocus=function(){if(this.$isFocused){return}this.$isFocused=true;this.renderer.showCursor();this.renderer.visualizeFocus();this._emit("focus")};this.onBlur=function(){if(!this.$isFocused){return}this.$isFocused=false;this.renderer.hideCursor();this.renderer.visualizeBlur();this._emit("blur")};this.$cursorChange=function(){this.renderer.updateCursor()};this.onDocumentChange=function(v){var w=v.data;var t=w.range;var u;if(t.start.row==t.end.row&&w.action!="insertLines"&&w.action!="removeLines"){u=t.end.row}else{u=Infinity}this.renderer.updateLines(t.start.row,u);this._signal("change",v);this.$cursorChange()};this.onTokenizerUpdate=function(u){var t=u.data;this.renderer.updateLines(t.first,t.last)};this.onScrollTopChange=function(){this.renderer.scrollToY(this.session.getScrollTop())};this.onScrollLeftChange=function(){this.renderer.scrollToX(this.session.getScrollLeft())};this.onCursorChange=function(){this.$cursorChange();if(!this.$blockScrolling){this.renderer.scrollCursorIntoView()}this.$highlightBrackets();this.$updateHighlightActiveLine();this._signal("changeSelection")};this.$updateHighlightActiveLine=function(){var v=this.getSession();var u;if(this.$highlightActiveLine){if((this.$selectionStyle!="line"||!this.selection.isMultiLine())){u=this.getCursorPosition()}if(this.renderer.$maxLines&&this.session.getLength()===1&&!(this.renderer.$minLines>1)){u=false}}if(v.$highlightLineMarker&&!u){v.removeMarker(v.$highlightLineMarker.id);v.$highlightLineMarker=null}else{if(!v.$highlightLineMarker&&u){var t=new o(u.row,u.column,u.row,Infinity);t.id=v.addMarker(t,"ace_active-line","screenLine");v.$highlightLineMarker=t}else{if(u){v.$highlightLineMarker.start.row=u.row;v.$highlightLineMarker.end.row=u.row;v.$highlightLineMarker.start.column=u.column;v._signal("changeBackMarker")}}}};this.onSelectionChange=function(x){var w=this.session;if(w.$selectionMarker){w.removeMarker(w.$selectionMarker)}w.$selectionMarker=null;if(!this.selection.isEmpty()){var t=this.selection.getRange();var v=this.getSelectionStyle();w.$selectionMarker=w.addMarker(t,"ace_selection",v)}else{this.$updateHighlightActiveLine()}var u=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(u);this._signal("changeSelection")};this.$getSelectionHighLightRegexp=function(){var z=this.session;var w=this.getSelectionRange();if(w.isEmpty()||w.isMultiLine()){return}var A=w.start.column-1;var y=w.end.column+1;var u=z.getLine(w.start.row);var t=u.length;var x=u.substring(Math.max(A,0),Math.min(y,t));if((A>=0&&/^[\w\d]/.test(x))||(y<=t&&/[\w\d]$/.test(x))){return}x=u.substring(w.start.column,w.end.column);if(!/^[\w\d]+$/.test(x)){return}var v=this.$search.$assembleRegExp({wholeWord:true,caseSensitive:true,needle:x});return v};this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()};this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()};this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()};this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())};this.onChangeMode=function(t){this.renderer.updateText();this._emit("changeMode",t)};this.onChangeWrapLimit=function(){this.renderer.updateFull()};this.onChangeWrapMode=function(){this.renderer.onResize(true)};this.onChangeFold=function(){this.$updateHighlightActiveLine();this.renderer.updateFull()};this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())};this.getCopyText=function(){var t=this.getSelectedText();this._signal("copy",t);return t};this.onCopy=function(){this.commands.exec("copy",this)};this.onCut=function(){this.commands.exec("cut",this)};this.onPaste=function(u){if(this.$readOnly){return}var t={text:u};this._signal("paste",t);this.insert(t.text,true)};this.execCommand=function(u,t){this.commands.exec(u,this,t)};this.insert=function(D,B){var C=this.session;var z=C.getMode();var E=this.getCursorPosition();if(this.getBehavioursEnabled()&&!B){var v=z.transformAction(C.getState(E.row),"insertion",this,C,D);if(v){if(D!==v.text){this.session.mergeUndoDeltas=false;this.$mergeNextCommand=false}D=v.text}}if(D=="\t"){D=this.session.getTabString()}if(!this.selection.isEmpty()){var y=this.getSelectionRange();E=this.session.remove(y);this.clearSelection()}else{if(this.session.getOverwrite()){var y=new o.fromPoints(E,E);y.end.column+=D.length;this.session.remove(y)}}if(D=="\n"||D=="\r\n"){var G=C.getLine(E.row);if(E.column>G.search(/\S|$/)){var A=G.substr(E.column).search(/\S|$/);C.doc.removeInLine(E.row,E.column,E.column+A)}}this.clearSelection();var u=E.column;var x=C.getState(E.row);var G=C.getLine(E.row);var F=z.checkOutdent(x,G,D);var w=C.insert(E,D);if(v&&v.selection){if(v.selection.length==2){this.selection.setSelectionRange(new o(E.row,u+v.selection[0],E.row,u+v.selection[1]))}else{this.selection.setSelectionRange(new o(E.row+v.selection[0],v.selection[1],E.row+v.selection[2],v.selection[3]))}}if(C.getDocument().isNewLine(D)){var t=z.getNextLineIndent(x,G.slice(0,E.column),C.getTabString());C.insert({row:E.row+1,column:0},t)}if(F){z.autoOutdent(x,C,E.row)}};this.onTextInput=function(t){this.keyBinding.onTextInput(t)};this.onCommandKey=function(v,t,u){this.keyBinding.onCommandKey(v,t,u)};this.setOverwrite=function(t){this.session.setOverwrite(t)};this.getOverwrite=function(){return this.session.getOverwrite()};this.toggleOverwrite=function(){this.session.toggleOverwrite()};this.setScrollSpeed=function(t){this.setOption("scrollSpeed",t)};this.getScrollSpeed=function(){return this.getOption("scrollSpeed")};this.setDragDelay=function(t){this.setOption("dragDelay",t)};this.getDragDelay=function(){return this.getOption("dragDelay")};this.setSelectionStyle=function(t){this.setOption("selectionStyle",t)};this.getSelectionStyle=function(){return this.getOption("selectionStyle")};this.setHighlightActiveLine=function(t){this.setOption("highlightActiveLine",t)};this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")};this.setHighlightGutterLine=function(t){this.setOption("highlightGutterLine",t)};this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")};this.setHighlightSelectedWord=function(t){this.setOption("highlightSelectedWord",t)};this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord};this.setAnimatedScroll=function(t){this.renderer.setAnimatedScroll(t)};this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()};this.setShowInvisibles=function(t){this.renderer.setShowInvisibles(t)};this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()};this.setDisplayIndentGuides=function(t){this.renderer.setDisplayIndentGuides(t)};this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()};this.setShowPrintMargin=function(t){this.renderer.setShowPrintMargin(t)};this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()};this.setPrintMarginColumn=function(t){this.renderer.setPrintMarginColumn(t)};this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()};this.setReadOnly=function(t){this.setOption("readOnly",t)};this.getReadOnly=function(){return this.getOption("readOnly")};this.setBehavioursEnabled=function(t){this.setOption("behavioursEnabled",t)};this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")};this.setWrapBehavioursEnabled=function(t){this.setOption("wrapBehavioursEnabled",t)};this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")};this.setShowFoldWidgets=function(t){this.setOption("showFoldWidgets",t)};this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")};this.setFadeFoldWidgets=function(t){this.setOption("fadeFoldWidgets",t)};this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")};this.remove=function(v){if(this.selection.isEmpty()){if(v=="left"){this.selection.selectLeft()}else{this.selection.selectRight()}}var u=this.getSelectionRange();if(this.getBehavioursEnabled()){var x=this.session;var w=x.getState(u.start.row);var z=x.getMode().transformAction(w,"deletion",this,x,u);if(u.end.column===0){var y=x.getTextRange(u);if(y[y.length-1]=="\n"){var t=x.getLine(u.end.row);if(/^\s+$/.test(t)){u.end.column=t.length}}}if(z){u=z}}this.session.remove(u);this.clearSelection()};this.removeWordRight=function(){if(this.selection.isEmpty()){this.selection.selectWordRight()}this.session.remove(this.getSelectionRange());this.clearSelection()};this.removeWordLeft=function(){if(this.selection.isEmpty()){this.selection.selectWordLeft()}this.session.remove(this.getSelectionRange());this.clearSelection()};this.removeToLineStart=function(){if(this.selection.isEmpty()){this.selection.selectLineStart()}this.session.remove(this.getSelectionRange());this.clearSelection()};this.removeToLineEnd=function(){if(this.selection.isEmpty()){this.selection.selectLineEnd()}var t=this.getSelectionRange();if(t.start.column==t.end.column&&t.start.row==t.end.row){t.end.column=0;t.end.row++}this.session.remove(t);this.clearSelection()};this.splitLine=function(){if(!this.selection.isEmpty()){this.session.remove(this.getSelectionRange());this.clearSelection()}var t=this.getCursorPosition();this.insert("\n");this.moveCursorToPosition(t)};this.transposeLetters=function(){if(!this.selection.isEmpty()){return}var x=this.getCursorPosition();var v=x.column;if(v===0){return}var t=this.session.getLine(x.row);var w,u;if(vz.toLowerCase()){return 1}return 0});var u=new o(0,0,0,0);for(var w=x.first;w<=x.last;w++){var t=y.getLine(w);u.start.row=w;u.end.row=w;u.end.column=t.length;y.replace(u,v[w-x.first])}};this.toggleCommentLines=function(){var u=this.session.getState(this.getCursorPosition().row);var t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(u,this.session,t.first,t.last)};this.toggleBlockComment=function(){var v=this.getCursorPosition();var u=this.session.getState(v.row);var t=this.getSelectionRange();this.session.getMode().toggleBlockComment(u,this.session,t,v)};this.getNumberAt=function(y,w){var u=/[\-]?[0-9]+(?:\.[0-9]+)?/g;u.lastIndex=0;var v=this.session.getLine(y);while(u.lastIndex=w){var x={value:t[0],start:t.index,end:t.index+t[0].length};return x}}return null};this.modifyNumber=function(w){var E=this.selection.getCursor().row;var v=this.selection.getCursor().column;var D=new o(E,v-1,E,v);var z=this.session.getTextRange(D);if(!isNaN(parseFloat(z))&&isFinite(z)){var A=this.getNumberAt(E,v);if(A){var x=A.value.indexOf(".")>=0?A.start+A.value.indexOf(".")+1:A.end;var u=A.start+A.value.length-x;var C=parseFloat(A.value);C*=Math.pow(10,u);if(x!==A.end&&v=w){t[v].moveBy(z,0);v--}}A.fromOrientedRange(A.ranges[0]);A.rangeList.attach(this.session)}};this.$getSelectedRows=function(){var t=this.getSelectionRange().collapseRows();return{first:this.session.getRowFoldStart(t.start.row),last:this.session.getRowFoldEnd(t.end.row)}};this.onCompositionStart=function(t){this.renderer.showComposition(this.getCursorPosition())};this.onCompositionUpdate=function(t){this.renderer.setCompositionText(t)};this.onCompositionEnd=function(){this.renderer.hideComposition()};this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()};this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()};this.isRowVisible=function(t){return(t>=this.getFirstVisibleRow()&&t<=this.getLastVisibleRow())};this.isRowFullyVisible=function(t){return(t>=this.renderer.getFirstFullyVisibleRow()&&t<=this.renderer.getLastFullyVisibleRow())};this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1};this.$moveByPage=function(v,t){var x=this.renderer;var u=this.renderer.layerConfig;var w=v*Math.floor(u.height/u.lineHeight);this.$blockScrolling++;if(t===true){this.selection.$moveSelection(function(){this.moveCursorBy(w,0)})}else{if(t===false){this.selection.moveCursorBy(w,0);this.selection.clearSelection()}}this.$blockScrolling--;var y=x.scrollTop;x.scrollBy(0,w*u.lineHeight);if(t!=null){x.scrollCursorIntoView(null,0.5)}x.animateScrolling(y)};this.selectPageDown=function(){this.$moveByPage(1,true)};this.selectPageUp=function(){this.$moveByPage(-1,true)};this.gotoPageDown=function(){this.$moveByPage(1,false)};this.gotoPageUp=function(){this.$moveByPage(-1,false)};this.scrollPageDown=function(){this.$moveByPage(1)};this.scrollPageUp=function(){this.$moveByPage(-1)};this.scrollToRow=function(t){this.renderer.scrollToRow(t)};this.scrollToLine=function(u,t,v,w){this.renderer.scrollToLine(u,t,v,w)};this.centerSelection=function(){var t=this.getSelectionRange();var u={row:Math.floor(t.start.row+(t.end.row-t.start.row)/2),column:Math.floor(t.start.column+(t.end.column-t.start.column)/2)};this.renderer.alignCursor(u,0.5)};this.getCursorPosition=function(){return this.selection.getCursor()};this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())};this.getSelectionRange=function(){return this.selection.getRange()};this.selectAll=function(){this.$blockScrolling+=1;this.selection.selectAll();this.$blockScrolling-=1};this.clearSelection=function(){this.selection.clearSelection()};this.moveCursorTo=function(u,t){this.selection.moveCursorTo(u,t)};this.moveCursorToPosition=function(t){this.selection.moveCursorToPosition(t)};this.jumpToMatching=function(t){var v=this.getCursorPosition();var u=this.session.getBracketRange(v);if(!u){u=this.find({needle:/[{}()\[\]]/g,preventScroll:true,start:{row:v.row,column:v.column-1}});if(!u){return}var w=u.start;if(w.row==v.row&&Math.abs(w.column-v.column)<2){u=this.session.getBracketRange(w)}}w=u&&u.cursor||w;if(w){if(t){if(u&&u.isEqual(this.getSelectionRange())){this.clearSelection()}else{this.selection.selectTo(w.row,w.column)}}else{this.selection.moveTo(w.row,w.column)}}};this.gotoLine=function(t,v,u){this.selection.clearSelection();this.session.unfold({row:t-1,column:v||0});this.$blockScrolling+=1;this.exitMultiSelectMode&&this.exitMultiSelectMode();this.moveCursorTo(t-1,v||0);this.$blockScrolling-=1;if(!this.isRowFullyVisible(t-1)){this.scrollToLine(t-1,true,u)}};this.navigateTo=function(u,t){this.selection.moveTo(u,t)};this.navigateUp=function(u){if(this.selection.isMultiLine()&&!this.selection.isBackwards()){var t=this.selection.anchor.getPosition();return this.moveCursorToPosition(t)}this.selection.clearSelection();this.selection.moveCursorBy(-u||-1,0)};this.navigateDown=function(u){if(this.selection.isMultiLine()&&this.selection.isBackwards()){var t=this.selection.anchor.getPosition();return this.moveCursorToPosition(t)}this.selection.clearSelection();this.selection.moveCursorBy(u||1,0)};this.navigateLeft=function(u){if(!this.selection.isEmpty()){var t=this.getSelectionRange().start;this.moveCursorToPosition(t)}else{u=u||1;while(u--){this.selection.moveCursorLeft()}}this.clearSelection()};this.navigateRight=function(u){if(!this.selection.isEmpty()){var t=this.getSelectionRange().end;this.moveCursorToPosition(t)}else{u=u||1;while(u--){this.selection.moveCursorRight()}}this.clearSelection()};this.navigateLineStart=function(){this.selection.moveCursorLineStart();this.clearSelection()};this.navigateLineEnd=function(){this.selection.moveCursorLineEnd();this.clearSelection()};this.navigateFileEnd=function(){this.selection.moveCursorFileEnd();this.clearSelection()};this.navigateFileStart=function(){this.selection.moveCursorFileStart();this.clearSelection()};this.navigateWordRight=function(){this.selection.moveCursorWordRight();this.clearSelection()};this.navigateWordLeft=function(){this.selection.moveCursorWordLeft();this.clearSelection()};this.replace=function(v,u){if(u){this.$search.set(u)}var t=this.$search.find(this.session);var w=0;if(!t){return w}if(this.$tryReplace(t,v)){w=1}if(t!==null){this.selection.setSelectionRange(t);this.renderer.scrollSelectionIntoView(t.start,t.end)}return w};this.replaceAll=function(x,u){if(u){this.$search.set(u)}var t=this.$search.findAll(this.session);var y=0;if(!t.length){return y}this.$blockScrolling+=1;var w=this.getSelectionRange();this.selection.moveTo(0,0);for(var v=t.length-1;v>=0;--v){if(this.$tryReplace(t[v],x)){y++}}this.selection.setSelectionRange(w);this.$blockScrolling-=1;return y};this.$tryReplace=function(u,v){var t=this.session.getTextRange(u);v=this.$search.replace(t,v);if(v!==null){u.end=this.session.replace(u,v);return u}else{return null}};this.getLastSearchOptions=function(){return this.$search.getOptions()};this.find=function(x,w,u){if(!w){w={}}if(typeof x=="string"||x instanceof RegExp){w.needle=x}else{if(typeof x=="object"){n.mixin(w,x)}}var t=this.selection.getRange();if(w.needle==null){x=this.session.getTextRange(t)||this.$search.$options.needle;if(!x){t=this.session.getWordRange(t.start.row,t.start.column);x=this.session.getTextRange(t)}this.$search.set({needle:x})}this.$search.set(w);if(!w.start){this.$search.set({start:t})}var v=this.$search.find(this.session);if(w.preventScroll){return v}if(v){this.revealRange(v,u);return v}if(w.backwards){t.start=t.end}else{t.end=t.start}this.selection.setRange(t)};this.findNext=function(u,t){this.find({skipCurrent:true,backwards:false},u,t)};this.findPrevious=function(u,t){this.find(u,{skipCurrent:true,backwards:true},t)};this.revealRange=function(u,t){this.$blockScrolling+=1;this.session.unfold(u);this.selection.setSelectionRange(u);this.$blockScrolling-=1;var v=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(u.start,u.end,0.5);if(t!==false){this.renderer.animateScrolling(v)}};this.undo=function(){this.$blockScrolling++;this.session.getUndoManager().undo();this.$blockScrolling--;this.renderer.scrollCursorIntoView(null,0.5)};this.redo=function(){this.$blockScrolling++;this.session.getUndoManager().redo();this.$blockScrolling--;this.renderer.scrollCursorIntoView(null,0.5)};this.destroy=function(){this.renderer.destroy();this._signal("destroy",this)};this.setAutoScrollEditorIntoView=function(v){if(!v){return}var x;var t=this;var w=false;if(!this.$scrollAnchor){this.$scrollAnchor=document.createElement("div")}var z=this.$scrollAnchor;z.style.cssText="position:absolute";this.container.insertBefore(z,this.container.firstChild);var A=this.on("changeSelection",function(){w=true});var y=this.renderer.on("beforeRender",function(){if(w){x=t.renderer.container.getBoundingClientRect()}});var u=this.renderer.on("afterRender",function(){if(w&&x&&t.isFocused()){var C=t.renderer;var E=C.$cursorLayer.$pixelPos;var B=C.layerConfig;var D=E.top-B.offset;if(E.top>=0&&D+x.top<0){w=true}else{if(E.topwindow.innerHeight){w=false}else{w=null}}if(w!=null){z.style.top=D+"px";z.style.left=E.left+"px";z.style.height=B.lineHeight+"px";z.scrollIntoView(w)}w=x=null}});this.setAutoScrollEditorIntoView=function(B){if(B){return}delete this.setAutoScrollEditorIntoView;this.removeEventListener("changeSelection",A);this.renderer.removeEventListener("afterRender",u);this.renderer.removeEventListener("beforeRender",y)}};this.$resetCursorStyle=function(){var t=this.$cursorStyle||"ace";var u=this.renderer.$cursorLayer;if(!u){return}u.setSmoothBlinking(t=="smooth");u.isBlinking=!this.$readOnly&&t!="wide"}}).call(k.prototype);q.defineOptions(k.prototype,"editor",{selectionStyle:{set:function(t){this.onSelectionChange();this._signal("changeSelectionStyle",{data:t})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:true},highlightSelectedWord:{set:function(t){this.$onSelectionChange()},initialValue:true},readOnly:{set:function(t){this.textInput.setReadOnly(t);this.$resetCursorStyle()},initialValue:false},cursorStyle:{set:function(t){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[false,true,"always"],initialValue:true},behavioursEnabled:{initialValue:true},wrapBehavioursEnabled:{initialValue:true},autoScrollEditorIntoView:{set:function(t){this.setAutoScrollEditorIntoView(t)}},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",foldStyle:"session",mode:"session"});r.Editor=k});define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event"],function(c,a,d){var e=c("../lib/event");function b(h,g){return h.row==g.row&&h.column==g.column}function f(A){var B=A.domEvent;var D=B.altKey;var w=B.shiftKey;var r=A.getAccelKey();var g=A.getButton();if(A.editor.inMultiSelectMode&&g==2){A.editor.textInput.onContextMenu(A.domEvent);return}if(!r&&!D){if(g===0&&A.editor.inMultiSelectMode){A.editor.exitMultiSelectMode()}return}var l=A.editor;var E=l.selection;var C=l.inMultiSelectMode;var o=A.getDocumentPosition();var m=E.getCursor();var x=A.inSelection()||(E.isEmpty()&&b(o,m));var q=A.x,p=A.y;var n=function(F){q=F.clientX;p=F.clientY};var j=function(){var G=l.renderer.pixelToScreenCoordinates(q,p);var F=h.screenToDocumentPosition(G.row,G.column);if(b(u,G)&&b(F,E.selectionLead)){return}u=G;l.selection.moveToPosition(F);l.renderer.scrollCursorIntoView();l.removeSelectionMarkers(z);z=E.rectangularRangeBlock(u,k);z.forEach(l.addSelectionMarker,l);l.updateSelectionMarkers()};var h=l.session;var k=l.renderer.pixelToScreenCoordinates(q,p);var u=k;if(r&&!D&&!w&&g===0){if(!C&&x){return}if(!C){var v=E.toOrientedRange();l.addSelectionMarker(v)}var t=E.rangeList.rangeAtPoint(o);l.$blockScrolling++;l.once("mouseup",function(){var F=E.toOrientedRange();if(t&&F.isEmpty()&&b(t.cursor,F.cursor)){E.substractPoint(F.cursor)}else{if(v){l.removeSelectionMarker(v);E.addRange(v)}E.addRange(F)}l.$blockScrolling--})}else{if(D&&g===0){A.stop();if(C&&!r){E.toSingleRange()}else{if(!C&&r){E.addRange()}}var z=[];if(w){k=h.documentToScreenPosition(E.lead);j()}else{E.moveToPosition(o)}var i=function(G){clearInterval(s);l.removeSelectionMarkers(z);for(var F=0;F=0)&&parseFloat(navigator.userAgent.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:|MSIE )([0-9]+[\.0-9]+)/)[1]);a.isOldIE=a.isIE&&a.isIE<9;a.isGecko=a.isMozilla=window.controllers&&window.navigator.product==="Gecko";a.isOldGecko=a.isGecko&&parseInt((navigator.userAgent.match(/rv\:(\d+)/)||[])[1],10)<4;a.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]";a.isWebKit=parseFloat(c.split("WebKit/")[1])||undefined;a.isChrome=parseFloat(c.split(" Chrome/")[1])||undefined;a.isAIR=c.indexOf("AdobeAIR")>=0;a.isIPad=c.indexOf("iPad")>=0;a.isTouchPad=c.indexOf("TouchPad")>=0});define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"],function(b,a,c){a.defaultCommands=[{name:"addCursorAbove",exec:function(e){e.selectMoreLines(-1)},bindKey:{win:"Ctrl-Alt-Up",mac:"Ctrl-Alt-Up"},readonly:true},{name:"addCursorBelow",exec:function(e){e.selectMoreLines(1)},bindKey:{win:"Ctrl-Alt-Down",mac:"Ctrl-Alt-Down"},readonly:true},{name:"addCursorAboveSkipCurrent",exec:function(e){e.selectMoreLines(-1,true)},bindKey:{win:"Ctrl-Alt-Shift-Up",mac:"Ctrl-Alt-Shift-Up"},readonly:true},{name:"addCursorBelowSkipCurrent",exec:function(e){e.selectMoreLines(1,true)},bindKey:{win:"Ctrl-Alt-Shift-Down",mac:"Ctrl-Alt-Shift-Down"},readonly:true},{name:"selectMoreBefore",exec:function(e){e.selectMore(-1)},bindKey:{win:"Ctrl-Alt-Left",mac:"Ctrl-Alt-Left"},readonly:true},{name:"selectMoreAfter",exec:function(e){e.selectMore(1)},bindKey:{win:"Ctrl-Alt-Right",mac:"Ctrl-Alt-Right"},readonly:true},{name:"selectNextBefore",exec:function(e){e.selectMore(-1,true)},bindKey:{win:"Ctrl-Alt-Shift-Left",mac:"Ctrl-Alt-Shift-Left"},readonly:true},{name:"selectNextAfter",exec:function(e){e.selectMore(1,true)},bindKey:{win:"Ctrl-Alt-Shift-Right",mac:"Ctrl-Alt-Shift-Right"},readonly:true},{name:"splitIntoLines",exec:function(e){e.multiSelect.splitIntoLines()},bindKey:{win:"Ctrl-Alt-L",mac:"Ctrl-Alt-L"},readonly:true},{name:"alignCursors",exec:function(e){e.alignCursors()},bindKey:{win:"Ctrl-Alt-A",mac:"Ctrl-Alt-A"}}];a.multiSelectCommands=[{name:"singleSelection",bindKey:"esc",exec:function(e){e.exitMultiSelectMode()},readonly:true,isAvailable:function(e){return e&&e.inMultiSelectMode}}];var d=b("../keyboard/hash_handler").HashHandler;a.keyboardHandler=new d(a.multiSelectCommands)});define("ace/lib/oop",["require","exports","module"],function(b,a,c){a.inherits=function(e,d){e.super_=d;e.prototype=Object.create(d.prototype,{constructor:{value:e,enumerable:false,writable:true,configurable:true}})};a.mixin=function(f,d){for(var e in d){f[e]=d[e]}return f};a.implement=function(e,d){a.mixin(e,d)}});define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/config"],function(c,a,d){var f=c("../lib/oop");var e=c("../lib/event_emitter").EventEmitter;var b=c("../config");var h=function(j,p,k,q){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this);this.changeListener=this.changeListener.bind(this);this.onMessage=this.onMessage.bind(this);if(c.nameToUrl&&!c.toUrl){c.toUrl=c.nameToUrl}if(b.get("packaged")||!c.toUrl){q=q||b.moduleUrl(p,"worker")}else{var l=this.$normalizePath;q=q||l(c.toUrl("ace/worker/worker.js",null,"_"));var r={};j.forEach(function(s){r[s]=l(c.toUrl(s,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}try{this.$worker=new Worker(q)}catch(n){if(n instanceof window.DOMException){var i=this.$workerBlob(q);var o=window.URL||window.webkitURL;var m=o.createObjectURL(i);this.$worker=new Worker(m);o.revokeObjectURL(m)}else{throw n}}this.$worker.postMessage({init:true,tlns:r,module:p,classname:k});this.callbackId=1;this.callbacks={};this.$worker.onmessage=this.onMessage};(function(){f.implement(this,e);this.onMessage=function(i){var j=i.data;switch(j.type){case"log":window.console&&console.log&&console.log.apply(console,j.data);break;case"event":this._signal(j.name,{data:j.data});break;case"call":var k=this.callbacks[j.id];if(k){k(j.data);delete this.callbacks[j.id]}break}};this.$normalizePath=function(i){if(!location.host){return i}i=i.replace(/^[a-z]+:\/\/[^\/]+/,"");i=location.protocol+"//"+location.host+(i.charAt(0)=="/"?"":location.pathname.replace(/\/[^\/]*$/,""))+"/"+i.replace(/^[\/]+/,"");return i};this.terminate=function(){this._signal("terminate",{});this.deltaQueue=null;this.$worker.terminate();this.$worker=null;this.$doc.removeEventListener("change",this.changeListener);this.$doc=null};this.send=function(j,i){this.$worker.postMessage({command:j,args:i})};this.call=function(j,i,l){if(l){var k=this.callbackId++;this.callbacks[k]=l;i.push(k)}this.send(j,i)};this.emit=function(j,k){try{this.$worker.postMessage({event:j,data:{data:k.data}})}catch(i){}};this.attachToDocument=function(i){if(this.$doc){this.terminate()}this.$doc=i;this.call("setValue",[i.getValue()]);i.on("change",this.changeListener)};this.changeListener=function(i){if(!this.deltaQueue){this.deltaQueue=[i.data];setTimeout(this.$sendDeltaQueue,0)}else{this.deltaQueue.push(i.data)}};this.$sendDeltaQueue=function(){var i=this.deltaQueue;if(!i){return}this.deltaQueue=null;if(i.length>20&&i.length>this.$doc.getLength()>>1){this.call("setValue",[this.$doc.getValue()])}else{this.emit("change",{data:i})}};this.$workerBlob=function(k){var i="importScripts('"+k+"');";try{return new Blob([i],{type:"application/javascript"})}catch(m){var l=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder;var j=new l();j.append(i);return j.getBlob("application/javascript")}}}).call(h.prototype);var g=function(m,l,p){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this);this.changeListener=this.changeListener.bind(this);this.callbackId=1;this.callbacks={};this.messageBuffer=[];var j=null;var o=false;var k=Object.create(e);var i=this;this.$worker={};this.$worker.terminate=function(){};this.$worker.postMessage=function(q){i.messageBuffer.push(q);if(j){if(o){setTimeout(n)}else{n()}}};this.setEmitSync=function(q){o=q};var n=function(){var q=i.messageBuffer.shift();if(q.command){j[q.command].apply(j,q.args)}else{if(q.event){k._signal(q.event,q.data)}}};k.postMessage=function(q){i.onMessage({data:q})};k.callback=function(r,q){this.postMessage({type:"call",id:q,data:r})};k.emit=function(q,r){this.postMessage({type:"event",name:q,data:r})};b.loadModule(["worker",l],function(q){j=new q[p](k);while(i.messageBuffer.length){n()}})};g.prototype=h.prototype;a.UIWorkerClient=g;a.WorkerClient=h});define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(c,a,d){var e=c("./oop");var b=(function(){var g={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,"super":8,meta:8,command:8,cmd:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9","-13":"NumpadEnter",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",188:",",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"}};var f,h;for(h in g.FUNCTION_KEYS){f=g.FUNCTION_KEYS[h].toLowerCase();g[f]=parseInt(h,10)}for(h in g.PRINTABLE_KEYS){f=g.PRINTABLE_KEYS[h].toLowerCase();g[f]=parseInt(h,10)}e.mixin(g,g.MODIFIER_KEYS);e.mixin(g,g.PRINTABLE_KEYS);e.mixin(g,g.FUNCTION_KEYS);g.enter=g["return"];g.escape=g.esc;g.del=g["delete"];g[173]="-";(function(){var k=["cmd","ctrl","alt","shift"];for(var j=Math.pow(2,k.length);j--;){g.KEY_MODS[j]=k.filter(function(i){return j&g.KEY_MODS[i]}).join("-")+"-"}})();return g})();e.mixin(a,b);a.keyCodeToString=function(f){return(b[f]||String.fromCharCode(f)).toLowerCase()}});define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(b,a,c){var f=b("./range").Range;var e=b("./lib/event_emitter").EventEmitter;var d=b("./lib/oop");var g=function(n,m,o,l,i,k){var h=this;this.length=m;this.session=n;this.doc=n.getDocument();this.mainClass=i;this.othersClass=k;this.$onUpdate=this.onUpdate.bind(this);this.doc.on("change",this.$onUpdate);this.$others=l;this.$onCursorChange=function(){setTimeout(function(){h.onCursorChange()})};this.$pos=o;var j=n.getUndoManager().$undoStack||n.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=j.length;this.setup();n.selection.on("changeCursor",this.$onCursorChange)};(function(){d.implement(this,e);this.setup=function(){var h=this;var j=this.doc;var i=this.session;var k=this.$pos;this.pos=j.createAnchor(k.row,k.column);this.markerId=i.addMarker(new f(k.row,k.column,k.row,k.column+this.length),this.mainClass,null,false);this.pos.on("change",function(l){i.removeMarker(h.markerId);h.markerId=i.addMarker(new f(l.value.row,l.value.column,l.value.row,l.value.column+h.length),h.mainClass,null,false)});this.others=[];this.$others.forEach(function(l){var m=j.createAnchor(l.row,l.column);h.others.push(m)});i.setUndoSelect(false)};this.showOtherMarkers=function(){if(this.othersActive){return}var i=this.session;var h=this;this.othersActive=true;this.others.forEach(function(j){j.markerId=i.addMarker(new f(j.row,j.column,j.row,j.column+h.length),h.othersClass,null,false);j.on("change",function(k){i.removeMarker(j.markerId);j.markerId=i.addMarker(new f(k.value.row,k.value.column,k.value.row,k.value.column+h.length),h.othersClass,null,false)})})};this.hideOtherMarkers=function(){if(!this.othersActive){return}this.othersActive=false;for(var h=0;h=this.pos.column&&h.start.column<=this.pos.column+this.length+1){var n=h.start.column-this.pos.column;this.length+=k;if(!this.session.$fromUndo){if(p.action==="insertText"){for(var m=this.others.length-1;m>=0;m--){var j=this.others[m];var l={row:j.row,column:j.column+n};if(j.row===h.start.row&&h.start.column=0;m--){var j=this.others[m];var l={row:j.row,column:j.column+n};if(j.row===h.start.row&&h.start.column=this.pos.column&&i.column<=this.pos.column+this.length){this.showOtherMarkers();this._emit("cursorEnter",h)}else{this.hideOtherMarkers();this._emit("cursorLeave",h)}};this.detach=function(){this.session.removeMarker(this.markerId);this.hideOtherMarkers();this.doc.removeEventListener("change",this.$onUpdate);this.session.selection.removeEventListener("changeCursor",this.$onCursorChange);this.pos.detach();for(var h=0;h1){s++;if(s>4){s=1}}else{s=1}}if(d.isIE){var t=Math.abs(u.clientX-q)>5||Math.abs(u.clientY-p)>5;if(t){s=1}if(s==1){q=u.clientX;p=u.clientY}}o[r]("mousedown",u);if(s>4){s=0}else{if(s>1){return o[r](m[s],u)}}});if(d.isOldIE){f.addListener(n,"dblclick",function(t){s=2;if(l){clearTimeout(l)}l=setTimeout(function(){l=null},k[s-1]||600);o[r]("mousedown",t);o[r](m[s],t)})}};var b=d.isMac&&d.isOpera&&!("KeyboardEvent" in window)?function(k){return 0|(k.metaKey?1:0)|(k.altKey?2:0)|(k.shiftKey?4:0)|(k.ctrlKey?8:0)}:function(k){return 0|(k.ctrlKey?1:0)|(k.altKey?2:0)|(k.shiftKey?4:0)|(k.metaKey?8:0)};f.getModifierString=function(k){return j.KEY_MODS[b(k)]};function i(p,o,n){var m=b(o);if(!d.isMac&&h){if(h[91]||h[92]){m|=8}if(h.altGr){if((3&m)!=3){h.altGr=0}else{return}}if(n===18||n===17){var k=o.location||o.keyLocation;if(n===17&&k===1){g=o.timeStamp}else{if(n===18&&m===3&&k===2){var l=-g;g=o.timeStamp;l+=g;if(l<3){h.altGr=true}}}}}if(n in j.MODIFIER_KEYS){switch(j.MODIFIER_KEYS[n]){case"Alt":m=2;break;case"Shift":m=4;break;case"Ctrl":m=1;break;default:m=8;break}n=-1}if(m&8&&(n===91||n===93)){n=-1}if(!m&&n===13){if(o.location||o.keyLocation===3){p(o,m,-n);if(o.defaultPrevented){return}}}if(!m&&!(n in j.FUNCTION_KEYS)&&!(n in j.PRINTABLE_KEYS)){return false}return p(o,m,n)}var h=null;var g=0;f.addCommandKeyListener=function(m,o){var l=f.addListener;if(d.isOldGecko||(d.isOpera&&!("KeyboardEvent" in window))){var n=null;l(m,"keydown",function(p){n=p.keyCode});l(m,"keypress",function(p){return i(o,p,n)})}else{var k=null;l(m,"keydown",function(q){h[q.keyCode]=true;var p=i(o,q,q.keyCode);k=q.defaultPrevented;return p});l(m,"keypress",function(p){if(k&&(p.ctrlKey||p.altKey||p.shiftKey||p.metaKey)){f.stopEvent(p);k=null}});l(m,"keyup",function(p){h[p.keyCode]=null});if(!h){h=Object.create(null);l(window,"focus",function(p){h=Object.create(null)})}}};if(window.postMessage&&!d.isOldIE){var a=1;f.nextTick=function(n,m){m=m||window;var k="zero-timeout-message-"+a;f.addListener(m,"message",function l(o){if(o.data==k){f.stopPropagation(o);f.removeListener(m,"message",l);n()}});m.postMessage(k,"*")}}f.nextFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame;if(f.nextFrame){f.nextFrame=f.nextFrame.bind(window)}else{f.nextFrame=function(k){setTimeout(k,17)}}});define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(b,a,c){var e=b("../../range").Range;var d=a.FoldMode=function(){};(function(){this.foldingStartMarker=null;this.foldingStopMarker=null;this.getFoldWidget=function(h,g,i){var f=h.getLine(i);if(this.foldingStartMarker.test(f)){return"start"}if(g=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(f)){return"end"}return""};this.getFoldWidgetRange=function(g,f,h){return null};this.indentationBlock=function(l,p,g){var o=/\S/;var q=l.getLine(p);var j=q.search(o);if(j==-1){return}var h=g||q.length;var m=l.getLength();var n=p;var i=p;while(++pn){var k=l.getLine(i).length;return new e(n,h,i,k)}};this.openingBracketBlock=function(j,l,k,h,f){var m={row:k,column:h+1};var g=j.$findClosingBracket(l,m,f);if(!g){return}var i=j.foldWidgets[g.row];if(i==null){i=j.getFoldWidget(g.row)}if(i=="start"&&g.row>m.row){g.row--;g.column=j.getLine(g.row).length}return e.fromPoints(m,g)};this.closingBracketBlock=function(i,k,j,h,f){var g={row:j,column:h};var l=i.$findOpeningBracket(k,g);if(!l){return}l.column++;g.column--;return e.fromPoints(l,g)}}).call(d.prototype)});define("ace/lib/dom",["require","exports","module"],function(c,a,d){if(typeof document=="undefined"){return}var b="http://www.w3.org/1999/xhtml";a.getDocumentHead=function(f){if(!f){f=document}return f.head||f.getElementsByTagName("head")[0]||f.documentElement};a.createElement=function(f,g){return document.createElementNS?document.createElementNS(g||b,f):document.createElement(f)};a.hasCssClass=function(h,f){var g=h.className.split(/\s+/g);return g.indexOf(f)!==-1};a.addCssClass=function(g,f){if(!a.hasCssClass(g,f)){g.className+=" "+f}};a.removeCssClass=function(i,g){var h=i.className.split(/\s+/g);while(true){var f=h.indexOf(g);if(f==-1){break}h.splice(f,1)}i.className=h.join(" ")};a.toggleCssClass=function(i,g){var h=i.className.split(/\s+/g),j=true;while(true){var f=h.indexOf(g);if(f==-1){break}j=false;h.splice(f,1)}if(j){h.push(g)}i.className=h.join(" ");return j};a.setCssClass=function(h,g,f){if(f){a.addCssClass(h,g)}else{a.removeCssClass(h,g)}};a.hasCssString=function(i,h){var f=0,g;h=h||document;if(h.createStyleSheet&&(g=h.styleSheets)){while(f0){if(aw>aq){aw=aq}}else{if(aw==void 0){aw=0}else{if(aw<0){aw=Math.max(aq+aw,0)}}}if(!(aw+aoax){for(at=an;at--;){this[ap+at]=this[ax+at]}}}if(az&&aw===ar){this.length=ar;this.push.apply(this,ay)}else{this.length=ar+az;for(at=0;at>>0;if(L(an)!="[object Function]"){throw new TypeError()}while(++aq>>0,an=Array(au),at=arguments[1];if(L(ao)!="[object Function]"){throw new TypeError(ao+" is not a function")}for(var ar=0;ar>>0,an=[],av,at=arguments[1];if(L(ao)!="[object Function]"){throw new TypeError(ao+" is not a function")}for(var ar=0;ar>>0,ar=arguments[1];if(L(an)!="[object Function]"){throw new TypeError(an+" is not a function")}for(var aq=0;aq>>0,ar=arguments[1];if(L(an)!="[object Function]"){throw new TypeError(an+" is not a function")}for(var aq=0;aq>>0;if(L(ao)!="[object Function]"){throw new TypeError(ao+" is not a function")}if(!at&&arguments.length==1){throw new TypeError("reduce of empty array with no initial value")}var ar=0;var an;if(arguments.length>=2){an=arguments[1]}else{do{if(ar in ap){an=ap[ar++];break}if(++ar>=at){throw new TypeError("reduce of empty array with no initial value")}}while(true)}for(;ar>>0;if(L(ao)!="[object Function]"){throw new TypeError(ao+" is not a function")}if(!at&&arguments.length==1){throw new TypeError("reduceRight of empty array with no initial value")}var an,ar=at-1;if(arguments.length>=2){an=arguments[1]}else{do{if(ar in ap){an=ap[ar--];break}if(--ar<0){throw new TypeError("reduceRight of empty array with no initial value")}}while(true)}do{if(ar in this){an=ao.call(void 0,an,ap[ar],ar,aq)}}while(ar--);return an}}if(!Array.prototype.indexOf||([0,1].indexOf(1,2)!=-1)){Array.prototype.indexOf=function v(ao){var an=aa&&L(this)=="[object String]"?this.split(""):M(this),aq=an.length>>>0;if(!aq){return -1}var ap=0;if(arguments.length>1){ap=U(arguments[1])}ap=ap>=0?ap:Math.max(0,aq+ap);for(;ap>>0;if(!aq){return -1}var ap=aq-1;if(arguments.length>1){ap=Math.min(ap,U(arguments[1]))}ap=ap>=0?ap:aq-Math.abs(ap);for(;ap>=0;ap--){if(ap in an&&ao===an[ap]){return ap}}return -1}}if(!Object.getPrototypeOf){Object.getPrototypeOf=function ah(an){return an.__proto__||(an.constructor?an.constructor.prototype:A)}}if(!Object.getOwnPropertyDescriptor){var b="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function B(ap,aq){if((typeof ap!="object"&&typeof ap!="function")||ap===null){throw new TypeError(b+ap)}if(!T(ap,aq)){return}var ar,an,at;ar={enumerable:true,configurable:true};if(p){var ao=ap.__proto__;ap.__proto__=A;var an=ac(ap,aq);var at=aj(ap,aq);ap.__proto__=ao;if(an||at){if(an){ar.get=an}if(at){ar.set=at}return ar}}ar.value=ap[aq];return ar}}if(!Object.getOwnPropertyNames){Object.getOwnPropertyNames=function R(an){return Object.keys(an)}}if(!Object.create){var V;if(Object.prototype.__proto__===null){V=function(){return{__proto__:null}}}else{V=function(){var ao={};for(var an in ao){ao[an]=null}ao.constructor=ao.hasOwnProperty=ao.propertyIsEnumerable=ao.isPrototypeOf=ao.toLocaleString=ao.toString=ao.valueOf=ao.__proto__=null;return ao}}Object.create=function j(ap,aq){var ao;if(ap===null){ao=V()}else{if(typeof ap!="object"){throw new TypeError("typeof prototype["+(typeof ap)+"] != 'object'")}var an=function(){};an.prototype=ap;ao=new an();ao.__proto__=ap}if(aq!==void 0){Object.defineProperties(ao,aq)}return ao}}function F(an){try{Object.defineProperty(an,"sentinel",{});return"sentinel" in an}catch(ao){}}if(Object.defineProperty){var i=F({});var H=typeof document=="undefined"||F(document.createElement("div"));if(!i||!H){var E=Object.defineProperty}}if(!Object.defineProperty||E){var f="Property description must be an object: ";var W="Object.defineProperty called on non-object: ";var n="getters & setters can not be defined on this javascript engine";Object.defineProperty=function Z(ao,aq,ar){if((typeof ao!="object"&&typeof ao!="function")||ao===null){throw new TypeError(W+ao)}if((typeof ar!="object"&&typeof ar!="function")||ar===null){throw new TypeError(f+ar)}if(E){try{return E.call(Object,ao,aq,ar)}catch(ap){}}if(T(ar,"value")){if(p&&(ac(ao,aq)||aj(ao,aq))){var an=ao.__proto__;ao.__proto__=A;delete ao[aq];ao[aq]=ar.value;ao.__proto__=an}else{ao[aq]=ar.value}}else{if(!p){throw new TypeError(n)}if(T(ar,"get")){ae(ao,aq,ar.get)}if(T(ar,"set")){al(ao,aq,ar.set)}}return ao}}if(!Object.defineProperties){Object.defineProperties=function N(an,ao){for(var ap in ao){if(T(ao,ap)){Object.defineProperty(an,ap,ao[ap])}}return an}}if(!Object.seal){Object.seal=function X(an){return an}}if(!Object.freeze){Object.freeze=function s(an){return an}}try{Object.freeze(function(){})}catch(l){Object.freeze=(function s(ao){return function an(ap){if(typeof ap=="function"){return ap}else{return ao(ap)}}})(Object.freeze)}if(!Object.preventExtensions){Object.preventExtensions=function O(an){return an}}if(!Object.isSealed){Object.isSealed=function am(an){return false}}if(!Object.isFrozen){Object.isFrozen=function ab(an){return false}}if(!Object.isExtensible){Object.isExtensible=function r(ao){if(Object(ao)===ao){throw new TypeError()}var an="";while(T(ao,an)){an+="?"}ao[an]=true;var ap=T(ao,an);delete ao[an];return ap}}if(!Object.keys){var m=true,u=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],k=u.length;for(var x in {toString:null}){m=false}Object.keys=function I(ap){if((typeof ap!="object"&&typeof ap!="function")||ap===null){throw new TypeError("Object.keys called on a non-object")}var at=[];for(var ao in ap){if(T(ap,ao)){at.push(ao)}}if(m){for(var aq=0,ar=k;aq0||-1)*Math.floor(Math.abs(an))}}return an}function z(an){var ao=typeof an;return(an===null||ao==="undefined"||ao==="boolean"||ao==="number"||ao==="string")}function w(ao){var aq,an,ap;if(z(ao)){return ao}an=ao.valueOf;if(typeof an==="function"){aq=an.call(ao);if(z(aq)){return aq}}ap=ao.toString;if(typeof ap==="function"){aq=ap.call(ao);if(z(aq)){return aq}}throw new TypeError()}var M=function(an){if(an==null){throw new TypeError("can't convert "+an+" to object")}return Object(an)}});define("ace/lib/regexp",["require","exports","module"],function(b,a,c){var h={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},f=h.exec.call(/()??/,"")[1]===undefined,e=function(){var i=/^/g;h.test.call(i,"");return !i.lastIndex}();if(e&&f){return}RegExp.prototype.exec=function(n){var l=h.exec.apply(this,arguments),k,j;if(typeof(n)=="string"&&l){if(!f&&l.length>1&&d(l,"")>-1){j=RegExp(this.source,h.replace.call(g(this),"g",""));h.replace.call(n.slice(l.index),j,function(){for(var o=1;ol.index)){this.lastIndex--}}return l};if(!e){RegExp.prototype.test=function(j){var i=h.exec.call(this,j);if(i&&this.global&&!i[0].length&&(this.lastIndex>i.index)){this.lastIndex--}return !!i}}function g(i){return(i.global?"g":"")+(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.extended?"x":"")+(i.sticky?"y":"")}function d(m,k,l){if(Array.prototype.indexOf){return m.indexOf(k,l)}for(var j=l||0;j>1;var n=i(l,o[j]);if(n>0){m=j+1}else{if(n<0){k=j-1}else{return j}}}return -(m+1)}function a(o,p,l){var n=o.getAnnotations().sort(e.comparePoints);if(!n.length){return}var m=h(n,{row:p,column:-1},e.comparePoints);if(m<0){m=-m-1}if(m>=n.length-1){m=l>0?0:n.length-1}else{if(m===0&&l<0){m=n.length-1}}var k=n[m];if(!k||!l){return}if(k.row===p){do{k=n[m+=l]}while(k&&k.row===p);if(!k){return n.slice()}}var j=[];p=k.row;do{j[l<0?"unshift":"push"](k);k=n[m+=l]}while(k&&k.row==p);return j.length&&j}b.showErrorMarker=function(p,k){var q=p.session;if(!q.widgetManager){q.widgetManager=new f(q);q.widgetManager.attach(p)}var r=p.getCursorPosition();var v=r.row;var m=q.lineWidgets&&q.lineWidgets[v];if(m){m.destroy()}else{v-=k}var o=a(q,v,k);var u;if(o){var l=o[0];r.column=(l.pos&&typeof l.column!="number"?l.pos.sc:l.column)||0;r.row=l.row;u=p.renderer.$gutterLayer.$annotations[r.row]}else{if(m){return}else{u={text:["Looks good!"],className:"ace_ok"}}}p.session.unfold(r.row);p.selection.moveToPosition(r);var t={row:r.row,fixedWidth:true,coverGutter:true,el:g.createElement("div")};var i=t.el.appendChild(g.createElement("div"));var s=t.el.appendChild(g.createElement("div"));s.className="error_widget_arrow "+u.className;var j=p.renderer.$cursorLayer.getPixelPosition(r).left;s.style.left=j+p.renderer.gutterWidth-5+"px";t.el.className="error_widget_wrapper";i.className="error_widget "+u.className;i.innerHTML=u.text.join("
");i.appendChild(g.createElement("div"));var n=function(x,y,w){if(y===0&&(w==="esc"||w==="return")){t.destroy();return{command:"null"}}};t.destroy=function(){if(p.$mouseHandler.isMousePressed){return}p.keyBinding.removeKeyboardHandler(n);q.widgetManager.removeLineWidget(t);p.off("changeSelection",t.destroy);p.off("changeSession",t.destroy);p.off("mouseup",t.destroy);p.off("change",t.destroy)};p.keyBinding.addKeyboardHandler(n);p.on("changeSelection",t.destroy);p.on("changeSession",t.destroy);p.on("mouseup",t.destroy);p.on("change",t.destroy);p.session.widgetManager.addLineWidget(t);t.el.onmousedown=p.focus.bind(p);p.renderer.scrollCursorIntoView(null,0.5,{bottom:t.el.offsetHeight})};g.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")});define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"],function(b,a,c){b("./regexp");b("./es5-shim")});define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(b,a,c){var d=b("./lib/oop");var g=b("./lib/dom");var f=b("./range").Range;function e(h){this.session=h;this.session.widgetManager=this;this.session.getRowLength=this.getRowLength;this.session.$getWidgetScreenLength=this.$getWidgetScreenLength;this.updateOnChange=this.updateOnChange.bind(this);this.renderWidgets=this.renderWidgets.bind(this);this.measureWidgets=this.measureWidgets.bind(this);this.session._changedWidgets=[];this.detach=this.detach.bind(this);this.session.on("change",this.updateOnChange)}(function(){this.getRowLength=function(j){var i;if(this.lineWidgets){i=this.lineWidgets[j]&&this.lineWidgets[j].rowCount||0}else{i=0}if(!this.$useWrapMode||!this.$wrapData[j]){return 1+i}else{return this.$wrapData[j].length+1+i}};this.$getWidgetScreenLength=function(){var h=0;this.lineWidgets.forEach(function(i){if(i&&i.rowCount){h+=i.rowCount}});return h};this.attach=function(h){if(h.widgetManager&&h.widgetManager!=this){h.widgetManager.detach()}if(this.editor==h){return}this.detach();this.editor=h;this.editor.on("changeSession",this.detach);h.widgetManager=this;h.setOption("enableLineWidgets",true);h.renderer.on("beforeRender",this.measureWidgets);h.renderer.on("afterRender",this.renderWidgets)};this.detach=function(j){if(j&&j.session==this.session){return}var i=this.editor;if(!i){return}i.off("changeSession",this.detach);this.editor=null;i.widgetManager=null;i.renderer.off("beforeRender",this.measureWidgets);i.renderer.off("afterRender",this.renderWidgets);var h=this.session.lineWidgets;h&&h.forEach(function(k){if(k&&k.el&&k.el.parentNode){k._inDocument=false;k.el.parentNode.removeChild(k.el)}})};this.updateOnChange=function(n){var l=this.session.lineWidgets;if(!l){return}var o=n.data;var j=o.range;var i=j.start.row;var h=j.end.row-i;if(h===0){}else{if(o.action=="removeText"||o.action=="removeLines"){var m=l.splice(i+1,h);m.forEach(function(p){p&&this.removeLineWidget(p)},this);this.$updateRows()}else{var k=new Array(h);k.unshift(i,0);l.splice.apply(l,k);this.$updateRows()}}};this.$updateRows=function(){var h=this.session.lineWidgets;if(!h){return}var i=true;h.forEach(function(j,k){if(j){i=false;j.row=k}});if(i){this.session.lineWidgets=null}};this.addLineWidget=function(h){if(!this.session.lineWidgets){this.session.lineWidgets=new Array(this.session.getLength())}this.session.lineWidgets[h.row]=h;var i=this.editor.renderer;if(h.html&&!h.el){h.el=g.createElement("div");h.el.innerHTML=h.html}if(h.el){g.addCssClass(h.el,"ace_lineWidgetContainer");h.el.style.position="absolute";h.el.style.zIndex=5;i.container.appendChild(h.el);h._inDocument=true}if(!h.coverGutter){h.el.style.zIndex=3}if(!h.pixelHeight){h.pixelHeight=h.el.offsetHeight}if(h.rowCount==null){h.rowCount=h.pixelHeight/i.layerConfig.lineHeight}this.session._emit("changeFold",{data:{start:{row:h.row}}});this.$updateRows();this.renderWidgets(null,i);return h};this.removeLineWidget=function(h){h._inDocument=false;if(h.el&&h.el.parentNode){h.el.parentNode.removeChild(h.el)}if(h.editor&&h.editor.destroy){try{h.editor.destroy()}catch(i){}}if(this.session.lineWidgets){this.session.lineWidgets[h.row]=undefined}this.session._emit("changeFold",{data:{start:{row:h.row}}});this.$updateRows()};this.onWidgetChanged=function(h){this.session._changedWidgets.push(h);this.editor&&this.editor.renderer.updateFull()};this.measureWidgets=function(p,o){var k=this.session._changedWidgets;var l=o.layerConfig;if(!k||!k.length){return}var n=Infinity;for(var m=0;m0&&!o[l]){l--}this.firstRow=h.firstRow;this.lastRow=h.lastRow;n.$cursorLayer.config=h;for(var k=l;k<=r;k++){var q=o[k];if(!q||!q.el){continue}if(!q._inDocument){q._inDocument=true;n.container.appendChild(q.el)}var p=n.$cursorLayer.getPixelPosition({row:k,column:0},true).top;if(!q.coverLine){p+=h.lineHeight*this.session.getRowLineCount(q.row)}q.el.style.top=p-h.offset+"px";var j=q.coverGutter?0:n.gutterWidth;if(!q.fixedWidth){j-=n.scrollLeft}q.el.style.left=j+"px";if(q.fixedWidth){q.el.style.right=n.scrollBar.getWidth()+"px"}else{q.el.style.right=""}}}}).call(e.prototype);a.LineWidgets=e});define("ace/document",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/range","ace/anchor"],function(d,c,e){var g=d("./lib/oop");var f=d("./lib/event_emitter").EventEmitter;var h=d("./range").Range;var a=d("./anchor").Anchor;var b=function(i){this.$lines=[];if(i.length===0){this.$lines=[""]}else{if(Array.isArray(i)){this._insertLines(0,i)}else{this.insert({row:0,column:0},i)}}};(function(){g.implement(this,f);this.initialize=function(i){this.refresh(i)};this.setValue=function(j){var i=this.getLength();this.remove(new h(0,0,i,this.getLine(i-1).length));this.insert({row:0,column:0},j)};this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())};this.createAnchor=function(j,i){return new a(this,j,i)};if("aaa".split(/a/).length===0){this.$split=function(i){return i.replace(/\r\n|\r/g,"\n").split("\n")}}else{this.$split=function(i){return i.split(/\r\n|\r|\n/)}}this.$detectNewLine=function(j){var i=j.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=i?i[1]:"\n";this._signal("changeNewLineMode")};this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}};this.$autoNewLine="";this.$newLineMode="auto";this.setNewLineMode=function(i){if(this.$newLineMode===i){return}this.$newLineMode=i;this._signal("changeNewLineMode")};this.getNewLineMode=function(){return this.$newLineMode};this.isNewLine=function(i){return(i=="\r\n"||i=="\r"||i=="\n")};this.getLine=function(i){return this.$lines[i]||""};this.getLines=function(j,i){return this.$lines.slice(j,i+1)};this.getAllLines=function(){return this.getLines(0,this.getLength())};this.getLength=function(){return this.$lines.length};this.getTextRange=function(k){if(k.start.row==k.end.row){return this.getLine(k.start.row).substring(k.start.column,k.end.column)}var j=this.getLines(k.start.row,k.end.row);j[0]=(j[0]||"").substring(k.start.column);var i=j.length-1;if(k.end.row-k.start.row==i){j[i]=j[i].substring(0,k.end.column)}return j.join(this.getNewLineCharacter())};this.$clipPosition=function(i){var j=this.getLength();if(i.row>=j){i.row=Math.max(0,j-1);i.column=this.getLine(j-1).length}else{if(i.row<0){i.row=0}}return i};this.insert=function(i,m){if(!m||m.length===0){return i}i=this.$clipPosition(i);if(this.getLength()<=1){this.$detectNewLine(m)}var k=this.$split(m);var l=k.splice(0,1)[0];var j=k.length==0?null:k.splice(k.length-1,1)[0];i=this.insertInLine(i,l);if(j!==null){i=this.insertNewLine(i);i=this._insertLines(i.row,k);i=this.insertInLine(i,j||"")}return i};this.refresh=function(n,m){var m=m||0;var j=this.$split(n);if(j.length>65535){var i=this.refresh(m,j.slice(65535));j=j.slice(0,65535)}var l=[m,0];l.push.apply(l,j);this.$lines.splice.apply(this.$lines,l);var k=new h(m,0,m+j.length,0);var o={action:"insertLines",context:"refresh",range:k,lines:j};this._emit("change",{data:o});return{row:0,column:0}};this.insertLines=function(j,i){if(j>=this.getLength()){return this.insert({row:j,column:0},"\n"+i.join("\n"))}return this._insertLines(Math.max(j,0),i)};this._insertLines=function(m,j){if(j.length==0){return{row:m,column:0}}while(j.length>61440){var i=this._insertLines(m,j.slice(0,61440));j=j.slice(61440);m=i.row}var l=[m,0];l.push.apply(l,j);this.$lines.splice.apply(this.$lines,l);var k=new h(m,0,m+j.length,0);var n={action:"insertLines",range:k,lines:j};this._signal("change",{data:n});return k.end};this.insertNewLine=function(i){i=this.$clipPosition(i);var k=this.$lines[i.row]||"";this.$lines[i.row]=k.substring(0,i.column);this.$lines.splice(i.row+1,0,k.substring(i.column,k.length));var j={row:i.row+1,column:0};var l={action:"insertText",range:h.fromPoints(i,j),text:this.getNewLineCharacter()};this._signal("change",{data:l});return j};this.insertInLine=function(i,l){if(l.length==0){return i}var k=this.$lines[i.row]||"";this.$lines[i.row]=k.substring(0,i.column)+l+k.substring(i.column);var j={row:i.row,column:i.column+l.length};var m={action:"insertText",range:h.fromPoints(i,j),text:l};this._signal("change",{data:m});return j};this.remove=function(j){if(!(j instanceof h)){j=h.fromPoints(j.start,j.end)}j.start=this.$clipPosition(j.start);j.end=this.$clipPosition(j.end);if(j.isEmpty()){return j.start}var m=j.start.row;var k=j.end.row;if(j.isMultiLine()){var l=j.start.column==0?m:m+1;var i=k-1;if(j.end.column>0){this.removeInLine(k,0,j.end.column)}if(i>=l){this._removeLines(l,i)}if(l!=m){this.removeInLine(m,j.start.column,this.getLine(m).length);this.removeNewLine(j.start.row)}}else{this.removeInLine(m,j.start.column,j.end.column)}return j.start};this.removeInLine=function(m,k,p){if(k==p){return}var j=new h(m,k,m,p);var i=this.getLine(m);var l=i.substring(k,p);var o=i.substring(0,k)+i.substring(p,i.length);this.$lines.splice(m,1,o);var n={action:"removeText",range:j,text:l};this._signal("change",{data:n});return j.start};this.removeLines=function(j,i){if(j<0||i>=this.getLength()){return this.remove(new h(j,0,i+1,0))}return this._removeLines(j,i)};this._removeLines=function(l,j){var i=new h(l,0,j+1,0);var k=this.$lines.splice(l,j-l+1);var m={action:"removeLines",range:i,nl:this.getNewLineCharacter(),lines:k};this._signal("change",{data:m});return k};this.removeNewLine=function(m){var l=this.getLine(m);var i=this.getLine(m+1);var k=new h(m,l.length,m+1,0);var j=l+i;this.$lines.splice(m,2,j);var n={action:"removeText",range:k,text:this.getNewLineCharacter()};this._signal("change",{data:n})};this.replace=function(j,k){if(!(j instanceof h)){j=h.fromPoints(j.start,j.end)}if(k.length==0&&j.isEmpty()){return j.start}if(k==this.getTextRange(j)){return j.end}this.remove(j);if(k){var i=this.insert(j.start,k)}else{i=j.start}return i};this.applyDeltas=function(l){for(var k=0;k=0;k--){var m=l[k];var j=h.fromPoints(m.range.start,m.range.end);if(m.action=="insertLines"){this._removeLines(j.start.row,j.end.row-1)}else{if(m.action=="insertText"){this.remove(j)}else{if(m.action=="removeLines"){this._insertLines(j.start.row,m.lines)}else{if(m.action=="removeText"){this.insert(j.start,m.text)}}}}}};this.indexToPosition=function(o,n){var k=this.$lines||this.getAllLines();var m=this.getNewLineCharacter().length;for(var p=n||0,j=k.length;p",newSubstr:" close tag "},{substr:"<",newSubstr:" tag start "},{substr:">",newSubstr:" tag end "}]}};var i={prop:i};var S=function(aD,aB){var aE=aD;for(var aA=0;aA0){cvox.Api.playEarcon(am)}ab(aB)};var E=function(aA){var az=aA.type+" "+aA.text+" on "+W(aA.row,aA.column);az=az.replace(";","semicolon");cvox.Api.speak(az,1)};var ae=function(aB){var aA=a[aB];for(var az in aA){E(aA[az])}};var W=function(aA,az){return"row "+(aA+1)+" column "+(az+1)};var n=function(){cvox.Api.speak(W(Y.row,Y.column))};var at=function(){for(var az in a){ae(az)}};var ag=function(){if(!m()){return}switch(x.editor.keyBinding.$data.state){case ac:cvox.Api.speak("Insert mode");break;case J:cvox.Api.speak("Command mode");break}};var h=function(){V=!V;if(V){cvox.Api.speak("Speak location on row change enabled.")}else{cvox.Api.speak("Speak location on row change disabled.")}};var aa=function(){M=!M;if(M){cvox.Api.speak("Speak displacement on column changes.")}else{cvox.Api.speak("Speak current character or word on column changes.")}};var w=function(aA){if(aA.ctrlKey&&aA.shiftKey){var az=ap[aA.keyCode];if(az){az.func()}}};var t=function(az,aA){if(!m()){return}var aB=aA.keyBinding.$data.state;if(aB===B){return}switch(aB){case ac:cvox.Api.playEarcon(u);cvox.Api.setKeyEcho(true);break;case J:cvox.Api.playEarcon(u);cvox.Api.setKeyEcho(false);break}B=aB};var b=function(aA){var aB=aA.detail.customCommand;var az=X[aB];if(az){az.func();x.editor.focus()}};var z=function(){var aA=C.map(function(aB){return{desc:aB.desc+al(aB.keyCode),cmd:aB.cmd}});var az=document.querySelector("body");az.setAttribute("contextMenuActions",JSON.stringify(aA));az.addEventListener("ATCustomEvent",b,true)};var F=function(az){if(az.match){D(Y.row,0)}else{cvox.Api.playEarcon(d)}};var av=function(){x.editor.focus()};var C=[{keyCode:49,func:function(){ae(Y.row)},cmd:o.SPEAK_ANNOT,desc:"Speak annotations on line"},{keyCode:50,func:at,cmd:o.SPEAK_ALL_ANNOTS,desc:"Speak all annotations"},{keyCode:51,func:ag,cmd:o.SPEAK_MODE,desc:"Speak Vim mode"},{keyCode:52,func:h,cmd:o.TOGGLE_LOCATION,desc:"Toggle speak row location"},{keyCode:53,func:n,cmd:o.SPEAK_ROW_COL,desc:"Speak row and column"},{keyCode:54,func:aa,cmd:o.TOGGLE_DISPLACEMENT,desc:"Toggle speak displacement"},{keyCode:55,func:av,cmd:o.FOCUS_TEXT,desc:"Focus text"}];var A=function(){x.editor=editor;editor.getSession().selection.on("changeCursor",I);editor.getSession().selection.on("changeSelection",j);editor.getSession().on("change",ak);editor.getSession().on("changeAnnotation",e);editor.on("changeStatus",t);editor.on("findSearchBox",F);editor.container.addEventListener("keydown",w);Y=editor.selection.getCursor()};var T=function(az){A();C.forEach(function(aA){ap[aA.keyCode]=aA;X[aA.cmd]=aA});az.on("focus",A);if(m()){cvox.Api.setKeyEcho(false)}z()};function v(){return(typeof(cvox)!=="undefined")&&cvox&&cvox.Api}var af=0;var ar=15;function an(az){if(v()){T(az)}else{af++;if(af>=ar){return}window.setTimeout(an,500,az)}}var L=ah("../editor").Editor;ah("../config").defineOptions(L.prototype,"editor",{enableChromevoxEnhancements:{set:function(az){if(az){an(this)}},value:true}})});(function(){window.require(["ace/ext/chromevox"],function(){})})();define("ace/ext/elastic_tabstops_lite",["require","exports","module","ace/editor","ace/config"],function(c,b,e){var d=function(i){this.$editor=i;var f=this;var g=[];var h=false;this.onAfterExec=function(){h=false;f.processRows(g);g=[]};this.onExec=function(){h=true};this.onChange=function(k){var j=k.data.range;if(h){if(g.indexOf(j.start.row)==-1){g.push(j.start.row)}if(j.end.row!=j.start.row){g.push(j.end.row)}}}};(function(){this.processRows=function(q){this.$inChange=true;var j=[];for(var f=0,n=q.length;f-1){continue}var k=this.$findCellWidthsForBlock(p);var g=this.$setBlockCellWidthsToMax(k.cellWidths);var m=k.firstRow;for(var o=0,i=g.length;o=0){g=this.$cellWidthsForRow(f);if(g.length==0){break}h.unshift(g);f--}var j=f+1;f=k;var i=this.$editor.session.getLength();while(f0){this.$editor.session.getDocument().insertInLine({row:u,column:m+1},Array(h+1).join(" ")+"\t");this.$editor.session.getDocument().removeInLine(u,m,m+1);p+=h}if(h<0&&o>=-h){this.$editor.session.getDocument().removeInLine(u,m+h,m);p+=h}}};this.$izip_longest=function(g){if(!g[0]){return[]}var k=g[0].length;var m=g.length;for(var j=1;jk){k=h}}var n=[];for(var f=0;f=h.length?h.length:j.length;var k=[];for(var f=0;f1){n=o[0]}else{if(n=="php"){n="html"}}}}return n},getProfileName:function(){switch(this.getSyntax()){case"css":return"css";case"xml":case"xsl":return"xml";case"html":var n=e.require("resources").getVariable("profile");if(!n){n=this.ace.session.getLines(0,2).join("").search(/]+XHTML/i)!=-1?"xhtml":"html"}return n}return"xhtml"},prompt:function(n){return prompt(n)},getSelection:function(){return this.ace.session.getTextRange()},getFilePath:function(){return""},$updateTabstops:function(t){var s=1000;var r=0;var q=null;var n=e.require("range");var p=e.require("tabStops");var o=e.require("resources").getVocabulary("user");var u={tabstop:function(x){var y=parseInt(x.group,10);var w=y===0;if(w){y=++r}else{y+=s}var z=x.placeholder;if(z){z=p.processText(z,u)}var v="${"+y+(z?":"+z:"")+"}";if(w){q=n.create(x.start,v)}return v},escape:function(v){if(v=="$"){return"\\$"}if(v=="\\"){return"\\\\"}return v}};t=p.processText(t,u);if(o.variables.insert_final_tabstop&&!/\$\{0\}$/.test(t)){t+="${0}"}else{if(q){t=e.require("utils").replaceSubstring(t,"${0}",q)}}return t}};var i={expand_abbreviation:{mac:"ctrl+alt+e",win:"alt+e"},match_pair_outward:{mac:"ctrl+d",win:"ctrl+,"},match_pair_inward:{mac:"ctrl+j",win:"ctrl+shift+0"},matching_pair:{mac:"ctrl+alt+j",win:"alt+j"},next_edit_point:"alt+right",prev_edit_point:"alt+left",toggle_comment:{mac:"command+/",win:"ctrl+/"},split_join_tag:{mac:"shift+command+'",win:"shift+ctrl+`"},remove_tag:{mac:"command+'",win:"shift+ctrl+;"},evaluate_math_expression:{mac:"shift+command+y",win:"shift+ctrl+y"},increment_number_by_1:"ctrl+up",decrement_number_by_1:"ctrl+down",increment_number_by_01:"alt+up",decrement_number_by_01:"alt+down",increment_number_by_10:{mac:"alt+command+up",win:"shift+alt+up"},decrement_number_by_10:{mac:"alt+command+down",win:"shift+alt+down"},select_next_item:{mac:"shift+command+.",win:"shift+ctrl+."},select_previous_item:{mac:"shift+command+,",win:"shift+ctrl+,"},reflect_css_value:{mac:"shift+command+r",win:"shift+ctrl+r"},encode_decode_data_url:{mac:"shift+ctrl+d",win:"ctrl+'"},expand_abbreviation_with_tab:"Tab",wrap_with_abbreviation:{mac:"shift+ctrl+a",win:"shift+ctrl+a"}};var l=new h();g.commands=new k();g.runEmmetCommand=function(o){l.setupContext(o);if(l.getSyntax()=="php"){return false}var q=e.require("actions");if(this.action=="expand_abbreviation_with_tab"){if(!o.selection.isEmpty()){return false}}if(this.action=="wrap_with_abbreviation"){return setTimeout(function(){q.run("wrap_with_abbreviation",l)},0)}try{var n=q.run(this.action,l)}catch(p){o._signal("changeStatus",typeof p=="string"?p:p.message);console.log(p)}return n};for(var f in i){g.commands.addCommand({name:"emmet:"+f,action:f,bindKey:i[f],exec:g.runEmmetCommand,multiSelectAction:"forEach"})}var m=function(q,p){var o=p;if(!o){return}var r=o.session.$modeId;var n=r&&/css|less|scss|sass|stylus|html|php/.test(r);if(q.enableEmmet===false){n=false}if(n){o.keyBinding.addKeyboardHandler(g.commands)}else{o.keyBinding.removeKeyboardHandler(g.commands)}};g.AceEmmetEditor=h;d("ace/config").defineOptions(j.prototype,"editor",{enableEmmet:{set:function(n){this[n?"on":"removeListener"]("changeMode",m);m({enableEmmet:!!n},this)},value:true}});g.setCore=function(n){e=n}});define("ace/snippets",["require","exports","module","ace/lib/lang","ace/range","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom"],function(e,f,c){var b=e("./lib/lang");var d=e("./range").Range;var h=e("./keyboard/hash_handler").HashHandler;var j=e("./tokenizer").Tokenizer;var l=d.comparePoints;var a=function(){this.snippetMap={};this.snippetNameMap={}};(function(){this.getTokenizer=function(){function m(q,p,o){q=q.substr(1);if(/^\d+$/.test(q)&&!o.inFormatString){return[{tabstopId:parseInt(q,10)}]}return[{text:q}]}function n(o){return"(?:[^\\\\"+o+"]|\\\\.)"}a.$tokenizer=new j({start:[{regex:/:/,onMatch:function(q,p,o){if(o.length&&o[0].expectIf){o[0].expectIf=false;o[0].elseBranch=o[0];return[o[0]]}return":"}},{regex:/\\./,onMatch:function(r,q,o){var p=r[1];if(p=="}"&&o.length){r=p}else{if("`$\\".indexOf(p)!=-1){r=p}else{if(o.inFormatString){if(p=="n"){r="\n"}else{if(p=="t"){r="\n"}else{if("ulULE".indexOf(p)!=-1){r={changeCase:p,local:p>"a"}}}}}}}return[r]}},{regex:/}/,onMatch:function(q,p,o){return[o.length?o.shift():q]}},{regex:/\$(?:\d+|\w+)/,onMatch:m},{regex:/\$\{[\dA-Z_a-z]+/,onMatch:function(r,q,o){var p=m(r.substr(1),q,o);o.unshift(p[0]);return p},next:"snippetVar"},{regex:/\n/,token:"newline",merge:false}],snippetVar:[{regex:"\\|"+n("\\|")+"*\\|",onMatch:function(q,p,o){o[0].choices=q.slice(1,-1).split(",")},next:"start"},{regex:"/("+n("/")+"+)/(?:("+n("/")+"*)/)(\\w*):?",onMatch:function(r,q,o){var p=o[0];p.fmtString=r;r=this.splitRegex.exec(r);p.guard=r[1];p.fmt=r[2];p.flag=r[3];return""},next:"start"},{regex:"`"+n("`")+"*`",onMatch:function(q,p,o){o[0].code=q.splice(1,-1);return""},next:"start"},{regex:"\\?",onMatch:function(q,p,o){if(o[0]){o[0].expectIf=true}},next:"start"},{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"start"}],formatString:[{regex:"/("+n("/")+"+)/",token:"regex"},{regex:"",onMatch:function(q,p,o){o.inFormatString=true},next:"start"}]});a.prototype.getTokenizer=function(){return a.$tokenizer};return a.$tokenizer};this.tokenizeTmSnippet=function(n,m){return this.getTokenizer().getLineTokens(n,m).tokens.map(function(o){return o.value||o})};this.$getDefaultValue=function(p,m){if(/^[A-Z]\d+$/.test(m)){var n=m.substr(1);return(this.variables[m[0]+"__"]||{})[n]}if(/^\d+$/.test(m)){return(this.variables.__||{})[m]}m=m.replace(/^TM_/,"");if(!p){return}var o=p.session;switch(m){case"CURRENT_WORD":var q=o.getWordRange();case"SELECTION":case"SELECTED_TEXT":return o.getTextRange(q);case"CURRENT_LINE":return o.getLine(p.getCursorPosition().row);case"PREV_LINE":return o.getLine(p.getCursorPosition().row-1);case"LINE_INDEX":return p.getCursorPosition().column;case"LINE_NUMBER":return p.getCursorPosition().row+1;case"SOFT_TABS":return o.getUseSoftTabs()?"YES":"NO";case"TAB_SIZE":return o.getTabSize();case"FILENAME":case"FILEPATH":return"";case"FULLNAME":return"Ace"}};this.variables={};this.getVariableValue=function(m,n){if(this.variables.hasOwnProperty(n)){return this.variables[n](m,n)||""}return this.$getDefaultValue(m,n)||""};this.tmStrFormat=function(t,r,q){var n=r.flag||"";var p=r.guard;p=new RegExp(p,n.replace(/[^gi]/,""));var o=this.tokenizeTmSnippet(r.fmt,"formatString");var m=this;var s=t.replace(p,function(){m.variables.__=arguments;var x=m.resolveVariables(o,q);var y="E";for(var u=0;u=0){u.splice(r,1)}}}if(o.content){m(o)}else{if(Array.isArray(o)){o.forEach(m)}}};this.parseSnippetFile=function(t){t=t.replace(/\r/g,"");var s=[],n={};var v=/^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm;var p;while(p=v.exec(t)){if(p[1]){try{n=JSON.parse(p[1]);s.push(n)}catch(r){}}if(p[4]){n.content=p[4].replace(/^\t/gm,"");s.push(n);n={}}else{var u=p[2],o=p[3];if(u=="regex"){var q=/\/((?:[^\/\\]|\\.)*)|$/g;n.guard=q.exec(o)[1];n.trigger=q.exec(o)[1];n.endTrigger=q.exec(o)[1];n.endGuard=q.exec(o)[1]}else{if(u=="snippet"){n.tabTrigger=o.match(/^\S*/)[0];if(!n.name){n.name=o}}else{n[u]=o}}}}return s};this.getSnippetByName=function(m,n){var p=this.snippetNameMap;var o;this.getActiveScopes(n).some(function(r){var q=p[r];if(q){o=q[m]}return !!o},this);return o}}).call(a.prototype);var i=function(m){if(m.tabstopManager){return m.tabstopManager}m.tabstopManager=this;this.$onChange=this.onChange.bind(this);this.$onChangeSelection=b.delayedCall(this.onChangeSelection.bind(this)).schedule;this.$onChangeSession=this.onChangeSession.bind(this);this.$onAfterExec=this.onAfterExec.bind(this);this.attach(m)};(function(){this.attach=function(m){this.index=-1;this.ranges=[];this.tabstops=[];this.selectedTabstop=null;this.editor=m;this.editor.on("change",this.$onChange);this.editor.on("changeSelection",this.$onChangeSelection);this.editor.on("changeSession",this.$onChangeSession);this.editor.commands.on("afterExec",this.$onAfterExec);this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)};this.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this);this.ranges=null;this.tabstops=null;this.selectedTabstop=null;this.editor.removeListener("change",this.$onChange);this.editor.removeListener("changeSelection",this.$onChangeSelection);this.editor.removeListener("changeSession",this.$onChangeSession);this.editor.commands.removeListener("afterExec",this.$onAfterExec);this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);this.editor.tabstopManager=null;this.editor=null};this.onChange=function(w){var q=w.data.range;var n=w.data.action[0]=="r";var p=q.start;var s=q.end;var z=p.row;var t=s.row;var y=t-z;var v=s.column-p.column;if(n){y=-y;v=-v}if(!this.$inChange&&n){var x=this.selectedTabstop;var A=!x.some(function(B){return l(B.start,p)<=0&&l(B.end,s)>=0});if(A){return this.detach()}}var o=this.ranges;for(var u=0;u0){this.removeRange(m);u--;continue}if(m.start.row==z&&m.start.column>p.column){m.start.column+=v}if(m.end.row==z&&m.end.column>=p.column){m.end.column+=v}if(m.start.row>=z){m.start.row+=y}if(m.end.row>=z){m.end.row+=y}if(l(m.start,m.end)>0){this.removeRange(m)}}if(!o.length){this.detach()}};this.updateLinkedFields=function(){var p=this.selectedTabstop;if(!p.hasLinkedRanges){return}this.$inChange=true;var q=this.editor.session;var r=q.getTextRange(p.firstNonLinked);for(var o=p.length;o--;){var n=p[o];if(!n.linked){continue}var m=f.snippetManager.tmStrFormat(r,n.original);q.replace(n,m)}this.$inChange=false};this.onAfterExec=function(m){if(m.command&&!m.command.readOnly){this.updateLinkedFields()}};this.onChangeSelection=function(){if(!this.editor){return}var o=this.editor.selection.lead;var n=this.editor.selection.anchor;var r=this.editor.selection.isEmpty();for(var p=this.ranges.length;p--;){if(this.ranges[p].linked){continue}var m=this.ranges[p].contains(o.row,o.column);var q=r||this.ranges[p].contains(n.row,n.column);if(m&&q){return}}this.detach()};this.onChangeSession=function(){this.detach()};this.tabNext=function(o){var m=this.tabstops.length-1;var n=this.index+(o||1);n=Math.min(Math.max(n,0),m);this.selectTabstop(n);if(n==m){this.detach()}};this.selectTabstop=function(m){var o=this.tabstops[this.index];if(o){this.addTabstopMarkers(o)}this.index=m;o=this.tabstops[this.index];if(!o||!o.length){return}this.selectedTabstop=o;if(!this.editor.inVirtualSelectionMode){var p=this.editor.multiSelect;p.toSingleRange(o.firstNonLinked.clone());for(var n=o.length;n--;){if(o.hasLinkedRanges&&o[n].linked){continue}p.addRange(o[n].clone(),true)}}else{this.editor.selection.setRange(o.firstNonLinked)}this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)};this.addTabstops=function(t,u,o){if(!t[0]){var s=d.fromPoints(o,o);g(s.start,u);g(s.end,u);t[0]=[s];t[0].index=0}var q=this.index;var m=[q,0];var n=this.ranges;var r=this.editor;t.forEach(function(x){for(var w=x.length;w--;){var y=x[w];var v=d.fromPoints(y.start,y.end||y.start);k(v.start,u);k(v.end,u);v.original=y;v.tabstop=x;n.push(v);x[w]=v;if(y.fmtString){v.linked=true;x.hasLinkedRanges=true}else{if(!x.firstNonLinked){x.firstNonLinked=v}}}if(!x.firstNonLinked){x.hasLinkedRanges=false}m.push(x);this.addTabstopMarkers(x)},this);m.push(m.splice(2,1)[0]);this.tabstops.splice.apply(this.tabstops,m)};this.addTabstopMarkers=function(m){var n=this.editor.session;m.forEach(function(o){if(!o.markerId){o.markerId=n.addMarker(o,"ace_snippet-marker","text")}})};this.removeTabstopMarkers=function(m){var n=this.editor.session;m.forEach(function(o){n.removeMarker(o.markerId);o.markerId=null})};this.removeRange=function(m){var n=m.tabstop.indexOf(m);m.tabstop.splice(n,1);n=this.ranges.indexOf(m);this.ranges.splice(n,1);this.editor.session.removeMarker(m.markerId)};this.keyboardHandler=new h();this.keyboardHandler.bindKeys({Tab:function(m){if(f.snippetManager&&f.snippetManager.expandWithTab(m)){return}m.tabstopManager.tabNext(1)},"Shift-Tab":function(m){m.tabstopManager.tabNext(-1)},Esc:function(m){m.tabstopManager.detach()},Return:function(m){return false}})}).call(i.prototype);var k=function(m,n){if(m.row==0){m.column+=n.column}m.row+=n.row};var g=function(m,n){if(m.row==n.row){m.column-=n.column}m.row-=n.row};e("./lib/dom").importCssString(".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}");f.snippetManager=new a()});(function(){window.require(["ace/ext/emmet"],function(){})})();(function(){window.require(["ace/ext/error_marker"],function(){})})();define("ace/ext/keybinding_menu",["require","exports","module","ace/editor","ace/ext/menu_tools/overlay_page","ace/ext/menu_tools/get_editor_keyboard_shortcuts"],function(c,b,e){var a=c("ace/editor").Editor;function d(j){if(!document.getElementById("kbshortcutmenu")){var k=c("./menu_tools/overlay_page").overlayPage;var i=c("./menu_tools/get_editor_keyboard_shortcuts").getEditorKeybordShortcuts;var h=i(j);var g=document.createElement("div");var f=h.reduce(function(l,m){return l+'
'+m.command+' : '+m.key+"
"},"");g.id="kbshortcutmenu";g.innerHTML="

Keyboard Shortcuts

"+f+"";k(j,g,"0","0","0",null)}}e.exports.init=function(f){a.prototype.showKeyboardShortcuts=function(){d(this)};f.commands.addCommands([{name:"showKeyboardShortcuts",bindKey:{win:"Ctrl-Alt-h",mac:"Command-Alt-h"},exec:function(h,g){h.showKeyboardShortcuts()}}])}});define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"],function(b,a,c){var f=b("../../lib/dom");var d="#ace_settingsmenu, #kbshortcutmenu {background-color: #F7F7F7;color: black;box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);padding: 1em 0.5em 2em 1em;overflow: auto;position: absolute;margin: 0;bottom: 0;right: 0;top: 0;z-index: 9991;cursor: default;}.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);background-color: rgba(255, 255, 255, 0.6);color: black;}.ace_optionsMenuEntry:hover {background-color: rgba(100, 100, 100, 0.1);-webkit-transition: all 0.5s;transition: all 0.3s}.ace_closeButton {background: rgba(245, 146, 146, 0.5);border: 1px solid #F48A8A;border-radius: 50%;padding: 7px;position: absolute;right: -8px;top: -8px;z-index: 1000;}.ace_closeButton{background: rgba(245, 146, 146, 0.9);}.ace_optionsMenuKey {color: darkslateblue;font-weight: bold;}.ace_optionsMenuCommand {color: darkcyan;font-weight: normal;}";f.importCssString(d);c.exports.overlayPage=function e(l,o,n,p,g,j){n=n?"top: "+n+";":"";g=g?"bottom: "+g+";":"";p=p?"right: "+p+";":"";j=j?"left: "+j+";":"";var q=document.createElement("div");var m=document.createElement("div");function k(r){if(r.keyCode===27){q.click()}}q.style.cssText="margin: 0; padding: 0; position: fixed; top:0; bottom:0; left:0; right:0;z-index: 9990; background-color: rgba(0, 0, 0, 0.3);";q.addEventListener("click",function(){document.removeEventListener("keydown",k);q.parentNode.removeChild(q);l.focus();q=null});document.addEventListener("keydown",k);m.style.cssText=n+p+g+j;m.addEventListener("click",function(r){r.stopPropagation()});var h=f.createElement("div");h.style.position="relative";var i=f.createElement("div");i.className="ace_closeButton";i.addEventListener("click",function(){q.click()});h.appendChild(i);m.appendChild(h);m.appendChild(o);q.appendChild(m);document.body.appendChild(q);l.blur()}});define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",["require","exports","module","ace/lib/keys"],function(b,a,c){var d=b("../../lib/keys");c.exports.getEditorKeybordShortcuts=function(h){var e=d.KEY_MODS;var g=[];var f={};h.keyBinding.$handlers.forEach(function(n){var m=n.commandKeyBinding;for(var l in m){var j=parseInt(l);if(j==-1){j=""}else{if(isNaN(j)){j=l}else{j=""+(j&e.command?"Cmd-":"")+(j&e.ctrl?"Ctrl-":"")+(j&e.alt?"Alt-":"")+(j&e.shift?"Shift-":"")}}for(var k in m[l]){var o=m[l][k];if(typeof o!="string"){o=o.name}if(f[o]){f[o].key+="|"+j+k}else{f[o]={key:j+k,command:o};g.push(f[o])}}}});return g}});(function(){window.require(["ace/ext/keybinding_menu"],function(){})})();define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/autocomplete/text_completer","ace/editor"],function(f,g,b){var a=f("../snippets").snippetManager;var k=f("../autocomplete").Autocomplete;var e=f("../config");var o=f("../autocomplete/text_completer");var i={getCompletions:function(q,t,v,s,u){var r=q.session.getState(v.row);var p=t.$mode.getCompletions(r,t,v,s);u(null,p)}};var j={getCompletions:function(q,t,v,s,u){var r=a.snippetMap;var p=[];a.getActiveScopes(q).forEach(function(A){var y=r[A]||[];for(var x=y.length;x--;){var z=y[x];var w=z.name||z.tabTrigger;if(!w){continue}p.push({caption:w,snippet:z.content,meta:z.tabTrigger&&!z.name?z.tabTrigger+"\u21E5 ":"snippet"})}},this);u(null,p)}};var d=[j,o,i];g.addCompleter=function(p){d.push(p)};var m={name:"expandSnippet",exec:function(p){var q=a.expandWithTab(p);if(!q){p.execCommand("indent")}},bindKey:"tab"};var n=function(q,p){l(p.session.$mode)};var l=function(p){var q=p.$id;if(!a.files){a.files={}}c(q);if(p.modes){p.modes.forEach(l)}};var c=function(q){if(!q||a.files[q]){return}var p=q.replace("mode","snippets");a.files[q]={};e.loadModule(p,function(r){if(r){a.files[q]=r;r.snippets=a.parseSnippetFile(r.snippetText);a.register(r.snippets,r.scope);if(r.includeScopes){a.snippetMap[r.scope].includeScopes=r.includeScopes;r.includeScopes.forEach(function(s){c("ace/mode/"+s)})}}})};var h=f("../editor").Editor;f("../config").defineOptions(h.prototype,"editor",{enableBasicAutocompletion:{set:function(p){if(p){this.completers=d;this.commands.addCommand(k.startCommand)}else{this.commands.removeCommand(k.startCommand)}},value:false},enableSnippets:{set:function(p){if(p){this.commands.addCommand(m);this.on("changeMode",n);n(null,this)}else{this.commands.removeCommand(m);this.off("changeMode",n)}},value:false}})});define("ace/snippets",["require","exports","module","ace/lib/lang","ace/range","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom"],function(e,f,c){var b=e("./lib/lang");var d=e("./range").Range;var h=e("./keyboard/hash_handler").HashHandler;var j=e("./tokenizer").Tokenizer;var l=d.comparePoints;var a=function(){this.snippetMap={};this.snippetNameMap={}};(function(){this.getTokenizer=function(){function m(q,p,o){q=q.substr(1);if(/^\d+$/.test(q)&&!o.inFormatString){return[{tabstopId:parseInt(q,10)}]}return[{text:q}]}function n(o){return"(?:[^\\\\"+o+"]|\\\\.)"}a.$tokenizer=new j({start:[{regex:/:/,onMatch:function(q,p,o){if(o.length&&o[0].expectIf){o[0].expectIf=false;o[0].elseBranch=o[0];return[o[0]]}return":"}},{regex:/\\./,onMatch:function(r,q,o){var p=r[1];if(p=="}"&&o.length){r=p}else{if("`$\\".indexOf(p)!=-1){r=p}else{if(o.inFormatString){if(p=="n"){r="\n"}else{if(p=="t"){r="\n"}else{if("ulULE".indexOf(p)!=-1){r={changeCase:p,local:p>"a"}}}}}}}return[r]}},{regex:/}/,onMatch:function(q,p,o){return[o.length?o.shift():q]}},{regex:/\$(?:\d+|\w+)/,onMatch:m},{regex:/\$\{[\dA-Z_a-z]+/,onMatch:function(r,q,o){var p=m(r.substr(1),q,o);o.unshift(p[0]);return p},next:"snippetVar"},{regex:/\n/,token:"newline",merge:false}],snippetVar:[{regex:"\\|"+n("\\|")+"*\\|",onMatch:function(q,p,o){o[0].choices=q.slice(1,-1).split(",")},next:"start"},{regex:"/("+n("/")+"+)/(?:("+n("/")+"*)/)(\\w*):?",onMatch:function(r,q,o){var p=o[0];p.fmtString=r;r=this.splitRegex.exec(r);p.guard=r[1];p.fmt=r[2];p.flag=r[3];return""},next:"start"},{regex:"`"+n("`")+"*`",onMatch:function(q,p,o){o[0].code=q.splice(1,-1);return""},next:"start"},{regex:"\\?",onMatch:function(q,p,o){if(o[0]){o[0].expectIf=true}},next:"start"},{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"start"}],formatString:[{regex:"/("+n("/")+"+)/",token:"regex"},{regex:"",onMatch:function(q,p,o){o.inFormatString=true},next:"start"}]});a.prototype.getTokenizer=function(){return a.$tokenizer};return a.$tokenizer};this.tokenizeTmSnippet=function(n,m){return this.getTokenizer().getLineTokens(n,m).tokens.map(function(o){return o.value||o})};this.$getDefaultValue=function(p,m){if(/^[A-Z]\d+$/.test(m)){var n=m.substr(1);return(this.variables[m[0]+"__"]||{})[n]}if(/^\d+$/.test(m)){return(this.variables.__||{})[m]}m=m.replace(/^TM_/,"");if(!p){return}var o=p.session;switch(m){case"CURRENT_WORD":var q=o.getWordRange();case"SELECTION":case"SELECTED_TEXT":return o.getTextRange(q);case"CURRENT_LINE":return o.getLine(p.getCursorPosition().row);case"PREV_LINE":return o.getLine(p.getCursorPosition().row-1);case"LINE_INDEX":return p.getCursorPosition().column;case"LINE_NUMBER":return p.getCursorPosition().row+1;case"SOFT_TABS":return o.getUseSoftTabs()?"YES":"NO";case"TAB_SIZE":return o.getTabSize();case"FILENAME":case"FILEPATH":return"";case"FULLNAME":return"Ace"}};this.variables={};this.getVariableValue=function(m,n){if(this.variables.hasOwnProperty(n)){return this.variables[n](m,n)||""}return this.$getDefaultValue(m,n)||""};this.tmStrFormat=function(t,r,q){var n=r.flag||"";var p=r.guard;p=new RegExp(p,n.replace(/[^gi]/,""));var o=this.tokenizeTmSnippet(r.fmt,"formatString");var m=this;var s=t.replace(p,function(){m.variables.__=arguments;var x=m.resolveVariables(o,q);var y="E";for(var u=0;u=0){u.splice(r,1)}}}if(o.content){m(o)}else{if(Array.isArray(o)){o.forEach(m)}}};this.parseSnippetFile=function(t){t=t.replace(/\r/g,"");var s=[],n={};var v=/^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm;var p;while(p=v.exec(t)){if(p[1]){try{n=JSON.parse(p[1]);s.push(n)}catch(r){}}if(p[4]){n.content=p[4].replace(/^\t/gm,"");s.push(n);n={}}else{var u=p[2],o=p[3];if(u=="regex"){var q=/\/((?:[^\/\\]|\\.)*)|$/g;n.guard=q.exec(o)[1];n.trigger=q.exec(o)[1];n.endTrigger=q.exec(o)[1];n.endGuard=q.exec(o)[1]}else{if(u=="snippet"){n.tabTrigger=o.match(/^\S*/)[0];if(!n.name){n.name=o}}else{n[u]=o}}}}return s};this.getSnippetByName=function(m,n){var p=this.snippetNameMap;var o;this.getActiveScopes(n).some(function(r){var q=p[r];if(q){o=q[m]}return !!o},this);return o}}).call(a.prototype);var i=function(m){if(m.tabstopManager){return m.tabstopManager}m.tabstopManager=this;this.$onChange=this.onChange.bind(this);this.$onChangeSelection=b.delayedCall(this.onChangeSelection.bind(this)).schedule;this.$onChangeSession=this.onChangeSession.bind(this);this.$onAfterExec=this.onAfterExec.bind(this);this.attach(m)};(function(){this.attach=function(m){this.index=-1;this.ranges=[];this.tabstops=[];this.selectedTabstop=null;this.editor=m;this.editor.on("change",this.$onChange);this.editor.on("changeSelection",this.$onChangeSelection);this.editor.on("changeSession",this.$onChangeSession);this.editor.commands.on("afterExec",this.$onAfterExec);this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)};this.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this);this.ranges=null;this.tabstops=null;this.selectedTabstop=null;this.editor.removeListener("change",this.$onChange);this.editor.removeListener("changeSelection",this.$onChangeSelection);this.editor.removeListener("changeSession",this.$onChangeSession);this.editor.commands.removeListener("afterExec",this.$onAfterExec);this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);this.editor.tabstopManager=null;this.editor=null};this.onChange=function(w){var q=w.data.range;var n=w.data.action[0]=="r";var p=q.start;var s=q.end;var z=p.row;var t=s.row;var y=t-z;var v=s.column-p.column;if(n){y=-y;v=-v}if(!this.$inChange&&n){var x=this.selectedTabstop;var A=!x.some(function(B){return l(B.start,p)<=0&&l(B.end,s)>=0});if(A){return this.detach()}}var o=this.ranges;for(var u=0;u0){this.removeRange(m);u--;continue}if(m.start.row==z&&m.start.column>p.column){m.start.column+=v}if(m.end.row==z&&m.end.column>=p.column){m.end.column+=v}if(m.start.row>=z){m.start.row+=y}if(m.end.row>=z){m.end.row+=y}if(l(m.start,m.end)>0){this.removeRange(m)}}if(!o.length){this.detach()}};this.updateLinkedFields=function(){var p=this.selectedTabstop;if(!p.hasLinkedRanges){return}this.$inChange=true;var q=this.editor.session;var r=q.getTextRange(p.firstNonLinked);for(var o=p.length;o--;){var n=p[o];if(!n.linked){continue}var m=f.snippetManager.tmStrFormat(r,n.original);q.replace(n,m)}this.$inChange=false};this.onAfterExec=function(m){if(m.command&&!m.command.readOnly){this.updateLinkedFields()}};this.onChangeSelection=function(){if(!this.editor){return}var o=this.editor.selection.lead;var n=this.editor.selection.anchor;var r=this.editor.selection.isEmpty();for(var p=this.ranges.length;p--;){if(this.ranges[p].linked){continue}var m=this.ranges[p].contains(o.row,o.column);var q=r||this.ranges[p].contains(n.row,n.column);if(m&&q){return}}this.detach()};this.onChangeSession=function(){this.detach()};this.tabNext=function(o){var m=this.tabstops.length-1;var n=this.index+(o||1);n=Math.min(Math.max(n,0),m);this.selectTabstop(n);if(n==m){this.detach()}};this.selectTabstop=function(m){var o=this.tabstops[this.index];if(o){this.addTabstopMarkers(o)}this.index=m;o=this.tabstops[this.index];if(!o||!o.length){return}this.selectedTabstop=o;if(!this.editor.inVirtualSelectionMode){var p=this.editor.multiSelect;p.toSingleRange(o.firstNonLinked.clone());for(var n=o.length;n--;){if(o.hasLinkedRanges&&o[n].linked){continue}p.addRange(o[n].clone(),true)}}else{this.editor.selection.setRange(o.firstNonLinked)}this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)};this.addTabstops=function(t,u,o){if(!t[0]){var s=d.fromPoints(o,o);g(s.start,u);g(s.end,u);t[0]=[s];t[0].index=0}var q=this.index;var m=[q,0];var n=this.ranges;var r=this.editor;t.forEach(function(x){for(var w=x.length;w--;){var y=x[w];var v=d.fromPoints(y.start,y.end||y.start);k(v.start,u);k(v.end,u);v.original=y;v.tabstop=x;n.push(v);x[w]=v;if(y.fmtString){v.linked=true;x.hasLinkedRanges=true}else{if(!x.firstNonLinked){x.firstNonLinked=v}}}if(!x.firstNonLinked){x.hasLinkedRanges=false}m.push(x);this.addTabstopMarkers(x)},this);m.push(m.splice(2,1)[0]);this.tabstops.splice.apply(this.tabstops,m)};this.addTabstopMarkers=function(m){var n=this.editor.session;m.forEach(function(o){if(!o.markerId){o.markerId=n.addMarker(o,"ace_snippet-marker","text")}})};this.removeTabstopMarkers=function(m){var n=this.editor.session;m.forEach(function(o){n.removeMarker(o.markerId);o.markerId=null})};this.removeRange=function(m){var n=m.tabstop.indexOf(m);m.tabstop.splice(n,1);n=this.ranges.indexOf(m);this.ranges.splice(n,1);this.editor.session.removeMarker(m.markerId)};this.keyboardHandler=new h();this.keyboardHandler.bindKeys({Tab:function(m){if(f.snippetManager&&f.snippetManager.expandWithTab(m)){return}m.tabstopManager.tabNext(1)},"Shift-Tab":function(m){m.tabstopManager.tabNext(-1)},Esc:function(m){m.tabstopManager.detach()},Return:function(m){return false}})}).call(i.prototype);var k=function(m,n){if(m.row==0){m.column+=n.column}m.row+=n.row};var g=function(m,n){if(m.row==n.row){m.column-=n.column}m.row-=n.row};e("./lib/dom").importCssString(".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}");f.snippetManager=new a()});define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/event","ace/lib/lang","ace/snippets"],function(f,g,e){var i=f("./keyboard/hash_handler").HashHandler;var k=f("./autocomplete/popup").AcePopup;var h=f("./autocomplete/util");var c=f("./lib/event");var d=f("./lib/lang");var b=f("./snippets").snippetManager;var j=function(){this.autoInsert=true;this.keyboardHandler=new i();this.keyboardHandler.bindKeys(this.commands);this.blurListener=this.blurListener.bind(this);this.changeListener=this.changeListener.bind(this);this.mousedownListener=this.mousedownListener.bind(this);this.mousewheelListener=this.mousewheelListener.bind(this);this.changeTimer=d.delayedCall(function(){this.updateCompletions(true)}.bind(this))};(function(){this.$init=function(){this.popup=new k(document.body||document.documentElement);this.popup.on("click",function(l){this.insertMatch();l.stop()}.bind(this))};this.openPopup=function(m,p,r){if(!this.popup){this.$init()}this.popup.setData(this.completions.filtered);var o=m.renderer;if(!r){this.popup.setRow(0);this.popup.setFontSize(m.getFontSize());var l=o.layerConfig.lineHeight;var q=o.$cursorLayer.getPixelPosition(this.base,true);q.left-=this.popup.getTextLeftOffset();var n=m.container.getBoundingClientRect();q.top+=n.top-o.layerConfig.offset;q.left+=n.left-m.renderer.scrollLeft;q.left+=o.$gutterLayer.gutterWidth;this.popup.show(q,l)}};this.detach=function(){this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);this.editor.off("changeSelection",this.changeListener);this.editor.off("blur",this.blurListener);this.editor.off("mousedown",this.mousedownListener);this.editor.off("mousewheel",this.mousewheelListener);this.changeTimer.cancel();if(this.popup){this.popup.hide()}this.activated=false;this.completions=this.base=null};this.changeListener=function(l){var m=this.editor.selection.lead;if(m.row!=this.base.row||m.column=l?-1:n+1;break;case"start":n=0;break;case"end":n=l;break}this.popup.setRow(n)};this.insertMatch=function(o){if(!o){o=this.popup.getData(this.popup.getRow())}if(!o){return false}if(o.completer&&o.completer.insertMatch){o.completer.insertMatch(this.editor)}else{if(this.completions.filterText){var l=this.editor.selection.getAllRanges();for(var n=0,m;m=l[n];n++){m.start.column-=this.completions.filterText.length;this.editor.session.remove(m)}}if(o.snippet){b.insertSnippet(this.editor,o.snippet)}else{this.editor.execCommand("insertstring",o.value||o)}}this.detach()};this.commands={Up:function(l){l.completer.goTo("up")},Down:function(l){l.completer.goTo("down")},"Ctrl-Up|Ctrl-Home":function(l){l.completer.goTo("start")},"Ctrl-Down|Ctrl-End":function(l){l.completer.goTo("end")},Esc:function(l){l.completer.detach()},Space:function(l){l.completer.detach();l.insert(" ")},Return:function(l){l.completer.insertMatch()},"Shift-Return":function(l){l.completer.insertMatch(true)},Tab:function(l){l.completer.insertMatch()},PageUp:function(l){l.completer.popup.gotoPageUp()},PageDown:function(l){l.completer.popup.gotoPageDown()}};this.gatherCompletions=function(m,r){var p=m.getSession();var q=m.getCursorPosition();var l=p.getLine(q.row);var o=h.retrievePrecedingIdentifier(l,q.column);this.base=m.getCursorPosition();this.base.column-=o.length;var n=[];h.parForEach(m.completers,function(s,t){s.getCompletions(m,p,q,o,function(v,u){if(!v){n=n.concat(u)}t()})},function(){r(null,{prefix:o,matches:n})});return true};this.showPopup=function(l){if(this.editor){this.detach()}this.activated=true;this.editor=l;if(l.completer!=this){if(l.completer){l.completer.detach()}l.completer=this}l.keyBinding.addKeyboardHandler(this.keyboardHandler);l.on("changeSelection",this.changeListener);l.on("blur",this.blurListener);l.on("mousedown",this.mousedownListener);l.on("mousewheel",this.mousewheelListener);this.updateCompletions()};this.updateCompletions=function(n){if(n&&this.base&&this.completions){var m=this.editor.getCursorPosition();var l=this.editor.session.getTextRange({start:this.base,end:m});if(l==this.completions.filterText){return}this.completions.setFilter(l);if(!this.completions.filtered.length){return this.detach()}this.openPopup(this.editor,l,n);return}this.gatherCompletions(this.editor,function(q,p){var r=p&&p.matches;if(!r||!r.length){return this.detach()}this.completions=new a(r);this.completions.setFilter(p.prefix);var o=this.completions.filtered;if(!o.length){return this.detach()}if(this.autoInsert&&o.length==1){return this.insertMatch(o[0])}this.openPopup(this.editor,p.prefix,n)}.bind(this))};this.cancelContextMenu=function(){var l=function(m){this.editor.off("nativecontextmenu",l);if(m&&m.domEvent){c.stopEvent(m.domEvent)}}.bind(this);setTimeout(l,10);this.editor.on("nativecontextmenu",l)}}).call(j.prototype);j.startCommand={name:"startAutocomplete",exec:function(l){if(!l.completer){l.completer=new j()}l.completer.showPopup(l);l.completer.cancelContextMenu()},bindKey:"Ctrl-Space|Ctrl-Shift-Space|Alt-Space"};var a=function(n,m,l){this.all=n;this.filtered=n;this.filterText=m||""};(function(){this.setFilter=function(n){if(n.length>this.filterText&&n.lastIndexOf(this.filterText,0)===0){var m=this.filtered}else{var m=this.all}this.filterText=n;m=this.filterCompletions(m,this.filterText);m=m.sort(function(p,o){return o.exactMatch-p.exactMatch||o.score-p.score});var l=null;m=m.filter(function(p){var o=p.value||p.caption||p.snippet;if(o===l){return false}l=o;return true});this.filtered=m};this.filterCompletions=function(x,q){var r=[];var z=q.toUpperCase();var t=q.toLowerCase();loop:for(var s=0,A;A=x[s];s++){var B=A.value||A.caption||A.snippet;if(!B){continue}var v=-1;var p=0;var y=0;var w,l;for(var o=0;o=0)?((m<0||n0){if(v===-1){y+=10}y+=l}p=p|(1<=0;){if(!r[s]){continue}if(r[s].meta=="local"&&u.indexOf(r[s].caption)!=-1){r.splice(s,1)}}return r}}).call(a.prototype);g.Autocomplete=j;g.FilteredList=a});define("ace/autocomplete/popup",["require","exports","module","ace/edit_session","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"],function(g,j,e){var a=g("../edit_session").EditSession;var i=g("../virtual_renderer").VirtualRenderer;var k=g("../editor").Editor;var f=g("../range").Range;var b=g("../lib/event");var d=g("../lib/lang");var h=g("../lib/dom");var c=function(n){var o=new i(n);o.$maxLines=4;var m=new k(o);m.setHighlightActiveLine(false);m.setShowPrintMargin(false);m.renderer.setShowGutter(false);m.renderer.setHighlightGutterLine(false);m.$mouseHandler.$focusWaitTimout=0;return m};var l=function(q){var o=h.createElement("div");var m=new c(o);if(q){q.appendChild(o)}o.style.display="none";m.renderer.content.style.cursor="default";m.renderer.setStyle("ace_autocomplete");m.setOption("displayIndentGuides",false);var v=function(){};m.focus=v;m.$isFocused=true;m.renderer.$cursorLayer.restartTimer=v;m.renderer.$cursorLayer.element.style.opacity=0;m.renderer.$maxLines=8;m.renderer.$keepTextAreaAtCursor=false;m.setHighlightActiveLine(false);m.session.highlight("");m.session.$searchHighlight.clazz="ace_highlight-marker";m.on("mousedown",function(w){var x=w.getDocumentPosition();m.selection.moveToPosition(x);t.start.row=t.end.row=x.row;w.stop()});var n;var s=new f(-1,0,-1,Infinity);var t=new f(-1,0,-1,Infinity);t.id=m.session.addMarker(t,"ace_active-line","fullLine");m.setSelectOnHover=function(w){if(!w){s.id=m.session.addMarker(s,"ace_line-hover","fullLine")}else{if(s.id){m.session.removeMarker(s.id);s.id=null}}};m.setSelectOnHover(false);m.on("mousemove",function(w){if(!n){n=w;return}if(n.x==w.x&&n.y==w.y){return}n=w;n.scrollTop=m.renderer.scrollTop;var x=n.getDocumentPosition().row;if(s.start.row!=x){if(!s.id){m.setRow(x)}p(x)}});m.renderer.on("beforeRender",function(){if(n&&s.start.row!=-1){n.$pos=null;var w=n.getDocumentPosition().row;if(!s.id){m.setRow(w)}p(w,true)}});m.renderer.on("afterRender",function(){var y=m.getRow();var w=m.renderer.$textLayer;var x=w.element.childNodes[y-w.config.firstRow];if(x==w.selectedNode){return}if(w.selectedNode){h.removeCssClass(w.selectedNode,"ace_selected")}w.selectedNode=x;if(x){h.addCssClass(x,"ace_selected")}});var u=function(){p(-1)};var p=function(x,w){if(x!==s.start.row){s.start.row=s.end.row=x;if(!w){m.session._emit("changeBackMarker")}m._emit("changeHoverMarker")}};m.getHoveredRow=function(){return s.start.row};b.addListener(m.container,"mouseout",u);m.on("hide",u);m.on("changeSelection",u);m.session.doc.getLength=function(){return m.data.length};m.session.doc.getLine=function(w){var x=m.data[w];if(typeof x=="string"){return x}return(x&&x.value)||""};var r=m.session.bgTokenizer;r.$tokenizeRow=function(x){var z=m.data[x];var A=[];if(!z){return A}if(typeof z=="string"){z={value:z}}if(!z.caption){z.caption=z.value}var y=-1;var w,C;for(var x=0;xx-F&&!A){y.style.top="";y.style.bottom=x-C+"px";m.isTopdown=false}else{C+=F;y.style.top=C+"px";y.style.bottom="";m.isTopdown=true}y.style.display="";this.renderer.$textLayer.checkForSizeChanges();var z=D.left;if(z+y.offsetWidth>w){z=w-y.offsetWidth}y.style.left=z+"px";this._signal("show");n=null;m.isOpen=true};m.getTextLeftOffset=function(){return this.$borderSize+this.renderer.$padding+this.$imageSize};m.$imageSize=0;m.$borderSize=1;return m};h.importCssString(".ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line { background-color: #CAD6FA; z-index: 1;}.ace_autocomplete.ace-tm .ace_line-hover { border: 1px solid #abbffe; margin-top: -1px; background: rgba(233,233,253,0.4);}.ace_autocomplete .ace_line-hover { position: absolute; z-index: 2;}.ace_rightAlignedText { color: gray; display: inline-block; position: absolute; right: 4px; text-align: right; z-index: -1;}.ace_autocomplete .ace_completion-highlight{ color: #000; text-shadow: 0 0 0.01em;}.ace_autocomplete { width: 280px; z-index: 200000; background: #fbfbfb; color: #444; border: 1px lightgray solid; position: fixed; box-shadow: 2px 3px 5px rgba(0,0,0,.2); line-height: 1.4;}");j.AcePopup=l});define("ace/autocomplete/util",["require","exports","module"],function(c,b,d){b.parForEach=function(k,h,j){var g=0;var e=k.length;if(e===0){j()}for(var f=0;f=0;f--){if(g.test(h[f])){e.push(h[f])}else{break}}return e.reverse().join("")};b.retrieveFollowingIdentifier=function(h,j,g){g=g||a;var e=[];for(var f=j;f\s+/g,">");var a=function(m,l,n){var o=g.createElement("div");o.innerHTML=i;this.element=o.firstChild;this.$init();this.setEditor(m)};(function(){this.setEditor=function(l){l.searchBox=this;l.container.appendChild(this.element);this.editor=l};this.$initElements=function(l){this.searchBox=l.querySelector(".ace_search_form");this.replaceBox=l.querySelector(".ace_replace_form");this.searchOptions=l.querySelector(".ace_search_options");this.regExpOption=l.querySelector("[action=toggleRegexpMode]");this.caseSensitiveOption=l.querySelector("[action=toggleCaseSensitive]");this.wholeWordOption=l.querySelector("[action=toggleWholeWords]");this.searchInput=this.searchBox.querySelector(".ace_search_field");this.replaceInput=this.replaceBox.querySelector(".ace_search_field")};this.$init=function(){var m=this.element;this.$initElements(m);var l=this;b.addListener(m,"mousedown",function(n){setTimeout(function(){l.activeInput.focus()},0);b.stopPropagation(n)});b.addListener(m,"click",function(p){var n=p.target||p.srcElement;var o=n.getAttribute("action");if(o&&l[o]){l[o]()}else{if(l.$searchBarKb.commands[o]){l.$searchBarKb.commands[o].exec(l)}}b.stopPropagation(p)});b.addCommandKeyListener(m,function(q,o,p){var n=f.keyCodeToString(p);var r=l.$searchBarKb.findKeyCommand(o,n);if(r&&r.exec){r.exec(l);b.stopEvent(q)}});this.$onChange=c.delayedCall(function(){l.find(false,false)});b.addListener(this.searchInput,"input",function(){l.$onChange.schedule(20)});b.addListener(this.searchInput,"focus",function(){l.activeInput=l.searchInput;l.searchInput.value&&l.highlight()});b.addListener(this.replaceInput,"focus",function(){l.activeInput=l.replaceInput;l.searchInput.value&&l.highlight()})};this.$closeSearchBarKb=new j([{bindKey:"Esc",name:"closeSearchBar",exec:function(l){l.searchBox.hide()}}]);this.$searchBarKb=new j();this.$searchBarKb.bindKeys({"Ctrl-f|Command-f|Ctrl-H|Command-Option-F":function(m){var l=m.isReplace=!m.isReplace;m.replaceBox.style.display=l?"":"none";m[l?"replaceInput":"searchInput"].focus()},"Ctrl-G|Command-G":function(l){l.findNext()},"Ctrl-Shift-G|Command-Shift-G":function(l){l.findPrev()},esc:function(l){setTimeout(function(){l.hide()})},Return:function(l){if(l.activeInput==l.replaceInput){l.replace()}l.findNext()},"Shift-Return":function(l){if(l.activeInput==l.replaceInput){l.replace()}l.findPrev()},Tab:function(l){(l.activeInput==l.replaceInput?l.searchInput:l.replaceInput).focus()}});this.$searchBarKb.addCommands([{name:"toggleRegexpMode",bindKey:{win:"Alt-R|Alt-/",mac:"Ctrl-Alt-R|Ctrl-Alt-/"},exec:function(l){l.regExpOption.checked=!l.regExpOption.checked;l.$syncOptions()}},{name:"toggleCaseSensitive",bindKey:{win:"Alt-C|Alt-I",mac:"Ctrl-Alt-R|Ctrl-Alt-I"},exec:function(l){l.caseSensitiveOption.checked=!l.caseSensitiveOption.checked;l.$syncOptions()}},{name:"toggleWholeWords",bindKey:{win:"Alt-B|Alt-W",mac:"Ctrl-Alt-B|Ctrl-Alt-W"},exec:function(l){l.wholeWordOption.checked=!l.wholeWordOption.checked;l.$syncOptions()}}]);this.$syncOptions=function(){g.setCssClass(this.regExpOption,"checked",this.regExpOption.checked);g.setCssClass(this.wholeWordOption,"checked",this.wholeWordOption.checked);g.setCssClass(this.caseSensitiveOption,"checked",this.caseSensitiveOption.checked);this.find(false,false)};this.highlight=function(l){this.editor.session.highlight(l||this.editor.$search.$options.re);this.editor.renderer.updateBackMarkers()};this.find=function(o,m){var n=this.editor.find(this.searchInput.value,{skipCurrent:o,backwards:m,wrap:true,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked});var l=!n&&this.searchInput.value;g.setCssClass(this.searchBox,"ace_nomatch",l);this.editor._emit("findSearchBox",{match:!l});this.highlight()};this.findNext=function(){this.find(true,false)};this.findPrev=function(){this.find(true,true)};this.replace=function(){if(!this.editor.getReadOnly()){this.editor.replace(this.replaceInput.value)}};this.replaceAndFindNext=function(){if(!this.editor.getReadOnly()){this.editor.replace(this.replaceInput.value);this.findNext()}};this.replaceAll=function(){if(!this.editor.getReadOnly()){this.editor.replaceAll(this.replaceInput.value)}};this.hide=function(){this.element.style.display="none";this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);this.editor.focus()};this.show=function(l,m){this.element.style.display="";this.replaceBox.style.display=m?"":"none";this.isReplace=m;if(l){this.searchInput.value=l}this.searchInput.focus();this.searchInput.select();this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb)}}).call(a.prototype);h.SearchBox=a;h.Search=function(l,m){var n=l.searchBox||new a(l);n.show(l.session.getTextRange(),m)}});(function(){window.require(["ace/ext/old_ie"],function(){})})();define("ace/ext/searchbox",["require","exports","module","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/keyboard/hash_handler","ace/lib/keys"],function(e,h,d){var g=e("../lib/dom");var c=e("../lib/lang");var b=e("../lib/event");var k="/* ------------------------------------------------------------------------------------------* Editor Search Form* --------------------------------------------------------------------------------------- */.ace_search {background-color: #ddd;border: 1px solid #cbcbcb;border-top: 0 none;max-width: 297px;overflow: hidden;margin: 0;padding: 4px;padding-right: 6px;padding-bottom: 0;position: absolute;top: 0px;z-index: 99;white-space: normal;}.ace_search.left {border-left: 0 none;border-radius: 0px 0px 5px 0px;left: 0;}.ace_search.right {border-radius: 0px 0px 0px 5px;border-right: 0 none;right: 0;}.ace_search_form, .ace_replace_form {border-radius: 3px;border: 1px solid #cbcbcb;float: left;margin-bottom: 4px;overflow: hidden;}.ace_search_form.ace_nomatch {outline: 1px solid red;}.ace_search_field {background-color: white;border-right: 1px solid #cbcbcb;border: 0 none;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;display: block;float: left;height: 22px;outline: 0;padding: 0 7px;width: 214px;margin: 0;}.ace_searchbtn,.ace_replacebtn {background: #fff;border: 0 none;border-left: 1px solid #dcdcdc;cursor: pointer;display: block;float: left;height: 22px;margin: 0;padding: 0;position: relative;}.ace_searchbtn:last-child,.ace_replacebtn:last-child {border-top-right-radius: 3px;border-bottom-right-radius: 3px;}.ace_searchbtn:disabled {background: none;cursor: default;}.ace_searchbtn {background-position: 50% 50%;background-repeat: no-repeat;width: 27px;}.ace_searchbtn.prev {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=); }.ace_searchbtn.next {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=); }.ace_searchbtn_close {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;border-radius: 50%;border: 0 none;color: #656565;cursor: pointer;display: block;float: right;font-family: Arial;font-size: 16px;height: 14px;line-height: 16px;margin: 5px 1px 9px 5px;padding: 0;text-align: center;width: 14px;}.ace_searchbtn_close:hover {background-color: #656565;background-position: 50% 100%;color: white;}.ace_replacebtn.prev {width: 54px}.ace_replacebtn.next {width: 27px}.ace_button {margin-left: 2px;cursor: pointer;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;overflow: hidden;opacity: 0.7;border: 1px solid rgba(100,100,100,0.23);padding: 1px;-moz-box-sizing: border-box;box-sizing: border-box;color: black;}.ace_button:hover {background-color: #eee;opacity:1;}.ace_button:active {background-color: #ddd;}.ace_button.checked {border-color: #3399ff;opacity:1;}.ace_search_options{margin-bottom: 3px;text-align: right;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;}";var j=e("../keyboard/hash_handler").HashHandler;var f=e("../lib/keys");g.importCssString(k,"ace_searchbox");var i=''.replace(/>\s+/g,">");var a=function(m,l,n){var o=g.createElement("div");o.innerHTML=i;this.element=o.firstChild;this.$init();this.setEditor(m)};(function(){this.setEditor=function(l){l.searchBox=this;l.container.appendChild(this.element);this.editor=l};this.$initElements=function(l){this.searchBox=l.querySelector(".ace_search_form");this.replaceBox=l.querySelector(".ace_replace_form");this.searchOptions=l.querySelector(".ace_search_options");this.regExpOption=l.querySelector("[action=toggleRegexpMode]");this.caseSensitiveOption=l.querySelector("[action=toggleCaseSensitive]");this.wholeWordOption=l.querySelector("[action=toggleWholeWords]");this.searchInput=this.searchBox.querySelector(".ace_search_field");this.replaceInput=this.replaceBox.querySelector(".ace_search_field")};this.$init=function(){var m=this.element;this.$initElements(m);var l=this;b.addListener(m,"mousedown",function(n){setTimeout(function(){l.activeInput.focus()},0);b.stopPropagation(n)});b.addListener(m,"click",function(p){var n=p.target||p.srcElement;var o=n.getAttribute("action");if(o&&l[o]){l[o]()}else{if(l.$searchBarKb.commands[o]){l.$searchBarKb.commands[o].exec(l)}}b.stopPropagation(p)});b.addCommandKeyListener(m,function(q,o,p){var n=f.keyCodeToString(p);var r=l.$searchBarKb.findKeyCommand(o,n);if(r&&r.exec){r.exec(l);b.stopEvent(q)}});this.$onChange=c.delayedCall(function(){l.find(false,false)});b.addListener(this.searchInput,"input",function(){l.$onChange.schedule(20)});b.addListener(this.searchInput,"focus",function(){l.activeInput=l.searchInput;l.searchInput.value&&l.highlight()});b.addListener(this.replaceInput,"focus",function(){l.activeInput=l.replaceInput;l.searchInput.value&&l.highlight()})};this.$closeSearchBarKb=new j([{bindKey:"Esc",name:"closeSearchBar",exec:function(l){l.searchBox.hide()}}]);this.$searchBarKb=new j();this.$searchBarKb.bindKeys({"Ctrl-f|Command-f|Ctrl-H|Command-Option-F":function(m){var l=m.isReplace=!m.isReplace;m.replaceBox.style.display=l?"":"none";m[l?"replaceInput":"searchInput"].focus()},"Ctrl-G|Command-G":function(l){l.findNext()},"Ctrl-Shift-G|Command-Shift-G":function(l){l.findPrev()},esc:function(l){setTimeout(function(){l.hide()})},Return:function(l){if(l.activeInput==l.replaceInput){l.replace()}l.findNext()},"Shift-Return":function(l){if(l.activeInput==l.replaceInput){l.replace()}l.findPrev()},Tab:function(l){(l.activeInput==l.replaceInput?l.searchInput:l.replaceInput).focus()}});this.$searchBarKb.addCommands([{name:"toggleRegexpMode",bindKey:{win:"Alt-R|Alt-/",mac:"Ctrl-Alt-R|Ctrl-Alt-/"},exec:function(l){l.regExpOption.checked=!l.regExpOption.checked;l.$syncOptions()}},{name:"toggleCaseSensitive",bindKey:{win:"Alt-C|Alt-I",mac:"Ctrl-Alt-R|Ctrl-Alt-I"},exec:function(l){l.caseSensitiveOption.checked=!l.caseSensitiveOption.checked;l.$syncOptions()}},{name:"toggleWholeWords",bindKey:{win:"Alt-B|Alt-W",mac:"Ctrl-Alt-B|Ctrl-Alt-W"},exec:function(l){l.wholeWordOption.checked=!l.wholeWordOption.checked;l.$syncOptions()}}]);this.$syncOptions=function(){g.setCssClass(this.regExpOption,"checked",this.regExpOption.checked);g.setCssClass(this.wholeWordOption,"checked",this.wholeWordOption.checked);g.setCssClass(this.caseSensitiveOption,"checked",this.caseSensitiveOption.checked);this.find(false,false)};this.highlight=function(l){this.editor.session.highlight(l||this.editor.$search.$options.re);this.editor.renderer.updateBackMarkers()};this.find=function(o,m){var n=this.editor.find(this.searchInput.value,{skipCurrent:o,backwards:m,wrap:true,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked});var l=!n&&this.searchInput.value;g.setCssClass(this.searchBox,"ace_nomatch",l);this.editor._emit("findSearchBox",{match:!l});this.highlight()};this.findNext=function(){this.find(true,false)};this.findPrev=function(){this.find(true,true)};this.replace=function(){if(!this.editor.getReadOnly()){this.editor.replace(this.replaceInput.value)}};this.replaceAndFindNext=function(){if(!this.editor.getReadOnly()){this.editor.replace(this.replaceInput.value);this.findNext()}};this.replaceAll=function(){if(!this.editor.getReadOnly()){this.editor.replaceAll(this.replaceInput.value)}};this.hide=function(){this.element.style.display="none";this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);this.editor.focus()};this.show=function(l,m){this.element.style.display="";this.replaceBox.style.display=m?"":"none";this.isReplace=m;if(l){this.searchInput.value=l}this.searchInput.focus();this.searchInput.select();this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb)}}).call(a.prototype);h.SearchBox=a;h.Search=function(l,m){var n=l.searchBox||new a(l);n.show(l.session.getTextRange(),m)}});(function(){window.require(["ace/ext/searchbox"],function(){})})();define("ace/ext/settings_menu",["require","exports","module","ace/ext/menu_tools/generate_settings_menu","ace/ext/menu_tools/overlay_page","ace/editor"],function(c,a,e){var b=c("./menu_tools/generate_settings_menu").generateSettingsMenu;var f=c("./menu_tools/overlay_page").overlayPage;function d(g){var h=document.getElementById("ace_settingsmenu");if(!h){f(g,b(g),"0","0","0")}}e.exports.init=function(h){var g=c("ace/editor").Editor;g.prototype.showSettingsMenu=function(){d(this)}}});define("ace/ext/menu_tools/generate_settings_menu",["require","exports","module","ace/ext/menu_tools/element_generator","ace/ext/menu_tools/add_editor_menu_options","ace/ext/menu_tools/get_set_functions"],function(f,c,g){var e=f("./element_generator");var b=f("./add_editor_menu_options").addEditorMenuOptions;var a=f("./get_set_functions").getSetFunctions;g.exports.generateSettingsMenu=function d(i){var k=[];function l(){k.sort(function(q,p){var o=q.getAttribute("contains");var r=p.getAttribute("contains");return o.localeCompare(r)})}function h(){var o=document.createElement("div");o.setAttribute("id","ace_settingsmenu");k.forEach(function(p){o.appendChild(p)});return o}function m(r,o,q,s){var p;var t=document.createElement("div");t.setAttribute("contains",q);t.setAttribute("class","ace_optionsMenuEntry");t.setAttribute("style","clear: both;");t.appendChild(e.createLabel(q.replace(/^set/,"").replace(/([A-Z])/g," $1").trim(),q));if(Array.isArray(s)){p=e.createSelection(q,s,o);p.addEventListener("change",function(v){try{i.menuOptions[v.target.id].forEach(function(w){if(w.textContent!==v.target.textContent){delete w.selected}});r[v.target.id](v.target.value)}catch(u){throw new Error(u)}})}else{if(typeof s==="boolean"){p=e.createCheckbox(q,s,o);p.addEventListener("change",function(v){try{r[v.target.id](!!v.target.checked)}catch(u){throw new Error(u)}})}else{p=e.createInput(q,s,o);p.addEventListener("change",function(v){try{if(v.target.value==="true"){r[v.target.id](true)}else{if(v.target.value==="false"){r[v.target.id](false)}else{r[v.target.id](v.target.value)}}}catch(u){throw new Error(u)}})}}p.style.cssText="float:right;";t.appendChild(p);return t}function n(r,s,o,q){var t=i.menuOptions[r];var p=s[q]();if(typeof p=="object"){p=p.$id}t.forEach(function(u){if(u.value===p){u.selected="selected"}});return m(s,o,r,t)}function j(r){var q=r.functionName;var t=r.parentObj;var o=r.parentName;var u;var p=q.replace(/^set/,"get");if(i.menuOptions[q]!==undefined){k.push(n(q,t,o,p))}else{if(typeof t[p]==="function"){try{u=t[p]();if(typeof u==="object"){u=u.$id}k.push(m(t,o,q,u))}catch(s){}}}}b(i);a(i).forEach(function(o){j(o)});l();return h()}});define("ace/ext/menu_tools/element_generator",["require","exports","module"],function(d,a,f){f.exports.createOption=function c(k){var j;var i=document.createElement("option");for(j in k){if(k.hasOwnProperty(j)){if(j==="selected"){i.setAttribute(j,k[j])}else{i[j]=k[j]}}}return i};f.exports.createCheckbox=function h(l,k,i){var j=document.createElement("input");j.setAttribute("type","checkbox");j.setAttribute("id",l);j.setAttribute("name",l);j.setAttribute("value",k);j.setAttribute("class",i);if(k){j.setAttribute("checked","checked")}return j};f.exports.createInput=function b(l,k,i){var j=document.createElement("input");j.setAttribute("type","text");j.setAttribute("id",l);j.setAttribute("name",l);j.setAttribute("value",k);j.setAttribute("class",i);return j};f.exports.createLabel=function e(k,j){var i=document.createElement("label");i.setAttribute("for",j);i.textContent=k;return i};f.exports.createSelection=function g(l,j,i){var k=document.createElement("select");k.setAttribute("id",l);k.setAttribute("name",l);k.setAttribute("class",i);j.forEach(function(m){k.appendChild(f.exports.createOption(m))});return k}});define("ace/ext/menu_tools/add_editor_menu_options",["require","exports","module","ace/ext/modelist","ace/ext/themelist"],function(c,b,d){d.exports.addEditorMenuOptions=function a(f){var g=c("../modelist");var e=c("../themelist");f.menuOptions={setNewLineMode:[{textContent:"unix",value:"unix"},{textContent:"windows",value:"windows"},{textContent:"auto",value:"auto"}],setTheme:[],setMode:[],setKeyboardHandler:[{textContent:"ace",value:""},{textContent:"vim",value:"ace/keyboard/vim"},{textContent:"emacs",value:"ace/keyboard/emacs"}]};f.menuOptions.setTheme=e.themes.map(function(h){return{textContent:h.caption,value:h.theme}});f.menuOptions.setMode=g.modes.map(function(h){return{textContent:h.name,value:h.mode}})}});define("ace/ext/modelist",["require","exports","module"],function(f,g,e){var d=[];function l(p){var q=k.text;var r=p.split(/[\/\\]/).pop();for(var o=0;o 0!"}if(m==this.$splits){return}else{if(m>this.$splits){while(this.$splitsm){l=this.$editors[this.$splits-1];this.$container.removeChild(l.container);this.$splits--}}}this.resize()};this.getSplits=function(){return this.$splits};this.getEditor=function(l){return this.$editors[l]};this.getCurrentEditor=function(){return this.$cEditor};this.focus=function(){this.$cEditor.focus()};this.blur=function(){this.$cEditor.blur()};this.setTheme=function(l){this.$editors.forEach(function(m){m.setTheme(l)})};this.setKeyboardHandler=function(l){this.$editors.forEach(function(m){m.setKeyboardHandler(l)})};this.forEach=function(m,l){this.$editors.forEach(m,l)};this.$fontSize="";this.setFontSize=function(l){this.$fontSize=l;this.forEach(function(m){m.setFontSize(l)})};this.$cloneSession=function(o){var m=new a(o.getDocument(),o.getMode());var n=o.getUndoManager();if(n){var l=new j(n,m);m.setUndoManager(l)}m.$informUndoManager=b.delayedCall(function(){m.$deltas=[]});m.setTabSize(o.getTabSize());m.setUseSoftTabs(o.getUseSoftTabs());m.setOverwrite(o.getOverwrite());m.setBreakpoints(o.getBreakpoints());m.setUseWrapMode(o.getUseWrapMode());m.setUseWorker(o.getUseWorker());m.setWrapLimitRange(o.$wrapLimitRange.min,o.$wrapLimitRange.max);m.$foldData=o.$cloneFoldData();return m};this.setSession=function(o,l){var m;if(l==null){m=this.$cEditor}else{m=this.$editors[l]}var n=this.$editors.some(function(p){return p.session===o});if(n){o=this.$cloneSession(o)}m.setSession(o);return o};this.getOrientation=function(){return this.$orientation};this.setOrientation=function(l){if(this.$orientation==l){return}this.$orientation=l;this.resize()};this.resize=function(){var p=this.$container.clientWidth;var m=this.$container.clientHeight;var o;if(this.$orientation==this.BESIDE){var q=p/this.$splits;for(var n=0;n");if(!m){k.push("")}j.$renderLine(k,n,true,false);k.push("\n")}var p="
"+k.join("")+"
";j.destroy();return{css:i+o.cssText,html:p,session:s}};b.exports=e;b.exports.highlight=e});(function(){window.require(["ace/ext/static_highlight"],function(){})})();define("ace/ext/statusbar",["require","exports","module","ace/lib/dom","ace/lib/lang"],function(c,b,d){var f=c("ace/lib/dom");var e=c("ace/lib/lang");var a=function(i,g){this.element=f.createElement("div");this.element.className="ace_status-indicator";this.element.style.cssText="display: inline-block;";g.appendChild(this.element);var h=e.delayedCall(function(){this.updateStatus(i)}.bind(this));i.on("changeStatus",function(){h.schedule(100)});i.on("changeSelection",function(){h.schedule(100)})};(function(){this.updateStatus=function(h){var g=[];function j(m,l){m&&g.push(m,l||"|")}if(h.$vimModeHandler){j(h.$vimModeHandler.getStatusText())}else{if(h.commands.recording){j("REC")}}var k=h.selection.lead;j(k.row+":"+k.column," ");if(!h.selection.isEmpty()){var i=h.getSelectionRange();j("("+(i.end.row-i.start.row)+":"+(i.end.column-i.start.column)+")")}g.pop();this.element.textContent=g.join("")}}).call(a.prototype);b.StatusBar=a});(function(){window.require(["ace/ext/statusbar"],function(){})})();define("ace/ext/textarea",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/net","ace/ace","ace/theme/textmate","ace/mode/text"],function(d,f,b){var a=d("../lib/event");var h=d("../lib/useragent");var j=d("../lib/net");var c=d("../ace");d("../theme/textmate");b.exports=f=c;var i=function(p,n,q){var o=p.style[q];if(!o){if(window.getComputedStyle){o=window.getComputedStyle(p,"").getPropertyValue(q)}else{o=p.currentStyle[q]}}if(!o||o=="auto"||o=="intrinsic"){o=n.style[q]}return o};function g(p,o){for(var n in o){p.style[n]=o[n]}}function m(r,p){if(r.type!="textarea"){throw new Error("Textarea required!")}var n=r.parentNode;var o=document.createElement("div");var s=function(){var v="position:relative;";["margin-top","margin-left","margin-right","margin-bottom"].forEach(function(w){v+=w+":"+i(r,o,w)+";"});var u=i(r,o,"width")||(r.clientWidth+"px");var t=i(r,o,"height")||(r.clientHeight+"px");v+="height:"+t+";width:"+u+";";v+="display:inline-block;";o.setAttribute("style",v)};a.addListener(window,"resize",s);s();n.insertBefore(o,r.nextSibling);while(n!==document){if(n.tagName.toUpperCase()==="FORM"){var q=n.onsubmit;n.onsubmit=function(t){r.value=p();if(q){q.call(this,t)}};break}n=n.parentNode}return o}f.transformTextarea=function(s,w){var u;var o=m(s,function(){return u.getValue()});s.style.display="none";o.style.background="white";var p=document.createElement("div");g(p,{top:"0px",left:"0px",right:"0px",bottom:"0px",border:"1px solid gray",position:"absolute"});o.appendChild(p);var q=document.createElement("div");g(q,{position:"absolute",right:"0px",bottom:"0px",background:"red",cursor:"nw-resize",borderStyle:"solid",borderWidth:"9px 8px 10px 9px",width:"2px",borderColor:"lightblue gray gray lightblue",zIndex:101});var v=document.createElement("div");var r={top:"0px",left:"20%",right:"0px",bottom:"0px",position:"absolute",padding:"5px",zIndex:100,color:"white",display:"none",overflow:"auto",fontSize:"14px",boxShadow:"-5px 2px 3px gray"};if(!h.isOldIE){r.backgroundColor="rgba(0, 0, 0, 0.6)"}else{r.backgroundColor="#333"}g(v,r);o.appendChild(v);var x={};var t=c.edit(p);u=t.getSession();u.setValue(s.value||s.innerHTML);t.focus();o.appendChild(q);l(t,p,v,c,x,w);e(v,q,t,x);var n="";a.addListener(q,"mousemove",function(B){var A=this.getBoundingClientRect();var z=B.clientX-A.left,C=B.clientY-A.top;if(z+C<(A.width+A.height)/2){this.style.cursor="pointer";n="toggle"}else{n="resize";this.style.cursor="nw-resize"}});a.addListener(q,"mousedown",function(B){if(n=="toggle"){t.setDisplaySettings();return}o.style.zIndex=100000;var A=o.getBoundingClientRect();var z=A.width+A.left-B.clientX;var y=A.height+A.top-B.clientY;a.capture(q,function(C){o.style.width=C.clientX-A.left+z+"px";o.style.height=C.clientY-A.top+y+"px";t.resize()},function(){})});return t};function k(n,o,p){j.loadScript(n,function(){d([o],p)})}function l(q,n,t,o,v,u){var s=q.getSession();var r=q.renderer;u=u||k;function p(w){return w==="true"||w==true}q.setDisplaySettings=function(x){if(x==null){x=t.style.display=="none"}if(x){t.style.display="block";t.hideButton.focus();q.on("focus",function w(){q.removeListener("focus",w);t.style.display="none"})}else{q.focus()}};q.$setOption=q.setOption;q.setOption=function(w,x){if(v[w]==x){return}switch(w){case"mode":if(x!="text"){u("mode-"+x+".js","ace/mode/"+x,function(){var y=d("../mode/"+x).Mode;s.setMode(new y())})}else{s.setMode(new (d("../mode/text").Mode))}break;case"theme":if(x!="textmate"){u("theme-"+x+".js","ace/theme/"+x,function(){q.setTheme("ace/theme/"+x)})}else{q.setTheme("ace/theme/textmate")}break;case"fontSize":n.style.fontSize=x;break;case"keybindings":switch(x){case"vim":q.setKeyboardHandler("ace/keyboard/vim");break;case"emacs":q.setKeyboardHandler("ace/keyboard/emacs");break;default:q.setKeyboardHandler(null)}break;case"softWrap":switch(x){case"off":s.setUseWrapMode(false);r.setPrintMarginColumn(80);break;case"40":s.setUseWrapMode(true);s.setWrapLimitRange(40,40);r.setPrintMarginColumn(40);break;case"80":s.setUseWrapMode(true);s.setWrapLimitRange(80,80);r.setPrintMarginColumn(80);break;case"free":s.setUseWrapMode(true);s.setWrapLimitRange(null,null);r.setPrintMarginColumn(80);break}break;default:q.$setOption(w,p(x))}v[w]=x};q.getOption=function(w){return v[w]};q.getOptions=function(){return v};q.setOptions(f.options);return q}function e(A,o,v,C){var n=null;var u={mode:"Mode:",gutter:"Display Gutter:",theme:"Theme:",fontSize:"Font Size:",softWrap:"Soft Wrap:",keybindings:"Keyboard",showPrintMargin:"Show Print Margin:",useSoftTabs:"Use Soft Tabs:",showInvisibles:"Show Invisibles"};var z={mode:{text:"Plain",javascript:"JavaScript",xml:"XML",html:"HTML",css:"CSS",scss:"SCSS",python:"Python",php:"PHP",java:"Java",ruby:"Ruby",c_cpp:"C/C++",coffee:"CoffeeScript",json:"json",perl:"Perl",clojure:"Clojure",ocaml:"OCaml",csharp:"C#",haxe:"haXe",svg:"SVG",textile:"Textile",groovy:"Groovy",liquid:"Liquid",Scala:"Scala"},theme:{clouds:"Clouds",clouds_midnight:"Clouds Midnight",cobalt:"Cobalt",crimson_editor:"Crimson Editor",dawn:"Dawn",eclipse:"Eclipse",idle_fingers:"Idle Fingers",kr_theme:"Kr Theme",merbivore:"Merbivore",merbivore_soft:"Merbivore Soft",mono_industrial:"Mono Industrial",monokai:"Monokai",pastel_on_dark:"Pastel On Dark",solarized_dark:"Solarized Dark",solarized_light:"Solarized Light",textmate:"Textmate",twilight:"Twilight",vibrant_ink:"Vibrant Ink"},gutter:n,fontSize:{"10px":"10px","11px":"11px","12px":"12px","14px":"14px","16px":"16px"},softWrap:{off:"Off",40:"40",80:"80",free:"Free"},keybindings:{ace:"ace",vim:"vim",emacs:"emacs"},showPrintMargin:n,useSoftTabs:n,showInvisibles:n};var B=[];B.push("");function p(D,F,H,E){if(!H){D.push("");return}D.push("")}for(var t in C){B.push("");B.push("")}B.push("
SettingValue
",u[t],"");p(B,t,z[t],C[t]);B.push("
");A.innerHTML=B.join("");var w=function(E){var D=E.currentTarget;v.setOption(D.title,D.value)};var y=function(E){var D=E.currentTarget;v.setOption(D.title,D.checked)};var x=A.getElementsByTagName("select");for(var r=0;r0&&!(h%p)&&!(l%p)){w[p]=(w[p]||0)+1}v[l]=(v[l]||0)+1}h=l;while(sj.score){j={score:t,length:s}}}if(j.score&&j.score>1.4){var e=j.length}if(o>k+1){return{ch:"\t",length:e}}if(k+1>o){return{ch:" ",length:e}}};a.detectIndentation=function(g){var f=g.getLines(0,1000);var e=a.$detectIndentation(f)||{};if(e.ch){g.setUseSoftTabs(e.ch==" ")}if(e.length){g.setTabSize(e.length)}return e};a.trimTrailingSpace=function(k,f){var m=k.getDocument();var n=m.getAllLines();var g=f?-1:0;for(var h=0,e=n.length;hg){m.removeInLine(h,j,o.length)}}};a.convertIndentation=function(f,r,x){var q=f.getTabString()[0];var m=f.getTabSize();if(!x){x=m}if(!r){r=q}var h=r=="\t"?r:d.stringRepeat(r,x);var y=f.doc;var e=y.getAllLines();var s={};var g={};for(var v=0,t=e.length;v30){this.$data.shift()}},get:function(q){q=q||1;return this.$data.slice(this.$data.length-q,this.$data.length).reverse().join("\n")},pop:function(){if(this.$data.length>1){this.$data.pop()}return this.get()},rotate:function(){this.$data.unshift(this.$data.pop());return this.get()}}});define("ace/incremental_search",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/search_highlight","ace/commands/incremental_search_commands","ace/lib/dom","ace/commands/command_manager","ace/editor","ace/config"],function(d,h,b){var k=d("./lib/oop");var c=d("./range").Range;var e=d("./search").Search;var l=d("./search_highlight").SearchHighlight;var m=d("./commands/incremental_search_commands");var j=m.IncrementalSearchKeyboardHandler;function g(){this.$options={wrap:false,skipCurrent:false};this.$keyboardHandler=new j(this)}k.inherits(g,e);(function(){this.activate=function(o,n){this.$editor=o;this.$startPos=this.$currentPos=o.getCursorPosition();this.$options.needle="";this.$options.backwards=n;o.keyBinding.addKeyboardHandler(this.$keyboardHandler);this.$originalEditorOnPaste=o.onPaste;o.onPaste=this.onPaste.bind(this);this.$mousedownHandler=o.addEventListener("mousedown",this.onMouseDown.bind(this));this.selectionFix(o);this.statusMessage(true)};this.deactivate=function(o){this.cancelSearch(o);var n=this.$editor;n.keyBinding.removeKeyboardHandler(this.$keyboardHandler);if(this.$mousedownHandler){n.removeEventListener("mousedown",this.$mousedownHandler);delete this.$mousedownHandler}n.onPaste=this.$originalEditorOnPaste;this.message("")};this.selectionFix=function(n){if(n.selection.isEmpty()&&!n.session.$emacsMark){n.clearSelection()}};this.highlight=function(p){var o=this.$editor.session,n=o.$isearchHighlight=o.$isearchHighlight||o.addDynamicMarker(new l(null,"ace_isearch-result","text"));n.setRegexp(p);o._emit("changeBackMarker")};this.cancelSearch=function(n){var o=this.$editor;this.$prevNeedle=this.$options.needle;this.$options.needle="";if(n){o.moveCursorToPosition(this.$startPos);this.$currentPos=this.$startPos}else{o.pushEmacsMark&&o.pushEmacsMark(this.$startPos,false)}this.highlight(null);return c.fromPoints(this.$currentPos,this.$currentPos)};this.highlightAndFindWithNeedle=function(p,n){if(!this.$editor){return null}var o=this.$options;if(n){o.needle=n.call(this,o.needle||"")||""}if(o.needle.length===0){this.statusMessage(true);return this.cancelSearch(true)}o.start=this.$currentPos;var r=this.$editor.session,q=this.find(r);if(q){if(o.backwards){q=c.fromPoints(q.end,q.start)}this.$editor.moveCursorToPosition(q.end);if(p){this.$currentPos=q.end}this.highlight(o.re)}this.statusMessage(q);return q};this.addString=function(n){return this.highlightAndFindWithNeedle(false,function(o){return o+n})};this.removeChar=function(n){return this.highlightAndFindWithNeedle(false,function(o){return o.length>0?o.substring(0,o.length-1):o})};this.next=function(n){n=n||{};this.$options.backwards=!!n.backwards;this.$currentPos=this.$editor.getCursorPosition();return this.highlightAndFindWithNeedle(true,function(o){return n.useCurrentOrPrevSearch&&o.length===0?this.$prevNeedle||"":o})};this.onMouseDown=function(n){this.deactivate();return true};this.onPaste=function(n){this.addString(n)};this.statusMessage=function(o){var n=this.$options,p="";p+=n.backwards?"reverse-":"";p+="isearch: "+n.needle;p+=o?"":" (not found)";this.message(p)};this.message=function(n){if(this.$editor.showCommandLine){this.$editor.showCommandLine(n);this.$editor.focus()}else{console.log(n)}}}).call(g.prototype);h.IncrementalSearch=g;var f=d("./lib/dom");f.importCssString&&f.importCssString(".ace_marker-layer .ace_isearch-result { position: absolute; z-index: 6; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;}div.ace_isearch-result { border-radius: 4px; background-color: rgba(255, 200, 0, 0.5); box-shadow: 0 0 4px rgb(255, 200, 0);}.ace_dark div.ace_isearch-result { background-color: rgb(100, 110, 160); box-shadow: 0 0 4px rgb(80, 90, 140);}","incremental-search-highlighting");var a=d("./commands/command_manager");(function(){this.setupIncrementalSearch=function(n,p){if(this.usesIncrementalSearch==p){return}this.usesIncrementalSearch=p;var o=m.iSearchStartCommands;var q=p?"addCommands":"removeCommands";this[q](o)}}).call(a.CommandManager.prototype);var i=d("./editor").Editor;d("./config").defineOptions(i.prototype,"editor",{useIncrementalSearch:{set:function(n){this.keyBinding.$handlers.forEach(function(o){if(o.setupIncrementalSearch){o.setupIncrementalSearch(this,n)}});this._emit("incrementalSearchSettingChanged",{isEnabled:n})}}})});define("ace/commands/incremental_search_commands",["require","exports","module","ace/config","ace/lib/oop","ace/keyboard/hash_handler","ace/commands/occur_commands"],function(c,a,d){var b=c("../config");var h=c("../lib/oop");var g=c("../keyboard/hash_handler").HashHandler;var f=c("./occur_commands").occurStartCommand;a.iSearchStartCommands=[{name:"iSearch",bindKey:{win:"Ctrl-F",mac:"Command-F"},exec:function(j,i){b.loadModule(["core","ace/incremental_search"],function(l){var k=l.iSearch=l.iSearch||new l.IncrementalSearch();k.activate(j,i.backwards);if(i.jumpToFirstMatch){k.next(i)}})},readOnly:true},{name:"iSearchBackwards",exec:function(i,j){i.execCommand("iSearch",{backwards:true})},readOnly:true},{name:"iSearchAndGo",bindKey:{win:"Ctrl-K",mac:"Command-G"},exec:function(i,j){i.execCommand("iSearch",{jumpToFirstMatch:true,useCurrentOrPrevSearch:true})},readOnly:true},{name:"iSearchBackwardsAndGo",bindKey:{win:"Ctrl-Shift-K",mac:"Command-Shift-G"},exec:function(i){i.execCommand("iSearch",{jumpToFirstMatch:true,backwards:true,useCurrentOrPrevSearch:true})},readOnly:true}];a.iSearchCommands=[{name:"restartSearch",bindKey:{win:"Ctrl-F",mac:"Command-F"},exec:function(i){i.cancelSearch(true)},readOnly:true,isIncrementalSearchCommand:true},{name:"searchForward",bindKey:{win:"Ctrl-S|Ctrl-K",mac:"Ctrl-S|Command-G"},exec:function(i,j){j.useCurrentOrPrevSearch=true;i.next(j)},readOnly:true,isIncrementalSearchCommand:true},{name:"searchBackward",bindKey:{win:"Ctrl-R|Ctrl-Shift-K",mac:"Ctrl-R|Command-Shift-G"},exec:function(i,j){j.useCurrentOrPrevSearch=true;j.backwards=true;i.next(j)},readOnly:true,isIncrementalSearchCommand:true},{name:"extendSearchTerm",exec:function(i,j){i.addString(j)},readOnly:true,isIncrementalSearchCommand:true},{name:"extendSearchTermSpace",bindKey:"space",exec:function(i){i.addString(" ")},readOnly:true,isIncrementalSearchCommand:true},{name:"shrinkSearchTerm",bindKey:"backspace",exec:function(i){i.removeChar()},readOnly:true,isIncrementalSearchCommand:true},{name:"confirmSearch",bindKey:"return",exec:function(i){i.deactivate()},readOnly:true,isIncrementalSearchCommand:true},{name:"cancelSearch",bindKey:"esc|Ctrl-G",exec:function(i){i.deactivate(true)},readOnly:true,isIncrementalSearchCommand:true},{name:"occurisearch",bindKey:"Ctrl-O",exec:function(i){var j=h.mixin({},i.$options);i.deactivate();f.exec(i.$editor,j)},readOnly:true,isIncrementalSearchCommand:true},{name:"yankNextWord",bindKey:"Ctrl-w",exec:function(k){var j=k.$editor,i=j.selection.getRangeOfMovements(function(m){m.moveCursorWordRight()}),l=j.session.getTextRange(i);k.addString(l)},readOnly:true,isIncrementalSearchCommand:true},{name:"yankNextChar",bindKey:"Ctrl-Alt-y",exec:function(k){var j=k.$editor,i=j.selection.getRangeOfMovements(function(m){m.moveCursorRight()}),l=j.session.getTextRange(i);k.addString(l)},readOnly:true,isIncrementalSearchCommand:true},{name:"recenterTopBottom",bindKey:"Ctrl-l",exec:function(i){i.$editor.execCommand("recenterTopBottom")},readOnly:true,isIncrementalSearchCommand:true}];function e(i){this.$iSearch=i}h.inherits(e,g);(function(){this.attach=function(k){var j=this.$iSearch;g.call(this,a.iSearchCommands,k.commands.platform);this.$commandExecHandler=k.commands.addEventListener("exec",function(l){if(!l.command.isIncrementalSearchCommand){return undefined}l.stopPropagation();l.preventDefault();return l.command.exec(j,l.args||{})})};this.detach=function(j){if(!this.$commandExecHandler){return}j.commands.removeEventListener("exec",this.$commandExecHandler);delete this.$commandExecHandler};var i=this.handleKeyboard;this.handleKeyboard=function(n,l,k,o){if(((l===1||l===8)&&k==="v")||(l===1&&k==="y")){return null}var m=i.call(this,n,l,k,o);if(m.command){return m}if(l==-1){var j=this.commands.extendSearchTerm;if(j){return{command:j,args:k}}}return{command:"null",passEvent:l==0||l==4}}}).call(e.prototype);a.IncrementalSearchKeyboardHandler=e});define("ace/commands/occur_commands",["require","exports","module","ace/config","ace/occur","ace/keyboard/hash_handler","ace/lib/oop"],function(d,f,b){var c=d("../config"),a=d("../occur").Occur;var j={name:"occur",exec:function(m,l){var n=!!m.session.$occur;var k=new a().enter(m,l);if(k&&!n){i.installIn(m)}},readOnly:true};var e=[{name:"occurexit",bindKey:"esc|Ctrl-G",exec:function(l){var k=l.session.$occur;if(!k){return}k.exit(l,{});if(!l.session.$occur){i.uninstallFrom(l)}},readOnly:true},{name:"occuraccept",bindKey:"enter",exec:function(l){var k=l.session.$occur;if(!k){return}k.exit(l,{translatePosition:true});if(!l.session.$occur){i.uninstallFrom(l)}},readOnly:true}];var g=d("../keyboard/hash_handler").HashHandler;var h=d("../lib/oop");function i(){}h.inherits(i,g);(function(){this.isOccurHandler=true;this.attach=function(l){g.call(this,e,l.commands.platform);this.$editor=l};var k=this.handleKeyboard;this.handleKeyboard=function(o,m,l,p){var n=k.call(this,o,m,l,p);return(n&&n.command)?n:undefined}}).call(i.prototype);i.installIn=function(l){var k=new this();l.keyBinding.addKeyboardHandler(k);l.commands.addCommands(e)};i.uninstallFrom=function(l){l.commands.removeCommands(e);var k=l.getKeyboardHandler();if(k.isOccurHandler){l.keyBinding.removeKeyboardHandler(k)}};f.occurStartCommand=j});define("ace/occur",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/edit_session","ace/search_highlight","ace/lib/dom"],function(e,h,c){var i=e("./lib/oop");var d=e("./range").Range;var f=e("./search").Search;var a=e("./edit_session").EditSession;var j=e("./search_highlight").SearchHighlight;function b(){}i.inherits(b,f);(function(){this.enter=function(m,l){if(!l.needle){return false}var n=m.getCursorPosition();this.displayOccurContent(m,l);var k=this.originalToOccurPosition(m.session,n);m.moveCursorToPosition(k);return true};this.exit=function(m,l){var n=l.translatePosition&&m.getCursorPosition();var k=n&&this.occurToOriginalPosition(m.session,n);this.displayOriginalContent(m);if(k){m.moveCursorToPosition(k)}return true};this.highlight=function(l,m){var k=l.$occurHighlight=l.$occurHighlight||l.addDynamicMarker(new j(null,"ace_occur-highlight","text"));k.setRegexp(m);l._emit("changeBackMarker")};this.displayOccurContent=function(n,m){this.$originalSession=n.session;var o=this.matchingLines(n.session,m);var k=o.map(function(p){return p.content});var l=new a(k.join("\n"));l.$occur=this;l.$occurMatchingLines=o;n.setSession(l);this.$useEmacsStyleLineStart=this.$originalSession.$useEmacsStyleLineStart;l.$useEmacsStyleLineStart=this.$useEmacsStyleLineStart;this.highlight(l,m.re);l._emit("changeBackMarker")};this.displayOriginalContent=function(k){k.setSession(this.$originalSession);this.$originalSession.$useEmacsStyleLineStart=this.$useEmacsStyleLineStart};this.originalToOccurPosition=function(m,o){var k=m.$occurMatchingLines;var n={row:0,column:0};if(!k){return n}for(var l=0;l1){if(b.inputBuffer.idle&&h[j]){return h[j]}var i=b.inputBuffer.push(k,j);return{command:"null",passEvent:!i}}else{if(j.length==1&&(l===0||l==4)){return{command:"null",passEvent:true}}else{if(j=="esc"&&l===0){return{command:a.stop}}}}}else{if(j=="ctrl-w"){return{command:"removewordleft"}}}}}},attach:function(i){i.on("click",e.onCursorMove);if(d.currentMode!=="insert"){b.coreCommands.stop.exec(i)}i.$vimModeHandler=this;this.updateMacCompositionHandlers(i,true)},detach:function(i){i.removeListener("click",e.onCursorMove);d.noMode(i);d.currentMode="normal";this.updateMacCompositionHandlers(i,false)},actions:b.actions,getStatusText:function(){if(d.currentMode=="insert"){return"INSERT"}if(d.onVisualMode){return(d.onVisualLineMode?"VISUAL LINE ":"VISUAL ")+b.inputBuffer.status}return b.inputBuffer.status}};e.onCursorMove=function(i){b.onCursorMove(i.editor,i);e.onCursorMove.scheduled=false}});define("ace/keyboard/vim/commands",["require","exports","module","ace/lib/lang","ace/keyboard/vim/maps/util","ace/keyboard/vim/maps/motions","ace/keyboard/vim/maps/operators","ace/keyboard/vim/maps/aliases","ace/keyboard/vim/registers"],function(h,x,b){var y=h("../../lib/lang");var a=h("./maps/util");var q=h("./maps/motions");var r=h("./maps/operators");var n=h("./maps/aliases");var u=h("./registers");var m=1;var j=2;var c=3;var s=4;var v=8;var i=function i(A,B,z){while(0B.$size.scrollerHeight){A=B.$size.scrollerHeight/2}if(B.scrollTop>C-A){B.session.setScrollTop(C-A)}if(B.scrollTop+B.$size.scrollerHeight1){C=C=="return"?"\n":C=="tab"?"\t":C}i(function(){A.insert(C)},B||1);A.navigateLeft()}}},R:{fn:function(A,z,B,C){a.insertMode(A);A.setOverwrite(true)}},"~":{fn:function(A,z,B){i(function(){var C=A.selection.getRange();if(C.isEmpty()){C.end.column++}var D=A.session.getTextRange(C);var E=D.toUpperCase();if(E==D){A.navigateRight()}else{A.session.replace(C,E)}},B||1)}},"*":{fn:function(A,z,C,D){A.selection.selectWord();A.findNext();d(A);var B=A.selection.getRange();A.selection.setSelectionRange(B,true)}},"#":{fn:function(A,z,C,D){A.selection.selectWord();A.findPrevious();d(A);var B=A.selection.getRange();A.selection.setSelectionRange(B,true)}},m:{param:true,fn:function(B,z,C,E){var A=B.session;var D=A.vimMarkers||(A.vimMarkers={});var F=B.getCursorPosition();if(!D[E]){D[E]=B.session.doc.createAnchor(F)}D[E].setPosition(F.row,F.column,true)}},n:{fn:function(B,z,D,E){var A=B.getLastSearchOptions();A.backwards=false;B.selection.moveCursorRight();B.selection.clearSelection();B.findNext(A);d(B);var C=B.selection.getRange();C.end.row=C.start.row;C.end.column=C.start.column;B.selection.setSelectionRange(C,true)}},N:{fn:function(B,z,D,E){var A=B.getLastSearchOptions();A.backwards=true;B.findPrevious(A);d(B);var C=B.selection.getRange();C.end.row=C.start.row;C.end.column=C.start.column;B.selection.setSelectionRange(C,true)}},v:{fn:function(A,z,B,C){A.selection.selectRight();a.visualMode(A,false)},acceptsMotion:true},V:{fn:function(A,z,B,D){var C=A.getCursorPosition().row;A.selection.moveTo(C,0);A.selection.selectLineEnd();A.selection.visualLineStart=C;a.visualMode(A,true)},acceptsMotion:true},Y:{fn:function(A,z,B,C){a.copyLine(A)}},p:{fn:function(A,z,C,E){var B=u._default;A.setOverwrite(false);if(B.isLine){var F=A.getCursorPosition();F.column=A.session.getLine(F.row).length;var D=y.stringRepeat("\n"+B.text,C||1);A.session.insert(F,D);A.moveCursorTo(F.row+1,0)}else{A.navigateRight();A.insert(y.stringRepeat(B.text,C||1));A.navigateLeft()}A.setOverwrite(true);A.selection.clearSelection()}},P:{fn:function(A,z,C,E){var B=u._default;A.setOverwrite(false);if(B.isLine){var F=A.getCursorPosition();F.column=0;var D=y.stringRepeat(B.text+"\n",C||1);A.session.insert(F,D);A.moveCursorToPosition(F)}else{A.insert(y.stringRepeat(B.text,C||1))}A.setOverwrite(true);A.selection.clearSelection()}},J:{fn:function(E,C,D,A){var F=E.session;C=E.getSelectionRange();var G={row:C.start.row,column:C.start.column};D=D||C.end.row-C.start.row;var H=Math.min(G.row+(D||1),F.getLength()-1);C.start.column=F.getLine(G.row).length;C.end.column=F.getLine(H).length;C.end.row=H;var I="";for(var B=G.row;B1){C=".,.+"+B+C}if(A.showCommandLine){A.showCommandLine(C)}}},"/":{fn:function(A,z,B,C){if(A.showCommandLine){A.showCommandLine("/")}}},"?":{fn:function(A,z,B,C){if(A.showCommandLine){A.showCommandLine("?")}}},".":{fn:function(A,z,C,D){a.onInsertReplaySequence=o.lastInsertCommands;var B=o.previous;if(B){o.exec(A,B.action,B.param)}}},"ctrl-x":{fn:function(A,z,B,C){A.modifyNumber(-(B||1))}},"ctrl-a":{fn:function(A,z,B,C){A.modifyNumber(B||1)}}};var o=x.inputBuffer={accepting:[m,j,c,s],currentCmd:null,currentCount:"",status:"",operator:null,motion:null,lastInsertCommands:[],push:function(D,C,G){var B=this.status;var E=true;this.idle=false;var F=this.waitingForParam;if(/^numpad\d+$/i.test(C)){C=C.substr(6)}if(F){this.exec(D,F,C)}else{if(!(C==="0"&&!this.currentCount.length)&&(/^\d+$/.test(C)&&this.isAccepting(m))){this.currentCount+=C;this.currentCmd=m;this.accepting=[m,j,c,s]}else{if(!this.operator&&this.isAccepting(j)&&r[C]){this.operator={ch:C,count:this.getCount()};this.currentCmd=j;this.accepting=[m,c,s];this.exec(D,{operator:this.operator})}else{if(q[C]&&this.isAccepting(c)){this.currentCmd=c;var A={operator:this.operator,motion:{ch:C,count:this.getCount()}};if(q[C].param){this.waitForParam(A)}else{this.exec(D,A)}}else{if(n[C]&&this.isAccepting(c)){n[C].operator.count=this.getCount();this.exec(D,n[C])}else{if(k[C]&&this.isAccepting(s)){var z={action:{fn:k[C].fn,count:this.getCount()}};if(k[C].param){this.waitForParam(z)}else{this.exec(D,z)}if(k[C].acceptsMotion){this.idle=false}}else{if(this.operator){this.operator.count=this.getCount();this.exec(D,{operator:this.operator},C)}else{E=C.length==1;this.reset()}}}}}}}if(this.waitingForParam||this.motion||this.operator){this.status+=C}else{if(this.currentCount){this.status=this.currentCount}else{if(this.status){this.status=""}}}if(this.status!=B){D._emit("changeStatus")}return E},waitForParam:function(z){this.waitingForParam=z},getCount:function(){var z=this.currentCount;this.currentCount="";return z&&parseInt(z,10)},exec:function(F,D,A){var B=D.motion;var z=D.operator;var H=D.action;if(!A){A=D.param}if(z){this.previous={action:D,param:A}}if(z&&!F.selection.isEmpty()){if(r[z.ch].selFn){r[z.ch].selFn(F,F.getSelectionRange(),z.count,A);this.reset()}return}else{if(!B&&!H&&z&&A){r[z.ch].fn(F,null,z.count,A);this.reset()}else{if(B){var C=function(I){if(I&&typeof I==="function"){if(B.count&&!E.handlesCount){i(I,B.count,[F,null,B.count,A])}else{I(F,null,B.count,A)}}};var E=q[B.ch];var G=E.sel;if(!z){if((a.onVisualMode||a.onVisualLineMode)&&G){C(E.sel)}else{C(E.nav)}}else{if(G){i(function(){C(E.sel);r[z.ch].fn(F,F.getSelectionRange(),z.count,A)},z.count||1)}}this.reset()}else{if(H){H.fn(F,F.getSelectionRange(),H.count,A);this.reset()}}}}l(F)},isAccepting:function(z){return this.accepting.indexOf(z)!==-1},reset:function(){this.operator=null;this.motion=null;this.currentCount="";this.status="";this.accepting=[m,j,c,s];this.idle=true;this.waitingForParam=null}};function e(z){o.previous={action:{action:{fn:z}}}}x.coreCommands={start:{exec:function f(z){a.insertMode(z);e(f)}},startBeginning:{exec:function g(z){z.navigateLineStart();a.insertMode(z);e(g)}},stop:{exec:function p(z){o.reset();a.onVisualMode=false;a.onVisualLineMode=false;o.lastInsertCommands=a.normalMode(z)}},append:{exec:function t(z){var B=z.getCursorPosition();var A=z.session.getLine(B.row).length;if(A){z.navigateRight()}a.insertMode(z);e(t)}},appendEnd:{exec:function w(z){z.navigateLineEnd();a.insertMode(z);e(w)}}};var l=x.onCursorMove=function(z,D){if(a.currentMode==="insert"||l.running){return}else{if(!z.selection.isEmpty()){l.running=true;if(a.onVisualLineMode){var C=z.selection.visualLineStart;var E=z.getCursorPosition().row;if(C<=E){var B=z.session.getLine(E);z.selection.moveTo(C,0);z.selection.selectTo(E,B.length)}else{var B=z.session.getLine(C);z.selection.moveTo(C,B.length);z.selection.selectTo(E,0)}}l.running=false;return}else{if(D&&(a.onVisualLineMode||a.onVisualMode)){z.selection.clearSelection();a.normalMode(z)}l.running=true;var F=z.getCursorPosition();var A=z.session.getLine(F.row).length;if(A&&F.column===A){z.navigateLeft()}l.running=false}}}});define("ace/keyboard/vim/maps/util",["require","exports","module","ace/keyboard/vim/registers","ace/lib/dom"],function(c,b,d){var a=c("../registers");var e=c("../../../lib/dom");e.importCssString(".insert-mode .ace_cursor{ border-left: 2px solid #333333;}.ace_dark.insert-mode .ace_cursor{ border-left: 2px solid #eeeeee;}.normal-mode .ace_cursor{ border: 0!important; background-color: red; opacity: 0.5;}","vimMode");d.exports={onVisualMode:false,onVisualLineMode:false,currentMode:"normal",noMode:function(f){f.unsetStyle("insert-mode");f.unsetStyle("normal-mode");if(f.commands.recording){f.commands.toggleRecording(f)}f.setOverwrite(false)},insertMode:function(f){this.currentMode="insert";f.setStyle("insert-mode");f.unsetStyle("normal-mode");f.setOverwrite(false);f.keyBinding.$data.buffer="";f.keyBinding.$data.state="insertMode";this.onVisualMode=false;this.onVisualLineMode=false;if(this.onInsertReplaySequence){f.commands.macro=this.onInsertReplaySequence;f.commands.replay(f);this.onInsertReplaySequence=null;this.normalMode(f)}else{f._emit("changeStatus");if(!f.commands.recording){f.commands.toggleRecording(f)}}},normalMode:function(f){this.currentMode="normal";f.unsetStyle("insert-mode");f.setStyle("normal-mode");f.clearSelection();var g;if(!f.getOverwrite()){g=f.getCursorPosition();if(g.column>0){f.navigateLeft()}}f.setOverwrite(true);f.keyBinding.$data.buffer="";f.keyBinding.$data.state="start";this.onVisualMode=false;this.onVisualLineMode=false;f._emit("changeStatus");if(f.commands.recording){f.commands.toggleRecording(f);return f.commands.macro}else{return[]}},visualMode:function(g,f){if((this.onVisualLineMode&&f)||(this.onVisualMode&&!f)){this.normalMode(g);return}g.setStyle("insert-mode");g.unsetStyle("normal-mode");g._emit("changeStatus");if(f){this.onVisualLineMode=true}else{this.onVisualMode=true;this.onVisualLineMode=false}},getRightNthChar:function(h,j,g,k){var f=h.getSession().getLine(j.row);var i=f.substr(j.column+1).split(g);return k~!@#$%^&*|+=\[\]{}`~?]/;var n=/[.\/\\()\"'-:,.;<>~!@#$%^&*|+=\[\]{}`~?]/;var a=/\s/;var l=function(q,s){var r=q.selection;this.range=r.getRange();s=s||r.selectionLead;this.row=s.row;this.col=s.column;var p=q.session.getLine(this.row);var t=q.session.getLength();this.ch=p[this.col]||"\n";this.skippedLines=0;this.next=function(){this.ch=p[++this.col]||this.handleNewLine(1);return this.ch};this.prev=function(){this.ch=p[--this.col]||this.handleNewLine(-1);return this.ch};this.peek=function(u){var v=p[this.col+u];if(v){return v}if(u==-1){return"\n"}if(this.col==p.length-1){return"\n"}return q.session.getLine(this.row+1)[0]||"\n"};this.handleNewLine=function(u){if(u==1){if(this.col==p.length){return"\n"}if(this.row==t-1){return""}this.col=0;this.row++;p=q.session.getLine(this.row);this.skippedLines++;return p[0]||"\n"}if(u==-1){if(this.row===0){return""}this.row--;p=q.session.getLine(this.row);this.col=p.length;this.skippedLines--;return"\n"}};this.debug=function(){console.log(p.substring(0,this.col)+"|"+this.ch+"'"+this.col+"'"+p.substr(this.col+1))}};var f=g("../../../search").Search;var o=new f();function k(q,r,p){o.$options.needle=r;o.$options.backwards=p==-1;return o.find(q.session)}var e=g("../../../range").Range;var m={};c.exports={w:new d(function(p){var q=new l(p);if(q.ch&&n.test(q.ch)){while(q.ch&&n.test(q.ch)){q.next()}}else{while(q.ch&&!j.test(q.ch)){q.next()}}while(q.ch&&a.test(q.ch)&&q.skippedLines<2){q.next()}q.skippedLines==2&&q.prev();return{column:q.col,row:q.row}}),W:new d(function(p){var q=new l(p);while(q.ch&&!(a.test(q.ch)&&!a.test(q.peek(1)))&&q.skippedLines<2){q.next()}if(q.skippedLines==2){q.prev()}else{q.next()}return{column:q.col,row:q.row}}),b:new d(function(p){var q=new l(p);q.prev();while(q.ch&&a.test(q.ch)&&q.skippedLines>-2){q.prev()}if(q.ch&&n.test(q.ch)){while(q.ch&&n.test(q.ch)){q.prev()}}else{while(q.ch&&!j.test(q.ch)){q.prev()}}q.ch&&q.next();return{column:q.col,row:q.row}}),B:new d(function(p){var q=new l(p);q.prev();while(q.ch&&!(!a.test(q.ch)&&a.test(q.peek(-1)))&&q.skippedLines>-2){q.prev()}if(q.skippedLines==-2){q.next()}return{column:q.col,row:q.row}}),e:new d(function(p){var q=new l(p);q.next();while(q.ch&&a.test(q.ch)){q.next()}if(q.ch&&n.test(q.ch)){while(q.ch&&n.test(q.ch)){q.next()}}else{while(q.ch&&!j.test(q.ch)){q.next()}}q.ch&&q.prev();return{column:q.col,row:q.row}}),E:new d(function(p){var q=new l(p);q.next();while(q.ch&&!(!a.test(q.ch)&&a.test(q.peek(1)))){q.next()}return{column:q.col,row:q.row}}),l:{nav:function(q){var s=q.getCursorPosition();var p=s.column;var r=q.session.getLine(s.row).length;if(r&&p!==r){q.navigateRight()}},sel:function(q){var s=q.getCursorPosition();var p=s.column;var r=q.session.getLine(s.row).length;if(r&&p!==r){q.selection.selectRight()}}},h:{nav:function(p){var q=p.getCursorPosition();if(q.column>0){p.navigateLeft()}},sel:function(p){var q=p.getCursorPosition();if(q.column>0){p.selection.selectLeft()}}},H:{nav:function(p){var q=p.renderer.getScrollTopRow();p.moveCursorTo(q)},sel:function(p){var q=p.renderer.getScrollTopRow();p.selection.selectTo(q)}},M:{nav:function(q){var p=q.renderer.getScrollTopRow();var s=q.renderer.getScrollBottomRow();var r=p+((s-p)/2);q.moveCursorTo(r)},sel:function(q){var p=q.renderer.getScrollTopRow();var s=q.renderer.getScrollBottomRow();var r=p+((s-p)/2);q.selection.selectTo(r)}},L:{nav:function(p){var q=p.renderer.getScrollBottomRow();p.moveCursorTo(q)},sel:function(p){var q=p.renderer.getScrollBottomRow();p.selection.selectTo(q)}},k:{nav:function(p){p.navigateUp()},sel:function(p){p.selection.selectUp()}},j:{nav:function(p){p.navigateDown()},sel:function(p){p.selection.selectDown()}},i:{param:true,sel:function(r,q,s,u){switch(u){case"w":r.selection.selectWord();break;case"W":r.selection.selectAWord();break;case"(":case"{":case"[":var t=r.getCursorPosition();var p=r.session.$findClosingBracket(u,t,/paren/);if(!p){return}var v=r.session.$findOpeningBracket(r.session.$brackets[u],t,/paren/);if(!v){return}v.column++;r.selection.setSelectionRange(e.fromPoints(v,p));break;case"'":case'"':case"/":var p=k(r,u,1);if(!p){return}var v=k(r,u,-1);if(!v){return}r.selection.setSelectionRange(e.fromPoints(v.end,p.start));break}}},a:{param:true,sel:function(r,q,s,u){switch(u){case"w":r.selection.selectAWord();break;case"W":r.selection.selectAWord();break;case"(":case"{":case"[":var t=r.getCursorPosition();var p=r.session.$findClosingBracket(u,t,/paren/);if(!p){return}var v=r.session.$findOpeningBracket(r.session.$brackets[u],t,/paren/);if(!v){return}p.column++;r.selection.setSelectionRange(e.fromPoints(v,p));break;case"'":case'"':case"/":var p=k(r,u,1);if(!p){return}var v=k(r,u,-1);if(!v){return}p.column++;r.selection.setSelectionRange(e.fromPoints(v.start,p.end));break}}},f:new d({param:true,handlesCount:true,getPos:function(t,q,u,w,p,r){if(!r){m={ch:"f",param:w}}var v=t.getCursorPosition();var s=i.getRightNthChar(t,v,w,u||1);if(typeof s==="number"){v.column+=s+(p?2:1);return v}}}),F:new d({param:true,handlesCount:true,getPos:function(t,q,u,w,p,r){if(!r){m={ch:"F",param:w}}var v=t.getCursorPosition();var s=i.getLeftNthChar(t,v,w,u||1);if(typeof s==="number"){v.column-=s+1;return v}}}),t:new d({param:true,handlesCount:true,getPos:function(t,q,u,w,p,r){if(!r){m={ch:"t",param:w}}var v=t.getCursorPosition();var s=i.getRightNthChar(t,v,w,u||1);if(r&&s==0&&!(u>1)){var s=i.getRightNthChar(t,v,w,2)}if(typeof s==="number"){v.column+=s+(p?1:0);return v}}}),T:new d({param:true,handlesCount:true,getPos:function(t,q,u,w,p,r){if(!r){m={ch:"T",param:w}}var v=t.getCursorPosition();var s=i.getLeftNthChar(t,v,w,u||1);if(r&&s==0&&!(u>1)){var s=i.getLeftNthChar(t,v,w,2)}if(typeof s==="number"){v.column-=s;return v}}}),";":new d({handlesCount:true,getPos:function(s,q,t,u,p){var r=m.ch;if(!r){return}return c.exports[r].getPos(s,q,t,m.param,p,true)}}),",":new d({handlesCount:true,getPos:function(t,r,u,v,q){var s=m.ch;if(!s){return}var p=s.toUpperCase();s=s===p?s.toLowerCase():p;return c.exports[s].getPos(t,r,u,m.param,q,true)}}),"^":{nav:function(p){p.navigateLineStart()},sel:function(p){p.selection.selectLineStart()}},"$":{handlesCount:true,nav:function(q,p,r,s){if(r>1){q.navigateDown(r-1)}q.navigateLineEnd()},sel:function(q,p,r,s){if(r>1){q.selection.moveCursorBy(r-1,0)}q.selection.selectLineEnd()}},"0":new d(function(p){return{row:p.selection.lead.row,column:0}}),G:{nav:function(q,p,r,s){if(!r&&r!==0){r=q.session.getLength()}q.gotoLine(r)},sel:function(q,p,r,s){if(!r&&r!==0){r=q.session.getLength()}q.selection.selectTo(r,0)}},g:{param:true,nav:function(q,p,r,s){switch(s){case"m":console.log("Middle line");break;case"e":console.log("End of prev word");break;case"g":q.gotoLine(r||0);case"u":q.gotoLine(r||0);case"U":q.gotoLine(r||0)}},sel:function(q,p,r,s){switch(s){case"m":console.log("Middle line");break;case"e":console.log("End of prev word");break;case"g":q.selection.selectTo(r||0,0)}}},o:{nav:function(q,p,s,t){s=s||1;var r="";while(00){q.navigateUp();q.navigateLineEnd();q.insert(r)}else{q.session.insert({row:0,column:0},r);q.navigateUp()}i.insertMode(q)}}},"%":new d(function(t){var s=/[\[\]{}()]/g;var u=t.getCursorPosition();var r=t.session.getLine(u.row)[u.column];if(!s.test(r)){var p=k(t,s);if(!p){return}u=p.start}var q=t.session.findMatchingBracket({row:u.row,column:u.column+1});return q}),"{":new d(function(p){var q=p.session;var r=q.selection.lead.row;while(r>0&&!/\S/.test(q.getLine(r))){r--}while(/\S/.test(q.getLine(r))){r--}return{column:0,row:r}}),"}":new d(function(q){var r=q.session;var p=r.getLength();var s=r.selection.lead.row;while(s":{selFn:function(h,f,j,k){j=j||1;for(var g=0;g":var l=h.getCursorPosition();h.selection.selectLine();for(var g=0;g>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"paren.lparen",regex:"[\\[\\(\\{]"},{token:"paren.rparen",regex:"[\\]\\)\\}]"},{token:"text",regex:"\\s+"}],define:[{token:"constant.language",regex:"def|class"},{token:"variable.language",regex:"[A-Za-z_][A-Za-z0-9_]*",next:"start"},{token:"text",regex:"\\s+"}],qqstring3:[{token:"constant.language.escape",regex:D},{token:"string",regex:'"{3}',next:"start"},{defaultToken:"string"}],qstring3:[{token:"constant.language.escape",regex:D},{token:"string",regex:"'{3}",next:"start"},{defaultToken:"string"}],qqstring:[{token:"constant.language.escape",regex:D},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"start"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:D},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"start"},{defaultToken:"string"}]}};f.inherits(c,a);b.PlotDeviceHighlightRules=c});define("ace/mode/folding/pythonic",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"],function(b,a,c){var d=b("../../lib/oop");var f=b("./fold_mode").FoldMode;var e=a.FoldMode=function(g){this.foldingStartMarker=new RegExp("([\\[{])(?:\\s*)$|("+g+")(?:\\s*)(?:#.*)?$")};d.inherits(e,f);(function(){this.getFoldWidgetRange=function(j,i,k){var g=j.getLine(k);var h=g.match(this.foldingStartMarker);if(h){if(h[1]){return this.openingBracketBlock(j,h[1],k,h.index)}if(h[2]){return this.indentationBlock(j,k,h.index+h[2].length)}return this.indentationBlock(j,k)}}}).call(e.prototype)});define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(f,i,d){var k=f("../../lib/oop");var h=f("../behaviour").Behaviour;var l=f("../../token_iterator").TokenIterator;var c=f("../../lib/lang");var j=["text","paren.rparen","punctuation.operator"];var e=["text","paren.rparen","punctuation.operator","comment"];var a;var g={};var b=function(n){var o=-1;if(n.multiSelect){o=n.selection.id;if(g.rangeCount!=n.multiSelect.rangeCount){g={rangeCount:n.multiSelect.rangeCount}}}if(g[o]){return a=g[o]}a=g[o]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}};var m=function(){this.add("braces","insertion",function(o,r,u,x,z){var A=u.getCursorPosition();var B=x.doc.getLine(A.row);if(z=="{"){b(u);var y=u.getSelectionRange();var s=x.doc.getTextRange(y);if(s!==""&&s!=="{"&&u.getWrapBehavioursEnabled()){return{text:"{"+s+"}",selection:false}}else{if(m.isSaneInsertion(u,x)){if(/[\]\}\)]/.test(B[A.column])||u.inMultiSelectMode){m.recordAutoInsert(u,x,"}");return{text:"{}",selection:[1,1]}}else{m.recordMaybeInsert(u,x,"{");return{text:"{",selection:[1,1]}}}}}else{if(z=="}"){b(u);var v=B.substring(A.column,A.column+1);if(v=="}"){var n=x.$findOpeningBracket("}",{column:A.column+1,row:A.row});if(n!==null&&m.isAutoInsertedClosing(A,B,z)){m.popAutoInsertedClosing();return{text:"",selection:[1,1]}}}}else{if(z=="\n"||z=="\r\n"){b(u);var q="";if(m.isMaybeInsertedClosing(A,B)){q=c.stringRepeat("}",a.maybeInsertedBrackets);m.clearMaybeInsertedClosing()}var v=B.substring(A.column,A.column+1);if(v==="}"){var w=x.findMatchingBracket({row:A.row,column:A.column+1},"}");if(!w){return null}var t=this.$getIndent(x.getLine(w.row))}else{if(q){var t=this.$getIndent(B)}else{m.clearMaybeInsertedClosing();return}}var p=t+x.getTabString();return{text:"\n"+p+"\n"+t+q,selection:[1,p.length,1,p.length]}}else{m.clearMaybeInsertedClosing()}}}});this.add("braces","deletion",function(s,r,q,t,o){var p=t.doc.getTextRange(o);if(!o.isMultiLine()&&p=="{"){b(q);var n=t.doc.getLine(o.start.row);var u=n.substring(o.end.column,o.end.column+1);if(u=="}"){o.end.column++;return o}else{a.maybeInsertedBrackets--}}});this.add("parens","insertion",function(o,p,r,t,v){if(v=="("){b(r);var u=r.getSelectionRange();var q=t.doc.getTextRange(u);if(q!==""&&r.getWrapBehavioursEnabled()){return{text:"("+q+")",selection:false}}else{if(m.isSaneInsertion(r,t)){m.recordAutoInsert(r,t,")");return{text:"()",selection:[1,1]}}}}else{if(v==")"){b(r);var w=r.getCursorPosition();var x=t.doc.getLine(w.row);var s=x.substring(w.column,w.column+1);if(s==")"){var n=t.$findOpeningBracket(")",{column:w.column+1,row:w.row});if(n!==null&&m.isAutoInsertedClosing(w,x,v)){m.popAutoInsertedClosing();return{text:"",selection:[1,1]}}}}}});this.add("parens","deletion",function(s,r,q,t,o){var p=t.doc.getTextRange(o);if(!o.isMultiLine()&&p=="("){b(q);var n=t.doc.getLine(o.start.row);var u=n.substring(o.start.column+1,o.start.column+2);if(u==")"){o.end.column++;return o}}});this.add("brackets","insertion",function(o,p,r,t,v){if(v=="["){b(r);var u=r.getSelectionRange();var q=t.doc.getTextRange(u);if(q!==""&&r.getWrapBehavioursEnabled()){return{text:"["+q+"]",selection:false}}else{if(m.isSaneInsertion(r,t)){m.recordAutoInsert(r,t,"]");return{text:"[]",selection:[1,1]}}}}else{if(v=="]"){b(r);var w=r.getCursorPosition();var x=t.doc.getLine(w.row);var s=x.substring(w.column,w.column+1);if(s=="]"){var n=t.$findOpeningBracket("]",{column:w.column+1,row:w.row});if(n!==null&&m.isAutoInsertedClosing(w,x,v)){m.popAutoInsertedClosing();return{text:"",selection:[1,1]}}}}}});this.add("brackets","deletion",function(s,r,q,t,o){var p=t.doc.getTextRange(o);if(!o.isMultiLine()&&p=="["){b(q);var n=t.doc.getLine(o.start.row);var u=n.substring(o.start.column+1,o.start.column+2);if(u=="]"){o.end.column++;return o}}});this.add("string_dquotes","insertion",function(o,r,u,y,C){if(C=='"'||C=="'"){b(u);var n=C;var A=u.getSelectionRange();var s=y.doc.getTextRange(A);if(s!==""&&s!=="'"&&s!='"'&&u.getWrapBehavioursEnabled()){return{text:n+s+n,selection:false}}else{var B=u.getCursorPosition();var E=y.doc.getLine(B.row);var D=E.substring(B.column-1,B.column);if(D=="\\"){return null}var w=y.getTokens(A.start.row);var p=0,q;var t=-1;for(var z=0;zA.start.column){break}p+=w[z].value.length}if(!q||(t<0&&q.type!=="comment"&&(q.type!=="string"||((A.start.column!==q.value.length+p-1)&&q.value.lastIndexOf(n)===q.value.length-1)))){if(!m.isSaneInsertion(u,y)){return}return{text:n+n,selection:[1,1]}}else{if(q&&q.type==="string"){var v=E.substring(B.column,B.column+1);if(v==n){return{text:"",selection:[1,1]}}}}}}});this.add("string_dquotes","deletion",function(s,r,q,t,o){var p=t.doc.getTextRange(o);if(!o.isMultiLine()&&(p=='"'||p=="'")){b(q);var n=t.doc.getLine(o.start.row);var u=n.substring(o.start.column+1,o.start.column+2);if(u==p){o.end.column++;return o}}})};m.isSaneInsertion=function(p,q){var r=p.getCursorPosition();var o=new l(q,r.row,r.column);if(!this.$matchTokenType(o.getCurrentToken()||"text",j)){var n=new l(q,r.row,r.column+1);if(!this.$matchTokenType(n.getCurrentToken()||"text",j)){return false}}o.stepForward();return o.getCurrentTokenRow()!==r.row||this.$matchTokenType(o.getCurrentToken()||"text",e)};m.$matchTokenType=function(o,n){return n.indexOf(o.type||o)>-1};m.recordAutoInsert=function(o,p,r){var q=o.getCursorPosition();var n=p.doc.getLine(q.row);if(!this.isAutoInsertedClosing(q,n,a.autoInsertedLineEnd[0])){a.autoInsertedBrackets=0}a.autoInsertedRow=q.row;a.autoInsertedLineEnd=r+n.substr(q.column);a.autoInsertedBrackets++};m.recordMaybeInsert=function(o,p,r){var q=o.getCursorPosition();var n=p.doc.getLine(q.row);if(!this.isMaybeInsertedClosing(q,n)){a.maybeInsertedBrackets=0}a.maybeInsertedRow=q.row;a.maybeInsertedLineStart=n.substr(0,q.column)+r;a.maybeInsertedLineEnd=n.substr(q.column);a.maybeInsertedBrackets++};m.isAutoInsertedClosing=function(p,n,o){return a.autoInsertedBrackets>0&&p.row===a.autoInsertedRow&&o===a.autoInsertedLineEnd[0]&&n.substr(p.column)===a.autoInsertedLineEnd};m.isMaybeInsertedClosing=function(o,n){return a.maybeInsertedBrackets>0&&o.row===a.maybeInsertedRow&&n.substr(o.column)===a.maybeInsertedLineEnd&&n.substr(0,o.column)==a.maybeInsertedLineStart};m.popAutoInsertedClosing=function(){a.autoInsertedLineEnd=a.autoInsertedLineEnd.substr(1);a.autoInsertedBrackets--};m.clearMaybeInsertedClosing=function(){if(a){a.maybeInsertedBrackets=0;a.maybeInsertedRow=-1}};k.inherits(m,h);i.CstyleBehaviour=m});define("ace/snippets/plotdevice",["require","exports","module"],function(b,a,c){a.snippetText='### general purpose\n\nsnippet {\n {"${1:k}":${2:v}, kw$3}\nsnippet kw\n "${1:k}":${2:v}, kw$3\nsnippet dict\n dict(${1:k}=${2:v}, dkw$3)\nsnippet dkw\n ${1:k}=${2:v}, dkw$3\nsnippet t\n True\nsnippet f\n False\nsnippet lorem\n lorem = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."\nsnippet draw\n def draw(state):\n print FRAME$1\nsnippet setup\n def setup(state):\n $1\nsnippet stop\n def stop(state):\n $1\nsnippet anim\n speed(${1:30})$2\n def setup(state):\n pass\n def draw(state):\n print FRAME\n def stop(state):\n pass\n\n\n### Some handy abbreviations borrowed from python.snippets\n\nsnippet imp\n import ${1:module}\nsnippet xi\n ${1:library} = ximport("$1")\nsnippet from\n from ${1:package} import ${2:module}\nsnippet wh\n while ${1:condition}:\n $2\nsnippet with\n with ${1:expr} as ${2:var}:\n $3\n# New Class\nsnippet cl\n class ${1:ClassName}(${2:object}):\n """${3:docstring for $1}"""\n def __init__(self, ${4:arg}):\n ${5:super($1, self).__init__()}\n $6\n# New Function\nsnippet def\n def ${1:fname}($2):\n $3\n# New Method\nsnippet defs\n def ${1:mname}(self, ${2:arg}):\n $3\n# Ifs\nsnippet if\n if ${1:condition}:\n $2\nsnippet el\n else:\n $1\nsnippet ei\n elif ${1:condition}:\n $2\n# For\nsnippet for\n for ${1:item} in ${2:items}:\n $3\nsnippet try\n try:\n ${1:# TODO: write code...}\n except ${2:Exception}, ${3:e}:\n ${4:raise $3}\n# if __name__ == \'__main__\':\nsnippet ifmain\n if __name__ == \'__main__\':\n ${1:main()}\n# __magic__\nsnippet _\n __${1:init}__${2}\n\n\n\n\n\n### signatures for the plotdevice api\n\nsnippet align\n align(${1:LEFT/RIGHT/CENTER/JUSTIFY})\nsnippet alpha\n alpha(${1:1.0})\nsnippet arc\n arc(${1:x}, ${2:y}, ${3:radius}${4:, range=${5:None}, ccw=${6:False}, close=${7:False}})\nsnippet arcto\n arcto(${1:x}, ${2:y}${3:, cx=${4:None}, cy=${5:None}, radius=${6:None}, ccw=${7:False}, close=${8:False}})\nsnippet arrow\n arrow(${1:x}, ${2:y}${3:, width=${4:100}, type=${5:NORMAL/FORTYFIVE}, plot=${6:True}})\nsnippet autoclosepath\n autoclosepath(${1:close=${2:True}})\nsnippet autotext\n autotext(${1:sourceFile})\nsnippet background\n background()\nsnippet beginclip\n beginclip(${1:stencil}${2:, mask=${3:False}, channel=${4:None}})\nsnippet beginpath\n beginpath(${1:${2:x}, ${3:y}})\nsnippet bezier\n bezier(${1:${2:x}, ${3:y}}, close=${4:True}, plot=${5:True})\nsnippet blend\n blend("${1:normal}")\nsnippet capstyle\n capstyle(${1:style=${2:BUTT/ROUND/SQUARE}})\nsnippet choice\n choice(${1:seq})\nsnippet clear\n clear(${1:all})\nsnippet clip\n clip(${1:stencil}${2:, channel="${3:black/white/alpha/red/green/blue}"})\nsnippet mask\n mask(${1:stencil}${2:, channel="${3:black/white/alpha/red/green/blue}"})\nsnippet closepath\n closepath()\nsnippet color\n color("${1:black}")\nsnippet colormode\n colormode(${1:mode=${2:RGB/HSB/CMYK}, range=${3:None}})\nsnippet colorrange\n colorrange(${1:maxval})\nsnippet curveto\n curveto(${1:x1}, ${2:y1}, ${3:x2}, ${4:y2}, ${5:x}, ${6:y}${7:, close=${8:False}})\nsnippet drawpath\n drawpath(${1:path})\nsnippet ellipse\n ellipse(${1:x}, ${2:y}, ${3:width}, ${4:height}${5:, range=${6:None}, ccw=${7:False}, close=${8:False}, plot=${9:True}})\nsnippet endclip\n endclip()\nsnippet endpath\n endpath(${1:plot=${2:True}})\nsnippet export\n export("${1:${2:document}.${3:mov}}"${4:, fps=${5:None}, loop=${6:None}, bitrate=${7:1.0}})\nsnippet files\n files("${1:${2:*}.${3:json}}", case=${4:True}})\nsnippet fill\n fill(${1:"#${2:000}"})\nsnippet findpath\n findpath(${1:points}${2:, curvature=${3:1.0}})\nsnippet findvar\n findvar(${1:name})\nsnippet font\n font("${1:HelveticaNeue-Medium}", ${2:12}})\nsnippet fonts\n fonts(${1:like="${2:akzidenz}", western=${3:True}})\nsnippet fontsize\n fontsize(${1:12})\nsnippet geometry\n geometry(${1:DEGREES/RADIANS/PERCENT})\nsnippet grid\n grid(${1:cols}, ${2:rows}${3:, colSize=${4:1}, rowSize=${5:1}, shuffled=${6:False}})\nsnippet image\n image("${1:image.png}", ${2:x}, ${3:y}${4:, width=${5:None}, height=${6:None}, plot=${7:True}})\nsnippet imagesize\n imagesize("${1:image.png}"${2:, data=${3:None}})\nsnippet joinstyle\n joinstyle(${1:MITER/ROUND/BEVEL})\nsnippet line\n line(${1:x1}, ${2:y1}, ${3:x2}, ${4:y2}${5:, plot=${6:True}})\nsnippet lineheight\n lineheight(${1:None})\nsnippet lineto\n lineto(${1:x}, ${2:y}${3:, close=${4:False}})\nsnippet measure\n measure(${1:obj})\nsnippet moveto\n moveto(${1:x}, ${2:y})\nsnippet nofill\n nofill()\nsnippet nostroke\n nostroke()\nsnippet noshadow\n noshadow()\nsnippet ordered\n ordered(${1:seq})\nsnippet outputmode\n outputmode(${1:RGB/CMYK})\nsnippet oval\n oval(${1:x}, ${2:y}, ${3:width}, ${4:height}${5:, range=${6:None}, ccw=${7:False}, close=${8:False}, plot=${9:True}})\nsnippet pen\n pen(${1:nib})\nsnippet plot\n plot(${1:obj})\nsnippet poly\n poly(${1:x}, ${2:y}, ${3:radius}, ${4:sides=4}${5:, plot=${6:True}})\nsnippet pop\n pop()\nsnippet push\n push()\nsnippet random\n random(${1:v1=${2:None}, v2=${3:None}})\nsnippet read\n read(${1:pth}${2:, format=${3:None}, encoding=${4:utf-8}, cols=${5:None}})\nsnippet rect\n rect(${1:x}, ${2:y}, ${3:width}, ${4:height}${5:, roundness=${6:0.0}, plot=${7:True}})\nsnippet reset\n reset()\nsnippet rotate\n rotate(${1:theta})\nsnippet scale\n scale(${1:x=${2:1}, y=${3:None}})\nsnippet shadow\n shadow(${1:"black"}, blur=${2:10}, offset=${3:10})))\nsnippet shuffled\n shuffled(${2:seq})\nsnippet size\n size(${1:width}, ${2:height}, unit=${4:px}})\nsnippet skew\n skew(${1:horizontal}, ${2:vertical})\nsnippet speed\n speed(${1:fps})\nsnippet star\n star(${1:x}, ${2:y}${3:, points=${4:20}, outer=${5:100}, inner=${6:None}, plot=${7:True}}})\nsnippet stroke\n stroke()\nsnippet strokewidth\n strokewidth(${1:width})\nsnippet text\n text("${1:txt}", ${2:x}, ${3:y}${4:, width=${5:None}, height=${6:None}, outline=${7:False}, plot=${8:True}})\nsnippet textheight\n textheight("${1:txt}"${2:, width=${3:None}})\nsnippet textmetrics\n textmetrics("${1:txt}"${2:, width=${3:None}, height=${4:None}})\nsnippet textpath\n textpath("${1:txt}", ${2:x}, ${3:y}${4:, width=${5:None}, height=${6:None}})\nsnippet textwidth\n textwidth("${1:txt}"${2:, width=${3:None}})\nsnippet transform\n transform()\nsnippet transform()\n with transform(${1:${2:CENTER/CORNER, }${3:...}}):\n $4\nsnippet translate\n translate(${1:x}, ${2:y})\nsnippet ximport\n ${1:libName} = ximport("$1")\n';a.scope="plotdevice"});define("ace/snippets/text",["require","exports","module"],function(b,a,c){a.snippetText="";a.scope="text"});define("ace/theme/ambiance",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-ambiance";a.cssText=".ace-ambiance .ace_gutter {background-color: #3d3d3d;background-image: -moz-linear-gradient(left, #3D3D3D, #333);background-image: -ms-linear-gradient(left, #3D3D3D, #333);background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#3D3D3D), to(#333));background-image: -webkit-linear-gradient(left, #3D3D3D, #333);background-image: -o-linear-gradient(left, #3D3D3D, #333);background-image: linear-gradient(left, #3D3D3D, #333);background-repeat: repeat-x;border-right: 1px solid #4d4d4d;text-shadow: 0px 1px 1px #4d4d4d;color: #222;}.ace-ambiance .ace_gutter-layer {background: repeat left top;}.ace-ambiance .ace_fold-widget {text-align: center;}.ace-ambiance .ace_fold-widget:hover {color: #777;}.ace-ambiance .ace_fold-widget.ace_start,.ace-ambiance .ace_fold-widget.ace_end,.ace-ambiance .ace_fold-widget.ace_closed{background: none;border: none;box-shadow: none;}.ace-ambiance .ace_fold-widget.ace_start:after {content: '\u25be'}.ace-ambiance .ace_fold-widget.ace_end:after {content: '\u25b4'}.ace-ambiance .ace_fold-widget.ace_closed:after {content: '\u2023'}.ace-ambiance .ace_print-margin {border-left: 1px dotted #2D2D2D;right: 0;background: #262626;}.ace-ambiance .ace_scroller {-webkit-box-shadow: inset 0 0 10px black;-moz-box-shadow: inset 0 0 10px black;-o-box-shadow: inset 0 0 10px black;box-shadow: inset 0 0 10px black;}.ace-ambiance {color: #E6E1DC;background-color: #202020;}.ace-ambiance .ace_cursor {border-left: 1px solid #7991E8;}.ace-ambiance .ace_overwrite-cursors .ace_cursor {border: 1px solid #FFE300;background: #766B13;}.ace-ambiance.normal-mode .ace_cursor-layer {z-index: 0;}.ace-ambiance .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20);}.ace-ambiance .ace_marker-layer .ace_selected-word {border-radius: 4px;border: 8px solid #3f475d;box-shadow: 0 0 4px black;}.ace-ambiance .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-ambiance .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25);}.ace-ambiance .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031);}.ace-ambiance .ace_invisible {color: #333;}.ace-ambiance .ace_paren {color: #24C2C7;}.ace-ambiance .ace_keyword {color: #cda869;}.ace-ambiance .ace_keyword.ace_operator {color: #fa8d6a;}.ace-ambiance .ace_punctuation.ace_operator {color: #fa8d6a;}.ace-ambiance .ace_identifier {}.ace-ambiance .ace-statement {color: #cda869;}.ace-ambiance .ace_constant {color: #CF7EA9;}.ace-ambiance .ace_constant.ace_language {color: #CF7EA9;}.ace-ambiance .ace_constant.ace_library {}.ace-ambiance .ace_constant.ace_numeric {color: #78CF8A;}.ace-ambiance .ace_invalid {text-decoration: underline;}.ace-ambiance .ace_invalid.ace_illegal {color:#F8F8F8;background-color: rgba(86, 45, 86, 0.75);}.ace-ambiance .ace_invalid,.ace-ambiance .ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1;}.ace-ambiance .ace_support {color: #9B859D;}.ace-ambiance .ace_support.ace_function {color: #DAD085;}.ace-ambiance .ace_function.ace_buildin {color: #9b859d;}.ace-ambiance .ace_string {color: #8f9d6a;}.ace-ambiance .ace_string.ace_regexp {color: #DAD085;}.ace-ambiance .ace_comment {font-style: italic;color: #555;}.ace-ambiance .ace_comment.ace_doc {}.ace-ambiance .ace_comment.ace_doc.ace_tag {color: #666;font-style: normal;}.ace-ambiance .ace_definition,.ace-ambiance .ace_type {color: #aac6e3;}.ace-ambiance .ace_variable {color: #9999cc;}.ace-ambiance .ace_variable.ace_language {color: #9b859d;}.ace-ambiance .ace_xml-pe {color: #494949;}.ace-ambiance .ace_gutter-layer,.ace-ambiance .ace_text-layer {background-image: url(\"data:image/png;base64,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\");}.ace-ambiance .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/blackboard",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-blackboard";a.cssText="/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: A2C6BAA7-90D0-4147-BBF5-96B0CD92D109) */.ace-blackboard .ace_gutter {background: #0c1021;color: #AEAEAE;}.ace-blackboard .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-blackboard {background-color: #0C1021;color: #F8F8F8;}.ace-blackboard .ace_cursor {color: rgba(255, 255, 255, 0.65);}.ace-blackboard .ace_marker-layer .ace_selection {background: #325087;}.ace-blackboard.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #0C1021;border-radius: 2px;}.ace-blackboard .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-blackboard .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25);}.ace-blackboard .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.059);}.ace-blackboard .ace_gutter-active-line {background-color: rgba(255, 255, 255, 0.059);}.ace-blackboard .ace_marker-layer .ace_selected-word {border: 1px solid #253B76;}.ace-blackboard .ace_fold {background-color: #FBDE2D;border-color: #F8F8F8;}.ace-blackboard .ace_keyword,.ace-blackboard .ace_storage {color: #FBDE2D;}.ace-blackboard .ace_constant {color: #D8FA3C;}.ace-blackboard .ace_support {color: #8DA6CE;}.ace-blackboard .ace_invalid.ace_illegal {color: #F8F8F8;background-color: #9D1E15;}.ace-blackboard .ace_invalid.ace_deprecated {font-style: italic;color: #AB2A1D;}.ace-blackboard .ace_string {color: #61CE3C;}.ace-blackboard .ace_invisible{color:rgba(174, 174, 174, 0.5);}.ace-blackboard .ace_comment {color: #AEAEAE;}.ace-blackboard .ace_meta.ace_tag {color: #7F90AA;}.ace-blackboard .ace_variable,.ace-blackboard .ace_variable.ace_language {color:rgba(255, 100, 0, 1.0);}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/chaos",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-chaos";a.cssText=".ace-chaos .ace_gutter {background: #141414;color: #595959;border-right: 1px solid #282828;}.ace-chaos .ace_gutter-cell.ace_warning {background-image: none;background: #FC0;border-left: none;padding-left: 0;color: #000;}.ace-chaos .ace_gutter-cell.ace_error {background-position: -6px center;background-image: none;background: #F10;border-left: none;padding-left: 0;color: #000;}.ace-chaos .ace_print-margin {border-left: 1px solid #555;right: 0;background: #1D1D1D;}.ace-chaos {background-color: #161616;color: #E6E1DC;}.ace-chaos .ace_cursor {border-left: 2px solid #FFFFFF;}.ace-chaos .ace_cursor.ace_overwrite {border-left: 0px;border-bottom: 1px solid #FFFFFF;}.ace-chaos .ace_marker-layer .ace_selection {background: #494836;}.ace-chaos .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-chaos .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #FCE94F;}.ace-chaos .ace_marker-layer .ace_active-line {background: #333;}.ace-chaos .ace_gutter-active-line {background-color: #222;}.ace-chaos .ace_invisible {color: #404040;}.ace-chaos .ace_keyword {color:#00698F;}.ace-chaos .ace_keyword.ace_operator {color:#FF308F;}.ace-chaos .ace_constant {color:#1EDAFB;}.ace-chaos .ace_constant.ace_language {color:#FDC251;}.ace-chaos .ace_constant.ace_library {color:#8DFF0A;}.ace-chaos .ace_constant.ace_numeric {color:#58C554;}.ace-chaos .ace_invalid {color:#FFFFFF;background-color:#990000;}.ace-chaos .ace_invalid.ace_deprecated {color:#FFFFFF;background-color:#990000;}.ace-chaos .ace_support {color: #999;}.ace-chaos .ace_support.ace_function {color:#00AEEF;}.ace-chaos .ace_function {color:#00AEEF;}.ace-chaos .ace_string {color:#58C554;}.ace-chaos .ace_comment {color:#555;font-style:italic;padding-bottom: 0px;}.ace-chaos .ace_variable {color:#997744;}.ace-chaos .ace_meta.ace_tag {color:#BE53E6;}.ace-chaos .ace_entity.ace_other.ace_attribute-name {color:#FFFF89;}.ace-chaos .ace_markup.ace_underline {text-decoration: underline;}.ace-chaos .ace_fold-widget {text-align: center;}.ace-chaos .ace_fold-widget:hover {color: #777;}.ace-chaos .ace_fold-widget.ace_start,.ace-chaos .ace_fold-widget.ace_end,.ace-chaos .ace_fold-widget.ace_closed{background: none;border: none;box-shadow: none;}.ace-chaos .ace_fold-widget.ace_start:after {content: '\u25be'}.ace-chaos .ace_fold-widget.ace_end:after {content: '\u25b4'}.ace-chaos .ace_fold-widget.ace_closed:after {content: '\u2023'}.ace-chaos .ace_indent-guide {border-right:1px dotted #333;margin-right:-1px;}.ace-chaos .ace_fold { background: #222; border-radius: 3px; color: #7AF; border: none; }.ace-chaos .ace_fold:hover {background: #CCC; color: #000;}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/chrome",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-chrome";a.cssText='.ace-chrome .ace_gutter {background: #ebebeb;color: #333;overflow : hidden;}.ace-chrome .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-chrome {background-color: #FFFFFF;color: black;}.ace-chrome .ace_cursor {color: black;}.ace-chrome .ace_invisible {color: rgb(191, 191, 191);}.ace-chrome .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-chrome .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-chrome .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-chrome .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-chrome .ace_fold {}.ace-chrome .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-chrome .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-chrome .ace_support.ace_type,.ace-chrome .ace_support.ace_class.ace-chrome .ace_support.ace_other {color: rgb(109, 121, 222);}.ace-chrome .ace_variable.ace_parameter {font-style:italic;color:#FD971F;}.ace-chrome .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-chrome .ace_comment {color: #236e24;}.ace-chrome .ace_comment.ace_doc {color: #236e24;}.ace-chrome .ace_comment.ace_doc.ace_tag {color: #236e24;}.ace-chrome .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-chrome .ace_variable {color: rgb(49, 132, 149);}.ace-chrome .ace_xml-pe {color: rgb(104, 104, 91);}.ace-chrome .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-chrome .ace_heading {color: rgb(12, 7, 255);}.ace-chrome .ace_list {color:rgb(185, 6, 144);}.ace-chrome .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-chrome .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-chrome .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-chrome .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-chrome .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-chrome .ace_gutter-active-line {background-color : #dcdcdc;}.ace-chrome .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-chrome .ace_storage,.ace-chrome .ace_keyword,.ace-chrome .ace_meta.ace_tag {color: rgb(147, 15, 128);}.ace-chrome .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-chrome .ace_string {color: #1A1AA6;}.ace-chrome .ace_entity.ace_other.ace_attribute-name {color: #994409;}.ace-chrome .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/clouds",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-clouds";a.cssText='.ace-clouds .ace_gutter {background: #ebebeb;color: #333}.ace-clouds .ace_print-margin {width: 1px;background: #e8e8e8}.ace-clouds {background-color: #FFFFFF;color: #000000}.ace-clouds .ace_cursor {color: #000000}.ace-clouds .ace_marker-layer .ace_selection {background: #BDD5FC}.ace-clouds.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;border-radius: 2px}.ace-clouds .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-clouds .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-clouds .ace_marker-layer .ace_active-line {background: #FFFBD1}.ace-clouds .ace_gutter-active-line {background-color : #dcdcdc}.ace-clouds .ace_marker-layer .ace_selected-word {border: 1px solid #BDD5FC}.ace-clouds .ace_invisible {color: #BFBFBF}.ace-clouds .ace_keyword,.ace-clouds .ace_meta,.ace-clouds .ace_support.ace_constant.ace_property-value {color: #AF956F}.ace-clouds .ace_keyword.ace_operator {color: #484848}.ace-clouds .ace_keyword.ace_other.ace_unit {color: #96DC5F}.ace-clouds .ace_constant.ace_language {color: #39946A}.ace-clouds .ace_constant.ace_numeric {color: #46A609}.ace-clouds .ace_constant.ace_character.ace_entity {color: #BF78CC}.ace-clouds .ace_invalid {background-color: #FF002A}.ace-clouds .ace_fold {background-color: #AF956F;border-color: #000000}.ace-clouds .ace_storage,.ace-clouds .ace_support.ace_class,.ace-clouds .ace_support.ace_function,.ace-clouds .ace_support.ace_other,.ace-clouds .ace_support.ace_type {color: #C52727}.ace-clouds .ace_string {color: #5D90CD}.ace-clouds .ace_comment {color: #BCC8BA}.ace-clouds .ace_entity.ace_name.ace_tag,.ace-clouds .ace_entity.ace_other.ace_attribute-name {color: #606060}.ace-clouds .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/clouds_midnight",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-clouds-midnight";a.cssText=".ace-clouds-midnight .ace_gutter {background: #232323;color: #929292}.ace-clouds-midnight .ace_print-margin {width: 1px;background: #232323}.ace-clouds-midnight {background-color: #191919;color: #929292}.ace-clouds-midnight .ace_cursor {color: #7DA5DC}.ace-clouds-midnight .ace_marker-layer .ace_selection {background: #000000}.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #191919;border-radius: 2px}.ace-clouds-midnight .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-clouds-midnight .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-clouds-midnight .ace_marker-layer .ace_active-line {background: rgba(215, 215, 215, 0.031)}.ace-clouds-midnight .ace_gutter-active-line {background-color: rgba(215, 215, 215, 0.031)}.ace-clouds-midnight .ace_marker-layer .ace_selected-word {border: 1px solid #000000}.ace-clouds-midnight .ace_invisible {color: #BFBFBF}.ace-clouds-midnight .ace_keyword,.ace-clouds-midnight .ace_meta,.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {color: #927C5D}.ace-clouds-midnight .ace_keyword.ace_operator {color: #4B4B4B}.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {color: #366F1A}.ace-clouds-midnight .ace_constant.ace_language {color: #39946A}.ace-clouds-midnight .ace_constant.ace_numeric {color: #46A609}.ace-clouds-midnight .ace_constant.ace_character.ace_entity {color: #A165AC}.ace-clouds-midnight .ace_invalid {color: #FFFFFF;background-color: #E92E2E}.ace-clouds-midnight .ace_fold {background-color: #927C5D;border-color: #929292}.ace-clouds-midnight .ace_storage,.ace-clouds-midnight .ace_support.ace_class,.ace-clouds-midnight .ace_support.ace_function,.ace-clouds-midnight .ace_support.ace_other,.ace-clouds-midnight .ace_support.ace_type {color: #E92E2E}.ace-clouds-midnight .ace_string {color: #5D90CD}.ace-clouds-midnight .ace_comment {color: #3C403B}.ace-clouds-midnight .ace_entity.ace_name.ace_tag,.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {color: #606060}.ace-clouds-midnight .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/cobalt",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-cobalt";a.cssText=".ace-cobalt .ace_gutter {background: #011e3a;color: #fff}.ace-cobalt .ace_print-margin {width: 1px;background: #011e3a}.ace-cobalt {background-color: #002240;color: #FFFFFF}.ace-cobalt .ace_cursor {color: #FFFFFF}.ace-cobalt .ace_marker-layer .ace_selection {background: rgba(179, 101, 57, 0.75)}.ace-cobalt.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #002240;border-radius: 2px}.ace-cobalt .ace_marker-layer .ace_step {background: rgb(127, 111, 19)}.ace-cobalt .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.15)}.ace-cobalt .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.35)}.ace-cobalt .ace_gutter-active-line {background-color: rgba(0, 0, 0, 0.35)}.ace-cobalt .ace_marker-layer .ace_selected-word {border: 1px solid rgba(179, 101, 57, 0.75)}.ace-cobalt .ace_invisible {color: rgba(255, 255, 255, 0.15)}.ace-cobalt .ace_keyword,.ace-cobalt .ace_meta {color: #FF9D00}.ace-cobalt .ace_constant,.ace-cobalt .ace_constant.ace_character,.ace-cobalt .ace_constant.ace_character.ace_escape,.ace-cobalt .ace_constant.ace_other {color: #FF628C}.ace-cobalt .ace_invalid {color: #F8F8F8;background-color: #800F00}.ace-cobalt .ace_support {color: #80FFBB}.ace-cobalt .ace_support.ace_constant {color: #EB939A}.ace-cobalt .ace_fold {background-color: #FF9D00;border-color: #FFFFFF}.ace-cobalt .ace_support.ace_function {color: #FFB054}.ace-cobalt .ace_storage {color: #FFEE80}.ace-cobalt .ace_entity {color: #FFDD00}.ace-cobalt .ace_string {color: #3AD900}.ace-cobalt .ace_string.ace_regexp {color: #80FFC2}.ace-cobalt .ace_comment {font-style: italic;color: #0088FF}.ace-cobalt .ace_heading,.ace-cobalt .ace_markup.ace_heading {color: #C8E4FD;background-color: #001221}.ace-cobalt .ace_list,.ace-cobalt .ace_markup.ace_list {background-color: #130D26}.ace-cobalt .ace_variable {color: #CCCCCC}.ace-cobalt .ace_variable.ace_language {color: #FF80E1}.ace-cobalt .ace_meta.ace_tag {color: #9EFFFF}.ace-cobalt .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/crimson_editor",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssText='.ace-crimson-editor .ace_gutter {background: #ebebeb;color: #333;overflow : hidden;}.ace-crimson-editor .ace_gutter-layer {width: 100%;text-align: right;}.ace-crimson-editor .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-crimson-editor {background-color: #FFFFFF;color: rgb(64, 64, 64);}.ace-crimson-editor .ace_cursor {color: black;}.ace-crimson-editor .ace_invisible {color: rgb(191, 191, 191);}.ace-crimson-editor .ace_identifier {color: black;}.ace-crimson-editor .ace_keyword {color: blue;}.ace-crimson-editor .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-crimson-editor .ace_constant.ace_language {color: rgb(255, 156, 0);}.ace-crimson-editor .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-crimson-editor .ace_invalid {text-decoration: line-through;color: rgb(224, 0, 0);}.ace-crimson-editor .ace_fold {}.ace-crimson-editor .ace_support.ace_function {color: rgb(192, 0, 0);}.ace-crimson-editor .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-crimson-editor .ace_support.ace_type,.ace-crimson-editor .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-crimson-editor .ace_keyword.ace_operator {color: rgb(49, 132, 149);}.ace-crimson-editor .ace_string {color: rgb(128, 0, 128);}.ace-crimson-editor .ace_comment {color: rgb(76, 136, 107);}.ace-crimson-editor .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-crimson-editor .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-crimson-editor .ace_constant.ace_numeric {color: rgb(0, 0, 64);}.ace-crimson-editor .ace_variable {color: rgb(0, 64, 128);}.ace-crimson-editor .ace_xml-pe {color: rgb(104, 104, 91);}.ace-crimson-editor .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-crimson-editor .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-crimson-editor .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-crimson-editor .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-crimson-editor .ace_marker-layer .ace_active-line {background: rgb(232, 242, 254);}.ace-crimson-editor .ace_gutter-active-line {background-color : #dcdcdc;}.ace-crimson-editor .ace_meta.ace_tag {color:rgb(28, 2, 255);}.ace-crimson-editor .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-crimson-editor .ace_string.ace_regex {color: rgb(192, 0, 192);}.ace-crimson-editor .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';a.cssClass="ace-crimson-editor";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/dawn",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-dawn";a.cssText=".ace-dawn .ace_gutter {background: #ebebeb;color: #333}.ace-dawn .ace_print-margin {width: 1px;background: #e8e8e8}.ace-dawn {background-color: #F9F9F9;color: #080808}.ace-dawn .ace_cursor {color: #000000}.ace-dawn .ace_marker-layer .ace_selection {background: rgba(39, 95, 255, 0.30)}.ace-dawn.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #F9F9F9;border-radius: 2px}.ace-dawn .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-dawn .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(75, 75, 126, 0.50)}.ace-dawn .ace_marker-layer .ace_active-line {background: rgba(36, 99, 180, 0.12)}.ace-dawn .ace_gutter-active-line {background-color : #dcdcdc}.ace-dawn .ace_marker-layer .ace_selected-word {border: 1px solid rgba(39, 95, 255, 0.30)}.ace-dawn .ace_invisible {color: rgba(75, 75, 126, 0.50)}.ace-dawn .ace_keyword,.ace-dawn .ace_meta {color: #794938}.ace-dawn .ace_constant,.ace-dawn .ace_constant.ace_character,.ace-dawn .ace_constant.ace_character.ace_escape,.ace-dawn .ace_constant.ace_other {color: #811F24}.ace-dawn .ace_invalid.ace_illegal {text-decoration: underline;font-style: italic;color: #F8F8F8;background-color: #B52A1D}.ace-dawn .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #B52A1D}.ace-dawn .ace_support {color: #691C97}.ace-dawn .ace_support.ace_constant {color: #B4371F}.ace-dawn .ace_fold {background-color: #794938;border-color: #080808}.ace-dawn .ace_list,.ace-dawn .ace_markup.ace_list,.ace-dawn .ace_support.ace_function {color: #693A17}.ace-dawn .ace_storage {font-style: italic;color: #A71D5D}.ace-dawn .ace_string {color: #0B6125}.ace-dawn .ace_string.ace_regexp {color: #CF5628}.ace-dawn .ace_comment {font-style: italic;color: #5A525F}.ace-dawn .ace_heading,.ace-dawn .ace_markup.ace_heading {color: #19356D}.ace-dawn .ace_variable {color: #234A97}.ace-dawn .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/dreamweaver",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-dreamweaver";a.cssText='.ace-dreamweaver .ace_gutter {background: #e8e8e8;color: #333;}.ace-dreamweaver .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-dreamweaver {background-color: #FFFFFF;color: black;}.ace-dreamweaver .ace_fold {background-color: #757AD8;}.ace-dreamweaver .ace_cursor {color: black;}.ace-dreamweaver .ace_invisible {color: rgb(191, 191, 191);}.ace-dreamweaver .ace_storage,.ace-dreamweaver .ace_keyword {color: blue;}.ace-dreamweaver .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-dreamweaver .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-dreamweaver .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-dreamweaver .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-dreamweaver .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-dreamweaver .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-dreamweaver .ace_support.ace_type,.ace-dreamweaver .ace_support.ace_class {color: #009;}.ace-dreamweaver .ace_support.ace_php_tag {color: #f00;}.ace-dreamweaver .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-dreamweaver .ace_string {color: #00F;}.ace-dreamweaver .ace_comment {color: rgb(76, 136, 107);}.ace-dreamweaver .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-dreamweaver .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-dreamweaver .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-dreamweaver .ace_variable {color: #06F}.ace-dreamweaver .ace_xml-pe {color: rgb(104, 104, 91);}.ace-dreamweaver .ace_entity.ace_name.ace_function {color: #00F;}.ace-dreamweaver .ace_heading {color: rgb(12, 7, 255);}.ace-dreamweaver .ace_list {color:rgb(185, 6, 144);}.ace-dreamweaver .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-dreamweaver .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-dreamweaver .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-dreamweaver .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-dreamweaver .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-dreamweaver .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-dreamweaver .ace_meta.ace_tag {color:#009;}.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {color:#060;}.ace-dreamweaver .ace_meta.ace_tag.ace_form {color:#F90;}.ace-dreamweaver .ace_meta.ace_tag.ace_image {color:#909;}.ace-dreamweaver .ace_meta.ace_tag.ace_script {color:#900;}.ace-dreamweaver .ace_meta.ace_tag.ace_style {color:#909;}.ace-dreamweaver .ace_meta.ace_tag.ace_table {color:#099;}.ace-dreamweaver .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-dreamweaver .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/eclipse",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssText='.ace-eclipse .ace_gutter {background: #ebebeb;border-right: 1px solid rgb(159, 159, 159);color: rgb(136, 136, 136);}.ace-eclipse .ace_print-margin {width: 1px;background: #ebebeb;}.ace-eclipse {background-color: #FFFFFF;color: black;}.ace-eclipse .ace_fold {background-color: rgb(60, 76, 114);}.ace-eclipse .ace_cursor {color: black;}.ace-eclipse .ace_storage,.ace-eclipse .ace_keyword,.ace-eclipse .ace_variable {color: rgb(127, 0, 85);}.ace-eclipse .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-eclipse .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-eclipse .ace_function {color: rgb(60, 76, 114);}.ace-eclipse .ace_string {color: rgb(42, 0, 255);}.ace-eclipse .ace_comment {color: rgb(113, 150, 130);}.ace-eclipse .ace_comment.ace_doc {color: rgb(63, 95, 191);}.ace-eclipse .ace_comment.ace_doc.ace_tag {color: rgb(127, 159, 191);}.ace-eclipse .ace_constant.ace_numeric {color: darkblue;}.ace-eclipse .ace_tag {color: rgb(25, 118, 116);}.ace-eclipse .ace_type {color: rgb(127, 0, 127);}.ace-eclipse .ace_xml-pe {color: rgb(104, 104, 91);}.ace-eclipse .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-eclipse .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-eclipse .ace_meta.ace_tag {color:rgb(25, 118, 116);}.ace-eclipse .ace_invisible {color: #ddd;}.ace-eclipse .ace_entity.ace_other.ace_attribute-name {color:rgb(127, 0, 127);}.ace-eclipse .ace_marker-layer .ace_step {background: rgb(255, 255, 0);}.ace-eclipse .ace_marker-layer .ace_active-line {background: rgb(232, 242, 254);}.ace-eclipse .ace_marker-layer .ace_selected-word {border: 1px solid rgb(181, 213, 255);}.ace-eclipse .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';a.cssClass="ace-eclipse";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/github",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-github";a.cssText='/* CSS style content from github\'s default pygments highlighter template.Cursor and selection styles from textmate.css. */.ace-github .ace_gutter {background: #e8e8e8;color: #AAA;}.ace-github {background: #fff;color: #000;}.ace-github .ace_keyword {font-weight: bold;}.ace-github .ace_string {color: #D14;}.ace-github .ace_variable.ace_class {color: teal;}.ace-github .ace_constant.ace_numeric {color: #099;}.ace-github .ace_constant.ace_buildin {color: #0086B3;}.ace-github .ace_support.ace_function {color: #0086B3;}.ace-github .ace_comment {color: #998;font-style: italic;}.ace-github .ace_variable.ace_language {color: #0086B3;}.ace-github .ace_paren {font-weight: bold;}.ace-github .ace_boolean {font-weight: bold;}.ace-github .ace_string.ace_regexp {color: #009926;font-weight: normal;}.ace-github .ace_variable.ace_instance {color: teal;}.ace-github .ace_constant.ace_language {font-weight: bold;}.ace-github .ace_cursor {color: black;}.ace-github .ace_marker-layer .ace_active-line {background: rgb(255, 255, 204);}.ace-github .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-github.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;border-radius: 2px;}/* bold keywords cause cursor issues for some fonts *//* this disables bold style for editor and keeps for static highlighter */.ace-github.ace_nobold .ace_line > span {font-weight: normal !important;}.ace-github .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-github .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-github .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-github .ace_gutter-active-line {background-color : rgba(0, 0, 0, 0.07);}.ace-github .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-github .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-github .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/idle_fingers",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-idle-fingers";a.cssText=".ace-idle-fingers .ace_gutter {background: #3b3b3b;color: #fff}.ace-idle-fingers .ace_print-margin {width: 1px;background: #3b3b3b}.ace-idle-fingers {background-color: #323232;color: #FFFFFF}.ace-idle-fingers .ace_cursor {color: #91FF00}.ace-idle-fingers .ace_marker-layer .ace_selection {background: rgba(90, 100, 126, 0.88)}.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #323232;border-radius: 2px}.ace-idle-fingers .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-idle-fingers .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-idle-fingers .ace_marker-layer .ace_active-line {background: #353637}.ace-idle-fingers .ace_gutter-active-line {background-color: #353637}.ace-idle-fingers .ace_marker-layer .ace_selected-word {border: 1px solid rgba(90, 100, 126, 0.88)}.ace-idle-fingers .ace_invisible {color: #404040}.ace-idle-fingers .ace_keyword,.ace-idle-fingers .ace_meta {color: #CC7833}.ace-idle-fingers .ace_constant,.ace-idle-fingers .ace_constant.ace_character,.ace-idle-fingers .ace_constant.ace_character.ace_escape,.ace-idle-fingers .ace_constant.ace_other,.ace-idle-fingers .ace_support.ace_constant {color: #6C99BB}.ace-idle-fingers .ace_invalid {color: #FFFFFF;background-color: #FF0000}.ace-idle-fingers .ace_fold {background-color: #CC7833;border-color: #FFFFFF}.ace-idle-fingers .ace_support.ace_function {color: #B83426}.ace-idle-fingers .ace_variable.ace_parameter {font-style: italic}.ace-idle-fingers .ace_string {color: #A5C261}.ace-idle-fingers .ace_string.ace_regexp {color: #CCCC33}.ace-idle-fingers .ace_comment {font-style: italic;color: #BC9458}.ace-idle-fingers .ace_meta.ace_tag {color: #FFE5BB}.ace-idle-fingers .ace_entity.ace_name {color: #FFC66D}.ace-idle-fingers .ace_collab.ace_user1 {color: #323232;background-color: #FFF980}.ace-idle-fingers .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/katzenmilch",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-katzenmilch";a.cssText=".ace-katzenmilch .ace_gutter,/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: ) */.ace-katzenmilch .ace_gutter {background: #e8e8e8;color: #333}.ace-katzenmilch .ace_print-margin {width: 1px;background: #e8e8e8}.ace-katzenmilch {background-color: #f3f2f3;color: rgba(15, 0, 9, 1.0)}.ace-katzenmilch .ace_cursor {border-left: 2px solid #100011}.ace-katzenmilch .ace_overwrite-cursors .ace_cursor {border-left: 0px;border-bottom: 1px solid #100011}.ace-katzenmilch .ace_marker-layer .ace_selection {background: rgba(100, 5, 208, 0.27)}.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #f3f2f3;border-radius: 2px}.ace-katzenmilch .ace_marker-layer .ace_step {background: rgb(198, 219, 174)}.ace-katzenmilch .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #000000}.ace-katzenmilch .ace_marker-layer .ace_active-line {background: rgb(232, 242, 254)}.ace-katzenmilch .ace_gutter-active-line {background-color: rgb(232, 242, 254)}.ace-katzenmilch .ace_marker-layer .ace_selected-word {border: 1px solid rgba(100, 5, 208, 0.27)}.ace-katzenmilch .ace_fold {background-color: rgba(2, 95, 73, 0.97);border-color: rgba(15, 0, 9, 1.0)}.ace-katzenmilch .ace_keyword {color: #674Aa8;rbackground-color: rgba(163, 170, 216, 0.055)}.ace-katzenmilch .ace_constant.ace_language {color: #7D7e52;rbackground-color: rgba(189, 190, 130, 0.059)}.ace-katzenmilch .ace_constant.ace_numeric {color: rgba(79, 130, 123, 0.93);rbackground-color: rgba(119, 194, 187, 0.059)}.ace-katzenmilch .ace_constant.ace_character,.ace-katzenmilch .ace_constant.ace_other {color: rgba(2, 95, 105, 1.0);rbackground-color: rgba(127, 34, 153, 0.063)}.ace-katzenmilch .ace_support.ace_function {color: #9D7e62;rbackground-color: rgba(189, 190, 130, 0.039)}.ace-katzenmilch .ace_support.ace_class {color: rgba(239, 106, 167, 1.0);rbackground-color: rgba(239, 106, 167, 0.063)}.ace-katzenmilch .ace_storage {color: rgba(123, 92, 191, 1.0);rbackground-color: rgba(139, 93, 223, 0.051)}.ace-katzenmilch .ace_invalid {color: #DFDFD5;rbackground-color: #CC1B27}.ace-katzenmilch .ace_string {color: #5a5f9b;rbackground-color: rgba(170, 175, 219, 0.035)}.ace-katzenmilch .ace_comment {font-style: italic;color: rgba(64, 79, 80, 0.67);rbackground-color: rgba(95, 15, 255, 0.0078)}.ace-katzenmilch .ace_entity.ace_name.ace_function,.ace-katzenmilch .ace_variable {color: rgba(2, 95, 73, 0.97);rbackground-color: rgba(34, 255, 73, 0.12)}.ace-katzenmilch .ace_variable.ace_language {color: #316fcf;rbackground-color: rgba(58, 175, 255, 0.039)}.ace-katzenmilch .ace_variable.ace_parameter {font-style: italic;color: rgba(51, 150, 159, 0.87);rbackground-color: rgba(5, 214, 249, 0.043)}.ace-katzenmilch .ace_entity.ace_other.ace_attribute-name {color: rgba(73, 70, 194, 0.93);rbackground-color: rgba(73, 134, 194, 0.035)}.ace-katzenmilch .ace_entity.ace_name.ace_tag {color: #3976a2;rbackground-color: rgba(73, 166, 210, 0.039)}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/kr_theme",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-kr-theme";a.cssText=".ace-kr-theme .ace_gutter {background: #1c1917;color: #FCFFE0}.ace-kr-theme .ace_print-margin {width: 1px;background: #1c1917}.ace-kr-theme {background-color: #0B0A09;color: #FCFFE0}.ace-kr-theme .ace_cursor {color: #FF9900}.ace-kr-theme .ace_marker-layer .ace_selection {background: rgba(170, 0, 255, 0.45)}.ace-kr-theme.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #0B0A09;border-radius: 2px}.ace-kr-theme .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-kr-theme .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 177, 111, 0.32)}.ace-kr-theme .ace_marker-layer .ace_active-line {background: #38403D}.ace-kr-theme .ace_gutter-active-line {background-color : #38403D}.ace-kr-theme .ace_marker-layer .ace_selected-word {border: 1px solid rgba(170, 0, 255, 0.45)}.ace-kr-theme .ace_invisible {color: rgba(255, 177, 111, 0.32)}.ace-kr-theme .ace_keyword,.ace-kr-theme .ace_meta {color: #949C8B}.ace-kr-theme .ace_constant,.ace-kr-theme .ace_constant.ace_character,.ace-kr-theme .ace_constant.ace_character.ace_escape,.ace-kr-theme .ace_constant.ace_other {color: rgba(210, 117, 24, 0.76)}.ace-kr-theme .ace_invalid {color: #F8F8F8;background-color: #A41300}.ace-kr-theme .ace_support {color: #9FC28A}.ace-kr-theme .ace_support.ace_constant {color: #C27E66}.ace-kr-theme .ace_fold {background-color: #949C8B;border-color: #FCFFE0}.ace-kr-theme .ace_support.ace_function {color: #85873A}.ace-kr-theme .ace_storage {color: #FFEE80}.ace-kr-theme .ace_string {color: rgba(164, 161, 181, 0.8)}.ace-kr-theme .ace_string.ace_regexp {color: rgba(125, 255, 192, 0.65)}.ace-kr-theme .ace_comment {font-style: italic;color: #706D5B}.ace-kr-theme .ace_variable {color: #D1A796}.ace-kr-theme .ace_list,.ace-kr-theme .ace_markup.ace_list {background-color: #0F0040}.ace-kr-theme .ace_variable.ace_language {color: #FF80E1}.ace-kr-theme .ace_meta.ace_tag {color: #BABD9C}.ace-kr-theme .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/kuroir",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-kuroir";a.cssText="/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: 467560D0-6ACE-4409-82FD-4791420837AC) */.ace-kuroir .ace_gutter {background: #e8e8e8;color: #333;}.ace-kuroir .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-kuroir {background-color: #E8E9E8;color: #363636;}.ace-kuroir .ace_cursor {color: #202020;}.ace-kuroir .ace_marker-layer .ace_selection {background: rgba(245, 170, 0, 0.57);}.ace-kuroir.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #E8E9E8;border-radius: 2px;}.ace-kuroir .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-kuroir .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(0, 0, 0, 0.29);}.ace-kuroir .ace_marker-layer .ace_active-line {background: rgba(203, 220, 47, 0.22);}.ace-kuroir .ace_gutter-active-line {background-color: rgba(203, 220, 47, 0.22);}.ace-kuroir .ace_marker-layer .ace_selected-word {border: 1px solid rgba(245, 170, 0, 0.57);}.ace-kuroir .ace_fold {border-color: #363636;}.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;background-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;font-style:italic;color:#FD1732;background-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;background-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);background-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;background-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/merbivore",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-merbivore";a.cssText=".ace-merbivore .ace_gutter {background: #202020;color: #E6E1DC}.ace-merbivore .ace_print-margin {width: 1px;background: #555651}.ace-merbivore {background-color: #161616;color: #E6E1DC}.ace-merbivore .ace_cursor {color: #FFFFFF}.ace-merbivore .ace_marker-layer .ace_selection {background: #454545}.ace-merbivore.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #161616;border-radius: 2px}.ace-merbivore .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-merbivore .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-merbivore .ace_marker-layer .ace_active-line {background: #333435}.ace-merbivore .ace_gutter-active-line {background-color: #333435}.ace-merbivore .ace_marker-layer .ace_selected-word {border: 1px solid #454545}.ace-merbivore .ace_invisible {color: #404040}.ace-merbivore .ace_entity.ace_name.ace_tag,.ace-merbivore .ace_keyword,.ace-merbivore .ace_meta,.ace-merbivore .ace_meta.ace_tag,.ace-merbivore .ace_storage,.ace-merbivore .ace_support.ace_function {color: #FC6F09}.ace-merbivore .ace_constant,.ace-merbivore .ace_constant.ace_character,.ace-merbivore .ace_constant.ace_character.ace_escape,.ace-merbivore .ace_constant.ace_other,.ace-merbivore .ace_support.ace_type {color: #1EDAFB}.ace-merbivore .ace_constant.ace_character.ace_escape {color: #519F50}.ace-merbivore .ace_constant.ace_language {color: #FDC251}.ace-merbivore .ace_constant.ace_library,.ace-merbivore .ace_string,.ace-merbivore .ace_support.ace_constant {color: #8DFF0A}.ace-merbivore .ace_constant.ace_numeric {color: #58C554}.ace-merbivore .ace_invalid {color: #FFFFFF;background-color: #990000}.ace-merbivore .ace_fold {background-color: #FC6F09;border-color: #E6E1DC}.ace-merbivore .ace_comment {font-style: italic;color: #AD2EA4}.ace-merbivore .ace_entity.ace_other.ace_attribute-name {color: #FFFF89}.ace-merbivore .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/merbivore_soft",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-merbivore-soft";a.cssText=".ace-merbivore-soft .ace_gutter {background: #262424;color: #E6E1DC}.ace-merbivore-soft .ace_print-margin {width: 1px;background: #262424}.ace-merbivore-soft {background-color: #1C1C1C;color: #E6E1DC}.ace-merbivore-soft .ace_cursor {color: #FFFFFF}.ace-merbivore-soft .ace_marker-layer .ace_selection {background: #494949}.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #1C1C1C;border-radius: 2px}.ace-merbivore-soft .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-merbivore-soft .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-merbivore-soft .ace_marker-layer .ace_active-line {background: #333435}.ace-merbivore-soft .ace_gutter-active-line {background-color: #333435}.ace-merbivore-soft .ace_marker-layer .ace_selected-word {border: 1px solid #494949}.ace-merbivore-soft .ace_invisible {color: #404040}.ace-merbivore-soft .ace_entity.ace_name.ace_tag,.ace-merbivore-soft .ace_keyword,.ace-merbivore-soft .ace_meta,.ace-merbivore-soft .ace_meta.ace_tag,.ace-merbivore-soft .ace_storage {color: #FC803A}.ace-merbivore-soft .ace_constant,.ace-merbivore-soft .ace_constant.ace_character,.ace-merbivore-soft .ace_constant.ace_character.ace_escape,.ace-merbivore-soft .ace_constant.ace_other,.ace-merbivore-soft .ace_support.ace_type {color: #68C1D8}.ace-merbivore-soft .ace_constant.ace_character.ace_escape {color: #B3E5B4}.ace-merbivore-soft .ace_constant.ace_language {color: #E1C582}.ace-merbivore-soft .ace_constant.ace_library,.ace-merbivore-soft .ace_string,.ace-merbivore-soft .ace_support.ace_constant {color: #8EC65F}.ace-merbivore-soft .ace_constant.ace_numeric {color: #7FC578}.ace-merbivore-soft .ace_invalid,.ace-merbivore-soft .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #FE3838}.ace-merbivore-soft .ace_fold {background-color: #FC803A;border-color: #E6E1DC}.ace-merbivore-soft .ace_comment,.ace-merbivore-soft .ace_meta {font-style: italic;color: #AC4BB8}.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {color: #EAF1A3}.ace-merbivore-soft .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/mono_industrial",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-mono-industrial";a.cssText=".ace-mono-industrial .ace_gutter {background: #1d2521;color: #C5C9C9}.ace-mono-industrial .ace_print-margin {width: 1px;background: #555651}.ace-mono-industrial {background-color: #222C28;color: #FFFFFF}.ace-mono-industrial .ace_cursor {color: #FFFFFF}.ace-mono-industrial .ace_marker-layer .ace_selection {background: rgba(145, 153, 148, 0.40)}.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #222C28;border-radius: 2px}.ace-mono-industrial .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-mono-industrial .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(102, 108, 104, 0.50)}.ace-mono-industrial .ace_marker-layer .ace_active-line {background: rgba(12, 13, 12, 0.25)}.ace-mono-industrial .ace_gutter-active-line {background-color: rgba(12, 13, 12, 0.25)}.ace-mono-industrial .ace_marker-layer .ace_selected-word {border: 1px solid rgba(145, 153, 148, 0.40)}.ace-mono-industrial .ace_invisible {color: rgba(102, 108, 104, 0.50)}.ace-mono-industrial .ace_string {background-color: #151C19;color: #FFFFFF}.ace-mono-industrial .ace_keyword,.ace-mono-industrial .ace_meta {color: #A39E64}.ace-mono-industrial .ace_constant,.ace-mono-industrial .ace_constant.ace_character,.ace-mono-industrial .ace_constant.ace_character.ace_escape,.ace-mono-industrial .ace_constant.ace_numeric,.ace-mono-industrial .ace_constant.ace_other {color: #E98800}.ace-mono-industrial .ace_entity.ace_name.ace_function,.ace-mono-industrial .ace_keyword.ace_operator,.ace-mono-industrial .ace_variable {color: #A8B3AB}.ace-mono-industrial .ace_invalid {color: #FFFFFF;background-color: rgba(153, 0, 0, 0.68)}.ace-mono-industrial .ace_support.ace_constant {color: #C87500}.ace-mono-industrial .ace_fold {background-color: #A8B3AB;border-color: #FFFFFF}.ace-mono-industrial .ace_support.ace_function {color: #588E60}.ace-mono-industrial .ace_entity.ace_name,.ace-mono-industrial .ace_support.ace_class,.ace-mono-industrial .ace_support.ace_type {color: #5778B6}.ace-mono-industrial .ace_storage {color: #C23B00}.ace-mono-industrial .ace_variable.ace_language,.ace-mono-industrial .ace_variable.ace_parameter {color: #648BD2}.ace-mono-industrial .ace_comment {color: #666C68;background-color: #151C19}.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {color: #909993}.ace-mono-industrial .ace_entity.ace_name.ace_tag {color: #A65EFF}.ace-mono-industrial .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/monokai",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-monokai";a.cssText=".ace-monokai .ace_gutter {background: #2F3129;color: #8F908A}.ace-monokai .ace_print-margin {width: 1px;background: #555651}.ace-monokai {background-color: #272822;color: #F8F8F2}.ace-monokai .ace_cursor {color: #F8F8F0}.ace-monokai .ace_marker-layer .ace_selection {background: #49483E}.ace-monokai.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #272822;border-radius: 2px}.ace-monokai .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-monokai .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #49483E}.ace-monokai .ace_marker-layer .ace_active-line {background: #202020}.ace-monokai .ace_gutter-active-line {background-color: #272727}.ace-monokai .ace_marker-layer .ace_selected-word {border: 1px solid #49483E}.ace-monokai .ace_invisible {color: #52524d}.ace-monokai .ace_entity.ace_name.ace_tag,.ace-monokai .ace_keyword,.ace-monokai .ace_meta.ace_tag,.ace-monokai .ace_storage {color: #F92672}.ace-monokai .ace_punctuation,.ace-monokai .ace_punctuation.ace_tag {color: #fff}.ace-monokai .ace_constant.ace_character,.ace-monokai .ace_constant.ace_language,.ace-monokai .ace_constant.ace_numeric,.ace-monokai .ace_constant.ace_other {color: #AE81FF}.ace-monokai .ace_invalid {color: #F8F8F0;background-color: #F92672}.ace-monokai .ace_invalid.ace_deprecated {color: #F8F8F0;background-color: #AE81FF}.ace-monokai .ace_support.ace_constant,.ace-monokai .ace_support.ace_function {color: #66D9EF}.ace-monokai .ace_fold {background-color: #A6E22E;border-color: #F8F8F2}.ace-monokai .ace_storage.ace_type,.ace-monokai .ace_support.ace_class,.ace-monokai .ace_support.ace_type {font-style: italic;color: #66D9EF}.ace-monokai .ace_entity.ace_name.ace_function,.ace-monokai .ace_entity.ace_other,.ace-monokai .ace_entity.ace_other.ace_attribute-name,.ace-monokai .ace_variable {color: #A6E22E}.ace-monokai .ace_variable.ace_parameter {font-style: italic;color: #FD971F}.ace-monokai .ace_string {color: #E6DB74}.ace-monokai .ace_comment {color: #75715E}.ace-monokai .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/pastel_on_dark",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-pastel-on-dark";a.cssText=".ace-pastel-on-dark .ace_gutter {background: #353030;color: #8F938F}.ace-pastel-on-dark .ace_print-margin {width: 1px;background: #353030}.ace-pastel-on-dark {background-color: #2C2828;color: #8F938F}.ace-pastel-on-dark .ace_cursor {color: #A7A7A7}.ace-pastel-on-dark .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20)}.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #2C2828;border-radius: 2px}.ace-pastel-on-dark .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-pastel-on-dark .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25)}.ace-pastel-on-dark .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031)}.ace-pastel-on-dark .ace_gutter-active-line {background-color: rgba(255, 255, 255, 0.031)}.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {border: 1px solid rgba(221, 240, 255, 0.20)}.ace-pastel-on-dark .ace_invisible {color: rgba(255, 255, 255, 0.25)}.ace-pastel-on-dark .ace_keyword,.ace-pastel-on-dark .ace_meta {color: #757aD8}.ace-pastel-on-dark .ace_constant,.ace-pastel-on-dark .ace_constant.ace_character,.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,.ace-pastel-on-dark .ace_constant.ace_other {color: #4FB7C5}.ace-pastel-on-dark .ace_keyword.ace_operator {color: #797878}.ace-pastel-on-dark .ace_constant.ace_character {color: #AFA472}.ace-pastel-on-dark .ace_constant.ace_language {color: #DE8E30}.ace-pastel-on-dark .ace_constant.ace_numeric {color: #CCCCCC}.ace-pastel-on-dark .ace_invalid,.ace-pastel-on-dark .ace_invalid.ace_illegal {color: #F8F8F8;background-color: rgba(86, 45, 86, 0.75)}.ace-pastel-on-dark .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1}.ace-pastel-on-dark .ace_fold {background-color: #757aD8;border-color: #8F938F}.ace-pastel-on-dark .ace_support.ace_function {color: #AEB2F8}.ace-pastel-on-dark .ace_string {color: #66A968}.ace-pastel-on-dark .ace_string.ace_regexp {color: #E9C062}.ace-pastel-on-dark .ace_comment {color: #A6C6FF}.ace-pastel-on-dark .ace_variable {color: #BEBF55}.ace-pastel-on-dark .ace_variable.ace_language {color: #C1C144}.ace-pastel-on-dark .ace_xml-pe {color: #494949}.ace-pastel-on-dark .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/solarized_dark",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-solarized-dark";a.cssText=".ace-solarized-dark .ace_gutter {background: #01313f;color: #d0edf7}.ace-solarized-dark .ace_print-margin {width: 1px;background: #33555E}.ace-solarized-dark {background-color: #002B36;color: #93A1A1}.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,.ace-solarized-dark .ace_storage {color: #93A1A1}.ace-solarized-dark .ace_cursor,.ace-solarized-dark .ace_string.ace_regexp {color: #D30102}.ace-solarized-dark .ace_marker-layer .ace_active-line,.ace-solarized-dark .ace_marker-layer .ace_selection {background: rgba(255, 255, 255, 0.1)}.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #002B36;border-radius: 2px}.ace-solarized-dark .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-solarized-dark .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(147, 161, 161, 0.50)}.ace-solarized-dark .ace_gutter-active-line {background-color: #0d3440}.ace-solarized-dark .ace_marker-layer .ace_selected-word {border: 1px solid #073642}.ace-solarized-dark .ace_invisible {color: rgba(147, 161, 161, 0.50)}.ace-solarized-dark .ace_keyword,.ace-solarized-dark .ace_meta,.ace-solarized-dark .ace_support.ace_class,.ace-solarized-dark .ace_support.ace_type {color: #859900}.ace-solarized-dark .ace_constant.ace_character,.ace-solarized-dark .ace_constant.ace_other {color: #CB4B16}.ace-solarized-dark .ace_constant.ace_language {color: #B58900}.ace-solarized-dark .ace_constant.ace_numeric {color: #D33682}.ace-solarized-dark .ace_fold {background-color: #268BD2;border-color: #93A1A1}.ace-solarized-dark .ace_entity.ace_name.ace_function,.ace-solarized-dark .ace_entity.ace_name.ace_tag,.ace-solarized-dark .ace_support.ace_function,.ace-solarized-dark .ace_variable,.ace-solarized-dark .ace_variable.ace_language {color: #268BD2}.ace-solarized-dark .ace_string {color: #2AA198}.ace-solarized-dark .ace_comment {font-style: italic;color: #657B83}.ace-solarized-dark .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/solarized_light",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-solarized-light";a.cssText=".ace-solarized-light .ace_gutter {background: #fbf1d3;color: #333}.ace-solarized-light .ace_print-margin {width: 1px;background: #e8e8e8}.ace-solarized-light {background-color: #FDF6E3;color: #586E75}.ace-solarized-light .ace_cursor {color: #000000}.ace-solarized-light .ace_marker-layer .ace_selection {background: rgba(7, 54, 67, 0.09)}.ace-solarized-light.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FDF6E3;border-radius: 2px}.ace-solarized-light .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-solarized-light .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(147, 161, 161, 0.50)}.ace-solarized-light .ace_marker-layer .ace_active-line {background: #EEE8D5}.ace-solarized-light .ace_gutter-active-line {background-color : #EDE5C1}.ace-solarized-light .ace_marker-layer .ace_selected-word {border: 1px solid #073642}.ace-solarized-light .ace_invisible {color: rgba(147, 161, 161, 0.50)}.ace-solarized-light .ace_keyword,.ace-solarized-light .ace_meta,.ace-solarized-light .ace_support.ace_class,.ace-solarized-light .ace_support.ace_type {color: #859900}.ace-solarized-light .ace_constant.ace_character,.ace-solarized-light .ace_constant.ace_other {color: #CB4B16}.ace-solarized-light .ace_constant.ace_language {color: #B58900}.ace-solarized-light .ace_constant.ace_numeric {color: #D33682}.ace-solarized-light .ace_fold {background-color: #268BD2;border-color: #586E75}.ace-solarized-light .ace_entity.ace_name.ace_function,.ace-solarized-light .ace_entity.ace_name.ace_tag,.ace-solarized-light .ace_support.ace_function,.ace-solarized-light .ace_variable,.ace-solarized-light .ace_variable.ace_language {color: #268BD2}.ace-solarized-light .ace_storage {color: #073642}.ace-solarized-light .ace_string {color: #2AA198}.ace-solarized-light .ace_string.ace_regexp {color: #D30102}.ace-solarized-light .ace_comment,.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {color: #93A1A1}.ace-solarized-light .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/terminal",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-terminal-theme";a.cssText=".ace-terminal-theme .ace_gutter {background: #1a0005;color: steelblue}.ace-terminal-theme .ace_print-margin {width: 1px;background: #1a1a1a}.ace-terminal-theme {background-color: black;color: #DEDEDE}.ace-terminal-theme .ace_cursor {color: #9F9F9F}.ace-terminal-theme .ace_marker-layer .ace_selection {background: #424242}.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px black;border-radius: 2px}.ace-terminal-theme .ace_marker-layer .ace_step {background: rgb(0, 0, 0)}.ace-terminal-theme .ace_marker-layer .ace_bracket {background: #090;}.ace-terminal-theme .ace_marker-layer .ace_bracket-start {background: #090;}.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {margin: -1px 0 0 -1px;border: 1px solid #900}.ace-terminal-theme .ace_marker-layer .ace_active-line {background: #2A2A2A}.ace-terminal-theme .ace_gutter-active-line {background-color: #2A112A}.ace-terminal-theme .ace_marker-layer .ace_selected-word {border: 1px solid #424242}.ace-terminal-theme .ace_invisible {color: #343434}.ace-terminal-theme .ace_keyword,.ace-terminal-theme .ace_meta,.ace-terminal-theme .ace_storage,.ace-terminal-theme .ace_storage.ace_type,.ace-terminal-theme .ace_support.ace_type {color: tomato}.ace-terminal-theme .ace_keyword.ace_operator {color: deeppink}.ace-terminal-theme .ace_constant.ace_character,.ace-terminal-theme .ace_constant.ace_language,.ace-terminal-theme .ace_constant.ace_numeric,.ace-terminal-theme .ace_keyword.ace_other.ace_unit,.ace-terminal-theme .ace_support.ace_constant,.ace-terminal-theme .ace_variable.ace_parameter {color: #E78C45}.ace-terminal-theme .ace_constant.ace_other {color: gold}.ace-terminal-theme .ace_invalid {color: yellow;background-color: red}.ace-terminal-theme .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-terminal-theme .ace_fold {background-color: #7AA6DA;border-color: #DEDEDE}.ace-terminal-theme .ace_entity.ace_name.ace_function,.ace-terminal-theme .ace_support.ace_function,.ace-terminal-theme .ace_variable {color: #7AA6DA}.ace-terminal-theme .ace_support.ace_class,.ace-terminal-theme .ace_support.ace_type {color: #E7C547}.ace-terminal-theme .ace_heading,.ace-terminal-theme .ace_string {color: #B9CA4A}.ace-terminal-theme .ace_entity.ace_name.ace_tag,.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,.ace-terminal-theme .ace_meta.ace_tag,.ace-terminal-theme .ace_string.ace_regexp,.ace-terminal-theme .ace_variable {color: #D54E53}.ace-terminal-theme .ace_comment {color: orangered}.ace-terminal-theme .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-tm";a.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;border-radius: 2px;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-tomorrow";a.cssText=".ace-tomorrow .ace_gutter {background: #f6f6f6;color: #4D4D4C}.ace-tomorrow .ace_print-margin {width: 1px;background: #f6f6f6}.ace-tomorrow {background-color: #FFFFFF;color: #4D4D4C}.ace-tomorrow .ace_cursor {color: #AEAFAD}.ace-tomorrow .ace_marker-layer .ace_selection {background: #D6D6D6}.ace-tomorrow.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;border-radius: 2px}.ace-tomorrow .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-tomorrow .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #D1D1D1}.ace-tomorrow .ace_marker-layer .ace_active-line {background: #EFEFEF}.ace-tomorrow .ace_gutter-active-line {background-color : #dcdcdc}.ace-tomorrow .ace_marker-layer .ace_selected-word {border: 1px solid #D6D6D6}.ace-tomorrow .ace_invisible {color: #D1D1D1}.ace-tomorrow .ace_keyword,.ace-tomorrow .ace_meta,.ace-tomorrow .ace_storage,.ace-tomorrow .ace_storage.ace_type,.ace-tomorrow .ace_support.ace_type {color: #8959A8}.ace-tomorrow .ace_keyword.ace_operator {color: #3E999F}.ace-tomorrow .ace_constant.ace_character,.ace-tomorrow .ace_constant.ace_language,.ace-tomorrow .ace_constant.ace_numeric,.ace-tomorrow .ace_keyword.ace_other.ace_unit,.ace-tomorrow .ace_support.ace_constant,.ace-tomorrow .ace_variable.ace_parameter {color: #F5871F}.ace-tomorrow .ace_constant.ace_other {color: #666969}.ace-tomorrow .ace_invalid {color: #FFFFFF;background-color: #C82829}.ace-tomorrow .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #8959A8}.ace-tomorrow .ace_fold {background-color: #4271AE;border-color: #4D4D4C}.ace-tomorrow .ace_entity.ace_name.ace_function,.ace-tomorrow .ace_support.ace_function,.ace-tomorrow .ace_variable {color: #4271AE}.ace-tomorrow .ace_support.ace_class,.ace-tomorrow .ace_support.ace_type {color: #C99E00}.ace-tomorrow .ace_heading,.ace-tomorrow .ace_markup.ace_heading,.ace-tomorrow .ace_string {color: #718C00}.ace-tomorrow .ace_entity.ace_name.ace_tag,.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow .ace_meta.ace_tag,.ace-tomorrow .ace_string.ace_regexp,.ace-tomorrow .ace_variable {color: #C82829}.ace-tomorrow .ace_comment {color: #8E908C}.ace-tomorrow .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow_night",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-tomorrow-night";a.cssText=".ace-tomorrow-night .ace_gutter {background: #25282c;color: #C5C8C6}.ace-tomorrow-night .ace_print-margin {width: 1px;background: #25282c}.ace-tomorrow-night {background-color: #1D1F21;color: #C5C8C6}.ace-tomorrow-night .ace_cursor {color: #AEAFAD}.ace-tomorrow-night .ace_marker-layer .ace_selection {background: #373B41}.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #1D1F21;border-radius: 2px}.ace-tomorrow-night .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #4B4E55}.ace-tomorrow-night .ace_marker-layer .ace_active-line {background: #282A2E}.ace-tomorrow-night .ace_gutter-active-line {background-color: #282A2E}.ace-tomorrow-night .ace_marker-layer .ace_selected-word {border: 1px solid #373B41}.ace-tomorrow-night .ace_invisible {color: #4B4E55}.ace-tomorrow-night .ace_keyword,.ace-tomorrow-night .ace_meta,.ace-tomorrow-night .ace_storage,.ace-tomorrow-night .ace_storage.ace_type,.ace-tomorrow-night .ace_support.ace_type {color: #B294BB}.ace-tomorrow-night .ace_keyword.ace_operator {color: #8ABEB7}.ace-tomorrow-night .ace_constant.ace_character,.ace-tomorrow-night .ace_constant.ace_language,.ace-tomorrow-night .ace_constant.ace_numeric,.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night .ace_support.ace_constant,.ace-tomorrow-night .ace_variable.ace_parameter {color: #DE935F}.ace-tomorrow-night .ace_constant.ace_other {color: #CED1CF}.ace-tomorrow-night .ace_invalid {color: #CED2CF;background-color: #DF5F5F}.ace-tomorrow-night .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-tomorrow-night .ace_fold {background-color: #81A2BE;border-color: #C5C8C6}.ace-tomorrow-night .ace_entity.ace_name.ace_function,.ace-tomorrow-night .ace_support.ace_function,.ace-tomorrow-night .ace_variable {color: #81A2BE}.ace-tomorrow-night .ace_support.ace_class,.ace-tomorrow-night .ace_support.ace_type {color: #F0C674}.ace-tomorrow-night .ace_heading,.ace-tomorrow-night .ace_markup.ace_heading,.ace-tomorrow-night .ace_string {color: #B5BD68}.ace-tomorrow-night .ace_entity.ace_name.ace_tag,.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night .ace_meta.ace_tag,.ace-tomorrow-night .ace_string.ace_regexp,.ace-tomorrow-night .ace_variable {color: #CC6666}.ace-tomorrow-night .ace_comment {color: #969896}.ace-tomorrow-night .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow_night_blue",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-tomorrow-night-blue";a.cssText=".ace-tomorrow-night-blue .ace_gutter {background: #00204b;color: #7388b5}.ace-tomorrow-night-blue .ace_print-margin {width: 1px;background: #00204b}.ace-tomorrow-night-blue {background-color: #002451;color: #FFFFFF}.ace-tomorrow-night-blue .ace_constant.ace_other,.ace-tomorrow-night-blue .ace_cursor {color: #FFFFFF}.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {background: #003F8E}.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #002451;border-radius: 2px}.ace-tomorrow-night-blue .ace_marker-layer .ace_step {background: rgb(127, 111, 19)}.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404F7D}.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {background: #00346E}.ace-tomorrow-night-blue .ace_gutter-active-line {background-color: #022040}.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {border: 1px solid #003F8E}.ace-tomorrow-night-blue .ace_invisible {color: #404F7D}.ace-tomorrow-night-blue .ace_keyword,.ace-tomorrow-night-blue .ace_meta,.ace-tomorrow-night-blue .ace_storage,.ace-tomorrow-night-blue .ace_storage.ace_type,.ace-tomorrow-night-blue .ace_support.ace_type {color: #EBBBFF}.ace-tomorrow-night-blue .ace_keyword.ace_operator {color: #99FFFF}.ace-tomorrow-night-blue .ace_constant.ace_character,.ace-tomorrow-night-blue .ace_constant.ace_language,.ace-tomorrow-night-blue .ace_constant.ace_numeric,.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night-blue .ace_support.ace_constant,.ace-tomorrow-night-blue .ace_variable.ace_parameter {color: #FFC58F}.ace-tomorrow-night-blue .ace_invalid {color: #FFFFFF;background-color: #F99DA5}.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #EBBBFF}.ace-tomorrow-night-blue .ace_fold {background-color: #BBDAFF;border-color: #FFFFFF}.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,.ace-tomorrow-night-blue .ace_support.ace_function,.ace-tomorrow-night-blue .ace_variable {color: #BBDAFF}.ace-tomorrow-night-blue .ace_support.ace_class,.ace-tomorrow-night-blue .ace_support.ace_type {color: #FFEEAD}.ace-tomorrow-night-blue .ace_heading,.ace-tomorrow-night-blue .ace_markup.ace_heading,.ace-tomorrow-night-blue .ace_string {color: #D1F1A9}.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night-blue .ace_meta.ace_tag,.ace-tomorrow-night-blue .ace_string.ace_regexp,.ace-tomorrow-night-blue .ace_variable {color: #FF9DA4}.ace-tomorrow-night-blue .ace_comment {color: #7285B7}.ace-tomorrow-night-blue .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow_night_bright",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-tomorrow-night-bright";a.cssText=".ace-tomorrow-night-bright .ace_gutter {background: #1a1a1a;color: #DEDEDE}.ace-tomorrow-night-bright .ace_print-margin {width: 1px;background: #1a1a1a}.ace-tomorrow-night-bright {background-color: #000000;color: #DEDEDE}.ace-tomorrow-night-bright .ace_cursor {color: #9F9F9F}.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {background: #424242}.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #000000;border-radius: 2px}.ace-tomorrow-night-bright .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #888888}.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {border: 1px solid rgb(110, 119, 0);border-bottom: 0;box-shadow: inset 0 -1px rgb(110, 119, 0);margin: -1px 0 0 -1px;background: rgba(255, 235, 0, 0.1);}.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {background: #2A2A2A}.ace-tomorrow-night-bright .ace_gutter-active-line {background-color: #2A2A2A}.ace-tomorrow-night-bright .ace_stack {background-color: rgb(66, 90, 44)}.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {border: 1px solid #888888}.ace-tomorrow-night-bright .ace_invisible {color: #343434}.ace-tomorrow-night-bright .ace_keyword,.ace-tomorrow-night-bright .ace_meta,.ace-tomorrow-night-bright .ace_storage,.ace-tomorrow-night-bright .ace_storage.ace_type,.ace-tomorrow-night-bright .ace_support.ace_type {color: #C397D8}.ace-tomorrow-night-bright .ace_keyword.ace_operator {color: #70C0B1}.ace-tomorrow-night-bright .ace_constant.ace_character,.ace-tomorrow-night-bright .ace_constant.ace_language,.ace-tomorrow-night-bright .ace_constant.ace_numeric,.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night-bright .ace_support.ace_constant,.ace-tomorrow-night-bright .ace_variable.ace_parameter {color: #E78C45}.ace-tomorrow-night-bright .ace_constant.ace_other {color: #EEEEEE}.ace-tomorrow-night-bright .ace_invalid {color: #CED2CF;background-color: #DF5F5F}.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-tomorrow-night-bright .ace_fold {background-color: #7AA6DA;border-color: #DEDEDE}.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,.ace-tomorrow-night-bright .ace_support.ace_function,.ace-tomorrow-night-bright .ace_variable {color: #7AA6DA}.ace-tomorrow-night-bright .ace_support.ace_class,.ace-tomorrow-night-bright .ace_support.ace_type {color: #E7C547}.ace-tomorrow-night-bright .ace_heading,.ace-tomorrow-night-bright .ace_markup.ace_heading,.ace-tomorrow-night-bright .ace_string {color: #B9CA4A}.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night-bright .ace_meta.ace_tag,.ace-tomorrow-night-bright .ace_string.ace_regexp,.ace-tomorrow-night-bright .ace_variable {color: #D54E53}.ace-tomorrow-night-bright .ace_comment {color: #969896}.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {color: #C2C280;}.ace-tomorrow-night-bright .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow_night_eighties",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-tomorrow-night-eighties";a.cssText=".ace-tomorrow-night-eighties .ace_gutter {background: #272727;color: #CCC}.ace-tomorrow-night-eighties .ace_print-margin {width: 1px;background: #272727}.ace-tomorrow-night-eighties {background-color: #2D2D2D;color: #CCCCCC}.ace-tomorrow-night-eighties .ace_constant.ace_other,.ace-tomorrow-night-eighties .ace_cursor {color: #CCCCCC}.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {background: #515151}.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #2D2D2D;border-radius: 2px}.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #6A6A6A}.ace-tomorrow-night-bright .ace_stack {background: rgb(66, 90, 44)}.ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {background: #393939}.ace-tomorrow-night-eighties .ace_gutter-active-line {background-color: #393939}.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected-word {border: 1px solid #515151}.ace-tomorrow-night-eighties .ace_invisible {color: #6A6A6A}.ace-tomorrow-night-eighties .ace_keyword,.ace-tomorrow-night-eighties .ace_meta,.ace-tomorrow-night-eighties .ace_storage,.ace-tomorrow-night-eighties .ace_storage.ace_type,.ace-tomorrow-night-eighties .ace_support.ace_type {color: #CC99CC}.ace-tomorrow-night-eighties .ace_keyword.ace_operator {color: #66CCCC}.ace-tomorrow-night-eighties .ace_constant.ace_character,.ace-tomorrow-night-eighties .ace_constant.ace_language,.ace-tomorrow-night-eighties .ace_constant.ace_numeric,.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night-eighties .ace_support.ace_constant,.ace-tomorrow-night-eighties .ace_variable.ace_parameter {color: #F99157}.ace-tomorrow-night-eighties .ace_invalid {color: #CDCDCD;background-color: #F2777A}.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {color: #CDCDCD;background-color: #CC99CC}.ace-tomorrow-night-eighties .ace_fold {background-color: #6699CC;border-color: #CCCCCC}.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,.ace-tomorrow-night-eighties .ace_support.ace_function,.ace-tomorrow-night-eighties .ace_variable {color: #6699CC}.ace-tomorrow-night-eighties .ace_support.ace_class,.ace-tomorrow-night-eighties .ace_support.ace_type {color: #FFCC66}.ace-tomorrow-night-eighties .ace_heading,.ace-tomorrow-night-eighties .ace_markup.ace_heading,.ace-tomorrow-night-eighties .ace_string {color: #99CC99}.ace-tomorrow-night-eighties .ace_comment {color: #999999}.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night-eighties .ace_meta.ace_tag,.ace-tomorrow-night-eighties .ace_variable {color: #F2777A}.ace-tomorrow-night-eighties .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/twilight",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-twilight";a.cssText=".ace-twilight .ace_gutter {background: #232323;color: #E2E2E2}.ace-twilight .ace_print-margin {width: 1px;background: #232323}.ace-twilight {background-color: #141414;color: #F8F8F8}.ace-twilight .ace_cursor {color: #A7A7A7}.ace-twilight .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20)}.ace-twilight.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #141414;border-radius: 2px}.ace-twilight .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-twilight .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25)}.ace-twilight .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031)}.ace-twilight .ace_gutter-active-line {background-color: rgba(255, 255, 255, 0.031)}.ace-twilight .ace_marker-layer .ace_selected-word {border: 1px solid rgba(221, 240, 255, 0.20)}.ace-twilight .ace_invisible {color: rgba(255, 255, 255, 0.25)}.ace-twilight .ace_keyword,.ace-twilight .ace_meta {color: #CDA869}.ace-twilight .ace_constant,.ace-twilight .ace_constant.ace_character,.ace-twilight .ace_constant.ace_character.ace_escape,.ace-twilight .ace_constant.ace_other,.ace-twilight .ace_heading,.ace-twilight .ace_markup.ace_heading,.ace-twilight .ace_support.ace_constant {color: #CF6A4C}.ace-twilight .ace_invalid.ace_illegal {color: #F8F8F8;background-color: rgba(86, 45, 86, 0.75)}.ace-twilight .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1}.ace-twilight .ace_support {color: #9B859D}.ace-twilight .ace_fold {background-color: #AC885B;border-color: #F8F8F8}.ace-twilight .ace_support.ace_function {color: #DAD085}.ace-twilight .ace_list,.ace-twilight .ace_markup.ace_list,.ace-twilight .ace_storage {color: #F9EE98}.ace-twilight .ace_entity.ace_name.ace_function,.ace-twilight .ace_meta.ace_tag,.ace-twilight .ace_variable {color: #AC885B}.ace-twilight .ace_string {color: #8F9D6A}.ace-twilight .ace_string.ace_regexp {color: #E9C062}.ace-twilight .ace_comment {font-style: italic;color: #5F5A60}.ace-twilight .ace_variable {color: #7587A6}.ace-twilight .ace_xml-pe {color: #494949}.ace-twilight .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/vibrant_ink",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-vibrant-ink";a.cssText=".ace-vibrant-ink .ace_gutter {background: #1a1a1a;color: #BEBEBE}.ace-vibrant-ink .ace_print-margin {width: 1px;background: #1a1a1a}.ace-vibrant-ink {background-color: #0F0F0F;color: #FFFFFF}.ace-vibrant-ink .ace_cursor {color: #FFFFFF}.ace-vibrant-ink .ace_marker-layer .ace_selection {background: #6699CC}.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #0F0F0F;border-radius: 2px}.ace-vibrant-ink .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-vibrant-ink .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-vibrant-ink .ace_marker-layer .ace_active-line {background: #333333}.ace-vibrant-ink .ace_gutter-active-line {background-color: #333333}.ace-vibrant-ink .ace_marker-layer .ace_selected-word {border: 1px solid #6699CC}.ace-vibrant-ink .ace_invisible {color: #404040}.ace-vibrant-ink .ace_keyword,.ace-vibrant-ink .ace_meta {color: #FF6600}.ace-vibrant-ink .ace_constant,.ace-vibrant-ink .ace_constant.ace_character,.ace-vibrant-ink .ace_constant.ace_character.ace_escape,.ace-vibrant-ink .ace_constant.ace_other {color: #339999}.ace-vibrant-ink .ace_constant.ace_numeric {color: #99CC99}.ace-vibrant-ink .ace_invalid,.ace-vibrant-ink .ace_invalid.ace_deprecated {color: #CCFF33;background-color: #000000}.ace-vibrant-ink .ace_fold {background-color: #FFCC00;border-color: #FFFFFF}.ace-vibrant-ink .ace_entity.ace_name.ace_function,.ace-vibrant-ink .ace_support.ace_function,.ace-vibrant-ink .ace_variable {color: #FFCC00}.ace-vibrant-ink .ace_variable.ace_parameter {font-style: italic}.ace-vibrant-ink .ace_string {color: #66FF00}.ace-vibrant-ink .ace_string.ace_regexp {color: #44B4CC}.ace-vibrant-ink .ace_comment {color: #9933CC}.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {font-style: italic;color: #99CC99}.ace-vibrant-ink .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/xcode",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-xcode";a.cssText="/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: EE3AD170-2B7F-4DE1-B724-C75F13FE0085) */.ace-xcode .ace_gutter {background: #e8e8e8;color: #333}.ace-xcode .ace_print-margin {width: 1px;background: #e8e8e8}.ace-xcode {background-color: #FFFFFF;color: #000000}.ace-xcode .ace_cursor {color: #000000}.ace-xcode .ace_marker-layer .ace_selection {background: #B5D5FF}.ace-xcode.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;border-radius: 2px}.ace-xcode .ace_marker-layer .ace_step {background: rgb(198, 219, 174)}.ace-xcode .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-xcode .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.071)}.ace-xcode .ace_gutter-active-line {background-color: rgba(0, 0, 0, 0.071)}.ace-xcode .ace_marker-layer .ace_selected-word {border: 1px solid #B5D5FF}.ace-xcode .ace_constant.ace_language,.ace-xcode .ace_keyword,.ace-xcode .ace_meta,.ace-xcode .ace_variable.ace_language {color: #C800A4}.ace-xcode .ace_invisible {color: #BFBFBF}.ace-xcode .ace_constant.ace_character,.ace-xcode .ace_constant.ace_other {color: #275A5E}.ace-xcode .ace_constant.ace_numeric {color: #3A00DC}.ace-xcode .ace_entity.ace_other.ace_attribute-name,.ace-xcode .ace_support.ace_constant,.ace-xcode .ace_support.ace_function {color: #450084}.ace-xcode .ace_fold {background-color: #C800A4;border-color: #000000}.ace-xcode .ace_entity.ace_name.ace_tag,.ace-xcode .ace_support.ace_class,.ace-xcode .ace_support.ace_type {color: #790EAD}.ace-xcode .ace_storage {color: #C900A4}.ace-xcode .ace_string {color: #DF0002}.ace-xcode .ace_comment {color: #008E00}.ace-xcode .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)}); \ No newline at end of file diff --git a/plotdevice/gfx/colors.py b/plotdevice/gfx/colors.py index eb094147..22d65c57 100644 --- a/plotdevice/gfx/colors.py +++ b/plotdevice/gfx/colors.py @@ -300,8 +300,10 @@ def recognized(cls, blob): if isinstance(blob, Color): return True - valid_str = lambda s: isinstance(s, str) and (s.strip() in _CSS_COLORS or \ - re.match(r'#?[a-z0-9]{3,8}$', s.strip()) ) + def valid_str(s): + s = s.strip() if isinstance(s, str) else '' + return s in _CSS_COLORS or re.match(r'#?[A-Fa-f0-9]{3,8}$', s) + if isinstance(blob, (tuple, list)): demoded = [b for b in blob if b not in (RGB,HSV,CMYK,GREY)] if all(numlike(n) and len(demoded)<=5 for n in blob): @@ -331,7 +333,7 @@ def _parse(cls, clrstr): if clrstr in _CSS_COLORS: # handle css color names clrstr = _CSS_COLORS[clrstr] - if re.search(r'#?[0-9a-f]{3,8}', clrstr): # rgb & rgba hex strings + if re.search(r'#?[0-9a-fA-F]{3,8}', clrstr): # rgb & rgba hex strings hexclr = clrstr.lstrip('#') if len(hexclr) in (3,4): hexclr = "".join(map("".join, zip(hexclr,hexclr))) From 418fa490cdd05c39f5d7e6034f4c62799ad5f009 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 24 Jun 2022 12:04:40 -0400 Subject: [PATCH 007/226] keep reference to exportPanel - remote views now cut the accessory view off from it --- plotdevice/gui/widgets.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plotdevice/gui/widgets.py b/plotdevice/gui/widgets.py index 1f64d905..8ba603e1 100644 --- a/plotdevice/gui/widgets.py +++ b/plotdevice/gui/widgets.py @@ -306,8 +306,8 @@ def beginExport(self, kind): exportPanel.setCanSelectHiddenExtension_(True) exportPanel.setShowsTagField_(False) exportPanel.setAllowedFileTypes_(list(filter(None, self.formats[kind]))) - exportPanel.setRequiredFileType_(format) exportPanel.setAccessoryView_(accessory) + self.exportPanel = exportPanel # present the dialog callback = "exportPanelDidEnd:returnCode:contextInfo:" @@ -370,17 +370,15 @@ def updateColorMode(self): @IBAction def imageFormatChanged_(self, sender): - panel = sender.window() format = self.formats['image'][sender.indexOfSelectedItem()] - panel.setRequiredFileType_(format) + self.exportPanel.setAllowedFileTypes_([format]) self.updateColorMode() self.updatePagination() @IBAction def movieFormatChanged_(self, sender): - panel = sender.window() format = self.formats['movie'][sender.indexOfSelectedItem()] - panel.setRequiredFileType_(format) + self.exportPanel.setAllowedFileTypes_([format]) is_gif = format=='gif' self.movieLoop.setState_(NSOnState if is_gif else NSOffState) self.movieLoop.setEnabled_(is_gif) From d1bf4cf1caa9d2872173192d1fb6ec904ebeec2f Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 24 Jun 2022 13:15:22 -0400 Subject: [PATCH 008/226] rename deprecated selectors --- app/deps/IO/AnimatedGif.m | 2 +- app/deps/IO/Video.m | 6 +++--- app/deps/foundry/Vandercook.m | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/deps/IO/AnimatedGif.m b/app/deps/IO/AnimatedGif.m index 8873f30f..768b5e1d 100644 --- a/app/deps/IO/AnimatedGif.m +++ b/app/deps/IO/AnimatedGif.m @@ -41,7 +41,7 @@ -(void) main{ // have CG render the frame and extract the gif89 data NSBitmapImageRep *imRep = [NSBitmapImageRep imageRepWithData:[self.frame TIFFRepresentation]]; - NSData *gifData = [imRep representationUsingType:NSGIFFileType properties:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:NSImageDitherTransparency]]; + NSData *gifData = [imRep representationUsingType:NSBitmapImageFileTypeGIF properties:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:NSImageDitherTransparency]]; UInt8 *gif = (UInt8 *)[gifData bytes]; GifMap map = [self _getOffsets:gifData]; // find the offsets for the important data blocks in the gif diff --git a/app/deps/IO/Video.m b/app/deps/IO/Video.m index 077a7ef8..c89a0481 100644 --- a/app/deps/IO/Video.m +++ b/app/deps/IO/Video.m @@ -85,10 +85,10 @@ - (CVPixelBufferRef)_pixelBufferFromNSImage:(NSImage*)image CGContextRef context = CGBitmapContextCreate(baseAddress, [image size].width, [image size].height, 8, bytesPerRow, colorSpace, (CGBitmapInfo)kCGImageAlphaNoneSkipFirst); // draw - NSGraphicsContext* imageContext = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:NO]; + NSGraphicsContext* imageContext = [NSGraphicsContext graphicsContextWithCGContext:context flipped:NO]; [NSGraphicsContext saveGraphicsState]; [NSGraphicsContext setCurrentContext:imageContext]; - [image drawAtPoint:NSMakePoint(0.0, 0.0) fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0]; + [image drawAtPoint:NSMakePoint(0.0, 0.0) fromRect:NSZeroRect operation:NSCompositingOperationCopy fraction:1.0]; [NSGraphicsContext restoreGraphicsState]; CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); @@ -115,7 +115,7 @@ - (id)initWithFile:(NSString *)fileName size:(CGSize)aSize fps:(NSUInteger)fps b videoWriter = [[AVAssetWriter alloc] initWithURL: [NSURL fileURLWithPath:fileName] fileType:AVFileTypeQuickTimeMovie error:&error]; NSParameterAssert(videoWriter); - NSDictionary *videoSettings = @{ AVVideoCodecKey: AVVideoCodecH264, + NSDictionary *videoSettings = @{ AVVideoCodecKey: AVVideoCodecTypeH264, AVVideoWidthKey: @(aSize.width), AVVideoHeightKey: [NSNumber numberWithInt:aSize.height], AVVideoCompressionPropertiesKey: @{ diff --git a/app/deps/foundry/Vandercook.m b/app/deps/foundry/Vandercook.m index d91f2b69..378604ed 100644 --- a/app/deps/foundry/Vandercook.m +++ b/app/deps/foundry/Vandercook.m @@ -101,7 +101,7 @@ + (NSBezierPath *)traceGlyphs:(NSRange)rng atOffset:(NSPoint)offset withLayout:( NSUInteger txt_idx = [layout characterIndexForGlyphAtIndex:glyph_idx]; NSFont *font = [store attribute:@"NSFont" atIndex:txt_idx effectiveRange:nil]; NSGlyph glyph = [layout glyphAtIndex:glyph_idx]; - [path appendBezierPathWithGlyph:glyph inFont:font]; + [path appendBezierPathWithCGGlyph:glyph inFont:font]; [path closePath]; } From 72eaaa67e0bb4f519212fc87cef0a662ed995624 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 24 Jun 2022 15:00:13 -0400 Subject: [PATCH 009/226] remember format between exports --- plotdevice/gui/widgets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plotdevice/gui/widgets.py b/plotdevice/gui/widgets.py index 8ba603e1..02e1c40d 100644 --- a/plotdevice/gui/widgets.py +++ b/plotdevice/gui/widgets.py @@ -305,7 +305,7 @@ def beginExport(self, kind): exportPanel.setPrompt_("Export") exportPanel.setCanSelectHiddenExtension_(True) exportPanel.setShowsTagField_(False) - exportPanel.setAllowedFileTypes_(list(filter(None, self.formats[kind]))) + exportPanel.setAllowedFileTypes_([format]) exportPanel.setAccessoryView_(accessory) self.exportPanel = exportPanel From c20e065adcbcd5112a93bb79914f4b377240393a Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 24 Jun 2022 15:02:35 -0400 Subject: [PATCH 010/226] fix image scaling/bounds bugs on retina - now using a CGImage-backed offscreen context to generate bitmaps rather than reusing the in-window NSView --- plotdevice/context.py | 38 ++++++++++++++++---------------------- plotdevice/lib/cocoa.py | 12 +++++++++--- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/plotdevice/context.py b/plotdevice/context.py index c4ccca51..4474662a 100644 --- a/plotdevice/context.py +++ b/plotdevice/context.py @@ -1735,9 +1735,6 @@ def _nsImage(self): def _cg_image(self, zoom=1.0): """Return a CGImage with the canvas dimensions scaled to the specified zoom level""" - from Quartz import CGBitmapContextCreate, CGBitmapContextCreateImage, CGColorSpaceCreateDeviceRGB, CGContextClearRect - from Quartz import CGSizeMake, CGRectMake - from Quartz import kCGImageAlphaPremultipliedFirst, kCGBitmapByteOrder32Host, kCGImageAlphaNoneSkipFirst w,h = self.pagesize # size = Size(int(w*zoom), int(h*zoom)) size = Size(*[int(dim*zoom) for dim in self.pagesize]) @@ -1748,7 +1745,7 @@ def _cg_image(self, zoom=1.0): CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host) - ns_ctx = NSGraphicsContext.graphicsContextWithGraphicsPort_flipped_(bitmapContext, True) + ns_ctx = NSGraphicsContext.graphicsContextWithCGContext_flipped_(bitmapContext, True) NSGraphicsContext.saveGraphicsState() NSGraphicsContext.setCurrentContext_(ns_ctx) trans = NSAffineTransform.transform() @@ -1787,8 +1784,7 @@ def rasterize(self, zoom=1.0): """Return an NSImage with the canvas dimensions scaled to the specified zoom level""" w,h = self.pagesize img = NSImage.alloc().initWithSize_((w*zoom, h*zoom)) - img.setFlipped_(True) - img.lockFocus() + img.lockFocusFlipped_(True) trans = NSAffineTransform.transform() trans.scaleBy_(zoom) trans.concat() @@ -1804,22 +1800,20 @@ def _getImageData(self, format): view = _PDFRenderView.alloc().initWithCanvas_(self) return view.dataWithEPSInsideRect_(view.bounds()) else: - imgTypes = {"gif": NSGIFFileType, - "jpg": NSJPEGFileType, - "jpeg": NSJPEGFileType, - "png": NSPNGFileType, - "tiff": NSTIFFFileType} - if format not in imgTypes: - badformat = "Filename should end in .pdf, .eps, .tiff, .gif, .jpg or .png" - raise DeviceError(badformat) - data = self.rasterize().TIFFRepresentation() - if format != 'tiff': - imgType = imgTypes[format] - rep = NSBitmapImageRep.imageRepWithData_(data) - props = {NSImageCompressionFactor:1.0} if format in ('jpg','jpeg') else None - return rep.representationUsingType_properties_(imgType, props) - else: - return data + cgTypes = {"gif": kUTTypeGIF, + "jpg": kUTTypeJPEG, + "jpeg": kUTTypeJPEG, + "png": kUTTypePNG, + "tiff": kUTTypeTIFF} + + cgData = NSMutableData.data() + cgImage = self._cg_image() + cgDest = CGImageDestinationCreateWithData(cgData, cgTypes[format], 1, None) + if format in ('jpg','jpeg'): + CGImageDestinationSetProperties(cgDest, {kCGImageDestinationLossyCompressionQuality:1.0}) + CGImageDestinationAddImage(cgDest, cgImage, None) + CGImageDestinationFinalize(cgDest) + return cgData def save(self, fname, format=None): """Write the current graphics objects to an image file""" diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index 07b61876..887b2a42 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -10,6 +10,9 @@ CGImageGetBytesPerRow, CGImageGetDataProvider, CGImageGetHeight, CGImageGetWidth, \ CGImageMaskCreate, CGPathAddCurveToPoint, CGPathAddLineToPoint, CGPathCloseSubpath, \ CGPathCreateCopy, CGPathCreateMutable, CGPathRelease, CGPathMoveToPoint, kCGBlendModeClear, \ + CGBitmapContextCreate, CGBitmapContextCreateImage, CGColorSpaceCreateDeviceRGB, \ + CGImageDestinationCreateWithData, CGImageDestinationAddImage, CGImageDestinationFinalize, \ + CGImageDestinationSetProperties, CGContextClearRect, CGSizeMake, CGRectMake, \ kCGBlendModeColor, kCGBlendModeColorBurn, kCGBlendModeColorDodge, kCGBlendModeCopy, \ kCGBlendModeDarken, kCGBlendModeDestinationAtop, kCGBlendModeDestinationIn, \ kCGBlendModeDestinationOut, kCGBlendModeDestinationOver, kCGBlendModeDifference, \ @@ -19,7 +22,8 @@ kCGBlendModeScreen, kCGBlendModeSoftLight, kCGBlendModeSourceAtop, kCGBlendModeSourceIn, \ kCGBlendModeSourceOut, kCGBlendModeXOR, kCGLineCapButt, kCGLineCapRound, kCGLineCapSquare, \ kCGLineJoinBevel, kCGLineJoinMiter, kCGLineJoinRound, kCGPathFill, kCGPathFillStroke, \ - kCGPathStroke, kCIInputImageKey + kCGPathStroke, kCIInputImageKey, kCGImageDestinationLossyCompressionQuality, \ + kCGImageAlphaPremultipliedFirst, kCGBitmapByteOrder32Host, kCGImageAlphaNoneSkipFirst from AppKit import NSAlert, NSApp, NSApplication, NSApplicationActivationPolicyAccessory, \ NSBackingStoreBuffered, NSBeep, NSBezierPath, NSBitmapImageRep, NSBorderlessWindowMask, \ NSButton, NSCenterTextAlignment, NSChangeAutosaved, NSChangeCleared, NSChangeDone, \ @@ -47,9 +51,11 @@ NSAttributedString, NSAutoreleasePool, NSBundle, NSData, NSDate, NSDateFormatter, \ NSFileCoordinator, NSFileHandle, NSFileHandleDataAvailableNotification, NSIntersectionRange, \ NSHeight, NSInsetRect, NSIntersectionRect, NSLocale, NSLog, NSMacOSRomanStringEncoding, \ - NSMakeRange, NSMidX, NSMidY, NSMutableAttributedString, NSNotificationCenter, NSObject,\ + NSMakeRange, NSMidX, NSMidY, NSMutableAttributedString, NSMutableData, NSNotificationCenter, NSObject,\ NSOffsetRect, NSOperationQueue, NSPoint, NSRect, NSRectFromString, NSSelectorFromString, \ NSSize, NSString, NSStringFromRect, NSTimeZone, NSTimer, NSURL, NSUserDefaults, \ NSUTF8StringEncoding, NSWidth +from LaunchServices import kUTTypePNG, kUTTypeJPEG, kUTTypeGIF, kUTTypeTIFF from WebKit import WebView -from objc import IBOutlet, IBAction \ No newline at end of file +from objc import IBOutlet, IBAction + From 250bf1003f9d4157f97928639670a7fef2520c59 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 24 Jun 2022 15:46:43 -0400 Subject: [PATCH 011/226] use enum for esc keycode --- plotdevice/gui/views.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plotdevice/gui/views.py b/plotdevice/gui/views.py index a70c888e..a9176b2d 100644 --- a/plotdevice/gui/views.py +++ b/plotdevice/gui/views.py @@ -6,6 +6,7 @@ from ..lib.cocoa import * from ..gfx import Color +from ..gfx.atoms import KEY_ESC from objc import super DARK_GREY = NSColor.blackColor().blendedColorWithFraction_ofColor_(0.7, NSColor.whiteColor()) @@ -229,7 +230,7 @@ def keyDown_(self, event): self.key = event.characters() self.keycode = event.keyCode() - if self.keycode==53: # stop animating on ESC + if self.keycode==KEY_ESC: # stop animating on ESC NSApp.sendAction_to_from_('stopScript:', None, self) def keyUp_(self, event): @@ -312,7 +313,7 @@ def keyDown_(self, event): self.key = event.characters() self.keycode = event.keyCode() - if self.keycode==53: # stop animating on ESC + if self.keycode==KEY_ESC: # stop animating on ESC NSApp().sendAction_to_from_('stopScript:', None, self) def keyUp_(self, event): From 92788de43a60082dc6fd0c15ddb3ebe2fe6b0559 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 24 Jun 2022 15:47:51 -0400 Subject: [PATCH 012/226] preserve fullscreen window after close - it wasn't responding to performClose for some reason. now just hiding it and reusing it if another fullscreen run happens --- plotdevice/gui/document.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index cb561f12..1db4fce0 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -154,6 +154,7 @@ def initWithWindowNibName_(self, nib): def _init_state(self): self.vm = Sandbox(self) self.animationTimer = None + self.offscreen = None self.fullScreen = None self.currentView = None self.stationery = None @@ -324,7 +325,9 @@ def runFullscreen_(self, sender): self.currentView = FullscreenView.alloc().init() self.currentView.canvas = None fullRect = NSScreen.mainScreen().frame() - self.fullScreen = FullscreenWindow.alloc().initWithRect_(fullRect) + if not self.offscreen: + self.offscreen = FullscreenWindow.alloc().initWithRect_(fullRect) + self.fullScreen = self.offscreen self.fullScreen.setContentView_(self.currentView) self.fullScreen.makeKeyAndOrderFront_(self) self.fullScreen.makeFirstResponder_(self.currentView) @@ -573,7 +576,7 @@ def stopScript(self): # close the fullscreen window NSMenu.setMenuBarVisible_(True) - self.fullScreen.performClose_(self) + self.fullScreen.orderOut_(self) self.fullScreen = None NSCursor.unhide() From 2be81574e790479b4d14f2d01ca3e568d65813e1 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 24 Jun 2022 18:12:58 -0400 Subject: [PATCH 013/226] whitespace --- PlotDevice.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 61de4875..641349d0 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -454,7 +454,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# let the setup script handle updating\n$PYTHON setup.py build\n\n# copy the up-to-date module contents into the app bundle\nSITE_DIR=\"$TARGET_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/python\"\nditto build/lib \"$SITE_DIR\"\n\n# make sure everything has a .pyc (so code-signing doesn't break on first run)\n$PYTHON -m compileall -q \"$SITE_DIR/plotdevice\""; + shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# let the setup script handle updating\n$PYTHON setup.py build\n\n# copy the up-to-date module contents into the app bundle\nSITE_DIR=\"$TARGET_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/python\"\nditto build/lib \"$SITE_DIR\"\n\n# make sure everything has a .pyc (so code-signing doesn't break on first run)\n$PYTHON -m compileall -q \"$SITE_DIR/plotdevice\"\n"; showEnvVarsInLog = 0; }; 2AF8981419953CA1005A49A5 /* Manually Update Examples */ = { From be4a16b8b1f4d602dd9f8426123e5a369423f06d Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 24 Jun 2022 18:13:42 -0400 Subject: [PATCH 014/226] remove weak self reference - was causing a crash (and wasn't actually accomplishing anything since the file isn't using ARC?) --- app/deps/IO/Video.m | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/deps/IO/Video.m b/app/deps/IO/Video.m index c89a0481..307d129d 100644 --- a/app/deps/IO/Video.m +++ b/app/deps/IO/Video.m @@ -31,12 +31,9 @@ @implementation FrameWriter -(void) main{ @autoreleasepool{ if (self.isCancelled || !frame){ - __unsafe_unretained FrameWriter *welf = self; - - // close the file [videoWriterInput markAsFinished]; [videoWriter finishWritingWithCompletionHandler:^{ - [welf.delegate wroteLast]; + [self.delegate wroteLast]; }]; return; } From 555483ead129eae33aba2f56b06e7c783c6511b6 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 24 Jun 2022 18:15:11 -0400 Subject: [PATCH 015/226] convert export status to toolbar item --- app/Resources/en.lproj/PlotDeviceDocument.xib | 85 +++++++++++-------- plotdevice/gui/document.py | 9 +- plotdevice/lib/cocoa.py | 6 +- 3 files changed, 55 insertions(+), 45 deletions(-) diff --git a/app/Resources/en.lproj/PlotDeviceDocument.xib b/app/Resources/en.lproj/PlotDeviceDocument.xib index b0a9c6a4..54718d64 100644 --- a/app/Resources/en.lproj/PlotDeviceDocument.xib +++ b/app/Resources/en.lproj/PlotDeviceDocument.xib @@ -19,7 +19,7 @@
- + @@ -118,6 +118,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -519,42 +566,6 @@ DQ - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index 1db4fce0..942f0d2f 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -190,11 +190,9 @@ def awakeFromNib(self): win.setPreferredBackingLocation_(NSWindowBackingLocationVideoMemory) win.useOptimizedDrawing_(True) - # place the statusView in the title bar - frame = win.frame() - # win.contentView().superview().addSubview_(self.statusView) - win.contentView().addSubview_(self.statusView) - self.statusView.setFrame_( ((frame.size.width-104,frame.size.height-22), (100,22)) ) + # wire up the statusView in the title bar + statusItem = win.toolbar().items()[0] + statusItem.setView_(self.statusView) # sign up for autoresume on quit-and-relaunch (but only if this isn't console.py) if self.editorView: @@ -470,6 +468,7 @@ def _ui_state(self): # @IBAction def exportAsImage_(self, sender): + print('my sheet', self.exportSheet) if self.vm.session: return NSBeep() self.exportSheet.beginExport('image') diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index 887b2a42..1f60277e 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -43,9 +43,9 @@ NSRectFillUsingOperation, NSResponder, NSRightTextAlignment, NSSavePanel, NSScreen, NSShadow, \ NSSlider, NSSmallControlSize, NSSplitView, NSStringPboardType, NSSwitchButton, NSTIFFFileType, \ NSTIFFPboardType, NSTextContainer, NSTextField, NSTextFinder, NSTextStorage, NSTextView, \ - NSTrackingActiveInActiveApp, NSTrackingArea, NSTrackingMouseEnteredAndExited, NSUnboldFontMask, \ - NSUnitalicFontMask, NSUnionRect, NSView, NSViewFrameDidChangeNotification, NSWindow, \ - NSWindowBackingLocationVideoMemory, NSWindowController, NSWorkspace, NSKernAttributeName + NSToolbarItem, NSTrackingActiveInActiveApp, NSTrackingArea, NSTrackingMouseEnteredAndExited, \ + NSUnboldFontMask, NSUnitalicFontMask, NSUnionRect, NSView, NSViewFrameDidChangeNotification, \ + NSWindow, NSWindowBackingLocationVideoMemory, NSWindowController, NSWorkspace, NSKernAttributeName from Foundation import CIAffineTransform, CIColorMatrix, CIContext, CIFilter, CIImage, \ CIVector, Foundation, NO, NSAffineTransform, NSAffineTransformStruct, \ NSAttributedString, NSAutoreleasePool, NSBundle, NSData, NSDate, NSDateFormatter, \ From 6413414a7db9f9f150c6afab61368e561e62cbb5 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 24 Jun 2022 20:28:54 -0400 Subject: [PATCH 016/226] abandon bundle-based nib loading --- plotdevice/gui/document.py | 1 - plotdevice/run/console.py | 7 ++++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index 942f0d2f..9ecaef98 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -468,7 +468,6 @@ def _ui_state(self): # @IBAction def exportAsImage_(self, sender): - print('my sheet', self.exportSheet) if self.vm.session: return NSBeep() self.exportSheet.beginExport('image') diff --git a/plotdevice/run/console.py b/plotdevice/run/console.py index 079a2a75..dc78f59c 100755 --- a/plotdevice/run/console.py +++ b/plotdevice/run/console.py @@ -68,9 +68,10 @@ def applicationDidFinishLaunching_(self, note): if self.mode=='windowed': # load the viewer ui from the nib in plotdevice/rsrc - bundle = NSBundle.bundleWithPath_(rsrc_path()) - ui = NSNib.alloc().initWithNibNamed_bundle_("viewer", bundle) - ok, objs = ui.instantiateWithOwner_topLevelObjects_(self, None) + nib = NSData.dataWithContentsOfFile_(rsrc_path('viewer.nib')) + ui = NSNib.alloc().initWithNibData_bundle_(nib, None) + ok, objs = ui.instantiateNibWithOwner_topLevelObjects_(self, None) + NSApp().setMainMenu_(self.menu) # configure the window script-controller, and update-watcher From 5d0b0069351545b243aad56668910e2b3ea9bef6 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 24 Jun 2022 20:29:45 -0400 Subject: [PATCH 017/226] move statusView into toolbar for cli --- app/Resources/en.lproj/PlotDeviceScript.xib | 89 ++++++++++++--------- 1 file changed, 51 insertions(+), 38 deletions(-) diff --git a/app/Resources/en.lproj/PlotDeviceScript.xib b/app/Resources/en.lproj/PlotDeviceScript.xib index 64c0a4aa..d76b4671 100644 --- a/app/Resources/en.lproj/PlotDeviceScript.xib +++ b/app/Resources/en.lproj/PlotDeviceScript.xib @@ -1,7 +1,6 @@ - @@ -15,7 +14,7 @@ - + @@ -23,7 +22,7 @@ - + @@ -58,6 +57,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -128,7 +171,7 @@ - + @@ -340,38 +383,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - @@ -397,7 +408,7 @@ - + @@ -412,7 +423,7 @@ - + @@ -470,6 +481,7 @@ + @@ -606,6 +618,7 @@ + From 7024a98648d876293ae46da5b263be189916be29 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 24 Jun 2022 20:29:55 -0400 Subject: [PATCH 018/226] set os target to 10.13 --- PlotDevice.xcodeproj/project.pbxproj | 8 ++++---- app/Resources/en.lproj/PlotDeviceDocument.xib | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 641349d0..fc87511c 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -573,7 +573,7 @@ INFOPLIST_FILE = app/info.plist; INSTALL_PATH = /Applications; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 10.13; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = io.plotdevice.PlotDevice; @@ -598,7 +598,7 @@ INFOPLIST_FILE = app/info.plist; INSTALL_PATH = /Applications; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 10.13; OTHER_LDFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = io.plotdevice.PlotDevice; PRODUCT_NAME = PlotDevice; @@ -638,7 +638,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 10.13; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = PlotDevice; SDKROOT = macosx; @@ -676,7 +676,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 10.13; PRODUCT_NAME = PlotDevice; SDKROOT = macosx; }; diff --git a/app/Resources/en.lproj/PlotDeviceDocument.xib b/app/Resources/en.lproj/PlotDeviceDocument.xib index 54718d64..267e1dc3 100644 --- a/app/Resources/en.lproj/PlotDeviceDocument.xib +++ b/app/Resources/en.lproj/PlotDeviceDocument.xib @@ -126,7 +126,7 @@ - + @@ -273,7 +273,7 @@ - + @@ -288,7 +288,7 @@ - + @@ -304,7 +304,7 @@ - + From c8c00b7322191bd52ceb54dd43f05ebbe369189a Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 25 Jun 2022 10:05:55 -0400 Subject: [PATCH 019/226] add missing src files --- PlotDevice.xcodeproj/project.pbxproj | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index fc87511c..5c1151ba 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -147,6 +147,12 @@ 2AC07CD818EF8EC500B75879 /* context.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = context.py; sourceTree = ""; }; 2AC07CE218EF9B2400B75879 /* atoms.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = atoms.py; sourceTree = ""; }; 2AC5187F18636C9F007FB066 /* sandbox.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = sandbox.py; sourceTree = ""; }; + 2ACFEAEF286746B5009BE346 /* geometry.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = geometry.py; sourceTree = ""; }; + 2ACFEAF0286746BE009BE346 /* text.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = text.py; sourceTree = ""; }; + 2ACFEAF1286746E2009BE346 /* foundry.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = foundry.py; sourceTree = ""; }; + 2ACFEAF2286746EC009BE346 /* cocoa.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = cocoa.py; sourceTree = ""; }; + 2ACFEAF3286746FA009BE346 /* common.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = common.py; sourceTree = ""; }; + 2ACFEAF428674708009BE346 /* readers.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = readers.py; sourceTree = ""; }; 2AE5AD291862366300CCDD45 /* editor.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = editor.py; sourceTree = ""; }; 2AE5AD2C1862386400CCDD45 /* widgets.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = widgets.py; sourceTree = ""; }; 2AEE843D18B5603900CF91D4 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; @@ -221,6 +227,7 @@ isa = PBXGroup; children = ( 2A294458185E539400E9F650 /* __init__.py */, + 2ACFEAF3286746FA009BE346 /* common.py */, 2AC5187F18636C9F007FB066 /* sandbox.py */, 2A29445A185E539400E9F650 /* console.py */, ); @@ -231,6 +238,8 @@ isa = PBXGroup; children = ( 2A32957218C59D0A00EEDD1C /* __init__.py */, + 2ACFEAF2286746EC009BE346 /* cocoa.py */, + 2ACFEAF1286746E2009BE346 /* foundry.py */, 2A32957718C59D0A00EEDD1C /* io.py */, 2A32957918C59D0A00EEDD1C /* pathmatics.py */, ); @@ -321,7 +330,9 @@ 2AC07CB818EF8E7D00B75879 /* bezier.py */, 2AC07CBA18EF8E7D00B75879 /* colors.py */, 2AC07CBD18EF8E7D00B75879 /* effects.py */, + 2ACFEAEF286746B5009BE346 /* geometry.py */, 2AC07CC118EF8E7D00B75879 /* image.py */, + 2ACFEAF0286746BE009BE346 /* text.py */, 2AC07CC518EF8E7D00B75879 /* typography.py */, ); path = gfx; @@ -362,6 +373,7 @@ 2AEE846318BEC25B00CF91D4 /* iglob.py */, 611CC4D910BA8C1B00B55455 /* kgp.py */, 611CC4DA10BA8C1B00B55455 /* ottobot.py */, + 2ACFEAF428674708009BE346 /* readers.py */, ); path = util; sourceTree = ""; From 6c6465f2b367da2dfd0434e463af583932ed5cf4 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 25 Jun 2022 10:21:17 -0400 Subject: [PATCH 020/226] update deploy target --- PlotDevice.xcodeproj/project.pbxproj | 6 +++--- app/Resources/en.lproj/PlotDeviceScript.xib | 3 ++- app/info.plist | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 5c1151ba..82f78268 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -481,7 +481,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "examples=\"$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/examples\"\nditto Examples $examples"; + shellScript = "examples=\"$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/examples\"\nditto Examples $examples\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -585,7 +585,7 @@ INFOPLIST_FILE = app/info.plist; INSTALL_PATH = /Applications; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.14; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = io.plotdevice.PlotDevice; @@ -610,7 +610,7 @@ INFOPLIST_FILE = app/info.plist; INSTALL_PATH = /Applications; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.14; OTHER_LDFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = io.plotdevice.PlotDevice; PRODUCT_NAME = PlotDevice; diff --git a/app/Resources/en.lproj/PlotDeviceScript.xib b/app/Resources/en.lproj/PlotDeviceScript.xib index d76b4671..a10edde7 100644 --- a/app/Resources/en.lproj/PlotDeviceScript.xib +++ b/app/Resources/en.lproj/PlotDeviceScript.xib @@ -1,6 +1,7 @@ + @@ -481,7 +482,7 @@ - + diff --git a/app/info.plist b/app/info.plist index b827958b..8a3cd679 100644 --- a/app/info.plist +++ b/app/info.plist @@ -72,13 +72,13 @@ LSMinimumSystemVersion 10.14 NSHumanReadableCopyright - © 2014–15 Samizdat Drafting Co. + © 2014–22 Samizdat Drafting Co. NSMainNibFile MainMenu - NSSystemAdministrationUsageDescription - PlotDevice would like to be able to write to your hard disk NSPrincipalClass NSApplication + NSSystemAdministrationUsageDescription + PlotDevice would like to be able to write to your hard disk UTExportedTypeDeclarations From 6871930249664abe17cf81b877ce4ab01aa57f5a Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 25 Jun 2022 10:38:54 -0400 Subject: [PATCH 021/226] add H265 export support --- app/Resources/en.lproj/PlotDeviceDocument.xib | 7 ++++--- app/Resources/en.lproj/PlotDeviceScript.xib | 5 +++-- app/deps/IO/Video.h | 2 +- app/deps/IO/Video.m | 5 ++--- plotdevice/gui/widgets.py | 7 ++++--- plotdevice/lib/io.py | 5 +++-- 6 files changed, 17 insertions(+), 14 deletions(-) diff --git a/app/Resources/en.lproj/PlotDeviceDocument.xib b/app/Resources/en.lproj/PlotDeviceDocument.xib index 267e1dc3..8417fe88 100644 --- a/app/Resources/en.lproj/PlotDeviceDocument.xib +++ b/app/Resources/en.lproj/PlotDeviceDocument.xib @@ -411,12 +411,13 @@ - + - + + @@ -501,7 +502,7 @@ - + diff --git a/app/Resources/en.lproj/PlotDeviceScript.xib b/app/Resources/en.lproj/PlotDeviceScript.xib index a10edde7..86bf01da 100644 --- a/app/Resources/en.lproj/PlotDeviceScript.xib +++ b/app/Resources/en.lproj/PlotDeviceScript.xib @@ -532,12 +532,13 @@ - + - + + diff --git a/app/deps/IO/Video.h b/app/deps/IO/Video.h index 21762b61..59a78e7b 100644 --- a/app/deps/IO/Video.h +++ b/app/deps/IO/Video.h @@ -24,7 +24,7 @@ @property NSInteger framesWritten; @property BOOL doneWriting; -- (id)initWithFile:(NSString *)fileName size:(CGSize)aSize fps:(NSUInteger)fps bitrate:(double)mbps; +- (id)initWithFile:(NSString *)fileName size:(CGSize)aSize fps:(NSUInteger)fps bitrate:(double)mbps codec:(NSUInteger)codec; - (void)addFrame:(NSImage *)frame; - (void)closeFile; diff --git a/app/deps/IO/Video.m b/app/deps/IO/Video.m index 307d129d..f74452c6 100644 --- a/app/deps/IO/Video.m +++ b/app/deps/IO/Video.m @@ -100,7 +100,7 @@ - (CVPixelBufferRef)_pixelBufferFromNSImage:(NSImage*)image @implementation Video @synthesize framesWritten, doneWriting; -- (id)initWithFile:(NSString *)fileName size:(CGSize)aSize fps:(NSUInteger)fps bitrate:(double)mbps{ +- (id)initWithFile:(NSString *)fileName size:(CGSize)aSize fps:(NSUInteger)fps bitrate:(double)mbps codec:(NSUInteger)codec{ if ((self = [super init])) { NSError *error = nil; @@ -109,10 +109,9 @@ - (id)initWithFile:(NSString *)fileName size:(CGSize)aSize fps:(NSUInteger)fps b frames = [[NSOperationQueue alloc] init]; frames.maxConcurrentOperationCount = 1; - videoWriter = [[AVAssetWriter alloc] initWithURL: [NSURL fileURLWithPath:fileName] fileType:AVFileTypeQuickTimeMovie error:&error]; NSParameterAssert(videoWriter); - NSDictionary *videoSettings = @{ AVVideoCodecKey: AVVideoCodecTypeH264, + NSDictionary *videoSettings = @{ AVVideoCodecKey: (codec == 0) ? AVVideoCodecTypeHEVC : AVVideoCodecTypeH264, AVVideoWidthKey: @(aSize.width), AVVideoHeightKey: [NSNumber numberWithInt:aSize.height], AVVideoCompressionPropertiesKey: @{ diff --git a/plotdevice/gui/widgets.py b/plotdevice/gui/widgets.py index 02e1c40d..d0261911 100644 --- a/plotdevice/gui/widgets.py +++ b/plotdevice/gui/widgets.py @@ -249,8 +249,8 @@ class ExportSheet(NSObject): movieBitrate = IBOutlet() def awakeFromNib(self): - self.formats = dict(image=(0, 'pdf', 0,0, 'png', 'jpg', 'tiff', 'gif', 0,0, 'pdf', 'eps'), movie=('mov', 'gif')) - self.movie = dict(format='mov', first=1, last=150, fps=30, bitrate=1, loop=0) + self.formats = dict(image=(0, 'pdf', 0,0, 'png', 'jpg', 'tiff', 'gif', 0,0, 'pdf', 'eps'), movie=('mov', 'mov', 'gif')) + self.movie = dict(format='mov', first=1, last=150, fps=30, bitrate=1, loop=0, codec=0) self.image = dict(format='pdf', first=1, last=1, cmyk=False, single=True) self.last = None @@ -340,7 +340,8 @@ def movieState(self, key=None): last=self.movieFrames.intValue(), fps=self.movieFps.floatValue(), loop=-1 if self.movieLoop.state()==NSOnState else 0, - bitrate=self.movieBitrate.selectedItem().tag() ) + bitrate=self.movieBitrate.selectedItem().tag(), + codec=fmt_idx ) # 0=h265 1=h264 if key: return state[key] return state diff --git a/plotdevice/lib/io.py b/plotdevice/lib/io.py index 130ad226..bcee134d 100644 --- a/plotdevice/lib/io.py +++ b/plotdevice/lib/io.py @@ -109,7 +109,7 @@ def add(self, canvas): self.added += 1 class MovieExportSession(ExportSession): - def __init__(self, fname, format='mov', first=1, last=None, fps=30, bitrate=1, loop=0, **rest): + def __init__(self, fname, format='mov', first=1, last=None, fps=30, bitrate=1, loop=0, codec=0, **rest): super(MovieExportSession, self).__init__() try: os.unlink(fname) @@ -122,6 +122,7 @@ def __init__(self, fname, format='mov', first=1, last=None, fps=30, bitrate=1, l self.fps = fps self.loop = loop self.bitrate = bitrate + self.codec = codec def add(self, canvas): image = canvas.rasterize() @@ -129,7 +130,7 @@ def add(self, canvas): dims = image.size() if self.format == 'mov': self.writer = Video.alloc() - self.writer.initWithFile_size_fps_bitrate_(self.fname, dims, self.fps, self.bitrate) + self.writer.initWithFile_size_fps_bitrate_codec_(self.fname, dims, self.fps, self.bitrate, self.codec) elif self.format == 'gif': self.writer = AnimatedGif.alloc() self.writer.initWithFile_size_fps_loop_(self.fname, dims, self.fps, self.loop) From 3411006229a9881d55452139ccc3bc8999a841f7 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 25 Jun 2022 11:17:11 -0400 Subject: [PATCH 022/226] reconnect image format menu in console ui --- app/Resources/en.lproj/PlotDeviceScript.xib | 29 ++++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/app/Resources/en.lproj/PlotDeviceScript.xib b/app/Resources/en.lproj/PlotDeviceScript.xib index 86bf01da..04f4650c 100644 --- a/app/Resources/en.lproj/PlotDeviceScript.xib +++ b/app/Resources/en.lproj/PlotDeviceScript.xib @@ -400,7 +400,7 @@ - + @@ -420,9 +420,25 @@ - + - + + + + + + + + + + + + + + + + + @@ -435,13 +451,12 @@ - - - - + + + From 28847ff2c9d63762f34cea7b6f051029dbdce0b3 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 25 Jun 2022 11:17:28 -0400 Subject: [PATCH 023/226] add HEIC export support --- app/Resources/en.lproj/PlotDeviceDocument.xib | 5 +++-- app/Resources/en.lproj/PlotDeviceScript.xib | 1 + plotdevice/context.py | 5 +++-- plotdevice/gui/widgets.py | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/Resources/en.lproj/PlotDeviceDocument.xib b/app/Resources/en.lproj/PlotDeviceDocument.xib index 8417fe88..7a2222f5 100644 --- a/app/Resources/en.lproj/PlotDeviceDocument.xib +++ b/app/Resources/en.lproj/PlotDeviceDocument.xib @@ -264,7 +264,7 @@ - + @@ -297,6 +297,7 @@ + @@ -361,7 +362,7 @@ - + diff --git a/app/Resources/en.lproj/PlotDeviceScript.xib b/app/Resources/en.lproj/PlotDeviceScript.xib index 04f4650c..9a74db33 100644 --- a/app/Resources/en.lproj/PlotDeviceScript.xib +++ b/app/Resources/en.lproj/PlotDeviceScript.xib @@ -433,6 +433,7 @@ + diff --git a/plotdevice/context.py b/plotdevice/context.py index 4474662a..3c21a4b5 100644 --- a/plotdevice/context.py +++ b/plotdevice/context.py @@ -1804,12 +1804,13 @@ def _getImageData(self, format): "jpg": kUTTypeJPEG, "jpeg": kUTTypeJPEG, "png": kUTTypePNG, - "tiff": kUTTypeTIFF} + "tiff": kUTTypeTIFF, + "heic": 'public.heic'} cgData = NSMutableData.data() cgImage = self._cg_image() cgDest = CGImageDestinationCreateWithData(cgData, cgTypes[format], 1, None) - if format in ('jpg','jpeg'): + if format in ('jpg', 'jpeg'): CGImageDestinationSetProperties(cgDest, {kCGImageDestinationLossyCompressionQuality:1.0}) CGImageDestinationAddImage(cgDest, cgImage, None) CGImageDestinationFinalize(cgDest) diff --git a/plotdevice/gui/widgets.py b/plotdevice/gui/widgets.py index d0261911..8300b1a5 100644 --- a/plotdevice/gui/widgets.py +++ b/plotdevice/gui/widgets.py @@ -249,7 +249,7 @@ class ExportSheet(NSObject): movieBitrate = IBOutlet() def awakeFromNib(self): - self.formats = dict(image=(0, 'pdf', 0,0, 'png', 'jpg', 'tiff', 'gif', 0,0, 'pdf', 'eps'), movie=('mov', 'mov', 'gif')) + self.formats = dict(image=(0, 'pdf', 0,0, 'png', 'jpg', 'heic', 'tiff', 'gif', 0,0, 'pdf', 'eps'), movie=('mov', 'mov', 'gif')) self.movie = dict(format='mov', first=1, last=150, fps=30, bitrate=1, loop=0, codec=0) self.image = dict(format='pdf', first=1, last=1, cmyk=False, single=True) self.last = None From 07e5325479c5f76274a22987680fbb0b69c94a8d Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 25 Jun 2022 12:19:40 -0400 Subject: [PATCH 024/226] repair cli-tool prefs item --- plotdevice/gui/preferences.py | 36 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/plotdevice/gui/preferences.py b/plotdevice/gui/preferences.py index b0e69d92..e5d01de8 100644 --- a/plotdevice/gui/preferences.py +++ b/plotdevice/gui/preferences.py @@ -61,22 +61,23 @@ def editor_info(name=None): return dict(_editor_info) def possibleToolLocations(): - homebin = '%s/bin/plotdevice'%os.environ['HOME'] - localbin = '/usr/local/bin/plotdevice' + homebin = b'%s/bin/plotdevice'%os.environ['HOME'].encode('utf-8') + localbin = b'/usr/local/bin/plotdevice' locations = [homebin, localbin] # find the user's login shell - out, _ = Popen(['dscl','.','-read','/Users/'+os.environ['USER'],'UserShell'], stdout=PIPE).communicate() - shell = out.replace('UserShell:','').strip() + userdir = ('/Users/'+os.environ['USER']).encode('utf8') + out, _ = Popen([b'dscl', b'.', b'-read', userdir, b'UserShell'], stdout=PIPE).communicate() + shell = out.replace(b'UserShell:', b'').strip() # try launching a shell to extract the user's path if shell: - out, _ = Popen([shell,"-l"], stdout=PIPE, stderr=PIPE, stdin=PIPE).communicate("echo $PATH") - for path in out.strip().split(':'): - path += '/plotdevice' - if '/sbin' in path: continue - if path.startswith('/bin'): continue - if path.startswith('/usr/bin'): continue + out, _ = Popen([shell, b"-l"], stdout=PIPE, stderr=PIPE, stdin=PIPE).communicate(b"echo $PATH") + for path in out.strip().split(b':'): + path += b'/plotdevice' + if b'/sbin' in path: continue + if path.startswith(b'/bin'): continue + if path.startswith(b'/usr/bin'): continue if path in locations: continue locations.append(path) return locations @@ -214,23 +215,18 @@ def checkTool(self): self.toolAction.setTitle_(action.title()) self.toolPath.setSelectable_(found is not None) - self.toolPath.setStringValue_(found if found else '') + self.toolPath.setStringValue_(found.decode('utf8') if found else '') self.toolPath.setTextColor_(OK_COL if valid else ERR_COL) self.toolBoilerplate.setHidden_(found is not None) self.toolPath.setHidden_(found is None) @property def _tool(self): - - # WORKAROUND: don't anger the permissions beast - return False, False, 'install' - - broken = [] for path in possibleToolLocations(): if os.path.islink(path): # if it's a symlink, make sure it points to this bundle - tool_path = os.path.realpath(path) + tool_path = os.path.realpath(path).decode('utf8') found = path valid = tool_path.startswith(bundle_path()) if valid: @@ -253,9 +249,9 @@ def toolChanged_(self, sender): found, _, action = self._tool if action == 'reveal': - os.system('open --reveal "%s"'%found) + os.system(b'open --reveal "%s"'%found) elif action in ('install', 'repair'): - locs = [loc.replace(os.environ['HOME'],'~') for loc in possibleToolLocations()] + locs = [loc.decode('utf8').replace(os.environ['HOME'], '~') for loc in possibleToolLocations()] self.toolInstallMenu.removeAllItems() self.toolInstallMenu.addItemsWithTitles_(locs) NSApp().beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.toolInstallSheet, self.window(), self, None, 0) @@ -265,7 +261,7 @@ def finishInstallation_(self, sender): should_install = sender.tag() if should_install: console_py = bundle_path('Contents/SharedSupport/plotdevice') - pth = self.toolInstallMenu.selectedItem().title().replace('~',os.environ['HOME']) + pth = self.toolInstallMenu.selectedItem().title().replace('~', os.environ['HOME']) dirname = os.path.dirname(pth) try: if os.path.exists(pth) or os.path.islink(pth): From b7a121e9494c3b1247b09c812b9bed78c4a3a227 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 25 Jun 2022 15:07:40 -0400 Subject: [PATCH 025/226] add `zoom` opt to export() and UI --- app/Resources/en.lproj/PlotDeviceDocument.xib | 87 +++++++++++++----- app/Resources/en.lproj/PlotDeviceScript.xib | 91 +++++++++++++------ plotdevice/context.py | 12 +-- plotdevice/gfx/image.py | 2 +- plotdevice/gui/document.py | 6 +- plotdevice/gui/views.py | 9 +- plotdevice/gui/widgets.py | 31 ++++++- plotdevice/lib/cocoa.py | 8 +- plotdevice/lib/io.py | 5 +- 9 files changed, 181 insertions(+), 70 deletions(-) diff --git a/app/Resources/en.lproj/PlotDeviceDocument.xib b/app/Resources/en.lproj/PlotDeviceDocument.xib index 7a2222f5..e82a72a8 100644 --- a/app/Resources/en.lproj/PlotDeviceDocument.xib +++ b/app/Resources/en.lproj/PlotDeviceDocument.xib @@ -239,6 +239,7 @@ + @@ -249,12 +250,12 @@ - + - - + + @@ -262,14 +263,14 @@ - - - + + + - + @@ -324,8 +325,8 @@ - - + + @@ -333,7 +334,7 @@ - + @@ -344,16 +345,8 @@ - - + @@ -361,8 +354,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -401,7 +440,7 @@ - + @@ -412,12 +451,12 @@ - + - + @@ -503,7 +542,7 @@ - + diff --git a/app/Resources/en.lproj/PlotDeviceScript.xib b/app/Resources/en.lproj/PlotDeviceScript.xib index 9a74db33..4e6ad646 100644 --- a/app/Resources/en.lproj/PlotDeviceScript.xib +++ b/app/Resources/en.lproj/PlotDeviceScript.xib @@ -183,7 +183,8 @@ - + + @@ -385,12 +386,12 @@ - + - - + + @@ -398,14 +399,14 @@ - - - + + + - + @@ -420,7 +421,7 @@ - + @@ -437,7 +438,7 @@ - + @@ -460,19 +461,28 @@ - - + + - - + + - - + + + + + + + + + + + @@ -480,25 +490,54 @@ + + + + + + + + + + + + + + + + + - - + + - - + + + + + + + + + + + + + + - + @@ -537,7 +576,7 @@ - + @@ -548,12 +587,12 @@ - + - + @@ -636,7 +675,7 @@ - + diff --git a/plotdevice/context.py b/plotdevice/context.py index 3c21a4b5..390a2413 100644 --- a/plotdevice/context.py +++ b/plotdevice/context.py @@ -1461,7 +1461,7 @@ def clear(self, *grobs): else: self.canvas.clear(*grobs) - def export(self, fname, fps=None, loop=None, bitrate=1.0, cmyk=False): + def export(self, fname, zoom=1.0, fps=None, loop=None, bitrate=1.0, cmyk=False): """Write single images or manage batch exports for animations. To write the canvas's current contents to a file, simply call export("~/somefile.png") @@ -1501,7 +1501,7 @@ def export(self, fname, fps=None, loop=None, bitrate=1.0, cmyk=False): raise DeviceError(badform) # build up opts based on type of output file (anim vs static) - opts = {"cmyk":cmyk} + opts = {"cmyk":cmyk, "zoom":zoom} if format=='mov' or (format=='gif' and fps or loop is not None): opts.update(fps=fps or 30, # set a default for .mov exports loop={True:-1, False:0, None:0}.get(loop, loop), # convert bool args to int @@ -1792,7 +1792,7 @@ def rasterize(self, zoom=1.0): img.unlockFocus() return img - def _getImageData(self, format): + def _getImageData(self, format, zoom=1.0): if format == 'pdf': view = _PDFRenderView.alloc().initWithCanvas_(self) return view.dataWithPDFInsideRect_(view.bounds()) @@ -1808,7 +1808,7 @@ def _getImageData(self, format): "heic": 'public.heic'} cgData = NSMutableData.data() - cgImage = self._cg_image() + cgImage = self._cg_image(zoom) cgDest = CGImageDestinationCreateWithData(cgData, cgTypes[format], 1, None) if format in ('jpg', 'jpeg'): CGImageDestinationSetProperties(cgDest, {kCGImageDestinationLossyCompressionQuality:1.0}) @@ -1816,11 +1816,11 @@ def _getImageData(self, format): CGImageDestinationFinalize(cgDest) return cgData - def save(self, fname, format=None): + def save(self, fname, format=None, zoom=1.0): """Write the current graphics objects to an image file""" if format is None: format = fname.rsplit('.',1)[-1].lower() - data = self._getImageData(format) + data = self._getImageData(format, zoom) fname = NSString.stringByExpandingTildeInPath(fname) data.writeToFile_atomically_(fname, False) diff --git a/plotdevice/gfx/image.py b/plotdevice/gfx/image.py index 833edcca..74494cf3 100644 --- a/plotdevice/gfx/image.py +++ b/plotdevice/gfx/image.py @@ -289,7 +289,7 @@ def __del__(self): # m = re_padded.search(self.fname) fn = re_padded.sub('0'*int(m.group(1)), self.fname, count=1) if m else self.fname - _ctx.canvas.save(fn, self.format) + _ctx.canvas.save(fn, self.format, self.opts['zoom']) @property def page(self): diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index 9ecaef98..b74c40a3 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -487,7 +487,7 @@ def exportInit(self, kind, fname, opts): # if this is a single-image export and the canvas already contains some grobs, # write it out synchronously rather than starting up an export session if kind=='image' and opts['last']==opts['first'] and list(self.vm.canvas): - img_data = self.vm.canvas._getImageData(opts['format']) + img_data = self.vm.canvas._getImageData(opts['format'], opts['zoom']) img_data.writeToFile_atomically_(fname, True) self.exportStatus('complete') return @@ -606,7 +606,9 @@ def crash(self): def copyImageAsPDF_(self, sender): pboard = NSPasteboard.generalPasteboard() # graphicsView implements the pboard delegate method to provide the data - pboard.declareTypes_owner_([NSPDFPboardType,NSPostScriptPboardType,NSTIFFPboardType], self.graphicsView) + pboard.declareTypes_owner_([ + NSPasteboardTypePDF, NSPasteboardTypeTIFF,"com.adobe.encapsulated-postscript" + ], self.graphicsView) # diff --git a/plotdevice/gui/views.py b/plotdevice/gui/views.py index a9176b2d..2aaa2ab5 100644 --- a/plotdevice/gui/views.py +++ b/plotdevice/gui/views.py @@ -212,12 +212,13 @@ def isFlipped(self): ### pasteboard delegate method ### def pasteboard_provideDataForType_(self, pboard, type): - formats = {NSPDFPboardType:"pdf", - NSPostScriptPboardType:"eps", - NSTIFFPboardType:"tiff"} + formats = {NSPasteboardTypePDF:"pdf", + "com.adobe.encapsulated-postscript":"eps", + NSPasteboardTypeTIFF:"tiff"} if self.canvas and type in formats: img_type = formats[type] - pboard.setData_forType_(self.canvas._getImageData(img_type), type) + mag = self.window().backingScaleFactor() if img_type=='tiff' else 1.0 + pboard.setData_forType_(self.canvas._getImageData(img_type, mag), type) def mouseDown_(self, event): self.mousedown = True diff --git a/plotdevice/gui/widgets.py b/plotdevice/gui/widgets.py index 8300b1a5..6b9b7e79 100644 --- a/plotdevice/gui/widgets.py +++ b/plotdevice/gui/widgets.py @@ -1,6 +1,7 @@ # encoding: utf-8 import os from ..lib.cocoa import * +from math import floor, ceil import objc ## classes instantiated by PlotDeviceDocument.xib & PlotDeviceScript.xib @@ -236,6 +237,7 @@ class ExportSheet(NSObject): # Image export settings imageAccessory = IBOutlet() imageFormat = IBOutlet() + imageZoom = IBOutlet() imagePageCount = IBOutlet() imagePagination = IBOutlet() imageCMYK = IBOutlet() @@ -251,7 +253,7 @@ class ExportSheet(NSObject): def awakeFromNib(self): self.formats = dict(image=(0, 'pdf', 0,0, 'png', 'jpg', 'heic', 'tiff', 'gif', 0,0, 'pdf', 'eps'), movie=('mov', 'mov', 'gif')) self.movie = dict(format='mov', first=1, last=150, fps=30, bitrate=1, loop=0, codec=0) - self.image = dict(format='pdf', first=1, last=1, cmyk=False, single=True) + self.image = dict(format='pdf', zoom=100, first=1, last=1, cmyk=False, single=True) self.last = None @@ -350,6 +352,7 @@ def imageState(self, key=None): fmts = self.formats['image'] fmt_idx = self.imageFormat.indexOfSelectedItem() state = dict(format=fmts[fmt_idx], + zoom=self.image['zoom'] / 100, first=1, cmyk=self.imageCMYK.state()==NSOnState, single=fmt_idx==1, @@ -376,6 +379,32 @@ def imageFormatChanged_(self, sender): self.updateColorMode() self.updatePagination() + @IBAction + def imageZoomStepped_(self, sender): + step = sender.intValue() + sender.setIntValue_(0) + + self.imageZoomChanged_(None) # reflect any editing in text field + pct = self.image['zoom'] + + if step > 0: + pct = 100 * ceil((pct + 1) / 100) + elif step < 0: + pct = 100 * floor((pct - 1) / 100) + + if 0 < pct < 10000: + self.image['zoom'] = pct + self.imageZoom.setStringValue_("%i%%" % pct) + + @IBAction + def imageZoomChanged_(self, sender): + pct = self.imageZoom.intValue() + if pct > 0: + self.image['zoom'] = pct + else: + pct = self.image['zoom'] + self.imageZoom.setStringValue_("%i%%" % pct) + @IBAction def movieFormatChanged_(self, sender): format = self.formats['movie'][sender.indexOfSelectedItem()] diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index 1f60277e..9bb32a73 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -37,12 +37,12 @@ NSImageCompressionFactor, NSImageInterpolationHigh, NSItalicFontMask, NSJPEGFileType, \ NSJustifiedTextAlignment, NSLayoutManager, NSLeftTextAlignment, NSLineBreakByWordWrapping, \ NSLineToBezierPathElement, NSMenu, NSMenuItem, NSMiniControlSize, NSMoveToBezierPathElement, \ - NSMutableParagraphStyle, NSNib, NSOffState, NSOnState, NSPDFPboardType, NSPNGFileType, \ - NSParagraphStyleAttributeName, NSPasteboard, NSPasteboardURLReadingContentsConformToTypesKey, \ - NSPasteboardURLReadingFileURLsOnlyKey, NSPostScriptPboardType, NSPrintOperation, NSRectFill, \ + NSMutableParagraphStyle, NSNib, NSOffState, NSOnState, NSPNGFileType, NSParagraphStyleAttributeName, \ + NSPasteboard, NSPasteboardTypePDF, NSPasteboardURLReadingContentsConformToTypesKey, \ + NSPasteboardURLReadingFileURLsOnlyKey, NSPasteboardTypeTIFF, NSPrintOperation, NSRectFill, \ NSRectFillUsingOperation, NSResponder, NSRightTextAlignment, NSSavePanel, NSScreen, NSShadow, \ NSSlider, NSSmallControlSize, NSSplitView, NSStringPboardType, NSSwitchButton, NSTIFFFileType, \ - NSTIFFPboardType, NSTextContainer, NSTextField, NSTextFinder, NSTextStorage, NSTextView, \ + NSTextContainer, NSTextField, NSTextFinder, NSTextStorage, NSTextView, \ NSToolbarItem, NSTrackingActiveInActiveApp, NSTrackingArea, NSTrackingMouseEnteredAndExited, \ NSUnboldFontMask, NSUnitalicFontMask, NSUnionRect, NSView, NSViewFrameDidChangeNotification, \ NSWindow, NSWindowBackingLocationVideoMemory, NSWindowController, NSWorkspace, NSKernAttributeName diff --git a/plotdevice/lib/io.py b/plotdevice/lib/io.py index bcee134d..4bf4b28b 100644 --- a/plotdevice/lib/io.py +++ b/plotdevice/lib/io.py @@ -79,12 +79,13 @@ def on(self, **handlers): re_padded = re.compile(r'{(\d+)}') class ImageExportSession(ExportSession): - def __init__(self, fname, format='pdf', first=1, last=None, single=False, **rest): + def __init__(self, fname, format='pdf', zoom=1.0, first=1, last=None, single=False, **rest): super(ImageExportSession, self).__init__() self.single_file = single or first==last if last is not None: self.begin(pages=last-first+1) self.format = format + self.zoom = zoom m = re_padded.search(fname) pad = '%%0%id' % int(m.group(1)) if m else None @@ -104,7 +105,7 @@ def __init__(self, fname, format='pdf', first=1, last=None, single=False, **rest self.writer = Pages.alloc().initWithPattern_(name_tmpl) def add(self, canvas): - image = canvas._getImageData(self.format) + image = canvas._getImageData(self.format, self.zoom) self.writer.addPage_(image) self.added += 1 From da7c11f984a33ad36cec5543855caac41eee82b0 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 25 Jun 2022 15:12:11 -0400 Subject: [PATCH 026/226] improve error when export lacks an extension --- plotdevice/context.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plotdevice/context.py b/plotdevice/context.py index 390a2413..e3ebe923 100644 --- a/plotdevice/context.py +++ b/plotdevice/context.py @@ -1495,8 +1495,8 @@ def export(self, fname, zoom=1.0, fps=None, loop=None, bitrate=1.0, cmyk=False): """ # determine the format by normalizing the file extension - format = fname.lower().rsplit('.',1)[1] if format not in ('pdf','eps','png','jpg','gif','tiff', 'mov'): + format = fname.lower().rsplit('.',1)[-1] badform = 'Unknown export format "%s"'%format raise DeviceError(badform) From eade22ebe9e479b86601a048366aacf839beeeb3 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 25 Jun 2022 15:12:26 -0400 Subject: [PATCH 027/226] add heic support to export() --- plotdevice/context.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plotdevice/context.py b/plotdevice/context.py index e3ebe923..4c231b5f 100644 --- a/plotdevice/context.py +++ b/plotdevice/context.py @@ -1495,8 +1495,8 @@ def export(self, fname, zoom=1.0, fps=None, loop=None, bitrate=1.0, cmyk=False): """ # determine the format by normalizing the file extension - if format not in ('pdf','eps','png','jpg','gif','tiff', 'mov'): format = fname.lower().rsplit('.',1)[-1] + if format not in ('pdf','eps','png','jpg','heic','gif','tiff', 'mov'): badform = 'Unknown export format "%s"'%format raise DeviceError(badform) From defce31881f2f9199f13f935541ec94aa7df00a3 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 25 Jun 2022 15:20:37 -0400 Subject: [PATCH 028/226] don't crash on text() w/ width & empty string --- plotdevice/gfx/text.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plotdevice/gfx/text.py b/plotdevice/gfx/text.py index 39cf042a..3660de59 100644 --- a/plotdevice/gfx/text.py +++ b/plotdevice/gfx/text.py @@ -262,6 +262,7 @@ def _dedent(cls, attrib_txt, idx=0, inherit=False): Note that this method *modifies* the attrib_txt reference rather than returning a value. """ + if not attrib_txt.length(): return attrib_txt.beginEditing() old_graf, _ = attrib_txt.attribute_atIndex_effectiveRange_("NSParagraphStyle", idx, None); graf = old_graf.mutableCopy() From ff4bdb71fa778f4a790e17341d389aa22591061a Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 25 Jun 2022 16:17:42 -0400 Subject: [PATCH 029/226] fix Color.blend --- plotdevice/gfx/colors.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plotdevice/gfx/colors.py b/plotdevice/gfx/colors.py index 22d65c57..21cb3c83 100644 --- a/plotdevice/gfx/colors.py +++ b/plotdevice/gfx/colors.py @@ -281,8 +281,8 @@ def blend(self, otherColor, factor): """ if hasattr(otherColor, "color"): otherColor = otherColor._rgb - return self.__class__(color=self._rgb.blendedColorWithFraction_ofColor_( - factor, otherColor)) + return self.__class__(self._rgb.blendedColorWithFraction_ofColor_( + factor, otherColor._rgb)) def _normalize(self, v, rng=None): """Bring the color into the 0-1 scale for the current colorrange""" From 9daca98e64df9a6cfb7ff0a7b071a5495a337b14 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 25 Jun 2022 16:41:11 -0400 Subject: [PATCH 030/226] use dataclasses for csv rows - also replace spaces in the header row with underscores --- plotdevice/util/readers.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/plotdevice/util/readers.py b/plotdevice/util/readers.py index 22f9aeba..2fedbd02 100644 --- a/plotdevice/util/readers.py +++ b/plotdevice/util/readers.py @@ -1,17 +1,16 @@ # encoding: utf-8 import os, sys, re from operator import attrgetter -PY2 = sys.version_info[0] == 2 # files & io from io import open, StringIO, BytesIO from os.path import abspath, dirname, exists, join, splitext from plotdevice import DeviceError, INTERNAL -text_type = str if not PY2 else str # data formats import json, csv -from collections import namedtuple, defaultdict +from collections import defaultdict +from dataclasses import make_dataclass from codecs import iterencode, iterdecode from xml.parsers import expat @@ -22,7 +21,7 @@ ### XML handling ### -Element = namedtuple('Element', ['tag', 'attrs', 'parents', 'start', 'end']) +Element = make_dataclass('Element', ['tag', 'attrs', 'parents', 'start', 'end']) escapes = [('break','0C'), ('indent', '09'), ('flush', '08')] doctype = '' % "".join([''%e for e in escapes]) HEAD = "%s<%s>" % (doctype, INTERNAL) @@ -50,7 +49,7 @@ def __init__(self, txt, offset=0): # wrap everything in a root node (and include the whitespace entities which shift # the tty escapes into the unicode PUA for the duration) - if isinstance(txt, text_type): + if isinstance(txt, str): txt = txt.encode('utf-8') self._xml = HEAD.encode('utf-8') + txt + TAIL.encode('utf-8') @@ -155,9 +154,7 @@ def _leave(self, name): ### CSV unpacking ### def csv_rows(file_obj, dialect=csv.excel, **kwargs): - csvfile = iterencode(file_obj, 'utf-8') if PY2 else file_obj - csvreader = csv.reader(csvfile, dialect=dialect, **kwargs) - csvreader = (list(iterdecode(i, 'utf-8')) for i in csvreader) if PY2 else csvreader + csvreader = csv.reader(file_obj, dialect=dialect, **kwargs) for row in csvreader: yield row @@ -171,19 +168,22 @@ def csv_dict(file_obj, dialect=csv.excel, cols=None, dict=dict, **kwargs): yield dict(list(zip(cols,row))) def csv_tuple(file_obj, dialect=csv.excel, cols=None, **kwargs): - if not isinstance(cols, (list, tuple)): - cols=None - elif cols: - RowType = namedtuple('Row', cols) + spaced = lambda a: [s.strip().replace(' ', '_') for s in a] if a else a + + if isinstance(cols, (list, tuple)): + Row = make_dataclass('Row', spaced(cols)) + else: + cols = None + for row in csv_rows(file_obj, dialect, **kwargs): if not cols: - cols = row - RowType = namedtuple('Row', cols) + cols = spaced(row) + Row = make_dataclass('Row', cols) continue - yield RowType(**dict(list(zip(cols, row)))) + yield Row(**dict(list(zip(cols, row)))) def csv_dialect(fd): - snippet = fd.read(1024).encode('utf-8') if PY2 else fd.read(1024) + snippet = fd.read(1024) fd.seek(0) return csv.Sniffer().sniff(snippet) @@ -244,7 +244,7 @@ def read(pth, format=None, encoding=None, cols=None, **kwargs): CSV files will return a list of rows. By default each row will be an ordered list of column values. If the first line of the file defines column names, - you can call read() with cols=True in which case each row will be a namedtuple + you can call read() with cols=True in which case each row will be a dataclass using those names as keys. If the file doesn't define its own column names, you can pass a list of strings as the `cols` parameter. Rows can be formatted as column-keyed dictionaries by passing True as the `dict` parameter. From 39188dd0bee7d15e5888c52209a2c8fe08308223 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 25 Jun 2022 20:11:04 -0400 Subject: [PATCH 031/226] update bezier constants --- app/deps/pathmatics/pathmatics.m | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/deps/pathmatics/pathmatics.m b/app/deps/pathmatics/pathmatics.m index 41b650b9..32080e6b 100644 --- a/app/deps/pathmatics/pathmatics.m +++ b/app/deps/pathmatics/pathmatics.m @@ -192,7 +192,7 @@ void _curvelength(double x0, double y0, double x1, double y1, { et = [path elementAtIndex:i]; - if ( et == NSMoveToBezierPathElement ) + if ( et == NSBezierPathElementMoveTo ) ++sp; } @@ -211,7 +211,7 @@ void _curvelength(double x0, double y0, double x1, double y1, { et = [path elementAtIndex:i]; - if ( et == NSMoveToBezierPathElement ) + if ( et == NSBezierPathElementMoveTo ) break; ++sp; @@ -273,7 +273,7 @@ void _curvelength(double x0, double y0, double x1, double y1, switch( elem ) { - case NSMoveToBezierPathElement: + case NSBezierPathElementMoveTo: // begins a new contour. if ( es != -1 ) @@ -301,20 +301,20 @@ void _curvelength(double x0, double y0, double x1, double y1, // fall through to record the vertex for the moveto - case NSLineToBezierPathElement: + case NSBezierPathElementLineTo: // add a vertex to the list poly->contour[es].vertex[k].x = ap[0].x; poly->contour[es].vertex[k].y = ap[0].y; ++k; break; - case NSCurveToBezierPathElement: + case NSBezierPathElementCurveTo: // should never happen - we have already converted the path to a flat version. Bail. printf("Got a curveto unexpectedly - bailing.\n"); gpc_free_polygon( poly ); return NULL; - case NSClosePathBezierPathElement: + case NSBezierPathElementClosePath: // ignore break; } @@ -354,7 +354,7 @@ void _curvelength(double x0, double y0, double x1, double y1, // set the default winding rule to be the one most useful for shapes // with holes. - [path setWindingRule:NSEvenOddWindingRule]; + [path setWindingRule:NSWindingRuleEvenOdd]; return path; } @@ -676,13 +676,13 @@ + (CGPathRef)cgPath:(NSBezierPath *)nsPath{ NSPoint points[3]; for (NSInteger i=0; i Date: Sun, 26 Jun 2022 09:55:54 -0400 Subject: [PATCH 032/226] add heic to binary types list --- plotdevice/util/readers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plotdevice/util/readers.py b/plotdevice/util/readers.py index 2fedbd02..30c7644e 100644 --- a/plotdevice/util/readers.py +++ b/plotdevice/util/readers.py @@ -206,7 +206,7 @@ def get(self, url): HTTP = Decoy() def binaryish(content, format): - bin_types = ('pdf','eps','png','jpg','jpeg','gif','tiff','tif','zip','tar','gz') + bin_types = ('pdf','eps','png','jpg','jpeg','heic','gif','tiff','tif','zip','tar','gz') bin_formats = ('raw','bytes','img','image') if any(b in content for b in bin_types): return True From ca043b25efb48a2947f8e76f588ce48ed53acde2 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sun, 26 Jun 2022 11:16:56 -0400 Subject: [PATCH 033/226] stop bundling pyobjc - use the current version on pypi and let `install_requires` pull them in --- setup.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 683a3c53..eca655fe 100644 --- a/setup.py +++ b/setup.py @@ -38,7 +38,7 @@ AUTHOR_EMAIL = plotdevice.__email__ LICENSE = plotdevice.__license__ URL = "http://plotdevice.io/" -CLASSIFIERS = ( +CLASSIFIERS = [ "Development Status :: 5 - Production/Stable", "Environment :: MacOS X :: Cocoa", "Intended Audience :: Developers", @@ -57,7 +57,7 @@ "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: User Interfaces", "Topic :: Text Editors :: Integrated Development Environments (IDE)", -) +] DESCRIPTION = "Create two-dimensional graphics and animations with code" LONG_DESCRIPTION = """PlotDevice is a Macintosh application used for computational graphic design. It provides an interactive Python environment where you can create two-dimensional graphics @@ -384,7 +384,16 @@ def run(self): license = LICENSE, classifiers = CLASSIFIERS, packages = find_packages(exclude=['tests']), - install_requires = ['requests', 'cachecontrol', 'lockfile'], + install_requires = [ + 'requests', + 'cachecontrol', + 'lockfile', + 'pyobjc-core==8.5', + 'pyobjc-framework-Cocoa==8.5', + 'pyobjc-framework-Quartz==8.5', + 'pyobjc-framework-LaunchServices==8.5', + 'pyobjc-framework-WebKit==8.5', + ], scripts = ["app/plotdevice"], zip_safe=False, cmdclass={ From 96aa792e8177b0e9f29fd82ea1d945a7715dcd8d Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sun, 26 Jun 2022 11:21:18 -0400 Subject: [PATCH 034/226] only use local pyobjc when running in sdist --- plotdevice/run/__init__.py | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/plotdevice/run/__init__.py b/plotdevice/run/__init__.py index 4b1f11ad..d527322e 100644 --- a/plotdevice/run/__init__.py +++ b/plotdevice/run/__init__.py @@ -2,27 +2,20 @@ from os.path import abspath, dirname, relpath, exists, join try: - # under normal circumstances the PyObjC site-dir is in the .lib directory... - objc_dir = abspath(join(dirname(__file__), '../lib/PyObjC')) - - # ...but if run from the sdist, the binaries will be in setup.py's build directory - if not exists(objc_dir): - objc_dir = abspath(join(dirname(__file__), '../../build/lib/plotdevice/lib/PyObjC')) - - # add our embedded PyObjC site-dir to the sys.path (and remove any conflicts) - for pyobjc_pth in [p for p in sys.path if p.endswith('PyObjC')]: - sys.path.remove(pyobjc_pth) - site.addsitedir(objc_dir) - - # test the sys.path by attempting to load a PyObjC submodule + # test the sys.path by attempting to load a PyObjC submodule... import objc except ImportError: - from pprint import pformat - missing = "Searched for PyObjC libraries in:\n%s\nto no avail..."%pformat(sys.path) - if exists('%s/../../app/info.plist'%dirname(__file__)): - missing += '\n\nBuild the plotdevice module with `python setup.py build\' before attempting import it.' - raise RuntimeError(missing) - + # ...but if run from the sdist, the PyObjC site-dir will be in setup.py's build directory + objc_dir = abspath(join(dirname(__file__), '../../build/lib/plotdevice/lib/PyObjC')) + if exists(objc_dir): + site.addsitedir(objc_dir) + import objc + else: + from pprint import pformat + missing = "Searched for PyObjC libraries in:\n%s\nto no avail..."%pformat(sys.path) + if exists('%s/../../app/info.plist'%dirname(__file__)): + missing += '\n\nBuild the plotdevice module with `python setup.py build\' before attempting import it.' + raise RuntimeError(missing) # pull in the encoding-pragma detector from .common import encoded From a7881f320b42c13e4c05b7089da270fcadb28b41 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sun, 26 Jun 2022 11:21:28 -0400 Subject: [PATCH 035/226] stop leaking globals --- app/deps/build.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/deps/build.py b/app/deps/build.py index 94ee4d91..a0e0971a 100644 --- a/app/deps/build.py +++ b/app/deps/build.py @@ -70,7 +70,7 @@ def install_extensions(ext_root): raise OSError("Could not copy %s" % lib_name) print() -if __name__=='__main__': +def main(): if len(sys.argv)>1: arg = sys.argv[1] if arg=='clean': @@ -88,3 +88,6 @@ def install_extensions(ext_root): install_extensions(ext_root) else: print("usage: python build.py ") + +if __name__=='__main__': + main() \ No newline at end of file From 237b480269f6aabbd1d6106f15dd0878d081651b Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sun, 26 Jun 2022 12:15:56 -0400 Subject: [PATCH 036/226] build Python.framework manually - who knows how long the devtool-provided copy will continue to exist... - lets pyobjc and requests be bundled in rather than having to live in plotdevice/lib --- .gitignore | 2 ++ PlotDevice.xcodeproj/project.pbxproj | 45 +++++++++++++++++++++------- app/deps/embed/Makefile | 11 +++++++ app/deps/embed/requirements.txt | 8 +++++ app/python.xcconfig | 12 ++++---- 5 files changed, 63 insertions(+), 15 deletions(-) create mode 100644 app/deps/embed/Makefile create mode 100644 app/deps/embed/requirements.txt diff --git a/.gitignore b/.gitignore index 2fe3f0d9..0b397c6c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ build/ dist/ app/deps/vendor/Sparkle* app/deps/vendor/*.tar.gz +app/deps/embed/Python.framework +app/deps/embed/relocatable-python # cds garbage related/ diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 82f78268..0ded7ada 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -11,14 +11,14 @@ 2A15C45018A329BD006BDFF0 /* editor.html in Copy Editor Assets */ = {isa = PBXBuildFile; fileRef = 2A15C44418A329AE006BDFF0 /* editor.html */; }; 2A15C45218A329BD006BDFF0 /* themes.json in Copy Editor Assets */ = {isa = PBXBuildFile; fileRef = 2A15C44618A329AE006BDFF0 /* themes.json */; }; 2A15C45618A48770006BDFF0 /* autocomplete.css in Copy Editor Assets */ = {isa = PBXBuildFile; fileRef = 2A15C45418A48765006BDFF0 /* autocomplete.css */; }; + 2A36AE2D2868B4E50088976E /* Python.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A36AE2C2868B4E50088976E /* Python.framework */; }; + 2A36AE2E2868B4F30088976E /* Python.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2A36AE2C2868B4E50088976E /* Python.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 2A591FF0185C17D200D1833D /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A591FEF185C17D200D1833D /* Security.framework */; }; 2A66ECEB18A99328002903DE /* ace.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECDE18A992BD002903DE /* ace.js */; }; 2A66ECEC18A99328002903DE /* editor.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECDF18A992BD002903DE /* editor.js */; }; 2A66ECED18A99328002903DE /* jquery-2.1.0.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECE018A992BD002903DE /* jquery-2.1.0.js */; }; 2A66ECEE18A99328002903DE /* keybindings.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECE118A992BD002903DE /* keybindings.js */; }; 2A66ECEF18A99328002903DE /* underscore-1.5.2.min.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECE218A992BD002903DE /* underscore-1.5.2.min.js */; }; - 2A79B146286508220074E96A /* Python3.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A79B144286507000074E96A /* Python3.framework */; }; - 2A79B147286508220074E96A /* Python3.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2A79B144286507000074E96A /* Python3.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 2A7AF5C818D2AFAA00F8FFC2 /* examples in Resources */ = {isa = PBXBuildFile; fileRef = 2A7AF5C718D2AFAA00F8FFC2 /* examples */; }; 2A93AE751903326E00C6144D /* placeholder.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 2A93AE731903326E00C6144D /* placeholder.pdf */; }; 2ABBB2FA1854018B001C4E0A /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2ABBB2F91854018B001C4E0A /* AVFoundation.framework */; }; @@ -75,7 +75,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 2A79B147286508220074E96A /* Python3.framework in Embed Frameworks */, + 2A36AE2E2868B4F30088976E /* Python.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -108,6 +108,7 @@ 2A32957218C59D0A00EEDD1C /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; 2A32957718C59D0A00EEDD1C /* io.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = io.py; sourceTree = ""; }; 2A32957918C59D0A00EEDD1C /* pathmatics.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pathmatics.py; sourceTree = ""; }; + 2A36AE2C2868B4E50088976E /* Python.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python.framework; path = app/deps/embed/Python.framework; sourceTree = ""; }; 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 2A37F4C5FDCFA73011CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 2A591FEF185C17D200D1833D /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; @@ -125,7 +126,6 @@ 2A79B13E2864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = Resources/en.lproj/PlotDevicePreferences.xib; sourceTree = ""; }; 2A79B13F2864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = Resources/en.lproj/PlotDeviceScript.xib; sourceTree = ""; }; 2A79B1402864FDAF0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = Resources/en.lproj/placeholder.pdf; sourceTree = ""; }; - 2A79B144286507000074E96A /* Python3.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python3.framework; path = Library/Frameworks/Python3.framework; sourceTree = DEVELOPER_DIR; }; 2A7AF5C718D2AFAA00F8FFC2 /* examples */ = {isa = PBXFileReference; lastKnownFileType = folder; path = examples; sourceTree = ""; }; 2A827CC91859E9FE00A126BA /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 2A98FCAD1B3C6BFC00ABF2C9 /* python.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = python.xcconfig; path = app/python.xcconfig; sourceTree = ""; }; @@ -173,11 +173,11 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 2A36AE2D2868B4E50088976E /* Python.framework in Frameworks */, 2ABBB2FC18540246001C4E0A /* CoreVideo.framework in Frameworks */, 2ABBB2FE185402AC001C4E0A /* CoreMedia.framework in Frameworks */, 2ABBB2FA1854018B001C4E0A /* AVFoundation.framework in Frameworks */, 2A15C42D18A1FA14006BDFF0 /* WebKit.framework in Frameworks */, - 2A79B146286508220074E96A /* Python3.framework in Frameworks */, 2A591FF0185C17D200D1833D /* Security.framework in Frameworks */, 8D15AC340486D014006FF6A4 /* Cocoa.framework in Frameworks */, ); @@ -296,7 +296,7 @@ 2A37F4C3FDCFA73011CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( - 2A79B144286507000074E96A /* Python3.framework */, + 2A36AE2C2868B4E50088976E /* Python.framework */, 2AEE843D18B5603900CF91D4 /* CoreText.framework */, 2A15C42C18A1FA14006BDFF0 /* WebKit.framework */, 2A591FEF185C17D200D1833D /* Security.framework */, @@ -388,6 +388,7 @@ 8D15AC2B0486D014006FF6A4 /* Resources */, 2A15C43718A20929006BDFF0 /* Copy Editor Assets */, 2A66ECEA18A99303002903DE /* Copy Editor Scripts */, + 2A36AE2F2868BB9A0088976E /* Build Python Framework */, 2A758E411957B7CE003ECF9D /* Build PlotDevice Module */, 2ABDB76F1867D9560069EFC3 /* Copy 'plotdevice' Tool */, 2AF8981419953CA1005A49A5 /* Manually Update Examples */, @@ -454,6 +455,24 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 2A36AE2F2868BB9A0088976E /* Build Python Framework */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Build Python Framework"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd app/deps/embed\nmake\n"; + }; 2A758E411957B7CE003ECF9D /* Build PlotDevice Module */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -576,7 +595,10 @@ COMBINE_HIDPI_IMAGES = YES; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**"; + FRAMEWORK_SEARCH_PATHS = ( + "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**", + "$(PROJECT_DIR)/app/deps/embed", + ); GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; @@ -584,7 +606,7 @@ GCC_PREFIX_HEADER = ""; INFOPLIST_FILE = app/info.plist; INSTALL_PATH = /Applications; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../Frameworks/Python.framework"; MACOSX_DEPLOYMENT_TARGET = 10.14; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "$(inherited)"; @@ -603,13 +625,16 @@ COMBINE_HIDPI_IMAGES = YES; CONFIGURATION_BUILD_DIR = dist; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**"; + FRAMEWORK_SEARCH_PATHS = ( + "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**", + "$(PROJECT_DIR)/app/deps/embed", + ); GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = ""; INFOPLIST_FILE = app/info.plist; INSTALL_PATH = /Applications; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../Frameworks/Python.framework"; MACOSX_DEPLOYMENT_TARGET = 10.14; OTHER_LDFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = io.plotdevice.PlotDevice; diff --git a/app/deps/embed/Makefile b/app/deps/embed/Makefile new file mode 100644 index 00000000..22bb2fda --- /dev/null +++ b/app/deps/embed/Makefile @@ -0,0 +1,11 @@ +REPO = https://github.com/gregneagle/relocatable-python.git +BUILD_OPTS = --os-version=11 --python-version=3.10.5 --upgrade-pip --pip-requirements=requirements.txt + +Python.framework: relocatable-python + python3 ./relocatable-python/make_relocatable_python_framework.py $(BUILD_OPTS) + +relocatable-python: + git clone $(REPO) + +clean: + rm -r Python.framework \ No newline at end of file diff --git a/app/deps/embed/requirements.txt b/app/deps/embed/requirements.txt new file mode 100644 index 00000000..4823c92c --- /dev/null +++ b/app/deps/embed/requirements.txt @@ -0,0 +1,8 @@ +# --no-binary :all: +xattr +cachecontrol +cffi +lockfile +pyobjc +requests +six \ No newline at end of file diff --git a/app/python.xcconfig b/app/python.xcconfig index 31d432da..bbb2f6d2 100644 --- a/app/python.xcconfig +++ b/app/python.xcconfig @@ -1,5 +1,7 @@ -PYTHON = /Applications/Xcode.app/Contents/Developer/usr/bin/python3 -LIBRARY_SEARCH_PATHS = $(inherited) /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/config-3.8-darwin -HEADER_SEARCH_PATHS = $(inherited) /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/Headers -OTHER_LDFLAGS = $(inherited) -lpython3.8 -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) PYTHON_BIN="/Applications/Xcode.app/Contents/Developer/usr/bin/python3" PY3K=1 +PYTHON_FRAMEWORK = $(PROJECT_DIR)/app/deps/embed/Python.framework +PYTHON_VERSION = 3.10 +PYTHON = $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/bin/python3 +LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/lib/python$(PYTHON_VERSION)/config-$(PYTHON_VERSION)-darwin +HEADER_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/Headers +OTHER_LDFLAGS = $(inherited) -lpython$(PYTHON_VERSION) +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) PYTHON_BIN="$(PYTHON)" PY3K=1 From 4c1e42a048eb456339128f605dc7064bafffd9ba Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sun, 26 Jun 2022 14:22:29 -0400 Subject: [PATCH 037/226] reorder lines --- app/deps/embed/Makefile | 4 ++-- app/python.xcconfig | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/deps/embed/Makefile b/app/deps/embed/Makefile index 22bb2fda..ce66e190 100644 --- a/app/deps/embed/Makefile +++ b/app/deps/embed/Makefile @@ -1,11 +1,11 @@ -REPO = https://github.com/gregneagle/relocatable-python.git +FRAMEWORK_REPO = https://github.com/gregneagle/relocatable-python.git BUILD_OPTS = --os-version=11 --python-version=3.10.5 --upgrade-pip --pip-requirements=requirements.txt Python.framework: relocatable-python python3 ./relocatable-python/make_relocatable_python_framework.py $(BUILD_OPTS) relocatable-python: - git clone $(REPO) + git clone $(FRAMEWORK_REPO) clean: rm -r Python.framework \ No newline at end of file diff --git a/app/python.xcconfig b/app/python.xcconfig index bbb2f6d2..c55de64f 100644 --- a/app/python.xcconfig +++ b/app/python.xcconfig @@ -1,5 +1,5 @@ -PYTHON_FRAMEWORK = $(PROJECT_DIR)/app/deps/embed/Python.framework PYTHON_VERSION = 3.10 +PYTHON_FRAMEWORK = $(PROJECT_DIR)/app/deps/embed/Python.framework PYTHON = $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/bin/python3 LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/lib/python$(PYTHON_VERSION)/config-$(PYTHON_VERSION)-darwin HEADER_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/Headers From 5dbfd3233568a69a20088286cf638dfc01a6c746 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sun, 26 Jun 2022 14:23:25 -0400 Subject: [PATCH 038/226] move config to module root --- setup.py | 67 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/setup.py b/setup.py index eca655fe..66fc5ca1 100644 --- a/setup.py +++ b/setup.py @@ -365,6 +365,40 @@ def run(self): print("\nBuilt PlotDevice.app, %s, and release.json in ./dist" % basename(ZIP)) +# common config between module and app builds +config = dict( + name = MODULE, + version = VERSION, + description = DESCRIPTION, + long_description = LONG_DESCRIPTION, + author = AUTHOR, + author_email = AUTHOR_EMAIL, + url = URL, + license = LICENSE, + classifiers = CLASSIFIERS, + packages = find_packages(exclude=['tests']), + install_requires = [ + 'requests', + 'cachecontrol', + 'lockfile', + 'pyobjc-core==8.5', + 'pyobjc-framework-Cocoa==8.5', + 'pyobjc-framework-Quartz==8.5', + 'pyobjc-framework-LaunchServices==8.5', + 'pyobjc-framework-WebKit==8.5', + ], + scripts = ["app/plotdevice"], + zip_safe=False, + cmdclass={ + 'app': BuildAppCommand, + 'clean': CleanCommand, + 'build_py': BuildCommand, + 'dist': DistCommand, + 'sdist': BuildDistCommand, + 'test': TestCommand, + }, +) + ## Run Build ## if __name__=='__main__': @@ -372,39 +406,6 @@ def run(self): # (this means the various commands don't have to play path games) os.chdir(dirname(abspath(__file__))) - # common config between module and app builds - config = dict( - name = MODULE, - version = VERSION, - description = DESCRIPTION, - long_description = LONG_DESCRIPTION, - author = AUTHOR, - author_email = AUTHOR_EMAIL, - url = URL, - license = LICENSE, - classifiers = CLASSIFIERS, - packages = find_packages(exclude=['tests']), - install_requires = [ - 'requests', - 'cachecontrol', - 'lockfile', - 'pyobjc-core==8.5', - 'pyobjc-framework-Cocoa==8.5', - 'pyobjc-framework-Quartz==8.5', - 'pyobjc-framework-LaunchServices==8.5', - 'pyobjc-framework-WebKit==8.5', - ], - scripts = ["app/plotdevice"], - zip_safe=False, - cmdclass={ - 'app': BuildAppCommand, - 'clean': CleanCommand, - 'build_py': BuildCommand, - 'dist': DistCommand, - 'sdist': BuildDistCommand, - 'test': TestCommand, - }, - ) # py2app-specific config if 'py2app' in sys.argv: From 4f8ad1b7c8f6910c99b16d6784d5150a85b0d8b3 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sun, 26 Jun 2022 14:27:49 -0400 Subject: [PATCH 039/226] use venv rather than build dir when running in-place --- .gitignore | 1 + plotdevice/run/__init__.py | 24 ++++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 0b397c6c..a4260b54 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ app/deps/vendor/Sparkle* app/deps/vendor/*.tar.gz app/deps/embed/Python.framework app/deps/embed/relocatable-python +app/deps/local # cds garbage related/ diff --git a/plotdevice/run/__init__.py b/plotdevice/run/__init__.py index d527322e..1c4a9233 100644 --- a/plotdevice/run/__init__.py +++ b/plotdevice/run/__init__.py @@ -1,14 +1,30 @@ import sys, site from os.path import abspath, dirname, relpath, exists, join +from subprocess import call, getoutput try: # test the sys.path by attempting to load a PyObjC submodule... import objc except ImportError: - # ...but if run from the sdist, the PyObjC site-dir will be in setup.py's build directory - objc_dir = abspath(join(dirname(__file__), '../../build/lib/plotdevice/lib/PyObjC')) - if exists(objc_dir): - site.addsitedir(objc_dir) + deps_dir = join(dirname(__file__), '../../app/deps') + if exists(deps_dir): + # if run from the sdist, install pyobjc et al. in a venv at app/deps/local + venv_dir = join(deps_dir, 'local') + if not exists(venv_dir): + import importlib.util + spec = importlib.util.spec_from_file_location("setup", join(dirname(__file__), '../../setup.py')) + setup = importlib.util.module_from_spec(spec) + spec.loader.exec_module(setup) + + import venv + venv.create(venv_dir, symlinks=True, with_pip=True) + PIP = '%s/bin/pip3' % venv_dir + call([PIP, 'install', '--upgrade', 'pip']) + call([PIP, '--isolated', 'install', *setup.config['install_requires']]) + + # use the venv's site directory + site_path = getoutput('%s/bin/python3 -c "import site; print(site.getsitepackages()[0])"' % venv_dir) + site.addsitedir(site_path) import objc else: from pprint import pformat From 96ba2d9ddd1cde978cbb4fc5b588ae2119d89607 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sun, 26 Jun 2022 14:42:08 -0400 Subject: [PATCH 040/226] drop python2 CPP macros --- app/deps/IO/module.m | 8 +++++++- app/deps/compat.h | 15 --------------- app/deps/foundry/module.m | 8 +++++++- app/deps/pathmatics/pathmatics.m | 8 +++++++- 4 files changed, 21 insertions(+), 18 deletions(-) delete mode 100644 app/deps/compat.h diff --git a/app/deps/IO/module.m b/app/deps/IO/module.m index 1a5bacb0..d11e28b8 100644 --- a/app/deps/IO/module.m +++ b/app/deps/IO/module.m @@ -1,5 +1,11 @@ #import -#include "../compat.h" +#define MOD_ERROR_VAL NULL +#define MOD_SUCCESS_VAL(val) val +#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void) +#define MOD_DEF(ob, name, doc, methods) \ + static struct PyModuleDef moduledef = { \ + PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \ + ob = PyModule_Create(&moduledef); PyMethodDef methods[] = { {NULL, NULL}, diff --git a/app/deps/compat.h b/app/deps/compat.h deleted file mode 100644 index 98930ed8..00000000 --- a/app/deps/compat.h +++ /dev/null @@ -1,15 +0,0 @@ -#if PY_MAJOR_VERSION >= 3 - #define MOD_ERROR_VAL NULL - #define MOD_SUCCESS_VAL(val) val - #define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void) - #define MOD_DEF(ob, name, doc, methods) \ - static struct PyModuleDef moduledef = { \ - PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \ - ob = PyModule_Create(&moduledef); -#else - #define MOD_ERROR_VAL - #define MOD_SUCCESS_VAL(val) - #define MOD_INIT(name) void init##name(void) - #define MOD_DEF(ob, name, doc, methods) \ - ob = Py_InitModule3(name, methods, doc); -#endif \ No newline at end of file diff --git a/app/deps/foundry/module.m b/app/deps/foundry/module.m index 5cdd2975..4e9f4d0d 100644 --- a/app/deps/foundry/module.m +++ b/app/deps/foundry/module.m @@ -1,5 +1,11 @@ #import -#include "../compat.h" +#define MOD_ERROR_VAL NULL +#define MOD_SUCCESS_VAL(val) val +#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void) +#define MOD_DEF(ob, name, doc, methods) \ + static struct PyModuleDef moduledef = { \ + PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \ + ob = PyModule_Create(&moduledef); PyMethodDef methods[] = { {NULL, NULL}, diff --git a/app/deps/pathmatics/pathmatics.m b/app/deps/pathmatics/pathmatics.m index 32080e6b..df7e6e14 100644 --- a/app/deps/pathmatics/pathmatics.m +++ b/app/deps/pathmatics/pathmatics.m @@ -694,6 +694,13 @@ + (CGPathRef)cgPath:(NSBezierPath *)nsPath{ @end +#define MOD_ERROR_VAL NULL +#define MOD_SUCCESS_VAL(val) val +#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void) +#define MOD_DEF(ob, name, doc, methods) \ + static struct PyModuleDef moduledef = { \ + PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \ + ob = PyModule_Create(&moduledef); static PyMethodDef PathmaticsMethods[] = { // pathmatics @@ -715,7 +722,6 @@ + (CGPathRef)cgPath:(NSBezierPath *)nsPath{ {NULL, NULL, 0, NULL} /* Sentinel */ }; -#include "../compat.h" MOD_INIT(cPathmatics){ PyObject *m; From dafd0e6a39b631dd2bdbe1950e6ceb2331969908 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 11:50:24 -0400 Subject: [PATCH 041/226] put all dependencies in Python.framework - the plotdevice module, pyobjc and friends all live in Python.framework/Versions/Current/lib/python3.10/site-packages now - prevents needing to splice the Resources subdir into sys.path manually - also obviates the pyobjc wheel-building in app/deps/vendor --- PlotDevice.xcodeproj/project.pbxproj | 4 +- app/deps/build.py | 10 +--- app/deps/embed/Makefile | 3 +- app/deps/embed/requirements.txt | 3 +- app/deps/vendor/Makefile | 74 ---------------------------- app/plotdevice-app.py | 6 --- 6 files changed, 7 insertions(+), 93 deletions(-) delete mode 100644 app/deps/vendor/Makefile diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 0ded7ada..2a76d550 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -471,7 +471,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd app/deps/embed\nmake\n"; + shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# build a relocatable Python.framework with our dependencies pre-installed\ncd app/deps/embed\nmake\n"; }; 2A758E411957B7CE003ECF9D /* Build PlotDevice Module */ = { isa = PBXShellScriptBuildPhase; @@ -485,7 +485,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# let the setup script handle updating\n$PYTHON setup.py build\n\n# copy the up-to-date module contents into the app bundle\nSITE_DIR=\"$TARGET_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/python\"\nditto build/lib \"$SITE_DIR\"\n\n# make sure everything has a .pyc (so code-signing doesn't break on first run)\n$PYTHON -m compileall -q \"$SITE_DIR/plotdevice\"\n"; + shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# let the setup script handle updating\n$PYTHON setup.py build\n\n# make sure everything has a .pyc (so code-signing doesn't break on first run)\n#$PYTHON -m compileall -q \"$SITE_DIR/plotdevice\"\n"; showEnvVarsInLog = 0; }; 2AF8981419953CA1005A49A5 /* Manually Update Examples */ = { diff --git a/app/deps/build.py b/app/deps/build.py index a0e0971a..2a019ab1 100644 --- a/app/deps/build.py +++ b/app/deps/build.py @@ -47,9 +47,6 @@ def build_extensions(): print("Building %s..."% lib_name) build(lib_name) - print("Building pyobjc...") - make('pyobjc') - def install_http_libs(mod_root): """Install the http modules into the Resources/python subdir""" print("Bundling requests module...") @@ -63,7 +60,7 @@ def install_extensions(ext_root): # Copy all build results to plotdevice/lib dir for extension in glob("%s/*/build/lib*"%DEPS): - cmd = 'cp -pR %s/* %s' % (extension, ext_root) + cmd = 'cp -p %s/* %s' % (extension, ext_root) result = call(cmd, shell=True) if result > 0: lib_name = dirname(dirname(extension)) @@ -80,11 +77,6 @@ def main(): mod_root = arg ext_root = join(mod_root, 'plotdevice/lib') build_extensions() - if 'ACTION' in os.environ: - # the ACTION env var will be defined for app and py2app builds, in which - # case we should install the http libs into Resources/python (for non-GUI - # builds, setup.py's install_requires will pull in dependencies automatically) - install_http_libs(mod_root) install_extensions(ext_root) else: print("usage: python build.py ") diff --git a/app/deps/embed/Makefile b/app/deps/embed/Makefile index ce66e190..9f890f7a 100644 --- a/app/deps/embed/Makefile +++ b/app/deps/embed/Makefile @@ -1,5 +1,6 @@ +PYTHON_VERSION = 3.10.5 FRAMEWORK_REPO = https://github.com/gregneagle/relocatable-python.git -BUILD_OPTS = --os-version=11 --python-version=3.10.5 --upgrade-pip --pip-requirements=requirements.txt +BUILD_OPTS = --os-version=11 --python-version=$(PYTHON_VERSION) --upgrade-pip --pip-requirements=requirements.txt Python.framework: relocatable-python python3 ./relocatable-python/make_relocatable_python_framework.py $(BUILD_OPTS) diff --git a/app/deps/embed/requirements.txt b/app/deps/embed/requirements.txt index 4823c92c..36f769c1 100644 --- a/app/deps/embed/requirements.txt +++ b/app/deps/embed/requirements.txt @@ -5,4 +5,5 @@ cffi lockfile pyobjc requests -six \ No newline at end of file +six +../../.. \ No newline at end of file diff --git a/app/deps/vendor/Makefile b/app/deps/vendor/Makefile deleted file mode 100644 index 881ad659..00000000 --- a/app/deps/vendor/Makefile +++ /dev/null @@ -1,74 +0,0 @@ -# interpretter info gathered from $PYTHON environment variable -PYTHON ?= python3 -PY_VERSION = $(shell $(PYTHON) -c 'import sys; print("py%i%i"%sys.version_info[:2])') - -# dependencies to be fetched -HTTP_MODULES = requests cachecontrol lockfile - -OBJC_VERSION = 8.5 -OBJC_SRC = pyobjc-$(OBJC_VERSION)-$(PY_VERSION).tar.gz -OBJC_URL = http://plotdevice.io/wheelhouse/$(OBJC_SRC) - -# paths -BUILD = build -ENV = $(BUILD)/env -WHEELHOUSE = $(BUILD)/wheelhouse -PYOBJC = $(BUILD)/lib/PyObjC -DSTROOT ?= $(BUILD)/HTTP -HTTP = $(DSTROOT)/$(firstword $(HTTP_MODULES)) - -# commands -CURL = @curl -L --progress-bar -f -# VIRTUALENV = $(BUILD)/virtualenv-$(VENV_VERSION)/virtualenv.py -PIP = $(ENV)/bin/pip3 --isolated - -# ---------------------------------------------------------------------------------------- # - -# create the sitedir at build/lib/PyObjC using the wheelhouse tarfile -# (whether downloaded from plotdevice.io or built locally using `make wheels`) -all, pyobjc: $(PYOBJC) - -# install the http libs in $DSTROOT -http: $(HTTP) - -# delete generated files -clean: - rm -rf $(BUILD) - -# delete generated files *and* cached archives -distclean: - rm -rf $(BUILD) $(VENV_SRC) $(OBJC_SRC) - -# retrieve the current PyObjC sources from PyPI and build wheels from them. the resulting -# wheelhouse dir is then tar'd up and will be used in subsequent `make all` runs -wheels: clean $(ENV) - $(PIP) install "pyobjc-core"==$(OBJC_VERSION) - $(PIP) wheel "pyobjc"==$(OBJC_VERSION) -w ${WHEELHOUSE} - tar czfv $(OBJC_SRC) -C $(BUILD) $(notdir ${WHEELHOUSE}) - -# ---------------------------------------------------------------------------------------- # - -# fetch the cached wheelhouse archive from plotdevice.io (or build it if necessary) -$(OBJC_SRC): - @echo $(OBJC_URL) - -$(CURL) $(OBJC_URL) -o $@ || $(MAKE) wheels - -# unpack the archived wheels in the build dir -$(WHEELHOUSE): $(OBJC_SRC) - @mkdir -p $(BUILD) - tar xzf $(OBJC_SRC) -C $(BUILD) - touch $@ - -# create a virtual environment at build/env -$(ENV): - $(PYTHON) -m venv $@ - $(PIP) install --upgrade pip - -# create a sitedir from the contents of build/wheelhouse -$(PYOBJC): $(WHEELHOUSE) $(ENV) - $(PIP) install --target=$@ --no-index --find-links=$(WHEELHOUSE) "pyobjc" - -# fetch the current versions of our helper modules -$(HTTP): $(ENV) - $(PIP) install --target=$(DSTROOT) $(HTTP_MODULES) - rm -rf $(DSTROOT)/*.dist-info diff --git a/app/plotdevice-app.py b/app/plotdevice-app.py index ea86ba6f..823434bc 100644 --- a/app/plotdevice-app.py +++ b/app/plotdevice-app.py @@ -1,9 +1,3 @@ -import sys -from os.path import dirname, abspath, join - -# rather than hijacking PYTHONPATH in the .m loader, add the module directory now -sys.path.append(join(dirname(abspath(__file__)), 'python')) - # PlotDevice is a typical document-based application. We'll import the PlotDeviceDocument # class et al from the gui module and the corresponding document-type defined in the # info.plist will do the rest. From 160dc496c1278f887648fcfd8e97a1311dc45556 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 12:05:03 -0400 Subject: [PATCH 042/226] support `python3 -m plotdevice` usage - moved the cli arg parsing to __main__.py and have it call console.run directly (since we're already in the proper interpreter there's no need to create a subprocess) - the `bin/plotdevice`command is now just a shell script that looks for a `python3` executable in the same directory as itself and passes args to the -m invocation (falling back to using whatever `python3` is in the path if it doesn't find one) --- app/plotdevice | 201 ++++---------------------------------- plotdevice/__main__.py | 115 ++++++++++++++++++++++ plotdevice/run/console.py | 40 ++++---- 3 files changed, 150 insertions(+), 206 deletions(-) create mode 100644 plotdevice/__main__.py diff --git a/app/plotdevice b/app/plotdevice index 53085c71..cdc65f2d 100755 --- a/app/plotdevice +++ b/app/plotdevice @@ -1,183 +1,18 @@ -#!/usr/bin/env python3 -# encoding: utf-8 -""" -plotdevice.py - -usage: plotdevice [-h] [-f] [-b] [--virtualenv PATH] [--export FILE] - [--frames N or M-N] [--fps N] [--rate N] [--loop [N]] [--live] - [--args [a [b ...]]] - file - -Run python scripts in PlotDevice.app or export graphics to a document (pdf/eps), -image (png/gif/jpg/tiff), or movie (mov/gif). - - Run a script: - plotdevice script.pv - - Run fullscreen: - plotdevice -f script.pv - - Save script's output to pdf: - plotdevice script.pv --export output.pdf - - Create an animated gif that loops every 2 seconds: - plotdevice script.pv --export output.gif --frames 60 --fps 30 --loop - - Create a sequence of numbered png files – one for each frame in the animation: - plotdevice script.pv --export output.png --frames 10 - - Create a 5 second long H.264 video at 2 megabits/sec: - plotdevice script.pv --export output.mov --frames 150 --rate 2.0 - -Options: - -h, --help show this help message and exit - -f run full-screen - -b run PlotDevice in the background - --virtualenv PATH path to virtualenv whose libraries you want to use (this - should point to the top-level virtualenv directory; a - folder containing a lib/python2.7/site-packages - subdirectory) - --export FILE a destination filename ending in pdf, eps, png, tiff, - jpg, gif, or mov - --cmyk sets the output color mode for PDF, EPS, or TIFF exports - --frames N or M-N number of frames to render or a range specifying the - first and last frames (default "1-") - --fps N frames per second in exported video (default 30) - --rate N bitrate in megabits per second (video only) - --loop [N] number of times to loop an exported animated gif (omit N - to loop forever) - --live re-render graphics each time the file is saved - --args [a [b ...]] arguments to be passed to the script as sys.argv - -PlotDevice Script File: - file the python script to be rendered -""" -from __future__ import print_function -import sys, os, re -import argparse -import json -import signal -from subprocess import Popen, PIPE -from os.path import exists, islink, dirname, abspath, realpath, join - -def module_root(): - parent = dirname(realpath(__file__)) if islink(__file__) else abspath(dirname(__file__)) - - # if running from a virtualenv or site-packages dir - for root in sys.path: - if exists(join(root, 'plotdevice/__init__.py')): - return root - - # if running from an app bundle - appname = 'PlotDevice.app' - if appname in parent: - bundle = parent[:parent.index(appname)+len(appname)] - return join(bundle, 'Contents/Resources/python') - - # if running from ./app/plotdevice in the source dist - if exists(join(parent, 'info.plist')): - return join(parent, '..') - - # ??? - print("Couldn't find the plotdevice module") - sys.exit(1) - -def parse_args(): - parser = argparse.ArgumentParser(description=main.__doc__, add_help=False) - o = parser.add_argument_group("Options", None) - o.add_argument('-h','--help', action='help', help='show this help message and exit') - o.add_argument('-f', dest='fullscreen', action='store_const', const=True, default=False, help='run full-screen') - o.add_argument('-b', dest='activate', action='store_const', const=False, default=True, help='run PlotDevice in the background') - o.add_argument('--virtualenv', metavar='PATH', help='path to virtualenv whose libraries you want to use (this should point to the top-level virtualenv directory; a folder containing a lib/python2.7/site-packages subdirectory)') - o.add_argument('--export', metavar='FILE', help='a destination filename ending in pdf, eps, png, tiff, jpg, gif, or mov') - o.add_argument('--frames', metavar='N or M-N', help='number of frames to render or a range specifying the first and last frames (default "1-")') - o.add_argument('--fps', metavar='N', default=30, type=int, help='frames per second in exported video (default 30)') - o.add_argument('--rate', metavar='N', default=1.0, type=float, dest='bitrate', help='bitrate in megabits per second (video only)') - o.add_argument('--loop', metavar='N', default=0, nargs='?', const=-1, help='number of times to loop an exported animated gif (omit N to loop forever)') - o.add_argument('--cmyk', action='store_const', const=True, default=False, help='convert colors to c/m/y/k during exports') - o.add_argument('--live', action='store_const', const=True, help='re-render graphics each time the file is saved') - o.add_argument('--args', nargs='*', default=[], metavar=('a','b'), help='arguments to be passed to the script as sys.argv') - i = parser.add_argument_group("PlotDevice Script File", None) - i.add_argument('file', help='the python script to be rendered') - - opts = parser.parse_args() - - if opts.virtualenv: - libdir = '%s/lib/python2.7/site-packages'%opts.virtualenv - if exists(libdir): - opts.virtualenv = abspath(libdir) - else: - parser.exit(1, "bad argument [--virtualenv]\nvirtualenv site-packages dir not found: %s\n"%libdir) - - if opts.file: - opts.file = abspath(opts.file) - if not exists(opts.file): - parser.exit(1, "file not found: %s\n"%opts.file) - - if opts.frames: - try: - frames = [int(f) if f else None for f in opts.frames.split('-')] - except ValueError: - parser.exit(1, 'bad argument [--frame]\nmust be a single integer ("42") or a hyphen-separated range ("33-66").\ncouldn\'t make sense of "%s"\n'%opts.frames) - - if len(frames) == 1: - opts.first, opts.last = (1, int(frames[0])) - elif len(frames) == 2: - if frames[1] is not None and frames[1]= (3,) else '' - python_cmd = prefix+suffix if prefix else sys.executable - console_py = join(opts.site, 'plotdevice/run/console.py') - - p = Popen([python_cmd, console_py], stdin=PIPE) - opts = (json.dumps(vars(opts))+"\n").encode('utf-8') - p.stdin.write(opts) - p.stdin.flush() - p.wait() - -if __name__ == "__main__": - main() +#!/bin/sh + +python=$( + self=${0} + while [ -L "${self}" ]; + do + cd "${self%/*}" + self=$(readlink "${self}") + done + cd "${self%/*}" + echo "$(pwd -P)/python3" +) + +if [ ! -x $python ]; then + python=python3 +fi + +$python -m plotdevice $@ \ No newline at end of file diff --git a/plotdevice/__main__.py b/plotdevice/__main__.py new file mode 100644 index 00000000..2ed2076c --- /dev/null +++ b/plotdevice/__main__.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 +# encoding: utf-8 +""" +Examples: + Run a script: + python -m plotdevice script.pv + + Run fullscreen: + python -m plotdevice -f script.pv + + Save script's output to pdf: + python -m plotdevice script.pv --export output.pdf + +Animation Examples: + Create a 5 second long H.265 video at 2 megabits/sec: + python -m plotdevice script.pv --export output.mov --frames 150 --rate 2.0 + + Create a sequence of numbered png files – one for each frame in the animation: + python -m plotdevice script.pv --export output.png --frames 10 + + Create an animated gif that loops every 2 seconds: + python -m plotdevice script.pv --export output.gif --frames 60 --fps 30 --loop +""" + +from __future__ import print_function +import sys, os, re +import argparse +import json +import signal +from glob import glob +from subprocess import Popen, PIPE +from os.path import exists, islink, dirname, abspath, realpath, join +from .run.console import run + +def main(): + """Run python scripts in a window or export graphics to a + document (pdf/eps), image (png/jpg/heic/gif/tiff), or movie (mov/gif).""" + parser = argparse.ArgumentParser(description=main.__doc__, add_help=False, prog='python -m plotdevice') + o = parser.add_argument_group("Options", None) + o.add_argument('-h','--help', action='help', help='show this help message and exit') + o.add_argument('-f', dest='fullscreen', action='store_const', const=True, default=False, help='run full-screen') + o.add_argument('-b', dest='activate', action='store_const', const=False, default=True, help='run PlotDevice in the background') + o.add_argument('--virtualenv', metavar='PATH', help='path to virtualenv whose libraries you want to use (this should point to the top-level virtualenv directory; a folder containing a lib/python3.x/site-packages subdirectory)') + o.add_argument('--export', '-o', metavar='FILE', help='a destination filename ending in pdf, eps, png, tiff, jpg, heic, gif, or mov') + o.add_argument('--frames', metavar='N or M-N', help='number of frames to render or a range specifying the first and last frames (default "1-")') + o.add_argument('--fps', metavar='N', default=30, type=int, help='frames per second in exported video (default 30)') + o.add_argument('--rate', metavar='N', default=1.0, type=float, dest='bitrate', help='bitrate in megabits per second (video only)') + o.add_argument('--loop', metavar='N', default=0, nargs='?', const=-1, help='number of times to loop an exported animated gif (omit N to loop forever)') + o.add_argument('--cmyk', action='store_const', const=True, default=False, help='convert colors to c/m/y/k during exports') + o.add_argument('--live', action='store_const', const=True, help='re-render graphics each time the file is saved') + o.add_argument('--args', nargs='*', default=[], metavar=('a','b'), help='arguments to be passed to the script as sys.argv') + i = parser.add_argument_group("PlotDevice Script File", None) + i.add_argument('script', help='the python script to be rendered') + + try: + opts = parser.parse_args() + except: + parser.print_help() + print(sys.modules[__name__].__doc__) + return + + if opts.virtualenv: + libdirs = glob('%s/lib/python*/site-packages'%opts.virtualenv) + if len(libdirs) and exists(libdir[0]): + opts.virtualenv = abspath(libdir[0]) + else: + parser.exit(1, "bad argument [--virtualenv]\nvirtualenv site-packages dir not found: %s\n"%libdir) + + if opts.script: + opts.script = abspath(opts.script) + if not exists(opts.script): + parser.exit(1, "file not found: %s\n"%opts.script) + + if opts.frames: + try: + frames = [int(f) if f else None for f in opts.frames.split('-')] + except ValueError: + parser.exit(1, 'bad argument [--frame]\nmust be a single integer ("42") or a hyphen-separated range ("33-66").\ncouldn\'t make sense of "%s"\n'%opts.frames) + + if len(frames) == 1: + opts.first, opts.last = (1, int(frames[0])) + elif len(frames) == 2: + if frames[1] is not None and frames[1] Date: Mon, 27 Jun 2022 12:06:12 -0400 Subject: [PATCH 043/226] move signal handling to gcd - calling handleInterrupts will start listening to SIGINT and quit the app if one is received (e.g., from ^c in the terminal that opened a window via the plotdevice command) --- app/deps/IO/SysAdmin.h | 2 ++ app/deps/IO/SysAdmin.m | 13 +++++++++++++ plotdevice/run/console.py | 21 +++------------------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/deps/IO/SysAdmin.h b/app/deps/IO/SysAdmin.h index 716e042d..6534895f 100644 --- a/app/deps/IO/SysAdmin.h +++ b/app/deps/IO/SysAdmin.h @@ -7,7 +7,9 @@ // #import +#import @interface SysAdmin : NSObject + (BOOL)createSymlink:(NSString *)toolPath; ++ (void)handleInterrupt; @end diff --git a/app/deps/IO/SysAdmin.m b/app/deps/IO/SysAdmin.m index 9d3df258..f36dc3b3 100644 --- a/app/deps/IO/SysAdmin.m +++ b/app/deps/IO/SysAdmin.m @@ -38,4 +38,17 @@ + (BOOL)createSymlink:(NSString *)toolPath{ return YES; #pragma clang diagnostic warning "-Wdeprecated-declarations" } + ++ (void)handleInterrupt{ + dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, SIGINT, 0, dispatch_get_global_queue(0, 0)); + dispatch_source_set_event_handler(source, ^{ + // quit on ctrl-c + [NSApp terminate:nil]; + }); + dispatch_resume(source); + + struct sigaction action = { 0 }; + action.sa_handler = SIG_IGN; + sigaction(SIGINT, &action, NULL); +} @end diff --git a/plotdevice/run/console.py b/plotdevice/run/console.py index d0b4c2d0..bf4c289e 100755 --- a/plotdevice/run/console.py +++ b/plotdevice/run/console.py @@ -93,22 +93,6 @@ def applicationDidFinishLaunching_(self, note): kind = 'movie' if format in ('mov','gif') else 'image' self.script.exportInit(kind, opts['export'], opts) - def catchInterrupts_(self, sender): - read, write, timeout = select.select([sys.stdin.fileno()], [], [], 0) - for fd in read: - if fd == sys.stdin.fileno(): - line = sys.stdin.readline().strip() - if 'CANCEL' in line: - script = self.script - if script.vm.session: - script.vm.session.cancel() - - if getattr(script,'animationTimer',None) is not None: - script.stopScript() - elif self.mode == 'windowed': - NSApp().delegate().done(quit=True) - self.poll.waitForDataInBackgroundAndNotify() - @objc.IBAction def openLink_(self, sender): link = 'http://plotdevice.io' @@ -249,10 +233,11 @@ def progress(written, total, width=20): def run(opts): + # install a signal handler to catch ^c + SysAdmin.handleInterrupt() + mode = 'headless' if opts['export'] else 'windowed' app = ScriptApp.sharedApplicationForMode_(mode) delegate = ScriptAppDelegate.alloc().initWithOpts_forMode_(opts, mode) app.setDelegate_(delegate) - signal.signal(signal.SIGINT, signal.SIG_IGN) - AppHelper.runEventLoop(installInterrupt=False) AppHelper.runEventLoop() From b3df42866bcc5b9594a80a389bbe60654067ca11 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 12:51:06 -0400 Subject: [PATCH 044/226] improve cli help message --- app/plotdevice | 2 +- plotdevice/__main__.py | 39 +++++++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/app/plotdevice b/app/plotdevice index cdc65f2d..28dc9599 100755 --- a/app/plotdevice +++ b/app/plotdevice @@ -1,5 +1,5 @@ #!/bin/sh - +export _p_l_o_t_d_e_v_i_c_e_=$(basename ${0}) python=$( self=${0} while [ -L "${self}" ]; diff --git a/plotdevice/__main__.py b/plotdevice/__main__.py index 2ed2076c..396fa24f 100644 --- a/plotdevice/__main__.py +++ b/plotdevice/__main__.py @@ -3,23 +3,23 @@ """ Examples: Run a script: - python -m plotdevice script.pv + python3 -m plotdevice script.pv Run fullscreen: - python -m plotdevice -f script.pv + python3 -m plotdevice -f script.pv Save script's output to pdf: - python -m plotdevice script.pv --export output.pdf + python3 -m plotdevice script.pv --export output.pdf Animation Examples: Create a 5 second long H.265 video at 2 megabits/sec: - python -m plotdevice script.pv --export output.mov --frames 150 --rate 2.0 + python3 -m plotdevice script.pv --export output.mov --frames 150 --rate 2.0 Create a sequence of numbered png files – one for each frame in the animation: - python -m plotdevice script.pv --export output.png --frames 10 + python3 -m plotdevice script.pv --export output.png --frames 10 Create an animated gif that loops every 2 seconds: - python -m plotdevice script.pv --export output.gif --frames 60 --fps 30 --loop + python3 -m plotdevice script.pv --export output.gif --frames 60 --fps 30 --loop """ from __future__ import print_function @@ -31,11 +31,16 @@ from subprocess import Popen, PIPE from os.path import exists, islink, dirname, abspath, realpath, join from .run.console import run +from . import __version__ def main(): - """Run python scripts in a window or export graphics to a - document (pdf/eps), image (png/jpg/heic/gif/tiff), or movie (mov/gif).""" - parser = argparse.ArgumentParser(description=main.__doc__, add_help=False, prog='python -m plotdevice') + parser = argparse.ArgumentParser( + add_help=False, + description="Run python scripts in a window or export graphics to a document (pdf/eps), image (png/jpg/heic/gif/tiff), or movie (mov/gif).", + epilog=sys.modules[__name__].__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter, + prog=os.environ.pop('_p_l_o_t_d_e_v_i_c_e_', 'python3 -m plotdevice') + ) o = parser.add_argument_group("Options", None) o.add_argument('-h','--help', action='help', help='show this help message and exit') o.add_argument('-f', dest='fullscreen', action='store_const', const=True, default=False, help='run full-screen') @@ -49,18 +54,20 @@ def main(): o.add_argument('--cmyk', action='store_const', const=True, default=False, help='convert colors to c/m/y/k during exports') o.add_argument('--live', action='store_const', const=True, help='re-render graphics each time the file is saved') o.add_argument('--args', nargs='*', default=[], metavar=('a','b'), help='arguments to be passed to the script as sys.argv') + o.add_argument('--version', action='version', version='PlotDevice %s' % __version__) + i = parser.add_argument_group("PlotDevice Script File", None) i.add_argument('script', help='the python script to be rendered') - try: - opts = parser.parse_args() - except: - parser.print_help() - print(sys.modules[__name__].__doc__) - return + if len(sys.argv)==1: + parser.print_usage() + print('for more detail:\n %s --help' % parser.prog) + return + + opts = parser.parse_args() if opts.virtualenv: - libdirs = glob('%s/lib/python*/site-packages'%opts.virtualenv) + libdirs = glob('%s/lib/python3.*/site-packages'%opts.virtualenv) if len(libdirs) and exists(libdir[0]): opts.virtualenv = abspath(libdir[0]) else: From ad3cc6b369af2c6c72991a521181540ff49228b5 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 12:51:20 -0400 Subject: [PATCH 045/226] add attribution --- app/deps/IO/SysAdmin.m | 1 + 1 file changed, 1 insertion(+) diff --git a/app/deps/IO/SysAdmin.m b/app/deps/IO/SysAdmin.m index f36dc3b3..0006b4f9 100644 --- a/app/deps/IO/SysAdmin.m +++ b/app/deps/IO/SysAdmin.m @@ -40,6 +40,7 @@ + (BOOL)createSymlink:(NSString *)toolPath{ } + (void)handleInterrupt{ + // thanks to: https://www.mikeash.com/pyblog/friday-qa-2011-04-01-signal-handling.html dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, SIGINT, 0, dispatch_get_global_queue(0, 0)); dispatch_source_set_event_handler(source, ^{ // quit on ctrl-c From 7632c73ca9ae52a42397a14aac7bfcfab636eedd Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 14:36:23 -0400 Subject: [PATCH 046/226] change Foundation import to wildcard - some essential side effect is triggered by the * import (without it, the process bus errors) --- plotdevice/gfx/atoms.py | 5 +---- plotdevice/lib/cocoa.py | 11 +---------- plotdevice/lib/io.py | 2 ++ plotdevice/run/sandbox.py | 2 -- 4 files changed, 4 insertions(+), 16 deletions(-) diff --git a/plotdevice/gfx/atoms.py b/plotdevice/gfx/atoms.py index 34cc9ecc..553b7e76 100644 --- a/plotdevice/gfx/atoms.py +++ b/plotdevice/gfx/atoms.py @@ -1,10 +1,7 @@ # encoding: utf-8 -from AppKit import * -from Foundation import * -from Quartz import * from collections import namedtuple, defaultdict -from plotdevice import DeviceError +from .. import DeviceError from ..lib.foundry import fontspec from ..util import _copy_attrs, _copy_attr, _flatten, trim_zeroes, numlike from .colors import Color diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index 9bb32a73..d2287682 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -46,16 +46,7 @@ NSToolbarItem, NSTrackingActiveInActiveApp, NSTrackingArea, NSTrackingMouseEnteredAndExited, \ NSUnboldFontMask, NSUnitalicFontMask, NSUnionRect, NSView, NSViewFrameDidChangeNotification, \ NSWindow, NSWindowBackingLocationVideoMemory, NSWindowController, NSWorkspace, NSKernAttributeName -from Foundation import CIAffineTransform, CIColorMatrix, CIContext, CIFilter, CIImage, \ - CIVector, Foundation, NO, NSAffineTransform, NSAffineTransformStruct, \ - NSAttributedString, NSAutoreleasePool, NSBundle, NSData, NSDate, NSDateFormatter, \ - NSFileCoordinator, NSFileHandle, NSFileHandleDataAvailableNotification, NSIntersectionRange, \ - NSHeight, NSInsetRect, NSIntersectionRect, NSLocale, NSLog, NSMacOSRomanStringEncoding, \ - NSMakeRange, NSMidX, NSMidY, NSMutableAttributedString, NSMutableData, NSNotificationCenter, NSObject,\ - NSOffsetRect, NSOperationQueue, NSPoint, NSRect, NSRectFromString, NSSelectorFromString, \ - NSSize, NSString, NSStringFromRect, NSTimeZone, NSTimer, NSURL, NSUserDefaults, \ - NSUTF8StringEncoding, NSWidth +from Foundation import * from LaunchServices import kUTTypePNG, kUTTypeJPEG, kUTTypeGIF, kUTTypeTIFF from WebKit import WebView from objc import IBOutlet, IBAction - diff --git a/plotdevice/lib/io.py b/plotdevice/lib/io.py index 4bf4b28b..f7d73ac5 100644 --- a/plotdevice/lib/io.py +++ b/plotdevice/lib/io.py @@ -1,4 +1,6 @@ import objc, os, re +# from Foundation import * + import cIO for cls in ["AnimatedGif", "Pages", "SysAdmin", "Video"]: globals()[cls] = objc.lookUpClass(cls) diff --git a/plotdevice/run/sandbox.py b/plotdevice/run/sandbox.py index 2b7db058..ee16c60b 100644 --- a/plotdevice/run/sandbox.py +++ b/plotdevice/run/sandbox.py @@ -4,8 +4,6 @@ from inspect import getargspec from collections import namedtuple from PyObjCTools import AppHelper -from Foundation import * -from AppKit import * from ..lib.io import MovieExportSession, ImageExportSession from .common import stacktrace, coredump, uncoded from plotdevice import util, context, gfx, Halted, DeviceError From 1a2115dc4ab93256d47a92a63ea2c050386944de Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 14:37:08 -0400 Subject: [PATCH 047/226] update embedded plotdevice w/ each build --- PlotDevice.xcodeproj/project.pbxproj | 2 +- app/deps/embed/Makefile | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 2a76d550..10136498 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -471,7 +471,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# build a relocatable Python.framework with our dependencies pre-installed\ncd app/deps/embed\nmake\n"; + shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# build a relocatable Python.framework with our dependencies pre-installed\ncd app/deps/embed\nmake update\n"; }; 2A758E411957B7CE003ECF9D /* Build PlotDevice Module */ = { isa = PBXShellScriptBuildPhase; diff --git a/app/deps/embed/Makefile b/app/deps/embed/Makefile index 9f890f7a..831b410d 100644 --- a/app/deps/embed/Makefile +++ b/app/deps/embed/Makefile @@ -1,6 +1,7 @@ PYTHON_VERSION = 3.10.5 FRAMEWORK_REPO = https://github.com/gregneagle/relocatable-python.git BUILD_OPTS = --os-version=11 --python-version=$(PYTHON_VERSION) --upgrade-pip --pip-requirements=requirements.txt +BIN = ./Python.framework/Versions/Current/bin Python.framework: relocatable-python python3 ./relocatable-python/make_relocatable_python_framework.py $(BUILD_OPTS) @@ -9,4 +10,7 @@ relocatable-python: git clone $(FRAMEWORK_REPO) clean: - rm -r Python.framework \ No newline at end of file + rm -r Python.framework + +update: Python.framework + $(BIN)/pip3 install --upgrade ../../.. From 077eb293022f9e0078b9ebdc7b8f8ae0af1141eb Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 14:38:00 -0400 Subject: [PATCH 048/226] update metadata --- plotdevice/__init__.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plotdevice/__init__.py b/plotdevice/__init__.py index 32bfa4e2..5018674a 100644 --- a/plotdevice/__init__.py +++ b/plotdevice/__init__.py @@ -12,7 +12,7 @@ """Quartz-powered vector machine -Copyright (C) 2015 Samizdat Drafting Co. +Copyright ©2014–2022 Samizdat Drafting Co. A derivative of http://nodebox.net/code by Frederik De Bleser & Tom De Smedt All rights reserved. @@ -20,9 +20,9 @@ """ import sys, re, os -__version__ = '0.10.1' +__version__ = '0.11' __author__ = 'Christian Swinehart' -__email__ = 'drafting@samizdat.cc' +__email__ = 'drafting@samizdat.co' __credits__ = 'Frederik De Bleser, Tom De Smedt, Just van Rossum, & Marcos Ojeda' __license__ = 'MIT' @@ -64,5 +64,3 @@ class Halted(Exception): pass # special exception to cleanly exit animation # context/canvas's internal ns globals().update(ctx._ns) __all__ = list(ctx._ns.keys()) - - From 88d9e537ad5b45ca98164bd44ae8f866b1eac09d Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 14:43:21 -0400 Subject: [PATCH 049/226] build version-specific local venvs --- plotdevice/run/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plotdevice/run/__init__.py b/plotdevice/run/__init__.py index 1c4a9233..cb6464b0 100644 --- a/plotdevice/run/__init__.py +++ b/plotdevice/run/__init__.py @@ -9,7 +9,8 @@ deps_dir = join(dirname(__file__), '../../app/deps') if exists(deps_dir): # if run from the sdist, install pyobjc et al. in a venv at app/deps/local - venv_dir = join(deps_dir, 'local') + import platform + venv_dir = join(deps_dir, 'local', platform.python_version()) if not exists(venv_dir): import importlib.util spec = importlib.util.spec_from_file_location("setup", join(dirname(__file__), '../../setup.py')) From dc4b9a53c987e099f3493235b124ad4c6f9f65c1 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 14:57:00 -0400 Subject: [PATCH 050/226] update requirements --- README.md | 68 +++++++++++++++++++++++-------------------------------- 1 file changed, 28 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 6f04d2a4..64318acb 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,34 @@ PlotDevice ========== -PlotDevice is a Macintosh application used for computational graphic design. It provides an -interactive Python environment where you can create two-dimensional graphics -and output them in a variety of vector, bitmap, and animation formats. It is -meant both as a sketch environment for exploring generative design and as a -general purpose graphics library for use in external Python programs. +PlotDevice is a Macintosh application used for computational graphic design. It +provides an interactive Python environment where you can create two-dimensional +graphics and output them in a variety of vector, bitmap, and animation formats. +It is meant both as a sketch environment for exploring generative design and as +a general purpose graphics library for use in external Python programs. PlotDevice scripts can create images from simple geometric primitives, text, and external vector or bitmap images. Drawing commands provide a thin abstraction over Mac OS X's Quartz graphics engine, providing high-quality rendering of 2D imagery and powerful compositing operations. -#### Derived from NodeBox - -PlotDevice is a [fork](https://github.com/nodebox/nodebox-pyobjc) of the legacy -[NodeBox 1](http://nodebox.net/code) application with a number of updates taking -advantage of recent OS features and simplifying its build procedure. As a result -it now happily runs on 64 bit systems, uses Python 2.7, and makes use of the version -of PyObjC provided by the system. It requires a Macintosh running OS X 10.9 or greater. - -#### Alternatives - -Though Quartz is not by any means ‘slow’, its focus on rendering quality does -mean that if you're interested in doing realtime or interactive work you may -be better served by [NodeBox GL](http://www.cityinabottle.org/nodebox/). This -project's focus is on allowing your scripts to generate ‘camera ready’ graphics -and movies for use elsewhere. To that end it provides functionality to -efficiently export script output as vector documents (`pdf`,`eps`), -bitmap images (`png`,`gif`,`jpg`,`tiff`), or animations (`mov`,`gif`). - -#### Latest changes (July 2015) - -* Python 3 compatible -* Can now be built with system Python or [Homebrew](http://brew.sh) versions of the interpreter -* Much faster import times on Yosemite thanks to a bundled copy of PyObjC 3.0.4 -* HTTP is now handled by the `requests` module and caches responses locally -* Totally revamped [typography](http://plotdevice.io/tut/Typography) system with - support for OpenType features, pagination, multi-column text, character geometry, and more -* Added 130+ unit tests (run them with `python setup.py test`) plus bugfixes for - for `measure()`, `textpath()`, `Bezier.fit()`, `read()`, and the Preferences dialog -* Miscellaneous enhancements to existing commands (see - [`CHANGES.md`](https://github.com/plotdevice/plotdevice/blob/master/CHANGES.md) for details) +#### Requirements + +The PlotDevice application requires macOS 11 or greater (either on Intel or Apple Silicon) +and comes bundled with a Python 3.10 distribution. The module can be installed via `pip3` +on Python versions ≥3.8 (including the interpreter from the Xcode +[command line tools](https://developer.apple.com/download/all/?q=command%20line%20tools%20for%20xcode)). + +When using [pyenv](https://github.com/pyenv/pyenv), be sure to build the interpreter as a +**Framework** if you want to be able to view your script's output in a window: +```console +env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.10.4 +pyenv local 3.10.4 +python3 -m plotdevice +``` + +#### Latest changes (July 2020) + +* TKTK Installation ------------ @@ -70,7 +58,7 @@ and launch scripts from the command line (or from a ‘shebang’ line at the to script invoking the `plotdevice` tool). To install the module and command line tool use `python setup.py install` -Easier still, you can install the module directly from PyPI with a simple `pip install plotdevice` +Easier still, you can install the module directly from PyPI with a simple `pip3 install plotdevice` Documentation ------------- @@ -158,14 +146,14 @@ Libraries can be installed individually or en masse using the archive #### Installing Python modules The easiest way to use third-party modules from a PlotDevice script is to create a -[`virtualenv`](http://virtualenv.org) and use `pip` to install your dependencies. +[`virtualenv`](http://virtualenv.org) and use `pip3` to install your dependencies. You can then launch your script with the `--virtualenv` option to add them to the import path: ```bash $ virtualenv env $ source ./env/bin/activate -(env)$ pip install redis +(env)$ pip3 install redis (env)$ plotdevice script.pv --virtualenv ./env ``` @@ -177,8 +165,8 @@ omit the `--virtualenv` option: ```bash $ virtualenv env $ source ./env/bin/activate -(env)$ pip install plotdevice -(env)$ pip install requests envoy bs4 # some other useful packages +(env)$ pip3 install plotdevice +(env)$ pip3 install requests envoy bs4 # some other useful packages (env)$ plotdevice script.pv # uses the tool found at ./env/bin/plotdevice ``` From a17ebdee0caa78eb451ee73ebec5d9480847d652 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 15:41:31 -0400 Subject: [PATCH 051/226] move foundation import to .run - inexplicably it cuts startup time in half --- plotdevice/lib/cocoa.py | 10 +++++++++- plotdevice/lib/io.py | 1 - plotdevice/run/__init__.py | 8 +++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index d2287682..6b9a07f3 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -46,7 +46,15 @@ NSToolbarItem, NSTrackingActiveInActiveApp, NSTrackingArea, NSTrackingMouseEnteredAndExited, \ NSUnboldFontMask, NSUnitalicFontMask, NSUnionRect, NSView, NSViewFrameDidChangeNotification, \ NSWindow, NSWindowBackingLocationVideoMemory, NSWindowController, NSWorkspace, NSKernAttributeName -from Foundation import * +from Foundation import CIAffineTransform, CIColorMatrix, CIContext, CIFilter, CIImage, \ + CIVector, Foundation, NO, NSAffineTransform, NSAffineTransformStruct, \ + NSAttributedString, NSAutoreleasePool, NSBundle, NSData, NSDate, NSDateFormatter, \ + NSFileCoordinator, NSFileHandle, NSFileHandleDataAvailableNotification, NSIntersectionRange, \ + NSHeight, NSInsetRect, NSIntersectionRect, NSLocale, NSLog, NSMacOSRomanStringEncoding, \ + NSMakeRange, NSMidX, NSMidY, NSMutableAttributedString, NSMutableData, NSNotificationCenter, NSObject,\ + NSOffsetRect, NSOperationQueue, NSPoint, NSRect, NSRectFromString, NSSelectorFromString, \ + NSSize, NSString, NSStringFromRect, NSTimeZone, NSTimer, NSURL, NSUserDefaults, \ + NSUTF8StringEncoding, NSWidth from LaunchServices import kUTTypePNG, kUTTypeJPEG, kUTTypeGIF, kUTTypeTIFF from WebKit import WebView from objc import IBOutlet, IBAction diff --git a/plotdevice/lib/io.py b/plotdevice/lib/io.py index f7d73ac5..f098b395 100644 --- a/plotdevice/lib/io.py +++ b/plotdevice/lib/io.py @@ -1,5 +1,4 @@ import objc, os, re -# from Foundation import * import cIO for cls in ["AnimatedGif", "Pages", "SysAdmin", "Video"]: diff --git a/plotdevice/run/__init__.py b/plotdevice/run/__init__.py index cb6464b0..2ecd5ae7 100644 --- a/plotdevice/run/__init__.py +++ b/plotdevice/run/__init__.py @@ -1,10 +1,10 @@ import sys, site -from os.path import abspath, dirname, relpath, exists, join +from os.path import abspath, dirname, exists, join from subprocess import call, getoutput try: # test the sys.path by attempting to load a PyObjC submodule... - import objc + from Foundation import * except ImportError: deps_dir = join(dirname(__file__), '../../app/deps') if exists(deps_dir): @@ -26,12 +26,10 @@ # use the venv's site directory site_path = getoutput('%s/bin/python3 -c "import site; print(site.getsitepackages()[0])"' % venv_dir) site.addsitedir(site_path) - import objc + from Foundation import * else: from pprint import pformat missing = "Searched for PyObjC libraries in:\n%s\nto no avail..."%pformat(sys.path) - if exists('%s/../../app/info.plist'%dirname(__file__)): - missing += '\n\nBuild the plotdevice module with `python setup.py build\' before attempting import it.' raise RuntimeError(missing) # pull in the encoding-pragma detector From 1c09a2616fed7cb98042d00175ff7d9ea31e8b92 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 16:43:50 -0400 Subject: [PATCH 052/226] moved file-watching to gcd - much lower latency than the NSFileCoordinator approach --- app/deps/IO/SysAdmin.h | 1 + app/deps/IO/SysAdmin.m | 25 +++++++++++++++++++++++++ plotdevice/run/console.py | 17 +++-------------- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/app/deps/IO/SysAdmin.h b/app/deps/IO/SysAdmin.h index 6534895f..6de8bf02 100644 --- a/app/deps/IO/SysAdmin.h +++ b/app/deps/IO/SysAdmin.h @@ -12,4 +12,5 @@ @interface SysAdmin : NSObject + (BOOL)createSymlink:(NSString *)toolPath; + (void)handleInterrupt; ++ (void)watchFile:(NSString*)path for:(NSObject *)observer onUpdate:(SEL)handler; @end diff --git a/app/deps/IO/SysAdmin.m b/app/deps/IO/SysAdmin.m index 0006b4f9..2135c547 100644 --- a/app/deps/IO/SysAdmin.m +++ b/app/deps/IO/SysAdmin.m @@ -52,4 +52,29 @@ + (void)handleInterrupt{ action.sa_handler = SIG_IGN; sigaction(SIGINT, &action, NULL); } + ++ (void)watchFile:(NSString*)path for:(NSObject *)observer onUpdate:(SEL)handler { + // thanks to: https://web.archive.org/web/20170528144758/http://www.davidhamrick.com/2011/10/13/Monitoring-Files-With-GCD-Being-Edited-With-A-Text-Editor.html + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + int fildes = open([path UTF8String], O_EVTONLY); + __block dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE,fildes, + DISPATCH_VNODE_DELETE | DISPATCH_VNODE_WRITE | DISPATCH_VNODE_EXTEND | DISPATCH_VNODE_ATTRIB | DISPATCH_VNODE_LINK | DISPATCH_VNODE_RENAME | DISPATCH_VNODE_REVOKE, + queue); + dispatch_source_set_event_handler(source, ^{ + unsigned long flags = dispatch_source_get_data(source); + if(flags & DISPATCH_VNODE_DELETE){ + dispatch_source_cancel(source); + [SysAdmin watchFile:path for:observer onUpdate:handler]; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [observer performSelector:handler]; + }); + }); + dispatch_source_set_cancel_handler(source, ^(void) + { + close(fildes); + }); + dispatch_resume(source); +} @end diff --git a/plotdevice/run/console.py b/plotdevice/run/console.py index bf4c289e..92789200 100755 --- a/plotdevice/run/console.py +++ b/plotdevice/run/console.py @@ -108,22 +108,9 @@ class ScriptWatcher(NSObject): def initWithScript_(self, script): self.script = script self.mtime = os.path.getmtime(script.path) - self._queue = NSOperationQueue.mainQueue() - NSFileCoordinator.addFilePresenter_(self) + SysAdmin.watchFile_for_onUpdate_(script.path, script, '_refresh') return self - def presentedItemURL(self): - return NSURL.fileURLWithPath_(self.script.path) - - def presentedItemOperationQueue(self): - return self._queue - - def presentedItemDidChange(self): - if not self.stale(): - return - # call the script's _refresh handler if the change-event wasn't spurious - self.script.performSelectorOnMainThread_withObject_waitUntilDone_("_refresh", None, True) - def stale(self): file_mtime = os.path.getmtime(self.script.path) if file_mtime > self.mtime: @@ -160,6 +147,8 @@ def scriptedRun(self): def _refresh(self): # file changed: reread the script (and potentially run it) + if not self.watcher.stale(): + return # file was re-saved but not changed self.vm.source = self.unicode_src if self.opts['live']: self.scriptedRun() From 7453ddad98a733cf7f7dfd70801b7e670ca61416 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 17:06:14 -0400 Subject: [PATCH 053/226] validate first- & last-frame are finite range --- plotdevice/run/console.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plotdevice/run/console.py b/plotdevice/run/console.py index 92789200..c6db7d1c 100755 --- a/plotdevice/run/console.py +++ b/plotdevice/run/console.py @@ -82,10 +82,8 @@ def applicationDidFinishLaunching_(self, note): self.script = ConsoleScript.alloc().init() self.script.setScript_options_(pth, opts) - # BUG? FEATURE? (it's a mystery!) - # exports will stall if `last` isn't an int. this should probably - # be handled by the command line arg-parser though, no? - if not opts.get('last',None): + # make sure the frame count is finite + if not opts.get('last', None): opts['last'] = opts.get('first', 1) # kick off an export session From 5926d5b3611755a6d9999021064c33f976c34a40 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 17:07:22 -0400 Subject: [PATCH 054/226] translate() uses same units set in size() - previously, setting up a canvas with (10, 10, cm) and then calling translate(5, 5) would only shift by 5px rather than 5cm --- plotdevice/context.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plotdevice/context.py b/plotdevice/context.py index 4c231b5f..f403f525 100644 --- a/plotdevice/context.py +++ b/plotdevice/context.py @@ -627,7 +627,8 @@ def reset(self): return xf def translate(self, x=0, y=0): - """Shift subsequent drawing operations by (x,y)""" + x *= self._grid.dpx + y *= self._grid.dpx return self._transform.translate(x,y, rollback=True) def scale(self, x=1, y=None): From 3036bfc9f33f038b6b329b10e54fc9bf507f3d3b Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 17:46:45 -0400 Subject: [PATCH 055/226] fix metadata handoff to sandbox - fixes #52 --- plotdevice/run/console.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plotdevice/run/console.py b/plotdevice/run/console.py index c6db7d1c..a429f894 100755 --- a/plotdevice/run/console.py +++ b/plotdevice/run/console.py @@ -125,7 +125,7 @@ def init(self): def setScript_options_(self, path, opts): self.vm.path = path self.vm.source = self.unicode_src - self.vm.metadata.update(opts) + self.vm.metadata = opts self.opts = opts self.watcher = ScriptWatcher.alloc().initWithScript_(self) From 943c87bc917aa33640a6a998b6a027d4a388ac75 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 17:47:25 -0400 Subject: [PATCH 056/226] add missing Bezier import - fixes #49 --- plotdevice/lib/pathmatics.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/plotdevice/lib/pathmatics.py b/plotdevice/lib/pathmatics.py index 5ac07aee..637d1145 100644 --- a/plotdevice/lib/pathmatics.py +++ b/plotdevice/lib/pathmatics.py @@ -1,6 +1,8 @@ import objc from collections import namedtuple from .cocoa import CGPathRelease +from ..gfx.geometry import Point +from ..gfx.bezier import Bezier, Curve import cPathmatics @@ -297,7 +299,6 @@ def _locate(path, t, segments=None): >>> _locate(path, 1.0) (0, 1.0, Point(x=0.0, y=0.0)) """ - from ..gfx.geometry import Point if segments == None: segments = path.segmentlengths(relative=True) @@ -350,7 +351,6 @@ def point(path, t, segments=None): >>> point(path, 0.1) Curve(LINETO, ((10.0, 0.0),)) """ - from ..gfx.bezier import Curve if len(path) == 0: raise DeviceError("The given path is empty") @@ -441,7 +441,6 @@ def contours(path): >>> len(contours(path)) 2 """ - from ..gfx.bezier import Bezier contours = [] current_contour = None @@ -482,8 +481,6 @@ def findpath(points, curvature=1.0): # The list of points consists of Point objects, # but it shouldn't crash on something straightforward # such as someone supplying a list of (x,y)-tuples. - from ..gfx.geometry import Point - from ..gfx.bezier import Bezier from types import TupleType, ListType for i, pt in enumerate(points): if type(pt) in (TupleType, ListType): From 5d1c2940973ecc28ebb58aa830b186fc55d628ab Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 17:49:31 -0400 Subject: [PATCH 057/226] make Region hashable --- plotdevice/gfx/geometry.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plotdevice/gfx/geometry.py b/plotdevice/gfx/geometry.py index 9469f47f..bc984b0a 100644 --- a/plotdevice/gfx/geometry.py +++ b/plotdevice/gfx/geometry.py @@ -281,6 +281,9 @@ def __iter__(self): # allow for assignments like: (x,y), (w,h) = Region() return iter([self.origin, self.size]) + def __hash__(self): + return hash((getattr(self, attr) for attr in ('x','y','w','h'))) + def union(self, *args): """Return a new Region which fully encloses the existing Region and the arguments""" other = Region(*args) From 2ed76b5cef2482dc4c23fd34dad52c36681ad23a Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 18:06:01 -0400 Subject: [PATCH 058/226] fix selectors for vars palette --- plotdevice/gui/widgets.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plotdevice/gui/widgets.py b/plotdevice/gui/widgets.py index 6b9b7e79..1db16d7f 100644 --- a/plotdevice/gui/widgets.py +++ b/plotdevice/gui/widgets.py @@ -176,7 +176,7 @@ def _addSlider(self, v, y, cnt): control.setContinuous_(True) control.setTarget_(self) control.setTag_(cnt) - control.setAction_(objc.selector(self.numberChanged_, signature="v@:@@")) + control.setAction_(objc.selector(self.numberChanged_, signature=b"v@:@@")) self.panel.contentView().addSubview_(control) @objc.python_method @@ -189,7 +189,7 @@ def _addTextField(self, v, y, cnt): control.setFont_(MINI_FONT) control.setTarget_(self) control.setTag_(cnt) - control.setAction_(objc.selector(self.textChanged_, signature="v@:@@")) + control.setAction_(objc.selector(self.textChanged_, signature=b"v@:@@")) self.panel.contentView().addSubview_(control) @objc.python_method @@ -212,7 +212,7 @@ def _addSwitch(self, v, y, cnt): NSColor.whiteColor(), (0, switchTitle.length())) control.setAttributedTitle_(switchTitle) - control.setAction_(objc.selector(self.booleanChanged_, signature="v@:@@")) + control.setAction_(objc.selector(self.booleanChanged_, signature=b"v@:@@")) self.panel.contentView().addSubview_(control) @objc.python_method @@ -226,7 +226,7 @@ def _addButton(self, v, y, cnt): control.cell().setControlTint_(NSGraphiteControlTint) control.setTarget_(self) control.setTag_(cnt) - control.setAction_(objc.selector(self.buttonClicked_, signature="v@:@@")) + control.setAction_(objc.selector(self.buttonClicked_, signature=b"v@:@@")) self.panel.contentView().addSubview_(control) from ..context import RGB, CMYK From 08b49ac88081e573e4a70b0abae8de975c274a6d Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 27 Jun 2022 18:08:38 -0400 Subject: [PATCH 059/226] simplify framework Makefile --- PlotDevice.xcodeproj/project.pbxproj | 2 +- app/deps/embed/Makefile | 6 +++--- app/deps/embed/requirements.txt | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 10136498..2a76d550 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -471,7 +471,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# build a relocatable Python.framework with our dependencies pre-installed\ncd app/deps/embed\nmake update\n"; + shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# build a relocatable Python.framework with our dependencies pre-installed\ncd app/deps/embed\nmake\n"; }; 2A758E411957B7CE003ECF9D /* Build PlotDevice Module */ = { isa = PBXShellScriptBuildPhase; diff --git a/app/deps/embed/Makefile b/app/deps/embed/Makefile index 831b410d..d5cf28cb 100644 --- a/app/deps/embed/Makefile +++ b/app/deps/embed/Makefile @@ -3,6 +3,9 @@ FRAMEWORK_REPO = https://github.com/gregneagle/relocatable-python.git BUILD_OPTS = --os-version=11 --python-version=$(PYTHON_VERSION) --upgrade-pip --pip-requirements=requirements.txt BIN = ./Python.framework/Versions/Current/bin +all: Python.framework + $(BIN)/pip3 install --upgrade ../../.. + Python.framework: relocatable-python python3 ./relocatable-python/make_relocatable_python_framework.py $(BUILD_OPTS) @@ -11,6 +14,3 @@ relocatable-python: clean: rm -r Python.framework - -update: Python.framework - $(BIN)/pip3 install --upgrade ../../.. diff --git a/app/deps/embed/requirements.txt b/app/deps/embed/requirements.txt index 36f769c1..4823c92c 100644 --- a/app/deps/embed/requirements.txt +++ b/app/deps/embed/requirements.txt @@ -5,5 +5,4 @@ cffi lockfile pyobjc requests -six -../../.. \ No newline at end of file +six \ No newline at end of file From 64bcc753bf5397edde7e95210766635df4ee77a6 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 10:24:48 -0400 Subject: [PATCH 060/226] port test suite to python3 --- tests/__init__.py | 23 +++++++++++++++-------- tests/__main__.py | 16 +++++----------- tests/module.py | 4 ++-- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/tests/__init__.py b/tests/__init__.py index bbbc7a24..a28c5fd6 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -4,7 +4,7 @@ import random from distutils.spawn import find_executable from subprocess import check_output, PIPE -from os.path import dirname, abspath, isdir, join, basename, splitext +from os.path import dirname, abspath, isdir, join, basename, splitext, relpath from glob import glob from pdb import set_trace as tron @@ -69,17 +69,24 @@ def render(self, save_output=True): except (ImportError, RuntimeError) as e: pass -def report(multisuite): +def suites(): + from . import typography, primitives, drawing, compositing, geometry, module + + suite = unittest.TestSuite() + for mod in (typography, primitives, drawing, compositing, geometry, module): + suite.addTest(mod.suite()) + return suite + +def report(): """Create an html document presenting all the rendered images, their references, and the diff between them""" with open('details.html', 'w') as f: f.write(html_head) - for suite in [s._tests[0]._tests for s in multisuite._tests]: - cat = suite[0].__module__.split('.')[-1] - for test in suite: - if hasattr(test, '_image'): - f.write(result_div % {"name":test._testMethodName, "img":test._image}) + for pth in glob('tests/_out/*/*'): + img = relpath(pth, 'tests/_out') + name = splitext(img)[0] + f.write(result_div % {"name":name, "img":img}) f.write(html_foot) - print "See details.html for case-by-case test comparisons" + print("See details.html for case-by-case test comparisons") html_head = """ diff --git a/tests/__main__.py b/tests/__main__.py index 6b956b68..f3035676 100644 --- a/tests/__main__.py +++ b/tests/__main__.py @@ -1,9 +1,10 @@ import sys import unittest +import importlib from os.path import basename, dirname from glob import glob from pdb import set_trace as tron -from . import report +from . import report, suites try: import plotdevice @@ -11,14 +12,7 @@ unbuilt = 'Build the c-extensions with "python setup.py build" before running tests.' raise ImportError(unbuilt) -cats = [basename(m).replace('.py','') for m in glob('%s/[a-ln-z]*.py'%dirname(__file__))] -cats += [basename(m).replace('.py','') for m in glob('%s/m*.py'%dirname(__file__))] -mods = [__import__(c, globals(), locals(), ['suite']) for c in cats] - -suite = unittest.TestSuite() -for category, mod in zip(cats, mods): - suitefn = getattr(mod, 'suite') - suite.addTest(suitefn()) +tests = suites() verb = 2 if '-v' in sys.argv else 1 -unittest.TextTestRunner(verbosity=verb).run(suite) -report(suite) \ No newline at end of file +unittest.TextTestRunner(verbosity=verb).run(tests) +report() \ No newline at end of file diff --git a/tests/module.py b/tests/module.py index c54d664c..9a13100f 100644 --- a/tests/module.py +++ b/tests/module.py @@ -15,14 +15,14 @@ def test_pyobjc(self): def test_nodebox_compat(self): code = open('%s/tests/_in/compliance/nodebox.py'%sdist_path).read() os.chdir('%s/tests/_in/compliance'%sdist_path) - exec code in _ctx._ns.copy() + exec(code, _ctx._ns.copy()) os.chdir(sdist_path) @reference('module/compliance.png') def test_compliance(self): code = open('%s/tests/_in/compliance/plotdevice.py'%sdist_path).read() os.chdir('%s/tests/_in/compliance'%sdist_path) - exec code in _ctx._ns.copy() + exec(code, _ctx._ns.copy()) os.chdir(sdist_path) def test_cli(self): From 0de3ae0a7214aad0c4b567bd517b2a9e2914c220 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 10:38:38 -0400 Subject: [PATCH 061/226] finish conversion from namedtuple to dataclass --- plotdevice/util/readers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plotdevice/util/readers.py b/plotdevice/util/readers.py index 30c7644e..6b61e70c 100644 --- a/plotdevice/util/readers.py +++ b/plotdevice/util/readers.py @@ -10,7 +10,7 @@ # data formats import json, csv from collections import defaultdict -from dataclasses import make_dataclass +from dataclasses import make_dataclass, replace from codecs import iterencode, iterdecode from xml.parsers import expat @@ -133,13 +133,13 @@ def _chars(self, data): self.log(data) def _leave(self, name): - node = self.stack.pop()._replace(end=self.cursor) + node = replace(self.stack.pop(), end=self.cursor) # hang onto line-ending self-closed tags so they can be applied to the next '\n' in _chars if node.start==node.end: at = self._expat.CurrentByteIndex if self._xml[at-2:at]=='/>' and self._xml[at:at+1]=="\n": - node = node._replace(end=node.start+1) + node = replace(node, end=node.start+1) self._crlf = node self.nodes[name].append(node) From 42db57bb7ee121a0dbe7637a2dda5c3cd53e364b Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 10:43:08 -0400 Subject: [PATCH 062/226] drop text-encoding 2isms --- plotdevice/gfx/text.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/plotdevice/gfx/text.py b/plotdevice/gfx/text.py index 3660de59..5e31e2fe 100644 --- a/plotdevice/gfx/text.py +++ b/plotdevice/gfx/text.py @@ -119,24 +119,20 @@ def append(self, txt=None, **kwargs): if not is_xml: txt_bytes = txt.encode('utf-8') txt_opts = {'CharacterEncoding': NSUTF8StringEncoding} - decoded, info, err = NSMutableAttributedString.alloc().initWithData_options_documentAttributes_error_( + txt, info, err = NSMutableAttributedString.alloc().initWithData_options_documentAttributes_error_( NSData.dataWithBytes_length_(txt_bytes, len(txt_bytes)), txt_opts, None, None ) # if the data got unpacked into anything more interesting than plain text, # preserve its styling. otherwise fall through and style the txt val if re.search(r'(html|rtf)$', info.get('UTI')): - attrib_txt = decoded + attrib_txt = txt if txt is not None and not attrib_txt: # convert non-textual `str` args to strings if not isinstance(txt, str) and not is_xml: txt = repr(txt) - # try to insulate people from the need to use a unicode constant for any text - # with high-ascii characters (while waiting for the other shoe to drop) - decoded = txt #if isinstance(txt, unicode) else txt.decode('utf-8') - # use the inherited baseline style but allow one-off overrides from kwargs merged_style = self._font._spec merged_style.update(fill=self._fillcolor) @@ -146,7 +142,7 @@ def append(self, txt=None, **kwargs): # its tag names. otherwise apply the merged style to the entire string if is_xml: # find any tagged regions that need styling - parser = XMLParser(decoded, offset=len(self.text)) + parser = XMLParser(txt, offset=len(self.text)) # update our internal lookup table of nodes for tag, elts in parser.nodes.items(): @@ -167,7 +163,7 @@ def append(self, txt=None, **kwargs): else: # don't parse as xml, just apply the current font(), align(), and fill() attrs = self._fontify(merged_style) - attrib_txt = NSMutableAttributedString.alloc().initWithString_attributes_(decoded, attrs) + attrib_txt = NSMutableAttributedString.alloc().initWithString_attributes_(txt, attrs) # ensure the very-first character of a Text is indented flush left. also watch for # double-newlines at the edge of the existing string and the appended chars. grafs @@ -408,8 +404,6 @@ def find(self, regex, matches=0): Returns: a list of TextFragment objects """ - # if isinstance(regex, str): - # regex = regex.decode('utf-8') if isinstance(regex, str): flags = (re.I|re.S) if regex.lower()==regex else (re.S) regex = re.compile(regex, flags) @@ -440,8 +434,6 @@ def select(self, tag_name, matches=0): Returns: a list of TextFragment objects """ - if isinstance(tag_name, str): - tag_name = tag_name.decode('utf-8') return self._seek(self._nodes.get(tag_name, []), matches) def _seek(self, stream, limit): From 6d2c648b1ee9c40a4806fa47ed1c70c9053e8f1b Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 11:05:06 -0400 Subject: [PATCH 063/226] test dataclass types rather than checking attrs --- plotdevice/gfx/text.py | 8 ++++---- plotdevice/util/__init__.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plotdevice/gfx/text.py b/plotdevice/gfx/text.py index 5e31e2fe..c66a1f54 100644 --- a/plotdevice/gfx/text.py +++ b/plotdevice/gfx/text.py @@ -10,7 +10,7 @@ from .colors import Color from .bezier import Bezier from .atoms import TransformMixin, ColorMixin, EffectsMixin, StyleMixin, FrameMixin, Grob -from ..util import _copy_attrs, trim_zeroes, numlike, ordered, XMLParser, read +from ..util import _copy_attrs, trim_zeroes, numlike, ordered, XMLParser, Element, read from ..lib import foundry from . import _ns_context @@ -612,10 +612,10 @@ def __init__(self, parent, match=None): elif hasattr(match, 'range'): # NSSubText self.start, n = match.range() self.end = self.start + n - elif hasattr(match, '_asdict'): # xml Element - for k,v in match._asdict().items(): + elif isinstance(match, Element): # xml Element + for k,v in match.__dict__.items(): setattr(self, k, v) - elif hasattr(match, '_chars'): # TextBlock + elif isinstance(match, TextBlock): # TextBlock self.start, n = match._chars self.end = self.start + n elif hasattr(match, 'span'): # re.Match diff --git a/plotdevice/util/__init__.py b/plotdevice/util/__init__.py index b6129e72..4d116ad8 100644 --- a/plotdevice/util/__init__.py +++ b/plotdevice/util/__init__.py @@ -11,7 +11,7 @@ from Foundation import NSAutoreleasePool from plotdevice import DeviceError -from .readers import read, XMLParser +from .readers import read, XMLParser, Element __all__ = ('grid', 'random', 'shuffled', 'choice', 'ordered', 'order', 'files', 'read', 'autotext', '_copy_attr', '_copy_attrs', 'odict', 'ddict', 'adict') From 6e88c93fbcc7cbf2770f38dc7b80f32b35d559ba Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 11:07:21 -0400 Subject: [PATCH 064/226] use modern type-checking for tuple/lists --- plotdevice/lib/pathmatics.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plotdevice/lib/pathmatics.py b/plotdevice/lib/pathmatics.py index 637d1145..e2187c61 100644 --- a/plotdevice/lib/pathmatics.py +++ b/plotdevice/lib/pathmatics.py @@ -481,9 +481,8 @@ def findpath(points, curvature=1.0): # The list of points consists of Point objects, # but it shouldn't crash on something straightforward # such as someone supplying a list of (x,y)-tuples. - from types import TupleType, ListType for i, pt in enumerate(points): - if type(pt) in (TupleType, ListType): + if isinstance(pt, (tuple, list)): points[i] = Point(pt[0], pt[1]) if len(points) == 0: return None From c3dd162ac4ac2c5752d7d0740ff0bec361530e9b Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 11:49:27 -0400 Subject: [PATCH 065/226] fix hash calculation for Region --- plotdevice/gfx/geometry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plotdevice/gfx/geometry.py b/plotdevice/gfx/geometry.py index bc984b0a..098f81cc 100644 --- a/plotdevice/gfx/geometry.py +++ b/plotdevice/gfx/geometry.py @@ -282,7 +282,7 @@ def __iter__(self): return iter([self.origin, self.size]) def __hash__(self): - return hash((getattr(self, attr) for attr in ('x','y','w','h'))) + return hash(tuple(getattr(self, attr) for attr in ('x','y','w','h'))) def union(self, *args): """Return a new Region which fully encloses the existing Region and the arguments""" From 7482da6950ecff64dad38d9a555933a5bbd07ecc Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 13:55:17 -0400 Subject: [PATCH 066/226] always run setup() even if no draw() is defined --- plotdevice/gui/document.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index b74c40a3..96e38d84 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -363,6 +363,10 @@ def runScript(self): if self.vm.vars: self.dashboardController.buildInterface(self.vm.vars) + # Run the setup routine (if it exists) + if success: + success = self.invoke("setup") + if not success or not self.vm.animated: # halt the progress indicator if we crashed (or if we succeeded in a non-anim) self.statusView.endRun() @@ -376,10 +380,6 @@ def runScript(self): # Check whether we are dealing with animation if self.vm.animated: - - # Run setup routine - self.invoke("setup") - if not self.vm.crashed: # calling speed(0) just draws the first frame, so bail out before repeating if self.vm.speed<=0: @@ -392,7 +392,6 @@ def runScript(self): # Start the timer self.animationTimer = set_timeout(self, 'step', 1.0/self.vm.speed, repeat=True) - def step(self): """Keep calling the script's draw method until an error occurs or the animation complete.""" ok = self.invoke("draw") From ef406605787ea4c5f6b9e0c40868b823ef856bd0 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 14:12:10 -0400 Subject: [PATCH 067/226] add `quiet` mode to command line tool - running with `-q` runs the script in a `from plotdevice import *` environment (and will trigger setup/draw if present) but no window is opened to show the output. The code itself can still generate files though by calling export() --- out.pdf | Bin 0 -> 3732 bytes plotdevice/__main__.py | 7 +++++- plotdevice/gui/__init__.py | 3 +++ plotdevice/run/console.py | 49 +++++++++++++++++++++++++++---------- 4 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 out.pdf diff --git a/out.pdf b/out.pdf new file mode 100644 index 0000000000000000000000000000000000000000..97cf7b875ffd5836c22cb151833efd20de9a2f8a GIT binary patch literal 3732 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 PAk@_$5)uX|L&*ODgG5=n literal 0 HcmV?d00001 diff --git a/plotdevice/__main__.py b/plotdevice/__main__.py index 396fa24f..36392308 100644 --- a/plotdevice/__main__.py +++ b/plotdevice/__main__.py @@ -36,15 +36,17 @@ def main(): parser = argparse.ArgumentParser( add_help=False, - description="Run python scripts in a window or export graphics to a document (pdf/eps), image (png/jpg/heic/gif/tiff), or movie (mov/gif).", + description="Run PlotDevice scripts in a window or export graphics to a document (pdf/eps), image (png/jpg/heic/gif/tiff), or movie (mov/gif).", epilog=sys.modules[__name__].__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, prog=os.environ.pop('_p_l_o_t_d_e_v_i_c_e_', 'python3 -m plotdevice') ) o = parser.add_argument_group("Options", None) o.add_argument('-h','--help', action='help', help='show this help message and exit') + # mode = o.add_mutually_exclusive_group() o.add_argument('-f', dest='fullscreen', action='store_const', const=True, default=False, help='run full-screen') o.add_argument('-b', dest='activate', action='store_const', const=False, default=True, help='run PlotDevice in the background') + o.add_argument('-q', dest='mode', action='store_const', const='headless', default='windowed', help='run a PlotDevice script ‘quietly’ (without opening a window)') o.add_argument('--virtualenv', metavar='PATH', help='path to virtualenv whose libraries you want to use (this should point to the top-level virtualenv directory; a folder containing a lib/python3.x/site-packages subdirectory)') o.add_argument('--export', '-o', metavar='FILE', help='a destination filename ending in pdf, eps, png, tiff, jpg, heic, gif, or mov') o.add_argument('--frames', metavar='N or M-N', help='number of frames to render or a range specifying the first and last frames (default "1-")') @@ -95,6 +97,9 @@ def main(): del opts.frames if opts.export: + # don't open a window + opts.mode = 'headless' + # screen out unsupported file extensions _, ext = opts.export.lower().rsplit('.',1) if ext not in ('pdf', 'eps', 'png', 'jpg', 'heic', 'tiff', 'gif', 'mov'): diff --git a/plotdevice/gui/__init__.py b/plotdevice/gui/__init__.py index e47222be..e9de5235 100644 --- a/plotdevice/gui/__init__.py +++ b/plotdevice/gui/__init__.py @@ -15,6 +15,9 @@ def bundle_path(subpath=None, rsrc=None, fmwk=None): def set_timeout(target, sel, delay, info=None, repeat=False): return NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(delay, target, sel, info, repeat) +def next_tick(target, sel): + return NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(0, target, sel, None, False) + from .document import PlotDeviceDocument, PythonScriptDocument, ScriptController from .app import PlotDeviceAppDelegate from .views import GraphicsBackdrop, GraphicsView, FullscreenView diff --git a/plotdevice/run/console.py b/plotdevice/run/console.py index a429f894..98405756 100755 --- a/plotdevice/run/console.py +++ b/plotdevice/run/console.py @@ -25,7 +25,7 @@ from ..lib.cocoa import * from ..lib.io import SysAdmin from ..util import rsrc_path -from ..gui import ScriptController +from ..gui import ScriptController, next_tick from PyObjCTools import AppHelper from AppKit import NSRunningApplication @@ -50,16 +50,15 @@ class ScriptAppDelegate(NSObject): window = objc.IBOutlet() menu = objc.IBOutlet() - def initWithOpts_forMode_(self, opts, mode): + def initWithOpts_(self, opts): self.opts = opts - self.mode = mode return self def applicationDidFinishLaunching_(self, note): opts = self.opts pth = opts['script'] - if self.mode=='windowed': + if self.opts['mode']=='windowed': # load the viewer ui from the nib in plotdevice/rsrc nib = NSData.dataWithContentsOfFile_(rsrc_path('viewer.nib')) ui = NSNib.alloc().initWithNibData_bundle_(nib, None) @@ -77,7 +76,7 @@ def applicationDidFinishLaunching_(self, note): NSApp().activateIgnoringOtherApps_(True) self.script.showWindow_(self) AppHelper.callAfter(self.script.scriptedRun) - elif self.mode=='headless': + elif self.opts['mode']=='headless': # create a window-less WindowController self.script = ConsoleScript.alloc().init() self.script.setScript_options_(pth, opts) @@ -86,10 +85,13 @@ def applicationDidFinishLaunching_(self, note): if not opts.get('last', None): opts['last'] = opts.get('first', 1) - # kick off an export session - format = opts['export'].rsplit('.',1)[1] - kind = 'movie' if format in ('mov','gif') else 'image' - self.script.exportInit(kind, opts['export'], opts) + if opts['export']: + # kick off an export session + format = opts['export'].rsplit('.',1)[1] + kind = 'movie' if format in ('mov','gif') else 'image' + self.script.exportInit(kind, opts['export'], opts) + else: + self.script.runHeadless() @objc.IBAction def openLink_(self, sender): @@ -99,7 +101,7 @@ def openLink_(self, sender): NSWorkspace.sharedWorkspace().openURL_(NSURL.URLWithString_(link)) def done(self, quit=False): - if self.mode=='headless' or quit: + if self.opts['mode']=='headless' or quit: NSApp().terminate_(None) class ScriptWatcher(NSObject): @@ -164,6 +166,27 @@ def runFullscreen_(self, sender): def windowWillClose_(self, note): NSApp().terminate_(self) + @objc.python_method + def invokeHeadless(self, method): + result = self.vm.run(method) + self.echo(result.output) + if not result.ok: + NSApp().terminate_(None) + + def runHeadless(self): + self.vm.source = self.unicode_src + self.invokeHeadless(None) + self.invokeHeadless('setup') + + if self.vm.animated: + self.redrawHeadless() + else: + NSApp().terminate_(None) + + def redrawHeadless(self): + self.invokeHeadless('draw') + self.loop = next_tick(self, 'redrawHeadless') + @objc.python_method def echo(self, output): STDERR.write(ERASER) @@ -219,12 +242,12 @@ def progress(written, total, width=20): return '[%s]' % dots + def run(opts): # install a signal handler to catch ^c SysAdmin.handleInterrupt() - mode = 'headless' if opts['export'] else 'windowed' - app = ScriptApp.sharedApplicationForMode_(mode) - delegate = ScriptAppDelegate.alloc().initWithOpts_forMode_(opts, mode) + app = ScriptApp.sharedApplicationForMode_(opts['mode']) + delegate = ScriptAppDelegate.alloc().initWithOpts_(opts) app.setDelegate_(delegate) AppHelper.runEventLoop() From 583a02f9d2061fd8e92bb8049da6c74ed3e42e8d Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 14:13:04 -0400 Subject: [PATCH 068/226] don't clear the canvas between init and setup() - preserves any drawing done outside all the function defs --- plotdevice/run/sandbox.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plotdevice/run/sandbox.py b/plotdevice/run/sandbox.py index ee16c60b..600d99cc 100644 --- a/plotdevice/run/sandbox.py +++ b/plotdevice/run/sandbox.py @@ -157,7 +157,8 @@ def run(self, method=None, cmyk=False): return check # Clear the canvas - self.canvas.clear() + if method != 'setup': + self.canvas.clear() # Reset the context state (and bind the .gfx objects as a side-effect) self.context._resetContext() From 2d467e2a970739f87236dcc293b364bd43462453 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 14:17:19 -0400 Subject: [PATCH 069/226] ignore .egg-info --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a4260b54..92f3d121 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.pyc build/ dist/ +plotdevice.egg-info app/deps/vendor/Sparkle* app/deps/vendor/*.tar.gz app/deps/embed/Python.framework From 554e84cdde11520016785716578536b8eeca3d06 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 14:17:38 -0400 Subject: [PATCH 070/226] skip ximport test until colors lib is working again --- tests/drawing.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/drawing.py b/tests/drawing.py index 0faf851e..8769369e 100644 --- a/tests/drawing.py +++ b/tests/drawing.py @@ -224,6 +224,7 @@ def test_plot_disable(self): o = oval(0,0,100,100) # not drawn s = rect(100,100,10,10) # same here + @unittest.skip("fix colors library first") @reference('drawing/ximport-colors.png') def test_ximport_colors(self): # ref/Canvas/compat/ximport() From 9ac2466ca7f928de3320d99f7138923d3a029cf2 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 14:18:19 -0400 Subject: [PATCH 071/226] don't worry about -qfb --- plotdevice/__main__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plotdevice/__main__.py b/plotdevice/__main__.py index 36392308..d49b988c 100644 --- a/plotdevice/__main__.py +++ b/plotdevice/__main__.py @@ -43,7 +43,6 @@ def main(): ) o = parser.add_argument_group("Options", None) o.add_argument('-h','--help', action='help', help='show this help message and exit') - # mode = o.add_mutually_exclusive_group() o.add_argument('-f', dest='fullscreen', action='store_const', const=True, default=False, help='run full-screen') o.add_argument('-b', dest='activate', action='store_const', const=False, default=True, help='run PlotDevice in the background') o.add_argument('-q', dest='mode', action='store_const', const='headless', default='windowed', help='run a PlotDevice script ‘quietly’ (without opening a window)') From 1f6392f5917b24e3fdbbf4b7dbd3e3f4dc55a76b Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 14:57:37 -0400 Subject: [PATCH 072/226] convert SharedSupport script to symlink --- PlotDevice.xcodeproj/project.pbxproj | 26 ++++++------------ setup.py | 40 +++++++++++++++++----------- 2 files changed, 32 insertions(+), 34 deletions(-) diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 2a76d550..f02bf591 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -26,7 +26,6 @@ 2ABBB2FE185402AC001C4E0A /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2ABBB2FD185402AC001C4E0A /* CoreMedia.framework */; }; 2ABDB76B1867D8160069EFC3 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ABDB7681867D8160069EFC3 /* main.m */; }; 2ABDB76E1867D8BB0069EFC3 /* plotdevice-app.py in Resources */ = {isa = PBXBuildFile; fileRef = 2ABDB7671867D8160069EFC3 /* plotdevice-app.py */; }; - 2ABDB7741867D9970069EFC3 /* plotdevice in Copy 'plotdevice' Tool */ = {isa = PBXBuildFile; fileRef = 2ABDB7721867D9920069EFC3 /* plotdevice */; }; 611CC49810BA8B9E00B55455 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 611CC48110BA8B9E00B55455 /* Credits.rtf */; }; 611CC49C10BA8B9E00B55455 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 611CC48910BA8B9E00B55455 /* InfoPlist.strings */; }; 611CC4A110BA8B9E00B55455 /* PlotDevice.icns in Resources */ = {isa = PBXBuildFile; fileRef = 611CC49310BA8B9E00B55455 /* PlotDevice.icns */; }; @@ -80,17 +79,6 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - 2ABDB76F1867D9560069EFC3 /* Copy 'plotdevice' Tool */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 12; - files = ( - 2ABDB7741867D9970069EFC3 /* plotdevice in Copy 'plotdevice' Tool */, - ); - name = "Copy 'plotdevice' Tool"; - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -389,12 +377,11 @@ 2A15C43718A20929006BDFF0 /* Copy Editor Assets */, 2A66ECEA18A99303002903DE /* Copy Editor Scripts */, 2A36AE2F2868BB9A0088976E /* Build Python Framework */, - 2A758E411957B7CE003ECF9D /* Build PlotDevice Module */, - 2ABDB76F1867D9560069EFC3 /* Copy 'plotdevice' Tool */, 2AF8981419953CA1005A49A5 /* Manually Update Examples */, 8D15AC300486D014006FF6A4 /* Sources */, 8D15AC330486D014006FF6A4 /* Frameworks */, 2A79B148286508220074E96A /* Embed Frameworks */, + 2A36AE34286B81290088976E /* Symlink Command Line Tool */, ); buildRules = ( ); @@ -473,20 +460,23 @@ shellPath = /bin/sh; shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# build a relocatable Python.framework with our dependencies pre-installed\ncd app/deps/embed\nmake\n"; }; - 2A758E411957B7CE003ECF9D /* Build PlotDevice Module */ = { + 2A36AE34286B81290088976E /* Symlink Command Line Tool */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( ); - name = "Build PlotDevice Module"; + name = "Symlink Command Line Tool"; + outputFileListPaths = ( + ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# let the setup script handle updating\n$PYTHON setup.py build\n\n# make sure everything has a .pyc (so code-signing doesn't break on first run)\n#$PYTHON -m compileall -q \"$SITE_DIR/plotdevice\"\n"; - showEnvVarsInLog = 0; + shellScript = "SCRIPT_DIR=\"$CONFIGURATION_BUILD_DIR/PlotDevice.app/Contents/SharedSupport\"\nmkdir -p \"$SCRIPT_DIR\"\nsrc=\"$SCRIPT_DIR/plotdevice\"\ndst=\"../Frameworks/Python.framework/Versions/Current/bin/plotdevice\"\nln -s $dst $src\n"; }; 2AF8981419953CA1005A49A5 /* Manually Update Examples */ = { isa = PBXShellScriptBuildPhase; diff --git a/setup.py b/setup.py index 66fc5ca1..2dee5f6a 100644 --- a/setup.py +++ b/setup.py @@ -233,26 +233,34 @@ def initialize_options(self): pass def finalize_options(self): - # customize the libpython paths based on the currently running interpreter - from sysconfig import get_config_var - - macros = ['PYTHON_BIN="%s"'%sys.executable, 'PY3K=1' if sys.version_info[0] >=3 else ''] - py_version = "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) PY3K=1\n" if sys.version_info[0] >=3 else '' - - re_cellarpath = re.compile(r'(.*)/Cellar/(python3?)/[^\/]+(.*)') - py_lib = re_cellarpath.sub(r'\1/opt/\2\3', get_config_var('LIBPL')) - py_inc = re_cellarpath.sub(r'\1/opt/\2\3', get_config_var('INCLUDEPY')) + # -- use the embedded framework rather now that system-python is gone: + # PYTHON_VERSION = 3.10 + # PYTHON_FRAMEWORK = $(PROJECT_DIR)/app/deps/embed/Python.framework + # PYTHON = $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/bin/python3 + # LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/lib/python$(PYTHON_VERSION)/config-$(PYTHON_VERSION)-darwin + # HEADER_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/Headers + # OTHER_LDFLAGS = $(inherited) -lpython$(PYTHON_VERSION) + # GCC_PREPROCESSOR_DEFINITIONS = $(inherited) PYTHON_BIN="$(PYTHON)" PY3K=1 - with open('app/python.xcconfig', 'w') as f: - f.writelines([ "PYTHON = %s\n" % sys.executable, - "LIBRARY_SEARCH_PATHS = $(inherited) %s\n" % py_lib, - "HEADER_SEARCH_PATHS = $(inherited) %s\n" % py_inc, - "OTHER_LDFLAGS = $(inherited) -lpython%i.%i\n" % sys.version_info[:2], - "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) %s\n" % " ".join(macros).strip() ]) + # customize the libpython paths based on the currently running interpreter + # from sysconfig import get_config_var + # macros = ['PYTHON_BIN="%s"'%sys.executable, 'PY3K=1' if sys.version_info[0] >=3 else ''] + # py_version = "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) PY3K=1\n" if sys.version_info[0] >=3 else '' + + # re_cellarpath = re.compile(r'(.*)/Cellar/(python3?)/[^\/]+(.*)') + # py_lib = re_cellarpath.sub(r'\1/opt/\2\3', get_config_var('LIBPL')) + # py_inc = re_cellarpath.sub(r'\1/opt/\2\3', get_config_var('INCLUDEPY')) + # with open('app/python.xcconfig', 'w') as f: + # f.writelines([ "PYTHON = %s\n" % sys.executable, + # "LIBRARY_SEARCH_PATHS = $(inherited) %s\n" % py_lib, + # "HEADER_SEARCH_PATHS = $(inherited) %s\n" % py_inc, + # "OTHER_LDFLAGS = $(inherited) -lpython%i.%i\n" % sys.version_info[:2], + # "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) %s\n" % " ".join(macros).strip() ]) + pass def run(self): self.spawn(['xcodebuild']) - update_shebang('dist/PlotDevice.app/Contents/SharedSupport/plotdevice', interpreter=sys.executable) + # update_shebang('dist/PlotDevice.app/Contents/SharedSupport/plotdevice', interpreter=sys.executable) remove_tree('dist/PlotDevice.app.dSYM') print("done building PlotDevice.app in ./dist") From faa95c48bcc39d584234cb23f5b2f0529056b696 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 16:00:09 -0400 Subject: [PATCH 073/226] generate python.xcconfig based on the framework build --- PlotDevice.xcodeproj/project.pbxproj | 4 +++- app/deps/embed/Makefile | 1 + app/deps/embed/config.py | 21 ++++++++++++++++++ app/python.xcconfig | 12 +++++------ setup.py | 32 ++++++---------------------- 5 files changed, 37 insertions(+), 33 deletions(-) create mode 100644 app/deps/embed/config.py diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index f02bf591..b094fa3c 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -459,6 +459,7 @@ runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# build a relocatable Python.framework with our dependencies pre-installed\ncd app/deps/embed\nmake\n"; + showEnvVarsInLog = 0; }; 2A36AE34286B81290088976E /* Symlink Command Line Tool */ = { isa = PBXShellScriptBuildPhase; @@ -476,7 +477,8 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "SCRIPT_DIR=\"$CONFIGURATION_BUILD_DIR/PlotDevice.app/Contents/SharedSupport\"\nmkdir -p \"$SCRIPT_DIR\"\nsrc=\"$SCRIPT_DIR/plotdevice\"\ndst=\"../Frameworks/Python.framework/Versions/Current/bin/plotdevice\"\nln -s $dst $src\n"; + shellScript = "SCRIPT_DIR=\"$CONFIGURATION_BUILD_DIR/PlotDevice.app/Contents/SharedSupport\"\nmkdir -p \"$SCRIPT_DIR\"\nsrc=\"$SCRIPT_DIR/plotdevice\"\ndst=\"../Frameworks/Python.framework/Versions/Current/bin/plotdevice\"\nln -sf $dst $src\n"; + showEnvVarsInLog = 0; }; 2AF8981419953CA1005A49A5 /* Manually Update Examples */ = { isa = PBXShellScriptBuildPhase; diff --git a/app/deps/embed/Makefile b/app/deps/embed/Makefile index d5cf28cb..7c67fde0 100644 --- a/app/deps/embed/Makefile +++ b/app/deps/embed/Makefile @@ -8,6 +8,7 @@ all: Python.framework Python.framework: relocatable-python python3 ./relocatable-python/make_relocatable_python_framework.py $(BUILD_OPTS) + $(BIN)/python3 config.py ../../python.xcconfig relocatable-python: git clone $(FRAMEWORK_REPO) diff --git a/app/deps/embed/config.py b/app/deps/embed/config.py new file mode 100644 index 00000000..492ffb2d --- /dev/null +++ b/app/deps/embed/config.py @@ -0,0 +1,21 @@ +import re +import sys +from sysconfig import get_config_var +from datetime import datetime + +# customize Xcode's libpython paths based on the Python.framework interpreter +config = """// Generated by app/deps/embed/config.py at {timestamp} +PYTHON_FRAMEWORK = $(PROJECT_DIR)/app/deps/embed/Python.framework +PYTHON = $(PYTHON_FRAMEWORK)/Versions/{py_version}/bin/python3 +LIBRARY_SEARCH_PATHS = $(inherited) {py_lib} +HEADER_SEARCH_PATHS = $(inherited) {py_inc} +OTHER_LDFLAGS = $(inherited) -lpython{py_version} +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) PYTHON_BIN="$(PYTHON)" PY3K=1""".format( + timestamp = datetime.now(), + py_version = get_config_var('py_version_short'), + py_lib = re.sub(r'^.*/Python.framework', '$(PYTHON_FRAMEWORK)', get_config_var('LIBPL')), + py_inc = re.sub(r'^.*/Python.framework', '$(PYTHON_FRAMEWORK)', get_config_var('INCLUDEPY')) +) + +with open(sys.argv[1], 'w') as f: + f.write(config) diff --git a/app/python.xcconfig b/app/python.xcconfig index c55de64f..01a8eda2 100644 --- a/app/python.xcconfig +++ b/app/python.xcconfig @@ -1,7 +1,7 @@ -PYTHON_VERSION = 3.10 +// Generated by app/deps/embed/config.py at 2022-06-28 15:50:24.150225 PYTHON_FRAMEWORK = $(PROJECT_DIR)/app/deps/embed/Python.framework -PYTHON = $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/bin/python3 -LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/lib/python$(PYTHON_VERSION)/config-$(PYTHON_VERSION)-darwin -HEADER_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/Headers -OTHER_LDFLAGS = $(inherited) -lpython$(PYTHON_VERSION) -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) PYTHON_BIN="$(PYTHON)" PY3K=1 +PYTHON = $(PYTHON_FRAMEWORK)/Versions/3.10/bin/python3 +LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.10/lib/python3.10/config-3.10-darwin +HEADER_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.10/include/python3.10 +OTHER_LDFLAGS = $(inherited) -lpython3.10 +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) PYTHON_BIN="$(PYTHON)" PY3K=1 \ No newline at end of file diff --git a/setup.py b/setup.py index 2dee5f6a..ca498073 100644 --- a/setup.py +++ b/setup.py @@ -25,6 +25,7 @@ from distutils.command.build_py import build_py from pkg_resources import DistributionNotFound from os.path import join, exists, dirname, basename, abspath, getmtime +from subprocess import call import plotdevice @@ -143,7 +144,8 @@ def gosub(cmd, on_err=True): ret = proc.returncode if on_err: msg = '%s:\n' % on_err if isinstance(on_err, str) else '' - assert ret==0, msg + (err or out) + if ret != 0: + print(msg + out.decode('utf8') + err.decode('utf8')) return out, err, ret def timestamp(): @@ -233,34 +235,12 @@ def initialize_options(self): pass def finalize_options(self): - # -- use the embedded framework rather now that system-python is gone: - # PYTHON_VERSION = 3.10 - # PYTHON_FRAMEWORK = $(PROJECT_DIR)/app/deps/embed/Python.framework - # PYTHON = $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/bin/python3 - # LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/lib/python$(PYTHON_VERSION)/config-$(PYTHON_VERSION)-darwin - # HEADER_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/$(PYTHON_VERSION)/Headers - # OTHER_LDFLAGS = $(inherited) -lpython$(PYTHON_VERSION) - # GCC_PREPROCESSOR_DEFINITIONS = $(inherited) PYTHON_BIN="$(PYTHON)" PY3K=1 - - # customize the libpython paths based on the currently running interpreter - # from sysconfig import get_config_var - # macros = ['PYTHON_BIN="%s"'%sys.executable, 'PY3K=1' if sys.version_info[0] >=3 else ''] - # py_version = "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) PY3K=1\n" if sys.version_info[0] >=3 else '' - - # re_cellarpath = re.compile(r'(.*)/Cellar/(python3?)/[^\/]+(.*)') - # py_lib = re_cellarpath.sub(r'\1/opt/\2\3', get_config_var('LIBPL')) - # py_inc = re_cellarpath.sub(r'\1/opt/\2\3', get_config_var('INCLUDEPY')) - # with open('app/python.xcconfig', 'w') as f: - # f.writelines([ "PYTHON = %s\n" % sys.executable, - # "LIBRARY_SEARCH_PATHS = $(inherited) %s\n" % py_lib, - # "HEADER_SEARCH_PATHS = $(inherited) %s\n" % py_inc, - # "OTHER_LDFLAGS = $(inherited) -lpython%i.%i\n" % sys.version_info[:2], - # "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) %s\n" % " ".join(macros).strip() ]) - pass + # make sure the embedded framework exists (and has updated app/python.xcconfig) + print("Set up Python.framework for app build") + call('cd app/deps/embed && make', shell=True) def run(self): self.spawn(['xcodebuild']) - # update_shebang('dist/PlotDevice.app/Contents/SharedSupport/plotdevice', interpreter=sys.executable) remove_tree('dist/PlotDevice.app.dSYM') print("done building PlotDevice.app in ./dist") From dbb69006af2296911fb7a46526d88ab2ed5c4811 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 28 Jun 2022 21:02:17 -0400 Subject: [PATCH 074/226] add imports --- plotdevice/lib/cocoa.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index 6b9a07f3..32ae936e 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -41,11 +41,12 @@ NSPasteboard, NSPasteboardTypePDF, NSPasteboardURLReadingContentsConformToTypesKey, \ NSPasteboardURLReadingFileURLsOnlyKey, NSPasteboardTypeTIFF, NSPrintOperation, NSRectFill, \ NSRectFillUsingOperation, NSResponder, NSRightTextAlignment, NSSavePanel, NSScreen, NSShadow, \ - NSSlider, NSSmallControlSize, NSSplitView, NSStringPboardType, NSSwitchButton, NSTIFFFileType, \ - NSTextContainer, NSTextField, NSTextFinder, NSTextStorage, NSTextView, \ + NSSlider, NSSmallControlSize, NSSplitView, NSStringPboardType, NSSwitch, NSSwitchButton, \ + NSTIFFFileType, NSTextContainer, NSTextField, NSTextFinder, NSTextStorage, NSTextView, \ NSToolbarItem, NSTrackingActiveInActiveApp, NSTrackingArea, NSTrackingMouseEnteredAndExited, \ - NSUnboldFontMask, NSUnitalicFontMask, NSUnionRect, NSView, NSViewFrameDidChangeNotification, \ - NSWindow, NSWindowBackingLocationVideoMemory, NSWindowController, NSWorkspace, NSKernAttributeName + NSUnboldFontMask, NSUnitalicFontMask, NSUnionRect, NSView, NSViewWidthSizable, \ + NSViewFrameDidChangeNotification, NSWindow, NSWindowBackingLocationVideoMemory, \ + NSWindowController, NSWorkspace, NSKernAttributeName from Foundation import CIAffineTransform, CIColorMatrix, CIContext, CIFilter, CIImage, \ CIVector, Foundation, NO, NSAffineTransform, NSAffineTransformStruct, \ NSAttributedString, NSAutoreleasePool, NSBundle, NSData, NSDate, NSDateFormatter, \ From bfecd4c96b98c4c03908aa559c15c43856ac0d69 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Wed, 29 Jun 2022 12:36:29 -0400 Subject: [PATCH 075/226] support dark mode in graphics-view - now using an NSVisualEffectsView to draw the backdrop rather than having GraphicsView always draw dark grey - split placeholder.pdf into light and dark variants --- PlotDevice.xcodeproj/project.pbxproj | 26 +++++++++++----- app/Resources/en.lproj/PlotDeviceDocument.xib | 4 +-- app/Resources/en.lproj/placeholder-dark.pdf | Bin 0 -> 50622 bytes app/Resources/en.lproj/placeholder-light.pdf | Bin 0 -> 51785 bytes app/Resources/en.lproj/placeholder.pdf | Bin 39382 -> 0 bytes plotdevice/gui/document.py | 14 ++++++++- plotdevice/gui/views.py | 29 ++++++++---------- plotdevice/lib/cocoa.py | 10 +++--- 8 files changed, 52 insertions(+), 31 deletions(-) create mode 100644 app/Resources/en.lproj/placeholder-dark.pdf create mode 100644 app/Resources/en.lproj/placeholder-light.pdf delete mode 100644 app/Resources/en.lproj/placeholder.pdf diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index b094fa3c..0aae67e7 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ 2A15C45618A48770006BDFF0 /* autocomplete.css in Copy Editor Assets */ = {isa = PBXBuildFile; fileRef = 2A15C45418A48765006BDFF0 /* autocomplete.css */; }; 2A36AE2D2868B4E50088976E /* Python.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A36AE2C2868B4E50088976E /* Python.framework */; }; 2A36AE2E2868B4F30088976E /* Python.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2A36AE2C2868B4E50088976E /* Python.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 2A36AE58286CA75B0088976E /* placeholder-light.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 2A36AE54286CA75B0088976E /* placeholder-light.pdf */; }; + 2A36AE59286CA75B0088976E /* placeholder-dark.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 2A36AE56286CA75B0088976E /* placeholder-dark.pdf */; }; 2A591FF0185C17D200D1833D /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A591FEF185C17D200D1833D /* Security.framework */; }; 2A66ECEB18A99328002903DE /* ace.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECDE18A992BD002903DE /* ace.js */; }; 2A66ECEC18A99328002903DE /* editor.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECDF18A992BD002903DE /* editor.js */; }; @@ -20,7 +22,6 @@ 2A66ECEE18A99328002903DE /* keybindings.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECE118A992BD002903DE /* keybindings.js */; }; 2A66ECEF18A99328002903DE /* underscore-1.5.2.min.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECE218A992BD002903DE /* underscore-1.5.2.min.js */; }; 2A7AF5C818D2AFAA00F8FFC2 /* examples in Resources */ = {isa = PBXBuildFile; fileRef = 2A7AF5C718D2AFAA00F8FFC2 /* examples */; }; - 2A93AE751903326E00C6144D /* placeholder.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 2A93AE731903326E00C6144D /* placeholder.pdf */; }; 2ABBB2FA1854018B001C4E0A /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2ABBB2F91854018B001C4E0A /* AVFoundation.framework */; }; 2ABBB2FC18540246001C4E0A /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2ABBB2FB18540246001C4E0A /* CoreVideo.framework */; }; 2ABBB2FE185402AC001C4E0A /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2ABBB2FD185402AC001C4E0A /* CoreMedia.framework */; }; @@ -97,6 +98,8 @@ 2A32957718C59D0A00EEDD1C /* io.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = io.py; sourceTree = ""; }; 2A32957918C59D0A00EEDD1C /* pathmatics.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pathmatics.py; sourceTree = ""; }; 2A36AE2C2868B4E50088976E /* Python.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python.framework; path = app/deps/embed/Python.framework; sourceTree = ""; }; + 2A36AE55286CA75B0088976E /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = "Resources/en.lproj/placeholder-light.pdf"; sourceTree = ""; }; + 2A36AE57286CA75B0088976E /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = "Resources/en.lproj/placeholder-dark.pdf"; sourceTree = ""; }; 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 2A37F4C5FDCFA73011CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 2A591FEF185C17D200D1833D /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; @@ -113,7 +116,6 @@ 2A79B13D2864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = Resources/en.lproj/PlotDeviceDocument.xib; sourceTree = ""; }; 2A79B13E2864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = Resources/en.lproj/PlotDevicePreferences.xib; sourceTree = ""; }; 2A79B13F2864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = Resources/en.lproj/PlotDeviceScript.xib; sourceTree = ""; }; - 2A79B1402864FDAF0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = Resources/en.lproj/placeholder.pdf; sourceTree = ""; }; 2A7AF5C718D2AFAA00F8FFC2 /* examples */ = {isa = PBXFileReference; lastKnownFileType = folder; path = examples; sourceTree = ""; }; 2A827CC91859E9FE00A126BA /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 2A98FCAD1B3C6BFC00ABF2C9 /* python.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = python.xcconfig; path = app/python.xcconfig; sourceTree = ""; }; @@ -274,7 +276,8 @@ 611CC48910BA8B9E00B55455 /* InfoPlist.strings */, 611CC49310BA8B9E00B55455 /* PlotDevice.icns */, 611CC49410BA8B9E00B55455 /* PlotDeviceFile.icns */, - 2A93AE731903326E00C6144D /* placeholder.pdf */, + 2A36AE56286CA75B0088976E /* placeholder-dark.pdf */, + 2A36AE54286CA75B0088976E /* placeholder-light.pdf */, 2ABDB76C1867D8210069EFC3 /* info.plist */, ); name = Resources; @@ -426,8 +429,9 @@ 2ABDB76E1867D8BB0069EFC3 /* plotdevice-app.py in Resources */, 611CC49810BA8B9E00B55455 /* Credits.rtf in Resources */, 611CC49C10BA8B9E00B55455 /* InfoPlist.strings in Resources */, + 2A36AE58286CA75B0088976E /* placeholder-light.pdf in Resources */, 611CC4A110BA8B9E00B55455 /* PlotDevice.icns in Resources */, - 2A93AE751903326E00C6144D /* placeholder.pdf in Resources */, + 2A36AE59286CA75B0088976E /* placeholder-dark.pdf in Resources */, 611CC4A210BA8B9E00B55455 /* PlotDeviceFile.icns in Resources */, 611CC5A010BA908C00B55455 /* PlotDeviceDocument.xib in Resources */, 611CC5A810BA919A00B55455 /* PlotDevicePreferences.xib in Resources */, @@ -509,12 +513,20 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - 2A93AE731903326E00C6144D /* placeholder.pdf */ = { + 2A36AE54286CA75B0088976E /* placeholder-light.pdf */ = { isa = PBXVariantGroup; children = ( - 2A79B1402864FDAF0074E96A /* en */, + 2A36AE55286CA75B0088976E /* en */, ); - name = placeholder.pdf; + name = "placeholder-light.pdf"; + sourceTree = ""; + }; + 2A36AE56286CA75B0088976E /* placeholder-dark.pdf */ = { + isa = PBXVariantGroup; + children = ( + 2A36AE57286CA75B0088976E /* en */, + ); + name = "placeholder-dark.pdf"; sourceTree = ""; }; 2AD0A9B5186E552700D1F6DE /* PlotDeviceScript.xib */ = { diff --git a/app/Resources/en.lproj/PlotDeviceDocument.xib b/app/Resources/en.lproj/PlotDeviceDocument.xib index e82a72a8..b412fb2b 100644 --- a/app/Resources/en.lproj/PlotDeviceDocument.xib +++ b/app/Resources/en.lproj/PlotDeviceDocument.xib @@ -25,7 +25,7 @@ - + @@ -36,7 +36,7 @@ - + diff --git a/app/Resources/en.lproj/placeholder-dark.pdf b/app/Resources/en.lproj/placeholder-dark.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fa9321d6e4d9a847d91c9ccb60851547cae18578 GIT binary patch literal 50622 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 ffrSl0x7J-;O`TnT-dN}4#~K#DYj^_ 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 literal 0 HcmV?d00001 diff --git a/app/Resources/en.lproj/placeholder.pdf b/app/Resources/en.lproj/placeholder.pdf deleted file mode 100644 index 8e5cc467c33fcea20c485c1f9de6534a18fdb5c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39382 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 H@y-7NWWB29 diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index 96e38d84..0f595140 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -201,6 +201,15 @@ def awakeFromNib(self): # always a reference to either the in-window view or a fullscreen view self.currentView = self.graphicsView + # watch for changes in light/dark-mode and pass them along to graphicsView + NSApp.addObserver_forKeyPath_options_context_(self, + "effectiveAppearance", NSKeyValueObservingOptionNew, None + ) + + def observeValueForKeyPath_ofObject_change_context_(self, path, obj, change, context): + self.graphicsView.updatePlaceholder(change.get('new')) + + ## WindowController duties def windowDidLoad(self): @@ -270,7 +279,7 @@ def windowWillUseStandardFrame_defaultFrame_(self, win, rect): gfx_share = scrollview.width / (current.width-thumb_w) best_w = round(gworld.width/gfx_share) + thumb_w - best_h = gworld.height + 22 + best_h = gworld.height + 38 merged = NSIntersectionRect(rect, (rect.origin, (best_w, best_h))) if merged.size.width<300 or merged.size.height<222: @@ -300,6 +309,9 @@ def windowWillClose_(self, note): self.graphicsView = self.outputView = self.editorView = self.statusView = None self.dashboardController = self.exportSheet = self.vm = None + # stop tracking appearance changes + NSApp.removeObserver_forKeyPath_(self, "effectiveAppearance") + def shouldCloseDocument(self): return True diff --git a/plotdevice/gui/views.py b/plotdevice/gui/views.py index 2aaa2ab5..4f1e4d9f 100644 --- a/plotdevice/gui/views.py +++ b/plotdevice/gui/views.py @@ -15,15 +15,10 @@ class GraphicsBackdrop(NSView): """A container that sits between the NSClipView and GraphicsView It resizes to fit the size of the canvas and centers it when the canvas - is smaller than the display space in the NSSplitView. It also draws the - background color and maintains an isOpaque=True to take advantage of - Responsive Scrolling in 10.9 + is smaller than the display space in the NSSplitView. """ gfxView = None - def isOpaque(self): - return True - def isFlipped(self): return True @@ -53,11 +48,6 @@ def willRemoveSubview_(self, subview): nc = NSNotificationCenter.defaultCenter() nc.removeObserver_name_object_(self, NSViewFrameDidChangeNotification, subview) - def drawRect_(self, rect): - DARK_GREY.setFill() - NSRectFillUsingOperation(rect, NSCompositeCopy) - super(GraphicsBackdrop, self).drawRect_(rect) - def viewFrameDidChange_(self, note): self.setFrame_(self.frame()) newframe = self.frame() @@ -74,7 +64,6 @@ def viewFrameDidChange_(self, note): class GraphicsView(NSView): script = IBOutlet() - placeholder = NSImage.imageNamed_('placeholder.pdf') # The zoom levels are 10%, 25%, 50%, 75%, 100%, 200% and so on up to 2000%. zoomLevels = [0.1, 0.25, 0.5, 0.75] @@ -99,10 +88,18 @@ def awakeFromNib(self): inaction = {k:None for k in ["onOrderOut", "sublayers", "contents", "position", "bounds"]} self.layer().setActions_(inaction) - # display the placeholder image until we're passed a canvas - if self.placeholder: - self.setFrameSize_(self.placeholder.size()) - self.layer().setContents_(self.placeholder) + # display the placeholder image until we're passed a canvas (and keep it in sync with appearance) + self.updatePlaceholder(NSAppearance.currentDrawingAppearance()) + + @objc.python_method + def updatePlaceholder(self, appearance): + if self.canvas is None: + placeholder = NSImage.imageNamed_('placeholder-{mode}.pdf'.format( + mode = 'dark' if 'Dark' in appearance.name() else 'light' + )) + if placeholder: + self.setFrameSize_(placeholder.size()) + self.layer().setContents_(placeholder) @objc.python_method def setCanvas(self, canvas): diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index 32ae936e..4672e8c8 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -24,7 +24,7 @@ kCGLineJoinBevel, kCGLineJoinMiter, kCGLineJoinRound, kCGPathFill, kCGPathFillStroke, \ kCGPathStroke, kCIInputImageKey, kCGImageDestinationLossyCompressionQuality, \ kCGImageAlphaPremultipliedFirst, kCGBitmapByteOrder32Host, kCGImageAlphaNoneSkipFirst -from AppKit import NSAlert, NSApp, NSApplication, NSApplicationActivationPolicyAccessory, \ +from AppKit import NSAlert, NSApp, NSAppearance, NSApplication, NSApplicationActivationPolicyAccessory, \ NSBackingStoreBuffered, NSBeep, NSBezierPath, NSBitmapImageRep, NSBorderlessWindowMask, \ NSButton, NSCenterTextAlignment, NSChangeAutosaved, NSChangeCleared, NSChangeDone, \ NSChangeReadOtherContents, NSChangeRedone, NSChangeUndone, NSClipView, \ @@ -35,10 +35,10 @@ NSFont, NSFontDescriptor, NSFontManager, NSForegroundColorAttributeName, NSGIFFileType, \ NSGradient, NSGraphicsContext, NSGraphiteControlTint, NSImage, NSImageCacheNever, \ NSImageCompressionFactor, NSImageInterpolationHigh, NSItalicFontMask, NSJPEGFileType, \ - NSJustifiedTextAlignment, NSLayoutManager, NSLeftTextAlignment, NSLineBreakByWordWrapping, \ - NSLineToBezierPathElement, NSMenu, NSMenuItem, NSMiniControlSize, NSMoveToBezierPathElement, \ - NSMutableParagraphStyle, NSNib, NSOffState, NSOnState, NSPNGFileType, NSParagraphStyleAttributeName, \ - NSPasteboard, NSPasteboardTypePDF, NSPasteboardURLReadingContentsConformToTypesKey, \ + NSJustifiedTextAlignment, NSKeyValueObservingOptionNew, NSLayoutManager, NSLeftTextAlignment, \ + NSLineBreakByWordWrapping, NSLineToBezierPathElement, NSMenu, NSMenuItem, NSMiniControlSize, \ + NSMoveToBezierPathElement, NSMutableParagraphStyle, NSNib, NSOffState, NSOnState, NSPNGFileType, \ + NSParagraphStyleAttributeName, NSPasteboard, NSPasteboardTypePDF, NSPasteboardURLReadingContentsConformToTypesKey, \ NSPasteboardURLReadingFileURLsOnlyKey, NSPasteboardTypeTIFF, NSPrintOperation, NSRectFill, \ NSRectFillUsingOperation, NSResponder, NSRightTextAlignment, NSSavePanel, NSScreen, NSShadow, \ NSSlider, NSSmallControlSize, NSSplitView, NSStringPboardType, NSSwitch, NSSwitchButton, \ From 489f0c0cd04d2315f23eedad18a50dc23a5ec16c Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Wed, 29 Jun 2022 14:22:46 -0400 Subject: [PATCH 076/226] make editor splitview handle visible in dark mode --- plotdevice/gui/document.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index 0f595140..1bbbe4eb 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -201,13 +201,18 @@ def awakeFromNib(self): # always a reference to either the in-window view or a fullscreen view self.currentView = self.graphicsView - # watch for changes in light/dark-mode and pass them along to graphicsView + # watch for changes in light/dark-mode and pass them along to subviews + from AppKit import NSKeyValueObservingOptionInitial NSApp.addObserver_forKeyPath_options_context_(self, - "effectiveAppearance", NSKeyValueObservingOptionNew, None + "effectiveAppearance", NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial, None ) def observeValueForKeyPath_ofObject_change_context_(self, path, obj, change, context): - self.graphicsView.updatePlaceholder(change.get('new')) + appearance = change.get('new', change.get('initial')) + self.editorView.superview().setDividerColor_( + NSColor.colorWithWhite_alpha_(1.0, 0.333) if 'Dark' in appearance.name() else NSColor.thinSplitViewDividerColor() + ) + self.graphicsView.updatePlaceholder(appearance) ## WindowController duties From 8f389930fb22db5b26ac2b7a38bf23b393f980aa Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Wed, 29 Jun 2022 15:57:24 -0400 Subject: [PATCH 077/226] skip the editor coloring in cli-mode --- plotdevice/gui/document.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index 1bbbe4eb..3b426016 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -209,10 +209,11 @@ def awakeFromNib(self): def observeValueForKeyPath_ofObject_change_context_(self, path, obj, change, context): appearance = change.get('new', change.get('initial')) - self.editorView.superview().setDividerColor_( - NSColor.colorWithWhite_alpha_(1.0, 0.333) if 'Dark' in appearance.name() else NSColor.thinSplitViewDividerColor() - ) self.graphicsView.updatePlaceholder(appearance) + if self.editorView: + self.editorView.superview().setDividerColor_( + NSColor.colorWithWhite_alpha_(1.0, 0.333) if 'Dark' in appearance.name() else NSColor.thinSplitViewDividerColor() + ) ## WindowController duties From df340c2ac331a5ca6cdd69efc7c53d52941c01c2 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Wed, 29 Jun 2022 16:10:25 -0400 Subject: [PATCH 078/226] only update graphicsView placeholder on change - it initializes itself correctly --- plotdevice/gui/document.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index 3b426016..5eb9d444 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -209,11 +209,12 @@ def awakeFromNib(self): def observeValueForKeyPath_ofObject_change_context_(self, path, obj, change, context): appearance = change.get('new', change.get('initial')) - self.graphicsView.updatePlaceholder(appearance) if self.editorView: self.editorView.superview().setDividerColor_( NSColor.colorWithWhite_alpha_(1.0, 0.333) if 'Dark' in appearance.name() else NSColor.thinSplitViewDividerColor() ) + if 'new' in change: + self.graphicsView.updatePlaceholder(appearance) ## WindowController duties From a486adc8cf800281e2cd3c50b0fdf5167680ad26 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Thu, 30 Jun 2022 16:44:28 -0400 Subject: [PATCH 079/226] add timers to runloop so they don't block on UI drags --- plotdevice/gui/__init__.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/plotdevice/gui/__init__.py b/plotdevice/gui/__init__.py index e9de5235..800208a7 100644 --- a/plotdevice/gui/__init__.py +++ b/plotdevice/gui/__init__.py @@ -11,12 +11,15 @@ def bundle_path(subpath=None, rsrc=None, fmwk=None): return join(bundle, subpath) return bundle -from Foundation import NSTimer +from Foundation import NSTimer, NSRunLoop, NSRunLoopCommonModes def set_timeout(target, sel, delay, info=None, repeat=False): - return NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(delay, target, sel, info, repeat) + timer = NSTimer.timerWithTimeInterval_target_selector_userInfo_repeats_(delay, target, sel, info, repeat) + NSRunLoop.mainRunLoop().addTimer_forMode_(timer, NSRunLoopCommonModes) + return timer def next_tick(target, sel): - return NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(0, target, sel, None, False) + timer = NSTimer.timerWithTimeInterval_target_selector_userInfo_repeats_(0, target, sel, None, False) + NSRunLoop.mainRunLoop().addTimer_forMode_(timer, NSRunLoopCommonModes) from .document import PlotDeviceDocument, PythonScriptDocument, ScriptController from .app import PlotDeviceAppDelegate From da48875c60b740bf697ec593ff5e0253888ba682 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Thu, 30 Jun 2022 20:07:52 -0400 Subject: [PATCH 080/226] restore editor focus after closing fullscreen view --- plotdevice/gui/document.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index 5eb9d444..a1872c2d 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -585,6 +585,7 @@ def stopScript(self): self.outputView.report(self.vm.crashed, self.vm.namespace.get('FRAME') if self.vm.animated else None) # return from fullscreen (if applicable) + needs_focus = False if self.fullScreen is not None: # copy the final frame back to the window's view self.graphicsView.setCanvas(self.vm.canvas) @@ -595,6 +596,7 @@ def stopScript(self): self.fullScreen.orderOut_(self) self.fullScreen = None NSCursor.unhide() + needs_focus = True # try to send the cursor to the editor if self.editorView: @@ -603,7 +605,7 @@ def stopScript(self): self.graphicsView.window().makeFirstResponder_(self.graphicsView) # bring the window forward (to recover from fullscreen mode) and re-cache the graphics - if self.graphicsView: + if needs_focus: # note that graphicsView is nulled out in self.close_ before we're called. # otherwise the makeKey will cause a double-flicker before the window disappears focus = self.editorView or self.graphicsView From 1fddce36161b6c2100d7aae73e7b73f8a083d511 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Thu, 30 Jun 2022 20:08:22 -0400 Subject: [PATCH 081/226] fix race condition initializing graphicsView --- plotdevice/gui/document.py | 3 +-- plotdevice/gui/views.py | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index a1872c2d..ca3986d0 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -209,12 +209,11 @@ def awakeFromNib(self): def observeValueForKeyPath_ofObject_change_context_(self, path, obj, change, context): appearance = change.get('new', change.get('initial')) + self.graphicsView.updatePlaceholder(appearance) if self.editorView: self.editorView.superview().setDividerColor_( NSColor.colorWithWhite_alpha_(1.0, 0.333) if 'Dark' in appearance.name() else NSColor.thinSplitViewDividerColor() ) - if 'new' in change: - self.graphicsView.updatePlaceholder(appearance) ## WindowController duties diff --git a/plotdevice/gui/views.py b/plotdevice/gui/views.py index 4f1e4d9f..ac94c8b9 100644 --- a/plotdevice/gui/views.py +++ b/plotdevice/gui/views.py @@ -64,6 +64,7 @@ def viewFrameDidChange_(self, note): class GraphicsView(NSView): script = IBOutlet() + canvas = None # The zoom levels are 10%, 25%, 50%, 75%, 100%, 200% and so on up to 2000%. zoomLevels = [0.1, 0.25, 0.5, 0.75] From a391cef3425e4618b220f22e2a7dcd8660e0678e Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Thu, 30 Jun 2022 20:16:11 -0400 Subject: [PATCH 082/226] revamp var() system - the BUTTON type actually works now (where the `value` is the text used for the button itself, and the 'variable name' is a user-defined function in the global scope to be called on click) - BUTTON takes an optional `label` that's displayed to the left of the button and a `color` for the button background - dragging a NUMBER slider doesn't hang the animation runLoop - NUMBER sliders now display the value in a companion text label - NUMBER ranges can be rounded off by setting `step` size - added optional custom `label` for the UI (not just the name of the variable being created) - BOOLEAN is now an NSSwitch rather than a checkbox --- app/Resources/en.lproj/PlotDeviceDocument.xib | 52 +-- app/Resources/en.lproj/PlotDeviceScript.xib | 57 +-- plotdevice/context.py | 41 +- plotdevice/gfx/atoms.py | 110 ++--- plotdevice/gui/document.py | 5 +- plotdevice/gui/widgets.py | 381 ++++++++++++------ plotdevice/lib/cocoa.py | 4 +- plotdevice/run/sandbox.py | 12 +- 8 files changed, 358 insertions(+), 304 deletions(-) diff --git a/app/Resources/en.lproj/PlotDeviceDocument.xib b/app/Resources/en.lproj/PlotDeviceDocument.xib index b412fb2b..9eca172b 100644 --- a/app/Resources/en.lproj/PlotDeviceDocument.xib +++ b/app/Resources/en.lproj/PlotDeviceDocument.xib @@ -170,61 +170,17 @@ - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/app/Resources/en.lproj/PlotDeviceScript.xib b/app/Resources/en.lproj/PlotDeviceScript.xib index 4e6ad646..eb318f26 100644 --- a/app/Resources/en.lproj/PlotDeviceScript.xib +++ b/app/Resources/en.lproj/PlotDeviceScript.xib @@ -21,7 +21,7 @@ - + @@ -107,61 +107,18 @@ - - + + - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -183,9 +140,9 @@ - + diff --git a/plotdevice/context.py b/plotdevice/context.py index f403f525..00fe965e 100644 --- a/plotdevice/context.py +++ b/plotdevice/context.py @@ -1,7 +1,7 @@ # encoding: utf-8 import os, re, types from contextlib import contextmanager -from collections import namedtuple +from collections import namedtuple, OrderedDict from os.path import exists, expanduser from objc import super @@ -24,7 +24,7 @@ ### NSGraphicsContext wrapper (whose methods are the business-end of the user-facing API) ### class Context(object): - _state_vars = '_outputmode', '_colormode', '_colorrange', '_fillcolor', '_strokecolor', '_penstyle', '_font', '_effects', '_path', '_autoclosepath', '_grid', '_transform', '_transformmode', '_thetamode', '_transformstack', '_oldvars', '_vars' + _state_vars = '_outputmode', '_colormode', '_colorrange', '_fillcolor', '_strokecolor', '_penstyle', '_font', '_effects', '_path', '_autoclosepath', '_grid', '_transform', '_transformmode', '_thetamode', '_transformstack', '_params', '_vars' def __init__(self, canvas=None, ns=None): """Initializes the context. @@ -37,6 +37,7 @@ def __init__(self, canvas=None, ns=None): self._imagecache = {} self._statestack = [] self._vars = [] + self._params = OrderedDict() self._resetContext() # initialize default graphics state self._resetEnvironment() # initialize namespace & canvas @@ -99,10 +100,17 @@ def _resetContext(self): self._autoclosepath = True self._autoplot = True + # track new calls to var() so we can update self._params + # (this is reset with every invocation but only checked after the full-module eval) + self._vars = OrderedDict() + + # update existing variables' values from _params (so draw() can see updates) + for name, p in self._params.items(): + if p.type != BUTTON: # buttons don't actually create variables + self._ns[name] = p.value + # legacy internals self._transformstack = [] # only used by push/pop - self._oldvars = self._vars - self._vars = [] def _saveContext(self): cached = [_copy_attr(getattr(self, v)) for v in Context._state_vars] @@ -1555,23 +1563,14 @@ def measure(self, obj=None, width=None, height=None, **kwargs): ### Variables ### - def var(self, name, type, default=None, min=0, max=100, value=None): - v = Variable(name, type, default, min, max, value) - v = self.addvar(v) - - def addvar(self, v): - oldvar = self.findvar(v.name) - if oldvar is not None: - if oldvar.compliesTo(v): - v.value = oldvar.value - self._vars.append(v) - self._ns[v.name] = v.value - - def findvar(self, name): - for v in self._oldvars: - if v.name == name: - return v - return None + def var(self, name, type, *args, **kwargs): + v = Variable(name, type, *args, **kwargs) + self._vars[v.name] = v + + # if we're re-running the script, don't overwrite the value set through the UI + if v.type != BUTTON: # buttons don't actually create variables + v.inherit(self._params.get(v.name, None)) + self._ns[v.name] = v.value class PlotContext(object): diff --git a/plotdevice/gfx/atoms.py b/plotdevice/gfx/atoms.py index 553b7e76..4becd301 100644 --- a/plotdevice/gfx/atoms.py +++ b/plotdevice/gfx/atoms.py @@ -1,4 +1,6 @@ # encoding: utf-8 +import re +from math import floor from collections import namedtuple, defaultdict from .. import DeviceError @@ -31,6 +33,7 @@ KEY_ESC = 53 + ### Graphic object inheritance hierarchy w/ mixins to merge local and context state ### class Bequest(type): @@ -385,61 +388,76 @@ def stylesheet(self): def fill(self): return self._fillcolor +re_var = re.compile(r'[A-Za-z_][A-Za-z0-9_]*$') +re_punct = re.compile(r'([^\!\'\#\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\/\]\^\_\{\|\}\~])$') class Variable(object): - def __init__(self, name, type, default=None, min=0, max=100, value=None): + def __init__(self, name, type, *args, **kwargs): + # var(name, TEXT, value, label=) + # var(name, BOOLEAN, value, label=) + # var(name, NUMBER, value, min, max, step, label=) + # var(handler, BUTTON, buttonText, color=, label=) + if not re_var.match(name): + raise DeviceError('Not a legal variable name: "%s"' % name) + self.name = name self.type = type or NUMBER + self.label = re_punct.sub(r'\1:', kwargs.get('label', name)) + if self.type == NUMBER: - if default is None: - self.default = 50 - else: - self.default = default - self.min = min - self.max = max - elif self.type == TEXT: - if default is None: - self.default = "hello" - else: - self.default = default - elif self.type == BOOLEAN: - if default is None: - self.default = True + attrs = ['value', 'min', 'max', 'step'] + for attr, val in zip(attrs, args): + setattr(self, attr, val) + for attr, val in kwargs.items(): + if attr in attrs: + setattr(self, attr, val) + + self.min = getattr(self, 'min', 0) + if hasattr(self, 'value'): + self.max = getattr(self, 'max', 100 if 0 <= self.value <= 100 else self.value * 2) else: - self.default = default - elif self.type == BUTTON: - self.default = self.name - self.value = value or self.default + self.max = getattr(self, 'max', 100) + self.min, self.max = min(self.min, self.max), max(self.min, self.max) + self.value = getattr(self, 'value', (self.min + self.max) / 2) + self.step = getattr(self, 'step', None) + + if self.step: + if ((self.max-self.min) / self.step) % 1 > 0: + raise DeviceError("The step size %d doesn't fit evenly into the range %d–%d" % (self.step, self.min, self.max)) + self.value = self.step * floor((self.value + self.step/2) / self.step) + + small = min(self.min, self.max) + big = max(self.min, self.max) + if not small < self.value < big: + raise DeviceError("The value %d doesn't fall with the range %d–%d" % (self.value, self.min, self.max)) - def sanitize(self, val): - """Given a Variable and a value, cleans it out""" - if self.type == NUMBER: - try: - return float(val) - except ValueError: - return 0.0 elif self.type == TEXT: - return str(val) + self.value = next(iter(args), "hello") elif self.type == BOOLEAN: - if str(val).lower() in ("true", "1", "yes"): - return True + self.value = bool(next(iter(args), True)) + elif self.type == BUTTON: + # first arg can be a function name or direct reference + if callable(name): + self.name = name.__name__ + + # use value as button text (else use function name) + self.value = next(iter(args), name) + + # only add label text if it's provided explicitly + if 'label' not in kwargs: + self.label = None + clr = kwargs.get('color', None) + self.color = Color(clr) if clr else None + + def inherit(self, old=None): + if old and old.type is self.type: + if self.type is NUMBER: + self.value = max(self.min, min(self.max, old.value)) + if self.step: + self.value = self.step * floor((self.value + self.step/2) / self.step) else: - return False - - def compliesTo(self, v): - """Return whether I am compatible with the given var: - - Type should be the same - - My value should be inside the given vars' min/max range. - """ - if self.type == v.type: - if self.type == NUMBER: - if self.value < self.min or self.value > self.max: - return False - return True - return False + self.value = old.value @trim_zeroes def __repr__(self): - if hasattr(self, 'min'): - return "Variable(name=%s, type=%s, default=%s, min=%s, max=%s, value=%s)" % (self.name, self.type, self.default, self.min, self.max, self.value) - - return "Variable(name=%s, type=%s, default=%s, value=%s)" % (self.name, self.type, self.default, self.value) + attrs = ['name', 'type', 'value', 'min', 'max', 'step', 'color', 'label'] + return "Variable(%s)" % ' '.join('%s=%s' % (a,getattr(self, a)) for a in attrs if hasattr(self, a)) diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index ca3986d0..5451fe89 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -312,6 +312,7 @@ def windowWillClose_(self, note): if self.editorView: self.editorView._cleanup() self.outputView._cleanup() + self.dashboardController.shutdown() self.graphicsView = self.outputView = self.editorView = self.statusView = None self.dashboardController = self.exportSheet = self.vm = None @@ -378,8 +379,8 @@ def runScript(self): success = self.invoke(None) # Display the dashboard if the var() command was called - if self.vm.vars: - self.dashboardController.buildInterface(self.vm.vars) + self.vm.params = self.vm.vars + self.dashboardController.updateInterface() # Run the setup routine (if it exists) if success: diff --git a/plotdevice/gui/widgets.py b/plotdevice/gui/widgets.py index 1db16d7f..bf307f41 100644 --- a/plotdevice/gui/widgets.py +++ b/plotdevice/gui/widgets.py @@ -1,5 +1,6 @@ # encoding: utf-8 -import os +import os, re +from collections import OrderedDict from ..lib.cocoa import * from math import floor, ceil import objc @@ -80,154 +81,269 @@ def mouseExited_(self, e): self.spinner.setHidden_(False) -from plotdevice.context import NUMBER, TEXT, BOOLEAN, BUTTON +from ..context import NUMBER, TEXT, BOOLEAN, BUTTON SMALL_FONT = NSFont.systemFontOfSize_(NSFont.smallSystemFontSize()) MINI_FONT = NSFont.systemFontOfSize_(NSFont.systemFontSizeForControlSize_(NSMiniControlSize)) -class DashboardController(NSObject): - script = IBOutlet() - panel = IBOutlet() - def clearInterface(self): - for s in list(self.panel.contentView().subviews()): - s.removeFromSuperview() +class DashboardSwitch(NSSwitch): + def acceptsFirstMouse_(self, e): + return True + +class DashboardRow(NSView): + + def initWithVariable_forDelegate_(self, var, delegate): + self.initWithFrame_(((0,-999), (200, 30))) + self.setAutoresizingMask_(NSViewWidthSizable) + + label = NSTextField.alloc().init() + if var.label is not None: + label.setStringValue_(var.label) + label.setAlignment_(NSRightTextAlignment) + label.setEditable_(False) + label.setBordered_(False) + label.setDrawsBackground_(False) + label.setFont_(SMALL_FONT) + label.sizeToFit() + self.addSubview_(label) + + if var.type is TEXT: + control = NSTextField.alloc().init() + control.setStringValue_(var.value) + control.cell().setControlSize_(NSSmallControlSize) + control.setFont_(SMALL_FONT) + control.setTarget_(self) + control.setAutoresizingMask_(NSViewWidthSizable) + control.setDelegate_(self) + self.addSubview_(control) + + elif var.type is BOOLEAN: + control = DashboardSwitch.alloc().init() + control.setState_(NSOnState if var.value else NSOffState) + control.setControlSize_(NSSmallControlSize) + control.sizeToFit() + control.setFont_(SMALL_FONT) + control.setTarget_(self) + control.setAction_(objc.selector(self.booleanChanged_, signature=b"v@:@@")) + self.addSubview_(control) + + elif var.type is NUMBER: + control = NSSlider.alloc().init() + control.setMaxValue_(var.max) + control.setMinValue_(var.min) + control.setFloatValue_(var.value) + control.cell().setControlSize_(NSSmallControlSize) + control.setContinuous_(True) + control.setTarget_(self) + control.setAutoresizingMask_(NSViewWidthSizable) + control.setAction_(objc.selector(self.numberChanged_, signature=b"v@:@@")) + self.addSubview_(control) + + num = NSTextField.alloc().init() + num.setBordered_(False) + num.setEditable_(False) + num.setAutoresizingMask_(NSViewMinXMargin) + num.setSelectable_(True) + num.setDrawsBackground_(False) + num.setFont_(SMALL_FONT) + + # measure all the possible values to decide on the text-field width + num_w = self._num_w(var.min, var.max, var.step) + num.setStringValue_(self._fmt(var.value)) + num.setFrameSize_((num_w, 18)) + self.addSubview_(num) + self.step = var.step + self.num = num + + elif var.type is BUTTON: + control = NSButton.alloc().init() + control.setTitle_(var.value) + control.setBezelStyle_(1) + control.setFont_(SMALL_FONT) + control.cell().setControlSize_(NSSmallControlSize) + control.setTarget_(self) + control.sizeToFit() + control.setBezelColor_(getattr(var.color, '_rgb', None)) + control.setAction_(objc.selector(self.buttonClicked_, signature=b"v@:@@")) + self.addSubview_(control) + + self.name = var.name + self.type = var.type + self.label = label + self.control = control + self.button_w = control.frame().size.width if var.type is BUTTON else 0 + self.num_w = num_w if var.type is NUMBER else 0 + self.label_w = label.frame().size.width + self.delegate = delegate + return self + + @objc.python_method + def _fmt(self, num): + s = "{:,.3f}".format(num) + s = re.sub(r'\.0+$', '', s) + return re.sub(r'(\.[^0])+0*$', r'\1', s) + + @objc.python_method + def _num_w(self, lo, hi, step): + num_w = 0 + inc = step if step else (hi - lo) / 97 + num = NSTextField.alloc().init() + num.setFont_(SMALL_FONT) + for i in range(1+ceil((hi - lo) / inc)): + n = min(hi, lo + i*inc) + s = self._fmt(n) + num.setStringValue_(s) + num.sizeToFit() + num_w = max(num_w, num.frame().size.width) + return num_w + + @objc.python_method + def roundOff(self): + if self.step: + rounded = self.step * floor((self.control.floatValue() + self.step/2) / self.step) + self.control.cell().setFloatValue_(rounded) + self.num.setStringValue_(self._fmt(self.control.floatValue())) + + @objc.python_method + def updateConfig(self, var): + label = self.label + control = self.control + label.setStringValue_(var.label or '') + label.sizeToFit() + self.label_w = label.frame().size.width + + if var.type is NUMBER: + control.setMaxValue_(var.max) + control.setMinValue_(var.min) + self.step = var.step + self.num_w = self._num_w(var.min, var.max, var.step) + self.roundOff() + + elif var.type is BUTTON: + control.setTitle_(var.value) + self.button_w = control.frame().size.width + control.setBezelColor_(getattr(var.color, '_rgb', None)) + + @objc.python_method + def updateLayout(self, indent, width, row_width, offset): + self.setFrame_(((0, offset), (row_width, 30))) + self.label.setFrame_(((10, 0), (indent-15, 18))) + if self.type is TEXT: + self.control.setFrame_(((indent, 3),(width - indent, 18))) + elif self.type is BOOLEAN: + self.control.setFrameOrigin_((indent, 0)) + elif self.type is NUMBER: + self.control.setFrame_(((indent, 1), (width - indent, 18))) + self.num.setFrameOrigin_((width + 5, 0)) + elif self.type is BUTTON: + self.control.setFrameOrigin_((indent-5, -5)) def numberChanged_(self, sender): - var = self.script.vm.vars[sender.tag()] - var.value = sender.floatValue() - self.script.runScript() + self.roundOff() + if self.delegate: + self.delegate.setVariable_to_(self.name, sender.floatValue()) - def textChanged_(self, sender): - var = self.script.vm.vars[sender.tag()] - var.value = sender.stringValue() - self.script.runScript() + def controlTextDidChange_(self, note): + if self.delegate: + sender = note.object() + self.delegate.setVariable_to_(self.name, sender.stringValue()) def booleanChanged_(self, sender): - var = self.script.vm.vars[sender.tag()] - if sender.state() == NSOnState: - var.value = True - else: - var.value = False - self.script.runScript() + if self.delegate: + self.delegate.setVariable_to_(self.name, sender.state() == NSOnState) def buttonClicked_(self, sender): - print("out of service") - # var = self.script.vm.vars[sender.tag()] - # self.script.vm.call(var.name) - # self.script.runScript() + if self.delegate: + self.delegate.callHandler_(self.name) - @objc.python_method - def buildInterface(self, vars): - self.vars = vars - self.clearInterface() - if len(self.vars) > 0: - self.panel.orderFront_(None) - else: - self.panel.orderOut_(None) - return - - # Set the title of the parameter panel to the title of the window - self.panel.setTitle_(self.script.window().title()) - - (px,py),(pw,ph) = self.panel.frame() - # Height of the window. Each element has a height of 21. - # The extra "fluff" is 38 pixels. - ph = len(self.vars) * 21 + 54 - # Start of first element - # First element is the height minus the fluff. - y = ph - 49 - cnt = 0 - for v in self.vars: - if v.type == NUMBER: - self._addLabel(v, y, cnt) - self._addSlider(v, y, cnt) - elif v.type == TEXT: - self._addLabel(v, y, cnt) - self._addTextField(v, y, cnt) - elif v.type == BOOLEAN: - self._addSwitch(v, y, cnt) - elif v.type == BUTTON: - self._addButton(v, y, cnt) - y -= 21 - cnt += 1 - self.panel.setFrame_display_animate_( ((px,py),(pw,ph)), True, True ) +class DashboardController(NSObject): + script = IBOutlet() + panel = IBOutlet() - @objc.python_method - def _addLabel(self, v, y, cnt): - control = NSTextField.alloc().init() - control.setFrame_(((0,y),(100,13))) - control.setStringValue_(v.name + ":") - control.setAlignment_(NSRightTextAlignment) - control.setEditable_(False) - control.setBordered_(False) - control.setDrawsBackground_(False) - control.setFont_(SMALL_FONT) - control.setTextColor_(NSColor.whiteColor()) - self.panel.contentView().addSubview_(control) + def awakeFromNib(self): + self.panel.contentView().setFlipped_(True) + self.rows = OrderedDict() + self.positioned = False + + def shutdown(self): + self.panel.close() + for row in self.rows.values(): + row.delegate = None + if row.type is TEXT: + row.control.setDelegate_(None) + + def setVariable_to_(self, name, val): + var = self.script.vm.params[name] + var.value = val + if self.script.animationTimer is None: + self.script.runScript() + + def callHandler_(self, name): + var = self.script.vm.params[name] + result = self.script.vm.call(var.name) + self.script.echo(result.output) @objc.python_method - def _addSlider(self, v, y, cnt): - control = NSSlider.alloc().init() - control.setMaxValue_(v.max) - control.setMinValue_(v.min) - control.setFloatValue_(v.value) - control.setFrame_(((108,y-1),(172,13))) - control.cell().setControlSize_(NSMiniControlSize) - control.cell().setControlTint_(NSGraphiteControlTint) - control.setContinuous_(True) - control.setTarget_(self) - control.setTag_(cnt) - control.setAction_(objc.selector(self.numberChanged_, signature=b"v@:@@")) - self.panel.contentView().addSubview_(control) + def updateInterface(self): + params = self.script.vm.params + for name, widget in self.rows.items(): + if name not in params: + widget.removeFromSuperview() + self.script.vm.namespace.pop(name) + + new_rows = OrderedDict() + for name, var in params.items(): + try: + new_rows[name] = self.rows[name] + new_rows[name].updateConfig(var) + except KeyError: + new_rows[name] = DashboardRow.alloc().initWithVariable_forDelegate_(var, self) + self.panel.contentView().addSubview_(new_rows[name]) + self.rows = new_rows + + if not self.rows: + self.panel.orderOut_(None) + else: + # Set the title of the parameter panel to the title of the window + self.panel.setTitle_(self.script.window().title()) + + # recalculate the layout + (pOrigin, pSize) = self.panel.frame() + label_w = max([v.label_w for v in self.rows.values()]) + button_w = max([v.button_w for v in self.rows.values()]) + num_w = max([v.num_w for v in self.rows.values()]) + ph = len(self.rows) * 30 + 30 + pw = label_w + 15 + max(button_w, 200) + num_w + col = label_w + 15 + + self.panel.setMinSize_( (pw, ph)) + self.panel.setMaxSize_( (pw * 5, ph)) + + needs_resize = pSize.width < pw or pSize.height != ph + pw = max(pw, pSize.width) + + if not self.positioned: + win = self.script.window().frame() + screen = self.script.window().screen().visibleFrame() + if win.origin.x + win.size.width + pw < screen.size.width: + pOrigin = (win.origin.x + win.size.width, win.origin.y + win.size.height - ph - 38) + elif win.origin.x - pw > 0: + pOrigin = (win.origin.x - pw, win.origin.y + win.size.height - ph - 38) + else: + pOrigin = (win.origin.x + win.size.width - pw - 15, win.origin.y + 15) + self.panel.setFrame_display_animate_( (pOrigin, (pw,ph)), True, True ) + self.positioned = True + + elif needs_resize: + pOrigin.y -= ph-pSize.height + self.panel.setFrame_display_animate_( (pOrigin, (pw,ph)), True, True ) + + # reposition the elements of each row to fit the new panel size and row contents + for idx, v in enumerate(self.rows.values()): + v.updateLayout(col, pw - 10 - num_w, pw, idx*30) - @objc.python_method - def _addTextField(self, v, y, cnt): - control = NSTextField.alloc().init() - control.setStringValue_(v.value) - control.setFrame_(((108,y-2),(172,15))) - control.cell().setControlSize_(NSMiniControlSize) - control.cell().setControlTint_(NSGraphiteControlTint) - control.setFont_(MINI_FONT) - control.setTarget_(self) - control.setTag_(cnt) - control.setAction_(objc.selector(self.textChanged_, signature=b"v@:@@")) - self.panel.contentView().addSubview_(control) + self.panel.orderFront_(None) - @objc.python_method - def _addSwitch(self, v, y, cnt): - control = NSButton.alloc().init() - control.setButtonType_(NSSwitchButton) - if v.value: - control.setState_(NSOnState) - else: - control.setState_(NSOffState) - control.setFrame_(((108,y-2),(172,16))) - control.setTitle_(v.name) - control.setFont_(SMALL_FONT) - control.cell().setControlSize_(NSSmallControlSize) - control.cell().setControlTint_(NSGraphiteControlTint) - control.setTarget_(self) - control.setTag_(cnt) - switchTitle = NSMutableAttributedString.alloc().initWithAttributedString_(control.attributedTitle()) - switchTitle.addAttribute_value_range_(NSForegroundColorAttributeName, - NSColor.whiteColor(), - (0, switchTitle.length())) - control.setAttributedTitle_(switchTitle) - control.setAction_(objc.selector(self.booleanChanged_, signature=b"v@:@@")) - self.panel.contentView().addSubview_(control) - @objc.python_method - def _addButton(self, v, y, cnt): - control = NSButton.alloc().init() - control.setFrame_(((108, y-2),(172,16))) - control.setTitle_(v.name) - control.setBezelStyle_(1) - control.setFont_(SMALL_FONT) - control.cell().setControlSize_(NSMiniControlSize) - control.cell().setControlTint_(NSGraphiteControlTint) - control.setTarget_(self) - control.setTag_(cnt) - control.setAction_(objc.selector(self.buttonClicked_, signature=b"v@:@@")) - self.panel.contentView().addSubview_(control) from ..context import RGB, CMYK class ExportSheet(NSObject): @@ -337,7 +453,6 @@ def movieState(self, key=None): fmts = self.formats['movie'] fmt_idx = self.movieFormat.indexOfSelectedItem() state = dict(format = fmts[fmt_idx], - # format=panel.requiredFileType(), first=1, last=self.movieFrames.intValue(), fps=self.movieFps.floatValue(), diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index 4672e8c8..9d72ef57 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -41,10 +41,10 @@ NSParagraphStyleAttributeName, NSPasteboard, NSPasteboardTypePDF, NSPasteboardURLReadingContentsConformToTypesKey, \ NSPasteboardURLReadingFileURLsOnlyKey, NSPasteboardTypeTIFF, NSPrintOperation, NSRectFill, \ NSRectFillUsingOperation, NSResponder, NSRightTextAlignment, NSSavePanel, NSScreen, NSShadow, \ - NSSlider, NSSmallControlSize, NSSplitView, NSStringPboardType, NSSwitch, NSSwitchButton, \ + NSSlider, NSSmallControlSize, NSSplitView, NSStringPboardType, NSSwitch, \ NSTIFFFileType, NSTextContainer, NSTextField, NSTextFinder, NSTextStorage, NSTextView, \ NSToolbarItem, NSTrackingActiveInActiveApp, NSTrackingArea, NSTrackingMouseEnteredAndExited, \ - NSUnboldFontMask, NSUnitalicFontMask, NSUnionRect, NSView, NSViewWidthSizable, \ + NSUnboldFontMask, NSUnitalicFontMask, NSUnionRect, NSView, NSViewMinXMargin, NSViewWidthSizable, \ NSViewFrameDidChangeNotification, NSWindow, NSWindowBackingLocationVideoMemory, \ NSWindowController, NSWorkspace, NSKernAttributeName from Foundation import CIAffineTransform, CIColorMatrix, CIContext, CIFilter, CIImage, \ diff --git a/plotdevice/run/sandbox.py b/plotdevice/run/sandbox.py index 600d99cc..af4cb68e 100644 --- a/plotdevice/run/sandbox.py +++ b/plotdevice/run/sandbox.py @@ -96,9 +96,18 @@ def _set_meta(self, metadict): self.live = metadict.get('live', self.live) metadata = property(_get_meta, _set_meta) + # .params + def _get_params(self): + """Script variables currently being displayed in the UI (r/w)""" + return self.context._params + def _set_params(self, new_params): + self.context._params.clear() + self.context._params.update(new_params) + params = property(_get_params, _set_params) + @property def vars(self): - """Script variables being tracked through the vars() method (r)""" + """Script variables added through the var() method in the last run (r)""" return self.context._vars @property @@ -170,7 +179,6 @@ def run(self, method=None, cmyk=False): result = self.call(method) # (non-animation scripts are now complete (as are anims that just crashed)) - if self.animated and result.ok: # animations require special bookkeeping depending on which routine is being run if method is None: From 186dca8575dd16af81d021867864f0f002b47adb Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Thu, 30 Jun 2022 20:56:41 -0400 Subject: [PATCH 083/226] provide some expected methods in shadowed stdout/err --- plotdevice/run/sandbox.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/plotdevice/run/sandbox.py b/plotdevice/run/sandbox.py index af4cb68e..4a4aef6e 100644 --- a/plotdevice/run/sandbox.py +++ b/plotdevice/run/sandbox.py @@ -365,16 +365,26 @@ def _cleanup(self): class StdIO(object): class OutputFile(object): def __init__(self, stream, streamname): - self.stream = stream - self.isErr = streamname=='stderr' + self._stream = stream + self.fileno = lambda: 1 if streamname=='stdout' else 2 def write(self, data): - # if isinstance(data, str): - # try: - # data = str(data, "utf_8", "replace") - # except UnicodeDecodeError: - # data = "XXX " + repr(data) - self.stream.write(Output(self.isErr, data)) + self._stream.write(Output(self.fileno()==2, data)) + + def writelines(self, lines): + self._stream.write(Output(self.fileno()==2, ''.join(lines))) + + def writable(self): + return True + + def readable(self, data): + return False + + def isatty(self): + return False + + def flush(self): + pass def __init__(self): self.data = [] # the list of (isErr, txt) tuples .write calls go to From be2f529757b0d366a3501f7e054a936b7b9c3e09 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 1 Jul 2022 10:47:27 -0400 Subject: [PATCH 084/226] use system colors for cli-tool in prefs pane - the hard-coded colors weren't legible in dark mode --- app/Resources/en.lproj/PlotDevicePreferences.xib | 13 +++++++------ plotdevice/gui/preferences.py | 4 +--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/app/Resources/en.lproj/PlotDevicePreferences.xib b/app/Resources/en.lproj/PlotDevicePreferences.xib index f05d4665..b61ef180 100644 --- a/app/Resources/en.lproj/PlotDevicePreferences.xib +++ b/app/Resources/en.lproj/PlotDevicePreferences.xib @@ -53,7 +53,7 @@ - + @@ -155,16 +155,16 @@ +
@@ -211,7 +244,7 @@ - + diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index 5451fe89..776e3324 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -11,6 +11,7 @@ from ..lib.cocoa import * +from .preferences import get_default from .editor import OutputTextView, EditorView from .widgets import DashboardController, ExportSheet from .views import FullscreenWindow, FullscreenView @@ -80,7 +81,7 @@ def updateChangeCount_(self, chg): ## Autosave & restoration on re-launch def autosavesInPlace(self): - return True + return get_default('autosave') def encodeRestorableStateWithCoder_(self, coder): super(PlotDeviceDocument, self).encodeRestorableStateWithCoder_(coder) diff --git a/plotdevice/gui/preferences.py b/plotdevice/gui/preferences.py index fd99c90b..7986469f 100644 --- a/plotdevice/gui/preferences.py +++ b/plotdevice/gui/preferences.py @@ -27,6 +27,7 @@ def defaultDefaults(): "plotdevice:bindings":"mac", "plotdevice:font-name":"Menlo", "plotdevice:font-size":11, + "plotdevice:autosave":True } NSUserDefaults.standardUserDefaults().registerDefaults_(defaultDefaults()) THEMES = None # to be filled in as needed @@ -88,6 +89,8 @@ class PlotDevicePreferencesController(NSWindowController): bindingsMenu = IBOutlet() fontMenu = IBOutlet() fontSizeMenu = IBOutlet() + autosaveEnabledRadio = IBOutlet() + autosaveDisabledRadio = IBOutlet() toolPath = IBOutlet() toolAction = IBOutlet() toolBoilerplate = IBOutlet() @@ -107,6 +110,7 @@ def awakeFromNib(self): self.checkThemes() self.checkFonts() self.checkBindings() + self.checkAutosave() self.checkUpdater() @objc.python_method @@ -149,6 +153,22 @@ def bindingsChanged_(self, sender): set_default('bindings', style) self._notify('BindingsChanged') + def checkAutosave(self): + enabled = get_default('autosave') + print('autosave ==', enabled) + if enabled: + self.autosaveEnabledRadio.setState_(NSOnState) + else: + self.autosaveDisabledRadio.setState_(NSOnState) + self.autosaveEnabledRadio.setState_(NSOnState if enabled else NSOffState) + + @IBAction + def autosaveChanged_(self, sender): + enabled = sender.tag() == 1 + print('autosave ->', enabled) + set_default('autosave', enabled) + # self._notify('AutosaveChanged') + def checkThemes(self): light = sorted([t for t,m in THEMES.items() if not m['dark']], reverse=True) dark = sorted([t for t,m in THEMES.items() if m['dark']], reverse=True) From 940aad5fd2101879410fc42bf2c0d008dc21e3a0 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 1 Jul 2022 16:47:12 -0400 Subject: [PATCH 089/226] streamline setup for running from the sdist --- plotdevice/lib/__init__.py | 13 ++++++++----- plotdevice/run/__init__.py | 21 +++------------------ setup.py | 25 ++++++++++++++++++++++++- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/plotdevice/lib/__init__.py b/plotdevice/lib/__init__.py index c8198b89..cef514b6 100644 --- a/plotdevice/lib/__init__.py +++ b/plotdevice/lib/__init__.py @@ -2,16 +2,19 @@ from os.path import abspath, dirname, exists from glob import glob +_libdir = abspath(dirname(__file__)) try: # if the lib files are missing, presume we're in the source dist and look in its build dir - if not glob('%s/*.so'%dirname(__file__)): - sys.path.append(abspath('%s/../../build/lib/'%dirname(__file__))) - sys.path.append(abspath('%s/plotdevice/lib'%sys.path[-1])) + if not glob('%s/*.so' % _libdir): + build_dir = '%s/../../build/lib/plotdevice/lib' % _libdir + if exists(build_dir): sys.path.append(abspath(build_dir)) else: - sys.path.append(abspath(dirname(__file__))) + sys.path.append(_libdir) from . import io, pathmatics, foundry # make sure the c-extensions are accessible except ImportError: - missing = "Missing C extensions (cPathmatics.so & friends) in %s" % abspath(dirname(__file__)) + missing = "Missing C extensions (cPathmatics.so & friends) in %s" % _libdir + if exists('%s/../../setup.py' % _libdir): + missing += "\nBuild the plotdevice module with `python3 setup.py build` before attempting import it." raise ImportError(missing) # allow Libraries to request a _ctx reference diff --git a/plotdevice/run/__init__.py b/plotdevice/run/__init__.py index 2ecd5ae7..c7f062af 100644 --- a/plotdevice/run/__init__.py +++ b/plotdevice/run/__init__.py @@ -6,25 +6,10 @@ # test the sys.path by attempting to load a PyObjC submodule... from Foundation import * except ImportError: - deps_dir = join(dirname(__file__), '../../app/deps') - if exists(deps_dir): + setup_py = join(dirname(__file__), '../../setup.py') + if exists(setup_py): # if run from the sdist, install pyobjc et al. in a venv at app/deps/local - import platform - venv_dir = join(deps_dir, 'local', platform.python_version()) - if not exists(venv_dir): - import importlib.util - spec = importlib.util.spec_from_file_location("setup", join(dirname(__file__), '../../setup.py')) - setup = importlib.util.module_from_spec(spec) - spec.loader.exec_module(setup) - - import venv - venv.create(venv_dir, symlinks=True, with_pip=True) - PIP = '%s/bin/pip3' % venv_dir - call([PIP, 'install', '--upgrade', 'pip']) - call([PIP, '--isolated', 'install', *setup.config['install_requires']]) - - # use the venv's site directory - site_path = getoutput('%s/bin/python3 -c "import site; print(site.getsitepackages()[0])"' % venv_dir) + site_path = getoutput('{py} {setup} -q env'.format(py=sys.executable, setup=setup_py)) site.addsitedir(site_path) from Foundation import * else: diff --git a/setup.py b/setup.py index ca498073..69768bce 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,7 @@ from distutils.command.build_py import build_py from pkg_resources import DistributionNotFound from os.path import join, exists, dirname, basename, abspath, getmtime -from subprocess import call +from subprocess import call, getoutput import plotdevice @@ -177,6 +177,28 @@ def run(self): os.system('find plotdevice -name \*.pyc -exec rm {} \;') os.system('find plotdevice -name __pycache__ -type d -prune -exec rmdir {} \;') +class LocalEnvCommand(Command): + description = "set up app/deps/local env to allow for running from the sdist" + user_options = [] + def initialize_options(self): + pass + def finalize_options(self): + pass + def run(self): + import platform + venv_dir = join('app/deps/local', platform.python_version()) + if not exists(venv_dir): + import venv + venv.create(venv_dir, symlinks=True, with_pip=True) + PIP = '%s/bin/pip3' % venv_dir + call([PIP, 'install', '-q', '--upgrade', 'pip']) + call([PIP, '--isolated', 'install', '-q', *config['install_requires']]) + + # use the venv's site directory + site_path = getoutput('%s/bin/python3 -c "import site; print(site.getsitepackages()[0])"' % venv_dir) + print(site_path) + + from setuptools.command.sdist import sdist class BuildDistCommand(sdist): def finalize_options(self): @@ -384,6 +406,7 @@ def run(self): 'dist': DistCommand, 'sdist': BuildDistCommand, 'test': TestCommand, + 'env': LocalEnvCommand, }, ) From d3ef0b51494f168b49f1a41a5756e1579711bf1b Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 1 Jul 2022 19:52:41 -0400 Subject: [PATCH 090/226] consolidate c-extensions into one .so --- .gitignore | 1 + app/deps/IO/module.m | 19 ----- app/deps/IO/setup.py | 13 --- app/deps/build.py | 85 ------------------- .../{ => extensions}/foundry/Vandercook.h | 0 .../{ => extensions}/foundry/Vandercook.m | 0 app/deps/{IO => extensions/io}/AnimatedGif.h | 0 app/deps/{IO => extensions/io}/AnimatedGif.m | 0 app/deps/{IO => extensions/io}/Pages.h | 0 app/deps/{IO => extensions/io}/Pages.m | 0 app/deps/{IO => extensions/io}/SysAdmin.h | 0 app/deps/{IO => extensions/io}/SysAdmin.m | 0 app/deps/{IO => extensions/io}/Video.h | 0 app/deps/{IO => extensions/io}/Video.m | 0 app/deps/extensions/module.m | 36 ++++++++ app/deps/{ => extensions}/pathmatics/gpc.c | 0 app/deps/{ => extensions}/pathmatics/gpc.h | 0 app/deps/extensions/pathmatics/pathmatics.h | 16 ++++ .../{ => extensions}/pathmatics/pathmatics.m | 75 ++++------------ .../pathmatics/pathmatics_test.py | 0 app/deps/extensions/setup.py | 18 ++++ app/deps/foundry/module.m | 18 ---- app/deps/foundry/setup.py | 13 --- app/deps/pathmatics/setup.py | 10 --- plotdevice/lib/__init__.py | 21 ++--- plotdevice/lib/foundry.py | 2 +- plotdevice/lib/io.py | 2 +- plotdevice/lib/pathmatics.py | 8 +- plotdevice/util/__init__.py | 2 +- setup.py | 16 ++-- 30 files changed, 109 insertions(+), 246 deletions(-) delete mode 100644 app/deps/IO/module.m delete mode 100644 app/deps/IO/setup.py delete mode 100644 app/deps/build.py rename app/deps/{ => extensions}/foundry/Vandercook.h (100%) rename app/deps/{ => extensions}/foundry/Vandercook.m (100%) rename app/deps/{IO => extensions/io}/AnimatedGif.h (100%) rename app/deps/{IO => extensions/io}/AnimatedGif.m (100%) rename app/deps/{IO => extensions/io}/Pages.h (100%) rename app/deps/{IO => extensions/io}/Pages.m (100%) rename app/deps/{IO => extensions/io}/SysAdmin.h (100%) rename app/deps/{IO => extensions/io}/SysAdmin.m (100%) rename app/deps/{IO => extensions/io}/Video.h (100%) rename app/deps/{IO => extensions/io}/Video.m (100%) create mode 100644 app/deps/extensions/module.m rename app/deps/{ => extensions}/pathmatics/gpc.c (100%) rename app/deps/{ => extensions}/pathmatics/gpc.h (100%) create mode 100644 app/deps/extensions/pathmatics/pathmatics.h rename app/deps/{ => extensions}/pathmatics/pathmatics.m (89%) rename app/deps/{ => extensions}/pathmatics/pathmatics_test.py (100%) create mode 100644 app/deps/extensions/setup.py delete mode 100644 app/deps/foundry/module.m delete mode 100644 app/deps/foundry/setup.py delete mode 100644 app/deps/pathmatics/setup.py diff --git a/.gitignore b/.gitignore index 92f3d121..e01fceb8 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ build/ dist/ plotdevice.egg-info +/*.so app/deps/vendor/Sparkle* app/deps/vendor/*.tar.gz app/deps/embed/Python.framework diff --git a/app/deps/IO/module.m b/app/deps/IO/module.m deleted file mode 100644 index d11e28b8..00000000 --- a/app/deps/IO/module.m +++ /dev/null @@ -1,19 +0,0 @@ -#import -#define MOD_ERROR_VAL NULL -#define MOD_SUCCESS_VAL(val) val -#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void) -#define MOD_DEF(ob, name, doc, methods) \ - static struct PyModuleDef moduledef = { \ - PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \ - ob = PyModule_Create(&moduledef); - -PyMethodDef methods[] = { - {NULL, NULL}, -}; - -// void initcIO() -MOD_INIT(cIO){ - PyObject *m; - MOD_DEF(m, "cIO", "Image and video export routines", methods) - return MOD_SUCCESS_VAL(m); -} diff --git a/app/deps/IO/setup.py b/app/deps/IO/setup.py deleted file mode 100644 index e514bf7e..00000000 --- a/app/deps/IO/setup.py +++ /dev/null @@ -1,13 +0,0 @@ -from setuptools import setup -from setuptools.extension import Extension - -sources = ['module.m', 'SysAdmin.m', 'Pages.m', 'AnimatedGif.m', 'Video.m'] -frameworks = ['AppKit', 'Foundation', 'Quartz', 'Security', 'AVFoundation', 'CoreMedia', 'CoreVideo'] -flags = sum((['-framework', fmwk] for fmwk in frameworks), []) -cIO = Extension('cIO', sources=sources, extra_link_args=flags) - -setup (name = "cIO", - version = "1.0", - author = "Christian Swinehart", - description = "Image and video export routines.", - ext_modules = [cIO]) \ No newline at end of file diff --git a/app/deps/build.py b/app/deps/build.py deleted file mode 100644 index 2a019ab1..00000000 --- a/app/deps/build.py +++ /dev/null @@ -1,85 +0,0 @@ -from __future__ import print_function -import os -import sys -import errno -from subprocess import call -from glob import glob -from os.path import dirname, basename, abspath, isdir, join -from shutil import rmtree - -DEPS = dirname(abspath(__file__)) -PYTHON = sys.executable - -## Helpers ## - -def build(extension): - """Run setup.py within a given c-extension's folder""" - result = call([PYTHON, 'setup.py', '-q', 'build'], cwd=join(DEPS, extension)) - if result > 0: - raise OSError("Could not build %s" % extension) - -def make(target, **envvars): - """Build the specified target in the vendor Makefile""" - os.chdir('%s/vendor'%DEPS) - env = {"PYTHON":PYTHON, "PATH":os.environ['PATH']} - env.update(envvars) - result = call('make -s %s'%target, env=env, shell=True) - if result > 0: - raise OSError("Could not make %s" % target) - os.chdir(DEPS) - -def clean(): - """Delete build folders in dependency subdirs""" - build_dirs = glob('%s/*/build'%DEPS) - for build_dir in build_dirs: - lib_name = dirname(build_dir) - print("Cleaning", lib_name) - call('rm -r "%s"' % build_dir) - make('clean') - -## Recipes ## - -def build_extensions(): - # Find all setup.py files in the current folder - print("\nCompiling required c-extensions") - for setup_script in glob('%s/*/setup.py'%DEPS): - lib_name = basename(dirname(setup_script)) - print("Building %s..."% lib_name) - build(lib_name) - -def install_http_libs(mod_root): - """Install the http modules into the Resources/python subdir""" - print("Bundling requests module...") - make('http', DSTROOT=mod_root) # makefile uses DSTROOT to target install - -def install_extensions(ext_root): - """Install the c-extensions and PyObjC site dir within the plotdevice module""" - # Make sure the destination folder exists. - if not isdir(ext_root): - os.makedirs(ext_root) - - # Copy all build results to plotdevice/lib dir - for extension in glob("%s/*/build/lib*"%DEPS): - cmd = 'cp -p %s/* %s' % (extension, ext_root) - result = call(cmd, shell=True) - if result > 0: - lib_name = dirname(dirname(extension)) - raise OSError("Could not copy %s" % lib_name) - print() - -def main(): - if len(sys.argv)>1: - arg = sys.argv[1] - if arg=='clean': - print("Cleaning dependency build files...") - clean() - else: - mod_root = arg - ext_root = join(mod_root, 'plotdevice/lib') - build_extensions() - install_extensions(ext_root) - else: - print("usage: python build.py ") - -if __name__=='__main__': - main() \ No newline at end of file diff --git a/app/deps/foundry/Vandercook.h b/app/deps/extensions/foundry/Vandercook.h similarity index 100% rename from app/deps/foundry/Vandercook.h rename to app/deps/extensions/foundry/Vandercook.h diff --git a/app/deps/foundry/Vandercook.m b/app/deps/extensions/foundry/Vandercook.m similarity index 100% rename from app/deps/foundry/Vandercook.m rename to app/deps/extensions/foundry/Vandercook.m diff --git a/app/deps/IO/AnimatedGif.h b/app/deps/extensions/io/AnimatedGif.h similarity index 100% rename from app/deps/IO/AnimatedGif.h rename to app/deps/extensions/io/AnimatedGif.h diff --git a/app/deps/IO/AnimatedGif.m b/app/deps/extensions/io/AnimatedGif.m similarity index 100% rename from app/deps/IO/AnimatedGif.m rename to app/deps/extensions/io/AnimatedGif.m diff --git a/app/deps/IO/Pages.h b/app/deps/extensions/io/Pages.h similarity index 100% rename from app/deps/IO/Pages.h rename to app/deps/extensions/io/Pages.h diff --git a/app/deps/IO/Pages.m b/app/deps/extensions/io/Pages.m similarity index 100% rename from app/deps/IO/Pages.m rename to app/deps/extensions/io/Pages.m diff --git a/app/deps/IO/SysAdmin.h b/app/deps/extensions/io/SysAdmin.h similarity index 100% rename from app/deps/IO/SysAdmin.h rename to app/deps/extensions/io/SysAdmin.h diff --git a/app/deps/IO/SysAdmin.m b/app/deps/extensions/io/SysAdmin.m similarity index 100% rename from app/deps/IO/SysAdmin.m rename to app/deps/extensions/io/SysAdmin.m diff --git a/app/deps/IO/Video.h b/app/deps/extensions/io/Video.h similarity index 100% rename from app/deps/IO/Video.h rename to app/deps/extensions/io/Video.h diff --git a/app/deps/IO/Video.m b/app/deps/extensions/io/Video.m similarity index 100% rename from app/deps/IO/Video.m rename to app/deps/extensions/io/Video.m diff --git a/app/deps/extensions/module.m b/app/deps/extensions/module.m new file mode 100644 index 00000000..a6ad8ddb --- /dev/null +++ b/app/deps/extensions/module.m @@ -0,0 +1,36 @@ +#import +#import "pathmatics/pathmatics.h" + +// Pathmatics routines written for NodeBox by Tom De Smedt and Frederik De Bleser +PyMethodDef methods[] = { + // pathmatics + {"linepoint", cPathmatics_linepoint, METH_VARARGS, "Calculate linepoint."}, + {"linelength", cPathmatics_linelength, METH_VARARGS, "Calculate linelength."}, + {"curvepoint", cPathmatics_curvepoint, METH_VARARGS, "Calculate curvepoint."}, + {"curvelength", cPathmatics_curvelength, METH_VARARGS, "Calculate curvelength."}, + // polymagic + {"intersects", cPathmatics_intersects, METH_VARARGS, "Check if two NSBezierPaths intersect."}, + {"union", cPathmatics_union, METH_VARARGS, "Calculates the union of two NSBezierPaths."}, + {"intersect", cPathmatics_intersect, METH_VARARGS, "Calculates the intersection of two NSBezierPaths."}, + {"difference", cPathmatics_difference, METH_VARARGS, "Calculates the difference of two NSBezierPaths."}, + {"xor", cPathmatics_xor, METH_VARARGS, "Calculates the exclusive or of two NSBezierPaths."}, + // trig + {"fast_inverse_sqrt", fast_inverse_sqrt, METH_VARARGS }, + {"angle", angle, METH_VARARGS }, + {"distance", distance, METH_VARARGS }, + {"coordinates", coordinates, METH_VARARGS }, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +PyMODINIT_FUNC PyInit__plotdevice(void){ + static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, "_plotdevice", "Typography, image/video export, and bezier math routines", -1, methods + }; + + PyObject *m = PyModule_Create(&moduledef); + PyObject *err = PyErr_NewException("cPathmatics.error", NULL, NULL); + Py_INCREF(err); + PyModule_AddObject(m, "error", err); + + return m; +} diff --git a/app/deps/pathmatics/gpc.c b/app/deps/extensions/pathmatics/gpc.c similarity index 100% rename from app/deps/pathmatics/gpc.c rename to app/deps/extensions/pathmatics/gpc.c diff --git a/app/deps/pathmatics/gpc.h b/app/deps/extensions/pathmatics/gpc.h similarity index 100% rename from app/deps/pathmatics/gpc.h rename to app/deps/extensions/pathmatics/gpc.h diff --git a/app/deps/extensions/pathmatics/pathmatics.h b/app/deps/extensions/pathmatics/pathmatics.h new file mode 100644 index 00000000..c51f699d --- /dev/null +++ b/app/deps/extensions/pathmatics/pathmatics.h @@ -0,0 +1,16 @@ +#import +#include + +PyObject * cPathmatics_linepoint(PyObject *self, PyObject *args); +PyObject * cPathmatics_linelength(PyObject *self, PyObject *args); +PyObject * cPathmatics_curvepoint(PyObject *self, PyObject *args); +PyObject * cPathmatics_curvelength(PyObject *self, PyObject *args); +PyObject * cPathmatics_intersects(PyObject *self, PyObject *args); +PyObject * cPathmatics_union(PyObject *self, PyObject *args); +PyObject * cPathmatics_intersect(PyObject *self, PyObject *args); +PyObject * cPathmatics_difference(PyObject *self, PyObject *args); +PyObject * cPathmatics_xor(PyObject *self, PyObject *args); +PyObject * fast_inverse_sqrt(PyObject *self, PyObject *args); +PyObject * angle(PyObject *self, PyObject *args); +PyObject * distance(PyObject *self, PyObject *args); +PyObject * coordinates(PyObject *self, PyObject *args); diff --git a/app/deps/pathmatics/pathmatics.m b/app/deps/extensions/pathmatics/pathmatics.m similarity index 89% rename from app/deps/pathmatics/pathmatics.m rename to app/deps/extensions/pathmatics/pathmatics.m index df7e6e14..b2d116cd 100644 --- a/app/deps/pathmatics/pathmatics.m +++ b/app/deps/extensions/pathmatics/pathmatics.m @@ -1,6 +1,4 @@ -#import -#include - +#import "pathmatics.h" #include #include #include "gpc.h" @@ -103,7 +101,7 @@ void _curvelength(double x0, double y0, double x1, double y1, *out_length = length; } -static PyObject * +PyObject * cPathmatics_linepoint(PyObject *self, PyObject *args) { double t, x0, y0, x1, y1; @@ -118,7 +116,7 @@ void _curvelength(double x0, double y0, double x1, double y1, return Py_BuildValue("dd", out_x, out_y); } -static PyObject * +PyObject * cPathmatics_linelength(PyObject *self, PyObject *args) { double x0, y0, x1, y1; @@ -134,7 +132,7 @@ void _curvelength(double x0, double y0, double x1, double y1, } -static PyObject * +PyObject * cPathmatics_curvepoint(PyObject *self, PyObject *args) { double t, x0, y0, x1, y1, x2, y2, x3, y3, handles = 0; @@ -159,7 +157,7 @@ void _curvelength(double x0, double y0, double x1, double y1, } } -static PyObject * +PyObject * cPathmatics_curvelength(PyObject *self, PyObject *args) { double x0, y0, x1, y1, x2, y2, x3, y3; @@ -175,7 +173,7 @@ void _curvelength(double x0, double y0, double x1, double y1, return Py_BuildValue("d", out_length); } -static PyObject *PathmaticsError; +PyObject *PathmaticsError; // ploymagic @@ -426,7 +424,7 @@ void _curvelength(double x0, double y0, double x1, double y1, return true; } -static PyObject * +PyObject * build_objc_instance(PyTypeObject *ob_type, id obj) { // Because we don't want to include PyObjC on compilation, // we hack around the object creation by making our own @@ -439,7 +437,7 @@ void _curvelength(double x0, double y0, double x1, double y1, } // Check if two NSBezierPaths intersect. -static PyObject * +PyObject * cPathmatics_intersects(PyObject *self, PyObject *args) { NSBezierPath *path1, *path2; @@ -511,28 +509,28 @@ void _curvelength(double x0, double y0, double x1, double y1, } // Returns the union of two NSBezierPaths as a new NSBezierPath. -static PyObject * +PyObject * cPathmatics_union(PyObject *self, PyObject *args) { return cPathmatics_operation(self, args, GPC_UNION); } // Returns the intersection of two NSBezierPaths as a new NSBezierPath. -static PyObject * +PyObject * cPathmatics_intersect(PyObject *self, PyObject *args) { return cPathmatics_operation(self, args, GPC_INT); } // Returns the difference of two NSBezierPaths as a new NSBezierPath. -static PyObject * +PyObject * cPathmatics_difference(PyObject *self, PyObject *args) { return cPathmatics_operation(self, args, GPC_DIFF); } // Returns the exclusive or of two NSBezierPaths as a new NSBezierPath. -static PyObject * +PyObject * cPathmatics_xor(PyObject *self, PyObject *args) { return cPathmatics_operation(self, args, GPC_XOR); @@ -613,7 +611,7 @@ float _fast_inverse_sqrt(float x) { } // we're not running doom on a 32 bit cpu anymore... -static PyObject * +PyObject * fast_inverse_sqrt(PyObject *self, PyObject *args) { double x; if (!PyArg_ParseTuple(args, "d", &x)) @@ -626,7 +624,7 @@ float _fast_inverse_sqrt(float x) { void _angle(double x0, double y0, double x1, double y1, double *a) { *a = atan2(y1-y0, x1-x0) / M_PI * 180; } -static PyObject * +PyObject * angle(PyObject *self, PyObject *args) { double x0, y0, x1, y1, a; if (!PyArg_ParseTuple(args, "dddd", &x0, &y0, &x1, &y1)) @@ -639,7 +637,7 @@ void _angle(double x0, double y0, double x1, double y1, double *a) { void _distance(double x0, double y0, double x1, double y1, double *d) { *d = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); } -static PyObject * +PyObject * distance(PyObject *self, PyObject *args) { double x0, y0, x1, y1, d; if (!PyArg_ParseTuple(args, "dddd", &x0, &y0, &x1, &y1)) @@ -653,7 +651,7 @@ void _coordinates(double x0, double y0, double d, double a, double *x1, double * *x1 = x0 + cos(a/180*M_PI) * d; *y1 = y0 + sin(a/180*M_PI) * d; } -static PyObject * +PyObject * coordinates(PyObject *self, PyObject *args) { double x0, y0, d, a, x1, y1; if (!PyArg_ParseTuple(args, "dddd", &x0, &y0, &d, &a)) @@ -692,44 +690,3 @@ + (CGPathRef)cgPath:(NSBezierPath *)nsPath{ return immutablePath; } @end - - -#define MOD_ERROR_VAL NULL -#define MOD_SUCCESS_VAL(val) val -#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void) -#define MOD_DEF(ob, name, doc, methods) \ - static struct PyModuleDef moduledef = { \ - PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \ - ob = PyModule_Create(&moduledef); - -static PyMethodDef PathmaticsMethods[] = { - // pathmatics - {"linepoint", cPathmatics_linepoint, METH_VARARGS, "Calculate linepoint."}, - {"linelength", cPathmatics_linelength, METH_VARARGS, "Calculate linelength."}, - {"curvepoint", cPathmatics_curvepoint, METH_VARARGS, "Calculate curvepoint."}, - {"curvelength", cPathmatics_curvelength, METH_VARARGS, "Calculate curvelength."}, - // polymagic - {"intersects", cPathmatics_intersects, METH_VARARGS, "Check if two NSBezierPaths intersect."}, - {"union", cPathmatics_union, METH_VARARGS, "Calculates the union of two NSBezierPaths."}, - {"intersect", cPathmatics_intersect, METH_VARARGS, "Calculates the intersection of two NSBezierPaths."}, - {"difference", cPathmatics_difference, METH_VARARGS, "Calculates the difference of two NSBezierPaths."}, - {"xor", cPathmatics_xor, METH_VARARGS, "Calculates the exclusive or of two NSBezierPaths."}, - // trig - { "fast_inverse_sqrt", fast_inverse_sqrt, METH_VARARGS }, - { "angle", angle, METH_VARARGS }, - { "distance", distance, METH_VARARGS }, - { "coordinates", coordinates, METH_VARARGS }, - {NULL, NULL, 0, NULL} /* Sentinel */ -}; - -MOD_INIT(cPathmatics){ - PyObject *m; - - MOD_DEF(m, "cPathmatics", "Fast bezier math routines", PathmaticsMethods) - - PathmaticsError = PyErr_NewException("cPathmatics.error", NULL, NULL); - Py_INCREF(PathmaticsError); - PyModule_AddObject(m, "error", PathmaticsError); - - return MOD_SUCCESS_VAL(m); -} diff --git a/app/deps/pathmatics/pathmatics_test.py b/app/deps/extensions/pathmatics/pathmatics_test.py similarity index 100% rename from app/deps/pathmatics/pathmatics_test.py rename to app/deps/extensions/pathmatics/pathmatics_test.py diff --git a/app/deps/extensions/setup.py b/app/deps/extensions/setup.py new file mode 100644 index 00000000..8b17ca45 --- /dev/null +++ b/app/deps/extensions/setup.py @@ -0,0 +1,18 @@ +from setuptools import setup +from setuptools.extension import Extension + +sources = [ + 'module.m', + 'io/SysAdmin.m', 'io/Pages.m', 'io/AnimatedGif.m', 'io/Video.m', + 'foundry/Vandercook.m', + 'pathmatics/gpc.c', 'pathmatics/pathmatics.m' +] +frameworks = ['AppKit', 'Foundation', 'Quartz', 'Security', 'AVFoundation', 'CoreMedia', 'CoreVideo', 'CoreText'] +flags = sum((['-framework', fmwk] for fmwk in frameworks), []) +_plotdevice = Extension('_plotdevice', sources=sources, extra_link_args=flags) + +setup (name = "_plotdevice", + version = "1.0", + author = "Christian Swinehart", + description = "Typography, image/video export, and bezier math routines.", + ext_modules = [_plotdevice]) \ No newline at end of file diff --git a/app/deps/foundry/module.m b/app/deps/foundry/module.m deleted file mode 100644 index 4e9f4d0d..00000000 --- a/app/deps/foundry/module.m +++ /dev/null @@ -1,18 +0,0 @@ -#import -#define MOD_ERROR_VAL NULL -#define MOD_SUCCESS_VAL(val) val -#define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void) -#define MOD_DEF(ob, name, doc, methods) \ - static struct PyModuleDef moduledef = { \ - PyModuleDef_HEAD_INIT, name, doc, -1, methods, }; \ - ob = PyModule_Create(&moduledef); - -PyMethodDef methods[] = { - {NULL, NULL}, -}; - -MOD_INIT(cFoundry){ - PyObject *m; - MOD_DEF(m, "cFoundry", "Dept. of Typography & Tracing", methods) - return MOD_SUCCESS_VAL(m); -} diff --git a/app/deps/foundry/setup.py b/app/deps/foundry/setup.py deleted file mode 100644 index 1b5a977d..00000000 --- a/app/deps/foundry/setup.py +++ /dev/null @@ -1,13 +0,0 @@ -from setuptools import setup -from setuptools.extension import Extension - -sources = ['module.m', 'Vandercook.m', ] -frameworks = ['AppKit', 'Foundation', 'Quartz', 'CoreText',] -flags = sum((['-framework', fmwk] for fmwk in frameworks), []) -cFoundry = Extension('cFoundry', sources=sources, extra_link_args=flags) - -setup (name = "cFoundry", - version = "1.0", - author = "Christian Swinehart", - description = "Dept. of Typography & Tracing.", - ext_modules = [cFoundry]) \ No newline at end of file diff --git a/app/deps/pathmatics/setup.py b/app/deps/pathmatics/setup.py deleted file mode 100644 index a0020cf0..00000000 --- a/app/deps/pathmatics/setup.py +++ /dev/null @@ -1,10 +0,0 @@ -from setuptools import setup -from setuptools.extension import Extension - -cPathmatics = Extension("cPathmatics", sources = ["pathmatics.m", "gpc.c"], extra_link_args=['-framework', 'Cocoa']) - -setup (name = "pathmatics", - version = "1.0", - author = "Written for NodeBox by Tom De Smedt and Frederik De Bleser", - description = "Fast bezier math routines.", - ext_modules = [cPathmatics]) \ No newline at end of file diff --git a/plotdevice/lib/__init__.py b/plotdevice/lib/__init__.py index cef514b6..6e856e44 100644 --- a/plotdevice/lib/__init__.py +++ b/plotdevice/lib/__init__.py @@ -1,21 +1,16 @@ import sys -from os.path import abspath, dirname, exists +from os.path import abspath, dirname, exists, join from glob import glob -_libdir = abspath(dirname(__file__)) try: - # if the lib files are missing, presume we're in the source dist and look in its build dir - if not glob('%s/*.so' % _libdir): - build_dir = '%s/../../build/lib/plotdevice/lib' % _libdir - if exists(build_dir): sys.path.append(abspath(build_dir)) - else: - sys.path.append(_libdir) - from . import io, pathmatics, foundry # make sure the c-extensions are accessible + import _plotdevice # make sure the c-extensions are accessible except ImportError: - missing = "Missing C extensions (cPathmatics.so & friends) in %s" % _libdir - if exists('%s/../../setup.py' % _libdir): - missing += "\nBuild the plotdevice module with `python3 setup.py build` before attempting import it." - raise ImportError(missing) + setup_py = join(dirname(__file__), '../../setup.py') + if exists(setup_py): + from subprocess import call + # call('{py} {setup} build_ext --inplace'.format(py=sys.executable, setup=setup_py)) + call([sys.executable, setup_py, 'build_ext', '--inplace']) + import _plotdevice # allow Libraries to request a _ctx reference def register(module): diff --git a/plotdevice/lib/foundry.py b/plotdevice/lib/foundry.py index 9ca6c6cb..8582df26 100644 --- a/plotdevice/lib/foundry.py +++ b/plotdevice/lib/foundry.py @@ -8,9 +8,9 @@ from collections import namedtuple, OrderedDict as odict, defaultdict as ddict from .cocoa import * from ..util import numlike -import cFoundry from plotdevice import DeviceError +import _plotdevice __all__ = ["font_family", "font_encoding", "font_face", "best_face", "family_names", "family_members", "family_name", "standardized", "sanitized", diff --git a/plotdevice/lib/io.py b/plotdevice/lib/io.py index f098b395..7d888c3a 100644 --- a/plotdevice/lib/io.py +++ b/plotdevice/lib/io.py @@ -1,6 +1,6 @@ import objc, os, re +import _plotdevice -import cIO for cls in ["AnimatedGif", "Pages", "SysAdmin", "Video"]: globals()[cls] = objc.lookUpClass(cls) diff --git a/plotdevice/lib/pathmatics.py b/plotdevice/lib/pathmatics.py index e2187c61..ecf91ba5 100644 --- a/plotdevice/lib/pathmatics.py +++ b/plotdevice/lib/pathmatics.py @@ -3,8 +3,6 @@ from .cocoa import CGPathRelease from ..gfx.geometry import Point from ..gfx.bezier import Bezier, Curve -import cPathmatics - # Quartz loop speedups @@ -20,7 +18,7 @@ def convert_path(ns_path): try: # Faster C versions. - from .cPathmatics import fast_inverse_sqrt, angle, distance, coordinates + from _plotdevice import fast_inverse_sqrt, angle, distance, coordinates isqrt = inverse_sqrt = fast_inverse_sqrt except ImportError: from math import degrees, atan2 @@ -53,9 +51,9 @@ def reflect(x0, y0, x1, y1, d=1.0, a=180): # Ye olde polymagic -from cPathmatics import intersects, union, intersect, difference, xor +from _plotdevice import intersects, union, intersect, difference, xor try: - from cPathmatics import linepoint, linelength, curvepoint, curvelength + from _plotdevice import linepoint, linelength, curvepoint, curvelength except ImportError: from math import sqrt, pow diff --git a/plotdevice/util/__init__.py b/plotdevice/util/__init__.py index 59f2c9b9..0cbb33d7 100644 --- a/plotdevice/util/__init__.py +++ b/plotdevice/util/__init__.py @@ -314,7 +314,7 @@ def rsrc_path(resource=None): if not exists(rsrc_root): # hack to run in-place in sdist from glob import glob - for pth in glob(join(module_root, '../build/lib/plotdevice/rsrc')): + for pth in glob(join(module_root, '../build/lib*/plotdevice/rsrc')): rsrc_root = abspath(pth) break else: diff --git a/setup.py b/setup.py index 69768bce..990fd2bf 100644 --- a/setup.py +++ b/setup.py @@ -218,14 +218,7 @@ def run(self): class BuildCommand(build_py): def run(self): - # if 'build' was called explicitly, flag that requests etc. should be fetched - if 'install' not in sys.argv: - os.environ['ACTION'] = 'build' - - # compile the dependencies into build/lib/plotdevice/lib... - self.spawn([sys.executable, 'app/deps/build.py', abspath(self.build_lib)]) - - # ...then let the real build_py routine do its thing + # let the real build_py routine do its thing build_py.run(self) # include some ui resources for running a script from the command line @@ -374,6 +367,12 @@ def run(self): print("\nBuilt PlotDevice.app, %s, and release.json in ./dist" % basename(ZIP)) +from glob import glob +from setuptools.extension import Extension +sources = ['app/deps/extensions/module.m', *glob('app/deps/extensions/*/*.[cm]')] +frameworks = ['AppKit', 'Foundation', 'Quartz', 'Security', 'AVFoundation', 'CoreMedia', 'CoreVideo', 'CoreText'] +flags = sum((['-framework', fmwk] for fmwk in frameworks), []) +_plotdevice = Extension('_plotdevice', sources=sources, extra_link_args=flags) # common config between module and app builds config = dict( @@ -387,6 +386,7 @@ def run(self): license = LICENSE, classifiers = CLASSIFIERS, packages = find_packages(exclude=['tests']), + ext_modules = [_plotdevice], install_requires = [ 'requests', 'cachecontrol', From d77cc689ba63b481d9a470c6bd77dd1f40f78295 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 1 Jul 2022 21:44:08 -0400 Subject: [PATCH 091/226] add `setup.py dev` command to run from repo - invoked on import by the `run` module if it can't find pyobjc, otherwise it adds the existing dev environment to sys.path - the other remaining piece of path hackery is mapping in the rsrc dir from the build directory in .util/__init__ --- plotdevice/lib/__init__.py | 13 +-------- plotdevice/lib/foundry.py | 1 - plotdevice/lib/io.py | 1 - plotdevice/run/__init__.py | 14 ++++++---- plotdevice/util/__init__.py | 2 +- plotdevice/util/readers.py | 21 +++++--------- setup.py | 55 +++++++++++++++++++------------------ 7 files changed, 47 insertions(+), 60 deletions(-) diff --git a/plotdevice/lib/__init__.py b/plotdevice/lib/__init__.py index 6e856e44..8e6f11f2 100644 --- a/plotdevice/lib/__init__.py +++ b/plotdevice/lib/__init__.py @@ -1,16 +1,5 @@ import sys -from os.path import abspath, dirname, exists, join -from glob import glob - -try: - import _plotdevice # make sure the c-extensions are accessible -except ImportError: - setup_py = join(dirname(__file__), '../../setup.py') - if exists(setup_py): - from subprocess import call - # call('{py} {setup} build_ext --inplace'.format(py=sys.executable, setup=setup_py)) - call([sys.executable, setup_py, 'build_ext', '--inplace']) - import _plotdevice +import _plotdevice # make sure the c-extensions are accessible for the submodules # allow Libraries to request a _ctx reference def register(module): diff --git a/plotdevice/lib/foundry.py b/plotdevice/lib/foundry.py index 8582df26..85780bbd 100644 --- a/plotdevice/lib/foundry.py +++ b/plotdevice/lib/foundry.py @@ -10,7 +10,6 @@ from ..util import numlike from plotdevice import DeviceError -import _plotdevice __all__ = ["font_family", "font_encoding", "font_face", "best_face", "family_names", "family_members", "family_name", "standardized", "sanitized", diff --git a/plotdevice/lib/io.py b/plotdevice/lib/io.py index 7d888c3a..0577c8c9 100644 --- a/plotdevice/lib/io.py +++ b/plotdevice/lib/io.py @@ -1,5 +1,4 @@ import objc, os, re -import _plotdevice for cls in ["AnimatedGif", "Pages", "SysAdmin", "Video"]: globals()[cls] = objc.lookUpClass(cls) diff --git a/plotdevice/run/__init__.py b/plotdevice/run/__init__.py index c7f062af..a8c21644 100644 --- a/plotdevice/run/__init__.py +++ b/plotdevice/run/__init__.py @@ -1,16 +1,20 @@ import sys, site +import platform from os.path import abspath, dirname, exists, join -from subprocess import call, getoutput +from subprocess import call try: # test the sys.path by attempting to load a PyObjC submodule... from Foundation import * except ImportError: - setup_py = join(dirname(__file__), '../../setup.py') + # detect whether we're being run from the repository and set up a local env if so + repo = abspath(join(dirname(__file__), '../..')) + setup_py = '%s/setup.py' % repo if exists(setup_py): - # if run from the sdist, install pyobjc et al. in a venv at app/deps/local - site_path = getoutput('{py} {setup} -q env'.format(py=sys.executable, setup=setup_py)) - site.addsitedir(site_path) + local_libs = '%s/app/deps/local/%s/libs' % (repo, platform.python_version()) + if not exists(local_libs): + call([sys.executable, setup_py, 'dev']) + site.addsitedir(local_libs) from Foundation import * else: from pprint import pformat diff --git a/plotdevice/util/__init__.py b/plotdevice/util/__init__.py index 0cbb33d7..cd529061 100644 --- a/plotdevice/util/__init__.py +++ b/plotdevice/util/__init__.py @@ -318,7 +318,7 @@ def rsrc_path(resource=None): rsrc_root = abspath(pth) break else: - notfound = "Couldn't locate resources directory (try running `python setup.py build` before running from the source dist)." + notfound = "Couldn't locate resources directory (try running `python setup.py dev` before running from the source dist)." raise RuntimeError(notfound) if resource: return join(rsrc_root, resource) diff --git a/plotdevice/util/readers.py b/plotdevice/util/readers.py index 6b61e70c..9a3550f4 100644 --- a/plotdevice/util/readers.py +++ b/plotdevice/util/readers.py @@ -190,20 +190,13 @@ def csv_dialect(fd): ### HTTP utils ### -try: - import requests - from cachecontrol import CacheControl, CacheControlAdapter - from cachecontrol.caches import FileCache - from cachecontrol.heuristics import LastModified - - cache_dir = '%s/Library/Caches/PlotDevice'%os.environ['HOME'] - HTTP = CacheControl(requests.Session(), cache=FileCache(cache_dir), heuristic=LastModified()) -except ImportError: - class Decoy(object): - def get(self, url): - unsupported = 'could not find the "requests" library (try running "python setup.py build" first)' - raise RuntimeError(unsupported) - HTTP = Decoy() +import requests +from cachecontrol import CacheControl, CacheControlAdapter +from cachecontrol.caches import FileCache +from cachecontrol.heuristics import LastModified + +cache_dir = '%s/Library/Caches/PlotDevice'%os.environ['HOME'] +HTTP = CacheControl(requests.Session(), cache=FileCache(cache_dir), heuristic=LastModified()) def binaryish(content, format): bin_types = ('pdf','eps','png','jpg','jpeg','heic','gif','tiff','tif','zip','tar','gz') diff --git a/setup.py b/setup.py index 990fd2bf..05ceccd3 100644 --- a/setup.py +++ b/setup.py @@ -19,8 +19,10 @@ # - cFoundry, cPathmatics, cIO, & PyObjC (included in the "app/deps" folder) # - Sparkle.framework (auto-downloaded only for `dist` builds) -import os, sys, json, re +import os, sys, json, re, platform +from glob import glob from setuptools import setup, find_packages +from setuptools.extension import Extension from distutils.dir_util import remove_tree from distutils.command.build_py import build_py from pkg_resources import DistributionNotFound @@ -47,10 +49,8 @@ "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: MIT License", "Operating System :: MacOS :: MacOS X", - "Programming Language :: Python :: 2", - "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.8", "Topic :: Artistic Software", "Topic :: Multimedia :: Graphics", "Topic :: Multimedia :: Graphics :: Editors :: Vector-Based", @@ -96,12 +96,10 @@ Requirements: -* Mac OS X 10.9+ -* Python 2.7 or 3.4+ -* the requests, cachecontrol, and lockfile modules +* Mac OS X 11+ +* Python 3.8+ """ - ## Basic Utils ## # the sparkle updater framework will be fetched as needed @@ -162,7 +160,7 @@ def stale(dst, src): from distutils.core import Command class CleanCommand(Command): - description = "wipe out the ./build ./dist and app/deps/.../build dirs" + description = "wipe out the ./build ./dist and app/deps/local dirs" user_options = [] def initialize_options(self): pass @@ -170,21 +168,23 @@ def finalize_options(self): pass def run(self): os.system('rm -rf ./build ./dist') - os.system('rm -rf ./app/deps/*/build') + os.system('rm -rf ./app/deps/local') os.system('rm -rf plotdevice.egg-info MANIFEST.in PKG') os.system('rm -rf ./tests/_out ./tests/_diff ./details.html') + os.system('rm -f ./_plotdevice.*.so') os.system('find plotdevice -name .DS_Store -exec rm {} \;') os.system('find plotdevice -name \*.pyc -exec rm {} \;') os.system('find plotdevice -name __pycache__ -type d -prune -exec rmdir {} \;') -class LocalEnvCommand(Command): - description = "set up app/deps/local env to allow for running from the sdist" +class LocalDevCommand(Command): + description = "set up environment to allow for running `python -m plotdevice` within the repo" user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): + # install pyobjc, requests and the other pypi dependencies in app/deps/local import platform venv_dir = join('app/deps/local', platform.python_version()) if not exists(venv_dir): @@ -192,11 +192,16 @@ def run(self): venv.create(venv_dir, symlinks=True, with_pip=True) PIP = '%s/bin/pip3' % venv_dir call([PIP, 'install', '-q', '--upgrade', 'pip']) - call([PIP, '--isolated', 'install', '-q', *config['install_requires']]) + call([PIP, '--isolated', 'install', '--target', join(venv_dir, 'libs'), *config['install_requires']]) + + # place the compiled c-extensions in the main repo dir + build_ext = self.distribution.get_command_obj('build_ext') + build_ext.inplace = 1 + self.run_command('build_ext') + + # build the sdist (primarily for access to its rsrc subdir) + self.run_command('build_py') - # use the venv's site directory - site_path = getoutput('%s/bin/python3 -c "import site; print(site.getsitepackages()[0])"' % venv_dir) - print(site_path) from setuptools.command.sdist import sdist @@ -367,13 +372,6 @@ def run(self): print("\nBuilt PlotDevice.app, %s, and release.json in ./dist" % basename(ZIP)) -from glob import glob -from setuptools.extension import Extension -sources = ['app/deps/extensions/module.m', *glob('app/deps/extensions/*/*.[cm]')] -frameworks = ['AppKit', 'Foundation', 'Quartz', 'Security', 'AVFoundation', 'CoreMedia', 'CoreVideo', 'CoreText'] -flags = sum((['-framework', fmwk] for fmwk in frameworks), []) -_plotdevice = Extension('_plotdevice', sources=sources, extra_link_args=flags) - # common config between module and app builds config = dict( name = MODULE, @@ -386,7 +384,13 @@ def run(self): license = LICENSE, classifiers = CLASSIFIERS, packages = find_packages(exclude=['tests']), - ext_modules = [_plotdevice], + ext_modules = [Extension( + '_plotdevice', + sources = ['app/deps/extensions/module.m', *glob('app/deps/extensions/*/*.[cm]')], + extra_link_args=sum((['-framework', fmwk] for fmwk in + ['AppKit', 'Foundation', 'Quartz', 'Security', 'AVFoundation', 'CoreMedia', 'CoreVideo', 'CoreText'] + ), []) + )], install_requires = [ 'requests', 'cachecontrol', @@ -406,7 +410,7 @@ def run(self): 'dist': DistCommand, 'sdist': BuildDistCommand, 'test': TestCommand, - 'env': LocalEnvCommand, + 'dev': LocalDevCommand, }, ) @@ -417,7 +421,6 @@ def run(self): # (this means the various commands don't have to play path games) os.chdir(dirname(abspath(__file__))) - # py2app-specific config if 'py2app' in sys.argv: config.update(dict( From fede659d0409ffa6202d4a0d9cfc7ca567ee0b6c Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 1 Jul 2022 21:49:33 -0400 Subject: [PATCH 092/226] s/embed/framework/ --- .gitignore | 4 ++-- PlotDevice.xcodeproj/project.pbxproj | 8 ++++---- app/deps/{embed => framework}/Makefile | 0 app/deps/{embed => framework}/config.py | 4 ++-- app/deps/{embed => framework}/requirements.txt | 0 app/python.xcconfig | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) rename app/deps/{embed => framework}/Makefile (100%) rename app/deps/{embed => framework}/config.py (84%) rename app/deps/{embed => framework}/requirements.txt (100%) diff --git a/.gitignore b/.gitignore index e01fceb8..31b1ddc9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,8 @@ plotdevice.egg-info /*.so app/deps/vendor/Sparkle* app/deps/vendor/*.tar.gz -app/deps/embed/Python.framework -app/deps/embed/relocatable-python +app/deps/framework/Python.framework +app/deps/framework/relocatable-python app/deps/local # cds garbage diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 0aae67e7..1c4f29bd 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -97,7 +97,7 @@ 2A32957218C59D0A00EEDD1C /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; 2A32957718C59D0A00EEDD1C /* io.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = io.py; sourceTree = ""; }; 2A32957918C59D0A00EEDD1C /* pathmatics.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pathmatics.py; sourceTree = ""; }; - 2A36AE2C2868B4E50088976E /* Python.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python.framework; path = app/deps/embed/Python.framework; sourceTree = ""; }; + 2A36AE2C2868B4E50088976E /* Python.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python.framework; path = app/deps/framework/Python.framework; sourceTree = ""; }; 2A36AE55286CA75B0088976E /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = "Resources/en.lproj/placeholder-light.pdf"; sourceTree = ""; }; 2A36AE57286CA75B0088976E /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = "Resources/en.lproj/placeholder-dark.pdf"; sourceTree = ""; }; 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; @@ -462,7 +462,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# build a relocatable Python.framework with our dependencies pre-installed\ncd app/deps/embed\nmake\n"; + shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# build a relocatable Python.framework with our dependencies pre-installed\ncd app/deps/framework\nmake\n"; showEnvVarsInLog = 0; }; 2A36AE34286B81290088976E /* Symlink Command Line Tool */ = { @@ -601,7 +601,7 @@ COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**", - "$(PROJECT_DIR)/app/deps/embed", + "$(PROJECT_DIR)/app/deps/framework", ); GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; @@ -631,7 +631,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; FRAMEWORK_SEARCH_PATHS = ( "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**", - "$(PROJECT_DIR)/app/deps/embed", + "$(PROJECT_DIR)/app/deps/framework", ); GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; diff --git a/app/deps/embed/Makefile b/app/deps/framework/Makefile similarity index 100% rename from app/deps/embed/Makefile rename to app/deps/framework/Makefile diff --git a/app/deps/embed/config.py b/app/deps/framework/config.py similarity index 84% rename from app/deps/embed/config.py rename to app/deps/framework/config.py index 492ffb2d..9c8a9769 100644 --- a/app/deps/embed/config.py +++ b/app/deps/framework/config.py @@ -4,8 +4,8 @@ from datetime import datetime # customize Xcode's libpython paths based on the Python.framework interpreter -config = """// Generated by app/deps/embed/config.py at {timestamp} -PYTHON_FRAMEWORK = $(PROJECT_DIR)/app/deps/embed/Python.framework +config = """// Generated by app/deps/framework/config.py at {timestamp} +PYTHON_FRAMEWORK = $(PROJECT_DIR)/app/deps/framework/Python.framework PYTHON = $(PYTHON_FRAMEWORK)/Versions/{py_version}/bin/python3 LIBRARY_SEARCH_PATHS = $(inherited) {py_lib} HEADER_SEARCH_PATHS = $(inherited) {py_inc} diff --git a/app/deps/embed/requirements.txt b/app/deps/framework/requirements.txt similarity index 100% rename from app/deps/embed/requirements.txt rename to app/deps/framework/requirements.txt diff --git a/app/python.xcconfig b/app/python.xcconfig index 01a8eda2..83010978 100644 --- a/app/python.xcconfig +++ b/app/python.xcconfig @@ -1,5 +1,5 @@ -// Generated by app/deps/embed/config.py at 2022-06-28 15:50:24.150225 -PYTHON_FRAMEWORK = $(PROJECT_DIR)/app/deps/embed/Python.framework +// Generated by app/deps/framework/config.py at 2022-07-01 21:48:41.935137 +PYTHON_FRAMEWORK = $(PROJECT_DIR)/app/deps/framework/Python.framework PYTHON = $(PYTHON_FRAMEWORK)/Versions/3.10/bin/python3 LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.10/lib/python3.10/config-3.10-darwin HEADER_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.10/include/python3.10 From 08b74f7287c0452d19b041173b0a8c0e1610d36d Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 1 Jul 2022 21:51:09 -0400 Subject: [PATCH 093/226] moved c-extensions build into main setup.py --- app/deps/extensions/setup.py | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 app/deps/extensions/setup.py diff --git a/app/deps/extensions/setup.py b/app/deps/extensions/setup.py deleted file mode 100644 index 8b17ca45..00000000 --- a/app/deps/extensions/setup.py +++ /dev/null @@ -1,18 +0,0 @@ -from setuptools import setup -from setuptools.extension import Extension - -sources = [ - 'module.m', - 'io/SysAdmin.m', 'io/Pages.m', 'io/AnimatedGif.m', 'io/Video.m', - 'foundry/Vandercook.m', - 'pathmatics/gpc.c', 'pathmatics/pathmatics.m' -] -frameworks = ['AppKit', 'Foundation', 'Quartz', 'Security', 'AVFoundation', 'CoreMedia', 'CoreVideo', 'CoreText'] -flags = sum((['-framework', fmwk] for fmwk in frameworks), []) -_plotdevice = Extension('_plotdevice', sources=sources, extra_link_args=flags) - -setup (name = "_plotdevice", - version = "1.0", - author = "Christian Swinehart", - description = "Typography, image/video export, and bezier math routines.", - ext_modules = [_plotdevice]) \ No newline at end of file From bf53a42ebd83cdf2c7bf02062eb3eb92b8e1c608 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 1 Jul 2022 23:10:01 -0400 Subject: [PATCH 094/226] remove testing detritus --- out.pdf | Bin 3732 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 out.pdf diff --git a/out.pdf b/out.pdf deleted file mode 100644 index 97cf7b875ffd5836c22cb151833efd20de9a2f8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3732 zcmai%c|25o`^N`U7(!)ujjnZnK`e|xz6>yzMt#-@xCO?^bO?{mj4|n|mSA2#p0Qwv(#0w#K;s4IgyxXZr@t4Xh11>U4 zF~hk0_$3p(C;*)K_#B{cj^Iu5A>#<%fYM)r9?6TseC`eG?2H+3hJYtxbV>ez9gHa` zE5dg!2Z+Ks5{0=-ro`OV-z)B9`00finS`?-PyjpTvigRA1E8Qs@*t5dE@E&5V8<*y zZ$&`)#}b;FzvNK)CC6E24GKCto_g&prJzsnCE^I@kh=eJ6|Tap=l}KnSF^Y_*}shNmlshFundhN?kk-@?F+6dRThrEDAiPqPj7 z`}TJ>ud*KCW8tx3sULTC1|!$>S^K}yG}6=ajatiBKFNpRYu?D#nL)h=w}TVJRQ1Gn zgCGV2DyObOg&3^K7UeC%@NMvm32)bMN zxzZhKjoE01#CQ%BoNb>b@y;dZ3Oj*jX`BIKtV;Fut=%>S!T8gix~8Go9?@_Ee&J8i zUsypL$<6A|$vm;^>aKS{{<$ubG2m!pZ0_EnG$P|eyYt3kxy3qGQ6{`e6i^KJbG}-b-iwQ?C@2KEsgfTO{+!d9Q}?C^$vQ>WA32> zO%SvqZhPxcd2NansKRr%He>uDY5@R!*#)W?y}fie(!(*a`8~HJSM1!Jhc`=>yS&T? z)y=Fh(u=xC_0{ywPn*^!bA_}*j~NRf2nLMYyj&Cgt}bq#R62fZm2Z2ZUY+=7N0aRB zta_ovh!0lgACfu4qg`tvPKDaskjF#9g9pZg52#483t!E2=XdpS0tH2=n^hUJx05tL zddJwry|e;ZgJ$jc6d~=k&s~cXO1c#WIth*?anaL41x68B_6w z8d&$;V5i)LD22+ySY-w4ZcL}^&V*cf#cT-v-Qk0mXA?HsyQ64ZQNz=0hD%cu>^(hO=IoD?0E%x z8ZumVQj`PP*!fQ1U*I;oQ2m?n(^Z0+Je7??;|D*3WFwp!lQ^{7IoNs)Z8#1t>g(RH z5og(Z)ICA$K5KzN#tokP2cN|mC0v?h+Z~mSNjo6eDm)Q|rjBE+F@xCCuz@sOnzgCW zl!`MSB6L0M0e0X~u8rhFEniNRy|?1znyoLyU$84neZ=+(Gj~#yr>$Q2z39cORR`?h zUdkolO5P!AO~`E1o^j}+|MTOc{0m{c4c?!zSB};~f<=Q5kHsHpt&_aLX$y7_<2`y4 z5cd$bg4W#Ph_^#L9iB0_~Zyml6+-is<$| z2zXglai-$LYr<>TA*Aa4&Az0WmgOTKXv>@g34$F%iXqAnVU)i(x4RK`VGVIk_yIME zT0@OrQkr^3pP;`{DJ42?KbKBfKkjw>N{U#Da|%mJe4(ioX@Gwqv(U2;)em!nx?$Xg z-8Kj0i{j{cbiX_FOedx7$!}2~%c`RTt2W%eHht9im?V-RQY#`XVkMHQ)T%6;;g!*m z!N{0aYO8Ry<$40PW!O$XafGF$f9kSymMD)^&n_;R&y(xbygyQ;QH;wkw{giiTi(6j zAyM8=Rj1Ov(!x&{WujoC;8be9kgaK+Rh)Id4q0ax{Gz@Gczq#O=T<|0c1(61<_;!j z9CxfRp{VzGj&07#RyEwyOEHU@6L!$D=uG282-64 zy8|w$Ez)fQSKggFGWDdmKyJ*pZa(N_hC|tiV9nVY`U=mA*d}ySkzFIoKZ?e)`ikN! zRTCaGuy^*ucvbfzb%I^;vgD&akl_vukp} zIrr`I0XH?UG}MG0QF!SjZr?A+s{2jPH{ukhGPi@khW7z^S*3^2xqvDw|EvCfU^%RT zzFu>UQGEN$c4TavpoyTLVF$9sU;uf>;Icugfk~>3EV_KskZMZ>ay0~x92B@L?n^FM zeK}$hH8J-dGVw_sVSlrH?lt)dqo9*sa>Jn9y@&roh(Sck(?uq zDCjNtlNesHR?(*`fr%-TaX@HD(iEDMa$tJZFNg!5toGm2?oBY2@0S_}ALmcu&C7X!vudVP_oS;Fwp;XutVg^Rn6tuH_3;t-8;2&BtkS-F7@4 zEgk|M^CQmX#cpp>#TZJB=~6f3K;FmuA45grGp1-C zFIUcIzHWOnR5#`s+{Y5f*21oNm|ygHaQmv6d$EpZ3+C^Gm=|bD^GiDV{Eer-wsAUy{|&NYA@ty|kymZ>Z08Rair zOy~*S0=I9eXZccilv$|sPWoAiP$!KS2YN_MmGjhQj+U7T_)FPJ> zb%&EdnL)Jq$gQ}+!!>tqI?Y`r&OBN0q|IC`-?}+be7$y8(Da7Gro!k-br9qFcIH90 z*xehS zFaN_OKC((rVLN5L6xFngUO<;ItT6nDEJo6)>(r6JN6RgrJE^IC6A^XN-=D6g^cH1Z z_1mPmU^|*WyZ6qfYn>j=uT|d|T=AU7f0*p^BQE6T#f%o!YOREBWpCn^+Y)BxP;01^ ztT-*dE1ciH_(MINr^Z&pmo|T==^a$vVOu888tdulV!R1>V24%D0S-U$cZaBd;_pAe z?fst!y@RZ(>hK>#?85|cML@xXi1%ia@(!^x^Zi1@s=uYw!%#3DB$vNn-urKg{|CX< zetCh3;CLS#b0CrO#NbdCfHi^aO(b~%ig0-)z+Ot%hvh{urxeta+2?Us| z{$l{}r${pqojI&fm~ZGa=^G-Ye*zAJ!(l3LHAOX;lCr8T3?|7unQ>=G_?-~ozlZ!& zpg)=541oda5ZJ#CKt)*@p$s?!KQ%>Frn5T-;Pq2OD8iT>_;(G)Eax{3uFf1&{yh!> zQ~gbYA(WX`{YRXl+V2`1!R*1$I0_j<^dOLb40{&DKmwr79H2-f3b4~B=B#Aw PAk@_$5)uX|L&*ODgG5=n From b55ade0d286354ff5f63a78b618a1643d4f628c1 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 1 Jul 2022 23:31:53 -0400 Subject: [PATCH 095/226] mv app/deps to deps --- .gitignore | 10 +++++----- PlotDevice.xcodeproj/project.pbxproj | 10 +++++----- {app/deps => deps}/extensions/foundry/Vandercook.h | 0 {app/deps => deps}/extensions/foundry/Vandercook.m | 0 {app/deps => deps}/extensions/io/AnimatedGif.h | 0 {app/deps => deps}/extensions/io/AnimatedGif.m | 0 {app/deps => deps}/extensions/io/Pages.h | 0 {app/deps => deps}/extensions/io/Pages.m | 0 {app/deps => deps}/extensions/io/SysAdmin.h | 0 {app/deps => deps}/extensions/io/SysAdmin.m | 0 {app/deps => deps}/extensions/io/Video.h | 0 {app/deps => deps}/extensions/io/Video.m | 0 {app/deps => deps}/extensions/module.m | 0 {app/deps => deps}/extensions/pathmatics/gpc.c | 0 {app/deps => deps}/extensions/pathmatics/gpc.h | 0 {app/deps => deps}/extensions/pathmatics/pathmatics.h | 0 {app/deps => deps}/extensions/pathmatics/pathmatics.m | 0 .../extensions/pathmatics/pathmatics_test.py | 0 {app/deps => deps}/framework/Makefile | 0 {app/deps => deps}/framework/config.py | 4 ++-- {app/deps => deps}/framework/requirements.txt | 0 plotdevice/run/__init__.py | 2 +- 22 files changed, 13 insertions(+), 13 deletions(-) rename {app/deps => deps}/extensions/foundry/Vandercook.h (100%) rename {app/deps => deps}/extensions/foundry/Vandercook.m (100%) rename {app/deps => deps}/extensions/io/AnimatedGif.h (100%) rename {app/deps => deps}/extensions/io/AnimatedGif.m (100%) rename {app/deps => deps}/extensions/io/Pages.h (100%) rename {app/deps => deps}/extensions/io/Pages.m (100%) rename {app/deps => deps}/extensions/io/SysAdmin.h (100%) rename {app/deps => deps}/extensions/io/SysAdmin.m (100%) rename {app/deps => deps}/extensions/io/Video.h (100%) rename {app/deps => deps}/extensions/io/Video.m (100%) rename {app/deps => deps}/extensions/module.m (100%) rename {app/deps => deps}/extensions/pathmatics/gpc.c (100%) rename {app/deps => deps}/extensions/pathmatics/gpc.h (100%) rename {app/deps => deps}/extensions/pathmatics/pathmatics.h (100%) rename {app/deps => deps}/extensions/pathmatics/pathmatics.m (100%) rename {app/deps => deps}/extensions/pathmatics/pathmatics_test.py (100%) rename {app/deps => deps}/framework/Makefile (100%) rename {app/deps => deps}/framework/config.py (84%) rename {app/deps => deps}/framework/requirements.txt (100%) diff --git a/.gitignore b/.gitignore index 31b1ddc9..c5ab3b97 100644 --- a/.gitignore +++ b/.gitignore @@ -4,11 +4,11 @@ build/ dist/ plotdevice.egg-info /*.so -app/deps/vendor/Sparkle* -app/deps/vendor/*.tar.gz -app/deps/framework/Python.framework -app/deps/framework/relocatable-python -app/deps/local +deps/vendor/Sparkle* +deps/vendor/*.tar.gz +deps/framework/Python.framework +deps/framework/relocatable-python +deps/local # cds garbage related/ diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 1c4f29bd..d2b766ab 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -97,13 +97,13 @@ 2A32957218C59D0A00EEDD1C /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; 2A32957718C59D0A00EEDD1C /* io.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = io.py; sourceTree = ""; }; 2A32957918C59D0A00EEDD1C /* pathmatics.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pathmatics.py; sourceTree = ""; }; - 2A36AE2C2868B4E50088976E /* Python.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python.framework; path = app/deps/framework/Python.framework; sourceTree = ""; }; + 2A36AE2C2868B4E50088976E /* Python.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python.framework; path = deps/framework/Python.framework; sourceTree = ""; }; 2A36AE55286CA75B0088976E /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = "Resources/en.lproj/placeholder-light.pdf"; sourceTree = ""; }; 2A36AE57286CA75B0088976E /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = "Resources/en.lproj/placeholder-dark.pdf"; sourceTree = ""; }; 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 2A37F4C5FDCFA73011CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 2A591FEF185C17D200D1833D /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - 2A64AB46195F4E78001E4E69 /* deps */ = {isa = PBXFileReference; lastKnownFileType = folder; name = deps; path = app/deps; sourceTree = ""; }; + 2A64AB46195F4E78001E4E69 /* deps */ = {isa = PBXFileReference; lastKnownFileType = folder; name = deps; path = deps; sourceTree = ""; }; 2A66ECDE18A992BD002903DE /* ace.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = ace.js; path = Resources/ui/js/ace.js; sourceTree = ""; }; 2A66ECDF18A992BD002903DE /* editor.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = editor.js; path = Resources/ui/js/editor.js; sourceTree = ""; }; 2A66ECE018A992BD002903DE /* jquery-2.1.0.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = "jquery-2.1.0.js"; path = "Resources/ui/js/jquery-2.1.0.js"; sourceTree = ""; }; @@ -462,7 +462,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# build a relocatable Python.framework with our dependencies pre-installed\ncd app/deps/framework\nmake\n"; + shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# build a relocatable Python.framework with our dependencies pre-installed\ncd deps/framework\nmake\n"; showEnvVarsInLog = 0; }; 2A36AE34286B81290088976E /* Symlink Command Line Tool */ = { @@ -601,7 +601,7 @@ COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**", - "$(PROJECT_DIR)/app/deps/framework", + "$(PROJECT_DIR)/deps/framework", ); GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; @@ -631,7 +631,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; FRAMEWORK_SEARCH_PATHS = ( "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**", - "$(PROJECT_DIR)/app/deps/framework", + "$(PROJECT_DIR)/deps/framework", ); GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; diff --git a/app/deps/extensions/foundry/Vandercook.h b/deps/extensions/foundry/Vandercook.h similarity index 100% rename from app/deps/extensions/foundry/Vandercook.h rename to deps/extensions/foundry/Vandercook.h diff --git a/app/deps/extensions/foundry/Vandercook.m b/deps/extensions/foundry/Vandercook.m similarity index 100% rename from app/deps/extensions/foundry/Vandercook.m rename to deps/extensions/foundry/Vandercook.m diff --git a/app/deps/extensions/io/AnimatedGif.h b/deps/extensions/io/AnimatedGif.h similarity index 100% rename from app/deps/extensions/io/AnimatedGif.h rename to deps/extensions/io/AnimatedGif.h diff --git a/app/deps/extensions/io/AnimatedGif.m b/deps/extensions/io/AnimatedGif.m similarity index 100% rename from app/deps/extensions/io/AnimatedGif.m rename to deps/extensions/io/AnimatedGif.m diff --git a/app/deps/extensions/io/Pages.h b/deps/extensions/io/Pages.h similarity index 100% rename from app/deps/extensions/io/Pages.h rename to deps/extensions/io/Pages.h diff --git a/app/deps/extensions/io/Pages.m b/deps/extensions/io/Pages.m similarity index 100% rename from app/deps/extensions/io/Pages.m rename to deps/extensions/io/Pages.m diff --git a/app/deps/extensions/io/SysAdmin.h b/deps/extensions/io/SysAdmin.h similarity index 100% rename from app/deps/extensions/io/SysAdmin.h rename to deps/extensions/io/SysAdmin.h diff --git a/app/deps/extensions/io/SysAdmin.m b/deps/extensions/io/SysAdmin.m similarity index 100% rename from app/deps/extensions/io/SysAdmin.m rename to deps/extensions/io/SysAdmin.m diff --git a/app/deps/extensions/io/Video.h b/deps/extensions/io/Video.h similarity index 100% rename from app/deps/extensions/io/Video.h rename to deps/extensions/io/Video.h diff --git a/app/deps/extensions/io/Video.m b/deps/extensions/io/Video.m similarity index 100% rename from app/deps/extensions/io/Video.m rename to deps/extensions/io/Video.m diff --git a/app/deps/extensions/module.m b/deps/extensions/module.m similarity index 100% rename from app/deps/extensions/module.m rename to deps/extensions/module.m diff --git a/app/deps/extensions/pathmatics/gpc.c b/deps/extensions/pathmatics/gpc.c similarity index 100% rename from app/deps/extensions/pathmatics/gpc.c rename to deps/extensions/pathmatics/gpc.c diff --git a/app/deps/extensions/pathmatics/gpc.h b/deps/extensions/pathmatics/gpc.h similarity index 100% rename from app/deps/extensions/pathmatics/gpc.h rename to deps/extensions/pathmatics/gpc.h diff --git a/app/deps/extensions/pathmatics/pathmatics.h b/deps/extensions/pathmatics/pathmatics.h similarity index 100% rename from app/deps/extensions/pathmatics/pathmatics.h rename to deps/extensions/pathmatics/pathmatics.h diff --git a/app/deps/extensions/pathmatics/pathmatics.m b/deps/extensions/pathmatics/pathmatics.m similarity index 100% rename from app/deps/extensions/pathmatics/pathmatics.m rename to deps/extensions/pathmatics/pathmatics.m diff --git a/app/deps/extensions/pathmatics/pathmatics_test.py b/deps/extensions/pathmatics/pathmatics_test.py similarity index 100% rename from app/deps/extensions/pathmatics/pathmatics_test.py rename to deps/extensions/pathmatics/pathmatics_test.py diff --git a/app/deps/framework/Makefile b/deps/framework/Makefile similarity index 100% rename from app/deps/framework/Makefile rename to deps/framework/Makefile diff --git a/app/deps/framework/config.py b/deps/framework/config.py similarity index 84% rename from app/deps/framework/config.py rename to deps/framework/config.py index 9c8a9769..cf371386 100644 --- a/app/deps/framework/config.py +++ b/deps/framework/config.py @@ -4,8 +4,8 @@ from datetime import datetime # customize Xcode's libpython paths based on the Python.framework interpreter -config = """// Generated by app/deps/framework/config.py at {timestamp} -PYTHON_FRAMEWORK = $(PROJECT_DIR)/app/deps/framework/Python.framework +config = """// Generated by deps/framework/config.py at {timestamp} +PYTHON_FRAMEWORK = $(PROJECT_DIR)/deps/framework/Python.framework PYTHON = $(PYTHON_FRAMEWORK)/Versions/{py_version}/bin/python3 LIBRARY_SEARCH_PATHS = $(inherited) {py_lib} HEADER_SEARCH_PATHS = $(inherited) {py_inc} diff --git a/app/deps/framework/requirements.txt b/deps/framework/requirements.txt similarity index 100% rename from app/deps/framework/requirements.txt rename to deps/framework/requirements.txt diff --git a/plotdevice/run/__init__.py b/plotdevice/run/__init__.py index a8c21644..88189e85 100644 --- a/plotdevice/run/__init__.py +++ b/plotdevice/run/__init__.py @@ -11,7 +11,7 @@ repo = abspath(join(dirname(__file__), '../..')) setup_py = '%s/setup.py' % repo if exists(setup_py): - local_libs = '%s/app/deps/local/%s/libs' % (repo, platform.python_version()) + local_libs = '%s/deps/local/%s/libs' % (repo, platform.python_version()) if not exists(local_libs): call([sys.executable, setup_py, 'dev']) site.addsitedir(local_libs) From 8ed1d74f70eac33b27b1357cf9efb768da1c546a Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 2 Jul 2022 00:54:34 -0400 Subject: [PATCH 096/226] update paths for framework build --- app/python.xcconfig | 4 ++-- deps/framework/Makefile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/python.xcconfig b/app/python.xcconfig index 83010978..6783912e 100644 --- a/app/python.xcconfig +++ b/app/python.xcconfig @@ -1,5 +1,5 @@ -// Generated by app/deps/framework/config.py at 2022-07-01 21:48:41.935137 -PYTHON_FRAMEWORK = $(PROJECT_DIR)/app/deps/framework/Python.framework +// Generated by deps/framework/config.py at 2022-07-02 00:33:46.129386 +PYTHON_FRAMEWORK = $(PROJECT_DIR)/deps/framework/Python.framework PYTHON = $(PYTHON_FRAMEWORK)/Versions/3.10/bin/python3 LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.10/lib/python3.10/config-3.10-darwin HEADER_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.10/include/python3.10 diff --git a/deps/framework/Makefile b/deps/framework/Makefile index 7c67fde0..f085083d 100644 --- a/deps/framework/Makefile +++ b/deps/framework/Makefile @@ -4,11 +4,11 @@ BUILD_OPTS = --os-version=11 --python-version=$(PYTHON_VERSION) --upgrade-pip -- BIN = ./Python.framework/Versions/Current/bin all: Python.framework - $(BIN)/pip3 install --upgrade ../../.. + $(BIN)/pip3 install --upgrade ../.. Python.framework: relocatable-python python3 ./relocatable-python/make_relocatable_python_framework.py $(BUILD_OPTS) - $(BIN)/python3 config.py ../../python.xcconfig + $(BIN)/python3 config.py ../../app/python.xcconfig relocatable-python: git clone $(FRAMEWORK_REPO) From 147f61c1537bfd48586bfee5c0d31c6996d90ad3 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 2 Jul 2022 00:56:39 -0400 Subject: [PATCH 097/226] update `sdist` and `dev` builds --- .gitignore | 12 +++++++-- setup.py | 71 +++++++++++++++++++++++++++++++++--------------------- 2 files changed, 54 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index c5ab3b97..be47cfca 100644 --- a/.gitignore +++ b/.gitignore @@ -1,20 +1,28 @@ .DS_Store *.pyc + +# setuptools detritus build/ dist/ plotdevice.egg-info +app/Resources/viewer.nib +Manifest.in + +# local development +deps/local /*.so + +# app dependencies deps/vendor/Sparkle* -deps/vendor/*.tar.gz deps/framework/Python.framework deps/framework/relocatable-python -deps/local # cds garbage related/ todo.txt test.py speedtrials.py +/out.* # Xcode user files project.xcworkspace diff --git a/setup.py b/setup.py index 05ceccd3..51633270 100644 --- a/setup.py +++ b/setup.py @@ -1,22 +1,21 @@ # encoding:utf-8 # To install the module & command line tool in site-packages, use: -# python setup.py install +# python3 setup.py install # # In addition to the `install' command, there are a few other variants: # app: builds ./dist/PlotDevice.app using Xcode # py2app: builds the application using py2app # clean: discard anything already built and start fresh # test: run unit tests and generate the file "details.html" with the test output -# build: puts the module in a usable state. after building, you should be able -# to run the ./app/plotdevice command line tool within the source distribution. +# dev: puts the module in a usable state within the source distribution. after running, +# you should be able to run the `python3 -m plotdevice` command line interface. # If you're having trouble building the app, this can be a good way to sanity # check your setup # # We require some dependencies: -# - Mac OS X 10.9+ and xcode command line tools -# - the system-provided /usr/bin/python2.7 or a homebrew-built python interpreter -# - cFoundry, cPathmatics, cIO, & PyObjC (included in the "app/deps" folder) +# - Mac OS X 11+ and Xcode command line tools (type `xcode-select --install` in the terminal) +# - the python3.8 provided by Xcode or a homebrew- or pyenv-built python3 interpreter # - Sparkle.framework (auto-downloaded only for `dist` builds) import os, sys, json, re, platform @@ -153,14 +152,15 @@ def timestamp(): return now.strftime("%a, %d %b %Y %H:%M:%S %z") def stale(dst, src): - if not exists(dst) or getmtime(dst) < getmtime(src): - yield dst, src + if exists(src): + if not exists(dst) or getmtime(dst) < getmtime(src): + yield dst, src ## Build Commands ## from distutils.core import Command class CleanCommand(Command): - description = "wipe out the ./build ./dist and app/deps/local dirs" + description = "wipe out the ./build ./dist and deps/local dirs" user_options = [] def initialize_options(self): pass @@ -168,7 +168,7 @@ def finalize_options(self): pass def run(self): os.system('rm -rf ./build ./dist') - os.system('rm -rf ./app/deps/local') + os.system('rm -rf ./deps/local') os.system('rm -rf plotdevice.egg-info MANIFEST.in PKG') os.system('rm -rf ./tests/_out ./tests/_diff ./details.html') os.system('rm -f ./_plotdevice.*.so') @@ -184,14 +184,14 @@ def initialize_options(self): def finalize_options(self): pass def run(self): - # install pyobjc, requests and the other pypi dependencies in app/deps/local + # install pyobjc, requests and the other pypi dependencies in deps/local import platform - venv_dir = join('app/deps/local', platform.python_version()) + venv_dir = join('deps/local', platform.python_version()) if not exists(venv_dir): import venv venv.create(venv_dir, symlinks=True, with_pip=True) PIP = '%s/bin/pip3' % venv_dir - call([PIP, 'install', '-q', '--upgrade', 'pip']) + call([PIP, 'install', '-q', '--upgrade', 'pip', 'wheel']) call([PIP, '--isolated', 'install', '--target', join(venv_dir, 'libs'), *config['install_requires']]) # place the compiled c-extensions in the main repo dir @@ -203,21 +203,33 @@ def run(self): self.run_command('build_py') - from setuptools.command.sdist import sdist class BuildDistCommand(sdist): def finalize_options(self): with open('MANIFEST.in','w') as f: - tracked, _, _ = gosub('git ls-tree --full-tree --name-only -r HEAD') - for line in tracked.splitlines()[1:]: - f.write("include %s\n"%line) + f.write(""" + graft app/Resources + prune app/Resources/en.lproj + prune app/Resources/ui + include app/plotdevice + include deps/extensions/*/*.h + include tests/*.py + graft tests/_in + graft examples + include *.md + include *.url + """) sdist.finalize_options(self) def run(self): + # include a compiled nib in the sdist so ibtool (and thus Xcode.app) isn't required to install + for dst, src in stale('app/Resources/viewer.nib', "app/Resources/en.lproj/PlotDeviceScript.xib"): + self.spawn(['/usr/bin/ibtool','--compile', dst, src]) + + # build the sdist based on our MANIFEST additions sdist.run(self) - # it would be nice to clean up MANIFEST.in and plotdevice.egg-info here, - # but we'll see if the upload command depends on them... + # clean up remove_tree('plotdevice.egg-info') os.unlink('MANIFEST.in') @@ -229,11 +241,16 @@ def run(self): # include some ui resources for running a script from the command line rsrc_dir = '%s/plotdevice/rsrc'%self.build_lib self.mkpath(rsrc_dir) - - self.copy_file("app/Resources/colors.json", '%s/colors.json'%rsrc_dir) self.copy_file("app/Resources/PlotDeviceFile.icns", '%s/viewer.icns'%rsrc_dir) - for dst, src in stale('%s/viewer.nib'%rsrc_dir, src="app/Resources/en.lproj/PlotDeviceScript.xib"): - self.spawn(['/usr/bin/ibtool','--compile', dst, src]) + self.copy_file("app/Resources/colors.json", rsrc_dir) + + # recompile the command-line UI nib if necessary + xib = 'app/Resources/en.lproj/PlotDeviceScript.xib' + nib = 'app/Resources/viewer.nib' + for dst, src in stale(nib, xib): + self.spawn(['/usr/bin/ibtool','--compile', nib, xib]) + self.copy_file(nib, rsrc_dir) + class TestCommand(Command): description = "Run unit tests" @@ -257,7 +274,7 @@ def initialize_options(self): def finalize_options(self): # make sure the embedded framework exists (and has updated app/python.xcconfig) print("Set up Python.framework for app build") - call('cd app/deps/embed && make', shell=True) + call('cd deps/embed && make', shell=True) def run(self): self.spawn(['xcodebuild']) @@ -274,7 +291,7 @@ def initialize_options(self): def finalize_options(self): self.verbose=0 build_py2app.finalize_options(self) - os.environ['ACTION'] = 'build' # flag for app/deps/build.py + os.environ['ACTION'] = 'build' # flag for deps/build.py def run(self): build_py2app.run(self) @@ -346,7 +363,7 @@ def run(self): ) # Download Sparkle (if necessary) and copy it into the bundle - ORIG = 'app/deps/vendor/Sparkle-%s/Sparkle.framework'%SPARKLE_VERSION + ORIG = 'deps/vendor/Sparkle-%s/Sparkle.framework'%SPARKLE_VERSION SPARKLE = join(APP,'Contents/Frameworks/Sparkle.framework') if not exists(ORIG): self.mkpath(dirname(ORIG)) @@ -386,7 +403,7 @@ def run(self): packages = find_packages(exclude=['tests']), ext_modules = [Extension( '_plotdevice', - sources = ['app/deps/extensions/module.m', *glob('app/deps/extensions/*/*.[cm]')], + sources = ['deps/extensions/module.m', *glob('deps/extensions/*/*.[cm]')], extra_link_args=sum((['-framework', fmwk] for fmwk in ['AppKit', 'Foundation', 'Quartz', 'Security', 'AVFoundation', 'CoreMedia', 'CoreVideo', 'CoreText'] ), []) From decf0c813bfa12ba73e21fa67142e530d936fa12 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 2 Jul 2022 11:28:09 -0400 Subject: [PATCH 098/226] update sparkle framework --- .gitignore | 3 +-- setup.py | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index be47cfca..b34f9ac7 100644 --- a/.gitignore +++ b/.gitignore @@ -13,8 +13,7 @@ deps/local /*.so # app dependencies -deps/vendor/Sparkle* -deps/framework/Python.framework +deps/framework/*.framework deps/framework/relocatable-python # cds garbage diff --git a/setup.py b/setup.py index 51633270..22f9658a 100644 --- a/setup.py +++ b/setup.py @@ -102,8 +102,8 @@ ## Basic Utils ## # the sparkle updater framework will be fetched as needed -SPARKLE_VERSION = '1.10.0' -SPARKLE_URL = 'https://github.com/sparkle-project/Sparkle/releases/download/%(v)s/Sparkle-%(v)s.tar.bz2' % {'v':SPARKLE_VERSION} +SPARKLE_VERSION = '2.1.0' +SPARKLE_URL = 'https://github.com/sparkle-project/Sparkle/releases/download/%(v)s/Sparkle-%(v)s.tar.xz' % {'v':SPARKLE_VERSION} # helpers for dealing with plists & git (spiritual cousins if ever there were) import plistlib @@ -363,12 +363,12 @@ def run(self): ) # Download Sparkle (if necessary) and copy it into the bundle - ORIG = 'deps/vendor/Sparkle-%s/Sparkle.framework'%SPARKLE_VERSION + ORIG = 'deps/framework/Sparkle.framework' SPARKLE = join(APP,'Contents/Frameworks/Sparkle.framework') if not exists(ORIG): self.mkpath(dirname(ORIG)) print("Downloading Sparkle.framework") - os.system('curl -L -# %s | bunzip2 -c | tar xf - -C %s'%(SPARKLE_URL, dirname(ORIG))) + os.system('curl -L -# %s | xz -dc | tar xf - -C %s %s'%(SPARKLE_URL, dirname(ORIG), basename(ORIG))) self.mkpath(dirname(SPARKLE)) self.spawn(['ditto', ORIG, SPARKLE]) From a03cb349717d994737438107c421a622c39df792 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 2 Jul 2022 11:35:03 -0400 Subject: [PATCH 099/226] s/framework/frameworks/ --- .gitignore | 4 ++-- PlotDevice.xcodeproj/project.pbxproj | 8 ++++---- app/python.xcconfig | 4 ++-- deps/{framework => frameworks}/Makefile | 0 deps/{framework => frameworks}/config.py | 4 ++-- deps/{framework => frameworks}/requirements.txt | 0 setup.py | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) rename deps/{framework => frameworks}/Makefile (100%) rename deps/{framework => frameworks}/config.py (85%) rename deps/{framework => frameworks}/requirements.txt (100%) diff --git a/.gitignore b/.gitignore index b34f9ac7..e505b4f6 100644 --- a/.gitignore +++ b/.gitignore @@ -13,8 +13,8 @@ deps/local /*.so # app dependencies -deps/framework/*.framework -deps/framework/relocatable-python +deps/frameworks/*.framework +deps/frameworks/relocatable-python # cds garbage related/ diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index d2b766ab..782d8e63 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -97,7 +97,7 @@ 2A32957218C59D0A00EEDD1C /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; 2A32957718C59D0A00EEDD1C /* io.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = io.py; sourceTree = ""; }; 2A32957918C59D0A00EEDD1C /* pathmatics.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pathmatics.py; sourceTree = ""; }; - 2A36AE2C2868B4E50088976E /* Python.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python.framework; path = deps/framework/Python.framework; sourceTree = ""; }; + 2A36AE2C2868B4E50088976E /* Python.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python.framework; path = deps/frameworks/Python.framework; sourceTree = ""; }; 2A36AE55286CA75B0088976E /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = "Resources/en.lproj/placeholder-light.pdf"; sourceTree = ""; }; 2A36AE57286CA75B0088976E /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = "Resources/en.lproj/placeholder-dark.pdf"; sourceTree = ""; }; 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; @@ -462,7 +462,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# build a relocatable Python.framework with our dependencies pre-installed\ncd deps/framework\nmake\n"; + shellScript = "# have the build fail if setup.py isn't successful\nset -e\n\n# build a relocatable Python.framework with our dependencies pre-installed\ncd deps/frameworks\nmake\n"; showEnvVarsInLog = 0; }; 2A36AE34286B81290088976E /* Symlink Command Line Tool */ = { @@ -601,7 +601,7 @@ COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**", - "$(PROJECT_DIR)/deps/framework", + "$(PROJECT_DIR)/deps/frameworks", ); GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; @@ -631,7 +631,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; FRAMEWORK_SEARCH_PATHS = ( "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**", - "$(PROJECT_DIR)/deps/framework", + "$(PROJECT_DIR)/deps/frameworks", ); GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; diff --git a/app/python.xcconfig b/app/python.xcconfig index 6783912e..ad0ea983 100644 --- a/app/python.xcconfig +++ b/app/python.xcconfig @@ -1,5 +1,5 @@ -// Generated by deps/framework/config.py at 2022-07-02 00:33:46.129386 -PYTHON_FRAMEWORK = $(PROJECT_DIR)/deps/framework/Python.framework +// Generated by deps/frameworks/config.py at 2022-07-02 11:34:29.273498 +PYTHON_FRAMEWORK = $(PROJECT_DIR)/deps/frameworks/Python.framework PYTHON = $(PYTHON_FRAMEWORK)/Versions/3.10/bin/python3 LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.10/lib/python3.10/config-3.10-darwin HEADER_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.10/include/python3.10 diff --git a/deps/framework/Makefile b/deps/frameworks/Makefile similarity index 100% rename from deps/framework/Makefile rename to deps/frameworks/Makefile diff --git a/deps/framework/config.py b/deps/frameworks/config.py similarity index 85% rename from deps/framework/config.py rename to deps/frameworks/config.py index cf371386..acdd2a46 100644 --- a/deps/framework/config.py +++ b/deps/frameworks/config.py @@ -4,8 +4,8 @@ from datetime import datetime # customize Xcode's libpython paths based on the Python.framework interpreter -config = """// Generated by deps/framework/config.py at {timestamp} -PYTHON_FRAMEWORK = $(PROJECT_DIR)/deps/framework/Python.framework +config = """// Generated by deps/frameworks/config.py at {timestamp} +PYTHON_FRAMEWORK = $(PROJECT_DIR)/deps/frameworks/Python.framework PYTHON = $(PYTHON_FRAMEWORK)/Versions/{py_version}/bin/python3 LIBRARY_SEARCH_PATHS = $(inherited) {py_lib} HEADER_SEARCH_PATHS = $(inherited) {py_inc} diff --git a/deps/framework/requirements.txt b/deps/frameworks/requirements.txt similarity index 100% rename from deps/framework/requirements.txt rename to deps/frameworks/requirements.txt diff --git a/setup.py b/setup.py index 22f9658a..ea4ef81f 100644 --- a/setup.py +++ b/setup.py @@ -363,7 +363,7 @@ def run(self): ) # Download Sparkle (if necessary) and copy it into the bundle - ORIG = 'deps/framework/Sparkle.framework' + ORIG = 'deps/frameworks/Sparkle.framework' SPARKLE = join(APP,'Contents/Frameworks/Sparkle.framework') if not exists(ORIG): self.mkpath(dirname(ORIG)) From 3decd6eaadc15b32f094171abf7e92182d23f33c Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 2 Jul 2022 12:43:27 -0400 Subject: [PATCH 100/226] update codesigning --- setup.py | 61 +++++++++++++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/setup.py b/setup.py index ea4ef81f..7d7f2fd1 100644 --- a/setup.py +++ b/setup.py @@ -108,19 +108,20 @@ # helpers for dealing with plists & git (spiritual cousins if ever there were) import plistlib def info_plist(pth='app/info.plist'): - info = plistlib.readPlist(pth) + info = plistlib.load(open(pth, 'rb')) # overwrite the xcode placeholder vars info['CFBundleExecutable'] = info['CFBundleName'] = APP_NAME return info def update_plist(pth, **modifications): - info = plistlib.readPlist(pth) + info = plistlib.load(open(pth, 'rb')) for key, val in modifications.items(): if val is None: info.pop(key) else: info[key] = val - plistlib.writePlist(info, pth) + with open(pth, 'wb') as f: + plistlib.dump(info, f) def update_shebang(pth, interpreter): body = open(pth).readlines()[1:] @@ -147,9 +148,7 @@ def gosub(cmd, on_err=True): def timestamp(): from datetime import datetime - from pytz import timezone, utc - now = utc.localize(datetime.utcnow()).astimezone(timezone('US/Eastern')) - return now.strftime("%a, %d %b %Y %H:%M:%S %z") + datetime.now().strftime("%a, %d %b %Y %H:%M:%S") def stale(dst, src): if exists(src): @@ -347,35 +346,33 @@ def run(self): APP = 'dist/PlotDevice.app' ZIP = 'dist/PlotDevice_app-%s.zip' % VERSION - # build the app - self.spawn(['xcodebuild']) + if False: + # run the Xcode build + self.run_command('app') - # we don't need no stinking core dumps - remove_tree(APP+'.dSYM') - - # set the bundle version to the current commit number and prime the updater - info_pth = 'dist/PlotDevice.app/Contents/Info.plist' - update_plist(info_pth, - CFBundleVersion = last_commit(), - CFBundleShortVersionString = VERSION, - SUFeedURL = 'http://plotdevice.io/app.xml', - SUEnableSystemProfiling = 'YES' - ) - - # Download Sparkle (if necessary) and copy it into the bundle - ORIG = 'deps/frameworks/Sparkle.framework' - SPARKLE = join(APP,'Contents/Frameworks/Sparkle.framework') - if not exists(ORIG): - self.mkpath(dirname(ORIG)) - print("Downloading Sparkle.framework") - os.system('curl -L -# %s | xz -dc | tar xf - -C %s %s'%(SPARKLE_URL, dirname(ORIG), basename(ORIG))) - self.mkpath(dirname(SPARKLE)) - self.spawn(['ditto', ORIG, SPARKLE]) + # set the bundle version to the current commit number and prime the updater + info_pth = 'dist/PlotDevice.app/Contents/Info.plist' + update_plist(info_pth, + CFBundleVersion = last_commit(), + CFBundleShortVersionString = VERSION, + SUFeedURL = 'http://plotdevice.io/app.xml', + SUEnableSystemProfiling = 'YES' + ) + + # Download Sparkle (if necessary) and copy it into the bundle + ORIG = 'deps/frameworks/Sparkle.framework' + SPARKLE = join(APP,'Contents/Frameworks/Sparkle.framework') + if not exists(ORIG): + self.mkpath(dirname(ORIG)) + print("Downloading Sparkle.framework") + os.system('curl -L -# %s | xz -dc | tar xf - -C %s %s'%(SPARKLE_URL, dirname(ORIG), basename(ORIG))) + self.mkpath(dirname(SPARKLE)) + self.spawn(['ditto', ORIG, SPARKLE]) # code-sign the app and sparkle bundles, then verify - self.spawn(['codesign', '-f', '-v', '-s', "Developer ID Application", SPARKLE]) - self.spawn(['codesign', '-f', '-v', '-s', "Developer ID Application", APP]) - self.spawn(['spctl', '--assess', '-v', 'dist/PlotDevice.app']) + self.spawn(['codesign', '--deep', '-f', '-v', '-s', "Developer ID Application", APP]) + self.spawn(['codesign', '--verify', '-vv', APP]) + self.spawn(['spctl', '--assess', '-t', 'exec', '-vvv', APP]) # create versioned zipfile of the app self.spawn(['ditto','-ck', '--keepParent', APP, ZIP]) From 9f39cc18e332296524eafb12c8c88d6e3bc91266 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 2 Jul 2022 20:27:06 -0400 Subject: [PATCH 101/226] add notarization to `setup.py dist` --- PlotDevice.xcodeproj/project.pbxproj | 8 ++- app/PlotDevice.entitlements | 12 ++++ app/python.xcconfig | 2 +- setup.py | 97 +++++++++++++++++++--------- 4 files changed, 87 insertions(+), 32 deletions(-) create mode 100644 app/PlotDevice.entitlements diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 782d8e63..168437ec 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -100,10 +100,11 @@ 2A36AE2C2868B4E50088976E /* Python.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python.framework; path = deps/frameworks/Python.framework; sourceTree = ""; }; 2A36AE55286CA75B0088976E /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = "Resources/en.lproj/placeholder-light.pdf"; sourceTree = ""; }; 2A36AE57286CA75B0088976E /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = "Resources/en.lproj/placeholder-dark.pdf"; sourceTree = ""; }; + 2A36AE5C2870AE8E0088976E /* PlotDevice.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = PlotDevice.entitlements; path = app/PlotDevice.entitlements; sourceTree = ""; }; 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 2A37F4C5FDCFA73011CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 2A591FEF185C17D200D1833D /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - 2A64AB46195F4E78001E4E69 /* deps */ = {isa = PBXFileReference; lastKnownFileType = folder; name = deps; path = deps; sourceTree = ""; }; + 2A64AB46195F4E78001E4E69 /* deps */ = {isa = PBXFileReference; lastKnownFileType = folder; path = deps; sourceTree = ""; }; 2A66ECDE18A992BD002903DE /* ace.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = ace.js; path = Resources/ui/js/ace.js; sourceTree = ""; }; 2A66ECDF18A992BD002903DE /* editor.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = editor.js; path = Resources/ui/js/editor.js; sourceTree = ""; }; 2A66ECE018A992BD002903DE /* jquery-2.1.0.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = "jquery-2.1.0.js"; path = "Resources/ui/js/jquery-2.1.0.js"; sourceTree = ""; }; @@ -239,6 +240,7 @@ 2A37F4AAFDCFA73011CA2CEA /* PlotDevice */ = { isa = PBXGroup; children = ( + 2A36AE5C2870AE8E0088976E /* PlotDevice.entitlements */, 6155D9F213E2B79E00675A92 /* CHANGES.md */, 6155D9F313E2B79E00675A92 /* README.md */, 611CC4AE10BA8C1B00B55455 /* plotdevice */, @@ -595,10 +597,12 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_ENTITLEMENTS = app/PlotDevice.entitlements; CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; COPY_PHASE_STRIP = NO; + ENABLE_HARDENED_RUNTIME = YES; FRAMEWORK_SEARCH_PATHS = ( "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**", "$(PROJECT_DIR)/deps/frameworks", @@ -625,10 +629,12 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_ENTITLEMENTS = app/PlotDevice.entitlements; CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; CONFIGURATION_BUILD_DIR = dist; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_HARDENED_RUNTIME = YES; FRAMEWORK_SEARCH_PATHS = ( "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/**", "$(PROJECT_DIR)/deps/frameworks", diff --git a/app/PlotDevice.entitlements b/app/PlotDevice.entitlements new file mode 100644 index 00000000..48f7bf5c --- /dev/null +++ b/app/PlotDevice.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.disable-library-validation + + + diff --git a/app/python.xcconfig b/app/python.xcconfig index ad0ea983..c31dd933 100644 --- a/app/python.xcconfig +++ b/app/python.xcconfig @@ -1,4 +1,4 @@ -// Generated by deps/frameworks/config.py at 2022-07-02 11:34:29.273498 +// Generated by deps/frameworks/config.py at 2022-07-02 19:55:54.413016 PYTHON_FRAMEWORK = $(PROJECT_DIR)/deps/frameworks/Python.framework PYTHON = $(PYTHON_FRAMEWORK)/Versions/3.10/bin/python3 LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.10/lib/python3.10/config-3.10-darwin diff --git a/setup.py b/setup.py index 7d7f2fd1..0279cb71 100644 --- a/setup.py +++ b/setup.py @@ -97,6 +97,7 @@ * Mac OS X 11+ * Python 3.8+ +* Python 3.6+ """ ## Basic Utils ## @@ -131,7 +132,7 @@ def update_shebang(pth, interpreter): def last_commit(): commit_count, _, _ = gosub('git log --oneline | wc -l') - return 'r%s' % commit_count.strip() + return 'r%s' % commit_count.decode('utf-8').strip() def gosub(cmd, on_err=True): """Run a shell command and return the output""" @@ -168,6 +169,7 @@ def finalize_options(self): def run(self): os.system('rm -rf ./build ./dist') os.system('rm -rf ./deps/local') + os.system('rm -rf ./deps/frameworks/*.framework') os.system('rm -rf plotdevice.egg-info MANIFEST.in PKG') os.system('rm -rf ./tests/_out ./tests/_diff ./details.html') os.system('rm -f ./_plotdevice.*.so') @@ -234,6 +236,7 @@ def run(self): class BuildCommand(build_py): def run(self): + # let the real build_py routine do its thing build_py.run(self) @@ -273,10 +276,10 @@ def initialize_options(self): def finalize_options(self): # make sure the embedded framework exists (and has updated app/python.xcconfig) print("Set up Python.framework for app build") - call('cd deps/embed && make', shell=True) + call('cd deps/frameworks && make', shell=True) def run(self): - self.spawn(['xcodebuild']) + self.spawn(['xcodebuild', '-configuration', 'Release']) remove_tree('dist/PlotDevice.app.dSYM') print("done building PlotDevice.app in ./dist") @@ -346,35 +349,69 @@ def run(self): APP = 'dist/PlotDevice.app' ZIP = 'dist/PlotDevice_app-%s.zip' % VERSION - if False: - # run the Xcode build - self.run_command('app') - - # set the bundle version to the current commit number and prime the updater - info_pth = 'dist/PlotDevice.app/Contents/Info.plist' - update_plist(info_pth, - CFBundleVersion = last_commit(), - CFBundleShortVersionString = VERSION, - SUFeedURL = 'http://plotdevice.io/app.xml', - SUEnableSystemProfiling = 'YES' - ) - - # Download Sparkle (if necessary) and copy it into the bundle - ORIG = 'deps/frameworks/Sparkle.framework' - SPARKLE = join(APP,'Contents/Frameworks/Sparkle.framework') - if not exists(ORIG): - self.mkpath(dirname(ORIG)) - print("Downloading Sparkle.framework") - os.system('curl -L -# %s | xz -dc | tar xf - -C %s %s'%(SPARKLE_URL, dirname(ORIG), basename(ORIG))) - self.mkpath(dirname(SPARKLE)) - self.spawn(['ditto', ORIG, SPARKLE]) - - # code-sign the app and sparkle bundles, then verify - self.spawn(['codesign', '--deep', '-f', '-v', '-s', "Developer ID Application", APP]) + # run the Xcode build + self.run_command('app') + + # set the bundle version to the current commit number and prime the updater + info_pth = 'dist/PlotDevice.app/Contents/Info.plist' + update_plist(info_pth, + CFBundleVersion = last_commit(), + CFBundleShortVersionString = VERSION, + SUFeedURL = 'http://plotdevice.io/app.xml', + SUEnableSystemProfiling = 'YES' + ) + + # Download Sparkle (if necessary) and copy it into the bundle + ORIG = 'deps/frameworks/Sparkle.framework' + SPARKLE = join(APP,'Contents/Frameworks/Sparkle.framework') + if not exists(ORIG): + self.mkpath(dirname(ORIG)) + print("Downloading Sparkle.framework") + os.system('curl -L -# %s | xz -dc | tar xf - -C %s %s'%(SPARKLE_URL, dirname(ORIG), basename(ORIG))) + self.mkpath(dirname(SPARKLE)) + self.spawn(['ditto', ORIG, SPARKLE]) + + # code-sign the app and embedded frameworks, then verify + def codesign(root, name=None, exec=False, entitlement=False): + test = [] + if name: + test += ['-name', name] + if exec: + test += ['-perm', '-u=x'] + + codesign = ['codesign', '--deep', '--strict', '--timestamp', '-o', 'runtime', '-f', '-v', '-s', 'Developer ID Application'] + if entitlement: + codesign += ['--entitlements', 'app/PlotDevice.entitlements'] + + if test: + self.spawn(['find', root, '-type', 'f', *test, '-exec', *codesign, "{}", ";"]) + else: + self.spawn([*codesign, root]) + + PYTHON = join(APP,'Contents/Frameworks/Python.framework') + codesign('%s/Versions/Current/lib'%PYTHON, name="*.dylib") + codesign('%s/Versions/Current/lib'%PYTHON, name="*.o") + codesign('%s/Versions/Current/lib'%PYTHON, name="*.a") + codesign('%s/Versions/Current/lib'%PYTHON, exec=True) + codesign('%s/Versions/Current/bin'%PYTHON, exec=True) + codesign('%s/Versions/Current/bin'%PYTHON, name="python3.*", entitlement=True) + codesign('%s/Versions/Current/Resources/Python.app'%PYTHON, entitlement=True) + codesign(PYTHON) + self.spawn(['codesign', '--verify', '-vv', PYTHON]) + + codesign('%s/Versions/Current/Updater.app'%SPARKLE) + codesign(SPARKLE) + self.spawn(['codesign', '--verify', '-vv', SPARKLE]) + + codesign(APP) self.spawn(['codesign', '--verify', '-vv', APP]) - self.spawn(['spctl', '--assess', '-t', 'exec', '-vvv', APP]) - # create versioned zipfile of the app + # create versioned zipfile of the app & notarize it + self.spawn(['ditto', '-ck', '--keepParent', APP, ZIP]) + self.spawn(['xcrun', 'notarytool', 'submit', ZIP, '--keychain-profile', 'AC_NOTARY', '--wait']) + + # staple notarization ticket and regenerate zip + self.spawn(['xcrun', 'stapler', 'staple', APP]) self.spawn(['ditto','-ck', '--keepParent', APP, ZIP]) # write out the release metadata for plotdevice-site to consume/merge From ee32bcdaa3a5b96e6b0963b61aa7df06b915953d Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 2 Jul 2022 20:27:34 -0400 Subject: [PATCH 102/226] support python 3.6 --- README.md | 15 ++++++++++----- setup.py | 9 ++++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 64318acb..d05abee3 100644 --- a/README.md +++ b/README.md @@ -15,15 +15,20 @@ of 2D imagery and powerful compositing operations. The PlotDevice application requires macOS 11 or greater (either on Intel or Apple Silicon) and comes bundled with a Python 3.10 distribution. The module can be installed via `pip3` -on Python versions ≥3.8 (including the interpreter from the Xcode +on Python versions ≥3.6 (including the interpreter from the Xcode [command line tools](https://developer.apple.com/download/all/?q=command%20line%20tools%20for%20xcode)). -When using [pyenv](https://github.com/pyenv/pyenv), be sure to build the interpreter as a -**Framework** if you want to be able to view your script's output in a window: +When using [pyenv](https://github.com/pyenv/pyenv) (or compiling Python from source) you have the +option of building the interpreter as a **Framework**. This gives you access to a GUI interface for +running PlotDevice scripts via the `python3 -m plotdevice` command. Non-framework builds support the +command line's `--export` functionality and will open a viewer window, but will not show an icon in +the Dock or give you access to the menu bar. + +To set up and run a script using a Framework build, do something along the lines of: ```console env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.10.4 -pyenv local 3.10.4 -python3 -m plotdevice +pyenv shell 3.10.4 +python3 -m plotdevice ``` #### Latest changes (July 2020) diff --git a/setup.py b/setup.py index 0279cb71..b0c8406b 100644 --- a/setup.py +++ b/setup.py @@ -49,7 +49,11 @@ "License :: OSI Approved :: MIT License", "Operating System :: MacOS :: MacOS X", "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", "Topic :: Artistic Software", "Topic :: Multimedia :: Graphics", "Topic :: Multimedia :: Graphics :: Editors :: Vector-Based", @@ -96,7 +100,6 @@ Requirements: * Mac OS X 11+ -* Python 3.8+ * Python 3.6+ """ @@ -501,5 +504,9 @@ def codesign(root, name=None, exec=False, entitlement=False): install_requires=[] )) + # include a backport of dataclasses on 3.6 + if sys.version_info < (3,7): + config['install_requires'].append('dataclasses') + # begin the build process setup(**config) From 8d3ee138e94a9c523cbe0e27f43b4fb2266f1876 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 2 Jul 2022 20:43:08 -0400 Subject: [PATCH 103/226] fix unicode handling for cli-path --- plotdevice/gui/preferences.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/plotdevice/gui/preferences.py b/plotdevice/gui/preferences.py index 7986469f..d6431ce6 100644 --- a/plotdevice/gui/preferences.py +++ b/plotdevice/gui/preferences.py @@ -79,7 +79,7 @@ def possibleToolLocations(): if path.startswith(b'/usr/bin'): continue if path in locations: continue locations.append(path) - return locations + return [pth.decode('utf-8') for pth in locations] @@ -155,7 +155,6 @@ def bindingsChanged_(self, sender): def checkAutosave(self): enabled = get_default('autosave') - print('autosave ==', enabled) if enabled: self.autosaveEnabledRadio.setState_(NSOnState) else: @@ -165,9 +164,6 @@ def checkAutosave(self): @IBAction def autosaveChanged_(self, sender): enabled = sender.tag() == 1 - print('autosave ->', enabled) - set_default('autosave', enabled) - # self._notify('AutosaveChanged') def checkThemes(self): light = sorted([t for t,m in THEMES.items() if not m['dark']], reverse=True) @@ -230,10 +226,9 @@ def fontChanged_(self, sender): def checkTool(self): found, valid, action = self._tool - self.toolAction.setTitle_(action.title()) self.toolPath.setSelectable_(found is not None) - self.toolPath.setStringValue_(found.decode('utf8') if found else '') + self.toolPath.setStringValue_(found.replace(os.environ['HOME'], '~') if found else '') self.toolPath.setTextColor_(NSColor.labelColor() if valid else NSColor.systemRedColor()) self.toolBoilerplate.setHidden_(found is not None) self.toolPath.setHidden_(found is None) @@ -244,7 +239,7 @@ def _tool(self): for path in possibleToolLocations(): if os.path.islink(path): # if it's a symlink, make sure it points to this bundle - tool_path = os.path.realpath(path).decode('utf8') + tool_path = os.path.realpath(path) found = path valid = tool_path.startswith(bundle_path()) if valid: @@ -267,9 +262,9 @@ def toolChanged_(self, sender): found, _, action = self._tool if action == 'reveal': - os.system(b'open --reveal "%s"'%found) + os.system(b'open --reveal "%s"' % found.encode('utf-8')) elif action in ('install', 'repair'): - locs = [loc.decode('utf8').replace(os.environ['HOME'], '~') for loc in possibleToolLocations()] + locs = [loc.replace(os.environ['HOME'], '~') for loc in possibleToolLocations()] self.toolInstallMenu.removeAllItems() self.toolInstallMenu.addItemsWithTitles_(locs) NSApp().beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.toolInstallSheet, self.window(), self, None, 0) From 9c39641490b4dcdf6dadff3e60d284a165275a71 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sun, 3 Jul 2022 16:59:36 -0400 Subject: [PATCH 104/226] update ace.js to 1.7.1 - dropped jquery and underscore dependencies --- PlotDevice.xcodeproj/project.pbxproj | 16 +- app/Resources/ui/autocomplete.css | 471 +- app/Resources/ui/editor.html | 13 +- app/Resources/ui/js/ace.js | 1 - app/Resources/ui/js/ace/ace.js | 21575 ++++++++++++++++ app/Resources/ui/js/ace/ext-beautify.js | 351 + app/Resources/ui/js/ace/ext-code_lens.js | 243 + .../ui/js/ace/ext-elastic_tabstops_lite.js | 277 + app/Resources/ui/js/ace/ext-emmet.js | 1331 + app/Resources/ui/js/ace/ext-error_marker.js | 9 + app/Resources/ui/js/ace/ext-hardwrap.js | 125 + .../ui/js/ace/ext-keybinding_menu.js | 193 + app/Resources/ui/js/ace/ext-language_tools.js | 2189 ++ app/Resources/ui/js/ace/ext-linking.js | 64 + app/Resources/ui/js/ace/ext-modelist.js | 253 + app/Resources/ui/js/ace/ext-options.js | 804 + app/Resources/ui/js/ace/ext-prompt.js | 2825 ++ app/Resources/ui/js/ace/ext-rtl.js | 122 + app/Resources/ui/js/ace/ext-searchbox.js | 514 + app/Resources/ui/js/ace/ext-settings_menu.js | 825 + app/Resources/ui/js/ace/ext-spellcheck.js | 73 + app/Resources/ui/js/ace/ext-split.js | 207 + .../ui/js/ace/ext-static_highlight.js | 229 + app/Resources/ui/js/ace/ext-statusbar.js | 56 + app/Resources/ui/js/ace/ext-textarea.js | 430 + app/Resources/ui/js/ace/ext-themelist.js | 67 + app/Resources/ui/js/ace/ext-whitespace.js | 213 + app/Resources/ui/js/ace/keybinding-emacs.js | 1169 + app/Resources/ui/js/ace/keybinding-sublime.js | 422 + app/Resources/ui/js/ace/keybinding-vim.js | 6283 +++++ app/Resources/ui/js/ace/keybinding-vscode.js | 262 + app/Resources/ui/js/ace/mode-plotdevice.js | 579 + app/Resources/ui/js/ace/mode-text.js | 9 + .../ui/js/ace/snippets/plotdevice.js | 276 + app/Resources/ui/js/ace/snippets/text.js | 9 + app/Resources/ui/js/ace/theme-ambiance.js | 185 + app/Resources/ui/js/ace/theme-blackboard.js | 92 + app/Resources/ui/js/ace/theme-chaos.js | 163 + app/Resources/ui/js/ace/theme-chrome.js | 134 + app/Resources/ui/js/ace/theme-cloud9_day.js | 135 + app/Resources/ui/js/ace/theme-cloud9_night.js | 129 + .../ui/js/ace/theme-cloud9_night_low_color.js | 118 + app/Resources/ui/js/ace/theme-clouds.js | 102 + .../ui/js/ace/theme-clouds_midnight.js | 103 + app/Resources/ui/js/ace/theme-cobalt.js | 120 + .../ui/js/ace/theme-crimson_editor.js | 125 + app/Resources/ui/js/ace/theme-dawn.js | 115 + app/Resources/ui/js/ace/theme-dracula.js | 135 + app/Resources/ui/js/ace/theme-dreamweaver.js | 148 + app/Resources/ui/js/ace/theme-eclipse.js | 105 + app/Resources/ui/js/ace/theme-github.js | 110 + app/Resources/ui/js/ace/theme-gob.js | 119 + app/Resources/ui/js/ace/theme-gruvbox.js | 89 + .../ui/js/ace/theme-gruvbox_dark_hard.js | 137 + .../ui/js/ace/theme-gruvbox_light_hard.js | 137 + app/Resources/ui/js/ace/theme-idle_fingers.js | 103 + app/Resources/ui/js/ace/theme-iplastic.js | 128 + app/Resources/ui/js/ace/theme-katzenmilch.js | 128 + app/Resources/ui/js/ace/theme-kr_theme.js | 111 + app/Resources/ui/js/ace/theme-kuroir.js | 68 + app/Resources/ui/js/ace/theme-merbivore.js | 102 + .../ui/js/ace/theme-merbivore_soft.js | 103 + .../ui/js/ace/theme-mono_industrial.js | 114 + app/Resources/ui/js/ace/theme-monokai.js | 112 + app/Resources/ui/js/ace/theme-nord_dark.js | 102 + app/Resources/ui/js/ace/theme-one_dark.js | 139 + .../ui/js/ace/theme-pastel_on_dark.js | 115 + .../ui/js/ace/theme-solarized_dark.js | 95 + .../ui/js/ace/theme-solarized_light.js | 98 + app/Resources/ui/js/ace/theme-sqlserver.js | 145 + app/Resources/ui/js/ace/theme-terminal.js | 121 + app/Resources/ui/js/ace/theme-textmate.js | 137 + app/Resources/ui/js/ace/theme-tomorrow.js | 115 + .../ui/js/ace/theme-tomorrow_night.js | 115 + .../ui/js/ace/theme-tomorrow_night_blue.js | 113 + .../ui/js/ace/theme-tomorrow_night_bright.js | 128 + .../js/ace/theme-tomorrow_night_eighties.js | 115 + app/Resources/ui/js/ace/theme-twilight.js | 116 + app/Resources/ui/js/ace/theme-vibrant_ink.js | 101 + app/Resources/ui/js/ace/theme-xcode.js | 95 + app/Resources/ui/js/ace/worker-base.js | 1459 ++ app/Resources/ui/js/editor.js | 39 +- app/Resources/ui/js/jquery-2.1.0.js | 4 - app/Resources/ui/js/keybindings.js | 16 +- app/Resources/ui/js/underscore-1.5.2.min.js | 6 - app/Resources/ui/themes.json | 834 +- 86 files changed, 49633 insertions(+), 530 deletions(-) delete mode 100644 app/Resources/ui/js/ace.js create mode 100644 app/Resources/ui/js/ace/ace.js create mode 100644 app/Resources/ui/js/ace/ext-beautify.js create mode 100644 app/Resources/ui/js/ace/ext-code_lens.js create mode 100644 app/Resources/ui/js/ace/ext-elastic_tabstops_lite.js create mode 100644 app/Resources/ui/js/ace/ext-emmet.js create mode 100644 app/Resources/ui/js/ace/ext-error_marker.js create mode 100644 app/Resources/ui/js/ace/ext-hardwrap.js create mode 100644 app/Resources/ui/js/ace/ext-keybinding_menu.js create mode 100644 app/Resources/ui/js/ace/ext-language_tools.js create mode 100644 app/Resources/ui/js/ace/ext-linking.js create mode 100644 app/Resources/ui/js/ace/ext-modelist.js create mode 100644 app/Resources/ui/js/ace/ext-options.js create mode 100644 app/Resources/ui/js/ace/ext-prompt.js create mode 100644 app/Resources/ui/js/ace/ext-rtl.js create mode 100644 app/Resources/ui/js/ace/ext-searchbox.js create mode 100644 app/Resources/ui/js/ace/ext-settings_menu.js create mode 100644 app/Resources/ui/js/ace/ext-spellcheck.js create mode 100644 app/Resources/ui/js/ace/ext-split.js create mode 100644 app/Resources/ui/js/ace/ext-static_highlight.js create mode 100644 app/Resources/ui/js/ace/ext-statusbar.js create mode 100644 app/Resources/ui/js/ace/ext-textarea.js create mode 100644 app/Resources/ui/js/ace/ext-themelist.js create mode 100644 app/Resources/ui/js/ace/ext-whitespace.js create mode 100644 app/Resources/ui/js/ace/keybinding-emacs.js create mode 100644 app/Resources/ui/js/ace/keybinding-sublime.js create mode 100644 app/Resources/ui/js/ace/keybinding-vim.js create mode 100644 app/Resources/ui/js/ace/keybinding-vscode.js create mode 100644 app/Resources/ui/js/ace/mode-plotdevice.js create mode 100644 app/Resources/ui/js/ace/mode-text.js create mode 100644 app/Resources/ui/js/ace/snippets/plotdevice.js create mode 100644 app/Resources/ui/js/ace/snippets/text.js create mode 100644 app/Resources/ui/js/ace/theme-ambiance.js create mode 100644 app/Resources/ui/js/ace/theme-blackboard.js create mode 100644 app/Resources/ui/js/ace/theme-chaos.js create mode 100644 app/Resources/ui/js/ace/theme-chrome.js create mode 100644 app/Resources/ui/js/ace/theme-cloud9_day.js create mode 100644 app/Resources/ui/js/ace/theme-cloud9_night.js create mode 100644 app/Resources/ui/js/ace/theme-cloud9_night_low_color.js create mode 100644 app/Resources/ui/js/ace/theme-clouds.js create mode 100644 app/Resources/ui/js/ace/theme-clouds_midnight.js create mode 100644 app/Resources/ui/js/ace/theme-cobalt.js create mode 100644 app/Resources/ui/js/ace/theme-crimson_editor.js create mode 100644 app/Resources/ui/js/ace/theme-dawn.js create mode 100644 app/Resources/ui/js/ace/theme-dracula.js create mode 100644 app/Resources/ui/js/ace/theme-dreamweaver.js create mode 100644 app/Resources/ui/js/ace/theme-eclipse.js create mode 100644 app/Resources/ui/js/ace/theme-github.js create mode 100644 app/Resources/ui/js/ace/theme-gob.js create mode 100644 app/Resources/ui/js/ace/theme-gruvbox.js create mode 100644 app/Resources/ui/js/ace/theme-gruvbox_dark_hard.js create mode 100644 app/Resources/ui/js/ace/theme-gruvbox_light_hard.js create mode 100644 app/Resources/ui/js/ace/theme-idle_fingers.js create mode 100644 app/Resources/ui/js/ace/theme-iplastic.js create mode 100644 app/Resources/ui/js/ace/theme-katzenmilch.js create mode 100644 app/Resources/ui/js/ace/theme-kr_theme.js create mode 100644 app/Resources/ui/js/ace/theme-kuroir.js create mode 100644 app/Resources/ui/js/ace/theme-merbivore.js create mode 100644 app/Resources/ui/js/ace/theme-merbivore_soft.js create mode 100644 app/Resources/ui/js/ace/theme-mono_industrial.js create mode 100644 app/Resources/ui/js/ace/theme-monokai.js create mode 100644 app/Resources/ui/js/ace/theme-nord_dark.js create mode 100644 app/Resources/ui/js/ace/theme-one_dark.js create mode 100644 app/Resources/ui/js/ace/theme-pastel_on_dark.js create mode 100644 app/Resources/ui/js/ace/theme-solarized_dark.js create mode 100644 app/Resources/ui/js/ace/theme-solarized_light.js create mode 100644 app/Resources/ui/js/ace/theme-sqlserver.js create mode 100644 app/Resources/ui/js/ace/theme-terminal.js create mode 100644 app/Resources/ui/js/ace/theme-textmate.js create mode 100644 app/Resources/ui/js/ace/theme-tomorrow.js create mode 100644 app/Resources/ui/js/ace/theme-tomorrow_night.js create mode 100644 app/Resources/ui/js/ace/theme-tomorrow_night_blue.js create mode 100644 app/Resources/ui/js/ace/theme-tomorrow_night_bright.js create mode 100644 app/Resources/ui/js/ace/theme-tomorrow_night_eighties.js create mode 100644 app/Resources/ui/js/ace/theme-twilight.js create mode 100644 app/Resources/ui/js/ace/theme-vibrant_ink.js create mode 100644 app/Resources/ui/js/ace/theme-xcode.js create mode 100644 app/Resources/ui/js/ace/worker-base.js delete mode 100644 app/Resources/ui/js/jquery-2.1.0.js delete mode 100644 app/Resources/ui/js/underscore-1.5.2.min.js diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 168437ec..dccf9085 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -15,12 +15,10 @@ 2A36AE2E2868B4F30088976E /* Python.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2A36AE2C2868B4E50088976E /* Python.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 2A36AE58286CA75B0088976E /* placeholder-light.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 2A36AE54286CA75B0088976E /* placeholder-light.pdf */; }; 2A36AE59286CA75B0088976E /* placeholder-dark.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 2A36AE56286CA75B0088976E /* placeholder-dark.pdf */; }; + 2A36AE5E287210C70088976E /* ace in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A36AE5D287210C70088976E /* ace */; }; 2A591FF0185C17D200D1833D /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A591FEF185C17D200D1833D /* Security.framework */; }; - 2A66ECEB18A99328002903DE /* ace.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECDE18A992BD002903DE /* ace.js */; }; 2A66ECEC18A99328002903DE /* editor.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECDF18A992BD002903DE /* editor.js */; }; - 2A66ECED18A99328002903DE /* jquery-2.1.0.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECE018A992BD002903DE /* jquery-2.1.0.js */; }; 2A66ECEE18A99328002903DE /* keybindings.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECE118A992BD002903DE /* keybindings.js */; }; - 2A66ECEF18A99328002903DE /* underscore-1.5.2.min.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A66ECE218A992BD002903DE /* underscore-1.5.2.min.js */; }; 2A7AF5C818D2AFAA00F8FFC2 /* examples in Resources */ = {isa = PBXBuildFile; fileRef = 2A7AF5C718D2AFAA00F8FFC2 /* examples */; }; 2ABBB2FA1854018B001C4E0A /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2ABBB2F91854018B001C4E0A /* AVFoundation.framework */; }; 2ABBB2FC18540246001C4E0A /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2ABBB2FB18540246001C4E0A /* CoreVideo.framework */; }; @@ -60,11 +58,9 @@ dstPath = ui/js; dstSubfolderSpec = 7; files = ( - 2A66ECEB18A99328002903DE /* ace.js in Copy Editor Scripts */, + 2A36AE5E287210C70088976E /* ace in Copy Editor Scripts */, 2A66ECEC18A99328002903DE /* editor.js in Copy Editor Scripts */, - 2A66ECED18A99328002903DE /* jquery-2.1.0.js in Copy Editor Scripts */, 2A66ECEE18A99328002903DE /* keybindings.js in Copy Editor Scripts */, - 2A66ECEF18A99328002903DE /* underscore-1.5.2.min.js in Copy Editor Scripts */, ); name = "Copy Editor Scripts"; runOnlyForDeploymentPostprocessing = 0; @@ -101,15 +97,13 @@ 2A36AE55286CA75B0088976E /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = "Resources/en.lproj/placeholder-light.pdf"; sourceTree = ""; }; 2A36AE57286CA75B0088976E /* en */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = en; path = "Resources/en.lproj/placeholder-dark.pdf"; sourceTree = ""; }; 2A36AE5C2870AE8E0088976E /* PlotDevice.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = PlotDevice.entitlements; path = app/PlotDevice.entitlements; sourceTree = ""; }; + 2A36AE5D287210C70088976E /* ace */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ace; path = Resources/ui/js/ace; sourceTree = ""; }; 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 2A37F4C5FDCFA73011CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 2A591FEF185C17D200D1833D /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; 2A64AB46195F4E78001E4E69 /* deps */ = {isa = PBXFileReference; lastKnownFileType = folder; path = deps; sourceTree = ""; }; - 2A66ECDE18A992BD002903DE /* ace.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = ace.js; path = Resources/ui/js/ace.js; sourceTree = ""; }; 2A66ECDF18A992BD002903DE /* editor.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = editor.js; path = Resources/ui/js/editor.js; sourceTree = ""; }; - 2A66ECE018A992BD002903DE /* jquery-2.1.0.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = "jquery-2.1.0.js"; path = "Resources/ui/js/jquery-2.1.0.js"; sourceTree = ""; }; 2A66ECE118A992BD002903DE /* keybindings.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = keybindings.js; path = Resources/ui/js/keybindings.js; sourceTree = ""; }; - 2A66ECE218A992BD002903DE /* underscore-1.5.2.min.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = "underscore-1.5.2.min.js"; path = "Resources/ui/js/underscore-1.5.2.min.js"; sourceTree = ""; }; 2A79B1392864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = Resources/en.lproj/AskString.xib; sourceTree = ""; }; 2A79B13A2864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; 2A79B13B2864FDAE0074E96A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -306,11 +300,9 @@ 2A66ECE918A992CD002903DE /* js */ = { isa = PBXGroup; children = ( - 2A66ECDE18A992BD002903DE /* ace.js */, + 2A36AE5D287210C70088976E /* ace */, 2A66ECDF18A992BD002903DE /* editor.js */, - 2A66ECE018A992BD002903DE /* jquery-2.1.0.js */, 2A66ECE118A992BD002903DE /* keybindings.js */, - 2A66ECE218A992BD002903DE /* underscore-1.5.2.min.js */, ); name = js; sourceTree = ""; diff --git a/app/Resources/ui/autocomplete.css b/app/Resources/ui/autocomplete.css index 336c8ab9..dfaba7ae 100644 --- a/app/Resources/ui/autocomplete.css +++ b/app/Resources/ui/autocomplete.css @@ -1,198 +1,405 @@ -#editor.ace-tomorrow-night-blue ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(0, 63, 142, 1.0); background-color:rgba(0, 63, 142, 0.7);} -#editor.ace-tomorrow-night-blue ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(255, 255, 255, 1.0);} -#editor.ace-tomorrow-night-blue ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(0, 63, 142, 1.0); background-color:rgba(0, 63, 142, 0.7);} -#editor.ace-tomorrow-night-blue ~ div.ace_rightAlignedText {color:rgba(114, 133, 183, 1.0);} -#editor.ace-tomorrow-night-blue ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 157, 164, 1.0);} -#editor.ace-tomorrow-night-blue ~ div.ace_autocomplete {background-color:rgba(0, 36, 81, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0);} -#editor.ace-chrome ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} -#editor.ace-chrome ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 0, 0, 1.0);} -#editor.ace-chrome ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} -#editor.ace-chrome ~ div.ace_rightAlignedText {color:rgba(35, 110, 36, 1.0);} -#editor.ace-chrome ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 0, 0, 1.0);} -#editor.ace-chrome ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} -#editor.ace-tomorrow-night-eighties ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(81, 81, 81, 1.0); background-color:rgba(81, 81, 81, 0.7);} -#editor.ace-tomorrow-night-eighties ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(204, 204, 204, 1.0);} -#editor.ace-tomorrow-night-eighties ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(81, 81, 81, 1.0); background-color:rgba(81, 81, 81, 0.7);} -#editor.ace-tomorrow-night-eighties ~ div.ace_rightAlignedText {color:rgba(153, 153, 153, 1.0);} -#editor.ace-tomorrow-night-eighties ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(249, 145, 87, 1.0);} -#editor.ace-tomorrow-night-eighties ~ div.ace_autocomplete {background-color:rgba(45, 45, 45, 1.0); color:rgba(204, 204, 204, 1.0); border-color:rgba(204, 204, 204, 1.0);} +#editor.ace-katzenmilch ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(100, 5, 208, 0.3); background-color:rgba(100, 5, 208, 0.2);} +#editor.ace-katzenmilch ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(15, 0, 9, 1.0);} +#editor.ace-katzenmilch ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(100, 5, 208, 0.3); background-color:rgba(100, 5, 208, 0.2);} +#editor.ace-katzenmilch ~ div.ace_rightAlignedText {color:rgba(64, 79, 80, 0.7);} +#editor.ace-katzenmilch ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(239, 106, 167, 1.0);} +#editor.ace-katzenmilch ~ div.ace_autocomplete {background-color:rgba(243, 242, 243, 1.0); color:rgba(15, 0, 9, 1.0); border-color:rgba(15, 0, 9, 1.0);} +#editor.ace-katzenmilch ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(243, 242, 243, 1.0); color:rgba(15, 0, 9, 1.0); border-color:rgba(15, 0, 9, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(64, 79, 80, 0.7); border-style: dotted; } +#editor.ace-katzenmilch ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(15, 0, 9, 1.0); } +#editor.ace-katzenmilch ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-clouds-midnight ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(0, 0, 0, 1.0); background-color:rgba(0, 0, 0, 0.7);} +#editor.ace-clouds-midnight ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(146, 146, 146, 1.0);} +#editor.ace-clouds-midnight ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(0, 0, 0, 1.0); background-color:rgba(0, 0, 0, 0.7);} +#editor.ace-clouds-midnight ~ div.ace_rightAlignedText {color:rgba(60, 64, 59, 1.0);} +#editor.ace-clouds-midnight ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(233, 46, 46, 1.0);} +#editor.ace-clouds-midnight ~ div.ace_autocomplete {background-color:rgba(25, 25, 25, 1.0); color:rgba(146, 146, 146, 1.0); border-color:rgba(146, 146, 146, 1.0);} +#editor.ace-clouds-midnight ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(25, 25, 25, 1.0); color:rgba(146, 146, 146, 1.0); border-color:rgba(146, 146, 146, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(60, 64, 59, 1.0); border-style: dotted; } +#editor.ace-clouds-midnight ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(146, 146, 146, 1.0); } +#editor.ace-clouds-midnight ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-tomorrow-night-bright ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(66, 66, 66, 1.0); background-color:rgba(66, 66, 66, 0.7);} +#editor.ace-tomorrow-night-bright ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(222, 222, 222, 1.0);} +#editor.ace-tomorrow-night-bright ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(66, 66, 66, 1.0); background-color:rgba(66, 66, 66, 0.7);} +#editor.ace-tomorrow-night-bright ~ div.ace_rightAlignedText {color:rgba(150, 152, 150, 1.0);} +#editor.ace-tomorrow-night-bright ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(231, 140, 69, 1.0);} +#editor.ace-tomorrow-night-bright ~ div.ace_autocomplete {background-color:rgba(0, 0, 0, 1.0); color:rgba(222, 222, 222, 1.0); border-color:rgba(222, 222, 222, 1.0);} +#editor.ace-tomorrow-night-bright ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(0, 0, 0, 1.0); color:rgba(222, 222, 222, 1.0); border-color:rgba(222, 222, 222, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(150, 152, 150, 1.0); border-style: dotted; } +#editor.ace-tomorrow-night-bright ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(222, 222, 222, 1.0); } +#editor.ace-tomorrow-night-bright ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } #editor.ace-chaos ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(73, 72, 54, 1.0); background-color:rgba(73, 72, 54, 0.7);} #editor.ace-chaos ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(230, 225, 220, 1.0);} #editor.ace-chaos ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(73, 72, 54, 1.0); background-color:rgba(73, 72, 54, 0.7);} #editor.ace-chaos ~ div.ace_rightAlignedText {color:rgba(85, 85, 85, 1.0);} #editor.ace-chaos ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 48, 143, 1.0);} #editor.ace-chaos ~ div.ace_autocomplete {background-color:rgba(22, 22, 22, 1.0); color:rgba(230, 225, 220, 1.0); border-color:rgba(230, 225, 220, 1.0);} -#editor.ace-terminal-theme ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(66, 66, 66, 1.0); background-color:rgba(66, 66, 66, 0.7);} -#editor.ace-terminal-theme ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(222, 222, 222, 1.0);} -#editor.ace-terminal-theme ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(66, 66, 66, 1.0); background-color:rgba(66, 66, 66, 0.7);} -#editor.ace-terminal-theme ~ div.ace_rightAlignedText {color:rgba(255, 69, 0, 1.0);} -#editor.ace-terminal-theme ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 20, 147, 1.0);} -#editor.ace-terminal-theme ~ div.ace_autocomplete {background-color:rgba(0, 0, 0, 1.0); color:rgba(222, 222, 222, 1.0); border-color:rgba(222, 222, 222, 1.0);} -#editor.ace-dreamweaver ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} -#editor.ace-dreamweaver ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 0, 0, 1.0);} -#editor.ace-dreamweaver ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} -#editor.ace-dreamweaver ~ div.ace_rightAlignedText {color:rgba(76, 136, 107, 1.0);} -#editor.ace-dreamweaver ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 0, 0, 1.0);} -#editor.ace-dreamweaver ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} -#editor.ace-merbivore-soft ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(73, 73, 73, 1.0); background-color:rgba(73, 73, 73, 0.7);} -#editor.ace-merbivore-soft ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(230, 225, 220, 1.0);} -#editor.ace-merbivore-soft ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(73, 73, 73, 1.0); background-color:rgba(73, 73, 73, 0.7);} -#editor.ace-merbivore-soft ~ div.ace_rightAlignedText {color:rgba(172, 75, 184, 1.0);} -#editor.ace-merbivore-soft ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(252, 128, 58, 1.0);} -#editor.ace-merbivore-soft ~ div.ace_autocomplete {background-color:rgba(28, 28, 28, 1.0); color:rgba(230, 225, 220, 1.0); border-color:rgba(230, 225, 220, 1.0);} +#editor.ace-chaos ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(22, 22, 22, 1.0); color:rgba(230, 225, 220, 1.0); border-color:rgba(230, 225, 220, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(85, 85, 85, 1.0); border-style: dotted; } +#editor.ace-chaos ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(230, 225, 220, 1.0); } +#editor.ace-chaos ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-kuroir ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(245, 170, 0, 0.6); background-color:rgba(245, 170, 0, 0.4);} +#editor.ace-kuroir ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(54, 54, 54, 1.0);} +#editor.ace-kuroir ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(245, 170, 0, 0.6); background-color:rgba(245, 170, 0, 0.4);} +#editor.ace-kuroir ~ div.ace_rightAlignedText {color:rgba(148, 148, 148, 0.9);} +#editor.ace-kuroir ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(253, 18, 36, 1.0);} +#editor.ace-kuroir ~ div.ace_autocomplete {background-color:rgba(232, 233, 232, 1.0); color:rgba(54, 54, 54, 1.0); border-color:rgba(54, 54, 54, 1.0);} +#editor.ace-kuroir ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(232, 233, 232, 1.0); color:rgba(54, 54, 54, 1.0); border-color:rgba(54, 54, 54, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(148, 148, 148, 0.9); border-style: dotted; } +#editor.ace-kuroir ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(54, 54, 54, 1.0); } +#editor.ace-kuroir ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } #editor.ace-monokai ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(73, 72, 62, 1.0); background-color:rgba(73, 72, 62, 0.7);} #editor.ace-monokai ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(248, 248, 242, 1.0);} #editor.ace-monokai ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(73, 72, 62, 1.0); background-color:rgba(73, 72, 62, 0.7);} #editor.ace-monokai ~ div.ace_rightAlignedText {color:rgba(117, 113, 94, 1.0);} #editor.ace-monokai ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(249, 38, 114, 1.0);} #editor.ace-monokai ~ div.ace_autocomplete {background-color:rgba(39, 40, 34, 1.0); color:rgba(248, 248, 242, 1.0); border-color:rgba(248, 248, 242, 1.0);} +#editor.ace-monokai ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(39, 40, 34, 1.0); color:rgba(248, 248, 242, 1.0); border-color:rgba(248, 248, 242, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(117, 113, 94, 1.0); border-style: dotted; } +#editor.ace-monokai ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(248, 248, 242, 1.0); } +#editor.ace-monokai ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } #editor.ace-solarized-light ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(7, 54, 67, 0.1); background-color:rgba(7, 54, 67, 0.1);} #editor.ace-solarized-light ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(88, 110, 117, 1.0);} #editor.ace-solarized-light ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(7, 54, 67, 0.1); background-color:rgba(7, 54, 67, 0.1);} #editor.ace-solarized-light ~ div.ace_rightAlignedText {color:rgba(147, 161, 161, 1.0);} #editor.ace-solarized-light ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(211, 1, 2, 1.0);} #editor.ace-solarized-light ~ div.ace_autocomplete {background-color:rgba(253, 246, 227, 1.0); color:rgba(88, 110, 117, 1.0); border-color:rgba(88, 110, 117, 1.0);} +#editor.ace-solarized-light ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(253, 246, 227, 1.0); color:rgba(88, 110, 117, 1.0); border-color:rgba(88, 110, 117, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(147, 161, 161, 1.0); border-style: dotted; } +#editor.ace-solarized-light ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(88, 110, 117, 1.0); } +#editor.ace-solarized-light ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-eclipse ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-eclipse ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 0, 0, 1.0);} +#editor.ace-eclipse ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-eclipse ~ div.ace_rightAlignedText {color:rgba(113, 150, 130, 1.0);} +#editor.ace-eclipse ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(127, 0, 85, 1.0);} +#editor.ace-eclipse ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} +#editor.ace-eclipse ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(113, 150, 130, 1.0); border-style: dotted; } +#editor.ace-eclipse ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(0, 0, 0, 1.0); } +#editor.ace-eclipse ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-ambiance ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} +#editor.ace-ambiance ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(230, 225, 220, 1.0);} +#editor.ace-ambiance ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} +#editor.ace-ambiance ~ div.ace_rightAlignedText {color:rgba(85, 85, 85, 1.0);} +#editor.ace-ambiance ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(250, 141, 106, 1.0);} +#editor.ace-ambiance ~ div.ace_autocomplete {background-color:rgba(32, 32, 32, 1.0); color:rgba(230, 225, 220, 1.0); border-color:rgba(230, 225, 220, 1.0);} +#editor.ace-ambiance ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(32, 32, 32, 1.0); color:rgba(230, 225, 220, 1.0); border-color:rgba(230, 225, 220, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(85, 85, 85, 1.0); border-style: dotted; } +#editor.ace-ambiance ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(230, 225, 220, 1.0); } +#editor.ace-ambiance ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-merbivore-soft ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(73, 73, 73, 1.0); background-color:rgba(73, 73, 73, 0.7);} +#editor.ace-merbivore-soft ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(230, 225, 220, 1.0);} +#editor.ace-merbivore-soft ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(73, 73, 73, 1.0); background-color:rgba(73, 73, 73, 0.7);} +#editor.ace-merbivore-soft ~ div.ace_rightAlignedText {color:rgba(172, 75, 184, 1.0);} +#editor.ace-merbivore-soft ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(252, 128, 58, 1.0);} +#editor.ace-merbivore-soft ~ div.ace_autocomplete {background-color:rgba(28, 28, 28, 1.0); color:rgba(230, 225, 220, 1.0); border-color:rgba(230, 225, 220, 1.0);} +#editor.ace-merbivore-soft ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(28, 28, 28, 1.0); color:rgba(230, 225, 220, 1.0); border-color:rgba(230, 225, 220, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(172, 75, 184, 1.0); border-style: dotted; } +#editor.ace-merbivore-soft ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(230, 225, 220, 1.0); } +#editor.ace-merbivore-soft ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-gob ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} +#editor.ace-gob ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 255, 0, 1.0);} +#editor.ace-gob ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} +#editor.ace-gob ~ div.ace_rightAlignedText {color:rgba(0, 224, 96, 1.0);} +#editor.ace-gob ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(248, 248, 248, 1.0);} +#editor.ace-gob ~ div.ace_autocomplete {background-color:rgba(11, 11, 11, 1.0); color:rgba(0, 255, 0, 1.0); border-color:rgba(0, 255, 0, 1.0);} +#editor.ace-gob ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(11, 11, 11, 1.0); color:rgba(0, 255, 0, 1.0); border-color:rgba(0, 255, 0, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(0, 224, 96, 1.0); border-style: dotted; } +#editor.ace-gob ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(0, 255, 0, 1.0); } +#editor.ace-gob ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-kr-theme ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(170, 0, 255, 0.4); background-color:rgba(170, 0, 255, 0.3);} +#editor.ace-kr-theme ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(252, 255, 224, 1.0);} +#editor.ace-kr-theme ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(170, 0, 255, 0.4); background-color:rgba(170, 0, 255, 0.3);} +#editor.ace-kr-theme ~ div.ace_rightAlignedText {color:rgba(112, 109, 91, 1.0);} +#editor.ace-kr-theme ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 153, 0, 1.0);} +#editor.ace-kr-theme ~ div.ace_autocomplete {background-color:rgba(11, 10, 9, 1.0); color:rgba(252, 255, 224, 1.0); border-color:rgba(252, 255, 224, 1.0);} +#editor.ace-kr-theme ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(11, 10, 9, 1.0); color:rgba(252, 255, 224, 1.0); border-color:rgba(252, 255, 224, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(112, 109, 91, 1.0); border-style: dotted; } +#editor.ace-kr-theme ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(252, 255, 224, 1.0); } +#editor.ace-kr-theme ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-twilight ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} +#editor.ace-twilight ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(248, 248, 248, 1.0);} +#editor.ace-twilight ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} +#editor.ace-twilight ~ div.ace_rightAlignedText {color:rgba(95, 90, 96, 1.0);} +#editor.ace-twilight ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(207, 106, 76, 1.0);} +#editor.ace-twilight ~ div.ace_autocomplete {background-color:rgba(20, 20, 20, 1.0); color:rgba(248, 248, 248, 1.0); border-color:rgba(248, 248, 248, 1.0);} +#editor.ace-twilight ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(20, 20, 20, 1.0); color:rgba(248, 248, 248, 1.0); border-color:rgba(248, 248, 248, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(95, 90, 96, 1.0); border-style: dotted; } +#editor.ace-twilight ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(248, 248, 248, 1.0); } +#editor.ace-twilight ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-cloud9-night ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(66, 66, 66, 1.0); background-color:rgba(66, 66, 66, 0.7);} +#editor.ace-cloud9-night ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(235, 235, 235, 1.0);} +#editor.ace-cloud9-night ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(66, 66, 66, 1.0); background-color:rgba(66, 66, 66, 0.7);} +#editor.ace-cloud9-night ~ div.ace_rightAlignedText {color:rgba(150, 152, 150, 1.0);} +#editor.ace-cloud9-night ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(231, 140, 69, 1.0);} +#editor.ace-cloud9-night ~ div.ace_autocomplete {background-color:rgba(24, 24, 24, 1.0); color:rgba(235, 235, 235, 1.0); border-color:rgba(235, 235, 235, 1.0);} +#editor.ace-cloud9-night ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(24, 24, 24, 1.0); color:rgba(235, 235, 235, 1.0); border-color:rgba(235, 235, 235, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(150, 152, 150, 1.0); border-style: dotted; } +#editor.ace-cloud9-night ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(235, 235, 235, 1.0); } +#editor.ace-cloud9-night ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-mono-industrial ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(145, 153, 148, 0.4); background-color:rgba(145, 153, 148, 0.3);} +#editor.ace-mono-industrial ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(255, 255, 255, 1.0);} +#editor.ace-mono-industrial ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(145, 153, 148, 0.4); background-color:rgba(145, 153, 148, 0.3);} +#editor.ace-mono-industrial ~ div.ace_rightAlignedText {color:rgba(102, 108, 104, 1.0);} +#editor.ace-mono-industrial ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(233, 136, 0, 1.0);} +#editor.ace-mono-industrial ~ div.ace_autocomplete {background-color:rgba(34, 44, 40, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0);} +#editor.ace-mono-industrial ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(34, 44, 40, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(102, 108, 104, 1.0); border-style: dotted; } +#editor.ace-mono-industrial ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(255, 255, 255, 1.0); } +#editor.ace-mono-industrial ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-xcode ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-xcode ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 0, 0, 1.0);} +#editor.ace-xcode ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-xcode ~ div.ace_rightAlignedText {color:rgba(0, 142, 0, 1.0);} +#editor.ace-xcode ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(223, 0, 2, 1.0);} +#editor.ace-xcode ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} +#editor.ace-xcode ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(0, 142, 0, 1.0); border-style: dotted; } +#editor.ace-xcode ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(0, 0, 0, 1.0); } +#editor.ace-xcode ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-gruvbox-light-hard ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(235, 219, 178, 1.0); background-color:rgba(235, 219, 178, 0.7);} +#editor.ace-gruvbox-light-hard ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(60, 56, 54, 0.5);} +#editor.ace-gruvbox-light-hard ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(235, 219, 178, 1.0); background-color:rgba(235, 219, 178, 0.7);} +#editor.ace-gruvbox-light-hard ~ div.ace_rightAlignedText {color:rgba(146, 131, 116, 1.0);} +#editor.ace-gruvbox-light-hard ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(157, 0, 6, 1.0);} +#editor.ace-gruvbox-light-hard ~ div.ace_autocomplete {background-color:rgba(249, 245, 215, 1.0); color:rgba(60, 56, 54, 0.5); border-color:rgba(60, 56, 54, 0.5);} +#editor.ace-gruvbox-light-hard ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(249, 245, 215, 1.0); color:rgba(60, 56, 54, 0.5); border-color:rgba(60, 56, 54, 0.5); font-family: -apple-system; font-size: 80%; color: rgba(146, 131, 116, 1.0); border-style: dotted; } +#editor.ace-gruvbox-light-hard ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(60, 56, 54, 0.5); } +#editor.ace-gruvbox-light-hard ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-gruvbox ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(179, 101, 57, 0.7); background-color:rgba(179, 101, 57, 0.5);} +#editor.ace-gruvbox ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(235, 218, 180, 1.0);} +#editor.ace-gruvbox ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(179, 101, 57, 0.7); background-color:rgba(179, 101, 57, 0.5);} +#editor.ace-gruvbox ~ div.ace_rightAlignedText {color:rgba(146, 131, 117, 1.0);} +#editor.ace-gruvbox ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 0, 0, 1.0);} +#editor.ace-gruvbox ~ div.ace_autocomplete {background-color:rgba(29, 32, 33, 1.0); color:rgba(235, 218, 180, 1.0); border-color:rgba(235, 218, 180, 1.0);} +#editor.ace-gruvbox ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(29, 32, 33, 1.0); color:rgba(235, 218, 180, 1.0); border-color:rgba(235, 218, 180, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(146, 131, 117, 1.0); border-style: dotted; } +#editor.ace-gruvbox ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(235, 218, 180, 1.0); } +#editor.ace-gruvbox ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-terminal-theme ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(66, 66, 66, 1.0); background-color:rgba(66, 66, 66, 0.7);} +#editor.ace-terminal-theme ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(222, 222, 222, 1.0);} +#editor.ace-terminal-theme ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(66, 66, 66, 1.0); background-color:rgba(66, 66, 66, 0.7);} +#editor.ace-terminal-theme ~ div.ace_rightAlignedText {color:rgba(255, 69, 0, 1.0);} +#editor.ace-terminal-theme ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 20, 147, 1.0);} +#editor.ace-terminal-theme ~ div.ace_autocomplete {background-color:rgba(0, 0, 0, 1.0); color:rgba(222, 222, 222, 1.0); border-color:rgba(222, 222, 222, 1.0);} +#editor.ace-terminal-theme ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(0, 0, 0, 1.0); color:rgba(222, 222, 222, 1.0); border-color:rgba(222, 222, 222, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(255, 69, 0, 1.0); border-style: dotted; } +#editor.ace-terminal-theme ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(222, 222, 222, 1.0); } +#editor.ace-terminal-theme ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } #editor.ace-blackboard ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(50, 80, 135, 1.0); background-color:rgba(50, 80, 135, 0.7);} #editor.ace-blackboard ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(248, 248, 248, 1.0);} #editor.ace-blackboard ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(50, 80, 135, 1.0); background-color:rgba(50, 80, 135, 0.7);} #editor.ace-blackboard ~ div.ace_rightAlignedText {color:rgba(174, 174, 174, 1.0);} #editor.ace-blackboard ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 100, 0, 1.0);} #editor.ace-blackboard ~ div.ace_autocomplete {background-color:rgba(12, 16, 33, 1.0); color:rgba(248, 248, 248, 1.0); border-color:rgba(248, 248, 248, 1.0);} +#editor.ace-blackboard ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(12, 16, 33, 1.0); color:rgba(248, 248, 248, 1.0); border-color:rgba(248, 248, 248, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(174, 174, 174, 1.0); border-style: dotted; } +#editor.ace-blackboard ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(248, 248, 248, 1.0); } +#editor.ace-blackboard ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-one-dark ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(61, 67, 80, 1.0); background-color:rgba(61, 67, 80, 0.7);} +#editor.ace-one-dark ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(171, 178, 191, 1.0);} +#editor.ace-one-dark ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(61, 67, 80, 1.0); background-color:rgba(61, 67, 80, 0.7);} +#editor.ace-one-dark ~ div.ace_rightAlignedText {color:rgba(92, 99, 112, 1.0);} +#editor.ace-one-dark ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(224, 108, 117, 1.0);} +#editor.ace-one-dark ~ div.ace_autocomplete {background-color:rgba(40, 44, 52, 1.0); color:rgba(171, 178, 191, 1.0); border-color:rgba(171, 178, 191, 1.0);} +#editor.ace-one-dark ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(40, 44, 52, 1.0); color:rgba(171, 178, 191, 1.0); border-color:rgba(171, 178, 191, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(92, 99, 112, 1.0); border-style: dotted; } +#editor.ace-one-dark ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(171, 178, 191, 1.0); } +#editor.ace-one-dark ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-crimson-editor ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-crimson-editor ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(64, 64, 64, 1.0);} +#editor.ace-crimson-editor ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-crimson-editor ~ div.ace_rightAlignedText {color:rgba(76, 136, 107, 1.0);} +#editor.ace-crimson-editor ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(224, 0, 0, 1.0);} +#editor.ace-crimson-editor ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(64, 64, 64, 1.0); border-color:rgba(64, 64, 64, 1.0);} +#editor.ace-crimson-editor ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(255, 255, 255, 1.0); color:rgba(64, 64, 64, 1.0); border-color:rgba(64, 64, 64, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(76, 136, 107, 1.0); border-style: dotted; } +#editor.ace-crimson-editor ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(64, 64, 64, 1.0); } +#editor.ace-crimson-editor ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-tomorrow-night-blue ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(0, 63, 142, 1.0); background-color:rgba(0, 63, 142, 0.7);} +#editor.ace-tomorrow-night-blue ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(255, 255, 255, 1.0);} +#editor.ace-tomorrow-night-blue ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(0, 63, 142, 1.0); background-color:rgba(0, 63, 142, 0.7);} +#editor.ace-tomorrow-night-blue ~ div.ace_rightAlignedText {color:rgba(114, 133, 183, 1.0);} +#editor.ace-tomorrow-night-blue ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 157, 164, 1.0);} +#editor.ace-tomorrow-night-blue ~ div.ace_autocomplete {background-color:rgba(0, 36, 81, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0);} +#editor.ace-tomorrow-night-blue ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(0, 36, 81, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(114, 133, 183, 1.0); border-style: dotted; } +#editor.ace-tomorrow-night-blue ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(255, 255, 255, 1.0); } +#editor.ace-tomorrow-night-blue ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-tomorrow-night-eighties ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(81, 81, 81, 1.0); background-color:rgba(81, 81, 81, 0.7);} +#editor.ace-tomorrow-night-eighties ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(204, 204, 204, 1.0);} +#editor.ace-tomorrow-night-eighties ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(81, 81, 81, 1.0); background-color:rgba(81, 81, 81, 0.7);} +#editor.ace-tomorrow-night-eighties ~ div.ace_rightAlignedText {color:rgba(153, 153, 153, 1.0);} +#editor.ace-tomorrow-night-eighties ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(249, 145, 87, 1.0);} +#editor.ace-tomorrow-night-eighties ~ div.ace_autocomplete {background-color:rgba(45, 45, 45, 1.0); color:rgba(204, 204, 204, 1.0); border-color:rgba(204, 204, 204, 1.0);} +#editor.ace-tomorrow-night-eighties ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(45, 45, 45, 1.0); color:rgba(204, 204, 204, 1.0); border-color:rgba(204, 204, 204, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(153, 153, 153, 1.0); border-style: dotted; } +#editor.ace-tomorrow-night-eighties ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(204, 204, 204, 1.0); } +#editor.ace-tomorrow-night-eighties ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-sqlserver ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-sqlserver ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 0, 0, 1.0);} +#editor.ace-sqlserver ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-sqlserver ~ div.ace_rightAlignedText {color:rgba(0, 128, 0, 1.0);} +#editor.ace-sqlserver ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 0, 0, 1.0);} +#editor.ace-sqlserver ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} +#editor.ace-sqlserver ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(0, 128, 0, 1.0); border-style: dotted; } +#editor.ace-sqlserver ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(0, 0, 0, 1.0); } +#editor.ace-sqlserver ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } #editor.ace-merbivore ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(69, 69, 69, 1.0); background-color:rgba(69, 69, 69, 0.7);} #editor.ace-merbivore ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(230, 225, 220, 1.0);} #editor.ace-merbivore ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(69, 69, 69, 1.0); background-color:rgba(69, 69, 69, 0.7);} #editor.ace-merbivore ~ div.ace_rightAlignedText {color:rgba(173, 46, 164, 1.0);} #editor.ace-merbivore ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(252, 111, 9, 1.0);} #editor.ace-merbivore ~ div.ace_autocomplete {background-color:rgba(22, 22, 22, 1.0); color:rgba(230, 225, 220, 1.0); border-color:rgba(230, 225, 220, 1.0);} -#editor.ace-mono-industrial ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(145, 153, 148, 0.4); background-color:rgba(145, 153, 148, 0.3);} -#editor.ace-mono-industrial ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(255, 255, 255, 1.0);} -#editor.ace-mono-industrial ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(145, 153, 148, 0.4); background-color:rgba(145, 153, 148, 0.3);} -#editor.ace-mono-industrial ~ div.ace_rightAlignedText {color:rgba(102, 108, 104, 1.0);} -#editor.ace-mono-industrial ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(233, 136, 0, 1.0);} -#editor.ace-mono-industrial ~ div.ace_autocomplete {background-color:rgba(34, 44, 40, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0);} -#editor.ace-twilight ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} -#editor.ace-twilight ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(248, 248, 248, 1.0);} -#editor.ace-twilight ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} -#editor.ace-twilight ~ div.ace_rightAlignedText {color:rgba(95, 90, 96, 1.0);} -#editor.ace-twilight ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(207, 106, 76, 1.0);} -#editor.ace-twilight ~ div.ace_autocomplete {background-color:rgba(20, 20, 20, 1.0); color:rgba(248, 248, 248, 1.0); border-color:rgba(248, 248, 248, 1.0);} -#editor.ace-idle-fingers ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(90, 100, 126, 0.9); background-color:rgba(90, 100, 126, 0.6);} -#editor.ace-idle-fingers ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(255, 255, 255, 1.0);} -#editor.ace-idle-fingers ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(90, 100, 126, 0.9); background-color:rgba(90, 100, 126, 0.6);} -#editor.ace-idle-fingers ~ div.ace_rightAlignedText {color:rgba(188, 148, 88, 1.0);} -#editor.ace-idle-fingers ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(184, 52, 38, 1.0);} -#editor.ace-idle-fingers ~ div.ace_autocomplete {background-color:rgba(50, 50, 50, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0);} +#editor.ace-merbivore ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(22, 22, 22, 1.0); color:rgba(230, 225, 220, 1.0); border-color:rgba(230, 225, 220, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(173, 46, 164, 1.0); border-style: dotted; } +#editor.ace-merbivore ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(230, 225, 220, 1.0); } +#editor.ace-merbivore ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-gruvbox-dark-hard ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(60, 56, 54, 1.0); background-color:rgba(60, 56, 54, 0.7);} +#editor.ace-gruvbox-dark-hard ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(235, 219, 178, 0.5);} +#editor.ace-gruvbox-dark-hard ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(60, 56, 54, 1.0); background-color:rgba(60, 56, 54, 0.7);} +#editor.ace-gruvbox-dark-hard ~ div.ace_rightAlignedText {color:rgba(146, 131, 116, 1.0);} +#editor.ace-gruvbox-dark-hard ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(251, 73, 52, 1.0);} +#editor.ace-gruvbox-dark-hard ~ div.ace_autocomplete {background-color:rgba(29, 32, 33, 1.0); color:rgba(235, 219, 178, 0.5); border-color:rgba(235, 219, 178, 0.5);} +#editor.ace-gruvbox-dark-hard ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(29, 32, 33, 1.0); color:rgba(235, 219, 178, 0.5); border-color:rgba(235, 219, 178, 0.5); font-family: -apple-system; font-size: 80%; color: rgba(146, 131, 116, 1.0); border-style: dotted; } +#editor.ace-gruvbox-dark-hard ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(235, 219, 178, 0.5); } +#editor.ace-gruvbox-dark-hard ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } #editor.ace-github ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} #editor.ace-github ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 0, 0, 1.0);} #editor.ace-github ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} #editor.ace-github ~ div.ace_rightAlignedText {color:rgba(153, 153, 136, 1.0);} #editor.ace-github ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(221, 17, 68, 1.0);} #editor.ace-github ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} +#editor.ace-github ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(153, 153, 136, 1.0); border-style: dotted; } +#editor.ace-github ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(0, 0, 0, 1.0); } +#editor.ace-github ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-chrome ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-chrome ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 0, 0, 1.0);} +#editor.ace-chrome ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-chrome ~ div.ace_rightAlignedText {color:rgba(35, 110, 36, 1.0);} +#editor.ace-chrome ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 0, 0, 1.0);} +#editor.ace-chrome ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} +#editor.ace-chrome ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(35, 110, 36, 1.0); border-style: dotted; } +#editor.ace-chrome ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(0, 0, 0, 1.0); } +#editor.ace-chrome ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } #editor.ace-clouds ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(189, 213, 252, 1.0); background-color:rgba(189, 213, 252, 0.7);} #editor.ace-clouds ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 0, 0, 1.0);} #editor.ace-clouds ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(189, 213, 252, 1.0); background-color:rgba(189, 213, 252, 0.7);} #editor.ace-clouds ~ div.ace_rightAlignedText {color:rgba(188, 200, 186, 1.0);} #editor.ace-clouds ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(197, 39, 39, 1.0);} #editor.ace-clouds ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} -#editor.ace-katzenmilch ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(100, 5, 208, 0.3); background-color:rgba(100, 5, 208, 0.2);} -#editor.ace-katzenmilch ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(15, 0, 9, 1.0);} -#editor.ace-katzenmilch ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(100, 5, 208, 0.3); background-color:rgba(100, 5, 208, 0.2);} -#editor.ace-katzenmilch ~ div.ace_rightAlignedText {color:rgba(64, 79, 80, 0.7);} -#editor.ace-katzenmilch ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(239, 106, 167, 1.0);} -#editor.ace-katzenmilch ~ div.ace_autocomplete {background-color:rgba(243, 242, 243, 1.0); color:rgba(15, 0, 9, 1.0); border-color:rgba(15, 0, 9, 1.0);} -#editor.ace-kuroir ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(245, 170, 0, 0.6); background-color:rgba(245, 170, 0, 0.4);} -#editor.ace-kuroir ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(54, 54, 54, 1.0);} -#editor.ace-kuroir ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(245, 170, 0, 0.6); background-color:rgba(245, 170, 0, 0.4);} -#editor.ace-kuroir ~ div.ace_rightAlignedText {color:rgba(148, 148, 148, 0.9);} -#editor.ace-kuroir ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(253, 18, 36, 1.0);} -#editor.ace-kuroir ~ div.ace_autocomplete {background-color:rgba(232, 233, 232, 1.0); color:rgba(54, 54, 54, 1.0); border-color:rgba(54, 54, 54, 1.0);} +#editor.ace-clouds ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(188, 200, 186, 1.0); border-style: dotted; } +#editor.ace-clouds ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(0, 0, 0, 1.0); } +#editor.ace-clouds ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-cobalt ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(179, 101, 57, 0.7); background-color:rgba(179, 101, 57, 0.5);} +#editor.ace-cobalt ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(255, 255, 255, 1.0);} +#editor.ace-cobalt ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(179, 101, 57, 0.7); background-color:rgba(179, 101, 57, 0.5);} +#editor.ace-cobalt ~ div.ace_rightAlignedText {color:rgba(0, 136, 255, 1.0);} +#editor.ace-cobalt ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 157, 0, 1.0);} +#editor.ace-cobalt ~ div.ace_autocomplete {background-color:rgba(0, 34, 64, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0);} +#editor.ace-cobalt ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(0, 34, 64, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(0, 136, 255, 1.0); border-style: dotted; } +#editor.ace-cobalt ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(255, 255, 255, 1.0); } +#editor.ace-cobalt ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-idle-fingers ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(90, 100, 126, 0.9); background-color:rgba(90, 100, 126, 0.6);} +#editor.ace-idle-fingers ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(255, 255, 255, 1.0);} +#editor.ace-idle-fingers ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(90, 100, 126, 0.9); background-color:rgba(90, 100, 126, 0.6);} +#editor.ace-idle-fingers ~ div.ace_rightAlignedText {color:rgba(188, 148, 88, 1.0);} +#editor.ace-idle-fingers ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(184, 52, 38, 1.0);} +#editor.ace-idle-fingers ~ div.ace_autocomplete {background-color:rgba(50, 50, 50, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0);} +#editor.ace-idle-fingers ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(50, 50, 50, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(188, 148, 88, 1.0); border-style: dotted; } +#editor.ace-idle-fingers ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(255, 255, 255, 1.0); } +#editor.ace-idle-fingers ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-pastel-on-dark ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} +#editor.ace-pastel-on-dark ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(143, 147, 143, 1.0);} +#editor.ace-pastel-on-dark ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} +#editor.ace-pastel-on-dark ~ div.ace_rightAlignedText {color:rgba(166, 198, 255, 1.0);} +#editor.ace-pastel-on-dark ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(222, 142, 48, 1.0);} +#editor.ace-pastel-on-dark ~ div.ace_autocomplete {background-color:rgba(44, 40, 40, 1.0); color:rgba(143, 147, 143, 1.0); border-color:rgba(143, 147, 143, 1.0);} +#editor.ace-pastel-on-dark ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(44, 40, 40, 1.0); color:rgba(143, 147, 143, 1.0); border-color:rgba(143, 147, 143, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(166, 198, 255, 1.0); border-style: dotted; } +#editor.ace-pastel-on-dark ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(143, 147, 143, 1.0); } +#editor.ace-pastel-on-dark ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-tomorrow ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(214, 214, 214, 1.0); background-color:rgba(214, 214, 214, 0.7);} +#editor.ace-tomorrow ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(77, 77, 76, 1.0);} +#editor.ace-tomorrow ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(214, 214, 214, 1.0); background-color:rgba(214, 214, 214, 0.7);} +#editor.ace-tomorrow ~ div.ace_rightAlignedText {color:rgba(142, 144, 140, 1.0);} +#editor.ace-tomorrow ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(245, 135, 31, 1.0);} +#editor.ace-tomorrow ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(77, 77, 76, 1.0); border-color:rgba(77, 77, 76, 1.0);} +#editor.ace-tomorrow ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(255, 255, 255, 1.0); color:rgba(77, 77, 76, 1.0); border-color:rgba(77, 77, 76, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(142, 144, 140, 1.0); border-style: dotted; } +#editor.ace-tomorrow ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(77, 77, 76, 1.0); } +#editor.ace-tomorrow ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-dreamweaver ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-dreamweaver ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 0, 0, 1.0);} +#editor.ace-dreamweaver ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-dreamweaver ~ div.ace_rightAlignedText {color:rgba(76, 136, 107, 1.0);} +#editor.ace-dreamweaver ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 0, 0, 1.0);} +#editor.ace-dreamweaver ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} +#editor.ace-dreamweaver ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(76, 136, 107, 1.0); border-style: dotted; } +#editor.ace-dreamweaver ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(0, 0, 0, 1.0); } +#editor.ace-dreamweaver ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-solarized-dark ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(255, 255, 255, 0.1); background-color:rgba(255, 255, 255, 0.1);} +#editor.ace-solarized-dark ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(147, 161, 161, 1.0);} +#editor.ace-solarized-dark ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(255, 255, 255, 0.1); background-color:rgba(255, 255, 255, 0.1);} +#editor.ace-solarized-dark ~ div.ace_rightAlignedText {color:rgba(101, 123, 131, 1.0);} +#editor.ace-solarized-dark ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(211, 1, 2, 1.0);} +#editor.ace-solarized-dark ~ div.ace_autocomplete {background-color:rgba(0, 43, 54, 1.0); color:rgba(147, 161, 161, 1.0); border-color:rgba(147, 161, 161, 1.0);} +#editor.ace-solarized-dark ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(0, 43, 54, 1.0); color:rgba(147, 161, 161, 1.0); border-color:rgba(147, 161, 161, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(101, 123, 131, 1.0); border-style: dotted; } +#editor.ace-solarized-dark ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(147, 161, 161, 1.0); } +#editor.ace-solarized-dark ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } #editor.ace-vibrant-ink ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(102, 153, 204, 1.0); background-color:rgba(102, 153, 204, 0.7);} #editor.ace-vibrant-ink ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(255, 255, 255, 1.0);} #editor.ace-vibrant-ink ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(102, 153, 204, 1.0); background-color:rgba(102, 153, 204, 0.7);} #editor.ace-vibrant-ink ~ div.ace_rightAlignedText {color:rgba(153, 51, 204, 1.0);} #editor.ace-vibrant-ink ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 102, 0, 1.0);} #editor.ace-vibrant-ink ~ div.ace_autocomplete {background-color:rgba(15, 15, 15, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0);} -#editor.ace-eclipse ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} -#editor.ace-eclipse ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 0, 0, 1.0);} -#editor.ace-eclipse ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} -#editor.ace-eclipse ~ div.ace_rightAlignedText {color:rgba(113, 150, 130, 1.0);} -#editor.ace-eclipse ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(127, 0, 85, 1.0);} -#editor.ace-eclipse ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} -#editor.ace-tomorrow-night-bright ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(66, 66, 66, 1.0); background-color:rgba(66, 66, 66, 0.7);} -#editor.ace-tomorrow-night-bright ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(222, 222, 222, 1.0);} -#editor.ace-tomorrow-night-bright ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(66, 66, 66, 1.0); background-color:rgba(66, 66, 66, 0.7);} -#editor.ace-tomorrow-night-bright ~ div.ace_rightAlignedText {color:rgba(150, 152, 150, 1.0);} -#editor.ace-tomorrow-night-bright ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(231, 140, 69, 1.0);} -#editor.ace-tomorrow-night-bright ~ div.ace_autocomplete {background-color:rgba(0, 0, 0, 1.0); color:rgba(222, 222, 222, 1.0); border-color:rgba(222, 222, 222, 1.0);} +#editor.ace-vibrant-ink ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(15, 15, 15, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(153, 51, 204, 1.0); border-style: dotted; } +#editor.ace-vibrant-ink ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(255, 255, 255, 1.0); } +#editor.ace-vibrant-ink ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-dracula ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(68, 71, 90, 1.0); background-color:rgba(68, 71, 90, 0.7);} +#editor.ace-dracula ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(248, 248, 242, 1.0);} +#editor.ace-dracula ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(68, 71, 90, 1.0); background-color:rgba(68, 71, 90, 0.7);} +#editor.ace-dracula ~ div.ace_rightAlignedText {color:rgba(98, 114, 164, 1.0);} +#editor.ace-dracula ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 184, 108, 1.0);} +#editor.ace-dracula ~ div.ace_autocomplete {background-color:rgba(40, 42, 54, 1.0); color:rgba(248, 248, 242, 1.0); border-color:rgba(248, 248, 242, 1.0);} +#editor.ace-dracula ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(40, 42, 54, 1.0); color:rgba(248, 248, 242, 1.0); border-color:rgba(248, 248, 242, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(98, 114, 164, 1.0); border-style: dotted; } +#editor.ace-dracula ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(248, 248, 242, 1.0); } +#editor.ace-dracula ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } #editor.ace-tm ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} #editor.ace-tm ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 0, 0, 1.0);} #editor.ace-tm ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} #editor.ace-tm ~ div.ace_rightAlignedText {color:rgba(76, 136, 107, 1.0);} #editor.ace-tm ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 0, 0, 1.0);} #editor.ace-tm ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} +#editor.ace-tm ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(76, 136, 107, 1.0); border-style: dotted; } +#editor.ace-tm ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(0, 0, 0, 1.0); } +#editor.ace-tm ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-iplastic ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(186, 214, 253, 1.0); background-color:rgba(186, 214, 253, 0.7);} +#editor.ace-iplastic ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(51, 51, 51, 1.0);} +#editor.ace-iplastic ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(186, 214, 253, 1.0); background-color:rgba(186, 214, 253, 0.7);} +#editor.ace-iplastic ~ div.ace_rightAlignedText {color:rgba(119, 119, 119, 1.0);} +#editor.ace-iplastic ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(165, 95, 3, 1.0);} +#editor.ace-iplastic ~ div.ace_autocomplete {background-color:rgba(238, 238, 238, 1.0); color:rgba(51, 51, 51, 1.0); border-color:rgba(51, 51, 51, 1.0);} +#editor.ace-iplastic ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(238, 238, 238, 1.0); color:rgba(51, 51, 51, 1.0); border-color:rgba(51, 51, 51, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(119, 119, 119, 1.0); border-style: dotted; } +#editor.ace-iplastic ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(51, 51, 51, 1.0); } +#editor.ace-iplastic ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } #editor.ace-tomorrow-night ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(55, 59, 65, 1.0); background-color:rgba(55, 59, 65, 0.7);} #editor.ace-tomorrow-night ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(197, 200, 198, 1.0);} #editor.ace-tomorrow-night ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(55, 59, 65, 1.0); background-color:rgba(55, 59, 65, 0.7);} #editor.ace-tomorrow-night ~ div.ace_rightAlignedText {color:rgba(150, 152, 150, 1.0);} #editor.ace-tomorrow-night ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(222, 147, 95, 1.0);} #editor.ace-tomorrow-night ~ div.ace_autocomplete {background-color:rgba(29, 31, 33, 1.0); color:rgba(197, 200, 198, 1.0); border-color:rgba(197, 200, 198, 1.0);} -#editor.ace-crimson-editor ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} -#editor.ace-crimson-editor ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(64, 64, 64, 1.0);} -#editor.ace-crimson-editor ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} -#editor.ace-crimson-editor ~ div.ace_rightAlignedText {color:rgba(76, 136, 107, 1.0);} -#editor.ace-crimson-editor ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(224, 0, 0, 1.0);} -#editor.ace-crimson-editor ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(64, 64, 64, 1.0); border-color:rgba(64, 64, 64, 1.0);} -#editor.ace-solarized-dark ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(255, 255, 255, 0.1); background-color:rgba(255, 255, 255, 0.1);} -#editor.ace-solarized-dark ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(147, 161, 161, 1.0);} -#editor.ace-solarized-dark ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(255, 255, 255, 0.1); background-color:rgba(255, 255, 255, 0.1);} -#editor.ace-solarized-dark ~ div.ace_rightAlignedText {color:rgba(101, 123, 131, 1.0);} -#editor.ace-solarized-dark ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(211, 1, 2, 1.0);} -#editor.ace-solarized-dark ~ div.ace_autocomplete {background-color:rgba(0, 43, 54, 1.0); color:rgba(147, 161, 161, 1.0); border-color:rgba(147, 161, 161, 1.0);} -#editor.ace-kr-theme ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(170, 0, 255, 0.4); background-color:rgba(170, 0, 255, 0.3);} -#editor.ace-kr-theme ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(252, 255, 224, 1.0);} -#editor.ace-kr-theme ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(170, 0, 255, 0.4); background-color:rgba(170, 0, 255, 0.3);} -#editor.ace-kr-theme ~ div.ace_rightAlignedText {color:rgba(112, 109, 91, 1.0);} -#editor.ace-kr-theme ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 153, 0, 1.0);} -#editor.ace-kr-theme ~ div.ace_autocomplete {background-color:rgba(11, 10, 9, 1.0); color:rgba(252, 255, 224, 1.0); border-color:rgba(252, 255, 224, 1.0);} -#editor.ace-clouds-midnight ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(0, 0, 0, 1.0); background-color:rgba(0, 0, 0, 0.7);} -#editor.ace-clouds-midnight ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(146, 146, 146, 1.0);} -#editor.ace-clouds-midnight ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(0, 0, 0, 1.0); background-color:rgba(0, 0, 0, 0.7);} -#editor.ace-clouds-midnight ~ div.ace_rightAlignedText {color:rgba(60, 64, 59, 1.0);} -#editor.ace-clouds-midnight ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(233, 46, 46, 1.0);} -#editor.ace-clouds-midnight ~ div.ace_autocomplete {background-color:rgba(25, 25, 25, 1.0); color:rgba(146, 146, 146, 1.0); border-color:rgba(146, 146, 146, 1.0);} -#editor.ace-pastel-on-dark ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} -#editor.ace-pastel-on-dark ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(143, 147, 143, 1.0);} -#editor.ace-pastel-on-dark ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} -#editor.ace-pastel-on-dark ~ div.ace_rightAlignedText {color:rgba(166, 198, 255, 1.0);} -#editor.ace-pastel-on-dark ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(222, 142, 48, 1.0);} -#editor.ace-pastel-on-dark ~ div.ace_autocomplete {background-color:rgba(44, 40, 40, 1.0); color:rgba(143, 147, 143, 1.0); border-color:rgba(143, 147, 143, 1.0);} -#editor.ace-xcode ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} -#editor.ace-xcode ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 0, 0, 1.0);} -#editor.ace-xcode ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} -#editor.ace-xcode ~ div.ace_rightAlignedText {color:rgba(0, 142, 0, 1.0);} -#editor.ace-xcode ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(223, 0, 2, 1.0);} -#editor.ace-xcode ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} -#editor.ace-ambiance ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} -#editor.ace-ambiance ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(230, 225, 220, 1.0);} -#editor.ace-ambiance ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(221, 240, 255, 0.2); background-color:rgba(221, 240, 255, 0.1);} -#editor.ace-ambiance ~ div.ace_rightAlignedText {color:rgba(85, 85, 85, 1.0);} -#editor.ace-ambiance ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(250, 141, 106, 1.0);} -#editor.ace-ambiance ~ div.ace_autocomplete {background-color:rgba(32, 32, 32, 1.0); color:rgba(230, 225, 220, 1.0); border-color:rgba(230, 225, 220, 1.0);} -#editor.ace-cobalt ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(179, 101, 57, 0.7); background-color:rgba(179, 101, 57, 0.5);} -#editor.ace-cobalt ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(255, 255, 255, 1.0);} -#editor.ace-cobalt ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(179, 101, 57, 0.7); background-color:rgba(179, 101, 57, 0.5);} -#editor.ace-cobalt ~ div.ace_rightAlignedText {color:rgba(0, 136, 255, 1.0);} -#editor.ace-cobalt ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 157, 0, 1.0);} -#editor.ace-cobalt ~ div.ace_autocomplete {background-color:rgba(0, 34, 64, 1.0); color:rgba(255, 255, 255, 1.0); border-color:rgba(255, 255, 255, 1.0);} +#editor.ace-tomorrow-night ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(29, 31, 33, 1.0); color:rgba(197, 200, 198, 1.0); border-color:rgba(197, 200, 198, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(150, 152, 150, 1.0); border-style: dotted; } +#editor.ace-tomorrow-night ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(197, 200, 198, 1.0); } +#editor.ace-tomorrow-night ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } #editor.ace-dawn ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(39, 95, 255, 0.3); background-color:rgba(39, 95, 255, 0.2);} #editor.ace-dawn ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(8, 8, 8, 1.0);} #editor.ace-dawn ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(39, 95, 255, 0.3); background-color:rgba(39, 95, 255, 0.2);} #editor.ace-dawn ~ div.ace_rightAlignedText {color:rgba(90, 82, 95, 1.0);} #editor.ace-dawn ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(207, 86, 40, 1.0);} #editor.ace-dawn ~ div.ace_autocomplete {background-color:rgba(249, 249, 249, 1.0); color:rgba(8, 8, 8, 1.0); border-color:rgba(8, 8, 8, 1.0);} -#editor.ace-tomorrow ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(214, 214, 214, 1.0); background-color:rgba(214, 214, 214, 0.7);} -#editor.ace-tomorrow ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(77, 77, 76, 1.0);} -#editor.ace-tomorrow ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(214, 214, 214, 1.0); background-color:rgba(214, 214, 214, 0.7);} -#editor.ace-tomorrow ~ div.ace_rightAlignedText {color:rgba(142, 144, 140, 1.0);} -#editor.ace-tomorrow ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(245, 135, 31, 1.0);} -#editor.ace-tomorrow ~ div.ace_autocomplete {background-color:rgba(255, 255, 255, 1.0); color:rgba(77, 77, 76, 1.0); border-color:rgba(77, 77, 76, 1.0);} \ No newline at end of file +#editor.ace-dawn ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(249, 249, 249, 1.0); color:rgba(8, 8, 8, 1.0); border-color:rgba(8, 8, 8, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(90, 82, 95, 1.0); border-style: dotted; } +#editor.ace-dawn ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(8, 8, 8, 1.0); } +#editor.ace-dawn ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-cloud9-night-low-color ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(66, 66, 66, 1.0); background-color:rgba(66, 66, 66, 0.7);} +#editor.ace-cloud9-night-low-color ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(235, 235, 235, 1.0);} +#editor.ace-cloud9-night-low-color ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(66, 66, 66, 1.0); background-color:rgba(66, 66, 66, 0.7);} +#editor.ace-cloud9-night-low-color ~ div.ace_rightAlignedText {color:rgba(150, 152, 150, 1.0);} +#editor.ace-cloud9-night-low-color ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(218, 166, 55, 1.0);} +#editor.ace-cloud9-night-low-color ~ div.ace_autocomplete {background-color:rgba(24, 24, 24, 1.0); color:rgba(235, 235, 235, 1.0); border-color:rgba(235, 235, 235, 1.0);} +#editor.ace-cloud9-night-low-color ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(24, 24, 24, 1.0); color:rgba(235, 235, 235, 1.0); border-color:rgba(235, 235, 235, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(150, 152, 150, 1.0); border-style: dotted; } +#editor.ace-cloud9-night-low-color ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(235, 235, 235, 1.0); } +#editor.ace-cloud9-night-low-color ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-nord-dark ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(67, 76, 94, 1.0); background-color:rgba(67, 76, 94, 0.7);} +#editor.ace-nord-dark ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(216, 222, 233, 1.0);} +#editor.ace-nord-dark ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(67, 76, 94, 1.0); background-color:rgba(67, 76, 94, 0.7);} +#editor.ace-nord-dark ~ div.ace_rightAlignedText {color:rgba(97, 110, 136, 1.0);} +#editor.ace-nord-dark ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(191, 97, 106, 1.0);} +#editor.ace-nord-dark ~ div.ace_autocomplete {background-color:rgba(46, 52, 64, 1.0); color:rgba(216, 222, 233, 1.0); border-color:rgba(216, 222, 233, 1.0);} +#editor.ace-nord-dark ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(46, 52, 64, 1.0); color:rgba(216, 222, 233, 1.0); border-color:rgba(216, 222, 233, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(97, 110, 136, 1.0); border-style: dotted; } +#editor.ace-nord-dark ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(216, 222, 233, 1.0); } +#editor.ace-nord-dark ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-cloud9-day ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-cloud9-day ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(0, 0, 0, 1.0);} +#editor.ace-cloud9-day ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(181, 213, 255, 1.0); background-color:rgba(181, 213, 255, 0.7);} +#editor.ace-cloud9-day ~ div.ace_rightAlignedText {color:rgba(76, 136, 107, 1.0);} +#editor.ace-cloud9-day ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(255, 0, 0, 1.0);} +#editor.ace-cloud9-day ~ div.ace_autocomplete {background-color:rgba(251, 251, 251, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} +#editor.ace-cloud9-day ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(251, 251, 251, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(76, 136, 107, 1.0); border-style: dotted; } +#editor.ace-cloud9-day ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(0, 0, 0, 1.0); } +#editor.ace-cloud9-day ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } \ No newline at end of file diff --git a/app/Resources/ui/editor.html b/app/Resources/ui/editor.html index 377e50ff..e3319449 100644 --- a/app/Resources/ui/editor.html +++ b/app/Resources/ui/editor.html @@ -45,9 +45,8 @@ - - - + + @@ -55,10 +54,10 @@
diff --git a/app/Resources/ui/js/ace.js b/app/Resources/ui/js/ace.js deleted file mode 100644 index 3429a1c5..00000000 --- a/app/Resources/ui/js/ace.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var g="";var d=(function(){return this})();if(!g&&typeof requirejs!=="undefined"){return}var c=function(h,j,i){if(typeof h!=="string"){if(c.original){c.original.apply(window,arguments)}else{console.error("dropping module because define wasn't a string.");console.trace()}return}if(arguments.length==2){i=j}if(!c.modules){c.modules={};c.payloads={}}c.payloads[h]=i;c.modules[h]=null};var a=function(q,k,p){if(Object.prototype.toString.call(k)==="[object Array]"){var o=[];for(var j=0,h=k.length;j=this.$rowTokens.length){this.$row+=1;if(!e){e=this.$session.getLength()}if(this.$row>=e){this.$row=e-1;return null}this.$rowTokens=this.$session.getTokens(this.$row);this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]};this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]};this.getCurrentTokenRow=function(){return this.$row};this.getCurrentTokenColumn=function(){var f=this.$rowTokens;var e=this.$tokenIndex;var g=f[e].start;if(g!==undefined){return g}g=0;while(e>0){e-=1;g+=f[e].value.length}return g}}).call(d.prototype);a.TokenIterator=d});define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(c,b,d){var e=c("../lib/lang");var a=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(n,l){if(!l){for(var j in n){this.$rules[j]=n[j]}return}for(var j in n){var k=n[j];for(var h=0;hthis.row){return}if(h.start.row==this.row&&h.start.column>this.column){return}var k=this.row;var i=this.column;var l=h.start;var g=h.end;if(m.action==="insertText"){if(l.row===k&&l.column<=i){if(l.column===i&&this.$insertRight){}else{if(l.row===g.row){i+=g.column-l.column}else{i-=l.column;k+=g.row-l.row}}}else{if(l.row!==g.row&&l.row=i){i=l.column}else{i=Math.max(0,i-(g.column-l.column))}}else{if(l.row!==g.row&&l.row=this.document.getLength()){i.row=Math.max(0,this.document.getLength()-1);i.column=this.document.getLine(i.row).length}else{if(h<0){i.row=0;i.column=0}else{i.row=h;i.column=Math.min(this.document.getLine(i.row).length,Math.max(0,g))}}if(g<0){i.column=0}return i}}).call(a.prototype)});define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(c,b,d){var f=c("./lib/oop");var e=c("./lib/event_emitter").EventEmitter;var a=function(i,h){this.running=false;this.lines=[];this.states=[];this.currentLine=0;this.tokenizer=i;var g=this;this.$worker=function(){if(!g.running){return}var n=new Date();var p=g.currentLine;var l=-1;var m=g.doc;while(g.lines[p]){p++}var o=p;var j=m.getLength();var k=0;g.running=false;while(p20){g.running=setTimeout(g.$worker,20);g.currentLine=p;return}}g.currentLine=p;if(o<=l){g.fireUpdateEvent(o,l)}}};(function(){f.implement(this,e);this.setTokenizer=function(g){this.tokenizer=g;this.lines=[];this.states=[];this.start(0)};this.setDocument=function(g){this.doc=g;this.lines=[];this.states=[];this.stop()};this.fireUpdateEvent=function(i,g){var h={first:i,last:g};this._signal("update",{data:h})};this.start=function(g){this.currentLine=Math.min(g||0,this.currentLine,this.doc.getLength());this.lines.splice(this.currentLine,this.lines.length);this.states.splice(this.currentLine,this.states.length);this.stop();this.running=setTimeout(this.$worker,700)};this.scheduleStart=function(){if(!this.running){this.running=setTimeout(this.$worker,700)}};this.$updateOnChange=function(k){var i=k.range;var h=i.start.row;var g=i.end.row-h;if(g===0){this.lines[h]=null}else{if(k.action=="removeText"||k.action=="removeLines"){this.lines.splice(h,g+1,null);this.states.splice(h,g+1,null)}else{var j=Array(g+1);j.unshift(h,1);this.lines.splice.apply(this.lines,j);this.states.splice.apply(this.states,j)}}this.currentLine=Math.min(h,this.currentLine,this.doc.getLength());this.stop()};this.stop=function(){if(this.running){clearTimeout(this.running)}this.running=false};this.getTokens=function(g){return this.lines[g]||this.$tokenizeRow(g)};this.getState=function(g){if(this.currentLine==g){this.$tokenizeRow(g)}return this.states[g]||"start"};this.$tokenizeRow=function(j){var g=this.doc.getLine(j);var i=this.states[j-1];var h=this.tokenizer.getLineTokens(g,i,j);if(this.states[j]+""!==h.state+""){this.states[j]=h.state;this.lines[j+1]=null;if(this.currentLine>j+1){this.currentLine=j+1}}else{if(this.currentLine==j){this.currentLine=j+1}}return this.lines[j]=h.tokens}}).call(a.prototype);b.BackgroundTokenizer=a});define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(b,a,c){var g=b("./lib/lang");var e=b("./lib/oop");var f=b("./range").Range;var d=function(i,h,j){this.setRegexp(i);this.clazz=h;this.type=j||"text"};(function(){this.MAX_RANGES=500;this.setRegexp=function(h){if(this.regExp+""==h+""){return}this.regExp=h;this.cache=[]};this.update=function(p,q,r,l){if(!this.regExp){return}var k=l.firstRow,m=l.lastRow;for(var o=k;o<=m;o++){var h=this.cache[o];if(h==null){h=g.getMatchOffsets(r.getLine(o),this.regExp);if(h.length>this.MAX_RANGES){h=h.slice(0,this.MAX_RANGES)}h=h.map(function(i){return new f(o,i.offset,o,i.offset+i.length)});this.cache[o]=h.length?h:""}for(var n=h.length;n--;){q.drawSingleLineMarker(p,h[n].toScreenRange(r),this.clazz,l)}}}}).call(d.prototype);a.SearchHighlight=d});define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"],function(d,c,e){var g=d("../range").Range;var h=d("./fold_line").FoldLine;var a=d("./fold").Fold;var f=d("../token_iterator").TokenIterator;function b(){this.getFoldAt=function(p,m,l){var o=this.getFoldLine(p);if(!o){return null}var n=o.folds;for(var k=0;k=j){return n}else{if(n.end.row>j){return null}}}return null};this.getNextFoldLine=function(j,k){var m=this.$foldData;var l=0;if(k){l=m.indexOf(k)}if(l==-1){l=0}for(l;l=j){return n}}return null};this.getFoldedRowCount=function(p,n){var m=this.$foldData,k=n-p+1;for(var l=0;l=n){if(q=p){k-=n-q}else{k=0}}break}else{if(j>=p){if(q>=p){k-=j-q}else{k-=j-p+1}}}}return k};this.$addFoldLine=function(i){this.$foldData.push(i);this.$foldData.sort(function(k,j){return k.start.row-j.start.row});return i};this.addFold=function(t,n){var j=this.$foldData;var r=false;var q;if(t instanceof a){q=t}else{q=new a(n,t);q.collapseChildren=n.collapseChildren}this.$clipRangeToDocument(q.range);var w=q.start.row;var k=q.start.column;var l=q.end.row;var p=q.end.column;if(!(w0){this.removeFolds(u);u.forEach(function(i){q.addSubFold(i)})}for(var m=0;m0){this.foldAll(i.start.row+1,i.end.row,i.collapseChildren-1)}i.subFolds=[]};this.expandFolds=function(i){i.forEach(function(j){this.expandFold(j)},this)};this.unfold=function(i,k){var j,m;if(i==null){j=new g(0,0,this.getLength(),0);k=true}else{if(typeof i=="number"){j=new g(i,0,i,this.getLine(i).length)}else{if("row" in i){j=g.fromPoints(i,i)}else{j=i}}}m=this.getFoldsInRangeList(j);if(k){this.removeFolds(m)}else{var l=m;while(l.length){this.expandFolds(l);l=this.getFoldsInRangeList(j)}}if(m.length){return m}};this.isRowFolded=function(i,j){return !!this.getFoldLine(i,j)};this.getRowFoldEnd=function(i,j){var k=this.getFoldLine(i,j);return k?k.end.row:i};this.getRowFoldStart=function(i,j){var k=this.getFoldLine(i,j);return k?k.start.row:i};this.getFoldDisplayLine=function(n,j,o,i,l){if(i==null){i=n.start.row;l=0}if(j==null){j=n.end.row;o=this.getLine(j).length}var m=this.doc;var k="";n.walk(function(s,r,q,p){if(r=k){o=i.end.row;try{var l=this.addFold("...",i);if(l){l.collapseChildren=p}}catch(n){}}}};this.$foldStyles={manual:1,markbegin:1,markbeginend:1};this.$foldStyle="markbegin";this.setFoldStyle=function(i){if(!this.$foldStyles[i]){throw new Error("invalid fold style: "+i+"["+Object.keys(this.$foldStyles).join(", ")+"]")}if(this.$foldStyle==i){return}this.$foldStyle=i;if(i=="manual"){this.unfold()}var j=this.$foldMode;this.$setFolding(null);this.$setFolding(j)};this.$setFolding=function(i){if(this.$foldMode==i){return}this.$foldMode=i;this.removeListener("change",this.$updateFoldWidgets);this._emit("changeAnnotation");if(!i||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[];this.getFoldWidget=i.getFoldWidget.bind(i,this,this.$foldStyle);this.getFoldWidgetRange=i.getFoldWidgetRange.bind(i,this,this.$foldStyle);this.$updateFoldWidgets=this.updateFoldWidgets.bind(this);this.on("change",this.$updateFoldWidgets)};this.getParentFoldRangeData=function(o,l){var n=this.foldWidgets;if(!n||(l&&n[o])){return{}}var m=o-1,j;while(m>=0){var p=n[m];if(p==null){p=n[m]=this.getFoldWidget(m)}if(p=="start"){var k=this.getFoldWidgetRange(m);if(!j){j=k}if(k&&k.end.row>=o){break}}m--}return{range:m!==-1&&k,firstRange:j}};this.onFoldWidgetClick=function(m,l){l=l.domEvent;var j={children:l.shiftKey,all:l.ctrlKey||l.metaKey,siblings:l.altKey};var i=this.$toggleFoldWidget(m,j);if(!i){var k=(l.target||l.srcElement);if(k&&/ace_fold-widget/.test(k.className)){k.className+=" ace_invalid"}}};this.$toggleFoldWidget=function(p,q){if(!this.getFoldWidget){return}var n=this.getFoldWidget(p);var r=this.getLine(p);var i=n==="end"?-1:1;var m=this.getFoldAt(p,i===-1?0:r.length,i);if(m){if(q.children||q.all){this.removeFold(m)}else{this.expandFold(m)}return}var l=this.getFoldWidgetRange(p,true);if(l&&!l.isMultiLine()){m=this.getFoldAt(l.start.row,l.start.column,1);if(m&&l.isEqual(m.range)){this.removeFold(m);return}}if(q.siblings){var k=this.getParentFoldRangeData(p);if(k.range){var o=k.range.start.row+1;var j=k.range.end.row}this.foldAll(o,j,q.all?10000:0)}else{if(q.children){j=l?l.end.row:this.getLength();this.foldAll(p+1,l.end.row,q.all?10000:0)}else{if(l){if(q.all){l.collapseChildren=10000}this.addFold("...",l)}}}return l};this.toggleFoldWidget=function(m){var l=this.selection.getCursor().row;l=this.getRowFoldStart(l);var i=this.$toggleFoldWidget(l,{});if(i){return}var k=this.getParentFoldRangeData(l,true);i=k.range||k.firstRange;if(i){l=i.start.row;var j=this.getFoldAt(l,this.getLine(l).length,1);if(j){this.removeFold(j)}else{this.addFold("...",i)}}};this.updateFoldWidgets=function(l){var n=l.data;var j=n.range;var m=j.start.row;var i=j.end.row-m;if(i===0){this.foldWidgets[m]=null}else{if(n.action=="removeText"||n.action=="removeLines"){this.foldWidgets.splice(m,i+1,null)}else{var k=Array(i+1);k.unshift(m,1);this.foldWidgets.splice.apply(this.foldWidgets,k)}}}}c.Folding=b});define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(b,a,c){var d=b("../range").Range;function e(f,h){this.foldData=f;if(Array.isArray(h)){this.folds=h}else{h=this.folds=[h]}var g=h[h.length-1];this.range=new d(h[0].start.row,h[0].start.column,g.end.row,g.end.column);this.start=this.range.start;this.end=this.range.end;this.folds.forEach(function(i){i.setFoldLine(this)},this)}(function(){this.shiftRow=function(f){this.start.row+=f;this.end.row+=f;this.folds.forEach(function(g){g.start.row+=f;g.end.row+=f})};this.addFold=function(f){if(f.sameRow){if(f.start.rowthis.endRow){throw new Error("Can't add a fold to this FoldLine as it has no connection")}this.folds.push(f);this.folds.sort(function(h,g){return -h.range.compareEnd(g.start.row,g.start.column)});if(this.range.compareEnd(f.start.row,f.start.column)>0){this.end.row=f.end.row;this.end.column=f.end.column}else{if(this.range.compareStart(f.end.row,f.end.column)<0){this.start.row=f.start.row;this.start.column=f.start.column}}}else{if(f.start.row==this.end.row){this.folds.push(f);this.end.row=f.end.row;this.end.column=f.end.column}else{if(f.end.row==this.start.row){this.folds.unshift(f);this.start.row=f.start.row;this.start.column=f.start.column}else{throw new Error("Trying to add fold to FoldRow that doesn't have a matching row")}}}f.foldLine=this};this.containsRow=function(f){return f>=this.start.row&&f<=this.end.row};this.walk=function(p,g,l){var f=0,o=this.folds,m,j,n,k=true;if(g==null){g=this.end.row;l=this.end.column}for(var h=0;h1){l.onMatch=this.$applyToken}else{l.onMatch=l.token}}}if(r>1){if(/\\\d/.test(l.regex)){n=l.regex.replace(/\\([0-9]+)/g,function(i,s){return"\\"+(parseInt(s,10)+q+1)})}else{r=1;n=this.removeCapturingGroups(l.regex)}if(!l.splitRegex&&typeof l.token!="string"){m.push(l)}}f[q]=h;q+=r;j.push(n);if(!l.onMatch){l.onMatch=null}l.__proto__=null}m.forEach(function(i){i.splitRegex=this.createSplitterRegexp(i.regex,k)},this);this.regExps[o]=new RegExp("("+j.join(")|(")+")|($)",k)}};(function(){this.$setMaxTokenCount=function(f){e=f|0};this.$applyToken=function(m){var g=this.splitRegex.exec(m).slice(1);var j=this.token.apply(this,g);if(typeof j==="string"){return[{type:j,value:m}]}var k=[];for(var h=0,f=j.length;hn){var p=w.substring(n,o-u.length);if(j.type==q){j.value+=p}else{if(j.type){r.push(j)}j={type:q,value:p}}}for(var l=0;le){while(n1){if(t[0]!==h){t.unshift(h)}}return{tokens:r,state:t.length?t:h}}}).call(b.prototype);a.Tokenizer=b});define("ace/edit_session/fold",["require","exports","module","ace/range","ace/range_list","ace/lib/oop"],function(d,f,a){var c=d("../range").Range;var g=d("../range_list").RangeList;var h=d("../lib/oop");var j=f.Fold=function(l,m){this.foldLine=null;this.placeholder=m;this.range=l;this.start=l.start;this.end=l.end;this.sameRow=l.start.row==l.end.row;this.subFolds=this.ranges=[]};h.inherits(j,g);(function(){this.toString=function(){return'"'+this.placeholder+'" '+this.range.toString()};this.setFoldLine=function(l){this.foldLine=l;this.subFolds.forEach(function(m){m.setFoldLine(l)})};this.clone=function(){var l=this.range.clone();var m=new j(l,this.placeholder);this.subFolds.forEach(function(n){m.subFolds.push(n.clone())});m.collapseChildren=this.collapseChildren;return m};this.addSubFold=function(p){if(this.range.isEqual(p)){return}if(!this.range.containsRange(p)){throw new Error("A fold can't intersect already existing fold"+p.range+this.range)}i(p,this.start);var t=p.start.row,l=p.start.column;for(var o=0,r=-1;o2){return H%w!=w-1}else{return H%w==0}return true}}function A(G){for(var H=l;H<=z;H++){G(F.getLine(H),H)}}var v=Infinity;A(function(H,I){var G=H.search(/\S/);if(G!==-1){if(GH.length){v=H.length}}});if(o==Infinity){o=v;p=false;B=false}if(E&&o%w!=0){o=Math.floor(o/w)*w}A(B?r:n)};this.toggleBlockComment=function(l,w,s,z){var t=this.blockComment;if(!t){return}if(!t.start&&t[0]){t=t[0]}var r=new i(w,z.row,z.column);var o=r.getCurrentToken();var m=w.selection;var v=w.selection.toOrientedRange();var y,u;if(o&&/comment/.test(o.type)){var x,p;while(o&&/comment/.test(o.type)){var q=o.value.indexOf(t.start);if(q!=-1){var A=r.getCurrentTokenRow();var n=r.getCurrentTokenColumn()+q;x=new e(A,n,A,n+t.start.length);break}o=r.stepBackward()}var r=new i(w,z.row,z.column);var o=r.getCurrentToken();while(o&&/comment/.test(o.type)){var q=o.value.indexOf(t.end);if(q!=-1){var A=r.getCurrentTokenRow();var n=r.getCurrentTokenColumn()+q;p=new e(A,n,A,n+t.end.length);break}o=r.stepForward()}if(p){w.remove(p)}if(x){w.remove(x);y=x.start.row;u=-t.start.length}}else{u=t.start.length;y=s.start.row;w.insert(s.end,t.end);w.insert(s.start,t.start)}if(v.start.row==y){v.start.column+=u}if(v.end.row==y){v.end.column+=u}w.selection.fromOrientedRange(v)};this.getNextLineIndent=function(n,l,m){return this.$getIndent(l)};this.checkOutdent=function(n,l,m){return false};this.autoOutdent=function(l,m,n){};this.$getIndent=function(l){return l.match(/^\s*/)[0]};this.createWorker=function(l){return null};this.createModeDelegates=function(m){this.$embeds=[];this.$modes={};for(var n in m){if(m[n]){this.$embeds.push(n);this.$modes[n]=new m[n]()}}var l=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var n=0;n0){continue}var g=e(o,h.start);if(m===0){return j&&g!==0?-k-2:k}if(g>0||(g===0&&!j)){return k}return -k-1}return -k-1};this.add=function(h){var g=!h.isEmpty();var j=this.pointIndex(h.start,g);if(j<0){j=-j-1}var i=this.pointIndex(h.end,g,j);if(i<0){i=-i-1}else{i++}return this.ranges.splice(j,i-j,h)};this.addList=function(h){var j=[];for(var g=h.length;g--;){j.push.call(j,this.add(h[g]))}return j};this.substractPoint=function(h){var g=this.pointIndex(h);if(g>=0){return this.ranges.splice(g,1)}};this.merge=function(){var m=[];var l=this.ranges;l=l.sort(function(n,i){return e(n.start,i.start)});var j=l[0],g;for(var h=1;h=0};this.containsPoint=function(g){return this.pointIndex(g)>=0};this.rangeAtPoint=function(h){var g=this.pointIndex(h);if(g>=0){return this.ranges[g]}};this.clipRows=function(j,h){var m=this.ranges;if(m[0].start.row>h||m[m.length-1].start.rowu){break}if(g.start.row==u&&g.start.column>=j.column){if(g.start.column==j.column&&this.$insertRight){}else{g.start.column+=q;g.start.row+=t}}if(g.end.row==u&&g.end.column>=j.column){if(g.end.column==j.column&&this.$insertRight){continue}if(g.end.column==j.column&&q>0&&pg.start.column&&g.end.column==h[p+1].start.column){g.end.column-=q}}g.end.column+=q;g.end.row+=t}}if(t!=0&&p ["+this.end.row+"/"+this.end.column+"]")};this.contains=function(g,f){return this.compare(g,f)==0};this.compareRange=function(g){var h,f=g.end,i=g.start;h=this.compare(f.row,f.column);if(h==1){h=this.compare(i.row,i.column);if(h==1){return 2}else{if(h==0){return 1}else{return 0}}}else{if(h==-1){return -2}else{h=this.compare(i.row,i.column);if(h==-1){return -1}else{if(h==1){return 42}else{return 0}}}}};this.comparePoint=function(f){return this.compare(f.row,f.column)};this.containsRange=function(f){return this.comparePoint(f.start)==0&&this.comparePoint(f.end)==0};this.intersects=function(f){var g=this.compareRange(f);return(g==-1||g==0||g==1)};this.isEnd=function(g,f){return this.end.row==g&&this.end.column==f};this.isStart=function(g,f){return this.start.row==g&&this.start.column==f};this.setStart=function(g,f){if(typeof g=="object"){this.start.column=g.column;this.start.row=g.row}else{this.start.row=g;this.start.column=f}};this.setEnd=function(g,f){if(typeof g=="object"){this.end.column=g.column;this.end.row=g.row}else{this.end.row=g;this.end.column=f}};this.inside=function(g,f){if(this.compare(g,f)==0){if(this.isEnd(g,f)||this.isStart(g,f)){return false}else{return true}}return false};this.insideStart=function(g,f){if(this.compare(g,f)==0){if(this.isEnd(g,f)){return false}else{return true}}return false};this.insideEnd=function(g,f){if(this.compare(g,f)==0){if(this.isStart(g,f)){return false}else{return true}}return false};this.compare=function(g,f){if(!this.isMultiLine()){if(g===this.start.row){return fthis.end.column?1:0)}}if(gthis.end.row){return 1}if(this.start.row===g){return f>=this.start.column?0:-1}if(this.end.row===g){return f<=this.end.column?0:1}return 0};this.compareStart=function(g,f){if(this.start.row==g&&this.start.column==f){return -1}else{return this.compare(g,f)}};this.compareEnd=function(g,f){if(this.end.row==g&&this.end.column==f){return 1}else{return this.compare(g,f)}};this.compareInside=function(g,f){if(this.end.row==g&&this.end.column==f){return 1}else{if(this.start.row==g&&this.start.column==f){return -1}else{return this.compare(g,f)}}};this.clipRows=function(h,g){if(this.end.row>g){var f={row:g+1,column:0}}else{if(this.end.rowg){var i={row:g+1,column:0}}else{if(this.start.row=0){var i=o.charAt(n);if(i==j){k-=1;if(k==0){return{row:l.getCurrentTokenRow(),column:n+l.getCurrentTokenColumn()}}}else{if(i==g){k+=1}}n-=1}do{h=l.stepBackward()}while(h&&!p.test(h.type));if(h==null){break}o=h.value;n=o.length-1}return null};this.$findClosingBracket=function(g,m,q){var h=this.$brackets[g];var k=1;var l=new e(this,m.row,m.column);var i=l.getCurrentToken();if(!i){i=l.stepForward()}if(!i){return}if(!q){q=new RegExp("(\\.?"+i.type.replace(".","\\.").replace("lparen",".paren")+")+")}var n=m.column-l.getCurrentTokenColumn();while(true){var o=i.value;var p=o.length;while(ni.row||(j.row==i.row&&j.column>i.column))};this.getRange=function(){var j=this.anchor;var i=this.lead;if(this.isEmpty()){return g.fromPoints(i,i)}if(this.isBackwards()){return g.fromPoints(i,j)}else{return g.fromPoints(j,i)}};this.clearSelection=function(){if(!this.$isEmpty){this.$isEmpty=true;this._emit("changeSelection")}};this.selectAll=function(){var i=this.doc.getLength()-1;this.setSelectionAnchor(0,0);this.moveCursorTo(i,this.doc.getLine(i).length)};this.setRange=this.setSelectionRange=function(i,j){if(j){this.setSelectionAnchor(i.end.row,i.end.column);this.selectTo(i.start.row,i.start.column)}else{this.setSelectionAnchor(i.start.row,i.start.column);this.selectTo(i.end.row,i.end.column)}if(this.getRange().isEmpty()){this.$isEmpty=true}this.$desiredColumn=null};this.$moveSelection=function(i){var j=this.lead;if(this.$isEmpty){this.setSelectionAnchor(j.row,j.column)}i.call(this)};this.selectTo=function(j,i){this.$moveSelection(function(){this.moveCursorTo(j,i)})};this.selectToPosition=function(i){this.$moveSelection(function(){this.moveCursorToPosition(i)})};this.moveTo=function(j,i){this.clearSelection();this.moveCursorTo(j,i)};this.moveToPosition=function(i){this.clearSelection();this.moveCursorToPosition(i)};this.selectUp=function(){this.$moveSelection(this.moveCursorUp)};this.selectDown=function(){this.$moveSelection(this.moveCursorDown)};this.selectRight=function(){this.$moveSelection(this.moveCursorRight)};this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)};this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)};this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)};this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)};this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)};this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)};this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)};this.getWordRange=function(k,i){if(typeof i=="undefined"){var j=k||this.lead;k=j.row;i=j.column}return this.session.getWordRange(k,i)};this.selectWord=function(){this.setSelectionRange(this.getWordRange())};this.selectAWord=function(){var j=this.getCursor();var i=this.session.getAWordRange(j.row,j.column);this.setSelectionRange(i)};this.getLineRange=function(m,k){var i=typeof m=="number"?m:this.lead.row;var j;var l=this.session.getFoldLine(i);if(l){i=l.start.row;j=l.end.row}else{j=i}if(k===true){return new g(i,0,j,this.session.getLine(j).length)}else{return new g(i,0,j+1,0)}};this.selectLine=function(){this.setSelectionRange(this.getLineRange())};this.moveCursorUp=function(){this.moveCursorBy(-1,0)};this.moveCursorDown=function(){this.moveCursorBy(1,0)};this.moveCursorLeft=function(){var k=this.lead.getPosition(),i;if(i=this.session.getFoldAt(k.row,k.column,-1)){this.moveCursorTo(i.start.row,i.start.column)}else{if(k.column==0){if(k.row>0){this.moveCursorTo(k.row-1,this.doc.getLine(k.row-1).length)}}else{var j=this.session.getTabSize();if(this.session.isTabStop(k)&&this.doc.getLine(k.row).slice(k.column-j,k.column).split(" ").length-1==j){this.moveCursorBy(0,-j)}else{this.moveCursorBy(0,-1)}}}};this.moveCursorRight=function(){var k=this.lead.getPosition(),i;if(i=this.session.getFoldAt(k.row,k.column,1)){this.moveCursorTo(i.end.row,i.end.column)}else{if(this.lead.column==this.doc.getLine(this.lead.row).length){if(this.lead.row0){l.column=k}}}this.moveCursorTo(l.row,l.column)};this.moveCursorFileEnd=function(){var j=this.doc.getLength()-1;var i=this.doc.getLine(j).length;this.moveCursorTo(j,i)};this.moveCursorFileStart=function(){this.moveCursorTo(0,0)};this.moveCursorLongWordRight=function(){var n=this.lead.row;var l=this.lead.column;var i=this.doc.getLine(n);var m=i.substring(l);var k;this.session.nonTokenRe.lastIndex=0;this.session.tokenRe.lastIndex=0;var j=this.session.getFoldAt(n,l,1);if(j){this.moveCursorTo(j.end.row,j.end.column);return}if(k=this.session.nonTokenRe.exec(m)){l+=this.session.nonTokenRe.lastIndex;this.session.nonTokenRe.lastIndex=0;m=i.substring(l)}if(l>=i.length){this.moveCursorTo(n,i.length);this.moveCursorRight();if(n0){this.moveCursorWordLeft()}return}if(i=this.session.tokenRe.exec(l)){k-=this.session.tokenRe.lastIndex;this.session.tokenRe.lastIndex=0}this.moveCursorTo(n,k)};this.$shortWordEndIndex=function(n){var j,i=0,m;var l=/\s/;var k=this.session.tokenRe;k.lastIndex=0;if(j=this.session.tokenRe.exec(n)){i=this.session.tokenRe.lastIndex}else{while((m=n[i])&&l.test(m)){i++}if(i<1){k.lastIndex=0;while((m=n[i])&&!k.test(m)){k.lastIndex=0;i++;if(l.test(m)){if(i>2){i--;break}else{while((m=n[i])&&l.test(m)){i++}if(i>2){break}}}}}}k.lastIndex=0;return i};this.moveCursorShortWordRight=function(){var p=this.lead.row;var n=this.lead.column;var j=this.doc.getLine(p);var o=j.substring(n);var m=this.session.getFoldAt(p,n,1);if(m){return this.moveCursorTo(m.end.row,m.end.column)}if(n==j.length){var i=this.doc.getLength();do{p++;o=this.doc.getLine(p)}while(p0&&/^\s*$/.test(i));l=i.length;if(!/\s+$/.test(i)){i=""}}var m=h.stringReverse(i);var j=this.$shortWordEndIndex(m);return this.moveCursorTo(n,l-j)};this.moveCursorWordRight=function(){if(this.session.$selectLongWords){this.moveCursorLongWordRight()}else{this.moveCursorShortWordRight()}};this.moveCursorWordLeft=function(){if(this.session.$selectLongWords){this.moveCursorLongWordLeft()}else{this.moveCursorShortWordLeft()}};this.moveCursorBy=function(l,k){var j=this.session.documentToScreenPosition(this.lead.row,this.lead.column);if(k===0){if(this.$desiredColumn){j.column=this.$desiredColumn}else{this.$desiredColumn=j.column}}var i=this.session.screenToDocumentPosition(j.row+l,j.column);if(l!==0&&k===0&&i.row===this.lead.row&&i.column===this.lead.column){if(this.session.lineWidgets&&this.session.lineWidgets[i.row]){i.row++}}this.moveCursorTo(i.row,i.column+k,k===0)};this.moveCursorToPosition=function(i){this.moveCursorTo(i.row,i.column)};this.moveCursorTo=function(l,k,i){var j=this.session.getFoldAt(l,k,1);if(j){l=j.start.row;k=j.start.column}this.$keepDesiredColumnOnChange=true;this.lead.setPosition(l,k);this.$keepDesiredColumnOnChange=false;if(!i){this.$desiredColumn=null}};this.moveCursorToScreen=function(k,j,i){var l=this.session.screenToDocumentPosition(k,j);this.moveCursorTo(l.row,l.column,i)};this.detach=function(){this.lead.detach();this.anchor.detach();this.session=this.doc=null};this.fromOrientedRange=function(i){this.setSelectionRange(i,i.cursor==i.start);this.$desiredColumn=i.desiredColumn||this.$desiredColumn};this.toOrientedRange=function(i){var j=this.getRange();if(i){i.start.column=j.start.column;i.start.row=j.start.row;i.end.column=j.end.column;i.end.row=j.end.row}else{i=j}i.cursor=this.isBackwards()?i.start:i.end;i.desiredColumn=this.$desiredColumn;return i};this.getRangeOfMovements=function(j){var l=this.getCursor();try{j.call(null,this);var i=this.getCursor();return g.fromPoints(l,i)}catch(k){return g.fromPoints(l,l)}finally{this.moveCursorToPosition(l)}};this.toJSON=function(){if(this.rangeCount){var i=this.ranges.map(function(k){var j=k.clone();j.isBackwards=k.cursor==k.start;return j})}else{var i=this.getRange();i.isBackwards=this.isBackwards()}return i};this.fromJSON=function(l){if(l.start==undefined){if(this.rangeList){this.toSingleRange(l[0]);for(var j=l.length;j--;){var k=g.fromPoints(l[j].start,l[j].end);if(l.isBackwards){k.cursor=k.start}this.addRange(k,true)}return}else{l=l[0]}}if(this.rangeList){this.toSingleRange(l)}this.setSelectionRange(l,l.isBackwards)};this.isEqual=function(k){if((k.length||this.rangeCount)&&k.length!=this.rangeCount){return false}if(!k.length||!this.ranges){return this.getRange().isEqual(k)}for(var j=this.ranges.length;j--;){if(!this.ranges[j].isEqual(k[j])){return false}}return true}}).call(d.prototype);a.Selection=d});define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(c,a,d){var g=c("./lib/lang");var e=c("./lib/oop");var f=c("./range").Range;var b=function(){this.$options={}};(function(){this.set=function(h){e.mixin(this.$options,h);return this};this.getOptions=function(){return g.copyObject(this.$options)};this.setOptions=function(h){this.$options=h};this.find=function(j){var i=this.$matchIterator(j,this.$options);if(!i){return false}var h=null;i.forEach(function(k,n,m){if(!k.start){var l=k.offset+(m||0);h=new f(n,l,n,l+k.length)}else{h=k}return true});return h};this.findAll=function(k){var q=this.$options;if(!q.needle){return[]}this.$assembleRegExp(q);var v=q.range;var h=v?k.getLines(v.start.row,v.end.row):k.doc.getAllLines();var o=[];var x=q.re;if(q.$isMultiLine){var C=x.length;var y=h.length-C;var w;outer:for(var s=x.offset||0;s<=y;s++){for(var A=0;Ar){continue}o.push(w=new f(s,r,s+C-1,n));if(C>2){s=s+C-2}}}else{for(var B=0;Bm&&o[A].end.row==v.end.row){A--}o=o.slice(B,A+1);for(B=0,A=o.length;B=0;q--){if(o(r[q],t,s)){return true}}}}else{var l=function(p,t,s){var r=g.getMatchOffsets(p,m);for(var q=0;q=j;r--){if(s(m.getLine(r),r)){return}}if(p.wrap==false){return}for(r=o,j=h.row;r>=j;r--){if(s(m.getLine(r),r)){return}}}:function(s){var r=h.row;var q=m.getLine(r).substr(h.column);if(s(q,r,h.column)){return}for(r=r+1;r<=o;r++){if(s(m.getLine(r),r)){return}}if(p.wrap==false){return}for(r=j,o=h.row;r<=o;r++){if(s(m.getLine(r),r)){return}}};return{forEach:l}}}).call(b.prototype);a.Search=b});define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/search_highlight","ace/edit_session/folding","ace/edit_session/bracket_match"],function(g,i,c){var l=g("./lib/oop");var b=g("./lib/lang");var e=g("./config");var m=g("./lib/event_emitter").EventEmitter;var n=g("./selection").Selection;var h=g("./mode/text").Mode;var f=g("./range").Range;var j=g("./document").Document;var d=g("./background_tokenizer").BackgroundTokenizer;var k=g("./search_highlight").SearchHighlight;var a=function(p,o){this.$breakpoints=[];this.$decorations=[];this.$frontMarkers={};this.$backMarkers={};this.$markerId=1;this.$undoSelect=true;this.$foldData=[];this.$foldData.toString=function(){return this.join("\n")};this.on("changeFold",this.onChangeFold.bind(this));this.$onChange=this.onChange.bind(this);if(typeof p!="object"||!p.getLine){p=new j(p)}this.setDocument(p);this.selection=new n(this);e.resetOptions(this);this.setMode(o);e._signal("session",this)};(function(){l.implement(this,m);this.setDocument=function(x){if(this.doc){this.doc.removeListener("change",this.$onChange)}this.doc=x;x.on("change",this.$onChange);if(this.bgTokenizer){this.bgTokenizer.setDocument(this.getDocument())}this.resetCaches()};this.getDocument=function(){return this.doc};this.$resetRowCache=function(y){if(!y){this.$docRowCache=[];this.$screenRowCache=[];return}var x=this.$docRowCache.length;var z=this.$getRowCacheIndex(this.$docRowCache,y)+1;if(x>z){this.$docRowCache.splice(z,x);this.$screenRowCache.splice(z,x)}};this.$getRowCacheIndex=function(y,B){var x=0;var A=y.length-1;while(x<=A){var z=(x+A)>>1;var C=y[z];if(B>C){x=z+1}else{if(B=z){break}}}y=A[x];if(!y){return null}y.index=x;y.start=C-y.value.length;return y};this.setUndoManager=function(y){this.$undoManager=y;this.$deltas=[];this.$deltasDoc=[];this.$deltasFold=[];if(this.$informUndoManager){this.$informUndoManager.cancel()}if(y){var x=this;this.$syncInformUndoManager=function(){x.$informUndoManager.cancel();if(x.$deltasFold.length){x.$deltas.push({group:"fold",deltas:x.$deltasFold});x.$deltasFold=[]}if(x.$deltasDoc.length){x.$deltas.push({group:"doc",deltas:x.$deltasDoc});x.$deltasDoc=[]}if(x.$deltas.length>0){y.execute({action:"aceupdate",args:[x.$deltas,x],merge:x.mergeUndoDeltas})}x.mergeUndoDeltas=false;x.$deltas=[]};this.$informUndoManager=b.delayedCall(this.$syncInformUndoManager)}};this.markUndoGroup=function(){if(this.$syncInformUndoManager){this.$syncInformUndoManager()}};this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}};this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager};this.getTabString=function(){if(this.getUseSoftTabs()){return b.stringRepeat(" ",this.getTabSize())}else{return"\t"}};this.setUseSoftTabs=function(x){this.setOption("useSoftTabs",x)};this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs};this.setTabSize=function(x){this.setOption("tabSize",x)};this.getTabSize=function(){return this.$tabSize};this.isTabStop=function(x){return this.$useSoftTabs&&(x.column%this.$tabSize===0)};this.$overwrite=false;this.setOverwrite=function(x){this.setOption("overwrite",x)};this.getOverwrite=function(){return this.$overwrite};this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)};this.addGutterDecoration=function(y,x){if(!this.$decorations[y]){this.$decorations[y]=""}this.$decorations[y]+=" "+x;this._signal("changeBreakpoint",{})};this.removeGutterDecoration=function(y,x){this.$decorations[y]=(this.$decorations[y]||"").replace(" "+x,"");this._signal("changeBreakpoint",{})};this.getBreakpoints=function(){return this.$breakpoints};this.setBreakpoints=function(y){this.$breakpoints=[];for(var x=0;x0){x=!!z.charAt(B-1).match(this.tokenRe)}if(!x){x=!!z.charAt(B).match(this.tokenRe)}if(x){var A=this.tokenRe}else{if(/^\s+$/.test(z.slice(B-1,B+1))){var A=/\s/}else{var A=this.nonTokenRe}}var D=B;if(D>0){do{D--}while(D>=0&&z.charAt(D).match(A));D++}var y=B;while(yx){x=y.screenWidth}});return this.lineWidgetWidth=x};this.$computeWidth=function(y){if(this.$modified||y){this.$modified=false;if(this.$useWrapMode){return this.screenWidth=this.$wrapLimit}var F=this.doc.getAllLines();var x=this.$rowLengthCache;var z=0;var E=0;var D=this.$foldData[E];var B=D?D.start.row:Infinity;var C=F.length;for(var A=0;AB){A=D.end.row+1;if(A>=C){break}D=this.$foldData[E++];B=D?D.start.row:Infinity}if(x[A]==null){x[A]=this.$getStringScreenWidth(F[A])[0]}if(x[A]>z){z=x[A]}}this.screenWidth=z}};this.getLine=function(x){return this.doc.getLine(x)};this.getLines=function(y,x){return this.doc.getLines(y,x)};this.getLength=function(){return this.doc.getLength()};this.getTextRange=function(x){return this.doc.getTextRange(x||this.selection.getRange())};this.insert=function(x,y){return this.doc.insert(x,y)};this.remove=function(x){return this.doc.remove(x)};this.undoChanges=function(A,z){if(!A.length){return}this.$fromUndo=true;var x=null;for(var y=A.length-1;y!=-1;y--){var B=A[y];if(B.group=="doc"){this.doc.revertDeltas(B.deltas);x=this.$getUndoSelection(B.deltas,true,x)}else{B.deltas.forEach(function(C){this.addFolds(C.folds)},this)}}this.$fromUndo=false;x&&this.$undoSelect&&!z&&this.selection.setSelectionRange(x);return x};this.redoChanges=function(A,z){if(!A.length){return}this.$fromUndo=true;var x=null;for(var y=0;yD.end.column){y.start.column+=z}if(y.end.row==D.end.row&&y.end.column>D.end.column){y.end.column+=z}}if(C&&y.start.row>=D.end.row){y.start.row+=C;y.end.row+=C}}y.end=this.insert(y.start,G);if(E.length){var A=D.start;var B=y.start;var C=B.row-A.row;var z=B.column-A.column;this.addFolds(E.map(function(H){H=H.clone();if(H.start.row==A.row){H.start.column+=z}if(H.end.row==A.row){H.end.column+=z}H.start.row+=C;H.end.row+=C;return H}))}return y};this.indentRows=function(y,x,A){A=A.replace(/\t/g,this.getTabString());for(var z=y;z<=x;z++){this.insert({row:z,column:0},A)}};this.outdentRows=function(z){var D=z.collapseRows();var y=new f(0,0,0,0);var C=this.getTabSize();for(var B=D.start.row;B<=D.end.row;++B){var x=this.getLine(B);y.start.row=B;y.end.row=B;for(var A=0;A0){var D=this.getRowFoldEnd(A+z);if(D>this.doc.getLength()-1){return 0}var C=D-A}else{E=this.$clipRowToDocument(E);A=this.$clipRowToDocument(A);var C=A-E+1}}var y=new f(E,0,A,Number.MAX_VALUE);var B=this.getFoldsInRange(y).map(function(F){F=F.clone();F.start.row+=C;F.end.row+=C;return F});var x=z==0?this.doc.getLines(E,A):this.doc.removeLines(E,A);this.doc.insertLines(E+C,x);B.length&&this.addFolds(B);return C};this.moveLinesUp=function(y,x){return this.$moveLines(y,x,-1)};this.moveLinesDown=function(y,x){return this.$moveLines(y,x,1)};this.duplicateLines=function(y,x){return this.$moveLines(y,x,0)};this.$clipRowToDocument=function(x){return Math.max(0,Math.min(x,this.doc.getLength()-1))};this.$clipColumnToRow=function(y,x){if(x<0){return 0}return Math.min(this.doc.getLine(y).length,x)};this.$clipPositionToDocument=function(z,y){y=Math.max(0,y);if(z<0){z=0;y=0}else{var x=this.doc.getLength();if(z>=x){z=x-1;y=this.doc.getLine(x-1).length}else{y=Math.min(this.doc.getLine(z).length,y)}}return{row:z,column:y}};this.$clipRangeToDocument=function(y){if(y.start.row<0){y.start.row=0;y.start.column=0}else{y.start.column=this.$clipColumnToRow(y.start.row,y.start.column)}var x=this.doc.getLength()-1;if(y.end.row>x){y.end.row=x;y.end.column=this.doc.getLine(x).length}else{y.end.column=this.$clipColumnToRow(y.end.row,y.end.column)}return y};this.$wrapLimit=80;this.$useWrapMode=false;this.$wrapLimitRange={min:null,max:null};this.setUseWrapMode=function(y){if(y!=this.$useWrapMode){this.$useWrapMode=y;this.$modified=true;this.$resetRowCache(0);if(y){var x=this.getLength();this.$wrapData=Array(x);this.$updateWrapData(0,x-1)}this._signal("changeWrapMode")}};this.getUseWrapMode=function(){return this.$useWrapMode};this.setWrapLimitRange=function(y,x){if(this.$wrapLimitRange.min!==y||this.$wrapLimitRange.max!==x){this.$wrapLimitRange={min:y,max:x};this.$modified=true;this._signal("changeWrapMode")}};this.adjustWrapLimit=function(A,z){var y=this.$wrapLimitRange;if(y.max<0){y={min:z,max:z}}var x=this.$constrainWrapLimit(A,y.min,y.max);if(x!=this.$wrapLimit&&x>1){this.$wrapLimit=x;this.$modified=true;if(this.$useWrapMode){this.$updateWrapData(0,this.getLength()-1);this.$resetRowCache(0);this._signal("changeWrapLimit")}return true}return false};this.$constrainWrapLimit=function(y,z,x){if(z){y=Math.max(z,y)}if(x){y=Math.min(x,y)}return y};this.getWrapLimit=function(){return this.$wrapLimit};this.setWrapLimit=function(x){this.setWrapLimitRange(x,x)};this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}};this.$updateInternalDataOnChange=function(G){var D=this.$useWrapMode;var F;var B=G.data.action;var A=G.data.range.start.row;var M=G.data.range.end.row;var y=G.data.range.start;var C=G.data.range.end;var x=null;if(B.indexOf("Lines")!=-1){if(B=="insertLines"){M=A+(G.data.lines.length)}else{M=A}F=G.data.lines?G.data.lines.length:M-A}else{F=M-A}this.$updating=true;if(F!=0){if(B.indexOf("remove")!=-1){this[D?"$wrapData":"$rowLengthCache"].splice(A,F);var z=this.$foldData;x=this.getFoldsInRange(G.data.range);this.removeFolds(x);var K=this.getFoldLine(C.row);var L=0;if(K){K.addRemoveChars(C.row,C.column,y.column-C.column);K.shiftRow(-F);var J=this.getFoldLine(A);if(J&&J!==K){J.merge(K);K=J}L=z.indexOf(K)+1}for(L;L=C.row){K.shiftRow(-F)}}M=A}else{var H=Array(F);H.unshift(A,0);var E=D?this.$wrapData:this.$rowLengthCache;E.splice.apply(E,H);var z=this.$foldData;var K=this.getFoldLine(A);var L=0;if(K){var I=K.range.compareInside(y.row,y.column);if(I==0){K=K.split(y.row,y.column);K.shiftRow(F);K.addRemoveChars(M,0,C.column-y.column)}else{if(I==-1){K.addRemoveChars(A,0,C.column-y.column);K.shiftRow(F)}}L=z.indexOf(K)+1}for(L;L=A){K.shiftRow(F)}}}}else{F=Math.abs(G.data.range.start.column-G.data.range.end.column);if(B.indexOf("remove")!=-1){x=this.getFoldsInRange(G.data.range);this.removeFolds(x);F=-F}var K=this.getFoldLine(A);if(K){K.addRemoveChars(A,y.column,F)}}if(D&&this.$wrapData.length!=this.doc.getLength()){console.error("doc.getLength() and $wrapData.length have to be the same!")}this.$updating=false;if(D){this.$updateWrapData(A,M)}else{this.$updateRowLengthCache(A,M)}return x};this.$updateRowLengthCache=function(z,y,x){this.$rowLengthCache[z]=null;this.$rowLengthCache[y]=null};this.$updateWrapData=function(x,D){var F=this.doc.getAllLines();var z=this.getTabSize();var y=this.$wrapData;var E=this.$wrapLimit;var A;var B;var C=x;D=Math.min(D,F.length-1);while(C<=D){B=this.getFoldLine(C,B);if(!B){A=this.$getDisplayTokens(F[C]);y[C]=this.$computeWrapSplits(A,E,z);C++}else{A=[];B.walk(function(L,K,J,G){var H;if(L!=null){H=this.$getDisplayTokens(L,A.length);H[0]=u;for(var I=1;IG){var B=A+G;if(C[B-1]>=s&&C[B]>=s){F(B);continue}if(C[B]==u||C[B]==o){for(B;B!=A-1;B--){if(C[B]==u){break}}if(B>A){F(B);continue}B=A+G;for(B;B>2)),A-1);while(B>z&&C[B]z&&C[B]z&&C[B]==r){B--}}else{while(B>z&&C[B]z){F(++B);continue}B=A+G;F(B)}return E};this.$getDisplayTokens=function(B,A){var x=[];var z;A=A||0;for(var y=0;y39&&D<48)||(D>57&&D<64)){x.push(r)}else{if(D>=4352&&q(D)){x.push(w,v)}else{x.push(w)}}}}}return x};this.$getStringScreenWidth=function(z,B,x){if(B==0){return[0,0]}if(B==null){B=Infinity}x=x||0;var A,y;for(y=0;y=4352&&q(A)){x+=2}else{x+=1}}if(x>B){break}}return[x,y]};this.lineWidgets=null;this.getRowLength=function(y){if(this.lineWidgets){var x=this.lineWidgets[y]&&this.lineWidgets[y].rowCount||0}else{x=0}if(!this.$useWrapMode||!this.$wrapData[y]){return 1+x}else{return this.$wrapData[y].length+1+x}};this.getRowLineCount=function(x){if(!this.$useWrapMode||!this.$wrapData[x]){return 1}else{return this.$wrapData[x].length+1}};this.getScreenLastRowColumn=function(x){var y=this.screenToDocumentPosition(x,Number.MAX_VALUE);return this.documentToScreenColumn(y.row,y.column)};this.getDocumentLastRowColumn=function(x,z){var y=this.documentToScreenRow(x,z);return this.getScreenLastRowColumn(y)};this.getDocumentLastRowColumnPosition=function(x,z){var y=this.documentToScreenRow(x,z);return this.screenToDocumentPosition(y,Number.MAX_VALUE/10)};this.getRowSplitData=function(x){if(!this.$useWrapMode){return undefined}else{return this.$wrapData[x]}};this.getScreenTabSize=function(x){return this.$tabSize-x%this.$tabSize};this.screenToDocumentRow=function(y,x){return this.screenToDocumentPosition(y,x).row};this.screenToDocumentColumn=function(y,x){return this.screenToDocumentPosition(y,x).column};this.screenToDocumentPosition=function(H,I){if(H<0){return{row:0,column:0}}var N;var A=0;var E=0;var C;var M=0;var D=0;var z=this.$screenRowCache;var G=this.$getRowCacheIndex(z,H);var B=z.length;if(B&&G>=0){var M=z[G];var A=this.$docRowCache[G];var x=H>z[B-1]}else{var x=!B}var J=this.getLength()-1;var K=this.getNextFoldLine(A);var F=K?K.start.row:Infinity;while(M<=H){D=this.getRowLength(A);if(M+D>H||A>=J){break}else{M+=D;A++;if(A>F){A=K.end.row+1;K=this.getNextFoldLine(A,K);F=K?K.start.row:Infinity}}if(x){this.$docRowCache.push(A);this.$screenRowCache.push(M)}}if(K&&K.start.row<=A){N=this.getFoldDisplayLine(K);A=K.start.row}else{if(M+D<=H||A>J){return{row:J,column:this.getLine(J).length}}else{N=this.getLine(A);K=null}}if(this.$useWrapMode){var L=this.$wrapData[A];if(L){var y=Math.floor(H-M);C=L[y];if(y>0&&L.length){E=L[y-1]||L[L.length-1];N=N.substring(E)}}}E+=this.$getStringScreenWidth(N,I)[1];if(this.$useWrapMode&&E>=C){E=C-1}if(K){return K.idxToPosition(E)}return{row:A,column:E}};this.documentToScreenPosition=function(A,C){if(typeof C==="undefined"){var K=this.$clipPositionToDocument(A.row,A.column)}else{K=this.$clipPositionToDocument(A,C)}A=K.row;C=K.column;var G=0;var F=null;var H=null;H=this.getFoldAt(A,C,1);if(H){A=H.start.row;C=H.start.column}var I,N=0;var z=this.$docRowCache;var E=this.$getRowCacheIndex(z,A);var B=z.length;if(B&&E>=0){var N=z[E];var G=this.$screenRowCache[E];var y=A>z[B-1]}else{var y=!B}var L=this.getNextFoldLine(N);var D=L?L.start.row:Infinity;while(N=D){I=L.end.row+1;if(I>A){break}L=this.getNextFoldLine(I,L);D=L?L.start.row:Infinity}else{I=N+1}G+=this.getRowLength(N);N=I;if(y){this.$docRowCache.push(N);this.$screenRowCache.push(G)}}var x="";if(L&&N>=D){x=this.getFoldDisplayLine(L,A,C);F=L.start.row}else{x=this.getLine(A).substring(0,C);F=A}if(this.$useWrapMode){var M=this.$wrapData[F];if(M){var J=0;while(x.length>=M[J]){G++;J++}x=x.substring(M[J-1]||0,x.length)}}return{row:G,column:this.$getStringScreenWidth(x)[0]}};this.documentToScreenColumn=function(y,x){return this.documentToScreenPosition(y,x).column};this.documentToScreenRow=function(x,y){return this.documentToScreenPosition(x,y).row};this.getScreenLength=function(){var D=0;var y=null;if(!this.$useWrapMode){D=this.getLength();var A=this.$foldData;for(var z=0;zx){E=y.end.row+1;y=this.$foldData[z++];x=y?y.start.row:Infinity}}}if(this.lineWidgets){D+=this.$getWidgetScreenLength()}return D};this.$setFontMetrics=function(x){};function q(x){if(x<4352){return false}return x>=4352&&x<=4447||x>=4515&&x<=4519||x>=4602&&x<=4607||x>=9001&&x<=9002||x>=11904&&x<=11929||x>=11931&&x<=12019||x>=12032&&x<=12245||x>=12272&&x<=12283||x>=12288&&x<=12350||x>=12353&&x<=12438||x>=12441&&x<=12543||x>=12549&&x<=12589||x>=12593&&x<=12686||x>=12688&&x<=12730||x>=12736&&x<=12771||x>=12784&&x<=12830||x>=12832&&x<=12871||x>=12880&&x<=13054||x>=13056&&x<=19903||x>=19968&&x<=42124||x>=42128&&x<=42182||x>=43360&&x<=43388||x>=44032&&x<=55203||x>=55216&&x<=55238||x>=55243&&x<=55291||x>=63744&&x<=64255||x>=65040&&x<=65049||x>=65072&&x<=65106||x>=65108&&x<=65126||x>=65128&&x<=65131||x>=65281&&x<=65376||x>=65504&&x<=65510}}).call(a.prototype);g("./edit_session/folding").Folding.call(a.prototype);g("./edit_session/bracket_match").BracketMatch.call(a.prototype);e.defineOptions(a.prototype,"session",{wrap:{set:function(p){if(!p||p=="off"){p=false}else{if(p=="free"){p=true}else{if(p=="printMargin"){p=-1}else{if(typeof p=="string"){p=parseInt(p,10)||false}}}}if(this.$wrap==p){return}if(!p){this.setUseWrapMode(false)}else{var o=typeof p=="number"?p:null;this.setWrapLimitRange(o,o);this.setUseWrapMode(true)}this.$wrap=p},get:function(){if(this.getUseWrapMode()){if(this.$wrap==-1){return"printMargin"}if(!this.getWrapLimitRange().min){return"free"}return this.$wrap}return"off"},handlesSet:true},wrapMethod:{set:function(o){o=o=="auto"?this.$mode.type!="text":o!="text";if(o!=this.$wrapAsCode){this.$wrapAsCode=o;if(this.$useWrapMode){this.$modified=true;this.$resetRowCache(0);this.$updateWrapData(0,this.getLength()-1)}}},initialValue:"auto"},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(o){this.$useWorker=o;this.$stopWorker();if(o){this.$startWorker()}},initialValue:true},useSoftTabs:{initialValue:true},tabSize:{set:function(o){if(isNaN(o)||this.$tabSize===o){return}this.$modified=true;this.$rowLengthCache=[];this.$tabSize=o;this._signal("changeTabSize")},initialValue:4,handlesSet:true},overwrite:{set:function(o){this._signal("changeOverwrite")},initialValue:false},newLineMode:{set:function(o){this.doc.setNewLineMode(o)},get:function(){return this.doc.getNewLineMode()},handlesSet:true},mode:{set:function(o){this.setMode(o)},get:function(){return this.$modeId}}});i.EditSession=a});define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(b,a,c){var f=b("../lib/oop");var d=b("../keyboard/hash_handler").HashHandler;var e=b("../lib/event_emitter").EventEmitter;var g=function(i,h){d.call(this,h,i);this.byName=this.commands;this.setDefaultHandler("exec",function(j){return j.command.exec(j.editor,j.args||{})})};f.inherits(g,d);(function(){f.implement(this,e);this.exec=function(l,j,i){if(typeof l==="string"){l=this.commands[l]}if(!l){return false}if(j&&j.$readOnly&&!l.readOnly){return false}var k={editor:j,command:l,args:i};var h=this._emit("exec",k);this._signal("afterExec",k);return h===false?false:true};this.toggleRecording=function(h){if(this.$inReplay){return}h&&h._emit("changeStatus");if(this.recording){this.macro.pop();this.removeEventListener("exec",this.$addCommandToMacro);if(!this.macro.length){this.macro=this.oldMacro}return this.recording=false}if(!this.$addCommandToMacro){this.$addCommandToMacro=function(i){this.macro.push([i.command,i.args])}.bind(this)}this.oldMacro=this.macro;this.macro=[];this.on("exec",this.$addCommandToMacro);return this.recording=true};this.replay=function(h){if(this.$inReplay||!this.macro){return}if(this.recording){return this.toggleRecording(h)}try{this.$inReplay=true;this.macro.forEach(function(i){if(typeof i=="string"){this.exec(i,h)}else{this.exec(i[0],h,i[1])}},this)}finally{this.$inReplay=false}};this.trimMacro=function(h){return h.map(function(i){if(typeof i[0]!="string"){i[0]=i[0].name}if(!i[1]){i=i[0]}return i})}}).call(g.prototype);a.CommandManager=g});define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(c,a,d){var b=c("../lib/keys");var e=c("../lib/event");var f=function(g){this.$editor=g;this.$data={};this.$handlers=[];this.setDefaultHandler(g.commands)};(function(){this.setDefaultHandler=function(g){this.removeKeyboardHandler(this.$defaultHandler);this.$defaultHandler=g;this.addKeyboardHandler(g,0);this.$data={editor:this.$editor}};this.setKeyboardHandler=function(i){var g=this.$handlers;if(g[g.length-1]==i){return}while(g[g.length-1]&&g[g.length-1]!=this.$defaultHandler){this.removeKeyboardHandler(g[g.length-1])}this.addKeyboardHandler(i,1)};this.addKeyboardHandler=function(h,j){if(!h){return}if(typeof h=="function"&&!h.handleKeyboard){h.handleKeyboard=h}var g=this.$handlers.indexOf(h);if(g!=-1){this.$handlers.splice(g,1)}if(j==undefined){this.$handlers.push(h)}else{this.$handlers.splice(j,0,h)}if(g==-1&&h.attach){h.attach(this.$editor)}};this.removeKeyboardHandler=function(h){var g=this.$handlers.indexOf(h);if(g==-1){return false}this.$handlers.splice(g,1);h.detach&&h.detach(this.$editor);return true};this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]};this.$callKeyboardHandlers=function(l,h,n,m){var k;var o=false;var g=this.$editor.commands;for(var j=this.$handlers.length;j--;){k=this.$handlers[j].handleKeyboard(this.$data,l,h,n,m);if(!k||!k.command){continue}if(k.command=="null"){o=true}else{o=g.exec(k.command,this.$editor,k.args,m)}if(o&&m&&l!=-1&&k.passEvent!=true&&k.command.passEvent!=true){e.stopEvent(m)}if(o){break}}return o};this.onCommandKey=function(j,h,i){var g=b.keyCodeToString(i);this.$callKeyboardHandlers(h,g,i,j)};this.onTextInput=function(h){var g=this.$callKeyboardHandlers(-1,h);if(!g){this.$editor.commands.exec("insertstring",this.$editor,h)}}}).call(f.prototype);a.KeyBinding=f});define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(d,b,e){var c=d("../lib/keys");var a=d("../lib/useragent");function f(h,g){this.platform=g||(a.isMac?"mac":"win");this.commands={};this.commandKeyBinding={};if(this.__defineGetter__&&this.__defineSetter__&&typeof console!="undefined"&&console.error){var i=false;var j=function(){if(!i){i=true;console.error("commmandKeyBinding has too many m's. use commandKeyBinding")}};this.__defineGetter__("commmandKeyBinding",function(){j();return this.commandKeyBinding});this.__defineSetter__("commmandKeyBinding",function(k){j();return this.commandKeyBinding=k})}else{this.commmandKeyBinding=this.commandKeyBinding}this.addCommands(h)}(function(){this.addCommand=function(h){if(this.commands[h.name]){this.removeCommand(h)}this.commands[h.name]=h;if(h.bindKey){this._buildKeyHash(h)}};this.removeCommand=function(l){var h=(typeof l==="string"?l:l.name);l=this.commands[h];delete this.commands[h];var j=this.commandKeyBinding;for(var k in j){for(var i in j[k]){if(j[k][i]==l){delete j[k][i]}}}};this.bindKey=function(h,j){if(!h){return}if(typeof j=="function"){this.addCommand({exec:j,bindKey:h,name:j.name||h});return}var i=this.commandKeyBinding;h.split("|").forEach(function(k){var m=this.parseKeys(k,j);var l=m.hashId;(i[l]||(i[l]={}))[m.key]=j},this)};this.addCommands=function(h){h&&Object.keys(h).forEach(function(i){var j=h[i];if(!j){return}if(typeof j==="string"){return this.bindKey(j,i)}if(typeof j==="function"){j={exec:j}}if(typeof j!=="object"){return}if(!j.name){j.name=i}this.addCommand(j)},this)};this.removeCommands=function(h){Object.keys(h).forEach(function(i){this.removeCommand(h[i])},this)};this.bindKeys=function(h){Object.keys(h).forEach(function(i){this.bindKey(i,h[i])},this)};this._buildKeyHash=function(j){var i=j.bindKey;if(!i){return}var h=typeof i=="string"?i:i[this.platform];this.bindKey(h,j)};this.parseKeys=function(m){if(m.indexOf(" ")!=-1){m=m.split(/\s+/).pop()}var o=m.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(i){return i});var k=o.pop();var n=c[k];if(c.FUNCTION_KEYS[n]){k=c.FUNCTION_KEYS[n].toLowerCase()}else{if(!o.length){return{key:k,hashId:-1}}else{if(o.length==1&&o[0]=="shift"){return{key:k.toUpperCase(),hashId:-1}}}}var l=0;for(var j=o.length;j--;){var h=c.KEY_MODS[o[j]];if(h==null){if(typeof console!="undefined"){console.error("invalid modifier "+o[j]+" in "+m)}return false}l|=h}return{key:k,hashId:l}};this.findKeyCommand=function g(j,h){var i=this.commandKeyBinding;return i[j]&&i[j][h]};this.handleKeyboard=function(j,i,h,k){return{command:this.findKeyCommand(i,h)}}}).call(f.prototype);b.HashHandler=f});define("ace/mouse/fold_handler",["require","exports","module"],function(b,a,c){function d(e){e.on("click",function(i){var f=i.getDocumentPosition();var h=e.session;var g=h.getFoldAt(f.row,f.column,1);if(g){if(i.getAccelKey()){h.removeFold(g)}else{h.expandFold(g)}i.stop()}});e.on("gutterclick",function(g){var i=e.renderer.$gutterLayer.getRegion(g);if(i=="foldWidgets"){var h=g.getDocumentPosition().row;var f=e.session;if(f.foldWidgets&&f.foldWidgets[h]){e.session.onFoldWidgetClick(h,g)}if(!e.isFocused()){e.focus()}g.stop()}});e.on("gutterdblclick",function(j){var l=e.renderer.$gutterLayer.getRegion(j);if(l=="foldWidgets"){var k=j.getDocumentPosition().row;var i=e.session;var h=i.getParentFoldRangeData(k,true);var f=h.range||h.firstRange;if(f){k=f.start.row;var g=i.getFoldAt(k,i.getLine(k).length,1);if(g){i.removeFold(g)}else{i.addFold("...",f);e.renderer.scrollCursorIntoView({row:f.start.row,column:0})}}j.stop()}})}a.FoldHandler=d});define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config"],function(c,a,d){var f=c("../lib/lang");var b=c("../config");function e(g,h){return{win:g,mac:h}}a.commands=[{name:"showSettingsMenu",bindKey:e("Ctrl-,","Command-,"),exec:function(g){b.loadModule("ace/ext/settings_menu",function(h){h.init(g);g.showSettingsMenu()})},readOnly:true},{name:"goToNextError",bindKey:e("Alt-E","Ctrl-E"),exec:function(g){b.loadModule("ace/ext/error_marker",function(h){h.showErrorMarker(g,1)})},scrollIntoView:"animate",readOnly:true},{name:"goToPreviousError",bindKey:e("Alt-Shift-E","Ctrl-Shift-E"),exec:function(g){b.loadModule("ace/ext/error_marker",function(h){h.showErrorMarker(g,-1)})},scrollIntoView:"animate",readOnly:true},{name:"selectall",bindKey:e("Ctrl-A","Command-A"),exec:function(g){g.selectAll()},readOnly:true},{name:"centerselection",bindKey:e(null,"Ctrl-L"),exec:function(g){g.centerSelection()},readOnly:true},{name:"gotoline",bindKey:e("Ctrl-L","Command-L"),exec:function(h){var g=parseInt(prompt("Enter line number:"),10);if(!isNaN(g)){h.gotoLine(g)}},readOnly:true},{name:"fold",bindKey:e("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(g){g.session.toggleFold(false)},scrollIntoView:"center",readOnly:true},{name:"unfold",bindKey:e("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(g){g.session.toggleFold(true)},scrollIntoView:"center",readOnly:true},{name:"toggleFoldWidget",bindKey:e("F2","F2"),exec:function(g){g.session.toggleFoldWidget()},scrollIntoView:"center",readOnly:true},{name:"toggleParentFoldWidget",bindKey:e("Alt-F2","Alt-F2"),exec:function(g){g.session.toggleFoldWidget(true)},scrollIntoView:"center",readOnly:true},{name:"foldall",bindKey:e("Ctrl-Alt-0","Ctrl-Command-Option-0"),exec:function(g){g.session.foldAll()},scrollIntoView:"center",readOnly:true},{name:"foldOther",bindKey:e("Alt-0","Command-Option-0"),exec:function(g){g.session.foldAll();g.session.unfold(g.selection.getAllRanges())},scrollIntoView:"center",readOnly:true},{name:"unfoldall",bindKey:e("Alt-Shift-0","Command-Option-Shift-0"),exec:function(g){g.session.unfold()},scrollIntoView:"center",readOnly:true},{name:"findnext",bindKey:e("Ctrl-K","Command-G"),exec:function(g){g.findNext()},readOnly:true},{name:"findprevious",bindKey:e("Ctrl-Shift-K","Command-Shift-G"),exec:function(g){g.findPrevious()},readOnly:true},{name:"selectOrFindNext",bindKey:e("ALt-K","Ctrl-G"),exec:function(g){if(g.selection.isEmpty()){g.selection.selectWord()}else{g.findNext()}},readOnly:true},{name:"selectOrFindPrevious",bindKey:e("Alt-Shift-K","Ctrl-Shift-G"),exec:function(g){if(g.selection.isEmpty()){g.selection.selectWord()}else{g.findPrevious()}},readOnly:true},{name:"find",bindKey:e("Ctrl-F","Command-F"),exec:function(g){b.loadModule("ace/ext/searchbox",function(h){h.Search(g)})},readOnly:true},{name:"overwrite",bindKey:"Insert",exec:function(g){g.toggleOverwrite()},readOnly:true},{name:"selecttostart",bindKey:e("Ctrl-Shift-Home","Command-Shift-Up"),exec:function(g){g.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:true,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:e("Ctrl-Home","Command-Home|Command-Up"),exec:function(g){g.navigateFileStart()},multiSelectAction:"forEach",readOnly:true,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:e("Shift-Up","Shift-Up"),exec:function(g){g.getSelection().selectUp()},multiSelectAction:"forEach",readOnly:true},{name:"golineup",bindKey:e("Up","Up|Ctrl-P"),exec:function(h,g){h.navigateUp(g.times)},multiSelectAction:"forEach",readOnly:true},{name:"selecttoend",bindKey:e("Ctrl-Shift-End","Command-Shift-Down"),exec:function(g){g.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:true,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:e("Ctrl-End","Command-End|Command-Down"),exec:function(g){g.navigateFileEnd()},multiSelectAction:"forEach",readOnly:true,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:e("Shift-Down","Shift-Down"),exec:function(g){g.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"golinedown",bindKey:e("Down","Down|Ctrl-N"),exec:function(h,g){h.navigateDown(g.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selectwordleft",bindKey:e("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(g){g.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"gotowordleft",bindKey:e("Ctrl-Left","Option-Left"),exec:function(g){g.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selecttolinestart",bindKey:e("Alt-Shift-Left","Command-Shift-Left"),exec:function(g){g.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"gotolinestart",bindKey:e("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(g){g.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selectleft",bindKey:e("Shift-Left","Shift-Left"),exec:function(g){g.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"gotoleft",bindKey:e("Left","Left|Ctrl-B"),exec:function(h,g){h.navigateLeft(g.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selectwordright",bindKey:e("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(g){g.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"gotowordright",bindKey:e("Ctrl-Right","Option-Right"),exec:function(g){g.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selecttolineend",bindKey:e("Alt-Shift-Right","Command-Shift-Right"),exec:function(g){g.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"gotolineend",bindKey:e("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(g){g.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selectright",bindKey:e("Shift-Right","Shift-Right"),exec:function(g){g.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"gotoright",bindKey:e("Right","Right|Ctrl-F"),exec:function(h,g){h.navigateRight(g.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(g){g.selectPageDown()},readOnly:true},{name:"pagedown",bindKey:e(null,"Option-PageDown"),exec:function(g){g.scrollPageDown()},readOnly:true},{name:"gotopagedown",bindKey:e("PageDown","PageDown|Ctrl-V"),exec:function(g){g.gotoPageDown()},readOnly:true},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(g){g.selectPageUp()},readOnly:true},{name:"pageup",bindKey:e(null,"Option-PageUp"),exec:function(g){g.scrollPageUp()},readOnly:true},{name:"gotopageup",bindKey:"PageUp",exec:function(g){g.gotoPageUp()},readOnly:true},{name:"scrollup",bindKey:e("Ctrl-Up",null),exec:function(g){g.renderer.scrollBy(0,-2*g.renderer.layerConfig.lineHeight)},readOnly:true},{name:"scrolldown",bindKey:e("Ctrl-Down",null),exec:function(g){g.renderer.scrollBy(0,2*g.renderer.layerConfig.lineHeight)},readOnly:true},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(g){g.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"selectlineend",bindKey:"Shift-End",exec:function(g){g.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:true},{name:"togglerecording",bindKey:e("Ctrl-Alt-E","Command-Option-E"),exec:function(g){g.commands.toggleRecording(g)},readOnly:true},{name:"replaymacro",bindKey:e("Ctrl-Shift-E","Command-Shift-E"),exec:function(g){g.commands.replay(g)},readOnly:true},{name:"jumptomatching",bindKey:e("Ctrl-P","Ctrl-Shift-P"),exec:function(g){g.jumpToMatching()},multiSelectAction:"forEach",readOnly:true},{name:"selecttomatching",bindKey:e("Ctrl-Shift-P",null),exec:function(g){g.jumpToMatching(true)},multiSelectAction:"forEach",readOnly:true},{name:"cut",exec:function(h){var g=h.getSelectionRange();h._emit("cut",g);if(!h.selection.isEmpty()){h.session.remove(g);h.clearSelection()}},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"removeline",bindKey:e("Ctrl-D","Command-D"),exec:function(g){g.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:e("Ctrl-Shift-D","Command-Shift-D"),exec:function(g){g.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:e("Ctrl-Alt-S","Command-Alt-S"),exec:function(g){g.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:e("Ctrl-/","Command-/"),exec:function(g){g.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:e("Ctrl-Shift-/","Command-Shift-/"),exec:function(g){g.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:e("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(g){g.modifyNumber(1)},multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:e("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(g){g.modifyNumber(-1)},multiSelectAction:"forEach"},{name:"replace",bindKey:e("Ctrl-H","Command-Option-F"),exec:function(g){b.loadModule("ace/ext/searchbox",function(h){h.Search(g,true)})}},{name:"undo",bindKey:e("Ctrl-Z","Command-Z"),exec:function(g){g.undo()}},{name:"redo",bindKey:e("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(g){g.redo()}},{name:"copylinesup",bindKey:e("Alt-Shift-Up","Command-Option-Up"),exec:function(g){g.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:e("Alt-Up","Option-Up"),exec:function(g){g.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:e("Alt-Shift-Down","Command-Option-Down"),exec:function(g){g.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:e("Alt-Down","Option-Down"),exec:function(g){g.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:e("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(g){g.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:e("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(g){g.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:e("Shift-Delete",null),exec:function(g){if(g.selection.isEmpty()){g.remove("left")}else{return false}},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:e("Alt-Backspace","Command-Backspace"),exec:function(g){g.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:e("Alt-Delete","Ctrl-K"),exec:function(g){g.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:e("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(g){g.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:e("Ctrl-Delete","Alt-Delete"),exec:function(g){g.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:e("Shift-Tab","Shift-Tab"),exec:function(g){g.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:e("Tab","Tab"),exec:function(g){g.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:e("Ctrl-[","Ctrl-["),exec:function(g){g.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:e("Ctrl-]","Ctrl-]"),exec:function(g){g.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(g,h){g.insert(h)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(h,g){h.insert(f.stringRepeat(g.text||"",g.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:e(null,"Ctrl-O"),exec:function(g){g.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:e("Ctrl-T","Ctrl-T"),exec:function(g){g.transposeLetters()},multiSelectAction:function(g){g.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:e("Ctrl-U","Ctrl-U"),exec:function(g){g.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:e("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(g){g.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"}]});define("ace/lib/event_emitter",["require","exports","module"],function(d,b,e){var f={};var a=function(){this.propagationStopped=true};var c=function(){this.defaultPrevented=true};f._emit=f._dispatchEvent=function(g,l){this._eventRegistry||(this._eventRegistry={});this._defaultHandlers||(this._defaultHandlers={});var k=this._eventRegistry[g]||[];var h=this._defaultHandlers[g];if(!k.length&&!h){return}if(typeof l!="object"||!l){l={}}if(!l.type){l.type=g}if(!l.stopPropagation){l.stopPropagation=a}if(!l.preventDefault){l.preventDefault=c}k=k.slice();for(var j=0;j0};this.hasRedo=function(){return this.$redoStack.length>0};this.markClean=function(){this.dirtyCounter=0};this.isClean=function(){return this.dirtyCounter===0}}).call(d.prototype);a.UndoManager=d});define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(b,a,c){var d=b("./dom");a.get=function(e,g){var f=new XMLHttpRequest();f.open("GET",e,true);f.onreadystatechange=function(){if(f.readyState===4){g(f.responseText)}};f.send(null)};a.loadScript=function(g,h){var e=d.getDocumentHead();var f=document.createElement("script");f.src=g;e.appendChild(f);f.onload=f.onreadystatechange=function(j,i){if(i||!f.readyState||f.readyState=="loaded"||f.readyState=="complete"){f=f.onload=f.onreadystatechange=null;if(!i){h()}}}}});define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(e,g,b){var k=e("./lib/oop");var f=e("./lib/dom");var d=e("./config");var p=e("./layer/gutter").Gutter;var n=e("./layer/marker").Marker;var c=e("./layer/text").Text;var o=e("./layer/cursor").Cursor;var l=e("./scrollbar").HScrollBar;var i=e("./scrollbar").VScrollBar;var m=e("./renderloop").RenderLoop;var h=e("./layer/font_metrics").FontMetrics;var q=e("./lib/event_emitter").EventEmitter;var j='.ace_editor {position: relative;overflow: hidden;font-family: \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;font-size: 12px;line-height: normal;direction: ltr;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: text;min-width: 100%;}.ace_dragging, .ace_dragging * {cursor: move !important;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;}.ace_text-input.ace_composition {background: #f8f8f8;color: #111;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;/* setting pointer-events: auto; on node under the mouse, which changesduring scroll, will break mouse wheel scrolling in Safari */pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0px;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-moz-transition: opacity 0.18s;-webkit-transition: opacity 0.18s;-o-transition: opacity 0.18s;-ms-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;-moz-border-radius: 2px;-webkit-border-radius: 2px;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;display: block;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}/*** Dark version for fold widgets*/.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-moz-transition: opacity 0.4s ease 0.05s;-webkit-transition: opacity 0.4s ease 0.05s;-o-transition: opacity 0.4s ease 0.05s;-ms-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-moz-transition: opacity 0.05s ease 0.05s;-webkit-transition: opacity 0.05s ease 0.05s;-o-transition: opacity 0.05s ease 0.05s;-ms-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}';f.importCssString(j,"ace_editor");var a=function(s,u){var r=this;this.container=s||f.createElement("div");this.$keepTextAreaAtCursor=true;f.addCssClass(this.container,"ace_editor");this.setTheme(u);this.$gutter=f.createElement("div");this.$gutter.className="ace_gutter";this.container.appendChild(this.$gutter);this.scroller=f.createElement("div");this.scroller.className="ace_scroller";this.container.appendChild(this.scroller);this.content=f.createElement("div");this.content.className="ace_content";this.scroller.appendChild(this.content);this.$gutterLayer=new p(this.$gutter);this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this));this.$markerBack=new n(this.content);var t=this.$textLayer=new c(this.content);this.canvas=t.element;this.$markerFront=new n(this.content);this.$cursorLayer=new o(this.content);this.$horizScroll=false;this.$vScroll=false;this.scrollBar=this.scrollBarV=new i(this.container,this);this.scrollBarH=new l(this.container,this);this.scrollBarV.addEventListener("scroll",function(v){if(!r.$scrollAnimation){r.session.setScrollTop(v.data-r.scrollMargin.top)}});this.scrollBarH.addEventListener("scroll",function(v){if(!r.$scrollAnimation){r.session.setScrollLeft(v.data-r.scrollMargin.left)}});this.scrollTop=0;this.scrollLeft=0;this.cursorPos={row:0,column:0};this.$fontMetrics=new h(this.container,500);this.$textLayer.$setFontMetrics(this.$fontMetrics);this.$textLayer.addEventListener("changeCharacterSize",function(v){r.updateCharacterSize();r.onResize(true,r.gutterWidth,r.$size.width,r.$size.height);r._signal("changeCharacterSize",v)});this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:true};this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1};this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0};this.$loop=new m(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView);this.$loop.schedule(this.CHANGE_FULL);this.updateCharacterSize();this.setPadding(4);d.resetOptions(this);d._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1;this.CHANGE_MARKER=2;this.CHANGE_GUTTER=4;this.CHANGE_SCROLL=8;this.CHANGE_LINES=16;this.CHANGE_TEXT=32;this.CHANGE_SIZE=64;this.CHANGE_MARKER_BACK=128;this.CHANGE_MARKER_FRONT=256;this.CHANGE_FULL=512;this.CHANGE_H_SCROLL=1024;k.implement(this,q);this.updateCharacterSize=function(){if(this.$textLayer.allowBoldFonts!=this.$allowBoldFonts){this.$allowBoldFonts=this.$textLayer.allowBoldFonts;this.setStyle("ace_nobold",!this.$allowBoldFonts)}this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth();this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight();this.$updatePrintMargin()};this.setSession=function(r){if(this.session){this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode)}this.session=r;if(!r){return}if(this.scrollMargin.top&&r.getScrollTop()<=0){r.setScrollTop(-this.scrollMargin.top)}this.$cursorLayer.setSession(r);this.$markerBack.setSession(r);this.$markerFront.setSession(r);this.$gutterLayer.setSession(r);this.$textLayer.setSession(r);this.$loop.schedule(this.CHANGE_FULL);this.session.$setFontMetrics(this.$fontMetrics);this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this);this.onChangeNewLineMode();this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)};this.updateLines=function(s,r){if(r===undefined){r=Infinity}if(!this.$changedLines){this.$changedLines={firstRow:s,lastRow:r}}else{if(this.$changedLines.firstRow>s){this.$changedLines.firstRow=s}if(this.$changedLines.lastRowthis.layerConfig.lastRow||this.$changedLines.lastRow2){return}else{if(this.resizing>0){this.resizing++}else{this.resizing=w?1:0}}var u=this.container;if(!r){r=u.clientHeight||u.scrollHeight}if(!v){v=u.clientWidth||u.scrollWidth}var t=this.$updateCachedSize(w,s,v,r);if(!this.$size.scrollerHeight||(!v&&!r)){return this.resizing=0}if(w){this.$gutterLayer.$padding=null}if(w){this.$renderChanges(t|this.$changes,true)}else{this.$loop.schedule(t|this.$changes)}if(this.resizing){this.resizing=0}};this.$updateCachedSize=function(x,t,v,r){r-=(this.$extraHeight||0);var u=0;var s=this.$size;var w={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};if(r&&(x||s.height!=r)){s.height=r;u|=this.CHANGE_SIZE;s.scrollerHeight=s.height;if(this.$horizScroll){s.scrollerHeight-=this.scrollBarH.getHeight()}this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px";u=u|this.CHANGE_SCROLL}if(v&&(x||s.width!=v)){u|=this.CHANGE_SIZE;s.width=v;if(t==null){t=this.$showGutter?this.$gutter.offsetWidth:0}this.gutterWidth=t;this.scrollBarH.element.style.left=this.scroller.style.left=t+"px";s.scrollerWidth=Math.max(0,v-t-this.scrollBarV.getWidth());this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px";this.scroller.style.bottom=this.scrollBarH.getHeight()+"px";if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||x){u|=this.CHANGE_FULL}}s.$dirty=!v||!r;if(u){this._signal("resize",w)}return u};this.onGutterResize=function(){var r=this.$showGutter?this.$gutter.offsetWidth:0;if(r!=this.gutterWidth){this.$changes|=this.$updateCachedSize(true,r,this.$size.width,this.$size.height)}if(this.session.getUseWrapMode()&&this.adjustWrapLimit()){this.$loop.schedule(this.CHANGE_FULL)}else{if(this.$size.$dirty){this.$loop.schedule(this.CHANGE_FULL)}else{this.$computeLayerConfig();this.$loop.schedule(this.CHANGE_MARKER)}}};this.adjustWrapLimit=function(){var s=this.$size.scrollerWidth-this.$padding*2;var r=Math.floor(s/this.characterWidth);return this.session.adjustWrapLimit(r,this.$showPrintMargin&&this.$printMarginColumn)};this.setAnimatedScroll=function(r){this.setOption("animatedScroll",r)};this.getAnimatedScroll=function(){return this.$animatedScroll};this.setShowInvisibles=function(r){this.setOption("showInvisibles",r)};this.getShowInvisibles=function(){return this.getOption("showInvisibles")};this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")};this.setDisplayIndentGuides=function(r){this.setOption("displayIndentGuides",r)};this.setShowPrintMargin=function(r){this.setOption("showPrintMargin",r)};this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")};this.setPrintMarginColumn=function(r){this.setOption("printMarginColumn",r)};this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")};this.getShowGutter=function(){return this.getOption("showGutter")};this.setShowGutter=function(r){return this.setOption("showGutter",r)};this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")};this.setFadeFoldWidgets=function(r){this.setOption("fadeFoldWidgets",r)};this.setHighlightGutterLine=function(r){this.setOption("highlightGutterLine",r)};this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")};this.$updateGutterLineHighlight=function(){var t=this.$cursorLayer.$pixelPos;var r=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var s=this.session.selection.getCursor();s.column=0;t=this.$cursorLayer.getPixelPosition(s,true);r*=this.session.getRowLength(s.row)}this.$gutterLineHighlight.style.top=t.top-this.layerConfig.offset+"px";this.$gutterLineHighlight.style.height=r+"px"};this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl){return}if(!this.$printMarginEl){var s=f.createElement("div");s.className="ace_layer ace_print-margin-layer";this.$printMarginEl=f.createElement("div");this.$printMarginEl.className="ace_print-margin";s.appendChild(this.$printMarginEl);this.content.insertBefore(s,this.content.firstChild)}var r=this.$printMarginEl.style;r.left=((this.characterWidth*this.$printMarginColumn)+this.$padding)+"px";r.visibility=this.$showPrintMargin?"visible":"hidden";if(this.session&&this.session.$wrap==-1){this.adjustWrapLimit()}};this.getContainerElement=function(){return this.container};this.getMouseEventTarget=function(){return this.content};this.getTextAreaContainer=function(){return this.container};this.$moveTextAreaToCursor=function(){if(!this.$keepTextAreaAtCursor){return}var t=this.layerConfig;var v=this.$cursorLayer.$pixelPos.top;var r=this.$cursorLayer.$pixelPos.left;v-=t.offset;var u=this.lineHeight;if(v<0||v>t.height-u){return}var s=this.characterWidth;if(this.$composition){var x=this.textarea.value.replace(/^\x01+/,"");s*=(this.session.$getStringScreenWidth(x)[0]+2);u+=2;v-=1}r-=this.scrollLeft;if(r>this.$size.scrollerWidth-s){r=this.$size.scrollerWidth-s}r-=this.scrollBar.width;this.textarea.style.height=u+"px";this.textarea.style.width=s+"px";this.textarea.style.right=Math.max(0,this.$size.scrollerWidth-r-s)+"px";this.textarea.style.bottom=Math.max(0,this.$size.height-v-u)+"px"};this.getFirstVisibleRow=function(){return this.layerConfig.firstRow};this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)};this.getLastFullyVisibleRow=function(){var r=Math.floor((this.layerConfig.height+this.layerConfig.offset)/this.layerConfig.lineHeight);return this.layerConfig.firstRow-1+r};this.getLastVisibleRow=function(){return this.layerConfig.lastRow};this.$padding=null;this.setPadding=function(r){this.$padding=r;this.$textLayer.setPadding(r);this.$cursorLayer.setPadding(r);this.$markerFront.setPadding(r);this.$markerBack.setPadding(r);this.$loop.schedule(this.CHANGE_FULL);this.$updatePrintMargin()};this.setScrollMargin=function(u,r,t,s){var v=this.scrollMargin;v.top=u|0;v.bottom=r|0;v.right=s|0;v.left=t|0;v.v=v.top+v.bottom;v.h=v.left+v.right;if(v.top&&this.scrollTop<=0&&this.session){this.session.setScrollTop(-v.top)}this.updateFull()};this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible};this.setHScrollBarAlwaysVisible=function(r){this.setOption("hScrollBarAlwaysVisible",r)};this.getVScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible};this.setVScrollBarAlwaysVisible=function(r){this.setOption("vScrollBarAlwaysVisible",r)};this.$updateScrollBarV=function(){this.scrollBarV.setScrollHeight(this.layerConfig.maxHeight+this.scrollMargin.v);this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)};this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h);this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)};this.$frozen=false;this.freeze=function(){this.$frozen=true};this.unfreeze=function(){this.$frozen=false};this.$renderChanges=function(s,t){if(this.$changes){s|=this.$changes;this.$changes=0}if((!this.session||!this.container.offsetWidth||this.$frozen)||(!s&&!t)){this.$changes|=s;return}if(this.$size.$dirty){this.$changes|=s;return this.onResize(true)}if(!this.lineHeight){this.$textLayer.checkForSizeChanges()}this._signal("beforeRender");var r=this.layerConfig;if(s&this.CHANGE_FULL||s&this.CHANGE_SIZE||s&this.CHANGE_TEXT||s&this.CHANGE_LINES||s&this.CHANGE_SCROLL||s&this.CHANGE_H_SCROLL){s|=this.$computeLayerConfig();r=this.layerConfig;this.$updateScrollBarV();if(s&this.CHANGE_H_SCROLL){this.$updateScrollBarH()}this.$gutterLayer.element.style.marginTop=(-r.offset)+"px";this.content.style.marginTop=(-r.offset)+"px";this.content.style.width=r.width+2*this.$padding+"px";this.content.style.height=r.minHeight+"px"}if(s&this.CHANGE_H_SCROLL){this.content.style.marginLeft=-this.scrollLeft+"px";this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left"}if(s&this.CHANGE_FULL){this.$textLayer.update(r);if(this.$showGutter){this.$gutterLayer.update(r)}this.$markerBack.update(r);this.$markerFront.update(r);this.$cursorLayer.update(r);this.$moveTextAreaToCursor();this.$highlightGutterLine&&this.$updateGutterLineHighlight();this._signal("afterRender");return}if(s&this.CHANGE_SCROLL){if(s&this.CHANGE_TEXT||s&this.CHANGE_LINES){this.$textLayer.update(r)}else{this.$textLayer.scrollLines(r)}if(this.$showGutter){this.$gutterLayer.update(r)}this.$markerBack.update(r);this.$markerFront.update(r);this.$cursorLayer.update(r);this.$highlightGutterLine&&this.$updateGutterLineHighlight();this.$moveTextAreaToCursor();this._signal("afterRender");return}if(s&this.CHANGE_TEXT){this.$textLayer.update(r);if(this.$showGutter){this.$gutterLayer.update(r)}}else{if(s&this.CHANGE_LINES){if(this.$updateLines()||(s&this.CHANGE_GUTTER)&&this.$showGutter){this.$gutterLayer.update(r)}}else{if(s&this.CHANGE_TEXT||s&this.CHANGE_GUTTER){if(this.$showGutter){this.$gutterLayer.update(r)}}}}if(s&this.CHANGE_CURSOR){this.$cursorLayer.update(r);this.$moveTextAreaToCursor();this.$highlightGutterLine&&this.$updateGutterLineHighlight()}if(s&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)){this.$markerFront.update(r)}if(s&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)){this.$markerBack.update(r)}this._signal("afterRender")};this.$autosize=function(){var r=this.session.getScreenLength()*this.lineHeight;var v=this.$maxLines*this.lineHeight;var u=Math.max((this.$minLines||1)*this.lineHeight,Math.min(v,r))+this.scrollMargin.v+(this.$extraHeight||0);var t=r>v;if(u!=this.desiredHeight||this.$size.height!=this.desiredHeight||t!=this.$vScroll){if(t!=this.$vScroll){this.$vScroll=t;this.scrollBarV.setVisible(t)}var s=this.container.clientWidth;this.container.style.height=u+"px";this.$updateCachedSize(true,this.$gutterWidth,s,u);this.desiredHeight=u}};this.$computeLayerConfig=function(){if(this.$maxLines&&this.lineHeight>1){this.$autosize()}var s=this.session;var B=this.$size;var G=B.height<=2*this.lineHeight;var t=this.session.getScreenLength();var D=t*this.lineHeight;var v=this.scrollTop%this.lineHeight;var x=B.scrollerHeight+this.lineHeight;var I=this.$getLongestLine();var w=!G&&(this.$hScrollBarAlwaysVisible||B.scrollerWidth-I-2*this.$padding<0);var J=this.$horizScroll!==w;if(J){this.$horizScroll=w;this.scrollBarH.setVisible(w)}if(!this.$maxLines&&this.$scrollPastEnd){if(this.scrollTop>D-B.scrollerHeight){D+=Math.min((B.scrollerHeight-this.lineHeight)*this.$scrollPastEnd,this.scrollTop-D+B.scrollerHeight)}}var y=!G&&(this.$vScrollBarAlwaysVisible||B.scrollerHeight-D<0);var z=this.$vScroll!==y;if(z){this.$vScroll=y;this.scrollBarV.setVisible(y)}this.session.setScrollTop(Math.max(-this.scrollMargin.top,Math.min(this.scrollTop,D-B.scrollerHeight+this.scrollMargin.bottom)));this.session.setScrollLeft(Math.max(-this.scrollMargin.left,Math.min(this.scrollLeft,I+2*this.$padding-B.scrollerWidth+this.scrollMargin.right)));var E=Math.ceil(x/this.lineHeight)-1;var r=Math.max(0,Math.round((this.scrollTop-v)/this.lineHeight));var F=r+E;var A,C;var u=this.lineHeight;r=s.screenToDocumentRow(r,0);var H=s.getFoldLine(r);if(H){r=H.start.row}A=s.documentToScreenRow(r,0);C=s.getRowLength(r)*u;F=Math.min(s.screenToDocumentRow(F,0),s.getLength()-1);x=B.scrollerHeight+s.getRowLength(F)*u+C;v=this.scrollTop-A*u;var K=0;if(this.layerConfig.width!=I){K=this.CHANGE_H_SCROLL}if(J||z){K=this.$updateCachedSize(true,this.gutterWidth,B.width,B.height);this._signal("scrollbarVisibilityChanged");if(z){I=this.$getLongestLine()}}this.layerConfig={width:I,padding:this.$padding,firstRow:r,firstRowScreen:A,lastRow:F,lineHeight:u,characterWidth:this.characterWidth,minHeight:x,maxHeight:D,offset:v,gutterOffset:Math.max(0,Math.ceil((v+B.height-B.scrollerHeight)/u)),height:this.$size.scrollerHeight};return K};this.$updateLines=function(){var t=this.$changedLines.firstRow;var s=this.$changedLines.lastRow;this.$changedLines=null;var r=this.layerConfig;if(t>r.lastRow+1){return}if(sz){if(w){z-=w*this.$size.scrollerHeight}if(z===0){z=-this.scrollMargin.top}this.session.setScrollTop(z)}else{if(s+this.$size.scrollerHeight-rt){if(t=1-this.scrollMargin.top){return true}if(r>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight-(this.$size.scrollerHeight-this.lineHeight)*this.$scrollPastEnd<-1+this.scrollMargin.bottom){return true}if(s<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left){return true}if(s>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right){return true}};this.pixelToScreenCoordinates=function(r,w){var t=this.scroller.getBoundingClientRect();var v=(r+this.scrollLeft-t.left-this.$padding)/this.characterWidth;var u=Math.floor((w+this.scrollTop-t.top)/this.lineHeight);var s=Math.round(v);return{row:u,column:s,side:v-s>0?1:-1}};this.screenToTextCoordinates=function(r,v){var t=this.scroller.getBoundingClientRect();var s=Math.round((r+this.scrollLeft-t.left-this.$padding)/this.characterWidth);var u=(v+this.scrollTop-t.top)/this.lineHeight;return this.session.screenToDocumentPosition(u,Math.max(s,0))};this.textToScreenCoordinates=function(u,t){var s=this.scroller.getBoundingClientRect();var w=this.session.documentToScreenPosition(u,t);var r=this.$padding+Math.round(w.column*this.characterWidth);var v=w.row*this.lineHeight;return{pageX:s.left+r-this.scrollLeft,pageY:s.top+v-this.scrollTop}};this.visualizeFocus=function(){f.addCssClass(this.container,"ace_focus")};this.visualizeBlur=function(){f.removeCssClass(this.container,"ace_focus")};this.showComposition=function(r){if(!this.$composition){this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}}this.$keepTextAreaAtCursor=true;f.addCssClass(this.textarea,"ace_composition");this.textarea.style.cssText="";this.$moveTextAreaToCursor()};this.setCompositionText=function(r){this.$moveTextAreaToCursor()};this.hideComposition=function(){if(!this.$composition){return}f.removeCssClass(this.textarea,"ace_composition");this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor;this.textarea.style.cssText=this.$composition.cssText;this.$composition=null};this.setTheme=function(u,s){var r=this;this.$themeId=u;r._dispatchEvent("themeChange",{theme:u});if(!u||typeof u=="string"){var t=u||this.$options.theme.initialValue;d.loadModule(["theme",t],v)}else{v(u)}function v(w){if(r.$themeId!=u){return s&&s()}if(!w.cssClass){return}f.importCssString(w.cssText,w.cssClass,r.container.ownerDocument);if(r.theme){f.removeCssClass(r.container,r.theme.cssClass)}var x="padding" in w?w.padding:"padding" in (r.theme||{})?4:r.$padding;if(r.$padding&&x!=r.$padding){r.setPadding(x)}r.$theme=w.cssClass;r.theme=w;f.addCssClass(r.container,w.cssClass);f.setCssClass(r.container,"ace_dark",w.isDark);if(r.$size){r.$size.width=0;r.$updateSizeAsync()}r._dispatchEvent("themeLoaded",{theme:w});s&&s()}};this.getTheme=function(){return this.$themeId};this.setStyle=function(s,r){f.setCssClass(this.container,s,r!==false)};this.unsetStyle=function(r){f.removeCssClass(this.container,r)};this.setCursorStyle=function(r){if(this.content.style.cursor!=r){this.content.style.cursor=r}};this.setMouseCursor=function(r){this.content.style.cursor=r};this.destroy=function(){this.$textLayer.destroy();this.$cursorLayer.destroy()}}).call(a.prototype);d.defineOptions(a.prototype,"renderer",{animatedScroll:{initialValue:false},showInvisibles:{set:function(r){if(this.$textLayer.setShowInvisibles(r)){this.$loop.schedule(this.CHANGE_TEXT)}},initialValue:false},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:true},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(r){if(typeof r=="number"){this.$printMarginColumn=r}this.$showPrintMargin=!!r;this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(r){this.$gutter.style.display=r?"block":"none";this.$loop.schedule(this.CHANGE_FULL);this.onGutterResize()},initialValue:true},fadeFoldWidgets:{set:function(r){f.setCssClass(this.$gutter,"ace_fade-fold-widgets",r)},initialValue:false},showFoldWidgets:{set:function(r){this.$gutterLayer.setShowFoldWidgets(r)},initialValue:true},showLineNumbers:{set:function(r){this.$gutterLayer.setShowLineNumbers(r);this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:true},displayIndentGuides:{set:function(r){if(this.$textLayer.setDisplayIndentGuides(r)){this.$loop.schedule(this.CHANGE_TEXT)}},initialValue:true},highlightGutterLine:{set:function(r){if(!this.$gutterLineHighlight){this.$gutterLineHighlight=f.createElement("div");this.$gutterLineHighlight.className="ace_gutter-active-line";this.$gutter.appendChild(this.$gutterLineHighlight);return}this.$gutterLineHighlight.style.display=r?"":"none";if(this.$cursorLayer.$pixelPos){this.$updateGutterLineHighlight()}},initialValue:false,value:true},hScrollBarAlwaysVisible:{set:function(r){if(!this.$hScrollBarAlwaysVisible||!this.$horizScroll){this.$loop.schedule(this.CHANGE_SCROLL)}},initialValue:false},vScrollBarAlwaysVisible:{set:function(r){if(!this.$vScrollBarAlwaysVisible||!this.$vScroll){this.$loop.schedule(this.CHANGE_SCROLL)}},initialValue:false},fontSize:{set:function(r){if(typeof r=="number"){r=r+"px"}this.container.style.fontSize=r;this.updateFontSize()},initialValue:12},fontFamily:{set:function(r){this.container.style.fontFamily=r;this.updateFontSize()}},maxLines:{set:function(r){this.updateFull()}},minLines:{set:function(r){this.updateFull()}},scrollPastEnd:{set:function(r){r=+r||0;if(this.$scrollPastEnd==r){return}this.$scrollPastEnd=r;this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:0,handlesSet:true},fixedWidthGutter:{set:function(r){this.$gutterLayer.$fixedWidth=!!r;this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(r){this.setTheme(r)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:true}});g.VirtualRenderer=a});define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/lib/net","ace/lib/event_emitter"],function(e,h,d){var c=e("./lib/lang");var i=e("./lib/oop");var j=e("./lib/net");var m=e("./lib/event_emitter").EventEmitter;var b=(function(){return this})();var l={packaged:false,workerPath:null,modePath:null,themePath:null,basePath:"",suffix:".js",$moduleUrls:{}};h.get=function(n){if(!l.hasOwnProperty(n)){throw new Error("Unknown config key: "+n)}return l[n]};h.set=function(n,o){if(!l.hasOwnProperty(n)){throw new Error("Unknown config key: "+n)}l[n]=o};h.all=function(){return c.copyObject(l)};i.implement(h,m);h.moduleUrl=function(p,o){if(l.$moduleUrls[p]){return l.$moduleUrls[p]}var t=p.split("/");o=o||t[t.length-2]||"";var n=o=="snippets"?"/":"-";var r=t[t.length-1];if(n=="-"){var q=new RegExp("^"+o+"[\\-_]|[\\-_]"+o+"$","g");r=r.replace(q,"")}if((!r||r==o)&&t.length>1){r=t[t.length-2]}var s=l[o+"Path"];if(s==null){s=l.basePath}else{if(n=="/"){o=n=""}}if(s&&s.slice(-1)!="/"){s+="/"}return s+o+n+r+this.get("suffix")};h.setModuleUrl=function(n,o){return l.$moduleUrls[n]=o};h.$loading={};h.loadModule=function(n,q){var o,p;if(Array.isArray(n)){p=n[0];n=n[1]}try{o=e(n)}catch(r){}if(o&&!h.$loading[n]){return q&&q(o)}if(!h.$loading[n]){h.$loading[n]=[]}h.$loading[n].push(q);if(h.$loading[n].length>1){return}var s=function(){e([n],function(t){h._emit("load.module",{name:n,module:t});var u=h.$loading[n];h.$loading[n]=null;u.forEach(function(v){v&&v(t)})})};if(!h.get("packaged")){return s()}j.loadScript(h.moduleUrl(n,p),s)};k(true);function k(p){l.packaged=p||e.packaged||d.packaged||(b.define&&define.packaged);if(!b.document){return""}var o={};var r="";var t=document.getElementsByTagName("script");for(var w=0;wm){p=n.end.row+1;n=j.getNextFoldLine(p,n);m=n?n.start.row:Infinity}if(p>y){while(this.$cells.length>q+1){k=this.$cells.pop();this.element.removeChild(k.element)}break}k=this.$cells[++q];if(!k){k={element:null,textNode:null,foldWidget:null};k.element=h.createElement("div");k.textNode=document.createTextNode("");k.element.appendChild(k.textNode);this.element.appendChild(k.element);this.$cells[q]=k}var l="ace_gutter-cell ";if(t[p]){l+=t[p]}if(o[p]){l+=o[p]}if(this.$annotations[p]){l+=this.$annotations[p].className}if(k.element.className!=l){k.element.className=l}var w=j.getRowLength(p)*C.lineHeight+"px";if(w!=k.element.style.height){k.element.style.height=w}if(x){var B=x[p];if(B==null){B=x[p]=j.getFoldWidget(p)}}if(B){if(!k.foldWidget){k.foldWidget=h.createElement("span");k.element.appendChild(k.foldWidget)}var l="ace_fold-widget ace_"+B;if(B=="start"&&p==m&&pj.right-k.right){return"foldWidgets"}}}).call(d.prototype);a.Gutter=d});define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,g,c){var f=e("../lib/dom");var a=e("../lib/event");var d=e("../lib/useragent");var j=200;var h=200;var k=5;function i(t){var r=t.editor;var L=f.createElement("img");L.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";if(d.isOpera){L.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;"}var M=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];M.forEach(function(y){t[y]=this[y]},this);r.addEventListener("mousedown",this.onMouseDown.bind(t));var z=r.container;var J,B,w;var C,F;var p,A=0;var q;var K;var G;var u;var D;this.onDragStart=function(N){if(this.cancelDrag||!z.draggable){var x=this;setTimeout(function(){x.startSelect();x.captureMouse(N)},0);return N.preventDefault()}F=r.getSelectionRange();var y=N.dataTransfer;y.effectAllowed=r.getReadOnly()?"copy":"copyMove";if(d.isOpera){r.container.appendChild(L);L._top=L.offsetTop}y.setDragImage&&y.setDragImage(L,0,0);if(d.isOpera){r.container.removeChild(L)}y.clearData();y.setData("Text",r.session.getTextRange());K=true;this.setState("drag")};this.onDragEnd=function(y){z.draggable=false;K=false;this.setState(null);if(!r.getReadOnly()){var x=y.dataTransfer.dropEffect;if(!q&&x=="move"){r.session.remove(r.getSelectionRange())}r.renderer.$cursorLayer.setBlinking(true)}this.editor.unsetStyle("ace_dragging")};this.onDragEnter=function(x){if(r.getReadOnly()||!n(x.dataTransfer)){return}if(!J){v()}A++;x.dataTransfer.dropEffect=q=H(x);return a.preventDefault(x)};this.onDragOver=function(x){if(r.getReadOnly()||!n(x.dataTransfer)){return}if(!J){v();A++}if(l!==null){l=null}B=x.clientX;w=x.clientY;x.dataTransfer.dropEffect=q=H(x);return a.preventDefault(x)};this.onDragLeave=function(x){A--;if(A<=0&&J){o();q=null;return a.preventDefault(x)}};this.onDrop=function(N){if(!J){return}var y=N.dataTransfer;if(K){switch(q){case"move":if(F.contains(p.row,p.column)){F={start:p,end:p}}else{F=r.moveText(F,p)}break;case"copy":F=r.moveText(F,p,true);break}}else{var x=y.getData("Text");F={start:p,end:r.session.insert(p,x)};r.focus();q=null}o();return a.preventDefault(N)};a.addListener(z,"dragstart",this.onDragStart.bind(t));a.addListener(z,"dragend",this.onDragEnd.bind(t));a.addListener(z,"dragenter",this.onDragEnter.bind(t));a.addListener(z,"dragover",this.onDragOver.bind(t));a.addListener(z,"dragleave",this.onDragLeave.bind(t));a.addListener(z,"drop",this.onDrop.bind(t));function I(O,N){var y=Date.now();var x=!N||O.row!=N.row;var Q=!N||O.column!=N.column;if(!u||x||Q){r.$blockScrolling+=1;r.moveCursorToPosition(O);r.$blockScrolling-=1;u=y;D={x:B,y:w}}else{var P=b(D.x,D.y,B,w);if(P>k){u=null}else{if(y-u>=h){r.renderer.scrollCursorIntoView();u=null}}}}function s(W,Q){var N=Date.now();var U=r.renderer.layerConfig.lineHeight;var y=r.renderer.layerConfig.characterWidth;var O=r.renderer.scroller.getBoundingClientRect();var R={x:{left:B-O.left,right:O.right-B},y:{top:w-O.top,bottom:O.bottom-w}};var T=Math.min(R.x.left,R.x.right);var P=Math.min(R.y.top,R.y.bottom);var X={row:W.row,column:W.column};if(T/y<=2){X.column+=(R.x.left=j){r.renderer.scrollCursorIntoView(X)}}}else{G=null}}function m(){var x=p;p=r.renderer.screenToTextCoordinates(B,w);I(p,x);s(p,x)}function v(){F=r.selection.toOrientedRange();J=r.session.addMarker(F,"ace_selection",r.getSelectionStyle());r.clearSelection();if(r.isFocused()){r.renderer.$cursorLayer.setBlinking(false)}clearInterval(C);C=setInterval(m,20);A=0;a.addListener(document,"mousemove",E)}function o(){clearInterval(C);r.session.removeMarker(J);J=null;r.$blockScrolling+=1;r.selection.fromOrientedRange(F);r.$blockScrolling-=1;if(r.isFocused()&&!K){r.renderer.$cursorLayer.setBlinking(!r.getReadOnly())}F=null;A=0;G=null;u=null;a.removeListener(document,"mousemove",E)}var l=null;function E(){if(l==null){l=setTimeout(function(){if(l!=null&&J){o()}},20)}}function n(y){var x=y.types;return !x||Array.prototype.some.call(x,function(N){return N=="text/plain"||N=="Text"})}function H(Q){var P=["copy","copymove","all","uninitialized"];var x=["move","copymove","linkmove","all","uninitialized"];var y=d.isMac?Q.altKey:Q.ctrlKey;var O="uninitialized";try{O=Q.dataTransfer.effectAllowed.toLowerCase()}catch(Q){}var N="none";if(y&&P.indexOf(O)>=0){N="copy"}else{if(x.indexOf(O)>=0){N="move"}else{if(P.indexOf(O)>=0){N="copy"}}}return N}}(function(){this.dragWait=function(){var l=Date.now()-this.mousedownEvent.time;if(l>this.editor.getDragDelay()){this.startDrag()}};this.dragWaitEnd=function(){var l=this.editor.container;l.draggable=false;this.startSelect(this.mousedownEvent.getDocumentPosition());this.selectEnd()};this.dragReadyEnd=function(l){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());this.editor.unsetStyle("ace_dragging");this.dragWaitEnd()};this.startDrag=function(){this.cancelDrag=false;var l=this.editor.container;l.draggable=true;this.editor.renderer.$cursorLayer.setBlinking(false);this.editor.setStyle("ace_dragging");this.setState("dragReady")};this.onMouseDrag=function(m){var l=this.editor.container;if(d.isIE&&this.state=="dragReady"){var n=b(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);if(n>3){l.dragDrop()}}if(this.state==="dragWait"){var n=b(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);if(n>0){l.draggable=false;this.startSelect(this.mousedownEvent.getDocumentPosition())}}};this.onMouseDown=function(r){if(!this.$dragEnabled){return}this.mousedownEvent=r;var o=this.editor;var n=r.inSelection();var m=r.getButton();var l=r.domEvent.detail||1;if(l===1&&m===0&&n){if(r.editor.inMultiSelectMode&&(r.getAccelKey()||r.getShiftKey())){return}this.mousedownEvent.time=Date.now();var q=r.domEvent.target||r.domEvent.srcElement;if("unselectable" in q){q.unselectable="on"}if(o.getDragDelay()){if(d.isWebKit){this.cancelDrag=true;var p=o.container;p.draggable=true}this.setState("dragWait")}else{this.startDrag()}this.captureMouse(r,this.onMouseDrag.bind(this));r.defaultPrevented=true}}}).call(i.prototype);function b(m,l,o,n){return Math.sqrt(Math.pow(o-m,2)+Math.pow(n-l,2))}g.DragdropHandler=i});define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(c,b,d){var e=c("../range").Range;var f=c("../lib/dom");var a=function(g){this.element=f.createElement("div");this.element.className="ace_layer ace_marker-layer";g.appendChild(this.element)};(function(){this.$padding=0;this.setPadding=function(g){this.$padding=g};this.setSession=function(g){this.session=g};this.setMarkers=function(g){this.markers=g};this.update=function(i){var i=i||this.config;if(!i){return}this.config=i;var k=[];for(var j in this.markers){var g=this.markers[j];if(!g.range){g.update(k,this,this.session,i);continue}var h=g.range.clipRows(i.firstRow,i.lastRow);if(h.isEmpty()){continue}h=h.toScreenRange(this.session);if(g.renderer){var m=this.$getTop(h.start.row,i);var l=this.$padding+h.start.column*i.characterWidth;g.renderer(k,h,l,m,i)}else{if(g.type=="fullLine"){this.drawFullLineMarker(k,h,g.clazz,i)}else{if(g.type=="screenLine"){this.drawScreenLineMarker(k,h,g.clazz,i)}else{if(h.isMultiLine()){if(g.type=="text"){this.drawTextMarker(k,h,g.clazz,i)}else{this.drawMultiLineMarker(k,h,g.clazz,i)}}else{this.drawSingleLineMarker(k,h,g.clazz+" ace_start",i)}}}}}this.element=f.setInnerHtml(this.element,k.join(""))};this.$getTop=function(h,g){return(h-g.firstRowScreen)*g.lineHeight};this.drawTextMarker=function(j,h,i,g,l){var m=h.start.row;var k=new e(m,h.start.column,m,this.session.getScreenLastRowColumn(m));this.drawSingleLineMarker(j,k,i+" ace_start",g,1,l);m=h.end.row;k=new e(m,0,m,h.end.column);this.drawSingleLineMarker(j,k,i,g,0,l);for(m=h.start.row+1;m");n=this.$getTop(l.end.row,j);var h=l.end.column*j.characterWidth;i.push("
");p=(l.end.row-l.start.row-1)*j.lineHeight;if(p<0){return}n=this.$getTop(l.start.row+1,j);i.push("
")};this.drawSingleLineMarker=function(h,l,n,j,m,g){var p=j.lineHeight;var i=(l.end.column+(m||0)-l.start.column)*j.characterWidth;var o=this.$getTop(l.start.row,j);var k=this.$padding+l.start.column*j.characterWidth;h.push("
")};this.drawFullLineMarker=function(k,h,j,i,m){var l=this.$getTop(h.start.row,i);var g=i.lineHeight;if(h.start.row!=h.end.row){g+=this.$getTop(h.end.row,i)-l}k.push("
")};this.drawScreenLineMarker=function(k,h,j,i,m){var l=this.$getTop(h.start.row,i);var g=i.lineHeight;k.push("
")}}).call(a.prototype);b.Marker=a});define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(c,b,d){var f=c("../lib/event");var a=c("../lib/useragent");var e=b.MouseEvent=function(h,g){this.domEvent=h;this.editor=g;this.x=this.clientX=h.clientX;this.y=this.clientY=h.clientY;this.$pos=null;this.$inSelection=null;this.propagationStopped=false;this.defaultPrevented=false};(function(){this.stopPropagation=function(){f.stopPropagation(this.domEvent);this.propagationStopped=true};this.preventDefault=function(){f.preventDefault(this.domEvent);this.defaultPrevented=true};this.stop=function(){this.stopPropagation();this.preventDefault()};this.getDocumentPosition=function(){if(this.$pos){return this.$pos}this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY);return this.$pos};this.inSelection=function(){if(this.$inSelection!==null){return this.$inSelection}var g=this.editor;var i=g.getSelectionRange();if(i.isEmpty()){this.$inSelection=false}else{var h=this.getDocumentPosition();this.$inSelection=i.contains(h.row,h.column)}return this.$inSelection};this.getButton=function(){return f.getButton(this.domEvent)};this.getShiftKey=function(){return this.domEvent.shiftKey};this.getAccelKey=a.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(e.prototype)});define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,g,b){var h=e("../lib/oop");var f=e("../lib/dom");var a=e("../lib/lang");var c=e("../lib/useragent");var i=e("../lib/event_emitter").EventEmitter;var d=function(j){this.element=f.createElement("div");this.element.className="ace_layer ace_text-layer";j.appendChild(this.element);this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){h.implement(this,i);this.EOF_CHAR="\xB6";this.EOL_CHAR_LF="\xAC";this.EOL_CHAR_CRLF="\xa4";this.EOL_CHAR=this.EOL_CHAR_LF;this.TAB_CHAR="\u2192";this.SPACE_CHAR="\xB7";this.$padding=0;this.$updateEolChar=function(){var j=this.session.doc.getNewLineCharacter()=="\n"?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=j){this.EOL_CHAR=j;return true}};this.setPadding=function(j){this.$padding=j;this.element.style.padding="0 "+j+"px"};this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0};this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0};this.$setFontMetrics=function(j){this.$fontMetrics=j;this.$fontMetrics.on("changeCharacterSize",function(k){this._signal("changeCharacterSize",k)}.bind(this));this.$pollSizeChanges()};this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()};this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()};this.setSession=function(j){this.session=j;this.$computeTabString()};this.showInvisibles=false;this.setShowInvisibles=function(j){if(this.showInvisibles==j){return false}this.showInvisibles=j;this.$computeTabString();return true};this.displayIndentGuides=true;this.setDisplayIndentGuides=function(j){if(this.displayIndentGuides==j){return false}this.displayIndentGuides=j;this.$computeTabString();return true};this.$tabStrings=[];this.onChangeTabSize=this.$computeTabString=function(){var n=this.session.getTabSize();this.tabSize=n;var j=this.$tabStrings=[0];for(var k=1;k"+this.TAB_CHAR+a.stringRepeat("\xa0",k-1)+"")}else{j.push(a.stringRepeat("\xa0",k))}}if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var l="ace_indent-guide";if(this.showInvisibles){l+=" ace_invisible";var o=a.stringRepeat(this.SPACE_CHAR,this.tabSize);var m=this.TAB_CHAR+a.stringRepeat("\xa0",this.tabSize-1)}else{var o=a.stringRepeat("\xa0",this.tabSize);var m=o}this.$tabStrings[" "]=""+o+"";this.$tabStrings["\t"]=""+m+""}};this.updateLines=function(k,m,u){if(this.config.lastRow!=k.lastRow||this.config.firstRow!=k.firstRow){this.scrollLines(k)}this.config=k;var p=Math.max(m,k.firstRow);var r=Math.min(u,k.lastRow);var s=this.element.childNodes;var j=0;for(var t=k.firstRow;tn){t=q.end.row+1;q=this.session.getNextFoldLine(t,q);n=q?q.start.row:Infinity}if(t>r){break}var l=s[j++];if(l){var o=[];this.$renderLine(o,t,!this.$useLineGroups(),t==n?q:false);l.style.height=k.lineHeight*this.session.getRowLength(t)+"px";f.setInnerHtml(l,o.join(""))}t++}};this.scrollLines=function(l){var j=this.config;this.config=l;if(!j||j.lastRow0;n--){m.removeChild(m.firstChild)}}if(j.lastRow>l.lastRow){for(var n=this.session.getFoldedRowCount(l.lastRow+1,j.lastRow);n>0;n--){m.removeChild(m.lastChild)}}if(l.firstRowj.lastRow){var k=this.$renderLinesFragment(l,j.lastRow+1,l.lastRow);m.appendChild(k)}};this.$renderLinesFragment=function(k,l,r){var o=this.element.ownerDocument.createDocumentFragment();var q=l;var p=this.session.getNextFoldLine(q);var m=p?p.start.row:Infinity;while(true){if(q>m){q=p.end.row+1;p=this.session.getNextFoldLine(q,p);m=p?p.start.row:Infinity}if(q>r){break}var j=f.createElement("div");var n=[];this.$renderLine(n,q,false,q==m?p:false);j.innerHTML=n.join("");if(this.$useLineGroups()){j.className="ace_line_group";o.appendChild(j);j.style.height=k.lineHeight*this.session.getRowLength(q)+"px"}else{while(j.firstChild){o.appendChild(j.firstChild)}}q++}return o};this.update=function(k){this.config=k;var l=[];var p=k.firstRow,m=k.lastRow;var o=p;var n=this.session.getNextFoldLine(o);var j=n?n.start.row:Infinity;while(true){if(o>j){o=n.end.row+1;n=this.session.getNextFoldLine(o,n);j=n?n.start.row:Infinity}if(o>m){break}if(this.$useLineGroups()){l.push("
")}this.$renderLine(l,o,false,o==j?n:false);if(this.$useLineGroups()){l.push("
")}o++}this.element=f.setInnerHtml(this.element,l.join(""))};this.$textToken={text:true,rparen:true,lparen:true};this.$renderToken=function(l,p,o,r){var s=this;var j=/\t|&|<|( +)|([\x00-\x1f\x80-\xa0\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g;var q=function(A,v,u,w,t){if(v){return s.showInvisibles?""+a.stringRepeat(s.SPACE_CHAR,A.length)+"":a.stringRepeat("\xa0",A.length)}else{if(A=="&"){return"&"}else{if(A=="<"){return"<"}else{if(A=="\t"){var y=s.session.getScreenTabSize(p+w);p+=y-1;return s.$tabStrings[y]}else{if(A=="\u3000"){var z=s.showInvisibles?"ace_cjk ace_invisible":"ace_cjk";var x=s.showInvisibles?s.SPACE_CHAR:"";p+=1;return""+x+""}else{if(u){return""+s.SPACE_CHAR+""}else{p+=1;return""+A+""}}}}}}};var m=r.replace(j,q);if(!this.$textToken[o.type]){var n="ace_"+o.type.replace(/\./g," ace_");var k="";if(o.type=="fold"){k=" style='width:"+(o.value.length*this.config.characterWidth)+"px;' "}l.push("",m,"")}else{l.push(m)}return p+r.length};this.renderIndentGuide=function(l,k,j){var m=k.search(this.$indentGuideRe);if(m<=0||m>=j){return k}if(k[0]==" "){m-=m%this.tabSize;l.push(a.stringRepeat(this.$tabStrings[" "],m/this.tabSize));return k.substr(m)}else{if(k[0]=="\t"){l.push(a.stringRepeat(this.$tabStrings["\t"],m));return k.substr(m)}}return k};this.$renderWrappedLine=function(j,p,t,k){var q=0;var r=0;var l=t[0];var o=0;for(var n=0;n=l){o=this.$renderToken(j,o,m,s.substring(0,l-q));s=s.substring(l-q);q=l;if(!k){j.push("","
")}r++;o=0;l=t[r]||Number.MAX_VALUE}if(s.length!=0){q+=s.length;o=this.$renderToken(j,o,m,s)}}}};this.$renderSimpleLine=function(n,o){var l=0;var k=o[0];var m=k.value;if(this.displayIndentGuides){m=this.renderIndentGuide(n,m)}if(m){l=this.$renderToken(n,l,k,m)}for(var j=1;j")}if(m.length){var l=this.session.getRowSplitData(o);if(l&&l.length){this.$renderWrappedLine(k,m,l,j)}else{this.$renderSimpleLine(k,m)}}if(this.showInvisibles){if(n){o=n.end.row}k.push("",o==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")}if(!j){k.push("
")}};this.$getFoldLineTokens=function(n,m){var l=this.session;var j=[];function o(s,u,t){var p=0,q=0;while((q+s[p].value.length)(t-u)){r=r.substring(0,t-u)}j.push({type:s[p].type,value:r});q=u+r.length;p+=1}while(qt){j.push({type:s[p].type,value:r.substring(0,t-q)})}else{j.push(s[p])}q+=r.length;p+=1}}var k=l.getTokens(n);m.walk(function(t,s,r,q,p){if(t!=null){j.push({type:"fold",value:t})}else{if(p){k=l.getTokens(s)}if(k.length){o(k,q,r)}}},m.end.row,this.session.getLine(m.end.row).length);return j};this.$useLineGroups=function(){return this.session.getUseWrapMode()};this.destroy=function(){clearInterval(this.$pollSizeChangesTimer);if(this.$measureNode){this.$measureNode.parentNode.removeChild(this.$measureNode)}delete this.$measureNode}}).call(d.prototype);g.Text=d});define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"],function(b,a,c){var e=b("./lib/oop");var f=b("./lib/dom");function d(g){this.isOpen=false;this.$element=null;this.$parentNode=g}(function(){this.$init=function(){this.$element=f.createElement("div");this.$element.className="ace_tooltip";this.$element.style.display="none";this.$parentNode.appendChild(this.$element);return this.$element};this.getElement=function(){return this.$element||this.$init()};this.setText=function(g){f.setInnerText(this.getElement(),g)};this.setHtml=function(g){this.getElement().innerHTML=g};this.setPosition=function(g,h){this.getElement().style.left=g+"px";this.getElement().style.top=h+"px"};this.setClassName=function(g){f.addCssClass(this.getElement(),g)};this.show=function(h,g,i){if(h!=null){this.setText(h)}if(g!=null&&i!=null){this.setPosition(g,i)}if(!this.isOpen){this.getElement().style.display="block";this.isOpen=true}};this.hide=function(){if(this.isOpen){this.getElement().style.display="none";this.isOpen=false}};this.getHeight=function(){return this.getElement().offsetHeight};this.getWidth=function(){return this.getElement().offsetWidth}}).call(d.prototype);a.Tooltip=d});define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(b,a,c){var f=b("../lib/dom");var e;var d=function(g){this.element=f.createElement("div");this.element.className="ace_layer ace_cursor-layer";g.appendChild(this.element);if(e===undefined){e="opacity" in this.element}this.isVisible=false;this.isBlinking=true;this.blinkInterval=1000;this.smoothBlinking=false;this.cursors=[];this.cursor=this.addCursor();f.addCssClass(this.element,"ace_hidden-cursors");this.$updateCursors=this.$updateVisibility.bind(this)};(function(){this.$updateVisibility=function(j){var h=this.cursors;for(var g=h.length;g--;){h[g].style.visibility=j?"":"hidden"}};this.$updateOpacity=function(j){var h=this.cursors;for(var g=h.length;g--;){h[g].style.opacity=j?"":"0"}};this.$padding=0;this.setPadding=function(g){this.$padding=g};this.setSession=function(g){this.session=g};this.setBlinking=function(g){if(g!=this.isBlinking){this.isBlinking=g;this.restartTimer()}};this.setBlinkInterval=function(g){if(g!=this.blinkInterval){this.blinkInterval=g;this.restartTimer()}};this.setSmoothBlinking=function(g){if(g!=this.smoothBlinking&&!e){this.smoothBlinking=g;f.setCssClass(this.element,"ace_smooth-blinking",g);this.$updateCursors(true);this.$updateCursors=(g?this.$updateOpacity:this.$updateVisibility).bind(this);this.restartTimer()}};this.addCursor=function(){var g=f.createElement("div");g.className="ace_cursor";this.element.appendChild(g);this.cursors.push(g);return g};this.removeCursor=function(){if(this.cursors.length>1){var g=this.cursors.pop();g.parentNode.removeChild(g);return g}};this.hideCursor=function(){this.isVisible=false;f.addCssClass(this.element,"ace_hidden-cursors");this.restartTimer()};this.showCursor=function(){this.isVisible=true;f.removeCssClass(this.element,"ace_hidden-cursors");this.restartTimer()};this.restartTimer=function(){var h=this.$updateCursors;clearInterval(this.intervalId);clearTimeout(this.timeoutId);if(this.smoothBlinking){f.removeCssClass(this.element,"ace_smooth-blinking")}h(true);if(!this.isBlinking||!this.blinkInterval||!this.isVisible){return}if(this.smoothBlinking){setTimeout(function(){f.addCssClass(this.element,"ace_smooth-blinking")}.bind(this))}var g=function(){this.timeoutId=setTimeout(function(){h(false)},0.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){h(true);g()},this.blinkInterval);g()};this.getPixelPosition=function(g,h){if(!this.config||!this.session){return{left:0,top:0}}if(!g){g=this.session.selection.getCursor()}var k=this.session.documentToScreenPosition(g);var i=this.$padding+k.column*this.config.characterWidth;var j=(k.row-(h?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:i,top:j}};this.update=function(h){this.config=h;var l=this.session.$selectionMarkers;var j=0,o=0;if(l===undefined||l.length===0){l=[{cursor:null}]}for(var j=0,p=l.length;jh.height+h.offset||m.top<0)&&j>1){continue}var k=(this.cursors[o++]||this.addCursor()).style;k.left=m.left+"px";k.top=m.top+"px";k.width=h.characterWidth+"px";k.height=h.lineHeight+"px"}while(this.cursors.length>o){this.removeCursor()}var g=this.session.getOverwrite();this.$setOverwrite(g);this.$pixelPos=m;this.restartTimer()};this.$setOverwrite=function(g){if(g!=this.overwrite){this.overwrite=g;if(g){f.addCssClass(this.element,"ace_overwrite-cursors")}else{f.removeCssClass(this.element,"ace_overwrite-cursors")}}};this.destroy=function(){clearInterval(this.intervalId);clearTimeout(this.timeoutId)}}).call(d.prototype);a.Cursor=d});define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"],function(e,g,d){var f=e("../lib/dom");var h=e("../lib/oop");var a=e("../lib/event");var i=e("../tooltip").Tooltip;function b(p){var m=p.editor;var k=m.renderer.$gutterLayer;var s=new c(m.container);p.editor.setDefaultHandler("guttermousedown",function(u){if(!m.isFocused()||u.getButton()!=0){return}var w=k.getRegion(u);if(w=="foldWidgets"){return}var v=u.getDocumentPosition().row;var t=m.session.selection;if(u.getShiftKey()){t.selectTo(v,0)}else{if(u.domEvent.detail==2){m.selectAll();return u.preventDefault()}p.$clickSelection=m.selection.getLineRange(v)}p.setState("selectByLines");p.captureMouse(u);return u.preventDefault()});var r,j,l;function q(){var y=j.getDocumentPosition().row;var t=k.$annotations[y];if(!t){return o()}var A=m.session.getLength();if(y==A){var v=m.renderer.pixelToScreenCoordinates(0,j.y).row;var z=j.$pos;if(v>m.session.documentToScreenRow(z.row,z.column)){return o()}}if(l==t){return}l=t.text.join("
");s.setHtml(l);if(l.length){s.show()}m.on("mousewheel",o);if(p.$tooltipFollowsMouse){n(j)}else{var u=k.$cells[y].element;var x=u.getBoundingClientRect();var w=s.getElement().style;w.left=x.right+"px";w.top=x.bottom+"px"}}function o(){if(r){r=clearTimeout(r)}if(l){s.hide();l=null;m.removeEventListener("mousewheel",o)}}function n(t){s.setPosition(t.x,t.y)}p.editor.setDefaultHandler("guttermousemove",function(u){var t=u.domEvent.target||u.domEvent.srcElement;if(f.hasCssClass(t,"ace_fold-widget")){return o()}if(l&&p.$tooltipFollowsMouse){n(u)}j=u;if(r){return}r=setTimeout(function(){r=null;if(j&&!p.isMousePressed){q()}else{o()}},50)});a.addListener(m.renderer.$gutter,"mouseout",function(t){j=null;if(!l||r){return}r=setTimeout(function(){r=null;o()},50)});m.on("changeSession",o)}function c(j){i.call(this,j)}h.inherits(c,i);(function(){this.setPosition=function(k,o){var l=window.innerWidth||document.documentElement.clientWidth;var n=window.innerHeight||document.documentElement.clientHeight;var m=this.getWidth();var j=this.getHeight();k+=15;o+=15;if(k+m>l){k-=(k+m)-l}if(o+j>n){o-=20+j}i.prototype.setPosition.call(this,k,o)}}).call(c.prototype);g.GutterHandler=b});define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(d,f,b){var h=d("./lib/oop");var e=d("./lib/dom");var a=d("./lib/event");var j=d("./lib/event_emitter").EventEmitter;var c=function(k){this.element=e.createElement("div");this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix;this.inner=e.createElement("div");this.inner.className="ace_scrollbar-inner";this.element.appendChild(this.inner);k.appendChild(this.element);this.setVisible(false);this.skipEvent=false;a.addListener(this.element,"scroll",this.onScroll.bind(this));a.addListener(this.element,"mousedown",a.preventDefault)};(function(){h.implement(this,j);this.setVisible=function(k){this.element.style.display=k?"":"none";this.isVisible=k}}).call(c.prototype);var g=function(k,l){c.call(this,k);this.scrollTop=0;l.$scrollbarWidth=this.width=e.scrollbarWidth(k.ownerDocument);this.inner.style.width=this.element.style.width=(this.width||15)+5+"px"};h.inherits(g,c);(function(){this.classSuffix="-v";this.onScroll=function(){if(!this.skipEvent){this.scrollTop=this.element.scrollTop;this._emit("scroll",{data:this.scrollTop})}this.skipEvent=false};this.getWidth=function(){return this.isVisible?this.width:0};this.setHeight=function(k){this.element.style.height=k+"px"};this.setInnerHeight=function(k){this.inner.style.height=k+"px"};this.setScrollHeight=function(k){this.inner.style.height=k+"px"};this.setScrollTop=function(k){if(this.scrollTop!=k){this.skipEvent=true;this.scrollTop=this.element.scrollTop=k}}}).call(g.prototype);var i=function(k,l){c.call(this,k);this.scrollLeft=0;this.height=l.$scrollbarWidth;this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};h.inherits(i,c);(function(){this.classSuffix="-h";this.onScroll=function(){if(!this.skipEvent){this.scrollLeft=this.element.scrollLeft;this._emit("scroll",{data:this.scrollLeft})}this.skipEvent=false};this.getHeight=function(){return this.isVisible?this.height:0};this.setWidth=function(k){this.element.style.width=k+"px"};this.setInnerWidth=function(k){this.inner.style.width=k+"px"};this.setScrollWidth=function(k){this.inner.style.width=k+"px"};this.setScrollLeft=function(k){if(this.scrollLeft!=k){this.skipEvent=true;this.scrollLeft=this.element.scrollLeft=k}}}).call(i.prototype);f.ScrollBar=g;f.ScrollBarV=g;f.ScrollBarH=i;f.VScrollBar=g;f.HScrollBar=i});define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,g,c){var f=e("../lib/dom");var a=e("../lib/event");var d=e("../lib/useragent");var j=0;function i(m){m.$clickSelection=null;var l=m.editor;l.setDefaultHandler("mousedown",this.onMouseDown.bind(m));l.setDefaultHandler("dblclick",this.onDoubleClick.bind(m));l.setDefaultHandler("tripleclick",this.onTripleClick.bind(m));l.setDefaultHandler("quadclick",this.onQuadClick.bind(m));l.setDefaultHandler("mousewheel",this.onMouseWheel.bind(m));var k=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];k.forEach(function(n){m[n]=this[n]},this);m.selectByLines=this.extendSelectionBy.bind(m,"getLineRange");m.selectByWords=this.extendSelectionBy.bind(m,"getWordRange")}(function(){this.onMouseDown=function(o){var m=o.inSelection();var q=o.getDocumentPosition();this.mousedownEvent=o;var n=this.editor;var l=o.getButton();if(l!==0){var p=n.getSelectionRange();var k=p.isEmpty();if(k){n.selection.moveToPosition(q)}n.textInput.onContextMenu(o.domEvent);return}if(m&&!n.isFocused()){n.focus();if(this.$focusTimout&&!this.$clickSelection&&!n.inMultiSelectMode){this.mousedownEvent.time=Date.now();this.setState("focusWait");this.captureMouse(o);return}}this.captureMouse(o);if(!m||this.$clickSelection||o.getShiftKey()||n.inMultiSelectMode){this.startSelect(q)}else{if(m){this.mousedownEvent.time=Date.now();this.startSelect(q)}}return o.preventDefault()};this.startSelect=function(m){m=m||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var k=this.editor;var l=this.mousedownEvent.getShiftKey();if(l){k.selection.selectToPosition(m)}else{if(!this.$clickSelection){k.selection.moveToPosition(m)}}if(k.renderer.scroller.setCapture){k.renderer.scroller.setCapture()}k.setStyle("ace_selecting");this.setState("select")};this.select=function(){var k,l=this.editor;var o=l.renderer.screenToTextCoordinates(this.x,this.y);if(this.$clickSelection){var m=this.$clickSelection.comparePoint(o);if(m==-1){k=this.$clickSelection.end}else{if(m==1){k=this.$clickSelection.start}else{var n=h(this.$clickSelection,o);o=n.cursor;k=n.anchor}}l.selection.setSelectionAnchor(k.row,k.column)}l.selection.selectToPosition(o);l.renderer.scrollCursorIntoView()};this.extendSelectionBy=function(l){var n,o=this.editor;var r=o.renderer.screenToTextCoordinates(this.x,this.y);var m=o.selection[l](r.row,r.column);if(this.$clickSelection){var k=this.$clickSelection.comparePoint(m.start);var q=this.$clickSelection.comparePoint(m.end);if(k==-1&&q<=0){n=this.$clickSelection.end;if(m.end.row!=r.row||m.end.column!=r.column){r=m.start}}else{if(q==1&&k>=0){n=this.$clickSelection.start;if(m.start.row!=r.row||m.start.column!=r.column){r=m.end}}else{if(k==-1&&q==1){r=m.end;n=m.start}else{var p=h(this.$clickSelection,r);r=p.cursor;n=p.anchor}}}o.selection.setSelectionAnchor(n.row,n.column)}o.selection.selectToPosition(r);o.renderer.scrollCursorIntoView()};this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.editor.unsetStyle("ace_selecting");if(this.editor.renderer.scroller.releaseCapture){this.editor.renderer.scroller.releaseCapture()}};this.focusWait=function(){var l=b(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);var k=Date.now();if(l>j||k-this.mousedownEvent.time>this.$focusTimout){this.startSelect(this.mousedownEvent.getDocumentPosition())}};this.onDoubleClick=function(m){var o=m.getDocumentPosition();var l=this.editor;var n=l.session;var k=n.getBracketRange(o);if(k){if(k.isEmpty()){k.start.column--;k.end.column++}this.setState("select")}else{k=l.selection.getWordRange(o.row,o.column);this.setState("selectByWords")}this.$clickSelection=k;this[this.state]&&this[this.state](m)};this.onTripleClick=function(l){var m=l.getDocumentPosition();var k=this.editor;this.setState("selectByLines");this.$clickSelection=k.selection.getLineRange(m.row);this[this.state]&&this[this.state](l)};this.onQuadClick=function(l){var k=this.editor;k.selectAll();this.$clickSelection=k.getSelectionRange();this.setState("selectAll")};this.onMouseWheel=function(o){if(o.getAccelKey()){return}if(o.getShiftKey()&&o.wheelY&&!o.wheelX){o.wheelX=o.wheelY;o.wheelY=0}var l=o.domEvent.timeStamp;var n=l-(this.$lastScrollTime||0);var m=this.editor;var k=m.renderer.isScrollableBy(o.wheelX*o.speed,o.wheelY*o.speed);if(k||n<200){this.$lastScrollTime=l;m.renderer.scrollBy(o.wheelX*o.speed,o.wheelY*o.speed);return o.stop()}}}).call(i.prototype);g.DefaultHandlers=i;function b(l,k,n,m){return Math.sqrt(Math.pow(n-l,2)+Math.pow(m-k,2))}function h(k,m){if(k.start.row==k.end.row){var l=2*m.column-k.start.column-k.end.column}else{if(k.start.row==k.end.row-1&&!k.start.column&&!k.end.column){var l=m.column-4}else{var l=2*m.row-k.start.row-k.end.row}}if(l<0){return{cursor:k.start,anchor:k.end}}else{return{cursor:k.end,anchor:k.start}}}});define("ace/renderloop",["require","exports","module","ace/lib/event"],function(b,a,c){var d=b("./lib/event");var e=function(g,f){this.onRender=g;this.pending=false;this.changes=0;this.window=f||window};(function(){this.schedule=function(g){this.changes=this.changes|g;if(!this.pending&&this.changes){this.pending=true;var f=this;d.nextFrame(function(){f.pending=false;var h;while(h=f.changes){f.changes=0;f.onRender(h)}},this.window)}}}).call(e.prototype);a.RenderLoop=e});define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(f,h,c){var a=f("../lib/event");var d=f("../lib/useragent");var k=f("./default_handlers").DefaultHandlers;var b=f("./default_gutter_handler").GutterHandler;var j=f("./mouse_event").MouseEvent;var i=f("./dragdrop_handler").DragdropHandler;var e=f("../config");var g=function(m){this.editor=m;new k(this);new b(this);new i(this);var n=m.renderer.getMouseEventTarget();a.addListener(n,"click",this.onMouseEvent.bind(this,"click"));a.addListener(n,"mousemove",this.onMouseMove.bind(this,"mousemove"));a.addMultiMouseDownListener(n,[300,300,250],this,"onMouseEvent");if(m.renderer.scrollBarV){a.addMultiMouseDownListener(m.renderer.scrollBarV.inner,[300,300,250],this,"onMouseEvent");a.addMultiMouseDownListener(m.renderer.scrollBarH.inner,[300,300,250],this,"onMouseEvent")}a.addMouseWheelListener(m.container,this.onMouseWheel.bind(this,"mousewheel"));var l=m.renderer.$gutter;a.addListener(l,"mousedown",this.onMouseEvent.bind(this,"guttermousedown"));a.addListener(l,"click",this.onMouseEvent.bind(this,"gutterclick"));a.addListener(l,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick"));a.addListener(l,"mousemove",this.onMouseEvent.bind(this,"guttermousemove"));a.addListener(n,"mousedown",function(o){m.focus()});a.addListener(l,"mousedown",function(o){m.focus();return a.preventDefault(o)})};(function(){this.onMouseEvent=function(l,m){this.editor._emit(l,new j(m,this.editor))};this.onMouseMove=function(l,n){var m=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!m||!m.length){return}this.editor._emit(l,new j(n,this.editor))};this.onMouseWheel=function(l,m){var n=new j(m,this.editor);n.speed=this.$scrollSpeed*2;n.wheelX=m.wheelX;n.wheelY=m.wheelY;this.editor._emit(l,n)};this.setState=function(l){this.state=l};this.captureMouse=function(p,m){this.x=p.x;this.y=p.y;this.isMousePressed=true;var q=this.editor.renderer;if(q.$keepTextAreaAtCursor){q.$keepTextAreaAtCursor=null}var n=this;var s=function(t){n.x=t.clientX;n.y=t.clientY;m&&m(t);n.mouseEvent=new j(t,n.editor);n.$mouseMoved=true};var r=function(t){clearInterval(l);o();n[n.state+"End"]&&n[n.state+"End"](t);n.$clickSelection=null;if(q.$keepTextAreaAtCursor==null){q.$keepTextAreaAtCursor=true;q.$moveTextAreaToCursor()}n.isMousePressed=false;n.$onCaptureMouseMove=n.releaseMouse=null;n.onMouseEvent("mouseup",t)};var o=function(){n[n.state]&&n[n.state]();n.$mouseMoved=false};if(d.isOldIE&&p.domEvent.type=="dblclick"){return setTimeout(function(){r(p)})}n.$onCaptureMouseMove=s;n.releaseMouse=a.capture(this.editor.container,s,r);var l=setInterval(o,20)};this.releaseMouse=null}).call(g.prototype);e.defineOptions(g.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:150},dragEnabled:{initialValue:true},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:true}});h.MouseHandler=g});define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event_emitter"],function(c,e,b){var g=c("../lib/oop");var d=c("../lib/dom");var a=c("../lib/lang");var i=c("../lib/event_emitter").EventEmitter;var h=0;var f=e.FontMetrics=function(k,j){this.el=d.createElement("div");this.$setMeasureNodeStyles(this.el.style,true);this.$main=d.createElement("div");this.$setMeasureNodeStyles(this.$main.style);this.$measureNode=d.createElement("div");this.$setMeasureNodeStyles(this.$measureNode.style);this.el.appendChild(this.$main);this.el.appendChild(this.$measureNode);k.appendChild(this.el);if(!h){this.$testFractionalRect()}this.$measureNode.textContent=a.stringRepeat("X",h);this.$characterSize={width:0,height:0};this.checkForSizeChanges()};(function(){g.implement(this,i);this.$characterSize={width:0,height:0};this.$testFractionalRect=function(){var k=d.createElement("div");this.$setMeasureNodeStyles(k.style);k.style.width="0.2px";document.documentElement.appendChild(k);var j=k.getBoundingClientRect().width;if(j>0&&j<1){h=1}else{h=100}k.parentNode.removeChild(k)};this.$setMeasureNodeStyles=function(k,j){k.width=k.height="auto";k.left=k.top="-100px";k.visibility="hidden";k.position="fixed";k.whiteSpace="pre";k.font="inherit";k.overflow=j?"hidden":"visible"};this.checkForSizeChanges=function(){var k=this.$measureSizes();if(k&&(this.$characterSize.width!==k.width||this.$characterSize.height!==k.height)){this.$measureNode.style.fontWeight="bold";var j=this.$measureSizes();this.$measureNode.style.fontWeight="";this.$characterSize=k;this.charSizes=Object.create(null);this.allowBoldFonts=j&&j.width===k.width&&j.height===k.height;this._emit("changeCharacterSize",{data:k})}};this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer){return this.$pollSizeChangesTimer}var j=this;return this.$pollSizeChangesTimer=setInterval(function(){j.checkForSizeChanges()},500)};this.setPolling=function(j){if(j){this.$pollSizeChanges()}else{if(this.$pollSizeChangesTimer){this.$pollSizeChangesTimer}}};this.$measureSizes=function(){var k=this.$measureNode.getBoundingClientRect();var j={height:k.height,width:k.width/h};if(j.width===0||j.height===0){return null}return j};this.$measureCharWidth=function(j){this.$main.textContent=a.stringRepeat(j,h);var k=this.$main.getBoundingClientRect();return k.width/h};this.getCharacterWidth=function(k){var j=this.charSizes[k];if(j===undefined){this.charSizes[k]=this.$measureCharWidth(k)/this.$characterSize.width}return j};this.destroy=function(){clearInterval(this.$pollSizeChangesTimer);if(this.el&&this.el.parentNode){this.el.parentNode.removeChild(this.el)}}}).call(f.prototype)});define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang"],function(e,h,c){var a=e("../lib/event");var d=e("../lib/useragent");var f=e("../lib/dom");var b=e("../lib/lang");var g=d.isChrome<18;var i=function(z,H){var D=f.createElement("textarea");D.className="ace_text-input";if(d.isTouchPad){D.setAttribute("x-palm-disable-auto-cap",true)}D.wrap="off";D.autocorrect="off";D.autocapitalize="off";D.spellcheck=false;D.style.opacity="0";z.insertBefore(D,z.firstChild);var k="\x01\x01";var n=false;var I=false;var q=false;var m=false;var R="";var o=true;try{var A=document.activeElement===D}catch(M){}a.addListener(D,"blur",function(){H.onBlur();A=false});a.addListener(D,"focus",function(){A=true;H.onFocus();y()});this.focus=function(){D.focus()};this.blur=function(){D.blur()};this.isFocused=function(){return A};var x=b.delayedCall(function(){A&&y(o)});var p=b.delayedCall(function(){if(!m){D.value=k;A&&y()}});function y(V){if(m){return}if(w){S=0;U=V?0:D.value.length-1}else{var S=V?2:1;var U=2}try{D.setSelectionRange(S,U)}catch(T){}}function u(){if(m){return}D.value=k;if(d.isWebKit){p.schedule()}}d.isWebKit||H.addEventListener("changeSelection",function(){if(H.selection.isEmpty()!=o){o=!o;x.schedule()}});u();if(A){H.onFocus()}var E=function(S){return S.selectionStart===0&&S.selectionEnd===S.value.length};if(!D.setSelectionRange&&D.createTextRange){D.setSelectionRange=function(T,U){var S=this.createTextRange();S.collapse(true);S.moveStart("character",T);S.moveEnd("character",U);S.select()};E=function(U){try{var S=U.ownerDocument.selection.createRange()}catch(T){}if(!S||S.parentElement()!=U){return false}return S.text==U.value}}if(d.isOldIE){var J=false;var Q=function(T){if(J){return}var S=D.value;if(m||!S||S==k){return}if(T&&S==k[0]){return t.schedule()}O(S);J=true;u();J=false};var t=b.delayedCall(Q);a.addListener(D,"propertychange",Q);var K={13:1,27:1};a.addListener(D,"keyup",function(S){if(m&&(!D.value||K[S.keyCode])){setTimeout(r,0)}if((D.value.charCodeAt(0)||0)<129){return t.call()}m?N():F()});a.addListener(D,"keydown",function(S){t.schedule(50)})}var P=function(S){if(n){n=false}else{if(I){I=false}else{if(E(D)){H.selectAll();y()}else{if(w){y(H.selection.isEmpty())}}}}};var w=null;this.setInputHandler=function(S){w=S};this.getInputHandler=function(){return w};var v=false;var O=function(S){if(w){S=w(S);w=null}if(q){y();if(S){H.onPaste(S)}q=false}else{if(S==k.charAt(0)){if(v){H.execCommand("del",{source:"ace"})}else{H.execCommand("backspace",{source:"ace"})}}else{if(S.substring(0,2)==k){S=S.substr(2)}else{if(S.charAt(0)==k.charAt(0)){S=S.substr(1)}else{if(S.charAt(S.length-1)==k.charAt(0)){S=S.slice(0,-1)}}}if(S.charAt(S.length-1)==k.charAt(0)){S=S.slice(0,-1)}if(S){H.onTextInput(S)}}}if(v){v=false}};var j=function(T){if(m){return}var S=D.value;O(S);u()};var s=function(U){var T=H.getCopyText();if(!T){a.preventDefault(U);return}var V=U.clipboardData||window.clipboardData;if(V&&!g){var S=V.setData("Text",T);if(S){H.onCut();a.preventDefault(U)}}if(!S){n=true;D.value=T;D.select();setTimeout(function(){n=false;u();y();H.onCut()})}};var B=function(U){var T=H.getCopyText();if(!T){a.preventDefault(U);return}var V=U.clipboardData||window.clipboardData;if(V&&!g){var S=V.setData("Text",T);if(S){H.onCopy();a.preventDefault(U)}}if(!S){I=true;D.value=T;D.select();setTimeout(function(){I=false;u();y();H.onCopy()})}};var l=function(T){var U=T.clipboardData||window.clipboardData;if(U){var S=U.getData("Text");if(S){H.onPaste(S)}if(d.isIE){setTimeout(y)}a.preventDefault(T)}else{D.value="";q=true}};a.addCommandKeyListener(D,H.onCommandKey.bind(H));a.addListener(D,"select",P);a.addListener(D,"input",j);a.addListener(D,"cut",s);a.addListener(D,"copy",B);a.addListener(D,"paste",l);if(!("oncut" in D)||!("oncopy" in D)||!("onpaste" in D)){a.addListener(z,"keydown",function(S){if((d.isMac&&!S.metaKey)||!S.ctrlKey){return}switch(S.keyCode){case 67:B(S);break;case 86:l(S);break;case 88:s(S);break}})}var F=function(S){if(m||!H.onCompositionStart){return}m={};H.onCompositionStart();setTimeout(N,0);H.on("mousedown",r);if(!H.selection.isEmpty()){H.insert("");H.session.markUndoGroup();H.selection.clearSelection()}H.session.markUndoGroup()};var N=function(){if(!m||!H.onCompositionUpdate){return}var T=D.value.replace(/\x01/g,"");if(m.lastValue===T){return}H.onCompositionUpdate(T);if(m.lastValue){H.undo()}m.lastValue=T;if(m.lastValue){var S=H.selection.getRange();H.insert(m.lastValue);H.session.markUndoGroup();m.range=H.selection.getRange();H.selection.setRange(S);H.selection.clearSelection()}};var r=function(T){if(!H.onCompositionEnd){return}var V=m;m=false;var U=setTimeout(function(){U=null;var W=D.value.replace(/\x01/g,"");if(m){return}else{if(W==V.lastValue){u()}else{if(!V.lastValue&&W){u();O(W)}}}});w=function S(W){if(U){clearTimeout(U)}W=W.replace(/\x01/g,"");if(W==V.lastValue){return""}if(V.lastValue&&U){H.undo()}return W};H.onCompositionEnd();H.removeListener("mousedown",r);if(T.type=="compositionend"&&V.range){H.selection.setRange(V.range)}};var G=b.delayedCall(N,50);a.addListener(D,"compositionstart",F);if(d.isGecko){a.addListener(D,"text",function(){G.schedule()})}else{a.addListener(D,"keyup",function(){G.schedule()});a.addListener(D,"keydown",function(){G.schedule()})}a.addListener(D,"compositionend",r);this.getElement=function(){return D};this.setReadOnly=function(S){D.readOnly=S};this.onContextMenu=function(X){v=true;if(!R){R=D.style.cssText}D.style.cssText="z-index:100000;"+(d.isIE?"opacity:0.1;":"");y(H.selection.isEmpty());H._emit("nativecontextmenu",{target:H,domEvent:X});var U=H.container.getBoundingClientRect();var T=f.computedStyle(H.container);var W=U.top+(parseInt(T.borderTopWidth)||0);var V=U.left+(parseInt(U.borderLeftWidth)||0);var Y=U.bottom-W-D.clientHeight;var S=function(Z){D.style.left=Z.clientX-V-2+"px";D.style.top=Math.min(Z.clientY-W-2,Y)+"px"};S(X);if(X.type!="mousedown"){return}if(H.renderer.$keepTextAreaAtCursor){H.renderer.$keepTextAreaAtCursor=null}if(d.isWin){a.capture(H.container,S,C)}};this.onContextMenuClose=C;function C(){setTimeout(function(){if(R){D.style.cssText=R;R=""}if(H.renderer.$keepTextAreaAtCursor==null){H.renderer.$keepTextAreaAtCursor=true;H.renderer.$moveTextAreaToCursor()}},0)}if(!d.isGecko||d.isMac){var L=function(S){H.textInput.onContextMenu(S);C()};a.addListener(H.renderer.scroller,"contextmenu",L);a.addListener(D,"contextmenu",L)}};h.TextInput=i});define("ace/lib/lang",["require","exports","module"],function(b,a,c){a.last=function(f){return f[f.length-1]};a.stringReverse=function(f){return f.split("").reverse().join("")};a.stringRepeat=function(g,h){var f="";while(h>0){if(h&1){f+=g}if(h>>=1){g+=g}}return f};var d=/^\s\s*/;var e=/\s\s*$/;a.stringTrimLeft=function(f){return f.replace(d,"")};a.stringTrimRight=function(f){return f.replace(e,"")};a.copyObject=function(g){var h={};for(var f in g){h[f]=g[f]}return h};a.copyArray=function(j){var h=[];for(var g=0,f=j.length;g1&&!this.inMultiSelectMode){this._signal("multiSelect");this.inMultiSelectMode=true;this.session.$undoSelect=false;this.rangeList.attach(this.session)}return s||this.fromOrientedRange(t)};this.toSingleRange=function(s){s=s||this.ranges[0];var t=this.rangeList.removeAll();if(t.length){this.$onRemoveRange(t)}s&&this.fromOrientedRange(s)};this.substractPoint=function(t){var s=this.rangeList.substractPoint(t);if(s){this.$onRemoveRange(s);return s[0]}};this.mergeOverlappingRanges=function(){var s=this.rangeList.merge();if(s.length){this.$onRemoveRange(s)}else{if(this.ranges[0]){this.fromOrientedRange(this.ranges[0])}}};this.$onAddRange=function(s){this.rangeCount=this.rangeList.ranges.length;this.ranges.unshift(s);this._signal("addRange",{range:s})};this.$onRemoveRange=function(u){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var v=this.rangeList.ranges.pop();u.push(v);this.rangeCount=0}for(var t=u.length;t--;){var s=this.ranges.indexOf(u[t]);this.ranges.splice(s,1)}this._signal("removeRange",{ranges:u});if(this.rangeCount==0&&this.inMultiSelectMode){this.inMultiSelectMode=false;this._signal("singleSelect");this.session.$undoSelect=true;this.rangeList.detach(this.session)}v=v||this.ranges[0];if(v&&!v.isEqual(this.getRange())){this.fromOrientedRange(v)}};this.$initRangeList=function(){if(this.rangeList){return}this.rangeList=new n();this.ranges=[];this.rangeCount=0};this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]};this.splitIntoLines=function(){if(this.rangeCount>1){var t=this.rangeList.ranges;var z=t[t.length-1];var A=o.fromPoints(t[0].start,z.end);this.toSingleRange();this.setSelectionRange(A,z.cursor==z.start)}else{var A=this.getRange();var B=this.isBackwards();var C=A.start.row;var x=A.end.row;if(C==x){if(B){var u=A.end,w=A.start}else{var u=A.start,w=A.end}this.addRange(o.fromPoints(w,w));this.addRange(o.fromPoints(u,u));return}var v=[];var s=this.getLineRange(C,true);s.start.column=A.start.column;v.push(s);for(var y=C+1;y1){var s=this.rangeList.ranges;var w=s[s.length-1];var t=o.fromPoints(s[0].start,w.end);this.toSingleRange();this.setSelectionRange(t,w.cursor==w.start)}else{var v=this.session.documentToScreenPosition(this.selectionLead);var u=this.session.documentToScreenPosition(this.selectionAnchor);var x=this.rectangularRangeBlock(v,u);x.forEach(this.addRange,this)}};this.rectangularRangeBlock=function(t,z,E){var u=[];var w=t.column0){x--}if(x>0){var s=0;while(u[s].isEmpty()){s++}}for(var A=x;A>=s;A--){if(u[A].isEmpty()){u.splice(A,1)}}}return u}}).call(c.prototype);var l=g("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor();this.renderer.updateBackMarkers()};this.addSelectionMarker=function(t){if(!t.cursor){t.cursor=t.end}var s=this.getSelectionStyle();t.marker=this.session.addMarker(t,"ace_selection",s);this.session.$selectionMarkers.push(t);this.session.selectionMarkerCount=this.session.$selectionMarkers.length;return t};this.removeSelectionMarker=function(s){if(!s.marker){return}this.session.removeMarker(s.marker);var t=this.session.$selectionMarkers.indexOf(s);if(t!=-1){this.session.$selectionMarkers.splice(t,1)}this.session.selectionMarkerCount=this.session.$selectionMarkers.length};this.removeSelectionMarkers=function(s){var u=this.session.$selectionMarkers;for(var w=s.length;w--;){var t=s[w];if(!t.marker){continue}this.session.removeMarker(t.marker);var v=u.indexOf(t);if(v!=-1){u.splice(v,1)}}this.session.selectionMarkerCount=u.length};this.$onAddRange=function(s){this.addSelectionMarker(s.range);this.renderer.updateCursor();this.renderer.updateBackMarkers()};this.$onRemoveRange=function(s){this.removeSelectionMarkers(s.ranges);this.renderer.updateCursor();this.renderer.updateBackMarkers()};this.$onMultiSelect=function(s){if(this.inMultiSelectMode){return}this.inMultiSelectMode=true;this.setStyle("ace_multiselect");this.keyBinding.addKeyboardHandler(d.keyboardHandler);this.commands.setDefaultHandler("exec",this.$onMultiSelectExec);this.renderer.updateCursor();this.renderer.updateBackMarkers()};this.$onSingleSelect=function(s){if(this.session.multiSelect.inVirtualMode){return}this.inMultiSelectMode=false;this.unsetStyle("ace_multiselect");this.keyBinding.removeKeyboardHandler(d.keyboardHandler);this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec);this.renderer.updateCursor();this.renderer.updateBackMarkers();this._emit("changeSelection")};this.$onMultiSelectExec=function(u){var v=u.command;var t=u.editor;if(!t.multiSelect){return}if(!v.multiSelectAction){var s=v.exec(t,u.args||{});t.multiSelect.addRange(t.multiSelect.toOrientedRange());t.multiSelect.mergeOverlappingRanges()}else{if(v.multiSelectAction=="forEach"){s=t.forEachSelection(v,u.args)}else{if(v.multiSelectAction=="forEachLine"){s=t.forEachSelection(v,u.args,true)}else{if(v.multiSelectAction=="single"){t.exitMultiSelectMode();s=v.exec(t,u.args||{})}else{s=v.multiSelectAction(t,u.args||{})}}}}return s};this.forEachSelection=function(u,A,z){if(this.inVirtualSelectionMode){return}var B=this.session;var C=this.selection;var v=C.rangeList;var D;var t=C._eventRegistry;C._eventRegistry={};var s=new c(B);this.inVirtualSelectionMode=true;for(var x=v.ranges.length;x--;){if(z){while(x>0&&v.ranges[x].start.row==v.ranges[x-1].end.row){x--}}s.fromOrientedRange(v.ranges[x]);s.id=v.ranges[x].marker;this.selection=B.selection=s;var y=u.exec(this,A||{});if(D!==undefined){D=y}s.toOrientedRange(v.ranges[x])}s.detach();this.selection=B.selection=C;this.inVirtualSelectionMode=false;C._eventRegistry=t;C.mergeOverlappingRanges();var w=this.renderer.$scrollAnimation;this.onCursorChange();this.onSelectionChange();if(w&&w.from==w.to){this.renderer.animateScrolling(w.from)}return D};this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode){return}this.multiSelect.toSingleRange()};this.getSelectedText=function(){var w="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges;var u=[];for(var v=0;vs.length||t.length<2||!t[1]){return this.commands.exec("insertstring",this,x)}for(var v=s.length;v--;){var u=s[v];if(!u.isEmpty()){this.session.remove(u)}this.session.insert(u.start,t[v])}};this.findAll=function(x,u,t){u=u||{};u.needle=x||u.needle;this.$search.set(u);var s=this.$search.findAll(this.session);if(!s.length){return 0}this.$blockScrolling+=1;var w=this.multiSelect;if(!t){w.toSingleRange(s[0])}for(var v=s.length;v--;){w.addRange(s[v],true)}this.$blockScrolling-=1;return s.length};this.selectMoreLines=function(t,A){var w=this.selection.toOrientedRange();var B=w.cursor==w.end;var z=this.session.documentToScreenPosition(w.cursor);if(this.selection.$desiredColumn){z.column=this.selection.$desiredColumn}var x=this.session.screenToDocumentPosition(z.row+t,z.column);if(!w.isEmpty()){var u=this.session.documentToScreenPosition(B?w.end:w.start);var v=this.session.screenToDocumentPosition(u.row+t,u.column)}else{var v=x}if(B){var y=o.fromPoints(x,v);y.cursor=y.start}else{var y=o.fromPoints(v,x);y.cursor=y.end}y.desiredColumn=z.column;if(!this.selection.inMultiSelectMode){this.selection.addRange(w)}else{if(A){var s=w.cursor}}this.selection.addRange(y);if(s){this.selection.substractPoint(s)}};this.transposeSelections=function(t){var y=this.session;var x=y.multiSelect;var w=x.ranges;for(var v=w.length;v--;){var s=w[v];if(s.isEmpty()){var u=y.getWordRange(s.start.row,s.start.column);s.start.row=u.start.row;s.start.column=u.start.column;s.end.row=u.end.row;s.end.column=u.end.column}}x.mergeOverlappingRanges();var z=[];for(var v=w.length;v--;){var s=w[v];z.unshift(y.getTextRange(s))}if(t<0){z.unshift(z.pop())}else{z.push(z.shift())}for(var v=w.length;v--;){var s=w[v];var u=s.clone();y.replace(s,z[v]);s.start.row=u.start.row;s.start.column=u.start.column}};this.selectMore=function(u,v){var y=this.session;var w=y.multiSelect;var s=w.toOrientedRange();if(s.isEmpty()){s=y.getWordRange(s.start.row,s.start.column);s.cursor=u==-1?s.start:s.end;this.multiSelect.addRange(s)}var x=y.getTextRange(s);var t=j(y,x,u);if(t){t.cursor=u==-1?t.start:t.end;this.$blockScrolling+=1;this.session.unfold(t);this.multiSelect.addRange(t);this.$blockScrolling-=1;this.renderer.scrollCursorIntoView(null,0.5)}if(v){this.multiSelect.substractPoint(s.cursor)}};this.alignCursors=function(){var z=this.session;var u=z.multiSelect;var t=u.ranges;if(!t.length){var w=this.selection.getRange();var y=w.start.row,x=w.end.row;var B=y==x;if(B){var A=this.session.getLength();var G;do{G=this.session.getLine(x)}while(/[=:]/.test(G)&&++x0);if(y<0){y=0}if(x>=A){x=A-1}}var F=this.session.doc.removeLines(y,x);F=this.$reAlignText(F,B);this.session.doc.insert({row:y,column:0},F.join("\n")+"\n");if(!B){w.start.column=0;w.end.column=F[F.length-1].length}this.selection.setRange(w)}else{var E=-1;var v=t.filter(function(H){if(H.cursor.row==E){return true}E=H.cursor.row});u.$onRemoveRange(v);var C=0;var D=Infinity;var s=t.map(function(J){var K=J.cursor;var H=z.getLine(K.row);var I=H.substr(K.column).search(/\S/g);if(I==-1){I=0}if(K.column>C){C=K.column}if(IL){z.insert(K,r.stringRepeat(" ",H-L))}else{z.remove(new o(K.row,K.column,K.row,K.column-H+L))}J.start.column=J.end.column=C;J.start.row=J.end.row=K.row;J.cursor=J.end});u.fromOrientedRange(t[0]);this.renderer.updateCursor();this.renderer.updateBackMarkers()}};this.$reAlignText=function(C,v){var s=true,u=true;var x,y,B;return C.map(function(E){var D=E.match(/(\s*)(.*?)(\s*)([=:].*)/);if(!D){return[E]}if(x==null){x=D[1].length;y=D[2].length;B=D[3].length;return D}if(x+y+B!=D[1].length+D[2].length+D[3].length){u=false}if(x!=D[1].length){s=false}if(x>D[1].length){x=D[1].length}if(yD[3].length){B=D[3].length}return D}).map(v?t:s?u?A:t:w);function z(D){return r.stringRepeat(" ",D)}function t(D){return !D[2]?D[0]:z(x)+D[2]+z(y-D[2].length+B)+D[4].replace(/^([=:])\s+/,"$1 ")}function A(D){return !D[2]?D[0]:z(x+y-D[2].length)+D[2]+z(B," ")+D[4].replace(/^([=:])\s+/,"$1 ")}function w(D){return !D[2]?D[0]:z(x)+D[2]+z(B)+D[4].replace(/^([=:])\s+/,"$1 ")}}}).call(l.prototype);function p(t,s){return t.row==s.row&&t.column==s.column}q.onSessionChange=function(u){var t=u.session;if(!t.multiSelect){t.$selectionMarkers=[];t.selection.$initRangeList();t.multiSelect=t.selection}this.multiSelect=t.multiSelect;var s=u.oldSession;if(s){s.multiSelect.removeEventListener("addRange",this.$onAddRange);s.multiSelect.removeEventListener("removeRange",this.$onRemoveRange);s.multiSelect.removeEventListener("multiSelect",this.$onMultiSelect);s.multiSelect.removeEventListener("singleSelect",this.$onSingleSelect)}t.multiSelect.on("addRange",this.$onAddRange);t.multiSelect.on("removeRange",this.$onRemoveRange);t.multiSelect.on("multiSelect",this.$onMultiSelect);t.multiSelect.on("singleSelect",this.$onSingleSelect);if(this.inMultiSelectMode!=t.selection.inMultiSelectMode){if(t.selection.inMultiSelectMode){this.$onMultiSelect()}else{this.$onSingleSelect()}}};function k(s){if(s.$multiselectOnSessionChange){return}s.$onAddRange=s.$onAddRange.bind(s);s.$onRemoveRange=s.$onRemoveRange.bind(s);s.$onMultiSelect=s.$onMultiSelect.bind(s);s.$onSingleSelect=s.$onSingleSelect.bind(s);s.$multiselectOnSessionChange=q.onSessionChange.bind(s);s.$multiselectOnSessionChange(s);s.on("changeSession",s.$multiselectOnSessionChange);s.on("mousedown",e);s.commands.addCommands(d.defaultCommands);i(s)}function i(t){var s=t.textInput.getElement();var v=false;m.addListener(s,"keydown",function(w){if(w.keyCode==18&&!(w.ctrlKey||w.shiftKey||w.metaKey)){if(!v){t.renderer.setMouseCursor("crosshair");v=true}}else{if(v){u()}}});m.addListener(s,"keyup",u);m.addListener(s,"blur",u);function u(w){if(v){t.renderer.setMouseCursor("");v=false}}}q.MultiSelect=k;g("./config").defineOptions(l.prototype,"editor",{enableMultiselect:{set:function(s){k(this);if(s){this.on("changeSession",this.$multiselectOnSessionChange);this.on("mousedown",e)}else{this.off("changeSession",this.$multiselectOnSessionChange);this.off("mousedown",e)}},value:true}})});define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config"],function(h,r,c){h("./lib/fixoldbrowsers");var n=h("./lib/oop");var m=h("./lib/dom");var s=h("./lib/lang");var l=h("./lib/useragent");var b=h("./keyboard/textinput").TextInput;var p=h("./mouse/mouse_handler").MouseHandler;var d=h("./mouse/fold_handler").FoldHandler;var f=h("./keyboard/keybinding").KeyBinding;var a=h("./edit_session").EditSession;var g=h("./search").Search;var o=h("./range").Range;var e=h("./lib/event_emitter").EventEmitter;var j=h("./commands/command_manager").CommandManager;var i=h("./commands/default_commands").commands;var q=h("./config");var k=function(u,v){var t=u.getContainerElement();this.container=t;this.renderer=u;this.commands=new j(l.isMac?"mac":"win",i);this.textInput=new b(u.getTextAreaContainer(),this);this.renderer.textarea=this.textInput.getElement();this.keyBinding=new f(this);this.$mouseHandler=new p(this);new d(this);this.$blockScrolling=0;this.$search=new g().set({wrap:true});this.$historyTracker=this.$historyTracker.bind(this);this.commands.on("exec",this.$historyTracker);this.$initOperationListeners();this._$emitInputEvent=s.delayedCall(function(){this._signal("input",{});this.session.bgTokenizer&&this.session.bgTokenizer.scheduleStart()}.bind(this));this.on("change",function(x,w){w._$emitInputEvent.schedule(31)});this.setSession(v||new a(""));q.resetOptions(this);q._signal("editor",this)};(function(){n.implement(this,e);this.$initOperationListeners=function(){function t(u){return u[u.length-1]}this.selections=[];this.commands.on("exec",function(v){this.startOperation(v);var w=v.command;if(w.aceCommandGroup=="fileJump"){var u=this.prevOp;if(!u||u.command.aceCommandGroup!="fileJump"){this.lastFileJumpPos=t(this.selections)}}else{this.lastFileJumpPos=null}}.bind(this),true);this.commands.on("afterExec",function(u){var v=u.command;if(v.aceCommandGroup=="fileJump"){if(this.lastFileJumpPos&&!this.curOp.selectionChanged){this.selection.fromJSON(this.lastFileJumpPos)}}this.endOperation(u)}.bind(this),true);this.$opResetTimer=s.delayedCall(this.endOperation.bind(this));this.on("change",function(){this.curOp||this.startOperation();this.curOp.docChanged=true}.bind(this),true);this.on("changeSelection",function(){this.curOp||this.startOperation();this.curOp.selectionChanged=true}.bind(this),true)};this.curOp=null;this.prevOp={};this.startOperation=function(u){if(this.curOp){if(!u||this.curOp.command){return}this.prevOp=this.curOp}if(!u){this.previousCommand=null;u={}}this.$opResetTimer.schedule();this.curOp={command:u.command||{},args:u.args,scrollTop:this.renderer.scrollTop};var t=this.curOp.command;if(t&&t.scrollIntoView){this.$blockScrolling++}this.selections.push(this.selection.toJSON())};this.endOperation=function(){if(this.curOp){var v=this.curOp.command;if(v&&v.scrollIntoView){this.$blockScrolling--;switch(v.scrollIntoView){case"center":this.renderer.scrollCursorIntoView(null,0.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var t=this.selection.getRange();var u=this.renderer.layerConfig;if(t.start.row>=u.lastRow||t.end.row<=u.firstRow){this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead)}break;default:break}if(v.scrollIntoView=="animate"){this.renderer.animateScrolling(this.curOp.scrollTop)}}this.prevOp=this.curOp;this.curOp=null}};this.$historyTracker=function(v){if(!this.$mergeUndoDeltas){return}var u=this.prevOp;var t=["backspace","del","insertstring"];var x=u.command&&(v.command.name==u.command.name);if(v.command.name=="insertstring"){var w=v.args;if(this.mergeNextCommand===undefined){this.mergeNextCommand=true}x=x&&this.mergeNextCommand&&(!/\s/.test(w)||/\s/.test(u.args));this.mergeNextCommand=true}else{x=x&&t.indexOf(v.command.name)!==-1}if(this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2000){x=false}if(x){this.session.mergeUndoDeltas=true}else{if(t.indexOf(v.command.name)!==-1){this.sequenceStartTime=Date.now()}}};this.setKeyboardHandler=function(u){if(!u){this.keyBinding.setKeyboardHandler(null)}else{if(typeof u==="string"){this.$keybindingId=u;var t=this;q.loadModule(["keybinding",u],function(v){if(t.$keybindingId==u){t.keyBinding.setKeyboardHandler(v&&v.handler)}})}else{this.$keybindingId=null;this.keyBinding.setKeyboardHandler(u)}}};this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()};this.setSession=function(v){if(this.session==v){return}var u=this.session;if(u){this.session.removeEventListener("change",this.$onDocumentChange);this.session.removeEventListener("changeMode",this.$onChangeMode);this.session.removeEventListener("tokenizerUpdate",this.$onTokenizerUpdate);this.session.removeEventListener("changeTabSize",this.$onChangeTabSize);this.session.removeEventListener("changeWrapLimit",this.$onChangeWrapLimit);this.session.removeEventListener("changeWrapMode",this.$onChangeWrapMode);this.session.removeEventListener("onChangeFold",this.$onChangeFold);this.session.removeEventListener("changeFrontMarker",this.$onChangeFrontMarker);this.session.removeEventListener("changeBackMarker",this.$onChangeBackMarker);this.session.removeEventListener("changeBreakpoint",this.$onChangeBreakpoint);this.session.removeEventListener("changeAnnotation",this.$onChangeAnnotation);this.session.removeEventListener("changeOverwrite",this.$onCursorChange);this.session.removeEventListener("changeScrollTop",this.$onScrollTopChange);this.session.removeEventListener("changeScrollLeft",this.$onScrollLeftChange);var t=this.session.getSelection();t.removeEventListener("changeCursor",this.$onCursorChange);t.removeEventListener("changeSelection",this.$onSelectionChange)}this.session=v;if(v){this.$onDocumentChange=this.onDocumentChange.bind(this);v.addEventListener("change",this.$onDocumentChange);this.renderer.setSession(v);this.$onChangeMode=this.onChangeMode.bind(this);v.addEventListener("changeMode",this.$onChangeMode);this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this);v.addEventListener("tokenizerUpdate",this.$onTokenizerUpdate);this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer);v.addEventListener("changeTabSize",this.$onChangeTabSize);this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this);v.addEventListener("changeWrapLimit",this.$onChangeWrapLimit);this.$onChangeWrapMode=this.onChangeWrapMode.bind(this);v.addEventListener("changeWrapMode",this.$onChangeWrapMode);this.$onChangeFold=this.onChangeFold.bind(this);v.addEventListener("changeFold",this.$onChangeFold);this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this);this.session.addEventListener("changeFrontMarker",this.$onChangeFrontMarker);this.$onChangeBackMarker=this.onChangeBackMarker.bind(this);this.session.addEventListener("changeBackMarker",this.$onChangeBackMarker);this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this);this.session.addEventListener("changeBreakpoint",this.$onChangeBreakpoint);this.$onChangeAnnotation=this.onChangeAnnotation.bind(this);this.session.addEventListener("changeAnnotation",this.$onChangeAnnotation);this.$onCursorChange=this.onCursorChange.bind(this);this.session.addEventListener("changeOverwrite",this.$onCursorChange);this.$onScrollTopChange=this.onScrollTopChange.bind(this);this.session.addEventListener("changeScrollTop",this.$onScrollTopChange);this.$onScrollLeftChange=this.onScrollLeftChange.bind(this);this.session.addEventListener("changeScrollLeft",this.$onScrollLeftChange);this.selection=v.getSelection();this.selection.addEventListener("changeCursor",this.$onCursorChange);this.$onSelectionChange=this.onSelectionChange.bind(this);this.selection.addEventListener("changeSelection",this.$onSelectionChange);this.onChangeMode();this.$blockScrolling+=1;this.onCursorChange();this.$blockScrolling-=1;this.onScrollTopChange();this.onScrollLeftChange();this.onSelectionChange();this.onChangeFrontMarker();this.onChangeBackMarker();this.onChangeBreakpoint();this.onChangeAnnotation();this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit();this.renderer.updateFull()}this._signal("changeSession",{session:v,oldSession:u});u&&u._signal("changeEditor",{oldEditor:this});v&&v._signal("changeEditor",{editor:this})};this.getSession=function(){return this.session};this.setValue=function(t,u){this.session.doc.setValue(t);if(!u){this.selectAll()}else{if(u==1){this.navigateFileEnd()}else{if(u==-1){this.navigateFileStart()}}}return t};this.getValue=function(){return this.session.getValue()};this.getSelection=function(){return this.selection};this.resize=function(t){this.renderer.onResize(t)};this.setTheme=function(u,t){this.renderer.setTheme(u,t)};this.getTheme=function(){return this.renderer.getTheme()};this.setStyle=function(t){this.renderer.setStyle(t)};this.unsetStyle=function(t){this.renderer.unsetStyle(t)};this.getFontSize=function(){return this.getOption("fontSize")||m.computedStyle(this.container,"fontSize")};this.setFontSize=function(t){this.setOption("fontSize",t)};this.$highlightBrackets=function(){if(this.session.$bracketHighlight){this.session.removeMarker(this.session.$bracketHighlight);this.session.$bracketHighlight=null}if(this.$highlightPending){return}var t=this;this.$highlightPending=true;setTimeout(function(){t.$highlightPending=false;var v=t.session.findMatchingBracket(t.getCursorPosition());if(v){var u=new o(v.row,v.column,v.row,v.column+1)}else{if(t.session.$mode.getMatching){var u=t.session.$mode.getMatching(t.session)}}if(u){t.session.$bracketHighlight=t.session.addMarker(u,"ace_bracket","text")}},50)};this.focus=function(){var t=this;setTimeout(function(){t.textInput.focus()});this.textInput.focus()};this.isFocused=function(){return this.textInput.isFocused()};this.blur=function(){this.textInput.blur()};this.onFocus=function(){if(this.$isFocused){return}this.$isFocused=true;this.renderer.showCursor();this.renderer.visualizeFocus();this._emit("focus")};this.onBlur=function(){if(!this.$isFocused){return}this.$isFocused=false;this.renderer.hideCursor();this.renderer.visualizeBlur();this._emit("blur")};this.$cursorChange=function(){this.renderer.updateCursor()};this.onDocumentChange=function(v){var w=v.data;var t=w.range;var u;if(t.start.row==t.end.row&&w.action!="insertLines"&&w.action!="removeLines"){u=t.end.row}else{u=Infinity}this.renderer.updateLines(t.start.row,u);this._signal("change",v);this.$cursorChange()};this.onTokenizerUpdate=function(u){var t=u.data;this.renderer.updateLines(t.first,t.last)};this.onScrollTopChange=function(){this.renderer.scrollToY(this.session.getScrollTop())};this.onScrollLeftChange=function(){this.renderer.scrollToX(this.session.getScrollLeft())};this.onCursorChange=function(){this.$cursorChange();if(!this.$blockScrolling){this.renderer.scrollCursorIntoView()}this.$highlightBrackets();this.$updateHighlightActiveLine();this._signal("changeSelection")};this.$updateHighlightActiveLine=function(){var v=this.getSession();var u;if(this.$highlightActiveLine){if((this.$selectionStyle!="line"||!this.selection.isMultiLine())){u=this.getCursorPosition()}if(this.renderer.$maxLines&&this.session.getLength()===1&&!(this.renderer.$minLines>1)){u=false}}if(v.$highlightLineMarker&&!u){v.removeMarker(v.$highlightLineMarker.id);v.$highlightLineMarker=null}else{if(!v.$highlightLineMarker&&u){var t=new o(u.row,u.column,u.row,Infinity);t.id=v.addMarker(t,"ace_active-line","screenLine");v.$highlightLineMarker=t}else{if(u){v.$highlightLineMarker.start.row=u.row;v.$highlightLineMarker.end.row=u.row;v.$highlightLineMarker.start.column=u.column;v._signal("changeBackMarker")}}}};this.onSelectionChange=function(x){var w=this.session;if(w.$selectionMarker){w.removeMarker(w.$selectionMarker)}w.$selectionMarker=null;if(!this.selection.isEmpty()){var t=this.selection.getRange();var v=this.getSelectionStyle();w.$selectionMarker=w.addMarker(t,"ace_selection",v)}else{this.$updateHighlightActiveLine()}var u=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(u);this._signal("changeSelection")};this.$getSelectionHighLightRegexp=function(){var z=this.session;var w=this.getSelectionRange();if(w.isEmpty()||w.isMultiLine()){return}var A=w.start.column-1;var y=w.end.column+1;var u=z.getLine(w.start.row);var t=u.length;var x=u.substring(Math.max(A,0),Math.min(y,t));if((A>=0&&/^[\w\d]/.test(x))||(y<=t&&/[\w\d]$/.test(x))){return}x=u.substring(w.start.column,w.end.column);if(!/^[\w\d]+$/.test(x)){return}var v=this.$search.$assembleRegExp({wholeWord:true,caseSensitive:true,needle:x});return v};this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()};this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()};this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()};this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())};this.onChangeMode=function(t){this.renderer.updateText();this._emit("changeMode",t)};this.onChangeWrapLimit=function(){this.renderer.updateFull()};this.onChangeWrapMode=function(){this.renderer.onResize(true)};this.onChangeFold=function(){this.$updateHighlightActiveLine();this.renderer.updateFull()};this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())};this.getCopyText=function(){var t=this.getSelectedText();this._signal("copy",t);return t};this.onCopy=function(){this.commands.exec("copy",this)};this.onCut=function(){this.commands.exec("cut",this)};this.onPaste=function(u){if(this.$readOnly){return}var t={text:u};this._signal("paste",t);this.insert(t.text,true)};this.execCommand=function(u,t){this.commands.exec(u,this,t)};this.insert=function(D,B){var C=this.session;var z=C.getMode();var E=this.getCursorPosition();if(this.getBehavioursEnabled()&&!B){var v=z.transformAction(C.getState(E.row),"insertion",this,C,D);if(v){if(D!==v.text){this.session.mergeUndoDeltas=false;this.$mergeNextCommand=false}D=v.text}}if(D=="\t"){D=this.session.getTabString()}if(!this.selection.isEmpty()){var y=this.getSelectionRange();E=this.session.remove(y);this.clearSelection()}else{if(this.session.getOverwrite()){var y=new o.fromPoints(E,E);y.end.column+=D.length;this.session.remove(y)}}if(D=="\n"||D=="\r\n"){var G=C.getLine(E.row);if(E.column>G.search(/\S|$/)){var A=G.substr(E.column).search(/\S|$/);C.doc.removeInLine(E.row,E.column,E.column+A)}}this.clearSelection();var u=E.column;var x=C.getState(E.row);var G=C.getLine(E.row);var F=z.checkOutdent(x,G,D);var w=C.insert(E,D);if(v&&v.selection){if(v.selection.length==2){this.selection.setSelectionRange(new o(E.row,u+v.selection[0],E.row,u+v.selection[1]))}else{this.selection.setSelectionRange(new o(E.row+v.selection[0],v.selection[1],E.row+v.selection[2],v.selection[3]))}}if(C.getDocument().isNewLine(D)){var t=z.getNextLineIndent(x,G.slice(0,E.column),C.getTabString());C.insert({row:E.row+1,column:0},t)}if(F){z.autoOutdent(x,C,E.row)}};this.onTextInput=function(t){this.keyBinding.onTextInput(t)};this.onCommandKey=function(v,t,u){this.keyBinding.onCommandKey(v,t,u)};this.setOverwrite=function(t){this.session.setOverwrite(t)};this.getOverwrite=function(){return this.session.getOverwrite()};this.toggleOverwrite=function(){this.session.toggleOverwrite()};this.setScrollSpeed=function(t){this.setOption("scrollSpeed",t)};this.getScrollSpeed=function(){return this.getOption("scrollSpeed")};this.setDragDelay=function(t){this.setOption("dragDelay",t)};this.getDragDelay=function(){return this.getOption("dragDelay")};this.setSelectionStyle=function(t){this.setOption("selectionStyle",t)};this.getSelectionStyle=function(){return this.getOption("selectionStyle")};this.setHighlightActiveLine=function(t){this.setOption("highlightActiveLine",t)};this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")};this.setHighlightGutterLine=function(t){this.setOption("highlightGutterLine",t)};this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")};this.setHighlightSelectedWord=function(t){this.setOption("highlightSelectedWord",t)};this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord};this.setAnimatedScroll=function(t){this.renderer.setAnimatedScroll(t)};this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()};this.setShowInvisibles=function(t){this.renderer.setShowInvisibles(t)};this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()};this.setDisplayIndentGuides=function(t){this.renderer.setDisplayIndentGuides(t)};this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()};this.setShowPrintMargin=function(t){this.renderer.setShowPrintMargin(t)};this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()};this.setPrintMarginColumn=function(t){this.renderer.setPrintMarginColumn(t)};this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()};this.setReadOnly=function(t){this.setOption("readOnly",t)};this.getReadOnly=function(){return this.getOption("readOnly")};this.setBehavioursEnabled=function(t){this.setOption("behavioursEnabled",t)};this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")};this.setWrapBehavioursEnabled=function(t){this.setOption("wrapBehavioursEnabled",t)};this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")};this.setShowFoldWidgets=function(t){this.setOption("showFoldWidgets",t)};this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")};this.setFadeFoldWidgets=function(t){this.setOption("fadeFoldWidgets",t)};this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")};this.remove=function(v){if(this.selection.isEmpty()){if(v=="left"){this.selection.selectLeft()}else{this.selection.selectRight()}}var u=this.getSelectionRange();if(this.getBehavioursEnabled()){var x=this.session;var w=x.getState(u.start.row);var z=x.getMode().transformAction(w,"deletion",this,x,u);if(u.end.column===0){var y=x.getTextRange(u);if(y[y.length-1]=="\n"){var t=x.getLine(u.end.row);if(/^\s+$/.test(t)){u.end.column=t.length}}}if(z){u=z}}this.session.remove(u);this.clearSelection()};this.removeWordRight=function(){if(this.selection.isEmpty()){this.selection.selectWordRight()}this.session.remove(this.getSelectionRange());this.clearSelection()};this.removeWordLeft=function(){if(this.selection.isEmpty()){this.selection.selectWordLeft()}this.session.remove(this.getSelectionRange());this.clearSelection()};this.removeToLineStart=function(){if(this.selection.isEmpty()){this.selection.selectLineStart()}this.session.remove(this.getSelectionRange());this.clearSelection()};this.removeToLineEnd=function(){if(this.selection.isEmpty()){this.selection.selectLineEnd()}var t=this.getSelectionRange();if(t.start.column==t.end.column&&t.start.row==t.end.row){t.end.column=0;t.end.row++}this.session.remove(t);this.clearSelection()};this.splitLine=function(){if(!this.selection.isEmpty()){this.session.remove(this.getSelectionRange());this.clearSelection()}var t=this.getCursorPosition();this.insert("\n");this.moveCursorToPosition(t)};this.transposeLetters=function(){if(!this.selection.isEmpty()){return}var x=this.getCursorPosition();var v=x.column;if(v===0){return}var t=this.session.getLine(x.row);var w,u;if(vz.toLowerCase()){return 1}return 0});var u=new o(0,0,0,0);for(var w=x.first;w<=x.last;w++){var t=y.getLine(w);u.start.row=w;u.end.row=w;u.end.column=t.length;y.replace(u,v[w-x.first])}};this.toggleCommentLines=function(){var u=this.session.getState(this.getCursorPosition().row);var t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(u,this.session,t.first,t.last)};this.toggleBlockComment=function(){var v=this.getCursorPosition();var u=this.session.getState(v.row);var t=this.getSelectionRange();this.session.getMode().toggleBlockComment(u,this.session,t,v)};this.getNumberAt=function(y,w){var u=/[\-]?[0-9]+(?:\.[0-9]+)?/g;u.lastIndex=0;var v=this.session.getLine(y);while(u.lastIndex=w){var x={value:t[0],start:t.index,end:t.index+t[0].length};return x}}return null};this.modifyNumber=function(w){var E=this.selection.getCursor().row;var v=this.selection.getCursor().column;var D=new o(E,v-1,E,v);var z=this.session.getTextRange(D);if(!isNaN(parseFloat(z))&&isFinite(z)){var A=this.getNumberAt(E,v);if(A){var x=A.value.indexOf(".")>=0?A.start+A.value.indexOf(".")+1:A.end;var u=A.start+A.value.length-x;var C=parseFloat(A.value);C*=Math.pow(10,u);if(x!==A.end&&v=w){t[v].moveBy(z,0);v--}}A.fromOrientedRange(A.ranges[0]);A.rangeList.attach(this.session)}};this.$getSelectedRows=function(){var t=this.getSelectionRange().collapseRows();return{first:this.session.getRowFoldStart(t.start.row),last:this.session.getRowFoldEnd(t.end.row)}};this.onCompositionStart=function(t){this.renderer.showComposition(this.getCursorPosition())};this.onCompositionUpdate=function(t){this.renderer.setCompositionText(t)};this.onCompositionEnd=function(){this.renderer.hideComposition()};this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()};this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()};this.isRowVisible=function(t){return(t>=this.getFirstVisibleRow()&&t<=this.getLastVisibleRow())};this.isRowFullyVisible=function(t){return(t>=this.renderer.getFirstFullyVisibleRow()&&t<=this.renderer.getLastFullyVisibleRow())};this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1};this.$moveByPage=function(v,t){var x=this.renderer;var u=this.renderer.layerConfig;var w=v*Math.floor(u.height/u.lineHeight);this.$blockScrolling++;if(t===true){this.selection.$moveSelection(function(){this.moveCursorBy(w,0)})}else{if(t===false){this.selection.moveCursorBy(w,0);this.selection.clearSelection()}}this.$blockScrolling--;var y=x.scrollTop;x.scrollBy(0,w*u.lineHeight);if(t!=null){x.scrollCursorIntoView(null,0.5)}x.animateScrolling(y)};this.selectPageDown=function(){this.$moveByPage(1,true)};this.selectPageUp=function(){this.$moveByPage(-1,true)};this.gotoPageDown=function(){this.$moveByPage(1,false)};this.gotoPageUp=function(){this.$moveByPage(-1,false)};this.scrollPageDown=function(){this.$moveByPage(1)};this.scrollPageUp=function(){this.$moveByPage(-1)};this.scrollToRow=function(t){this.renderer.scrollToRow(t)};this.scrollToLine=function(u,t,v,w){this.renderer.scrollToLine(u,t,v,w)};this.centerSelection=function(){var t=this.getSelectionRange();var u={row:Math.floor(t.start.row+(t.end.row-t.start.row)/2),column:Math.floor(t.start.column+(t.end.column-t.start.column)/2)};this.renderer.alignCursor(u,0.5)};this.getCursorPosition=function(){return this.selection.getCursor()};this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())};this.getSelectionRange=function(){return this.selection.getRange()};this.selectAll=function(){this.$blockScrolling+=1;this.selection.selectAll();this.$blockScrolling-=1};this.clearSelection=function(){this.selection.clearSelection()};this.moveCursorTo=function(u,t){this.selection.moveCursorTo(u,t)};this.moveCursorToPosition=function(t){this.selection.moveCursorToPosition(t)};this.jumpToMatching=function(t){var v=this.getCursorPosition();var u=this.session.getBracketRange(v);if(!u){u=this.find({needle:/[{}()\[\]]/g,preventScroll:true,start:{row:v.row,column:v.column-1}});if(!u){return}var w=u.start;if(w.row==v.row&&Math.abs(w.column-v.column)<2){u=this.session.getBracketRange(w)}}w=u&&u.cursor||w;if(w){if(t){if(u&&u.isEqual(this.getSelectionRange())){this.clearSelection()}else{this.selection.selectTo(w.row,w.column)}}else{this.selection.moveTo(w.row,w.column)}}};this.gotoLine=function(t,v,u){this.selection.clearSelection();this.session.unfold({row:t-1,column:v||0});this.$blockScrolling+=1;this.exitMultiSelectMode&&this.exitMultiSelectMode();this.moveCursorTo(t-1,v||0);this.$blockScrolling-=1;if(!this.isRowFullyVisible(t-1)){this.scrollToLine(t-1,true,u)}};this.navigateTo=function(u,t){this.selection.moveTo(u,t)};this.navigateUp=function(u){if(this.selection.isMultiLine()&&!this.selection.isBackwards()){var t=this.selection.anchor.getPosition();return this.moveCursorToPosition(t)}this.selection.clearSelection();this.selection.moveCursorBy(-u||-1,0)};this.navigateDown=function(u){if(this.selection.isMultiLine()&&this.selection.isBackwards()){var t=this.selection.anchor.getPosition();return this.moveCursorToPosition(t)}this.selection.clearSelection();this.selection.moveCursorBy(u||1,0)};this.navigateLeft=function(u){if(!this.selection.isEmpty()){var t=this.getSelectionRange().start;this.moveCursorToPosition(t)}else{u=u||1;while(u--){this.selection.moveCursorLeft()}}this.clearSelection()};this.navigateRight=function(u){if(!this.selection.isEmpty()){var t=this.getSelectionRange().end;this.moveCursorToPosition(t)}else{u=u||1;while(u--){this.selection.moveCursorRight()}}this.clearSelection()};this.navigateLineStart=function(){this.selection.moveCursorLineStart();this.clearSelection()};this.navigateLineEnd=function(){this.selection.moveCursorLineEnd();this.clearSelection()};this.navigateFileEnd=function(){this.selection.moveCursorFileEnd();this.clearSelection()};this.navigateFileStart=function(){this.selection.moveCursorFileStart();this.clearSelection()};this.navigateWordRight=function(){this.selection.moveCursorWordRight();this.clearSelection()};this.navigateWordLeft=function(){this.selection.moveCursorWordLeft();this.clearSelection()};this.replace=function(v,u){if(u){this.$search.set(u)}var t=this.$search.find(this.session);var w=0;if(!t){return w}if(this.$tryReplace(t,v)){w=1}if(t!==null){this.selection.setSelectionRange(t);this.renderer.scrollSelectionIntoView(t.start,t.end)}return w};this.replaceAll=function(x,u){if(u){this.$search.set(u)}var t=this.$search.findAll(this.session);var y=0;if(!t.length){return y}this.$blockScrolling+=1;var w=this.getSelectionRange();this.selection.moveTo(0,0);for(var v=t.length-1;v>=0;--v){if(this.$tryReplace(t[v],x)){y++}}this.selection.setSelectionRange(w);this.$blockScrolling-=1;return y};this.$tryReplace=function(u,v){var t=this.session.getTextRange(u);v=this.$search.replace(t,v);if(v!==null){u.end=this.session.replace(u,v);return u}else{return null}};this.getLastSearchOptions=function(){return this.$search.getOptions()};this.find=function(x,w,u){if(!w){w={}}if(typeof x=="string"||x instanceof RegExp){w.needle=x}else{if(typeof x=="object"){n.mixin(w,x)}}var t=this.selection.getRange();if(w.needle==null){x=this.session.getTextRange(t)||this.$search.$options.needle;if(!x){t=this.session.getWordRange(t.start.row,t.start.column);x=this.session.getTextRange(t)}this.$search.set({needle:x})}this.$search.set(w);if(!w.start){this.$search.set({start:t})}var v=this.$search.find(this.session);if(w.preventScroll){return v}if(v){this.revealRange(v,u);return v}if(w.backwards){t.start=t.end}else{t.end=t.start}this.selection.setRange(t)};this.findNext=function(u,t){this.find({skipCurrent:true,backwards:false},u,t)};this.findPrevious=function(u,t){this.find(u,{skipCurrent:true,backwards:true},t)};this.revealRange=function(u,t){this.$blockScrolling+=1;this.session.unfold(u);this.selection.setSelectionRange(u);this.$blockScrolling-=1;var v=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(u.start,u.end,0.5);if(t!==false){this.renderer.animateScrolling(v)}};this.undo=function(){this.$blockScrolling++;this.session.getUndoManager().undo();this.$blockScrolling--;this.renderer.scrollCursorIntoView(null,0.5)};this.redo=function(){this.$blockScrolling++;this.session.getUndoManager().redo();this.$blockScrolling--;this.renderer.scrollCursorIntoView(null,0.5)};this.destroy=function(){this.renderer.destroy();this._signal("destroy",this)};this.setAutoScrollEditorIntoView=function(v){if(!v){return}var x;var t=this;var w=false;if(!this.$scrollAnchor){this.$scrollAnchor=document.createElement("div")}var z=this.$scrollAnchor;z.style.cssText="position:absolute";this.container.insertBefore(z,this.container.firstChild);var A=this.on("changeSelection",function(){w=true});var y=this.renderer.on("beforeRender",function(){if(w){x=t.renderer.container.getBoundingClientRect()}});var u=this.renderer.on("afterRender",function(){if(w&&x&&t.isFocused()){var C=t.renderer;var E=C.$cursorLayer.$pixelPos;var B=C.layerConfig;var D=E.top-B.offset;if(E.top>=0&&D+x.top<0){w=true}else{if(E.topwindow.innerHeight){w=false}else{w=null}}if(w!=null){z.style.top=D+"px";z.style.left=E.left+"px";z.style.height=B.lineHeight+"px";z.scrollIntoView(w)}w=x=null}});this.setAutoScrollEditorIntoView=function(B){if(B){return}delete this.setAutoScrollEditorIntoView;this.removeEventListener("changeSelection",A);this.renderer.removeEventListener("afterRender",u);this.renderer.removeEventListener("beforeRender",y)}};this.$resetCursorStyle=function(){var t=this.$cursorStyle||"ace";var u=this.renderer.$cursorLayer;if(!u){return}u.setSmoothBlinking(t=="smooth");u.isBlinking=!this.$readOnly&&t!="wide"}}).call(k.prototype);q.defineOptions(k.prototype,"editor",{selectionStyle:{set:function(t){this.onSelectionChange();this._signal("changeSelectionStyle",{data:t})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:true},highlightSelectedWord:{set:function(t){this.$onSelectionChange()},initialValue:true},readOnly:{set:function(t){this.textInput.setReadOnly(t);this.$resetCursorStyle()},initialValue:false},cursorStyle:{set:function(t){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[false,true,"always"],initialValue:true},behavioursEnabled:{initialValue:true},wrapBehavioursEnabled:{initialValue:true},autoScrollEditorIntoView:{set:function(t){this.setAutoScrollEditorIntoView(t)}},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",foldStyle:"session",mode:"session"});r.Editor=k});define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event"],function(c,a,d){var e=c("../lib/event");function b(h,g){return h.row==g.row&&h.column==g.column}function f(A){var B=A.domEvent;var D=B.altKey;var w=B.shiftKey;var r=A.getAccelKey();var g=A.getButton();if(A.editor.inMultiSelectMode&&g==2){A.editor.textInput.onContextMenu(A.domEvent);return}if(!r&&!D){if(g===0&&A.editor.inMultiSelectMode){A.editor.exitMultiSelectMode()}return}var l=A.editor;var E=l.selection;var C=l.inMultiSelectMode;var o=A.getDocumentPosition();var m=E.getCursor();var x=A.inSelection()||(E.isEmpty()&&b(o,m));var q=A.x,p=A.y;var n=function(F){q=F.clientX;p=F.clientY};var j=function(){var G=l.renderer.pixelToScreenCoordinates(q,p);var F=h.screenToDocumentPosition(G.row,G.column);if(b(u,G)&&b(F,E.selectionLead)){return}u=G;l.selection.moveToPosition(F);l.renderer.scrollCursorIntoView();l.removeSelectionMarkers(z);z=E.rectangularRangeBlock(u,k);z.forEach(l.addSelectionMarker,l);l.updateSelectionMarkers()};var h=l.session;var k=l.renderer.pixelToScreenCoordinates(q,p);var u=k;if(r&&!D&&!w&&g===0){if(!C&&x){return}if(!C){var v=E.toOrientedRange();l.addSelectionMarker(v)}var t=E.rangeList.rangeAtPoint(o);l.$blockScrolling++;l.once("mouseup",function(){var F=E.toOrientedRange();if(t&&F.isEmpty()&&b(t.cursor,F.cursor)){E.substractPoint(F.cursor)}else{if(v){l.removeSelectionMarker(v);E.addRange(v)}E.addRange(F)}l.$blockScrolling--})}else{if(D&&g===0){A.stop();if(C&&!r){E.toSingleRange()}else{if(!C&&r){E.addRange()}}var z=[];if(w){k=h.documentToScreenPosition(E.lead);j()}else{E.moveToPosition(o)}var i=function(G){clearInterval(s);l.removeSelectionMarkers(z);for(var F=0;F=0)&&parseFloat(navigator.userAgent.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:|MSIE )([0-9]+[\.0-9]+)/)[1]);a.isOldIE=a.isIE&&a.isIE<9;a.isGecko=a.isMozilla=window.controllers&&window.navigator.product==="Gecko";a.isOldGecko=a.isGecko&&parseInt((navigator.userAgent.match(/rv\:(\d+)/)||[])[1],10)<4;a.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]";a.isWebKit=parseFloat(c.split("WebKit/")[1])||undefined;a.isChrome=parseFloat(c.split(" Chrome/")[1])||undefined;a.isAIR=c.indexOf("AdobeAIR")>=0;a.isIPad=c.indexOf("iPad")>=0;a.isTouchPad=c.indexOf("TouchPad")>=0});define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"],function(b,a,c){a.defaultCommands=[{name:"addCursorAbove",exec:function(e){e.selectMoreLines(-1)},bindKey:{win:"Ctrl-Alt-Up",mac:"Ctrl-Alt-Up"},readonly:true},{name:"addCursorBelow",exec:function(e){e.selectMoreLines(1)},bindKey:{win:"Ctrl-Alt-Down",mac:"Ctrl-Alt-Down"},readonly:true},{name:"addCursorAboveSkipCurrent",exec:function(e){e.selectMoreLines(-1,true)},bindKey:{win:"Ctrl-Alt-Shift-Up",mac:"Ctrl-Alt-Shift-Up"},readonly:true},{name:"addCursorBelowSkipCurrent",exec:function(e){e.selectMoreLines(1,true)},bindKey:{win:"Ctrl-Alt-Shift-Down",mac:"Ctrl-Alt-Shift-Down"},readonly:true},{name:"selectMoreBefore",exec:function(e){e.selectMore(-1)},bindKey:{win:"Ctrl-Alt-Left",mac:"Ctrl-Alt-Left"},readonly:true},{name:"selectMoreAfter",exec:function(e){e.selectMore(1)},bindKey:{win:"Ctrl-Alt-Right",mac:"Ctrl-Alt-Right"},readonly:true},{name:"selectNextBefore",exec:function(e){e.selectMore(-1,true)},bindKey:{win:"Ctrl-Alt-Shift-Left",mac:"Ctrl-Alt-Shift-Left"},readonly:true},{name:"selectNextAfter",exec:function(e){e.selectMore(1,true)},bindKey:{win:"Ctrl-Alt-Shift-Right",mac:"Ctrl-Alt-Shift-Right"},readonly:true},{name:"splitIntoLines",exec:function(e){e.multiSelect.splitIntoLines()},bindKey:{win:"Ctrl-Alt-L",mac:"Ctrl-Alt-L"},readonly:true},{name:"alignCursors",exec:function(e){e.alignCursors()},bindKey:{win:"Ctrl-Alt-A",mac:"Ctrl-Alt-A"}}];a.multiSelectCommands=[{name:"singleSelection",bindKey:"esc",exec:function(e){e.exitMultiSelectMode()},readonly:true,isAvailable:function(e){return e&&e.inMultiSelectMode}}];var d=b("../keyboard/hash_handler").HashHandler;a.keyboardHandler=new d(a.multiSelectCommands)});define("ace/lib/oop",["require","exports","module"],function(b,a,c){a.inherits=function(e,d){e.super_=d;e.prototype=Object.create(d.prototype,{constructor:{value:e,enumerable:false,writable:true,configurable:true}})};a.mixin=function(f,d){for(var e in d){f[e]=d[e]}return f};a.implement=function(e,d){a.mixin(e,d)}});define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/config"],function(c,a,d){var f=c("../lib/oop");var e=c("../lib/event_emitter").EventEmitter;var b=c("../config");var h=function(j,p,k,q){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this);this.changeListener=this.changeListener.bind(this);this.onMessage=this.onMessage.bind(this);if(c.nameToUrl&&!c.toUrl){c.toUrl=c.nameToUrl}if(b.get("packaged")||!c.toUrl){q=q||b.moduleUrl(p,"worker")}else{var l=this.$normalizePath;q=q||l(c.toUrl("ace/worker/worker.js",null,"_"));var r={};j.forEach(function(s){r[s]=l(c.toUrl(s,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}try{this.$worker=new Worker(q)}catch(n){if(n instanceof window.DOMException){var i=this.$workerBlob(q);var o=window.URL||window.webkitURL;var m=o.createObjectURL(i);this.$worker=new Worker(m);o.revokeObjectURL(m)}else{throw n}}this.$worker.postMessage({init:true,tlns:r,module:p,classname:k});this.callbackId=1;this.callbacks={};this.$worker.onmessage=this.onMessage};(function(){f.implement(this,e);this.onMessage=function(i){var j=i.data;switch(j.type){case"log":window.console&&console.log&&console.log.apply(console,j.data);break;case"event":this._signal(j.name,{data:j.data});break;case"call":var k=this.callbacks[j.id];if(k){k(j.data);delete this.callbacks[j.id]}break}};this.$normalizePath=function(i){if(!location.host){return i}i=i.replace(/^[a-z]+:\/\/[^\/]+/,"");i=location.protocol+"//"+location.host+(i.charAt(0)=="/"?"":location.pathname.replace(/\/[^\/]*$/,""))+"/"+i.replace(/^[\/]+/,"");return i};this.terminate=function(){this._signal("terminate",{});this.deltaQueue=null;this.$worker.terminate();this.$worker=null;this.$doc.removeEventListener("change",this.changeListener);this.$doc=null};this.send=function(j,i){this.$worker.postMessage({command:j,args:i})};this.call=function(j,i,l){if(l){var k=this.callbackId++;this.callbacks[k]=l;i.push(k)}this.send(j,i)};this.emit=function(j,k){try{this.$worker.postMessage({event:j,data:{data:k.data}})}catch(i){}};this.attachToDocument=function(i){if(this.$doc){this.terminate()}this.$doc=i;this.call("setValue",[i.getValue()]);i.on("change",this.changeListener)};this.changeListener=function(i){if(!this.deltaQueue){this.deltaQueue=[i.data];setTimeout(this.$sendDeltaQueue,0)}else{this.deltaQueue.push(i.data)}};this.$sendDeltaQueue=function(){var i=this.deltaQueue;if(!i){return}this.deltaQueue=null;if(i.length>20&&i.length>this.$doc.getLength()>>1){this.call("setValue",[this.$doc.getValue()])}else{this.emit("change",{data:i})}};this.$workerBlob=function(k){var i="importScripts('"+k+"');";try{return new Blob([i],{type:"application/javascript"})}catch(m){var l=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder;var j=new l();j.append(i);return j.getBlob("application/javascript")}}}).call(h.prototype);var g=function(m,l,p){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this);this.changeListener=this.changeListener.bind(this);this.callbackId=1;this.callbacks={};this.messageBuffer=[];var j=null;var o=false;var k=Object.create(e);var i=this;this.$worker={};this.$worker.terminate=function(){};this.$worker.postMessage=function(q){i.messageBuffer.push(q);if(j){if(o){setTimeout(n)}else{n()}}};this.setEmitSync=function(q){o=q};var n=function(){var q=i.messageBuffer.shift();if(q.command){j[q.command].apply(j,q.args)}else{if(q.event){k._signal(q.event,q.data)}}};k.postMessage=function(q){i.onMessage({data:q})};k.callback=function(r,q){this.postMessage({type:"call",id:q,data:r})};k.emit=function(q,r){this.postMessage({type:"event",name:q,data:r})};b.loadModule(["worker",l],function(q){j=new q[p](k);while(i.messageBuffer.length){n()}})};g.prototype=h.prototype;a.UIWorkerClient=g;a.WorkerClient=h});define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(c,a,d){var e=c("./oop");var b=(function(){var g={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,"super":8,meta:8,command:8,cmd:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9","-13":"NumpadEnter",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",188:",",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"}};var f,h;for(h in g.FUNCTION_KEYS){f=g.FUNCTION_KEYS[h].toLowerCase();g[f]=parseInt(h,10)}for(h in g.PRINTABLE_KEYS){f=g.PRINTABLE_KEYS[h].toLowerCase();g[f]=parseInt(h,10)}e.mixin(g,g.MODIFIER_KEYS);e.mixin(g,g.PRINTABLE_KEYS);e.mixin(g,g.FUNCTION_KEYS);g.enter=g["return"];g.escape=g.esc;g.del=g["delete"];g[173]="-";(function(){var k=["cmd","ctrl","alt","shift"];for(var j=Math.pow(2,k.length);j--;){g.KEY_MODS[j]=k.filter(function(i){return j&g.KEY_MODS[i]}).join("-")+"-"}})();return g})();e.mixin(a,b);a.keyCodeToString=function(f){return(b[f]||String.fromCharCode(f)).toLowerCase()}});define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(b,a,c){var f=b("./range").Range;var e=b("./lib/event_emitter").EventEmitter;var d=b("./lib/oop");var g=function(n,m,o,l,i,k){var h=this;this.length=m;this.session=n;this.doc=n.getDocument();this.mainClass=i;this.othersClass=k;this.$onUpdate=this.onUpdate.bind(this);this.doc.on("change",this.$onUpdate);this.$others=l;this.$onCursorChange=function(){setTimeout(function(){h.onCursorChange()})};this.$pos=o;var j=n.getUndoManager().$undoStack||n.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=j.length;this.setup();n.selection.on("changeCursor",this.$onCursorChange)};(function(){d.implement(this,e);this.setup=function(){var h=this;var j=this.doc;var i=this.session;var k=this.$pos;this.pos=j.createAnchor(k.row,k.column);this.markerId=i.addMarker(new f(k.row,k.column,k.row,k.column+this.length),this.mainClass,null,false);this.pos.on("change",function(l){i.removeMarker(h.markerId);h.markerId=i.addMarker(new f(l.value.row,l.value.column,l.value.row,l.value.column+h.length),h.mainClass,null,false)});this.others=[];this.$others.forEach(function(l){var m=j.createAnchor(l.row,l.column);h.others.push(m)});i.setUndoSelect(false)};this.showOtherMarkers=function(){if(this.othersActive){return}var i=this.session;var h=this;this.othersActive=true;this.others.forEach(function(j){j.markerId=i.addMarker(new f(j.row,j.column,j.row,j.column+h.length),h.othersClass,null,false);j.on("change",function(k){i.removeMarker(j.markerId);j.markerId=i.addMarker(new f(k.value.row,k.value.column,k.value.row,k.value.column+h.length),h.othersClass,null,false)})})};this.hideOtherMarkers=function(){if(!this.othersActive){return}this.othersActive=false;for(var h=0;h=this.pos.column&&h.start.column<=this.pos.column+this.length+1){var n=h.start.column-this.pos.column;this.length+=k;if(!this.session.$fromUndo){if(p.action==="insertText"){for(var m=this.others.length-1;m>=0;m--){var j=this.others[m];var l={row:j.row,column:j.column+n};if(j.row===h.start.row&&h.start.column=0;m--){var j=this.others[m];var l={row:j.row,column:j.column+n};if(j.row===h.start.row&&h.start.column=this.pos.column&&i.column<=this.pos.column+this.length){this.showOtherMarkers();this._emit("cursorEnter",h)}else{this.hideOtherMarkers();this._emit("cursorLeave",h)}};this.detach=function(){this.session.removeMarker(this.markerId);this.hideOtherMarkers();this.doc.removeEventListener("change",this.$onUpdate);this.session.selection.removeEventListener("changeCursor",this.$onCursorChange);this.pos.detach();for(var h=0;h1){s++;if(s>4){s=1}}else{s=1}}if(d.isIE){var t=Math.abs(u.clientX-q)>5||Math.abs(u.clientY-p)>5;if(t){s=1}if(s==1){q=u.clientX;p=u.clientY}}o[r]("mousedown",u);if(s>4){s=0}else{if(s>1){return o[r](m[s],u)}}});if(d.isOldIE){f.addListener(n,"dblclick",function(t){s=2;if(l){clearTimeout(l)}l=setTimeout(function(){l=null},k[s-1]||600);o[r]("mousedown",t);o[r](m[s],t)})}};var b=d.isMac&&d.isOpera&&!("KeyboardEvent" in window)?function(k){return 0|(k.metaKey?1:0)|(k.altKey?2:0)|(k.shiftKey?4:0)|(k.ctrlKey?8:0)}:function(k){return 0|(k.ctrlKey?1:0)|(k.altKey?2:0)|(k.shiftKey?4:0)|(k.metaKey?8:0)};f.getModifierString=function(k){return j.KEY_MODS[b(k)]};function i(p,o,n){var m=b(o);if(!d.isMac&&h){if(h[91]||h[92]){m|=8}if(h.altGr){if((3&m)!=3){h.altGr=0}else{return}}if(n===18||n===17){var k=o.location||o.keyLocation;if(n===17&&k===1){g=o.timeStamp}else{if(n===18&&m===3&&k===2){var l=-g;g=o.timeStamp;l+=g;if(l<3){h.altGr=true}}}}}if(n in j.MODIFIER_KEYS){switch(j.MODIFIER_KEYS[n]){case"Alt":m=2;break;case"Shift":m=4;break;case"Ctrl":m=1;break;default:m=8;break}n=-1}if(m&8&&(n===91||n===93)){n=-1}if(!m&&n===13){if(o.location||o.keyLocation===3){p(o,m,-n);if(o.defaultPrevented){return}}}if(!m&&!(n in j.FUNCTION_KEYS)&&!(n in j.PRINTABLE_KEYS)){return false}return p(o,m,n)}var h=null;var g=0;f.addCommandKeyListener=function(m,o){var l=f.addListener;if(d.isOldGecko||(d.isOpera&&!("KeyboardEvent" in window))){var n=null;l(m,"keydown",function(p){n=p.keyCode});l(m,"keypress",function(p){return i(o,p,n)})}else{var k=null;l(m,"keydown",function(q){h[q.keyCode]=true;var p=i(o,q,q.keyCode);k=q.defaultPrevented;return p});l(m,"keypress",function(p){if(k&&(p.ctrlKey||p.altKey||p.shiftKey||p.metaKey)){f.stopEvent(p);k=null}});l(m,"keyup",function(p){h[p.keyCode]=null});if(!h){h=Object.create(null);l(window,"focus",function(p){h=Object.create(null)})}}};if(window.postMessage&&!d.isOldIE){var a=1;f.nextTick=function(n,m){m=m||window;var k="zero-timeout-message-"+a;f.addListener(m,"message",function l(o){if(o.data==k){f.stopPropagation(o);f.removeListener(m,"message",l);n()}});m.postMessage(k,"*")}}f.nextFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame;if(f.nextFrame){f.nextFrame=f.nextFrame.bind(window)}else{f.nextFrame=function(k){setTimeout(k,17)}}});define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(b,a,c){var e=b("../../range").Range;var d=a.FoldMode=function(){};(function(){this.foldingStartMarker=null;this.foldingStopMarker=null;this.getFoldWidget=function(h,g,i){var f=h.getLine(i);if(this.foldingStartMarker.test(f)){return"start"}if(g=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(f)){return"end"}return""};this.getFoldWidgetRange=function(g,f,h){return null};this.indentationBlock=function(l,p,g){var o=/\S/;var q=l.getLine(p);var j=q.search(o);if(j==-1){return}var h=g||q.length;var m=l.getLength();var n=p;var i=p;while(++pn){var k=l.getLine(i).length;return new e(n,h,i,k)}};this.openingBracketBlock=function(j,l,k,h,f){var m={row:k,column:h+1};var g=j.$findClosingBracket(l,m,f);if(!g){return}var i=j.foldWidgets[g.row];if(i==null){i=j.getFoldWidget(g.row)}if(i=="start"&&g.row>m.row){g.row--;g.column=j.getLine(g.row).length}return e.fromPoints(m,g)};this.closingBracketBlock=function(i,k,j,h,f){var g={row:j,column:h};var l=i.$findOpeningBracket(k,g);if(!l){return}l.column++;g.column--;return e.fromPoints(l,g)}}).call(d.prototype)});define("ace/lib/dom",["require","exports","module"],function(c,a,d){if(typeof document=="undefined"){return}var b="http://www.w3.org/1999/xhtml";a.getDocumentHead=function(f){if(!f){f=document}return f.head||f.getElementsByTagName("head")[0]||f.documentElement};a.createElement=function(f,g){return document.createElementNS?document.createElementNS(g||b,f):document.createElement(f)};a.hasCssClass=function(h,f){var g=h.className.split(/\s+/g);return g.indexOf(f)!==-1};a.addCssClass=function(g,f){if(!a.hasCssClass(g,f)){g.className+=" "+f}};a.removeCssClass=function(i,g){var h=i.className.split(/\s+/g);while(true){var f=h.indexOf(g);if(f==-1){break}h.splice(f,1)}i.className=h.join(" ")};a.toggleCssClass=function(i,g){var h=i.className.split(/\s+/g),j=true;while(true){var f=h.indexOf(g);if(f==-1){break}j=false;h.splice(f,1)}if(j){h.push(g)}i.className=h.join(" ");return j};a.setCssClass=function(h,g,f){if(f){a.addCssClass(h,g)}else{a.removeCssClass(h,g)}};a.hasCssString=function(i,h){var f=0,g;h=h||document;if(h.createStyleSheet&&(g=h.styleSheets)){while(f0){if(aw>aq){aw=aq}}else{if(aw==void 0){aw=0}else{if(aw<0){aw=Math.max(aq+aw,0)}}}if(!(aw+aoax){for(at=an;at--;){this[ap+at]=this[ax+at]}}}if(az&&aw===ar){this.length=ar;this.push.apply(this,ay)}else{this.length=ar+az;for(at=0;at>>0;if(L(an)!="[object Function]"){throw new TypeError()}while(++aq>>0,an=Array(au),at=arguments[1];if(L(ao)!="[object Function]"){throw new TypeError(ao+" is not a function")}for(var ar=0;ar>>0,an=[],av,at=arguments[1];if(L(ao)!="[object Function]"){throw new TypeError(ao+" is not a function")}for(var ar=0;ar>>0,ar=arguments[1];if(L(an)!="[object Function]"){throw new TypeError(an+" is not a function")}for(var aq=0;aq>>0,ar=arguments[1];if(L(an)!="[object Function]"){throw new TypeError(an+" is not a function")}for(var aq=0;aq>>0;if(L(ao)!="[object Function]"){throw new TypeError(ao+" is not a function")}if(!at&&arguments.length==1){throw new TypeError("reduce of empty array with no initial value")}var ar=0;var an;if(arguments.length>=2){an=arguments[1]}else{do{if(ar in ap){an=ap[ar++];break}if(++ar>=at){throw new TypeError("reduce of empty array with no initial value")}}while(true)}for(;ar>>0;if(L(ao)!="[object Function]"){throw new TypeError(ao+" is not a function")}if(!at&&arguments.length==1){throw new TypeError("reduceRight of empty array with no initial value")}var an,ar=at-1;if(arguments.length>=2){an=arguments[1]}else{do{if(ar in ap){an=ap[ar--];break}if(--ar<0){throw new TypeError("reduceRight of empty array with no initial value")}}while(true)}do{if(ar in this){an=ao.call(void 0,an,ap[ar],ar,aq)}}while(ar--);return an}}if(!Array.prototype.indexOf||([0,1].indexOf(1,2)!=-1)){Array.prototype.indexOf=function v(ao){var an=aa&&L(this)=="[object String]"?this.split(""):M(this),aq=an.length>>>0;if(!aq){return -1}var ap=0;if(arguments.length>1){ap=U(arguments[1])}ap=ap>=0?ap:Math.max(0,aq+ap);for(;ap>>0;if(!aq){return -1}var ap=aq-1;if(arguments.length>1){ap=Math.min(ap,U(arguments[1]))}ap=ap>=0?ap:aq-Math.abs(ap);for(;ap>=0;ap--){if(ap in an&&ao===an[ap]){return ap}}return -1}}if(!Object.getPrototypeOf){Object.getPrototypeOf=function ah(an){return an.__proto__||(an.constructor?an.constructor.prototype:A)}}if(!Object.getOwnPropertyDescriptor){var b="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function B(ap,aq){if((typeof ap!="object"&&typeof ap!="function")||ap===null){throw new TypeError(b+ap)}if(!T(ap,aq)){return}var ar,an,at;ar={enumerable:true,configurable:true};if(p){var ao=ap.__proto__;ap.__proto__=A;var an=ac(ap,aq);var at=aj(ap,aq);ap.__proto__=ao;if(an||at){if(an){ar.get=an}if(at){ar.set=at}return ar}}ar.value=ap[aq];return ar}}if(!Object.getOwnPropertyNames){Object.getOwnPropertyNames=function R(an){return Object.keys(an)}}if(!Object.create){var V;if(Object.prototype.__proto__===null){V=function(){return{__proto__:null}}}else{V=function(){var ao={};for(var an in ao){ao[an]=null}ao.constructor=ao.hasOwnProperty=ao.propertyIsEnumerable=ao.isPrototypeOf=ao.toLocaleString=ao.toString=ao.valueOf=ao.__proto__=null;return ao}}Object.create=function j(ap,aq){var ao;if(ap===null){ao=V()}else{if(typeof ap!="object"){throw new TypeError("typeof prototype["+(typeof ap)+"] != 'object'")}var an=function(){};an.prototype=ap;ao=new an();ao.__proto__=ap}if(aq!==void 0){Object.defineProperties(ao,aq)}return ao}}function F(an){try{Object.defineProperty(an,"sentinel",{});return"sentinel" in an}catch(ao){}}if(Object.defineProperty){var i=F({});var H=typeof document=="undefined"||F(document.createElement("div"));if(!i||!H){var E=Object.defineProperty}}if(!Object.defineProperty||E){var f="Property description must be an object: ";var W="Object.defineProperty called on non-object: ";var n="getters & setters can not be defined on this javascript engine";Object.defineProperty=function Z(ao,aq,ar){if((typeof ao!="object"&&typeof ao!="function")||ao===null){throw new TypeError(W+ao)}if((typeof ar!="object"&&typeof ar!="function")||ar===null){throw new TypeError(f+ar)}if(E){try{return E.call(Object,ao,aq,ar)}catch(ap){}}if(T(ar,"value")){if(p&&(ac(ao,aq)||aj(ao,aq))){var an=ao.__proto__;ao.__proto__=A;delete ao[aq];ao[aq]=ar.value;ao.__proto__=an}else{ao[aq]=ar.value}}else{if(!p){throw new TypeError(n)}if(T(ar,"get")){ae(ao,aq,ar.get)}if(T(ar,"set")){al(ao,aq,ar.set)}}return ao}}if(!Object.defineProperties){Object.defineProperties=function N(an,ao){for(var ap in ao){if(T(ao,ap)){Object.defineProperty(an,ap,ao[ap])}}return an}}if(!Object.seal){Object.seal=function X(an){return an}}if(!Object.freeze){Object.freeze=function s(an){return an}}try{Object.freeze(function(){})}catch(l){Object.freeze=(function s(ao){return function an(ap){if(typeof ap=="function"){return ap}else{return ao(ap)}}})(Object.freeze)}if(!Object.preventExtensions){Object.preventExtensions=function O(an){return an}}if(!Object.isSealed){Object.isSealed=function am(an){return false}}if(!Object.isFrozen){Object.isFrozen=function ab(an){return false}}if(!Object.isExtensible){Object.isExtensible=function r(ao){if(Object(ao)===ao){throw new TypeError()}var an="";while(T(ao,an)){an+="?"}ao[an]=true;var ap=T(ao,an);delete ao[an];return ap}}if(!Object.keys){var m=true,u=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],k=u.length;for(var x in {toString:null}){m=false}Object.keys=function I(ap){if((typeof ap!="object"&&typeof ap!="function")||ap===null){throw new TypeError("Object.keys called on a non-object")}var at=[];for(var ao in ap){if(T(ap,ao)){at.push(ao)}}if(m){for(var aq=0,ar=k;aq0||-1)*Math.floor(Math.abs(an))}}return an}function z(an){var ao=typeof an;return(an===null||ao==="undefined"||ao==="boolean"||ao==="number"||ao==="string")}function w(ao){var aq,an,ap;if(z(ao)){return ao}an=ao.valueOf;if(typeof an==="function"){aq=an.call(ao);if(z(aq)){return aq}}ap=ao.toString;if(typeof ap==="function"){aq=ap.call(ao);if(z(aq)){return aq}}throw new TypeError()}var M=function(an){if(an==null){throw new TypeError("can't convert "+an+" to object")}return Object(an)}});define("ace/lib/regexp",["require","exports","module"],function(b,a,c){var h={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},f=h.exec.call(/()??/,"")[1]===undefined,e=function(){var i=/^/g;h.test.call(i,"");return !i.lastIndex}();if(e&&f){return}RegExp.prototype.exec=function(n){var l=h.exec.apply(this,arguments),k,j;if(typeof(n)=="string"&&l){if(!f&&l.length>1&&d(l,"")>-1){j=RegExp(this.source,h.replace.call(g(this),"g",""));h.replace.call(n.slice(l.index),j,function(){for(var o=1;ol.index)){this.lastIndex--}}return l};if(!e){RegExp.prototype.test=function(j){var i=h.exec.call(this,j);if(i&&this.global&&!i[0].length&&(this.lastIndex>i.index)){this.lastIndex--}return !!i}}function g(i){return(i.global?"g":"")+(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.extended?"x":"")+(i.sticky?"y":"")}function d(m,k,l){if(Array.prototype.indexOf){return m.indexOf(k,l)}for(var j=l||0;j>1;var n=i(l,o[j]);if(n>0){m=j+1}else{if(n<0){k=j-1}else{return j}}}return -(m+1)}function a(o,p,l){var n=o.getAnnotations().sort(e.comparePoints);if(!n.length){return}var m=h(n,{row:p,column:-1},e.comparePoints);if(m<0){m=-m-1}if(m>=n.length-1){m=l>0?0:n.length-1}else{if(m===0&&l<0){m=n.length-1}}var k=n[m];if(!k||!l){return}if(k.row===p){do{k=n[m+=l]}while(k&&k.row===p);if(!k){return n.slice()}}var j=[];p=k.row;do{j[l<0?"unshift":"push"](k);k=n[m+=l]}while(k&&k.row==p);return j.length&&j}b.showErrorMarker=function(p,k){var q=p.session;if(!q.widgetManager){q.widgetManager=new f(q);q.widgetManager.attach(p)}var r=p.getCursorPosition();var v=r.row;var m=q.lineWidgets&&q.lineWidgets[v];if(m){m.destroy()}else{v-=k}var o=a(q,v,k);var u;if(o){var l=o[0];r.column=(l.pos&&typeof l.column!="number"?l.pos.sc:l.column)||0;r.row=l.row;u=p.renderer.$gutterLayer.$annotations[r.row]}else{if(m){return}else{u={text:["Looks good!"],className:"ace_ok"}}}p.session.unfold(r.row);p.selection.moveToPosition(r);var t={row:r.row,fixedWidth:true,coverGutter:true,el:g.createElement("div")};var i=t.el.appendChild(g.createElement("div"));var s=t.el.appendChild(g.createElement("div"));s.className="error_widget_arrow "+u.className;var j=p.renderer.$cursorLayer.getPixelPosition(r).left;s.style.left=j+p.renderer.gutterWidth-5+"px";t.el.className="error_widget_wrapper";i.className="error_widget "+u.className;i.innerHTML=u.text.join("
");i.appendChild(g.createElement("div"));var n=function(x,y,w){if(y===0&&(w==="esc"||w==="return")){t.destroy();return{command:"null"}}};t.destroy=function(){if(p.$mouseHandler.isMousePressed){return}p.keyBinding.removeKeyboardHandler(n);q.widgetManager.removeLineWidget(t);p.off("changeSelection",t.destroy);p.off("changeSession",t.destroy);p.off("mouseup",t.destroy);p.off("change",t.destroy)};p.keyBinding.addKeyboardHandler(n);p.on("changeSelection",t.destroy);p.on("changeSession",t.destroy);p.on("mouseup",t.destroy);p.on("change",t.destroy);p.session.widgetManager.addLineWidget(t);t.el.onmousedown=p.focus.bind(p);p.renderer.scrollCursorIntoView(null,0.5,{bottom:t.el.offsetHeight})};g.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")});define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"],function(b,a,c){b("./regexp");b("./es5-shim")});define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(b,a,c){var d=b("./lib/oop");var g=b("./lib/dom");var f=b("./range").Range;function e(h){this.session=h;this.session.widgetManager=this;this.session.getRowLength=this.getRowLength;this.session.$getWidgetScreenLength=this.$getWidgetScreenLength;this.updateOnChange=this.updateOnChange.bind(this);this.renderWidgets=this.renderWidgets.bind(this);this.measureWidgets=this.measureWidgets.bind(this);this.session._changedWidgets=[];this.detach=this.detach.bind(this);this.session.on("change",this.updateOnChange)}(function(){this.getRowLength=function(j){var i;if(this.lineWidgets){i=this.lineWidgets[j]&&this.lineWidgets[j].rowCount||0}else{i=0}if(!this.$useWrapMode||!this.$wrapData[j]){return 1+i}else{return this.$wrapData[j].length+1+i}};this.$getWidgetScreenLength=function(){var h=0;this.lineWidgets.forEach(function(i){if(i&&i.rowCount){h+=i.rowCount}});return h};this.attach=function(h){if(h.widgetManager&&h.widgetManager!=this){h.widgetManager.detach()}if(this.editor==h){return}this.detach();this.editor=h;this.editor.on("changeSession",this.detach);h.widgetManager=this;h.setOption("enableLineWidgets",true);h.renderer.on("beforeRender",this.measureWidgets);h.renderer.on("afterRender",this.renderWidgets)};this.detach=function(j){if(j&&j.session==this.session){return}var i=this.editor;if(!i){return}i.off("changeSession",this.detach);this.editor=null;i.widgetManager=null;i.renderer.off("beforeRender",this.measureWidgets);i.renderer.off("afterRender",this.renderWidgets);var h=this.session.lineWidgets;h&&h.forEach(function(k){if(k&&k.el&&k.el.parentNode){k._inDocument=false;k.el.parentNode.removeChild(k.el)}})};this.updateOnChange=function(n){var l=this.session.lineWidgets;if(!l){return}var o=n.data;var j=o.range;var i=j.start.row;var h=j.end.row-i;if(h===0){}else{if(o.action=="removeText"||o.action=="removeLines"){var m=l.splice(i+1,h);m.forEach(function(p){p&&this.removeLineWidget(p)},this);this.$updateRows()}else{var k=new Array(h);k.unshift(i,0);l.splice.apply(l,k);this.$updateRows()}}};this.$updateRows=function(){var h=this.session.lineWidgets;if(!h){return}var i=true;h.forEach(function(j,k){if(j){i=false;j.row=k}});if(i){this.session.lineWidgets=null}};this.addLineWidget=function(h){if(!this.session.lineWidgets){this.session.lineWidgets=new Array(this.session.getLength())}this.session.lineWidgets[h.row]=h;var i=this.editor.renderer;if(h.html&&!h.el){h.el=g.createElement("div");h.el.innerHTML=h.html}if(h.el){g.addCssClass(h.el,"ace_lineWidgetContainer");h.el.style.position="absolute";h.el.style.zIndex=5;i.container.appendChild(h.el);h._inDocument=true}if(!h.coverGutter){h.el.style.zIndex=3}if(!h.pixelHeight){h.pixelHeight=h.el.offsetHeight}if(h.rowCount==null){h.rowCount=h.pixelHeight/i.layerConfig.lineHeight}this.session._emit("changeFold",{data:{start:{row:h.row}}});this.$updateRows();this.renderWidgets(null,i);return h};this.removeLineWidget=function(h){h._inDocument=false;if(h.el&&h.el.parentNode){h.el.parentNode.removeChild(h.el)}if(h.editor&&h.editor.destroy){try{h.editor.destroy()}catch(i){}}if(this.session.lineWidgets){this.session.lineWidgets[h.row]=undefined}this.session._emit("changeFold",{data:{start:{row:h.row}}});this.$updateRows()};this.onWidgetChanged=function(h){this.session._changedWidgets.push(h);this.editor&&this.editor.renderer.updateFull()};this.measureWidgets=function(p,o){var k=this.session._changedWidgets;var l=o.layerConfig;if(!k||!k.length){return}var n=Infinity;for(var m=0;m0&&!o[l]){l--}this.firstRow=h.firstRow;this.lastRow=h.lastRow;n.$cursorLayer.config=h;for(var k=l;k<=r;k++){var q=o[k];if(!q||!q.el){continue}if(!q._inDocument){q._inDocument=true;n.container.appendChild(q.el)}var p=n.$cursorLayer.getPixelPosition({row:k,column:0},true).top;if(!q.coverLine){p+=h.lineHeight*this.session.getRowLineCount(q.row)}q.el.style.top=p-h.offset+"px";var j=q.coverGutter?0:n.gutterWidth;if(!q.fixedWidth){j-=n.scrollLeft}q.el.style.left=j+"px";if(q.fixedWidth){q.el.style.right=n.scrollBar.getWidth()+"px"}else{q.el.style.right=""}}}}).call(e.prototype);a.LineWidgets=e});define("ace/document",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/range","ace/anchor"],function(d,c,e){var g=d("./lib/oop");var f=d("./lib/event_emitter").EventEmitter;var h=d("./range").Range;var a=d("./anchor").Anchor;var b=function(i){this.$lines=[];if(i.length===0){this.$lines=[""]}else{if(Array.isArray(i)){this._insertLines(0,i)}else{this.insert({row:0,column:0},i)}}};(function(){g.implement(this,f);this.initialize=function(i){this.refresh(i)};this.setValue=function(j){var i=this.getLength();this.remove(new h(0,0,i,this.getLine(i-1).length));this.insert({row:0,column:0},j)};this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())};this.createAnchor=function(j,i){return new a(this,j,i)};if("aaa".split(/a/).length===0){this.$split=function(i){return i.replace(/\r\n|\r/g,"\n").split("\n")}}else{this.$split=function(i){return i.split(/\r\n|\r|\n/)}}this.$detectNewLine=function(j){var i=j.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=i?i[1]:"\n";this._signal("changeNewLineMode")};this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}};this.$autoNewLine="";this.$newLineMode="auto";this.setNewLineMode=function(i){if(this.$newLineMode===i){return}this.$newLineMode=i;this._signal("changeNewLineMode")};this.getNewLineMode=function(){return this.$newLineMode};this.isNewLine=function(i){return(i=="\r\n"||i=="\r"||i=="\n")};this.getLine=function(i){return this.$lines[i]||""};this.getLines=function(j,i){return this.$lines.slice(j,i+1)};this.getAllLines=function(){return this.getLines(0,this.getLength())};this.getLength=function(){return this.$lines.length};this.getTextRange=function(k){if(k.start.row==k.end.row){return this.getLine(k.start.row).substring(k.start.column,k.end.column)}var j=this.getLines(k.start.row,k.end.row);j[0]=(j[0]||"").substring(k.start.column);var i=j.length-1;if(k.end.row-k.start.row==i){j[i]=j[i].substring(0,k.end.column)}return j.join(this.getNewLineCharacter())};this.$clipPosition=function(i){var j=this.getLength();if(i.row>=j){i.row=Math.max(0,j-1);i.column=this.getLine(j-1).length}else{if(i.row<0){i.row=0}}return i};this.insert=function(i,m){if(!m||m.length===0){return i}i=this.$clipPosition(i);if(this.getLength()<=1){this.$detectNewLine(m)}var k=this.$split(m);var l=k.splice(0,1)[0];var j=k.length==0?null:k.splice(k.length-1,1)[0];i=this.insertInLine(i,l);if(j!==null){i=this.insertNewLine(i);i=this._insertLines(i.row,k);i=this.insertInLine(i,j||"")}return i};this.refresh=function(n,m){var m=m||0;var j=this.$split(n);if(j.length>65535){var i=this.refresh(m,j.slice(65535));j=j.slice(0,65535)}var l=[m,0];l.push.apply(l,j);this.$lines.splice.apply(this.$lines,l);var k=new h(m,0,m+j.length,0);var o={action:"insertLines",context:"refresh",range:k,lines:j};this._emit("change",{data:o});return{row:0,column:0}};this.insertLines=function(j,i){if(j>=this.getLength()){return this.insert({row:j,column:0},"\n"+i.join("\n"))}return this._insertLines(Math.max(j,0),i)};this._insertLines=function(m,j){if(j.length==0){return{row:m,column:0}}while(j.length>61440){var i=this._insertLines(m,j.slice(0,61440));j=j.slice(61440);m=i.row}var l=[m,0];l.push.apply(l,j);this.$lines.splice.apply(this.$lines,l);var k=new h(m,0,m+j.length,0);var n={action:"insertLines",range:k,lines:j};this._signal("change",{data:n});return k.end};this.insertNewLine=function(i){i=this.$clipPosition(i);var k=this.$lines[i.row]||"";this.$lines[i.row]=k.substring(0,i.column);this.$lines.splice(i.row+1,0,k.substring(i.column,k.length));var j={row:i.row+1,column:0};var l={action:"insertText",range:h.fromPoints(i,j),text:this.getNewLineCharacter()};this._signal("change",{data:l});return j};this.insertInLine=function(i,l){if(l.length==0){return i}var k=this.$lines[i.row]||"";this.$lines[i.row]=k.substring(0,i.column)+l+k.substring(i.column);var j={row:i.row,column:i.column+l.length};var m={action:"insertText",range:h.fromPoints(i,j),text:l};this._signal("change",{data:m});return j};this.remove=function(j){if(!(j instanceof h)){j=h.fromPoints(j.start,j.end)}j.start=this.$clipPosition(j.start);j.end=this.$clipPosition(j.end);if(j.isEmpty()){return j.start}var m=j.start.row;var k=j.end.row;if(j.isMultiLine()){var l=j.start.column==0?m:m+1;var i=k-1;if(j.end.column>0){this.removeInLine(k,0,j.end.column)}if(i>=l){this._removeLines(l,i)}if(l!=m){this.removeInLine(m,j.start.column,this.getLine(m).length);this.removeNewLine(j.start.row)}}else{this.removeInLine(m,j.start.column,j.end.column)}return j.start};this.removeInLine=function(m,k,p){if(k==p){return}var j=new h(m,k,m,p);var i=this.getLine(m);var l=i.substring(k,p);var o=i.substring(0,k)+i.substring(p,i.length);this.$lines.splice(m,1,o);var n={action:"removeText",range:j,text:l};this._signal("change",{data:n});return j.start};this.removeLines=function(j,i){if(j<0||i>=this.getLength()){return this.remove(new h(j,0,i+1,0))}return this._removeLines(j,i)};this._removeLines=function(l,j){var i=new h(l,0,j+1,0);var k=this.$lines.splice(l,j-l+1);var m={action:"removeLines",range:i,nl:this.getNewLineCharacter(),lines:k};this._signal("change",{data:m});return k};this.removeNewLine=function(m){var l=this.getLine(m);var i=this.getLine(m+1);var k=new h(m,l.length,m+1,0);var j=l+i;this.$lines.splice(m,2,j);var n={action:"removeText",range:k,text:this.getNewLineCharacter()};this._signal("change",{data:n})};this.replace=function(j,k){if(!(j instanceof h)){j=h.fromPoints(j.start,j.end)}if(k.length==0&&j.isEmpty()){return j.start}if(k==this.getTextRange(j)){return j.end}this.remove(j);if(k){var i=this.insert(j.start,k)}else{i=j.start}return i};this.applyDeltas=function(l){for(var k=0;k=0;k--){var m=l[k];var j=h.fromPoints(m.range.start,m.range.end);if(m.action=="insertLines"){this._removeLines(j.start.row,j.end.row-1)}else{if(m.action=="insertText"){this.remove(j)}else{if(m.action=="removeLines"){this._insertLines(j.start.row,m.lines)}else{if(m.action=="removeText"){this.insert(j.start,m.text)}}}}}};this.indexToPosition=function(o,n){var k=this.$lines||this.getAllLines();var m=this.getNewLineCharacter().length;for(var p=n||0,j=k.length;p",newSubstr:" close tag "},{substr:"<",newSubstr:" tag start "},{substr:">",newSubstr:" tag end "}]}};var i={prop:i};var S=function(aD,aB){var aE=aD;for(var aA=0;aA0){cvox.Api.playEarcon(am)}ab(aB)};var E=function(aA){var az=aA.type+" "+aA.text+" on "+W(aA.row,aA.column);az=az.replace(";","semicolon");cvox.Api.speak(az,1)};var ae=function(aB){var aA=a[aB];for(var az in aA){E(aA[az])}};var W=function(aA,az){return"row "+(aA+1)+" column "+(az+1)};var n=function(){cvox.Api.speak(W(Y.row,Y.column))};var at=function(){for(var az in a){ae(az)}};var ag=function(){if(!m()){return}switch(x.editor.keyBinding.$data.state){case ac:cvox.Api.speak("Insert mode");break;case J:cvox.Api.speak("Command mode");break}};var h=function(){V=!V;if(V){cvox.Api.speak("Speak location on row change enabled.")}else{cvox.Api.speak("Speak location on row change disabled.")}};var aa=function(){M=!M;if(M){cvox.Api.speak("Speak displacement on column changes.")}else{cvox.Api.speak("Speak current character or word on column changes.")}};var w=function(aA){if(aA.ctrlKey&&aA.shiftKey){var az=ap[aA.keyCode];if(az){az.func()}}};var t=function(az,aA){if(!m()){return}var aB=aA.keyBinding.$data.state;if(aB===B){return}switch(aB){case ac:cvox.Api.playEarcon(u);cvox.Api.setKeyEcho(true);break;case J:cvox.Api.playEarcon(u);cvox.Api.setKeyEcho(false);break}B=aB};var b=function(aA){var aB=aA.detail.customCommand;var az=X[aB];if(az){az.func();x.editor.focus()}};var z=function(){var aA=C.map(function(aB){return{desc:aB.desc+al(aB.keyCode),cmd:aB.cmd}});var az=document.querySelector("body");az.setAttribute("contextMenuActions",JSON.stringify(aA));az.addEventListener("ATCustomEvent",b,true)};var F=function(az){if(az.match){D(Y.row,0)}else{cvox.Api.playEarcon(d)}};var av=function(){x.editor.focus()};var C=[{keyCode:49,func:function(){ae(Y.row)},cmd:o.SPEAK_ANNOT,desc:"Speak annotations on line"},{keyCode:50,func:at,cmd:o.SPEAK_ALL_ANNOTS,desc:"Speak all annotations"},{keyCode:51,func:ag,cmd:o.SPEAK_MODE,desc:"Speak Vim mode"},{keyCode:52,func:h,cmd:o.TOGGLE_LOCATION,desc:"Toggle speak row location"},{keyCode:53,func:n,cmd:o.SPEAK_ROW_COL,desc:"Speak row and column"},{keyCode:54,func:aa,cmd:o.TOGGLE_DISPLACEMENT,desc:"Toggle speak displacement"},{keyCode:55,func:av,cmd:o.FOCUS_TEXT,desc:"Focus text"}];var A=function(){x.editor=editor;editor.getSession().selection.on("changeCursor",I);editor.getSession().selection.on("changeSelection",j);editor.getSession().on("change",ak);editor.getSession().on("changeAnnotation",e);editor.on("changeStatus",t);editor.on("findSearchBox",F);editor.container.addEventListener("keydown",w);Y=editor.selection.getCursor()};var T=function(az){A();C.forEach(function(aA){ap[aA.keyCode]=aA;X[aA.cmd]=aA});az.on("focus",A);if(m()){cvox.Api.setKeyEcho(false)}z()};function v(){return(typeof(cvox)!=="undefined")&&cvox&&cvox.Api}var af=0;var ar=15;function an(az){if(v()){T(az)}else{af++;if(af>=ar){return}window.setTimeout(an,500,az)}}var L=ah("../editor").Editor;ah("../config").defineOptions(L.prototype,"editor",{enableChromevoxEnhancements:{set:function(az){if(az){an(this)}},value:true}})});(function(){window.require(["ace/ext/chromevox"],function(){})})();define("ace/ext/elastic_tabstops_lite",["require","exports","module","ace/editor","ace/config"],function(c,b,e){var d=function(i){this.$editor=i;var f=this;var g=[];var h=false;this.onAfterExec=function(){h=false;f.processRows(g);g=[]};this.onExec=function(){h=true};this.onChange=function(k){var j=k.data.range;if(h){if(g.indexOf(j.start.row)==-1){g.push(j.start.row)}if(j.end.row!=j.start.row){g.push(j.end.row)}}}};(function(){this.processRows=function(q){this.$inChange=true;var j=[];for(var f=0,n=q.length;f-1){continue}var k=this.$findCellWidthsForBlock(p);var g=this.$setBlockCellWidthsToMax(k.cellWidths);var m=k.firstRow;for(var o=0,i=g.length;o=0){g=this.$cellWidthsForRow(f);if(g.length==0){break}h.unshift(g);f--}var j=f+1;f=k;var i=this.$editor.session.getLength();while(f0){this.$editor.session.getDocument().insertInLine({row:u,column:m+1},Array(h+1).join(" ")+"\t");this.$editor.session.getDocument().removeInLine(u,m,m+1);p+=h}if(h<0&&o>=-h){this.$editor.session.getDocument().removeInLine(u,m+h,m);p+=h}}};this.$izip_longest=function(g){if(!g[0]){return[]}var k=g[0].length;var m=g.length;for(var j=1;jk){k=h}}var n=[];for(var f=0;f=h.length?h.length:j.length;var k=[];for(var f=0;f1){n=o[0]}else{if(n=="php"){n="html"}}}}return n},getProfileName:function(){switch(this.getSyntax()){case"css":return"css";case"xml":case"xsl":return"xml";case"html":var n=e.require("resources").getVariable("profile");if(!n){n=this.ace.session.getLines(0,2).join("").search(/]+XHTML/i)!=-1?"xhtml":"html"}return n}return"xhtml"},prompt:function(n){return prompt(n)},getSelection:function(){return this.ace.session.getTextRange()},getFilePath:function(){return""},$updateTabstops:function(t){var s=1000;var r=0;var q=null;var n=e.require("range");var p=e.require("tabStops");var o=e.require("resources").getVocabulary("user");var u={tabstop:function(x){var y=parseInt(x.group,10);var w=y===0;if(w){y=++r}else{y+=s}var z=x.placeholder;if(z){z=p.processText(z,u)}var v="${"+y+(z?":"+z:"")+"}";if(w){q=n.create(x.start,v)}return v},escape:function(v){if(v=="$"){return"\\$"}if(v=="\\"){return"\\\\"}return v}};t=p.processText(t,u);if(o.variables.insert_final_tabstop&&!/\$\{0\}$/.test(t)){t+="${0}"}else{if(q){t=e.require("utils").replaceSubstring(t,"${0}",q)}}return t}};var i={expand_abbreviation:{mac:"ctrl+alt+e",win:"alt+e"},match_pair_outward:{mac:"ctrl+d",win:"ctrl+,"},match_pair_inward:{mac:"ctrl+j",win:"ctrl+shift+0"},matching_pair:{mac:"ctrl+alt+j",win:"alt+j"},next_edit_point:"alt+right",prev_edit_point:"alt+left",toggle_comment:{mac:"command+/",win:"ctrl+/"},split_join_tag:{mac:"shift+command+'",win:"shift+ctrl+`"},remove_tag:{mac:"command+'",win:"shift+ctrl+;"},evaluate_math_expression:{mac:"shift+command+y",win:"shift+ctrl+y"},increment_number_by_1:"ctrl+up",decrement_number_by_1:"ctrl+down",increment_number_by_01:"alt+up",decrement_number_by_01:"alt+down",increment_number_by_10:{mac:"alt+command+up",win:"shift+alt+up"},decrement_number_by_10:{mac:"alt+command+down",win:"shift+alt+down"},select_next_item:{mac:"shift+command+.",win:"shift+ctrl+."},select_previous_item:{mac:"shift+command+,",win:"shift+ctrl+,"},reflect_css_value:{mac:"shift+command+r",win:"shift+ctrl+r"},encode_decode_data_url:{mac:"shift+ctrl+d",win:"ctrl+'"},expand_abbreviation_with_tab:"Tab",wrap_with_abbreviation:{mac:"shift+ctrl+a",win:"shift+ctrl+a"}};var l=new h();g.commands=new k();g.runEmmetCommand=function(o){l.setupContext(o);if(l.getSyntax()=="php"){return false}var q=e.require("actions");if(this.action=="expand_abbreviation_with_tab"){if(!o.selection.isEmpty()){return false}}if(this.action=="wrap_with_abbreviation"){return setTimeout(function(){q.run("wrap_with_abbreviation",l)},0)}try{var n=q.run(this.action,l)}catch(p){o._signal("changeStatus",typeof p=="string"?p:p.message);console.log(p)}return n};for(var f in i){g.commands.addCommand({name:"emmet:"+f,action:f,bindKey:i[f],exec:g.runEmmetCommand,multiSelectAction:"forEach"})}var m=function(q,p){var o=p;if(!o){return}var r=o.session.$modeId;var n=r&&/css|less|scss|sass|stylus|html|php/.test(r);if(q.enableEmmet===false){n=false}if(n){o.keyBinding.addKeyboardHandler(g.commands)}else{o.keyBinding.removeKeyboardHandler(g.commands)}};g.AceEmmetEditor=h;d("ace/config").defineOptions(j.prototype,"editor",{enableEmmet:{set:function(n){this[n?"on":"removeListener"]("changeMode",m);m({enableEmmet:!!n},this)},value:true}});g.setCore=function(n){e=n}});define("ace/snippets",["require","exports","module","ace/lib/lang","ace/range","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom"],function(e,f,c){var b=e("./lib/lang");var d=e("./range").Range;var h=e("./keyboard/hash_handler").HashHandler;var j=e("./tokenizer").Tokenizer;var l=d.comparePoints;var a=function(){this.snippetMap={};this.snippetNameMap={}};(function(){this.getTokenizer=function(){function m(q,p,o){q=q.substr(1);if(/^\d+$/.test(q)&&!o.inFormatString){return[{tabstopId:parseInt(q,10)}]}return[{text:q}]}function n(o){return"(?:[^\\\\"+o+"]|\\\\.)"}a.$tokenizer=new j({start:[{regex:/:/,onMatch:function(q,p,o){if(o.length&&o[0].expectIf){o[0].expectIf=false;o[0].elseBranch=o[0];return[o[0]]}return":"}},{regex:/\\./,onMatch:function(r,q,o){var p=r[1];if(p=="}"&&o.length){r=p}else{if("`$\\".indexOf(p)!=-1){r=p}else{if(o.inFormatString){if(p=="n"){r="\n"}else{if(p=="t"){r="\n"}else{if("ulULE".indexOf(p)!=-1){r={changeCase:p,local:p>"a"}}}}}}}return[r]}},{regex:/}/,onMatch:function(q,p,o){return[o.length?o.shift():q]}},{regex:/\$(?:\d+|\w+)/,onMatch:m},{regex:/\$\{[\dA-Z_a-z]+/,onMatch:function(r,q,o){var p=m(r.substr(1),q,o);o.unshift(p[0]);return p},next:"snippetVar"},{regex:/\n/,token:"newline",merge:false}],snippetVar:[{regex:"\\|"+n("\\|")+"*\\|",onMatch:function(q,p,o){o[0].choices=q.slice(1,-1).split(",")},next:"start"},{regex:"/("+n("/")+"+)/(?:("+n("/")+"*)/)(\\w*):?",onMatch:function(r,q,o){var p=o[0];p.fmtString=r;r=this.splitRegex.exec(r);p.guard=r[1];p.fmt=r[2];p.flag=r[3];return""},next:"start"},{regex:"`"+n("`")+"*`",onMatch:function(q,p,o){o[0].code=q.splice(1,-1);return""},next:"start"},{regex:"\\?",onMatch:function(q,p,o){if(o[0]){o[0].expectIf=true}},next:"start"},{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"start"}],formatString:[{regex:"/("+n("/")+"+)/",token:"regex"},{regex:"",onMatch:function(q,p,o){o.inFormatString=true},next:"start"}]});a.prototype.getTokenizer=function(){return a.$tokenizer};return a.$tokenizer};this.tokenizeTmSnippet=function(n,m){return this.getTokenizer().getLineTokens(n,m).tokens.map(function(o){return o.value||o})};this.$getDefaultValue=function(p,m){if(/^[A-Z]\d+$/.test(m)){var n=m.substr(1);return(this.variables[m[0]+"__"]||{})[n]}if(/^\d+$/.test(m)){return(this.variables.__||{})[m]}m=m.replace(/^TM_/,"");if(!p){return}var o=p.session;switch(m){case"CURRENT_WORD":var q=o.getWordRange();case"SELECTION":case"SELECTED_TEXT":return o.getTextRange(q);case"CURRENT_LINE":return o.getLine(p.getCursorPosition().row);case"PREV_LINE":return o.getLine(p.getCursorPosition().row-1);case"LINE_INDEX":return p.getCursorPosition().column;case"LINE_NUMBER":return p.getCursorPosition().row+1;case"SOFT_TABS":return o.getUseSoftTabs()?"YES":"NO";case"TAB_SIZE":return o.getTabSize();case"FILENAME":case"FILEPATH":return"";case"FULLNAME":return"Ace"}};this.variables={};this.getVariableValue=function(m,n){if(this.variables.hasOwnProperty(n)){return this.variables[n](m,n)||""}return this.$getDefaultValue(m,n)||""};this.tmStrFormat=function(t,r,q){var n=r.flag||"";var p=r.guard;p=new RegExp(p,n.replace(/[^gi]/,""));var o=this.tokenizeTmSnippet(r.fmt,"formatString");var m=this;var s=t.replace(p,function(){m.variables.__=arguments;var x=m.resolveVariables(o,q);var y="E";for(var u=0;u=0){u.splice(r,1)}}}if(o.content){m(o)}else{if(Array.isArray(o)){o.forEach(m)}}};this.parseSnippetFile=function(t){t=t.replace(/\r/g,"");var s=[],n={};var v=/^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm;var p;while(p=v.exec(t)){if(p[1]){try{n=JSON.parse(p[1]);s.push(n)}catch(r){}}if(p[4]){n.content=p[4].replace(/^\t/gm,"");s.push(n);n={}}else{var u=p[2],o=p[3];if(u=="regex"){var q=/\/((?:[^\/\\]|\\.)*)|$/g;n.guard=q.exec(o)[1];n.trigger=q.exec(o)[1];n.endTrigger=q.exec(o)[1];n.endGuard=q.exec(o)[1]}else{if(u=="snippet"){n.tabTrigger=o.match(/^\S*/)[0];if(!n.name){n.name=o}}else{n[u]=o}}}}return s};this.getSnippetByName=function(m,n){var p=this.snippetNameMap;var o;this.getActiveScopes(n).some(function(r){var q=p[r];if(q){o=q[m]}return !!o},this);return o}}).call(a.prototype);var i=function(m){if(m.tabstopManager){return m.tabstopManager}m.tabstopManager=this;this.$onChange=this.onChange.bind(this);this.$onChangeSelection=b.delayedCall(this.onChangeSelection.bind(this)).schedule;this.$onChangeSession=this.onChangeSession.bind(this);this.$onAfterExec=this.onAfterExec.bind(this);this.attach(m)};(function(){this.attach=function(m){this.index=-1;this.ranges=[];this.tabstops=[];this.selectedTabstop=null;this.editor=m;this.editor.on("change",this.$onChange);this.editor.on("changeSelection",this.$onChangeSelection);this.editor.on("changeSession",this.$onChangeSession);this.editor.commands.on("afterExec",this.$onAfterExec);this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)};this.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this);this.ranges=null;this.tabstops=null;this.selectedTabstop=null;this.editor.removeListener("change",this.$onChange);this.editor.removeListener("changeSelection",this.$onChangeSelection);this.editor.removeListener("changeSession",this.$onChangeSession);this.editor.commands.removeListener("afterExec",this.$onAfterExec);this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);this.editor.tabstopManager=null;this.editor=null};this.onChange=function(w){var q=w.data.range;var n=w.data.action[0]=="r";var p=q.start;var s=q.end;var z=p.row;var t=s.row;var y=t-z;var v=s.column-p.column;if(n){y=-y;v=-v}if(!this.$inChange&&n){var x=this.selectedTabstop;var A=!x.some(function(B){return l(B.start,p)<=0&&l(B.end,s)>=0});if(A){return this.detach()}}var o=this.ranges;for(var u=0;u0){this.removeRange(m);u--;continue}if(m.start.row==z&&m.start.column>p.column){m.start.column+=v}if(m.end.row==z&&m.end.column>=p.column){m.end.column+=v}if(m.start.row>=z){m.start.row+=y}if(m.end.row>=z){m.end.row+=y}if(l(m.start,m.end)>0){this.removeRange(m)}}if(!o.length){this.detach()}};this.updateLinkedFields=function(){var p=this.selectedTabstop;if(!p.hasLinkedRanges){return}this.$inChange=true;var q=this.editor.session;var r=q.getTextRange(p.firstNonLinked);for(var o=p.length;o--;){var n=p[o];if(!n.linked){continue}var m=f.snippetManager.tmStrFormat(r,n.original);q.replace(n,m)}this.$inChange=false};this.onAfterExec=function(m){if(m.command&&!m.command.readOnly){this.updateLinkedFields()}};this.onChangeSelection=function(){if(!this.editor){return}var o=this.editor.selection.lead;var n=this.editor.selection.anchor;var r=this.editor.selection.isEmpty();for(var p=this.ranges.length;p--;){if(this.ranges[p].linked){continue}var m=this.ranges[p].contains(o.row,o.column);var q=r||this.ranges[p].contains(n.row,n.column);if(m&&q){return}}this.detach()};this.onChangeSession=function(){this.detach()};this.tabNext=function(o){var m=this.tabstops.length-1;var n=this.index+(o||1);n=Math.min(Math.max(n,0),m);this.selectTabstop(n);if(n==m){this.detach()}};this.selectTabstop=function(m){var o=this.tabstops[this.index];if(o){this.addTabstopMarkers(o)}this.index=m;o=this.tabstops[this.index];if(!o||!o.length){return}this.selectedTabstop=o;if(!this.editor.inVirtualSelectionMode){var p=this.editor.multiSelect;p.toSingleRange(o.firstNonLinked.clone());for(var n=o.length;n--;){if(o.hasLinkedRanges&&o[n].linked){continue}p.addRange(o[n].clone(),true)}}else{this.editor.selection.setRange(o.firstNonLinked)}this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)};this.addTabstops=function(t,u,o){if(!t[0]){var s=d.fromPoints(o,o);g(s.start,u);g(s.end,u);t[0]=[s];t[0].index=0}var q=this.index;var m=[q,0];var n=this.ranges;var r=this.editor;t.forEach(function(x){for(var w=x.length;w--;){var y=x[w];var v=d.fromPoints(y.start,y.end||y.start);k(v.start,u);k(v.end,u);v.original=y;v.tabstop=x;n.push(v);x[w]=v;if(y.fmtString){v.linked=true;x.hasLinkedRanges=true}else{if(!x.firstNonLinked){x.firstNonLinked=v}}}if(!x.firstNonLinked){x.hasLinkedRanges=false}m.push(x);this.addTabstopMarkers(x)},this);m.push(m.splice(2,1)[0]);this.tabstops.splice.apply(this.tabstops,m)};this.addTabstopMarkers=function(m){var n=this.editor.session;m.forEach(function(o){if(!o.markerId){o.markerId=n.addMarker(o,"ace_snippet-marker","text")}})};this.removeTabstopMarkers=function(m){var n=this.editor.session;m.forEach(function(o){n.removeMarker(o.markerId);o.markerId=null})};this.removeRange=function(m){var n=m.tabstop.indexOf(m);m.tabstop.splice(n,1);n=this.ranges.indexOf(m);this.ranges.splice(n,1);this.editor.session.removeMarker(m.markerId)};this.keyboardHandler=new h();this.keyboardHandler.bindKeys({Tab:function(m){if(f.snippetManager&&f.snippetManager.expandWithTab(m)){return}m.tabstopManager.tabNext(1)},"Shift-Tab":function(m){m.tabstopManager.tabNext(-1)},Esc:function(m){m.tabstopManager.detach()},Return:function(m){return false}})}).call(i.prototype);var k=function(m,n){if(m.row==0){m.column+=n.column}m.row+=n.row};var g=function(m,n){if(m.row==n.row){m.column-=n.column}m.row-=n.row};e("./lib/dom").importCssString(".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}");f.snippetManager=new a()});(function(){window.require(["ace/ext/emmet"],function(){})})();(function(){window.require(["ace/ext/error_marker"],function(){})})();define("ace/ext/keybinding_menu",["require","exports","module","ace/editor","ace/ext/menu_tools/overlay_page","ace/ext/menu_tools/get_editor_keyboard_shortcuts"],function(c,b,e){var a=c("ace/editor").Editor;function d(j){if(!document.getElementById("kbshortcutmenu")){var k=c("./menu_tools/overlay_page").overlayPage;var i=c("./menu_tools/get_editor_keyboard_shortcuts").getEditorKeybordShortcuts;var h=i(j);var g=document.createElement("div");var f=h.reduce(function(l,m){return l+'
'+m.command+' : '+m.key+"
"},"");g.id="kbshortcutmenu";g.innerHTML="

Keyboard Shortcuts

"+f+"";k(j,g,"0","0","0",null)}}e.exports.init=function(f){a.prototype.showKeyboardShortcuts=function(){d(this)};f.commands.addCommands([{name:"showKeyboardShortcuts",bindKey:{win:"Ctrl-Alt-h",mac:"Command-Alt-h"},exec:function(h,g){h.showKeyboardShortcuts()}}])}});define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"],function(b,a,c){var f=b("../../lib/dom");var d="#ace_settingsmenu, #kbshortcutmenu {background-color: #F7F7F7;color: black;box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);padding: 1em 0.5em 2em 1em;overflow: auto;position: absolute;margin: 0;bottom: 0;right: 0;top: 0;z-index: 9991;cursor: default;}.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);background-color: rgba(255, 255, 255, 0.6);color: black;}.ace_optionsMenuEntry:hover {background-color: rgba(100, 100, 100, 0.1);-webkit-transition: all 0.5s;transition: all 0.3s}.ace_closeButton {background: rgba(245, 146, 146, 0.5);border: 1px solid #F48A8A;border-radius: 50%;padding: 7px;position: absolute;right: -8px;top: -8px;z-index: 1000;}.ace_closeButton{background: rgba(245, 146, 146, 0.9);}.ace_optionsMenuKey {color: darkslateblue;font-weight: bold;}.ace_optionsMenuCommand {color: darkcyan;font-weight: normal;}";f.importCssString(d);c.exports.overlayPage=function e(l,o,n,p,g,j){n=n?"top: "+n+";":"";g=g?"bottom: "+g+";":"";p=p?"right: "+p+";":"";j=j?"left: "+j+";":"";var q=document.createElement("div");var m=document.createElement("div");function k(r){if(r.keyCode===27){q.click()}}q.style.cssText="margin: 0; padding: 0; position: fixed; top:0; bottom:0; left:0; right:0;z-index: 9990; background-color: rgba(0, 0, 0, 0.3);";q.addEventListener("click",function(){document.removeEventListener("keydown",k);q.parentNode.removeChild(q);l.focus();q=null});document.addEventListener("keydown",k);m.style.cssText=n+p+g+j;m.addEventListener("click",function(r){r.stopPropagation()});var h=f.createElement("div");h.style.position="relative";var i=f.createElement("div");i.className="ace_closeButton";i.addEventListener("click",function(){q.click()});h.appendChild(i);m.appendChild(h);m.appendChild(o);q.appendChild(m);document.body.appendChild(q);l.blur()}});define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",["require","exports","module","ace/lib/keys"],function(b,a,c){var d=b("../../lib/keys");c.exports.getEditorKeybordShortcuts=function(h){var e=d.KEY_MODS;var g=[];var f={};h.keyBinding.$handlers.forEach(function(n){var m=n.commandKeyBinding;for(var l in m){var j=parseInt(l);if(j==-1){j=""}else{if(isNaN(j)){j=l}else{j=""+(j&e.command?"Cmd-":"")+(j&e.ctrl?"Ctrl-":"")+(j&e.alt?"Alt-":"")+(j&e.shift?"Shift-":"")}}for(var k in m[l]){var o=m[l][k];if(typeof o!="string"){o=o.name}if(f[o]){f[o].key+="|"+j+k}else{f[o]={key:j+k,command:o};g.push(f[o])}}}});return g}});(function(){window.require(["ace/ext/keybinding_menu"],function(){})})();define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/autocomplete/text_completer","ace/editor"],function(f,g,b){var a=f("../snippets").snippetManager;var k=f("../autocomplete").Autocomplete;var e=f("../config");var o=f("../autocomplete/text_completer");var i={getCompletions:function(q,t,v,s,u){var r=q.session.getState(v.row);var p=t.$mode.getCompletions(r,t,v,s);u(null,p)}};var j={getCompletions:function(q,t,v,s,u){var r=a.snippetMap;var p=[];a.getActiveScopes(q).forEach(function(A){var y=r[A]||[];for(var x=y.length;x--;){var z=y[x];var w=z.name||z.tabTrigger;if(!w){continue}p.push({caption:w,snippet:z.content,meta:z.tabTrigger&&!z.name?z.tabTrigger+"\u21E5 ":"snippet"})}},this);u(null,p)}};var d=[j,o,i];g.addCompleter=function(p){d.push(p)};var m={name:"expandSnippet",exec:function(p){var q=a.expandWithTab(p);if(!q){p.execCommand("indent")}},bindKey:"tab"};var n=function(q,p){l(p.session.$mode)};var l=function(p){var q=p.$id;if(!a.files){a.files={}}c(q);if(p.modes){p.modes.forEach(l)}};var c=function(q){if(!q||a.files[q]){return}var p=q.replace("mode","snippets");a.files[q]={};e.loadModule(p,function(r){if(r){a.files[q]=r;r.snippets=a.parseSnippetFile(r.snippetText);a.register(r.snippets,r.scope);if(r.includeScopes){a.snippetMap[r.scope].includeScopes=r.includeScopes;r.includeScopes.forEach(function(s){c("ace/mode/"+s)})}}})};var h=f("../editor").Editor;f("../config").defineOptions(h.prototype,"editor",{enableBasicAutocompletion:{set:function(p){if(p){this.completers=d;this.commands.addCommand(k.startCommand)}else{this.commands.removeCommand(k.startCommand)}},value:false},enableSnippets:{set:function(p){if(p){this.commands.addCommand(m);this.on("changeMode",n);n(null,this)}else{this.commands.removeCommand(m);this.off("changeMode",n)}},value:false}})});define("ace/snippets",["require","exports","module","ace/lib/lang","ace/range","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom"],function(e,f,c){var b=e("./lib/lang");var d=e("./range").Range;var h=e("./keyboard/hash_handler").HashHandler;var j=e("./tokenizer").Tokenizer;var l=d.comparePoints;var a=function(){this.snippetMap={};this.snippetNameMap={}};(function(){this.getTokenizer=function(){function m(q,p,o){q=q.substr(1);if(/^\d+$/.test(q)&&!o.inFormatString){return[{tabstopId:parseInt(q,10)}]}return[{text:q}]}function n(o){return"(?:[^\\\\"+o+"]|\\\\.)"}a.$tokenizer=new j({start:[{regex:/:/,onMatch:function(q,p,o){if(o.length&&o[0].expectIf){o[0].expectIf=false;o[0].elseBranch=o[0];return[o[0]]}return":"}},{regex:/\\./,onMatch:function(r,q,o){var p=r[1];if(p=="}"&&o.length){r=p}else{if("`$\\".indexOf(p)!=-1){r=p}else{if(o.inFormatString){if(p=="n"){r="\n"}else{if(p=="t"){r="\n"}else{if("ulULE".indexOf(p)!=-1){r={changeCase:p,local:p>"a"}}}}}}}return[r]}},{regex:/}/,onMatch:function(q,p,o){return[o.length?o.shift():q]}},{regex:/\$(?:\d+|\w+)/,onMatch:m},{regex:/\$\{[\dA-Z_a-z]+/,onMatch:function(r,q,o){var p=m(r.substr(1),q,o);o.unshift(p[0]);return p},next:"snippetVar"},{regex:/\n/,token:"newline",merge:false}],snippetVar:[{regex:"\\|"+n("\\|")+"*\\|",onMatch:function(q,p,o){o[0].choices=q.slice(1,-1).split(",")},next:"start"},{regex:"/("+n("/")+"+)/(?:("+n("/")+"*)/)(\\w*):?",onMatch:function(r,q,o){var p=o[0];p.fmtString=r;r=this.splitRegex.exec(r);p.guard=r[1];p.fmt=r[2];p.flag=r[3];return""},next:"start"},{regex:"`"+n("`")+"*`",onMatch:function(q,p,o){o[0].code=q.splice(1,-1);return""},next:"start"},{regex:"\\?",onMatch:function(q,p,o){if(o[0]){o[0].expectIf=true}},next:"start"},{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"start"}],formatString:[{regex:"/("+n("/")+"+)/",token:"regex"},{regex:"",onMatch:function(q,p,o){o.inFormatString=true},next:"start"}]});a.prototype.getTokenizer=function(){return a.$tokenizer};return a.$tokenizer};this.tokenizeTmSnippet=function(n,m){return this.getTokenizer().getLineTokens(n,m).tokens.map(function(o){return o.value||o})};this.$getDefaultValue=function(p,m){if(/^[A-Z]\d+$/.test(m)){var n=m.substr(1);return(this.variables[m[0]+"__"]||{})[n]}if(/^\d+$/.test(m)){return(this.variables.__||{})[m]}m=m.replace(/^TM_/,"");if(!p){return}var o=p.session;switch(m){case"CURRENT_WORD":var q=o.getWordRange();case"SELECTION":case"SELECTED_TEXT":return o.getTextRange(q);case"CURRENT_LINE":return o.getLine(p.getCursorPosition().row);case"PREV_LINE":return o.getLine(p.getCursorPosition().row-1);case"LINE_INDEX":return p.getCursorPosition().column;case"LINE_NUMBER":return p.getCursorPosition().row+1;case"SOFT_TABS":return o.getUseSoftTabs()?"YES":"NO";case"TAB_SIZE":return o.getTabSize();case"FILENAME":case"FILEPATH":return"";case"FULLNAME":return"Ace"}};this.variables={};this.getVariableValue=function(m,n){if(this.variables.hasOwnProperty(n)){return this.variables[n](m,n)||""}return this.$getDefaultValue(m,n)||""};this.tmStrFormat=function(t,r,q){var n=r.flag||"";var p=r.guard;p=new RegExp(p,n.replace(/[^gi]/,""));var o=this.tokenizeTmSnippet(r.fmt,"formatString");var m=this;var s=t.replace(p,function(){m.variables.__=arguments;var x=m.resolveVariables(o,q);var y="E";for(var u=0;u=0){u.splice(r,1)}}}if(o.content){m(o)}else{if(Array.isArray(o)){o.forEach(m)}}};this.parseSnippetFile=function(t){t=t.replace(/\r/g,"");var s=[],n={};var v=/^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm;var p;while(p=v.exec(t)){if(p[1]){try{n=JSON.parse(p[1]);s.push(n)}catch(r){}}if(p[4]){n.content=p[4].replace(/^\t/gm,"");s.push(n);n={}}else{var u=p[2],o=p[3];if(u=="regex"){var q=/\/((?:[^\/\\]|\\.)*)|$/g;n.guard=q.exec(o)[1];n.trigger=q.exec(o)[1];n.endTrigger=q.exec(o)[1];n.endGuard=q.exec(o)[1]}else{if(u=="snippet"){n.tabTrigger=o.match(/^\S*/)[0];if(!n.name){n.name=o}}else{n[u]=o}}}}return s};this.getSnippetByName=function(m,n){var p=this.snippetNameMap;var o;this.getActiveScopes(n).some(function(r){var q=p[r];if(q){o=q[m]}return !!o},this);return o}}).call(a.prototype);var i=function(m){if(m.tabstopManager){return m.tabstopManager}m.tabstopManager=this;this.$onChange=this.onChange.bind(this);this.$onChangeSelection=b.delayedCall(this.onChangeSelection.bind(this)).schedule;this.$onChangeSession=this.onChangeSession.bind(this);this.$onAfterExec=this.onAfterExec.bind(this);this.attach(m)};(function(){this.attach=function(m){this.index=-1;this.ranges=[];this.tabstops=[];this.selectedTabstop=null;this.editor=m;this.editor.on("change",this.$onChange);this.editor.on("changeSelection",this.$onChangeSelection);this.editor.on("changeSession",this.$onChangeSession);this.editor.commands.on("afterExec",this.$onAfterExec);this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)};this.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this);this.ranges=null;this.tabstops=null;this.selectedTabstop=null;this.editor.removeListener("change",this.$onChange);this.editor.removeListener("changeSelection",this.$onChangeSelection);this.editor.removeListener("changeSession",this.$onChangeSession);this.editor.commands.removeListener("afterExec",this.$onAfterExec);this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);this.editor.tabstopManager=null;this.editor=null};this.onChange=function(w){var q=w.data.range;var n=w.data.action[0]=="r";var p=q.start;var s=q.end;var z=p.row;var t=s.row;var y=t-z;var v=s.column-p.column;if(n){y=-y;v=-v}if(!this.$inChange&&n){var x=this.selectedTabstop;var A=!x.some(function(B){return l(B.start,p)<=0&&l(B.end,s)>=0});if(A){return this.detach()}}var o=this.ranges;for(var u=0;u0){this.removeRange(m);u--;continue}if(m.start.row==z&&m.start.column>p.column){m.start.column+=v}if(m.end.row==z&&m.end.column>=p.column){m.end.column+=v}if(m.start.row>=z){m.start.row+=y}if(m.end.row>=z){m.end.row+=y}if(l(m.start,m.end)>0){this.removeRange(m)}}if(!o.length){this.detach()}};this.updateLinkedFields=function(){var p=this.selectedTabstop;if(!p.hasLinkedRanges){return}this.$inChange=true;var q=this.editor.session;var r=q.getTextRange(p.firstNonLinked);for(var o=p.length;o--;){var n=p[o];if(!n.linked){continue}var m=f.snippetManager.tmStrFormat(r,n.original);q.replace(n,m)}this.$inChange=false};this.onAfterExec=function(m){if(m.command&&!m.command.readOnly){this.updateLinkedFields()}};this.onChangeSelection=function(){if(!this.editor){return}var o=this.editor.selection.lead;var n=this.editor.selection.anchor;var r=this.editor.selection.isEmpty();for(var p=this.ranges.length;p--;){if(this.ranges[p].linked){continue}var m=this.ranges[p].contains(o.row,o.column);var q=r||this.ranges[p].contains(n.row,n.column);if(m&&q){return}}this.detach()};this.onChangeSession=function(){this.detach()};this.tabNext=function(o){var m=this.tabstops.length-1;var n=this.index+(o||1);n=Math.min(Math.max(n,0),m);this.selectTabstop(n);if(n==m){this.detach()}};this.selectTabstop=function(m){var o=this.tabstops[this.index];if(o){this.addTabstopMarkers(o)}this.index=m;o=this.tabstops[this.index];if(!o||!o.length){return}this.selectedTabstop=o;if(!this.editor.inVirtualSelectionMode){var p=this.editor.multiSelect;p.toSingleRange(o.firstNonLinked.clone());for(var n=o.length;n--;){if(o.hasLinkedRanges&&o[n].linked){continue}p.addRange(o[n].clone(),true)}}else{this.editor.selection.setRange(o.firstNonLinked)}this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)};this.addTabstops=function(t,u,o){if(!t[0]){var s=d.fromPoints(o,o);g(s.start,u);g(s.end,u);t[0]=[s];t[0].index=0}var q=this.index;var m=[q,0];var n=this.ranges;var r=this.editor;t.forEach(function(x){for(var w=x.length;w--;){var y=x[w];var v=d.fromPoints(y.start,y.end||y.start);k(v.start,u);k(v.end,u);v.original=y;v.tabstop=x;n.push(v);x[w]=v;if(y.fmtString){v.linked=true;x.hasLinkedRanges=true}else{if(!x.firstNonLinked){x.firstNonLinked=v}}}if(!x.firstNonLinked){x.hasLinkedRanges=false}m.push(x);this.addTabstopMarkers(x)},this);m.push(m.splice(2,1)[0]);this.tabstops.splice.apply(this.tabstops,m)};this.addTabstopMarkers=function(m){var n=this.editor.session;m.forEach(function(o){if(!o.markerId){o.markerId=n.addMarker(o,"ace_snippet-marker","text")}})};this.removeTabstopMarkers=function(m){var n=this.editor.session;m.forEach(function(o){n.removeMarker(o.markerId);o.markerId=null})};this.removeRange=function(m){var n=m.tabstop.indexOf(m);m.tabstop.splice(n,1);n=this.ranges.indexOf(m);this.ranges.splice(n,1);this.editor.session.removeMarker(m.markerId)};this.keyboardHandler=new h();this.keyboardHandler.bindKeys({Tab:function(m){if(f.snippetManager&&f.snippetManager.expandWithTab(m)){return}m.tabstopManager.tabNext(1)},"Shift-Tab":function(m){m.tabstopManager.tabNext(-1)},Esc:function(m){m.tabstopManager.detach()},Return:function(m){return false}})}).call(i.prototype);var k=function(m,n){if(m.row==0){m.column+=n.column}m.row+=n.row};var g=function(m,n){if(m.row==n.row){m.column-=n.column}m.row-=n.row};e("./lib/dom").importCssString(".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}");f.snippetManager=new a()});define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/event","ace/lib/lang","ace/snippets"],function(f,g,e){var i=f("./keyboard/hash_handler").HashHandler;var k=f("./autocomplete/popup").AcePopup;var h=f("./autocomplete/util");var c=f("./lib/event");var d=f("./lib/lang");var b=f("./snippets").snippetManager;var j=function(){this.autoInsert=true;this.keyboardHandler=new i();this.keyboardHandler.bindKeys(this.commands);this.blurListener=this.blurListener.bind(this);this.changeListener=this.changeListener.bind(this);this.mousedownListener=this.mousedownListener.bind(this);this.mousewheelListener=this.mousewheelListener.bind(this);this.changeTimer=d.delayedCall(function(){this.updateCompletions(true)}.bind(this))};(function(){this.$init=function(){this.popup=new k(document.body||document.documentElement);this.popup.on("click",function(l){this.insertMatch();l.stop()}.bind(this))};this.openPopup=function(m,p,r){if(!this.popup){this.$init()}this.popup.setData(this.completions.filtered);var o=m.renderer;if(!r){this.popup.setRow(0);this.popup.setFontSize(m.getFontSize());var l=o.layerConfig.lineHeight;var q=o.$cursorLayer.getPixelPosition(this.base,true);q.left-=this.popup.getTextLeftOffset();var n=m.container.getBoundingClientRect();q.top+=n.top-o.layerConfig.offset;q.left+=n.left-m.renderer.scrollLeft;q.left+=o.$gutterLayer.gutterWidth;this.popup.show(q,l)}};this.detach=function(){this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);this.editor.off("changeSelection",this.changeListener);this.editor.off("blur",this.blurListener);this.editor.off("mousedown",this.mousedownListener);this.editor.off("mousewheel",this.mousewheelListener);this.changeTimer.cancel();if(this.popup){this.popup.hide()}this.activated=false;this.completions=this.base=null};this.changeListener=function(l){var m=this.editor.selection.lead;if(m.row!=this.base.row||m.column=l?-1:n+1;break;case"start":n=0;break;case"end":n=l;break}this.popup.setRow(n)};this.insertMatch=function(o){if(!o){o=this.popup.getData(this.popup.getRow())}if(!o){return false}if(o.completer&&o.completer.insertMatch){o.completer.insertMatch(this.editor)}else{if(this.completions.filterText){var l=this.editor.selection.getAllRanges();for(var n=0,m;m=l[n];n++){m.start.column-=this.completions.filterText.length;this.editor.session.remove(m)}}if(o.snippet){b.insertSnippet(this.editor,o.snippet)}else{this.editor.execCommand("insertstring",o.value||o)}}this.detach()};this.commands={Up:function(l){l.completer.goTo("up")},Down:function(l){l.completer.goTo("down")},"Ctrl-Up|Ctrl-Home":function(l){l.completer.goTo("start")},"Ctrl-Down|Ctrl-End":function(l){l.completer.goTo("end")},Esc:function(l){l.completer.detach()},Space:function(l){l.completer.detach();l.insert(" ")},Return:function(l){l.completer.insertMatch()},"Shift-Return":function(l){l.completer.insertMatch(true)},Tab:function(l){l.completer.insertMatch()},PageUp:function(l){l.completer.popup.gotoPageUp()},PageDown:function(l){l.completer.popup.gotoPageDown()}};this.gatherCompletions=function(m,r){var p=m.getSession();var q=m.getCursorPosition();var l=p.getLine(q.row);var o=h.retrievePrecedingIdentifier(l,q.column);this.base=m.getCursorPosition();this.base.column-=o.length;var n=[];h.parForEach(m.completers,function(s,t){s.getCompletions(m,p,q,o,function(v,u){if(!v){n=n.concat(u)}t()})},function(){r(null,{prefix:o,matches:n})});return true};this.showPopup=function(l){if(this.editor){this.detach()}this.activated=true;this.editor=l;if(l.completer!=this){if(l.completer){l.completer.detach()}l.completer=this}l.keyBinding.addKeyboardHandler(this.keyboardHandler);l.on("changeSelection",this.changeListener);l.on("blur",this.blurListener);l.on("mousedown",this.mousedownListener);l.on("mousewheel",this.mousewheelListener);this.updateCompletions()};this.updateCompletions=function(n){if(n&&this.base&&this.completions){var m=this.editor.getCursorPosition();var l=this.editor.session.getTextRange({start:this.base,end:m});if(l==this.completions.filterText){return}this.completions.setFilter(l);if(!this.completions.filtered.length){return this.detach()}this.openPopup(this.editor,l,n);return}this.gatherCompletions(this.editor,function(q,p){var r=p&&p.matches;if(!r||!r.length){return this.detach()}this.completions=new a(r);this.completions.setFilter(p.prefix);var o=this.completions.filtered;if(!o.length){return this.detach()}if(this.autoInsert&&o.length==1){return this.insertMatch(o[0])}this.openPopup(this.editor,p.prefix,n)}.bind(this))};this.cancelContextMenu=function(){var l=function(m){this.editor.off("nativecontextmenu",l);if(m&&m.domEvent){c.stopEvent(m.domEvent)}}.bind(this);setTimeout(l,10);this.editor.on("nativecontextmenu",l)}}).call(j.prototype);j.startCommand={name:"startAutocomplete",exec:function(l){if(!l.completer){l.completer=new j()}l.completer.showPopup(l);l.completer.cancelContextMenu()},bindKey:"Ctrl-Space|Ctrl-Shift-Space|Alt-Space"};var a=function(n,m,l){this.all=n;this.filtered=n;this.filterText=m||""};(function(){this.setFilter=function(n){if(n.length>this.filterText&&n.lastIndexOf(this.filterText,0)===0){var m=this.filtered}else{var m=this.all}this.filterText=n;m=this.filterCompletions(m,this.filterText);m=m.sort(function(p,o){return o.exactMatch-p.exactMatch||o.score-p.score});var l=null;m=m.filter(function(p){var o=p.value||p.caption||p.snippet;if(o===l){return false}l=o;return true});this.filtered=m};this.filterCompletions=function(x,q){var r=[];var z=q.toUpperCase();var t=q.toLowerCase();loop:for(var s=0,A;A=x[s];s++){var B=A.value||A.caption||A.snippet;if(!B){continue}var v=-1;var p=0;var y=0;var w,l;for(var o=0;o=0)?((m<0||n0){if(v===-1){y+=10}y+=l}p=p|(1<=0;){if(!r[s]){continue}if(r[s].meta=="local"&&u.indexOf(r[s].caption)!=-1){r.splice(s,1)}}return r}}).call(a.prototype);g.Autocomplete=j;g.FilteredList=a});define("ace/autocomplete/popup",["require","exports","module","ace/edit_session","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"],function(g,j,e){var a=g("../edit_session").EditSession;var i=g("../virtual_renderer").VirtualRenderer;var k=g("../editor").Editor;var f=g("../range").Range;var b=g("../lib/event");var d=g("../lib/lang");var h=g("../lib/dom");var c=function(n){var o=new i(n);o.$maxLines=4;var m=new k(o);m.setHighlightActiveLine(false);m.setShowPrintMargin(false);m.renderer.setShowGutter(false);m.renderer.setHighlightGutterLine(false);m.$mouseHandler.$focusWaitTimout=0;return m};var l=function(q){var o=h.createElement("div");var m=new c(o);if(q){q.appendChild(o)}o.style.display="none";m.renderer.content.style.cursor="default";m.renderer.setStyle("ace_autocomplete");m.setOption("displayIndentGuides",false);var v=function(){};m.focus=v;m.$isFocused=true;m.renderer.$cursorLayer.restartTimer=v;m.renderer.$cursorLayer.element.style.opacity=0;m.renderer.$maxLines=8;m.renderer.$keepTextAreaAtCursor=false;m.setHighlightActiveLine(false);m.session.highlight("");m.session.$searchHighlight.clazz="ace_highlight-marker";m.on("mousedown",function(w){var x=w.getDocumentPosition();m.selection.moveToPosition(x);t.start.row=t.end.row=x.row;w.stop()});var n;var s=new f(-1,0,-1,Infinity);var t=new f(-1,0,-1,Infinity);t.id=m.session.addMarker(t,"ace_active-line","fullLine");m.setSelectOnHover=function(w){if(!w){s.id=m.session.addMarker(s,"ace_line-hover","fullLine")}else{if(s.id){m.session.removeMarker(s.id);s.id=null}}};m.setSelectOnHover(false);m.on("mousemove",function(w){if(!n){n=w;return}if(n.x==w.x&&n.y==w.y){return}n=w;n.scrollTop=m.renderer.scrollTop;var x=n.getDocumentPosition().row;if(s.start.row!=x){if(!s.id){m.setRow(x)}p(x)}});m.renderer.on("beforeRender",function(){if(n&&s.start.row!=-1){n.$pos=null;var w=n.getDocumentPosition().row;if(!s.id){m.setRow(w)}p(w,true)}});m.renderer.on("afterRender",function(){var y=m.getRow();var w=m.renderer.$textLayer;var x=w.element.childNodes[y-w.config.firstRow];if(x==w.selectedNode){return}if(w.selectedNode){h.removeCssClass(w.selectedNode,"ace_selected")}w.selectedNode=x;if(x){h.addCssClass(x,"ace_selected")}});var u=function(){p(-1)};var p=function(x,w){if(x!==s.start.row){s.start.row=s.end.row=x;if(!w){m.session._emit("changeBackMarker")}m._emit("changeHoverMarker")}};m.getHoveredRow=function(){return s.start.row};b.addListener(m.container,"mouseout",u);m.on("hide",u);m.on("changeSelection",u);m.session.doc.getLength=function(){return m.data.length};m.session.doc.getLine=function(w){var x=m.data[w];if(typeof x=="string"){return x}return(x&&x.value)||""};var r=m.session.bgTokenizer;r.$tokenizeRow=function(x){var z=m.data[x];var A=[];if(!z){return A}if(typeof z=="string"){z={value:z}}if(!z.caption){z.caption=z.value}var y=-1;var w,C;for(var x=0;xx-F&&!A){y.style.top="";y.style.bottom=x-C+"px";m.isTopdown=false}else{C+=F;y.style.top=C+"px";y.style.bottom="";m.isTopdown=true}y.style.display="";this.renderer.$textLayer.checkForSizeChanges();var z=D.left;if(z+y.offsetWidth>w){z=w-y.offsetWidth}y.style.left=z+"px";this._signal("show");n=null;m.isOpen=true};m.getTextLeftOffset=function(){return this.$borderSize+this.renderer.$padding+this.$imageSize};m.$imageSize=0;m.$borderSize=1;return m};h.importCssString(".ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line { background-color: #CAD6FA; z-index: 1;}.ace_autocomplete.ace-tm .ace_line-hover { border: 1px solid #abbffe; margin-top: -1px; background: rgba(233,233,253,0.4);}.ace_autocomplete .ace_line-hover { position: absolute; z-index: 2;}.ace_rightAlignedText { color: gray; display: inline-block; position: absolute; right: 4px; text-align: right; z-index: -1;}.ace_autocomplete .ace_completion-highlight{ color: #000; text-shadow: 0 0 0.01em;}.ace_autocomplete { width: 280px; z-index: 200000; background: #fbfbfb; color: #444; border: 1px lightgray solid; position: fixed; box-shadow: 2px 3px 5px rgba(0,0,0,.2); line-height: 1.4;}");j.AcePopup=l});define("ace/autocomplete/util",["require","exports","module"],function(c,b,d){b.parForEach=function(k,h,j){var g=0;var e=k.length;if(e===0){j()}for(var f=0;f=0;f--){if(g.test(h[f])){e.push(h[f])}else{break}}return e.reverse().join("")};b.retrieveFollowingIdentifier=function(h,j,g){g=g||a;var e=[];for(var f=j;f\s+/g,">");var a=function(m,l,n){var o=g.createElement("div");o.innerHTML=i;this.element=o.firstChild;this.$init();this.setEditor(m)};(function(){this.setEditor=function(l){l.searchBox=this;l.container.appendChild(this.element);this.editor=l};this.$initElements=function(l){this.searchBox=l.querySelector(".ace_search_form");this.replaceBox=l.querySelector(".ace_replace_form");this.searchOptions=l.querySelector(".ace_search_options");this.regExpOption=l.querySelector("[action=toggleRegexpMode]");this.caseSensitiveOption=l.querySelector("[action=toggleCaseSensitive]");this.wholeWordOption=l.querySelector("[action=toggleWholeWords]");this.searchInput=this.searchBox.querySelector(".ace_search_field");this.replaceInput=this.replaceBox.querySelector(".ace_search_field")};this.$init=function(){var m=this.element;this.$initElements(m);var l=this;b.addListener(m,"mousedown",function(n){setTimeout(function(){l.activeInput.focus()},0);b.stopPropagation(n)});b.addListener(m,"click",function(p){var n=p.target||p.srcElement;var o=n.getAttribute("action");if(o&&l[o]){l[o]()}else{if(l.$searchBarKb.commands[o]){l.$searchBarKb.commands[o].exec(l)}}b.stopPropagation(p)});b.addCommandKeyListener(m,function(q,o,p){var n=f.keyCodeToString(p);var r=l.$searchBarKb.findKeyCommand(o,n);if(r&&r.exec){r.exec(l);b.stopEvent(q)}});this.$onChange=c.delayedCall(function(){l.find(false,false)});b.addListener(this.searchInput,"input",function(){l.$onChange.schedule(20)});b.addListener(this.searchInput,"focus",function(){l.activeInput=l.searchInput;l.searchInput.value&&l.highlight()});b.addListener(this.replaceInput,"focus",function(){l.activeInput=l.replaceInput;l.searchInput.value&&l.highlight()})};this.$closeSearchBarKb=new j([{bindKey:"Esc",name:"closeSearchBar",exec:function(l){l.searchBox.hide()}}]);this.$searchBarKb=new j();this.$searchBarKb.bindKeys({"Ctrl-f|Command-f|Ctrl-H|Command-Option-F":function(m){var l=m.isReplace=!m.isReplace;m.replaceBox.style.display=l?"":"none";m[l?"replaceInput":"searchInput"].focus()},"Ctrl-G|Command-G":function(l){l.findNext()},"Ctrl-Shift-G|Command-Shift-G":function(l){l.findPrev()},esc:function(l){setTimeout(function(){l.hide()})},Return:function(l){if(l.activeInput==l.replaceInput){l.replace()}l.findNext()},"Shift-Return":function(l){if(l.activeInput==l.replaceInput){l.replace()}l.findPrev()},Tab:function(l){(l.activeInput==l.replaceInput?l.searchInput:l.replaceInput).focus()}});this.$searchBarKb.addCommands([{name:"toggleRegexpMode",bindKey:{win:"Alt-R|Alt-/",mac:"Ctrl-Alt-R|Ctrl-Alt-/"},exec:function(l){l.regExpOption.checked=!l.regExpOption.checked;l.$syncOptions()}},{name:"toggleCaseSensitive",bindKey:{win:"Alt-C|Alt-I",mac:"Ctrl-Alt-R|Ctrl-Alt-I"},exec:function(l){l.caseSensitiveOption.checked=!l.caseSensitiveOption.checked;l.$syncOptions()}},{name:"toggleWholeWords",bindKey:{win:"Alt-B|Alt-W",mac:"Ctrl-Alt-B|Ctrl-Alt-W"},exec:function(l){l.wholeWordOption.checked=!l.wholeWordOption.checked;l.$syncOptions()}}]);this.$syncOptions=function(){g.setCssClass(this.regExpOption,"checked",this.regExpOption.checked);g.setCssClass(this.wholeWordOption,"checked",this.wholeWordOption.checked);g.setCssClass(this.caseSensitiveOption,"checked",this.caseSensitiveOption.checked);this.find(false,false)};this.highlight=function(l){this.editor.session.highlight(l||this.editor.$search.$options.re);this.editor.renderer.updateBackMarkers()};this.find=function(o,m){var n=this.editor.find(this.searchInput.value,{skipCurrent:o,backwards:m,wrap:true,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked});var l=!n&&this.searchInput.value;g.setCssClass(this.searchBox,"ace_nomatch",l);this.editor._emit("findSearchBox",{match:!l});this.highlight()};this.findNext=function(){this.find(true,false)};this.findPrev=function(){this.find(true,true)};this.replace=function(){if(!this.editor.getReadOnly()){this.editor.replace(this.replaceInput.value)}};this.replaceAndFindNext=function(){if(!this.editor.getReadOnly()){this.editor.replace(this.replaceInput.value);this.findNext()}};this.replaceAll=function(){if(!this.editor.getReadOnly()){this.editor.replaceAll(this.replaceInput.value)}};this.hide=function(){this.element.style.display="none";this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);this.editor.focus()};this.show=function(l,m){this.element.style.display="";this.replaceBox.style.display=m?"":"none";this.isReplace=m;if(l){this.searchInput.value=l}this.searchInput.focus();this.searchInput.select();this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb)}}).call(a.prototype);h.SearchBox=a;h.Search=function(l,m){var n=l.searchBox||new a(l);n.show(l.session.getTextRange(),m)}});(function(){window.require(["ace/ext/old_ie"],function(){})})();define("ace/ext/searchbox",["require","exports","module","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/keyboard/hash_handler","ace/lib/keys"],function(e,h,d){var g=e("../lib/dom");var c=e("../lib/lang");var b=e("../lib/event");var k="/* ------------------------------------------------------------------------------------------* Editor Search Form* --------------------------------------------------------------------------------------- */.ace_search {background-color: #ddd;border: 1px solid #cbcbcb;border-top: 0 none;max-width: 297px;overflow: hidden;margin: 0;padding: 4px;padding-right: 6px;padding-bottom: 0;position: absolute;top: 0px;z-index: 99;white-space: normal;}.ace_search.left {border-left: 0 none;border-radius: 0px 0px 5px 0px;left: 0;}.ace_search.right {border-radius: 0px 0px 0px 5px;border-right: 0 none;right: 0;}.ace_search_form, .ace_replace_form {border-radius: 3px;border: 1px solid #cbcbcb;float: left;margin-bottom: 4px;overflow: hidden;}.ace_search_form.ace_nomatch {outline: 1px solid red;}.ace_search_field {background-color: white;border-right: 1px solid #cbcbcb;border: 0 none;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;display: block;float: left;height: 22px;outline: 0;padding: 0 7px;width: 214px;margin: 0;}.ace_searchbtn,.ace_replacebtn {background: #fff;border: 0 none;border-left: 1px solid #dcdcdc;cursor: pointer;display: block;float: left;height: 22px;margin: 0;padding: 0;position: relative;}.ace_searchbtn:last-child,.ace_replacebtn:last-child {border-top-right-radius: 3px;border-bottom-right-radius: 3px;}.ace_searchbtn:disabled {background: none;cursor: default;}.ace_searchbtn {background-position: 50% 50%;background-repeat: no-repeat;width: 27px;}.ace_searchbtn.prev {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=); }.ace_searchbtn.next {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=); }.ace_searchbtn_close {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;border-radius: 50%;border: 0 none;color: #656565;cursor: pointer;display: block;float: right;font-family: Arial;font-size: 16px;height: 14px;line-height: 16px;margin: 5px 1px 9px 5px;padding: 0;text-align: center;width: 14px;}.ace_searchbtn_close:hover {background-color: #656565;background-position: 50% 100%;color: white;}.ace_replacebtn.prev {width: 54px}.ace_replacebtn.next {width: 27px}.ace_button {margin-left: 2px;cursor: pointer;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;overflow: hidden;opacity: 0.7;border: 1px solid rgba(100,100,100,0.23);padding: 1px;-moz-box-sizing: border-box;box-sizing: border-box;color: black;}.ace_button:hover {background-color: #eee;opacity:1;}.ace_button:active {background-color: #ddd;}.ace_button.checked {border-color: #3399ff;opacity:1;}.ace_search_options{margin-bottom: 3px;text-align: right;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;}";var j=e("../keyboard/hash_handler").HashHandler;var f=e("../lib/keys");g.importCssString(k,"ace_searchbox");var i=''.replace(/>\s+/g,">");var a=function(m,l,n){var o=g.createElement("div");o.innerHTML=i;this.element=o.firstChild;this.$init();this.setEditor(m)};(function(){this.setEditor=function(l){l.searchBox=this;l.container.appendChild(this.element);this.editor=l};this.$initElements=function(l){this.searchBox=l.querySelector(".ace_search_form");this.replaceBox=l.querySelector(".ace_replace_form");this.searchOptions=l.querySelector(".ace_search_options");this.regExpOption=l.querySelector("[action=toggleRegexpMode]");this.caseSensitiveOption=l.querySelector("[action=toggleCaseSensitive]");this.wholeWordOption=l.querySelector("[action=toggleWholeWords]");this.searchInput=this.searchBox.querySelector(".ace_search_field");this.replaceInput=this.replaceBox.querySelector(".ace_search_field")};this.$init=function(){var m=this.element;this.$initElements(m);var l=this;b.addListener(m,"mousedown",function(n){setTimeout(function(){l.activeInput.focus()},0);b.stopPropagation(n)});b.addListener(m,"click",function(p){var n=p.target||p.srcElement;var o=n.getAttribute("action");if(o&&l[o]){l[o]()}else{if(l.$searchBarKb.commands[o]){l.$searchBarKb.commands[o].exec(l)}}b.stopPropagation(p)});b.addCommandKeyListener(m,function(q,o,p){var n=f.keyCodeToString(p);var r=l.$searchBarKb.findKeyCommand(o,n);if(r&&r.exec){r.exec(l);b.stopEvent(q)}});this.$onChange=c.delayedCall(function(){l.find(false,false)});b.addListener(this.searchInput,"input",function(){l.$onChange.schedule(20)});b.addListener(this.searchInput,"focus",function(){l.activeInput=l.searchInput;l.searchInput.value&&l.highlight()});b.addListener(this.replaceInput,"focus",function(){l.activeInput=l.replaceInput;l.searchInput.value&&l.highlight()})};this.$closeSearchBarKb=new j([{bindKey:"Esc",name:"closeSearchBar",exec:function(l){l.searchBox.hide()}}]);this.$searchBarKb=new j();this.$searchBarKb.bindKeys({"Ctrl-f|Command-f|Ctrl-H|Command-Option-F":function(m){var l=m.isReplace=!m.isReplace;m.replaceBox.style.display=l?"":"none";m[l?"replaceInput":"searchInput"].focus()},"Ctrl-G|Command-G":function(l){l.findNext()},"Ctrl-Shift-G|Command-Shift-G":function(l){l.findPrev()},esc:function(l){setTimeout(function(){l.hide()})},Return:function(l){if(l.activeInput==l.replaceInput){l.replace()}l.findNext()},"Shift-Return":function(l){if(l.activeInput==l.replaceInput){l.replace()}l.findPrev()},Tab:function(l){(l.activeInput==l.replaceInput?l.searchInput:l.replaceInput).focus()}});this.$searchBarKb.addCommands([{name:"toggleRegexpMode",bindKey:{win:"Alt-R|Alt-/",mac:"Ctrl-Alt-R|Ctrl-Alt-/"},exec:function(l){l.regExpOption.checked=!l.regExpOption.checked;l.$syncOptions()}},{name:"toggleCaseSensitive",bindKey:{win:"Alt-C|Alt-I",mac:"Ctrl-Alt-R|Ctrl-Alt-I"},exec:function(l){l.caseSensitiveOption.checked=!l.caseSensitiveOption.checked;l.$syncOptions()}},{name:"toggleWholeWords",bindKey:{win:"Alt-B|Alt-W",mac:"Ctrl-Alt-B|Ctrl-Alt-W"},exec:function(l){l.wholeWordOption.checked=!l.wholeWordOption.checked;l.$syncOptions()}}]);this.$syncOptions=function(){g.setCssClass(this.regExpOption,"checked",this.regExpOption.checked);g.setCssClass(this.wholeWordOption,"checked",this.wholeWordOption.checked);g.setCssClass(this.caseSensitiveOption,"checked",this.caseSensitiveOption.checked);this.find(false,false)};this.highlight=function(l){this.editor.session.highlight(l||this.editor.$search.$options.re);this.editor.renderer.updateBackMarkers()};this.find=function(o,m){var n=this.editor.find(this.searchInput.value,{skipCurrent:o,backwards:m,wrap:true,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked});var l=!n&&this.searchInput.value;g.setCssClass(this.searchBox,"ace_nomatch",l);this.editor._emit("findSearchBox",{match:!l});this.highlight()};this.findNext=function(){this.find(true,false)};this.findPrev=function(){this.find(true,true)};this.replace=function(){if(!this.editor.getReadOnly()){this.editor.replace(this.replaceInput.value)}};this.replaceAndFindNext=function(){if(!this.editor.getReadOnly()){this.editor.replace(this.replaceInput.value);this.findNext()}};this.replaceAll=function(){if(!this.editor.getReadOnly()){this.editor.replaceAll(this.replaceInput.value)}};this.hide=function(){this.element.style.display="none";this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);this.editor.focus()};this.show=function(l,m){this.element.style.display="";this.replaceBox.style.display=m?"":"none";this.isReplace=m;if(l){this.searchInput.value=l}this.searchInput.focus();this.searchInput.select();this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb)}}).call(a.prototype);h.SearchBox=a;h.Search=function(l,m){var n=l.searchBox||new a(l);n.show(l.session.getTextRange(),m)}});(function(){window.require(["ace/ext/searchbox"],function(){})})();define("ace/ext/settings_menu",["require","exports","module","ace/ext/menu_tools/generate_settings_menu","ace/ext/menu_tools/overlay_page","ace/editor"],function(c,a,e){var b=c("./menu_tools/generate_settings_menu").generateSettingsMenu;var f=c("./menu_tools/overlay_page").overlayPage;function d(g){var h=document.getElementById("ace_settingsmenu");if(!h){f(g,b(g),"0","0","0")}}e.exports.init=function(h){var g=c("ace/editor").Editor;g.prototype.showSettingsMenu=function(){d(this)}}});define("ace/ext/menu_tools/generate_settings_menu",["require","exports","module","ace/ext/menu_tools/element_generator","ace/ext/menu_tools/add_editor_menu_options","ace/ext/menu_tools/get_set_functions"],function(f,c,g){var e=f("./element_generator");var b=f("./add_editor_menu_options").addEditorMenuOptions;var a=f("./get_set_functions").getSetFunctions;g.exports.generateSettingsMenu=function d(i){var k=[];function l(){k.sort(function(q,p){var o=q.getAttribute("contains");var r=p.getAttribute("contains");return o.localeCompare(r)})}function h(){var o=document.createElement("div");o.setAttribute("id","ace_settingsmenu");k.forEach(function(p){o.appendChild(p)});return o}function m(r,o,q,s){var p;var t=document.createElement("div");t.setAttribute("contains",q);t.setAttribute("class","ace_optionsMenuEntry");t.setAttribute("style","clear: both;");t.appendChild(e.createLabel(q.replace(/^set/,"").replace(/([A-Z])/g," $1").trim(),q));if(Array.isArray(s)){p=e.createSelection(q,s,o);p.addEventListener("change",function(v){try{i.menuOptions[v.target.id].forEach(function(w){if(w.textContent!==v.target.textContent){delete w.selected}});r[v.target.id](v.target.value)}catch(u){throw new Error(u)}})}else{if(typeof s==="boolean"){p=e.createCheckbox(q,s,o);p.addEventListener("change",function(v){try{r[v.target.id](!!v.target.checked)}catch(u){throw new Error(u)}})}else{p=e.createInput(q,s,o);p.addEventListener("change",function(v){try{if(v.target.value==="true"){r[v.target.id](true)}else{if(v.target.value==="false"){r[v.target.id](false)}else{r[v.target.id](v.target.value)}}}catch(u){throw new Error(u)}})}}p.style.cssText="float:right;";t.appendChild(p);return t}function n(r,s,o,q){var t=i.menuOptions[r];var p=s[q]();if(typeof p=="object"){p=p.$id}t.forEach(function(u){if(u.value===p){u.selected="selected"}});return m(s,o,r,t)}function j(r){var q=r.functionName;var t=r.parentObj;var o=r.parentName;var u;var p=q.replace(/^set/,"get");if(i.menuOptions[q]!==undefined){k.push(n(q,t,o,p))}else{if(typeof t[p]==="function"){try{u=t[p]();if(typeof u==="object"){u=u.$id}k.push(m(t,o,q,u))}catch(s){}}}}b(i);a(i).forEach(function(o){j(o)});l();return h()}});define("ace/ext/menu_tools/element_generator",["require","exports","module"],function(d,a,f){f.exports.createOption=function c(k){var j;var i=document.createElement("option");for(j in k){if(k.hasOwnProperty(j)){if(j==="selected"){i.setAttribute(j,k[j])}else{i[j]=k[j]}}}return i};f.exports.createCheckbox=function h(l,k,i){var j=document.createElement("input");j.setAttribute("type","checkbox");j.setAttribute("id",l);j.setAttribute("name",l);j.setAttribute("value",k);j.setAttribute("class",i);if(k){j.setAttribute("checked","checked")}return j};f.exports.createInput=function b(l,k,i){var j=document.createElement("input");j.setAttribute("type","text");j.setAttribute("id",l);j.setAttribute("name",l);j.setAttribute("value",k);j.setAttribute("class",i);return j};f.exports.createLabel=function e(k,j){var i=document.createElement("label");i.setAttribute("for",j);i.textContent=k;return i};f.exports.createSelection=function g(l,j,i){var k=document.createElement("select");k.setAttribute("id",l);k.setAttribute("name",l);k.setAttribute("class",i);j.forEach(function(m){k.appendChild(f.exports.createOption(m))});return k}});define("ace/ext/menu_tools/add_editor_menu_options",["require","exports","module","ace/ext/modelist","ace/ext/themelist"],function(c,b,d){d.exports.addEditorMenuOptions=function a(f){var g=c("../modelist");var e=c("../themelist");f.menuOptions={setNewLineMode:[{textContent:"unix",value:"unix"},{textContent:"windows",value:"windows"},{textContent:"auto",value:"auto"}],setTheme:[],setMode:[],setKeyboardHandler:[{textContent:"ace",value:""},{textContent:"vim",value:"ace/keyboard/vim"},{textContent:"emacs",value:"ace/keyboard/emacs"}]};f.menuOptions.setTheme=e.themes.map(function(h){return{textContent:h.caption,value:h.theme}});f.menuOptions.setMode=g.modes.map(function(h){return{textContent:h.name,value:h.mode}})}});define("ace/ext/modelist",["require","exports","module"],function(f,g,e){var d=[];function l(p){var q=k.text;var r=p.split(/[\/\\]/).pop();for(var o=0;o 0!"}if(m==this.$splits){return}else{if(m>this.$splits){while(this.$splitsm){l=this.$editors[this.$splits-1];this.$container.removeChild(l.container);this.$splits--}}}this.resize()};this.getSplits=function(){return this.$splits};this.getEditor=function(l){return this.$editors[l]};this.getCurrentEditor=function(){return this.$cEditor};this.focus=function(){this.$cEditor.focus()};this.blur=function(){this.$cEditor.blur()};this.setTheme=function(l){this.$editors.forEach(function(m){m.setTheme(l)})};this.setKeyboardHandler=function(l){this.$editors.forEach(function(m){m.setKeyboardHandler(l)})};this.forEach=function(m,l){this.$editors.forEach(m,l)};this.$fontSize="";this.setFontSize=function(l){this.$fontSize=l;this.forEach(function(m){m.setFontSize(l)})};this.$cloneSession=function(o){var m=new a(o.getDocument(),o.getMode());var n=o.getUndoManager();if(n){var l=new j(n,m);m.setUndoManager(l)}m.$informUndoManager=b.delayedCall(function(){m.$deltas=[]});m.setTabSize(o.getTabSize());m.setUseSoftTabs(o.getUseSoftTabs());m.setOverwrite(o.getOverwrite());m.setBreakpoints(o.getBreakpoints());m.setUseWrapMode(o.getUseWrapMode());m.setUseWorker(o.getUseWorker());m.setWrapLimitRange(o.$wrapLimitRange.min,o.$wrapLimitRange.max);m.$foldData=o.$cloneFoldData();return m};this.setSession=function(o,l){var m;if(l==null){m=this.$cEditor}else{m=this.$editors[l]}var n=this.$editors.some(function(p){return p.session===o});if(n){o=this.$cloneSession(o)}m.setSession(o);return o};this.getOrientation=function(){return this.$orientation};this.setOrientation=function(l){if(this.$orientation==l){return}this.$orientation=l;this.resize()};this.resize=function(){var p=this.$container.clientWidth;var m=this.$container.clientHeight;var o;if(this.$orientation==this.BESIDE){var q=p/this.$splits;for(var n=0;n");if(!m){k.push("")}j.$renderLine(k,n,true,false);k.push("\n")}var p="
"+k.join("")+"
";j.destroy();return{css:i+o.cssText,html:p,session:s}};b.exports=e;b.exports.highlight=e});(function(){window.require(["ace/ext/static_highlight"],function(){})})();define("ace/ext/statusbar",["require","exports","module","ace/lib/dom","ace/lib/lang"],function(c,b,d){var f=c("ace/lib/dom");var e=c("ace/lib/lang");var a=function(i,g){this.element=f.createElement("div");this.element.className="ace_status-indicator";this.element.style.cssText="display: inline-block;";g.appendChild(this.element);var h=e.delayedCall(function(){this.updateStatus(i)}.bind(this));i.on("changeStatus",function(){h.schedule(100)});i.on("changeSelection",function(){h.schedule(100)})};(function(){this.updateStatus=function(h){var g=[];function j(m,l){m&&g.push(m,l||"|")}if(h.$vimModeHandler){j(h.$vimModeHandler.getStatusText())}else{if(h.commands.recording){j("REC")}}var k=h.selection.lead;j(k.row+":"+k.column," ");if(!h.selection.isEmpty()){var i=h.getSelectionRange();j("("+(i.end.row-i.start.row)+":"+(i.end.column-i.start.column)+")")}g.pop();this.element.textContent=g.join("")}}).call(a.prototype);b.StatusBar=a});(function(){window.require(["ace/ext/statusbar"],function(){})})();define("ace/ext/textarea",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/net","ace/ace","ace/theme/textmate","ace/mode/text"],function(d,f,b){var a=d("../lib/event");var h=d("../lib/useragent");var j=d("../lib/net");var c=d("../ace");d("../theme/textmate");b.exports=f=c;var i=function(p,n,q){var o=p.style[q];if(!o){if(window.getComputedStyle){o=window.getComputedStyle(p,"").getPropertyValue(q)}else{o=p.currentStyle[q]}}if(!o||o=="auto"||o=="intrinsic"){o=n.style[q]}return o};function g(p,o){for(var n in o){p.style[n]=o[n]}}function m(r,p){if(r.type!="textarea"){throw new Error("Textarea required!")}var n=r.parentNode;var o=document.createElement("div");var s=function(){var v="position:relative;";["margin-top","margin-left","margin-right","margin-bottom"].forEach(function(w){v+=w+":"+i(r,o,w)+";"});var u=i(r,o,"width")||(r.clientWidth+"px");var t=i(r,o,"height")||(r.clientHeight+"px");v+="height:"+t+";width:"+u+";";v+="display:inline-block;";o.setAttribute("style",v)};a.addListener(window,"resize",s);s();n.insertBefore(o,r.nextSibling);while(n!==document){if(n.tagName.toUpperCase()==="FORM"){var q=n.onsubmit;n.onsubmit=function(t){r.value=p();if(q){q.call(this,t)}};break}n=n.parentNode}return o}f.transformTextarea=function(s,w){var u;var o=m(s,function(){return u.getValue()});s.style.display="none";o.style.background="white";var p=document.createElement("div");g(p,{top:"0px",left:"0px",right:"0px",bottom:"0px",border:"1px solid gray",position:"absolute"});o.appendChild(p);var q=document.createElement("div");g(q,{position:"absolute",right:"0px",bottom:"0px",background:"red",cursor:"nw-resize",borderStyle:"solid",borderWidth:"9px 8px 10px 9px",width:"2px",borderColor:"lightblue gray gray lightblue",zIndex:101});var v=document.createElement("div");var r={top:"0px",left:"20%",right:"0px",bottom:"0px",position:"absolute",padding:"5px",zIndex:100,color:"white",display:"none",overflow:"auto",fontSize:"14px",boxShadow:"-5px 2px 3px gray"};if(!h.isOldIE){r.backgroundColor="rgba(0, 0, 0, 0.6)"}else{r.backgroundColor="#333"}g(v,r);o.appendChild(v);var x={};var t=c.edit(p);u=t.getSession();u.setValue(s.value||s.innerHTML);t.focus();o.appendChild(q);l(t,p,v,c,x,w);e(v,q,t,x);var n="";a.addListener(q,"mousemove",function(B){var A=this.getBoundingClientRect();var z=B.clientX-A.left,C=B.clientY-A.top;if(z+C<(A.width+A.height)/2){this.style.cursor="pointer";n="toggle"}else{n="resize";this.style.cursor="nw-resize"}});a.addListener(q,"mousedown",function(B){if(n=="toggle"){t.setDisplaySettings();return}o.style.zIndex=100000;var A=o.getBoundingClientRect();var z=A.width+A.left-B.clientX;var y=A.height+A.top-B.clientY;a.capture(q,function(C){o.style.width=C.clientX-A.left+z+"px";o.style.height=C.clientY-A.top+y+"px";t.resize()},function(){})});return t};function k(n,o,p){j.loadScript(n,function(){d([o],p)})}function l(q,n,t,o,v,u){var s=q.getSession();var r=q.renderer;u=u||k;function p(w){return w==="true"||w==true}q.setDisplaySettings=function(x){if(x==null){x=t.style.display=="none"}if(x){t.style.display="block";t.hideButton.focus();q.on("focus",function w(){q.removeListener("focus",w);t.style.display="none"})}else{q.focus()}};q.$setOption=q.setOption;q.setOption=function(w,x){if(v[w]==x){return}switch(w){case"mode":if(x!="text"){u("mode-"+x+".js","ace/mode/"+x,function(){var y=d("../mode/"+x).Mode;s.setMode(new y())})}else{s.setMode(new (d("../mode/text").Mode))}break;case"theme":if(x!="textmate"){u("theme-"+x+".js","ace/theme/"+x,function(){q.setTheme("ace/theme/"+x)})}else{q.setTheme("ace/theme/textmate")}break;case"fontSize":n.style.fontSize=x;break;case"keybindings":switch(x){case"vim":q.setKeyboardHandler("ace/keyboard/vim");break;case"emacs":q.setKeyboardHandler("ace/keyboard/emacs");break;default:q.setKeyboardHandler(null)}break;case"softWrap":switch(x){case"off":s.setUseWrapMode(false);r.setPrintMarginColumn(80);break;case"40":s.setUseWrapMode(true);s.setWrapLimitRange(40,40);r.setPrintMarginColumn(40);break;case"80":s.setUseWrapMode(true);s.setWrapLimitRange(80,80);r.setPrintMarginColumn(80);break;case"free":s.setUseWrapMode(true);s.setWrapLimitRange(null,null);r.setPrintMarginColumn(80);break}break;default:q.$setOption(w,p(x))}v[w]=x};q.getOption=function(w){return v[w]};q.getOptions=function(){return v};q.setOptions(f.options);return q}function e(A,o,v,C){var n=null;var u={mode:"Mode:",gutter:"Display Gutter:",theme:"Theme:",fontSize:"Font Size:",softWrap:"Soft Wrap:",keybindings:"Keyboard",showPrintMargin:"Show Print Margin:",useSoftTabs:"Use Soft Tabs:",showInvisibles:"Show Invisibles"};var z={mode:{text:"Plain",javascript:"JavaScript",xml:"XML",html:"HTML",css:"CSS",scss:"SCSS",python:"Python",php:"PHP",java:"Java",ruby:"Ruby",c_cpp:"C/C++",coffee:"CoffeeScript",json:"json",perl:"Perl",clojure:"Clojure",ocaml:"OCaml",csharp:"C#",haxe:"haXe",svg:"SVG",textile:"Textile",groovy:"Groovy",liquid:"Liquid",Scala:"Scala"},theme:{clouds:"Clouds",clouds_midnight:"Clouds Midnight",cobalt:"Cobalt",crimson_editor:"Crimson Editor",dawn:"Dawn",eclipse:"Eclipse",idle_fingers:"Idle Fingers",kr_theme:"Kr Theme",merbivore:"Merbivore",merbivore_soft:"Merbivore Soft",mono_industrial:"Mono Industrial",monokai:"Monokai",pastel_on_dark:"Pastel On Dark",solarized_dark:"Solarized Dark",solarized_light:"Solarized Light",textmate:"Textmate",twilight:"Twilight",vibrant_ink:"Vibrant Ink"},gutter:n,fontSize:{"10px":"10px","11px":"11px","12px":"12px","14px":"14px","16px":"16px"},softWrap:{off:"Off",40:"40",80:"80",free:"Free"},keybindings:{ace:"ace",vim:"vim",emacs:"emacs"},showPrintMargin:n,useSoftTabs:n,showInvisibles:n};var B=[];B.push("");function p(D,F,H,E){if(!H){D.push("");return}D.push("")}for(var t in C){B.push("");B.push("")}B.push("
SettingValue
",u[t],"");p(B,t,z[t],C[t]);B.push("
");A.innerHTML=B.join("");var w=function(E){var D=E.currentTarget;v.setOption(D.title,D.value)};var y=function(E){var D=E.currentTarget;v.setOption(D.title,D.checked)};var x=A.getElementsByTagName("select");for(var r=0;r0&&!(h%p)&&!(l%p)){w[p]=(w[p]||0)+1}v[l]=(v[l]||0)+1}h=l;while(sj.score){j={score:t,length:s}}}if(j.score&&j.score>1.4){var e=j.length}if(o>k+1){return{ch:"\t",length:e}}if(k+1>o){return{ch:" ",length:e}}};a.detectIndentation=function(g){var f=g.getLines(0,1000);var e=a.$detectIndentation(f)||{};if(e.ch){g.setUseSoftTabs(e.ch==" ")}if(e.length){g.setTabSize(e.length)}return e};a.trimTrailingSpace=function(k,f){var m=k.getDocument();var n=m.getAllLines();var g=f?-1:0;for(var h=0,e=n.length;hg){m.removeInLine(h,j,o.length)}}};a.convertIndentation=function(f,r,x){var q=f.getTabString()[0];var m=f.getTabSize();if(!x){x=m}if(!r){r=q}var h=r=="\t"?r:d.stringRepeat(r,x);var y=f.doc;var e=y.getAllLines();var s={};var g={};for(var v=0,t=e.length;v30){this.$data.shift()}},get:function(q){q=q||1;return this.$data.slice(this.$data.length-q,this.$data.length).reverse().join("\n")},pop:function(){if(this.$data.length>1){this.$data.pop()}return this.get()},rotate:function(){this.$data.unshift(this.$data.pop());return this.get()}}});define("ace/incremental_search",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/search_highlight","ace/commands/incremental_search_commands","ace/lib/dom","ace/commands/command_manager","ace/editor","ace/config"],function(d,h,b){var k=d("./lib/oop");var c=d("./range").Range;var e=d("./search").Search;var l=d("./search_highlight").SearchHighlight;var m=d("./commands/incremental_search_commands");var j=m.IncrementalSearchKeyboardHandler;function g(){this.$options={wrap:false,skipCurrent:false};this.$keyboardHandler=new j(this)}k.inherits(g,e);(function(){this.activate=function(o,n){this.$editor=o;this.$startPos=this.$currentPos=o.getCursorPosition();this.$options.needle="";this.$options.backwards=n;o.keyBinding.addKeyboardHandler(this.$keyboardHandler);this.$originalEditorOnPaste=o.onPaste;o.onPaste=this.onPaste.bind(this);this.$mousedownHandler=o.addEventListener("mousedown",this.onMouseDown.bind(this));this.selectionFix(o);this.statusMessage(true)};this.deactivate=function(o){this.cancelSearch(o);var n=this.$editor;n.keyBinding.removeKeyboardHandler(this.$keyboardHandler);if(this.$mousedownHandler){n.removeEventListener("mousedown",this.$mousedownHandler);delete this.$mousedownHandler}n.onPaste=this.$originalEditorOnPaste;this.message("")};this.selectionFix=function(n){if(n.selection.isEmpty()&&!n.session.$emacsMark){n.clearSelection()}};this.highlight=function(p){var o=this.$editor.session,n=o.$isearchHighlight=o.$isearchHighlight||o.addDynamicMarker(new l(null,"ace_isearch-result","text"));n.setRegexp(p);o._emit("changeBackMarker")};this.cancelSearch=function(n){var o=this.$editor;this.$prevNeedle=this.$options.needle;this.$options.needle="";if(n){o.moveCursorToPosition(this.$startPos);this.$currentPos=this.$startPos}else{o.pushEmacsMark&&o.pushEmacsMark(this.$startPos,false)}this.highlight(null);return c.fromPoints(this.$currentPos,this.$currentPos)};this.highlightAndFindWithNeedle=function(p,n){if(!this.$editor){return null}var o=this.$options;if(n){o.needle=n.call(this,o.needle||"")||""}if(o.needle.length===0){this.statusMessage(true);return this.cancelSearch(true)}o.start=this.$currentPos;var r=this.$editor.session,q=this.find(r);if(q){if(o.backwards){q=c.fromPoints(q.end,q.start)}this.$editor.moveCursorToPosition(q.end);if(p){this.$currentPos=q.end}this.highlight(o.re)}this.statusMessage(q);return q};this.addString=function(n){return this.highlightAndFindWithNeedle(false,function(o){return o+n})};this.removeChar=function(n){return this.highlightAndFindWithNeedle(false,function(o){return o.length>0?o.substring(0,o.length-1):o})};this.next=function(n){n=n||{};this.$options.backwards=!!n.backwards;this.$currentPos=this.$editor.getCursorPosition();return this.highlightAndFindWithNeedle(true,function(o){return n.useCurrentOrPrevSearch&&o.length===0?this.$prevNeedle||"":o})};this.onMouseDown=function(n){this.deactivate();return true};this.onPaste=function(n){this.addString(n)};this.statusMessage=function(o){var n=this.$options,p="";p+=n.backwards?"reverse-":"";p+="isearch: "+n.needle;p+=o?"":" (not found)";this.message(p)};this.message=function(n){if(this.$editor.showCommandLine){this.$editor.showCommandLine(n);this.$editor.focus()}else{console.log(n)}}}).call(g.prototype);h.IncrementalSearch=g;var f=d("./lib/dom");f.importCssString&&f.importCssString(".ace_marker-layer .ace_isearch-result { position: absolute; z-index: 6; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;}div.ace_isearch-result { border-radius: 4px; background-color: rgba(255, 200, 0, 0.5); box-shadow: 0 0 4px rgb(255, 200, 0);}.ace_dark div.ace_isearch-result { background-color: rgb(100, 110, 160); box-shadow: 0 0 4px rgb(80, 90, 140);}","incremental-search-highlighting");var a=d("./commands/command_manager");(function(){this.setupIncrementalSearch=function(n,p){if(this.usesIncrementalSearch==p){return}this.usesIncrementalSearch=p;var o=m.iSearchStartCommands;var q=p?"addCommands":"removeCommands";this[q](o)}}).call(a.CommandManager.prototype);var i=d("./editor").Editor;d("./config").defineOptions(i.prototype,"editor",{useIncrementalSearch:{set:function(n){this.keyBinding.$handlers.forEach(function(o){if(o.setupIncrementalSearch){o.setupIncrementalSearch(this,n)}});this._emit("incrementalSearchSettingChanged",{isEnabled:n})}}})});define("ace/commands/incremental_search_commands",["require","exports","module","ace/config","ace/lib/oop","ace/keyboard/hash_handler","ace/commands/occur_commands"],function(c,a,d){var b=c("../config");var h=c("../lib/oop");var g=c("../keyboard/hash_handler").HashHandler;var f=c("./occur_commands").occurStartCommand;a.iSearchStartCommands=[{name:"iSearch",bindKey:{win:"Ctrl-F",mac:"Command-F"},exec:function(j,i){b.loadModule(["core","ace/incremental_search"],function(l){var k=l.iSearch=l.iSearch||new l.IncrementalSearch();k.activate(j,i.backwards);if(i.jumpToFirstMatch){k.next(i)}})},readOnly:true},{name:"iSearchBackwards",exec:function(i,j){i.execCommand("iSearch",{backwards:true})},readOnly:true},{name:"iSearchAndGo",bindKey:{win:"Ctrl-K",mac:"Command-G"},exec:function(i,j){i.execCommand("iSearch",{jumpToFirstMatch:true,useCurrentOrPrevSearch:true})},readOnly:true},{name:"iSearchBackwardsAndGo",bindKey:{win:"Ctrl-Shift-K",mac:"Command-Shift-G"},exec:function(i){i.execCommand("iSearch",{jumpToFirstMatch:true,backwards:true,useCurrentOrPrevSearch:true})},readOnly:true}];a.iSearchCommands=[{name:"restartSearch",bindKey:{win:"Ctrl-F",mac:"Command-F"},exec:function(i){i.cancelSearch(true)},readOnly:true,isIncrementalSearchCommand:true},{name:"searchForward",bindKey:{win:"Ctrl-S|Ctrl-K",mac:"Ctrl-S|Command-G"},exec:function(i,j){j.useCurrentOrPrevSearch=true;i.next(j)},readOnly:true,isIncrementalSearchCommand:true},{name:"searchBackward",bindKey:{win:"Ctrl-R|Ctrl-Shift-K",mac:"Ctrl-R|Command-Shift-G"},exec:function(i,j){j.useCurrentOrPrevSearch=true;j.backwards=true;i.next(j)},readOnly:true,isIncrementalSearchCommand:true},{name:"extendSearchTerm",exec:function(i,j){i.addString(j)},readOnly:true,isIncrementalSearchCommand:true},{name:"extendSearchTermSpace",bindKey:"space",exec:function(i){i.addString(" ")},readOnly:true,isIncrementalSearchCommand:true},{name:"shrinkSearchTerm",bindKey:"backspace",exec:function(i){i.removeChar()},readOnly:true,isIncrementalSearchCommand:true},{name:"confirmSearch",bindKey:"return",exec:function(i){i.deactivate()},readOnly:true,isIncrementalSearchCommand:true},{name:"cancelSearch",bindKey:"esc|Ctrl-G",exec:function(i){i.deactivate(true)},readOnly:true,isIncrementalSearchCommand:true},{name:"occurisearch",bindKey:"Ctrl-O",exec:function(i){var j=h.mixin({},i.$options);i.deactivate();f.exec(i.$editor,j)},readOnly:true,isIncrementalSearchCommand:true},{name:"yankNextWord",bindKey:"Ctrl-w",exec:function(k){var j=k.$editor,i=j.selection.getRangeOfMovements(function(m){m.moveCursorWordRight()}),l=j.session.getTextRange(i);k.addString(l)},readOnly:true,isIncrementalSearchCommand:true},{name:"yankNextChar",bindKey:"Ctrl-Alt-y",exec:function(k){var j=k.$editor,i=j.selection.getRangeOfMovements(function(m){m.moveCursorRight()}),l=j.session.getTextRange(i);k.addString(l)},readOnly:true,isIncrementalSearchCommand:true},{name:"recenterTopBottom",bindKey:"Ctrl-l",exec:function(i){i.$editor.execCommand("recenterTopBottom")},readOnly:true,isIncrementalSearchCommand:true}];function e(i){this.$iSearch=i}h.inherits(e,g);(function(){this.attach=function(k){var j=this.$iSearch;g.call(this,a.iSearchCommands,k.commands.platform);this.$commandExecHandler=k.commands.addEventListener("exec",function(l){if(!l.command.isIncrementalSearchCommand){return undefined}l.stopPropagation();l.preventDefault();return l.command.exec(j,l.args||{})})};this.detach=function(j){if(!this.$commandExecHandler){return}j.commands.removeEventListener("exec",this.$commandExecHandler);delete this.$commandExecHandler};var i=this.handleKeyboard;this.handleKeyboard=function(n,l,k,o){if(((l===1||l===8)&&k==="v")||(l===1&&k==="y")){return null}var m=i.call(this,n,l,k,o);if(m.command){return m}if(l==-1){var j=this.commands.extendSearchTerm;if(j){return{command:j,args:k}}}return{command:"null",passEvent:l==0||l==4}}}).call(e.prototype);a.IncrementalSearchKeyboardHandler=e});define("ace/commands/occur_commands",["require","exports","module","ace/config","ace/occur","ace/keyboard/hash_handler","ace/lib/oop"],function(d,f,b){var c=d("../config"),a=d("../occur").Occur;var j={name:"occur",exec:function(m,l){var n=!!m.session.$occur;var k=new a().enter(m,l);if(k&&!n){i.installIn(m)}},readOnly:true};var e=[{name:"occurexit",bindKey:"esc|Ctrl-G",exec:function(l){var k=l.session.$occur;if(!k){return}k.exit(l,{});if(!l.session.$occur){i.uninstallFrom(l)}},readOnly:true},{name:"occuraccept",bindKey:"enter",exec:function(l){var k=l.session.$occur;if(!k){return}k.exit(l,{translatePosition:true});if(!l.session.$occur){i.uninstallFrom(l)}},readOnly:true}];var g=d("../keyboard/hash_handler").HashHandler;var h=d("../lib/oop");function i(){}h.inherits(i,g);(function(){this.isOccurHandler=true;this.attach=function(l){g.call(this,e,l.commands.platform);this.$editor=l};var k=this.handleKeyboard;this.handleKeyboard=function(o,m,l,p){var n=k.call(this,o,m,l,p);return(n&&n.command)?n:undefined}}).call(i.prototype);i.installIn=function(l){var k=new this();l.keyBinding.addKeyboardHandler(k);l.commands.addCommands(e)};i.uninstallFrom=function(l){l.commands.removeCommands(e);var k=l.getKeyboardHandler();if(k.isOccurHandler){l.keyBinding.removeKeyboardHandler(k)}};f.occurStartCommand=j});define("ace/occur",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/edit_session","ace/search_highlight","ace/lib/dom"],function(e,h,c){var i=e("./lib/oop");var d=e("./range").Range;var f=e("./search").Search;var a=e("./edit_session").EditSession;var j=e("./search_highlight").SearchHighlight;function b(){}i.inherits(b,f);(function(){this.enter=function(m,l){if(!l.needle){return false}var n=m.getCursorPosition();this.displayOccurContent(m,l);var k=this.originalToOccurPosition(m.session,n);m.moveCursorToPosition(k);return true};this.exit=function(m,l){var n=l.translatePosition&&m.getCursorPosition();var k=n&&this.occurToOriginalPosition(m.session,n);this.displayOriginalContent(m);if(k){m.moveCursorToPosition(k)}return true};this.highlight=function(l,m){var k=l.$occurHighlight=l.$occurHighlight||l.addDynamicMarker(new j(null,"ace_occur-highlight","text"));k.setRegexp(m);l._emit("changeBackMarker")};this.displayOccurContent=function(n,m){this.$originalSession=n.session;var o=this.matchingLines(n.session,m);var k=o.map(function(p){return p.content});var l=new a(k.join("\n"));l.$occur=this;l.$occurMatchingLines=o;n.setSession(l);this.$useEmacsStyleLineStart=this.$originalSession.$useEmacsStyleLineStart;l.$useEmacsStyleLineStart=this.$useEmacsStyleLineStart;this.highlight(l,m.re);l._emit("changeBackMarker")};this.displayOriginalContent=function(k){k.setSession(this.$originalSession);this.$originalSession.$useEmacsStyleLineStart=this.$useEmacsStyleLineStart};this.originalToOccurPosition=function(m,o){var k=m.$occurMatchingLines;var n={row:0,column:0};if(!k){return n}for(var l=0;l1){if(b.inputBuffer.idle&&h[j]){return h[j]}var i=b.inputBuffer.push(k,j);return{command:"null",passEvent:!i}}else{if(j.length==1&&(l===0||l==4)){return{command:"null",passEvent:true}}else{if(j=="esc"&&l===0){return{command:a.stop}}}}}else{if(j=="ctrl-w"){return{command:"removewordleft"}}}}}},attach:function(i){i.on("click",e.onCursorMove);if(d.currentMode!=="insert"){b.coreCommands.stop.exec(i)}i.$vimModeHandler=this;this.updateMacCompositionHandlers(i,true)},detach:function(i){i.removeListener("click",e.onCursorMove);d.noMode(i);d.currentMode="normal";this.updateMacCompositionHandlers(i,false)},actions:b.actions,getStatusText:function(){if(d.currentMode=="insert"){return"INSERT"}if(d.onVisualMode){return(d.onVisualLineMode?"VISUAL LINE ":"VISUAL ")+b.inputBuffer.status}return b.inputBuffer.status}};e.onCursorMove=function(i){b.onCursorMove(i.editor,i);e.onCursorMove.scheduled=false}});define("ace/keyboard/vim/commands",["require","exports","module","ace/lib/lang","ace/keyboard/vim/maps/util","ace/keyboard/vim/maps/motions","ace/keyboard/vim/maps/operators","ace/keyboard/vim/maps/aliases","ace/keyboard/vim/registers"],function(h,x,b){var y=h("../../lib/lang");var a=h("./maps/util");var q=h("./maps/motions");var r=h("./maps/operators");var n=h("./maps/aliases");var u=h("./registers");var m=1;var j=2;var c=3;var s=4;var v=8;var i=function i(A,B,z){while(0B.$size.scrollerHeight){A=B.$size.scrollerHeight/2}if(B.scrollTop>C-A){B.session.setScrollTop(C-A)}if(B.scrollTop+B.$size.scrollerHeight1){C=C=="return"?"\n":C=="tab"?"\t":C}i(function(){A.insert(C)},B||1);A.navigateLeft()}}},R:{fn:function(A,z,B,C){a.insertMode(A);A.setOverwrite(true)}},"~":{fn:function(A,z,B){i(function(){var C=A.selection.getRange();if(C.isEmpty()){C.end.column++}var D=A.session.getTextRange(C);var E=D.toUpperCase();if(E==D){A.navigateRight()}else{A.session.replace(C,E)}},B||1)}},"*":{fn:function(A,z,C,D){A.selection.selectWord();A.findNext();d(A);var B=A.selection.getRange();A.selection.setSelectionRange(B,true)}},"#":{fn:function(A,z,C,D){A.selection.selectWord();A.findPrevious();d(A);var B=A.selection.getRange();A.selection.setSelectionRange(B,true)}},m:{param:true,fn:function(B,z,C,E){var A=B.session;var D=A.vimMarkers||(A.vimMarkers={});var F=B.getCursorPosition();if(!D[E]){D[E]=B.session.doc.createAnchor(F)}D[E].setPosition(F.row,F.column,true)}},n:{fn:function(B,z,D,E){var A=B.getLastSearchOptions();A.backwards=false;B.selection.moveCursorRight();B.selection.clearSelection();B.findNext(A);d(B);var C=B.selection.getRange();C.end.row=C.start.row;C.end.column=C.start.column;B.selection.setSelectionRange(C,true)}},N:{fn:function(B,z,D,E){var A=B.getLastSearchOptions();A.backwards=true;B.findPrevious(A);d(B);var C=B.selection.getRange();C.end.row=C.start.row;C.end.column=C.start.column;B.selection.setSelectionRange(C,true)}},v:{fn:function(A,z,B,C){A.selection.selectRight();a.visualMode(A,false)},acceptsMotion:true},V:{fn:function(A,z,B,D){var C=A.getCursorPosition().row;A.selection.moveTo(C,0);A.selection.selectLineEnd();A.selection.visualLineStart=C;a.visualMode(A,true)},acceptsMotion:true},Y:{fn:function(A,z,B,C){a.copyLine(A)}},p:{fn:function(A,z,C,E){var B=u._default;A.setOverwrite(false);if(B.isLine){var F=A.getCursorPosition();F.column=A.session.getLine(F.row).length;var D=y.stringRepeat("\n"+B.text,C||1);A.session.insert(F,D);A.moveCursorTo(F.row+1,0)}else{A.navigateRight();A.insert(y.stringRepeat(B.text,C||1));A.navigateLeft()}A.setOverwrite(true);A.selection.clearSelection()}},P:{fn:function(A,z,C,E){var B=u._default;A.setOverwrite(false);if(B.isLine){var F=A.getCursorPosition();F.column=0;var D=y.stringRepeat(B.text+"\n",C||1);A.session.insert(F,D);A.moveCursorToPosition(F)}else{A.insert(y.stringRepeat(B.text,C||1))}A.setOverwrite(true);A.selection.clearSelection()}},J:{fn:function(E,C,D,A){var F=E.session;C=E.getSelectionRange();var G={row:C.start.row,column:C.start.column};D=D||C.end.row-C.start.row;var H=Math.min(G.row+(D||1),F.getLength()-1);C.start.column=F.getLine(G.row).length;C.end.column=F.getLine(H).length;C.end.row=H;var I="";for(var B=G.row;B1){C=".,.+"+B+C}if(A.showCommandLine){A.showCommandLine(C)}}},"/":{fn:function(A,z,B,C){if(A.showCommandLine){A.showCommandLine("/")}}},"?":{fn:function(A,z,B,C){if(A.showCommandLine){A.showCommandLine("?")}}},".":{fn:function(A,z,C,D){a.onInsertReplaySequence=o.lastInsertCommands;var B=o.previous;if(B){o.exec(A,B.action,B.param)}}},"ctrl-x":{fn:function(A,z,B,C){A.modifyNumber(-(B||1))}},"ctrl-a":{fn:function(A,z,B,C){A.modifyNumber(B||1)}}};var o=x.inputBuffer={accepting:[m,j,c,s],currentCmd:null,currentCount:"",status:"",operator:null,motion:null,lastInsertCommands:[],push:function(D,C,G){var B=this.status;var E=true;this.idle=false;var F=this.waitingForParam;if(/^numpad\d+$/i.test(C)){C=C.substr(6)}if(F){this.exec(D,F,C)}else{if(!(C==="0"&&!this.currentCount.length)&&(/^\d+$/.test(C)&&this.isAccepting(m))){this.currentCount+=C;this.currentCmd=m;this.accepting=[m,j,c,s]}else{if(!this.operator&&this.isAccepting(j)&&r[C]){this.operator={ch:C,count:this.getCount()};this.currentCmd=j;this.accepting=[m,c,s];this.exec(D,{operator:this.operator})}else{if(q[C]&&this.isAccepting(c)){this.currentCmd=c;var A={operator:this.operator,motion:{ch:C,count:this.getCount()}};if(q[C].param){this.waitForParam(A)}else{this.exec(D,A)}}else{if(n[C]&&this.isAccepting(c)){n[C].operator.count=this.getCount();this.exec(D,n[C])}else{if(k[C]&&this.isAccepting(s)){var z={action:{fn:k[C].fn,count:this.getCount()}};if(k[C].param){this.waitForParam(z)}else{this.exec(D,z)}if(k[C].acceptsMotion){this.idle=false}}else{if(this.operator){this.operator.count=this.getCount();this.exec(D,{operator:this.operator},C)}else{E=C.length==1;this.reset()}}}}}}}if(this.waitingForParam||this.motion||this.operator){this.status+=C}else{if(this.currentCount){this.status=this.currentCount}else{if(this.status){this.status=""}}}if(this.status!=B){D._emit("changeStatus")}return E},waitForParam:function(z){this.waitingForParam=z},getCount:function(){var z=this.currentCount;this.currentCount="";return z&&parseInt(z,10)},exec:function(F,D,A){var B=D.motion;var z=D.operator;var H=D.action;if(!A){A=D.param}if(z){this.previous={action:D,param:A}}if(z&&!F.selection.isEmpty()){if(r[z.ch].selFn){r[z.ch].selFn(F,F.getSelectionRange(),z.count,A);this.reset()}return}else{if(!B&&!H&&z&&A){r[z.ch].fn(F,null,z.count,A);this.reset()}else{if(B){var C=function(I){if(I&&typeof I==="function"){if(B.count&&!E.handlesCount){i(I,B.count,[F,null,B.count,A])}else{I(F,null,B.count,A)}}};var E=q[B.ch];var G=E.sel;if(!z){if((a.onVisualMode||a.onVisualLineMode)&&G){C(E.sel)}else{C(E.nav)}}else{if(G){i(function(){C(E.sel);r[z.ch].fn(F,F.getSelectionRange(),z.count,A)},z.count||1)}}this.reset()}else{if(H){H.fn(F,F.getSelectionRange(),H.count,A);this.reset()}}}}l(F)},isAccepting:function(z){return this.accepting.indexOf(z)!==-1},reset:function(){this.operator=null;this.motion=null;this.currentCount="";this.status="";this.accepting=[m,j,c,s];this.idle=true;this.waitingForParam=null}};function e(z){o.previous={action:{action:{fn:z}}}}x.coreCommands={start:{exec:function f(z){a.insertMode(z);e(f)}},startBeginning:{exec:function g(z){z.navigateLineStart();a.insertMode(z);e(g)}},stop:{exec:function p(z){o.reset();a.onVisualMode=false;a.onVisualLineMode=false;o.lastInsertCommands=a.normalMode(z)}},append:{exec:function t(z){var B=z.getCursorPosition();var A=z.session.getLine(B.row).length;if(A){z.navigateRight()}a.insertMode(z);e(t)}},appendEnd:{exec:function w(z){z.navigateLineEnd();a.insertMode(z);e(w)}}};var l=x.onCursorMove=function(z,D){if(a.currentMode==="insert"||l.running){return}else{if(!z.selection.isEmpty()){l.running=true;if(a.onVisualLineMode){var C=z.selection.visualLineStart;var E=z.getCursorPosition().row;if(C<=E){var B=z.session.getLine(E);z.selection.moveTo(C,0);z.selection.selectTo(E,B.length)}else{var B=z.session.getLine(C);z.selection.moveTo(C,B.length);z.selection.selectTo(E,0)}}l.running=false;return}else{if(D&&(a.onVisualLineMode||a.onVisualMode)){z.selection.clearSelection();a.normalMode(z)}l.running=true;var F=z.getCursorPosition();var A=z.session.getLine(F.row).length;if(A&&F.column===A){z.navigateLeft()}l.running=false}}}});define("ace/keyboard/vim/maps/util",["require","exports","module","ace/keyboard/vim/registers","ace/lib/dom"],function(c,b,d){var a=c("../registers");var e=c("../../../lib/dom");e.importCssString(".insert-mode .ace_cursor{ border-left: 2px solid #333333;}.ace_dark.insert-mode .ace_cursor{ border-left: 2px solid #eeeeee;}.normal-mode .ace_cursor{ border: 0!important; background-color: red; opacity: 0.5;}","vimMode");d.exports={onVisualMode:false,onVisualLineMode:false,currentMode:"normal",noMode:function(f){f.unsetStyle("insert-mode");f.unsetStyle("normal-mode");if(f.commands.recording){f.commands.toggleRecording(f)}f.setOverwrite(false)},insertMode:function(f){this.currentMode="insert";f.setStyle("insert-mode");f.unsetStyle("normal-mode");f.setOverwrite(false);f.keyBinding.$data.buffer="";f.keyBinding.$data.state="insertMode";this.onVisualMode=false;this.onVisualLineMode=false;if(this.onInsertReplaySequence){f.commands.macro=this.onInsertReplaySequence;f.commands.replay(f);this.onInsertReplaySequence=null;this.normalMode(f)}else{f._emit("changeStatus");if(!f.commands.recording){f.commands.toggleRecording(f)}}},normalMode:function(f){this.currentMode="normal";f.unsetStyle("insert-mode");f.setStyle("normal-mode");f.clearSelection();var g;if(!f.getOverwrite()){g=f.getCursorPosition();if(g.column>0){f.navigateLeft()}}f.setOverwrite(true);f.keyBinding.$data.buffer="";f.keyBinding.$data.state="start";this.onVisualMode=false;this.onVisualLineMode=false;f._emit("changeStatus");if(f.commands.recording){f.commands.toggleRecording(f);return f.commands.macro}else{return[]}},visualMode:function(g,f){if((this.onVisualLineMode&&f)||(this.onVisualMode&&!f)){this.normalMode(g);return}g.setStyle("insert-mode");g.unsetStyle("normal-mode");g._emit("changeStatus");if(f){this.onVisualLineMode=true}else{this.onVisualMode=true;this.onVisualLineMode=false}},getRightNthChar:function(h,j,g,k){var f=h.getSession().getLine(j.row);var i=f.substr(j.column+1).split(g);return k~!@#$%^&*|+=\[\]{}`~?]/;var n=/[.\/\\()\"'-:,.;<>~!@#$%^&*|+=\[\]{}`~?]/;var a=/\s/;var l=function(q,s){var r=q.selection;this.range=r.getRange();s=s||r.selectionLead;this.row=s.row;this.col=s.column;var p=q.session.getLine(this.row);var t=q.session.getLength();this.ch=p[this.col]||"\n";this.skippedLines=0;this.next=function(){this.ch=p[++this.col]||this.handleNewLine(1);return this.ch};this.prev=function(){this.ch=p[--this.col]||this.handleNewLine(-1);return this.ch};this.peek=function(u){var v=p[this.col+u];if(v){return v}if(u==-1){return"\n"}if(this.col==p.length-1){return"\n"}return q.session.getLine(this.row+1)[0]||"\n"};this.handleNewLine=function(u){if(u==1){if(this.col==p.length){return"\n"}if(this.row==t-1){return""}this.col=0;this.row++;p=q.session.getLine(this.row);this.skippedLines++;return p[0]||"\n"}if(u==-1){if(this.row===0){return""}this.row--;p=q.session.getLine(this.row);this.col=p.length;this.skippedLines--;return"\n"}};this.debug=function(){console.log(p.substring(0,this.col)+"|"+this.ch+"'"+this.col+"'"+p.substr(this.col+1))}};var f=g("../../../search").Search;var o=new f();function k(q,r,p){o.$options.needle=r;o.$options.backwards=p==-1;return o.find(q.session)}var e=g("../../../range").Range;var m={};c.exports={w:new d(function(p){var q=new l(p);if(q.ch&&n.test(q.ch)){while(q.ch&&n.test(q.ch)){q.next()}}else{while(q.ch&&!j.test(q.ch)){q.next()}}while(q.ch&&a.test(q.ch)&&q.skippedLines<2){q.next()}q.skippedLines==2&&q.prev();return{column:q.col,row:q.row}}),W:new d(function(p){var q=new l(p);while(q.ch&&!(a.test(q.ch)&&!a.test(q.peek(1)))&&q.skippedLines<2){q.next()}if(q.skippedLines==2){q.prev()}else{q.next()}return{column:q.col,row:q.row}}),b:new d(function(p){var q=new l(p);q.prev();while(q.ch&&a.test(q.ch)&&q.skippedLines>-2){q.prev()}if(q.ch&&n.test(q.ch)){while(q.ch&&n.test(q.ch)){q.prev()}}else{while(q.ch&&!j.test(q.ch)){q.prev()}}q.ch&&q.next();return{column:q.col,row:q.row}}),B:new d(function(p){var q=new l(p);q.prev();while(q.ch&&!(!a.test(q.ch)&&a.test(q.peek(-1)))&&q.skippedLines>-2){q.prev()}if(q.skippedLines==-2){q.next()}return{column:q.col,row:q.row}}),e:new d(function(p){var q=new l(p);q.next();while(q.ch&&a.test(q.ch)){q.next()}if(q.ch&&n.test(q.ch)){while(q.ch&&n.test(q.ch)){q.next()}}else{while(q.ch&&!j.test(q.ch)){q.next()}}q.ch&&q.prev();return{column:q.col,row:q.row}}),E:new d(function(p){var q=new l(p);q.next();while(q.ch&&!(!a.test(q.ch)&&a.test(q.peek(1)))){q.next()}return{column:q.col,row:q.row}}),l:{nav:function(q){var s=q.getCursorPosition();var p=s.column;var r=q.session.getLine(s.row).length;if(r&&p!==r){q.navigateRight()}},sel:function(q){var s=q.getCursorPosition();var p=s.column;var r=q.session.getLine(s.row).length;if(r&&p!==r){q.selection.selectRight()}}},h:{nav:function(p){var q=p.getCursorPosition();if(q.column>0){p.navigateLeft()}},sel:function(p){var q=p.getCursorPosition();if(q.column>0){p.selection.selectLeft()}}},H:{nav:function(p){var q=p.renderer.getScrollTopRow();p.moveCursorTo(q)},sel:function(p){var q=p.renderer.getScrollTopRow();p.selection.selectTo(q)}},M:{nav:function(q){var p=q.renderer.getScrollTopRow();var s=q.renderer.getScrollBottomRow();var r=p+((s-p)/2);q.moveCursorTo(r)},sel:function(q){var p=q.renderer.getScrollTopRow();var s=q.renderer.getScrollBottomRow();var r=p+((s-p)/2);q.selection.selectTo(r)}},L:{nav:function(p){var q=p.renderer.getScrollBottomRow();p.moveCursorTo(q)},sel:function(p){var q=p.renderer.getScrollBottomRow();p.selection.selectTo(q)}},k:{nav:function(p){p.navigateUp()},sel:function(p){p.selection.selectUp()}},j:{nav:function(p){p.navigateDown()},sel:function(p){p.selection.selectDown()}},i:{param:true,sel:function(r,q,s,u){switch(u){case"w":r.selection.selectWord();break;case"W":r.selection.selectAWord();break;case"(":case"{":case"[":var t=r.getCursorPosition();var p=r.session.$findClosingBracket(u,t,/paren/);if(!p){return}var v=r.session.$findOpeningBracket(r.session.$brackets[u],t,/paren/);if(!v){return}v.column++;r.selection.setSelectionRange(e.fromPoints(v,p));break;case"'":case'"':case"/":var p=k(r,u,1);if(!p){return}var v=k(r,u,-1);if(!v){return}r.selection.setSelectionRange(e.fromPoints(v.end,p.start));break}}},a:{param:true,sel:function(r,q,s,u){switch(u){case"w":r.selection.selectAWord();break;case"W":r.selection.selectAWord();break;case"(":case"{":case"[":var t=r.getCursorPosition();var p=r.session.$findClosingBracket(u,t,/paren/);if(!p){return}var v=r.session.$findOpeningBracket(r.session.$brackets[u],t,/paren/);if(!v){return}p.column++;r.selection.setSelectionRange(e.fromPoints(v,p));break;case"'":case'"':case"/":var p=k(r,u,1);if(!p){return}var v=k(r,u,-1);if(!v){return}p.column++;r.selection.setSelectionRange(e.fromPoints(v.start,p.end));break}}},f:new d({param:true,handlesCount:true,getPos:function(t,q,u,w,p,r){if(!r){m={ch:"f",param:w}}var v=t.getCursorPosition();var s=i.getRightNthChar(t,v,w,u||1);if(typeof s==="number"){v.column+=s+(p?2:1);return v}}}),F:new d({param:true,handlesCount:true,getPos:function(t,q,u,w,p,r){if(!r){m={ch:"F",param:w}}var v=t.getCursorPosition();var s=i.getLeftNthChar(t,v,w,u||1);if(typeof s==="number"){v.column-=s+1;return v}}}),t:new d({param:true,handlesCount:true,getPos:function(t,q,u,w,p,r){if(!r){m={ch:"t",param:w}}var v=t.getCursorPosition();var s=i.getRightNthChar(t,v,w,u||1);if(r&&s==0&&!(u>1)){var s=i.getRightNthChar(t,v,w,2)}if(typeof s==="number"){v.column+=s+(p?1:0);return v}}}),T:new d({param:true,handlesCount:true,getPos:function(t,q,u,w,p,r){if(!r){m={ch:"T",param:w}}var v=t.getCursorPosition();var s=i.getLeftNthChar(t,v,w,u||1);if(r&&s==0&&!(u>1)){var s=i.getLeftNthChar(t,v,w,2)}if(typeof s==="number"){v.column-=s;return v}}}),";":new d({handlesCount:true,getPos:function(s,q,t,u,p){var r=m.ch;if(!r){return}return c.exports[r].getPos(s,q,t,m.param,p,true)}}),",":new d({handlesCount:true,getPos:function(t,r,u,v,q){var s=m.ch;if(!s){return}var p=s.toUpperCase();s=s===p?s.toLowerCase():p;return c.exports[s].getPos(t,r,u,m.param,q,true)}}),"^":{nav:function(p){p.navigateLineStart()},sel:function(p){p.selection.selectLineStart()}},"$":{handlesCount:true,nav:function(q,p,r,s){if(r>1){q.navigateDown(r-1)}q.navigateLineEnd()},sel:function(q,p,r,s){if(r>1){q.selection.moveCursorBy(r-1,0)}q.selection.selectLineEnd()}},"0":new d(function(p){return{row:p.selection.lead.row,column:0}}),G:{nav:function(q,p,r,s){if(!r&&r!==0){r=q.session.getLength()}q.gotoLine(r)},sel:function(q,p,r,s){if(!r&&r!==0){r=q.session.getLength()}q.selection.selectTo(r,0)}},g:{param:true,nav:function(q,p,r,s){switch(s){case"m":console.log("Middle line");break;case"e":console.log("End of prev word");break;case"g":q.gotoLine(r||0);case"u":q.gotoLine(r||0);case"U":q.gotoLine(r||0)}},sel:function(q,p,r,s){switch(s){case"m":console.log("Middle line");break;case"e":console.log("End of prev word");break;case"g":q.selection.selectTo(r||0,0)}}},o:{nav:function(q,p,s,t){s=s||1;var r="";while(00){q.navigateUp();q.navigateLineEnd();q.insert(r)}else{q.session.insert({row:0,column:0},r);q.navigateUp()}i.insertMode(q)}}},"%":new d(function(t){var s=/[\[\]{}()]/g;var u=t.getCursorPosition();var r=t.session.getLine(u.row)[u.column];if(!s.test(r)){var p=k(t,s);if(!p){return}u=p.start}var q=t.session.findMatchingBracket({row:u.row,column:u.column+1});return q}),"{":new d(function(p){var q=p.session;var r=q.selection.lead.row;while(r>0&&!/\S/.test(q.getLine(r))){r--}while(/\S/.test(q.getLine(r))){r--}return{column:0,row:r}}),"}":new d(function(q){var r=q.session;var p=r.getLength();var s=r.selection.lead.row;while(s":{selFn:function(h,f,j,k){j=j||1;for(var g=0;g":var l=h.getCursorPosition();h.selection.selectLine();for(var g=0;g>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|="},{token:"paren.lparen",regex:"[\\[\\(\\{]"},{token:"paren.rparen",regex:"[\\]\\)\\}]"},{token:"text",regex:"\\s+"}],define:[{token:"constant.language",regex:"def|class"},{token:"variable.language",regex:"[A-Za-z_][A-Za-z0-9_]*",next:"start"},{token:"text",regex:"\\s+"}],qqstring3:[{token:"constant.language.escape",regex:D},{token:"string",regex:'"{3}',next:"start"},{defaultToken:"string"}],qstring3:[{token:"constant.language.escape",regex:D},{token:"string",regex:"'{3}",next:"start"},{defaultToken:"string"}],qqstring:[{token:"constant.language.escape",regex:D},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"start"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:D},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"start"},{defaultToken:"string"}]}};f.inherits(c,a);b.PlotDeviceHighlightRules=c});define("ace/mode/folding/pythonic",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"],function(b,a,c){var d=b("../../lib/oop");var f=b("./fold_mode").FoldMode;var e=a.FoldMode=function(g){this.foldingStartMarker=new RegExp("([\\[{])(?:\\s*)$|("+g+")(?:\\s*)(?:#.*)?$")};d.inherits(e,f);(function(){this.getFoldWidgetRange=function(j,i,k){var g=j.getLine(k);var h=g.match(this.foldingStartMarker);if(h){if(h[1]){return this.openingBracketBlock(j,h[1],k,h.index)}if(h[2]){return this.indentationBlock(j,k,h.index+h[2].length)}return this.indentationBlock(j,k)}}}).call(e.prototype)});define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(f,i,d){var k=f("../../lib/oop");var h=f("../behaviour").Behaviour;var l=f("../../token_iterator").TokenIterator;var c=f("../../lib/lang");var j=["text","paren.rparen","punctuation.operator"];var e=["text","paren.rparen","punctuation.operator","comment"];var a;var g={};var b=function(n){var o=-1;if(n.multiSelect){o=n.selection.id;if(g.rangeCount!=n.multiSelect.rangeCount){g={rangeCount:n.multiSelect.rangeCount}}}if(g[o]){return a=g[o]}a=g[o]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}};var m=function(){this.add("braces","insertion",function(o,r,u,x,z){var A=u.getCursorPosition();var B=x.doc.getLine(A.row);if(z=="{"){b(u);var y=u.getSelectionRange();var s=x.doc.getTextRange(y);if(s!==""&&s!=="{"&&u.getWrapBehavioursEnabled()){return{text:"{"+s+"}",selection:false}}else{if(m.isSaneInsertion(u,x)){if(/[\]\}\)]/.test(B[A.column])||u.inMultiSelectMode){m.recordAutoInsert(u,x,"}");return{text:"{}",selection:[1,1]}}else{m.recordMaybeInsert(u,x,"{");return{text:"{",selection:[1,1]}}}}}else{if(z=="}"){b(u);var v=B.substring(A.column,A.column+1);if(v=="}"){var n=x.$findOpeningBracket("}",{column:A.column+1,row:A.row});if(n!==null&&m.isAutoInsertedClosing(A,B,z)){m.popAutoInsertedClosing();return{text:"",selection:[1,1]}}}}else{if(z=="\n"||z=="\r\n"){b(u);var q="";if(m.isMaybeInsertedClosing(A,B)){q=c.stringRepeat("}",a.maybeInsertedBrackets);m.clearMaybeInsertedClosing()}var v=B.substring(A.column,A.column+1);if(v==="}"){var w=x.findMatchingBracket({row:A.row,column:A.column+1},"}");if(!w){return null}var t=this.$getIndent(x.getLine(w.row))}else{if(q){var t=this.$getIndent(B)}else{m.clearMaybeInsertedClosing();return}}var p=t+x.getTabString();return{text:"\n"+p+"\n"+t+q,selection:[1,p.length,1,p.length]}}else{m.clearMaybeInsertedClosing()}}}});this.add("braces","deletion",function(s,r,q,t,o){var p=t.doc.getTextRange(o);if(!o.isMultiLine()&&p=="{"){b(q);var n=t.doc.getLine(o.start.row);var u=n.substring(o.end.column,o.end.column+1);if(u=="}"){o.end.column++;return o}else{a.maybeInsertedBrackets--}}});this.add("parens","insertion",function(o,p,r,t,v){if(v=="("){b(r);var u=r.getSelectionRange();var q=t.doc.getTextRange(u);if(q!==""&&r.getWrapBehavioursEnabled()){return{text:"("+q+")",selection:false}}else{if(m.isSaneInsertion(r,t)){m.recordAutoInsert(r,t,")");return{text:"()",selection:[1,1]}}}}else{if(v==")"){b(r);var w=r.getCursorPosition();var x=t.doc.getLine(w.row);var s=x.substring(w.column,w.column+1);if(s==")"){var n=t.$findOpeningBracket(")",{column:w.column+1,row:w.row});if(n!==null&&m.isAutoInsertedClosing(w,x,v)){m.popAutoInsertedClosing();return{text:"",selection:[1,1]}}}}}});this.add("parens","deletion",function(s,r,q,t,o){var p=t.doc.getTextRange(o);if(!o.isMultiLine()&&p=="("){b(q);var n=t.doc.getLine(o.start.row);var u=n.substring(o.start.column+1,o.start.column+2);if(u==")"){o.end.column++;return o}}});this.add("brackets","insertion",function(o,p,r,t,v){if(v=="["){b(r);var u=r.getSelectionRange();var q=t.doc.getTextRange(u);if(q!==""&&r.getWrapBehavioursEnabled()){return{text:"["+q+"]",selection:false}}else{if(m.isSaneInsertion(r,t)){m.recordAutoInsert(r,t,"]");return{text:"[]",selection:[1,1]}}}}else{if(v=="]"){b(r);var w=r.getCursorPosition();var x=t.doc.getLine(w.row);var s=x.substring(w.column,w.column+1);if(s=="]"){var n=t.$findOpeningBracket("]",{column:w.column+1,row:w.row});if(n!==null&&m.isAutoInsertedClosing(w,x,v)){m.popAutoInsertedClosing();return{text:"",selection:[1,1]}}}}}});this.add("brackets","deletion",function(s,r,q,t,o){var p=t.doc.getTextRange(o);if(!o.isMultiLine()&&p=="["){b(q);var n=t.doc.getLine(o.start.row);var u=n.substring(o.start.column+1,o.start.column+2);if(u=="]"){o.end.column++;return o}}});this.add("string_dquotes","insertion",function(o,r,u,y,C){if(C=='"'||C=="'"){b(u);var n=C;var A=u.getSelectionRange();var s=y.doc.getTextRange(A);if(s!==""&&s!=="'"&&s!='"'&&u.getWrapBehavioursEnabled()){return{text:n+s+n,selection:false}}else{var B=u.getCursorPosition();var E=y.doc.getLine(B.row);var D=E.substring(B.column-1,B.column);if(D=="\\"){return null}var w=y.getTokens(A.start.row);var p=0,q;var t=-1;for(var z=0;zA.start.column){break}p+=w[z].value.length}if(!q||(t<0&&q.type!=="comment"&&(q.type!=="string"||((A.start.column!==q.value.length+p-1)&&q.value.lastIndexOf(n)===q.value.length-1)))){if(!m.isSaneInsertion(u,y)){return}return{text:n+n,selection:[1,1]}}else{if(q&&q.type==="string"){var v=E.substring(B.column,B.column+1);if(v==n){return{text:"",selection:[1,1]}}}}}}});this.add("string_dquotes","deletion",function(s,r,q,t,o){var p=t.doc.getTextRange(o);if(!o.isMultiLine()&&(p=='"'||p=="'")){b(q);var n=t.doc.getLine(o.start.row);var u=n.substring(o.start.column+1,o.start.column+2);if(u==p){o.end.column++;return o}}})};m.isSaneInsertion=function(p,q){var r=p.getCursorPosition();var o=new l(q,r.row,r.column);if(!this.$matchTokenType(o.getCurrentToken()||"text",j)){var n=new l(q,r.row,r.column+1);if(!this.$matchTokenType(n.getCurrentToken()||"text",j)){return false}}o.stepForward();return o.getCurrentTokenRow()!==r.row||this.$matchTokenType(o.getCurrentToken()||"text",e)};m.$matchTokenType=function(o,n){return n.indexOf(o.type||o)>-1};m.recordAutoInsert=function(o,p,r){var q=o.getCursorPosition();var n=p.doc.getLine(q.row);if(!this.isAutoInsertedClosing(q,n,a.autoInsertedLineEnd[0])){a.autoInsertedBrackets=0}a.autoInsertedRow=q.row;a.autoInsertedLineEnd=r+n.substr(q.column);a.autoInsertedBrackets++};m.recordMaybeInsert=function(o,p,r){var q=o.getCursorPosition();var n=p.doc.getLine(q.row);if(!this.isMaybeInsertedClosing(q,n)){a.maybeInsertedBrackets=0}a.maybeInsertedRow=q.row;a.maybeInsertedLineStart=n.substr(0,q.column)+r;a.maybeInsertedLineEnd=n.substr(q.column);a.maybeInsertedBrackets++};m.isAutoInsertedClosing=function(p,n,o){return a.autoInsertedBrackets>0&&p.row===a.autoInsertedRow&&o===a.autoInsertedLineEnd[0]&&n.substr(p.column)===a.autoInsertedLineEnd};m.isMaybeInsertedClosing=function(o,n){return a.maybeInsertedBrackets>0&&o.row===a.maybeInsertedRow&&n.substr(o.column)===a.maybeInsertedLineEnd&&n.substr(0,o.column)==a.maybeInsertedLineStart};m.popAutoInsertedClosing=function(){a.autoInsertedLineEnd=a.autoInsertedLineEnd.substr(1);a.autoInsertedBrackets--};m.clearMaybeInsertedClosing=function(){if(a){a.maybeInsertedBrackets=0;a.maybeInsertedRow=-1}};k.inherits(m,h);i.CstyleBehaviour=m});define("ace/snippets/plotdevice",["require","exports","module"],function(b,a,c){a.snippetText='### general purpose\n\nsnippet {\n {"${1:k}":${2:v}, kw$3}\nsnippet kw\n "${1:k}":${2:v}, kw$3\nsnippet dict\n dict(${1:k}=${2:v}, dkw$3)\nsnippet dkw\n ${1:k}=${2:v}, dkw$3\nsnippet t\n True\nsnippet f\n False\nsnippet lorem\n lorem = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."\nsnippet draw\n def draw(state):\n print FRAME$1\nsnippet setup\n def setup(state):\n $1\nsnippet stop\n def stop(state):\n $1\nsnippet anim\n speed(${1:30})$2\n def setup(state):\n pass\n def draw(state):\n print FRAME\n def stop(state):\n pass\n\n\n### Some handy abbreviations borrowed from python.snippets\n\nsnippet imp\n import ${1:module}\nsnippet xi\n ${1:library} = ximport("$1")\nsnippet from\n from ${1:package} import ${2:module}\nsnippet wh\n while ${1:condition}:\n $2\nsnippet with\n with ${1:expr} as ${2:var}:\n $3\n# New Class\nsnippet cl\n class ${1:ClassName}(${2:object}):\n """${3:docstring for $1}"""\n def __init__(self, ${4:arg}):\n ${5:super($1, self).__init__()}\n $6\n# New Function\nsnippet def\n def ${1:fname}($2):\n $3\n# New Method\nsnippet defs\n def ${1:mname}(self, ${2:arg}):\n $3\n# Ifs\nsnippet if\n if ${1:condition}:\n $2\nsnippet el\n else:\n $1\nsnippet ei\n elif ${1:condition}:\n $2\n# For\nsnippet for\n for ${1:item} in ${2:items}:\n $3\nsnippet try\n try:\n ${1:# TODO: write code...}\n except ${2:Exception}, ${3:e}:\n ${4:raise $3}\n# if __name__ == \'__main__\':\nsnippet ifmain\n if __name__ == \'__main__\':\n ${1:main()}\n# __magic__\nsnippet _\n __${1:init}__${2}\n\n\n\n\n\n### signatures for the plotdevice api\n\nsnippet align\n align(${1:LEFT/RIGHT/CENTER/JUSTIFY})\nsnippet alpha\n alpha(${1:1.0})\nsnippet arc\n arc(${1:x}, ${2:y}, ${3:radius}${4:, range=${5:None}, ccw=${6:False}, close=${7:False}})\nsnippet arcto\n arcto(${1:x}, ${2:y}${3:, cx=${4:None}, cy=${5:None}, radius=${6:None}, ccw=${7:False}, close=${8:False}})\nsnippet arrow\n arrow(${1:x}, ${2:y}${3:, width=${4:100}, type=${5:NORMAL/FORTYFIVE}, plot=${6:True}})\nsnippet autoclosepath\n autoclosepath(${1:close=${2:True}})\nsnippet autotext\n autotext(${1:sourceFile})\nsnippet background\n background()\nsnippet beginclip\n beginclip(${1:stencil}${2:, mask=${3:False}, channel=${4:None}})\nsnippet beginpath\n beginpath(${1:${2:x}, ${3:y}})\nsnippet bezier\n bezier(${1:${2:x}, ${3:y}}, close=${4:True}, plot=${5:True})\nsnippet blend\n blend("${1:normal}")\nsnippet capstyle\n capstyle(${1:style=${2:BUTT/ROUND/SQUARE}})\nsnippet choice\n choice(${1:seq})\nsnippet clear\n clear(${1:all})\nsnippet clip\n clip(${1:stencil}${2:, channel="${3:black/white/alpha/red/green/blue}"})\nsnippet mask\n mask(${1:stencil}${2:, channel="${3:black/white/alpha/red/green/blue}"})\nsnippet closepath\n closepath()\nsnippet color\n color("${1:black}")\nsnippet colormode\n colormode(${1:mode=${2:RGB/HSB/CMYK}, range=${3:None}})\nsnippet colorrange\n colorrange(${1:maxval})\nsnippet curveto\n curveto(${1:x1}, ${2:y1}, ${3:x2}, ${4:y2}, ${5:x}, ${6:y}${7:, close=${8:False}})\nsnippet drawpath\n drawpath(${1:path})\nsnippet ellipse\n ellipse(${1:x}, ${2:y}, ${3:width}, ${4:height}${5:, range=${6:None}, ccw=${7:False}, close=${8:False}, plot=${9:True}})\nsnippet endclip\n endclip()\nsnippet endpath\n endpath(${1:plot=${2:True}})\nsnippet export\n export("${1:${2:document}.${3:mov}}"${4:, fps=${5:None}, loop=${6:None}, bitrate=${7:1.0}})\nsnippet files\n files("${1:${2:*}.${3:json}}", case=${4:True}})\nsnippet fill\n fill(${1:"#${2:000}"})\nsnippet findpath\n findpath(${1:points}${2:, curvature=${3:1.0}})\nsnippet findvar\n findvar(${1:name})\nsnippet font\n font("${1:HelveticaNeue-Medium}", ${2:12}})\nsnippet fonts\n fonts(${1:like="${2:akzidenz}", western=${3:True}})\nsnippet fontsize\n fontsize(${1:12})\nsnippet geometry\n geometry(${1:DEGREES/RADIANS/PERCENT})\nsnippet grid\n grid(${1:cols}, ${2:rows}${3:, colSize=${4:1}, rowSize=${5:1}, shuffled=${6:False}})\nsnippet image\n image("${1:image.png}", ${2:x}, ${3:y}${4:, width=${5:None}, height=${6:None}, plot=${7:True}})\nsnippet imagesize\n imagesize("${1:image.png}"${2:, data=${3:None}})\nsnippet joinstyle\n joinstyle(${1:MITER/ROUND/BEVEL})\nsnippet line\n line(${1:x1}, ${2:y1}, ${3:x2}, ${4:y2}${5:, plot=${6:True}})\nsnippet lineheight\n lineheight(${1:None})\nsnippet lineto\n lineto(${1:x}, ${2:y}${3:, close=${4:False}})\nsnippet measure\n measure(${1:obj})\nsnippet moveto\n moveto(${1:x}, ${2:y})\nsnippet nofill\n nofill()\nsnippet nostroke\n nostroke()\nsnippet noshadow\n noshadow()\nsnippet ordered\n ordered(${1:seq})\nsnippet outputmode\n outputmode(${1:RGB/CMYK})\nsnippet oval\n oval(${1:x}, ${2:y}, ${3:width}, ${4:height}${5:, range=${6:None}, ccw=${7:False}, close=${8:False}, plot=${9:True}})\nsnippet pen\n pen(${1:nib})\nsnippet plot\n plot(${1:obj})\nsnippet poly\n poly(${1:x}, ${2:y}, ${3:radius}, ${4:sides=4}${5:, plot=${6:True}})\nsnippet pop\n pop()\nsnippet push\n push()\nsnippet random\n random(${1:v1=${2:None}, v2=${3:None}})\nsnippet read\n read(${1:pth}${2:, format=${3:None}, encoding=${4:utf-8}, cols=${5:None}})\nsnippet rect\n rect(${1:x}, ${2:y}, ${3:width}, ${4:height}${5:, roundness=${6:0.0}, plot=${7:True}})\nsnippet reset\n reset()\nsnippet rotate\n rotate(${1:theta})\nsnippet scale\n scale(${1:x=${2:1}, y=${3:None}})\nsnippet shadow\n shadow(${1:"black"}, blur=${2:10}, offset=${3:10})))\nsnippet shuffled\n shuffled(${2:seq})\nsnippet size\n size(${1:width}, ${2:height}, unit=${4:px}})\nsnippet skew\n skew(${1:horizontal}, ${2:vertical})\nsnippet speed\n speed(${1:fps})\nsnippet star\n star(${1:x}, ${2:y}${3:, points=${4:20}, outer=${5:100}, inner=${6:None}, plot=${7:True}}})\nsnippet stroke\n stroke()\nsnippet strokewidth\n strokewidth(${1:width})\nsnippet text\n text("${1:txt}", ${2:x}, ${3:y}${4:, width=${5:None}, height=${6:None}, outline=${7:False}, plot=${8:True}})\nsnippet textheight\n textheight("${1:txt}"${2:, width=${3:None}})\nsnippet textmetrics\n textmetrics("${1:txt}"${2:, width=${3:None}, height=${4:None}})\nsnippet textpath\n textpath("${1:txt}", ${2:x}, ${3:y}${4:, width=${5:None}, height=${6:None}})\nsnippet textwidth\n textwidth("${1:txt}"${2:, width=${3:None}})\nsnippet transform\n transform()\nsnippet transform()\n with transform(${1:${2:CENTER/CORNER, }${3:...}}):\n $4\nsnippet translate\n translate(${1:x}, ${2:y})\nsnippet ximport\n ${1:libName} = ximport("$1")\n';a.scope="plotdevice"});define("ace/snippets/text",["require","exports","module"],function(b,a,c){a.snippetText="";a.scope="text"});define("ace/theme/ambiance",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-ambiance";a.cssText=".ace-ambiance .ace_gutter {background-color: #3d3d3d;background-image: -moz-linear-gradient(left, #3D3D3D, #333);background-image: -ms-linear-gradient(left, #3D3D3D, #333);background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#3D3D3D), to(#333));background-image: -webkit-linear-gradient(left, #3D3D3D, #333);background-image: -o-linear-gradient(left, #3D3D3D, #333);background-image: linear-gradient(left, #3D3D3D, #333);background-repeat: repeat-x;border-right: 1px solid #4d4d4d;text-shadow: 0px 1px 1px #4d4d4d;color: #222;}.ace-ambiance .ace_gutter-layer {background: repeat left top;}.ace-ambiance .ace_fold-widget {text-align: center;}.ace-ambiance .ace_fold-widget:hover {color: #777;}.ace-ambiance .ace_fold-widget.ace_start,.ace-ambiance .ace_fold-widget.ace_end,.ace-ambiance .ace_fold-widget.ace_closed{background: none;border: none;box-shadow: none;}.ace-ambiance .ace_fold-widget.ace_start:after {content: '\u25be'}.ace-ambiance .ace_fold-widget.ace_end:after {content: '\u25b4'}.ace-ambiance .ace_fold-widget.ace_closed:after {content: '\u2023'}.ace-ambiance .ace_print-margin {border-left: 1px dotted #2D2D2D;right: 0;background: #262626;}.ace-ambiance .ace_scroller {-webkit-box-shadow: inset 0 0 10px black;-moz-box-shadow: inset 0 0 10px black;-o-box-shadow: inset 0 0 10px black;box-shadow: inset 0 0 10px black;}.ace-ambiance {color: #E6E1DC;background-color: #202020;}.ace-ambiance .ace_cursor {border-left: 1px solid #7991E8;}.ace-ambiance .ace_overwrite-cursors .ace_cursor {border: 1px solid #FFE300;background: #766B13;}.ace-ambiance.normal-mode .ace_cursor-layer {z-index: 0;}.ace-ambiance .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20);}.ace-ambiance .ace_marker-layer .ace_selected-word {border-radius: 4px;border: 8px solid #3f475d;box-shadow: 0 0 4px black;}.ace-ambiance .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-ambiance .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25);}.ace-ambiance .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031);}.ace-ambiance .ace_invisible {color: #333;}.ace-ambiance .ace_paren {color: #24C2C7;}.ace-ambiance .ace_keyword {color: #cda869;}.ace-ambiance .ace_keyword.ace_operator {color: #fa8d6a;}.ace-ambiance .ace_punctuation.ace_operator {color: #fa8d6a;}.ace-ambiance .ace_identifier {}.ace-ambiance .ace-statement {color: #cda869;}.ace-ambiance .ace_constant {color: #CF7EA9;}.ace-ambiance .ace_constant.ace_language {color: #CF7EA9;}.ace-ambiance .ace_constant.ace_library {}.ace-ambiance .ace_constant.ace_numeric {color: #78CF8A;}.ace-ambiance .ace_invalid {text-decoration: underline;}.ace-ambiance .ace_invalid.ace_illegal {color:#F8F8F8;background-color: rgba(86, 45, 86, 0.75);}.ace-ambiance .ace_invalid,.ace-ambiance .ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1;}.ace-ambiance .ace_support {color: #9B859D;}.ace-ambiance .ace_support.ace_function {color: #DAD085;}.ace-ambiance .ace_function.ace_buildin {color: #9b859d;}.ace-ambiance .ace_string {color: #8f9d6a;}.ace-ambiance .ace_string.ace_regexp {color: #DAD085;}.ace-ambiance .ace_comment {font-style: italic;color: #555;}.ace-ambiance .ace_comment.ace_doc {}.ace-ambiance .ace_comment.ace_doc.ace_tag {color: #666;font-style: normal;}.ace-ambiance .ace_definition,.ace-ambiance .ace_type {color: #aac6e3;}.ace-ambiance .ace_variable {color: #9999cc;}.ace-ambiance .ace_variable.ace_language {color: #9b859d;}.ace-ambiance .ace_xml-pe {color: #494949;}.ace-ambiance .ace_gutter-layer,.ace-ambiance .ace_text-layer {background-image: url(\"data:image/png;base64,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\");}.ace-ambiance .ace_indent-guide {background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/blackboard",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-blackboard";a.cssText="/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: A2C6BAA7-90D0-4147-BBF5-96B0CD92D109) */.ace-blackboard .ace_gutter {background: #0c1021;color: #AEAEAE;}.ace-blackboard .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-blackboard {background-color: #0C1021;color: #F8F8F8;}.ace-blackboard .ace_cursor {color: rgba(255, 255, 255, 0.65);}.ace-blackboard .ace_marker-layer .ace_selection {background: #325087;}.ace-blackboard.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #0C1021;border-radius: 2px;}.ace-blackboard .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-blackboard .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25);}.ace-blackboard .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.059);}.ace-blackboard .ace_gutter-active-line {background-color: rgba(255, 255, 255, 0.059);}.ace-blackboard .ace_marker-layer .ace_selected-word {border: 1px solid #253B76;}.ace-blackboard .ace_fold {background-color: #FBDE2D;border-color: #F8F8F8;}.ace-blackboard .ace_keyword,.ace-blackboard .ace_storage {color: #FBDE2D;}.ace-blackboard .ace_constant {color: #D8FA3C;}.ace-blackboard .ace_support {color: #8DA6CE;}.ace-blackboard .ace_invalid.ace_illegal {color: #F8F8F8;background-color: #9D1E15;}.ace-blackboard .ace_invalid.ace_deprecated {font-style: italic;color: #AB2A1D;}.ace-blackboard .ace_string {color: #61CE3C;}.ace-blackboard .ace_invisible{color:rgba(174, 174, 174, 0.5);}.ace-blackboard .ace_comment {color: #AEAEAE;}.ace-blackboard .ace_meta.ace_tag {color: #7F90AA;}.ace-blackboard .ace_variable,.ace-blackboard .ace_variable.ace_language {color:rgba(255, 100, 0, 1.0);}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/chaos",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-chaos";a.cssText=".ace-chaos .ace_gutter {background: #141414;color: #595959;border-right: 1px solid #282828;}.ace-chaos .ace_gutter-cell.ace_warning {background-image: none;background: #FC0;border-left: none;padding-left: 0;color: #000;}.ace-chaos .ace_gutter-cell.ace_error {background-position: -6px center;background-image: none;background: #F10;border-left: none;padding-left: 0;color: #000;}.ace-chaos .ace_print-margin {border-left: 1px solid #555;right: 0;background: #1D1D1D;}.ace-chaos {background-color: #161616;color: #E6E1DC;}.ace-chaos .ace_cursor {border-left: 2px solid #FFFFFF;}.ace-chaos .ace_cursor.ace_overwrite {border-left: 0px;border-bottom: 1px solid #FFFFFF;}.ace-chaos .ace_marker-layer .ace_selection {background: #494836;}.ace-chaos .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-chaos .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #FCE94F;}.ace-chaos .ace_marker-layer .ace_active-line {background: #333;}.ace-chaos .ace_gutter-active-line {background-color: #222;}.ace-chaos .ace_invisible {color: #404040;}.ace-chaos .ace_keyword {color:#00698F;}.ace-chaos .ace_keyword.ace_operator {color:#FF308F;}.ace-chaos .ace_constant {color:#1EDAFB;}.ace-chaos .ace_constant.ace_language {color:#FDC251;}.ace-chaos .ace_constant.ace_library {color:#8DFF0A;}.ace-chaos .ace_constant.ace_numeric {color:#58C554;}.ace-chaos .ace_invalid {color:#FFFFFF;background-color:#990000;}.ace-chaos .ace_invalid.ace_deprecated {color:#FFFFFF;background-color:#990000;}.ace-chaos .ace_support {color: #999;}.ace-chaos .ace_support.ace_function {color:#00AEEF;}.ace-chaos .ace_function {color:#00AEEF;}.ace-chaos .ace_string {color:#58C554;}.ace-chaos .ace_comment {color:#555;font-style:italic;padding-bottom: 0px;}.ace-chaos .ace_variable {color:#997744;}.ace-chaos .ace_meta.ace_tag {color:#BE53E6;}.ace-chaos .ace_entity.ace_other.ace_attribute-name {color:#FFFF89;}.ace-chaos .ace_markup.ace_underline {text-decoration: underline;}.ace-chaos .ace_fold-widget {text-align: center;}.ace-chaos .ace_fold-widget:hover {color: #777;}.ace-chaos .ace_fold-widget.ace_start,.ace-chaos .ace_fold-widget.ace_end,.ace-chaos .ace_fold-widget.ace_closed{background: none;border: none;box-shadow: none;}.ace-chaos .ace_fold-widget.ace_start:after {content: '\u25be'}.ace-chaos .ace_fold-widget.ace_end:after {content: '\u25b4'}.ace-chaos .ace_fold-widget.ace_closed:after {content: '\u2023'}.ace-chaos .ace_indent-guide {border-right:1px dotted #333;margin-right:-1px;}.ace-chaos .ace_fold { background: #222; border-radius: 3px; color: #7AF; border: none; }.ace-chaos .ace_fold:hover {background: #CCC; color: #000;}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/chrome",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-chrome";a.cssText='.ace-chrome .ace_gutter {background: #ebebeb;color: #333;overflow : hidden;}.ace-chrome .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-chrome {background-color: #FFFFFF;color: black;}.ace-chrome .ace_cursor {color: black;}.ace-chrome .ace_invisible {color: rgb(191, 191, 191);}.ace-chrome .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-chrome .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-chrome .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-chrome .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-chrome .ace_fold {}.ace-chrome .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-chrome .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-chrome .ace_support.ace_type,.ace-chrome .ace_support.ace_class.ace-chrome .ace_support.ace_other {color: rgb(109, 121, 222);}.ace-chrome .ace_variable.ace_parameter {font-style:italic;color:#FD971F;}.ace-chrome .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-chrome .ace_comment {color: #236e24;}.ace-chrome .ace_comment.ace_doc {color: #236e24;}.ace-chrome .ace_comment.ace_doc.ace_tag {color: #236e24;}.ace-chrome .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-chrome .ace_variable {color: rgb(49, 132, 149);}.ace-chrome .ace_xml-pe {color: rgb(104, 104, 91);}.ace-chrome .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-chrome .ace_heading {color: rgb(12, 7, 255);}.ace-chrome .ace_list {color:rgb(185, 6, 144);}.ace-chrome .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-chrome .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-chrome .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-chrome .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-chrome .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-chrome .ace_gutter-active-line {background-color : #dcdcdc;}.ace-chrome .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-chrome .ace_storage,.ace-chrome .ace_keyword,.ace-chrome .ace_meta.ace_tag {color: rgb(147, 15, 128);}.ace-chrome .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-chrome .ace_string {color: #1A1AA6;}.ace-chrome .ace_entity.ace_other.ace_attribute-name {color: #994409;}.ace-chrome .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/clouds",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-clouds";a.cssText='.ace-clouds .ace_gutter {background: #ebebeb;color: #333}.ace-clouds .ace_print-margin {width: 1px;background: #e8e8e8}.ace-clouds {background-color: #FFFFFF;color: #000000}.ace-clouds .ace_cursor {color: #000000}.ace-clouds .ace_marker-layer .ace_selection {background: #BDD5FC}.ace-clouds.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;border-radius: 2px}.ace-clouds .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-clouds .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-clouds .ace_marker-layer .ace_active-line {background: #FFFBD1}.ace-clouds .ace_gutter-active-line {background-color : #dcdcdc}.ace-clouds .ace_marker-layer .ace_selected-word {border: 1px solid #BDD5FC}.ace-clouds .ace_invisible {color: #BFBFBF}.ace-clouds .ace_keyword,.ace-clouds .ace_meta,.ace-clouds .ace_support.ace_constant.ace_property-value {color: #AF956F}.ace-clouds .ace_keyword.ace_operator {color: #484848}.ace-clouds .ace_keyword.ace_other.ace_unit {color: #96DC5F}.ace-clouds .ace_constant.ace_language {color: #39946A}.ace-clouds .ace_constant.ace_numeric {color: #46A609}.ace-clouds .ace_constant.ace_character.ace_entity {color: #BF78CC}.ace-clouds .ace_invalid {background-color: #FF002A}.ace-clouds .ace_fold {background-color: #AF956F;border-color: #000000}.ace-clouds .ace_storage,.ace-clouds .ace_support.ace_class,.ace-clouds .ace_support.ace_function,.ace-clouds .ace_support.ace_other,.ace-clouds .ace_support.ace_type {color: #C52727}.ace-clouds .ace_string {color: #5D90CD}.ace-clouds .ace_comment {color: #BCC8BA}.ace-clouds .ace_entity.ace_name.ace_tag,.ace-clouds .ace_entity.ace_other.ace_attribute-name {color: #606060}.ace-clouds .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/clouds_midnight",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-clouds-midnight";a.cssText=".ace-clouds-midnight .ace_gutter {background: #232323;color: #929292}.ace-clouds-midnight .ace_print-margin {width: 1px;background: #232323}.ace-clouds-midnight {background-color: #191919;color: #929292}.ace-clouds-midnight .ace_cursor {color: #7DA5DC}.ace-clouds-midnight .ace_marker-layer .ace_selection {background: #000000}.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #191919;border-radius: 2px}.ace-clouds-midnight .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-clouds-midnight .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-clouds-midnight .ace_marker-layer .ace_active-line {background: rgba(215, 215, 215, 0.031)}.ace-clouds-midnight .ace_gutter-active-line {background-color: rgba(215, 215, 215, 0.031)}.ace-clouds-midnight .ace_marker-layer .ace_selected-word {border: 1px solid #000000}.ace-clouds-midnight .ace_invisible {color: #BFBFBF}.ace-clouds-midnight .ace_keyword,.ace-clouds-midnight .ace_meta,.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {color: #927C5D}.ace-clouds-midnight .ace_keyword.ace_operator {color: #4B4B4B}.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {color: #366F1A}.ace-clouds-midnight .ace_constant.ace_language {color: #39946A}.ace-clouds-midnight .ace_constant.ace_numeric {color: #46A609}.ace-clouds-midnight .ace_constant.ace_character.ace_entity {color: #A165AC}.ace-clouds-midnight .ace_invalid {color: #FFFFFF;background-color: #E92E2E}.ace-clouds-midnight .ace_fold {background-color: #927C5D;border-color: #929292}.ace-clouds-midnight .ace_storage,.ace-clouds-midnight .ace_support.ace_class,.ace-clouds-midnight .ace_support.ace_function,.ace-clouds-midnight .ace_support.ace_other,.ace-clouds-midnight .ace_support.ace_type {color: #E92E2E}.ace-clouds-midnight .ace_string {color: #5D90CD}.ace-clouds-midnight .ace_comment {color: #3C403B}.ace-clouds-midnight .ace_entity.ace_name.ace_tag,.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {color: #606060}.ace-clouds-midnight .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/cobalt",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-cobalt";a.cssText=".ace-cobalt .ace_gutter {background: #011e3a;color: #fff}.ace-cobalt .ace_print-margin {width: 1px;background: #011e3a}.ace-cobalt {background-color: #002240;color: #FFFFFF}.ace-cobalt .ace_cursor {color: #FFFFFF}.ace-cobalt .ace_marker-layer .ace_selection {background: rgba(179, 101, 57, 0.75)}.ace-cobalt.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #002240;border-radius: 2px}.ace-cobalt .ace_marker-layer .ace_step {background: rgb(127, 111, 19)}.ace-cobalt .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.15)}.ace-cobalt .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.35)}.ace-cobalt .ace_gutter-active-line {background-color: rgba(0, 0, 0, 0.35)}.ace-cobalt .ace_marker-layer .ace_selected-word {border: 1px solid rgba(179, 101, 57, 0.75)}.ace-cobalt .ace_invisible {color: rgba(255, 255, 255, 0.15)}.ace-cobalt .ace_keyword,.ace-cobalt .ace_meta {color: #FF9D00}.ace-cobalt .ace_constant,.ace-cobalt .ace_constant.ace_character,.ace-cobalt .ace_constant.ace_character.ace_escape,.ace-cobalt .ace_constant.ace_other {color: #FF628C}.ace-cobalt .ace_invalid {color: #F8F8F8;background-color: #800F00}.ace-cobalt .ace_support {color: #80FFBB}.ace-cobalt .ace_support.ace_constant {color: #EB939A}.ace-cobalt .ace_fold {background-color: #FF9D00;border-color: #FFFFFF}.ace-cobalt .ace_support.ace_function {color: #FFB054}.ace-cobalt .ace_storage {color: #FFEE80}.ace-cobalt .ace_entity {color: #FFDD00}.ace-cobalt .ace_string {color: #3AD900}.ace-cobalt .ace_string.ace_regexp {color: #80FFC2}.ace-cobalt .ace_comment {font-style: italic;color: #0088FF}.ace-cobalt .ace_heading,.ace-cobalt .ace_markup.ace_heading {color: #C8E4FD;background-color: #001221}.ace-cobalt .ace_list,.ace-cobalt .ace_markup.ace_list {background-color: #130D26}.ace-cobalt .ace_variable {color: #CCCCCC}.ace-cobalt .ace_variable.ace_language {color: #FF80E1}.ace-cobalt .ace_meta.ace_tag {color: #9EFFFF}.ace-cobalt .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/crimson_editor",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssText='.ace-crimson-editor .ace_gutter {background: #ebebeb;color: #333;overflow : hidden;}.ace-crimson-editor .ace_gutter-layer {width: 100%;text-align: right;}.ace-crimson-editor .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-crimson-editor {background-color: #FFFFFF;color: rgb(64, 64, 64);}.ace-crimson-editor .ace_cursor {color: black;}.ace-crimson-editor .ace_invisible {color: rgb(191, 191, 191);}.ace-crimson-editor .ace_identifier {color: black;}.ace-crimson-editor .ace_keyword {color: blue;}.ace-crimson-editor .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-crimson-editor .ace_constant.ace_language {color: rgb(255, 156, 0);}.ace-crimson-editor .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-crimson-editor .ace_invalid {text-decoration: line-through;color: rgb(224, 0, 0);}.ace-crimson-editor .ace_fold {}.ace-crimson-editor .ace_support.ace_function {color: rgb(192, 0, 0);}.ace-crimson-editor .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-crimson-editor .ace_support.ace_type,.ace-crimson-editor .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-crimson-editor .ace_keyword.ace_operator {color: rgb(49, 132, 149);}.ace-crimson-editor .ace_string {color: rgb(128, 0, 128);}.ace-crimson-editor .ace_comment {color: rgb(76, 136, 107);}.ace-crimson-editor .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-crimson-editor .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-crimson-editor .ace_constant.ace_numeric {color: rgb(0, 0, 64);}.ace-crimson-editor .ace_variable {color: rgb(0, 64, 128);}.ace-crimson-editor .ace_xml-pe {color: rgb(104, 104, 91);}.ace-crimson-editor .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-crimson-editor .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-crimson-editor .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-crimson-editor .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-crimson-editor .ace_marker-layer .ace_active-line {background: rgb(232, 242, 254);}.ace-crimson-editor .ace_gutter-active-line {background-color : #dcdcdc;}.ace-crimson-editor .ace_meta.ace_tag {color:rgb(28, 2, 255);}.ace-crimson-editor .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-crimson-editor .ace_string.ace_regex {color: rgb(192, 0, 192);}.ace-crimson-editor .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';a.cssClass="ace-crimson-editor";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/dawn",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-dawn";a.cssText=".ace-dawn .ace_gutter {background: #ebebeb;color: #333}.ace-dawn .ace_print-margin {width: 1px;background: #e8e8e8}.ace-dawn {background-color: #F9F9F9;color: #080808}.ace-dawn .ace_cursor {color: #000000}.ace-dawn .ace_marker-layer .ace_selection {background: rgba(39, 95, 255, 0.30)}.ace-dawn.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #F9F9F9;border-radius: 2px}.ace-dawn .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-dawn .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(75, 75, 126, 0.50)}.ace-dawn .ace_marker-layer .ace_active-line {background: rgba(36, 99, 180, 0.12)}.ace-dawn .ace_gutter-active-line {background-color : #dcdcdc}.ace-dawn .ace_marker-layer .ace_selected-word {border: 1px solid rgba(39, 95, 255, 0.30)}.ace-dawn .ace_invisible {color: rgba(75, 75, 126, 0.50)}.ace-dawn .ace_keyword,.ace-dawn .ace_meta {color: #794938}.ace-dawn .ace_constant,.ace-dawn .ace_constant.ace_character,.ace-dawn .ace_constant.ace_character.ace_escape,.ace-dawn .ace_constant.ace_other {color: #811F24}.ace-dawn .ace_invalid.ace_illegal {text-decoration: underline;font-style: italic;color: #F8F8F8;background-color: #B52A1D}.ace-dawn .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #B52A1D}.ace-dawn .ace_support {color: #691C97}.ace-dawn .ace_support.ace_constant {color: #B4371F}.ace-dawn .ace_fold {background-color: #794938;border-color: #080808}.ace-dawn .ace_list,.ace-dawn .ace_markup.ace_list,.ace-dawn .ace_support.ace_function {color: #693A17}.ace-dawn .ace_storage {font-style: italic;color: #A71D5D}.ace-dawn .ace_string {color: #0B6125}.ace-dawn .ace_string.ace_regexp {color: #CF5628}.ace-dawn .ace_comment {font-style: italic;color: #5A525F}.ace-dawn .ace_heading,.ace-dawn .ace_markup.ace_heading {color: #19356D}.ace-dawn .ace_variable {color: #234A97}.ace-dawn .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/dreamweaver",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-dreamweaver";a.cssText='.ace-dreamweaver .ace_gutter {background: #e8e8e8;color: #333;}.ace-dreamweaver .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-dreamweaver {background-color: #FFFFFF;color: black;}.ace-dreamweaver .ace_fold {background-color: #757AD8;}.ace-dreamweaver .ace_cursor {color: black;}.ace-dreamweaver .ace_invisible {color: rgb(191, 191, 191);}.ace-dreamweaver .ace_storage,.ace-dreamweaver .ace_keyword {color: blue;}.ace-dreamweaver .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-dreamweaver .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-dreamweaver .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-dreamweaver .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-dreamweaver .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-dreamweaver .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-dreamweaver .ace_support.ace_type,.ace-dreamweaver .ace_support.ace_class {color: #009;}.ace-dreamweaver .ace_support.ace_php_tag {color: #f00;}.ace-dreamweaver .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-dreamweaver .ace_string {color: #00F;}.ace-dreamweaver .ace_comment {color: rgb(76, 136, 107);}.ace-dreamweaver .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-dreamweaver .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-dreamweaver .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-dreamweaver .ace_variable {color: #06F}.ace-dreamweaver .ace_xml-pe {color: rgb(104, 104, 91);}.ace-dreamweaver .ace_entity.ace_name.ace_function {color: #00F;}.ace-dreamweaver .ace_heading {color: rgb(12, 7, 255);}.ace-dreamweaver .ace_list {color:rgb(185, 6, 144);}.ace-dreamweaver .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-dreamweaver .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-dreamweaver .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-dreamweaver .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-dreamweaver .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-dreamweaver .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-dreamweaver .ace_meta.ace_tag {color:#009;}.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {color:#060;}.ace-dreamweaver .ace_meta.ace_tag.ace_form {color:#F90;}.ace-dreamweaver .ace_meta.ace_tag.ace_image {color:#909;}.ace-dreamweaver .ace_meta.ace_tag.ace_script {color:#900;}.ace-dreamweaver .ace_meta.ace_tag.ace_style {color:#909;}.ace-dreamweaver .ace_meta.ace_tag.ace_table {color:#099;}.ace-dreamweaver .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-dreamweaver .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/eclipse",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssText='.ace-eclipse .ace_gutter {background: #ebebeb;border-right: 1px solid rgb(159, 159, 159);color: rgb(136, 136, 136);}.ace-eclipse .ace_print-margin {width: 1px;background: #ebebeb;}.ace-eclipse {background-color: #FFFFFF;color: black;}.ace-eclipse .ace_fold {background-color: rgb(60, 76, 114);}.ace-eclipse .ace_cursor {color: black;}.ace-eclipse .ace_storage,.ace-eclipse .ace_keyword,.ace-eclipse .ace_variable {color: rgb(127, 0, 85);}.ace-eclipse .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-eclipse .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-eclipse .ace_function {color: rgb(60, 76, 114);}.ace-eclipse .ace_string {color: rgb(42, 0, 255);}.ace-eclipse .ace_comment {color: rgb(113, 150, 130);}.ace-eclipse .ace_comment.ace_doc {color: rgb(63, 95, 191);}.ace-eclipse .ace_comment.ace_doc.ace_tag {color: rgb(127, 159, 191);}.ace-eclipse .ace_constant.ace_numeric {color: darkblue;}.ace-eclipse .ace_tag {color: rgb(25, 118, 116);}.ace-eclipse .ace_type {color: rgb(127, 0, 127);}.ace-eclipse .ace_xml-pe {color: rgb(104, 104, 91);}.ace-eclipse .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-eclipse .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-eclipse .ace_meta.ace_tag {color:rgb(25, 118, 116);}.ace-eclipse .ace_invisible {color: #ddd;}.ace-eclipse .ace_entity.ace_other.ace_attribute-name {color:rgb(127, 0, 127);}.ace-eclipse .ace_marker-layer .ace_step {background: rgb(255, 255, 0);}.ace-eclipse .ace_marker-layer .ace_active-line {background: rgb(232, 242, 254);}.ace-eclipse .ace_marker-layer .ace_selected-word {border: 1px solid rgb(181, 213, 255);}.ace-eclipse .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';a.cssClass="ace-eclipse";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/github",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-github";a.cssText='/* CSS style content from github\'s default pygments highlighter template.Cursor and selection styles from textmate.css. */.ace-github .ace_gutter {background: #e8e8e8;color: #AAA;}.ace-github {background: #fff;color: #000;}.ace-github .ace_keyword {font-weight: bold;}.ace-github .ace_string {color: #D14;}.ace-github .ace_variable.ace_class {color: teal;}.ace-github .ace_constant.ace_numeric {color: #099;}.ace-github .ace_constant.ace_buildin {color: #0086B3;}.ace-github .ace_support.ace_function {color: #0086B3;}.ace-github .ace_comment {color: #998;font-style: italic;}.ace-github .ace_variable.ace_language {color: #0086B3;}.ace-github .ace_paren {font-weight: bold;}.ace-github .ace_boolean {font-weight: bold;}.ace-github .ace_string.ace_regexp {color: #009926;font-weight: normal;}.ace-github .ace_variable.ace_instance {color: teal;}.ace-github .ace_constant.ace_language {font-weight: bold;}.ace-github .ace_cursor {color: black;}.ace-github .ace_marker-layer .ace_active-line {background: rgb(255, 255, 204);}.ace-github .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-github.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;border-radius: 2px;}/* bold keywords cause cursor issues for some fonts *//* this disables bold style for editor and keeps for static highlighter */.ace-github.ace_nobold .ace_line > span {font-weight: normal !important;}.ace-github .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-github .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-github .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-github .ace_gutter-active-line {background-color : rgba(0, 0, 0, 0.07);}.ace-github .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-github .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-github .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/idle_fingers",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-idle-fingers";a.cssText=".ace-idle-fingers .ace_gutter {background: #3b3b3b;color: #fff}.ace-idle-fingers .ace_print-margin {width: 1px;background: #3b3b3b}.ace-idle-fingers {background-color: #323232;color: #FFFFFF}.ace-idle-fingers .ace_cursor {color: #91FF00}.ace-idle-fingers .ace_marker-layer .ace_selection {background: rgba(90, 100, 126, 0.88)}.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #323232;border-radius: 2px}.ace-idle-fingers .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-idle-fingers .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-idle-fingers .ace_marker-layer .ace_active-line {background: #353637}.ace-idle-fingers .ace_gutter-active-line {background-color: #353637}.ace-idle-fingers .ace_marker-layer .ace_selected-word {border: 1px solid rgba(90, 100, 126, 0.88)}.ace-idle-fingers .ace_invisible {color: #404040}.ace-idle-fingers .ace_keyword,.ace-idle-fingers .ace_meta {color: #CC7833}.ace-idle-fingers .ace_constant,.ace-idle-fingers .ace_constant.ace_character,.ace-idle-fingers .ace_constant.ace_character.ace_escape,.ace-idle-fingers .ace_constant.ace_other,.ace-idle-fingers .ace_support.ace_constant {color: #6C99BB}.ace-idle-fingers .ace_invalid {color: #FFFFFF;background-color: #FF0000}.ace-idle-fingers .ace_fold {background-color: #CC7833;border-color: #FFFFFF}.ace-idle-fingers .ace_support.ace_function {color: #B83426}.ace-idle-fingers .ace_variable.ace_parameter {font-style: italic}.ace-idle-fingers .ace_string {color: #A5C261}.ace-idle-fingers .ace_string.ace_regexp {color: #CCCC33}.ace-idle-fingers .ace_comment {font-style: italic;color: #BC9458}.ace-idle-fingers .ace_meta.ace_tag {color: #FFE5BB}.ace-idle-fingers .ace_entity.ace_name {color: #FFC66D}.ace-idle-fingers .ace_collab.ace_user1 {color: #323232;background-color: #FFF980}.ace-idle-fingers .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/katzenmilch",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-katzenmilch";a.cssText=".ace-katzenmilch .ace_gutter,/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: ) */.ace-katzenmilch .ace_gutter {background: #e8e8e8;color: #333}.ace-katzenmilch .ace_print-margin {width: 1px;background: #e8e8e8}.ace-katzenmilch {background-color: #f3f2f3;color: rgba(15, 0, 9, 1.0)}.ace-katzenmilch .ace_cursor {border-left: 2px solid #100011}.ace-katzenmilch .ace_overwrite-cursors .ace_cursor {border-left: 0px;border-bottom: 1px solid #100011}.ace-katzenmilch .ace_marker-layer .ace_selection {background: rgba(100, 5, 208, 0.27)}.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #f3f2f3;border-radius: 2px}.ace-katzenmilch .ace_marker-layer .ace_step {background: rgb(198, 219, 174)}.ace-katzenmilch .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #000000}.ace-katzenmilch .ace_marker-layer .ace_active-line {background: rgb(232, 242, 254)}.ace-katzenmilch .ace_gutter-active-line {background-color: rgb(232, 242, 254)}.ace-katzenmilch .ace_marker-layer .ace_selected-word {border: 1px solid rgba(100, 5, 208, 0.27)}.ace-katzenmilch .ace_fold {background-color: rgba(2, 95, 73, 0.97);border-color: rgba(15, 0, 9, 1.0)}.ace-katzenmilch .ace_keyword {color: #674Aa8;rbackground-color: rgba(163, 170, 216, 0.055)}.ace-katzenmilch .ace_constant.ace_language {color: #7D7e52;rbackground-color: rgba(189, 190, 130, 0.059)}.ace-katzenmilch .ace_constant.ace_numeric {color: rgba(79, 130, 123, 0.93);rbackground-color: rgba(119, 194, 187, 0.059)}.ace-katzenmilch .ace_constant.ace_character,.ace-katzenmilch .ace_constant.ace_other {color: rgba(2, 95, 105, 1.0);rbackground-color: rgba(127, 34, 153, 0.063)}.ace-katzenmilch .ace_support.ace_function {color: #9D7e62;rbackground-color: rgba(189, 190, 130, 0.039)}.ace-katzenmilch .ace_support.ace_class {color: rgba(239, 106, 167, 1.0);rbackground-color: rgba(239, 106, 167, 0.063)}.ace-katzenmilch .ace_storage {color: rgba(123, 92, 191, 1.0);rbackground-color: rgba(139, 93, 223, 0.051)}.ace-katzenmilch .ace_invalid {color: #DFDFD5;rbackground-color: #CC1B27}.ace-katzenmilch .ace_string {color: #5a5f9b;rbackground-color: rgba(170, 175, 219, 0.035)}.ace-katzenmilch .ace_comment {font-style: italic;color: rgba(64, 79, 80, 0.67);rbackground-color: rgba(95, 15, 255, 0.0078)}.ace-katzenmilch .ace_entity.ace_name.ace_function,.ace-katzenmilch .ace_variable {color: rgba(2, 95, 73, 0.97);rbackground-color: rgba(34, 255, 73, 0.12)}.ace-katzenmilch .ace_variable.ace_language {color: #316fcf;rbackground-color: rgba(58, 175, 255, 0.039)}.ace-katzenmilch .ace_variable.ace_parameter {font-style: italic;color: rgba(51, 150, 159, 0.87);rbackground-color: rgba(5, 214, 249, 0.043)}.ace-katzenmilch .ace_entity.ace_other.ace_attribute-name {color: rgba(73, 70, 194, 0.93);rbackground-color: rgba(73, 134, 194, 0.035)}.ace-katzenmilch .ace_entity.ace_name.ace_tag {color: #3976a2;rbackground-color: rgba(73, 166, 210, 0.039)}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/kr_theme",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-kr-theme";a.cssText=".ace-kr-theme .ace_gutter {background: #1c1917;color: #FCFFE0}.ace-kr-theme .ace_print-margin {width: 1px;background: #1c1917}.ace-kr-theme {background-color: #0B0A09;color: #FCFFE0}.ace-kr-theme .ace_cursor {color: #FF9900}.ace-kr-theme .ace_marker-layer .ace_selection {background: rgba(170, 0, 255, 0.45)}.ace-kr-theme.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #0B0A09;border-radius: 2px}.ace-kr-theme .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-kr-theme .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 177, 111, 0.32)}.ace-kr-theme .ace_marker-layer .ace_active-line {background: #38403D}.ace-kr-theme .ace_gutter-active-line {background-color : #38403D}.ace-kr-theme .ace_marker-layer .ace_selected-word {border: 1px solid rgba(170, 0, 255, 0.45)}.ace-kr-theme .ace_invisible {color: rgba(255, 177, 111, 0.32)}.ace-kr-theme .ace_keyword,.ace-kr-theme .ace_meta {color: #949C8B}.ace-kr-theme .ace_constant,.ace-kr-theme .ace_constant.ace_character,.ace-kr-theme .ace_constant.ace_character.ace_escape,.ace-kr-theme .ace_constant.ace_other {color: rgba(210, 117, 24, 0.76)}.ace-kr-theme .ace_invalid {color: #F8F8F8;background-color: #A41300}.ace-kr-theme .ace_support {color: #9FC28A}.ace-kr-theme .ace_support.ace_constant {color: #C27E66}.ace-kr-theme .ace_fold {background-color: #949C8B;border-color: #FCFFE0}.ace-kr-theme .ace_support.ace_function {color: #85873A}.ace-kr-theme .ace_storage {color: #FFEE80}.ace-kr-theme .ace_string {color: rgba(164, 161, 181, 0.8)}.ace-kr-theme .ace_string.ace_regexp {color: rgba(125, 255, 192, 0.65)}.ace-kr-theme .ace_comment {font-style: italic;color: #706D5B}.ace-kr-theme .ace_variable {color: #D1A796}.ace-kr-theme .ace_list,.ace-kr-theme .ace_markup.ace_list {background-color: #0F0040}.ace-kr-theme .ace_variable.ace_language {color: #FF80E1}.ace-kr-theme .ace_meta.ace_tag {color: #BABD9C}.ace-kr-theme .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/kuroir",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-kuroir";a.cssText="/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: 467560D0-6ACE-4409-82FD-4791420837AC) */.ace-kuroir .ace_gutter {background: #e8e8e8;color: #333;}.ace-kuroir .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-kuroir {background-color: #E8E9E8;color: #363636;}.ace-kuroir .ace_cursor {color: #202020;}.ace-kuroir .ace_marker-layer .ace_selection {background: rgba(245, 170, 0, 0.57);}.ace-kuroir.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #E8E9E8;border-radius: 2px;}.ace-kuroir .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-kuroir .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(0, 0, 0, 0.29);}.ace-kuroir .ace_marker-layer .ace_active-line {background: rgba(203, 220, 47, 0.22);}.ace-kuroir .ace_gutter-active-line {background-color: rgba(203, 220, 47, 0.22);}.ace-kuroir .ace_marker-layer .ace_selected-word {border: 1px solid rgba(245, 170, 0, 0.57);}.ace-kuroir .ace_fold {border-color: #363636;}.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;background-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;font-style:italic;color:#FD1732;background-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;background-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);background-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;background-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/merbivore",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-merbivore";a.cssText=".ace-merbivore .ace_gutter {background: #202020;color: #E6E1DC}.ace-merbivore .ace_print-margin {width: 1px;background: #555651}.ace-merbivore {background-color: #161616;color: #E6E1DC}.ace-merbivore .ace_cursor {color: #FFFFFF}.ace-merbivore .ace_marker-layer .ace_selection {background: #454545}.ace-merbivore.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #161616;border-radius: 2px}.ace-merbivore .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-merbivore .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-merbivore .ace_marker-layer .ace_active-line {background: #333435}.ace-merbivore .ace_gutter-active-line {background-color: #333435}.ace-merbivore .ace_marker-layer .ace_selected-word {border: 1px solid #454545}.ace-merbivore .ace_invisible {color: #404040}.ace-merbivore .ace_entity.ace_name.ace_tag,.ace-merbivore .ace_keyword,.ace-merbivore .ace_meta,.ace-merbivore .ace_meta.ace_tag,.ace-merbivore .ace_storage,.ace-merbivore .ace_support.ace_function {color: #FC6F09}.ace-merbivore .ace_constant,.ace-merbivore .ace_constant.ace_character,.ace-merbivore .ace_constant.ace_character.ace_escape,.ace-merbivore .ace_constant.ace_other,.ace-merbivore .ace_support.ace_type {color: #1EDAFB}.ace-merbivore .ace_constant.ace_character.ace_escape {color: #519F50}.ace-merbivore .ace_constant.ace_language {color: #FDC251}.ace-merbivore .ace_constant.ace_library,.ace-merbivore .ace_string,.ace-merbivore .ace_support.ace_constant {color: #8DFF0A}.ace-merbivore .ace_constant.ace_numeric {color: #58C554}.ace-merbivore .ace_invalid {color: #FFFFFF;background-color: #990000}.ace-merbivore .ace_fold {background-color: #FC6F09;border-color: #E6E1DC}.ace-merbivore .ace_comment {font-style: italic;color: #AD2EA4}.ace-merbivore .ace_entity.ace_other.ace_attribute-name {color: #FFFF89}.ace-merbivore .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/merbivore_soft",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-merbivore-soft";a.cssText=".ace-merbivore-soft .ace_gutter {background: #262424;color: #E6E1DC}.ace-merbivore-soft .ace_print-margin {width: 1px;background: #262424}.ace-merbivore-soft {background-color: #1C1C1C;color: #E6E1DC}.ace-merbivore-soft .ace_cursor {color: #FFFFFF}.ace-merbivore-soft .ace_marker-layer .ace_selection {background: #494949}.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #1C1C1C;border-radius: 2px}.ace-merbivore-soft .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-merbivore-soft .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-merbivore-soft .ace_marker-layer .ace_active-line {background: #333435}.ace-merbivore-soft .ace_gutter-active-line {background-color: #333435}.ace-merbivore-soft .ace_marker-layer .ace_selected-word {border: 1px solid #494949}.ace-merbivore-soft .ace_invisible {color: #404040}.ace-merbivore-soft .ace_entity.ace_name.ace_tag,.ace-merbivore-soft .ace_keyword,.ace-merbivore-soft .ace_meta,.ace-merbivore-soft .ace_meta.ace_tag,.ace-merbivore-soft .ace_storage {color: #FC803A}.ace-merbivore-soft .ace_constant,.ace-merbivore-soft .ace_constant.ace_character,.ace-merbivore-soft .ace_constant.ace_character.ace_escape,.ace-merbivore-soft .ace_constant.ace_other,.ace-merbivore-soft .ace_support.ace_type {color: #68C1D8}.ace-merbivore-soft .ace_constant.ace_character.ace_escape {color: #B3E5B4}.ace-merbivore-soft .ace_constant.ace_language {color: #E1C582}.ace-merbivore-soft .ace_constant.ace_library,.ace-merbivore-soft .ace_string,.ace-merbivore-soft .ace_support.ace_constant {color: #8EC65F}.ace-merbivore-soft .ace_constant.ace_numeric {color: #7FC578}.ace-merbivore-soft .ace_invalid,.ace-merbivore-soft .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #FE3838}.ace-merbivore-soft .ace_fold {background-color: #FC803A;border-color: #E6E1DC}.ace-merbivore-soft .ace_comment,.ace-merbivore-soft .ace_meta {font-style: italic;color: #AC4BB8}.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {color: #EAF1A3}.ace-merbivore-soft .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/mono_industrial",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-mono-industrial";a.cssText=".ace-mono-industrial .ace_gutter {background: #1d2521;color: #C5C9C9}.ace-mono-industrial .ace_print-margin {width: 1px;background: #555651}.ace-mono-industrial {background-color: #222C28;color: #FFFFFF}.ace-mono-industrial .ace_cursor {color: #FFFFFF}.ace-mono-industrial .ace_marker-layer .ace_selection {background: rgba(145, 153, 148, 0.40)}.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #222C28;border-radius: 2px}.ace-mono-industrial .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-mono-industrial .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(102, 108, 104, 0.50)}.ace-mono-industrial .ace_marker-layer .ace_active-line {background: rgba(12, 13, 12, 0.25)}.ace-mono-industrial .ace_gutter-active-line {background-color: rgba(12, 13, 12, 0.25)}.ace-mono-industrial .ace_marker-layer .ace_selected-word {border: 1px solid rgba(145, 153, 148, 0.40)}.ace-mono-industrial .ace_invisible {color: rgba(102, 108, 104, 0.50)}.ace-mono-industrial .ace_string {background-color: #151C19;color: #FFFFFF}.ace-mono-industrial .ace_keyword,.ace-mono-industrial .ace_meta {color: #A39E64}.ace-mono-industrial .ace_constant,.ace-mono-industrial .ace_constant.ace_character,.ace-mono-industrial .ace_constant.ace_character.ace_escape,.ace-mono-industrial .ace_constant.ace_numeric,.ace-mono-industrial .ace_constant.ace_other {color: #E98800}.ace-mono-industrial .ace_entity.ace_name.ace_function,.ace-mono-industrial .ace_keyword.ace_operator,.ace-mono-industrial .ace_variable {color: #A8B3AB}.ace-mono-industrial .ace_invalid {color: #FFFFFF;background-color: rgba(153, 0, 0, 0.68)}.ace-mono-industrial .ace_support.ace_constant {color: #C87500}.ace-mono-industrial .ace_fold {background-color: #A8B3AB;border-color: #FFFFFF}.ace-mono-industrial .ace_support.ace_function {color: #588E60}.ace-mono-industrial .ace_entity.ace_name,.ace-mono-industrial .ace_support.ace_class,.ace-mono-industrial .ace_support.ace_type {color: #5778B6}.ace-mono-industrial .ace_storage {color: #C23B00}.ace-mono-industrial .ace_variable.ace_language,.ace-mono-industrial .ace_variable.ace_parameter {color: #648BD2}.ace-mono-industrial .ace_comment {color: #666C68;background-color: #151C19}.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {color: #909993}.ace-mono-industrial .ace_entity.ace_name.ace_tag {color: #A65EFF}.ace-mono-industrial .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/monokai",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-monokai";a.cssText=".ace-monokai .ace_gutter {background: #2F3129;color: #8F908A}.ace-monokai .ace_print-margin {width: 1px;background: #555651}.ace-monokai {background-color: #272822;color: #F8F8F2}.ace-monokai .ace_cursor {color: #F8F8F0}.ace-monokai .ace_marker-layer .ace_selection {background: #49483E}.ace-monokai.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #272822;border-radius: 2px}.ace-monokai .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-monokai .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #49483E}.ace-monokai .ace_marker-layer .ace_active-line {background: #202020}.ace-monokai .ace_gutter-active-line {background-color: #272727}.ace-monokai .ace_marker-layer .ace_selected-word {border: 1px solid #49483E}.ace-monokai .ace_invisible {color: #52524d}.ace-monokai .ace_entity.ace_name.ace_tag,.ace-monokai .ace_keyword,.ace-monokai .ace_meta.ace_tag,.ace-monokai .ace_storage {color: #F92672}.ace-monokai .ace_punctuation,.ace-monokai .ace_punctuation.ace_tag {color: #fff}.ace-monokai .ace_constant.ace_character,.ace-monokai .ace_constant.ace_language,.ace-monokai .ace_constant.ace_numeric,.ace-monokai .ace_constant.ace_other {color: #AE81FF}.ace-monokai .ace_invalid {color: #F8F8F0;background-color: #F92672}.ace-monokai .ace_invalid.ace_deprecated {color: #F8F8F0;background-color: #AE81FF}.ace-monokai .ace_support.ace_constant,.ace-monokai .ace_support.ace_function {color: #66D9EF}.ace-monokai .ace_fold {background-color: #A6E22E;border-color: #F8F8F2}.ace-monokai .ace_storage.ace_type,.ace-monokai .ace_support.ace_class,.ace-monokai .ace_support.ace_type {font-style: italic;color: #66D9EF}.ace-monokai .ace_entity.ace_name.ace_function,.ace-monokai .ace_entity.ace_other,.ace-monokai .ace_entity.ace_other.ace_attribute-name,.ace-monokai .ace_variable {color: #A6E22E}.ace-monokai .ace_variable.ace_parameter {font-style: italic;color: #FD971F}.ace-monokai .ace_string {color: #E6DB74}.ace-monokai .ace_comment {color: #75715E}.ace-monokai .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/pastel_on_dark",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-pastel-on-dark";a.cssText=".ace-pastel-on-dark .ace_gutter {background: #353030;color: #8F938F}.ace-pastel-on-dark .ace_print-margin {width: 1px;background: #353030}.ace-pastel-on-dark {background-color: #2C2828;color: #8F938F}.ace-pastel-on-dark .ace_cursor {color: #A7A7A7}.ace-pastel-on-dark .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20)}.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #2C2828;border-radius: 2px}.ace-pastel-on-dark .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-pastel-on-dark .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25)}.ace-pastel-on-dark .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031)}.ace-pastel-on-dark .ace_gutter-active-line {background-color: rgba(255, 255, 255, 0.031)}.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {border: 1px solid rgba(221, 240, 255, 0.20)}.ace-pastel-on-dark .ace_invisible {color: rgba(255, 255, 255, 0.25)}.ace-pastel-on-dark .ace_keyword,.ace-pastel-on-dark .ace_meta {color: #757aD8}.ace-pastel-on-dark .ace_constant,.ace-pastel-on-dark .ace_constant.ace_character,.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,.ace-pastel-on-dark .ace_constant.ace_other {color: #4FB7C5}.ace-pastel-on-dark .ace_keyword.ace_operator {color: #797878}.ace-pastel-on-dark .ace_constant.ace_character {color: #AFA472}.ace-pastel-on-dark .ace_constant.ace_language {color: #DE8E30}.ace-pastel-on-dark .ace_constant.ace_numeric {color: #CCCCCC}.ace-pastel-on-dark .ace_invalid,.ace-pastel-on-dark .ace_invalid.ace_illegal {color: #F8F8F8;background-color: rgba(86, 45, 86, 0.75)}.ace-pastel-on-dark .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1}.ace-pastel-on-dark .ace_fold {background-color: #757aD8;border-color: #8F938F}.ace-pastel-on-dark .ace_support.ace_function {color: #AEB2F8}.ace-pastel-on-dark .ace_string {color: #66A968}.ace-pastel-on-dark .ace_string.ace_regexp {color: #E9C062}.ace-pastel-on-dark .ace_comment {color: #A6C6FF}.ace-pastel-on-dark .ace_variable {color: #BEBF55}.ace-pastel-on-dark .ace_variable.ace_language {color: #C1C144}.ace-pastel-on-dark .ace_xml-pe {color: #494949}.ace-pastel-on-dark .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/solarized_dark",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-solarized-dark";a.cssText=".ace-solarized-dark .ace_gutter {background: #01313f;color: #d0edf7}.ace-solarized-dark .ace_print-margin {width: 1px;background: #33555E}.ace-solarized-dark {background-color: #002B36;color: #93A1A1}.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,.ace-solarized-dark .ace_storage {color: #93A1A1}.ace-solarized-dark .ace_cursor,.ace-solarized-dark .ace_string.ace_regexp {color: #D30102}.ace-solarized-dark .ace_marker-layer .ace_active-line,.ace-solarized-dark .ace_marker-layer .ace_selection {background: rgba(255, 255, 255, 0.1)}.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #002B36;border-radius: 2px}.ace-solarized-dark .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-solarized-dark .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(147, 161, 161, 0.50)}.ace-solarized-dark .ace_gutter-active-line {background-color: #0d3440}.ace-solarized-dark .ace_marker-layer .ace_selected-word {border: 1px solid #073642}.ace-solarized-dark .ace_invisible {color: rgba(147, 161, 161, 0.50)}.ace-solarized-dark .ace_keyword,.ace-solarized-dark .ace_meta,.ace-solarized-dark .ace_support.ace_class,.ace-solarized-dark .ace_support.ace_type {color: #859900}.ace-solarized-dark .ace_constant.ace_character,.ace-solarized-dark .ace_constant.ace_other {color: #CB4B16}.ace-solarized-dark .ace_constant.ace_language {color: #B58900}.ace-solarized-dark .ace_constant.ace_numeric {color: #D33682}.ace-solarized-dark .ace_fold {background-color: #268BD2;border-color: #93A1A1}.ace-solarized-dark .ace_entity.ace_name.ace_function,.ace-solarized-dark .ace_entity.ace_name.ace_tag,.ace-solarized-dark .ace_support.ace_function,.ace-solarized-dark .ace_variable,.ace-solarized-dark .ace_variable.ace_language {color: #268BD2}.ace-solarized-dark .ace_string {color: #2AA198}.ace-solarized-dark .ace_comment {font-style: italic;color: #657B83}.ace-solarized-dark .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/solarized_light",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-solarized-light";a.cssText=".ace-solarized-light .ace_gutter {background: #fbf1d3;color: #333}.ace-solarized-light .ace_print-margin {width: 1px;background: #e8e8e8}.ace-solarized-light {background-color: #FDF6E3;color: #586E75}.ace-solarized-light .ace_cursor {color: #000000}.ace-solarized-light .ace_marker-layer .ace_selection {background: rgba(7, 54, 67, 0.09)}.ace-solarized-light.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FDF6E3;border-radius: 2px}.ace-solarized-light .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-solarized-light .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(147, 161, 161, 0.50)}.ace-solarized-light .ace_marker-layer .ace_active-line {background: #EEE8D5}.ace-solarized-light .ace_gutter-active-line {background-color : #EDE5C1}.ace-solarized-light .ace_marker-layer .ace_selected-word {border: 1px solid #073642}.ace-solarized-light .ace_invisible {color: rgba(147, 161, 161, 0.50)}.ace-solarized-light .ace_keyword,.ace-solarized-light .ace_meta,.ace-solarized-light .ace_support.ace_class,.ace-solarized-light .ace_support.ace_type {color: #859900}.ace-solarized-light .ace_constant.ace_character,.ace-solarized-light .ace_constant.ace_other {color: #CB4B16}.ace-solarized-light .ace_constant.ace_language {color: #B58900}.ace-solarized-light .ace_constant.ace_numeric {color: #D33682}.ace-solarized-light .ace_fold {background-color: #268BD2;border-color: #586E75}.ace-solarized-light .ace_entity.ace_name.ace_function,.ace-solarized-light .ace_entity.ace_name.ace_tag,.ace-solarized-light .ace_support.ace_function,.ace-solarized-light .ace_variable,.ace-solarized-light .ace_variable.ace_language {color: #268BD2}.ace-solarized-light .ace_storage {color: #073642}.ace-solarized-light .ace_string {color: #2AA198}.ace-solarized-light .ace_string.ace_regexp {color: #D30102}.ace-solarized-light .ace_comment,.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {color: #93A1A1}.ace-solarized-light .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/terminal",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-terminal-theme";a.cssText=".ace-terminal-theme .ace_gutter {background: #1a0005;color: steelblue}.ace-terminal-theme .ace_print-margin {width: 1px;background: #1a1a1a}.ace-terminal-theme {background-color: black;color: #DEDEDE}.ace-terminal-theme .ace_cursor {color: #9F9F9F}.ace-terminal-theme .ace_marker-layer .ace_selection {background: #424242}.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px black;border-radius: 2px}.ace-terminal-theme .ace_marker-layer .ace_step {background: rgb(0, 0, 0)}.ace-terminal-theme .ace_marker-layer .ace_bracket {background: #090;}.ace-terminal-theme .ace_marker-layer .ace_bracket-start {background: #090;}.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {margin: -1px 0 0 -1px;border: 1px solid #900}.ace-terminal-theme .ace_marker-layer .ace_active-line {background: #2A2A2A}.ace-terminal-theme .ace_gutter-active-line {background-color: #2A112A}.ace-terminal-theme .ace_marker-layer .ace_selected-word {border: 1px solid #424242}.ace-terminal-theme .ace_invisible {color: #343434}.ace-terminal-theme .ace_keyword,.ace-terminal-theme .ace_meta,.ace-terminal-theme .ace_storage,.ace-terminal-theme .ace_storage.ace_type,.ace-terminal-theme .ace_support.ace_type {color: tomato}.ace-terminal-theme .ace_keyword.ace_operator {color: deeppink}.ace-terminal-theme .ace_constant.ace_character,.ace-terminal-theme .ace_constant.ace_language,.ace-terminal-theme .ace_constant.ace_numeric,.ace-terminal-theme .ace_keyword.ace_other.ace_unit,.ace-terminal-theme .ace_support.ace_constant,.ace-terminal-theme .ace_variable.ace_parameter {color: #E78C45}.ace-terminal-theme .ace_constant.ace_other {color: gold}.ace-terminal-theme .ace_invalid {color: yellow;background-color: red}.ace-terminal-theme .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-terminal-theme .ace_fold {background-color: #7AA6DA;border-color: #DEDEDE}.ace-terminal-theme .ace_entity.ace_name.ace_function,.ace-terminal-theme .ace_support.ace_function,.ace-terminal-theme .ace_variable {color: #7AA6DA}.ace-terminal-theme .ace_support.ace_class,.ace-terminal-theme .ace_support.ace_type {color: #E7C547}.ace-terminal-theme .ace_heading,.ace-terminal-theme .ace_string {color: #B9CA4A}.ace-terminal-theme .ace_entity.ace_name.ace_tag,.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,.ace-terminal-theme .ace_meta.ace_tag,.ace-terminal-theme .ace_string.ace_regexp,.ace-terminal-theme .ace_variable {color: #D54E53}.ace-terminal-theme .ace_comment {color: orangered}.ace-terminal-theme .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-tm";a.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;border-radius: 2px;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-tomorrow";a.cssText=".ace-tomorrow .ace_gutter {background: #f6f6f6;color: #4D4D4C}.ace-tomorrow .ace_print-margin {width: 1px;background: #f6f6f6}.ace-tomorrow {background-color: #FFFFFF;color: #4D4D4C}.ace-tomorrow .ace_cursor {color: #AEAFAD}.ace-tomorrow .ace_marker-layer .ace_selection {background: #D6D6D6}.ace-tomorrow.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;border-radius: 2px}.ace-tomorrow .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-tomorrow .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #D1D1D1}.ace-tomorrow .ace_marker-layer .ace_active-line {background: #EFEFEF}.ace-tomorrow .ace_gutter-active-line {background-color : #dcdcdc}.ace-tomorrow .ace_marker-layer .ace_selected-word {border: 1px solid #D6D6D6}.ace-tomorrow .ace_invisible {color: #D1D1D1}.ace-tomorrow .ace_keyword,.ace-tomorrow .ace_meta,.ace-tomorrow .ace_storage,.ace-tomorrow .ace_storage.ace_type,.ace-tomorrow .ace_support.ace_type {color: #8959A8}.ace-tomorrow .ace_keyword.ace_operator {color: #3E999F}.ace-tomorrow .ace_constant.ace_character,.ace-tomorrow .ace_constant.ace_language,.ace-tomorrow .ace_constant.ace_numeric,.ace-tomorrow .ace_keyword.ace_other.ace_unit,.ace-tomorrow .ace_support.ace_constant,.ace-tomorrow .ace_variable.ace_parameter {color: #F5871F}.ace-tomorrow .ace_constant.ace_other {color: #666969}.ace-tomorrow .ace_invalid {color: #FFFFFF;background-color: #C82829}.ace-tomorrow .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #8959A8}.ace-tomorrow .ace_fold {background-color: #4271AE;border-color: #4D4D4C}.ace-tomorrow .ace_entity.ace_name.ace_function,.ace-tomorrow .ace_support.ace_function,.ace-tomorrow .ace_variable {color: #4271AE}.ace-tomorrow .ace_support.ace_class,.ace-tomorrow .ace_support.ace_type {color: #C99E00}.ace-tomorrow .ace_heading,.ace-tomorrow .ace_markup.ace_heading,.ace-tomorrow .ace_string {color: #718C00}.ace-tomorrow .ace_entity.ace_name.ace_tag,.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow .ace_meta.ace_tag,.ace-tomorrow .ace_string.ace_regexp,.ace-tomorrow .ace_variable {color: #C82829}.ace-tomorrow .ace_comment {color: #8E908C}.ace-tomorrow .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow_night",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-tomorrow-night";a.cssText=".ace-tomorrow-night .ace_gutter {background: #25282c;color: #C5C8C6}.ace-tomorrow-night .ace_print-margin {width: 1px;background: #25282c}.ace-tomorrow-night {background-color: #1D1F21;color: #C5C8C6}.ace-tomorrow-night .ace_cursor {color: #AEAFAD}.ace-tomorrow-night .ace_marker-layer .ace_selection {background: #373B41}.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #1D1F21;border-radius: 2px}.ace-tomorrow-night .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #4B4E55}.ace-tomorrow-night .ace_marker-layer .ace_active-line {background: #282A2E}.ace-tomorrow-night .ace_gutter-active-line {background-color: #282A2E}.ace-tomorrow-night .ace_marker-layer .ace_selected-word {border: 1px solid #373B41}.ace-tomorrow-night .ace_invisible {color: #4B4E55}.ace-tomorrow-night .ace_keyword,.ace-tomorrow-night .ace_meta,.ace-tomorrow-night .ace_storage,.ace-tomorrow-night .ace_storage.ace_type,.ace-tomorrow-night .ace_support.ace_type {color: #B294BB}.ace-tomorrow-night .ace_keyword.ace_operator {color: #8ABEB7}.ace-tomorrow-night .ace_constant.ace_character,.ace-tomorrow-night .ace_constant.ace_language,.ace-tomorrow-night .ace_constant.ace_numeric,.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night .ace_support.ace_constant,.ace-tomorrow-night .ace_variable.ace_parameter {color: #DE935F}.ace-tomorrow-night .ace_constant.ace_other {color: #CED1CF}.ace-tomorrow-night .ace_invalid {color: #CED2CF;background-color: #DF5F5F}.ace-tomorrow-night .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-tomorrow-night .ace_fold {background-color: #81A2BE;border-color: #C5C8C6}.ace-tomorrow-night .ace_entity.ace_name.ace_function,.ace-tomorrow-night .ace_support.ace_function,.ace-tomorrow-night .ace_variable {color: #81A2BE}.ace-tomorrow-night .ace_support.ace_class,.ace-tomorrow-night .ace_support.ace_type {color: #F0C674}.ace-tomorrow-night .ace_heading,.ace-tomorrow-night .ace_markup.ace_heading,.ace-tomorrow-night .ace_string {color: #B5BD68}.ace-tomorrow-night .ace_entity.ace_name.ace_tag,.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night .ace_meta.ace_tag,.ace-tomorrow-night .ace_string.ace_regexp,.ace-tomorrow-night .ace_variable {color: #CC6666}.ace-tomorrow-night .ace_comment {color: #969896}.ace-tomorrow-night .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow_night_blue",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-tomorrow-night-blue";a.cssText=".ace-tomorrow-night-blue .ace_gutter {background: #00204b;color: #7388b5}.ace-tomorrow-night-blue .ace_print-margin {width: 1px;background: #00204b}.ace-tomorrow-night-blue {background-color: #002451;color: #FFFFFF}.ace-tomorrow-night-blue .ace_constant.ace_other,.ace-tomorrow-night-blue .ace_cursor {color: #FFFFFF}.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {background: #003F8E}.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #002451;border-radius: 2px}.ace-tomorrow-night-blue .ace_marker-layer .ace_step {background: rgb(127, 111, 19)}.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404F7D}.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {background: #00346E}.ace-tomorrow-night-blue .ace_gutter-active-line {background-color: #022040}.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {border: 1px solid #003F8E}.ace-tomorrow-night-blue .ace_invisible {color: #404F7D}.ace-tomorrow-night-blue .ace_keyword,.ace-tomorrow-night-blue .ace_meta,.ace-tomorrow-night-blue .ace_storage,.ace-tomorrow-night-blue .ace_storage.ace_type,.ace-tomorrow-night-blue .ace_support.ace_type {color: #EBBBFF}.ace-tomorrow-night-blue .ace_keyword.ace_operator {color: #99FFFF}.ace-tomorrow-night-blue .ace_constant.ace_character,.ace-tomorrow-night-blue .ace_constant.ace_language,.ace-tomorrow-night-blue .ace_constant.ace_numeric,.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night-blue .ace_support.ace_constant,.ace-tomorrow-night-blue .ace_variable.ace_parameter {color: #FFC58F}.ace-tomorrow-night-blue .ace_invalid {color: #FFFFFF;background-color: #F99DA5}.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {color: #FFFFFF;background-color: #EBBBFF}.ace-tomorrow-night-blue .ace_fold {background-color: #BBDAFF;border-color: #FFFFFF}.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,.ace-tomorrow-night-blue .ace_support.ace_function,.ace-tomorrow-night-blue .ace_variable {color: #BBDAFF}.ace-tomorrow-night-blue .ace_support.ace_class,.ace-tomorrow-night-blue .ace_support.ace_type {color: #FFEEAD}.ace-tomorrow-night-blue .ace_heading,.ace-tomorrow-night-blue .ace_markup.ace_heading,.ace-tomorrow-night-blue .ace_string {color: #D1F1A9}.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night-blue .ace_meta.ace_tag,.ace-tomorrow-night-blue .ace_string.ace_regexp,.ace-tomorrow-night-blue .ace_variable {color: #FF9DA4}.ace-tomorrow-night-blue .ace_comment {color: #7285B7}.ace-tomorrow-night-blue .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow_night_bright",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-tomorrow-night-bright";a.cssText=".ace-tomorrow-night-bright .ace_gutter {background: #1a1a1a;color: #DEDEDE}.ace-tomorrow-night-bright .ace_print-margin {width: 1px;background: #1a1a1a}.ace-tomorrow-night-bright {background-color: #000000;color: #DEDEDE}.ace-tomorrow-night-bright .ace_cursor {color: #9F9F9F}.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {background: #424242}.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #000000;border-radius: 2px}.ace-tomorrow-night-bright .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #888888}.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {border: 1px solid rgb(110, 119, 0);border-bottom: 0;box-shadow: inset 0 -1px rgb(110, 119, 0);margin: -1px 0 0 -1px;background: rgba(255, 235, 0, 0.1);}.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {background: #2A2A2A}.ace-tomorrow-night-bright .ace_gutter-active-line {background-color: #2A2A2A}.ace-tomorrow-night-bright .ace_stack {background-color: rgb(66, 90, 44)}.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {border: 1px solid #888888}.ace-tomorrow-night-bright .ace_invisible {color: #343434}.ace-tomorrow-night-bright .ace_keyword,.ace-tomorrow-night-bright .ace_meta,.ace-tomorrow-night-bright .ace_storage,.ace-tomorrow-night-bright .ace_storage.ace_type,.ace-tomorrow-night-bright .ace_support.ace_type {color: #C397D8}.ace-tomorrow-night-bright .ace_keyword.ace_operator {color: #70C0B1}.ace-tomorrow-night-bright .ace_constant.ace_character,.ace-tomorrow-night-bright .ace_constant.ace_language,.ace-tomorrow-night-bright .ace_constant.ace_numeric,.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night-bright .ace_support.ace_constant,.ace-tomorrow-night-bright .ace_variable.ace_parameter {color: #E78C45}.ace-tomorrow-night-bright .ace_constant.ace_other {color: #EEEEEE}.ace-tomorrow-night-bright .ace_invalid {color: #CED2CF;background-color: #DF5F5F}.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-tomorrow-night-bright .ace_fold {background-color: #7AA6DA;border-color: #DEDEDE}.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,.ace-tomorrow-night-bright .ace_support.ace_function,.ace-tomorrow-night-bright .ace_variable {color: #7AA6DA}.ace-tomorrow-night-bright .ace_support.ace_class,.ace-tomorrow-night-bright .ace_support.ace_type {color: #E7C547}.ace-tomorrow-night-bright .ace_heading,.ace-tomorrow-night-bright .ace_markup.ace_heading,.ace-tomorrow-night-bright .ace_string {color: #B9CA4A}.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night-bright .ace_meta.ace_tag,.ace-tomorrow-night-bright .ace_string.ace_regexp,.ace-tomorrow-night-bright .ace_variable {color: #D54E53}.ace-tomorrow-night-bright .ace_comment {color: #969896}.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {color: #C2C280;}.ace-tomorrow-night-bright .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/tomorrow_night_eighties",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-tomorrow-night-eighties";a.cssText=".ace-tomorrow-night-eighties .ace_gutter {background: #272727;color: #CCC}.ace-tomorrow-night-eighties .ace_print-margin {width: 1px;background: #272727}.ace-tomorrow-night-eighties {background-color: #2D2D2D;color: #CCCCCC}.ace-tomorrow-night-eighties .ace_constant.ace_other,.ace-tomorrow-night-eighties .ace_cursor {color: #CCCCCC}.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {background: #515151}.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #2D2D2D;border-radius: 2px}.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #6A6A6A}.ace-tomorrow-night-bright .ace_stack {background: rgb(66, 90, 44)}.ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {background: #393939}.ace-tomorrow-night-eighties .ace_gutter-active-line {background-color: #393939}.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected-word {border: 1px solid #515151}.ace-tomorrow-night-eighties .ace_invisible {color: #6A6A6A}.ace-tomorrow-night-eighties .ace_keyword,.ace-tomorrow-night-eighties .ace_meta,.ace-tomorrow-night-eighties .ace_storage,.ace-tomorrow-night-eighties .ace_storage.ace_type,.ace-tomorrow-night-eighties .ace_support.ace_type {color: #CC99CC}.ace-tomorrow-night-eighties .ace_keyword.ace_operator {color: #66CCCC}.ace-tomorrow-night-eighties .ace_constant.ace_character,.ace-tomorrow-night-eighties .ace_constant.ace_language,.ace-tomorrow-night-eighties .ace_constant.ace_numeric,.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night-eighties .ace_support.ace_constant,.ace-tomorrow-night-eighties .ace_variable.ace_parameter {color: #F99157}.ace-tomorrow-night-eighties .ace_invalid {color: #CDCDCD;background-color: #F2777A}.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {color: #CDCDCD;background-color: #CC99CC}.ace-tomorrow-night-eighties .ace_fold {background-color: #6699CC;border-color: #CCCCCC}.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,.ace-tomorrow-night-eighties .ace_support.ace_function,.ace-tomorrow-night-eighties .ace_variable {color: #6699CC}.ace-tomorrow-night-eighties .ace_support.ace_class,.ace-tomorrow-night-eighties .ace_support.ace_type {color: #FFCC66}.ace-tomorrow-night-eighties .ace_heading,.ace-tomorrow-night-eighties .ace_markup.ace_heading,.ace-tomorrow-night-eighties .ace_string {color: #99CC99}.ace-tomorrow-night-eighties .ace_comment {color: #999999}.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night-eighties .ace_meta.ace_tag,.ace-tomorrow-night-eighties .ace_variable {color: #F2777A}.ace-tomorrow-night-eighties .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/twilight",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-twilight";a.cssText=".ace-twilight .ace_gutter {background: #232323;color: #E2E2E2}.ace-twilight .ace_print-margin {width: 1px;background: #232323}.ace-twilight {background-color: #141414;color: #F8F8F8}.ace-twilight .ace_cursor {color: #A7A7A7}.ace-twilight .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20)}.ace-twilight.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #141414;border-radius: 2px}.ace-twilight .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-twilight .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25)}.ace-twilight .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031)}.ace-twilight .ace_gutter-active-line {background-color: rgba(255, 255, 255, 0.031)}.ace-twilight .ace_marker-layer .ace_selected-word {border: 1px solid rgba(221, 240, 255, 0.20)}.ace-twilight .ace_invisible {color: rgba(255, 255, 255, 0.25)}.ace-twilight .ace_keyword,.ace-twilight .ace_meta {color: #CDA869}.ace-twilight .ace_constant,.ace-twilight .ace_constant.ace_character,.ace-twilight .ace_constant.ace_character.ace_escape,.ace-twilight .ace_constant.ace_other,.ace-twilight .ace_heading,.ace-twilight .ace_markup.ace_heading,.ace-twilight .ace_support.ace_constant {color: #CF6A4C}.ace-twilight .ace_invalid.ace_illegal {color: #F8F8F8;background-color: rgba(86, 45, 86, 0.75)}.ace-twilight .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1}.ace-twilight .ace_support {color: #9B859D}.ace-twilight .ace_fold {background-color: #AC885B;border-color: #F8F8F8}.ace-twilight .ace_support.ace_function {color: #DAD085}.ace-twilight .ace_list,.ace-twilight .ace_markup.ace_list,.ace-twilight .ace_storage {color: #F9EE98}.ace-twilight .ace_entity.ace_name.ace_function,.ace-twilight .ace_meta.ace_tag,.ace-twilight .ace_variable {color: #AC885B}.ace-twilight .ace_string {color: #8F9D6A}.ace-twilight .ace_string.ace_regexp {color: #E9C062}.ace-twilight .ace_comment {font-style: italic;color: #5F5A60}.ace-twilight .ace_variable {color: #7587A6}.ace-twilight .ace_xml-pe {color: #494949}.ace-twilight .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/vibrant_ink",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=true;a.cssClass="ace-vibrant-ink";a.cssText=".ace-vibrant-ink .ace_gutter {background: #1a1a1a;color: #BEBEBE}.ace-vibrant-ink .ace_print-margin {width: 1px;background: #1a1a1a}.ace-vibrant-ink {background-color: #0F0F0F;color: #FFFFFF}.ace-vibrant-ink .ace_cursor {color: #FFFFFF}.ace-vibrant-ink .ace_marker-layer .ace_selection {background: #6699CC}.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #0F0F0F;border-radius: 2px}.ace-vibrant-ink .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-vibrant-ink .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #404040}.ace-vibrant-ink .ace_marker-layer .ace_active-line {background: #333333}.ace-vibrant-ink .ace_gutter-active-line {background-color: #333333}.ace-vibrant-ink .ace_marker-layer .ace_selected-word {border: 1px solid #6699CC}.ace-vibrant-ink .ace_invisible {color: #404040}.ace-vibrant-ink .ace_keyword,.ace-vibrant-ink .ace_meta {color: #FF6600}.ace-vibrant-ink .ace_constant,.ace-vibrant-ink .ace_constant.ace_character,.ace-vibrant-ink .ace_constant.ace_character.ace_escape,.ace-vibrant-ink .ace_constant.ace_other {color: #339999}.ace-vibrant-ink .ace_constant.ace_numeric {color: #99CC99}.ace-vibrant-ink .ace_invalid,.ace-vibrant-ink .ace_invalid.ace_deprecated {color: #CCFF33;background-color: #000000}.ace-vibrant-ink .ace_fold {background-color: #FFCC00;border-color: #FFFFFF}.ace-vibrant-ink .ace_entity.ace_name.ace_function,.ace-vibrant-ink .ace_support.ace_function,.ace-vibrant-ink .ace_variable {color: #FFCC00}.ace-vibrant-ink .ace_variable.ace_parameter {font-style: italic}.ace-vibrant-ink .ace_string {color: #66FF00}.ace-vibrant-ink .ace_string.ace_regexp {color: #44B4CC}.ace-vibrant-ink .ace_comment {color: #9933CC}.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {font-style: italic;color: #99CC99}.ace-vibrant-ink .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)});define("ace/theme/xcode",["require","exports","module","ace/lib/dom"],function(b,a,c){a.isDark=false;a.cssClass="ace-xcode";a.cssText="/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: EE3AD170-2B7F-4DE1-B724-C75F13FE0085) */.ace-xcode .ace_gutter {background: #e8e8e8;color: #333}.ace-xcode .ace_print-margin {width: 1px;background: #e8e8e8}.ace-xcode {background-color: #FFFFFF;color: #000000}.ace-xcode .ace_cursor {color: #000000}.ace-xcode .ace_marker-layer .ace_selection {background: #B5D5FF}.ace-xcode.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;border-radius: 2px}.ace-xcode .ace_marker-layer .ace_step {background: rgb(198, 219, 174)}.ace-xcode .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-xcode .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.071)}.ace-xcode .ace_gutter-active-line {background-color: rgba(0, 0, 0, 0.071)}.ace-xcode .ace_marker-layer .ace_selected-word {border: 1px solid #B5D5FF}.ace-xcode .ace_constant.ace_language,.ace-xcode .ace_keyword,.ace-xcode .ace_meta,.ace-xcode .ace_variable.ace_language {color: #C800A4}.ace-xcode .ace_invisible {color: #BFBFBF}.ace-xcode .ace_constant.ace_character,.ace-xcode .ace_constant.ace_other {color: #275A5E}.ace-xcode .ace_constant.ace_numeric {color: #3A00DC}.ace-xcode .ace_entity.ace_other.ace_attribute-name,.ace-xcode .ace_support.ace_constant,.ace-xcode .ace_support.ace_function {color: #450084}.ace-xcode .ace_fold {background-color: #C800A4;border-color: #000000}.ace-xcode .ace_entity.ace_name.ace_tag,.ace-xcode .ace_support.ace_class,.ace-xcode .ace_support.ace_type {color: #790EAD}.ace-xcode .ace_storage {color: #C900A4}.ace-xcode .ace_string {color: #DF0002}.ace-xcode .ace_comment {color: #008E00}.ace-xcode .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y}";var d=b("../lib/dom");d.importCssString(a.cssText,a.cssClass)}); \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ace.js b/app/Resources/ui/js/ace/ace.js new file mode 100644 index 00000000..b71c2820 --- /dev/null +++ b/app/Resources/ui/js/ace/ace.js @@ -0,0 +1,21575 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +/** + * Define a module along with a payload + * @param module a name for the payload + * @param payload a function to call with (require, exports, module) params + */ + +(function() { + +var ACE_NAMESPACE = ""; + +var global = (function() { return this; })(); +if (!global && typeof window != "undefined") global = window; // strict mode + + +if (!ACE_NAMESPACE && typeof requirejs !== "undefined") + return; + + +var define = function(module, deps, payload) { + if (typeof module !== "string") { + if (define.original) + define.original.apply(this, arguments); + else { + console.error("dropping module because define wasn\'t a string."); + console.trace(); + } + return; + } + if (arguments.length == 2) + payload = deps; + if (!define.modules[module]) { + define.payloads[module] = payload; + define.modules[module] = null; + } +}; + +define.modules = {}; +define.payloads = {}; + +/** + * Get at functionality define()ed using the function above + */ +var _require = function(parentId, module, callback) { + if (typeof module === "string") { + var payload = lookup(parentId, module); + if (payload != undefined) { + callback && callback(); + return payload; + } + } else if (Object.prototype.toString.call(module) === "[object Array]") { + var params = []; + for (var i = 0, l = module.length; i < l; ++i) { + var dep = lookup(parentId, module[i]); + if (dep == undefined && require.original) + return; + params.push(dep); + } + return callback && callback.apply(null, params) || true; + } +}; + +var require = function(module, callback) { + var packagedModule = _require("", module, callback); + if (packagedModule == undefined && require.original) + return require.original.apply(this, arguments); + return packagedModule; +}; + +var normalizeModule = function(parentId, moduleName) { + // normalize plugin requires + if (moduleName.indexOf("!") !== -1) { + var chunks = moduleName.split("!"); + return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]); + } + // normalize relative requires + if (moduleName.charAt(0) == ".") { + var base = parentId.split("/").slice(0, -1).join("/"); + moduleName = base + "/" + moduleName; + + while(moduleName.indexOf(".") !== -1 && previous != moduleName) { + var previous = moduleName; + moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); + } + } + return moduleName; +}; + +/** + * Internal function to lookup moduleNames and resolve them by calling the + * definition function if needed. + */ +var lookup = function(parentId, moduleName) { + moduleName = normalizeModule(parentId, moduleName); + + var module = define.modules[moduleName]; + if (!module) { + module = define.payloads[moduleName]; + if (typeof module === 'function') { + var exports = {}; + var mod = { + id: moduleName, + uri: '', + exports: exports, + packaged: true + }; + + var req = function(module, callback) { + return _require(moduleName, module, callback); + }; + + var returnValue = module(req, exports, mod); + exports = returnValue || mod.exports; + define.modules[moduleName] = exports; + delete define.payloads[moduleName]; + } + module = define.modules[moduleName] = exports || module; + } + return module; +}; + +function exportAce(ns) { + var root = global; + if (ns) { + if (!global[ns]) + global[ns] = {}; + root = global[ns]; + } + + if (!root.define || !root.define.packaged) { + define.original = root.define; + root.define = define; + root.define.packaged = true; + } + + if (!root.require || !root.require.packaged) { + require.original = root.require; + root.require = require; + root.require.packaged = true; + } +} + +exportAce(ACE_NAMESPACE); + +})(); + +define("ace/lib/es6-shim",["require","exports","module"], function (require, exports, module) { + function defineProp(obj, name, val) { + Object.defineProperty(obj, name, { + value: val, + enumerable: false, + writable: true, + configurable: true + }); + } + if (!String.prototype.startsWith) { + defineProp( + String.prototype, + "startsWith", + function (searchString, position) { + position = position || 0; + return this.lastIndexOf(searchString, position) === position; + } + ); + } + if (!String.prototype.endsWith) { + defineProp(String.prototype, "endsWith", function (searchString, position) { + var subjectString = this; + if (position === undefined || position > subjectString.length) { + position = subjectString.length; + } + position -= searchString.length; + var lastIndex = subjectString.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; + }); + } + if (!String.prototype.repeat) { + defineProp(String.prototype, "repeat", function (count) { + var result = ""; + var string = this; + while (count > 0) { + if (count & 1) result += string; + + if ((count >>= 1)) string += string; + } + return result; + }); + } + if (!String.prototype.includes) { + defineProp(String.prototype, "includes", function (str, position) { + return this.indexOf(str, position) != -1; + }); + } + if (!Object.assign) { + Object.assign = function (target) { + if (target === undefined || target === null) { + throw new TypeError("Cannot convert undefined or null to object"); + } + + var output = Object(target); + for (var index = 1; index < arguments.length; index++) { + var source = arguments[index]; + if (source !== undefined && source !== null) { + Object.keys(source).forEach(function (key) { + output[key] = source[key]; + }); + } + } + return output; + }; + } + if (!Object.values) { + Object.values = function (o) { + return Object.keys(o).map(function (k) { + return o[k]; + }); + }; + } + if (!Array.prototype.find) { + defineProp(Array.prototype, "find", function (predicate) { + var len = this.length; + var thisArg = arguments[1]; + for (var k = 0; k < len; k++) { + var kValue = this[k]; + if (predicate.call(thisArg, kValue, k, this)) { + return kValue; + } + } + }); + } + if (!Array.prototype.findIndex) { + defineProp(Array.prototype, "findIndex", function (predicate) { + var len = this.length; + var thisArg = arguments[1]; + for (var k = 0; k < len; k++) { + var kValue = this[k]; + if (predicate.call(thisArg, kValue, k, this)) { + return k; + } + } + }); + } + if (!Array.prototype.includes) { + defineProp(Array.prototype, "includes", function (item, position) { + return this.indexOf(item, position) != -1; + }); + } + if (!Array.prototype.fill) { + defineProp(Array.prototype, "fill", function (value) { + var O = this; + var len = O.length >>> 0; + var start = arguments[1]; + var relativeStart = start >> 0; + var k = + relativeStart < 0 + ? Math.max(len + relativeStart, 0) + : Math.min(relativeStart, len); + var end = arguments[2]; + var relativeEnd = end === undefined ? len : end >> 0; + var final = + relativeEnd < 0 + ? Math.max(len + relativeEnd, 0) + : Math.min(relativeEnd, len); + while (k < final) { + O[k] = value; + k++; + } + return O; + }); + } + if (!Array.of) { + defineProp(Array, "of", function () { + return Array.prototype.slice.call(arguments); + }); + } +}); + +define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/es6-shim"], function(require, exports, module) { +"use strict"; + +require("./es6-shim"); + +}); + +define("ace/lib/useragent",["require","exports","module"], function(require, exports, module) { +"use strict"; +exports.OS = { + LINUX: "LINUX", + MAC: "MAC", + WINDOWS: "WINDOWS" +}; +exports.getOS = function() { + if (exports.isMac) { + return exports.OS.MAC; + } else if (exports.isLinux) { + return exports.OS.LINUX; + } else { + return exports.OS.WINDOWS; + } +}; +var _navigator = typeof navigator == "object" ? navigator : {}; + +var os = (/mac|win|linux/i.exec(_navigator.platform) || ["other"])[0].toLowerCase(); +var ua = _navigator.userAgent || ""; +var appName = _navigator.appName || ""; +exports.isWin = (os == "win"); +exports.isMac = (os == "mac"); +exports.isLinux = (os == "linux"); +exports.isIE = + (appName == "Microsoft Internet Explorer" || appName.indexOf("MSAppHost") >= 0) + ? parseFloat((ua.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]) + : parseFloat((ua.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]); // for ie + +exports.isOldIE = exports.isIE && exports.isIE < 9; +exports.isGecko = exports.isMozilla = ua.match(/ Gecko\/\d+/); +exports.isOpera = typeof opera == "object" && Object.prototype.toString.call(window.opera) == "[object Opera]"; +exports.isWebKit = parseFloat(ua.split("WebKit/")[1]) || undefined; + +exports.isChrome = parseFloat(ua.split(" Chrome/")[1]) || undefined; + +exports.isEdge = parseFloat(ua.split(" Edge/")[1]) || undefined; + +exports.isAIR = ua.indexOf("AdobeAIR") >= 0; + +exports.isAndroid = ua.indexOf("Android") >= 0; + +exports.isChromeOS = ua.indexOf(" CrOS ") >= 0; + +exports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream; + +if (exports.isIOS) exports.isMac = true; + +exports.isMobile = exports.isIOS || exports.isAndroid; + +}); + +define("ace/lib/dom",["require","exports","module","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var useragent = require("./useragent"); +var XHTML_NS = "http://www.w3.org/1999/xhtml"; + +exports.buildDom = function buildDom(arr, parent, refs) { + if (typeof arr == "string" && arr) { + var txt = document.createTextNode(arr); + if (parent) + parent.appendChild(txt); + return txt; + } + + if (!Array.isArray(arr)) { + if (arr && arr.appendChild && parent) + parent.appendChild(arr); + return arr; + } + if (typeof arr[0] != "string" || !arr[0]) { + var els = []; + for (var i = 0; i < arr.length; i++) { + var ch = buildDom(arr[i], parent, refs); + ch && els.push(ch); + } + return els; + } + + var el = document.createElement(arr[0]); + var options = arr[1]; + var childIndex = 1; + if (options && typeof options == "object" && !Array.isArray(options)) + childIndex = 2; + for (var i = childIndex; i < arr.length; i++) + buildDom(arr[i], el, refs); + if (childIndex == 2) { + Object.keys(options).forEach(function(n) { + var val = options[n]; + if (n === "class") { + el.className = Array.isArray(val) ? val.join(" ") : val; + } else if (typeof val == "function" || n == "value" || n[0] == "$") { + el[n] = val; + } else if (n === "ref") { + if (refs) refs[val] = el; + } else if (n === "style") { + if (typeof val == "string") el.style.cssText = val; + } else if (val != null) { + el.setAttribute(n, val); + } + }); + } + if (parent) + parent.appendChild(el); + return el; +}; + +exports.getDocumentHead = function(doc) { + if (!doc) + doc = document; + return doc.head || doc.getElementsByTagName("head")[0] || doc.documentElement; +}; + +exports.createElement = function(tag, ns) { + return document.createElementNS ? + document.createElementNS(ns || XHTML_NS, tag) : + document.createElement(tag); +}; + +exports.removeChildren = function(element) { + element.innerHTML = ""; +}; + +exports.createTextNode = function(textContent, element) { + var doc = element ? element.ownerDocument : document; + return doc.createTextNode(textContent); +}; + +exports.createFragment = function(element) { + var doc = element ? element.ownerDocument : document; + return doc.createDocumentFragment(); +}; + +exports.hasCssClass = function(el, name) { + var classes = (el.className + "").split(/\s+/g); + return classes.indexOf(name) !== -1; +}; +exports.addCssClass = function(el, name) { + if (!exports.hasCssClass(el, name)) { + el.className += " " + name; + } +}; +exports.removeCssClass = function(el, name) { + var classes = el.className.split(/\s+/g); + while (true) { + var index = classes.indexOf(name); + if (index == -1) { + break; + } + classes.splice(index, 1); + } + el.className = classes.join(" "); +}; + +exports.toggleCssClass = function(el, name) { + var classes = el.className.split(/\s+/g), add = true; + while (true) { + var index = classes.indexOf(name); + if (index == -1) { + break; + } + add = false; + classes.splice(index, 1); + } + if (add) + classes.push(name); + + el.className = classes.join(" "); + return add; +}; +exports.setCssClass = function(node, className, include) { + if (include) { + exports.addCssClass(node, className); + } else { + exports.removeCssClass(node, className); + } +}; + +exports.hasCssString = function(id, doc) { + var index = 0, sheets; + doc = doc || document; + if ((sheets = doc.querySelectorAll("style"))) { + while (index < sheets.length) { + if (sheets[index++].id === id) { + return true; + } + } + } +}; + +exports.removeElementById = function(id, doc) { + doc = doc || document; + if(doc.getElementById(id)) { + doc.getElementById(id).remove(); + } +}; + +var strictCSP; +var cssCache = []; +exports.useStrictCSP = function(value) { + strictCSP = value; + if (value == false) insertPendingStyles(); + else if (!cssCache) cssCache = []; +}; + +function insertPendingStyles() { + var cache = cssCache; + cssCache = null; + cache && cache.forEach(function(item) { + importCssString(item[0], item[1]); + }); +} + +function importCssString(cssText, id, target) { + if (typeof document == "undefined") + return; + if (cssCache) { + if (target) { + insertPendingStyles(); + } else if (target === false) { + return cssCache.push([cssText, id]); + } + } + if (strictCSP) return; + + var container = target; + if (!target || !target.getRootNode) { + container = document; + } else { + container = target.getRootNode(); + if (!container || container == target) + container = document; + } + + var doc = container.ownerDocument || container; + if (id && exports.hasCssString(id, container)) + return null; + + if (id) + cssText += "\n/*# sourceURL=ace/css/" + id + " */"; + + var style = exports.createElement("style"); + style.appendChild(doc.createTextNode(cssText)); + if (id) + style.id = id; + + if (container == doc) + container = exports.getDocumentHead(doc); + container.insertBefore(style, container.firstChild); +} +exports.importCssString = importCssString; + +exports.importCssStylsheet = function(uri, doc) { + exports.buildDom(["link", {rel: "stylesheet", href: uri}], exports.getDocumentHead(doc)); +}; +exports.scrollbarWidth = function(document) { + var inner = exports.createElement("ace_inner"); + inner.style.width = "100%"; + inner.style.minWidth = "0px"; + inner.style.height = "200px"; + inner.style.display = "block"; + + var outer = exports.createElement("ace_outer"); + var style = outer.style; + + style.position = "absolute"; + style.left = "-10000px"; + style.overflow = "hidden"; + style.width = "200px"; + style.minWidth = "0px"; + style.height = "150px"; + style.display = "block"; + + outer.appendChild(inner); + + var body = document.documentElement; + body.appendChild(outer); + + var noScrollbar = inner.offsetWidth; + + style.overflow = "scroll"; + var withScrollbar = inner.offsetWidth; + + if (noScrollbar == withScrollbar) { + withScrollbar = outer.clientWidth; + } + + body.removeChild(outer); + + return noScrollbar-withScrollbar; +}; + +exports.computedStyle = function(element, style) { + return window.getComputedStyle(element, "") || {}; +}; + +exports.setStyle = function(styles, property, value) { + if (styles[property] !== value) { + styles[property] = value; + } +}; + +exports.HAS_CSS_ANIMATION = false; +exports.HAS_CSS_TRANSFORMS = false; +exports.HI_DPI = useragent.isWin + ? typeof window !== "undefined" && window.devicePixelRatio >= 1.5 + : true; + +if (useragent.isChromeOS) exports.HI_DPI = false; + +if (typeof document !== "undefined") { + var div = document.createElement("div"); + if (exports.HI_DPI && div.style.transform !== undefined) + exports.HAS_CSS_TRANSFORMS = true; + if (!useragent.isEdge && typeof div.style.animationName !== "undefined") + exports.HAS_CSS_ANIMATION = true; + div = null; +} + +if (exports.HAS_CSS_TRANSFORMS) { + exports.translate = function(element, tx, ty) { + element.style.transform = "translate(" + Math.round(tx) + "px, " + Math.round(ty) +"px)"; + }; +} else { + exports.translate = function(element, tx, ty) { + element.style.top = Math.round(ty) + "px"; + element.style.left = Math.round(tx) + "px"; + }; +} + +}); + +define("ace/lib/oop",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.inherits = function(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); +}; + +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } + return obj; +}; + +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); + +define("ace/lib/keys",["require","exports","module","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +var oop = require("./oop"); +var Keys = (function() { + var ret = { + MODIFIER_KEYS: { + 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta', + 91: 'MetaLeft', 92: 'MetaRight', 93: 'ContextMenu' + }, + + KEY_MODS: { + "ctrl": 1, "alt": 2, "option" : 2, "shift": 4, + "super": 8, "meta": 8, "command": 8, "cmd": 8, + "control": 1 + }, + + FUNCTION_KEYS : { + 8 : "Backspace", + 9 : "Tab", + 13 : "Return", + 19 : "Pause", + 27 : "Esc", + 32 : "Space", + 33 : "PageUp", + 34 : "PageDown", + 35 : "End", + 36 : "Home", + 37 : "Left", + 38 : "Up", + 39 : "Right", + 40 : "Down", + 44 : "Print", + 45 : "Insert", + 46 : "Delete", + 96 : "Numpad0", + 97 : "Numpad1", + 98 : "Numpad2", + 99 : "Numpad3", + 100: "Numpad4", + 101: "Numpad5", + 102: "Numpad6", + 103: "Numpad7", + 104: "Numpad8", + 105: "Numpad9", + '-13': "NumpadEnter", + 112: "F1", + 113: "F2", + 114: "F3", + 115: "F4", + 116: "F5", + 117: "F6", + 118: "F7", + 119: "F8", + 120: "F9", + 121: "F10", + 122: "F11", + 123: "F12", + 144: "Numlock", + 145: "Scrolllock" + }, + + PRINTABLE_KEYS: { + 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5', + 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a', + 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h', + 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o', + 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v', + 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.', + 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', + 219: '[', 220: '\\',221: ']', 222: "'", 111: '/', 106: '*' + } + }; + var name, i; + for (i in ret.FUNCTION_KEYS) { + name = ret.FUNCTION_KEYS[i].toLowerCase(); + ret[name] = parseInt(i, 10); + } + for (i in ret.PRINTABLE_KEYS) { + name = ret.PRINTABLE_KEYS[i].toLowerCase(); + ret[name] = parseInt(i, 10); + } + oop.mixin(ret, ret.MODIFIER_KEYS); + oop.mixin(ret, ret.PRINTABLE_KEYS); + oop.mixin(ret, ret.FUNCTION_KEYS); + ret.enter = ret["return"]; + ret.escape = ret.esc; + ret.del = ret["delete"]; + ret[173] = '-'; + + (function() { + var mods = ["cmd", "ctrl", "alt", "shift"]; + for (var i = Math.pow(2, mods.length); i--;) { + ret.KEY_MODS[i] = mods.filter(function(x) { + return i & ret.KEY_MODS[x]; + }).join("-") + "-"; + } + })(); + + ret.KEY_MODS[0] = ""; + ret.KEY_MODS[-1] = "input-"; + + return ret; +})(); +oop.mixin(exports, Keys); + +exports.keyCodeToString = function(keyCode) { + var keyString = Keys[keyCode]; + if (typeof keyString != "string") + keyString = String.fromCharCode(keyCode); + return keyString.toLowerCase(); +}; + +}); + +define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var keys = require("./keys"); +var useragent = require("./useragent"); + +var pressedKeys = null; +var ts = 0; + +var activeListenerOptions; +function detectListenerOptionsSupport() { + activeListenerOptions = false; + try { + document.createComment("").addEventListener("test", function() {}, { + get passive() { + activeListenerOptions = {passive: false}; + } + }); + } catch(e) {} +} + +function getListenerOptions() { + if (activeListenerOptions == undefined) + detectListenerOptionsSupport(); + return activeListenerOptions; +} + +function EventListener(elem, type, callback) { + this.elem = elem; + this.type = type; + this.callback = callback; +} +EventListener.prototype.destroy = function() { + removeListener(this.elem, this.type, this.callback); + this.elem = this.type = this.callback = undefined; +}; + +var addListener = exports.addListener = function(elem, type, callback, destroyer) { + elem.addEventListener(type, callback, getListenerOptions()); + if (destroyer) + destroyer.$toDestroy.push(new EventListener(elem, type, callback)); +}; + +var removeListener = exports.removeListener = function(elem, type, callback) { + elem.removeEventListener(type, callback, getListenerOptions()); +}; +exports.stopEvent = function(e) { + exports.stopPropagation(e); + exports.preventDefault(e); + return false; +}; + +exports.stopPropagation = function(e) { + if (e.stopPropagation) + e.stopPropagation(); +}; + +exports.preventDefault = function(e) { + if (e.preventDefault) + e.preventDefault(); +}; +exports.getButton = function(e) { + if (e.type == "dblclick") + return 0; + if (e.type == "contextmenu" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey))) + return 2; + return e.button; +}; + +exports.capture = function(el, eventHandler, releaseCaptureHandler) { + var ownerDocument = el && el.ownerDocument || document; + function onMouseUp(e) { + eventHandler && eventHandler(e); + releaseCaptureHandler && releaseCaptureHandler(e); + + removeListener(ownerDocument, "mousemove", eventHandler); + removeListener(ownerDocument, "mouseup", onMouseUp); + removeListener(ownerDocument, "dragstart", onMouseUp); + } + + addListener(ownerDocument, "mousemove", eventHandler); + addListener(ownerDocument, "mouseup", onMouseUp); + addListener(ownerDocument, "dragstart", onMouseUp); + + return onMouseUp; +}; + +exports.addMouseWheelListener = function(el, callback, destroyer) { + addListener(el, "wheel", function(e) { + var factor = 0.15; + var deltaX = e.deltaX || 0; + var deltaY = e.deltaY || 0; + switch (e.deltaMode) { + case e.DOM_DELTA_PIXEL: + e.wheelX = deltaX * factor; + e.wheelY = deltaY * factor; + break; + case e.DOM_DELTA_LINE: + var linePixels = 15; + e.wheelX = deltaX * linePixels; + e.wheelY = deltaY * linePixels; + break; + case e.DOM_DELTA_PAGE: + var pagePixels = 150; + e.wheelX = deltaX * pagePixels; + e.wheelY = deltaY * pagePixels; + break; + } + callback(e); + }, destroyer); +}; + +exports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName, destroyer) { + var clicks = 0; + var startX, startY, timer; + var eventNames = { + 2: "dblclick", + 3: "tripleclick", + 4: "quadclick" + }; + + function onMousedown(e) { + if (exports.getButton(e) !== 0) { + clicks = 0; + } else if (e.detail > 1) { + clicks++; + if (clicks > 4) + clicks = 1; + } else { + clicks = 1; + } + if (useragent.isIE) { + var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5; + if (!timer || isNewClick) + clicks = 1; + if (timer) + clearTimeout(timer); + timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600); + + if (clicks == 1) { + startX = e.clientX; + startY = e.clientY; + } + } + + e._clicks = clicks; + + eventHandler[callbackName]("mousedown", e); + + if (clicks > 4) + clicks = 0; + else if (clicks > 1) + return eventHandler[callbackName](eventNames[clicks], e); + } + if (!Array.isArray(elements)) + elements = [elements]; + elements.forEach(function(el) { + addListener(el, "mousedown", onMousedown, destroyer); + }); +}; + +var getModifierHash = function(e) { + return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0); +}; + +exports.getModifierString = function(e) { + return keys.KEY_MODS[getModifierHash(e)]; +}; + +function normalizeCommandKeys(callback, e, keyCode) { + var hashId = getModifierHash(e); + + if (!useragent.isMac && pressedKeys) { + if (e.getModifierState && (e.getModifierState("OS") || e.getModifierState("Win"))) + hashId |= 8; + if (pressedKeys.altGr) { + if ((3 & hashId) != 3) + pressedKeys.altGr = 0; + else + return; + } + if (keyCode === 18 || keyCode === 17) { + var location = "location" in e ? e.location : e.keyLocation; + if (keyCode === 17 && location === 1) { + if (pressedKeys[keyCode] == 1) + ts = e.timeStamp; + } else if (keyCode === 18 && hashId === 3 && location === 2) { + var dt = e.timeStamp - ts; + if (dt < 50) + pressedKeys.altGr = true; + } + } + } + + if (keyCode in keys.MODIFIER_KEYS) { + keyCode = -1; + } + + if (!hashId && keyCode === 13) { + var location = "location" in e ? e.location : e.keyLocation; + if (location === 3) { + callback(e, hashId, -keyCode); + if (e.defaultPrevented) + return; + } + } + + if (useragent.isChromeOS && hashId & 8) { + callback(e, hashId, keyCode); + if (e.defaultPrevented) + return; + else + hashId &= ~8; + } + if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) { + return false; + } + + return callback(e, hashId, keyCode); +} + + +exports.addCommandKeyListener = function(el, callback, destroyer) { + if (useragent.isOldGecko || (useragent.isOpera && !("KeyboardEvent" in window))) { + var lastKeyDownKeyCode = null; + addListener(el, "keydown", function(e) { + lastKeyDownKeyCode = e.keyCode; + }, destroyer); + addListener(el, "keypress", function(e) { + return normalizeCommandKeys(callback, e, lastKeyDownKeyCode); + }, destroyer); + } else { + var lastDefaultPrevented = null; + + addListener(el, "keydown", function(e) { + pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1; + var result = normalizeCommandKeys(callback, e, e.keyCode); + lastDefaultPrevented = e.defaultPrevented; + return result; + }, destroyer); + + addListener(el, "keypress", function(e) { + if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) { + exports.stopEvent(e); + lastDefaultPrevented = null; + } + }, destroyer); + + addListener(el, "keyup", function(e) { + pressedKeys[e.keyCode] = null; + }, destroyer); + + if (!pressedKeys) { + resetPressedKeys(); + addListener(window, "focus", resetPressedKeys); + } + } +}; +function resetPressedKeys() { + pressedKeys = Object.create(null); +} + +if (typeof window == "object" && window.postMessage && !useragent.isOldIE) { + var postMessageId = 1; + exports.nextTick = function(callback, win) { + win = win || window; + var messageName = "zero-timeout-message-" + (postMessageId++); + + var listener = function(e) { + if (e.data == messageName) { + exports.stopPropagation(e); + removeListener(win, "message", listener); + callback(); + } + }; + + addListener(win, "message", listener); + win.postMessage(messageName, "*"); + }; +} + +exports.$idleBlocked = false; +exports.onIdle = function(cb, timeout) { + return setTimeout(function handler() { + if (!exports.$idleBlocked) { + cb(); + } else { + setTimeout(handler, 100); + } + }, timeout); +}; + +exports.$idleBlockId = null; +exports.blockIdle = function(delay) { + if (exports.$idleBlockId) + clearTimeout(exports.$idleBlockId); + + exports.$idleBlocked = true; + exports.$idleBlockId = setTimeout(function() { + exports.$idleBlocked = false; + }, delay || 100); +}; + +exports.nextFrame = typeof window == "object" && (window.requestAnimationFrame + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame + || window.msRequestAnimationFrame + || window.oRequestAnimationFrame); + +if (exports.nextFrame) + exports.nextFrame = exports.nextFrame.bind(window); +else + exports.nextFrame = function(callback) { + setTimeout(callback, 17); + }; +}); + +define("ace/range",["require","exports","module"], function(require, exports, module) { +"use strict"; +var comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; +var Range = function(startRow, startColumn, endRow, endColumn) { + this.start = { + row: startRow, + column: startColumn + }; + + this.end = { + row: endRow, + column: endColumn + }; +}; + +(function() { + this.isEqual = function(range) { + return this.start.row === range.start.row && + this.end.row === range.end.row && + this.start.column === range.start.column && + this.end.column === range.end.column; + }; + this.toString = function() { + return ("Range: [" + this.start.row + "/" + this.start.column + + "] -> [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + }; + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + }; + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + }; + this.intersects = function(range) { + var cmp = this.compareRange(range); + return (cmp == -1 || cmp == 0 || cmp == 1); + }; + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + }; + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + }; + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + }; + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + }; + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + } + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + }; + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) + var end = {row: lastRow + 1, column: 0}; + else if (this.end.row < firstRow) + var end = {row: firstRow, column: 0}; + + if (this.start.row > lastRow) + var start = {row: lastRow + 1, column: 0}; + else if (this.start.row < firstRow) + var start = {row: firstRow, column: 0}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row === this.end.row && this.start.column === this.end.column); + }; + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0); + else + return new Range(this.start.row, 0, this.end.row, 0); + }; + this.toScreenRange = function(session) { + var screenPosStart = session.documentToScreenPosition(this.start); + var screenPosEnd = session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + this.moveBy = function(row, column) { + this.start.row += row; + this.start.column += column; + this.end.row += row; + this.end.column += column; + }; + +}).call(Range.prototype); +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; +Range.comparePoints = comparePoints; + +Range.comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; + + +exports.Range = Range; +}); + +define("ace/lib/lang",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.last = function(a) { + return a[a.length - 1]; +}; + +exports.stringReverse = function(string) { + return string.split("").reverse().join(""); +}; + +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + + if (count >>= 1) + string += string; + } + return result; +}; + +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; + +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; + +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; + +exports.copyObject = function(obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; + +exports.copyArray = function(array){ + var copy = []; + for (var i=0, l=array.length; i Date.now() - 50) + return true; + return $cancelT = false; + }, + cancel: function() { + $cancelT = Date.now(); + } +}; + +}); + +define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/clipboard","ace/lib/keys"], function(require, exports, module) { +"use strict"; + +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var clipboard = require("../clipboard"); +var BROKEN_SETDATA = useragent.isChrome < 18; +var USE_IE_MIME_TYPE = useragent.isIE; +var HAS_FOCUS_ARGS = useragent.isChrome > 63; +var MAX_LINE_LENGTH = 400; + +var KEYS = require("../lib/keys"); +var MODS = KEYS.KEY_MODS; +var isIOS = useragent.isIOS; +var valueResetRegex = isIOS ? /\s/ : /\n/; +var isMobile = useragent.isMobile; + +var TextInput = function(parentNode, host) { + var text = dom.createElement("textarea"); + text.className = "ace_text-input"; + + text.setAttribute("wrap", "off"); + text.setAttribute("autocorrect", "off"); + text.setAttribute("autocapitalize", "off"); + text.setAttribute("spellcheck", false); + + text.style.opacity = "0"; + parentNode.insertBefore(text, parentNode.firstChild); + + var copied = false; + var pasted = false; + var inComposition = false; + var sendingText = false; + var tempStyle = ''; + + if (!isMobile) + text.style.fontSize = "1px"; + + var commandMode = false; + var ignoreFocusEvents = false; + + var lastValue = ""; + var lastSelectionStart = 0; + var lastSelectionEnd = 0; + var lastRestoreEnd = 0; + try { var isFocused = document.activeElement === text; } catch(e) {} + + event.addListener(text, "blur", function(e) { + if (ignoreFocusEvents) return; + host.onBlur(e); + isFocused = false; + }, host); + event.addListener(text, "focus", function(e) { + if (ignoreFocusEvents) return; + isFocused = true; + if (useragent.isEdge) { + try { + if (!document.hasFocus()) + return; + } catch(e) {} + } + host.onFocus(e); + if (useragent.isEdge) + setTimeout(resetSelection); + else + resetSelection(); + }, host); + this.$focusScroll = false; + this.focus = function() { + if (tempStyle || HAS_FOCUS_ARGS || this.$focusScroll == "browser") + return text.focus({ preventScroll: true }); + + var top = text.style.top; + text.style.position = "fixed"; + text.style.top = "0px"; + try { + var isTransformed = text.getBoundingClientRect().top != 0; + } catch(e) { + return; + } + var ancestors = []; + if (isTransformed) { + var t = text.parentElement; + while (t && t.nodeType == 1) { + ancestors.push(t); + t.setAttribute("ace_nocontext", true); + if (!t.parentElement && t.getRootNode) + t = t.getRootNode().host; + else + t = t.parentElement; + } + } + text.focus({ preventScroll: true }); + if (isTransformed) { + ancestors.forEach(function(p) { + p.removeAttribute("ace_nocontext"); + }); + } + setTimeout(function() { + text.style.position = ""; + if (text.style.top == "0px") + text.style.top = top; + }, 0); + }; + this.blur = function() { + text.blur(); + }; + this.isFocused = function() { + return isFocused; + }; + + host.on("beforeEndOperation", function() { + var curOp = host.curOp; + var commandName = curOp && curOp.command && curOp.command.name; + if (commandName == "insertstring") + return; + var isUserAction = commandName && (curOp.docChanged || curOp.selectionChanged); + if (inComposition && isUserAction) { + lastValue = text.value = ""; + onCompositionEnd(); + } + resetSelection(); + }); + + var resetSelection = isIOS + ? function(value) { + if (!isFocused || (copied && !value) || sendingText) return; + if (!value) + value = ""; + var newValue = "\n ab" + value + "cde fg\n"; + if (newValue != text.value) + text.value = lastValue = newValue; + + var selectionStart = 4; + var selectionEnd = 4 + (value.length || (host.selection.isEmpty() ? 0 : 1)); + + if (lastSelectionStart != selectionStart || lastSelectionEnd != selectionEnd) { + text.setSelectionRange(selectionStart, selectionEnd); + } + lastSelectionStart = selectionStart; + lastSelectionEnd = selectionEnd; + } + : function() { + if (inComposition || sendingText) + return; + if (!isFocused && !afterContextMenu) + return; + inComposition = true; + + var selectionStart = 0; + var selectionEnd = 0; + var line = ""; + + if (host.session) { + var selection = host.selection; + var range = selection.getRange(); + var row = selection.cursor.row; + selectionStart = range.start.column; + selectionEnd = range.end.column; + line = host.session.getLine(row); + + if (range.start.row != row) { + var prevLine = host.session.getLine(row - 1); + selectionStart = range.start.row < row - 1 ? 0 : selectionStart; + selectionEnd += prevLine.length + 1; + line = prevLine + "\n" + line; + } + else if (range.end.row != row) { + var nextLine = host.session.getLine(row + 1); + selectionEnd = range.end.row > row + 1 ? nextLine.length : selectionEnd; + selectionEnd += line.length + 1; + line = line + "\n" + nextLine; + } + else if (isMobile && row > 0) { + line = "\n" + line; + selectionEnd += 1; + selectionStart += 1; + } + + if (line.length > MAX_LINE_LENGTH) { + if (selectionStart < MAX_LINE_LENGTH && selectionEnd < MAX_LINE_LENGTH) { + line = line.slice(0, MAX_LINE_LENGTH); + } else { + line = "\n"; + if (selectionStart == selectionEnd) { + selectionStart = selectionEnd = 0; + } + else { + selectionStart = 0; + selectionEnd = 1; + } + } + } + } + + var newValue = line + "\n\n"; + if (newValue != lastValue) { + text.value = lastValue = newValue; + lastSelectionStart = lastSelectionEnd = newValue.length; + } + if (afterContextMenu) { + lastSelectionStart = text.selectionStart; + lastSelectionEnd = text.selectionEnd; + } + if ( + lastSelectionEnd != selectionEnd + || lastSelectionStart != selectionStart + || text.selectionEnd != lastSelectionEnd // on ie edge selectionEnd changes silently after the initialization + ) { + try { + text.setSelectionRange(selectionStart, selectionEnd); + lastSelectionStart = selectionStart; + lastSelectionEnd = selectionEnd; + } catch(e){} + } + inComposition = false; + }; + this.resetSelection = resetSelection; + + if (isFocused) + host.onFocus(); + + + var isAllSelected = function(text) { + return text.selectionStart === 0 && text.selectionEnd >= lastValue.length + && text.value === lastValue && lastValue + && text.selectionEnd !== lastSelectionEnd; + }; + + var onSelect = function(e) { + if (inComposition) + return; + if (copied) { + copied = false; + } else if (isAllSelected(text)) { + host.selectAll(); + resetSelection(); + } else if (isMobile && text.selectionStart != lastSelectionStart) { + resetSelection(); + } + }; + + var inputHandler = null; + this.setInputHandler = function(cb) {inputHandler = cb;}; + this.getInputHandler = function() {return inputHandler;}; + var afterContextMenu = false; + + var sendText = function(value, fromInput) { + if (afterContextMenu) + afterContextMenu = false; + if (pasted) { + resetSelection(); + if (value) + host.onPaste(value); + pasted = false; + return ""; + } else { + var selectionStart = text.selectionStart; + var selectionEnd = text.selectionEnd; + + var extendLeft = lastSelectionStart; + var extendRight = lastValue.length - lastSelectionEnd; + + var inserted = value; + var restoreStart = value.length - selectionStart; + var restoreEnd = value.length - selectionEnd; + + var i = 0; + while (extendLeft > 0 && lastValue[i] == value[i]) { + i++; + extendLeft--; + } + inserted = inserted.slice(i); + i = 1; + while (extendRight > 0 && lastValue.length - i > lastSelectionStart - 1 && lastValue[lastValue.length - i] == value[value.length - i]) { + i++; + extendRight--; + } + restoreStart -= i-1; + restoreEnd -= i-1; + var endIndex = inserted.length - i + 1; + if (endIndex < 0) { + extendLeft = -endIndex; + endIndex = 0; + } + inserted = inserted.slice(0, endIndex); + if (!fromInput && !inserted && !restoreStart && !extendLeft && !extendRight && !restoreEnd) + return ""; + sendingText = true; + var shouldReset = false; + if (useragent.isAndroid && inserted == ". ") { + inserted = " "; + shouldReset = true; + } + + if (inserted && !extendLeft && !extendRight && !restoreStart && !restoreEnd || commandMode) { + host.onTextInput(inserted); + } else { + host.onTextInput(inserted, { + extendLeft: extendLeft, + extendRight: extendRight, + restoreStart: restoreStart, + restoreEnd: restoreEnd + }); + } + sendingText = false; + + lastValue = value; + lastSelectionStart = selectionStart; + lastSelectionEnd = selectionEnd; + lastRestoreEnd = restoreEnd; + return shouldReset ? "\n" : inserted; + } + }; + var onInput = function(e) { + if (inComposition) + return onCompositionUpdate(); + if (e && e.inputType) { + if (e.inputType == "historyUndo") return host.execCommand("undo"); + if (e.inputType == "historyRedo") return host.execCommand("redo"); + } + var data = text.value; + var inserted = sendText(data, true); + if ( + data.length > MAX_LINE_LENGTH + 100 + || valueResetRegex.test(inserted) + || isMobile && lastSelectionStart < 1 && lastSelectionStart == lastSelectionEnd + ) { + resetSelection(); + } + }; + + var handleClipboardData = function(e, data, forceIEMime) { + var clipboardData = e.clipboardData || window.clipboardData; + if (!clipboardData || BROKEN_SETDATA) + return; + var mime = USE_IE_MIME_TYPE || forceIEMime ? "Text" : "text/plain"; + try { + if (data) { + return clipboardData.setData(mime, data) !== false; + } else { + return clipboardData.getData(mime); + } + } catch(e) { + if (!forceIEMime) + return handleClipboardData(e, data, true); + } + }; + + var doCopy = function(e, isCut) { + var data = host.getCopyText(); + if (!data) + return event.preventDefault(e); + + if (handleClipboardData(e, data)) { + if (isIOS) { + resetSelection(data); + copied = data; + setTimeout(function () { + copied = false; + }, 10); + } + isCut ? host.onCut() : host.onCopy(); + event.preventDefault(e); + } else { + copied = true; + text.value = data; + text.select(); + setTimeout(function(){ + copied = false; + resetSelection(); + isCut ? host.onCut() : host.onCopy(); + }); + } + }; + + var onCut = function(e) { + doCopy(e, true); + }; + + var onCopy = function(e) { + doCopy(e, false); + }; + + var onPaste = function(e) { + var data = handleClipboardData(e); + if (clipboard.pasteCancelled()) + return; + if (typeof data == "string") { + if (data) + host.onPaste(data, e); + if (useragent.isIE) + setTimeout(resetSelection); + event.preventDefault(e); + } + else { + text.value = ""; + pasted = true; + } + }; + + event.addCommandKeyListener(text, host.onCommandKey.bind(host), host); + + event.addListener(text, "select", onSelect, host); + event.addListener(text, "input", onInput, host); + + event.addListener(text, "cut", onCut, host); + event.addListener(text, "copy", onCopy, host); + event.addListener(text, "paste", onPaste, host); + if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)) { + event.addListener(parentNode, "keydown", function(e) { + if ((useragent.isMac && !e.metaKey) || !e.ctrlKey) + return; + + switch (e.keyCode) { + case 67: + onCopy(e); + break; + case 86: + onPaste(e); + break; + case 88: + onCut(e); + break; + } + }, host); + } + var onCompositionStart = function(e) { + if (inComposition || !host.onCompositionStart || host.$readOnly) + return; + + inComposition = {}; + + if (commandMode) + return; + + if (e.data) + inComposition.useTextareaForIME = false; + + setTimeout(onCompositionUpdate, 0); + host._signal("compositionStart"); + host.on("mousedown", cancelComposition); + + var range = host.getSelectionRange(); + range.end.row = range.start.row; + range.end.column = range.start.column; + inComposition.markerRange = range; + inComposition.selectionStart = lastSelectionStart; + host.onCompositionStart(inComposition); + + if (inComposition.useTextareaForIME) { + lastValue = text.value = ""; + lastSelectionStart = 0; + lastSelectionEnd = 0; + } + else { + if (text.msGetInputContext) + inComposition.context = text.msGetInputContext(); + if (text.getInputContext) + inComposition.context = text.getInputContext(); + } + }; + + var onCompositionUpdate = function() { + if (!inComposition || !host.onCompositionUpdate || host.$readOnly) + return; + if (commandMode) + return cancelComposition(); + + if (inComposition.useTextareaForIME) { + host.onCompositionUpdate(text.value); + } + else { + var data = text.value; + sendText(data); + if (inComposition.markerRange) { + if (inComposition.context) { + inComposition.markerRange.start.column = inComposition.selectionStart + = inComposition.context.compositionStartOffset; + } + inComposition.markerRange.end.column = inComposition.markerRange.start.column + + lastSelectionEnd - inComposition.selectionStart + lastRestoreEnd; + } + } + }; + + var onCompositionEnd = function(e) { + if (!host.onCompositionEnd || host.$readOnly) return; + inComposition = false; + host.onCompositionEnd(); + host.off("mousedown", cancelComposition); + if (e) onInput(); + }; + + + function cancelComposition() { + ignoreFocusEvents = true; + text.blur(); + text.focus(); + ignoreFocusEvents = false; + } + + var syncComposition = lang.delayedCall(onCompositionUpdate, 50).schedule.bind(null, null); + + function onKeyup(e) { + if (e.keyCode == 27 && text.value.length < text.selectionStart) { + if (!inComposition) + lastValue = text.value; + lastSelectionStart = lastSelectionEnd = -1; + resetSelection(); + } + syncComposition(); + } + + event.addListener(text, "compositionstart", onCompositionStart, host); + event.addListener(text, "compositionupdate", onCompositionUpdate, host); + event.addListener(text, "keyup", onKeyup, host); + event.addListener(text, "keydown", syncComposition, host); + event.addListener(text, "compositionend", onCompositionEnd, host); + + this.getElement = function() { + return text; + }; + this.setCommandMode = function(value) { + commandMode = value; + text.readOnly = false; + }; + + this.setReadOnly = function(readOnly) { + if (!commandMode) + text.readOnly = readOnly; + }; + + this.setCopyWithEmptySelection = function(value) { + }; + + this.onContextMenu = function(e) { + afterContextMenu = true; + resetSelection(); + host._emit("nativecontextmenu", {target: host, domEvent: e}); + this.moveToMouse(e, true); + }; + + this.moveToMouse = function(e, bringToFront) { + if (!tempStyle) + tempStyle = text.style.cssText; + text.style.cssText = (bringToFront ? "z-index:100000;" : "") + + (useragent.isIE ? "opacity:0.1;" : "") + + "text-indent: -" + (lastSelectionStart + lastSelectionEnd) * host.renderer.characterWidth * 0.5 + "px;"; + + var rect = host.container.getBoundingClientRect(); + var style = dom.computedStyle(host.container); + var top = rect.top + (parseInt(style.borderTopWidth) || 0); + var left = rect.left + (parseInt(rect.borderLeftWidth) || 0); + var maxTop = rect.bottom - top - text.clientHeight -2; + var move = function(e) { + dom.translate(text, e.clientX - left - 2, Math.min(e.clientY - top - 2, maxTop)); + }; + move(e); + + if (e.type != "mousedown") + return; + + host.renderer.$isMousePressed = true; + + clearTimeout(closeTimeout); + if (useragent.isWin) + event.capture(host.container, move, onContextMenuClose); + }; + + this.onContextMenuClose = onContextMenuClose; + var closeTimeout; + function onContextMenuClose() { + clearTimeout(closeTimeout); + closeTimeout = setTimeout(function () { + if (tempStyle) { + text.style.cssText = tempStyle; + tempStyle = ''; + } + host.renderer.$isMousePressed = false; + if (host.renderer.$keepTextAreaAtCursor) + host.renderer.$moveTextAreaToCursor(); + }, 0); + } + + var onContextMenu = function(e) { + host.textInput.onContextMenu(e); + onContextMenuClose(); + }; + event.addListener(text, "mouseup", onContextMenu, host); + event.addListener(text, "mousedown", function(e) { + e.preventDefault(); + onContextMenuClose(); + }, host); + event.addListener(host.renderer.scroller, "contextmenu", onContextMenu, host); + event.addListener(text, "contextmenu", onContextMenu, host); + + if (isIOS) + addIosSelectionHandler(parentNode, host, text); + + function addIosSelectionHandler(parentNode, host, text) { + var typingResetTimeout = null; + var typing = false; + + text.addEventListener("keydown", function (e) { + if (typingResetTimeout) clearTimeout(typingResetTimeout); + typing = true; + }, true); + + text.addEventListener("keyup", function (e) { + typingResetTimeout = setTimeout(function () { + typing = false; + }, 100); + }, true); + var detectArrowKeys = function(e) { + if (document.activeElement !== text) return; + if (typing || inComposition || host.$mouseHandler.isMousePressed) return; + + if (copied) { + return; + } + var selectionStart = text.selectionStart; + var selectionEnd = text.selectionEnd; + + var key = null; + var modifier = 0; + if (selectionStart == 0) { + key = KEYS.up; + } else if (selectionStart == 1) { + key = KEYS.home; + } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd] == "\n") { + key = KEYS.end; + } else if (selectionStart < lastSelectionStart && lastValue[selectionStart - 1] == " ") { + key = KEYS.left; + modifier = MODS.option; + } else if ( + selectionStart < lastSelectionStart + || ( + selectionStart == lastSelectionStart + && lastSelectionEnd != lastSelectionStart + && selectionStart == selectionEnd + ) + ) { + key = KEYS.left; + } else if (selectionEnd > lastSelectionEnd && lastValue.slice(0, selectionEnd).split("\n").length > 2) { + key = KEYS.down; + } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd - 1] == " ") { + key = KEYS.right; + modifier = MODS.option; + } else if ( + selectionEnd > lastSelectionEnd + || ( + selectionEnd == lastSelectionEnd + && lastSelectionEnd != lastSelectionStart + && selectionStart == selectionEnd + ) + ) { + key = KEYS.right; + } + + if (selectionStart !== selectionEnd) + modifier |= MODS.shift; + + if (key) { + var result = host.onCommandKey({}, modifier, key); + if (!result && host.commands) { + key = KEYS.keyCodeToString(key); + var command = host.commands.findKeyCommand(modifier, key); + if (command) + host.execCommand(command); + } + lastSelectionStart = selectionStart; + lastSelectionEnd = selectionEnd; + resetSelection(""); + } + }; + document.addEventListener("selectionchange", detectArrowKeys); + host.on("destroy", function() { + document.removeEventListener("selectionchange", detectArrowKeys); + }); + } + + this.destroy = function() { + if (text.parentElement) + text.parentElement.removeChild(text); + }; +}; + +exports.TextInput = TextInput; +exports.$setUserAgentForTests = function(_isMobile, _isIOS) { + isMobile = _isMobile; + isIOS = _isIOS; +}; +}); + +define("ace/mouse/default_handlers",["require","exports","module","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var useragent = require("../lib/useragent"); + +var DRAG_OFFSET = 0; // pixels +var SCROLL_COOLDOWN_T = 550; // milliseconds + +function DefaultHandlers(mouseHandler) { + mouseHandler.$clickSelection = null; + + var editor = mouseHandler.editor; + editor.setDefaultHandler("mousedown", this.onMouseDown.bind(mouseHandler)); + editor.setDefaultHandler("dblclick", this.onDoubleClick.bind(mouseHandler)); + editor.setDefaultHandler("tripleclick", this.onTripleClick.bind(mouseHandler)); + editor.setDefaultHandler("quadclick", this.onQuadClick.bind(mouseHandler)); + editor.setDefaultHandler("mousewheel", this.onMouseWheel.bind(mouseHandler)); + + var exports = ["select", "startSelect", "selectEnd", "selectAllEnd", "selectByWordsEnd", + "selectByLinesEnd", "dragWait", "dragWaitEnd", "focusWait"]; + + exports.forEach(function(x) { + mouseHandler[x] = this[x]; + }, this); + + mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, "getLineRange"); + mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, "getWordRange"); +} + +(function() { + + this.onMouseDown = function(ev) { + var inSelection = ev.inSelection(); + var pos = ev.getDocumentPosition(); + this.mousedownEvent = ev; + var editor = this.editor; + + var button = ev.getButton(); + if (button !== 0) { + var selectionRange = editor.getSelectionRange(); + var selectionEmpty = selectionRange.isEmpty(); + if (selectionEmpty || button == 1) + editor.selection.moveToPosition(pos); + if (button == 2) { + editor.textInput.onContextMenu(ev.domEvent); + if (!useragent.isMozilla) + ev.preventDefault(); + } + return; + } + + this.mousedownEvent.time = Date.now(); + if (inSelection && !editor.isFocused()) { + editor.focus(); + if (this.$focusTimeout && !this.$clickSelection && !editor.inMultiSelectMode) { + this.setState("focusWait"); + this.captureMouse(ev); + return; + } + } + + this.captureMouse(ev); + this.startSelect(pos, ev.domEvent._clicks > 1); + return ev.preventDefault(); + }; + + this.startSelect = function(pos, waitForClickSelection) { + pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y); + var editor = this.editor; + if (!this.mousedownEvent) return; + if (this.mousedownEvent.getShiftKey()) + editor.selection.selectToPosition(pos); + else if (!waitForClickSelection) + editor.selection.moveToPosition(pos); + if (!waitForClickSelection) + this.select(); + if (editor.renderer.scroller.setCapture) { + editor.renderer.scroller.setCapture(); + } + editor.setStyle("ace_selecting"); + this.setState("select"); + }; + + this.select = function() { + var anchor, editor = this.editor; + var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); + if (this.$clickSelection) { + var cmp = this.$clickSelection.comparePoint(cursor); + + if (cmp == -1) { + anchor = this.$clickSelection.end; + } else if (cmp == 1) { + anchor = this.$clickSelection.start; + } else { + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + cursor = orientedRange.cursor; + anchor = orientedRange.anchor; + } + editor.selection.setSelectionAnchor(anchor.row, anchor.column); + } + editor.selection.selectToPosition(cursor); + editor.renderer.scrollCursorIntoView(); + }; + + this.extendSelectionBy = function(unitName) { + var anchor, editor = this.editor; + var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); + var range = editor.selection[unitName](cursor.row, cursor.column); + if (this.$clickSelection) { + var cmpStart = this.$clickSelection.comparePoint(range.start); + var cmpEnd = this.$clickSelection.comparePoint(range.end); + + if (cmpStart == -1 && cmpEnd <= 0) { + anchor = this.$clickSelection.end; + if (range.end.row != cursor.row || range.end.column != cursor.column) + cursor = range.start; + } else if (cmpEnd == 1 && cmpStart >= 0) { + anchor = this.$clickSelection.start; + if (range.start.row != cursor.row || range.start.column != cursor.column) + cursor = range.end; + } else if (cmpStart == -1 && cmpEnd == 1) { + cursor = range.end; + anchor = range.start; + } else { + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + cursor = orientedRange.cursor; + anchor = orientedRange.anchor; + } + editor.selection.setSelectionAnchor(anchor.row, anchor.column); + } + editor.selection.selectToPosition(cursor); + editor.renderer.scrollCursorIntoView(); + }; + + this.selectEnd = + this.selectAllEnd = + this.selectByWordsEnd = + this.selectByLinesEnd = function() { + this.$clickSelection = null; + this.editor.unsetStyle("ace_selecting"); + if (this.editor.renderer.scroller.releaseCapture) { + this.editor.renderer.scroller.releaseCapture(); + } + }; + + this.focusWait = function() { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + var time = Date.now(); + + if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimeout) + this.startSelect(this.mousedownEvent.getDocumentPosition()); + }; + + this.onDoubleClick = function(ev) { + var pos = ev.getDocumentPosition(); + var editor = this.editor; + var session = editor.session; + + var range = session.getBracketRange(pos); + if (range) { + if (range.isEmpty()) { + range.start.column--; + range.end.column++; + } + this.setState("select"); + } else { + range = editor.selection.getWordRange(pos.row, pos.column); + this.setState("selectByWords"); + } + this.$clickSelection = range; + this.select(); + }; + + this.onTripleClick = function(ev) { + var pos = ev.getDocumentPosition(); + var editor = this.editor; + + this.setState("selectByLines"); + var range = editor.getSelectionRange(); + if (range.isMultiLine() && range.contains(pos.row, pos.column)) { + this.$clickSelection = editor.selection.getLineRange(range.start.row); + this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end; + } else { + this.$clickSelection = editor.selection.getLineRange(pos.row); + } + this.select(); + }; + + this.onQuadClick = function(ev) { + var editor = this.editor; + + editor.selectAll(); + this.$clickSelection = editor.getSelectionRange(); + this.setState("selectAll"); + }; + + this.onMouseWheel = function(ev) { + if (ev.getAccelKey()) + return; + if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) { + ev.wheelX = ev.wheelY; + ev.wheelY = 0; + } + + var editor = this.editor; + + if (!this.$lastScroll) + this.$lastScroll = { t: 0, vx: 0, vy: 0, allowed: 0 }; + + var prevScroll = this.$lastScroll; + var t = ev.domEvent.timeStamp; + var dt = t - prevScroll.t; + var vx = dt ? ev.wheelX / dt : prevScroll.vx; + var vy = dt ? ev.wheelY / dt : prevScroll.vy; + if (dt < SCROLL_COOLDOWN_T) { + vx = (vx + prevScroll.vx) / 2; + vy = (vy + prevScroll.vy) / 2; + } + + var direction = Math.abs(vx / vy); + + var canScroll = false; + if (direction >= 1 && editor.renderer.isScrollableBy(ev.wheelX * ev.speed, 0)) + canScroll = true; + if (direction <= 1 && editor.renderer.isScrollableBy(0, ev.wheelY * ev.speed)) + canScroll = true; + + if (canScroll) { + prevScroll.allowed = t; + } else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) { + var isSlower = Math.abs(vx) <= 1.5 * Math.abs(prevScroll.vx) + && Math.abs(vy) <= 1.5 * Math.abs(prevScroll.vy); + if (isSlower) { + canScroll = true; + prevScroll.allowed = t; + } + else { + prevScroll.allowed = 0; + } + } + + prevScroll.t = t; + prevScroll.vx = vx; + prevScroll.vy = vy; + + if (canScroll) { + editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + return ev.stop(); + } + }; + +}).call(DefaultHandlers.prototype); + +exports.DefaultHandlers = DefaultHandlers; + +function calcDistance(ax, ay, bx, by) { + return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); +} + +function calcRangeOrientation(range, cursor) { + if (range.start.row == range.end.row) + var cmp = 2 * cursor.column - range.start.column - range.end.column; + else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column) + var cmp = cursor.column - 4; + else + var cmp = 2 * cursor.row - range.start.row - range.end.row; + + if (cmp < 0) + return {cursor: range.start, anchor: range.end}; + else + return {cursor: range.end, anchor: range.start}; +} + +}); + +define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); + +var CLASSNAME = "ace_tooltip"; +function Tooltip (parentNode) { + this.isOpen = false; + this.$element = null; + this.$parentNode = parentNode; +} + +(function() { + this.$init = function() { + this.$element = dom.createElement("div"); + this.$element.className = CLASSNAME; + this.$element.style.display = "none"; + this.$parentNode.appendChild(this.$element); + return this.$element; + }; + this.getElement = function() { + return this.$element || this.$init(); + }; + this.setText = function(text) { + this.getElement().textContent = text; + }; + this.setHtml = function(html) { + this.getElement().innerHTML = html; + }; + this.setPosition = function(x, y) { + this.getElement().style.left = x + "px"; + this.getElement().style.top = y + "px"; + }; + this.setClassName = function(className) { + dom.addCssClass(this.getElement(), className); + }; + this.show = function(text, x, y) { + if (text != null) + this.setText(text); + if (x != null && y != null) + this.setPosition(x, y); + if (!this.isOpen) { + this.getElement().style.display = "block"; + this.isOpen = true; + } + }; + + this.hide = function() { + if (this.isOpen) { + this.getElement().style.display = "none"; + this.getElement().className = CLASSNAME; + this.isOpen = false; + } + }; + this.getHeight = function() { + return this.getElement().offsetHeight; + }; + this.getWidth = function() { + return this.getElement().offsetWidth; + }; + + this.destroy = function() { + this.isOpen = false; + if (this.$element && this.$element.parentNode) { + this.$element.parentNode.removeChild(this.$element); + } + }; + +}).call(Tooltip.prototype); + +exports.Tooltip = Tooltip; +}); + +define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"], function(require, exports, module) { +"use strict"; +var dom = require("../lib/dom"); +var oop = require("../lib/oop"); +var event = require("../lib/event"); +var Tooltip = require("../tooltip").Tooltip; + +function GutterHandler(mouseHandler) { + var editor = mouseHandler.editor; + var gutter = editor.renderer.$gutterLayer; + var tooltip = new GutterTooltip(editor.container); + + mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) { + if (!editor.isFocused() || e.getButton() != 0) + return; + var gutterRegion = gutter.getRegion(e); + + if (gutterRegion == "foldWidgets") + return; + + var row = e.getDocumentPosition().row; + var selection = editor.session.selection; + + if (e.getShiftKey()) + selection.selectTo(row, 0); + else { + if (e.domEvent.detail == 2) { + editor.selectAll(); + return e.preventDefault(); + } + mouseHandler.$clickSelection = editor.selection.getLineRange(row); + } + mouseHandler.setState("selectByLines"); + mouseHandler.captureMouse(e); + return e.preventDefault(); + }); + + + var tooltipTimeout, mouseEvent, tooltipAnnotation; + + function showTooltip() { + var row = mouseEvent.getDocumentPosition().row; + var annotation = gutter.$annotations[row]; + if (!annotation) + return hideTooltip(); + + var maxRow = editor.session.getLength(); + if (row == maxRow) { + var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row; + var pos = mouseEvent.$pos; + if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column)) + return hideTooltip(); + } + + + if (tooltipAnnotation == annotation) + return; + tooltipAnnotation = annotation.text.join("
"); + if (!tooltipAnnotation.length) return + + tooltip.setHtml(tooltipAnnotation); + var annotationClassName = annotation.className; + if (annotationClassName) { + tooltip.setClassName(annotationClassName.trim()); + } + + tooltip.show(); + editor._signal("showGutterTooltip", tooltip); + + editor.on("mousewheel", hideTooltip); + + if (mouseHandler.$tooltipFollowsMouse) { + moveTooltip(mouseEvent); + } else { + var gutterElement = mouseEvent.domEvent.target; + var rect = gutterElement.getBoundingClientRect(); + var style = tooltip.getElement().style; + style.left = rect.right + "px"; + style.top = rect.bottom + "px"; + } + } + + function hideTooltip() { + if (tooltipTimeout) + tooltipTimeout = clearTimeout(tooltipTimeout); + if (tooltipAnnotation) { + tooltip.hide(); + tooltipAnnotation = null; + editor._signal("hideGutterTooltip", tooltip); + editor.off("mousewheel", hideTooltip); + } + } + + function moveTooltip(e) { + tooltip.setPosition(e.x, e.y); + } + + mouseHandler.editor.setDefaultHandler("guttermousemove", function(e) { + var target = e.domEvent.target || e.domEvent.srcElement; + if (dom.hasCssClass(target, "ace_fold-widget")) + return hideTooltip(); + + if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse) + moveTooltip(e); + + mouseEvent = e; + if (tooltipTimeout) + return; + tooltipTimeout = setTimeout(function() { + tooltipTimeout = null; + if (mouseEvent && !mouseHandler.isMousePressed) + showTooltip(); + else + hideTooltip(); + }, 50); + }); + + event.addListener(editor.renderer.$gutter, "mouseout", function(e) { + mouseEvent = null; + if (!tooltipAnnotation || tooltipTimeout) + return; + + tooltipTimeout = setTimeout(function() { + tooltipTimeout = null; + hideTooltip(); + }, 50); + }, editor); + + editor.on("changeSession", hideTooltip); +} + +function GutterTooltip(parentNode) { + Tooltip.call(this, parentNode); +} + +oop.inherits(GutterTooltip, Tooltip); + +(function(){ + this.setPosition = function(x, y) { + var windowWidth = window.innerWidth || document.documentElement.clientWidth; + var windowHeight = window.innerHeight || document.documentElement.clientHeight; + var width = this.getWidth(); + var height = this.getHeight(); + x += 15; + y += 15; + if (x + width > windowWidth) { + x -= (x + width) - windowWidth; + } + if (y + height > windowHeight) { + y -= 20 + height; + } + Tooltip.prototype.setPosition.call(this, x, y); + }; + +}).call(GutterTooltip.prototype); + + + +exports.GutterHandler = GutterHandler; + +}); + +define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var MouseEvent = exports.MouseEvent = function(domEvent, editor) { + this.domEvent = domEvent; + this.editor = editor; + + this.x = this.clientX = domEvent.clientX; + this.y = this.clientY = domEvent.clientY; + + this.$pos = null; + this.$inSelection = null; + + this.propagationStopped = false; + this.defaultPrevented = false; +}; + +(function() { + + this.stopPropagation = function() { + event.stopPropagation(this.domEvent); + this.propagationStopped = true; + }; + + this.preventDefault = function() { + event.preventDefault(this.domEvent); + this.defaultPrevented = true; + }; + + this.stop = function() { + this.stopPropagation(); + this.preventDefault(); + }; + this.getDocumentPosition = function() { + if (this.$pos) + return this.$pos; + + this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY); + return this.$pos; + }; + this.inSelection = function() { + if (this.$inSelection !== null) + return this.$inSelection; + + var editor = this.editor; + + + var selectionRange = editor.getSelectionRange(); + if (selectionRange.isEmpty()) + this.$inSelection = false; + else { + var pos = this.getDocumentPosition(); + this.$inSelection = selectionRange.contains(pos.row, pos.column); + } + + return this.$inSelection; + }; + this.getButton = function() { + return event.getButton(this.domEvent); + }; + this.getShiftKey = function() { + return this.domEvent.shiftKey; + }; + + this.getAccelKey = useragent.isMac + ? function() { return this.domEvent.metaKey; } + : function() { return this.domEvent.ctrlKey; }; + +}).call(MouseEvent.prototype); + +}); + +define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); + +var AUTOSCROLL_DELAY = 200; +var SCROLL_CURSOR_DELAY = 200; +var SCROLL_CURSOR_HYSTERESIS = 5; + +function DragdropHandler(mouseHandler) { + + var editor = mouseHandler.editor; + + var dragImage = dom.createElement("div"); + dragImage.style.cssText = "top:-100px;position:absolute;z-index:2147483647;opacity:0.5"; + dragImage.textContent = "\xa0"; + + var exports = ["dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag"]; + + exports.forEach(function(x) { + mouseHandler[x] = this[x]; + }, this); + editor.on("mousedown", this.onMouseDown.bind(mouseHandler)); + + var mouseTarget = editor.container; + var dragSelectionMarker, x, y; + var timerId, range; + var dragCursor, counter = 0; + var dragOperation; + var isInternal; + var autoScrollStartTime; + var cursorMovedTime; + var cursorPointOnCaretMoved; + + this.onDragStart = function(e) { + if (this.cancelDrag || !mouseTarget.draggable) { + var self = this; + setTimeout(function(){ + self.startSelect(); + self.captureMouse(e); + }, 0); + return e.preventDefault(); + } + range = editor.getSelectionRange(); + + var dataTransfer = e.dataTransfer; + dataTransfer.effectAllowed = editor.getReadOnly() ? "copy" : "copyMove"; + editor.container.appendChild(dragImage); + + dataTransfer.setDragImage && dataTransfer.setDragImage(dragImage, 0, 0); + setTimeout(function() { + editor.container.removeChild(dragImage); + }); + dataTransfer.clearData(); + dataTransfer.setData("Text", editor.session.getTextRange()); + + isInternal = true; + this.setState("drag"); + }; + + this.onDragEnd = function(e) { + mouseTarget.draggable = false; + isInternal = false; + this.setState(null); + if (!editor.getReadOnly()) { + var dropEffect = e.dataTransfer.dropEffect; + if (!dragOperation && dropEffect == "move") + editor.session.remove(editor.getSelectionRange()); + editor.$resetCursorStyle(); + } + this.editor.unsetStyle("ace_dragging"); + this.editor.renderer.setCursorStyle(""); + }; + + this.onDragEnter = function(e) { + if (editor.getReadOnly() || !canAccept(e.dataTransfer)) + return; + x = e.clientX; + y = e.clientY; + if (!dragSelectionMarker) + addDragMarker(); + counter++; + e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); + return event.preventDefault(e); + }; + + this.onDragOver = function(e) { + if (editor.getReadOnly() || !canAccept(e.dataTransfer)) + return; + x = e.clientX; + y = e.clientY; + if (!dragSelectionMarker) { + addDragMarker(); + counter++; + } + if (onMouseMoveTimer !== null) + onMouseMoveTimer = null; + + e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); + return event.preventDefault(e); + }; + + this.onDragLeave = function(e) { + counter--; + if (counter <= 0 && dragSelectionMarker) { + clearDragMarker(); + dragOperation = null; + return event.preventDefault(e); + } + }; + + this.onDrop = function(e) { + if (!dragCursor) + return; + var dataTransfer = e.dataTransfer; + if (isInternal) { + switch (dragOperation) { + case "move": + if (range.contains(dragCursor.row, dragCursor.column)) { + range = { + start: dragCursor, + end: dragCursor + }; + } else { + range = editor.moveText(range, dragCursor); + } + break; + case "copy": + range = editor.moveText(range, dragCursor, true); + break; + } + } else { + var dropData = dataTransfer.getData('Text'); + range = { + start: dragCursor, + end: editor.session.insert(dragCursor, dropData) + }; + editor.focus(); + dragOperation = null; + } + clearDragMarker(); + return event.preventDefault(e); + }; + + event.addListener(mouseTarget, "dragstart", this.onDragStart.bind(mouseHandler), editor); + event.addListener(mouseTarget, "dragend", this.onDragEnd.bind(mouseHandler), editor); + event.addListener(mouseTarget, "dragenter", this.onDragEnter.bind(mouseHandler), editor); + event.addListener(mouseTarget, "dragover", this.onDragOver.bind(mouseHandler), editor); + event.addListener(mouseTarget, "dragleave", this.onDragLeave.bind(mouseHandler), editor); + event.addListener(mouseTarget, "drop", this.onDrop.bind(mouseHandler), editor); + + function scrollCursorIntoView(cursor, prevCursor) { + var now = Date.now(); + var vMovement = !prevCursor || cursor.row != prevCursor.row; + var hMovement = !prevCursor || cursor.column != prevCursor.column; + if (!cursorMovedTime || vMovement || hMovement) { + editor.moveCursorToPosition(cursor); + cursorMovedTime = now; + cursorPointOnCaretMoved = {x: x, y: y}; + } else { + var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y); + if (distance > SCROLL_CURSOR_HYSTERESIS) { + cursorMovedTime = null; + } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) { + editor.renderer.scrollCursorIntoView(); + cursorMovedTime = null; + } + } + } + + function autoScroll(cursor, prevCursor) { + var now = Date.now(); + var lineHeight = editor.renderer.layerConfig.lineHeight; + var characterWidth = editor.renderer.layerConfig.characterWidth; + var editorRect = editor.renderer.scroller.getBoundingClientRect(); + var offsets = { + x: { + left: x - editorRect.left, + right: editorRect.right - x + }, + y: { + top: y - editorRect.top, + bottom: editorRect.bottom - y + } + }; + var nearestXOffset = Math.min(offsets.x.left, offsets.x.right); + var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom); + var scrollCursor = {row: cursor.row, column: cursor.column}; + if (nearestXOffset / characterWidth <= 2) { + scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2); + } + if (nearestYOffset / lineHeight <= 1) { + scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1); + } + var vScroll = cursor.row != scrollCursor.row; + var hScroll = cursor.column != scrollCursor.column; + var vMovement = !prevCursor || cursor.row != prevCursor.row; + if (vScroll || (hScroll && !vMovement)) { + if (!autoScrollStartTime) + autoScrollStartTime = now; + else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY) + editor.renderer.scrollCursorIntoView(scrollCursor); + } else { + autoScrollStartTime = null; + } + } + + function onDragInterval() { + var prevCursor = dragCursor; + dragCursor = editor.renderer.screenToTextCoordinates(x, y); + scrollCursorIntoView(dragCursor, prevCursor); + autoScroll(dragCursor, prevCursor); + } + + function addDragMarker() { + range = editor.selection.toOrientedRange(); + dragSelectionMarker = editor.session.addMarker(range, "ace_selection", editor.getSelectionStyle()); + editor.clearSelection(); + if (editor.isFocused()) + editor.renderer.$cursorLayer.setBlinking(false); + clearInterval(timerId); + onDragInterval(); + timerId = setInterval(onDragInterval, 20); + counter = 0; + event.addListener(document, "mousemove", onMouseMove); + } + + function clearDragMarker() { + clearInterval(timerId); + editor.session.removeMarker(dragSelectionMarker); + dragSelectionMarker = null; + editor.selection.fromOrientedRange(range); + if (editor.isFocused() && !isInternal) + editor.$resetCursorStyle(); + range = null; + dragCursor = null; + counter = 0; + autoScrollStartTime = null; + cursorMovedTime = null; + event.removeListener(document, "mousemove", onMouseMove); + } + var onMouseMoveTimer = null; + function onMouseMove() { + if (onMouseMoveTimer == null) { + onMouseMoveTimer = setTimeout(function() { + if (onMouseMoveTimer != null && dragSelectionMarker) + clearDragMarker(); + }, 20); + } + } + + function canAccept(dataTransfer) { + var types = dataTransfer.types; + return !types || Array.prototype.some.call(types, function(type) { + return type == 'text/plain' || type == 'Text'; + }); + } + + function getDropEffect(e) { + var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized']; + var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized']; + + var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey; + var effectAllowed = "uninitialized"; + try { + effectAllowed = e.dataTransfer.effectAllowed.toLowerCase(); + } catch (e) {} + var dropEffect = "none"; + + if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0) + dropEffect = "copy"; + else if (moveAllowed.indexOf(effectAllowed) >= 0) + dropEffect = "move"; + else if (copyAllowed.indexOf(effectAllowed) >= 0) + dropEffect = "copy"; + + return dropEffect; + } +} + +(function() { + + this.dragWait = function() { + var interval = Date.now() - this.mousedownEvent.time; + if (interval > this.editor.getDragDelay()) + this.startDrag(); + }; + + this.dragWaitEnd = function() { + var target = this.editor.container; + target.draggable = false; + this.startSelect(this.mousedownEvent.getDocumentPosition()); + this.selectEnd(); + }; + + this.dragReadyEnd = function(e) { + this.editor.$resetCursorStyle(); + this.editor.unsetStyle("ace_dragging"); + this.editor.renderer.setCursorStyle(""); + this.dragWaitEnd(); + }; + + this.startDrag = function(){ + this.cancelDrag = false; + var editor = this.editor; + var target = editor.container; + target.draggable = true; + editor.renderer.$cursorLayer.setBlinking(false); + editor.setStyle("ace_dragging"); + var cursorStyle = useragent.isWin ? "default" : "move"; + editor.renderer.setCursorStyle(cursorStyle); + this.setState("dragReady"); + }; + + this.onMouseDrag = function(e) { + var target = this.editor.container; + if (useragent.isIE && this.state == "dragReady") { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + if (distance > 3) + target.dragDrop(); + } + if (this.state === "dragWait") { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + if (distance > 0) { + target.draggable = false; + this.startSelect(this.mousedownEvent.getDocumentPosition()); + } + } + }; + + this.onMouseDown = function(e) { + if (!this.$dragEnabled) + return; + this.mousedownEvent = e; + var editor = this.editor; + + var inSelection = e.inSelection(); + var button = e.getButton(); + var clickCount = e.domEvent.detail || 1; + if (clickCount === 1 && button === 0 && inSelection) { + if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey())) + return; + this.mousedownEvent.time = Date.now(); + var eventTarget = e.domEvent.target || e.domEvent.srcElement; + if ("unselectable" in eventTarget) + eventTarget.unselectable = "on"; + if (editor.getDragDelay()) { + if (useragent.isWebKit) { + this.cancelDrag = true; + var mouseTarget = editor.container; + mouseTarget.draggable = true; + } + this.setState("dragWait"); + } else { + this.startDrag(); + } + this.captureMouse(e, this.onMouseDrag.bind(this)); + e.defaultPrevented = true; + } + }; + +}).call(DragdropHandler.prototype); + + +function calcDistance(ax, ay, bx, by) { + return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); +} + +exports.DragdropHandler = DragdropHandler; + +}); + +define("ace/mouse/touch_handler",["require","exports","module","ace/mouse/mouse_event","ace/lib/event","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var MouseEvent = require("./mouse_event").MouseEvent; +var event = require("../lib/event"); +var dom = require("../lib/dom"); + +exports.addTouchListeners = function(el, editor) { + var mode = "scroll"; + var startX; + var startY; + var touchStartT; + var lastT; + var longTouchTimer; + var animationTimer; + var animationSteps = 0; + var pos; + var clickCount = 0; + var vX = 0; + var vY = 0; + var pressed; + var contextMenu; + + function createContextMenu() { + var clipboard = window.navigator && window.navigator.clipboard; + var isOpen = false; + var updateMenu = function() { + var selected = editor.getCopyText(); + var hasUndo = editor.session.getUndoManager().hasUndo(); + contextMenu.replaceChild( + dom.buildDom(isOpen ? ["span", + !selected && ["span", { class: "ace_mobile-button", action: "selectall" }, "Select All"], + selected && ["span", { class: "ace_mobile-button", action: "copy" }, "Copy"], + selected && ["span", { class: "ace_mobile-button", action: "cut" }, "Cut"], + clipboard && ["span", { class: "ace_mobile-button", action: "paste" }, "Paste"], + hasUndo && ["span", { class: "ace_mobile-button", action: "undo" }, "Undo"], + ["span", { class: "ace_mobile-button", action: "find" }, "Find"], + ["span", { class: "ace_mobile-button", action: "openCommandPallete" }, "Pallete"] + ] : ["span"]), + contextMenu.firstChild + ); + }; + var handleClick = function(e) { + var action = e.target.getAttribute("action"); + + if (action == "more" || !isOpen) { + isOpen = !isOpen; + return updateMenu(); + } + if (action == "paste") { + clipboard.readText().then(function (text) { + editor.execCommand(action, text); + }); + } + else if (action) { + if (action == "cut" || action == "copy") { + if (clipboard) + clipboard.writeText(editor.getCopyText()); + else + document.execCommand("copy"); + } + editor.execCommand(action); + } + contextMenu.firstChild.style.display = "none"; + isOpen = false; + if (action != "openCommandPallete") + editor.focus(); + }; + contextMenu = dom.buildDom(["div", + { + class: "ace_mobile-menu", + ontouchstart: function(e) { + mode = "menu"; + e.stopPropagation(); + e.preventDefault(); + editor.textInput.focus(); + }, + ontouchend: function(e) { + e.stopPropagation(); + e.preventDefault(); + handleClick(e); + }, + onclick: handleClick + }, + ["span"], + ["span", { class: "ace_mobile-button", action: "more" }, "..."] + ], editor.container); + } + function showContextMenu() { + if (!contextMenu) createContextMenu(); + var cursor = editor.selection.cursor; + var pagePos = editor.renderer.textToScreenCoordinates(cursor.row, cursor.column); + var leftOffset = editor.renderer.textToScreenCoordinates(0, 0).pageX; + var scrollLeft = editor.renderer.scrollLeft; + var rect = editor.container.getBoundingClientRect(); + contextMenu.style.top = pagePos.pageY - rect.top - 3 + "px"; + if (pagePos.pageX - rect.left < rect.width - 70) { + contextMenu.style.left = ""; + contextMenu.style.right = "10px"; + } else { + contextMenu.style.right = ""; + contextMenu.style.left = leftOffset + scrollLeft - rect.left + "px"; + } + contextMenu.style.display = ""; + contextMenu.firstChild.style.display = "none"; + editor.on("input", hideContextMenu); + } + function hideContextMenu(e) { + if (contextMenu) + contextMenu.style.display = "none"; + editor.off("input", hideContextMenu); + } + + function handleLongTap() { + longTouchTimer = null; + clearTimeout(longTouchTimer); + var range = editor.selection.getRange(); + var inSelection = range.contains(pos.row, pos.column); + if (range.isEmpty() || !inSelection) { + editor.selection.moveToPosition(pos); + editor.selection.selectWord(); + } + mode = "wait"; + showContextMenu(); + } + function switchToSelectionMode() { + longTouchTimer = null; + clearTimeout(longTouchTimer); + editor.selection.moveToPosition(pos); + var range = clickCount >= 2 + ? editor.selection.getLineRange(pos.row) + : editor.session.getBracketRange(pos); + if (range && !range.isEmpty()) { + editor.selection.setRange(range); + } else { + editor.selection.selectWord(); + } + mode = "wait"; + } + event.addListener(el, "contextmenu", function(e) { + if (!pressed) return; + var textarea = editor.textInput.getElement(); + textarea.focus(); + }, editor); + event.addListener(el, "touchstart", function (e) { + var touches = e.touches; + if (longTouchTimer || touches.length > 1) { + clearTimeout(longTouchTimer); + longTouchTimer = null; + touchStartT = -1; + mode = "zoom"; + return; + } + + pressed = editor.$mouseHandler.isMousePressed = true; + var h = editor.renderer.layerConfig.lineHeight; + var w = editor.renderer.layerConfig.lineHeight; + var t = e.timeStamp; + lastT = t; + var touchObj = touches[0]; + var x = touchObj.clientX; + var y = touchObj.clientY; + if (Math.abs(startX - x) + Math.abs(startY - y) > h) + touchStartT = -1; + + startX = e.clientX = x; + startY = e.clientY = y; + vX = vY = 0; + + var ev = new MouseEvent(e, editor); + pos = ev.getDocumentPosition(); + + if (t - touchStartT < 500 && touches.length == 1 && !animationSteps) { + clickCount++; + e.preventDefault(); + e.button = 0; + switchToSelectionMode(); + } else { + clickCount = 0; + var cursor = editor.selection.cursor; + var anchor = editor.selection.isEmpty() ? cursor : editor.selection.anchor; + + var cursorPos = editor.renderer.$cursorLayer.getPixelPosition(cursor, true); + var anchorPos = editor.renderer.$cursorLayer.getPixelPosition(anchor, true); + var rect = editor.renderer.scroller.getBoundingClientRect(); + var offsetTop = editor.renderer.layerConfig.offset; + var offsetLeft = editor.renderer.scrollLeft; + var weightedDistance = function(x, y) { + x = x / w; + y = y / h - 0.75; + return x * x + y * y; + }; + + if (e.clientX < rect.left) { + mode = "zoom"; + return; + } + + var diff1 = weightedDistance( + e.clientX - rect.left - cursorPos.left + offsetLeft, + e.clientY - rect.top - cursorPos.top + offsetTop + ); + var diff2 = weightedDistance( + e.clientX - rect.left - anchorPos.left + offsetLeft, + e.clientY - rect.top - anchorPos.top + offsetTop + ); + if (diff1 < 3.5 && diff2 < 3.5) + mode = diff1 > diff2 ? "cursor" : "anchor"; + + if (diff2 < 3.5) + mode = "anchor"; + else if (diff1 < 3.5) + mode = "cursor"; + else + mode = "scroll"; + longTouchTimer = setTimeout(handleLongTap, 450); + } + touchStartT = t; + }, editor); + + event.addListener(el, "touchend", function (e) { + pressed = editor.$mouseHandler.isMousePressed = false; + if (animationTimer) clearInterval(animationTimer); + if (mode == "zoom") { + mode = ""; + animationSteps = 0; + } else if (longTouchTimer) { + editor.selection.moveToPosition(pos); + animationSteps = 0; + showContextMenu(); + } else if (mode == "scroll") { + animate(); + hideContextMenu(); + } else { + showContextMenu(); + } + clearTimeout(longTouchTimer); + longTouchTimer = null; + }, editor); + event.addListener(el, "touchmove", function (e) { + if (longTouchTimer) { + clearTimeout(longTouchTimer); + longTouchTimer = null; + } + var touches = e.touches; + if (touches.length > 1 || mode == "zoom") return; + + var touchObj = touches[0]; + + var wheelX = startX - touchObj.clientX; + var wheelY = startY - touchObj.clientY; + + if (mode == "wait") { + if (wheelX * wheelX + wheelY * wheelY > 4) + mode = "cursor"; + else + return e.preventDefault(); + } + + startX = touchObj.clientX; + startY = touchObj.clientY; + + e.clientX = touchObj.clientX; + e.clientY = touchObj.clientY; + + var t = e.timeStamp; + var dt = t - lastT; + lastT = t; + if (mode == "scroll") { + var mouseEvent = new MouseEvent(e, editor); + mouseEvent.speed = 1; + mouseEvent.wheelX = wheelX; + mouseEvent.wheelY = wheelY; + if (10 * Math.abs(wheelX) < Math.abs(wheelY)) wheelX = 0; + if (10 * Math.abs(wheelY) < Math.abs(wheelX)) wheelY = 0; + if (dt != 0) { + vX = wheelX / dt; + vY = wheelY / dt; + } + editor._emit("mousewheel", mouseEvent); + if (!mouseEvent.propagationStopped) { + vX = vY = 0; + } + } + else { + var ev = new MouseEvent(e, editor); + var pos = ev.getDocumentPosition(); + if (mode == "cursor") + editor.selection.moveCursorToPosition(pos); + else if (mode == "anchor") + editor.selection.setSelectionAnchor(pos.row, pos.column); + editor.renderer.scrollCursorIntoView(pos); + e.preventDefault(); + } + }, editor); + + function animate() { + animationSteps += 60; + animationTimer = setInterval(function() { + if (animationSteps-- <= 0) { + clearInterval(animationTimer); + animationTimer = null; + } + if (Math.abs(vX) < 0.01) vX = 0; + if (Math.abs(vY) < 0.01) vY = 0; + if (animationSteps < 20) vX = 0.9 * vX; + if (animationSteps < 20) vY = 0.9 * vY; + var oldScrollTop = editor.session.getScrollTop(); + editor.renderer.scrollBy(10 * vX, 10 * vY); + if (oldScrollTop == editor.session.getScrollTop()) + animationSteps = 0; + }, 10); + } +}; + +}); + +define("ace/lib/net",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; +var dom = require("./dom"); + +exports.get = function (url, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + callback(xhr.responseText); + } + }; + xhr.send(null); +}; + +exports.loadScript = function(path, callback) { + var head = dom.getDocumentHead(); + var s = document.createElement('script'); + + s.src = path; + head.appendChild(s); + + s.onload = s.onreadystatechange = function(_, isAbort) { + if (isAbort || !s.readyState || s.readyState == "loaded" || s.readyState == "complete") { + s = s.onload = s.onreadystatechange = null; + if (!isAbort) + callback(); + } + }; +}; +exports.qualifyURL = function(url) { + var a = document.createElement('a'); + a.href = url; + return a.href; +}; + +}); + +define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var EventEmitter = {}; +var stopPropagation = function() { this.propagationStopped = true; }; +var preventDefault = function() { this.defaultPrevented = true; }; + +EventEmitter._emit = +EventEmitter._dispatchEvent = function(eventName, e) { + this._eventRegistry || (this._eventRegistry = {}); + this._defaultHandlers || (this._defaultHandlers = {}); + + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + + if (typeof e != "object" || !e) + e = {}; + + if (!e.type) + e.type = eventName; + if (!e.stopPropagation) + e.stopPropagation = stopPropagation; + if (!e.preventDefault) + e.preventDefault = preventDefault; + + listeners = listeners.slice(); + for (var i=0; i 1) + base = parts[parts.length - 2]; + var path = options[component + "Path"]; + if (path == null) { + path = options.basePath; + } else if (sep == "/") { + component = sep = ""; + } + if (path && path.slice(-1) != "/") + path += "/"; + return path + component + sep + base + this.get("suffix"); +}; + +exports.setModuleUrl = function(name, subst) { + return options.$moduleUrls[name] = subst; +}; + +exports.$loading = {}; +exports.loadModule = function(moduleName, onLoad) { + var module, moduleType; + if (Array.isArray(moduleName)) { + moduleType = moduleName[0]; + moduleName = moduleName[1]; + } + + try { + module = require(moduleName); + } catch (e) {} + if (module && !exports.$loading[moduleName]) + return onLoad && onLoad(module); + + if (!exports.$loading[moduleName]) + exports.$loading[moduleName] = []; + + exports.$loading[moduleName].push(onLoad); + + if (exports.$loading[moduleName].length > 1) + return; + + var afterLoad = function() { + require([moduleName], function(module) { + exports._emit("load.module", {name: moduleName, module: module}); + var listeners = exports.$loading[moduleName]; + exports.$loading[moduleName] = null; + listeners.forEach(function(onLoad) { + onLoad && onLoad(module); + }); + }); + }; + + if (!exports.get("packaged")) + return afterLoad(); + + net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad); + reportErrorIfPathIsNotConfigured(); +}; + +var reportErrorIfPathIsNotConfigured = function() { + if ( + !options.basePath && !options.workerPath + && !options.modePath && !options.themePath + && !Object.keys(options.$moduleUrls).length + ) { + console.error( + "Unable to infer path to ace from script src,", + "use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes", + "or with webpack use ace/webpack-resolver" + ); + reportErrorIfPathIsNotConfigured = function() {}; + } +}; +init(true);function init(packaged) { + + if (!global || !global.document) + return; + + options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged); + + var scriptOptions = {}; + var scriptUrl = ""; + var currentScript = (document.currentScript || document._currentScript ); // native or polyfill + var currentDocument = currentScript && currentScript.ownerDocument || document; + + var scripts = currentDocument.getElementsByTagName("script"); + for (var i=0; i 0){ + if (action == 0x10){ + for(i = condPos; i < ix; i++){ + levels[i] = 1; + } + condPos = -1; + } else { + condPos = -1; + } + } + cond = impTab[newState][6]; + if (cond){ + if(condPos == -1){ + condPos = ix; + } + }else{ + if (condPos > -1){ + for(i = condPos; i < ix; i++){ + levels[i] = newLevel; + } + condPos = -1; + } + } + if (charTypes[ix] == B){ + levels[ix] = 0; + } + hiLevel |= newLevel; + } + if (hasUBAT_S){ + for(i = 0; i < len; i++){ + if(charTypes[i] == S){ + levels[i] = dir; + for(var j = i - 1; j >= 0; j--){ + if(charTypes[j] == WS){ + levels[j] = dir; + }else{ + break; + } + } + } + } + } +} + +function _invertLevel(lev, levels, _array) { + if (hiLevel < lev){ + return; + } + if (lev == 1 && dir == RTL && !hasUBAT_B){ + _array.reverse(); + return; + } + var len = _array.length, start = 0, end, lo, hi, tmp; + while(start < len){ + if (levels[start] >= lev){ + end = start + 1; + while(end < len && levels[end] >= lev){ + end++; + } + for(lo = start, hi = end - 1 ; lo < hi; lo++, hi--){ + tmp = _array[lo]; + _array[lo] = _array[hi]; + _array[hi] = tmp; + } + start = end; + } + start++; + } +} + +function _getCharClass(chars, types, classes, ix) { + var cType = types[ix], wType, nType, len, i; + switch(cType){ + case L: + case R: + lastArabic = false; + case ON: + case AN: + return cType; + case EN: + return lastArabic ? AN : EN; + case AL: + lastArabic = true; + hasUBAT_AL = true; + return R; + case WS: + return ON; + case CS: + if (ix < 1 || (ix + 1) >= types.length || + ((wType = classes[ix - 1]) != EN && wType != AN) || + ((nType = types[ix + 1]) != EN && nType != AN)){ + return ON; + } + if (lastArabic){nType = AN;} + return nType == wType ? nType : ON; + case ES: + wType = ix > 0 ? classes[ix - 1] : B; + if (wType == EN && (ix + 1) < types.length && types[ix + 1] == EN){ + return EN; + } + return ON; + case ET: + if (ix > 0 && classes[ix - 1] == EN){ + return EN; + } + if (lastArabic){ + return ON; + } + i = ix + 1; + len = types.length; + while (i < len && types[i] == ET){ + i++; + } + if (i < len && types[i] == EN){ + return EN; + } + return ON; + case NSM: + len = types.length; + i = ix + 1; + while (i < len && types[i] == NSM){ + i++; + } + if (i < len){ + var c = chars[ix], rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E; + + wType = types[i]; + if (rtlCandidate && (wType == R || wType == AL)){ + return R; + } + } + + if (ix < 1 || (wType = types[ix - 1]) == B){ + return ON; + } + return classes[ix - 1]; + case B: + lastArabic = false; + hasUBAT_B = true; + return dir; + case S: + hasUBAT_S = true; + return ON; + case LRE: + case RLE: + case LRO: + case RLO: + case PDF: + lastArabic = false; + case BN: + return ON; + } +} + +function _getCharacterType( ch ) { + var uc = ch.charCodeAt(0), hi = uc >> 8; + + if (hi == 0) { + return ((uc > 0x00BF) ? L : UnicodeTBL00[uc]); + } else if (hi == 5) { + return (/[\u0591-\u05f4]/.test(ch) ? R : L); + } else if (hi == 6) { + if (/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(ch)) + return NSM; + else if (/[\u0660-\u0669\u066b-\u066c]/.test(ch)) + return AN; + else if (uc == 0x066A) + return ET; + else if (/[\u06f0-\u06f9]/.test(ch)) + return EN; + else + return AL; + } else if (hi == 0x20 && uc <= 0x205F) { + return UnicodeTBL20[uc & 0xFF]; + } else if (hi == 0xFE) { + return (uc >= 0xFE70 ? AL : ON); + } + return ON; +} + +function _isArabicDiacritics( ch ) { + return (ch >= '\u064b' && ch <= '\u0655'); +} +exports.L = L; +exports.R = R; +exports.EN = EN; +exports.ON_R = 3; +exports.AN = 4; +exports.R_H = 5; +exports.B = 6; +exports.RLE = 7; + +exports.DOT = "\xB7"; +exports.doBidiReorder = function(text, textCharTypes, isRtl) { + if (text.length < 2) + return {}; + + var chars = text.split(""), logicalFromVisual = new Array(chars.length), + bidiLevels = new Array(chars.length), levels = []; + + dir = isRtl ? RTL : LTR; + + _computeLevels(chars, levels, chars.length, textCharTypes); + + for (var i = 0; i < logicalFromVisual.length; logicalFromVisual[i] = i, i++); + + _invertLevel(2, levels, logicalFromVisual); + _invertLevel(1, levels, logicalFromVisual); + + for (var i = 0; i < logicalFromVisual.length - 1; i++) { //fix levels to reflect character width + if (textCharTypes[i] === AN) { + levels[i] = exports.AN; + } else if (levels[i] === R && ((textCharTypes[i] > AL && textCharTypes[i] < LRE) + || textCharTypes[i] === ON || textCharTypes[i] === BN)) { + levels[i] = exports.ON_R; + } else if ((i > 0 && chars[i - 1] === '\u0644') && /\u0622|\u0623|\u0625|\u0627/.test(chars[i])) { + levels[i - 1] = levels[i] = exports.R_H; + i++; + } + } + if (chars[chars.length - 1] === exports.DOT) + levels[chars.length - 1] = exports.B; + + if (chars[0] === '\u202B') + levels[0] = exports.RLE; + + for (var i = 0; i < logicalFromVisual.length; i++) { + bidiLevels[i] = levels[logicalFromVisual[i]]; + } + + return {'logicalFromVisual': logicalFromVisual, 'bidiLevels': bidiLevels}; +}; +exports.hasBidiCharacters = function(text, textCharTypes){ + var ret = false; + for (var i = 0; i < text.length; i++){ + textCharTypes[i] = _getCharacterType(text.charAt(i)); + if (!ret && (textCharTypes[i] == R || textCharTypes[i] == AL || textCharTypes[i] == AN)) + ret = true; + } + return ret; +}; +exports.getVisualFromLogicalIdx = function(logIdx, rowMap) { + for (var i = 0; i < rowMap.logicalFromVisual.length; i++) { + if (rowMap.logicalFromVisual[i] == logIdx) + return i; + } + return 0; +}; + +}); + +define("ace/bidihandler",["require","exports","module","ace/lib/bidiutil","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var bidiUtil = require("./lib/bidiutil"); +var lang = require("./lib/lang"); +var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\u202B]/; +var BidiHandler = function(session) { + this.session = session; + this.bidiMap = {}; + this.currentRow = null; + this.bidiUtil = bidiUtil; + this.charWidths = []; + this.EOL = "\xAC"; + this.showInvisibles = true; + this.isRtlDir = false; + this.$isRtl = false; + this.line = ""; + this.wrapIndent = 0; + this.EOF = "\xB6"; + this.RLE = "\u202B"; + this.contentWidth = 0; + this.fontMetrics = null; + this.rtlLineOffset = 0; + this.wrapOffset = 0; + this.isMoveLeftOperation = false; + this.seenBidi = bidiRE.test(session.getValue()); +}; + +(function() { + this.isBidiRow = function(screenRow, docRow, splitIndex) { + if (!this.seenBidi) + return false; + if (screenRow !== this.currentRow) { + this.currentRow = screenRow; + this.updateRowLine(docRow, splitIndex); + this.updateBidiMap(); + } + return this.bidiMap.bidiLevels; + }; + + this.onChange = function(delta) { + if (!this.seenBidi) { + if (delta.action == "insert" && bidiRE.test(delta.lines.join("\n"))) { + this.seenBidi = true; + this.currentRow = null; + } + } + else { + this.currentRow = null; + } + }; + + this.getDocumentRow = function() { + var docRow = 0; + var rowCache = this.session.$screenRowCache; + if (rowCache.length) { + var index = this.session.$getRowCacheIndex(rowCache, this.currentRow); + if (index >= 0) + docRow = this.session.$docRowCache[index]; + } + + return docRow; + }; + + this.getSplitIndex = function() { + var splitIndex = 0; + var rowCache = this.session.$screenRowCache; + if (rowCache.length) { + var currentIndex, prevIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow); + while (this.currentRow - splitIndex > 0) { + currentIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow - splitIndex - 1); + if (currentIndex !== prevIndex) + break; + + prevIndex = currentIndex; + splitIndex++; + } + } else { + splitIndex = this.currentRow; + } + + return splitIndex; + }; + + this.updateRowLine = function(docRow, splitIndex) { + if (docRow === undefined) + docRow = this.getDocumentRow(); + + var isLastRow = (docRow === this.session.getLength() - 1), + endOfLine = isLastRow ? this.EOF : this.EOL; + + this.wrapIndent = 0; + this.line = this.session.getLine(docRow); + this.isRtlDir = this.$isRtl || this.line.charAt(0) === this.RLE; + if (this.session.$useWrapMode) { + var splits = this.session.$wrapData[docRow]; + if (splits) { + if (splitIndex === undefined) + splitIndex = this.getSplitIndex(); + + if(splitIndex > 0 && splits.length) { + this.wrapIndent = splits.indent; + this.wrapOffset = this.wrapIndent * this.charWidths[bidiUtil.L]; + this.line = (splitIndex < splits.length) ? + this.line.substring(splits[splitIndex - 1], splits[splitIndex]) : + this.line.substring(splits[splits.length - 1]); + } else { + this.line = this.line.substring(0, splits[splitIndex]); + } + } + if (splitIndex == splits.length) + this.line += (this.showInvisibles) ? endOfLine : bidiUtil.DOT; + } else { + this.line += this.showInvisibles ? endOfLine : bidiUtil.DOT; + } + var session = this.session, shift = 0, size; + this.line = this.line.replace(/\t|[\u1100-\u2029, \u202F-\uFFE6]/g, function(ch, i){ + if (ch === '\t' || session.isFullWidth(ch.charCodeAt(0))) { + size = (ch === '\t') ? session.getScreenTabSize(i + shift) : 2; + shift += size - 1; + return lang.stringRepeat(bidiUtil.DOT, size); + } + return ch; + }); + + if (this.isRtlDir) { + this.fontMetrics.$main.textContent = (this.line.charAt(this.line.length - 1) == bidiUtil.DOT) ? this.line.substr(0, this.line.length - 1) : this.line; + this.rtlLineOffset = this.contentWidth - this.fontMetrics.$main.getBoundingClientRect().width; + } + }; + + this.updateBidiMap = function() { + var textCharTypes = []; + if (bidiUtil.hasBidiCharacters(this.line, textCharTypes) || this.isRtlDir) { + this.bidiMap = bidiUtil.doBidiReorder(this.line, textCharTypes, this.isRtlDir); + } else { + this.bidiMap = {}; + } + }; + this.markAsDirty = function() { + this.currentRow = null; + }; + this.updateCharacterWidths = function(fontMetrics) { + if (this.characterWidth === fontMetrics.$characterSize.width) + return; + + this.fontMetrics = fontMetrics; + var characterWidth = this.characterWidth = fontMetrics.$characterSize.width; + var bidiCharWidth = fontMetrics.$measureCharWidth("\u05d4"); + + this.charWidths[bidiUtil.L] = this.charWidths[bidiUtil.EN] = this.charWidths[bidiUtil.ON_R] = characterWidth; + this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] = bidiCharWidth; + this.charWidths[bidiUtil.R_H] = bidiCharWidth * 0.45; + this.charWidths[bidiUtil.B] = this.charWidths[bidiUtil.RLE] = 0; + + this.currentRow = null; + }; + + this.setShowInvisibles = function(showInvisibles) { + this.showInvisibles = showInvisibles; + this.currentRow = null; + }; + + this.setEolChar = function(eolChar) { + this.EOL = eolChar; + }; + + this.setContentWidth = function(width) { + this.contentWidth = width; + }; + + this.isRtlLine = function(row) { + if (this.$isRtl) return true; + if (row != undefined) + return (this.session.getLine(row).charAt(0) == this.RLE); + else + return this.isRtlDir; + }; + + this.setRtlDirection = function(editor, isRtlDir) { + var cursor = editor.getCursorPosition(); + for (var row = editor.selection.getSelectionAnchor().row; row <= cursor.row; row++) { + if (!isRtlDir && editor.session.getLine(row).charAt(0) === editor.session.$bidiHandler.RLE) + editor.session.doc.removeInLine(row, 0, 1); + else if (isRtlDir && editor.session.getLine(row).charAt(0) !== editor.session.$bidiHandler.RLE) + editor.session.doc.insert({column: 0, row: row}, editor.session.$bidiHandler.RLE); + } + }; + this.getPosLeft = function(col) { + col -= this.wrapIndent; + var leftBoundary = (this.line.charAt(0) === this.RLE) ? 1 : 0; + var logicalIdx = (col > leftBoundary) ? (this.session.getOverwrite() ? col : col - 1) : leftBoundary; + var visualIdx = bidiUtil.getVisualFromLogicalIdx(logicalIdx, this.bidiMap), + levels = this.bidiMap.bidiLevels, left = 0; + + if (!this.session.getOverwrite() && col <= leftBoundary && levels[visualIdx] % 2 !== 0) + visualIdx++; + + for (var i = 0; i < visualIdx; i++) { + left += this.charWidths[levels[i]]; + } + + if (!this.session.getOverwrite() && (col > leftBoundary) && (levels[visualIdx] % 2 === 0)) + left += this.charWidths[levels[visualIdx]]; + + if (this.wrapIndent) + left += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; + + if (this.isRtlDir) + left += this.rtlLineOffset; + + return left; + }; + this.getSelections = function(startCol, endCol) { + var map = this.bidiMap, levels = map.bidiLevels, level, selections = [], offset = 0, + selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent, + isSelected = false, isSelectedPrev = false, selectionStart = 0; + + if (this.wrapIndent) + offset += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; + + for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) { + logIdx = map.logicalFromVisual[visIdx]; + level = levels[visIdx]; + isSelected = (logIdx >= selColMin) && (logIdx < selColMax); + if (isSelected && !isSelectedPrev) { + selectionStart = offset; + } else if (!isSelected && isSelectedPrev) { + selections.push({left: selectionStart, width: offset - selectionStart}); + } + offset += this.charWidths[level]; + isSelectedPrev = isSelected; + } + + if (isSelected && (visIdx === levels.length)) { + selections.push({left: selectionStart, width: offset - selectionStart}); + } + + if(this.isRtlDir) { + for (var i = 0; i < selections.length; i++) { + selections[i].left += this.rtlLineOffset; + } + } + return selections; + }; + this.offsetToCol = function(posX) { + if(this.isRtlDir) + posX -= this.rtlLineOffset; + + var logicalIdx = 0, posX = Math.max(posX, 0), + offset = 0, visualIdx = 0, levels = this.bidiMap.bidiLevels, + charWidth = this.charWidths[levels[visualIdx]]; + + if (this.wrapIndent) + posX -= this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; + + while(posX > offset + charWidth/2) { + offset += charWidth; + if(visualIdx === levels.length - 1) { + charWidth = 0; + break; + } + charWidth = this.charWidths[levels[++visualIdx]]; + } + + if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && (levels[visualIdx] % 2 === 0)){ + if(posX < offset) + visualIdx--; + logicalIdx = this.bidiMap.logicalFromVisual[visualIdx]; + + } else if (visualIdx > 0 && (levels[visualIdx - 1] % 2 === 0) && (levels[visualIdx] % 2 !== 0)){ + logicalIdx = 1 + ((posX > offset) ? this.bidiMap.logicalFromVisual[visualIdx] + : this.bidiMap.logicalFromVisual[visualIdx - 1]); + + } else if ((this.isRtlDir && visualIdx === levels.length - 1 && charWidth === 0 && (levels[visualIdx - 1] % 2 === 0)) + || (!this.isRtlDir && visualIdx === 0 && (levels[visualIdx] % 2 !== 0))){ + logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx]; + } else { + if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && charWidth !== 0) + visualIdx--; + logicalIdx = this.bidiMap.logicalFromVisual[visualIdx]; + } + + if (logicalIdx === 0 && this.isRtlDir) + logicalIdx++; + + return (logicalIdx + this.wrapIndent); + }; + +}).call(BidiHandler.prototype); + +exports.BidiHandler = BidiHandler; +}); + +define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Selection = function(session) { + this.session = session; + this.doc = session.getDocument(); + + this.clearSelection(); + this.cursor = this.lead = this.doc.createAnchor(0, 0); + this.anchor = this.doc.createAnchor(0, 0); + this.$silent = false; + + var self = this; + this.cursor.on("change", function(e) { + self.$cursorChanged = true; + if (!self.$silent) + self._emit("changeCursor"); + if (!self.$isEmpty && !self.$silent) + self._emit("changeSelection"); + if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column) + self.$desiredColumn = null; + }); + + this.anchor.on("change", function() { + self.$anchorChanged = true; + if (!self.$isEmpty && !self.$silent) + self._emit("changeSelection"); + }); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.isEmpty = function() { + return this.$isEmpty || ( + this.anchor.row == this.lead.row && + this.anchor.column == this.lead.column + ); + }; + this.isMultiLine = function() { + return !this.$isEmpty && this.anchor.row != this.cursor.row; + }; + this.getCursor = function() { + return this.lead.getPosition(); + }; + this.setSelectionAnchor = function(row, column) { + this.$isEmpty = false; + this.anchor.setPosition(row, column); + }; + this.getAnchor = + this.getSelectionAnchor = function() { + if (this.$isEmpty) + return this.getSelectionLead(); + + return this.anchor.getPosition(); + }; + this.getSelectionLead = function() { + return this.lead.getPosition(); + }; + this.isBackwards = function() { + var anchor = this.anchor; + var lead = this.lead; + return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); + }; + this.getRange = function() { + var anchor = this.anchor; + var lead = this.lead; + + if (this.$isEmpty) + return Range.fromPoints(lead, lead); + + return this.isBackwards() + ? Range.fromPoints(lead, anchor) + : Range.fromPoints(anchor, lead); + }; + this.clearSelection = function() { + if (!this.$isEmpty) { + this.$isEmpty = true; + this._emit("changeSelection"); + } + }; + this.selectAll = function() { + this.$setSelection(0, 0, Number.MAX_VALUE, Number.MAX_VALUE); + }; + this.setRange = + this.setSelectionRange = function(range, reverse) { + var start = reverse ? range.end : range.start; + var end = reverse ? range.start : range.end; + this.$setSelection(start.row, start.column, end.row, end.column); + }; + + this.$setSelection = function(anchorRow, anchorColumn, cursorRow, cursorColumn) { + if (this.$silent) + return; + var wasEmpty = this.$isEmpty; + var wasMultiselect = this.inMultiSelectMode; + this.$silent = true; + this.$cursorChanged = this.$anchorChanged = false; + this.anchor.setPosition(anchorRow, anchorColumn); + this.cursor.setPosition(cursorRow, cursorColumn); + this.$isEmpty = !Range.comparePoints(this.anchor, this.cursor); + this.$silent = false; + if (this.$cursorChanged) + this._emit("changeCursor"); + if (this.$cursorChanged || this.$anchorChanged || wasEmpty != this.$isEmpty || wasMultiselect) + this._emit("changeSelection"); + }; + + this.$moveSelection = function(mover) { + var lead = this.lead; + if (this.$isEmpty) + this.setSelectionAnchor(lead.row, lead.column); + + mover.call(this); + }; + this.selectTo = function(row, column) { + this.$moveSelection(function() { + this.moveCursorTo(row, column); + }); + }; + this.selectToPosition = function(pos) { + this.$moveSelection(function() { + this.moveCursorToPosition(pos); + }); + }; + this.moveTo = function(row, column) { + this.clearSelection(); + this.moveCursorTo(row, column); + }; + this.moveToPosition = function(pos) { + this.clearSelection(); + this.moveCursorToPosition(pos); + }; + this.selectUp = function() { + this.$moveSelection(this.moveCursorUp); + }; + this.selectDown = function() { + this.$moveSelection(this.moveCursorDown); + }; + this.selectRight = function() { + this.$moveSelection(this.moveCursorRight); + }; + this.selectLeft = function() { + this.$moveSelection(this.moveCursorLeft); + }; + this.selectLineStart = function() { + this.$moveSelection(this.moveCursorLineStart); + }; + this.selectLineEnd = function() { + this.$moveSelection(this.moveCursorLineEnd); + }; + this.selectFileEnd = function() { + this.$moveSelection(this.moveCursorFileEnd); + }; + this.selectFileStart = function() { + this.$moveSelection(this.moveCursorFileStart); + }; + this.selectWordRight = function() { + this.$moveSelection(this.moveCursorWordRight); + }; + this.selectWordLeft = function() { + this.$moveSelection(this.moveCursorWordLeft); + }; + this.getWordRange = function(row, column) { + if (typeof column == "undefined") { + var cursor = row || this.lead; + row = cursor.row; + column = cursor.column; + } + return this.session.getWordRange(row, column); + }; + this.selectWord = function() { + this.setSelectionRange(this.getWordRange()); + }; + this.selectAWord = function() { + var cursor = this.getCursor(); + var range = this.session.getAWordRange(cursor.row, cursor.column); + this.setSelectionRange(range); + }; + + this.getLineRange = function(row, excludeLastChar) { + var rowStart = typeof row == "number" ? row : this.lead.row; + var rowEnd; + + var foldLine = this.session.getFoldLine(rowStart); + if (foldLine) { + rowStart = foldLine.start.row; + rowEnd = foldLine.end.row; + } else { + rowEnd = rowStart; + } + if (excludeLastChar === true) + return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length); + else + return new Range(rowStart, 0, rowEnd + 1, 0); + }; + this.selectLine = function() { + this.setSelectionRange(this.getLineRange()); + }; + this.moveCursorUp = function() { + this.moveCursorBy(-1, 0); + }; + this.moveCursorDown = function() { + this.moveCursorBy(1, 0); + }; + this.wouldMoveIntoSoftTab = function(cursor, tabSize, direction) { + var start = cursor.column; + var end = cursor.column + tabSize; + + if (direction < 0) { + start = cursor.column - tabSize; + end = cursor.column; + } + return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(" ").length-1 == tabSize; + }; + this.moveCursorLeft = function() { + var cursor = this.lead.getPosition(), + fold; + + if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) { + this.moveCursorTo(fold.start.row, fold.start.column); + } else if (cursor.column === 0) { + if (cursor.row > 0) { + this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length); + } + } + else { + var tabSize = this.session.getTabSize(); + if (this.wouldMoveIntoSoftTab(cursor, tabSize, -1) && !this.session.getNavigateWithinSoftTabs()) { + this.moveCursorBy(0, -tabSize); + } else { + this.moveCursorBy(0, -1); + } + } + }; + this.moveCursorRight = function() { + var cursor = this.lead.getPosition(), + fold; + if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) { + this.moveCursorTo(fold.end.row, fold.end.column); + } + else if (this.lead.column == this.doc.getLine(this.lead.row).length) { + if (this.lead.row < this.doc.getLength() - 1) { + this.moveCursorTo(this.lead.row + 1, 0); + } + } + else { + var tabSize = this.session.getTabSize(); + var cursor = this.lead; + if (this.wouldMoveIntoSoftTab(cursor, tabSize, 1) && !this.session.getNavigateWithinSoftTabs()) { + this.moveCursorBy(0, tabSize); + } else { + this.moveCursorBy(0, 1); + } + } + }; + this.moveCursorLineStart = function() { + var row = this.lead.row; + var column = this.lead.column; + var screenRow = this.session.documentToScreenRow(row, column); + var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0); + var beforeCursor = this.session.getDisplayLine( + row, null, firstColumnPosition.row, + firstColumnPosition.column + ); + + var leadingSpace = beforeCursor.match(/^\s*/); + if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart) + firstColumnPosition.column += leadingSpace[0].length; + this.moveCursorToPosition(firstColumnPosition); + }; + this.moveCursorLineEnd = function() { + var lead = this.lead; + var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column); + if (this.lead.column == lineEnd.column) { + var line = this.session.getLine(lineEnd.row); + if (lineEnd.column == line.length) { + var textEnd = line.search(/\s+$/); + if (textEnd > 0) + lineEnd.column = textEnd; + } + } + + this.moveCursorTo(lineEnd.row, lineEnd.column); + }; + this.moveCursorFileEnd = function() { + var row = this.doc.getLength() - 1; + var column = this.doc.getLine(row).length; + this.moveCursorTo(row, column); + }; + this.moveCursorFileStart = function() { + this.moveCursorTo(0, 0); + }; + this.moveCursorLongWordRight = function() { + var row = this.lead.row; + var column = this.lead.column; + var line = this.doc.getLine(row); + var rightOfCursor = line.substring(column); + + this.session.nonTokenRe.lastIndex = 0; + this.session.tokenRe.lastIndex = 0; + var fold = this.session.getFoldAt(row, column, 1); + if (fold) { + this.moveCursorTo(fold.end.row, fold.end.column); + return; + } + if (this.session.nonTokenRe.exec(rightOfCursor)) { + column += this.session.nonTokenRe.lastIndex; + this.session.nonTokenRe.lastIndex = 0; + rightOfCursor = line.substring(column); + } + if (column >= line.length) { + this.moveCursorTo(row, line.length); + this.moveCursorRight(); + if (row < this.doc.getLength() - 1) + this.moveCursorWordRight(); + return; + } + if (this.session.tokenRe.exec(rightOfCursor)) { + column += this.session.tokenRe.lastIndex; + this.session.tokenRe.lastIndex = 0; + } + + this.moveCursorTo(row, column); + }; + this.moveCursorLongWordLeft = function() { + var row = this.lead.row; + var column = this.lead.column; + var fold; + if (fold = this.session.getFoldAt(row, column, -1)) { + this.moveCursorTo(fold.start.row, fold.start.column); + return; + } + + var str = this.session.getFoldStringAt(row, column, -1); + if (str == null) { + str = this.doc.getLine(row).substring(0, column); + } + + var leftOfCursor = lang.stringReverse(str); + this.session.nonTokenRe.lastIndex = 0; + this.session.tokenRe.lastIndex = 0; + if (this.session.nonTokenRe.exec(leftOfCursor)) { + column -= this.session.nonTokenRe.lastIndex; + leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex); + this.session.nonTokenRe.lastIndex = 0; + } + if (column <= 0) { + this.moveCursorTo(row, 0); + this.moveCursorLeft(); + if (row > 0) + this.moveCursorWordLeft(); + return; + } + if (this.session.tokenRe.exec(leftOfCursor)) { + column -= this.session.tokenRe.lastIndex; + this.session.tokenRe.lastIndex = 0; + } + + this.moveCursorTo(row, column); + }; + + this.$shortWordEndIndex = function(rightOfCursor) { + var index = 0, ch; + var whitespaceRe = /\s/; + var tokenRe = this.session.tokenRe; + + tokenRe.lastIndex = 0; + if (this.session.tokenRe.exec(rightOfCursor)) { + index = this.session.tokenRe.lastIndex; + } else { + while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) + index ++; + + if (index < 1) { + tokenRe.lastIndex = 0; + while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) { + tokenRe.lastIndex = 0; + index ++; + if (whitespaceRe.test(ch)) { + if (index > 2) { + index--; + break; + } else { + while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) + index ++; + if (index > 2) + break; + } + } + } + } + } + tokenRe.lastIndex = 0; + + return index; + }; + + this.moveCursorShortWordRight = function() { + var row = this.lead.row; + var column = this.lead.column; + var line = this.doc.getLine(row); + var rightOfCursor = line.substring(column); + + var fold = this.session.getFoldAt(row, column, 1); + if (fold) + return this.moveCursorTo(fold.end.row, fold.end.column); + + if (column == line.length) { + var l = this.doc.getLength(); + do { + row++; + rightOfCursor = this.doc.getLine(row); + } while (row < l && /^\s*$/.test(rightOfCursor)); + + if (!/^\s+/.test(rightOfCursor)) + rightOfCursor = ""; + column = 0; + } + + var index = this.$shortWordEndIndex(rightOfCursor); + + this.moveCursorTo(row, column + index); + }; + + this.moveCursorShortWordLeft = function() { + var row = this.lead.row; + var column = this.lead.column; + + var fold; + if (fold = this.session.getFoldAt(row, column, -1)) + return this.moveCursorTo(fold.start.row, fold.start.column); + + var line = this.session.getLine(row).substring(0, column); + if (column === 0) { + do { + row--; + line = this.doc.getLine(row); + } while (row > 0 && /^\s*$/.test(line)); + + column = line.length; + if (!/\s+$/.test(line)) + line = ""; + } + + var leftOfCursor = lang.stringReverse(line); + var index = this.$shortWordEndIndex(leftOfCursor); + + return this.moveCursorTo(row, column - index); + }; + + this.moveCursorWordRight = function() { + if (this.session.$selectLongWords) + this.moveCursorLongWordRight(); + else + this.moveCursorShortWordRight(); + }; + + this.moveCursorWordLeft = function() { + if (this.session.$selectLongWords) + this.moveCursorLongWordLeft(); + else + this.moveCursorShortWordLeft(); + }; + this.moveCursorBy = function(rows, chars) { + var screenPos = this.session.documentToScreenPosition( + this.lead.row, + this.lead.column + ); + + var offsetX; + + if (chars === 0) { + if (rows !== 0) { + if (this.session.$bidiHandler.isBidiRow(screenPos.row, this.lead.row)) { + offsetX = this.session.$bidiHandler.getPosLeft(screenPos.column); + screenPos.column = Math.round(offsetX / this.session.$bidiHandler.charWidths[0]); + } else { + offsetX = screenPos.column * this.session.$bidiHandler.charWidths[0]; + } + } + + if (this.$desiredColumn) + screenPos.column = this.$desiredColumn; + else + this.$desiredColumn = screenPos.column; + } + + if (rows != 0 && this.session.lineWidgets && this.session.lineWidgets[this.lead.row]) { + var widget = this.session.lineWidgets[this.lead.row]; + if (rows < 0) + rows -= widget.rowsAbove || 0; + else if (rows > 0) + rows += widget.rowCount - (widget.rowsAbove || 0); + } + + var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column, offsetX); + + if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) { + + } + this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0); + }; + this.moveCursorToPosition = function(position) { + this.moveCursorTo(position.row, position.column); + }; + this.moveCursorTo = function(row, column, keepDesiredColumn) { + var fold = this.session.getFoldAt(row, column, 1); + if (fold) { + row = fold.start.row; + column = fold.start.column; + } + + this.$keepDesiredColumnOnChange = true; + var line = this.session.getLine(row); + if (/[\uDC00-\uDFFF]/.test(line.charAt(column)) && line.charAt(column - 1)) { + if (this.lead.row == row && this.lead.column == column + 1) + column = column - 1; + else + column = column + 1; + } + this.lead.setPosition(row, column); + this.$keepDesiredColumnOnChange = false; + + if (!keepDesiredColumn) + this.$desiredColumn = null; + }; + this.moveCursorToScreen = function(row, column, keepDesiredColumn) { + var pos = this.session.screenToDocumentPosition(row, column); + this.moveCursorTo(pos.row, pos.column, keepDesiredColumn); + }; + this.detach = function() { + this.lead.detach(); + this.anchor.detach(); + }; + + this.fromOrientedRange = function(range) { + this.setSelectionRange(range, range.cursor == range.start); + this.$desiredColumn = range.desiredColumn || this.$desiredColumn; + }; + + this.toOrientedRange = function(range) { + var r = this.getRange(); + if (range) { + range.start.column = r.start.column; + range.start.row = r.start.row; + range.end.column = r.end.column; + range.end.row = r.end.row; + } else { + range = r; + } + + range.cursor = this.isBackwards() ? range.start : range.end; + range.desiredColumn = this.$desiredColumn; + return range; + }; + this.getRangeOfMovements = function(func) { + var start = this.getCursor(); + try { + func(this); + var end = this.getCursor(); + return Range.fromPoints(start, end); + } catch(e) { + return Range.fromPoints(start, start); + } finally { + this.moveCursorToPosition(start); + } + }; + + this.toJSON = function() { + if (this.rangeCount) { + var data = this.ranges.map(function(r) { + var r1 = r.clone(); + r1.isBackwards = r.cursor == r.start; + return r1; + }); + } else { + var data = this.getRange(); + data.isBackwards = this.isBackwards(); + } + return data; + }; + + this.fromJSON = function(data) { + if (data.start == undefined) { + if (this.rangeList && data.length > 1) { + this.toSingleRange(data[0]); + for (var i = data.length; i--; ) { + var r = Range.fromPoints(data[i].start, data[i].end); + if (data[i].isBackwards) + r.cursor = r.start; + this.addRange(r, true); + } + return; + } else { + data = data[0]; + } + } + if (this.rangeList) + this.toSingleRange(data); + this.setSelectionRange(data, data.isBackwards); + }; + + this.isEqual = function(data) { + if ((data.length || this.rangeCount) && data.length != this.rangeCount) + return false; + if (!data.length || !this.ranges) + return this.getRange().isEqual(data); + + for (var i = this.ranges.length; i--; ) { + if (!this.ranges[i].isEqual(data[i])) + return false; + } + return true; + }; + +}).call(Selection.prototype); + +exports.Selection = Selection; +}); + +define("ace/tokenizer",["require","exports","module","ace/config"], function(require, exports, module) { +"use strict"; + +var config = require("./config"); +var MAX_TOKEN_COUNT = 2000; +var Tokenizer = function(rules) { + this.states = rules; + + this.regExps = {}; + this.matchMappings = {}; + for (var key in this.states) { + var state = this.states[key]; + var ruleRegExps = []; + var matchTotal = 0; + var mapping = this.matchMappings[key] = {defaultToken: "text"}; + var flag = "g"; + + var splitterRurles = []; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.defaultToken) + mapping.defaultToken = rule.defaultToken; + if (rule.caseInsensitive && flag.indexOf("i") === -1) + flag += "i"; + if (rule.unicode && flag.indexOf("u") === -1) + flag += "u"; + if (rule.regex == null) + continue; + + if (rule.regex instanceof RegExp) + rule.regex = rule.regex.toString().slice(1, -1); + var adjustedregex = rule.regex; + var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2; + if (Array.isArray(rule.token)) { + if (rule.token.length == 1 || matchcount == 1) { + rule.token = rule.token[0]; + } else if (matchcount - 1 != rule.token.length) { + this.reportError("number of classes and regexp groups doesn't match", { + rule: rule, + groupCount: matchcount - 1 + }); + rule.token = rule.token[0]; + } else { + rule.tokenArray = rule.token; + rule.token = null; + rule.onMatch = this.$arrayTokens; + } + } else if (typeof rule.token == "function" && !rule.onMatch) { + if (matchcount > 1) + rule.onMatch = this.$applyToken; + else + rule.onMatch = rule.token; + } + + if (matchcount > 1) { + if (/\\\d/.test(rule.regex)) { + adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function(match, digit) { + return "\\" + (parseInt(digit, 10) + matchTotal + 1); + }); + } else { + matchcount = 1; + adjustedregex = this.removeCapturingGroups(rule.regex); + } + if (!rule.splitRegex && typeof rule.token != "string") + splitterRurles.push(rule); // flag will be known only at the very end + } + + mapping[matchTotal] = i; + matchTotal += matchcount; + + ruleRegExps.push(adjustedregex); + if (!rule.onMatch) + rule.onMatch = null; + } + + if (!ruleRegExps.length) { + mapping[0] = 0; + ruleRegExps.push("$"); + } + + splitterRurles.forEach(function(rule) { + rule.splitRegex = this.createSplitterRegexp(rule.regex, flag); + }, this); + + this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag); + } +}; + +(function() { + this.$setMaxTokenCount = function(m) { + MAX_TOKEN_COUNT = m | 0; + }; + + this.$applyToken = function(str) { + var values = this.splitRegex.exec(str).slice(1); + var types = this.token.apply(this, values); + if (typeof types === "string") + return [{type: types, value: str}]; + + var tokens = []; + for (var i = 0, l = types.length; i < l; i++) { + if (values[i]) + tokens[tokens.length] = { + type: types[i], + value: values[i] + }; + } + return tokens; + }; + + this.$arrayTokens = function(str) { + if (!str) + return []; + var values = this.splitRegex.exec(str); + if (!values) + return "text"; + var tokens = []; + var types = this.tokenArray; + for (var i = 0, l = types.length; i < l; i++) { + if (values[i + 1]) + tokens[tokens.length] = { + type: types[i], + value: values[i + 1] + }; + } + return tokens; + }; + + this.removeCapturingGroups = function(src) { + var r = src.replace( + /\\.|\[(?:\\.|[^\\\]])*|\(\?[:=!<]|(\()/g, + function(x, y) {return y ? "(?:" : x;} + ); + return r; + }; + + this.createSplitterRegexp = function(src, flag) { + if (src.indexOf("(?=") != -1) { + var stack = 0; + var inChClass = false; + var lastCapture = {}; + src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function( + m, esc, parenOpen, parenClose, square, index + ) { + if (inChClass) { + inChClass = square != "]"; + } else if (square) { + inChClass = true; + } else if (parenClose) { + if (stack == lastCapture.stack) { + lastCapture.end = index+1; + lastCapture.stack = -1; + } + stack--; + } else if (parenOpen) { + stack++; + if (parenOpen.length != 1) { + lastCapture.stack = stack; + lastCapture.start = index; + } + } + return m; + }); + + if (lastCapture.end != null && /^\)*$/.test(src.substr(lastCapture.end))) + src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end); + } + if (src.charAt(0) != "^") src = "^" + src; + if (src.charAt(src.length - 1) != "$") src += "$"; + + return new RegExp(src, (flag||"").replace("g", "")); + }; + this.getLineTokens = function(line, startState) { + if (startState && typeof startState != "string") { + var stack = startState.slice(0); + startState = stack[0]; + if (startState === "#tmp") { + stack.shift(); + startState = stack.shift(); + } + } else + var stack = []; + + var currentState = startState || "start"; + var state = this.states[currentState]; + if (!state) { + currentState = "start"; + state = this.states[currentState]; + } + var mapping = this.matchMappings[currentState]; + var re = this.regExps[currentState]; + re.lastIndex = 0; + + var match, tokens = []; + var lastIndex = 0; + var matchAttempts = 0; + + var token = {type: null, value: ""}; + + while (match = re.exec(line)) { + var type = mapping.defaultToken; + var rule = null; + var value = match[0]; + var index = re.lastIndex; + + if (index - value.length > lastIndex) { + var skipped = line.substring(lastIndex, index - value.length); + if (token.type == type) { + token.value += skipped; + } else { + if (token.type) + tokens.push(token); + token = {type: type, value: skipped}; + } + } + + for (var i = 0; i < match.length-2; i++) { + if (match[i + 1] === undefined) + continue; + + rule = state[mapping[i]]; + + if (rule.onMatch) + type = rule.onMatch(value, currentState, stack, line); + else + type = rule.token; + + if (rule.next) { + if (typeof rule.next == "string") { + currentState = rule.next; + } else { + currentState = rule.next(currentState, stack); + } + + state = this.states[currentState]; + if (!state) { + this.reportError("state doesn't exist", currentState); + currentState = "start"; + state = this.states[currentState]; + } + mapping = this.matchMappings[currentState]; + lastIndex = index; + re = this.regExps[currentState]; + re.lastIndex = index; + } + if (rule.consumeLineEnd) + lastIndex = index; + break; + } + + if (value) { + if (typeof type === "string") { + if ((!rule || rule.merge !== false) && token.type === type) { + token.value += value; + } else { + if (token.type) + tokens.push(token); + token = {type: type, value: value}; + } + } else if (type) { + if (token.type) + tokens.push(token); + token = {type: null, value: ""}; + for (var i = 0; i < type.length; i++) + tokens.push(type[i]); + } + } + + if (lastIndex == line.length) + break; + + lastIndex = index; + + if (matchAttempts++ > MAX_TOKEN_COUNT) { + if (matchAttempts > 2 * line.length) { + this.reportError("infinite loop with in ace tokenizer", { + startState: startState, + line: line + }); + } + while (lastIndex < line.length) { + if (token.type) + tokens.push(token); + token = { + value: line.substring(lastIndex, lastIndex += 500), + type: "overflow" + }; + } + currentState = "start"; + stack = []; + break; + } + } + + if (token.type) + tokens.push(token); + + if (stack.length > 1) { + if (stack[0] !== currentState) + stack.unshift("#tmp", currentState); + } + return { + tokens : tokens, + state : stack.length ? stack : currentState + }; + }; + + this.reportError = config.reportError; + +}).call(Tokenizer.prototype); + +exports.Tokenizer = Tokenizer; +}); + +define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var lang = require("../lib/lang"); + +var TextHighlightRules = function() { + + this.$rules = { + "start" : [{ + token : "empty_line", + regex : '^$' + }, { + defaultToken : "text" + }] + }; +}; + +(function() { + + this.addRules = function(rules, prefix) { + if (!prefix) { + for (var key in rules) + this.$rules[key] = rules[key]; + return; + } + for (var key in rules) { + var state = rules[key]; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.next || rule.onMatch) { + if (typeof rule.next == "string") { + if (rule.next.indexOf(prefix) !== 0) + rule.next = prefix + rule.next; + } + if (rule.nextState && rule.nextState.indexOf(prefix) !== 0) + rule.nextState = prefix + rule.nextState; + } + } + this.$rules[prefix + key] = state; + } + }; + + this.getRules = function() { + return this.$rules; + }; + + this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) { + var embedRules = typeof HighlightRules == "function" + ? new HighlightRules().getRules() + : HighlightRules; + if (states) { + for (var i = 0; i < states.length; i++) + states[i] = prefix + states[i]; + } else { + states = []; + for (var key in embedRules) + states.push(prefix + key); + } + + this.addRules(embedRules, prefix); + + if (escapeRules) { + var addRules = Array.prototype[append ? "push" : "unshift"]; + for (var i = 0; i < states.length; i++) + addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules)); + } + + if (!this.$embeds) + this.$embeds = []; + this.$embeds.push(prefix); + }; + + this.getEmbeds = function() { + return this.$embeds; + }; + + var pushState = function(currentState, stack) { + if (currentState != "start" || stack.length) + stack.unshift(this.nextState, currentState); + return this.nextState; + }; + var popState = function(currentState, stack) { + stack.shift(); + return stack.shift() || "start"; + }; + + this.normalizeRules = function() { + var id = 0; + var rules = this.$rules; + function processState(key) { + var state = rules[key]; + state.processed = true; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + var toInsert = null; + if (Array.isArray(rule)) { + toInsert = rule; + rule = {}; + } + if (!rule.regex && rule.start) { + rule.regex = rule.start; + if (!rule.next) + rule.next = []; + rule.next.push({ + defaultToken: rule.token + }, { + token: rule.token + ".end", + regex: rule.end || rule.start, + next: "pop" + }); + rule.token = rule.token + ".start"; + rule.push = true; + } + var next = rule.next || rule.push; + if (next && Array.isArray(next)) { + var stateName = rule.stateName; + if (!stateName) { + stateName = rule.token; + if (typeof stateName != "string") + stateName = stateName[0] || ""; + if (rules[stateName]) + stateName += id++; + } + rules[stateName] = next; + rule.next = stateName; + processState(stateName); + } else if (next == "pop") { + rule.next = popState; + } + + if (rule.push) { + rule.nextState = rule.next || rule.push; + rule.next = pushState; + delete rule.push; + } + + if (rule.rules) { + for (var r in rule.rules) { + if (rules[r]) { + if (rules[r].push) + rules[r].push.apply(rules[r], rule.rules[r]); + } else { + rules[r] = rule.rules[r]; + } + } + } + var includeName = typeof rule == "string" ? rule : rule.include; + if (includeName) { + if (Array.isArray(includeName)) + toInsert = includeName.map(function(x) { return rules[x]; }); + else + toInsert = rules[includeName]; + } + + if (toInsert) { + var args = [i, 1].concat(toInsert); + if (rule.noEscape) + args = args.filter(function(x) {return !x.next;}); + state.splice.apply(state, args); + i--; + } + + if (rule.keywordMap) { + rule.token = this.createKeywordMapper( + rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive + ); + delete rule.defaultToken; + } + } + } + Object.keys(rules).forEach(processState, this); + }; + + this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) { + var keywords = Object.create(null); + this.$keywordList = []; + Object.keys(map).forEach(function(className) { + var a = map[className]; + var list = a.split(splitChar || "|"); + for (var i = list.length; i--; ) { + var word = list[i]; + this.$keywordList.push(word); + if (ignoreCase) + word = word.toLowerCase(); + keywords[word] = className; + } + }, this); + map = null; + return ignoreCase + ? function(value) {return keywords[value.toLowerCase()] || defaultToken; } + : function(value) {return keywords[value] || defaultToken; }; + }; + + this.getKeywords = function() { + return this.$keywords; + }; + +}).call(TextHighlightRules.prototype); + +exports.TextHighlightRules = TextHighlightRules; +}); + +define("ace/mode/behaviour",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var Behaviour = function() { + this.$behaviours = {}; +}; + +(function () { + + this.add = function (name, action, callback) { + switch (undefined) { + case this.$behaviours: + this.$behaviours = {}; + case this.$behaviours[name]: + this.$behaviours[name] = {}; + } + this.$behaviours[name][action] = callback; + }; + + this.addBehaviours = function (behaviours) { + for (var key in behaviours) { + for (var action in behaviours[key]) { + this.add(key, action, behaviours[key][action]); + } + } + }; + + this.remove = function (name) { + if (this.$behaviours && this.$behaviours[name]) { + delete this.$behaviours[name]; + } + }; + + this.inherit = function (mode, filter) { + if (typeof mode === "function") { + var behaviours = new mode().getBehaviours(filter); + } else { + var behaviours = mode.getBehaviours(filter); + } + this.addBehaviours(behaviours); + }; + + this.getBehaviours = function (filter) { + if (!filter) { + return this.$behaviours; + } else { + var ret = {}; + for (var i = 0; i < filter.length; i++) { + if (this.$behaviours[filter[i]]) { + ret[filter[i]] = this.$behaviours[filter[i]]; + } + } + return ret; + } + }; + +}).call(Behaviour.prototype); + +exports.Behaviour = Behaviour; +}); + +define("ace/token_iterator",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("./range").Range; +var TokenIterator = function(session, initialRow, initialColumn) { + this.$session = session; + this.$row = initialRow; + this.$rowTokens = session.getTokens(initialRow); + + var token = session.getTokenAt(initialRow, initialColumn); + this.$tokenIndex = token ? token.index : -1; +}; + +(function() { + this.stepBackward = function() { + this.$tokenIndex -= 1; + + while (this.$tokenIndex < 0) { + this.$row -= 1; + if (this.$row < 0) { + this.$row = 0; + return null; + } + + this.$rowTokens = this.$session.getTokens(this.$row); + this.$tokenIndex = this.$rowTokens.length - 1; + } + + return this.$rowTokens[this.$tokenIndex]; + }; + this.stepForward = function() { + this.$tokenIndex += 1; + var rowCount; + while (this.$tokenIndex >= this.$rowTokens.length) { + this.$row += 1; + if (!rowCount) + rowCount = this.$session.getLength(); + if (this.$row >= rowCount) { + this.$row = rowCount - 1; + return null; + } + + this.$rowTokens = this.$session.getTokens(this.$row); + this.$tokenIndex = 0; + } + + return this.$rowTokens[this.$tokenIndex]; + }; + this.getCurrentToken = function () { + return this.$rowTokens[this.$tokenIndex]; + }; + this.getCurrentTokenRow = function () { + return this.$row; + }; + this.getCurrentTokenColumn = function() { + var rowTokens = this.$rowTokens; + var tokenIndex = this.$tokenIndex; + var column = rowTokens[tokenIndex].start; + if (column !== undefined) + return column; + + column = 0; + while (tokenIndex > 0) { + tokenIndex -= 1; + column += rowTokens[tokenIndex].value.length; + } + + return column; + }; + this.getCurrentTokenPosition = function() { + return {row: this.$row, column: this.getCurrentTokenColumn()}; + }; + this.getCurrentTokenRange = function() { + var token = this.$rowTokens[this.$tokenIndex]; + var column = this.getCurrentTokenColumn(); + return new Range(this.$row, column, this.$row, column + token.value.length); + }; + +}).call(TokenIterator.prototype); + +exports.TokenIterator = TokenIterator; +}); + +define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "rparen", "paren", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "rparen", "paren", "punctuation.operator", "comment"]; + +var context; +var contextCache = {}; +var defaultQuotes = {'"' : '"', "'" : "'"}; + +var initContext = function(editor) { + var id = -1; + if (editor.multiSelect) { + id = editor.selection.index; + if (contextCache.rangeCount != editor.multiSelect.rangeCount) + contextCache = {rangeCount: editor.multiSelect.rangeCount}; + } + if (contextCache[id]) + return context = contextCache[id]; + context = contextCache[id] = { + autoInsertedBrackets: 0, + autoInsertedRow: -1, + autoInsertedLineEnd: "", + maybeInsertedBrackets: 0, + maybeInsertedRow: -1, + maybeInsertedLineStart: "", + maybeInsertedLineEnd: "" + }; +}; + +var getWrapped = function(selection, selected, opening, closing) { + var rowDiff = selection.end.row - selection.start.row; + return { + text: opening + selected + closing, + selection: [ + 0, + selection.start.column + 1, + rowDiff, + selection.end.column + (rowDiff ? 0 : 1) + ] + }; +}; + +var CstyleBehaviour = function(options) { + this.add("braces", "insertion", function(state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '{', '}'); + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options && options.braces) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + initContext(editor); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + initContext(editor); + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", context.maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === '}') { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}'); + if (!openBracePos) + return null; + var next_indent = this.$getIndent(session.getLine(openBracePos.row)); + } else if (closing) { + var next_indent = this.$getIndent(line); + } else { + CstyleBehaviour.clearMaybeInsertedClosing(); + return; + } + var indent = next_indent + session.getTabString(); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } else { + CstyleBehaviour.clearMaybeInsertedClosing(); + } + }); + + this.add("braces", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + context.maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function(state, action, editor, session, text) { + if (text == '(') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '(', ')'); + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + initContext(editor); + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function(state, action, editor, session, text) { + if (text == '[') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '[', ']'); + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + initContext(editor); + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function(state, action, editor, session, text) { + var quotes = session.$mode.$quotes || defaultQuotes; + if (text.length == 1 && quotes[text]) { + if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1) + return; + initContext(editor); + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && (selected.length != 1 || !quotes[selected]) && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, quote, quote); + } else if (!selected) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + var rightChar = line.substring(cursor.column, cursor.column + 1); + + var token = session.getTokenAt(cursor.row, cursor.column); + var rightToken = session.getTokenAt(cursor.row, cursor.column + 1); + if (leftChar == "\\" && token && /escape/.test(token.type)) + return null; + + var stringBefore = token && /string|escape/.test(token.type); + var stringAfter = !rightToken || /string|escape/.test(rightToken.type); + + var pair; + if (rightChar == quote) { + pair = stringBefore !== stringAfter; + if (pair && /string\.end/.test(rightToken.type)) + pair = false; + } else { + if (stringBefore && !stringAfter) + return null; // wrap string with different quote + if (stringBefore && stringAfter) + return null; // do not pair quotes inside strings + var wordRe = session.$mode.tokenRe; + wordRe.lastIndex = 0; + var isWordBefore = wordRe.test(leftChar); + wordRe.lastIndex = 0; + var isWordAfter = wordRe.test(leftChar); + if (isWordBefore || isWordAfter) + return null; // before or after alphanumeric + if (rightChar && !/[\s;,.})\]\\]/.test(rightChar)) + return null; // there is rightChar and it isn't closing + var charBefore = line[cursor.column - 2]; + if (leftChar == quote && (charBefore == quote || wordRe.test(charBefore))) + return null; + pair = true; + } + return { + text: pair ? quote + quote : "", + selection: [1,1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var quotes = session.$mode.$quotes || defaultQuotes; + + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && quotes.hasOwnProperty(selected)) { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + + +CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + if (/[)}\]]/.test(editor.session.getLine(cursor.row)[cursor.column])) + return true; + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); +}; + +CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; +}; + +CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0])) + context.autoInsertedBrackets = 0; + context.autoInsertedRow = cursor.row; + context.autoInsertedLineEnd = bracket + line.substr(cursor.column); + context.autoInsertedBrackets++; +}; + +CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + context.maybeInsertedBrackets = 0; + context.maybeInsertedRow = cursor.row; + context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + context.maybeInsertedLineEnd = line.substr(cursor.column); + context.maybeInsertedBrackets++; +}; + +CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return context.autoInsertedBrackets > 0 && + cursor.row === context.autoInsertedRow && + bracket === context.autoInsertedLineEnd[0] && + line.substr(cursor.column) === context.autoInsertedLineEnd; +}; + +CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return context.maybeInsertedBrackets > 0 && + cursor.row === context.maybeInsertedRow && + line.substr(cursor.column) === context.maybeInsertedLineEnd && + line.substr(0, cursor.column) == context.maybeInsertedLineStart; +}; + +CstyleBehaviour.popAutoInsertedClosing = function() { + context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1); + context.autoInsertedBrackets--; +}; + +CstyleBehaviour.clearMaybeInsertedClosing = function() { + if (context) { + context.maybeInsertedBrackets = 0; + context.maybeInsertedRow = -1; + } +}; + + + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +define("ace/unicode",["require","exports","module"], function(require, exports, module) { +"use strict"; +var wordChars = [48,9,8,25,5,0,2,25,48,0,11,0,5,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,18,116,2,1,3,3,9,0,2,2,2,0,2,19,2,82,2,138,2,4,3,155,12,37,3,0,8,38,10,44,2,0,2,1,2,1,2,0,9,26,6,2,30,10,7,61,2,9,5,101,2,7,3,9,2,18,3,0,17,58,3,100,15,53,5,0,6,45,211,57,3,18,2,5,3,11,3,9,2,1,7,6,2,2,2,7,3,1,3,21,2,6,2,0,4,3,3,8,3,1,3,3,9,0,5,1,2,4,3,11,16,2,2,5,5,1,3,21,2,6,2,1,2,1,2,1,3,0,2,4,5,1,3,2,4,0,8,3,2,0,8,15,12,2,2,8,2,2,2,21,2,6,2,1,2,4,3,9,2,2,2,2,3,0,16,3,3,9,18,2,2,7,3,1,3,21,2,6,2,1,2,4,3,8,3,1,3,2,9,1,5,1,2,4,3,9,2,0,17,1,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,5,4,4,2,2,3,3,0,7,0,15,9,18,2,2,7,2,2,2,22,2,9,2,4,4,7,2,2,2,3,8,1,2,1,7,3,3,9,19,1,2,7,2,2,2,22,2,9,2,4,3,8,2,2,2,3,8,1,8,0,2,3,3,9,19,1,2,7,2,2,2,22,2,15,4,7,2,2,2,3,10,0,9,3,3,9,11,5,3,1,2,17,4,23,2,8,2,0,3,6,4,0,5,5,2,0,2,7,19,1,14,57,6,14,2,9,40,1,2,0,3,1,2,0,3,0,7,3,2,6,2,2,2,0,2,0,3,1,2,12,2,2,3,4,2,0,2,5,3,9,3,1,35,0,24,1,7,9,12,0,2,0,2,0,5,9,2,35,5,19,2,5,5,7,2,35,10,0,58,73,7,77,3,37,11,42,2,0,4,328,2,3,3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,2,3,3,14,2,56,2,3,3,66,5,0,33,15,17,84,13,619,3,16,2,25,6,74,22,12,2,6,12,20,12,19,13,12,2,2,2,1,13,51,3,29,4,0,5,1,3,9,34,2,3,9,7,87,9,42,6,69,11,28,4,11,5,11,11,39,3,4,12,43,5,25,7,10,38,27,5,62,2,28,3,10,7,9,14,0,89,75,5,9,18,8,13,42,4,11,71,55,9,9,4,48,83,2,2,30,14,230,23,280,3,5,3,37,3,5,3,7,2,0,2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,67,1,20,0,29,0,14,0,17,4,60,12,5,0,4,11,18,0,5,0,3,9,2,0,4,4,7,0,2,0,2,0,2,3,2,10,3,3,6,4,5,0,53,1,2684,46,2,46,2,132,7,6,15,37,11,53,10,0,17,22,10,6,2,6,2,6,2,6,2,6,2,6,2,6,2,6,2,31,48,0,470,1,36,5,2,4,6,1,5,85,3,1,3,2,2,89,2,3,6,40,4,93,18,23,57,15,513,6581,75,20939,53,1164,68,45,3,268,4,27,21,31,3,13,13,1,2,24,9,69,11,1,38,8,3,102,3,1,111,44,25,51,13,68,12,9,7,23,4,0,5,45,3,35,13,28,4,64,15,10,39,54,10,13,3,9,7,22,4,1,5,66,25,2,227,42,2,1,3,9,7,11171,13,22,5,48,8453,301,3,61,3,105,39,6,13,4,6,11,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,5,15,17,6,13,1,25,2,33,4,2,134,20,9,8,25,5,0,2,25,12,88,4,5,3,5,3,5,3,2]; + +var code = 0; +var str = []; +for (var i = 0; i < wordChars.length; i += 2) { + str.push(code += wordChars[i]); + if (wordChars[i + 1]) + str.push(45, code += wordChars[i + 1]); +} + +exports.wordChars = String.fromCharCode.apply(null, str); + +}); + +define("ace/mode/text",["require","exports","module","ace/config","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"], function(require, exports, module) { +"use strict"; +var config = require("../config"); + +var Tokenizer = require("../tokenizer").Tokenizer; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var unicode = require("../unicode"); +var lang = require("../lib/lang"); +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; + +var Mode = function() { + this.HighlightRules = TextHighlightRules; +}; + +(function() { + this.$defaultBehaviour = new CstyleBehaviour(); + + this.tokenRe = new RegExp("^[" + unicode.wordChars + "\\$_]+", "g"); + + this.nonTokenRe = new RegExp("^(?:[^" + unicode.wordChars + "\\$_]|\\s])+", "g"); + + this.getTokenizer = function() { + if (!this.$tokenizer) { + this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig); + this.$tokenizer = new Tokenizer(this.$highlightRules.getRules()); + } + return this.$tokenizer; + }; + + this.lineCommentStart = ""; + this.blockComment = ""; + + this.toggleCommentLines = function(state, session, startRow, endRow) { + var doc = session.doc; + + var ignoreBlankLines = true; + var shouldRemove = true; + var minIndent = Infinity; + var tabSize = session.getTabSize(); + var insertAtTabStop = false; + + if (!this.lineCommentStart) { + if (!this.blockComment) + return false; + var lineCommentStart = this.blockComment.start; + var lineCommentEnd = this.blockComment.end; + var regexpStart = new RegExp("^(\\s*)(?:" + lang.escapeRegExp(lineCommentStart) + ")"); + var regexpEnd = new RegExp("(?:" + lang.escapeRegExp(lineCommentEnd) + ")\\s*$"); + + var comment = function(line, i) { + if (testRemove(line, i)) + return; + if (!ignoreBlankLines || /\S/.test(line)) { + doc.insertInLine({row: i, column: line.length}, lineCommentEnd); + doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + } + }; + + var uncomment = function(line, i) { + var m; + if (m = line.match(regexpEnd)) + doc.removeInLine(i, line.length - m[0].length, line.length); + if (m = line.match(regexpStart)) + doc.removeInLine(i, m[1].length, m[0].length); + }; + + var testRemove = function(line, row) { + if (regexpStart.test(line)) + return true; + var tokens = session.getTokens(row); + for (var i = 0; i < tokens.length; i++) { + if (tokens[i].type === "comment") + return true; + } + }; + } else { + if (Array.isArray(this.lineCommentStart)) { + var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join("|"); + var lineCommentStart = this.lineCommentStart[0]; + } else { + var regexpStart = lang.escapeRegExp(this.lineCommentStart); + var lineCommentStart = this.lineCommentStart; + } + regexpStart = new RegExp("^(\\s*)(?:" + regexpStart + ") ?"); + + insertAtTabStop = session.getUseSoftTabs(); + + var uncomment = function(line, i) { + var m = line.match(regexpStart); + if (!m) return; + var start = m[1].length, end = m[0].length; + if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == " ") + end--; + doc.removeInLine(i, start, end); + }; + var commentWithSpace = lineCommentStart + " "; + var comment = function(line, i) { + if (!ignoreBlankLines || /\S/.test(line)) { + if (shouldInsertSpace(line, minIndent, minIndent)) + doc.insertInLine({row: i, column: minIndent}, commentWithSpace); + else + doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + } + }; + var testRemove = function(line, i) { + return regexpStart.test(line); + }; + + var shouldInsertSpace = function(line, before, after) { + var spaces = 0; + while (before-- && line.charAt(before) == " ") + spaces++; + if (spaces % tabSize != 0) + return false; + var spaces = 0; + while (line.charAt(after++) == " ") + spaces++; + if (tabSize > 2) + return spaces % tabSize != tabSize - 1; + else + return spaces % tabSize == 0; + }; + } + + function iter(fun) { + for (var i = startRow; i <= endRow; i++) + fun(doc.getLine(i), i); + } + + + var minEmptyLength = Infinity; + iter(function(line, i) { + var indent = line.search(/\S/); + if (indent !== -1) { + if (indent < minIndent) + minIndent = indent; + if (shouldRemove && !testRemove(line, i)) + shouldRemove = false; + } else if (minEmptyLength > line.length) { + minEmptyLength = line.length; + } + }); + + if (minIndent == Infinity) { + minIndent = minEmptyLength; + ignoreBlankLines = false; + shouldRemove = false; + } + + if (insertAtTabStop && minIndent % tabSize != 0) + minIndent = Math.floor(minIndent / tabSize) * tabSize; + + iter(shouldRemove ? uncomment : comment); + }; + + this.toggleBlockComment = function(state, session, range, cursor) { + var comment = this.blockComment; + if (!comment) + return; + if (!comment.start && comment[0]) + comment = comment[0]; + + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + var sel = session.selection; + var initialRange = session.selection.toOrientedRange(); + var startRow, colDiff; + + if (token && /comment/.test(token.type)) { + var startRange, endRange; + while (token && /comment/.test(token.type)) { + var i = token.value.indexOf(comment.start); + if (i != -1) { + var row = iterator.getCurrentTokenRow(); + var column = iterator.getCurrentTokenColumn() + i; + startRange = new Range(row, column, row, column + comment.start.length); + break; + } + token = iterator.stepBackward(); + } + + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + while (token && /comment/.test(token.type)) { + var i = token.value.indexOf(comment.end); + if (i != -1) { + var row = iterator.getCurrentTokenRow(); + var column = iterator.getCurrentTokenColumn() + i; + endRange = new Range(row, column, row, column + comment.end.length); + break; + } + token = iterator.stepForward(); + } + if (endRange) + session.remove(endRange); + if (startRange) { + session.remove(startRange); + startRow = startRange.start.row; + colDiff = -comment.start.length; + } + } else { + colDiff = comment.start.length; + startRow = range.start.row; + session.insert(range.end, comment.end); + session.insert(range.start, comment.start); + } + if (initialRange.start.row == startRow) + initialRange.start.column += colDiff; + if (initialRange.end.row == startRow) + initialRange.end.column += colDiff; + session.selection.fromOrientedRange(initialRange); + }; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.autoOutdent = function(state, doc, row) { + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + + this.createWorker = function(session) { + return null; + }; + + this.createModeDelegates = function (mapping) { + this.$embeds = []; + this.$modes = {}; + for (var i in mapping) { + if (mapping[i]) { + var Mode = mapping[i]; + var id = Mode.prototype.$id; + var mode = config.$modes[id]; + if (!mode) + config.$modes[id] = mode = new Mode(); + if (!config.$modes[i]) + config.$modes[i] = mode; + this.$embeds.push(i); + this.$modes[i] = mode; + } + } + + var delegations = ["toggleBlockComment", "toggleCommentLines", "getNextLineIndent", + "checkOutdent", "autoOutdent", "transformAction", "getCompletions"]; + + for (var i = 0; i < delegations.length; i++) { + (function(scope) { + var functionName = delegations[i]; + var defaultHandler = scope[functionName]; + scope[delegations[i]] = function() { + return this.$delegator(functionName, arguments, defaultHandler); + }; + }(this)); + } + }; + + this.$delegator = function(method, args, defaultHandler) { + var state = args[0] || "start"; + if (typeof state != "string") { + if (Array.isArray(state[2])) { + var language = state[2][state[2].length - 1]; + var mode = this.$modes[language]; + if (mode) + return mode[method].apply(mode, [state[1]].concat([].slice.call(args, 1))); + } + state = state[0] || "start"; + } + + for (var i = 0; i < this.$embeds.length; i++) { + if (!this.$modes[this.$embeds[i]]) continue; + + var split = state.split(this.$embeds[i]); + if (!split[0] && split[1]) { + args[0] = split[1]; + var mode = this.$modes[this.$embeds[i]]; + return mode[method].apply(mode, args); + } + } + var ret = defaultHandler.apply(this, args); + return defaultHandler ? ret : undefined; + }; + + this.transformAction = function(state, action, editor, session, param) { + if (this.$behaviour) { + var behaviours = this.$behaviour.getBehaviours(); + for (var key in behaviours) { + if (behaviours[key][action]) { + var ret = behaviours[key][action].apply(this, arguments); + if (ret) { + return ret; + } + } + } + } + }; + + this.getKeywords = function(append) { + if (!this.completionKeywords) { + var rules = this.$tokenizer.rules; + var completionKeywords = []; + for (var rule in rules) { + var ruleItr = rules[rule]; + for (var r = 0, l = ruleItr.length; r < l; r++) { + if (typeof ruleItr[r].token === "string") { + if (/keyword|support|storage/.test(ruleItr[r].token)) + completionKeywords.push(ruleItr[r].regex); + } + else if (typeof ruleItr[r].token === "object") { + for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { + if (/keyword|support|storage/.test(ruleItr[r].token[a])) { + var rule = ruleItr[r].regex.match(/\(.+?\)/g)[a]; + completionKeywords.push(rule.substr(1, rule.length - 2)); + } + } + } + } + } + this.completionKeywords = completionKeywords; + } + if (!append) + return this.$keywordList; + return completionKeywords.concat(this.$keywordList || []); + }; + + this.$createKeywordList = function() { + if (!this.$highlightRules) + this.getTokenizer(); + return this.$keywordList = this.$highlightRules.$keywordList || []; + }; + + this.getCompletions = function(state, session, pos, prefix) { + var keywords = this.$keywordList || this.$createKeywordList(); + return keywords.map(function(word) { + return { + name: word, + value: word, + score: 0, + meta: "keyword" + }; + }); + }; + + this.$id = "ace/mode/text"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +define("ace/apply_delta",["require","exports","module"], function(require, exports, module) { +"use strict"; + +function throwDeltaError(delta, errorText){ + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} + +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} + +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} + +exports.applyDelta = function(docLines, delta, doNotValidate) { + + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } else { + docLines.splice( + row, endRow - row + 1, + line.substring(0, startColumn) + docLines[endRow].substring(endColumn) + ); + } + break; + } +}; +}); + +define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var Anchor = exports.Anchor = function(doc, row, column) { + this.$onChange = this.onChange.bind(this); + this.attach(doc); + + if (typeof column == "undefined") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.getPosition = function() { + return this.$clipPositionToDocument(this.row, this.column); + }; + this.getDocument = function() { + return this.document; + }; + this.$insertRight = false; + this.onChange = function(delta) { + if (delta.start.row == delta.end.row && delta.start.row != this.row) + return; + + if (delta.start.row > this.row) + return; + + var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); + this.setPosition(point.row, point.column, true); + }; + + function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); + } + + function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + + return { + row: deltaStart.row, + column: deltaStart.column + }; + } + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); + }; + this.detach = function() { + this.document.off("change", this.$onChange); + }; + this.attach = function(doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); + +define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } else if (Array.isArray(textOrLines)) { + this.insertMergedLines({row: 0, column: 0}, textOrLines); + } else { + this.insert({row: 0, column:0}, textOrLines); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.initialize = function(text) { + this.refresh(text); + }; + this.setValue = function(text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({row: 0, column: 0}, text); + }; + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + if ("aaa".split(/a/).length === 0) { + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + }; + } else { + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); + }; + } + + + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; + } + }; + + this.$autoNewLine = ""; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + this._signal("changeNewLineMode"); + }; + this.getNewLineMode = function() { + return this.$newLineMode; + }; + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + this.getLength = function() { + return this.$lines.length; + }; + this.getTextRange = function(range) { + return this.getLinesForRange(range).join(this.getNewLineCharacter()); + }; + this.getLinesForRange = function(range) { + var lines; + if (range.start.row === range.end.row) { + lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; + } else { + lines = this.getLines(range.start.row, range.end.row); + lines[0] = (lines[0] || "").substring(range.start.column); + var l = lines.length - 1; + if (range.end.row - range.start.row == l) + lines[l] = lines[l].substring(0, range.end.column); + } + return lines; + }; + this.insertLines = function(row, lines) { + console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); + return this.insertFullLines(row, lines); + }; + this.removeLines = function(firstRow, lastRow) { + console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); + return this.removeFullLines(firstRow, lastRow); + }; + this.insertNewLine = function(position) { + console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."); + return this.insertMergedLines(position, ["", ""]); + }; + this.insert = function(position, text) { + if (this.getLength() <= 1) + this.$detectNewLine(text); + + return this.insertMergedLines(position, this.$split(text)); + }; + this.insertInLine = function(position, text) { + var start = this.clippedPos(position.row, position.column); + var end = this.pos(position.row, position.column + text.length); + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: [text] + }, true); + + return this.clonePos(end); + }; + + this.clippedPos = function(row, column) { + var length = this.getLength(); + if (row === undefined) { + row = length; + } else if (row < 0) { + row = 0; + } else if (row >= length) { + row = length - 1; + column = undefined; + } + var line = this.getLine(row); + if (column == undefined) + column = line.length; + column = Math.min(Math.max(column, 0), line.length); + return {row: row, column: column}; + }; + + this.clonePos = function(pos) { + return {row: pos.row, column: pos.column}; + }; + + this.pos = function(row, column) { + return {row: row, column: column}; + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length - 1).length; + } else { + position.row = Math.max(0, position.row); + position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); + } + return position; + }; + + this.refresh = function(text, row){ + var row = row || 0 + var lines = this.$split(text); + if (lines.length > 0xFFFF) { + var end = this.refresh(row, lines.slice(0xFFFF)); + lines = lines.slice(0, 0xFFFF); + } + + var args = [row, 0]; + args.push.apply(args, lines); + this.$lines.splice.apply(this.$lines, args); + var range = new Range(row, 0, row + lines.length, 0); + var delta = { + action: "insertLines", + context: 'refresh', + range: range, + lines: lines + }; + this._emit("change", { data: delta }); + return {row:0, column:0}; + } + this.insertFullLines = function(row, lines) { + row = Math.min(Math.max(row, 0), this.getLength()); + var column = 0; + if (row < this.getLength()) { + lines = lines.concat([""]); + column = 0; + } else { + lines = [""].concat(lines); + row--; + column = this.$lines[row].length; + } + this.insertMergedLines({row: row, column: column}, lines); + }; + this.insertMergedLines = function(position, lines) { + var start = this.clippedPos(position.row, position.column); + var end = { + row: start.row + lines.length - 1, + column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length + }; + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: lines + }); + + return this.clonePos(end); + }; + this.remove = function(range) { + var start = this.clippedPos(range.start.row, range.start.column); + var end = this.clippedPos(range.end.row, range.end.column); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }); + return this.clonePos(start); + }; + this.removeInLine = function(row, startColumn, endColumn) { + var start = this.clippedPos(row, startColumn); + var end = this.clippedPos(row, endColumn); + + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }, true); + + return this.clonePos(start); + }; + this.removeFullLines = function(firstRow, lastRow) { + firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); + var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); + var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); + var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var range = new Range(startRow, startCol, endRow, endCol); + var deletedLines = this.$lines.slice(firstRow, lastRow + 1); + + this.applyDelta({ + start: range.start, + end: range.end, + action: "remove", + lines: this.getLinesForRange(range) + }); + return deletedLines; + }; + this.removeNewLine = function(row) { + if (row < this.getLength() - 1 && row >= 0) { + this.applyDelta({ + start: this.pos(row, this.getLine(row).length), + end: this.pos(row + 1, 0), + action: "remove", + lines: ["", ""] + }); + } + }; + this.replace = function(range, text) { + if (!(range instanceof Range)) + range = Range.fromPoints(range.start, range.end); + if (text.length === 0 && range.isEmpty()) + return range.start; + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + var end; + if (text) { + end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + this.revertDelta(deltas[i]); + } + }; + this.applyDelta = function(delta, doNotValidate) { + var isInsert = delta.action == "insert"; + if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] + : !Range.comparePoints(delta.start, delta.end)) { + return; + } + + if (isInsert && delta.lines.length > 20000) { + this.$splitAndapplyLargeDelta(delta, 20000); + } + else { + applyDelta(this.$lines, delta, doNotValidate); + this._signal("change", delta); + } + }; + + this.$safeApplyDelta = function(delta) { + var docLength = this.$lines.length; + if ( + delta.action == "remove" && delta.start.row < docLength && delta.end.row < docLength + || delta.action == "insert" && delta.start.row <= docLength + ) { + this.applyDelta(delta); + } + }; + + this.$splitAndapplyLargeDelta = function(delta, MAX) { + var lines = delta.lines; + var l = lines.length - MAX + 1; + var row = delta.start.row; + var column = delta.start.column; + for (var from = 0, to = 0; from < l; from = to) { + to += MAX - 1; + var chunk = lines.slice(from, to); + chunk.push(""); + this.applyDelta({ + start: this.pos(row + from, column), + end: this.pos(row + to, column = 0), + action: delta.action, + lines: chunk + }, true); + } + delta.lines = lines.slice(from); + delta.start.row = row + from; + delta.start.column = column; + this.applyDelta(delta, true); + }; + this.revertDelta = function(delta) { + this.$safeApplyDelta({ + start: this.clonePos(delta.start), + end: this.clonePos(delta.end), + action: (delta.action == "insert" ? "remove" : "insert"), + lines: delta.lines.slice() + }); + }; + this.indexToPosition = function(index, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + for (var i = startRow || 0, l = lines.length; i < l; i++) { + index -= lines[i].length + newlineLength; + if (index < 0) + return {row: i, column: index + lines[i].length + newlineLength}; + } + return {row: l-1, column: index + lines[l-1].length + newlineLength}; + }; + this.positionToIndex = function(pos, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + var index = 0; + var row = Math.min(pos.row, lines.length); + for (var i = startRow || 0; i < row; ++i) + index += lines[i].length + newlineLength; + + return index + pos.column; + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); + +define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var BackgroundTokenizer = function(tokenizer, editor) { + this.running = false; + this.lines = []; + this.states = []; + this.currentLine = 0; + this.tokenizer = tokenizer; + + var self = this; + + this.$worker = function() { + if (!self.running) { return; } + + var workerStart = new Date(); + var currentLine = self.currentLine; + var endLine = -1; + var doc = self.doc; + + var startLine = currentLine; + while (self.lines[currentLine]) + currentLine++; + + var len = doc.getLength(); + var processedLines = 0; + self.running = false; + while (currentLine < len) { + self.$tokenizeRow(currentLine); + endLine = currentLine; + do { + currentLine++; + } while (self.lines[currentLine]); + processedLines ++; + if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) { + self.running = setTimeout(self.$worker, 20); + break; + } + } + self.currentLine = currentLine; + + if (endLine == -1) + endLine = currentLine; + + if (startLine <= endLine) + self.fireUpdateEvent(startLine, endLine); + }; +}; + +(function(){ + + oop.implement(this, EventEmitter); + this.setTokenizer = function(tokenizer) { + this.tokenizer = tokenizer; + this.lines = []; + this.states = []; + + this.start(0); + }; + this.setDocument = function(doc) { + this.doc = doc; + this.lines = []; + this.states = []; + + this.stop(); + }; + this.fireUpdateEvent = function(firstRow, lastRow) { + var data = { + first: firstRow, + last: lastRow + }; + this._signal("update", {data: data}); + }; + this.start = function(startRow) { + this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength()); + this.lines.splice(this.currentLine, this.lines.length); + this.states.splice(this.currentLine, this.states.length); + + this.stop(); + this.running = setTimeout(this.$worker, 700); + }; + + this.scheduleStart = function() { + if (!this.running) + this.running = setTimeout(this.$worker, 700); + }; + + this.$updateOnChange = function(delta) { + var startRow = delta.start.row; + var len = delta.end.row - startRow; + + if (len === 0) { + this.lines[startRow] = null; + } else if (delta.action == "remove") { + this.lines.splice(startRow, len + 1, null); + this.states.splice(startRow, len + 1, null); + } else { + var args = Array(len + 1); + args.unshift(startRow, 1); + this.lines.splice.apply(this.lines, args); + this.states.splice.apply(this.states, args); + } + + this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength()); + + this.stop(); + }; + this.stop = function() { + if (this.running) + clearTimeout(this.running); + this.running = false; + }; + this.getTokens = function(row) { + return this.lines[row] || this.$tokenizeRow(row); + }; + this.getState = function(row) { + if (this.currentLine == row) + this.$tokenizeRow(row); + return this.states[row] || "start"; + }; + + this.$tokenizeRow = function(row) { + var line = this.doc.getLine(row); + var state = this.states[row - 1]; + + var data = this.tokenizer.getLineTokens(line, state, row); + + if (this.states[row] + "" !== data.state + "") { + this.states[row] = data.state; + this.lines[row + 1] = null; + if (this.currentLine > row + 1) + this.currentLine = row + 1; + } else if (this.currentLine == row) { + this.currentLine = row + 1; + } + + return this.lines[row] = data.tokens; + }; + + this.cleanup = function() { + this.running = false; + this.lines = []; + this.states = []; + this.currentLine = 0; + this.removeAllListeners(); + }; + +}).call(BackgroundTokenizer.prototype); + +exports.BackgroundTokenizer = BackgroundTokenizer; +}); + +define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) { +"use strict"; + +var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var Range = require("./range").Range; + +var SearchHighlight = function(regExp, clazz, type) { + this.setRegexp(regExp); + this.clazz = clazz; + this.type = type || "text"; +}; + +(function() { + this.MAX_RANGES = 500; + + this.setRegexp = function(regExp) { + if (this.regExp+"" == regExp+"") + return; + this.regExp = regExp; + this.cache = []; + }; + + this.update = function(html, markerLayer, session, config) { + if (!this.regExp) + return; + var start = config.firstRow, end = config.lastRow; + var renderedMarkerRanges = {}; + + for (var i = start; i <= end; i++) { + var ranges = this.cache[i]; + if (ranges == null) { + ranges = lang.getMatchOffsets(session.getLine(i), this.regExp); + if (ranges.length > this.MAX_RANGES) + ranges = ranges.slice(0, this.MAX_RANGES); + ranges = ranges.map(function(match) { + return new Range(i, match.offset, i, match.offset + match.length); + }); + this.cache[i] = ranges.length ? ranges : ""; + } + + for (var j = ranges.length; j --; ) { + var rangeToAddMarkerTo = ranges[j].toScreenRange(session); + var rangeAsString = rangeToAddMarkerTo.toString(); + if (renderedMarkerRanges[rangeAsString]) continue; + + renderedMarkerRanges[rangeAsString] = true; + markerLayer.drawSingleLineMarker( + html, rangeToAddMarkerTo, this.clazz, config); + } + } + }; + +}).call(SearchHighlight.prototype); + +exports.SearchHighlight = SearchHighlight; +}); + +define("ace/edit_session/fold_line",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +function FoldLine(foldData, folds) { + this.foldData = foldData; + if (Array.isArray(folds)) { + this.folds = folds; + } else { + folds = this.folds = [ folds ]; + } + + var last = folds[folds.length - 1]; + this.range = new Range(folds[0].start.row, folds[0].start.column, + last.end.row, last.end.column); + this.start = this.range.start; + this.end = this.range.end; + + this.folds.forEach(function(fold) { + fold.setFoldLine(this); + }, this); +} + +(function() { + this.shiftRow = function(shift) { + this.start.row += shift; + this.end.row += shift; + this.folds.forEach(function(fold) { + fold.start.row += shift; + fold.end.row += shift; + }); + }; + + this.addFold = function(fold) { + if (fold.sameRow) { + if (fold.start.row < this.startRow || fold.endRow > this.endRow) { + throw new Error("Can't add a fold to this FoldLine as it has no connection"); + } + this.folds.push(fold); + this.folds.sort(function(a, b) { + return -a.range.compareEnd(b.start.row, b.start.column); + }); + if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) { + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) { + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } + } else if (fold.start.row == this.end.row) { + this.folds.push(fold); + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } else if (fold.end.row == this.start.row) { + this.folds.unshift(fold); + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } else { + throw new Error("Trying to add fold to FoldRow that doesn't have a matching row"); + } + fold.foldLine = this; + }; + + this.containsRow = function(row) { + return row >= this.start.row && row <= this.end.row; + }; + + this.walk = function(callback, endRow, endColumn) { + var lastEnd = 0, + folds = this.folds, + fold, + cmp, stop, isNewRow = true; + + if (endRow == null) { + endRow = this.end.row; + endColumn = this.end.column; + } + + for (var i = 0; i < folds.length; i++) { + fold = folds[i]; + + cmp = fold.range.compareStart(endRow, endColumn); + if (cmp == -1) { + callback(null, endRow, endColumn, lastEnd, isNewRow); + return; + } + + stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow); + stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd); + if (stop || cmp === 0) { + return; + } + isNewRow = !fold.sameRow; + lastEnd = fold.end.column; + } + callback(null, endRow, endColumn, lastEnd, isNewRow); + }; + + this.getNextFoldTo = function(row, column) { + var fold, cmp; + for (var i = 0; i < this.folds.length; i++) { + fold = this.folds[i]; + cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + return { + fold: fold, + kind: "after" + }; + } else if (cmp === 0) { + return { + fold: fold, + kind: "inside" + }; + } + } + return null; + }; + + this.addRemoveChars = function(row, column, len) { + var ret = this.getNextFoldTo(row, column), + fold, folds; + if (ret) { + fold = ret.fold; + if (ret.kind == "inside" + && fold.start.column != column + && fold.start.row != row) + { + window.console && window.console.log(row, column, fold); + } else if (fold.start.row == row) { + folds = this.folds; + var i = folds.indexOf(fold); + if (i === 0) { + this.start.column += len; + } + for (i; i < folds.length; i++) { + fold = folds[i]; + fold.start.column += len; + if (!fold.sameRow) { + return; + } + fold.end.column += len; + } + this.end.column += len; + } + } + }; + + this.split = function(row, column) { + var pos = this.getNextFoldTo(row, column); + + if (!pos || pos.kind == "inside") + return null; + + var fold = pos.fold; + var folds = this.folds; + var foldData = this.foldData; + + var i = folds.indexOf(fold); + var foldBefore = folds[i - 1]; + this.end.row = foldBefore.end.row; + this.end.column = foldBefore.end.column; + folds = folds.splice(i, folds.length - i); + + var newFoldLine = new FoldLine(foldData, folds); + foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine); + return newFoldLine; + }; + + this.merge = function(foldLineNext) { + var folds = foldLineNext.folds; + for (var i = 0; i < folds.length; i++) { + this.addFold(folds[i]); + } + var foldData = this.foldData; + foldData.splice(foldData.indexOf(foldLineNext), 1); + }; + + this.toString = function() { + var ret = [this.range.toString() + ": [" ]; + + this.folds.forEach(function(fold) { + ret.push(" " + fold.toString()); + }); + ret.push("]"); + return ret.join("\n"); + }; + + this.idxToPosition = function(idx) { + var lastFoldEndColumn = 0; + + for (var i = 0; i < this.folds.length; i++) { + var fold = this.folds[i]; + + idx -= fold.start.column - lastFoldEndColumn; + if (idx < 0) { + return { + row: fold.start.row, + column: fold.start.column + idx + }; + } + + idx -= fold.placeholder.length; + if (idx < 0) { + return fold.start; + } + + lastFoldEndColumn = fold.end.column; + } + + return { + row: this.end.row, + column: this.end.column + idx + }; + }; +}).call(FoldLine.prototype); + +exports.FoldLine = FoldLine; +}); + +define("ace/range_list",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; +var Range = require("./range").Range; +var comparePoints = Range.comparePoints; + +var RangeList = function() { + this.ranges = []; + this.$bias = 1; +}; + +(function() { + this.comparePoints = comparePoints; + + this.pointIndex = function(pos, excludeEdges, startIndex) { + var list = this.ranges; + + for (var i = startIndex || 0; i < list.length; i++) { + var range = list[i]; + var cmpEnd = comparePoints(pos, range.end); + if (cmpEnd > 0) + continue; + var cmpStart = comparePoints(pos, range.start); + if (cmpEnd === 0) + return excludeEdges && cmpStart !== 0 ? -i-2 : i; + if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges)) + return i; + + return -i-1; + } + return -i - 1; + }; + + this.add = function(range) { + var excludeEdges = !range.isEmpty(); + var startIndex = this.pointIndex(range.start, excludeEdges); + if (startIndex < 0) + startIndex = -startIndex - 1; + + var endIndex = this.pointIndex(range.end, excludeEdges, startIndex); + + if (endIndex < 0) + endIndex = -endIndex - 1; + else + endIndex++; + return this.ranges.splice(startIndex, endIndex - startIndex, range); + }; + + this.addList = function(list) { + var removed = []; + for (var i = list.length; i--; ) { + removed.push.apply(removed, this.add(list[i])); + } + return removed; + }; + + this.substractPoint = function(pos) { + var i = this.pointIndex(pos); + + if (i >= 0) + return this.ranges.splice(i, 1); + }; + this.merge = function() { + var removed = []; + var list = this.ranges; + + list = list.sort(function(a, b) { + return comparePoints(a.start, b.start); + }); + + var next = list[0], range; + for (var i = 1; i < list.length; i++) { + range = next; + next = list[i]; + var cmp = comparePoints(range.end, next.start); + if (cmp < 0) + continue; + + if (cmp == 0 && !range.isEmpty() && !next.isEmpty()) + continue; + + if (comparePoints(range.end, next.end) < 0) { + range.end.row = next.end.row; + range.end.column = next.end.column; + } + + list.splice(i, 1); + removed.push(next); + next = range; + i--; + } + + this.ranges = list; + + return removed; + }; + + this.contains = function(row, column) { + return this.pointIndex({row: row, column: column}) >= 0; + }; + + this.containsPoint = function(pos) { + return this.pointIndex(pos) >= 0; + }; + + this.rangeAtPoint = function(pos) { + var i = this.pointIndex(pos); + if (i >= 0) + return this.ranges[i]; + }; + + + this.clipRows = function(startRow, endRow) { + var list = this.ranges; + if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow) + return []; + + var startIndex = this.pointIndex({row: startRow, column: 0}); + if (startIndex < 0) + startIndex = -startIndex - 1; + var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex); + if (endIndex < 0) + endIndex = -endIndex - 1; + + var clipped = []; + for (var i = startIndex; i < endIndex; i++) { + clipped.push(list[i]); + } + return clipped; + }; + + this.removeAll = function() { + return this.ranges.splice(0, this.ranges.length); + }; + + this.attach = function(session) { + if (this.session) + this.detach(); + + this.session = session; + this.onChange = this.$onChange.bind(this); + + this.session.on('change', this.onChange); + }; + + this.detach = function() { + if (!this.session) + return; + this.session.removeListener('change', this.onChange); + this.session = null; + }; + + this.$onChange = function(delta) { + var start = delta.start; + var end = delta.end; + var startRow = start.row; + var endRow = end.row; + var ranges = this.ranges; + for (var i = 0, n = ranges.length; i < n; i++) { + var r = ranges[i]; + if (r.end.row >= startRow) + break; + } + + if (delta.action == "insert") { + var lineDif = endRow - startRow; + var colDiff = -start.column + end.column; + for (; i < n; i++) { + var r = ranges[i]; + if (r.start.row > startRow) + break; + + if (r.start.row == startRow && r.start.column >= start.column) { + if (r.start.column == start.column && this.$bias <= 0) { + } else { + r.start.column += colDiff; + r.start.row += lineDif; + } + } + if (r.end.row == startRow && r.end.column >= start.column) { + if (r.end.column == start.column && this.$bias < 0) { + continue; + } + if (r.end.column == start.column && colDiff > 0 && i < n - 1) { + if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column) + r.end.column -= colDiff; + } + r.end.column += colDiff; + r.end.row += lineDif; + } + } + } else { + var lineDif = startRow - endRow; + var colDiff = start.column - end.column; + for (; i < n; i++) { + var r = ranges[i]; + + if (r.start.row > endRow) + break; + + if (r.end.row < endRow + && ( + startRow < r.end.row + || startRow == r.end.row && start.column < r.end.column + ) + ) { + r.end.row = startRow; + r.end.column = start.column; + } + else if (r.end.row == endRow) { + if (r.end.column <= end.column) { + if (lineDif || r.end.column > start.column) { + r.end.column = start.column; + r.end.row = start.row; + } + } + else { + r.end.column += colDiff; + r.end.row += lineDif; + } + } + else if (r.end.row > endRow) { + r.end.row += lineDif; + } + + if (r.start.row < endRow + && ( + startRow < r.start.row + || startRow == r.start.row && start.column < r.start.column + ) + ) { + r.start.row = startRow; + r.start.column = start.column; + } + else if (r.start.row == endRow) { + if (r.start.column <= end.column) { + if (lineDif || r.start.column > start.column) { + r.start.column = start.column; + r.start.row = start.row; + } + } + else { + r.start.column += colDiff; + r.start.row += lineDif; + } + } + else if (r.start.row > endRow) { + r.start.row += lineDif; + } + } + } + + if (lineDif != 0 && i < n) { + for (; i < n; i++) { + var r = ranges[i]; + r.start.row += lineDif; + r.end.row += lineDif; + } + } + }; + +}).call(RangeList.prototype); + +exports.RangeList = RangeList; +}); + +define("ace/edit_session/fold",["require","exports","module","ace/range_list","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +var RangeList = require("../range_list").RangeList; +var oop = require("../lib/oop"); +var Fold = exports.Fold = function(range, placeholder) { + this.foldLine = null; + this.placeholder = placeholder; + this.range = range; + this.start = range.start; + this.end = range.end; + + this.sameRow = range.start.row == range.end.row; + this.subFolds = this.ranges = []; +}; + +oop.inherits(Fold, RangeList); + +(function() { + + this.toString = function() { + return '"' + this.placeholder + '" ' + this.range.toString(); + }; + + this.setFoldLine = function(foldLine) { + this.foldLine = foldLine; + this.subFolds.forEach(function(fold) { + fold.setFoldLine(foldLine); + }); + }; + + this.clone = function() { + var range = this.range.clone(); + var fold = new Fold(range, this.placeholder); + this.subFolds.forEach(function(subFold) { + fold.subFolds.push(subFold.clone()); + }); + fold.collapseChildren = this.collapseChildren; + return fold; + }; + + this.addSubFold = function(fold) { + if (this.range.isEqual(fold)) + return; + consumeRange(fold, this.start); + + var row = fold.start.row, column = fold.start.column; + for (var i = 0, cmp = -1; i < this.subFolds.length; i++) { + cmp = this.subFolds[i].range.compare(row, column); + if (cmp != 1) + break; + } + var afterStart = this.subFolds[i]; + var firstConsumed = 0; + + if (cmp == 0) { + if (afterStart.range.containsRange(fold)) + return afterStart.addSubFold(fold); + else + firstConsumed = 1; + } + var row = fold.range.end.row, column = fold.range.end.column; + for (var j = i, cmp = -1; j < this.subFolds.length; j++) { + cmp = this.subFolds[j].range.compare(row, column); + if (cmp != 1) + break; + } + if (cmp == 0) j++; + var consumedFolds = this.subFolds.splice(i, j - i, fold); + var last = cmp == 0 ? consumedFolds.length - 1 : consumedFolds.length; + for (var k = firstConsumed; k < last; k++) { + fold.addSubFold(consumedFolds[k]); + } + fold.setFoldLine(this.foldLine); + + return fold; + }; + + this.restoreRange = function(range) { + return restoreRange(range, this.start); + }; + +}).call(Fold.prototype); + +function consumePoint(point, anchor) { + point.row -= anchor.row; + if (point.row == 0) + point.column -= anchor.column; +} +function consumeRange(range, anchor) { + consumePoint(range.start, anchor); + consumePoint(range.end, anchor); +} +function restorePoint(point, anchor) { + if (point.row == 0) + point.column += anchor.column; + point.row += anchor.row; +} +function restoreRange(range, anchor) { + restorePoint(range.start, anchor); + restorePoint(range.end, anchor); +} + +}); + +define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +var FoldLine = require("./fold_line").FoldLine; +var Fold = require("./fold").Fold; +var TokenIterator = require("../token_iterator").TokenIterator; + +function Folding() { + this.getFoldAt = function(row, column, side) { + var foldLine = this.getFoldLine(row); + if (!foldLine) + return null; + + var folds = foldLine.folds; + for (var i = 0; i < folds.length; i++) { + var range = folds[i].range; + if (range.contains(row, column)) { + if (side == 1 && range.isEnd(row, column) && !range.isEmpty()) { + continue; + } else if (side == -1 && range.isStart(row, column) && !range.isEmpty()) { + continue; + } + return folds[i]; + } + } + }; + this.getFoldsInRange = function(range) { + var start = range.start; + var end = range.end; + var foldLines = this.$foldData; + var foundFolds = []; + + start.column += 1; + end.column -= 1; + + for (var i = 0; i < foldLines.length; i++) { + var cmp = foldLines[i].range.compareRange(range); + if (cmp == 2) { + continue; + } + else if (cmp == -2) { + break; + } + + var folds = foldLines[i].folds; + for (var j = 0; j < folds.length; j++) { + var fold = folds[j]; + cmp = fold.range.compareRange(range); + if (cmp == -2) { + break; + } else if (cmp == 2) { + continue; + } else + if (cmp == 42) { + break; + } + foundFolds.push(fold); + } + } + start.column -= 1; + end.column += 1; + + return foundFolds; + }; + + this.getFoldsInRangeList = function(ranges) { + if (Array.isArray(ranges)) { + var folds = []; + ranges.forEach(function(range) { + folds = folds.concat(this.getFoldsInRange(range)); + }, this); + } else { + var folds = this.getFoldsInRange(ranges); + } + return folds; + }; + this.getAllFolds = function() { + var folds = []; + var foldLines = this.$foldData; + + for (var i = 0; i < foldLines.length; i++) + for (var j = 0; j < foldLines[i].folds.length; j++) + folds.push(foldLines[i].folds[j]); + + return folds; + }; + this.getFoldStringAt = function(row, column, trim, foldLine) { + foldLine = foldLine || this.getFoldLine(row); + if (!foldLine) + return null; + + var lastFold = { + end: { column: 0 } + }; + var str, fold; + for (var i = 0; i < foldLine.folds.length; i++) { + fold = foldLine.folds[i]; + var cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + str = this + .getLine(fold.start.row) + .substring(lastFold.end.column, fold.start.column); + break; + } + else if (cmp === 0) { + return null; + } + lastFold = fold; + } + if (!str) + str = this.getLine(fold.start.row).substring(lastFold.end.column); + + if (trim == -1) + return str.substring(0, column - lastFold.end.column); + else if (trim == 1) + return str.substring(column - lastFold.end.column); + else + return str; + }; + + this.getFoldLine = function(docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) { + return foldLine; + } else if (foldLine.end.row > docRow) { + return null; + } + } + return null; + }; + this.getNextFoldLine = function(docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.end.row >= docRow) { + return foldLine; + } + } + return null; + }; + + this.getFoldedRowCount = function(first, last) { + var foldData = this.$foldData, rowCount = last-first+1; + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i], + end = foldLine.end.row, + start = foldLine.start.row; + if (end >= last) { + if (start < last) { + if (start >= first) + rowCount -= last-start; + else + rowCount = 0; // in one fold + } + break; + } else if (end >= first){ + if (start >= first) // fold inside range + rowCount -= end-start; + else + rowCount -= end-first+1; + } + } + return rowCount; + }; + + this.$addFoldLine = function(foldLine) { + this.$foldData.push(foldLine); + this.$foldData.sort(function(a, b) { + return a.start.row - b.start.row; + }); + return foldLine; + }; + this.addFold = function(placeholder, range) { + var foldData = this.$foldData; + var added = false; + var fold; + + if (placeholder instanceof Fold) + fold = placeholder; + else { + fold = new Fold(range, placeholder); + fold.collapseChildren = range.collapseChildren; + } + this.$clipRangeToDocument(fold.range); + + var startRow = fold.start.row; + var startColumn = fold.start.column; + var endRow = fold.end.row; + var endColumn = fold.end.column; + + var startFold = this.getFoldAt(startRow, startColumn, 1); + var endFold = this.getFoldAt(endRow, endColumn, -1); + if (startFold && endFold == startFold) + return startFold.addSubFold(fold); + + if (startFold && !startFold.range.isStart(startRow, startColumn)) + this.removeFold(startFold); + + if (endFold && !endFold.range.isEnd(endRow, endColumn)) + this.removeFold(endFold); + var folds = this.getFoldsInRange(fold.range); + if (folds.length > 0) { + this.removeFolds(folds); + if (!fold.collapseChildren) { + folds.forEach(function(subFold) { + fold.addSubFold(subFold); + }); + } + } + + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (endRow == foldLine.start.row) { + foldLine.addFold(fold); + added = true; + break; + } else if (startRow == foldLine.end.row) { + foldLine.addFold(fold); + added = true; + if (!fold.sameRow) { + var foldLineNext = foldData[i + 1]; + if (foldLineNext && foldLineNext.start.row == endRow) { + foldLine.merge(foldLineNext); + break; + } + } + break; + } else if (endRow <= foldLine.start.row) { + break; + } + } + + if (!added) + foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold)); + + if (this.$useWrapMode) + this.$updateWrapData(foldLine.start.row, foldLine.start.row); + else + this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row); + this.$modified = true; + this._signal("changeFold", { data: fold, action: "add" }); + + return fold; + }; + + this.addFolds = function(folds) { + folds.forEach(function(fold) { + this.addFold(fold); + }, this); + }; + + this.removeFold = function(fold) { + var foldLine = fold.foldLine; + var startRow = foldLine.start.row; + var endRow = foldLine.end.row; + + var foldLines = this.$foldData; + var folds = foldLine.folds; + if (folds.length == 1) { + foldLines.splice(foldLines.indexOf(foldLine), 1); + } else + if (foldLine.range.isEnd(fold.end.row, fold.end.column)) { + folds.pop(); + foldLine.end.row = folds[folds.length - 1].end.row; + foldLine.end.column = folds[folds.length - 1].end.column; + } else + if (foldLine.range.isStart(fold.start.row, fold.start.column)) { + folds.shift(); + foldLine.start.row = folds[0].start.row; + foldLine.start.column = folds[0].start.column; + } else + if (fold.sameRow) { + folds.splice(folds.indexOf(fold), 1); + } else + { + var newFoldLine = foldLine.split(fold.start.row, fold.start.column); + folds = newFoldLine.folds; + folds.shift(); + newFoldLine.start.row = folds[0].start.row; + newFoldLine.start.column = folds[0].start.column; + } + + if (!this.$updating) { + if (this.$useWrapMode) + this.$updateWrapData(startRow, endRow); + else + this.$updateRowLengthCache(startRow, endRow); + } + this.$modified = true; + this._signal("changeFold", { data: fold, action: "remove" }); + }; + + this.removeFolds = function(folds) { + var cloneFolds = []; + for (var i = 0; i < folds.length; i++) { + cloneFolds.push(folds[i]); + } + + cloneFolds.forEach(function(fold) { + this.removeFold(fold); + }, this); + this.$modified = true; + }; + + this.expandFold = function(fold) { + this.removeFold(fold); + fold.subFolds.forEach(function(subFold) { + fold.restoreRange(subFold); + this.addFold(subFold); + }, this); + if (fold.collapseChildren > 0) { + this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1); + } + fold.subFolds = []; + }; + + this.expandFolds = function(folds) { + folds.forEach(function(fold) { + this.expandFold(fold); + }, this); + }; + + this.unfold = function(location, expandInner) { + var range, folds; + if (location == null) { + range = new Range(0, 0, this.getLength(), 0); + if (expandInner == null) expandInner = true; + } else if (typeof location == "number") { + range = new Range(location, 0, location, this.getLine(location).length); + } else if ("row" in location) { + range = Range.fromPoints(location, location); + } else if (Array.isArray(location)) { + folds = []; + location.forEach(function(range) { + folds = folds.concat(this.unfold(range)); + }, this); + return folds; + } else { + range = location; + } + + folds = this.getFoldsInRangeList(range); + var outermostFolds = folds; + while ( + folds.length == 1 + && Range.comparePoints(folds[0].start, range.start) < 0 + && Range.comparePoints(folds[0].end, range.end) > 0 + ) { + this.expandFolds(folds); + folds = this.getFoldsInRangeList(range); + } + + if (expandInner != false) { + this.removeFolds(folds); + } else { + this.expandFolds(folds); + } + if (outermostFolds.length) + return outermostFolds; + }; + this.isRowFolded = function(docRow, startFoldRow) { + return !!this.getFoldLine(docRow, startFoldRow); + }; + + this.getRowFoldEnd = function(docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.end.row : docRow; + }; + + this.getRowFoldStart = function(docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.start.row : docRow; + }; + + this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) { + if (startRow == null) + startRow = foldLine.start.row; + if (startColumn == null) + startColumn = 0; + if (endRow == null) + endRow = foldLine.end.row; + if (endColumn == null) + endColumn = this.getLine(endRow).length; + var doc = this.doc; + var textLine = ""; + + foldLine.walk(function(placeholder, row, column, lastColumn) { + if (row < startRow) + return; + if (row == startRow) { + if (column < startColumn) + return; + lastColumn = Math.max(startColumn, lastColumn); + } + + if (placeholder != null) { + textLine += placeholder; + } else { + textLine += doc.getLine(row).substring(lastColumn, column); + } + }, endRow, endColumn); + return textLine; + }; + + this.getDisplayLine = function(row, endColumn, startRow, startColumn) { + var foldLine = this.getFoldLine(row); + + if (!foldLine) { + var line; + line = this.doc.getLine(row); + return line.substring(startColumn || 0, endColumn || line.length); + } else { + return this.getFoldDisplayLine( + foldLine, row, endColumn, startRow, startColumn); + } + }; + + this.$cloneFoldData = function() { + var fd = []; + fd = this.$foldData.map(function(foldLine) { + var folds = foldLine.folds.map(function(fold) { + return fold.clone(); + }); + return new FoldLine(fd, folds); + }); + + return fd; + }; + + this.toggleFold = function(tryToUnfold) { + var selection = this.selection; + var range = selection.getRange(); + var fold; + var bracketPos; + + if (range.isEmpty()) { + var cursor = range.start; + fold = this.getFoldAt(cursor.row, cursor.column); + + if (fold) { + this.expandFold(fold); + return; + } else if (bracketPos = this.findMatchingBracket(cursor)) { + if (range.comparePoint(bracketPos) == 1) { + range.end = bracketPos; + } else { + range.start = bracketPos; + range.start.column++; + range.end.column--; + } + } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) { + if (range.comparePoint(bracketPos) == 1) + range.end = bracketPos; + else + range.start = bracketPos; + + range.start.column++; + } else { + range = this.getCommentFoldRange(cursor.row, cursor.column) || range; + } + } else { + var folds = this.getFoldsInRange(range); + if (tryToUnfold && folds.length) { + this.expandFolds(folds); + return; + } else if (folds.length == 1 ) { + fold = folds[0]; + } + } + + if (!fold) + fold = this.getFoldAt(range.start.row, range.start.column); + + if (fold && fold.range.toString() == range.toString()) { + this.expandFold(fold); + return; + } + + var placeholder = "..."; + if (!range.isMultiLine()) { + placeholder = this.getTextRange(range); + if (placeholder.length < 4) + return; + placeholder = placeholder.trim().substring(0, 2) + ".."; + } + + this.addFold(placeholder, range); + }; + + this.getCommentFoldRange = function(row, column, dir) { + var iterator = new TokenIterator(this, row, column); + var token = iterator.getCurrentToken(); + var type = token && token.type; + if (token && /^comment|string/.test(type)) { + type = type.match(/comment|string/)[0]; + if (type == "comment") + type += "|doc-start"; + var re = new RegExp(type); + var range = new Range(); + if (dir != 1) { + do { + token = iterator.stepBackward(); + } while (token && re.test(token.type)); + iterator.stepForward(); + } + + range.start.row = iterator.getCurrentTokenRow(); + range.start.column = iterator.getCurrentTokenColumn() + 2; + + iterator = new TokenIterator(this, row, column); + + if (dir != -1) { + var lastRow = -1; + do { + token = iterator.stepForward(); + if (lastRow == -1) { + var state = this.getState(iterator.$row); + if (!re.test(state)) + lastRow = iterator.$row; + } else if (iterator.$row > lastRow) { + break; + } + } while (token && re.test(token.type)); + token = iterator.stepBackward(); + } else + token = iterator.getCurrentToken(); + + range.end.row = iterator.getCurrentTokenRow(); + range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2; + return range; + } + }; + + this.foldAll = function(startRow, endRow, depth, test) { + if (depth == undefined) + depth = 100000; // JSON.stringify doesn't hanle Infinity + var foldWidgets = this.foldWidgets; + if (!foldWidgets) + return; // mode doesn't support folding + endRow = endRow || this.getLength(); + startRow = startRow || 0; + for (var row = startRow; row < endRow; row++) { + if (foldWidgets[row] == null) + foldWidgets[row] = this.getFoldWidget(row); + if (foldWidgets[row] != "start") + continue; + + if (test && !test(row)) continue; + + var range = this.getFoldWidgetRange(row); + if (range && range.isMultiLine() + && range.end.row <= endRow + && range.start.row >= startRow + ) { + row = range.end.row; + range.collapseChildren = depth; + this.addFold("...", range); + } + } + }; + + this.foldToLevel = function(level) { + this.foldAll(); + while (level-- > 0) + this.unfold(null, false); + }; + + this.foldAllComments = function() { + var session = this; + this.foldAll(null, null, null, function(row) { + var tokens = session.getTokens(row); + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token.type == "text" && /^\s+$/.test(token.value)) + continue; + if (/comment/.test(token.type)) + return true; + return false; + } + }); + }; + this.$foldStyles = { + "manual": 1, + "markbegin": 1, + "markbeginend": 1 + }; + this.$foldStyle = "markbegin"; + this.setFoldStyle = function(style) { + if (!this.$foldStyles[style]) + throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]"); + + if (this.$foldStyle == style) + return; + + this.$foldStyle = style; + + if (style == "manual") + this.unfold(); + var mode = this.$foldMode; + this.$setFolding(null); + this.$setFolding(mode); + }; + + this.$setFolding = function(foldMode) { + if (this.$foldMode == foldMode) + return; + + this.$foldMode = foldMode; + + this.off('change', this.$updateFoldWidgets); + this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + this._signal("changeAnnotation"); + + if (!foldMode || this.$foldStyle == "manual") { + this.foldWidgets = null; + return; + } + + this.foldWidgets = []; + this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle); + this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); + + this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); + this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this); + this.on('change', this.$updateFoldWidgets); + this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + }; + + this.getParentFoldRangeData = function (row, ignoreCurrent) { + var fw = this.foldWidgets; + if (!fw || (ignoreCurrent && fw[row])) + return {}; + + var i = row - 1, firstRange; + while (i >= 0) { + var c = fw[i]; + if (c == null) + c = fw[i] = this.getFoldWidget(i); + + if (c == "start") { + var range = this.getFoldWidgetRange(i); + if (!firstRange) + firstRange = range; + if (range && range.end.row >= row) + break; + } + i--; + } + + return { + range: i !== -1 && range, + firstRange: firstRange + }; + }; + + this.onFoldWidgetClick = function(row, e) { + e = e.domEvent; + var options = { + children: e.shiftKey, + all: e.ctrlKey || e.metaKey, + siblings: e.altKey + }; + + var range = this.$toggleFoldWidget(row, options); + if (!range) { + var el = (e.target || e.srcElement); + if (el && /ace_fold-widget/.test(el.className)) + el.className += " ace_invalid"; + } + }; + + this.$toggleFoldWidget = function(row, options) { + if (!this.getFoldWidget) + return; + var type = this.getFoldWidget(row); + var line = this.getLine(row); + + var dir = type === "end" ? -1 : 1; + var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir); + + if (fold) { + if (options.children || options.all) + this.removeFold(fold); + else + this.expandFold(fold); + return fold; + } + + var range = this.getFoldWidgetRange(row, true); + if (range && !range.isMultiLine()) { + fold = this.getFoldAt(range.start.row, range.start.column, 1); + if (fold && range.isEqual(fold.range)) { + this.removeFold(fold); + return fold; + } + } + + if (options.siblings) { + var data = this.getParentFoldRangeData(row); + if (data.range) { + var startRow = data.range.start.row + 1; + var endRow = data.range.end.row; + } + this.foldAll(startRow, endRow, options.all ? 10000 : 0); + } else if (options.children) { + endRow = range ? range.end.row : this.getLength(); + this.foldAll(row + 1, endRow, options.all ? 10000 : 0); + } else if (range) { + if (options.all) + range.collapseChildren = 10000; + this.addFold("...", range); + } + + return range; + }; + + + + this.toggleFoldWidget = function(toggleParent) { + var row = this.selection.getCursor().row; + row = this.getRowFoldStart(row); + var range = this.$toggleFoldWidget(row, {}); + + if (range) + return; + var data = this.getParentFoldRangeData(row, true); + range = data.range || data.firstRange; + + if (range) { + row = range.start.row; + var fold = this.getFoldAt(row, this.getLine(row).length, 1); + + if (fold) { + this.removeFold(fold); + } else { + this.addFold("...", range); + } + } + }; + + this.updateFoldWidgets = function(delta) { + var firstRow = delta.start.row; + var len = delta.end.row - firstRow; + + if (len === 0) { + this.foldWidgets[firstRow] = null; + } else if (delta.action == 'remove') { + this.foldWidgets.splice(firstRow, len + 1, null); + } else { + var args = Array(len + 1); + args.unshift(firstRow, 1); + this.foldWidgets.splice.apply(this.foldWidgets, args); + } + }; + this.tokenizerUpdateFoldWidgets = function(e) { + var rows = e.data; + if (rows.first != rows.last) { + if (this.foldWidgets.length > rows.first) + this.foldWidgets.splice(rows.first, this.foldWidgets.length); + } + }; +} + +exports.Folding = Folding; + +}); + +define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; + + +function BracketMatch() { + + this.findMatchingBracket = function(position, chr) { + if (position.column == 0) return null; + + var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1); + if (charBeforeCursor == "") return null; + + var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); + if (!match) + return null; + + if (match[1]) + return this.$findClosingBracket(match[1], position); + else + return this.$findOpeningBracket(match[2], position); + }; + + this.getBracketRange = function(pos) { + var line = this.getLine(pos.row); + var before = true, range; + + var chr = line.charAt(pos.column - 1); + var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + if (!match) { + chr = line.charAt(pos.column); + pos = {row: pos.row, column: pos.column + 1}; + match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + before = false; + } + if (!match) + return null; + + if (match[1]) { + var bracketPos = this.$findClosingBracket(match[1], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(pos, bracketPos); + if (!before) { + range.end.column++; + range.start.column--; + } + range.cursor = range.end; + } else { + var bracketPos = this.$findOpeningBracket(match[2], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(bracketPos, pos); + if (!before) { + range.start.column++; + range.end.column--; + } + range.cursor = range.start; + } + + return range; + }; + this.getMatchingBracketRanges = function(pos) { + var line = this.getLine(pos.row); + + var chr = line.charAt(pos.column - 1); + var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + if (!match) { + chr = line.charAt(pos.column); + pos = {row: pos.row, column: pos.column + 1}; + match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + } + + if (!match) + return null; + + var startRange = new Range(pos.row, pos.column - 1, pos.row, pos.column); + var bracketPos = match[1] ? this.$findClosingBracket(match[1], pos) + : this.$findOpeningBracket(match[2], pos); + if (!bracketPos) + return [startRange]; + var endRange = new Range(bracketPos.row, bracketPos.column, bracketPos.row, bracketPos.column + 1); + + return [startRange, endRange]; + }; + + this.$brackets = { + ")": "(", + "(": ")", + "]": "[", + "[": "]", + "{": "}", + "}": "{", + "<": ">", + ">": "<" + }; + + this.$findOpeningBracket = function(bracket, position, typeRe) { + var openBracket = this.$brackets[bracket]; + var depth = 1; + + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + + if (!typeRe){ + typeRe = new RegExp( + "(\\.?" + + token.type.replace(".", "\\.").replace("rparen", ".paren") + .replace(/\b(?:end)\b/, "(?:start|begin|end)") + + ")+" + ); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2; + var value = token.value; + + while (true) { + + while (valueIndex >= 0) { + var chr = value.charAt(valueIndex); + if (chr == openBracket) { + depth -= 1; + if (depth == 0) { + return {row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn()}; + } + } + else if (chr == bracket) { + depth += 1; + } + valueIndex -= 1; + } + do { + token = iterator.stepBackward(); + } while (token && !typeRe.test(token.type)); + + if (token == null) + break; + + value = token.value; + valueIndex = value.length - 1; + } + + return null; + }; + + this.$findClosingBracket = function(bracket, position, typeRe) { + var closingBracket = this.$brackets[bracket]; + var depth = 1; + + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + + if (!typeRe){ + typeRe = new RegExp( + "(\\.?" + + token.type.replace(".", "\\.").replace("lparen", ".paren") + .replace(/\b(?:start|begin)\b/, "(?:start|begin|end)") + + ")+" + ); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn(); + + while (true) { + + var value = token.value; + var valueLength = value.length; + while (valueIndex < valueLength) { + var chr = value.charAt(valueIndex); + if (chr == closingBracket) { + depth -= 1; + if (depth == 0) { + return {row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn()}; + } + } + else if (chr == bracket) { + depth += 1; + } + valueIndex += 1; + } + do { + token = iterator.stepForward(); + } while (token && !typeRe.test(token.type)); + + if (token == null) + break; + + valueIndex = 0; + } + + return null; + }; +} +exports.BracketMatch = BracketMatch; + +}); + +define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/bidihandler","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/search_highlight","ace/edit_session/folding","ace/edit_session/bracket_match"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var BidiHandler = require("./bidihandler").BidiHandler; +var config = require("./config"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Selection = require("./selection").Selection; +var TextMode = require("./mode/text").Mode; +var Range = require("./range").Range; +var Document = require("./document").Document; +var BackgroundTokenizer = require("./background_tokenizer").BackgroundTokenizer; +var SearchHighlight = require("./search_highlight").SearchHighlight; + +var EditSession = function(text, mode) { + this.$breakpoints = []; + this.$decorations = []; + this.$frontMarkers = {}; + this.$backMarkers = {}; + this.$markerId = 1; + this.$undoSelect = true; + + this.$foldData = []; + this.id = "session" + (++EditSession.$uid); + this.$foldData.toString = function() { + return this.join("\n"); + }; + this.bgTokenizer = new BackgroundTokenizer((new TextMode()).getTokenizer(), this); + + var _self = this; + this.bgTokenizer.on("update", function(e) { + _self._signal("tokenizerUpdate", e); + }); + + this.on("changeFold", this.onChangeFold.bind(this)); + this.$onChange = this.onChange.bind(this); + + if (typeof text != "object" || !text.getLine) + text = new Document(text); + + this.setDocument(text); + this.selection = new Selection(this); + this.$bidiHandler = new BidiHandler(this); + + config.resetOptions(this); + this.setMode(mode); + config._signal("session", this); + + this.destroyed = false; +}; + + +EditSession.$uid = 0; + +(function() { + + oop.implement(this, EventEmitter); + this.setDocument = function(doc) { + if (this.doc) + this.doc.off("change", this.$onChange); + + this.doc = doc; + doc.on("change", this.$onChange, true); + + this.bgTokenizer.setDocument(this.getDocument()); + + this.resetCaches(); + }; + this.getDocument = function() { + return this.doc; + }; + this.$resetRowCache = function(docRow) { + if (!docRow) { + this.$docRowCache = []; + this.$screenRowCache = []; + return; + } + var l = this.$docRowCache.length; + var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1; + if (l > i) { + this.$docRowCache.splice(i, l); + this.$screenRowCache.splice(i, l); + } + }; + + this.$getRowCacheIndex = function(cacheArray, val) { + var low = 0; + var hi = cacheArray.length - 1; + + while (low <= hi) { + var mid = (low + hi) >> 1; + var c = cacheArray[mid]; + + if (val > c) + low = mid + 1; + else if (val < c) + hi = mid - 1; + else + return mid; + } + + return low -1; + }; + + this.resetCaches = function() { + this.$modified = true; + this.$wrapData = []; + this.$rowLengthCache = []; + this.$resetRowCache(0); + if (!this.destroyed) + this.bgTokenizer.start(0); + }; + + this.onChangeFold = function(e) { + var fold = e.data; + this.$resetRowCache(fold.start.row); + }; + + this.onChange = function(delta) { + this.$modified = true; + this.$bidiHandler.onChange(delta); + this.$resetRowCache(delta.start.row); + + var removedFolds = this.$updateInternalDataOnChange(delta); + if (!this.$fromUndo && this.$undoManager) { + if (removedFolds && removedFolds.length) { + this.$undoManager.add({ + action: "removeFolds", + folds: removedFolds + }, this.mergeUndoDeltas); + this.mergeUndoDeltas = true; + } + this.$undoManager.add(delta, this.mergeUndoDeltas); + this.mergeUndoDeltas = true; + + this.$informUndoManager.schedule(); + } + + this.bgTokenizer.$updateOnChange(delta); + this._signal("change", delta); + }; + this.setValue = function(text) { + this.doc.setValue(text); + this.selection.moveTo(0, 0); + + this.$resetRowCache(0); + this.setUndoManager(this.$undoManager); + this.getUndoManager().reset(); + }; + this.getValue = + this.toString = function() { + return this.doc.getValue(); + }; + this.getSelection = function() { + return this.selection; + }; + this.getState = function(row) { + return this.bgTokenizer.getState(row); + }; + this.getTokens = function(row) { + return this.bgTokenizer.getTokens(row); + }; + this.getTokenAt = function(row, column) { + var tokens = this.bgTokenizer.getTokens(row); + var token, c = 0; + if (column == null) { + var i = tokens.length - 1; + c = this.getLine(row).length; + } else { + for (var i = 0; i < tokens.length; i++) { + c += tokens[i].value.length; + if (c >= column) + break; + } + } + token = tokens[i]; + if (!token) + return null; + token.index = i; + token.start = c - token.value.length; + return token; + }; + this.setUndoManager = function(undoManager) { + this.$undoManager = undoManager; + + if (this.$informUndoManager) + this.$informUndoManager.cancel(); + + if (undoManager) { + var self = this; + undoManager.addSession(this); + this.$syncInformUndoManager = function() { + self.$informUndoManager.cancel(); + self.mergeUndoDeltas = false; + }; + this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager); + } else { + this.$syncInformUndoManager = function() {}; + } + }; + this.markUndoGroup = function() { + if (this.$syncInformUndoManager) + this.$syncInformUndoManager(); + }; + + this.$defaultUndoManager = { + undo: function() {}, + redo: function() {}, + hasUndo: function() {}, + hasRedo: function() {}, + reset: function() {}, + add: function() {}, + addSelection: function() {}, + startNewGroup: function() {}, + addSession: function() {} + }; + this.getUndoManager = function() { + return this.$undoManager || this.$defaultUndoManager; + }; + this.getTabString = function() { + if (this.getUseSoftTabs()) { + return lang.stringRepeat(" ", this.getTabSize()); + } else { + return "\t"; + } + }; + this.setUseSoftTabs = function(val) { + this.setOption("useSoftTabs", val); + }; + this.getUseSoftTabs = function() { + return this.$useSoftTabs && !this.$mode.$indentWithTabs; + }; + this.setTabSize = function(tabSize) { + this.setOption("tabSize", tabSize); + }; + this.getTabSize = function() { + return this.$tabSize; + }; + this.isTabStop = function(position) { + return this.$useSoftTabs && (position.column % this.$tabSize === 0); + }; + this.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) { + this.setOption("navigateWithinSoftTabs", navigateWithinSoftTabs); + }; + this.getNavigateWithinSoftTabs = function() { + return this.$navigateWithinSoftTabs; + }; + + this.$overwrite = false; + this.setOverwrite = function(overwrite) { + this.setOption("overwrite", overwrite); + }; + this.getOverwrite = function() { + return this.$overwrite; + }; + this.toggleOverwrite = function() { + this.setOverwrite(!this.$overwrite); + }; + this.addGutterDecoration = function(row, className) { + if (!this.$decorations[row]) + this.$decorations[row] = ""; + this.$decorations[row] += " " + className; + this._signal("changeBreakpoint", {}); + }; + this.removeGutterDecoration = function(row, className) { + this.$decorations[row] = (this.$decorations[row] || "").replace(" " + className, ""); + this._signal("changeBreakpoint", {}); + }; + this.getBreakpoints = function() { + return this.$breakpoints; + }; + this.setBreakpoints = function(rows) { + this.$breakpoints = []; + for (var i=0; i 0) + inToken = !!line.charAt(column - 1).match(this.tokenRe); + + if (!inToken) + inToken = !!line.charAt(column).match(this.tokenRe); + + if (inToken) + var re = this.tokenRe; + else if (/^\s+$/.test(line.slice(column-1, column+1))) + var re = /\s/; + else + var re = this.nonTokenRe; + + var start = column; + if (start > 0) { + do { + start--; + } + while (start >= 0 && line.charAt(start).match(re)); + start++; + } + + var end = column; + while (end < line.length && line.charAt(end).match(re)) { + end++; + } + + return new Range(row, start, row, end); + }; + this.getAWordRange = function(row, column) { + var wordRange = this.getWordRange(row, column); + var line = this.getLine(wordRange.end.row); + + while (line.charAt(wordRange.end.column).match(/[ \t]/)) { + wordRange.end.column += 1; + } + return wordRange; + }; + this.setNewLineMode = function(newLineMode) { + this.doc.setNewLineMode(newLineMode); + }; + this.getNewLineMode = function() { + return this.doc.getNewLineMode(); + }; + this.setUseWorker = function(useWorker) { this.setOption("useWorker", useWorker); }; + this.getUseWorker = function() { return this.$useWorker; }; + this.onReloadTokenizer = function(e) { + var rows = e.data; + this.bgTokenizer.start(rows.first); + this._signal("tokenizerUpdate", e); + }; + + this.$modes = config.$modes; + this.$mode = null; + this.$modeId = null; + this.setMode = function(mode, cb) { + if (mode && typeof mode === "object") { + if (mode.getTokenizer) + return this.$onChangeMode(mode); + var options = mode; + var path = options.path; + } else { + path = mode || "ace/mode/text"; + } + if (!this.$modes["ace/mode/text"]) + this.$modes["ace/mode/text"] = new TextMode(); + + if (this.$modes[path] && !options) { + this.$onChangeMode(this.$modes[path]); + cb && cb(); + return; + } + this.$modeId = path; + config.loadModule(["mode", path], function(m) { + if (this.$modeId !== path) + return cb && cb(); + if (this.$modes[path] && !options) { + this.$onChangeMode(this.$modes[path]); + } else if (m && m.Mode) { + m = new m.Mode(options); + if (!options) { + this.$modes[path] = m; + m.$id = path; + } + this.$onChangeMode(m); + } + cb && cb(); + }.bind(this)); + if (!this.$mode) + this.$onChangeMode(this.$modes["ace/mode/text"], true); + }; + + this.$onChangeMode = function(mode, $isPlaceholder) { + if (!$isPlaceholder) + this.$modeId = mode.$id; + if (this.$mode === mode) + return; + + var oldMode = this.$mode; + this.$mode = mode; + + this.$stopWorker(); + + if (this.$useWorker) + this.$startWorker(); + + var tokenizer = mode.getTokenizer(); + + if(tokenizer.on !== undefined) { + var onReloadTokenizer = this.onReloadTokenizer.bind(this); + tokenizer.on("update", onReloadTokenizer); + } + + this.bgTokenizer.setTokenizer(tokenizer); + this.bgTokenizer.setDocument(this.getDocument()); + + this.tokenRe = mode.tokenRe; + this.nonTokenRe = mode.nonTokenRe; + + + if (!$isPlaceholder) { + if (mode.attachToSession) + mode.attachToSession(this); + this.$options.wrapMethod.set.call(this, this.$wrapMethod); + this.$setFolding(mode.foldingRules); + this.bgTokenizer.start(0); + this._emit("changeMode", {oldMode: oldMode, mode: mode}); + } + }; + + this.$stopWorker = function() { + if (this.$worker) { + this.$worker.terminate(); + this.$worker = null; + } + }; + + this.$startWorker = function() { + try { + this.$worker = this.$mode.createWorker(this); + } catch (e) { + config.warn("Could not load worker", e); + this.$worker = null; + } + }; + this.getMode = function() { + return this.$mode; + }; + + this.$scrollTop = 0; + this.setScrollTop = function(scrollTop) { + if (this.$scrollTop === scrollTop || isNaN(scrollTop)) + return; + + this.$scrollTop = scrollTop; + this._signal("changeScrollTop", scrollTop); + }; + this.getScrollTop = function() { + return this.$scrollTop; + }; + + this.$scrollLeft = 0; + this.setScrollLeft = function(scrollLeft) { + if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft)) + return; + + this.$scrollLeft = scrollLeft; + this._signal("changeScrollLeft", scrollLeft); + }; + this.getScrollLeft = function() { + return this.$scrollLeft; + }; + this.getScreenWidth = function() { + this.$computeWidth(); + if (this.lineWidgets) + return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth); + return this.screenWidth; + }; + + this.getLineWidgetMaxWidth = function() { + if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth; + var width = 0; + this.lineWidgets.forEach(function(w) { + if (w && w.screenWidth > width) + width = w.screenWidth; + }); + return this.lineWidgetWidth = width; + }; + + this.$computeWidth = function(force) { + if (this.$modified || force) { + this.$modified = false; + + if (this.$useWrapMode) + return this.screenWidth = this.$wrapLimit; + + var lines = this.doc.getAllLines(); + var cache = this.$rowLengthCache; + var longestScreenLine = 0; + var foldIndex = 0; + var foldLine = this.$foldData[foldIndex]; + var foldStart = foldLine ? foldLine.start.row : Infinity; + var len = lines.length; + + for (var i = 0; i < len; i++) { + if (i > foldStart) { + i = foldLine.end.row + 1; + if (i >= len) + break; + foldLine = this.$foldData[foldIndex++]; + foldStart = foldLine ? foldLine.start.row : Infinity; + } + + if (cache[i] == null) + cache[i] = this.$getStringScreenWidth(lines[i])[0]; + + if (cache[i] > longestScreenLine) + longestScreenLine = cache[i]; + } + this.screenWidth = longestScreenLine; + } + }; + this.getLine = function(row) { + return this.doc.getLine(row); + }; + this.getLines = function(firstRow, lastRow) { + return this.doc.getLines(firstRow, lastRow); + }; + this.getLength = function() { + return this.doc.getLength(); + }; + this.getTextRange = function(range) { + return this.doc.getTextRange(range || this.selection.getRange()); + }; + this.insert = function(position, text) { + return this.doc.insert(position, text); + }; + this.remove = function(range) { + return this.doc.remove(range); + }; + this.removeFullLines = function(firstRow, lastRow){ + return this.doc.removeFullLines(firstRow, lastRow); + }; + this.undoChanges = function(deltas, dontSelect) { + if (!deltas.length) + return; + + this.$fromUndo = true; + for (var i = deltas.length - 1; i != -1; i--) { + var delta = deltas[i]; + if (delta.action == "insert" || delta.action == "remove") { + this.doc.revertDelta(delta); + } else if (delta.folds) { + this.addFolds(delta.folds); + } + } + if (!dontSelect && this.$undoSelect) { + if (deltas.selectionBefore) + this.selection.fromJSON(deltas.selectionBefore); + else + this.selection.setRange(this.$getUndoSelection(deltas, true)); + } + this.$fromUndo = false; + }; + this.redoChanges = function(deltas, dontSelect) { + if (!deltas.length) + return; + + this.$fromUndo = true; + for (var i = 0; i < deltas.length; i++) { + var delta = deltas[i]; + if (delta.action == "insert" || delta.action == "remove") { + this.doc.$safeApplyDelta(delta); + } + } + + if (!dontSelect && this.$undoSelect) { + if (deltas.selectionAfter) + this.selection.fromJSON(deltas.selectionAfter); + else + this.selection.setRange(this.$getUndoSelection(deltas, false)); + } + this.$fromUndo = false; + }; + this.setUndoSelect = function(enable) { + this.$undoSelect = enable; + }; + + this.$getUndoSelection = function(deltas, isUndo) { + function isInsert(delta) { + return isUndo ? delta.action !== "insert" : delta.action === "insert"; + } + + var range, point; + + for (var i = 0; i < deltas.length; i++) { + var delta = deltas[i]; + if (!delta.start) continue; // skip folds + if (!range) { + if (isInsert(delta)) { + range = Range.fromPoints(delta.start, delta.end); + } else { + range = Range.fromPoints(delta.start, delta.start); + } + continue; + } + + if (isInsert(delta)) { + point = delta.start; + if (range.compare(point.row, point.column) == -1) { + range.setStart(point); + } + point = delta.end; + if (range.compare(point.row, point.column) == 1) { + range.setEnd(point); + } + } else { + point = delta.start; + if (range.compare(point.row, point.column) == -1) { + range = Range.fromPoints(delta.start, delta.start); + } + } + } + return range; + }; + this.replace = function(range, text) { + return this.doc.replace(range, text); + }; + this.moveText = function(fromRange, toPosition, copy) { + var text = this.getTextRange(fromRange); + var folds = this.getFoldsInRange(fromRange); + + var toRange = Range.fromPoints(toPosition, toPosition); + if (!copy) { + this.remove(fromRange); + var rowDiff = fromRange.start.row - fromRange.end.row; + var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column; + if (collDiff) { + if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column) + toRange.start.column += collDiff; + if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column) + toRange.end.column += collDiff; + } + if (rowDiff && toRange.start.row >= fromRange.end.row) { + toRange.start.row += rowDiff; + toRange.end.row += rowDiff; + } + } + + toRange.end = this.insert(toRange.start, text); + if (folds.length) { + var oldStart = fromRange.start; + var newStart = toRange.start; + var rowDiff = newStart.row - oldStart.row; + var collDiff = newStart.column - oldStart.column; + this.addFolds(folds.map(function(x) { + x = x.clone(); + if (x.start.row == oldStart.row) + x.start.column += collDiff; + if (x.end.row == oldStart.row) + x.end.column += collDiff; + x.start.row += rowDiff; + x.end.row += rowDiff; + return x; + })); + } + + return toRange; + }; + this.indentRows = function(startRow, endRow, indentString) { + indentString = indentString.replace(/\t/g, this.getTabString()); + for (var row=startRow; row<=endRow; row++) + this.doc.insertInLine({row: row, column: 0}, indentString); + }; + this.outdentRows = function (range) { + var rowRange = range.collapseRows(); + var deleteRange = new Range(0, 0, 0, 0); + var size = this.getTabSize(); + + for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) { + var line = this.getLine(i); + + deleteRange.start.row = i; + deleteRange.end.row = i; + for (var j = 0; j < size; ++j) + if (line.charAt(j) != ' ') + break; + if (j < size && line.charAt(j) == '\t') { + deleteRange.start.column = j; + deleteRange.end.column = j + 1; + } else { + deleteRange.start.column = 0; + deleteRange.end.column = j; + } + this.remove(deleteRange); + } + }; + + this.$moveLines = function(firstRow, lastRow, dir) { + firstRow = this.getRowFoldStart(firstRow); + lastRow = this.getRowFoldEnd(lastRow); + if (dir < 0) { + var row = this.getRowFoldStart(firstRow + dir); + if (row < 0) return 0; + var diff = row-firstRow; + } else if (dir > 0) { + var row = this.getRowFoldEnd(lastRow + dir); + if (row > this.doc.getLength()-1) return 0; + var diff = row-lastRow; + } else { + firstRow = this.$clipRowToDocument(firstRow); + lastRow = this.$clipRowToDocument(lastRow); + var diff = lastRow - firstRow + 1; + } + + var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE); + var folds = this.getFoldsInRange(range).map(function(x){ + x = x.clone(); + x.start.row += diff; + x.end.row += diff; + return x; + }); + + var lines = dir == 0 + ? this.doc.getLines(firstRow, lastRow) + : this.doc.removeFullLines(firstRow, lastRow); + this.doc.insertFullLines(firstRow+diff, lines); + folds.length && this.addFolds(folds); + return diff; + }; + this.moveLinesUp = function(firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, -1); + }; + this.moveLinesDown = function(firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 1); + }; + this.duplicateLines = function(firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 0); + }; + + + this.$clipRowToDocument = function(row) { + return Math.max(0, Math.min(row, this.doc.getLength()-1)); + }; + + this.$clipColumnToRow = function(row, column) { + if (column < 0) + return 0; + return Math.min(this.doc.getLine(row).length, column); + }; + + + this.$clipPositionToDocument = function(row, column) { + column = Math.max(0, column); + + if (row < 0) { + row = 0; + column = 0; + } else { + var len = this.doc.getLength(); + if (row >= len) { + row = len - 1; + column = this.doc.getLine(len-1).length; + } else { + column = Math.min(this.doc.getLine(row).length, column); + } + } + + return { + row: row, + column: column + }; + }; + + this.$clipRangeToDocument = function(range) { + if (range.start.row < 0) { + range.start.row = 0; + range.start.column = 0; + } else { + range.start.column = this.$clipColumnToRow( + range.start.row, + range.start.column + ); + } + + var len = this.doc.getLength() - 1; + if (range.end.row > len) { + range.end.row = len; + range.end.column = this.doc.getLine(len).length; + } else { + range.end.column = this.$clipColumnToRow( + range.end.row, + range.end.column + ); + } + return range; + }; + this.$wrapLimit = 80; + this.$useWrapMode = false; + this.$wrapLimitRange = { + min : null, + max : null + }; + this.setUseWrapMode = function(useWrapMode) { + if (useWrapMode != this.$useWrapMode) { + this.$useWrapMode = useWrapMode; + this.$modified = true; + this.$resetRowCache(0); + if (useWrapMode) { + var len = this.getLength(); + this.$wrapData = Array(len); + this.$updateWrapData(0, len - 1); + } + + this._signal("changeWrapMode"); + } + }; + this.getUseWrapMode = function() { + return this.$useWrapMode; + }; + this.setWrapLimitRange = function(min, max) { + if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) { + this.$wrapLimitRange = { min: min, max: max }; + this.$modified = true; + this.$bidiHandler.markAsDirty(); + if (this.$useWrapMode) + this._signal("changeWrapMode"); + } + }; + this.adjustWrapLimit = function(desiredLimit, $printMargin) { + var limits = this.$wrapLimitRange; + if (limits.max < 0) + limits = {min: $printMargin, max: $printMargin}; + var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max); + if (wrapLimit != this.$wrapLimit && wrapLimit > 1) { + this.$wrapLimit = wrapLimit; + this.$modified = true; + if (this.$useWrapMode) { + this.$updateWrapData(0, this.getLength() - 1); + this.$resetRowCache(0); + this._signal("changeWrapLimit"); + } + return true; + } + return false; + }; + + this.$constrainWrapLimit = function(wrapLimit, min, max) { + if (min) + wrapLimit = Math.max(min, wrapLimit); + + if (max) + wrapLimit = Math.min(max, wrapLimit); + + return wrapLimit; + }; + this.getWrapLimit = function() { + return this.$wrapLimit; + }; + this.setWrapLimit = function (limit) { + this.setWrapLimitRange(limit, limit); + }; + this.getWrapLimitRange = function() { + return { + min : this.$wrapLimitRange.min, + max : this.$wrapLimitRange.max + }; + }; + + this.$updateInternalDataOnChange = function(delta) { + var useWrapMode = this.$useWrapMode; + var action = delta.action; + var start = delta.start; + var end = delta.end; + var firstRow = start.row; + var lastRow = end.row; + var len = lastRow - firstRow; + var removedFolds = null; + + this.$updating = true; + if (len != 0) { + if (action === "remove") { + this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len); + + var foldLines = this.$foldData; + removedFolds = this.getFoldsInRange(delta); + this.removeFolds(removedFolds); + + var foldLine = this.getFoldLine(end.row); + var idx = 0; + if (foldLine) { + foldLine.addRemoveChars(end.row, end.column, start.column - end.column); + foldLine.shiftRow(-len); + + var foldLineBefore = this.getFoldLine(firstRow); + if (foldLineBefore && foldLineBefore !== foldLine) { + foldLineBefore.merge(foldLine); + foldLine = foldLineBefore; + } + idx = foldLines.indexOf(foldLine) + 1; + } + + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= end.row) { + foldLine.shiftRow(-len); + } + } + + lastRow = firstRow; + } else { + var args = Array(len); + args.unshift(firstRow, 0); + var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache; + arr.splice.apply(arr, args); + var foldLines = this.$foldData; + var foldLine = this.getFoldLine(firstRow); + var idx = 0; + if (foldLine) { + var cmp = foldLine.range.compareInside(start.row, start.column); + if (cmp == 0) { + foldLine = foldLine.split(start.row, start.column); + if (foldLine) { + foldLine.shiftRow(len); + foldLine.addRemoveChars(lastRow, 0, end.column - start.column); + } + } else + if (cmp == -1) { + foldLine.addRemoveChars(firstRow, 0, end.column - start.column); + foldLine.shiftRow(len); + } + idx = foldLines.indexOf(foldLine) + 1; + } + + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= firstRow) { + foldLine.shiftRow(len); + } + } + } + } else { + len = Math.abs(delta.start.column - delta.end.column); + if (action === "remove") { + removedFolds = this.getFoldsInRange(delta); + this.removeFolds(removedFolds); + + len = -len; + } + var foldLine = this.getFoldLine(firstRow); + if (foldLine) { + foldLine.addRemoveChars(firstRow, start.column, len); + } + } + + if (useWrapMode && this.$wrapData.length != this.doc.getLength()) { + console.error("doc.getLength() and $wrapData.length have to be the same!"); + } + this.$updating = false; + + if (useWrapMode) + this.$updateWrapData(firstRow, lastRow); + else + this.$updateRowLengthCache(firstRow, lastRow); + + return removedFolds; + }; + + this.$updateRowLengthCache = function(firstRow, lastRow, b) { + this.$rowLengthCache[firstRow] = null; + this.$rowLengthCache[lastRow] = null; + }; + + this.$updateWrapData = function(firstRow, lastRow) { + var lines = this.doc.getAllLines(); + var tabSize = this.getTabSize(); + var wrapData = this.$wrapData; + var wrapLimit = this.$wrapLimit; + var tokens; + var foldLine; + + var row = firstRow; + lastRow = Math.min(lastRow, lines.length - 1); + while (row <= lastRow) { + foldLine = this.getFoldLine(row, foldLine); + if (!foldLine) { + tokens = this.$getDisplayTokens(lines[row]); + wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row ++; + } else { + tokens = []; + foldLine.walk(function(placeholder, row, column, lastColumn) { + var walkTokens; + if (placeholder != null) { + walkTokens = this.$getDisplayTokens( + placeholder, tokens.length); + walkTokens[0] = PLACEHOLDER_START; + for (var i = 1; i < walkTokens.length; i++) { + walkTokens[i] = PLACEHOLDER_BODY; + } + } else { + walkTokens = this.$getDisplayTokens( + lines[row].substring(lastColumn, column), + tokens.length); + } + tokens = tokens.concat(walkTokens); + }.bind(this), + foldLine.end.row, + lines[foldLine.end.row].length + 1 + ); + + wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row = foldLine.end.row + 1; + } + } + }; + var CHAR = 1, + CHAR_EXT = 2, + PLACEHOLDER_START = 3, + PLACEHOLDER_BODY = 4, + PUNCTUATION = 9, + SPACE = 10, + TAB = 11, + TAB_SPACE = 12; + + + this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) { + if (tokens.length == 0) { + return []; + } + + var splits = []; + var displayLength = tokens.length; + var lastSplit = 0, lastDocSplit = 0; + + var isCode = this.$wrapAsCode; + + var indentedSoftWrap = this.$indentedSoftWrap; + var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8) + || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2); + + function getWrapIndent() { + var indentation = 0; + if (maxIndent === 0) + return indentation; + if (indentedSoftWrap) { + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token == SPACE) + indentation += 1; + else if (token == TAB) + indentation += tabSize; + else if (token == TAB_SPACE) + continue; + else + break; + } + } + if (isCode && indentedSoftWrap !== false) + indentation += tabSize; + return Math.min(indentation, maxIndent); + } + function addSplit(screenPos) { + var len = screenPos - lastSplit; + for (var i = lastSplit; i < screenPos; i++) { + var ch = tokens[i]; + if (ch === 12 || ch === 2) len -= 1; + } + + if (!splits.length) { + indent = getWrapIndent(); + splits.indent = indent; + } + lastDocSplit += len; + splits.push(lastDocSplit); + lastSplit = screenPos; + } + var indent = 0; + while (displayLength - lastSplit > wrapLimit - indent) { + var split = lastSplit + wrapLimit - indent; + if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) { + addSplit(split); + continue; + } + if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) { + for (split; split != lastSplit - 1; split--) { + if (tokens[split] == PLACEHOLDER_START) { + break; + } + } + if (split > lastSplit) { + addSplit(split); + continue; + } + split = lastSplit + wrapLimit; + for (split; split < tokens.length; split++) { + if (tokens[split] != PLACEHOLDER_BODY) { + break; + } + } + if (split == tokens.length) { + break; // Breaks the while-loop. + } + addSplit(split); + continue; + } + var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1); + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split --; + } + if (isCode) { + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split --; + } + while (split > minSplit && tokens[split] == PUNCTUATION) { + split --; + } + } else { + while (split > minSplit && tokens[split] < SPACE) { + split --; + } + } + if (split > minSplit) { + addSplit(++split); + continue; + } + split = lastSplit + wrapLimit; + if (tokens[split] == CHAR_EXT) + split--; + addSplit(split - indent); + } + return splits; + }; + this.$getDisplayTokens = function(str, offset) { + var arr = []; + var tabSize; + offset = offset || 0; + + for (var i = 0; i < str.length; i++) { + var c = str.charCodeAt(i); + if (c == 9) { + tabSize = this.getScreenTabSize(arr.length + offset); + arr.push(TAB); + for (var n = 1; n < tabSize; n++) { + arr.push(TAB_SPACE); + } + } + else if (c == 32) { + arr.push(SPACE); + } else if((c > 39 && c < 48) || (c > 57 && c < 64)) { + arr.push(PUNCTUATION); + } + else if (c >= 0x1100 && isFullWidth(c)) { + arr.push(CHAR, CHAR_EXT); + } else { + arr.push(CHAR); + } + } + return arr; + }; + this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) { + if (maxScreenColumn == 0) + return [0, 0]; + if (maxScreenColumn == null) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charCodeAt(column); + if (c == 9) { + screenColumn += this.getScreenTabSize(screenColumn); + } + else if (c >= 0x1100 && isFullWidth(c)) { + screenColumn += 2; + } else { + screenColumn += 1; + } + if (screenColumn > maxScreenColumn) { + break; + } + } + + return [screenColumn, column]; + }; + + this.lineWidgets = null; + this.getRowLength = function(row) { + var h = 1; + if (this.lineWidgets) + h += this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; + + if (!this.$useWrapMode || !this.$wrapData[row]) + return h; + else + return this.$wrapData[row].length + h; + }; + this.getRowLineCount = function(row) { + if (!this.$useWrapMode || !this.$wrapData[row]) { + return 1; + } else { + return this.$wrapData[row].length + 1; + } + }; + + this.getRowWrapIndent = function(screenRow) { + if (this.$useWrapMode) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + var splits = this.$wrapData[pos.row]; + return splits.length && splits[0] < pos.column ? splits.indent : 0; + } else { + return 0; + } + }; + this.getScreenLastRowColumn = function(screenRow) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + return this.documentToScreenColumn(pos.row, pos.column); + }; + this.getDocumentLastRowColumn = function(docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.getScreenLastRowColumn(screenRow); + }; + this.getDocumentLastRowColumnPosition = function(docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10); + }; + this.getRowSplitData = function(row) { + if (!this.$useWrapMode) { + return undefined; + } else { + return this.$wrapData[row]; + } + }; + this.getScreenTabSize = function(screenColumn) { + return this.$tabSize - (screenColumn % this.$tabSize | 0); + }; + + + this.screenToDocumentRow = function(screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).row; + }; + + + this.screenToDocumentColumn = function(screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).column; + }; + this.screenToDocumentPosition = function(screenRow, screenColumn, offsetX) { + if (screenRow < 0) + return {row: 0, column: 0}; + + var line; + var docRow = 0; + var docColumn = 0; + var column; + var row = 0; + var rowLength = 0; + + var rowCache = this.$screenRowCache; + var i = this.$getRowCacheIndex(rowCache, screenRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var docRow = this.$docRowCache[i]; + var doCache = screenRow > rowCache[l - 1]; + } else { + var doCache = !l; + } + + var maxRow = this.getLength() - 1; + var foldLine = this.getNextFoldLine(docRow); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (row <= screenRow) { + rowLength = this.getRowLength(docRow); + if (row + rowLength > screenRow || docRow >= maxRow) { + break; + } else { + row += rowLength; + docRow++; + if (docRow > foldStart) { + docRow = foldLine.end.row+1; + foldLine = this.getNextFoldLine(docRow, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + } + + if (doCache) { + this.$docRowCache.push(docRow); + this.$screenRowCache.push(row); + } + } + + if (foldLine && foldLine.start.row <= docRow) { + line = this.getFoldDisplayLine(foldLine); + docRow = foldLine.start.row; + } else if (row + rowLength <= screenRow || docRow > maxRow) { + return { + row: maxRow, + column: this.getLine(maxRow).length + }; + } else { + line = this.getLine(docRow); + foldLine = null; + } + var wrapIndent = 0, splitIndex = Math.floor(screenRow - row); + if (this.$useWrapMode) { + var splits = this.$wrapData[docRow]; + if (splits) { + column = splits[splitIndex]; + if(splitIndex > 0 && splits.length) { + wrapIndent = splits.indent; + docColumn = splits[splitIndex - 1] || splits[splits.length - 1]; + line = line.substring(docColumn); + } + } + } + + if (offsetX !== undefined && this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex)) + screenColumn = this.$bidiHandler.offsetToCol(offsetX); + + docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1]; + if (this.$useWrapMode && docColumn >= column) + docColumn = column - 1; + + if (foldLine) + return foldLine.idxToPosition(docColumn); + + return {row: docRow, column: docColumn}; + }; + this.documentToScreenPosition = function(docRow, docColumn) { + if (typeof docColumn === "undefined") + var pos = this.$clipPositionToDocument(docRow.row, docRow.column); + else + pos = this.$clipPositionToDocument(docRow, docColumn); + + docRow = pos.row; + docColumn = pos.column; + + var screenRow = 0; + var foldStartRow = null; + var fold = null; + fold = this.getFoldAt(docRow, docColumn, 1); + if (fold) { + docRow = fold.start.row; + docColumn = fold.start.column; + } + + var rowEnd, row = 0; + + + var rowCache = this.$docRowCache; + var i = this.$getRowCacheIndex(rowCache, docRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var screenRow = this.$screenRowCache[i]; + var doCache = docRow > rowCache[l - 1]; + } else { + var doCache = !l; + } + + var foldLine = this.getNextFoldLine(row); + var foldStart = foldLine ?foldLine.start.row :Infinity; + + while (row < docRow) { + if (row >= foldStart) { + rowEnd = foldLine.end.row + 1; + if (rowEnd > docRow) + break; + foldLine = this.getNextFoldLine(rowEnd, foldLine); + foldStart = foldLine ?foldLine.start.row :Infinity; + } + else { + rowEnd = row + 1; + } + + screenRow += this.getRowLength(row); + row = rowEnd; + + if (doCache) { + this.$docRowCache.push(row); + this.$screenRowCache.push(screenRow); + } + } + var textLine = ""; + if (foldLine && row >= foldStart) { + textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn); + foldStartRow = foldLine.start.row; + } else { + textLine = this.getLine(docRow).substring(0, docColumn); + foldStartRow = docRow; + } + var wrapIndent = 0; + if (this.$useWrapMode) { + var wrapRow = this.$wrapData[foldStartRow]; + if (wrapRow) { + var screenRowOffset = 0; + while (textLine.length >= wrapRow[screenRowOffset]) { + screenRow ++; + screenRowOffset++; + } + textLine = textLine.substring( + wrapRow[screenRowOffset - 1] || 0, textLine.length + ); + wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0; + } + } + + if (this.lineWidgets && this.lineWidgets[row] && this.lineWidgets[row].rowsAbove) + screenRow += this.lineWidgets[row].rowsAbove; + + return { + row: screenRow, + column: wrapIndent + this.$getStringScreenWidth(textLine)[0] + }; + }; + this.documentToScreenColumn = function(row, docColumn) { + return this.documentToScreenPosition(row, docColumn).column; + }; + this.documentToScreenRow = function(docRow, docColumn) { + return this.documentToScreenPosition(docRow, docColumn).row; + }; + this.getScreenLength = function() { + var screenRows = 0; + var fold = null; + if (!this.$useWrapMode) { + screenRows = this.getLength(); + var foldData = this.$foldData; + for (var i = 0; i < foldData.length; i++) { + fold = foldData[i]; + screenRows -= fold.end.row - fold.start.row; + } + } else { + var lastRow = this.$wrapData.length; + var row = 0, i = 0; + var fold = this.$foldData[i++]; + var foldStart = fold ? fold.start.row :Infinity; + + while (row < lastRow) { + var splits = this.$wrapData[row]; + screenRows += splits ? splits.length + 1 : 1; + row ++; + if (row > foldStart) { + row = fold.end.row+1; + fold = this.$foldData[i++]; + foldStart = fold ?fold.start.row :Infinity; + } + } + } + if (this.lineWidgets) + screenRows += this.$getWidgetScreenLength(); + + return screenRows; + }; + this.$setFontMetrics = function(fm) { + if (!this.$enableVarChar) return; + this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) { + if (maxScreenColumn === 0) + return [0, 0]; + if (!maxScreenColumn) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charAt(column); + if (c === "\t") { + screenColumn += this.getScreenTabSize(screenColumn); + } else { + screenColumn += fm.getCharacterWidth(c); + } + if (screenColumn > maxScreenColumn) { + break; + } + } + + return [screenColumn, column]; + }; + }; + + this.destroy = function() { + if (!this.destroyed) { + this.bgTokenizer.setDocument(null); + this.bgTokenizer.cleanup(); + this.destroyed = true; + } + this.$stopWorker(); + this.removeAllListeners(); + if (this.doc) { + this.doc.off("change", this.$onChange); + } + this.selection.detach(); + }; + + this.isFullWidth = isFullWidth; + function isFullWidth(c) { + if (c < 0x1100) + return false; + return c >= 0x1100 && c <= 0x115F || + c >= 0x11A3 && c <= 0x11A7 || + c >= 0x11FA && c <= 0x11FF || + c >= 0x2329 && c <= 0x232A || + c >= 0x2E80 && c <= 0x2E99 || + c >= 0x2E9B && c <= 0x2EF3 || + c >= 0x2F00 && c <= 0x2FD5 || + c >= 0x2FF0 && c <= 0x2FFB || + c >= 0x3000 && c <= 0x303E || + c >= 0x3041 && c <= 0x3096 || + c >= 0x3099 && c <= 0x30FF || + c >= 0x3105 && c <= 0x312D || + c >= 0x3131 && c <= 0x318E || + c >= 0x3190 && c <= 0x31BA || + c >= 0x31C0 && c <= 0x31E3 || + c >= 0x31F0 && c <= 0x321E || + c >= 0x3220 && c <= 0x3247 || + c >= 0x3250 && c <= 0x32FE || + c >= 0x3300 && c <= 0x4DBF || + c >= 0x4E00 && c <= 0xA48C || + c >= 0xA490 && c <= 0xA4C6 || + c >= 0xA960 && c <= 0xA97C || + c >= 0xAC00 && c <= 0xD7A3 || + c >= 0xD7B0 && c <= 0xD7C6 || + c >= 0xD7CB && c <= 0xD7FB || + c >= 0xF900 && c <= 0xFAFF || + c >= 0xFE10 && c <= 0xFE19 || + c >= 0xFE30 && c <= 0xFE52 || + c >= 0xFE54 && c <= 0xFE66 || + c >= 0xFE68 && c <= 0xFE6B || + c >= 0xFF01 && c <= 0xFF60 || + c >= 0xFFE0 && c <= 0xFFE6; + } + +}).call(EditSession.prototype); + +require("./edit_session/folding").Folding.call(EditSession.prototype); +require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype); + + +config.defineOptions(EditSession.prototype, "session", { + wrap: { + set: function(value) { + if (!value || value == "off") + value = false; + else if (value == "free") + value = true; + else if (value == "printMargin") + value = -1; + else if (typeof value == "string") + value = parseInt(value, 10) || false; + + if (this.$wrap == value) + return; + this.$wrap = value; + if (!value) { + this.setUseWrapMode(false); + } else { + var col = typeof value == "number" ? value : null; + this.setWrapLimitRange(col, col); + this.setUseWrapMode(true); + } + }, + get: function() { + if (this.getUseWrapMode()) { + if (this.$wrap == -1) + return "printMargin"; + if (!this.getWrapLimitRange().min) + return "free"; + return this.$wrap; + } + return "off"; + }, + handlesSet: true + }, + wrapMethod: { + set: function(val) { + val = val == "auto" + ? this.$mode.type != "text" + : val != "text"; + if (val != this.$wrapAsCode) { + this.$wrapAsCode = val; + if (this.$useWrapMode) { + this.$useWrapMode = false; + this.setUseWrapMode(true); + } + } + }, + initialValue: "auto" + }, + indentedSoftWrap: { + set: function() { + if (this.$useWrapMode) { + this.$useWrapMode = false; + this.setUseWrapMode(true); + } + }, + initialValue: true + }, + firstLineNumber: { + set: function() {this._signal("changeBreakpoint");}, + initialValue: 1 + }, + useWorker: { + set: function(useWorker) { + this.$useWorker = useWorker; + + this.$stopWorker(); + if (useWorker) + this.$startWorker(); + }, + initialValue: true + }, + useSoftTabs: {initialValue: true}, + tabSize: { + set: function(tabSize) { + tabSize = parseInt(tabSize); + if (tabSize > 0 && this.$tabSize !== tabSize) { + this.$modified = true; + this.$rowLengthCache = []; + this.$tabSize = tabSize; + this._signal("changeTabSize"); + } + }, + initialValue: 4, + handlesSet: true + }, + navigateWithinSoftTabs: {initialValue: false}, + foldStyle: { + set: function(val) {this.setFoldStyle(val);}, + handlesSet: true + }, + overwrite: { + set: function(val) {this._signal("changeOverwrite");}, + initialValue: false + }, + newLineMode: { + set: function(val) {this.doc.setNewLineMode(val);}, + get: function() {return this.doc.getNewLineMode();}, + handlesSet: true + }, + mode: { + set: function(val) { this.setMode(val); }, + get: function() { return this.$modeId; }, + handlesSet: true + } +}); + +exports.EditSession = EditSession; +}); + +define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) { +"use strict"; + +var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var Range = require("./range").Range; + +var Search = function() { + this.$options = {}; +}; + +(function() { + this.set = function(options) { + oop.mixin(this.$options, options); + return this; + }; + this.getOptions = function() { + return lang.copyObject(this.$options); + }; + this.setOptions = function(options) { + this.$options = options; + }; + this.find = function(session) { + var options = this.$options; + var iterator = this.$matchIterator(session, options); + if (!iterator) + return false; + + var firstRange = null; + iterator.forEach(function(sr, sc, er, ec) { + firstRange = new Range(sr, sc, er, ec); + if (sc == ec && options.start && options.start.start + && options.skipCurrent != false && firstRange.isEqual(options.start) + ) { + firstRange = null; + return false; + } + + return true; + }); + + return firstRange; + }; + this.findAll = function(session) { + var options = this.$options; + if (!options.needle) + return []; + this.$assembleRegExp(options); + + var range = options.range; + var lines = range + ? session.getLines(range.start.row, range.end.row) + : session.doc.getAllLines(); + + var ranges = []; + var re = options.re; + if (options.$isMultiLine) { + var len = re.length; + var maxRow = lines.length - len; + var prevRange; + outer: for (var row = re.offset || 0; row <= maxRow; row++) { + for (var j = 0; j < len; j++) + if (lines[row + j].search(re[j]) == -1) + continue outer; + + var startLine = lines[row]; + var line = lines[row + len - 1]; + var startIndex = startLine.length - startLine.match(re[0])[0].length; + var endIndex = line.match(re[len - 1])[0].length; + + if (prevRange && prevRange.end.row === row && + prevRange.end.column > startIndex + ) { + continue; + } + ranges.push(prevRange = new Range( + row, startIndex, row + len - 1, endIndex + )); + if (len > 2) + row = row + len - 2; + } + } else { + for (var i = 0; i < lines.length; i++) { + var matches = lang.getMatchOffsets(lines[i], re); + for (var j = 0; j < matches.length; j++) { + var match = matches[j]; + ranges.push(new Range(i, match.offset, i, match.offset + match.length)); + } + } + } + + if (range) { + var startColumn = range.start.column; + var endColumn = range.start.column; + var i = 0, j = ranges.length - 1; + while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row) + i++; + + while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row) + j--; + + ranges = ranges.slice(i, j + 1); + for (i = 0, j = ranges.length; i < j; i++) { + ranges[i].start.row += range.start.row; + ranges[i].end.row += range.start.row; + } + } + + return ranges; + }; + this.replace = function(input, replacement) { + var options = this.$options; + + var re = this.$assembleRegExp(options); + if (options.$isMultiLine) + return replacement; + + if (!re) + return; + + var match = re.exec(input); + if (!match || match[0].length != input.length) + return null; + + replacement = input.replace(re, replacement); + if (options.preserveCase) { + replacement = replacement.split(""); + for (var i = Math.min(input.length, input.length); i--; ) { + var ch = input[i]; + if (ch && ch.toLowerCase() != ch) + replacement[i] = replacement[i].toUpperCase(); + else + replacement[i] = replacement[i].toLowerCase(); + } + replacement = replacement.join(""); + } + + return replacement; + }; + + this.$assembleRegExp = function(options, $disableFakeMultiline) { + if (options.needle instanceof RegExp) + return options.re = options.needle; + + var needle = options.needle; + + if (!options.needle) + return options.re = false; + + if (!options.regExp) + needle = lang.escapeRegExp(needle); + + if (options.wholeWord) + needle = addWordBoundary(needle, options); + + var modifier = options.caseSensitive ? "gm" : "gmi"; + + options.$isMultiLine = !$disableFakeMultiline && /[\n\r]/.test(needle); + if (options.$isMultiLine) + return options.re = this.$assembleMultilineRegExp(needle, modifier); + + try { + var re = new RegExp(needle, modifier); + } catch(e) { + re = false; + } + return options.re = re; + }; + + this.$assembleMultilineRegExp = function(needle, modifier) { + var parts = needle.replace(/\r\n|\r|\n/g, "$\n^").split("\n"); + var re = []; + for (var i = 0; i < parts.length; i++) try { + re.push(new RegExp(parts[i], modifier)); + } catch(e) { + return false; + } + return re; + }; + + this.$matchIterator = function(session, options) { + var re = this.$assembleRegExp(options); + if (!re) + return false; + var backwards = options.backwards == true; + var skipCurrent = options.skipCurrent != false; + + var range = options.range; + var start = options.start; + if (!start) + start = range ? range[backwards ? "end" : "start"] : session.selection.getRange(); + + if (start.start) + start = start[skipCurrent != backwards ? "end" : "start"]; + + var firstRow = range ? range.start.row : 0; + var lastRow = range ? range.end.row : session.getLength() - 1; + + if (backwards) { + var forEach = function(callback) { + var row = start.row; + if (forEachInLine(row, start.column, callback)) + return; + for (row--; row >= firstRow; row--) + if (forEachInLine(row, Number.MAX_VALUE, callback)) + return; + if (options.wrap == false) + return; + for (row = lastRow, firstRow = start.row; row >= firstRow; row--) + if (forEachInLine(row, Number.MAX_VALUE, callback)) + return; + }; + } + else { + var forEach = function(callback) { + var row = start.row; + if (forEachInLine(row, start.column, callback)) + return; + for (row = row + 1; row <= lastRow; row++) + if (forEachInLine(row, 0, callback)) + return; + if (options.wrap == false) + return; + for (row = firstRow, lastRow = start.row; row <= lastRow; row++) + if (forEachInLine(row, 0, callback)) + return; + }; + } + + if (options.$isMultiLine) { + var len = re.length; + var forEachInLine = function(row, offset, callback) { + var startRow = backwards ? row - len + 1 : row; + if (startRow < 0 || startRow + len > session.getLength()) return; + var line = session.getLine(startRow); + var startIndex = line.search(re[0]); + if (!backwards && startIndex < offset || startIndex === -1) return; + for (var i = 1; i < len; i++) { + line = session.getLine(startRow + i); + if (line.search(re[i]) == -1) + return; + } + var endIndex = line.match(re[len - 1])[0].length; + if (backwards && endIndex > offset) return; + if (callback(startRow, startIndex, startRow + len - 1, endIndex)) + return true; + }; + } + else if (backwards) { + var forEachInLine = function(row, endIndex, callback) { + var line = session.getLine(row); + var matches = []; + var m, last = 0; + re.lastIndex = 0; + while((m = re.exec(line))) { + var length = m[0].length; + last = m.index; + if (!length) { + if (last >= line.length) break; + re.lastIndex = last += 1; + } + if (m.index + length > endIndex) + break; + matches.push(m.index, length); + } + for (var i = matches.length - 1; i >= 0; i -= 2) { + var column = matches[i - 1]; + var length = matches[i]; + if (callback(row, column, row, column + length)) + return true; + } + }; + } + else { + var forEachInLine = function(row, startIndex, callback) { + var line = session.getLine(row); + var last; + var m; + re.lastIndex = startIndex; + while((m = re.exec(line))) { + var length = m[0].length; + last = m.index; + if (callback(row, last, row,last + length)) + return true; + if (!length) { + re.lastIndex = last += 1; + if (last >= line.length) return false; + } + } + }; + } + return {forEach: forEach}; + }; + +}).call(Search.prototype); + +function addWordBoundary(needle, options) { + function wordBoundary(c) { + if (/\w/.test(c) || options.regExp) return "\\b"; + return ""; + } + return wordBoundary(needle[0]) + needle + + wordBoundary(needle[needle.length - 1]); +} + +exports.Search = Search; +}); + +define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var keyUtil = require("../lib/keys"); +var useragent = require("../lib/useragent"); +var KEY_MODS = keyUtil.KEY_MODS; + +function HashHandler(config, platform) { + this.platform = platform || (useragent.isMac ? "mac" : "win"); + this.commands = {}; + this.commandKeyBinding = {}; + this.addCommands(config); + this.$singleCommand = true; +} + +function MultiHashHandler(config, platform) { + HashHandler.call(this, config, platform); + this.$singleCommand = false; +} + +MultiHashHandler.prototype = HashHandler.prototype; + +(function() { + + + this.addCommand = function(command) { + if (this.commands[command.name]) + this.removeCommand(command); + + this.commands[command.name] = command; + + if (command.bindKey) + this._buildKeyHash(command); + }; + + this.removeCommand = function(command, keepCommand) { + var name = command && (typeof command === 'string' ? command : command.name); + command = this.commands[name]; + if (!keepCommand) + delete this.commands[name]; + var ckb = this.commandKeyBinding; + for (var keyId in ckb) { + var cmdGroup = ckb[keyId]; + if (cmdGroup == command) { + delete ckb[keyId]; + } else if (Array.isArray(cmdGroup)) { + var i = cmdGroup.indexOf(command); + if (i != -1) { + cmdGroup.splice(i, 1); + if (cmdGroup.length == 1) + ckb[keyId] = cmdGroup[0]; + } + } + } + }; + + this.bindKey = function(key, command, position) { + if (typeof key == "object" && key) { + if (position == undefined) + position = key.position; + key = key[this.platform]; + } + if (!key) + return; + if (typeof command == "function") + return this.addCommand({exec: command, bindKey: key, name: command.name || key}); + + key.split("|").forEach(function(keyPart) { + var chain = ""; + if (keyPart.indexOf(" ") != -1) { + var parts = keyPart.split(/\s+/); + keyPart = parts.pop(); + parts.forEach(function(keyPart) { + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + chain += (chain ? " " : "") + id; + this._addCommandToBinding(chain, "chainKeys"); + }, this); + chain += " "; + } + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + this._addCommandToBinding(chain + id, command, position); + }, this); + }; + + function getPosition(command) { + return typeof command == "object" && command.bindKey + && command.bindKey.position + || (command.isDefault ? -100 : 0); + } + this._addCommandToBinding = function(keyId, command, position) { + var ckb = this.commandKeyBinding, i; + if (!command) { + delete ckb[keyId]; + } else if (!ckb[keyId] || this.$singleCommand) { + ckb[keyId] = command; + } else { + if (!Array.isArray(ckb[keyId])) { + ckb[keyId] = [ckb[keyId]]; + } else if ((i = ckb[keyId].indexOf(command)) != -1) { + ckb[keyId].splice(i, 1); + } + + if (typeof position != "number") { + position = getPosition(command); + } + + var commands = ckb[keyId]; + for (i = 0; i < commands.length; i++) { + var other = commands[i]; + var otherPos = getPosition(other); + if (otherPos > position) + break; + } + commands.splice(i, 0, command); + } + }; + + this.addCommands = function(commands) { + commands && Object.keys(commands).forEach(function(name) { + var command = commands[name]; + if (!command) + return; + + if (typeof command === "string") + return this.bindKey(command, name); + + if (typeof command === "function") + command = { exec: command }; + + if (typeof command !== "object") + return; + + if (!command.name) + command.name = name; + + this.addCommand(command); + }, this); + }; + + this.removeCommands = function(commands) { + Object.keys(commands).forEach(function(name) { + this.removeCommand(commands[name]); + }, this); + }; + + this.bindKeys = function(keyList) { + Object.keys(keyList).forEach(function(key) { + this.bindKey(key, keyList[key]); + }, this); + }; + + this._buildKeyHash = function(command) { + this.bindKey(command.bindKey, command); + }; + this.parseKeys = function(keys) { + var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(x){return x;}); + var key = parts.pop(); + + var keyCode = keyUtil[key]; + if (keyUtil.FUNCTION_KEYS[keyCode]) + key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase(); + else if (!parts.length) + return {key: key, hashId: -1}; + else if (parts.length == 1 && parts[0] == "shift") + return {key: key.toUpperCase(), hashId: -1}; + + var hashId = 0; + for (var i = parts.length; i--;) { + var modifier = keyUtil.KEY_MODS[parts[i]]; + if (modifier == null) { + if (typeof console != "undefined") + console.error("invalid modifier " + parts[i] + " in " + keys); + return false; + } + hashId |= modifier; + } + return {key: key, hashId: hashId}; + }; + + this.findKeyCommand = function findKeyCommand(hashId, keyString) { + var key = KEY_MODS[hashId] + keyString; + return this.commandKeyBinding[key]; + }; + + this.handleKeyboard = function(data, hashId, keyString, keyCode) { + if (keyCode < 0) return; + var key = KEY_MODS[hashId] + keyString; + var command = this.commandKeyBinding[key]; + if (data.$keyChain) { + data.$keyChain += " " + key; + command = this.commandKeyBinding[data.$keyChain] || command; + } + + if (command) { + if (command == "chainKeys" || command[command.length - 1] == "chainKeys") { + data.$keyChain = data.$keyChain || key; + return {command: "null"}; + } + } + + if (data.$keyChain) { + if ((!hashId || hashId == 4) && keyString.length == 1) + data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input + else if (hashId == -1 || keyCode > 0) + data.$keyChain = ""; // reset keyChain + } + return {command: command}; + }; + + this.getStatusText = function(editor, data) { + return data.$keyChain || ""; + }; + +}).call(HashHandler.prototype); + +exports.HashHandler = HashHandler; +exports.MultiHashHandler = MultiHashHandler; +}); + +define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var MultiHashHandler = require("../keyboard/hash_handler").MultiHashHandler; +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var CommandManager = function(platform, commands) { + MultiHashHandler.call(this, commands, platform); + this.byName = this.commands; + this.setDefaultHandler("exec", function(e) { + if (!e.args) { + return e.command.exec(e.editor, {}, e.event, true); + } + return e.command.exec(e.editor, e.args, e.event, false); + }); +}; + +oop.inherits(CommandManager, MultiHashHandler); + +(function() { + + oop.implement(this, EventEmitter); + + this.exec = function(command, editor, args) { + if (Array.isArray(command)) { + for (var i = command.length; i--; ) { + if (this.exec(command[i], editor, args)) return true; + } + return false; + } + + if (typeof command === "string") + command = this.commands[command]; + + if (!command) + return false; + + if (editor && editor.$readOnly && !command.readOnly) + return false; + + if (this.$checkCommandState != false && command.isAvailable && !command.isAvailable(editor)) + return false; + + var e = {editor: editor, command: command, args: args}; + e.returnValue = this._emit("exec", e); + this._signal("afterExec", e); + + return e.returnValue === false ? false : true; + }; + + this.toggleRecording = function(editor) { + if (this.$inReplay) + return; + + editor && editor._emit("changeStatus"); + if (this.recording) { + this.macro.pop(); + this.off("exec", this.$addCommandToMacro); + + if (!this.macro.length) + this.macro = this.oldMacro; + + return this.recording = false; + } + if (!this.$addCommandToMacro) { + this.$addCommandToMacro = function(e) { + this.macro.push([e.command, e.args]); + }.bind(this); + } + + this.oldMacro = this.macro; + this.macro = []; + this.on("exec", this.$addCommandToMacro); + return this.recording = true; + }; + + this.replay = function(editor) { + if (this.$inReplay || !this.macro) + return; + + if (this.recording) + return this.toggleRecording(editor); + + try { + this.$inReplay = true; + this.macro.forEach(function(x) { + if (typeof x == "string") + this.exec(x, editor); + else + this.exec(x[0], editor, x[1]); + }, this); + } finally { + this.$inReplay = false; + } + }; + + this.trimMacro = function(m) { + return m.map(function(x){ + if (typeof x[0] != "string") + x[0] = x[0].name; + if (!x[1]) + x = x[0]; + return x; + }); + }; + +}).call(CommandManager.prototype); + +exports.CommandManager = CommandManager; + +}); + +define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"], function(require, exports, module) { +"use strict"; + +var lang = require("../lib/lang"); +var config = require("../config"); +var Range = require("../range").Range; + +function bindKey(win, mac) { + return {win: win, mac: mac}; +} +exports.commands = [{ + name: "showSettingsMenu", + description: "Show settings menu", + bindKey: bindKey("Ctrl-,", "Command-,"), + exec: function(editor) { + config.loadModule("ace/ext/settings_menu", function(module) { + module.init(editor); + editor.showSettingsMenu(); + }); + }, + readOnly: true +}, { + name: "goToNextError", + description: "Go to next error", + bindKey: bindKey("Alt-E", "F4"), + exec: function(editor) { + config.loadModule("./ext/error_marker", function(module) { + module.showErrorMarker(editor, 1); + }); + }, + scrollIntoView: "animate", + readOnly: true +}, { + name: "goToPreviousError", + description: "Go to previous error", + bindKey: bindKey("Alt-Shift-E", "Shift-F4"), + exec: function(editor) { + config.loadModule("./ext/error_marker", function(module) { + module.showErrorMarker(editor, -1); + }); + }, + scrollIntoView: "animate", + readOnly: true +}, { + name: "selectall", + description: "Select all", + bindKey: bindKey("Ctrl-A", "Command-A"), + exec: function(editor) { editor.selectAll(); }, + readOnly: true +}, { + name: "centerselection", + description: "Center selection", + bindKey: bindKey(null, "Ctrl-L"), + exec: function(editor) { editor.centerSelection(); }, + readOnly: true +}, { + name: "gotoline", + description: "Go to line...", + bindKey: bindKey("Ctrl-L", "Command-L"), + exec: function(editor, line) { + if (typeof line === "number" && !isNaN(line)) + editor.gotoLine(line); + editor.prompt({ $type: "gotoLine" }); + }, + readOnly: true +}, { + name: "fold", + bindKey: bindKey("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"), + exec: function(editor) { editor.session.toggleFold(false); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "unfold", + bindKey: bindKey("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"), + exec: function(editor) { editor.session.toggleFold(true); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "toggleFoldWidget", + description: "Toggle fold widget", + bindKey: bindKey("F2", "F2"), + exec: function(editor) { editor.session.toggleFoldWidget(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "toggleParentFoldWidget", + description: "Toggle parent fold widget", + bindKey: bindKey("Alt-F2", "Alt-F2"), + exec: function(editor) { editor.session.toggleFoldWidget(true); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "foldall", + description: "Fold all", + bindKey: bindKey(null, "Ctrl-Command-Option-0"), + exec: function(editor) { editor.session.foldAll(); }, + scrollIntoView: "center", + readOnly: true +}, { + name: "foldAllComments", + description: "Fold all comments", + bindKey: bindKey(null, "Ctrl-Command-Option-0"), + exec: function(editor) { editor.session.foldAllComments(); }, + scrollIntoView: "center", + readOnly: true +}, { + name: "foldOther", + description: "Fold other", + bindKey: bindKey("Alt-0", "Command-Option-0"), + exec: function(editor) { + editor.session.foldAll(); + editor.session.unfold(editor.selection.getAllRanges()); + }, + scrollIntoView: "center", + readOnly: true +}, { + name: "unfoldall", + description: "Unfold all", + bindKey: bindKey("Alt-Shift-0", "Command-Option-Shift-0"), + exec: function(editor) { editor.session.unfold(); }, + scrollIntoView: "center", + readOnly: true +}, { + name: "findnext", + description: "Find next", + bindKey: bindKey("Ctrl-K", "Command-G"), + exec: function(editor) { editor.findNext(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "findprevious", + description: "Find previous", + bindKey: bindKey("Ctrl-Shift-K", "Command-Shift-G"), + exec: function(editor) { editor.findPrevious(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "selectOrFindNext", + description: "Select or find next", + bindKey: bindKey("Alt-K", "Ctrl-G"), + exec: function(editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + else + editor.findNext(); + }, + readOnly: true +}, { + name: "selectOrFindPrevious", + description: "Select or find previous", + bindKey: bindKey("Alt-Shift-K", "Ctrl-Shift-G"), + exec: function(editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + else + editor.findPrevious(); + }, + readOnly: true +}, { + name: "find", + description: "Find", + bindKey: bindKey("Ctrl-F", "Command-F"), + exec: function(editor) { + config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor);}); + }, + readOnly: true +}, { + name: "overwrite", + description: "Overwrite", + bindKey: "Insert", + exec: function(editor) { editor.toggleOverwrite(); }, + readOnly: true +}, { + name: "selecttostart", + description: "Select to start", + bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Home|Command-Shift-Up"), + exec: function(editor) { editor.getSelection().selectFileStart(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" +}, { + name: "gotostart", + description: "Go to start", + bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"), + exec: function(editor) { editor.navigateFileStart(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" +}, { + name: "selectup", + description: "Select up", + bindKey: bindKey("Shift-Up", "Shift-Up|Ctrl-Shift-P"), + exec: function(editor) { editor.getSelection().selectUp(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "golineup", + description: "Go line up", + bindKey: bindKey("Up", "Up|Ctrl-P"), + exec: function(editor, args) { editor.navigateUp(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selecttoend", + description: "Select to end", + bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-End|Command-Shift-Down"), + exec: function(editor) { editor.getSelection().selectFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" +}, { + name: "gotoend", + description: "Go to end", + bindKey: bindKey("Ctrl-End", "Command-End|Command-Down"), + exec: function(editor) { editor.navigateFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" +}, { + name: "selectdown", + description: "Select down", + bindKey: bindKey("Shift-Down", "Shift-Down|Ctrl-Shift-N"), + exec: function(editor) { editor.getSelection().selectDown(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "golinedown", + description: "Go line down", + bindKey: bindKey("Down", "Down|Ctrl-N"), + exec: function(editor, args) { editor.navigateDown(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectwordleft", + description: "Select word left", + bindKey: bindKey("Ctrl-Shift-Left", "Option-Shift-Left"), + exec: function(editor) { editor.getSelection().selectWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotowordleft", + description: "Go to word left", + bindKey: bindKey("Ctrl-Left", "Option-Left"), + exec: function(editor) { editor.navigateWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selecttolinestart", + description: "Select to line start", + bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left|Ctrl-Shift-A"), + exec: function(editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotolinestart", + description: "Go to line start", + bindKey: bindKey("Alt-Left|Home", "Command-Left|Home|Ctrl-A"), + exec: function(editor) { editor.navigateLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectleft", + description: "Select left", + bindKey: bindKey("Shift-Left", "Shift-Left|Ctrl-Shift-B"), + exec: function(editor) { editor.getSelection().selectLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotoleft", + description: "Go to left", + bindKey: bindKey("Left", "Left|Ctrl-B"), + exec: function(editor, args) { editor.navigateLeft(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectwordright", + description: "Select word right", + bindKey: bindKey("Ctrl-Shift-Right", "Option-Shift-Right"), + exec: function(editor) { editor.getSelection().selectWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotowordright", + description: "Go to word right", + bindKey: bindKey("Ctrl-Right", "Option-Right"), + exec: function(editor) { editor.navigateWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selecttolineend", + description: "Select to line end", + bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right|Shift-End|Ctrl-Shift-E"), + exec: function(editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotolineend", + description: "Go to line end", + bindKey: bindKey("Alt-Right|End", "Command-Right|End|Ctrl-E"), + exec: function(editor) { editor.navigateLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectright", + description: "Select right", + bindKey: bindKey("Shift-Right", "Shift-Right"), + exec: function(editor) { editor.getSelection().selectRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotoright", + description: "Go to right", + bindKey: bindKey("Right", "Right|Ctrl-F"), + exec: function(editor, args) { editor.navigateRight(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectpagedown", + description: "Select page down", + bindKey: "Shift-PageDown", + exec: function(editor) { editor.selectPageDown(); }, + readOnly: true +}, { + name: "pagedown", + description: "Page down", + bindKey: bindKey(null, "Option-PageDown"), + exec: function(editor) { editor.scrollPageDown(); }, + readOnly: true +}, { + name: "gotopagedown", + description: "Go to page down", + bindKey: bindKey("PageDown", "PageDown|Ctrl-V"), + exec: function(editor) { editor.gotoPageDown(); }, + readOnly: true +}, { + name: "selectpageup", + description: "Select page up", + bindKey: "Shift-PageUp", + exec: function(editor) { editor.selectPageUp(); }, + readOnly: true +}, { + name: "pageup", + description: "Page up", + bindKey: bindKey(null, "Option-PageUp"), + exec: function(editor) { editor.scrollPageUp(); }, + readOnly: true +}, { + name: "gotopageup", + description: "Go to page up", + bindKey: "PageUp", + exec: function(editor) { editor.gotoPageUp(); }, + readOnly: true +}, { + name: "scrollup", + description: "Scroll up", + bindKey: bindKey("Ctrl-Up", null), + exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true +}, { + name: "scrolldown", + description: "Scroll down", + bindKey: bindKey("Ctrl-Down", null), + exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true +}, { + name: "selectlinestart", + description: "Select line start", + bindKey: "Shift-Home", + exec: function(editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectlineend", + description: "Select line end", + bindKey: "Shift-End", + exec: function(editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "togglerecording", + description: "Toggle recording", + bindKey: bindKey("Ctrl-Alt-E", "Command-Option-E"), + exec: function(editor) { editor.commands.toggleRecording(editor); }, + readOnly: true +}, { + name: "replaymacro", + description: "Replay macro", + bindKey: bindKey("Ctrl-Shift-E", "Command-Shift-E"), + exec: function(editor) { editor.commands.replay(editor); }, + readOnly: true +}, { + name: "jumptomatching", + description: "Jump to matching", + bindKey: bindKey("Ctrl-\\|Ctrl-P", "Command-\\"), + exec: function(editor) { editor.jumpToMatching(); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true +}, { + name: "selecttomatching", + description: "Select to matching", + bindKey: bindKey("Ctrl-Shift-\\|Ctrl-Shift-P", "Command-Shift-\\"), + exec: function(editor) { editor.jumpToMatching(true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true +}, { + name: "expandToMatching", + description: "Expand to matching", + bindKey: bindKey("Ctrl-Shift-M", "Ctrl-Shift-M"), + exec: function(editor) { editor.jumpToMatching(true, true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true +}, { + name: "passKeysToBrowser", + description: "Pass keys to browser", + bindKey: bindKey(null, null), + exec: function() {}, + passEvent: true, + readOnly: true +}, { + name: "copy", + description: "Copy", + exec: function(editor) { + }, + readOnly: true +}, +{ + name: "cut", + description: "Cut", + exec: function(editor) { + var cutLine = editor.$copyWithEmptySelection && editor.selection.isEmpty(); + var range = cutLine ? editor.selection.getLineRange() : editor.selection.getRange(); + editor._emit("cut", range); + + if (!range.isEmpty()) + editor.session.remove(range); + editor.clearSelection(); + }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" +}, { + name: "paste", + description: "Paste", + exec: function(editor, args) { + editor.$handlePaste(args); + }, + scrollIntoView: "cursor" +}, { + name: "removeline", + description: "Remove line", + bindKey: bindKey("Ctrl-D", "Command-D"), + exec: function(editor) { editor.removeLines(); }, + scrollIntoView: "cursor", + multiSelectAction: "forEachLine" +}, { + name: "duplicateSelection", + description: "Duplicate selection", + bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"), + exec: function(editor) { editor.duplicateSelection(); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" +}, { + name: "sortlines", + description: "Sort lines", + bindKey: bindKey("Ctrl-Alt-S", "Command-Alt-S"), + exec: function(editor) { editor.sortLines(); }, + scrollIntoView: "selection", + multiSelectAction: "forEachLine" +}, { + name: "togglecomment", + description: "Toggle comment", + bindKey: bindKey("Ctrl-/", "Command-/"), + exec: function(editor) { editor.toggleCommentLines(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" +}, { + name: "toggleBlockComment", + description: "Toggle block comment", + bindKey: bindKey("Ctrl-Shift-/", "Command-Shift-/"), + exec: function(editor) { editor.toggleBlockComment(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" +}, { + name: "modifyNumberUp", + description: "Modify number up", + bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"), + exec: function(editor) { editor.modifyNumber(1); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" +}, { + name: "modifyNumberDown", + description: "Modify number down", + bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"), + exec: function(editor) { editor.modifyNumber(-1); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" +}, { + name: "replace", + description: "Replace", + bindKey: bindKey("Ctrl-H", "Command-Option-F"), + exec: function(editor) { + config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor, true);}); + } +}, { + name: "undo", + description: "Undo", + bindKey: bindKey("Ctrl-Z", "Command-Z"), + exec: function(editor) { editor.undo(); } +}, { + name: "redo", + description: "Redo", + bindKey: bindKey("Ctrl-Shift-Z|Ctrl-Y", "Command-Shift-Z|Command-Y"), + exec: function(editor) { editor.redo(); } +}, { + name: "copylinesup", + description: "Copy lines up", + bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"), + exec: function(editor) { editor.copyLinesUp(); }, + scrollIntoView: "cursor" +}, { + name: "movelinesup", + description: "Move lines up", + bindKey: bindKey("Alt-Up", "Option-Up"), + exec: function(editor) { editor.moveLinesUp(); }, + scrollIntoView: "cursor" +}, { + name: "copylinesdown", + description: "Copy lines down", + bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"), + exec: function(editor) { editor.copyLinesDown(); }, + scrollIntoView: "cursor" +}, { + name: "movelinesdown", + description: "Move lines down", + bindKey: bindKey("Alt-Down", "Option-Down"), + exec: function(editor) { editor.moveLinesDown(); }, + scrollIntoView: "cursor" +}, { + name: "del", + description: "Delete", + bindKey: bindKey("Delete", "Delete|Ctrl-D|Shift-Delete"), + exec: function(editor) { editor.remove("right"); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "backspace", + description: "Backspace", + bindKey: bindKey( + "Shift-Backspace|Backspace", + "Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H" + ), + exec: function(editor) { editor.remove("left"); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "cut_or_delete", + description: "Cut or delete", + bindKey: bindKey("Shift-Delete", null), + exec: function(editor) { + if (editor.selection.isEmpty()) { + editor.remove("left"); + } else { + return false; + } + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removetolinestart", + description: "Remove to line start", + bindKey: bindKey("Alt-Backspace", "Command-Backspace"), + exec: function(editor) { editor.removeToLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removetolineend", + description: "Remove to line end", + bindKey: bindKey("Alt-Delete", "Ctrl-K|Command-Delete"), + exec: function(editor) { editor.removeToLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removetolinestarthard", + description: "Remove to line start hard", + bindKey: bindKey("Ctrl-Shift-Backspace", null), + exec: function(editor) { + var range = editor.selection.getRange(); + range.start.column = 0; + editor.session.remove(range); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removetolineendhard", + description: "Remove to line end hard", + bindKey: bindKey("Ctrl-Shift-Delete", null), + exec: function(editor) { + var range = editor.selection.getRange(); + range.end.column = Number.MAX_VALUE; + editor.session.remove(range); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removewordleft", + description: "Remove word left", + bindKey: bindKey("Ctrl-Backspace", "Alt-Backspace|Ctrl-Alt-Backspace"), + exec: function(editor) { editor.removeWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removewordright", + description: "Remove word right", + bindKey: bindKey("Ctrl-Delete", "Alt-Delete"), + exec: function(editor) { editor.removeWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "outdent", + description: "Outdent", + bindKey: bindKey("Shift-Tab", "Shift-Tab"), + exec: function(editor) { editor.blockOutdent(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" +}, { + name: "indent", + description: "Indent", + bindKey: bindKey("Tab", "Tab"), + exec: function(editor) { editor.indent(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" +}, { + name: "blockoutdent", + description: "Block outdent", + bindKey: bindKey("Ctrl-[", "Ctrl-["), + exec: function(editor) { editor.blockOutdent(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" +}, { + name: "blockindent", + description: "Block indent", + bindKey: bindKey("Ctrl-]", "Ctrl-]"), + exec: function(editor) { editor.blockIndent(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" +}, { + name: "insertstring", + description: "Insert string", + exec: function(editor, str) { editor.insert(str); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "inserttext", + description: "Insert text", + exec: function(editor, args) { + editor.insert(lang.stringRepeat(args.text || "", args.times || 1)); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "splitline", + description: "Split line", + bindKey: bindKey(null, "Ctrl-O"), + exec: function(editor) { editor.splitLine(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "transposeletters", + description: "Transpose letters", + bindKey: bindKey("Alt-Shift-X", "Ctrl-T"), + exec: function(editor) { editor.transposeLetters(); }, + multiSelectAction: function(editor) {editor.transposeSelections(1); }, + scrollIntoView: "cursor" +}, { + name: "touppercase", + description: "To uppercase", + bindKey: bindKey("Ctrl-U", "Ctrl-U"), + exec: function(editor) { editor.toUpperCase(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "tolowercase", + description: "To lowercase", + bindKey: bindKey("Ctrl-Shift-U", "Ctrl-Shift-U"), + exec: function(editor) { editor.toLowerCase(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "autoindent", + description: "Auto Indent", + bindKey: bindKey(null, null), + exec: function(editor) { editor.autoIndent(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "animate" +}, { + name: "expandtoline", + description: "Expand to line", + bindKey: bindKey("Ctrl-Shift-L", "Command-Shift-L"), + exec: function(editor) { + var range = editor.selection.getRange(); + + range.start.column = range.end.column = 0; + range.end.row++; + editor.selection.setRange(range, false); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "joinlines", + description: "Join lines", + bindKey: bindKey(null, null), + exec: function(editor) { + var isBackwards = editor.selection.isBackwards(); + var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor(); + var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead(); + var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length; + var selectedText = editor.session.doc.getTextRange(editor.selection.getRange()); + var selectedCount = selectedText.replace(/\n\s*/, " ").length; + var insertLine = editor.session.doc.getLine(selectionStart.row); + + for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) { + var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i))); + if (curLine.length !== 0) { + curLine = " " + curLine; + } + insertLine += curLine; + } + + if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) { + insertLine += editor.session.doc.getNewLineCharacter(); + } + + editor.clearSelection(); + editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine); + + if (selectedCount > 0) { + editor.selection.moveCursorTo(selectionStart.row, selectionStart.column); + editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount); + } else { + firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol; + editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol); + } + }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "invertSelection", + description: "Invert selection", + bindKey: bindKey(null, null), + exec: function(editor) { + var endRow = editor.session.doc.getLength() - 1; + var endCol = editor.session.doc.getLine(endRow).length; + var ranges = editor.selection.rangeList.ranges; + var newRanges = []; + if (ranges.length < 1) { + ranges = [editor.selection.getRange()]; + } + + for (var i = 0; i < ranges.length; i++) { + if (i == (ranges.length - 1)) { + if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) { + newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol)); + } + } + + if (i === 0) { + if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) { + newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column)); + } + } else { + newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column)); + } + } + + editor.exitMultiSelectMode(); + editor.clearSelection(); + + for(var i = 0; i < newRanges.length; i++) { + editor.selection.addRange(newRanges[i], false); + } + }, + readOnly: true, + scrollIntoView: "none" +}, { + name: "addLineAfter", + description: "Add new line after the current line", + exec: function(editor) { + editor.selection.clearSelection(); + editor.navigateLineEnd(); + editor.insert("\n"); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "addLineBefore", + description: "Add new line before the current line", + exec: function(editor) { + editor.selection.clearSelection(); + var cursor = editor.getCursorPosition(); + editor.selection.moveTo(cursor.row - 1, Number.MAX_VALUE); + editor.insert("\n"); + if (cursor.row === 0) editor.navigateUp(); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "openCommandPallete", + description: "Open command pallete", + bindKey: bindKey("F1", "F1"), + exec: function(editor) { + editor.prompt({ $type: "commands" }); + }, + readOnly: true +}, { + name: "modeSelect", + description: "Change language mode...", + bindKey: bindKey(null, null), + exec: function(editor) { + editor.prompt({ $type: "modes" }); + }, + readOnly: true +}]; + +for (var i = 1; i < 9; i++) { + exports.commands.push({ + name: "foldToLevel" + i, + description: "Fold To Level " + i, + level: i, + exec: function(editor) { editor.session.foldToLevel(this.level); }, + scrollIntoView: "center", + readOnly: true + }); +} + +}); + +define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config","ace/token_iterator","ace/clipboard"], function(require, exports, module) { +"use strict"; + +require("./lib/fixoldbrowsers"); + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var lang = require("./lib/lang"); +var useragent = require("./lib/useragent"); +var TextInput = require("./keyboard/textinput").TextInput; +var MouseHandler = require("./mouse/mouse_handler").MouseHandler; +var FoldHandler = require("./mouse/fold_handler").FoldHandler; +var KeyBinding = require("./keyboard/keybinding").KeyBinding; +var EditSession = require("./edit_session").EditSession; +var Search = require("./search").Search; +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var CommandManager = require("./commands/command_manager").CommandManager; +var defaultCommands = require("./commands/default_commands").commands; +var config = require("./config"); +var TokenIterator = require("./token_iterator").TokenIterator; + +var clipboard = require("./clipboard"); +var Editor = function(renderer, session, options) { + this.$toDestroy = []; + var container = renderer.getContainerElement(); + this.container = container; + this.renderer = renderer; + this.id = "editor" + (++Editor.$uid); + + this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands); + if (typeof document == "object") { + this.textInput = new TextInput(renderer.getTextAreaContainer(), this); + this.renderer.textarea = this.textInput.getElement(); + this.$mouseHandler = new MouseHandler(this); + new FoldHandler(this); + } + + this.keyBinding = new KeyBinding(this); + + this.$search = new Search().set({ + wrap: true + }); + + this.$historyTracker = this.$historyTracker.bind(this); + this.commands.on("exec", this.$historyTracker); + + this.$initOperationListeners(); + + this._$emitInputEvent = lang.delayedCall(function() { + this._signal("input", {}); + if (this.session && !this.session.destroyed) + this.session.bgTokenizer.scheduleStart(); + }.bind(this)); + + this.on("change", function(_, _self) { + _self._$emitInputEvent.schedule(31); + }); + + this.setSession(session || options && options.session || new EditSession("")); + config.resetOptions(this); + if (options) + this.setOptions(options); + config._signal("editor", this); +}; + +Editor.$uid = 0; + +(function(){ + + oop.implement(this, EventEmitter); + + this.$initOperationListeners = function() { + this.commands.on("exec", this.startOperation.bind(this), true); + this.commands.on("afterExec", this.endOperation.bind(this), true); + + this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this, true)); + this.on("change", function() { + if (!this.curOp) { + this.startOperation(); + this.curOp.selectionBefore = this.$lastSel; + } + this.curOp.docChanged = true; + }.bind(this), true); + + this.on("changeSelection", function() { + if (!this.curOp) { + this.startOperation(); + this.curOp.selectionBefore = this.$lastSel; + } + this.curOp.selectionChanged = true; + }.bind(this), true); + }; + + this.curOp = null; + this.prevOp = {}; + this.startOperation = function(commandEvent) { + if (this.curOp) { + if (!commandEvent || this.curOp.command) + return; + this.prevOp = this.curOp; + } + if (!commandEvent) { + this.previousCommand = null; + commandEvent = {}; + } + + this.$opResetTimer.schedule(); + this.curOp = this.session.curOp = { + command: commandEvent.command || {}, + args: commandEvent.args, + scrollTop: this.renderer.scrollTop + }; + this.curOp.selectionBefore = this.selection.toJSON(); + }; + + this.endOperation = function(e) { + if (this.curOp && this.session) { + if (e && e.returnValue === false || !this.session) + return (this.curOp = null); + if (e == true && this.curOp.command && this.curOp.command.name == "mouse") + return; + this._signal("beforeEndOperation"); + if (!this.curOp) return; + var command = this.curOp.command; + var scrollIntoView = command && command.scrollIntoView; + if (scrollIntoView) { + switch (scrollIntoView) { + case "center-animate": + scrollIntoView = "animate"; + case "center": + this.renderer.scrollCursorIntoView(null, 0.5); + break; + case "animate": + case "cursor": + this.renderer.scrollCursorIntoView(); + break; + case "selectionPart": + var range = this.selection.getRange(); + var config = this.renderer.layerConfig; + if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) { + this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead); + } + break; + default: + break; + } + if (scrollIntoView == "animate") + this.renderer.animateScrolling(this.curOp.scrollTop); + } + var sel = this.selection.toJSON(); + this.curOp.selectionAfter = sel; + this.$lastSel = this.selection.toJSON(); + this.session.getUndoManager().addSelection(sel); + this.prevOp = this.curOp; + this.curOp = null; + } + }; + this.$mergeableCommands = ["backspace", "del", "insertstring"]; + this.$historyTracker = function(e) { + if (!this.$mergeUndoDeltas) + return; + + var prev = this.prevOp; + var mergeableCommands = this.$mergeableCommands; + var shouldMerge = prev.command && (e.command.name == prev.command.name); + if (e.command.name == "insertstring") { + var text = e.args; + if (this.mergeNextCommand === undefined) + this.mergeNextCommand = true; + + shouldMerge = shouldMerge + && this.mergeNextCommand // previous command allows to coalesce with + && (!/\s/.test(text) || /\s/.test(prev.args)); // previous insertion was of same type + + this.mergeNextCommand = true; + } else { + shouldMerge = shouldMerge + && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable + } + + if ( + this.$mergeUndoDeltas != "always" + && Date.now() - this.sequenceStartTime > 2000 + ) { + shouldMerge = false; // the sequence is too long + } + + if (shouldMerge) + this.session.mergeUndoDeltas = true; + else if (mergeableCommands.indexOf(e.command.name) !== -1) + this.sequenceStartTime = Date.now(); + }; + this.setKeyboardHandler = function(keyboardHandler, cb) { + if (keyboardHandler && typeof keyboardHandler === "string" && keyboardHandler != "ace") { + this.$keybindingId = keyboardHandler; + var _self = this; + config.loadModule(["keybinding", keyboardHandler], function(module) { + if (_self.$keybindingId == keyboardHandler) + _self.keyBinding.setKeyboardHandler(module && module.handler); + cb && cb(); + }); + } else { + this.$keybindingId = null; + this.keyBinding.setKeyboardHandler(keyboardHandler); + cb && cb(); + } + }; + this.getKeyboardHandler = function() { + return this.keyBinding.getKeyboardHandler(); + }; + this.setSession = function(session) { + if (this.session == session) + return; + if (this.curOp) this.endOperation(); + this.curOp = {}; + + var oldSession = this.session; + if (oldSession) { + this.session.off("change", this.$onDocumentChange); + this.session.off("changeMode", this.$onChangeMode); + this.session.off("tokenizerUpdate", this.$onTokenizerUpdate); + this.session.off("changeTabSize", this.$onChangeTabSize); + this.session.off("changeWrapLimit", this.$onChangeWrapLimit); + this.session.off("changeWrapMode", this.$onChangeWrapMode); + this.session.off("changeFold", this.$onChangeFold); + this.session.off("changeFrontMarker", this.$onChangeFrontMarker); + this.session.off("changeBackMarker", this.$onChangeBackMarker); + this.session.off("changeBreakpoint", this.$onChangeBreakpoint); + this.session.off("changeAnnotation", this.$onChangeAnnotation); + this.session.off("changeOverwrite", this.$onCursorChange); + this.session.off("changeScrollTop", this.$onScrollTopChange); + this.session.off("changeScrollLeft", this.$onScrollLeftChange); + + var selection = this.session.getSelection(); + selection.off("changeCursor", this.$onCursorChange); + selection.off("changeSelection", this.$onSelectionChange); + } + + this.session = session; + if (session) { + this.$onDocumentChange = this.onDocumentChange.bind(this); + session.on("change", this.$onDocumentChange); + this.renderer.setSession(session); + + this.$onChangeMode = this.onChangeMode.bind(this); + session.on("changeMode", this.$onChangeMode); + + this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this); + session.on("tokenizerUpdate", this.$onTokenizerUpdate); + + this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer); + session.on("changeTabSize", this.$onChangeTabSize); + + this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this); + session.on("changeWrapLimit", this.$onChangeWrapLimit); + + this.$onChangeWrapMode = this.onChangeWrapMode.bind(this); + session.on("changeWrapMode", this.$onChangeWrapMode); + + this.$onChangeFold = this.onChangeFold.bind(this); + session.on("changeFold", this.$onChangeFold); + + this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this); + this.session.on("changeFrontMarker", this.$onChangeFrontMarker); + + this.$onChangeBackMarker = this.onChangeBackMarker.bind(this); + this.session.on("changeBackMarker", this.$onChangeBackMarker); + + this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this); + this.session.on("changeBreakpoint", this.$onChangeBreakpoint); + + this.$onChangeAnnotation = this.onChangeAnnotation.bind(this); + this.session.on("changeAnnotation", this.$onChangeAnnotation); + + this.$onCursorChange = this.onCursorChange.bind(this); + this.session.on("changeOverwrite", this.$onCursorChange); + + this.$onScrollTopChange = this.onScrollTopChange.bind(this); + this.session.on("changeScrollTop", this.$onScrollTopChange); + + this.$onScrollLeftChange = this.onScrollLeftChange.bind(this); + this.session.on("changeScrollLeft", this.$onScrollLeftChange); + + this.selection = session.getSelection(); + this.selection.on("changeCursor", this.$onCursorChange); + + this.$onSelectionChange = this.onSelectionChange.bind(this); + this.selection.on("changeSelection", this.$onSelectionChange); + + this.onChangeMode(); + + this.onCursorChange(); + + this.onScrollTopChange(); + this.onScrollLeftChange(); + this.onSelectionChange(); + this.onChangeFrontMarker(); + this.onChangeBackMarker(); + this.onChangeBreakpoint(); + this.onChangeAnnotation(); + this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); + this.renderer.updateFull(); + } else { + this.selection = null; + this.renderer.setSession(session); + } + + this._signal("changeSession", { + session: session, + oldSession: oldSession + }); + + this.curOp = null; + + oldSession && oldSession._signal("changeEditor", {oldEditor: this}); + session && session._signal("changeEditor", {editor: this}); + + if (session && !session.destroyed) + session.bgTokenizer.scheduleStart(); + }; + this.getSession = function() { + return this.session; + }; + this.setValue = function(val, cursorPos) { + this.session.doc.setValue(val); + + if (!cursorPos) + this.selectAll(); + else if (cursorPos == 1) + this.navigateFileEnd(); + else if (cursorPos == -1) + this.navigateFileStart(); + + return val; + }; + this.getValue = function() { + return this.session.getValue(); + }; + this.getSelection = function() { + return this.selection; + }; + this.resize = function(force) { + this.renderer.onResize(force); + }; + this.setTheme = function(theme, cb) { + this.renderer.setTheme(theme, cb); + }; + this.getTheme = function() { + return this.renderer.getTheme(); + }; + this.setStyle = function(style) { + this.renderer.setStyle(style); + }; + this.unsetStyle = function(style) { + this.renderer.unsetStyle(style); + }; + this.getFontSize = function () { + return this.getOption("fontSize") || + dom.computedStyle(this.container).fontSize; + }; + this.setFontSize = function(size) { + this.setOption("fontSize", size); + }; + + this.$highlightBrackets = function() { + if (this.$highlightPending) { + return; + } + var self = this; + this.$highlightPending = true; + setTimeout(function () { + self.$highlightPending = false; + var session = self.session; + if (!session || session.destroyed) return; + if (session.$bracketHighlight) { + session.$bracketHighlight.markerIds.forEach(function(id) { + session.removeMarker(id); + }); + session.$bracketHighlight = null; + } + var ranges = session.getMatchingBracketRanges(self.getCursorPosition()); + if (!ranges && session.$mode.getMatching) + ranges = session.$mode.getMatching(self.session); + if (!ranges) + return; + + var markerType = "ace_bracket"; + if (!Array.isArray(ranges)) { + ranges = [ranges]; + } else if (ranges.length == 1) { + markerType = "ace_error_bracket"; + } + if (ranges.length == 2) { + if (Range.comparePoints(ranges[0].end, ranges[1].start) == 0) + ranges = [Range.fromPoints(ranges[0].start, ranges[1].end)]; + else if (Range.comparePoints(ranges[0].start, ranges[1].end) == 0) + ranges = [Range.fromPoints(ranges[1].start, ranges[0].end)]; + } + + session.$bracketHighlight = { + ranges: ranges, + markerIds: ranges.map(function(range) { + return session.addMarker(range, markerType, "text"); + }) + }; + }, 50); + }; + this.$highlightTags = function() { + if (this.$highlightTagPending) + return; + var self = this; + this.$highlightTagPending = true; + setTimeout(function() { + self.$highlightTagPending = false; + + var session = self.session; + if (!session || session.destroyed) return; + + var pos = self.getCursorPosition(); + var iterator = new TokenIterator(self.session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + + if (!token || !/\b(?:tag-open|tag-name)/.test(token.type)) { + session.removeMarker(session.$tagHighlight); + session.$tagHighlight = null; + return; + } + + if (token.type.indexOf("tag-open") !== -1) { + token = iterator.stepForward(); + if (!token) + return; + } + + var tag = token.value; + var currentTag = token.value; + var depth = 0; + var prevToken = iterator.stepBackward(); + + if (prevToken.value === '<'){ + do { + prevToken = token; + token = iterator.stepForward(); + + if (token) { + if (token.type.indexOf('tag-name') !== -1) { + currentTag = token.value; + if (tag === currentTag) { + if (prevToken.value === '<') { + depth++; + } else if (prevToken.value === '') { // self closing tag + depth--; + } + } + + } while (token && depth >= 0); + } else { + do { + token = prevToken; + prevToken = iterator.stepBackward(); + + if (token) { + if (token.type.indexOf('tag-name') !== -1) { + if (tag === token.value) { + if (prevToken.value === '<') { + depth++; + } else if (prevToken.value === '') { // self closing tag + var stepCount = 0; + var tmpToken = prevToken; + while (tmpToken) { + if (tmpToken.type.indexOf('tag-name') !== -1 && tmpToken.value === tag) { + depth--; + break; + } else if (tmpToken.value === '<') { + break; + } + tmpToken = iterator.stepBackward(); + stepCount++; + } + for (var i = 0; i < stepCount; i++) { + iterator.stepForward(); + } + } + } + } while (prevToken && depth <= 0); + iterator.stepForward(); + } + + if (!token) { + session.removeMarker(session.$tagHighlight); + session.$tagHighlight = null; + return; + } + + var row = iterator.getCurrentTokenRow(); + var column = iterator.getCurrentTokenColumn(); + var range = new Range(row, column, row, column+token.value.length); + var sbm = session.$backMarkers[session.$tagHighlight]; + if (session.$tagHighlight && sbm != undefined && range.compareRange(sbm.range) !== 0) { + session.removeMarker(session.$tagHighlight); + session.$tagHighlight = null; + } + + if (!session.$tagHighlight) + session.$tagHighlight = session.addMarker(range, "ace_bracket", "text"); + }, 50); + }; + this.focus = function() { + this.textInput.focus(); + }; + this.isFocused = function() { + return this.textInput.isFocused(); + }; + this.blur = function() { + this.textInput.blur(); + }; + this.onFocus = function(e) { + if (this.$isFocused) + return; + this.$isFocused = true; + this.renderer.showCursor(); + this.renderer.visualizeFocus(); + this._emit("focus", e); + }; + this.onBlur = function(e) { + if (!this.$isFocused) + return; + this.$isFocused = false; + this.renderer.hideCursor(); + this.renderer.visualizeBlur(); + this._emit("blur", e); + }; + + this.$cursorChange = function() { + this.renderer.updateCursor(); + this.$highlightBrackets(); + this.$highlightTags(); + this.$updateHighlightActiveLine(); + }; + this.onDocumentChange = function(delta) { + var wrap = this.session.$useWrapMode; + var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity); + this.renderer.updateLines(delta.start.row, lastRow, wrap); + + this._signal("change", delta); + this.$cursorChange(); + }; + + this.onTokenizerUpdate = function(e) { + var rows = e.data; + this.renderer.updateLines(rows.first, rows.last); + }; + + + this.onScrollTopChange = function() { + this.renderer.scrollToY(this.session.getScrollTop()); + }; + + this.onScrollLeftChange = function() { + this.renderer.scrollToX(this.session.getScrollLeft()); + }; + this.onCursorChange = function() { + this.$cursorChange(); + this._signal("changeSelection"); + }; + + this.$updateHighlightActiveLine = function() { + var session = this.getSession(); + + var highlight; + if (this.$highlightActiveLine) { + if (this.$selectionStyle != "line" || !this.selection.isMultiLine()) + highlight = this.getCursorPosition(); + if (this.renderer.theme && this.renderer.theme.$selectionColorConflict && !this.selection.isEmpty()) + highlight = false; + if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1)) + highlight = false; + } + + if (session.$highlightLineMarker && !highlight) { + session.removeMarker(session.$highlightLineMarker.id); + session.$highlightLineMarker = null; + } else if (!session.$highlightLineMarker && highlight) { + var range = new Range(highlight.row, highlight.column, highlight.row, Infinity); + range.id = session.addMarker(range, "ace_active-line", "screenLine"); + session.$highlightLineMarker = range; + } else if (highlight) { + session.$highlightLineMarker.start.row = highlight.row; + session.$highlightLineMarker.end.row = highlight.row; + session.$highlightLineMarker.start.column = highlight.column; + session._signal("changeBackMarker"); + } + }; + + this.onSelectionChange = function(e) { + var session = this.session; + + if (session.$selectionMarker) { + session.removeMarker(session.$selectionMarker); + } + session.$selectionMarker = null; + + if (!this.selection.isEmpty()) { + var range = this.selection.getRange(); + var style = this.getSelectionStyle(); + session.$selectionMarker = session.addMarker(range, "ace_selection", style); + } else { + this.$updateHighlightActiveLine(); + } + + var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp(); + this.session.highlight(re); + + this._signal("changeSelection"); + }; + + this.$getSelectionHighLightRegexp = function() { + var session = this.session; + + var selection = this.getSelectionRange(); + if (selection.isEmpty() || selection.isMultiLine()) + return; + + var startColumn = selection.start.column; + var endColumn = selection.end.column; + var line = session.getLine(selection.start.row); + + var needle = line.substring(startColumn, endColumn); + if (needle.length > 5000 || !/[\w\d]/.test(needle)) + return; + + var re = this.$search.$assembleRegExp({ + wholeWord: true, + caseSensitive: true, + needle: needle + }); + + var wordWithBoundary = line.substring(startColumn - 1, endColumn + 1); + if (!re.test(wordWithBoundary)) + return; + + return re; + }; + + + this.onChangeFrontMarker = function() { + this.renderer.updateFrontMarkers(); + }; + + this.onChangeBackMarker = function() { + this.renderer.updateBackMarkers(); + }; + + + this.onChangeBreakpoint = function() { + this.renderer.updateBreakpoints(); + }; + + this.onChangeAnnotation = function() { + this.renderer.setAnnotations(this.session.getAnnotations()); + }; + + + this.onChangeMode = function(e) { + this.renderer.updateText(); + this._emit("changeMode", e); + }; + + + this.onChangeWrapLimit = function() { + this.renderer.updateFull(); + }; + + this.onChangeWrapMode = function() { + this.renderer.onResize(true); + }; + + + this.onChangeFold = function() { + this.$updateHighlightActiveLine(); + this.renderer.updateFull(); + }; + this.getSelectedText = function() { + return this.session.getTextRange(this.getSelectionRange()); + }; + this.getCopyText = function() { + var text = this.getSelectedText(); + var nl = this.session.doc.getNewLineCharacter(); + var copyLine= false; + if (!text && this.$copyWithEmptySelection) { + copyLine = true; + var ranges = this.selection.getAllRanges(); + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (i && ranges[i - 1].start.row == range.start.row) + continue; + text += this.session.getLine(range.start.row) + nl; + } + } + var e = {text: text}; + this._signal("copy", e); + clipboard.lineMode = copyLine ? e.text : false; + return e.text; + }; + this.onCopy = function() { + this.commands.exec("copy", this); + }; + this.onCut = function() { + this.commands.exec("cut", this); + }; + this.onPaste = function(text, event) { + var e = {text: text, event: event}; + this.commands.exec("paste", this, e); + }; + + this.$handlePaste = function(e) { + if (typeof e == "string") + e = {text: e}; + this._signal("paste", e); + var text = e.text; + + var lineMode = text === clipboard.lineMode; + var session = this.session; + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) { + if (lineMode) + session.insert({ row: this.selection.lead.row, column: 0 }, text); + else + this.insert(text); + } else if (lineMode) { + this.selection.rangeList.ranges.forEach(function(range) { + session.insert({ row: range.start.row, column: 0 }, text); + }); + } else { + var lines = text.split(/\r\n|\r|\n/); + var ranges = this.selection.rangeList.ranges; + + var isFullLine = lines.length == 2 && (!lines[0] || !lines[1]); + if (lines.length != ranges.length || isFullLine) + return this.commands.exec("insertstring", this, text); + + for (var i = ranges.length; i--;) { + var range = ranges[i]; + if (!range.isEmpty()) + session.remove(range); + + session.insert(range.start, lines[i]); + } + } + }; + + this.execCommand = function(command, args) { + return this.commands.exec(command, this, args); + }; + this.insert = function(text, pasted) { + var session = this.session; + var mode = session.getMode(); + var cursor = this.getCursorPosition(); + + if (this.getBehavioursEnabled() && !pasted) { + var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text); + if (transform) { + if (text !== transform.text) { + if (!this.inVirtualSelectionMode) { + this.session.mergeUndoDeltas = false; + this.mergeNextCommand = false; + } + } + text = transform.text; + + } + } + + if (text == "\t") + text = this.session.getTabString(); + if (!this.selection.isEmpty()) { + var range = this.getSelectionRange(); + cursor = this.session.remove(range); + this.clearSelection(); + } + else if (this.session.getOverwrite() && text.indexOf("\n") == -1) { + var range = new Range.fromPoints(cursor, cursor); + range.end.column += text.length; + this.session.remove(range); + } + + if (text == "\n" || text == "\r\n") { + var line = session.getLine(cursor.row); + if (cursor.column > line.search(/\S|$/)) { + var d = line.substr(cursor.column).search(/\S|$/); + session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d); + } + } + this.clearSelection(); + + var start = cursor.column; + var lineState = session.getState(cursor.row); + var line = session.getLine(cursor.row); + var shouldOutdent = mode.checkOutdent(lineState, line, text); + session.insert(cursor, text); + + if (transform && transform.selection) { + if (transform.selection.length == 2) { // Transform relative to the current column + this.selection.setSelectionRange( + new Range(cursor.row, start + transform.selection[0], + cursor.row, start + transform.selection[1])); + } else { // Transform relative to the current row. + this.selection.setSelectionRange( + new Range(cursor.row + transform.selection[0], + transform.selection[1], + cursor.row + transform.selection[2], + transform.selection[3])); + } + } + if (this.$enableAutoIndent) { + if (session.getDocument().isNewLine(text)) { + var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString()); + + session.insert({row: cursor.row+1, column: 0}, lineIndent); + } + if (shouldOutdent) + mode.autoOutdent(lineState, session, cursor.row); + } + }; + + this.autoIndent = function () { + var session = this.session; + var mode = session.getMode(); + + var startRow, endRow; + if (this.selection.isEmpty()) { + startRow = 0; + endRow = session.doc.getLength() - 1; + } else { + var selectedRange = this.getSelectionRange(); + + startRow = selectedRange.start.row; + endRow = selectedRange.end.row; + } + + var prevLineState = ""; + var prevLine = ""; + var lineIndent = ""; + var line, currIndent, range; + var tab = session.getTabString(); + + for (var row = startRow; row <= endRow; row++) { + if (row > 0) { + prevLineState = session.getState(row - 1); + prevLine = session.getLine(row - 1); + lineIndent = mode.getNextLineIndent(prevLineState, prevLine, tab); + } + + line = session.getLine(row); + currIndent = mode.$getIndent(line); + if (lineIndent !== currIndent) { + if (currIndent.length > 0) { + range = new Range(row, 0, row, currIndent.length); + session.remove(range); + } + if (lineIndent.length > 0) { + session.insert({row: row, column: 0}, lineIndent); + } + } + + mode.autoOutdent(prevLineState, session, row); + } + }; + + + this.onTextInput = function(text, composition) { + if (!composition) + return this.keyBinding.onTextInput(text); + + this.startOperation({command: { name: "insertstring" }}); + var applyComposition = this.applyComposition.bind(this, text, composition); + if (this.selection.rangeCount) + this.forEachSelection(applyComposition); + else + applyComposition(); + this.endOperation(); + }; + + this.applyComposition = function(text, composition) { + if (composition.extendLeft || composition.extendRight) { + var r = this.selection.getRange(); + r.start.column -= composition.extendLeft; + r.end.column += composition.extendRight; + if (r.start.column < 0) { + r.start.row--; + r.start.column += this.session.getLine(r.start.row).length + 1; + } + this.selection.setRange(r); + if (!text && !r.isEmpty()) + this.remove(); + } + if (text || !this.selection.isEmpty()) + this.insert(text, true); + if (composition.restoreStart || composition.restoreEnd) { + var r = this.selection.getRange(); + r.start.column -= composition.restoreStart; + r.end.column -= composition.restoreEnd; + this.selection.setRange(r); + } + }; + + this.onCommandKey = function(e, hashId, keyCode) { + return this.keyBinding.onCommandKey(e, hashId, keyCode); + }; + this.setOverwrite = function(overwrite) { + this.session.setOverwrite(overwrite); + }; + this.getOverwrite = function() { + return this.session.getOverwrite(); + }; + this.toggleOverwrite = function() { + this.session.toggleOverwrite(); + }; + this.setScrollSpeed = function(speed) { + this.setOption("scrollSpeed", speed); + }; + this.getScrollSpeed = function() { + return this.getOption("scrollSpeed"); + }; + this.setDragDelay = function(dragDelay) { + this.setOption("dragDelay", dragDelay); + }; + this.getDragDelay = function() { + return this.getOption("dragDelay"); + }; + this.setSelectionStyle = function(val) { + this.setOption("selectionStyle", val); + }; + this.getSelectionStyle = function() { + return this.getOption("selectionStyle"); + }; + this.setHighlightActiveLine = function(shouldHighlight) { + this.setOption("highlightActiveLine", shouldHighlight); + }; + this.getHighlightActiveLine = function() { + return this.getOption("highlightActiveLine"); + }; + this.setHighlightGutterLine = function(shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + + this.getHighlightGutterLine = function() { + return this.getOption("highlightGutterLine"); + }; + this.setHighlightSelectedWord = function(shouldHighlight) { + this.setOption("highlightSelectedWord", shouldHighlight); + }; + this.getHighlightSelectedWord = function() { + return this.$highlightSelectedWord; + }; + + this.setAnimatedScroll = function(shouldAnimate){ + this.renderer.setAnimatedScroll(shouldAnimate); + }; + + this.getAnimatedScroll = function(){ + return this.renderer.getAnimatedScroll(); + }; + this.setShowInvisibles = function(showInvisibles) { + this.renderer.setShowInvisibles(showInvisibles); + }; + this.getShowInvisibles = function() { + return this.renderer.getShowInvisibles(); + }; + + this.setDisplayIndentGuides = function(display) { + this.renderer.setDisplayIndentGuides(display); + }; + + this.getDisplayIndentGuides = function() { + return this.renderer.getDisplayIndentGuides(); + }; + this.setShowPrintMargin = function(showPrintMargin) { + this.renderer.setShowPrintMargin(showPrintMargin); + }; + this.getShowPrintMargin = function() { + return this.renderer.getShowPrintMargin(); + }; + this.setPrintMarginColumn = function(showPrintMargin) { + this.renderer.setPrintMarginColumn(showPrintMargin); + }; + this.getPrintMarginColumn = function() { + return this.renderer.getPrintMarginColumn(); + }; + this.setReadOnly = function(readOnly) { + this.setOption("readOnly", readOnly); + }; + this.getReadOnly = function() { + return this.getOption("readOnly"); + }; + this.setBehavioursEnabled = function (enabled) { + this.setOption("behavioursEnabled", enabled); + }; + this.getBehavioursEnabled = function () { + return this.getOption("behavioursEnabled"); + }; + this.setWrapBehavioursEnabled = function (enabled) { + this.setOption("wrapBehavioursEnabled", enabled); + }; + this.getWrapBehavioursEnabled = function () { + return this.getOption("wrapBehavioursEnabled"); + }; + this.setShowFoldWidgets = function(show) { + this.setOption("showFoldWidgets", show); + + }; + this.getShowFoldWidgets = function() { + return this.getOption("showFoldWidgets"); + }; + + this.setFadeFoldWidgets = function(fade) { + this.setOption("fadeFoldWidgets", fade); + }; + + this.getFadeFoldWidgets = function() { + return this.getOption("fadeFoldWidgets"); + }; + this.remove = function(dir) { + if (this.selection.isEmpty()){ + if (dir == "left") + this.selection.selectLeft(); + else + this.selection.selectRight(); + } + + var range = this.getSelectionRange(); + if (this.getBehavioursEnabled()) { + var session = this.session; + var state = session.getState(range.start.row); + var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); + + if (range.end.column === 0) { + var text = session.getTextRange(range); + if (text[text.length - 1] == "\n") { + var line = session.getLine(range.end.row); + if (/^\s+$/.test(line)) { + range.end.column = line.length; + } + } + } + if (new_range) + range = new_range; + } + + this.session.remove(range); + this.clearSelection(); + }; + this.removeWordRight = function() { + if (this.selection.isEmpty()) + this.selection.selectWordRight(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeWordLeft = function() { + if (this.selection.isEmpty()) + this.selection.selectWordLeft(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeToLineStart = function() { + if (this.selection.isEmpty()) + this.selection.selectLineStart(); + if (this.selection.isEmpty()) + this.selection.selectLeft(); + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeToLineEnd = function() { + if (this.selection.isEmpty()) + this.selection.selectLineEnd(); + + var range = this.getSelectionRange(); + if (range.start.column == range.end.column && range.start.row == range.end.row) { + range.end.column = 0; + range.end.row++; + } + + this.session.remove(range); + this.clearSelection(); + }; + this.splitLine = function() { + if (!this.selection.isEmpty()) { + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + } + + var cursor = this.getCursorPosition(); + this.insert("\n"); + this.moveCursorToPosition(cursor); + }; + this.transposeLetters = function() { + if (!this.selection.isEmpty()) { + return; + } + + var cursor = this.getCursorPosition(); + var column = cursor.column; + if (column === 0) + return; + + var line = this.session.getLine(cursor.row); + var swap, range; + if (column < line.length) { + swap = line.charAt(column) + line.charAt(column-1); + range = new Range(cursor.row, column-1, cursor.row, column+1); + } + else { + swap = line.charAt(column-1) + line.charAt(column-2); + range = new Range(cursor.row, column-2, cursor.row, column); + } + this.session.replace(range, swap); + this.session.selection.moveToPosition(range.end); + }; + this.toLowerCase = function() { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toLowerCase()); + this.selection.setSelectionRange(originalRange); + }; + this.toUpperCase = function() { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toUpperCase()); + this.selection.setSelectionRange(originalRange); + }; + this.indent = function() { + var session = this.session; + var range = this.getSelectionRange(); + + if (range.start.row < range.end.row) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } else if (range.start.column < range.end.column) { + var text = session.getTextRange(range); + if (!/^\s+$/.test(text)) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } + } + + var line = session.getLine(range.start.row); + var position = range.start; + var size = session.getTabSize(); + var column = session.documentToScreenColumn(position.row, position.column); + + if (this.session.getUseSoftTabs()) { + var count = (size - column % size); + var indentString = lang.stringRepeat(" ", count); + } else { + var count = column % size; + while (line[range.start.column - 1] == " " && count) { + range.start.column--; + count--; + } + this.selection.setSelectionRange(range); + indentString = "\t"; + } + return this.insert(indentString); + }; + this.blockIndent = function() { + var rows = this.$getSelectedRows(); + this.session.indentRows(rows.first, rows.last, "\t"); + }; + this.blockOutdent = function() { + var selection = this.session.getSelection(); + this.session.outdentRows(selection.getRange()); + }; + this.sortLines = function() { + var rows = this.$getSelectedRows(); + var session = this.session; + + var lines = []; + for (var i = rows.first; i <= rows.last; i++) + lines.push(session.getLine(i)); + + lines.sort(function(a, b) { + if (a.toLowerCase() < b.toLowerCase()) return -1; + if (a.toLowerCase() > b.toLowerCase()) return 1; + return 0; + }); + + var deleteRange = new Range(0, 0, 0, 0); + for (var i = rows.first; i <= rows.last; i++) { + var line = session.getLine(i); + deleteRange.start.row = i; + deleteRange.end.row = i; + deleteRange.end.column = line.length; + session.replace(deleteRange, lines[i-rows.first]); + } + }; + this.toggleCommentLines = function() { + var state = this.session.getState(this.getCursorPosition().row); + var rows = this.$getSelectedRows(); + this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last); + }; + + this.toggleBlockComment = function() { + var cursor = this.getCursorPosition(); + var state = this.session.getState(cursor.row); + var range = this.getSelectionRange(); + this.session.getMode().toggleBlockComment(state, this.session, range, cursor); + }; + this.getNumberAt = function(row, column) { + var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g; + _numberRx.lastIndex = 0; + + var s = this.session.getLine(row); + while (_numberRx.lastIndex < column) { + var m = _numberRx.exec(s); + if(m.index <= column && m.index+m[0].length >= column){ + var number = { + value: m[0], + start: m.index, + end: m.index+m[0].length + }; + return number; + } + } + return null; + }; + this.modifyNumber = function(amount) { + var row = this.selection.getCursor().row; + var column = this.selection.getCursor().column; + var charRange = new Range(row, column-1, row, column); + + var c = this.session.getTextRange(charRange); + if (!isNaN(parseFloat(c)) && isFinite(c)) { + var nr = this.getNumberAt(row, column); + if (nr) { + var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end; + var decimals = nr.start + nr.value.length - fp; + + var t = parseFloat(nr.value); + t *= Math.pow(10, decimals); + + + if(fp !== nr.end && column < fp){ + amount *= Math.pow(10, nr.end - column - 1); + } else { + amount *= Math.pow(10, nr.end - column); + } + + t += amount; + t /= Math.pow(10, decimals); + var nnr = t.toFixed(decimals); + var replaceRange = new Range(row, nr.start, row, nr.end); + this.session.replace(replaceRange, nnr); + this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length)); + + } + } else { + this.toggleWord(); + } + }; + + this.$toggleWordPairs = [ + ["first", "last"], + ["true", "false"], + ["yes", "no"], + ["width", "height"], + ["top", "bottom"], + ["right", "left"], + ["on", "off"], + ["x", "y"], + ["get", "set"], + ["max", "min"], + ["horizontal", "vertical"], + ["show", "hide"], + ["add", "remove"], + ["up", "down"], + ["before", "after"], + ["even", "odd"], + ["in", "out"], + ["inside", "outside"], + ["next", "previous"], + ["increase", "decrease"], + ["attach", "detach"], + ["&&", "||"], + ["==", "!="] + ]; + + this.toggleWord = function () { + var row = this.selection.getCursor().row; + var column = this.selection.getCursor().column; + this.selection.selectWord(); + var currentState = this.getSelectedText(); + var currWordStart = this.selection.getWordRange().start.column; + var wordParts = currentState.replace(/([a-z]+|[A-Z]+)(?=[A-Z_]|$)/g, '$1 ').split(/\s/); + var delta = column - currWordStart - 1; + if (delta < 0) delta = 0; + var curLength = 0, itLength = 0; + var that = this; + if (currentState.match(/[A-Za-z0-9_]+/)) { + wordParts.forEach(function (item, i) { + itLength = curLength + item.length; + if (delta >= curLength && delta <= itLength) { + currentState = item; + that.selection.clearSelection(); + that.moveCursorTo(row, curLength + currWordStart); + that.selection.selectTo(row, itLength + currWordStart); + } + curLength = itLength; + }); + } + + var wordPairs = this.$toggleWordPairs; + var reg; + for (var i = 0; i < wordPairs.length; i++) { + var item = wordPairs[i]; + for (var j = 0; j <= 1; j++) { + var negate = +!j; + var firstCondition = currentState.match(new RegExp('^\\s?_?(' + lang.escapeRegExp(item[j]) + ')\\s?$', 'i')); + if (firstCondition) { + var secondCondition = currentState.match(new RegExp('([_]|^|\\s)(' + lang.escapeRegExp(firstCondition[1]) + ')($|\\s)', 'g')); + if (secondCondition) { + reg = currentState.replace(new RegExp(lang.escapeRegExp(item[j]), 'i'), function (result) { + var res = item[negate]; + if (result.toUpperCase() == result) { + res = res.toUpperCase(); + } else if (result.charAt(0).toUpperCase() == result.charAt(0)) { + res = res.substr(0, 0) + item[negate].charAt(0).toUpperCase() + res.substr(1); + } + return res; + }); + this.insert(reg); + reg = ""; + } + } + } + } + }; + this.removeLines = function() { + var rows = this.$getSelectedRows(); + this.session.removeFullLines(rows.first, rows.last); + this.clearSelection(); + }; + + this.duplicateSelection = function() { + var sel = this.selection; + var doc = this.session; + var range = sel.getRange(); + var reverse = sel.isBackwards(); + if (range.isEmpty()) { + var row = range.start.row; + doc.duplicateLines(row, row); + } else { + var point = reverse ? range.start : range.end; + var endPoint = doc.insert(point, doc.getTextRange(range), false); + range.start = point; + range.end = endPoint; + + sel.setSelectionRange(range, reverse); + } + }; + this.moveLinesDown = function() { + this.$moveLines(1, false); + }; + this.moveLinesUp = function() { + this.$moveLines(-1, false); + }; + this.moveText = function(range, toPosition, copy) { + return this.session.moveText(range, toPosition, copy); + }; + this.copyLinesUp = function() { + this.$moveLines(-1, true); + }; + this.copyLinesDown = function() { + this.$moveLines(1, true); + }; + this.$moveLines = function(dir, copy) { + var rows, moved; + var selection = this.selection; + if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) { + var range = selection.toOrientedRange(); + rows = this.$getSelectedRows(range); + moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir); + if (copy && dir == -1) moved = 0; + range.moveBy(moved, 0); + selection.fromOrientedRange(range); + } else { + var ranges = selection.rangeList.ranges; + selection.rangeList.detach(this.session); + this.inVirtualSelectionMode = true; + + var diff = 0; + var totalDiff = 0; + var l = ranges.length; + for (var i = 0; i < l; i++) { + var rangeIndex = i; + ranges[i].moveBy(diff, 0); + rows = this.$getSelectedRows(ranges[i]); + var first = rows.first; + var last = rows.last; + while (++i < l) { + if (totalDiff) ranges[i].moveBy(totalDiff, 0); + var subRows = this.$getSelectedRows(ranges[i]); + if (copy && subRows.first != last) + break; + else if (!copy && subRows.first > last + 1) + break; + last = subRows.last; + } + i--; + diff = this.session.$moveLines(first, last, copy ? 0 : dir); + if (copy && dir == -1) rangeIndex = i + 1; + while (rangeIndex <= i) { + ranges[rangeIndex].moveBy(diff, 0); + rangeIndex++; + } + if (!copy) diff = 0; + totalDiff += diff; + } + + selection.fromOrientedRange(selection.ranges[0]); + selection.rangeList.attach(this.session); + this.inVirtualSelectionMode = false; + } + }; + this.$getSelectedRows = function(range) { + range = (range || this.getSelectionRange()).collapseRows(); + + return { + first: this.session.getRowFoldStart(range.start.row), + last: this.session.getRowFoldEnd(range.end.row) + }; + }; + + this.onCompositionStart = function(compositionState) { + this.renderer.showComposition(compositionState); + }; + + this.onCompositionUpdate = function(text) { + this.renderer.setCompositionText(text); + }; + + this.onCompositionEnd = function() { + this.renderer.hideComposition(); + }; + this.getFirstVisibleRow = function() { + return this.renderer.getFirstVisibleRow(); + }; + this.getLastVisibleRow = function() { + return this.renderer.getLastVisibleRow(); + }; + this.isRowVisible = function(row) { + return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()); + }; + this.isRowFullyVisible = function(row) { + return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow()); + }; + this.$getVisibleRowCount = function() { + return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1; + }; + + this.$moveByPage = function(dir, select) { + var renderer = this.renderer; + var config = this.renderer.layerConfig; + var rows = dir * Math.floor(config.height / config.lineHeight); + + if (select === true) { + this.selection.$moveSelection(function(){ + this.moveCursorBy(rows, 0); + }); + } else if (select === false) { + this.selection.moveCursorBy(rows, 0); + this.selection.clearSelection(); + } + + var scrollTop = renderer.scrollTop; + + renderer.scrollBy(0, rows * config.lineHeight); + if (select != null) + renderer.scrollCursorIntoView(null, 0.5); + + renderer.animateScrolling(scrollTop); + }; + this.selectPageDown = function() { + this.$moveByPage(1, true); + }; + this.selectPageUp = function() { + this.$moveByPage(-1, true); + }; + this.gotoPageDown = function() { + this.$moveByPage(1, false); + }; + this.gotoPageUp = function() { + this.$moveByPage(-1, false); + }; + this.scrollPageDown = function() { + this.$moveByPage(1); + }; + this.scrollPageUp = function() { + this.$moveByPage(-1); + }; + this.scrollToRow = function(row) { + this.renderer.scrollToRow(row); + }; + this.scrollToLine = function(line, center, animate, callback) { + this.renderer.scrollToLine(line, center, animate, callback); + }; + this.centerSelection = function() { + var range = this.getSelectionRange(); + var pos = { + row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2), + column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2) + }; + this.renderer.alignCursor(pos, 0.5); + }; + this.getCursorPosition = function() { + return this.selection.getCursor(); + }; + this.getCursorPositionScreen = function() { + return this.session.documentToScreenPosition(this.getCursorPosition()); + }; + this.getSelectionRange = function() { + return this.selection.getRange(); + }; + this.selectAll = function() { + this.selection.selectAll(); + }; + this.clearSelection = function() { + this.selection.clearSelection(); + }; + this.moveCursorTo = function(row, column) { + this.selection.moveCursorTo(row, column); + }; + this.moveCursorToPosition = function(pos) { + this.selection.moveCursorToPosition(pos); + }; + this.jumpToMatching = function(select, expand) { + var cursor = this.getCursorPosition(); + var iterator = new TokenIterator(this.session, cursor.row, cursor.column); + var prevToken = iterator.getCurrentToken(); + var token = prevToken || iterator.stepForward(); + + if (!token) return; + var matchType; + var found = false; + var depth = {}; + var i = cursor.column - token.start; + var bracketType; + var brackets = { + ")": "(", + "(": "(", + "]": "[", + "[": "[", + "{": "{", + "}": "{" + }; + + do { + if (token.value.match(/[{}()\[\]]/g)) { + for (; i < token.value.length && !found; i++) { + if (!brackets[token.value[i]]) { + continue; + } + + bracketType = brackets[token.value[i]] + '.' + token.type.replace("rparen", "lparen"); + + if (isNaN(depth[bracketType])) { + depth[bracketType] = 0; + } + + switch (token.value[i]) { + case '(': + case '[': + case '{': + depth[bracketType]++; + break; + case ')': + case ']': + case '}': + depth[bracketType]--; + + if (depth[bracketType] === -1) { + matchType = 'bracket'; + found = true; + } + break; + } + } + } + else if (token.type.indexOf('tag-name') !== -1) { + if (isNaN(depth[token.value])) { + depth[token.value] = 0; + } + + if (prevToken.value === '<') { + depth[token.value]++; + } + else if (prevToken.value === '= 0; --i) { + if(this.$tryReplace(ranges[i], replacement)) { + replaced++; + } + } + + this.selection.setSelectionRange(selection); + + return replaced; + }; + + this.$tryReplace = function(range, replacement) { + var input = this.session.getTextRange(range); + replacement = this.$search.replace(input, replacement); + if (replacement !== null) { + range.end = this.session.replace(range, replacement); + return range; + } else { + return null; + } + }; + this.getLastSearchOptions = function() { + return this.$search.getOptions(); + }; + this.find = function(needle, options, animate) { + if (!options) + options = {}; + + if (typeof needle == "string" || needle instanceof RegExp) + options.needle = needle; + else if (typeof needle == "object") + oop.mixin(options, needle); + + var range = this.selection.getRange(); + if (options.needle == null) { + needle = this.session.getTextRange(range) + || this.$search.$options.needle; + if (!needle) { + range = this.session.getWordRange(range.start.row, range.start.column); + needle = this.session.getTextRange(range); + } + this.$search.set({needle: needle}); + } + + this.$search.set(options); + if (!options.start) + this.$search.set({start: range}); + + var newRange = this.$search.find(this.session); + if (options.preventScroll) + return newRange; + if (newRange) { + this.revealRange(newRange, animate); + return newRange; + } + if (options.backwards) + range.start = range.end; + else + range.end = range.start; + this.selection.setRange(range); + }; + this.findNext = function(options, animate) { + this.find({skipCurrent: true, backwards: false}, options, animate); + }; + this.findPrevious = function(options, animate) { + this.find(options, {skipCurrent: true, backwards: true}, animate); + }; + + this.revealRange = function(range, animate) { + this.session.unfold(range); + this.selection.setSelectionRange(range); + + var scrollTop = this.renderer.scrollTop; + this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5); + if (animate !== false) + this.renderer.animateScrolling(scrollTop); + }; + this.undo = function() { + this.session.getUndoManager().undo(this.session); + this.renderer.scrollCursorIntoView(null, 0.5); + }; + this.redo = function() { + this.session.getUndoManager().redo(this.session); + this.renderer.scrollCursorIntoView(null, 0.5); + }; + this.destroy = function() { + if (this.$toDestroy) { + this.$toDestroy.forEach(function(el) { + el.destroy(); + }); + this.$toDestroy = null; + } + if (this.$mouseHandler) + this.$mouseHandler.destroy(); + this.renderer.destroy(); + this._signal("destroy", this); + if (this.session) + this.session.destroy(); + if (this._$emitInputEvent) + this._$emitInputEvent.cancel(); + this.removeAllListeners(); + }; + this.setAutoScrollEditorIntoView = function(enable) { + if (!enable) + return; + var rect; + var self = this; + var shouldScroll = false; + if (!this.$scrollAnchor) + this.$scrollAnchor = document.createElement("div"); + var scrollAnchor = this.$scrollAnchor; + scrollAnchor.style.cssText = "position:absolute"; + this.container.insertBefore(scrollAnchor, this.container.firstChild); + var onChangeSelection = this.on("changeSelection", function() { + shouldScroll = true; + }); + var onBeforeRender = this.renderer.on("beforeRender", function() { + if (shouldScroll) + rect = self.renderer.container.getBoundingClientRect(); + }); + var onAfterRender = this.renderer.on("afterRender", function() { + if (shouldScroll && rect && (self.isFocused() + || self.searchBox && self.searchBox.isFocused()) + ) { + var renderer = self.renderer; + var pos = renderer.$cursorLayer.$pixelPos; + var config = renderer.layerConfig; + var top = pos.top - config.offset; + if (pos.top >= 0 && top + rect.top < 0) { + shouldScroll = true; + } else if (pos.top < config.height && + pos.top + rect.top + config.lineHeight > window.innerHeight) { + shouldScroll = false; + } else { + shouldScroll = null; + } + if (shouldScroll != null) { + scrollAnchor.style.top = top + "px"; + scrollAnchor.style.left = pos.left + "px"; + scrollAnchor.style.height = config.lineHeight + "px"; + scrollAnchor.scrollIntoView(shouldScroll); + } + shouldScroll = rect = null; + } + }); + this.setAutoScrollEditorIntoView = function(enable) { + if (enable) + return; + delete this.setAutoScrollEditorIntoView; + this.off("changeSelection", onChangeSelection); + this.renderer.off("afterRender", onAfterRender); + this.renderer.off("beforeRender", onBeforeRender); + }; + }; + + + this.$resetCursorStyle = function() { + var style = this.$cursorStyle || "ace"; + var cursorLayer = this.renderer.$cursorLayer; + if (!cursorLayer) + return; + cursorLayer.setSmoothBlinking(/smooth/.test(style)); + cursorLayer.isBlinking = !this.$readOnly && style != "wide"; + dom.setCssClass(cursorLayer.element, "ace_slim-cursors", /slim/.test(style)); + }; + this.prompt = function(message, options, callback) { + var editor = this; + config.loadModule("./ext/prompt", function (module) { + module.prompt(editor, message, options, callback); + }); + }; + +}).call(Editor.prototype); + + + +config.defineOptions(Editor.prototype, "editor", { + selectionStyle: { + set: function(style) { + this.onSelectionChange(); + this._signal("changeSelectionStyle", {data: style}); + }, + initialValue: "line" + }, + highlightActiveLine: { + set: function() {this.$updateHighlightActiveLine();}, + initialValue: true + }, + highlightSelectedWord: { + set: function(shouldHighlight) {this.$onSelectionChange();}, + initialValue: true + }, + readOnly: { + set: function(readOnly) { + this.textInput.setReadOnly(readOnly); + this.$resetCursorStyle(); + }, + initialValue: false + }, + copyWithEmptySelection: { + set: function(value) { + this.textInput.setCopyWithEmptySelection(value); + }, + initialValue: false + }, + cursorStyle: { + set: function(val) { this.$resetCursorStyle(); }, + values: ["ace", "slim", "smooth", "wide"], + initialValue: "ace" + }, + mergeUndoDeltas: { + values: [false, true, "always"], + initialValue: true + }, + behavioursEnabled: {initialValue: true}, + wrapBehavioursEnabled: {initialValue: true}, + enableAutoIndent: {initialValue: true}, + autoScrollEditorIntoView: { + set: function(val) {this.setAutoScrollEditorIntoView(val);} + }, + keyboardHandler: { + set: function(val) { this.setKeyboardHandler(val); }, + get: function() { return this.$keybindingId; }, + handlesSet: true + }, + value: { + set: function(val) { this.session.setValue(val); }, + get: function() { return this.getValue(); }, + handlesSet: true, + hidden: true + }, + session: { + set: function(val) { this.setSession(val); }, + get: function() { return this.session; }, + handlesSet: true, + hidden: true + }, + + showLineNumbers: { + set: function(show) { + this.renderer.$gutterLayer.setShowLineNumbers(show); + this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER); + if (show && this.$relativeLineNumbers) + relativeNumberRenderer.attach(this); + else + relativeNumberRenderer.detach(this); + }, + initialValue: true + }, + relativeLineNumbers: { + set: function(value) { + if (this.$showLineNumbers && value) + relativeNumberRenderer.attach(this); + else + relativeNumberRenderer.detach(this); + } + }, + placeholder: { + set: function(message) { + if (!this.$updatePlaceholder) { + this.$updatePlaceholder = function() { + var value = this.session && (this.renderer.$composition || this.getValue()); + if (value && this.renderer.placeholderNode) { + this.renderer.off("afterRender", this.$updatePlaceholder); + dom.removeCssClass(this.container, "ace_hasPlaceholder"); + this.renderer.placeholderNode.remove(); + this.renderer.placeholderNode = null; + } else if (!value && !this.renderer.placeholderNode) { + this.renderer.on("afterRender", this.$updatePlaceholder); + dom.addCssClass(this.container, "ace_hasPlaceholder"); + var el = dom.createElement("div"); + el.className = "ace_placeholder"; + el.textContent = this.$placeholder || ""; + this.renderer.placeholderNode = el; + this.renderer.content.appendChild(this.renderer.placeholderNode); + } else if (!value && this.renderer.placeholderNode) { + this.renderer.placeholderNode.textContent = this.$placeholder || ""; + } + }.bind(this); + this.on("input", this.$updatePlaceholder); + } + this.$updatePlaceholder(); + } + }, + + hScrollBarAlwaysVisible: "renderer", + vScrollBarAlwaysVisible: "renderer", + highlightGutterLine: "renderer", + animatedScroll: "renderer", + showInvisibles: "renderer", + showPrintMargin: "renderer", + printMarginColumn: "renderer", + printMargin: "renderer", + fadeFoldWidgets: "renderer", + showFoldWidgets: "renderer", + displayIndentGuides: "renderer", + showGutter: "renderer", + fontSize: "renderer", + fontFamily: "renderer", + maxLines: "renderer", + minLines: "renderer", + scrollPastEnd: "renderer", + fixedWidthGutter: "renderer", + theme: "renderer", + hasCssTransforms: "renderer", + maxPixelHeight: "renderer", + useTextareaForIME: "renderer", + + scrollSpeed: "$mouseHandler", + dragDelay: "$mouseHandler", + dragEnabled: "$mouseHandler", + focusTimeout: "$mouseHandler", + tooltipFollowsMouse: "$mouseHandler", + + firstLineNumber: "session", + overwrite: "session", + newLineMode: "session", + useWorker: "session", + useSoftTabs: "session", + navigateWithinSoftTabs: "session", + tabSize: "session", + wrap: "session", + indentedSoftWrap: "session", + foldStyle: "session", + mode: "session" +}); + + +var relativeNumberRenderer = { + getText: function(session, row) { + return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9 ? "\xb7" : ""))) + ""; + }, + getWidth: function(session, lastLineNumber, config) { + return Math.max( + lastLineNumber.toString().length, + (config.lastRow + 1).toString().length, + 2 + ) * config.characterWidth; + }, + update: function(e, editor) { + editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER); + }, + attach: function(editor) { + editor.renderer.$gutterLayer.$renderer = this; + editor.on("changeSelection", this.update); + this.update(null, editor); + }, + detach: function(editor) { + if (editor.renderer.$gutterLayer.$renderer == this) + editor.renderer.$gutterLayer.$renderer = null; + editor.off("changeSelection", this.update); + this.update(null, editor); + } +}; + +exports.Editor = Editor; +}); + +define("ace/undomanager",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; +var UndoManager = function() { + this.$maxRev = 0; + this.$fromUndo = false; + this.reset(); +}; + +(function() { + + this.addSession = function(session) { + this.$session = session; + }; + this.add = function(delta, allowMerge, session) { + if (this.$fromUndo) return; + if (delta == this.$lastDelta) return; + if (!this.$keepRedoStack) this.$redoStack.length = 0; + if (allowMerge === false || !this.lastDeltas) { + this.lastDeltas = []; + this.$undoStack.push(this.lastDeltas); + delta.id = this.$rev = ++this.$maxRev; + } + if (delta.action == "remove" || delta.action == "insert") + this.$lastDelta = delta; + this.lastDeltas.push(delta); + }; + + this.addSelection = function(selection, rev) { + this.selections.push({ + value: selection, + rev: rev || this.$rev + }); + }; + + this.startNewGroup = function() { + this.lastDeltas = null; + return this.$rev; + }; + + this.markIgnored = function(from, to) { + if (to == null) to = this.$rev + 1; + var stack = this.$undoStack; + for (var i = stack.length; i--;) { + var delta = stack[i][0]; + if (delta.id <= from) + break; + if (delta.id < to) + delta.ignore = true; + } + this.lastDeltas = null; + }; + + this.getSelection = function(rev, after) { + var stack = this.selections; + for (var i = stack.length; i--;) { + var selection = stack[i]; + if (selection.rev < rev) { + if (after) + selection = stack[i + 1]; + return selection; + } + } + }; + + this.getRevision = function() { + return this.$rev; + }; + + this.getDeltas = function(from, to) { + if (to == null) to = this.$rev + 1; + var stack = this.$undoStack; + var end = null, start = 0; + for (var i = stack.length; i--;) { + var delta = stack[i][0]; + if (delta.id < to && !end) + end = i+1; + if (delta.id <= from) { + start = i + 1; + break; + } + } + return stack.slice(start, end); + }; + + this.getChangedRanges = function(from, to) { + if (to == null) to = this.$rev + 1; + + }; + + this.getChangedLines = function(from, to) { + if (to == null) to = this.$rev + 1; + + }; + this.undo = function(session, dontSelect) { + this.lastDeltas = null; + var stack = this.$undoStack; + + if (!rearrangeUndoStack(stack, stack.length)) + return; + + if (!session) + session = this.$session; + + if (this.$redoStackBaseRev !== this.$rev && this.$redoStack.length) + this.$redoStack = []; + + this.$fromUndo = true; + + var deltaSet = stack.pop(); + var undoSelectionRange = null; + if (deltaSet) { + undoSelectionRange = session.undoChanges(deltaSet, dontSelect); + this.$redoStack.push(deltaSet); + this.$syncRev(); + } + + this.$fromUndo = false; + + return undoSelectionRange; + }; + this.redo = function(session, dontSelect) { + this.lastDeltas = null; + + if (!session) + session = this.$session; + + this.$fromUndo = true; + if (this.$redoStackBaseRev != this.$rev) { + var diff = this.getDeltas(this.$redoStackBaseRev, this.$rev + 1); + rebaseRedoStack(this.$redoStack, diff); + this.$redoStackBaseRev = this.$rev; + this.$redoStack.forEach(function(x) { + x[0].id = ++this.$maxRev; + }, this); + } + var deltaSet = this.$redoStack.pop(); + var redoSelectionRange = null; + + if (deltaSet) { + redoSelectionRange = session.redoChanges(deltaSet, dontSelect); + this.$undoStack.push(deltaSet); + this.$syncRev(); + } + this.$fromUndo = false; + + return redoSelectionRange; + }; + + this.$syncRev = function() { + var stack = this.$undoStack; + var nextDelta = stack[stack.length - 1]; + var id = nextDelta && nextDelta[0].id || 0; + this.$redoStackBaseRev = id; + this.$rev = id; + }; + this.reset = function() { + this.lastDeltas = null; + this.$lastDelta = null; + this.$undoStack = []; + this.$redoStack = []; + this.$rev = 0; + this.mark = 0; + this.$redoStackBaseRev = this.$rev; + this.selections = []; + }; + this.canUndo = function() { + return this.$undoStack.length > 0; + }; + this.canRedo = function() { + return this.$redoStack.length > 0; + }; + this.bookmark = function(rev) { + if (rev == undefined) + rev = this.$rev; + this.mark = rev; + }; + this.isAtBookmark = function() { + return this.$rev === this.mark; + }; + + this.toJSON = function() { + + }; + + this.fromJSON = function() { + + }; + + this.hasUndo = this.canUndo; + this.hasRedo = this.canRedo; + this.isClean = this.isAtBookmark; + this.markClean = this.bookmark; + + this.$prettyPrint = function(delta) { + if (delta) return stringifyDelta(delta); + return stringifyDelta(this.$undoStack) + "\n---\n" + stringifyDelta(this.$redoStack); + }; +}).call(UndoManager.prototype); + +function rearrangeUndoStack(stack, pos) { + for (var i = pos; i--; ) { + var deltaSet = stack[i]; + if (deltaSet && !deltaSet[0].ignore) { + while(i < pos - 1) { + var swapped = swapGroups(stack[i], stack[i + 1]); + stack[i] = swapped[0]; + stack[i + 1] = swapped[1]; + i++; + } + return true; + } + } +} + +var Range = require("./range").Range; +var cmp = Range.comparePoints; +var comparePoints = Range.comparePoints; + +function $updateMarkers(delta) { + var isInsert = delta.action == "insert"; + var start = delta.start; + var end = delta.end; + var rowShift = (end.row - start.row) * (isInsert ? 1 : -1); + var colShift = (end.column - start.column) * (isInsert ? 1 : -1); + if (isInsert) end = start; + + for (var i in this.marks) { + var point = this.marks[i]; + var cmp = comparePoints(point, start); + if (cmp < 0) { + continue; // delta starts after the range + } + if (cmp === 0) { + if (isInsert) { + if (point.bias == 1) { + cmp = 1; + } + else { + point.bias == -1; + continue; + } + } + } + var cmp2 = isInsert ? cmp : comparePoints(point, end); + if (cmp2 > 0) { + point.row += rowShift; + point.column += point.row == end.row ? colShift : 0; + continue; + } + if (!isInsert && cmp2 <= 0) { + point.row = start.row; + point.column = start.column; + if (cmp2 === 0) + point.bias = 1; + } + } +} + + + +function clonePos(pos) { + return {row: pos.row,column: pos.column}; +} +function cloneDelta(d) { + return { + start: clonePos(d.start), + end: clonePos(d.end), + action: d.action, + lines: d.lines.slice() + }; +} +function stringifyDelta(d) { + d = d || this; + if (Array.isArray(d)) { + return d.map(stringifyDelta).join("\n"); + } + var type = ""; + if (d.action) { + type = d.action == "insert" ? "+" : "-"; + type += "[" + d.lines + "]"; + } else if (d.value) { + if (Array.isArray(d.value)) { + type = d.value.map(stringifyRange).join("\n"); + } else { + type = stringifyRange(d.value); + } + } + if (d.start) { + type += stringifyRange(d); + } + if (d.id || d.rev) { + type += "\t(" + (d.id || d.rev) + ")"; + } + return type; +} +function stringifyRange(r) { + return r.start.row + ":" + r.start.column + + "=>" + r.end.row + ":" + r.end.column; +} + +function swap(d1, d2) { + var i1 = d1.action == "insert"; + var i2 = d2.action == "insert"; + + if (i1 && i2) { + if (cmp(d2.start, d1.end) >= 0) { + shift(d2, d1, -1); + } else if (cmp(d2.start, d1.start) <= 0) { + shift(d1, d2, +1); + } else { + return null; + } + } else if (i1 && !i2) { + if (cmp(d2.start, d1.end) >= 0) { + shift(d2, d1, -1); + } else if (cmp(d2.end, d1.start) <= 0) { + shift(d1, d2, -1); + } else { + return null; + } + } else if (!i1 && i2) { + if (cmp(d2.start, d1.start) >= 0) { + shift(d2, d1, +1); + } else if (cmp(d2.start, d1.start) <= 0) { + shift(d1, d2, +1); + } else { + return null; + } + } else if (!i1 && !i2) { + if (cmp(d2.start, d1.start) >= 0) { + shift(d2, d1, +1); + } else if (cmp(d2.end, d1.start) <= 0) { + shift(d1, d2, -1); + } else { + return null; + } + } + return [d2, d1]; +} +function swapGroups(ds1, ds2) { + for (var i = ds1.length; i--; ) { + for (var j = 0; j < ds2.length; j++) { + if (!swap(ds1[i], ds2[j])) { + while (i < ds1.length) { + while (j--) { + swap(ds2[j], ds1[i]); + } + j = ds2.length; + i++; + } + return [ds1, ds2]; + } + } + } + ds1.selectionBefore = ds2.selectionBefore = + ds1.selectionAfter = ds2.selectionAfter = null; + return [ds2, ds1]; +} +function xform(d1, c1) { + var i1 = d1.action == "insert"; + var i2 = c1.action == "insert"; + + if (i1 && i2) { + if (cmp(d1.start, c1.start) < 0) { + shift(c1, d1, 1); + } else { + shift(d1, c1, 1); + } + } else if (i1 && !i2) { + if (cmp(d1.start, c1.end) >= 0) { + shift(d1, c1, -1); + } else if (cmp(d1.start, c1.start) <= 0) { + shift(c1, d1, +1); + } else { + shift(d1, Range.fromPoints(c1.start, d1.start), -1); + shift(c1, d1, +1); + } + } else if (!i1 && i2) { + if (cmp(c1.start, d1.end) >= 0) { + shift(c1, d1, -1); + } else if (cmp(c1.start, d1.start) <= 0) { + shift(d1, c1, +1); + } else { + shift(c1, Range.fromPoints(d1.start, c1.start), -1); + shift(d1, c1, +1); + } + } else if (!i1 && !i2) { + if (cmp(c1.start, d1.end) >= 0) { + shift(c1, d1, -1); + } else if (cmp(c1.end, d1.start) <= 0) { + shift(d1, c1, -1); + } else { + var before, after; + if (cmp(d1.start, c1.start) < 0) { + before = d1; + d1 = splitDelta(d1, c1.start); + } + if (cmp(d1.end, c1.end) > 0) { + after = splitDelta(d1, c1.end); + } + + shiftPos(c1.end, d1.start, d1.end, -1); + if (after && !before) { + d1.lines = after.lines; + d1.start = after.start; + d1.end = after.end; + after = d1; + } + + return [c1, before, after].filter(Boolean); + } + } + return [c1, d1]; +} + +function shift(d1, d2, dir) { + shiftPos(d1.start, d2.start, d2.end, dir); + shiftPos(d1.end, d2.start, d2.end, dir); +} +function shiftPos(pos, start, end, dir) { + if (pos.row == (dir == 1 ? start : end).row) { + pos.column += dir * (end.column - start.column); + } + pos.row += dir * (end.row - start.row); +} +function splitDelta(c, pos) { + var lines = c.lines; + var end = c.end; + c.end = clonePos(pos); + var rowsBefore = c.end.row - c.start.row; + var otherLines = lines.splice(rowsBefore, lines.length); + + var col = rowsBefore ? pos.column : pos.column - c.start.column; + lines.push(otherLines[0].substring(0, col)); + otherLines[0] = otherLines[0].substr(col) ; + var rest = { + start: clonePos(pos), + end: end, + lines: otherLines, + action: c.action + }; + return rest; +} + +function moveDeltasByOne(redoStack, d) { + d = cloneDelta(d); + for (var j = redoStack.length; j--;) { + var deltaSet = redoStack[j]; + for (var i = 0; i < deltaSet.length; i++) { + var x = deltaSet[i]; + var xformed = xform(x, d); + d = xformed[0]; + if (xformed.length != 2) { + if (xformed[2]) { + deltaSet.splice(i + 1, 1, xformed[1], xformed[2]); + i++; + } else if (!xformed[1]) { + deltaSet.splice(i, 1); + i--; + } + } + } + if (!deltaSet.length) { + redoStack.splice(j, 1); + } + } + return redoStack; +} +function rebaseRedoStack(redoStack, deltaSets) { + for (var i = 0; i < deltaSets.length; i++) { + var deltas = deltaSets[i]; + for (var j = 0; j < deltas.length; j++) { + moveDeltasByOne(redoStack, deltas[j]); + } + } +} + +exports.UndoManager = UndoManager; + +}); + +define("ace/layer/lines",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); + +var Lines = function(element, canvasHeight) { + this.element = element; + this.canvasHeight = canvasHeight || 500000; + this.element.style.height = (this.canvasHeight * 2) + "px"; + + this.cells = []; + this.cellCache = []; + this.$offsetCoefficient = 0; +}; + +(function() { + + this.moveContainer = function(config) { + dom.translate(this.element, 0, -((config.firstRowScreen * config.lineHeight) % this.canvasHeight) - config.offset * this.$offsetCoefficient); + }; + + this.pageChanged = function(oldConfig, newConfig) { + return ( + Math.floor((oldConfig.firstRowScreen * oldConfig.lineHeight) / this.canvasHeight) !== + Math.floor((newConfig.firstRowScreen * newConfig.lineHeight) / this.canvasHeight) + ); + }; + + this.computeLineTop = function(row, config, session) { + var screenTop = config.firstRowScreen * config.lineHeight; + var screenPage = Math.floor(screenTop / this.canvasHeight); + var lineTop = session.documentToScreenRow(row, 0) * config.lineHeight; + return lineTop - (screenPage * this.canvasHeight); + }; + + this.computeLineHeight = function(row, config, session) { + return config.lineHeight * session.getRowLineCount(row); + }; + + this.getLength = function() { + return this.cells.length; + }; + + this.get = function(index) { + return this.cells[index]; + }; + + this.shift = function() { + this.$cacheCell(this.cells.shift()); + }; + + this.pop = function() { + this.$cacheCell(this.cells.pop()); + }; + + this.push = function(cell) { + if (Array.isArray(cell)) { + this.cells.push.apply(this.cells, cell); + var fragment = dom.createFragment(this.element); + for (var i=0; i foldStart) { + row = fold.end.row + 1; + fold = session.getNextFoldLine(row, fold); + foldStart = fold ? fold.start.row : Infinity; + } + if (row > lastRow) { + while (this.$lines.getLength() > index + 1) + this.$lines.pop(); + + break; + } + + cell = this.$lines.get(++index); + if (cell) { + cell.row = row; + } else { + cell = this.$lines.createCell(row, config, this.session, onCreateCell); + this.$lines.push(cell); + } + + this.$renderCell(cell, config, fold, row); + row++; + } + + this._signal("afterRender"); + this.$updateGutterWidth(config); + }; + + this.$updateGutterWidth = function(config) { + var session = this.session; + + var gutterRenderer = session.gutterRenderer || this.$renderer; + + var firstLineNumber = session.$firstLineNumber; + var lastLineText = this.$lines.last() ? this.$lines.last().text : ""; + + if (this.$fixedWidth || session.$useWrapMode) + lastLineText = session.getLength() + firstLineNumber - 1; + + var gutterWidth = gutterRenderer + ? gutterRenderer.getWidth(session, lastLineText, config) + : lastLineText.toString().length * config.characterWidth; + + var padding = this.$padding || this.$computePadding(); + gutterWidth += padding.left + padding.right; + if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) { + this.gutterWidth = gutterWidth; + this.element.parentNode.style.width = + this.element.style.width = Math.ceil(this.gutterWidth) + "px"; + this._signal("changeGutterWidth", gutterWidth); + } + }; + + this.$updateCursorRow = function() { + if (!this.$highlightGutterLine) + return; + + var position = this.session.selection.getCursor(); + if (this.$cursorRow === position.row) + return; + + this.$cursorRow = position.row; + }; + + this.updateLineHighlight = function() { + if (!this.$highlightGutterLine) + return; + var row = this.session.selection.cursor.row; + this.$cursorRow = row; + + if (this.$cursorCell && this.$cursorCell.row == row) + return; + if (this.$cursorCell) + this.$cursorCell.element.className = this.$cursorCell.element.className.replace("ace_gutter-active-line ", ""); + var cells = this.$lines.cells; + this.$cursorCell = null; + for (var i = 0; i < cells.length; i++) { + var cell = cells[i]; + if (cell.row >= this.$cursorRow) { + if (cell.row > this.$cursorRow) { + var fold = this.session.getFoldLine(this.$cursorRow); + if (i > 0 && fold && fold.start.row == cells[i - 1].row) + cell = cells[i - 1]; + else + break; + } + cell.element.className = "ace_gutter-active-line " + cell.element.className; + this.$cursorCell = cell; + break; + } + } + }; + + this.scrollLines = function(config) { + var oldConfig = this.config; + this.config = config; + + this.$updateCursorRow(); + if (this.$lines.pageChanged(oldConfig, config)) + return this.update(config); + + this.$lines.moveContainer(config); + + var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar + this.session.getLength() - 1); + var oldLastRow = this.oldLastRow; + this.oldLastRow = lastRow; + + if (!oldConfig || oldLastRow < config.firstRow) + return this.update(config); + + if (lastRow < oldConfig.firstRow) + return this.update(config); + + if (oldConfig.firstRow < config.firstRow) + for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--) + this.$lines.shift(); + + if (oldLastRow > lastRow) + for (var row=this.session.getFoldedRowCount(lastRow + 1, oldLastRow); row>0; row--) + this.$lines.pop(); + + if (config.firstRow < oldConfig.firstRow) { + this.$lines.unshift(this.$renderLines(config, config.firstRow, oldConfig.firstRow - 1)); + } + + if (lastRow > oldLastRow) { + this.$lines.push(this.$renderLines(config, oldLastRow + 1, lastRow)); + } + + this.updateLineHighlight(); + + this._signal("afterRender"); + this.$updateGutterWidth(config); + }; + + this.$renderLines = function(config, firstRow, lastRow) { + var fragment = []; + var row = firstRow; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (true) { + if (row > foldStart) { + row = foldLine.end.row+1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + if (row > lastRow) + break; + + var cell = this.$lines.createCell(row, config, this.session, onCreateCell); + this.$renderCell(cell, config, foldLine, row); + fragment.push(cell); + + row++; + } + return fragment; + }; + + this.$renderCell = function(cell, config, fold, row) { + var element = cell.element; + + var session = this.session; + + var textNode = element.childNodes[0]; + var foldWidget = element.childNodes[1]; + + var firstLineNumber = session.$firstLineNumber; + + var breakpoints = session.$breakpoints; + var decorations = session.$decorations; + var gutterRenderer = session.gutterRenderer || this.$renderer; + var foldWidgets = this.$showFoldWidgets && session.foldWidgets; + var foldStart = fold ? fold.start.row : Number.MAX_VALUE; + + var className = "ace_gutter-cell "; + if (this.$highlightGutterLine) { + if (row == this.$cursorRow || (fold && row < this.$cursorRow && row >= foldStart && this.$cursorRow <= fold.end.row)) { + className += "ace_gutter-active-line "; + if (this.$cursorCell != cell) { + if (this.$cursorCell) + this.$cursorCell.element.className = this.$cursorCell.element.className.replace("ace_gutter-active-line ", ""); + this.$cursorCell = cell; + } + } + } + + if (breakpoints[row]) + className += breakpoints[row]; + if (decorations[row]) + className += decorations[row]; + if (this.$annotations[row]) + className += this.$annotations[row].className; + if (element.className != className) + element.className = className; + + if (foldWidgets) { + var c = foldWidgets[row]; + if (c == null) + c = foldWidgets[row] = session.getFoldWidget(row); + } + + if (c) { + var className = "ace_fold-widget ace_" + c; + if (c == "start" && row == foldStart && row < fold.end.row) + className += " ace_closed"; + else + className += " ace_open"; + if (foldWidget.className != className) + foldWidget.className = className; + + var foldHeight = config.lineHeight + "px"; + dom.setStyle(foldWidget.style, "height", foldHeight); + dom.setStyle(foldWidget.style, "display", "inline-block"); + } else { + if (foldWidget) { + dom.setStyle(foldWidget.style, "display", "none"); + } + } + + var text = (gutterRenderer + ? gutterRenderer.getText(session, row) + : row + firstLineNumber).toString(); + + if (text !== textNode.data) { + textNode.data = text; + } + + dom.setStyle(cell.element.style, "height", this.$lines.computeLineHeight(row, config, session) + "px"); + dom.setStyle(cell.element.style, "top", this.$lines.computeLineTop(row, config, session) + "px"); + + cell.text = text; + return cell; + }; + + this.$fixedWidth = false; + + this.$highlightGutterLine = true; + this.$renderer = ""; + this.setHighlightGutterLine = function(highlightGutterLine) { + this.$highlightGutterLine = highlightGutterLine; + }; + + this.$showLineNumbers = true; + this.$renderer = ""; + this.setShowLineNumbers = function(show) { + this.$renderer = !show && { + getWidth: function() {return 0;}, + getText: function() {return "";} + }; + }; + + this.getShowLineNumbers = function() { + return this.$showLineNumbers; + }; + + this.$showFoldWidgets = true; + this.setShowFoldWidgets = function(show) { + if (show) + dom.addCssClass(this.element, "ace_folding-enabled"); + else + dom.removeCssClass(this.element, "ace_folding-enabled"); + + this.$showFoldWidgets = show; + this.$padding = null; + }; + + this.getShowFoldWidgets = function() { + return this.$showFoldWidgets; + }; + + this.$computePadding = function() { + if (!this.element.firstChild) + return {left: 0, right: 0}; + var style = dom.computedStyle(this.element.firstChild); + this.$padding = {}; + this.$padding.left = (parseInt(style.borderLeftWidth) || 0) + + (parseInt(style.paddingLeft) || 0) + 1; + this.$padding.right = (parseInt(style.borderRightWidth) || 0) + + (parseInt(style.paddingRight) || 0); + return this.$padding; + }; + + this.getRegion = function(point) { + var padding = this.$padding || this.$computePadding(); + var rect = this.element.getBoundingClientRect(); + if (point.x < padding.left + rect.left) + return "markers"; + if (this.$showFoldWidgets && point.x > rect.right - padding.right) + return "foldWidgets"; + }; + +}).call(Gutter.prototype); + +function onCreateCell(element) { + var textNode = document.createTextNode(''); + element.appendChild(textNode); + + var foldWidget = dom.createElement("span"); + element.appendChild(foldWidget); + + return element; +} + +exports.Gutter = Gutter; + +}); + +define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +var dom = require("../lib/dom"); + +var Marker = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_marker-layer"; + parentEl.appendChild(this.element); +}; + +(function() { + + this.$padding = 0; + + this.setPadding = function(padding) { + this.$padding = padding; + }; + this.setSession = function(session) { + this.session = session; + }; + + this.setMarkers = function(markers) { + this.markers = markers; + }; + + this.elt = function(className, css) { + var x = this.i != -1 && this.element.childNodes[this.i]; + if (!x) { + x = document.createElement("div"); + this.element.appendChild(x); + this.i = -1; + } else { + this.i++; + } + x.style.cssText = css; + x.className = className; + }; + + this.update = function(config) { + if (!config) return; + + this.config = config; + + this.i = 0; + var html; + for (var key in this.markers) { + var marker = this.markers[key]; + + if (!marker.range) { + marker.update(html, this, this.session, config); + continue; + } + + var range = marker.range.clipRows(config.firstRow, config.lastRow); + if (range.isEmpty()) continue; + + range = range.toScreenRange(this.session); + if (marker.renderer) { + var top = this.$getTop(range.start.row, config); + var left = this.$padding + range.start.column * config.characterWidth; + marker.renderer(html, range, left, top, config); + } else if (marker.type == "fullLine") { + this.drawFullLineMarker(html, range, marker.clazz, config); + } else if (marker.type == "screenLine") { + this.drawScreenLineMarker(html, range, marker.clazz, config); + } else if (range.isMultiLine()) { + if (marker.type == "text") + this.drawTextMarker(html, range, marker.clazz, config); + else + this.drawMultiLineMarker(html, range, marker.clazz, config); + } else { + this.drawSingleLineMarker(html, range, marker.clazz + " ace_start" + " ace_br15", config); + } + } + if (this.i !=-1) { + while (this.i < this.element.childElementCount) + this.element.removeChild(this.element.lastChild); + } + }; + + this.$getTop = function(row, layerConfig) { + return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight; + }; + + function getBorderClass(tl, tr, br, bl) { + return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0); + } + this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) { + var session = this.session; + var start = range.start.row; + var end = range.end.row; + var row = start; + var prev = 0; + var curr = 0; + var next = session.getScreenLastRowColumn(row); + var lineRange = new Range(row, range.start.column, row, curr); + for (; row <= end; row++) { + lineRange.start.row = lineRange.end.row = row; + lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row); + lineRange.end.column = next; + prev = curr; + curr = next; + next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column; + this.drawSingleLineMarker(stringBuilder, lineRange, + clazz + (row == start ? " ace_start" : "") + " ace_br" + + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end), + layerConfig, row == end ? 0 : 1, extraStyle); + } + }; + this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + var padding = this.$padding; + var height = config.lineHeight; + var top = this.$getTop(range.start.row, config); + var left = padding + range.start.column * config.characterWidth; + extraStyle = extraStyle || ""; + + if (this.session.$bidiHandler.isBidiRow(range.start.row)) { + var range1 = range.clone(); + range1.end.row = range1.start.row; + range1.end.column = this.session.getLine(range1.start.row).length; + this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + " ace_br1 ace_start", config, null, extraStyle); + } else { + this.elt( + clazz + " ace_br1 ace_start", + "height:"+ height+ "px;"+ "right:0;"+ "top:"+top+ "px;left:"+ left+ "px;" + (extraStyle || "") + ); + } + if (this.session.$bidiHandler.isBidiRow(range.end.row)) { + var range1 = range.clone(); + range1.start.row = range1.end.row; + range1.start.column = 0; + this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + " ace_br12", config, null, extraStyle); + } else { + top = this.$getTop(range.end.row, config); + var width = range.end.column * config.characterWidth; + + this.elt( + clazz + " ace_br12", + "height:"+ height+ "px;"+ + "width:"+ width+ "px;"+ + "top:"+ top+ "px;"+ + "left:"+ padding+ "px;"+ (extraStyle || "") + ); + } + height = (range.end.row - range.start.row - 1) * config.lineHeight; + if (height <= 0) + return; + top = this.$getTop(range.start.row + 1, config); + + var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8); + + this.elt( + clazz + (radiusClass ? " ace_br" + radiusClass : ""), + "height:"+ height+ "px;"+ + "right:0;"+ + "top:"+ top+ "px;"+ + "left:"+ padding+ "px;"+ (extraStyle || "") + ); + }; + this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) { + if (this.session.$bidiHandler.isBidiRow(range.start.row)) + return this.drawBidiSingleLineMarker(stringBuilder, range, clazz, config, extraLength, extraStyle); + var height = config.lineHeight; + var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth; + + var top = this.$getTop(range.start.row, config); + var left = this.$padding + range.start.column * config.characterWidth; + + this.elt( + clazz, + "height:"+ height+ "px;"+ + "width:"+ width+ "px;"+ + "top:"+ top+ "px;"+ + "left:"+ left+ "px;"+ (extraStyle || "") + ); + }; + this.drawBidiSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) { + var height = config.lineHeight, top = this.$getTop(range.start.row, config), padding = this.$padding; + var selections = this.session.$bidiHandler.getSelections(range.start.column, range.end.column); + + selections.forEach(function(selection) { + this.elt( + clazz, + "height:" + height + "px;" + + "width:" + selection.width + (extraLength || 0) + "px;" + + "top:" + top + "px;" + + "left:" + (padding + selection.left) + "px;" + (extraStyle || "") + ); + }, this); + }; + + this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + var top = this.$getTop(range.start.row, config); + var height = config.lineHeight; + if (range.start.row != range.end.row) + height += this.$getTop(range.end.row, config) - top; + + this.elt( + clazz, + "height:"+ height+ "px;"+ + "top:"+ top+ "px;"+ + "left:0;right:0;"+ (extraStyle || "") + ); + }; + + this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + var top = this.$getTop(range.start.row, config); + var height = config.lineHeight; + + this.elt( + clazz, + "height:"+ height+ "px;"+ + "top:"+ top+ "px;"+ + "left:0;right:0;"+ (extraStyle || "") + ); + }; + +}).call(Marker.prototype); + +exports.Marker = Marker; + +}); + +define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/layer/lines","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var Lines = require("./lines").Lines; +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var Text = function(parentEl) { + this.dom = dom; + this.element = this.dom.createElement("div"); + this.element.className = "ace_layer ace_text-layer"; + parentEl.appendChild(this.element); + this.$updateEolChar = this.$updateEolChar.bind(this); + this.$lines = new Lines(this.element); +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.EOF_CHAR = "\xB6"; + this.EOL_CHAR_LF = "\xAC"; + this.EOL_CHAR_CRLF = "\xa4"; + this.EOL_CHAR = this.EOL_CHAR_LF; + this.TAB_CHAR = "\u2014"; //"\u21E5"; + this.SPACE_CHAR = "\xB7"; + this.$padding = 0; + this.MAX_LINE_LENGTH = 10000; + + this.$updateEolChar = function() { + var doc = this.session.doc; + var unixMode = doc.getNewLineCharacter() == "\n" && doc.getNewLineMode() != "windows"; + var EOL_CHAR = unixMode ? this.EOL_CHAR_LF : this.EOL_CHAR_CRLF; + if (this.EOL_CHAR != EOL_CHAR) { + this.EOL_CHAR = EOL_CHAR; + return true; + } + }; + + this.setPadding = function(padding) { + this.$padding = padding; + this.element.style.margin = "0 " + padding + "px"; + }; + + this.getLineHeight = function() { + return this.$fontMetrics.$characterSize.height || 0; + }; + + this.getCharacterWidth = function() { + return this.$fontMetrics.$characterSize.width || 0; + }; + + this.$setFontMetrics = function(measure) { + this.$fontMetrics = measure; + this.$fontMetrics.on("changeCharacterSize", function(e) { + this._signal("changeCharacterSize", e); + }.bind(this)); + this.$pollSizeChanges(); + }; + + this.checkForSizeChanges = function() { + this.$fontMetrics.checkForSizeChanges(); + }; + this.$pollSizeChanges = function() { + return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges(); + }; + this.setSession = function(session) { + this.session = session; + if (session) + this.$computeTabString(); + }; + + this.showInvisibles = false; + this.showSpaces = false; + this.showTabs = false; + this.showEOL = false; + this.setShowInvisibles = function(showInvisibles) { + if (this.showInvisibles == showInvisibles) + return false; + + this.showInvisibles = showInvisibles; + if (typeof showInvisibles == "string") { + this.showSpaces = /tab/i.test(showInvisibles); + this.showTabs = /space/i.test(showInvisibles); + this.showEOL = /eol/i.test(showInvisibles); + } else { + this.showSpaces = this.showTabs = this.showEOL = showInvisibles; + } + this.$computeTabString(); + return true; + }; + + this.displayIndentGuides = true; + this.setDisplayIndentGuides = function(display) { + if (this.displayIndentGuides == display) + return false; + + this.displayIndentGuides = display; + this.$computeTabString(); + return true; + }; + + this.$tabStrings = []; + this.onChangeTabSize = + this.$computeTabString = function() { + var tabSize = this.session.getTabSize(); + this.tabSize = tabSize; + var tabStr = this.$tabStrings = [0]; + for (var i = 1; i < tabSize + 1; i++) { + if (this.showTabs) { + var span = this.dom.createElement("span"); + span.className = "ace_invisible ace_invisible_tab"; + span.textContent = lang.stringRepeat(this.TAB_CHAR, i); + tabStr.push(span); + } else { + tabStr.push(this.dom.createTextNode(lang.stringRepeat(" ", i), this.element)); + } + } + if (this.displayIndentGuides) { + this.$indentGuideRe = /\s\S| \t|\t |\s$/; + var className = "ace_indent-guide"; + var spaceClass = this.showSpaces ? " ace_invisible ace_invisible_space" : ""; + var spaceContent = this.showSpaces + ? lang.stringRepeat(this.SPACE_CHAR, this.tabSize) + : lang.stringRepeat(" ", this.tabSize); + + var tabClass = this.showTabs ? " ace_invisible ace_invisible_tab" : ""; + var tabContent = this.showTabs + ? lang.stringRepeat(this.TAB_CHAR, this.tabSize) + : spaceContent; + + var span = this.dom.createElement("span"); + span.className = className + spaceClass; + span.textContent = spaceContent; + this.$tabStrings[" "] = span; + + var span = this.dom.createElement("span"); + span.className = className + tabClass; + span.textContent = tabContent; + this.$tabStrings["\t"] = span; + } + }; + + this.updateLines = function(config, firstRow, lastRow) { + if (this.config.lastRow != config.lastRow || + this.config.firstRow != config.firstRow) { + return this.update(config); + } + + this.config = config; + + var first = Math.max(firstRow, config.firstRow); + var last = Math.min(lastRow, config.lastRow); + + var lineElements = this.element.childNodes; + var lineElementsIdx = 0; + + for (var row = config.firstRow; row < first; row++) { + var foldLine = this.session.getFoldLine(row); + if (foldLine) { + if (foldLine.containsRow(first)) { + first = foldLine.start.row; + break; + } else { + row = foldLine.end.row; + } + } + lineElementsIdx ++; + } + + var heightChanged = false; + var row = first; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (true) { + if (row > foldStart) { + row = foldLine.end.row+1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row :Infinity; + } + if (row > last) + break; + + var lineElement = lineElements[lineElementsIdx++]; + if (lineElement) { + this.dom.removeChildren(lineElement); + this.$renderLine( + lineElement, row, row == foldStart ? foldLine : false + ); + + if (heightChanged) + lineElement.style.top = this.$lines.computeLineTop(row, config, this.session) + "px"; + + var height = (config.lineHeight * this.session.getRowLength(row)) + "px"; + if (lineElement.style.height != height) { + heightChanged = true; + lineElement.style.height = height; + } + } + row++; + } + if (heightChanged) { + while (lineElementsIdx < this.$lines.cells.length) { + var cell = this.$lines.cells[lineElementsIdx++]; + cell.element.style.top = this.$lines.computeLineTop(cell.row, config, this.session) + "px"; + } + } + }; + + this.scrollLines = function(config) { + var oldConfig = this.config; + this.config = config; + + if (this.$lines.pageChanged(oldConfig, config)) + return this.update(config); + + this.$lines.moveContainer(config); + + var lastRow = config.lastRow; + var oldLastRow = oldConfig ? oldConfig.lastRow : -1; + + if (!oldConfig || oldLastRow < config.firstRow) + return this.update(config); + + if (lastRow < oldConfig.firstRow) + return this.update(config); + + if (!oldConfig || oldConfig.lastRow < config.firstRow) + return this.update(config); + + if (config.lastRow < oldConfig.firstRow) + return this.update(config); + + if (oldConfig.firstRow < config.firstRow) + for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--) + this.$lines.shift(); + + if (oldConfig.lastRow > config.lastRow) + for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--) + this.$lines.pop(); + + if (config.firstRow < oldConfig.firstRow) { + this.$lines.unshift(this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1)); + } + + if (config.lastRow > oldConfig.lastRow) { + this.$lines.push(this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow)); + } + }; + + this.$renderLinesFragment = function(config, firstRow, lastRow) { + var fragment = []; + var row = firstRow; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (true) { + if (row > foldStart) { + row = foldLine.end.row+1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + if (row > lastRow) + break; + + var line = this.$lines.createCell(row, config, this.session); + + var lineEl = line.element; + this.dom.removeChildren(lineEl); + dom.setStyle(lineEl.style, "height", this.$lines.computeLineHeight(row, config, this.session) + "px"); + dom.setStyle(lineEl.style, "top", this.$lines.computeLineTop(row, config, this.session) + "px"); + this.$renderLine(lineEl, row, row == foldStart ? foldLine : false); + + if (this.$useLineGroups()) { + lineEl.className = "ace_line_group"; + } else { + lineEl.className = "ace_line"; + } + fragment.push(line); + + row++; + } + return fragment; + }; + + this.update = function(config) { + this.$lines.moveContainer(config); + + this.config = config; + + var firstRow = config.firstRow; + var lastRow = config.lastRow; + + var lines = this.$lines; + while (lines.getLength()) + lines.pop(); + + lines.push(this.$renderLinesFragment(config, firstRow, lastRow)); + }; + + this.$textToken = { + "text": true, + "rparen": true, + "lparen": true + }; + + this.$renderToken = function(parent, screenColumn, token, value) { + var self = this; + var re = /(\t)|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\uFEFF\uFFF9-\uFFFC\u2066\u2067\u2068\u202A\u202B\u202D\u202E\u202C\u2069]+)|(\u3000)|([\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3001-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF])/g; + + var valueFragment = this.dom.createFragment(this.element); + + var m; + var i = 0; + while (m = re.exec(value)) { + var tab = m[1]; + var simpleSpace = m[2]; + var controlCharacter = m[3]; + var cjkSpace = m[4]; + var cjk = m[5]; + + if (!self.showSpaces && simpleSpace) + continue; + + var before = i != m.index ? value.slice(i, m.index) : ""; + + i = m.index + m[0].length; + + if (before) { + valueFragment.appendChild(this.dom.createTextNode(before, this.element)); + } + + if (tab) { + var tabSize = self.session.getScreenTabSize(screenColumn + m.index); + valueFragment.appendChild(self.$tabStrings[tabSize].cloneNode(true)); + screenColumn += tabSize - 1; + } else if (simpleSpace) { + if (self.showSpaces) { + var span = this.dom.createElement("span"); + span.className = "ace_invisible ace_invisible_space"; + span.textContent = lang.stringRepeat(self.SPACE_CHAR, simpleSpace.length); + valueFragment.appendChild(span); + } else { + valueFragment.appendChild(this.com.createTextNode(simpleSpace, this.element)); + } + } else if (controlCharacter) { + var span = this.dom.createElement("span"); + span.className = "ace_invisible ace_invisible_space ace_invalid"; + span.textContent = lang.stringRepeat(self.SPACE_CHAR, controlCharacter.length); + valueFragment.appendChild(span); + } else if (cjkSpace) { + screenColumn += 1; + + var span = this.dom.createElement("span"); + span.style.width = (self.config.characterWidth * 2) + "px"; + span.className = self.showSpaces ? "ace_cjk ace_invisible ace_invisible_space" : "ace_cjk"; + span.textContent = self.showSpaces ? self.SPACE_CHAR : cjkSpace; + valueFragment.appendChild(span); + } else if (cjk) { + screenColumn += 1; + var span = this.dom.createElement("span"); + span.style.width = (self.config.characterWidth * 2) + "px"; + span.className = "ace_cjk"; + span.textContent = cjk; + valueFragment.appendChild(span); + } + } + + valueFragment.appendChild(this.dom.createTextNode(i ? value.slice(i) : value, this.element)); + + if (!this.$textToken[token.type]) { + var classes = "ace_" + token.type.replace(/\./g, " ace_"); + var span = this.dom.createElement("span"); + if (token.type == "fold") + span.style.width = (token.value.length * this.config.characterWidth) + "px"; + + span.className = classes; + span.appendChild(valueFragment); + + parent.appendChild(span); + } + else { + parent.appendChild(valueFragment); + } + + return screenColumn + value.length; + }; + + this.renderIndentGuide = function(parent, value, max) { + var cols = value.search(this.$indentGuideRe); + if (cols <= 0 || cols >= max) + return value; + if (value[0] == " ") { + cols -= cols % this.tabSize; + var count = cols/this.tabSize; + for (var i=0; i= splitChars) { + screenColumn = this.$renderToken( + lineEl, screenColumn, + token, value.substring(0, splitChars - chars) + ); + value = value.substring(splitChars - chars); + chars = splitChars; + + lineEl = this.$createLineElement(); + parent.appendChild(lineEl); + + lineEl.appendChild(this.dom.createTextNode(lang.stringRepeat("\xa0", splits.indent), this.element)); + + split ++; + screenColumn = 0; + splitChars = splits[split] || Number.MAX_VALUE; + } + if (value.length != 0) { + chars += value.length; + screenColumn = this.$renderToken( + lineEl, screenColumn, token, value + ); + } + } + } + + if (splits[splits.length - 1] > this.MAX_LINE_LENGTH) + this.$renderOverflowMessage(lineEl, screenColumn, null, "", true); + }; + + this.$renderSimpleLine = function(parent, tokens) { + var screenColumn = 0; + + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + var value = token.value; + if (i == 0 && this.displayIndentGuides) { + value = this.renderIndentGuide(parent, value); + if (!value) + continue; + } + if (screenColumn + value.length > this.MAX_LINE_LENGTH) + return this.$renderOverflowMessage(parent, screenColumn, token, value); + screenColumn = this.$renderToken(parent, screenColumn, token, value); + } + }; + + this.$renderOverflowMessage = function(parent, screenColumn, token, value, hide) { + token && this.$renderToken(parent, screenColumn, token, + value.slice(0, this.MAX_LINE_LENGTH - screenColumn)); + + var overflowEl = this.dom.createElement("span"); + overflowEl.className = "ace_inline_button ace_keyword ace_toggle_wrap"; + overflowEl.textContent = hide ? "" : ""; + + parent.appendChild(overflowEl); + }; + this.$renderLine = function(parent, row, foldLine) { + if (!foldLine && foldLine != false) + foldLine = this.session.getFoldLine(row); + + if (foldLine) + var tokens = this.$getFoldLineTokens(row, foldLine); + else + var tokens = this.session.getTokens(row); + + var lastLineEl = parent; + if (tokens.length) { + var splits = this.session.getRowSplitData(row); + if (splits && splits.length) { + this.$renderWrappedLine(parent, tokens, splits); + var lastLineEl = parent.lastChild; + } else { + var lastLineEl = parent; + if (this.$useLineGroups()) { + lastLineEl = this.$createLineElement(); + parent.appendChild(lastLineEl); + } + this.$renderSimpleLine(lastLineEl, tokens); + } + } else if (this.$useLineGroups()) { + lastLineEl = this.$createLineElement(); + parent.appendChild(lastLineEl); + } + + if (this.showEOL && lastLineEl) { + if (foldLine) + row = foldLine.end.row; + + var invisibleEl = this.dom.createElement("span"); + invisibleEl.className = "ace_invisible ace_invisible_eol"; + invisibleEl.textContent = row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR; + + lastLineEl.appendChild(invisibleEl); + } + }; + + this.$getFoldLineTokens = function(row, foldLine) { + var session = this.session; + var renderTokens = []; + + function addTokens(tokens, from, to) { + var idx = 0, col = 0; + while ((col + tokens[idx].value.length) < from) { + col += tokens[idx].value.length; + idx++; + + if (idx == tokens.length) + return; + } + if (col != from) { + var value = tokens[idx].value.substring(from - col); + if (value.length > (to - from)) + value = value.substring(0, to - from); + + renderTokens.push({ + type: tokens[idx].type, + value: value + }); + + col = from + value.length; + idx += 1; + } + + while (col < to && idx < tokens.length) { + var value = tokens[idx].value; + if (value.length + col > to) { + renderTokens.push({ + type: tokens[idx].type, + value: value.substring(0, to - col) + }); + } else + renderTokens.push(tokens[idx]); + col += value.length; + idx += 1; + } + } + + var tokens = session.getTokens(row); + foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) { + if (placeholder != null) { + renderTokens.push({ + type: "fold", + value: placeholder + }); + } else { + if (isNewRow) + tokens = session.getTokens(row); + + if (tokens.length) + addTokens(tokens, lastColumn, column); + } + }, foldLine.end.row, this.session.getLine(foldLine.end.row).length); + + return renderTokens; + }; + + this.$useLineGroups = function() { + return this.session.getUseWrapMode(); + }; + + this.destroy = function() {}; +}).call(Text.prototype); + +exports.Text = Text; + +}); + +define("ace/layer/cursor",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); + +var Cursor = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_cursor-layer"; + parentEl.appendChild(this.element); + + this.isVisible = false; + this.isBlinking = true; + this.blinkInterval = 1000; + this.smoothBlinking = false; + + this.cursors = []; + this.cursor = this.addCursor(); + dom.addCssClass(this.element, "ace_hidden-cursors"); + this.$updateCursors = this.$updateOpacity.bind(this); +}; + +(function() { + + this.$updateOpacity = function(val) { + var cursors = this.cursors; + for (var i = cursors.length; i--; ) + dom.setStyle(cursors[i].style, "opacity", val ? "" : "0"); + }; + + this.$startCssAnimation = function() { + var cursors = this.cursors; + for (var i = cursors.length; i--; ) + cursors[i].style.animationDuration = this.blinkInterval + "ms"; + + this.$isAnimating = true; + setTimeout(function() { + if (this.$isAnimating) { + dom.addCssClass(this.element, "ace_animate-blinking"); + } + }.bind(this)); + }; + + this.$stopCssAnimation = function() { + this.$isAnimating = false; + dom.removeCssClass(this.element, "ace_animate-blinking"); + }; + + this.$padding = 0; + this.setPadding = function(padding) { + this.$padding = padding; + }; + + this.setSession = function(session) { + this.session = session; + }; + + this.setBlinking = function(blinking) { + if (blinking != this.isBlinking) { + this.isBlinking = blinking; + this.restartTimer(); + } + }; + + this.setBlinkInterval = function(blinkInterval) { + if (blinkInterval != this.blinkInterval) { + this.blinkInterval = blinkInterval; + this.restartTimer(); + } + }; + + this.setSmoothBlinking = function(smoothBlinking) { + if (smoothBlinking != this.smoothBlinking) { + this.smoothBlinking = smoothBlinking; + dom.setCssClass(this.element, "ace_smooth-blinking", smoothBlinking); + this.$updateCursors(true); + this.restartTimer(); + } + }; + + this.addCursor = function() { + var el = dom.createElement("div"); + el.className = "ace_cursor"; + this.element.appendChild(el); + this.cursors.push(el); + return el; + }; + + this.removeCursor = function() { + if (this.cursors.length > 1) { + var el = this.cursors.pop(); + el.parentNode.removeChild(el); + return el; + } + }; + + this.hideCursor = function() { + this.isVisible = false; + dom.addCssClass(this.element, "ace_hidden-cursors"); + this.restartTimer(); + }; + + this.showCursor = function() { + this.isVisible = true; + dom.removeCssClass(this.element, "ace_hidden-cursors"); + this.restartTimer(); + }; + + this.restartTimer = function() { + var update = this.$updateCursors; + clearInterval(this.intervalId); + clearTimeout(this.timeoutId); + this.$stopCssAnimation(); + + if (this.smoothBlinking) { + this.$isSmoothBlinking = false; + dom.removeCssClass(this.element, "ace_smooth-blinking"); + } + + update(true); + + if (!this.isBlinking || !this.blinkInterval || !this.isVisible) { + this.$stopCssAnimation(); + return; + } + + if (this.smoothBlinking) { + this.$isSmoothBlinking = true; + setTimeout(function() { + if (this.$isSmoothBlinking) { + dom.addCssClass(this.element, "ace_smooth-blinking"); + } + }.bind(this)); + } + + if (dom.HAS_CSS_ANIMATION) { + this.$startCssAnimation(); + } else { + var blink = function(){ + this.timeoutId = setTimeout(function() { + update(false); + }, 0.6 * this.blinkInterval); + }.bind(this); + + this.intervalId = setInterval(function() { + update(true); + blink(); + }, this.blinkInterval); + blink(); + } + }; + + this.getPixelPosition = function(position, onScreen) { + if (!this.config || !this.session) + return {left : 0, top : 0}; + + if (!position) + position = this.session.selection.getCursor(); + var pos = this.session.documentToScreenPosition(position); + var cursorLeft = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, position.row) + ? this.session.$bidiHandler.getPosLeft(pos.column) + : pos.column * this.config.characterWidth); + + var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) * + this.config.lineHeight; + + return {left : cursorLeft, top : cursorTop}; + }; + + this.isCursorInView = function(pixelPos, config) { + return pixelPos.top >= 0 && pixelPos.top < config.maxHeight; + }; + + this.update = function(config) { + this.config = config; + + var selections = this.session.$selectionMarkers; + var i = 0, cursorIndex = 0; + + if (selections === undefined || selections.length === 0){ + selections = [{cursor: null}]; + } + + for (var i = 0, n = selections.length; i < n; i++) { + var pixelPos = this.getPixelPosition(selections[i].cursor, true); + if ((pixelPos.top > config.height + config.offset || + pixelPos.top < 0) && i > 1) { + continue; + } + + var element = this.cursors[cursorIndex++] || this.addCursor(); + var style = element.style; + + if (!this.drawCursor) { + if (!this.isCursorInView(pixelPos, config)) { + dom.setStyle(style, "display", "none"); + } else { + dom.setStyle(style, "display", "block"); + dom.translate(element, pixelPos.left, pixelPos.top); + dom.setStyle(style, "width", Math.round(config.characterWidth) + "px"); + dom.setStyle(style, "height", config.lineHeight + "px"); + } + } else { + this.drawCursor(element, pixelPos, config, selections[i], this.session); + } + } + while (this.cursors.length > cursorIndex) + this.removeCursor(); + + var overwrite = this.session.getOverwrite(); + this.$setOverwrite(overwrite); + this.$pixelPos = pixelPos; + this.restartTimer(); + }; + + this.drawCursor = null; + + this.$setOverwrite = function(overwrite) { + if (overwrite != this.overwrite) { + this.overwrite = overwrite; + if (overwrite) + dom.addCssClass(this.element, "ace_overwrite-cursors"); + else + dom.removeCssClass(this.element, "ace_overwrite-cursors"); + } + }; + + this.destroy = function() { + clearInterval(this.intervalId); + clearTimeout(this.timeoutId); + }; + +}).call(Cursor.prototype); + +exports.Cursor = Cursor; + +}); + +define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var event = require("./lib/event"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var MAX_SCROLL_H = 0x8000; +var ScrollBar = function(parent) { + this.element = dom.createElement("div"); + this.element.className = "ace_scrollbar ace_scrollbar" + this.classSuffix; + + this.inner = dom.createElement("div"); + this.inner.className = "ace_scrollbar-inner"; + this.inner.textContent = "\xa0"; + this.element.appendChild(this.inner); + + parent.appendChild(this.element); + + this.setVisible(false); + this.skipEvent = false; + + event.addListener(this.element, "scroll", this.onScroll.bind(this)); + event.addListener(this.element, "mousedown", event.preventDefault); +}; + +(function() { + oop.implement(this, EventEmitter); + + this.setVisible = function(isVisible) { + this.element.style.display = isVisible ? "" : "none"; + this.isVisible = isVisible; + this.coeff = 1; + }; +}).call(ScrollBar.prototype); +var VScrollBar = function(parent, renderer) { + ScrollBar.call(this, parent); + this.scrollTop = 0; + this.scrollHeight = 0; + renderer.$scrollbarWidth = + this.width = dom.scrollbarWidth(parent.ownerDocument); + this.inner.style.width = + this.element.style.width = (this.width || 15) + 5 + "px"; + this.$minWidth = 0; +}; + +oop.inherits(VScrollBar, ScrollBar); + +(function() { + + this.classSuffix = '-v'; + this.onScroll = function() { + if (!this.skipEvent) { + this.scrollTop = this.element.scrollTop; + if (this.coeff != 1) { + var h = this.element.clientHeight / this.scrollHeight; + this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h); + } + this._emit("scroll", {data: this.scrollTop}); + } + this.skipEvent = false; + }; + this.getWidth = function() { + return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0); + }; + this.setHeight = function(height) { + this.element.style.height = height + "px"; + }; + this.setInnerHeight = + this.setScrollHeight = function(height) { + this.scrollHeight = height; + if (height > MAX_SCROLL_H) { + this.coeff = MAX_SCROLL_H / height; + height = MAX_SCROLL_H; + } else if (this.coeff != 1) { + this.coeff = 1; + } + this.inner.style.height = height + "px"; + }; + this.setScrollTop = function(scrollTop) { + if (this.scrollTop != scrollTop) { + this.skipEvent = true; + this.scrollTop = scrollTop; + this.element.scrollTop = scrollTop * this.coeff; + } + }; + +}).call(VScrollBar.prototype); +var HScrollBar = function(parent, renderer) { + ScrollBar.call(this, parent); + this.scrollLeft = 0; + this.height = renderer.$scrollbarWidth; + this.inner.style.height = + this.element.style.height = (this.height || 15) + 5 + "px"; +}; + +oop.inherits(HScrollBar, ScrollBar); + +(function() { + + this.classSuffix = '-h'; + this.onScroll = function() { + if (!this.skipEvent) { + this.scrollLeft = this.element.scrollLeft; + this._emit("scroll", {data: this.scrollLeft}); + } + this.skipEvent = false; + }; + this.getHeight = function() { + return this.isVisible ? this.height : 0; + }; + this.setWidth = function(width) { + this.element.style.width = width + "px"; + }; + this.setInnerWidth = function(width) { + this.inner.style.width = width + "px"; + }; + this.setScrollWidth = function(width) { + this.inner.style.width = width + "px"; + }; + this.setScrollLeft = function(scrollLeft) { + if (this.scrollLeft != scrollLeft) { + this.skipEvent = true; + this.scrollLeft = this.element.scrollLeft = scrollLeft; + } + }; + +}).call(HScrollBar.prototype); + + +exports.ScrollBar = VScrollBar; // backward compatibility +exports.ScrollBarV = VScrollBar; // backward compatibility +exports.ScrollBarH = HScrollBar; // backward compatibility + +exports.VScrollBar = VScrollBar; +exports.HScrollBar = HScrollBar; +}); + +define("ace/renderloop",["require","exports","module","ace/lib/event"], function(require, exports, module) { +"use strict"; + +var event = require("./lib/event"); + + +var RenderLoop = function(onRender, win) { + this.onRender = onRender; + this.pending = false; + this.changes = 0; + this.$recursionLimit = 2; + this.window = win || window; + var _self = this; + this._flush = function(ts) { + _self.pending = false; + var changes = _self.changes; + + if (changes) { + event.blockIdle(100); + _self.changes = 0; + _self.onRender(changes); + } + + if (_self.changes) { + if (_self.$recursionLimit-- < 0) return; + _self.schedule(); + } else { + _self.$recursionLimit = 2; + } + }; +}; + +(function() { + + this.schedule = function(change) { + this.changes = this.changes | change; + if (this.changes && !this.pending) { + event.nextFrame(this._flush); + this.pending = true; + } + }; + + this.clear = function(change) { + var changes = this.changes; + this.changes = 0; + return changes; + }; + +}).call(RenderLoop.prototype); + +exports.RenderLoop = RenderLoop; +}); + +define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/lib/useragent","ace/lib/event_emitter"], function(require, exports, module) { + +var oop = require("../lib/oop"); +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var CHAR_COUNT = 256; +var USE_OBSERVER = typeof ResizeObserver == "function"; +var L = 200; + +var FontMetrics = exports.FontMetrics = function(parentEl) { + this.el = dom.createElement("div"); + this.$setMeasureNodeStyles(this.el.style, true); + + this.$main = dom.createElement("div"); + this.$setMeasureNodeStyles(this.$main.style); + + this.$measureNode = dom.createElement("div"); + this.$setMeasureNodeStyles(this.$measureNode.style); + + + this.el.appendChild(this.$main); + this.el.appendChild(this.$measureNode); + parentEl.appendChild(this.el); + + this.$measureNode.textContent = lang.stringRepeat("X", CHAR_COUNT); + + this.$characterSize = {width: 0, height: 0}; + + + if (USE_OBSERVER) + this.$addObserver(); + else + this.checkForSizeChanges(); +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.$characterSize = {width: 0, height: 0}; + + this.$setMeasureNodeStyles = function(style, isRoot) { + style.width = style.height = "auto"; + style.left = style.top = "0px"; + style.visibility = "hidden"; + style.position = "absolute"; + style.whiteSpace = "pre"; + + if (useragent.isIE < 8) { + style["font-family"] = "inherit"; + } else { + style.font = "inherit"; + } + style.overflow = isRoot ? "hidden" : "visible"; + }; + + this.checkForSizeChanges = function(size) { + if (size === undefined) + size = this.$measureSizes(); + if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) { + this.$measureNode.style.fontWeight = "bold"; + var boldSize = this.$measureSizes(); + this.$measureNode.style.fontWeight = ""; + this.$characterSize = size; + this.charSizes = Object.create(null); + this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height; + this._emit("changeCharacterSize", {data: size}); + } + }; + + this.$addObserver = function() { + var self = this; + this.$observer = new window.ResizeObserver(function(e) { + self.checkForSizeChanges(); + }); + this.$observer.observe(this.$measureNode); + }; + + this.$pollSizeChanges = function() { + if (this.$pollSizeChangesTimer || this.$observer) + return this.$pollSizeChangesTimer; + var self = this; + + return this.$pollSizeChangesTimer = event.onIdle(function cb() { + self.checkForSizeChanges(); + event.onIdle(cb, 500); + }, 500); + }; + + this.setPolling = function(val) { + if (val) { + this.$pollSizeChanges(); + } else if (this.$pollSizeChangesTimer) { + clearInterval(this.$pollSizeChangesTimer); + this.$pollSizeChangesTimer = 0; + } + }; + + this.$measureSizes = function(node) { + var size = { + height: (node || this.$measureNode).clientHeight, + width: (node || this.$measureNode).clientWidth / CHAR_COUNT + }; + if (size.width === 0 || size.height === 0) + return null; + return size; + }; + + this.$measureCharWidth = function(ch) { + this.$main.textContent = lang.stringRepeat(ch, CHAR_COUNT); + var rect = this.$main.getBoundingClientRect(); + return rect.width / CHAR_COUNT; + }; + + this.getCharacterWidth = function(ch) { + var w = this.charSizes[ch]; + if (w === undefined) { + w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width; + } + return w; + }; + + this.destroy = function() { + clearInterval(this.$pollSizeChangesTimer); + if (this.$observer) + this.$observer.disconnect(); + if (this.el && this.el.parentNode) + this.el.parentNode.removeChild(this.el); + }; + + + this.$getZoom = function getZoom(element) { + if (!element || !element.parentElement) return 1; + return (window.getComputedStyle(element).zoom || 1) * getZoom(element.parentElement); + }; + this.$initTransformMeasureNodes = function() { + var t = function(t, l) { + return ["div", { + style: "position: absolute;top:" + t + "px;left:" + l + "px;" + }]; + }; + this.els = dom.buildDom([t(0, 0), t(L, 0), t(0, L), t(L, L)], this.el); + }; + this.transformCoordinates = function(clientPos, elPos) { + if (clientPos) { + var zoom = this.$getZoom(this.el); + clientPos = mul(1 / zoom, clientPos); + } + function solve(l1, l2, r) { + var det = l1[1] * l2[0] - l1[0] * l2[1]; + return [ + (-l2[1] * r[0] + l2[0] * r[1]) / det, + (+l1[1] * r[0] - l1[0] * r[1]) / det + ]; + } + function sub(a, b) { return [a[0] - b[0], a[1] - b[1]]; } + function add(a, b) { return [a[0] + b[0], a[1] + b[1]]; } + function mul(a, b) { return [a * b[0], a * b[1]]; } + + if (!this.els) + this.$initTransformMeasureNodes(); + + function p(el) { + var r = el.getBoundingClientRect(); + return [r.left, r.top]; + } + + var a = p(this.els[0]); + var b = p(this.els[1]); + var c = p(this.els[2]); + var d = p(this.els[3]); + + var h = solve(sub(d, b), sub(d, c), sub(add(b, c), add(d, a))); + + var m1 = mul(1 + h[0], sub(b, a)); + var m2 = mul(1 + h[1], sub(c, a)); + + if (elPos) { + var x = elPos; + var k = h[0] * x[0] / L + h[1] * x[1] / L + 1; + var ut = add(mul(x[0], m1), mul(x[1], m2)); + return add(mul(1 / k / L, ut), a); + } + var u = sub(clientPos, a); + var f = solve(sub(m1, mul(h[0], u)), sub(m2, mul(h[1], u)), u); + return mul(L, f); + }; + +}).call(FontMetrics.prototype); + +}); + +define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var config = require("./config"); +var GutterLayer = require("./layer/gutter").Gutter; +var MarkerLayer = require("./layer/marker").Marker; +var TextLayer = require("./layer/text").Text; +var CursorLayer = require("./layer/cursor").Cursor; +var HScrollBar = require("./scrollbar").HScrollBar; +var VScrollBar = require("./scrollbar").VScrollBar; +var RenderLoop = require("./renderloop").RenderLoop; +var FontMetrics = require("./layer/font_metrics").FontMetrics; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var editorCss = "\ +.ace_br1 {border-top-left-radius : 3px;}\ +.ace_br2 {border-top-right-radius : 3px;}\ +.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\ +.ace_br4 {border-bottom-right-radius: 3px;}\ +.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\ +.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\ +.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\ +.ace_br8 {border-bottom-left-radius : 3px;}\ +.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\ +.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\ +.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_editor {\ +position: relative;\ +overflow: hidden;\ +padding: 0;\ +font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\ +direction: ltr;\ +text-align: left;\ +-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\ +}\ +.ace_scroller {\ +position: absolute;\ +overflow: hidden;\ +top: 0;\ +bottom: 0;\ +background-color: inherit;\ +-ms-user-select: none;\ +-moz-user-select: none;\ +-webkit-user-select: none;\ +user-select: none;\ +cursor: text;\ +}\ +.ace_content {\ +position: absolute;\ +box-sizing: border-box;\ +min-width: 100%;\ +contain: style size layout;\ +font-variant-ligatures: no-common-ligatures;\ +}\ +.ace_dragging .ace_scroller:before{\ +position: absolute;\ +top: 0;\ +left: 0;\ +right: 0;\ +bottom: 0;\ +content: '';\ +background: rgba(250, 250, 250, 0.01);\ +z-index: 1000;\ +}\ +.ace_dragging.ace_dark .ace_scroller:before{\ +background: rgba(0, 0, 0, 0.01);\ +}\ +.ace_gutter {\ +position: absolute;\ +overflow : hidden;\ +width: auto;\ +top: 0;\ +bottom: 0;\ +left: 0;\ +cursor: default;\ +z-index: 4;\ +-ms-user-select: none;\ +-moz-user-select: none;\ +-webkit-user-select: none;\ +user-select: none;\ +contain: style size layout;\ +}\ +.ace_gutter-active-line {\ +position: absolute;\ +left: 0;\ +right: 0;\ +}\ +.ace_scroller.ace_scroll-left {\ +box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\ +}\ +.ace_gutter-cell {\ +position: absolute;\ +top: 0;\ +left: 0;\ +right: 0;\ +padding-left: 19px;\ +padding-right: 6px;\ +background-repeat: no-repeat;\ +}\ +.ace_gutter-cell.ace_error {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\");\ +background-repeat: no-repeat;\ +background-position: 2px center;\ +}\ +.ace_gutter-cell.ace_warning {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\");\ +background-position: 2px center;\ +}\ +.ace_gutter-cell.ace_info {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\");\ +background-position: 2px center;\ +}\ +.ace_dark .ace_gutter-cell.ace_info {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\");\ +}\ +.ace_scrollbar {\ +contain: strict;\ +position: absolute;\ +right: 0;\ +bottom: 0;\ +z-index: 6;\ +}\ +.ace_scrollbar-inner {\ +position: absolute;\ +cursor: text;\ +left: 0;\ +top: 0;\ +}\ +.ace_scrollbar-v{\ +overflow-x: hidden;\ +overflow-y: scroll;\ +top: 0;\ +}\ +.ace_scrollbar-h {\ +overflow-x: scroll;\ +overflow-y: hidden;\ +left: 0;\ +}\ +.ace_print-margin {\ +position: absolute;\ +height: 100%;\ +}\ +.ace_text-input {\ +position: absolute;\ +z-index: 0;\ +width: 0.5em;\ +height: 1em;\ +opacity: 0;\ +background: transparent;\ +-moz-appearance: none;\ +appearance: none;\ +border: none;\ +resize: none;\ +outline: none;\ +overflow: hidden;\ +font: inherit;\ +padding: 0 1px;\ +margin: 0 -1px;\ +contain: strict;\ +-ms-user-select: text;\ +-moz-user-select: text;\ +-webkit-user-select: text;\ +user-select: text;\ +white-space: pre!important;\ +}\ +.ace_text-input.ace_composition {\ +background: transparent;\ +color: inherit;\ +z-index: 1000;\ +opacity: 1;\ +}\ +.ace_composition_placeholder { color: transparent }\ +.ace_composition_marker { \ +border-bottom: 1px solid;\ +position: absolute;\ +border-radius: 0;\ +margin-top: 1px;\ +}\ +[ace_nocontext=true] {\ +transform: none!important;\ +filter: none!important;\ +clip-path: none!important;\ +mask : none!important;\ +contain: none!important;\ +perspective: none!important;\ +mix-blend-mode: initial!important;\ +z-index: auto;\ +}\ +.ace_layer {\ +z-index: 1;\ +position: absolute;\ +overflow: hidden;\ +word-wrap: normal;\ +white-space: pre;\ +height: 100%;\ +width: 100%;\ +box-sizing: border-box;\ +pointer-events: none;\ +}\ +.ace_gutter-layer {\ +position: relative;\ +width: auto;\ +text-align: right;\ +pointer-events: auto;\ +height: 1000000px;\ +contain: style size layout;\ +}\ +.ace_text-layer {\ +font: inherit !important;\ +position: absolute;\ +height: 1000000px;\ +width: 1000000px;\ +contain: style size layout;\ +}\ +.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {\ +contain: style size layout;\ +position: absolute;\ +top: 0;\ +left: 0;\ +right: 0;\ +}\ +.ace_hidpi .ace_text-layer,\ +.ace_hidpi .ace_gutter-layer,\ +.ace_hidpi .ace_content,\ +.ace_hidpi .ace_gutter {\ +contain: strict;\ +will-change: transform;\ +}\ +.ace_hidpi .ace_text-layer > .ace_line, \ +.ace_hidpi .ace_text-layer > .ace_line_group {\ +contain: strict;\ +}\ +.ace_cjk {\ +display: inline-block;\ +text-align: center;\ +}\ +.ace_cursor-layer {\ +z-index: 4;\ +}\ +.ace_cursor {\ +z-index: 4;\ +position: absolute;\ +box-sizing: border-box;\ +border-left: 2px solid;\ +transform: translatez(0);\ +}\ +.ace_multiselect .ace_cursor {\ +border-left-width: 1px;\ +}\ +.ace_slim-cursors .ace_cursor {\ +border-left-width: 1px;\ +}\ +.ace_overwrite-cursors .ace_cursor {\ +border-left-width: 0;\ +border-bottom: 1px solid;\ +}\ +.ace_hidden-cursors .ace_cursor {\ +opacity: 0.2;\ +}\ +.ace_hasPlaceholder .ace_hidden-cursors .ace_cursor {\ +opacity: 0;\ +}\ +.ace_smooth-blinking .ace_cursor {\ +transition: opacity 0.18s;\ +}\ +.ace_animate-blinking .ace_cursor {\ +animation-duration: 1000ms;\ +animation-timing-function: step-end;\ +animation-name: blink-ace-animate;\ +animation-iteration-count: infinite;\ +}\ +.ace_animate-blinking.ace_smooth-blinking .ace_cursor {\ +animation-duration: 1000ms;\ +animation-timing-function: ease-in-out;\ +animation-name: blink-ace-animate-smooth;\ +}\ +@keyframes blink-ace-animate {\ +from, to { opacity: 1; }\ +60% { opacity: 0; }\ +}\ +@keyframes blink-ace-animate-smooth {\ +from, to { opacity: 1; }\ +45% { opacity: 1; }\ +60% { opacity: 0; }\ +85% { opacity: 0; }\ +}\ +.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\ +position: absolute;\ +z-index: 3;\ +}\ +.ace_marker-layer .ace_selection {\ +position: absolute;\ +z-index: 5;\ +}\ +.ace_marker-layer .ace_bracket {\ +position: absolute;\ +z-index: 6;\ +}\ +.ace_marker-layer .ace_error_bracket {\ +position: absolute;\ +border-bottom: 1px solid #DE5555;\ +border-radius: 0;\ +}\ +.ace_marker-layer .ace_active-line {\ +position: absolute;\ +z-index: 2;\ +}\ +.ace_marker-layer .ace_selected-word {\ +position: absolute;\ +z-index: 4;\ +box-sizing: border-box;\ +}\ +.ace_line .ace_fold {\ +box-sizing: border-box;\ +display: inline-block;\ +height: 11px;\ +margin-top: -2px;\ +vertical-align: middle;\ +background-image:\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");\ +background-repeat: no-repeat, repeat-x;\ +background-position: center center, top left;\ +color: transparent;\ +border: 1px solid black;\ +border-radius: 2px;\ +cursor: pointer;\ +pointer-events: auto;\ +}\ +.ace_dark .ace_fold {\ +}\ +.ace_fold:hover{\ +background-image:\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");\ +}\ +.ace_tooltip {\ +background-color: #FFF;\ +background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\ +border: 1px solid gray;\ +border-radius: 1px;\ +box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\ +color: black;\ +max-width: 100%;\ +padding: 3px 4px;\ +position: fixed;\ +z-index: 999999;\ +box-sizing: border-box;\ +cursor: default;\ +white-space: pre;\ +word-wrap: break-word;\ +line-height: normal;\ +font-style: normal;\ +font-weight: normal;\ +letter-spacing: normal;\ +pointer-events: none;\ +}\ +.ace_folding-enabled > .ace_gutter-cell {\ +padding-right: 13px;\ +}\ +.ace_fold-widget {\ +box-sizing: border-box;\ +margin: 0 -12px 0 1px;\ +display: none;\ +width: 11px;\ +vertical-align: top;\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");\ +background-repeat: no-repeat;\ +background-position: center;\ +border-radius: 3px;\ +border: 1px solid transparent;\ +cursor: pointer;\ +}\ +.ace_folding-enabled .ace_fold-widget {\ +display: inline-block; \ +}\ +.ace_fold-widget.ace_end {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");\ +}\ +.ace_fold-widget.ace_closed {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");\ +}\ +.ace_fold-widget:hover {\ +border: 1px solid rgba(0, 0, 0, 0.3);\ +background-color: rgba(255, 255, 255, 0.2);\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ +}\ +.ace_fold-widget:active {\ +border: 1px solid rgba(0, 0, 0, 0.4);\ +background-color: rgba(0, 0, 0, 0.05);\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ +}\ +.ace_dark .ace_fold-widget {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\ +}\ +.ace_dark .ace_fold-widget.ace_end {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\ +}\ +.ace_dark .ace_fold-widget.ace_closed {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\ +}\ +.ace_dark .ace_fold-widget:hover {\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ +background-color: rgba(255, 255, 255, 0.1);\ +}\ +.ace_dark .ace_fold-widget:active {\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ +}\ +.ace_inline_button {\ +border: 1px solid lightgray;\ +display: inline-block;\ +margin: -1px 8px;\ +padding: 0 5px;\ +pointer-events: auto;\ +cursor: pointer;\ +}\ +.ace_inline_button:hover {\ +border-color: gray;\ +background: rgba(200,200,200,0.2);\ +display: inline-block;\ +pointer-events: auto;\ +}\ +.ace_fold-widget.ace_invalid {\ +background-color: #FFB4B4;\ +border-color: #DE5555;\ +}\ +.ace_fade-fold-widgets .ace_fold-widget {\ +transition: opacity 0.4s ease 0.05s;\ +opacity: 0;\ +}\ +.ace_fade-fold-widgets:hover .ace_fold-widget {\ +transition: opacity 0.05s ease 0.05s;\ +opacity:1;\ +}\ +.ace_underline {\ +text-decoration: underline;\ +}\ +.ace_bold {\ +font-weight: bold;\ +}\ +.ace_nobold .ace_bold {\ +font-weight: normal;\ +}\ +.ace_italic {\ +font-style: italic;\ +}\ +.ace_error-marker {\ +background-color: rgba(255, 0, 0,0.2);\ +position: absolute;\ +z-index: 9;\ +}\ +.ace_highlight-marker {\ +background-color: rgba(255, 255, 0,0.2);\ +position: absolute;\ +z-index: 8;\ +}\ +.ace_mobile-menu {\ +position: absolute;\ +line-height: 1.5;\ +border-radius: 4px;\ +-ms-user-select: none;\ +-moz-user-select: none;\ +-webkit-user-select: none;\ +user-select: none;\ +background: white;\ +box-shadow: 1px 3px 2px grey;\ +border: 1px solid #dcdcdc;\ +color: black;\ +}\ +.ace_dark > .ace_mobile-menu {\ +background: #333;\ +color: #ccc;\ +box-shadow: 1px 3px 2px grey;\ +border: 1px solid #444;\ +}\ +.ace_mobile-button {\ +padding: 2px;\ +cursor: pointer;\ +overflow: hidden;\ +}\ +.ace_mobile-button:hover {\ +background-color: #eee;\ +opacity:1;\ +}\ +.ace_mobile-button:active {\ +background-color: #ddd;\ +}\ +.ace_placeholder {\ +font-family: arial;\ +transform: scale(0.9);\ +transform-origin: left;\ +white-space: pre;\ +opacity: 0.7;\ +margin: 0 10px;\ +}"; + +var useragent = require("./lib/useragent"); +var HIDE_TEXTAREA = useragent.isIE; + +dom.importCssString(editorCss, "ace_editor.css", false); + +var VirtualRenderer = function(container, theme) { + var _self = this; + + this.container = container || dom.createElement("div"); + + dom.addCssClass(this.container, "ace_editor"); + if (dom.HI_DPI) dom.addCssClass(this.container, "ace_hidpi"); + + this.setTheme(theme); + if (config.get("useStrictCSP") == null) + config.set("useStrictCSP", false); + + this.$gutter = dom.createElement("div"); + this.$gutter.className = "ace_gutter"; + this.container.appendChild(this.$gutter); + this.$gutter.setAttribute("aria-hidden", true); + + this.scroller = dom.createElement("div"); + this.scroller.className = "ace_scroller"; + + this.container.appendChild(this.scroller); + + this.content = dom.createElement("div"); + this.content.className = "ace_content"; + this.scroller.appendChild(this.content); + + this.$gutterLayer = new GutterLayer(this.$gutter); + this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)); + + this.$markerBack = new MarkerLayer(this.content); + + var textLayer = this.$textLayer = new TextLayer(this.content); + this.canvas = textLayer.element; + + this.$markerFront = new MarkerLayer(this.content); + + this.$cursorLayer = new CursorLayer(this.content); + this.$horizScroll = false; + this.$vScroll = false; + + this.scrollBar = + this.scrollBarV = new VScrollBar(this.container, this); + this.scrollBarH = new HScrollBar(this.container, this); + this.scrollBarV.on("scroll", function(e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data - _self.scrollMargin.top); + }); + this.scrollBarH.on("scroll", function(e) { + if (!_self.$scrollAnimation) + _self.session.setScrollLeft(e.data - _self.scrollMargin.left); + }); + + this.scrollTop = 0; + this.scrollLeft = 0; + + this.cursorPos = { + row : 0, + column : 0 + }; + + this.$fontMetrics = new FontMetrics(this.container); + this.$textLayer.$setFontMetrics(this.$fontMetrics); + this.$textLayer.on("changeCharacterSize", function(e) { + _self.updateCharacterSize(); + _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height); + _self._signal("changeCharacterSize", e); + }); + + this.$size = { + width: 0, + height: 0, + scrollerHeight: 0, + scrollerWidth: 0, + $dirty: true + }; + + this.layerConfig = { + width : 1, + padding : 0, + firstRow : 0, + firstRowScreen: 0, + lastRow : 0, + lineHeight : 0, + characterWidth : 0, + minHeight : 1, + maxHeight : 1, + offset : 0, + height : 1, + gutterOffset: 1 + }; + + this.scrollMargin = { + left: 0, + right: 0, + top: 0, + bottom: 0, + v: 0, + h: 0 + }; + + this.margin = { + left: 0, + right: 0, + top: 0, + bottom: 0, + v: 0, + h: 0 + }; + + this.$keepTextAreaAtCursor = !useragent.isIOS; + + this.$loop = new RenderLoop( + this.$renderChanges.bind(this), + this.container.ownerDocument.defaultView + ); + this.$loop.schedule(this.CHANGE_FULL); + + this.updateCharacterSize(); + this.setPadding(4); + config.resetOptions(this); + config._signal("renderer", this); +}; + +(function() { + + this.CHANGE_CURSOR = 1; + this.CHANGE_MARKER = 2; + this.CHANGE_GUTTER = 4; + this.CHANGE_SCROLL = 8; + this.CHANGE_LINES = 16; + this.CHANGE_TEXT = 32; + this.CHANGE_SIZE = 64; + this.CHANGE_MARKER_BACK = 128; + this.CHANGE_MARKER_FRONT = 256; + this.CHANGE_FULL = 512; + this.CHANGE_H_SCROLL = 1024; + + oop.implement(this, EventEmitter); + + this.updateCharacterSize = function() { + if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) { + this.$allowBoldFonts = this.$textLayer.allowBoldFonts; + this.setStyle("ace_nobold", !this.$allowBoldFonts); + } + + this.layerConfig.characterWidth = + this.characterWidth = this.$textLayer.getCharacterWidth(); + this.layerConfig.lineHeight = + this.lineHeight = this.$textLayer.getLineHeight(); + this.$updatePrintMargin(); + dom.setStyle(this.scroller.style, "line-height", this.lineHeight + "px"); + }; + this.setSession = function(session) { + if (this.session) + this.session.doc.off("changeNewLineMode", this.onChangeNewLineMode); + + this.session = session; + if (session && this.scrollMargin.top && session.getScrollTop() <= 0) + session.setScrollTop(-this.scrollMargin.top); + + this.$cursorLayer.setSession(session); + this.$markerBack.setSession(session); + this.$markerFront.setSession(session); + this.$gutterLayer.setSession(session); + this.$textLayer.setSession(session); + if (!session) + return; + + this.$loop.schedule(this.CHANGE_FULL); + this.session.$setFontMetrics(this.$fontMetrics); + this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null; + + this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this); + this.onChangeNewLineMode(); + this.session.doc.on("changeNewLineMode", this.onChangeNewLineMode); + }; + this.updateLines = function(firstRow, lastRow, force) { + if (lastRow === undefined) + lastRow = Infinity; + + if (!this.$changedLines) { + this.$changedLines = { + firstRow: firstRow, + lastRow: lastRow + }; + } + else { + if (this.$changedLines.firstRow > firstRow) + this.$changedLines.firstRow = firstRow; + + if (this.$changedLines.lastRow < lastRow) + this.$changedLines.lastRow = lastRow; + } + if (this.$changedLines.lastRow < this.layerConfig.firstRow) { + if (force) + this.$changedLines.lastRow = this.layerConfig.lastRow; + else + return; + } + if (this.$changedLines.firstRow > this.layerConfig.lastRow) + return; + this.$loop.schedule(this.CHANGE_LINES); + }; + + this.onChangeNewLineMode = function() { + this.$loop.schedule(this.CHANGE_TEXT); + this.$textLayer.$updateEolChar(); + this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR); + }; + + this.onChangeTabSize = function() { + this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER); + this.$textLayer.onChangeTabSize(); + }; + this.updateText = function() { + this.$loop.schedule(this.CHANGE_TEXT); + }; + this.updateFull = function(force) { + if (force) + this.$renderChanges(this.CHANGE_FULL, true); + else + this.$loop.schedule(this.CHANGE_FULL); + }; + this.updateFontSize = function() { + this.$textLayer.checkForSizeChanges(); + }; + + this.$changes = 0; + this.$updateSizeAsync = function() { + if (this.$loop.pending) + this.$size.$dirty = true; + else + this.onResize(); + }; + this.onResize = function(force, gutterWidth, width, height) { + if (this.resizing > 2) + return; + else if (this.resizing > 0) + this.resizing++; + else + this.resizing = force ? 1 : 0; + var el = this.container; + if (!height) + height = el.clientHeight || el.scrollHeight; + if (!width) + width = el.clientWidth || el.scrollWidth; + var changes = this.$updateCachedSize(force, gutterWidth, width, height); + + + if (!this.$size.scrollerHeight || (!width && !height)) + return this.resizing = 0; + + if (force) + this.$gutterLayer.$padding = null; + + if (force) + this.$renderChanges(changes | this.$changes, true); + else + this.$loop.schedule(changes | this.$changes); + + if (this.resizing) + this.resizing = 0; + this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null; + }; + + this.$updateCachedSize = function(force, gutterWidth, width, height) { + height -= (this.$extraHeight || 0); + var changes = 0; + var size = this.$size; + var oldSize = { + width: size.width, + height: size.height, + scrollerHeight: size.scrollerHeight, + scrollerWidth: size.scrollerWidth + }; + if (height && (force || size.height != height)) { + size.height = height; + changes |= this.CHANGE_SIZE; + + size.scrollerHeight = size.height; + if (this.$horizScroll) + size.scrollerHeight -= this.scrollBarH.getHeight(); + this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px"; + + changes = changes | this.CHANGE_SCROLL; + } + + if (width && (force || size.width != width)) { + changes |= this.CHANGE_SIZE; + size.width = width; + + if (gutterWidth == null) + gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; + + this.gutterWidth = gutterWidth; + + dom.setStyle(this.scrollBarH.element.style, "left", gutterWidth + "px"); + dom.setStyle(this.scroller.style, "left", gutterWidth + this.margin.left + "px"); + size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth() - this.margin.h); + dom.setStyle(this.$gutter.style, "left", this.margin.left + "px"); + + var right = this.scrollBarV.getWidth() + "px"; + dom.setStyle(this.scrollBarH.element.style, "right", right); + dom.setStyle(this.scroller.style, "right", right); + dom.setStyle(this.scroller.style, "bottom", this.scrollBarH.getHeight()); + + if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) { + changes |= this.CHANGE_FULL; + } + } + + size.$dirty = !width || !height; + + if (changes) + this._signal("resize", oldSize); + + return changes; + }; + + this.onGutterResize = function(width) { + var gutterWidth = this.$showGutter ? width : 0; + if (gutterWidth != this.gutterWidth) + this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height); + + if (this.session.getUseWrapMode() && this.adjustWrapLimit()) { + this.$loop.schedule(this.CHANGE_FULL); + } else if (this.$size.$dirty) { + this.$loop.schedule(this.CHANGE_FULL); + } else { + this.$computeLayerConfig(); + } + }; + this.adjustWrapLimit = function() { + var availableWidth = this.$size.scrollerWidth - this.$padding * 2; + var limit = Math.floor(availableWidth / this.characterWidth); + return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn); + }; + this.setAnimatedScroll = function(shouldAnimate){ + this.setOption("animatedScroll", shouldAnimate); + }; + this.getAnimatedScroll = function() { + return this.$animatedScroll; + }; + this.setShowInvisibles = function(showInvisibles) { + this.setOption("showInvisibles", showInvisibles); + this.session.$bidiHandler.setShowInvisibles(showInvisibles); + }; + this.getShowInvisibles = function() { + return this.getOption("showInvisibles"); + }; + this.getDisplayIndentGuides = function() { + return this.getOption("displayIndentGuides"); + }; + + this.setDisplayIndentGuides = function(display) { + this.setOption("displayIndentGuides", display); + }; + this.setShowPrintMargin = function(showPrintMargin) { + this.setOption("showPrintMargin", showPrintMargin); + }; + this.getShowPrintMargin = function() { + return this.getOption("showPrintMargin"); + }; + this.setPrintMarginColumn = function(showPrintMargin) { + this.setOption("printMarginColumn", showPrintMargin); + }; + this.getPrintMarginColumn = function() { + return this.getOption("printMarginColumn"); + }; + this.getShowGutter = function(){ + return this.getOption("showGutter"); + }; + this.setShowGutter = function(show){ + return this.setOption("showGutter", show); + }; + + this.getFadeFoldWidgets = function(){ + return this.getOption("fadeFoldWidgets"); + }; + + this.setFadeFoldWidgets = function(show) { + this.setOption("fadeFoldWidgets", show); + }; + + this.setHighlightGutterLine = function(shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + + this.getHighlightGutterLine = function() { + return this.getOption("highlightGutterLine"); + }; + + this.$updatePrintMargin = function() { + if (!this.$showPrintMargin && !this.$printMarginEl) + return; + + if (!this.$printMarginEl) { + var containerEl = dom.createElement("div"); + containerEl.className = "ace_layer ace_print-margin-layer"; + this.$printMarginEl = dom.createElement("div"); + this.$printMarginEl.className = "ace_print-margin"; + containerEl.appendChild(this.$printMarginEl); + this.content.insertBefore(containerEl, this.content.firstChild); + } + + var style = this.$printMarginEl.style; + style.left = Math.round(this.characterWidth * this.$printMarginColumn + this.$padding) + "px"; + style.visibility = this.$showPrintMargin ? "visible" : "hidden"; + + if (this.session && this.session.$wrap == -1) + this.adjustWrapLimit(); + }; + this.getContainerElement = function() { + return this.container; + }; + this.getMouseEventTarget = function() { + return this.scroller; + }; + this.getTextAreaContainer = function() { + return this.container; + }; + this.$moveTextAreaToCursor = function() { + if (this.$isMousePressed) return; + var style = this.textarea.style; + var composition = this.$composition; + if (!this.$keepTextAreaAtCursor && !composition) { + dom.translate(this.textarea, -100, 0); + return; + } + var pixelPos = this.$cursorLayer.$pixelPos; + if (!pixelPos) + return; + if (composition && composition.markerRange) + pixelPos = this.$cursorLayer.getPixelPosition(composition.markerRange.start, true); + + var config = this.layerConfig; + var posTop = pixelPos.top; + var posLeft = pixelPos.left; + posTop -= config.offset; + + var h = composition && composition.useTextareaForIME ? this.lineHeight : HIDE_TEXTAREA ? 0 : 1; + if (posTop < 0 || posTop > config.height - h) { + dom.translate(this.textarea, 0, 0); + return; + } + + var w = 1; + var maxTop = this.$size.height - h; + if (!composition) { + posTop += this.lineHeight; + } + else { + if (composition.useTextareaForIME) { + var val = this.textarea.value; + w = this.characterWidth * (this.session.$getStringScreenWidth(val)[0]); + } + else { + posTop += this.lineHeight + 2; + } + } + + posLeft -= this.scrollLeft; + if (posLeft > this.$size.scrollerWidth - w) + posLeft = this.$size.scrollerWidth - w; + + posLeft += this.gutterWidth + this.margin.left; + + dom.setStyle(style, "height", h + "px"); + dom.setStyle(style, "width", w + "px"); + dom.translate(this.textarea, Math.min(posLeft, this.$size.scrollerWidth - w), Math.min(posTop, maxTop)); + }; + this.getFirstVisibleRow = function() { + return this.layerConfig.firstRow; + }; + this.getFirstFullyVisibleRow = function() { + return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1); + }; + this.getLastFullyVisibleRow = function() { + var config = this.layerConfig; + var lastRow = config.lastRow; + var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight; + if (top - this.session.getScrollTop() > config.height - config.lineHeight) + return lastRow - 1; + return lastRow; + }; + this.getLastVisibleRow = function() { + return this.layerConfig.lastRow; + }; + + this.$padding = null; + this.setPadding = function(padding) { + this.$padding = padding; + this.$textLayer.setPadding(padding); + this.$cursorLayer.setPadding(padding); + this.$markerFront.setPadding(padding); + this.$markerBack.setPadding(padding); + this.$loop.schedule(this.CHANGE_FULL); + this.$updatePrintMargin(); + }; + + this.setScrollMargin = function(top, bottom, left, right) { + var sm = this.scrollMargin; + sm.top = top|0; + sm.bottom = bottom|0; + sm.right = right|0; + sm.left = left|0; + sm.v = sm.top + sm.bottom; + sm.h = sm.left + sm.right; + if (sm.top && this.scrollTop <= 0 && this.session) + this.session.setScrollTop(-sm.top); + this.updateFull(); + }; + + this.setMargin = function(top, bottom, left, right) { + var sm = this.margin; + sm.top = top|0; + sm.bottom = bottom|0; + sm.right = right|0; + sm.left = left|0; + sm.v = sm.top + sm.bottom; + sm.h = sm.left + sm.right; + this.$updateCachedSize(true, this.gutterWidth, this.$size.width, this.$size.height); + this.updateFull(); + }; + this.getHScrollBarAlwaysVisible = function() { + return this.$hScrollBarAlwaysVisible; + }; + this.setHScrollBarAlwaysVisible = function(alwaysVisible) { + this.setOption("hScrollBarAlwaysVisible", alwaysVisible); + }; + this.getVScrollBarAlwaysVisible = function() { + return this.$vScrollBarAlwaysVisible; + }; + this.setVScrollBarAlwaysVisible = function(alwaysVisible) { + this.setOption("vScrollBarAlwaysVisible", alwaysVisible); + }; + + this.$updateScrollBarV = function() { + var scrollHeight = this.layerConfig.maxHeight; + var scrollerHeight = this.$size.scrollerHeight; + if (!this.$maxLines && this.$scrollPastEnd) { + scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd; + if (this.scrollTop > scrollHeight - scrollerHeight) { + scrollHeight = this.scrollTop + scrollerHeight; + this.scrollBarV.scrollTop = null; + } + } + this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v); + this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top); + }; + this.$updateScrollBarH = function() { + this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h); + this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left); + }; + + this.$frozen = false; + this.freeze = function() { + this.$frozen = true; + }; + + this.unfreeze = function() { + this.$frozen = false; + }; + + this.$renderChanges = function(changes, force) { + if (this.$changes) { + changes |= this.$changes; + this.$changes = 0; + } + if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) { + this.$changes |= changes; + return; + } + if (this.$size.$dirty) { + this.$changes |= changes; + return this.onResize(true); + } + if (!this.lineHeight) { + this.$textLayer.checkForSizeChanges(); + } + + this._signal("beforeRender", changes); + + if (this.session && this.session.$bidiHandler) + this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics); + + var config = this.layerConfig; + if (changes & this.CHANGE_FULL || + changes & this.CHANGE_SIZE || + changes & this.CHANGE_TEXT || + changes & this.CHANGE_LINES || + changes & this.CHANGE_SCROLL || + changes & this.CHANGE_H_SCROLL + ) { + changes |= this.$computeLayerConfig() | this.$loop.clear(); + if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) { + var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight; + if (st > 0) { + this.scrollTop = st; + changes = changes | this.CHANGE_SCROLL; + changes |= this.$computeLayerConfig() | this.$loop.clear(); + } + } + config = this.layerConfig; + this.$updateScrollBarV(); + if (changes & this.CHANGE_H_SCROLL) + this.$updateScrollBarH(); + + dom.translate(this.content, -this.scrollLeft, -config.offset); + + var width = config.width + 2 * this.$padding + "px"; + var height = config.minHeight + "px"; + + dom.setStyle(this.content.style, "width", width); + dom.setStyle(this.content.style, "height", height); + } + if (changes & this.CHANGE_H_SCROLL) { + dom.translate(this.content, -this.scrollLeft, -config.offset); + this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left"; + } + if (changes & this.CHANGE_FULL) { + this.$changedLines = null; + this.$textLayer.update(config); + if (this.$showGutter) + this.$gutterLayer.update(config); + this.$markerBack.update(config); + this.$markerFront.update(config); + this.$cursorLayer.update(config); + this.$moveTextAreaToCursor(); + this._signal("afterRender", changes); + return; + } + if (changes & this.CHANGE_SCROLL) { + this.$changedLines = null; + if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES) + this.$textLayer.update(config); + else + this.$textLayer.scrollLines(config); + + if (this.$showGutter) { + if (changes & this.CHANGE_GUTTER || changes & this.CHANGE_LINES) + this.$gutterLayer.update(config); + else + this.$gutterLayer.scrollLines(config); + } + this.$markerBack.update(config); + this.$markerFront.update(config); + this.$cursorLayer.update(config); + this.$moveTextAreaToCursor(); + this._signal("afterRender", changes); + return; + } + + if (changes & this.CHANGE_TEXT) { + this.$changedLines = null; + this.$textLayer.update(config); + if (this.$showGutter) + this.$gutterLayer.update(config); + } + else if (changes & this.CHANGE_LINES) { + if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter) + this.$gutterLayer.update(config); + } + else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) { + if (this.$showGutter) + this.$gutterLayer.update(config); + } + else if (changes & this.CHANGE_CURSOR) { + if (this.$highlightGutterLine) + this.$gutterLayer.updateLineHighlight(config); + } + + if (changes & this.CHANGE_CURSOR) { + this.$cursorLayer.update(config); + this.$moveTextAreaToCursor(); + } + + if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) { + this.$markerFront.update(config); + } + + if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) { + this.$markerBack.update(config); + } + + this._signal("afterRender", changes); + }; + + + this.$autosize = function() { + var height = this.session.getScreenLength() * this.lineHeight; + var maxHeight = this.$maxLines * this.lineHeight; + var desiredHeight = Math.min(maxHeight, + Math.max((this.$minLines || 1) * this.lineHeight, height) + ) + this.scrollMargin.v + (this.$extraHeight || 0); + if (this.$horizScroll) + desiredHeight += this.scrollBarH.getHeight(); + if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight) + desiredHeight = this.$maxPixelHeight; + + var hideScrollbars = desiredHeight <= 2 * this.lineHeight; + var vScroll = !hideScrollbars && height > maxHeight; + + if (desiredHeight != this.desiredHeight || + this.$size.height != this.desiredHeight || vScroll != this.$vScroll) { + if (vScroll != this.$vScroll) { + this.$vScroll = vScroll; + this.scrollBarV.setVisible(vScroll); + } + + var w = this.container.clientWidth; + this.container.style.height = desiredHeight + "px"; + this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight); + this.desiredHeight = desiredHeight; + + this._signal("autosize"); + } + }; + + this.$computeLayerConfig = function() { + var session = this.session; + var size = this.$size; + + var hideScrollbars = size.height <= 2 * this.lineHeight; + var screenLines = this.session.getScreenLength(); + var maxHeight = screenLines * this.lineHeight; + + var longestLine = this.$getLongestLine(); + + var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible || + size.scrollerWidth - longestLine - 2 * this.$padding < 0); + + var hScrollChanged = this.$horizScroll !== horizScroll; + if (hScrollChanged) { + this.$horizScroll = horizScroll; + this.scrollBarH.setVisible(horizScroll); + } + var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine + if (this.$maxLines && this.lineHeight > 1) + this.$autosize(); + + var minHeight = size.scrollerHeight + this.lineHeight; + + var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd + ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd + : 0; + maxHeight += scrollPastEnd; + + var sm = this.scrollMargin; + this.session.setScrollTop(Math.max(-sm.top, + Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom))); + + this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, + longestLine + 2 * this.$padding - size.scrollerWidth + sm.right))); + + var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible || + size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top); + var vScrollChanged = vScrollBefore !== vScroll; + if (vScrollChanged) { + this.$vScroll = vScroll; + this.scrollBarV.setVisible(vScroll); + } + + var offset = this.scrollTop % this.lineHeight; + var lineCount = Math.ceil(minHeight / this.lineHeight) - 1; + var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight)); + var lastRow = firstRow + lineCount; + var firstRowScreen, firstRowHeight; + var lineHeight = this.lineHeight; + firstRow = session.screenToDocumentRow(firstRow, 0); + var foldLine = session.getFoldLine(firstRow); + if (foldLine) { + firstRow = foldLine.start.row; + } + + firstRowScreen = session.documentToScreenRow(firstRow, 0); + firstRowHeight = session.getRowLength(firstRow) * lineHeight; + + lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1); + minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight + + firstRowHeight; + + offset = this.scrollTop - firstRowScreen * lineHeight; + + var changes = 0; + if (this.layerConfig.width != longestLine || hScrollChanged) + changes = this.CHANGE_H_SCROLL; + if (hScrollChanged || vScrollChanged) { + changes |= this.$updateCachedSize(true, this.gutterWidth, size.width, size.height); + this._signal("scrollbarVisibilityChanged"); + if (vScrollChanged) + longestLine = this.$getLongestLine(); + } + + this.layerConfig = { + width : longestLine, + padding : this.$padding, + firstRow : firstRow, + firstRowScreen: firstRowScreen, + lastRow : lastRow, + lineHeight : lineHeight, + characterWidth : this.characterWidth, + minHeight : minHeight, + maxHeight : maxHeight, + offset : offset, + gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0, + height : this.$size.scrollerHeight + }; + + if (this.session.$bidiHandler) + this.session.$bidiHandler.setContentWidth(longestLine - this.$padding); + + return changes; + }; + + this.$updateLines = function() { + if (!this.$changedLines) return; + var firstRow = this.$changedLines.firstRow; + var lastRow = this.$changedLines.lastRow; + this.$changedLines = null; + + var layerConfig = this.layerConfig; + + if (firstRow > layerConfig.lastRow + 1) { return; } + if (lastRow < layerConfig.firstRow) { return; } + if (lastRow === Infinity) { + if (this.$showGutter) + this.$gutterLayer.update(layerConfig); + this.$textLayer.update(layerConfig); + return; + } + this.$textLayer.updateLines(layerConfig, firstRow, lastRow); + return true; + }; + + this.$getLongestLine = function() { + var charCount = this.session.getScreenWidth(); + if (this.showInvisibles && !this.session.$useWrapMode) + charCount += 1; + + if (this.$textLayer && charCount > this.$textLayer.MAX_LINE_LENGTH) + charCount = this.$textLayer.MAX_LINE_LENGTH + 30; + + return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth)); + }; + this.updateFrontMarkers = function() { + this.$markerFront.setMarkers(this.session.getMarkers(true)); + this.$loop.schedule(this.CHANGE_MARKER_FRONT); + }; + this.updateBackMarkers = function() { + this.$markerBack.setMarkers(this.session.getMarkers()); + this.$loop.schedule(this.CHANGE_MARKER_BACK); + }; + this.addGutterDecoration = function(row, className){ + this.$gutterLayer.addGutterDecoration(row, className); + }; + this.removeGutterDecoration = function(row, className){ + this.$gutterLayer.removeGutterDecoration(row, className); + }; + this.updateBreakpoints = function(rows) { + this.$loop.schedule(this.CHANGE_GUTTER); + }; + this.setAnnotations = function(annotations) { + this.$gutterLayer.setAnnotations(annotations); + this.$loop.schedule(this.CHANGE_GUTTER); + }; + this.updateCursor = function() { + this.$loop.schedule(this.CHANGE_CURSOR); + }; + this.hideCursor = function() { + this.$cursorLayer.hideCursor(); + }; + this.showCursor = function() { + this.$cursorLayer.showCursor(); + }; + + this.scrollSelectionIntoView = function(anchor, lead, offset) { + this.scrollCursorIntoView(anchor, offset); + this.scrollCursorIntoView(lead, offset); + }; + this.scrollCursorIntoView = function(cursor, offset, $viewMargin) { + if (this.$size.scrollerHeight === 0) + return; + + var pos = this.$cursorLayer.getPixelPosition(cursor); + + var left = pos.left; + var top = pos.top; + + var topMargin = $viewMargin && $viewMargin.top || 0; + var bottomMargin = $viewMargin && $viewMargin.bottom || 0; + + var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop; + + if (scrollTop + topMargin > top) { + if (offset && scrollTop + topMargin > top + this.lineHeight) + top -= offset * this.$size.scrollerHeight; + if (top === 0) + top = -this.scrollMargin.top; + this.session.setScrollTop(top); + } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) { + if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight) + top += offset * this.$size.scrollerHeight; + this.session.setScrollTop(top + this.lineHeight + bottomMargin - this.$size.scrollerHeight); + } + + var scrollLeft = this.scrollLeft; + + if (scrollLeft > left) { + if (left < this.$padding + 2 * this.layerConfig.characterWidth) + left = -this.scrollMargin.left; + this.session.setScrollLeft(left); + } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) { + this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth)); + } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) { + this.session.setScrollLeft(0); + } + }; + this.getScrollTop = function() { + return this.session.getScrollTop(); + }; + this.getScrollLeft = function() { + return this.session.getScrollLeft(); + }; + this.getScrollTopRow = function() { + return this.scrollTop / this.lineHeight; + }; + this.getScrollBottomRow = function() { + return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1); + }; + this.scrollToRow = function(row) { + this.session.setScrollTop(row * this.lineHeight); + }; + + this.alignCursor = function(cursor, alignment) { + if (typeof cursor == "number") + cursor = {row: cursor, column: 0}; + + var pos = this.$cursorLayer.getPixelPosition(cursor); + var h = this.$size.scrollerHeight - this.lineHeight; + var offset = pos.top - h * (alignment || 0); + + this.session.setScrollTop(offset); + return offset; + }; + + this.STEPS = 8; + this.$calcSteps = function(fromValue, toValue){ + var i = 0; + var l = this.STEPS; + var steps = []; + + var func = function(t, x_min, dx) { + return dx * (Math.pow(t - 1, 3) + 1) + x_min; + }; + + for (i = 0; i < l; ++i) + steps.push(func(i / this.STEPS, fromValue, toValue - fromValue)); + + return steps; + }; + this.scrollToLine = function(line, center, animate, callback) { + var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0}); + var offset = pos.top; + if (center) + offset -= this.$size.scrollerHeight / 2; + + var initialScroll = this.scrollTop; + this.session.setScrollTop(offset); + if (animate !== false) + this.animateScrolling(initialScroll, callback); + }; + + this.animateScrolling = function(fromValue, callback) { + var toValue = this.scrollTop; + if (!this.$animatedScroll) + return; + var _self = this; + + if (fromValue == toValue) + return; + + if (this.$scrollAnimation) { + var oldSteps = this.$scrollAnimation.steps; + if (oldSteps.length) { + fromValue = oldSteps[0]; + if (fromValue == toValue) + return; + } + } + + var steps = _self.$calcSteps(fromValue, toValue); + this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps}; + + clearInterval(this.$timer); + + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + this.$timer = setInterval(function() { + if (!_self.session) + return clearInterval(_self.$timer); + if (steps.length) { + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + } else if (toValue != null) { + _self.session.$scrollTop = -1; + _self.session.setScrollTop(toValue); + toValue = null; + } else { + _self.$timer = clearInterval(_self.$timer); + _self.$scrollAnimation = null; + callback && callback(); + } + }, 10); + }; + this.scrollToY = function(scrollTop) { + if (this.scrollTop !== scrollTop) { + this.$loop.schedule(this.CHANGE_SCROLL); + this.scrollTop = scrollTop; + } + }; + this.scrollToX = function(scrollLeft) { + if (this.scrollLeft !== scrollLeft) + this.scrollLeft = scrollLeft; + this.$loop.schedule(this.CHANGE_H_SCROLL); + }; + this.scrollTo = function(x, y) { + this.session.setScrollTop(y); + this.session.setScrollLeft(x); + }; + this.scrollBy = function(deltaX, deltaY) { + deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY); + deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX); + }; + this.isScrollableBy = function(deltaX, deltaY) { + if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top) + return true; + if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight + - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom) + return true; + if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left) + return true; + if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth + - this.layerConfig.width < -1 + this.scrollMargin.right) + return true; + }; + + this.pixelToScreenCoordinates = function(x, y) { + var canvasPos; + if (this.$hasCssTransforms) { + canvasPos = {top:0, left: 0}; + var p = this.$fontMetrics.transformCoordinates([x, y]); + x = p[1] - this.gutterWidth - this.margin.left; + y = p[0]; + } else { + canvasPos = this.scroller.getBoundingClientRect(); + } + + var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding; + var offset = offsetX / this.characterWidth; + var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); + var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset); + + return {row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX}; + }; + + this.screenToTextCoordinates = function(x, y) { + var canvasPos; + if (this.$hasCssTransforms) { + canvasPos = {top:0, left: 0}; + var p = this.$fontMetrics.transformCoordinates([x, y]); + x = p[1] - this.gutterWidth - this.margin.left; + y = p[0]; + } else { + canvasPos = this.scroller.getBoundingClientRect(); + } + + var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding; + var offset = offsetX / this.characterWidth; + var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset); + + var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); + + return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX); + }; + this.textToScreenCoordinates = function(row, column) { + var canvasPos = this.scroller.getBoundingClientRect(); + var pos = this.session.documentToScreenPosition(row, column); + + var x = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, row) + ? this.session.$bidiHandler.getPosLeft(pos.column) + : Math.round(pos.column * this.characterWidth)); + + var y = pos.row * this.lineHeight; + + return { + pageX: canvasPos.left + x - this.scrollLeft, + pageY: canvasPos.top + y - this.scrollTop + }; + }; + this.visualizeFocus = function() { + dom.addCssClass(this.container, "ace_focus"); + }; + this.visualizeBlur = function() { + dom.removeCssClass(this.container, "ace_focus"); + }; + this.showComposition = function(composition) { + this.$composition = composition; + if (!composition.cssText) { + composition.cssText = this.textarea.style.cssText; + } + if (composition.useTextareaForIME == undefined) + composition.useTextareaForIME = this.$useTextareaForIME; + + if (this.$useTextareaForIME) { + dom.addCssClass(this.textarea, "ace_composition"); + this.textarea.style.cssText = ""; + this.$moveTextAreaToCursor(); + this.$cursorLayer.element.style.display = "none"; + } + else { + composition.markerId = this.session.addMarker(composition.markerRange, "ace_composition_marker", "text"); + } + }; + this.setCompositionText = function(text) { + var cursor = this.session.selection.cursor; + this.addToken(text, "composition_placeholder", cursor.row, cursor.column); + this.$moveTextAreaToCursor(); + }; + this.hideComposition = function() { + if (!this.$composition) + return; + + if (this.$composition.markerId) + this.session.removeMarker(this.$composition.markerId); + + dom.removeCssClass(this.textarea, "ace_composition"); + this.textarea.style.cssText = this.$composition.cssText; + var cursor = this.session.selection.cursor; + this.removeExtraToken(cursor.row, cursor.column); + this.$composition = null; + this.$cursorLayer.element.style.display = ""; + }; + + this.addToken = function(text, type, row, column) { + var session = this.session; + session.bgTokenizer.lines[row] = null; + var newToken = {type: type, value: text}; + var tokens = session.getTokens(row); + if (column == null) { + tokens.push(newToken); + } else { + var l = 0; + for (var i =0; i < tokens.length; i++) { + var token = tokens[i]; + l += token.value.length; + if (column <= l) { + var diff = token.value.length - (l - column); + var before = token.value.slice(0, diff); + var after = token.value.slice(diff); + + tokens.splice(i, 1, {type: token.type, value: before}, newToken, {type: token.type, value: after}); + break; + } + } + } + this.updateLines(row, row); + }; + + this.removeExtraToken = function(row, column) { + this.updateLines(row, row); + }; + this.setTheme = function(theme, cb) { + var _self = this; + this.$themeId = theme; + _self._dispatchEvent('themeChange',{theme:theme}); + + if (!theme || typeof theme == "string") { + var moduleName = theme || this.$options.theme.initialValue; + config.loadModule(["theme", moduleName], afterLoad); + } else { + afterLoad(theme); + } + + function afterLoad(module) { + if (_self.$themeId != theme) + return cb && cb(); + if (!module || !module.cssClass) + throw new Error("couldn't load module " + theme + " or it didn't call define"); + if (module.$id) + _self.$themeId = module.$id; + dom.importCssString( + module.cssText, + module.cssClass, + _self.container + ); + + if (_self.theme) + dom.removeCssClass(_self.container, _self.theme.cssClass); + + var padding = "padding" in module ? module.padding + : "padding" in (_self.theme || {}) ? 4 : _self.$padding; + if (_self.$padding && padding != _self.$padding) + _self.setPadding(padding); + _self.$theme = module.cssClass; + + _self.theme = module; + dom.addCssClass(_self.container, module.cssClass); + dom.setCssClass(_self.container, "ace_dark", module.isDark); + if (_self.$size) { + _self.$size.width = 0; + _self.$updateSizeAsync(); + } + + _self._dispatchEvent('themeLoaded', {theme:module}); + cb && cb(); + } + }; + this.getTheme = function() { + return this.$themeId; + }; + this.setStyle = function(style, include) { + dom.setCssClass(this.container, style, include !== false); + }; + this.unsetStyle = function(style) { + dom.removeCssClass(this.container, style); + }; + + this.setCursorStyle = function(style) { + dom.setStyle(this.scroller.style, "cursor", style); + }; + this.setMouseCursor = function(cursorStyle) { + dom.setStyle(this.scroller.style, "cursor", cursorStyle); + }; + + this.attachToShadowRoot = function() { + dom.importCssString(editorCss, "ace_editor.css", this.container); + }; + this.destroy = function() { + this.freeze(); + this.$fontMetrics.destroy(); + this.$cursorLayer.destroy(); + this.removeAllListeners(); + this.container.textContent = ""; + }; + +}).call(VirtualRenderer.prototype); + + +config.defineOptions(VirtualRenderer.prototype, "renderer", { + animatedScroll: {initialValue: false}, + showInvisibles: { + set: function(value) { + if (this.$textLayer.setShowInvisibles(value)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: false + }, + showPrintMargin: { + set: function() { this.$updatePrintMargin(); }, + initialValue: true + }, + printMarginColumn: { + set: function() { this.$updatePrintMargin(); }, + initialValue: 80 + }, + printMargin: { + set: function(val) { + if (typeof val == "number") + this.$printMarginColumn = val; + this.$showPrintMargin = !!val; + this.$updatePrintMargin(); + }, + get: function() { + return this.$showPrintMargin && this.$printMarginColumn; + } + }, + showGutter: { + set: function(show){ + this.$gutter.style.display = show ? "block" : "none"; + this.$loop.schedule(this.CHANGE_FULL); + this.onGutterResize(); + }, + initialValue: true + }, + fadeFoldWidgets: { + set: function(show) { + dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show); + }, + initialValue: false + }, + showFoldWidgets: { + set: function(show) { + this.$gutterLayer.setShowFoldWidgets(show); + this.$loop.schedule(this.CHANGE_GUTTER); + }, + initialValue: true + }, + displayIndentGuides: { + set: function(show) { + if (this.$textLayer.setDisplayIndentGuides(show)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: true + }, + highlightGutterLine: { + set: function(shouldHighlight) { + this.$gutterLayer.setHighlightGutterLine(shouldHighlight); + this.$loop.schedule(this.CHANGE_GUTTER); + }, + initialValue: true + }, + hScrollBarAlwaysVisible: { + set: function(val) { + if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + vScrollBarAlwaysVisible: { + set: function(val) { + if (!this.$vScrollBarAlwaysVisible || !this.$vScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + fontSize: { + set: function(size) { + if (typeof size == "number") + size = size + "px"; + this.container.style.fontSize = size; + this.updateFontSize(); + }, + initialValue: 12 + }, + fontFamily: { + set: function(name) { + this.container.style.fontFamily = name; + this.updateFontSize(); + } + }, + maxLines: { + set: function(val) { + this.updateFull(); + } + }, + minLines: { + set: function(val) { + if (!(this.$minLines < 0x1ffffffffffff)) + this.$minLines = 0; + this.updateFull(); + } + }, + maxPixelHeight: { + set: function(val) { + this.updateFull(); + }, + initialValue: 0 + }, + scrollPastEnd: { + set: function(val) { + val = +val || 0; + if (this.$scrollPastEnd == val) + return; + this.$scrollPastEnd = val; + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: 0, + handlesSet: true + }, + fixedWidthGutter: { + set: function(val) { + this.$gutterLayer.$fixedWidth = !!val; + this.$loop.schedule(this.CHANGE_GUTTER); + } + }, + theme: { + set: function(val) { this.setTheme(val); }, + get: function() { return this.$themeId || this.theme; }, + initialValue: "./theme/textmate", + handlesSet: true + }, + hasCssTransforms: { + }, + useTextareaForIME: { + initialValue: !useragent.isMobile && !useragent.isIE + } +}); + +exports.VirtualRenderer = VirtualRenderer; +}); + +define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var net = require("../lib/net"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var config = require("../config"); + +function $workerBlob(workerUrl) { + var script = "importScripts('" + net.qualifyURL(workerUrl) + "');"; + try { + return new Blob([script], {"type": "application/javascript"}); + } catch (e) { // Backwards-compatibility + var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; + var blobBuilder = new BlobBuilder(); + blobBuilder.append(script); + return blobBuilder.getBlob("application/javascript"); + } +} + +function createWorker(workerUrl) { + if (typeof Worker == "undefined") + return { postMessage: function() {}, terminate: function() {} }; + if (config.get("loadWorkerFromBlob")) { + var blob = $workerBlob(workerUrl); + var URL = window.URL || window.webkitURL; + var blobURL = URL.createObjectURL(blob); + return new Worker(blobURL); + } + return new Worker(workerUrl); +} + +var WorkerClient = function(worker) { + if (!worker.postMessage) + worker = this.$createWorkerFromOldConfig.apply(this, arguments); + + this.$worker = worker; + this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); + this.changeListener = this.changeListener.bind(this); + this.onMessage = this.onMessage.bind(this); + + this.callbackId = 1; + this.callbacks = {}; + + this.$worker.onmessage = this.onMessage; +}; + +(function(){ + + oop.implement(this, EventEmitter); + + this.$createWorkerFromOldConfig = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) { + if (require.nameToUrl && !require.toUrl) + require.toUrl = require.nameToUrl; + + if (config.get("packaged") || !require.toUrl) { + workerUrl = workerUrl || config.moduleUrl(mod, "worker"); + } else { + var normalizePath = this.$normalizePath; + workerUrl = workerUrl || normalizePath(require.toUrl("ace/worker/worker.js", null, "_")); + + var tlns = {}; + topLevelNamespaces.forEach(function(ns) { + tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, "")); + }); + } + + this.$worker = createWorker(workerUrl); + if (importScripts) { + this.send("importScripts", importScripts); + } + this.$worker.postMessage({ + init : true, + tlns : tlns, + module : mod, + classname : classname + }); + return this.$worker; + }; + + this.onMessage = function(e) { + var msg = e.data; + switch (msg.type) { + case "event": + this._signal(msg.name, {data: msg.data}); + break; + case "call": + var callback = this.callbacks[msg.id]; + if (callback) { + callback(msg.data); + delete this.callbacks[msg.id]; + } + break; + case "error": + this.reportError(msg.data); + break; + case "log": + window.console && console.log && console.log.apply(console, msg.data); + break; + } + }; + + this.reportError = function(err) { + window.console && console.error && console.error(err); + }; + + this.$normalizePath = function(path) { + return net.qualifyURL(path); + }; + + this.terminate = function() { + this._signal("terminate", {}); + this.deltaQueue = null; + this.$worker.terminate(); + this.$worker = null; + if (this.$doc) + this.$doc.off("change", this.changeListener); + this.$doc = null; + }; + + this.send = function(cmd, args) { + this.$worker.postMessage({command: cmd, args: args}); + }; + + this.call = function(cmd, args, callback) { + if (callback) { + var id = this.callbackId++; + this.callbacks[id] = callback; + args.push(id); + } + this.send(cmd, args); + }; + + this.emit = function(event, data) { + try { + if (data.data && data.data.err) + data.data.err = {message: data.data.err.message, stack: data.data.err.stack, code: data.data.err.code}; + this.$worker && this.$worker.postMessage({event: event, data: {data: data.data}}); + } + catch(ex) { + console.error(ex.stack); + } + }; + + this.attachToDocument = function(doc) { + if (this.$doc) + this.terminate(); + + this.$doc = doc; + this.call("setValue", [doc.getValue()]); + doc.on("change", this.changeListener, true); + }; + + this.changeListener = function(delta) { + if (!this.deltaQueue) { + this.deltaQueue = []; + setTimeout(this.$sendDeltaQueue, 0); + } + if (delta.action == "insert") + this.deltaQueue.push(delta.start, delta.lines); + else + this.deltaQueue.push(delta.start, delta.end); + }; + + this.$sendDeltaQueue = function() { + var q = this.deltaQueue; + if (!q) return; + this.deltaQueue = null; + if (q.length > 50 && q.length > this.$doc.getLength() >> 1) { + this.call("setValue", [this.$doc.getValue()]); + } else + this.emit("change", {data: q}); + }; + +}).call(WorkerClient.prototype); + + +var UIWorkerClient = function(topLevelNamespaces, mod, classname) { + var main = null; + var emitSync = false; + var sender = Object.create(EventEmitter); + + var messageBuffer = []; + var workerClient = new WorkerClient({ + messageBuffer: messageBuffer, + terminate: function() {}, + postMessage: function(e) { + messageBuffer.push(e); + if (!main) return; + if (emitSync) + setTimeout(processNext); + else + processNext(); + } + }); + + workerClient.setEmitSync = function(val) { emitSync = val; }; + + var processNext = function() { + var msg = messageBuffer.shift(); + if (msg.command) + main[msg.command].apply(main, msg.args); + else if (msg.event) + sender._signal(msg.event, msg.data); + }; + + sender.postMessage = function(msg) { + workerClient.onMessage({data: msg}); + }; + sender.callback = function(data, callbackId) { + this.postMessage({type: "call", id: callbackId, data: data}); + }; + sender.emit = function(name, data) { + this.postMessage({type: "event", name: name, data: data}); + }; + + config.loadModule(["worker", mod], function(Main) { + main = new Main[classname](sender); + while (messageBuffer.length) + processNext(); + }); + + return workerClient; +}; + +exports.UIWorkerClient = UIWorkerClient; +exports.WorkerClient = WorkerClient; +exports.createWorker = createWorker; + + +}); + +define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var oop = require("./lib/oop"); + +var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) { + var _self = this; + this.length = length; + this.session = session; + this.doc = session.getDocument(); + this.mainClass = mainClass; + this.othersClass = othersClass; + this.$onUpdate = this.onUpdate.bind(this); + this.doc.on("change", this.$onUpdate, true); + this.$others = others; + + this.$onCursorChange = function() { + setTimeout(function() { + _self.onCursorChange(); + }); + }; + + this.$pos = pos; + var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1}; + this.$undoStackDepth = undoStack.length; + this.setup(); + + session.selection.on("changeCursor", this.$onCursorChange); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setup = function() { + var _self = this; + var doc = this.doc; + var session = this.session; + + this.selectionBefore = session.selection.toJSON(); + if (session.selection.inMultiSelectMode) + session.selection.toSingleRange(); + + this.pos = doc.createAnchor(this.$pos.row, this.$pos.column); + var pos = this.pos; + pos.$insertRight = true; + pos.detach(); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false); + this.others = []; + this.$others.forEach(function(other) { + var anchor = doc.createAnchor(other.row, other.column); + anchor.$insertRight = true; + anchor.detach(); + _self.others.push(anchor); + }); + session.setUndoSelect(false); + }; + this.showOtherMarkers = function() { + if (this.othersActive) return; + var session = this.session; + var _self = this; + this.othersActive = true; + this.others.forEach(function(anchor) { + anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false); + }); + }; + this.hideOtherMarkers = function() { + if (!this.othersActive) return; + this.othersActive = false; + for (var i = 0; i < this.others.length; i++) { + this.session.removeMarker(this.others[i].markerId); + } + }; + this.onUpdate = function(delta) { + if (this.$updating) + return this.updateAnchors(delta); + + var range = delta; + if (range.start.row !== range.end.row) return; + if (range.start.row !== this.pos.row) return; + this.$updating = true; + var lengthDiff = delta.action === "insert" ? range.end.column - range.start.column : range.start.column - range.end.column; + var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1; + var distanceFromStart = range.start.column - this.pos.column; + + this.updateAnchors(delta); + + if (inMainRange) + this.length += lengthDiff; + + if (inMainRange && !this.session.$fromUndo) { + if (delta.action === 'insert') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; + this.doc.insertMergedLines(newPos, delta.lines); + } + } else if (delta.action === 'remove') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; + this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff)); + } + } + } + + this.$updating = false; + this.updateMarkers(); + }; + + this.updateAnchors = function(delta) { + this.pos.onChange(delta); + for (var i = this.others.length; i--;) + this.others[i].onChange(delta); + this.updateMarkers(); + }; + + this.updateMarkers = function() { + if (this.$updating) + return; + var _self = this; + var session = this.session; + var updateMarker = function(pos, className) { + session.removeMarker(pos.markerId); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false); + }; + updateMarker(this.pos, this.mainClass); + for (var i = this.others.length; i--;) + updateMarker(this.others[i], this.othersClass); + }; + + this.onCursorChange = function(event) { + if (this.$updating || !this.session) return; + var pos = this.session.selection.getCursor(); + if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { + this.showOtherMarkers(); + this._emit("cursorEnter", event); + } else { + this.hideOtherMarkers(); + this._emit("cursorLeave", event); + } + }; + this.detach = function() { + this.session.removeMarker(this.pos && this.pos.markerId); + this.hideOtherMarkers(); + this.doc.off("change", this.$onUpdate); + this.session.selection.off("changeCursor", this.$onCursorChange); + this.session.setUndoSelect(true); + this.session = null; + }; + this.cancel = function() { + if (this.$undoStackDepth === -1) + return; + var undoManager = this.session.getUndoManager(); + var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth; + for (var i = 0; i < undosRequired; i++) { + undoManager.undo(this.session, true); + } + if (this.selectionBefore) + this.session.selection.fromJSON(this.selectionBefore); + }; +}).call(PlaceHolder.prototype); + + +exports.PlaceHolder = PlaceHolder; +}); + +define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { + +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} + +function onMouseDown(e) { + var ev = e.domEvent; + var alt = ev.altKey; + var shift = ev.shiftKey; + var ctrl = ev.ctrlKey; + var accel = e.getAccelKey(); + var button = e.getButton(); + + if (ctrl && useragent.isMac) + button = ev.button; + + if (e.editor.inMultiSelectMode && button == 2) { + e.editor.textInput.onContextMenu(e.domEvent); + return; + } + + if (!ctrl && !alt && !accel) { + if (button === 0 && e.editor.inMultiSelectMode) + e.editor.exitMultiSelectMode(); + return; + } + + if (button !== 0) + return; + + var editor = e.editor; + var selection = editor.selection; + var isMultiSelect = editor.inMultiSelectMode; + var pos = e.getDocumentPosition(); + var cursor = selection.getCursor(); + var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor)); + + var mouseX = e.x, mouseY = e.y; + var onMouseSelection = function(e) { + mouseX = e.clientX; + mouseY = e.clientY; + }; + + var session = editor.session; + var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var screenCursor = screenAnchor; + + var selectionMode; + if (editor.$mouseHandler.$enableJumpToDef) { + if (ctrl && alt || accel && alt) + selectionMode = shift ? "block" : "add"; + else if (alt && editor.$blockSelectEnabled) + selectionMode = "block"; + } else { + if (accel && !alt) { + selectionMode = "add"; + if (!isMultiSelect && shift) + return; + } else if (alt && editor.$blockSelectEnabled) { + selectionMode = "block"; + } + } + + if (selectionMode && useragent.isMac && ev.ctrlKey) { + editor.$mouseHandler.cancelContextMenu(); + } + + if (selectionMode == "add") { + if (!isMultiSelect && inSelection) + return; // dragging + + if (!isMultiSelect) { + var range = selection.toOrientedRange(); + editor.addSelectionMarker(range); + } + + var oldRange = selection.rangeList.rangeAtPoint(pos); + + editor.inVirtualSelectionMode = true; + + if (shift) { + oldRange = null; + range = selection.ranges[0] || range; + editor.removeSelectionMarker(range); + } + editor.once("mouseup", function() { + var tmpSel = selection.toOrientedRange(); + + if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) + selection.substractPoint(tmpSel.cursor); + else { + if (shift) { + selection.substractPoint(range.cursor); + } else if (range) { + editor.removeSelectionMarker(range); + selection.addRange(range); + } + selection.addRange(tmpSel); + } + editor.inVirtualSelectionMode = false; + }); + + } else if (selectionMode == "block") { + e.stop(); + editor.inVirtualSelectionMode = true; + var initialRange; + var rectSel = []; + var blockSelect = function() { + var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX); + + if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead)) + return; + screenCursor = newCursor; + + editor.selection.moveToPosition(cursor); + editor.renderer.scrollCursorIntoView(); + + editor.removeSelectionMarkers(rectSel); + rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor); + if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty()) + rectSel[0] = editor.$mouseHandler.$clickSelection.clone(); + rectSel.forEach(editor.addSelectionMarker, editor); + editor.updateSelectionMarkers(); + }; + if (isMultiSelect && !accel) { + selection.toSingleRange(); + } else if (!isMultiSelect && accel) { + initialRange = selection.toOrientedRange(); + editor.addSelectionMarker(initialRange); + } + + if (shift) + screenAnchor = session.documentToScreenPosition(selection.lead); + else + selection.moveToPosition(pos); + + screenCursor = {row: -1, column: -1}; + + var onMouseSelectionEnd = function(e) { + blockSelect(); + clearInterval(timerId); + editor.removeSelectionMarkers(rectSel); + if (!rectSel.length) + rectSel = [selection.toOrientedRange()]; + if (initialRange) { + editor.removeSelectionMarker(initialRange); + selection.toSingleRange(initialRange); + } + for (var i = 0; i < rectSel.length; i++) + selection.addRange(rectSel[i]); + editor.inVirtualSelectionMode = false; + editor.$mouseHandler.$clickSelection = null; + }; + + var onSelectionInterval = blockSelect; + + event.capture(editor.container, onMouseSelection, onMouseSelectionEnd); + var timerId = setInterval(function() {onSelectionInterval();}, 20); + + return e.preventDefault(); + } +} + + +exports.onMouseDown = onMouseDown; + +}); + +define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module) { +exports.defaultCommands = [{ + name: "addCursorAbove", + description: "Add cursor above", + exec: function(editor) { editor.selectMoreLines(-1); }, + bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "addCursorBelow", + description: "Add cursor below", + exec: function(editor) { editor.selectMoreLines(1); }, + bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "addCursorAboveSkipCurrent", + description: "Add cursor above (skip current)", + exec: function(editor) { editor.selectMoreLines(-1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "addCursorBelowSkipCurrent", + description: "Add cursor below (skip current)", + exec: function(editor) { editor.selectMoreLines(1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectMoreBefore", + description: "Select more before", + exec: function(editor) { editor.selectMore(-1); }, + bindKey: {win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectMoreAfter", + description: "Select more after", + exec: function(editor) { editor.selectMore(1); }, + bindKey: {win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectNextBefore", + description: "Select next before", + exec: function(editor) { editor.selectMore(-1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectNextAfter", + description: "Select next after", + exec: function(editor) { editor.selectMore(1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "toggleSplitSelectionIntoLines", + description: "Split into lines", + exec: function(editor) { + if (editor.multiSelect.rangeCount > 1) + editor.multiSelect.joinSelections(); + else + editor.multiSelect.splitIntoLines(); + }, + bindKey: {win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L"}, + readOnly: true +}, { + name: "splitSelectionIntoLines", + description: "Split into lines", + exec: function(editor) { editor.multiSelect.splitIntoLines(); }, + readOnly: true +}, { + name: "alignCursors", + description: "Align cursors", + exec: function(editor) { editor.alignCursors(); }, + bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"}, + scrollIntoView: "cursor" +}, { + name: "findAll", + description: "Find all", + exec: function(editor) { editor.findAll(); }, + bindKey: {win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G"}, + scrollIntoView: "cursor", + readOnly: true +}]; +exports.multiSelectCommands = [{ + name: "singleSelection", + description: "Single selection", + bindKey: "esc", + exec: function(editor) { editor.exitMultiSelectMode(); }, + scrollIntoView: "cursor", + readOnly: true, + isAvailable: function(editor) {return editor && editor.inMultiSelectMode;} +}]; + +var HashHandler = require("../keyboard/hash_handler").HashHandler; +exports.keyboardHandler = new HashHandler(exports.multiSelectCommands); + +}); + +define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"], function(require, exports, module) { + +var RangeList = require("./range_list").RangeList; +var Range = require("./range").Range; +var Selection = require("./selection").Selection; +var onMouseDown = require("./mouse/multi_select_handler").onMouseDown; +var event = require("./lib/event"); +var lang = require("./lib/lang"); +var commands = require("./commands/multi_select_commands"); +exports.commands = commands.defaultCommands.concat(commands.multiSelectCommands); +var Search = require("./search").Search; +var search = new Search(); + +function find(session, needle, dir) { + search.$options.wrap = true; + search.$options.needle = needle; + search.$options.backwards = dir == -1; + return search.find(session); +} +var EditSession = require("./edit_session").EditSession; +(function() { + this.getSelectionMarkers = function() { + return this.$selectionMarkers; + }; +}).call(EditSession.prototype); +(function() { + this.ranges = null; + this.rangeList = null; + this.addRange = function(range, $blockChangeEvents) { + if (!range) + return; + + if (!this.inMultiSelectMode && this.rangeCount === 0) { + var oldRange = this.toOrientedRange(); + this.rangeList.add(oldRange); + this.rangeList.add(range); + if (this.rangeList.ranges.length != 2) { + this.rangeList.removeAll(); + return $blockChangeEvents || this.fromOrientedRange(range); + } + this.rangeList.removeAll(); + this.rangeList.add(oldRange); + this.$onAddRange(oldRange); + } + + if (!range.cursor) + range.cursor = range.end; + + var removed = this.rangeList.add(range); + + this.$onAddRange(range); + + if (removed.length) + this.$onRemoveRange(removed); + + if (this.rangeCount > 1 && !this.inMultiSelectMode) { + this._signal("multiSelect"); + this.inMultiSelectMode = true; + this.session.$undoSelect = false; + this.rangeList.attach(this.session); + } + + return $blockChangeEvents || this.fromOrientedRange(range); + }; + this.toSingleRange = function(range) { + range = range || this.ranges[0]; + var removed = this.rangeList.removeAll(); + if (removed.length) + this.$onRemoveRange(removed); + + range && this.fromOrientedRange(range); + }; + this.substractPoint = function(pos) { + var removed = this.rangeList.substractPoint(pos); + if (removed) { + this.$onRemoveRange(removed); + return removed[0]; + } + }; + this.mergeOverlappingRanges = function() { + var removed = this.rangeList.merge(); + if (removed.length) + this.$onRemoveRange(removed); + }; + + this.$onAddRange = function(range) { + this.rangeCount = this.rangeList.ranges.length; + this.ranges.unshift(range); + this._signal("addRange", {range: range}); + }; + + this.$onRemoveRange = function(removed) { + this.rangeCount = this.rangeList.ranges.length; + if (this.rangeCount == 1 && this.inMultiSelectMode) { + var lastRange = this.rangeList.ranges.pop(); + removed.push(lastRange); + this.rangeCount = 0; + } + + for (var i = removed.length; i--; ) { + var index = this.ranges.indexOf(removed[i]); + this.ranges.splice(index, 1); + } + + this._signal("removeRange", {ranges: removed}); + + if (this.rangeCount === 0 && this.inMultiSelectMode) { + this.inMultiSelectMode = false; + this._signal("singleSelect"); + this.session.$undoSelect = true; + this.rangeList.detach(this.session); + } + + lastRange = lastRange || this.ranges[0]; + if (lastRange && !lastRange.isEqual(this.getRange())) + this.fromOrientedRange(lastRange); + }; + this.$initRangeList = function() { + if (this.rangeList) + return; + + this.rangeList = new RangeList(); + this.ranges = []; + this.rangeCount = 0; + }; + this.getAllRanges = function() { + return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()]; + }; + this.splitIntoLines = function () { + var ranges = this.ranges.length ? this.ranges : [this.getRange()]; + var newRanges = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + var row = range.start.row; + var endRow = range.end.row; + if (row === endRow) { + newRanges.push(range.clone()); + } else { + newRanges.push(new Range(row, range.start.column, row, this.session.getLine(row).length)); + while (++row < endRow) + newRanges.push(this.getLineRange(row, true)); + newRanges.push(new Range(endRow, 0, endRow, range.end.column)); + } + if (i == 0 && !this.isBackwards()) + newRanges = newRanges.reverse(); + } + this.toSingleRange(); + for (var i = newRanges.length; i--;) + this.addRange(newRanges[i]); + }; + + this.joinSelections = function () { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); + }; + this.toggleBlockSelection = function () { + if (this.rangeCount > 1) { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); + } else { + var cursor = this.session.documentToScreenPosition(this.cursor); + var anchor = this.session.documentToScreenPosition(this.anchor); + + var rectSel = this.rectangularRangeBlock(cursor, anchor); + rectSel.forEach(this.addRange, this); + } + }; + this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) { + var rectSel = []; + + var xBackwards = screenCursor.column < screenAnchor.column; + if (xBackwards) { + var startColumn = screenCursor.column; + var endColumn = screenAnchor.column; + var startOffsetX = screenCursor.offsetX; + var endOffsetX = screenAnchor.offsetX; + } else { + var startColumn = screenAnchor.column; + var endColumn = screenCursor.column; + var startOffsetX = screenAnchor.offsetX; + var endOffsetX = screenCursor.offsetX; + } + + var yBackwards = screenCursor.row < screenAnchor.row; + if (yBackwards) { + var startRow = screenCursor.row; + var endRow = screenAnchor.row; + } else { + var startRow = screenAnchor.row; + var endRow = screenCursor.row; + } + + if (startColumn < 0) + startColumn = 0; + if (startRow < 0) + startRow = 0; + + if (startRow == endRow) + includeEmptyLines = true; + + var docEnd; + for (var row = startRow; row <= endRow; row++) { + var range = Range.fromPoints( + this.session.screenToDocumentPosition(row, startColumn, startOffsetX), + this.session.screenToDocumentPosition(row, endColumn, endOffsetX) + ); + if (range.isEmpty()) { + if (docEnd && isSamePoint(range.end, docEnd)) + break; + docEnd = range.end; + } + range.cursor = xBackwards ? range.start : range.end; + rectSel.push(range); + } + + if (yBackwards) + rectSel.reverse(); + + if (!includeEmptyLines) { + var end = rectSel.length - 1; + while (rectSel[end].isEmpty() && end > 0) + end--; + if (end > 0) { + var start = 0; + while (rectSel[start].isEmpty()) + start++; + } + for (var i = end; i >= start; i--) { + if (rectSel[i].isEmpty()) + rectSel.splice(i, 1); + } + } + + return rectSel; + }; +}).call(Selection.prototype); +var Editor = require("./editor").Editor; +(function() { + this.updateSelectionMarkers = function() { + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.addSelectionMarker = function(orientedRange) { + if (!orientedRange.cursor) + orientedRange.cursor = orientedRange.end; + + var style = this.getSelectionStyle(); + orientedRange.marker = this.session.addMarker(orientedRange, "ace_selection", style); + + this.session.$selectionMarkers.push(orientedRange); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + return orientedRange; + }; + this.removeSelectionMarker = function(range) { + if (!range.marker) + return; + this.session.removeMarker(range.marker); + var index = this.session.$selectionMarkers.indexOf(range); + if (index != -1) + this.session.$selectionMarkers.splice(index, 1); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + }; + + this.removeSelectionMarkers = function(ranges) { + var markerList = this.session.$selectionMarkers; + for (var i = ranges.length; i--; ) { + var range = ranges[i]; + if (!range.marker) + continue; + this.session.removeMarker(range.marker); + var index = markerList.indexOf(range); + if (index != -1) + markerList.splice(index, 1); + } + this.session.selectionMarkerCount = markerList.length; + }; + + this.$onAddRange = function(e) { + this.addSelectionMarker(e.range); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + + this.$onRemoveRange = function(e) { + this.removeSelectionMarkers(e.ranges); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + + this.$onMultiSelect = function(e) { + if (this.inMultiSelectMode) + return; + this.inMultiSelectMode = true; + + this.setStyle("ace_multiselect"); + this.keyBinding.addKeyboardHandler(commands.keyboardHandler); + this.commands.setDefaultHandler("exec", this.$onMultiSelectExec); + + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + + this.$onSingleSelect = function(e) { + if (this.session.multiSelect.inVirtualMode) + return; + this.inMultiSelectMode = false; + + this.unsetStyle("ace_multiselect"); + this.keyBinding.removeKeyboardHandler(commands.keyboardHandler); + + this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + this._emit("changeSelection"); + }; + + this.$onMultiSelectExec = function(e) { + var command = e.command; + var editor = e.editor; + if (!editor.multiSelect) + return; + if (!command.multiSelectAction) { + var result = command.exec(editor, e.args || {}); + editor.multiSelect.addRange(editor.multiSelect.toOrientedRange()); + editor.multiSelect.mergeOverlappingRanges(); + } else if (command.multiSelectAction == "forEach") { + result = editor.forEachSelection(command, e.args); + } else if (command.multiSelectAction == "forEachLine") { + result = editor.forEachSelection(command, e.args, true); + } else if (command.multiSelectAction == "single") { + editor.exitMultiSelectMode(); + result = command.exec(editor, e.args || {}); + } else { + result = command.multiSelectAction(editor, e.args || {}); + } + return result; + }; + this.forEachSelection = function(cmd, args, options) { + if (this.inVirtualSelectionMode) + return; + var keepOrder = options && options.keepOrder; + var $byLines = options == true || options && options.$byLines; + var session = this.session; + var selection = this.selection; + var rangeList = selection.rangeList; + var ranges = (keepOrder ? selection : rangeList).ranges; + var result; + + if (!ranges.length) + return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + + var reg = selection._eventRegistry; + selection._eventRegistry = {}; + + var tmpSel = new Selection(session); + this.inVirtualSelectionMode = true; + for (var i = ranges.length; i--;) { + if ($byLines) { + while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row) + i--; + } + tmpSel.fromOrientedRange(ranges[i]); + tmpSel.index = i; + this.selection = session.selection = tmpSel; + var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + if (!result && cmdResult !== undefined) + result = cmdResult; + tmpSel.toOrientedRange(ranges[i]); + } + tmpSel.detach(); + + this.selection = session.selection = selection; + this.inVirtualSelectionMode = false; + selection._eventRegistry = reg; + selection.mergeOverlappingRanges(); + if (selection.ranges[0]) + selection.fromOrientedRange(selection.ranges[0]); + + var anim = this.renderer.$scrollAnimation; + this.onCursorChange(); + this.onSelectionChange(); + if (anim && anim.from == anim.to) + this.renderer.animateScrolling(anim.from); + + return result; + }; + this.exitMultiSelectMode = function() { + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) + return; + this.multiSelect.toSingleRange(); + }; + + this.getSelectedText = function() { + var text = ""; + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var ranges = this.multiSelect.rangeList.ranges; + var buf = []; + for (var i = 0; i < ranges.length; i++) { + buf.push(this.session.getTextRange(ranges[i])); + } + var nl = this.session.getDocument().getNewLineCharacter(); + text = buf.join(nl); + if (text.length == (buf.length - 1) * nl.length) + text = ""; + } else if (!this.selection.isEmpty()) { + text = this.session.getTextRange(this.getSelectionRange()); + } + return text; + }; + + this.$checkMultiselectChange = function(e, anchor) { + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var range = this.multiSelect.ranges[0]; + if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor) + return; + var pos = anchor == this.multiSelect.anchor + ? range.cursor == range.start ? range.end : range.start + : range.cursor; + if (pos.row != anchor.row + || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column) + this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange()); + else + this.multiSelect.mergeOverlappingRanges(); + } + }; + this.findAll = function(needle, options, additive) { + options = options || {}; + options.needle = needle || options.needle; + if (options.needle == undefined) { + var range = this.selection.isEmpty() + ? this.selection.getWordRange() + : this.selection.getRange(); + options.needle = this.session.getTextRange(range); + } + this.$search.set(options); + + var ranges = this.$search.findAll(this.session); + if (!ranges.length) + return 0; + + var selection = this.multiSelect; + + if (!additive) + selection.toSingleRange(ranges[0]); + + for (var i = ranges.length; i--; ) + selection.addRange(ranges[i], true); + if (range && selection.rangeList.rangeAtPoint(range.start)) + selection.addRange(range, true); + + return ranges.length; + }; + this.selectMoreLines = function(dir, skip) { + var range = this.selection.toOrientedRange(); + var isBackwards = range.cursor == range.end; + + var screenLead = this.session.documentToScreenPosition(range.cursor); + if (this.selection.$desiredColumn) + screenLead.column = this.selection.$desiredColumn; + + var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column); + + if (!range.isEmpty()) { + var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start); + var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column); + } else { + var anchor = lead; + } + + if (isBackwards) { + var newRange = Range.fromPoints(lead, anchor); + newRange.cursor = newRange.start; + } else { + var newRange = Range.fromPoints(anchor, lead); + newRange.cursor = newRange.end; + } + + newRange.desiredColumn = screenLead.column; + if (!this.selection.inMultiSelectMode) { + this.selection.addRange(range); + } else { + if (skip) + var toRemove = range.cursor; + } + + this.selection.addRange(newRange); + if (toRemove) + this.selection.substractPoint(toRemove); + }; + this.transposeSelections = function(dir) { + var session = this.session; + var sel = session.multiSelect; + var all = sel.ranges; + + for (var i = all.length; i--; ) { + var range = all[i]; + if (range.isEmpty()) { + var tmp = session.getWordRange(range.start.row, range.start.column); + range.start.row = tmp.start.row; + range.start.column = tmp.start.column; + range.end.row = tmp.end.row; + range.end.column = tmp.end.column; + } + } + sel.mergeOverlappingRanges(); + + var words = []; + for (var i = all.length; i--; ) { + var range = all[i]; + words.unshift(session.getTextRange(range)); + } + + if (dir < 0) + words.unshift(words.pop()); + else + words.push(words.shift()); + + for (var i = all.length; i--; ) { + var range = all[i]; + var tmp = range.clone(); + session.replace(range, words[i]); + range.start.row = tmp.start.row; + range.start.column = tmp.start.column; + } + sel.fromOrientedRange(sel.ranges[0]); + }; + this.selectMore = function(dir, skip, stopAtFirst) { + var session = this.session; + var sel = session.multiSelect; + + var range = sel.toOrientedRange(); + if (range.isEmpty()) { + range = session.getWordRange(range.start.row, range.start.column); + range.cursor = dir == -1 ? range.start : range.end; + this.multiSelect.addRange(range); + if (stopAtFirst) + return; + } + var needle = session.getTextRange(range); + + var newRange = find(session, needle, dir); + if (newRange) { + newRange.cursor = dir == -1 ? newRange.start : newRange.end; + this.session.unfold(newRange); + this.multiSelect.addRange(newRange); + this.renderer.scrollCursorIntoView(null, 0.5); + } + if (skip) + this.multiSelect.substractPoint(range.cursor); + }; + this.alignCursors = function() { + var session = this.session; + var sel = session.multiSelect; + var ranges = sel.ranges; + var row = -1; + var sameRowRanges = ranges.filter(function(r) { + if (r.cursor.row == row) + return true; + row = r.cursor.row; + }); + + if (!ranges.length || sameRowRanges.length == ranges.length - 1) { + var range = this.selection.getRange(); + var fr = range.start.row, lr = range.end.row; + var guessRange = fr == lr; + if (guessRange) { + var max = this.session.getLength(); + var line; + do { + line = this.session.getLine(lr); + } while (/[=:]/.test(line) && ++lr < max); + do { + line = this.session.getLine(fr); + } while (/[=:]/.test(line) && --fr > 0); + + if (fr < 0) fr = 0; + if (lr >= max) lr = max - 1; + } + var lines = this.session.removeFullLines(fr, lr); + lines = this.$reAlignText(lines, guessRange); + this.session.insert({row: fr, column: 0}, lines.join("\n") + "\n"); + if (!guessRange) { + range.start.column = 0; + range.end.column = lines[lines.length - 1].length; + } + this.selection.setRange(range); + } else { + sameRowRanges.forEach(function(r) { + sel.substractPoint(r.cursor); + }); + + var maxCol = 0; + var minSpace = Infinity; + var spaceOffsets = ranges.map(function(r) { + var p = r.cursor; + var line = session.getLine(p.row); + var spaceOffset = line.substr(p.column).search(/\S/g); + if (spaceOffset == -1) + spaceOffset = 0; + + if (p.column > maxCol) + maxCol = p.column; + if (spaceOffset < minSpace) + minSpace = spaceOffset; + return spaceOffset; + }); + ranges.forEach(function(r, i) { + var p = r.cursor; + var l = maxCol - p.column; + var d = spaceOffsets[i] - minSpace; + if (l > d) + session.insert(p, lang.stringRepeat(" ", l - d)); + else + session.remove(new Range(p.row, p.column, p.row, p.column - l + d)); + + r.start.column = r.end.column = maxCol; + r.start.row = r.end.row = p.row; + r.cursor = r.end; + }); + sel.fromOrientedRange(ranges[0]); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + } + }; + + this.$reAlignText = function(lines, forceLeft) { + var isLeftAligned = true, isRightAligned = true; + var startW, textW, endW; + + return lines.map(function(line) { + var m = line.match(/(\s*)(.*?)(\s*)([=:].*)/); + if (!m) + return [line]; + + if (startW == null) { + startW = m[1].length; + textW = m[2].length; + endW = m[3].length; + return m; + } + + if (startW + textW + endW != m[1].length + m[2].length + m[3].length) + isRightAligned = false; + if (startW != m[1].length) + isLeftAligned = false; + + if (startW > m[1].length) + startW = m[1].length; + if (textW < m[2].length) + textW = m[2].length; + if (endW > m[3].length) + endW = m[3].length; + + return m; + }).map(forceLeft ? alignLeft : + isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign); + + function spaces(n) { + return lang.stringRepeat(" ", n); + } + + function alignLeft(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(textW - m[2].length + endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + function alignRight(m) { + return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2] + + spaces(endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + function unAlign(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + }; +}).call(Editor.prototype); + + +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} +exports.onSessionChange = function(e) { + var session = e.session; + if (session && !session.multiSelect) { + session.$selectionMarkers = []; + session.selection.$initRangeList(); + session.multiSelect = session.selection; + } + this.multiSelect = session && session.multiSelect; + + var oldSession = e.oldSession; + if (oldSession) { + oldSession.multiSelect.off("addRange", this.$onAddRange); + oldSession.multiSelect.off("removeRange", this.$onRemoveRange); + oldSession.multiSelect.off("multiSelect", this.$onMultiSelect); + oldSession.multiSelect.off("singleSelect", this.$onSingleSelect); + oldSession.multiSelect.lead.off("change", this.$checkMultiselectChange); + oldSession.multiSelect.anchor.off("change", this.$checkMultiselectChange); + } + + if (session) { + session.multiSelect.on("addRange", this.$onAddRange); + session.multiSelect.on("removeRange", this.$onRemoveRange); + session.multiSelect.on("multiSelect", this.$onMultiSelect); + session.multiSelect.on("singleSelect", this.$onSingleSelect); + session.multiSelect.lead.on("change", this.$checkMultiselectChange); + session.multiSelect.anchor.on("change", this.$checkMultiselectChange); + } + + if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) { + if (session.selection.inMultiSelectMode) + this.$onMultiSelect(); + else + this.$onSingleSelect(); + } +}; +function MultiSelect(editor) { + if (editor.$multiselectOnSessionChange) + return; + editor.$onAddRange = editor.$onAddRange.bind(editor); + editor.$onRemoveRange = editor.$onRemoveRange.bind(editor); + editor.$onMultiSelect = editor.$onMultiSelect.bind(editor); + editor.$onSingleSelect = editor.$onSingleSelect.bind(editor); + editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor); + editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor); + + editor.$multiselectOnSessionChange(editor); + editor.on("changeSession", editor.$multiselectOnSessionChange); + + editor.on("mousedown", onMouseDown); + editor.commands.addCommands(commands.defaultCommands); + + addAltCursorListeners(editor); +} + +function addAltCursorListeners(editor){ + if (!editor.textInput) return; + var el = editor.textInput.getElement(); + var altCursor = false; + event.addListener(el, "keydown", function(e) { + var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey); + if (editor.$blockSelectEnabled && altDown) { + if (!altCursor) { + editor.renderer.setMouseCursor("crosshair"); + altCursor = true; + } + } else if (altCursor) { + reset(); + } + }, editor); + + event.addListener(el, "keyup", reset, editor); + event.addListener(el, "blur", reset, editor); + function reset(e) { + if (altCursor) { + editor.renderer.setMouseCursor(""); + altCursor = false; + } + } +} + +exports.MultiSelect = MultiSelect; + + +require("./config").defineOptions(Editor.prototype, "editor", { + enableMultiselect: { + set: function(val) { + MultiSelect(this); + if (val) { + this.on("changeSession", this.$multiselectOnSessionChange); + this.on("mousedown", onMouseDown); + } else { + this.off("changeSession", this.$multiselectOnSessionChange); + this.off("mousedown", onMouseDown); + } + }, + value: true + }, + enableBlockSelect: { + set: function(val) { + this.$blockSelectEnabled = val; + }, + value: true + } +}); + + + +}); + +define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; + +(function() { + + this.foldingStartMarker = null; + this.foldingStopMarker = null; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + if (this.foldingStartMarker.test(line)) + return "start"; + if (foldStyle == "markbeginend" + && this.foldingStopMarker + && this.foldingStopMarker.test(line)) + return "end"; + return ""; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + return null; + }; + + this.indentationBlock = function(session, row, column) { + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1) + return; + + var startColumn = column || line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + var level = session.getLine(row).search(re); + + if (level == -1) + continue; + + if (level <= startLevel) { + var token = session.getTokenAt(row, 0); + if (!token || token.type !== "string") + break; + } + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + + this.openingBracketBlock = function(session, bracket, row, column, typeRe) { + var start = {row: row, column: column + 1}; + var end = session.$findClosingBracket(bracket, start, typeRe); + if (!end) + return; + + var fw = session.foldWidgets[end.row]; + if (fw == null) + fw = session.getFoldWidget(end.row); + + if (fw == "start" && end.row > start.row) { + end.row --; + end.column = session.getLine(end.row).length; + } + return Range.fromPoints(start, end); + }; + + this.closingBracketBlock = function(session, bracket, row, column, typeRe) { + var end = {row: row, column: column}; + var start = session.$findOpeningBracket(bracket, end); + + if (!start) + return; + + start.column++; + end.column--; + + return Range.fromPoints(start, end); + }; +}).call(FoldMode.prototype); + +}); + +define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +exports.isDark = false; +exports.cssClass = "ace-tm"; +exports.cssText = ".ace-tm .ace_gutter {\ +background: #f0f0f0;\ +color: #333;\ +}\ +.ace-tm .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-tm .ace_fold {\ +background-color: #6B72E6;\ +}\ +.ace-tm {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-tm .ace_cursor {\ +color: black;\ +}\ +.ace-tm .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-tm .ace_storage,\ +.ace-tm .ace_keyword {\ +color: blue;\ +}\ +.ace-tm .ace_constant {\ +color: rgb(197, 6, 11);\ +}\ +.ace-tm .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-tm .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-tm .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_invalid {\ +background-color: rgba(255, 0, 0, 0.1);\ +color: red;\ +}\ +.ace-tm .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-tm .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_support.ace_type,\ +.ace-tm .ace_support.ace_class {\ +color: rgb(109, 121, 222);\ +}\ +.ace-tm .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-tm .ace_string {\ +color: rgb(3, 106, 7);\ +}\ +.ace-tm .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-tm .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-tm .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-tm .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-tm .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-tm .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-tm .ace_entity.ace_name.ace_function {\ +color: #0000A2;\ +}\ +.ace-tm .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-tm .ace_list {\ +color:rgb(185, 6, 144);\ +}\ +.ace-tm .ace_meta.ace_tag {\ +color:rgb(0, 22, 142);\ +}\ +.ace-tm .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-tm .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-tm.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px white;\ +}\ +.ace-tm .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-tm .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-tm .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-tm .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-tm .ace_gutter-active-line {\ +background-color : #dcdcdc;\ +}\ +.ace-tm .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-tm .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}\ +"; +exports.$id = "ace/theme/textmate"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); + +define("ace/line_widgets",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var dom = require("./lib/dom"); + +function LineWidgets(session) { + this.session = session; + this.session.widgetManager = this; + this.session.getRowLength = this.getRowLength; + this.session.$getWidgetScreenLength = this.$getWidgetScreenLength; + this.updateOnChange = this.updateOnChange.bind(this); + this.renderWidgets = this.renderWidgets.bind(this); + this.measureWidgets = this.measureWidgets.bind(this); + this.session._changedWidgets = []; + this.$onChangeEditor = this.$onChangeEditor.bind(this); + + this.session.on("change", this.updateOnChange); + this.session.on("changeFold", this.updateOnFold); + this.session.on("changeEditor", this.$onChangeEditor); +} + +(function() { + this.getRowLength = function(row) { + var h; + if (this.lineWidgets) + h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; + else + h = 0; + if (!this.$useWrapMode || !this.$wrapData[row]) { + return 1 + h; + } else { + return this.$wrapData[row].length + 1 + h; + } + }; + + this.$getWidgetScreenLength = function() { + var screenRows = 0; + this.lineWidgets.forEach(function(w){ + if (w && w.rowCount && !w.hidden) + screenRows += w.rowCount; + }); + return screenRows; + }; + + this.$onChangeEditor = function(e) { + this.attach(e.editor); + }; + + this.attach = function(editor) { + if (editor && editor.widgetManager && editor.widgetManager != this) + editor.widgetManager.detach(); + + if (this.editor == editor) + return; + + this.detach(); + this.editor = editor; + + if (editor) { + editor.widgetManager = this; + editor.renderer.on("beforeRender", this.measureWidgets); + editor.renderer.on("afterRender", this.renderWidgets); + } + }; + this.detach = function(e) { + var editor = this.editor; + if (!editor) + return; + + this.editor = null; + editor.widgetManager = null; + + editor.renderer.off("beforeRender", this.measureWidgets); + editor.renderer.off("afterRender", this.renderWidgets); + var lineWidgets = this.session.lineWidgets; + lineWidgets && lineWidgets.forEach(function(w) { + if (w && w.el && w.el.parentNode) { + w._inDocument = false; + w.el.parentNode.removeChild(w.el); + } + }); + }; + + this.updateOnFold = function(e, session) { + var lineWidgets = session.lineWidgets; + if (!lineWidgets || !e.action) + return; + var fold = e.data; + var start = fold.start.row; + var end = fold.end.row; + var hide = e.action == "add"; + for (var i = start + 1; i < end; i++) { + if (lineWidgets[i]) + lineWidgets[i].hidden = hide; + } + if (lineWidgets[end]) { + if (hide) { + if (!lineWidgets[start]) + lineWidgets[start] = lineWidgets[end]; + else + lineWidgets[end].hidden = hide; + } else { + if (lineWidgets[start] == lineWidgets[end]) + lineWidgets[start] = undefined; + lineWidgets[end].hidden = hide; + } + } + }; + + this.updateOnChange = function(delta) { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) return; + + var startRow = delta.start.row; + var len = delta.end.row - startRow; + + if (len === 0) { + } else if (delta.action == "remove") { + var removed = lineWidgets.splice(startRow + 1, len); + if (!lineWidgets[startRow] && removed[removed.length - 1]) { + lineWidgets[startRow] = removed.pop(); + } + removed.forEach(function(w) { + w && this.removeLineWidget(w); + }, this); + this.$updateRows(); + } else { + var args = new Array(len); + if (lineWidgets[startRow] && lineWidgets[startRow].column != null) { + if (delta.start.column > lineWidgets[startRow].column) + startRow++; + } + args.unshift(startRow, 0); + lineWidgets.splice.apply(lineWidgets, args); + this.$updateRows(); + } + }; + + this.$updateRows = function() { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) return; + var noWidgets = true; + lineWidgets.forEach(function(w, i) { + if (w) { + noWidgets = false; + w.row = i; + while (w.$oldWidget) { + w.$oldWidget.row = i; + w = w.$oldWidget; + } + } + }); + if (noWidgets) + this.session.lineWidgets = null; + }; + + this.$registerLineWidget = function(w) { + if (!this.session.lineWidgets) + this.session.lineWidgets = new Array(this.session.getLength()); + + var old = this.session.lineWidgets[w.row]; + if (old) { + w.$oldWidget = old; + if (old.el && old.el.parentNode) { + old.el.parentNode.removeChild(old.el); + old._inDocument = false; + } + } + + this.session.lineWidgets[w.row] = w; + return w; + }; + + this.addLineWidget = function(w) { + this.$registerLineWidget(w); + w.session = this.session; + + if (!this.editor) return w; + + var renderer = this.editor.renderer; + if (w.html && !w.el) { + w.el = dom.createElement("div"); + w.el.innerHTML = w.html; + } + if (w.el) { + dom.addCssClass(w.el, "ace_lineWidgetContainer"); + w.el.style.position = "absolute"; + w.el.style.zIndex = 5; + renderer.container.appendChild(w.el); + w._inDocument = true; + + if (!w.coverGutter) { + w.el.style.zIndex = 3; + } + if (w.pixelHeight == null) { + w.pixelHeight = w.el.offsetHeight; + } + } + if (w.rowCount == null) { + w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight; + } + + var fold = this.session.getFoldAt(w.row, 0); + w.$fold = fold; + if (fold) { + var lineWidgets = this.session.lineWidgets; + if (w.row == fold.end.row && !lineWidgets[fold.start.row]) + lineWidgets[fold.start.row] = w; + else + w.hidden = true; + } + + this.session._emit("changeFold", {data:{start:{row: w.row}}}); + + this.$updateRows(); + this.renderWidgets(null, renderer); + this.onWidgetChanged(w); + return w; + }; + + this.removeLineWidget = function(w) { + w._inDocument = false; + w.session = null; + if (w.el && w.el.parentNode) + w.el.parentNode.removeChild(w.el); + if (w.editor && w.editor.destroy) try { + w.editor.destroy(); + } catch(e){} + if (this.session.lineWidgets) { + var w1 = this.session.lineWidgets[w.row]; + if (w1 == w) { + this.session.lineWidgets[w.row] = w.$oldWidget; + if (w.$oldWidget) + this.onWidgetChanged(w.$oldWidget); + } else { + while (w1) { + if (w1.$oldWidget == w) { + w1.$oldWidget = w.$oldWidget; + break; + } + w1 = w1.$oldWidget; + } + } + } + this.session._emit("changeFold", {data:{start:{row: w.row}}}); + this.$updateRows(); + }; + + this.getWidgetsAtRow = function(row) { + var lineWidgets = this.session.lineWidgets; + var w = lineWidgets && lineWidgets[row]; + var list = []; + while (w) { + list.push(w); + w = w.$oldWidget; + } + return list; + }; + + this.onWidgetChanged = function(w) { + this.session._changedWidgets.push(w); + this.editor && this.editor.renderer.updateFull(); + }; + + this.measureWidgets = function(e, renderer) { + var changedWidgets = this.session._changedWidgets; + var config = renderer.layerConfig; + + if (!changedWidgets || !changedWidgets.length) return; + var min = Infinity; + for (var i = 0; i < changedWidgets.length; i++) { + var w = changedWidgets[i]; + if (!w || !w.el) continue; + if (w.session != this.session) continue; + if (!w._inDocument) { + if (this.session.lineWidgets[w.row] != w) + continue; + w._inDocument = true; + renderer.container.appendChild(w.el); + } + + w.h = w.el.offsetHeight; + + if (!w.fixedWidth) { + w.w = w.el.offsetWidth; + w.screenWidth = Math.ceil(w.w / config.characterWidth); + } + + var rowCount = w.h / config.lineHeight; + if (w.coverLine) { + rowCount -= this.session.getRowLineCount(w.row); + if (rowCount < 0) + rowCount = 0; + } + if (w.rowCount != rowCount) { + w.rowCount = rowCount; + if (w.row < min) + min = w.row; + } + } + if (min != Infinity) { + this.session._emit("changeFold", {data:{start:{row: min}}}); + this.session.lineWidgetWidth = null; + } + this.session._changedWidgets = []; + }; + + this.renderWidgets = function(e, renderer) { + var config = renderer.layerConfig; + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) + return; + var first = Math.min(this.firstRow, config.firstRow); + var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length); + + while (first > 0 && !lineWidgets[first]) + first--; + + this.firstRow = config.firstRow; + this.lastRow = config.lastRow; + + renderer.$cursorLayer.config = config; + for (var i = first; i <= last; i++) { + var w = lineWidgets[i]; + if (!w || !w.el) continue; + if (w.hidden) { + w.el.style.top = -100 - (w.pixelHeight || 0) + "px"; + continue; + } + if (!w._inDocument) { + w._inDocument = true; + renderer.container.appendChild(w.el); + } + var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top; + if (!w.coverLine) + top += config.lineHeight * this.session.getRowLineCount(w.row); + w.el.style.top = top - config.offset + "px"; + + var left = w.coverGutter ? 0 : renderer.gutterWidth; + if (!w.fixedWidth) + left -= renderer.scrollLeft; + w.el.style.left = left + "px"; + + if (w.fullWidth && w.screenWidth) { + w.el.style.minWidth = config.width + 2 * config.padding + "px"; + } + + if (w.fixedWidth) { + w.el.style.right = renderer.scrollBar.getWidth() + "px"; + } else { + w.el.style.right = ""; + } + } + }; + +}).call(LineWidgets.prototype); + + +exports.LineWidgets = LineWidgets; + +}); + +define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"], function(require, exports, module) { +"use strict"; +var LineWidgets = require("../line_widgets").LineWidgets; +var dom = require("../lib/dom"); +var Range = require("../range").Range; + +function binarySearch(array, needle, comparator) { + var first = 0; + var last = array.length - 1; + + while (first <= last) { + var mid = (first + last) >> 1; + var c = comparator(needle, array[mid]); + if (c > 0) + first = mid + 1; + else if (c < 0) + last = mid - 1; + else + return mid; + } + return -(first + 1); +} + +function findAnnotations(session, row, dir) { + var annotations = session.getAnnotations().sort(Range.comparePoints); + if (!annotations.length) + return; + + var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints); + if (i < 0) + i = -i - 1; + + if (i >= annotations.length) + i = dir > 0 ? 0 : annotations.length - 1; + else if (i === 0 && dir < 0) + i = annotations.length - 1; + + var annotation = annotations[i]; + if (!annotation || !dir) + return; + + if (annotation.row === row) { + do { + annotation = annotations[i += dir]; + } while (annotation && annotation.row === row); + if (!annotation) + return annotations.slice(); + } + + + var matched = []; + row = annotation.row; + do { + matched[dir < 0 ? "unshift" : "push"](annotation); + annotation = annotations[i += dir]; + } while (annotation && annotation.row == row); + return matched.length && matched; +} + +exports.showErrorMarker = function(editor, dir) { + var session = editor.session; + if (!session.widgetManager) { + session.widgetManager = new LineWidgets(session); + session.widgetManager.attach(editor); + } + + var pos = editor.getCursorPosition(); + var row = pos.row; + var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) { + return w.type == "errorMarker"; + })[0]; + if (oldWidget) { + oldWidget.destroy(); + } else { + row -= dir; + } + var annotations = findAnnotations(session, row, dir); + var gutterAnno; + if (annotations) { + var annotation = annotations[0]; + pos.column = (annotation.pos && typeof annotation.column != "number" + ? annotation.pos.sc + : annotation.column) || 0; + pos.row = annotation.row; + gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row]; + } else if (oldWidget) { + return; + } else { + gutterAnno = { + text: ["Looks good!"], + className: "ace_ok" + }; + } + editor.session.unfold(pos.row); + editor.selection.moveToPosition(pos); + + var w = { + row: pos.row, + fixedWidth: true, + coverGutter: true, + el: dom.createElement("div"), + type: "errorMarker" + }; + var el = w.el.appendChild(dom.createElement("div")); + var arrow = w.el.appendChild(dom.createElement("div")); + arrow.className = "error_widget_arrow " + gutterAnno.className; + + var left = editor.renderer.$cursorLayer + .getPixelPosition(pos).left; + arrow.style.left = left + editor.renderer.gutterWidth - 5 + "px"; + + w.el.className = "error_widget_wrapper"; + el.className = "error_widget " + gutterAnno.className; + el.innerHTML = gutterAnno.text.join("
"); + + el.appendChild(dom.createElement("div")); + + var kb = function(_, hashId, keyString) { + if (hashId === 0 && (keyString === "esc" || keyString === "return")) { + w.destroy(); + return {command: "null"}; + } + }; + + w.destroy = function() { + if (editor.$mouseHandler.isMousePressed) + return; + editor.keyBinding.removeKeyboardHandler(kb); + session.widgetManager.removeLineWidget(w); + editor.off("changeSelection", w.destroy); + editor.off("changeSession", w.destroy); + editor.off("mouseup", w.destroy); + editor.off("change", w.destroy); + }; + + editor.keyBinding.addKeyboardHandler(kb); + editor.on("changeSelection", w.destroy); + editor.on("changeSession", w.destroy); + editor.on("mouseup", w.destroy); + editor.on("change", w.destroy); + + editor.session.widgetManager.addLineWidget(w); + + w.el.onmousedown = editor.focus.bind(editor); + + editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight}); +}; + + +dom.importCssString("\ + .error_widget_wrapper {\ + background: inherit;\ + color: inherit;\ + border:none\ + }\ + .error_widget {\ + border-top: solid 2px;\ + border-bottom: solid 2px;\ + margin: 5px 0;\ + padding: 10px 40px;\ + white-space: pre-wrap;\ + }\ + .error_widget.ace_error, .error_widget_arrow.ace_error{\ + border-color: #ff5a5a\ + }\ + .error_widget.ace_warning, .error_widget_arrow.ace_warning{\ + border-color: #F1D817\ + }\ + .error_widget.ace_info, .error_widget_arrow.ace_info{\ + border-color: #5a5a5a\ + }\ + .error_widget.ace_ok, .error_widget_arrow.ace_ok{\ + border-color: #5aaa5a\ + }\ + .error_widget_arrow {\ + position: absolute;\ + border: solid 5px;\ + border-top-color: transparent!important;\ + border-right-color: transparent!important;\ + border-left-color: transparent!important;\ + top: -5px;\ + }\ +", "error_marker.css", false); + +}); + +define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/range","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"], function(require, exports, module) { +"use strict"; + +require("./lib/fixoldbrowsers"); + +var dom = require("./lib/dom"); +var event = require("./lib/event"); + +var Range = require("./range").Range; +var Editor = require("./editor").Editor; +var EditSession = require("./edit_session").EditSession; +var UndoManager = require("./undomanager").UndoManager; +var Renderer = require("./virtual_renderer").VirtualRenderer; +require("./worker/worker_client"); +require("./keyboard/hash_handler"); +require("./placeholder"); +require("./multi_select"); +require("./mode/folding/fold_mode"); +require("./theme/textmate"); +require("./ext/error_marker"); + +exports.config = require("./config"); +exports.require = require; + +if (typeof define === "function") + exports.define = define; +exports.edit = function(el, options) { + if (typeof el == "string") { + var _id = el; + el = document.getElementById(_id); + if (!el) + throw new Error("ace.edit can't find div #" + _id); + } + + if (el && el.env && el.env.editor instanceof Editor) + return el.env.editor; + + var value = ""; + if (el && /input|textarea/i.test(el.tagName)) { + var oldNode = el; + value = oldNode.value; + el = dom.createElement("pre"); + oldNode.parentNode.replaceChild(el, oldNode); + } else if (el) { + value = el.textContent; + el.innerHTML = ""; + } + + var doc = exports.createEditSession(value); + + var editor = new Editor(new Renderer(el), doc, options); + + var env = { + document: doc, + editor: editor, + onResize: editor.resize.bind(editor, null) + }; + if (oldNode) env.textarea = oldNode; + event.addListener(window, "resize", env.onResize); + editor.on("destroy", function() { + event.removeListener(window, "resize", env.onResize); + env.editor.container.env = null; // prevent memory leak on old ie + }); + editor.container.env = editor.env = env; + return editor; +}; +exports.createEditSession = function(text, mode) { + var doc = new EditSession(text, mode); + doc.setUndoManager(new UndoManager()); + return doc; +}; +exports.Range = Range; +exports.Editor = Editor; +exports.EditSession = EditSession; +exports.UndoManager = UndoManager; +exports.VirtualRenderer = Renderer; +exports.version = exports.config.version; +}); (function() { + window.require(["ace/ace"], function(a) { + if (a) { + a.config.init(true); + a.define = window.define; + } + if (!window.ace) + window.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + window.ace[key] = a[key]; + window.ace["default"] = window.ace; + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = window.ace; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-beautify.js b/app/Resources/ui/js/ace/ext-beautify.js new file mode 100644 index 00000000..6c8826f3 --- /dev/null +++ b/app/Resources/ui/js/ace/ext-beautify.js @@ -0,0 +1,351 @@ +define("ace/ext/beautify",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; +var TokenIterator = require("../token_iterator").TokenIterator; + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} +exports.singletonTags = ["area", "base", "br", "col", "command", "embed", "hr", "html", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; +exports.blockTags = ["article", "aside", "blockquote", "body", "div", "dl", "fieldset", "footer", "form", "head", "header", "html", "nav", "ol", "p", "script", "section", "style", "table", "tbody", "tfoot", "thead", "ul"]; + +exports.formatOptions = { + lineBreaksAfterCommasInCurlyBlock: true +}; + +exports.beautify = function(session) { + var iterator = new TokenIterator(session, 0, 0); + var token = iterator.getCurrentToken(); + var tabString = session.getTabString(); + var singletonTags = exports.singletonTags; + var blockTags = exports.blockTags; + var formatOptions = exports.formatOptions || {}; + var nextToken; + var breakBefore = false; + var spaceBefore = false; + var spaceAfter = false; + var code = ""; + var value = ""; + var tagName = ""; + var depth = 0; + var lastDepth = 0; + var lastIndent = 0; + var indent = 0; + var unindent = 0; + var roundDepth = 0; + var curlyDepth = 0; + var row; + var curRow = 0; + var rowsToAdd = 0; + var rowTokens = []; + var abort = false; + var i; + var indentNextLine = false; + var inTag = false; + var inCSS = false; + var inBlock = false; + var levels = {0: 0}; + var parents = []; + var caseBody = false; + + var trimNext = function() { + if (nextToken && nextToken.value && nextToken.type !== 'string.regexp') + nextToken.value = nextToken.value.replace(/^\s*/, ""); + }; + + var trimLine = function() { + var end = code.length - 1; + + while (true) { + if (end == 0) + break; + if (code[end] !== " ") + break; + + end = end - 1; + } + + code = code.slice(0, end + 1); + }; + + var trimCode = function() { + code = code.trimRight(); + breakBefore = false; + }; + + while (token !== null) { + curRow = iterator.getCurrentTokenRow(); + rowTokens = iterator.$rowTokens; + nextToken = iterator.stepForward(); + + if (typeof token !== "undefined") { + value = token.value; + unindent = 0; + inCSS = (tagName === "style" || session.$modeId === "ace/mode/css"); + if (is(token, "tag-open")) { + inTag = true; + if (nextToken) + inBlock = (blockTags.indexOf(nextToken.value) !== -1); + if (value === " 0; rowsToAdd--) + code += "\n"; + + breakBefore = true; + if (!is(token, "comment") && !token.type.match(/^(comment|string)$/)) + value = value.trimLeft(); + } + + if (value) { + if (token.type === "keyword" && value.match(/^(if|else|elseif|for|foreach|while|switch)$/)) { + parents[depth] = value; + + trimNext(); + spaceAfter = true; + if (value.match(/^(else|elseif)$/)) { + if (code.match(/\}[\s]*$/)) { + trimCode(); + spaceBefore = true; + } + } + } else if (token.type === "paren.lparen") { + trimNext(); + if (value.substr(-1) === "{") { + spaceAfter = true; + indentNextLine = false; + + if(!inTag) + rowsToAdd = 1; + } + if (value.substr(0, 1) === "{") { + spaceBefore = true; + if (code.substr(-1) !== '[' && code.trimRight().substr(-1) === '[') { + trimCode(); + spaceBefore = false; + } else if (code.trimRight().substr(-1) === ')') { + trimCode(); + } else { + trimLine(); + } + } + } else if (token.type === "paren.rparen") { + unindent = 1; + if (value.substr(0, 1) === "}") { + if (parents[depth-1] === 'case') + unindent++; + + if (code.trimRight().substr(-1) === '{') { + trimCode(); + } else { + spaceBefore = true; + + if (inCSS) + rowsToAdd+=2; + } + } + if (value.substr(0, 1) === "]") { + if (code.substr(-1) !== '}' && code.trimRight().substr(-1) === '}') { + spaceBefore = false; + indent++; + trimCode(); + } + } + if (value.substr(0, 1) === ")") { + if (code.substr(-1) !== '(' && code.trimRight().substr(-1) === '(') { + spaceBefore = false; + indent++; + trimCode(); + } + } + + trimLine(); + } else if ((token.type === "keyword.operator" || token.type === "keyword") && value.match(/^(=|==|===|!=|!==|&&|\|\||and|or|xor|\+=|.=|>|>=|<|<=|=>)$/)) { + trimCode(); + trimNext(); + spaceBefore = true; + spaceAfter = true; + } else if (token.type === "punctuation.operator" && value === ';') { + trimCode(); + trimNext(); + spaceAfter = true; + + if (inCSS) + rowsToAdd++; + } else if (token.type === "punctuation.operator" && value.match(/^(:|,)$/)) { + trimCode(); + trimNext(); + if (value.match(/^(,)$/) && curlyDepth>0 && roundDepth===0 && formatOptions.lineBreaksAfterCommasInCurlyBlock) { + rowsToAdd++; + } else { + spaceAfter = true; + breakBefore = false; + } + } else if (token.type === "support.php_tag" && value === "?>" && !breakBefore) { + trimCode(); + spaceBefore = true; + } else if (is(token, "attribute-name") && code.substr(-1).match(/^\s$/)) { + spaceBefore = true; + } else if (is(token, "attribute-equals")) { + trimLine(); + trimNext(); + } else if (is(token, "tag-close")) { + trimLine(); + if(value === "/>") + spaceBefore = true; + } else if (token.type === "keyword" && value.match(/^(case|default)$/)) { + if (caseBody) + unindent = 1; + } + if (breakBefore && !(token.type.match(/^(comment)$/) && !value.substr(0, 1).match(/^[/#]$/)) && !(token.type.match(/^(string)$/) && !value.substr(0, 1).match(/^['"@]$/))) { + + indent = lastIndent; + + if(depth > lastDepth) { + indent++; + + for (i=depth; i > lastDepth; i--) + levels[i] = indent; + } else if(depth < lastDepth) + indent = levels[depth]; + + lastDepth = depth; + lastIndent = indent; + + if(unindent) + indent -= unindent; + + if (indentNextLine && !roundDepth) { + indent++; + indentNextLine = false; + } + + for (i = 0; i < indent; i++) + code += tabString; + } + + if (token.type === "keyword" && value.match(/^(case|default)$/)) { + if (caseBody === false) { + parents[depth] = value; + depth++; + caseBody = true; + } + } else if (token.type === "keyword" && value.match(/^(break)$/)) { + if(parents[depth-1] && parents[depth-1].match(/^(case|default)$/)) { + depth--; + caseBody = false; + } + } + if (token.type === "paren.lparen") { + roundDepth += (value.match(/\(/g) || []).length; + curlyDepth += (value.match(/\{/g) || []).length; + depth += value.length; + } + + if (token.type === "keyword" && value.match(/^(if|else|elseif|for|while)$/)) { + indentNextLine = true; + roundDepth = 0; + } else if (!roundDepth && value.trim() && token.type !== "comment") + indentNextLine = false; + + if (token.type === "paren.rparen") { + roundDepth -= (value.match(/\)/g) || []).length; + curlyDepth -= (value.match(/\}/g) || []).length; + + for (i = 0; i < value.length; i++) { + depth--; + if(value.substr(i, 1)==='}' && parents[depth]==='case') { + depth--; + } + } + } + + if (token.type == "text") + value = value.replace(/\s+$/, " "); + if (spaceBefore && !breakBefore) { + trimLine(); + if (code.substr(-1) !== "\n") + code += " "; + } + + code += value; + + if (spaceAfter) + code += " "; + + breakBefore = false; + spaceBefore = false; + spaceAfter = false; + if ((is(token, "tag-close") && (inBlock || blockTags.indexOf(tagName) !== -1)) || (is(token, "doctype") && value === ">")) { + if (inBlock && nextToken && nextToken.value === ""){ + depth--; + } + } + + if (is(token, "tag-name")) { + tagName = value; + } + + row = curRow; + } + } + + token = nextToken; + } + + code = code.trim(); + session.doc.setValue(code); +}; + +exports.commands = [{ + name: "beautify", + description: "Format selection (Beautify)", + exec: function(editor) { + exports.beautify(editor.session); + }, + bindKey: "Ctrl-Shift-B" +}]; + +}); (function() { + window.require(["ace/ext/beautify"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-code_lens.js b/app/Resources/ui/js/ace/ext-code_lens.js new file mode 100644 index 00000000..19a4c201 --- /dev/null +++ b/app/Resources/ui/js/ace/ext-code_lens.js @@ -0,0 +1,243 @@ +define("ace/ext/code_lens",["require","exports","module","ace/line_widgets","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/editor","ace/config"], function(require, exports, module) { +"use strict"; +var LineWidgets = require("../line_widgets").LineWidgets; +var event = require("../lib/event"); +var lang = require("../lib/lang"); +var dom = require("../lib/dom"); + +function clearLensElements(renderer) { + var textLayer = renderer.$textLayer; + var lensElements = textLayer.$lenses; + if (lensElements) + lensElements.forEach(function(el) {el.remove(); }); + textLayer.$lenses = null; +} + +function renderWidgets(changes, renderer) { + var changed = changes & renderer.CHANGE_LINES + || changes & renderer.CHANGE_FULL + || changes & renderer.CHANGE_SCROLL + || changes & renderer.CHANGE_TEXT; + if (!changed) + return; + + var session = renderer.session; + var lineWidgets = renderer.session.lineWidgets; + var textLayer = renderer.$textLayer; + var lensElements = textLayer.$lenses; + if (!lineWidgets) { + if (lensElements) + clearLensElements(renderer); + return; + } + + var textCells = renderer.$textLayer.$lines.cells; + var config = renderer.layerConfig; + var padding = renderer.$padding; + + if (!lensElements) + lensElements = textLayer.$lenses = []; + + + var index = 0; + for (var i = 0; i < textCells.length; i++) { + var row = textCells[i].row; + var widget = lineWidgets[row]; + var lenses = widget && widget.lenses; + + if (!lenses || !lenses.length) continue; + + var lensContainer = lensElements[index]; + if (!lensContainer) { + lensContainer = lensElements[index] + = dom.buildDom(["div", {class: "ace_codeLens"}], renderer.container); + } + lensContainer.style.height = config.lineHeight + "px"; + index++; + + for (var j = 0; j < lenses.length; j++) { + var el = lensContainer.childNodes[2 * j]; + if (!el) { + if (j != 0) lensContainer.appendChild(dom.createTextNode("\xa0|\xa0")); + el = dom.buildDom(["a"], lensContainer); + } + el.textContent = lenses[j].title; + el.lensCommand = lenses[j]; + } + while (lensContainer.childNodes.length > 2 * j - 1) + lensContainer.lastChild.remove(); + + var top = renderer.$cursorLayer.getPixelPosition({ + row: row, + column: 0 + }, true).top - config.lineHeight * widget.rowsAbove - config.offset; + lensContainer.style.top = top + "px"; + + var left = renderer.gutterWidth; + var indent = session.getLine(row).search(/\S|$/); + if (indent == -1) + indent = 0; + left += indent * config.characterWidth; + lensContainer.style.paddingLeft = padding + left + "px"; + } + while (index < lensElements.length) + lensElements.pop().remove(); +} + +function clearCodeLensWidgets(session) { + if (!session.lineWidgets) return; + var widgetManager = session.widgetManager; + session.lineWidgets.forEach(function(widget) { + if (widget && widget.lenses) + widgetManager.removeLineWidget(widget); + }); +} + +exports.setLenses = function(session, lenses) { + var firstRow = Number.MAX_VALUE; + + clearCodeLensWidgets(session); + lenses && lenses.forEach(function(lens) { + var row = lens.start.row; + var column = lens.start.column; + var widget = session.lineWidgets && session.lineWidgets[row]; + if (!widget || !widget.lenses) { + widget = session.widgetManager.$registerLineWidget({ + rowCount: 1, + rowsAbove: 1, + row: row, + column: column, + lenses: [] + }); + } + widget.lenses.push(lens.command); + if (row < firstRow) + firstRow = row; + }); + session._emit("changeFold", {data: {start: {row: firstRow}}}); + return firstRow; +}; + +function attachToEditor(editor) { + editor.codeLensProviders = []; + editor.renderer.on("afterRender", renderWidgets); + if (!editor.$codeLensClickHandler) { + editor.$codeLensClickHandler = function(e) { + var command = e.target.lensCommand; + if (!command) return; + editor.execCommand(command.id, command.arguments); + editor._emit("codeLensClick", e); + }; + event.addListener(editor.container, "click", editor.$codeLensClickHandler, editor); + } + editor.$updateLenses = function() { + var session = editor.session; + if (!session) return; + + if (!session.widgetManager) { + session.widgetManager = new LineWidgets(session); + session.widgetManager.attach(editor); + } + + var providersToWaitNum = editor.codeLensProviders.length; + var lenses = []; + editor.codeLensProviders.forEach(function(provider) { + provider.provideCodeLenses(session, function(err, payload) { + if (err) return; + payload.forEach(function(lens) { + lenses.push(lens); + }); + providersToWaitNum--; + if (providersToWaitNum == 0) { + applyLenses(); + } + }); + }); + + function applyLenses() { + var cursor = session.selection.cursor; + var oldRow = session.documentToScreenRow(cursor); + var scrollTop = session.getScrollTop(); + var firstRow = exports.setLenses(session, lenses); + + var lastDelta = session.$undoManager && session.$undoManager.$lastDelta; + if (lastDelta && lastDelta.action == "remove" && lastDelta.lines.length > 1) + return; + var row = session.documentToScreenRow(cursor); + var lineHeight = editor.renderer.layerConfig.lineHeight; + var top = session.getScrollTop() + (row - oldRow) * lineHeight; + if (firstRow == 0 && scrollTop < lineHeight /4 && scrollTop > -lineHeight/4) { + top = -lineHeight; + } + session.setScrollTop(top); + } + }; + var updateLenses = lang.delayedCall(editor.$updateLenses); + editor.$updateLensesOnInput = function() { + updateLenses.delay(250); + }; + editor.on("input", editor.$updateLensesOnInput); +} + +function detachFromEditor(editor) { + editor.off("input", editor.$updateLensesOnInput); + editor.renderer.off("afterRender", renderWidgets); + if (editor.$codeLensClickHandler) + editor.container.removeEventListener("click", editor.$codeLensClickHandler); +} + +exports.registerCodeLensProvider = function(editor, codeLensProvider) { + editor.setOption("enableCodeLens", true); + editor.codeLensProviders.push(codeLensProvider); + editor.$updateLensesOnInput(); +}; + +exports.clear = function(session) { + exports.setLenses(session, null); +}; + +var Editor = require("../editor").Editor; +require("../config").defineOptions(Editor.prototype, "editor", { + enableCodeLens: { + set: function(val) { + if (val) { + attachToEditor(this); + } else { + detachFromEditor(this); + } + } + } +}); + +dom.importCssString("\ +.ace_codeLens {\ + position: absolute;\ + color: #aaa;\ + font-size: 88%;\ + background: inherit;\ + width: 100%;\ + display: flex;\ + align-items: flex-end;\ + pointer-events: none;\ +}\ +.ace_codeLens > a {\ + cursor: pointer;\ + pointer-events: auto;\ +}\ +.ace_codeLens > a:hover {\ + color: #0000ff;\ + text-decoration: underline;\ +}\ +.ace_dark > .ace_codeLens > a:hover {\ + color: #4e94ce;\ +}\ +", "codelense.css", false); + +}); (function() { + window.require(["ace/ext/code_lens"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-elastic_tabstops_lite.js b/app/Resources/ui/js/ace/ext-elastic_tabstops_lite.js new file mode 100644 index 00000000..855666ac --- /dev/null +++ b/app/Resources/ui/js/ace/ext-elastic_tabstops_lite.js @@ -0,0 +1,277 @@ +define("ace/ext/elastic_tabstops_lite",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) { +"use strict"; + +var ElasticTabstopsLite = function(editor) { + this.$editor = editor; + var self = this; + var changedRows = []; + var recordChanges = false; + this.onAfterExec = function() { + recordChanges = false; + self.processRows(changedRows); + changedRows = []; + }; + this.onExec = function() { + recordChanges = true; + }; + this.onChange = function(delta) { + if (recordChanges) { + if (changedRows.indexOf(delta.start.row) == -1) + changedRows.push(delta.start.row); + if (delta.end.row != delta.start.row) + changedRows.push(delta.end.row); + } + }; +}; + +(function() { + this.processRows = function(rows) { + this.$inChange = true; + var checkedRows = []; + + for (var r = 0, rowCount = rows.length; r < rowCount; r++) { + var row = rows[r]; + + if (checkedRows.indexOf(row) > -1) + continue; + + var cellWidthObj = this.$findCellWidthsForBlock(row); + var cellWidths = this.$setBlockCellWidthsToMax(cellWidthObj.cellWidths); + var rowIndex = cellWidthObj.firstRow; + + for (var w = 0, l = cellWidths.length; w < l; w++) { + var widths = cellWidths[w]; + checkedRows.push(rowIndex); + this.$adjustRow(rowIndex, widths); + rowIndex++; + } + } + this.$inChange = false; + }; + + this.$findCellWidthsForBlock = function(row) { + var cellWidths = [], widths; + var rowIter = row; + while (rowIter >= 0) { + widths = this.$cellWidthsForRow(rowIter); + if (widths.length == 0) + break; + + cellWidths.unshift(widths); + rowIter--; + } + var firstRow = rowIter + 1; + rowIter = row; + var numRows = this.$editor.session.getLength(); + + while (rowIter < numRows - 1) { + rowIter++; + + widths = this.$cellWidthsForRow(rowIter); + if (widths.length == 0) + break; + + cellWidths.push(widths); + } + + return { cellWidths: cellWidths, firstRow: firstRow }; + }; + + this.$cellWidthsForRow = function(row) { + var selectionColumns = this.$selectionColumnsForRow(row); + + var tabs = [-1].concat(this.$tabsForRow(row)); + var widths = tabs.map(function(el) { return 0; } ).slice(1); + var line = this.$editor.session.getLine(row); + + for (var i = 0, len = tabs.length - 1; i < len; i++) { + var leftEdge = tabs[i]+1; + var rightEdge = tabs[i+1]; + + var rightmostSelection = this.$rightmostSelectionInCell(selectionColumns, rightEdge); + var cell = line.substring(leftEdge, rightEdge); + widths[i] = Math.max(cell.replace(/\s+$/g,'').length, rightmostSelection - leftEdge); + } + + return widths; + }; + + this.$selectionColumnsForRow = function(row) { + var selections = [], cursor = this.$editor.getCursorPosition(); + if (this.$editor.session.getSelection().isEmpty()) { + if (row == cursor.row) + selections.push(cursor.column); + } + + return selections; + }; + + this.$setBlockCellWidthsToMax = function(cellWidths) { + var startingNewBlock = true, blockStartRow, blockEndRow, maxWidth; + var columnInfo = this.$izip_longest(cellWidths); + + for (var c = 0, l = columnInfo.length; c < l; c++) { + var column = columnInfo[c]; + if (!column.push) { + console.error(column); + continue; + } + column.push(NaN); + + for (var r = 0, s = column.length; r < s; r++) { + var width = column[r]; + if (startingNewBlock) { + blockStartRow = r; + maxWidth = 0; + startingNewBlock = false; + } + if (isNaN(width)) { + blockEndRow = r; + + for (var j = blockStartRow; j < blockEndRow; j++) { + cellWidths[j][c] = maxWidth; + } + startingNewBlock = true; + } + + maxWidth = Math.max(maxWidth, width); + } + } + + return cellWidths; + }; + + this.$rightmostSelectionInCell = function(selectionColumns, cellRightEdge) { + var rightmost = 0; + + if (selectionColumns.length) { + var lengths = []; + for (var s = 0, length = selectionColumns.length; s < length; s++) { + if (selectionColumns[s] <= cellRightEdge) + lengths.push(s); + else + lengths.push(0); + } + rightmost = Math.max.apply(Math, lengths); + } + + return rightmost; + }; + + this.$tabsForRow = function(row) { + var rowTabs = [], line = this.$editor.session.getLine(row), + re = /\t/g, match; + + while ((match = re.exec(line)) != null) { + rowTabs.push(match.index); + } + + return rowTabs; + }; + + this.$adjustRow = function(row, widths) { + var rowTabs = this.$tabsForRow(row); + + if (rowTabs.length == 0) + return; + + var bias = 0, location = -1; + var expandedSet = this.$izip(widths, rowTabs); + + for (var i = 0, l = expandedSet.length; i < l; i++) { + var w = expandedSet[i][0], it = expandedSet[i][1]; + location += 1 + w; + it += bias; + var difference = location - it; + + if (difference == 0) + continue; + + var partialLine = this.$editor.session.getLine(row).substr(0, it ); + var strippedPartialLine = partialLine.replace(/\s*$/g, ""); + var ispaces = partialLine.length - strippedPartialLine.length; + + if (difference > 0) { + this.$editor.session.getDocument().insertInLine({row: row, column: it + 1}, Array(difference + 1).join(" ") + "\t"); + this.$editor.session.getDocument().removeInLine(row, it, it + 1); + + bias += difference; + } + + if (difference < 0 && ispaces >= -difference) { + this.$editor.session.getDocument().removeInLine(row, it + difference, it); + bias += difference; + } + } + }; + this.$izip_longest = function(iterables) { + if (!iterables[0]) + return []; + var longest = iterables[0].length; + var iterablesLength = iterables.length; + + for (var i = 1; i < iterablesLength; i++) { + var iLength = iterables[i].length; + if (iLength > longest) + longest = iLength; + } + + var expandedSet = []; + + for (var l = 0; l < longest; l++) { + var set = []; + for (var i = 0; i < iterablesLength; i++) { + if (iterables[i][l] === "") + set.push(NaN); + else + set.push(iterables[i][l]); + } + + expandedSet.push(set); + } + + + return expandedSet; + }; + this.$izip = function(widths, tabs) { + var size = widths.length >= tabs.length ? tabs.length : widths.length; + + var expandedSet = []; + for (var i = 0; i < size; i++) { + var set = [ widths[i], tabs[i] ]; + expandedSet.push(set); + } + return expandedSet; + }; + +}).call(ElasticTabstopsLite.prototype); + +exports.ElasticTabstopsLite = ElasticTabstopsLite; + +var Editor = require("../editor").Editor; +require("../config").defineOptions(Editor.prototype, "editor", { + useElasticTabstops: { + set: function(val) { + if (val) { + if (!this.elasticTabstops) + this.elasticTabstops = new ElasticTabstopsLite(this); + this.commands.on("afterExec", this.elasticTabstops.onAfterExec); + this.commands.on("exec", this.elasticTabstops.onExec); + this.on("change", this.elasticTabstops.onChange); + } else if (this.elasticTabstops) { + this.commands.removeListener("afterExec", this.elasticTabstops.onAfterExec); + this.commands.removeListener("exec", this.elasticTabstops.onExec); + this.removeListener("change", this.elasticTabstops.onChange); + } + } + } +}); + +}); (function() { + window.require(["ace/ext/elastic_tabstops_lite"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-emmet.js b/app/Resources/ui/js/ace/ext-emmet.js new file mode 100644 index 00000000..68fc0ff1 --- /dev/null +++ b/app/Resources/ui/js/ace/ext-emmet.js @@ -0,0 +1,1331 @@ +define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module) { +"use strict"; +var dom = require("./lib/dom"); +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var lang = require("./lib/lang"); +var Range = require("./range").Range; +var RangeList = require("./range_list").RangeList; +var HashHandler = require("./keyboard/hash_handler").HashHandler; +var Tokenizer = require("./tokenizer").Tokenizer; +var clipboard = require("./clipboard"); + +var VARIABLES = { + CURRENT_WORD: function(editor) { + return editor.session.getTextRange(editor.session.getWordRange()); + }, + SELECTION: function(editor, name, indentation) { + var text = editor.session.getTextRange(); + if (indentation) + return text.replace(/\n\r?([ \t]*\S)/g, "\n" + indentation + "$1"); + return text; + }, + CURRENT_LINE: function(editor) { + return editor.session.getLine(editor.getCursorPosition().row); + }, + PREV_LINE: function(editor) { + return editor.session.getLine(editor.getCursorPosition().row - 1); + }, + LINE_INDEX: function(editor) { + return editor.getCursorPosition().row; + }, + LINE_NUMBER: function(editor) { + return editor.getCursorPosition().row + 1; + }, + SOFT_TABS: function(editor) { + return editor.session.getUseSoftTabs() ? "YES" : "NO"; + }, + TAB_SIZE: function(editor) { + return editor.session.getTabSize(); + }, + CLIPBOARD: function(editor) { + return clipboard.getText && clipboard.getText(); + }, + FILENAME: function(editor) { + return /[^/\\]*$/.exec(this.FILEPATH(editor))[0]; + }, + FILENAME_BASE: function(editor) { + return /[^/\\]*$/.exec(this.FILEPATH(editor))[0].replace(/\.[^.]*$/, ""); + }, + DIRECTORY: function(editor) { + return this.FILEPATH(editor).replace(/[^/\\]*$/, ""); + }, + FILEPATH: function(editor) { return "/not implemented.txt"; }, + WORKSPACE_NAME: function() { return "Unknown"; }, + FULLNAME: function() { return "Unknown"; }, + BLOCK_COMMENT_START: function(editor) { + var mode = editor.session.$mode || {}; + return mode.blockComment && mode.blockComment.start || ""; + }, + BLOCK_COMMENT_END: function(editor) { + var mode = editor.session.$mode || {}; + return mode.blockComment && mode.blockComment.end || ""; + }, + LINE_COMMENT: function(editor) { + var mode = editor.session.$mode || {}; + return mode.lineCommentStart || ""; + }, + CURRENT_YEAR: date.bind(null, {year: "numeric"}), + CURRENT_YEAR_SHORT: date.bind(null, {year: "2-digit"}), + CURRENT_MONTH: date.bind(null, {month: "numeric"}), + CURRENT_MONTH_NAME: date.bind(null, {month: "long"}), + CURRENT_MONTH_NAME_SHORT: date.bind(null, {month: "short"}), + CURRENT_DATE: date.bind(null, {day: "2-digit"}), + CURRENT_DAY_NAME: date.bind(null, {weekday: "long"}), + CURRENT_DAY_NAME_SHORT: date.bind(null, {weekday: "short"}), + CURRENT_HOUR: date.bind(null, {hour: "2-digit", hour12: false}), + CURRENT_MINUTE: date.bind(null, {minute: "2-digit"}), + CURRENT_SECOND: date.bind(null, {second: "2-digit"}) +}; + +VARIABLES.SELECTED_TEXT = VARIABLES.SELECTION; + +function date(dateFormat) { + var str = new Date().toLocaleString("en-us", dateFormat); + return str.length == 1 ? "0" + str : str; +} + +var SnippetManager = function() { + this.snippetMap = {}; + this.snippetNameMap = {}; +}; + +(function() { + oop.implement(this, EventEmitter); + + this.getTokenizer = function() { + return SnippetManager.$tokenizer || this.createTokenizer(); + }; + + this.createTokenizer = function() { + function TabstopToken(str) { + str = str.substr(1); + if (/^\d+$/.test(str)) + return [{tabstopId: parseInt(str, 10)}]; + return [{text: str}]; + } + function escape(ch) { + return "(?:[^\\\\" + ch + "]|\\\\.)"; + } + var formatMatcher = { + regex: "/(" + escape("/") + "+)/", + onMatch: function(val, state, stack) { + var ts = stack[0]; + ts.fmtString = true; + ts.guard = val.slice(1, -1); + ts.flag = ""; + return ""; + }, + next: "formatString" + }; + + SnippetManager.$tokenizer = new Tokenizer({ + start: [ + {regex: /\\./, onMatch: function(val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) { + val = ch; + } else if ("`$\\".indexOf(ch) != -1) { + val = ch; + } + return [val]; + }}, + {regex: /}/, onMatch: function(val, state, stack) { + return [stack.length ? stack.shift() : val]; + }}, + {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken}, + {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) { + var t = TabstopToken(str.substr(1)); + stack.unshift(t[0]); + return t; + }, next: "snippetVar"}, + {regex: /\n/, token: "newline", merge: false} + ], + snippetVar: [ + {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) { + var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function(operator) { + return operator.length == 2 ? operator[1] : "\x00"; + }).split("\x00").map(function(value){ + return {value: value}; + }); + stack[0].choices = choices; + return [choices[0]]; + }, next: "start"}, + formatMatcher, + {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"} + ], + formatString: [ + {regex: /:/, onMatch: function(val, state, stack) { + if (stack.length && stack[0].expectElse) { + stack[0].expectElse = false; + stack[0].ifEnd = {elseEnd: stack[0]}; + return [stack[0].ifEnd]; + } + return ":"; + }}, + {regex: /\\./, onMatch: function(val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) + val = ch; + else if ("`$\\".indexOf(ch) != -1) + val = ch; + else if (ch == "n") + val = "\n"; + else if (ch == "t") + val = "\t"; + else if ("ulULE".indexOf(ch) != -1) + val = {changeCase: ch, local: ch > "a"}; + return [val]; + }}, + {regex: "/\\w*}", onMatch: function(val, state, stack) { + var next = stack.shift(); + if (next) + next.flag = val.slice(1, -1); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start"}, + {regex: /\$(?:\d+|\w+)/, onMatch: function(val, state, stack) { + return [{text: val.slice(1)}]; + }}, + {regex: /\${\w+/, onMatch: function(val, state, stack) { + var token = {text: val.slice(2)}; + stack.unshift(token); + return [token]; + }, next: "formatStringVar"}, + {regex: /\n/, token: "newline", merge: false}, + {regex: /}/, onMatch: function(val, state, stack) { + var next = stack.shift(); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start"} + ], + formatStringVar: [ + {regex: /:\/\w+}/, onMatch: function(val, state, stack) { + var ts = stack[0]; + ts.formatFunction = val.slice(2, -1); + return [stack.shift()]; + }, next: "formatString"}, + formatMatcher, + {regex: /:[\?\-+]?/, onMatch: function(val, state, stack) { + if (val[1] == "+") + stack[0].ifEnd = stack[0]; + if (val[1] == "?") + stack[0].expectElse = true; + }, next: "formatString"}, + {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString"} + ] + }); + return SnippetManager.$tokenizer; + }; + + this.tokenizeTmSnippet = function(str, startState) { + return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) { + return x.value || x; + }); + }; + + this.getVariableValue = function(editor, name, indentation) { + if (/^\d+$/.test(name)) + return (this.variables.__ || {})[name] || ""; + if (/^[A-Z]\d+$/.test(name)) + return (this.variables[name[0] + "__"] || {})[name.substr(1)] || ""; + + name = name.replace(/^TM_/, ""); + if (!this.variables.hasOwnProperty(name)) + return ""; + var value = this.variables[name]; + if (typeof value == "function") + value = this.variables[name](editor, name, indentation); + return value == null ? "" : value; + }; + + this.variables = VARIABLES; + this.tmStrFormat = function(str, ch, editor) { + if (!ch.fmt) return str; + var flag = ch.flag || ""; + var re = ch.guard; + re = new RegExp(re, flag.replace(/[^gim]/g, "")); + var fmtTokens = typeof ch.fmt == "string" ? this.tokenizeTmSnippet(ch.fmt, "formatString") : ch.fmt; + var _self = this; + var formatted = str.replace(re, function() { + var oldArgs = _self.variables.__; + _self.variables.__ = [].slice.call(arguments); + var fmtParts = _self.resolveVariables(fmtTokens, editor); + var gChangeCase = "E"; + for (var i = 0; i < fmtParts.length; i++) { + var ch = fmtParts[i]; + if (typeof ch == "object") { + fmtParts[i] = ""; + if (ch.changeCase && ch.local) { + var next = fmtParts[i + 1]; + if (next && typeof next == "string") { + if (ch.changeCase == "u") + fmtParts[i] = next[0].toUpperCase(); + else + fmtParts[i] = next[0].toLowerCase(); + fmtParts[i + 1] = next.substr(1); + } + } else if (ch.changeCase) { + gChangeCase = ch.changeCase; + } + } else if (gChangeCase == "U") { + fmtParts[i] = ch.toUpperCase(); + } else if (gChangeCase == "L") { + fmtParts[i] = ch.toLowerCase(); + } + } + _self.variables.__ = oldArgs; + return fmtParts.join(""); + }); + return formatted; + }; + + this.tmFormatFunction = function(str, ch, editor) { + if (ch.formatFunction == "upcase") + return str.toUpperCase(); + if (ch.formatFunction == "downcase") + return str.toLowerCase(); + return str; + }; + + this.resolveVariables = function(snippet, editor) { + var result = []; + var indentation = ""; + var afterNewLine = true; + for (var i = 0; i < snippet.length; i++) { + var ch = snippet[i]; + if (typeof ch == "string") { + result.push(ch); + if (ch == "\n") { + afterNewLine = true; + indentation = ""; + } + else if (afterNewLine) { + indentation = /^\t*/.exec(ch)[0]; + afterNewLine = /\S/.test(ch); + } + continue; + } + if (!ch) continue; + afterNewLine = false; + + if (ch.fmtString) { + var j = snippet.indexOf(ch, i + 1); + if (j == -1) j = snippet.length; + ch.fmt = snippet.slice(i + 1, j); + i = j; + } + + if (ch.text) { + var value = this.getVariableValue(editor, ch.text, indentation) + ""; + if (ch.fmtString) + value = this.tmStrFormat(value, ch, editor); + if (ch.formatFunction) + value = this.tmFormatFunction(value, ch, editor); + + if (value && !ch.ifEnd) { + result.push(value); + gotoNext(ch); + } else if (!value && ch.ifEnd) { + gotoNext(ch.ifEnd); + } + } else if (ch.elseEnd) { + gotoNext(ch.elseEnd); + } else if (ch.tabstopId != null) { + result.push(ch); + } else if (ch.changeCase != null) { + result.push(ch); + } + } + function gotoNext(ch) { + var i1 = snippet.indexOf(ch, i + 1); + if (i1 != -1) + i = i1; + } + return result; + }; + + this.insertSnippetForSelection = function(editor, snippetText) { + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var tabString = editor.session.getTabString(); + var indentString = line.match(/^\s*/)[0]; + + if (cursor.column < indentString.length) + indentString = indentString.slice(0, cursor.column); + + snippetText = snippetText.replace(/\r/g, ""); + var tokens = this.tokenizeTmSnippet(snippetText); + tokens = this.resolveVariables(tokens, editor); + tokens = tokens.map(function(x) { + if (x == "\n") + return x + indentString; + if (typeof x == "string") + return x.replace(/\t/g, tabString); + return x; + }); + var tabstops = []; + tokens.forEach(function(p, i) { + if (typeof p != "object") + return; + var id = p.tabstopId; + var ts = tabstops[id]; + if (!ts) { + ts = tabstops[id] = []; + ts.index = id; + ts.value = ""; + ts.parents = {}; + } + if (ts.indexOf(p) !== -1) + return; + if (p.choices && !ts.choices) + ts.choices = p.choices; + ts.push(p); + var i1 = tokens.indexOf(p, i + 1); + if (i1 === -1) + return; + + var value = tokens.slice(i + 1, i1); + var isNested = value.some(function(t) {return typeof t === "object";}); + if (isNested && !ts.value) { + ts.value = value; + } else if (value.length && (!ts.value || typeof ts.value !== "string")) { + ts.value = value.join(""); + } + }); + tabstops.forEach(function(ts) {ts.length = 0;}); + var expanding = {}; + function copyValue(val) { + var copy = []; + for (var i = 0; i < val.length; i++) { + var p = val[i]; + if (typeof p == "object") { + if (expanding[p.tabstopId]) + continue; + var j = val.lastIndexOf(p, i - 1); + p = copy[j] || {tabstopId: p.tabstopId}; + } + copy[i] = p; + } + return copy; + } + for (var i = 0; i < tokens.length; i++) { + var p = tokens[i]; + if (typeof p != "object") + continue; + var id = p.tabstopId; + var ts = tabstops[id]; + var i1 = tokens.indexOf(p, i + 1); + if (expanding[id]) { + if (expanding[id] === p) { + delete expanding[id]; + Object.keys(expanding).forEach(function(parentId) { + ts.parents[parentId] = true; + }); + } + continue; + } + expanding[id] = p; + var value = ts.value; + if (typeof value !== "string") + value = copyValue(value); + else if (p.fmt) + value = this.tmStrFormat(value, p, editor); + tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); + + if (ts.indexOf(p) === -1) + ts.push(p); + } + var row = 0, column = 0; + var text = ""; + tokens.forEach(function(t) { + if (typeof t === "string") { + var lines = t.split("\n"); + if (lines.length > 1){ + column = lines[lines.length - 1].length; + row += lines.length - 1; + } else + column += t.length; + text += t; + } else if (t) { + if (!t.start) + t.start = {row: row, column: column}; + else + t.end = {row: row, column: column}; + } + }); + var range = editor.getSelectionRange(); + var end = editor.session.replace(range, text); + + var tabstopManager = new TabstopManager(editor); + var selectionId = editor.inVirtualSelectionMode && editor.selection.index; + tabstopManager.addTabstops(tabstops, range.start, end, selectionId); + }; + + this.insertSnippet = function(editor, snippetText) { + var self = this; + if (editor.inVirtualSelectionMode) + return self.insertSnippetForSelection(editor, snippetText); + + editor.forEachSelection(function() { + self.insertSnippetForSelection(editor, snippetText); + }, null, {keepOrder: true}); + + if (editor.tabstopManager) + editor.tabstopManager.tabNext(); + }; + + this.$getScope = function(editor) { + var scope = editor.session.$mode.$id || ""; + scope = scope.split("/").pop(); + if (scope === "html" || scope === "php") { + if (scope === "php" && !editor.session.$mode.inlinePhp) + scope = "html"; + var c = editor.getCursorPosition(); + var state = editor.session.getState(c.row); + if (typeof state === "object") { + state = state[0]; + } + if (state.substring) { + if (state.substring(0, 3) == "js-") + scope = "javascript"; + else if (state.substring(0, 4) == "css-") + scope = "css"; + else if (state.substring(0, 4) == "php-") + scope = "php"; + } + } + + return scope; + }; + + this.getActiveScopes = function(editor) { + var scope = this.$getScope(editor); + var scopes = [scope]; + var snippetMap = this.snippetMap; + if (snippetMap[scope] && snippetMap[scope].includeScopes) { + scopes.push.apply(scopes, snippetMap[scope].includeScopes); + } + scopes.push("_"); + return scopes; + }; + + this.expandWithTab = function(editor, options) { + var self = this; + var result = editor.forEachSelection(function() { + return self.expandSnippetForSelection(editor, options); + }, null, {keepOrder: true}); + if (result && editor.tabstopManager) + editor.tabstopManager.tabNext(); + return result; + }; + + this.expandSnippetForSelection = function(editor, options) { + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var before = line.substring(0, cursor.column); + var after = line.substr(cursor.column); + + var snippetMap = this.snippetMap; + var snippet; + this.getActiveScopes(editor).some(function(scope) { + var snippets = snippetMap[scope]; + if (snippets) + snippet = this.findMatchingSnippet(snippets, before, after); + return !!snippet; + }, this); + if (!snippet) + return false; + if (options && options.dryRun) + return true; + editor.session.doc.removeInLine(cursor.row, + cursor.column - snippet.replaceBefore.length, + cursor.column + snippet.replaceAfter.length + ); + + this.variables.M__ = snippet.matchBefore; + this.variables.T__ = snippet.matchAfter; + this.insertSnippetForSelection(editor, snippet.content); + + this.variables.M__ = this.variables.T__ = null; + return true; + }; + + this.findMatchingSnippet = function(snippetList, before, after) { + for (var i = snippetList.length; i--;) { + var s = snippetList[i]; + if (s.startRe && !s.startRe.test(before)) + continue; + if (s.endRe && !s.endRe.test(after)) + continue; + if (!s.startRe && !s.endRe) + continue; + + s.matchBefore = s.startRe ? s.startRe.exec(before) : [""]; + s.matchAfter = s.endRe ? s.endRe.exec(after) : [""]; + s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : ""; + s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : ""; + return s; + } + }; + + this.snippetMap = {}; + this.snippetNameMap = {}; + this.register = function(snippets, scope) { + var snippetMap = this.snippetMap; + var snippetNameMap = this.snippetNameMap; + var self = this; + + if (!snippets) + snippets = []; + + function wrapRegexp(src) { + if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) + src = "(?:" + src + ")"; + + return src || ""; + } + function guardedRegexp(re, guard, opening) { + re = wrapRegexp(re); + guard = wrapRegexp(guard); + if (opening) { + re = guard + re; + if (re && re[re.length - 1] != "$") + re = re + "$"; + } else { + re = re + guard; + if (re && re[0] != "^") + re = "^" + re; + } + return new RegExp(re); + } + + function addSnippet(s) { + if (!s.scope) + s.scope = scope || "_"; + scope = s.scope; + if (!snippetMap[scope]) { + snippetMap[scope] = []; + snippetNameMap[scope] = {}; + } + + var map = snippetNameMap[scope]; + if (s.name) { + var old = map[s.name]; + if (old) + self.unregister(old); + map[s.name] = s; + } + snippetMap[scope].push(s); + + if (s.prefix) + s.tabTrigger = s.prefix; + + if (!s.content && s.body) + s.content = Array.isArray(s.body) ? s.body.join("\n") : s.body; + + if (s.tabTrigger && !s.trigger) { + if (!s.guard && /^\w/.test(s.tabTrigger)) + s.guard = "\\b"; + s.trigger = lang.escapeRegExp(s.tabTrigger); + } + + if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard) + return; + + s.startRe = guardedRegexp(s.trigger, s.guard, true); + s.triggerRe = new RegExp(s.trigger); + + s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true); + s.endTriggerRe = new RegExp(s.endTrigger); + } + + if (Array.isArray(snippets)) { + snippets.forEach(addSnippet); + } else { + Object.keys(snippets).forEach(function(key) { + addSnippet(snippets[key]); + }); + } + + this._signal("registerSnippets", {scope: scope}); + }; + this.unregister = function(snippets, scope) { + var snippetMap = this.snippetMap; + var snippetNameMap = this.snippetNameMap; + + function removeSnippet(s) { + var nameMap = snippetNameMap[s.scope||scope]; + if (nameMap && nameMap[s.name]) { + delete nameMap[s.name]; + var map = snippetMap[s.scope||scope]; + var i = map && map.indexOf(s); + if (i >= 0) + map.splice(i, 1); + } + } + if (snippets.content) + removeSnippet(snippets); + else if (Array.isArray(snippets)) + snippets.forEach(removeSnippet); + }; + this.parseSnippetFile = function(str) { + str = str.replace(/\r/g, ""); + var list = [], snippet = {}; + var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; + var m; + while (m = re.exec(str)) { + if (m[1]) { + try { + snippet = JSON.parse(m[1]); + list.push(snippet); + } catch (e) {} + } if (m[4]) { + snippet.content = m[4].replace(/^\t/gm, ""); + list.push(snippet); + snippet = {}; + } else { + var key = m[2], val = m[3]; + if (key == "regex") { + var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g; + snippet.guard = guardRe.exec(val)[1]; + snippet.trigger = guardRe.exec(val)[1]; + snippet.endTrigger = guardRe.exec(val)[1]; + snippet.endGuard = guardRe.exec(val)[1]; + } else if (key == "snippet") { + snippet.tabTrigger = val.match(/^\S*/)[0]; + if (!snippet.name) + snippet.name = val; + } else if (key) { + snippet[key] = val; + } + } + } + return list; + }; + this.getSnippetByName = function(name, editor) { + var snippetMap = this.snippetNameMap; + var snippet; + this.getActiveScopes(editor).some(function(scope) { + var snippets = snippetMap[scope]; + if (snippets) + snippet = snippets[name]; + return !!snippet; + }, this); + return snippet; + }; + +}).call(SnippetManager.prototype); + + +var TabstopManager = function(editor) { + if (editor.tabstopManager) + return editor.tabstopManager; + editor.tabstopManager = this; + this.$onChange = this.onChange.bind(this); + this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; + this.$onChangeSession = this.onChangeSession.bind(this); + this.$onAfterExec = this.onAfterExec.bind(this); + this.attach(editor); +}; +(function() { + this.attach = function(editor) { + this.index = 0; + this.ranges = []; + this.tabstops = []; + this.$openTabstops = null; + this.selectedTabstop = null; + + this.editor = editor; + this.editor.on("change", this.$onChange); + this.editor.on("changeSelection", this.$onChangeSelection); + this.editor.on("changeSession", this.$onChangeSession); + this.editor.commands.on("afterExec", this.$onAfterExec); + this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + }; + this.detach = function() { + this.tabstops.forEach(this.removeTabstopMarkers, this); + this.ranges = null; + this.tabstops = null; + this.selectedTabstop = null; + this.editor.removeListener("change", this.$onChange); + this.editor.removeListener("changeSelection", this.$onChangeSelection); + this.editor.removeListener("changeSession", this.$onChangeSession); + this.editor.commands.removeListener("afterExec", this.$onAfterExec); + this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); + this.editor.tabstopManager = null; + this.editor = null; + }; + + this.onChange = function(delta) { + var isRemove = delta.action[0] == "r"; + var selectedTabstop = this.selectedTabstop || {}; + var parents = selectedTabstop.parents || {}; + var tabstops = (this.tabstops || []).slice(); + for (var i = 0; i < tabstops.length; i++) { + var ts = tabstops[i]; + var active = ts == selectedTabstop || parents[ts.index]; + ts.rangeList.$bias = active ? 0 : 1; + + if (delta.action == "remove" && ts !== selectedTabstop) { + var parentActive = ts.parents && ts.parents[selectedTabstop.index]; + var startIndex = ts.rangeList.pointIndex(delta.start, parentActive); + startIndex = startIndex < 0 ? -startIndex - 1 : startIndex + 1; + var endIndex = ts.rangeList.pointIndex(delta.end, parentActive); + endIndex = endIndex < 0 ? -endIndex - 1 : endIndex - 1; + var toRemove = ts.rangeList.ranges.slice(startIndex, endIndex); + for (var j = 0; j < toRemove.length; j++) + this.removeRange(toRemove[j]); + } + ts.rangeList.$onChange(delta); + } + var session = this.editor.session; + if (!this.$inChange && isRemove && session.getLength() == 1 && !session.getValue()) + this.detach(); + }; + this.updateLinkedFields = function() { + var ts = this.selectedTabstop; + if (!ts || !ts.hasLinkedRanges || !ts.firstNonLinked) + return; + this.$inChange = true; + var session = this.editor.session; + var text = session.getTextRange(ts.firstNonLinked); + for (var i = 0; i < ts.length; i++) { + var range = ts[i]; + if (!range.linked) + continue; + var original = range.original; + var fmt = exports.snippetManager.tmStrFormat(text, original, this.editor); + session.replace(range, fmt); + } + this.$inChange = false; + }; + this.onAfterExec = function(e) { + if (e.command && !e.command.readOnly) + this.updateLinkedFields(); + }; + this.onChangeSelection = function() { + if (!this.editor) + return; + var lead = this.editor.selection.lead; + var anchor = this.editor.selection.anchor; + var isEmpty = this.editor.selection.isEmpty(); + for (var i = 0; i < this.ranges.length; i++) { + if (this.ranges[i].linked) + continue; + var containsLead = this.ranges[i].contains(lead.row, lead.column); + var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column); + if (containsLead && containsAnchor) + return; + } + this.detach(); + }; + this.onChangeSession = function() { + this.detach(); + }; + this.tabNext = function(dir) { + var max = this.tabstops.length; + var index = this.index + (dir || 1); + index = Math.min(Math.max(index, 1), max); + if (index == max) + index = 0; + this.selectTabstop(index); + if (index === 0) + this.detach(); + }; + this.selectTabstop = function(index) { + this.$openTabstops = null; + var ts = this.tabstops[this.index]; + if (ts) + this.addTabstopMarkers(ts); + this.index = index; + ts = this.tabstops[this.index]; + if (!ts || !ts.length) + return; + + this.selectedTabstop = ts; + var range = ts.firstNonLinked || ts; + if (ts.choices) range.cursor = range.start; + if (!this.editor.inVirtualSelectionMode) { + var sel = this.editor.multiSelect; + sel.toSingleRange(range); + for (var i = 0; i < ts.length; i++) { + if (ts.hasLinkedRanges && ts[i].linked) + continue; + sel.addRange(ts[i].clone(), true); + } + } else { + this.editor.selection.fromOrientedRange(range); + } + + this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + if (this.selectedTabstop && this.selectedTabstop.choices) + this.editor.execCommand("startAutocomplete", {matches: this.selectedTabstop.choices}); + }; + this.addTabstops = function(tabstops, start, end) { + var useLink = this.useLink || !this.editor.getOption("enableMultiselect"); + + if (!this.$openTabstops) + this.$openTabstops = []; + if (!tabstops[0]) { + var p = Range.fromPoints(end, end); + moveRelative(p.start, start); + moveRelative(p.end, start); + tabstops[0] = [p]; + tabstops[0].index = 0; + } + + var i = this.index; + var arg = [i + 1, 0]; + var ranges = this.ranges; + tabstops.forEach(function(ts, index) { + var dest = this.$openTabstops[index] || ts; + + for (var i = 0; i < ts.length; i++) { + var p = ts[i]; + var range = Range.fromPoints(p.start, p.end || p.start); + movePoint(range.start, start); + movePoint(range.end, start); + range.original = p; + range.tabstop = dest; + ranges.push(range); + if (dest != ts) + dest.unshift(range); + else + dest[i] = range; + if (p.fmtString || (dest.firstNonLinked && useLink)) { + range.linked = true; + dest.hasLinkedRanges = true; + } else if (!dest.firstNonLinked) + dest.firstNonLinked = range; + } + if (!dest.firstNonLinked) + dest.hasLinkedRanges = false; + if (dest === ts) { + arg.push(dest); + this.$openTabstops[index] = dest; + } + this.addTabstopMarkers(dest); + dest.rangeList = dest.rangeList || new RangeList(); + dest.rangeList.$bias = 0; + dest.rangeList.addList(dest); + }, this); + + if (arg.length > 2) { + if (this.tabstops.length) + arg.push(arg.splice(2, 1)[0]); + this.tabstops.splice.apply(this.tabstops, arg); + } + }; + + this.addTabstopMarkers = function(ts) { + var session = this.editor.session; + ts.forEach(function(range) { + if (!range.markerId) + range.markerId = session.addMarker(range, "ace_snippet-marker", "text"); + }); + }; + this.removeTabstopMarkers = function(ts) { + var session = this.editor.session; + ts.forEach(function(range) { + session.removeMarker(range.markerId); + range.markerId = null; + }); + }; + this.removeRange = function(range) { + var i = range.tabstop.indexOf(range); + if (i != -1) range.tabstop.splice(i, 1); + i = this.ranges.indexOf(range); + if (i != -1) this.ranges.splice(i, 1); + i = range.tabstop.rangeList.ranges.indexOf(range); + if (i != -1) range.tabstop.splice(i, 1); + this.editor.session.removeMarker(range.markerId); + if (!range.tabstop.length) { + i = this.tabstops.indexOf(range.tabstop); + if (i != -1) + this.tabstops.splice(i, 1); + if (!this.tabstops.length) + this.detach(); + } + }; + + this.keyboardHandler = new HashHandler(); + this.keyboardHandler.bindKeys({ + "Tab": function(editor) { + if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) + return; + editor.tabstopManager.tabNext(1); + editor.renderer.scrollCursorIntoView(); + }, + "Shift-Tab": function(editor) { + editor.tabstopManager.tabNext(-1); + editor.renderer.scrollCursorIntoView(); + }, + "Esc": function(editor) { + editor.tabstopManager.detach(); + } + }); +}).call(TabstopManager.prototype); + + + +var movePoint = function(point, diff) { + if (point.row == 0) + point.column += diff.column; + point.row += diff.row; +}; + +var moveRelative = function(point, start) { + if (point.row == start.row) + point.column -= start.column; + point.row -= start.row; +}; + + +dom.importCssString("\ +.ace_snippet-marker {\ + -moz-box-sizing: border-box;\ + box-sizing: border-box;\ + background: rgba(194, 193, 208, 0.09);\ + border: 1px dotted rgba(211, 208, 235, 0.62);\ + position: absolute;\ +}", "snippets.css", false); + +exports.snippetManager = new SnippetManager(); + + +var Editor = require("./editor").Editor; +(function() { + this.insertSnippet = function(content, options) { + return exports.snippetManager.insertSnippet(this, content, options); + }; + this.expandSnippet = function(options) { + return exports.snippetManager.expandWithTab(this, options); + }; +}).call(Editor.prototype); + +}); + +define("ace/ext/emmet",["require","exports","module","ace/keyboard/hash_handler","ace/editor","ace/snippets","ace/range","ace/config","resources","resources","tabStops","resources","utils","actions"], function(require, exports, module) { +"use strict"; +var HashHandler = require("../keyboard/hash_handler").HashHandler; +var Editor = require("../editor").Editor; +var snippetManager = require("../snippets").snippetManager; +var Range = require("../range").Range; +var config = require("../config"); +var emmet, emmetPath; +function AceEmmetEditor() {} + +AceEmmetEditor.prototype = { + setupContext: function(editor) { + this.ace = editor; + this.indentation = editor.session.getTabString(); + if (!emmet) + emmet = window.emmet; + var resources = emmet.resources || emmet.require("resources"); + resources.setVariable("indentation", this.indentation); + this.$syntax = null; + this.$syntax = this.getSyntax(); + }, + getSelectionRange: function() { + var range = this.ace.getSelectionRange(); + var doc = this.ace.session.doc; + return { + start: doc.positionToIndex(range.start), + end: doc.positionToIndex(range.end) + }; + }, + createSelection: function(start, end) { + var doc = this.ace.session.doc; + this.ace.selection.setRange({ + start: doc.indexToPosition(start), + end: doc.indexToPosition(end) + }); + }, + getCurrentLineRange: function() { + var ace = this.ace; + var row = ace.getCursorPosition().row; + var lineLength = ace.session.getLine(row).length; + var index = ace.session.doc.positionToIndex({row: row, column: 0}); + return { + start: index, + end: index + lineLength + }; + }, + getCaretPos: function(){ + var pos = this.ace.getCursorPosition(); + return this.ace.session.doc.positionToIndex(pos); + }, + setCaretPos: function(index){ + var pos = this.ace.session.doc.indexToPosition(index); + this.ace.selection.moveToPosition(pos); + }, + getCurrentLine: function() { + var row = this.ace.getCursorPosition().row; + return this.ace.session.getLine(row); + }, + replaceContent: function(value, start, end, noIndent) { + if (end == null) + end = start == null ? this.getContent().length : start; + if (start == null) + start = 0; + + var editor = this.ace; + var doc = editor.session.doc; + var range = Range.fromPoints(doc.indexToPosition(start), doc.indexToPosition(end)); + editor.session.remove(range); + + range.end = range.start; + + value = this.$updateTabstops(value); + snippetManager.insertSnippet(editor, value); + }, + getContent: function(){ + return this.ace.getValue(); + }, + getSyntax: function() { + if (this.$syntax) + return this.$syntax; + var syntax = this.ace.session.$modeId.split("/").pop(); + if (syntax == "html" || syntax == "php") { + var cursor = this.ace.getCursorPosition(); + var state = this.ace.session.getState(cursor.row); + if (typeof state != "string") + state = state[0]; + if (state) { + state = state.split("-"); + if (state.length > 1) + syntax = state[0]; + else if (syntax == "php") + syntax = "html"; + } + } + return syntax; + }, + getProfileName: function() { + var resources = emmet.resources || emmet.require("resources"); + switch (this.getSyntax()) { + case "css": return "css"; + case "xml": + case "xsl": + return "xml"; + case "html": + var profile = resources.getVariable("profile"); + if (!profile) + profile = this.ace.session.getLines(0,2).join("").search(/]+XHTML/i) != -1 ? "xhtml": "html"; + return profile; + default: + var mode = this.ace.session.$mode; + return mode.emmetConfig && mode.emmetConfig.profile || "xhtml"; + } + }, + prompt: function(title) { + return prompt(title); // eslint-disable-line no-alert + }, + getSelection: function() { + return this.ace.session.getTextRange(); + }, + getFilePath: function() { + return ""; + }, + $updateTabstops: function(value) { + var base = 1000; + var zeroBase = 0; + var lastZero = null; + var ts = emmet.tabStops || emmet.require('tabStops'); + var resources = emmet.resources || emmet.require("resources"); + var settings = resources.getVocabulary("user"); + var tabstopOptions = { + tabstop: function(data) { + var group = parseInt(data.group, 10); + var isZero = group === 0; + if (isZero) + group = ++zeroBase; + else + group += base; + + var placeholder = data.placeholder; + if (placeholder) { + placeholder = ts.processText(placeholder, tabstopOptions); + } + + var result = '${' + group + (placeholder ? ':' + placeholder : '') + '}'; + + if (isZero) { + lastZero = [data.start, result]; + } + + return result; + }, + escape: function(ch) { + if (ch == '$') return '\\$'; + if (ch == '\\') return '\\\\'; + return ch; + } + }; + + value = ts.processText(value, tabstopOptions); + + if (settings.variables['insert_final_tabstop'] && !/\$\{0\}$/.test(value)) { + value += '${0}'; + } else if (lastZero) { + var common = emmet.utils ? emmet.utils.common : emmet.require('utils'); + value = common.replaceSubstring(value, '${0}', lastZero[0], lastZero[1]); + } + + return value; + } +}; + + +var keymap = { + expand_abbreviation: {"mac": "ctrl+alt+e", "win": "alt+e"}, + match_pair_outward: {"mac": "ctrl+d", "win": "ctrl+,"}, + match_pair_inward: {"mac": "ctrl+j", "win": "ctrl+shift+0"}, + matching_pair: {"mac": "ctrl+alt+j", "win": "alt+j"}, + next_edit_point: "alt+right", + prev_edit_point: "alt+left", + toggle_comment: {"mac": "command+/", "win": "ctrl+/"}, + split_join_tag: {"mac": "shift+command+'", "win": "shift+ctrl+`"}, + remove_tag: {"mac": "command+'", "win": "shift+ctrl+;"}, + evaluate_math_expression: {"mac": "shift+command+y", "win": "shift+ctrl+y"}, + increment_number_by_1: "ctrl+up", + decrement_number_by_1: "ctrl+down", + increment_number_by_01: "alt+up", + decrement_number_by_01: "alt+down", + increment_number_by_10: {"mac": "alt+command+up", "win": "shift+alt+up"}, + decrement_number_by_10: {"mac": "alt+command+down", "win": "shift+alt+down"}, + select_next_item: {"mac": "shift+command+.", "win": "shift+ctrl+."}, + select_previous_item: {"mac": "shift+command+,", "win": "shift+ctrl+,"}, + reflect_css_value: {"mac": "shift+command+r", "win": "shift+ctrl+r"}, + + encode_decode_data_url: {"mac": "shift+ctrl+d", "win": "ctrl+'"}, + expand_abbreviation_with_tab: "Tab", + wrap_with_abbreviation: {"mac": "shift+ctrl+a", "win": "shift+ctrl+a"} +}; + +var editorProxy = new AceEmmetEditor(); +exports.commands = new HashHandler(); +exports.runEmmetCommand = function runEmmetCommand(editor) { + if (this.action == "expand_abbreviation_with_tab") { + if (!editor.selection.isEmpty()) + return false; + var pos = editor.selection.lead; + var token = editor.session.getTokenAt(pos.row, pos.column); + if (token && /\btag\b/.test(token.type)) + return false; + } + try { + editorProxy.setupContext(editor); + var actions = emmet.actions || emmet.require("actions"); + + if (this.action == "wrap_with_abbreviation") { + return setTimeout(function() { + actions.run("wrap_with_abbreviation", editorProxy); + }, 0); + } + + var result = actions.run(this.action, editorProxy); + } catch(e) { + if (!emmet) { + var loading = exports.load(runEmmetCommand.bind(this, editor)); + if (this.action == "expand_abbreviation_with_tab") + return false; + return loading; + } + editor._signal("changeStatus", typeof e == "string" ? e : e.message); + config.warn(e); + result = false; + } + return result; +}; + +for (var command in keymap) { + exports.commands.addCommand({ + name: "emmet:" + command, + action: command, + bindKey: keymap[command], + exec: exports.runEmmetCommand, + multiSelectAction: "forEach" + }); +} + +exports.updateCommands = function(editor, enabled) { + if (enabled) { + editor.keyBinding.addKeyboardHandler(exports.commands); + } else { + editor.keyBinding.removeKeyboardHandler(exports.commands); + } +}; + +exports.isSupportedMode = function(mode) { + if (!mode) return false; + if (mode.emmetConfig) return true; + var id = mode.$id || mode; + return /css|less|scss|sass|stylus|html|php|twig|ejs|handlebars/.test(id); +}; + +exports.isAvailable = function(editor, command) { + if (/(evaluate_math_expression|expand_abbreviation)$/.test(command)) + return true; + var mode = editor.session.$mode; + var isSupported = exports.isSupportedMode(mode); + if (isSupported && mode.$modes) { + try { + editorProxy.setupContext(editor); + if (/js|php/.test(editorProxy.getSyntax())) + isSupported = false; + } catch(e) {} + } + return isSupported; +}; + +var onChangeMode = function(e, target) { + var editor = target; + if (!editor) + return; + var enabled = exports.isSupportedMode(editor.session.$mode); + if (e.enableEmmet === false) + enabled = false; + if (enabled) + exports.load(); + exports.updateCommands(editor, enabled); +}; + +exports.load = function(cb) { + if (typeof emmetPath !== "string") { + config.warn("script for emmet-core is not loaded"); + return false; + } + config.loadModule(emmetPath, function() { + emmetPath = null; + cb && cb(); + }); + return true; +}; + +exports.AceEmmetEditor = AceEmmetEditor; +config.defineOptions(Editor.prototype, "editor", { + enableEmmet: { + set: function(val) { + this[val ? "on" : "removeListener"]("changeMode", onChangeMode); + onChangeMode({enableEmmet: !!val}, this); + }, + value: true + } +}); + +exports.setCore = function(e) { + if (typeof e == "string") + emmetPath = e; + else + emmet = e; +}; +}); (function() { + window.require(["ace/ext/emmet"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-error_marker.js b/app/Resources/ui/js/ace/ext-error_marker.js new file mode 100644 index 00000000..683423d7 --- /dev/null +++ b/app/Resources/ui/js/ace/ext-error_marker.js @@ -0,0 +1,9 @@ + +; (function() { + window.require(["ace/ext/error_marker"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-hardwrap.js b/app/Resources/ui/js/ace/ext-hardwrap.js new file mode 100644 index 00000000..a2037b91 --- /dev/null +++ b/app/Resources/ui/js/ace/ext-hardwrap.js @@ -0,0 +1,125 @@ +define("ace/ext/hardwrap",["require","exports","module","ace/range","ace/editor","ace/config"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +function hardWrap(editor, options) { + var max = options.column || editor.getOption("printMarginColumn"); + var allowMerge = options.allowMerge != false; + + var row = Math.min(options.startRow, options.endRow); + var endRow = Math.max(options.startRow, options.endRow); + + var session = editor.session; + + while (row <= endRow) { + var line = session.getLine(row); + if (line.length > max) { + var space = findSpace(line, max, 5); + if (space) { + var indentation = /^\s*/.exec(line)[0]; + session.replace(new Range(row,space.start,row,space.end), "\n" + indentation); + } + endRow++; + } else if (allowMerge && /\S/.test(line) && row != endRow) { + var nextLine = session.getLine(row + 1); + if (nextLine && /\S/.test(nextLine)) { + var trimmedLine = line.replace(/\s+$/, ""); + var trimmedNextLine = nextLine.replace(/^\s+/, ""); + var mergedLine = trimmedLine + " " + trimmedNextLine; + + var space = findSpace(mergedLine, max, 5); + if (space && space.start > trimmedLine.length || mergedLine.length < max) { + var replaceRange = new Range(row,trimmedLine.length,row + 1,nextLine.length - trimmedNextLine.length); + session.replace(replaceRange, " "); + row--; + endRow--; + } else if (trimmedLine.length < line.length) { + session.remove(new Range(row, trimmedLine.length, row, line.length)); + } + } + } + row++; + } + + function findSpace(line, max, min) { + if (line.length < max) + return; + var before = line.slice(0, max); + var after = line.slice(max); + var spaceAfter = /^(?:(\s+)|(\S+)(\s+))/.exec(after); + var spaceBefore = /(?:(\s+)|(\s+)(\S+))$/.exec(before); + var start = 0; + var end = 0; + if (spaceBefore && !spaceBefore[2]) { + start = max - spaceBefore[1].length; + end = max; + } + if (spaceAfter && !spaceAfter[2]) { + if (!start) + start = max; + end = max + spaceAfter[1].length; + } + if (start) { + return { + start: start, + end: end + }; + } + if (spaceBefore && spaceBefore[2] && spaceBefore.index > min) { + return { + start: spaceBefore.index, + end: spaceBefore.index + spaceBefore[2].length + }; + } + if (spaceAfter && spaceAfter[2]) { + start = max + spaceAfter[2].length; + return { + start: start, + end: start + spaceAfter[3].length + }; + } + } + +} + +function wrapAfterInput(e) { + if (e.command.name == "insertstring" && /\S/.test(e.args)) { + var editor = e.editor; + var cursor = editor.selection.cursor; + if (cursor.column <= editor.renderer.$printMarginColumn) return; + var lastDelta = editor.session.$undoManager.$lastDelta; + + hardWrap(editor, { + startRow: cursor.row, endRow: cursor.row, + allowMerge: false + }); + if (lastDelta != editor.session.$undoManager.$lastDelta) + editor.session.markUndoGroup(); + } +} + +var Editor = require("../editor").Editor; +require("../config").defineOptions(Editor.prototype, "editor", { + hardWrap: { + set: function(val) { + if (val) { + this.commands.on("afterExec", wrapAfterInput); + } else { + this.commands.off("afterExec", wrapAfterInput); + } + }, + value: false + } +}); + +exports.hardWrap = hardWrap; + +}); (function() { + window.require(["ace/ext/hardwrap"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-keybinding_menu.js b/app/Resources/ui/js/ace/ext-keybinding_menu.js new file mode 100644 index 00000000..b9ad46ee --- /dev/null +++ b/app/Resources/ui/js/ace/ext-keybinding_menu.js @@ -0,0 +1,193 @@ +define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +'use strict'; +var dom = require("../../lib/dom"); +var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ +background-color: #F7F7F7;\ +color: black;\ +box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ +padding: 1em 0.5em 2em 1em;\ +overflow: auto;\ +position: absolute;\ +margin: 0;\ +bottom: 0;\ +right: 0;\ +top: 0;\ +z-index: 9991;\ +cursor: default;\ +}\ +.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ +box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ +background-color: rgba(255, 255, 255, 0.6);\ +color: black;\ +}\ +.ace_optionsMenuEntry:hover {\ +background-color: rgba(100, 100, 100, 0.1);\ +transition: all 0.3s\ +}\ +.ace_closeButton {\ +background: rgba(245, 146, 146, 0.5);\ +border: 1px solid #F48A8A;\ +border-radius: 50%;\ +padding: 7px;\ +position: absolute;\ +right: -8px;\ +top: -8px;\ +z-index: 100000;\ +}\ +.ace_closeButton{\ +background: rgba(245, 146, 146, 0.9);\ +}\ +.ace_optionsMenuKey {\ +color: darkslateblue;\ +font-weight: bold;\ +}\ +.ace_optionsMenuCommand {\ +color: darkcyan;\ +font-weight: normal;\ +}\ +.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\ +vertical-align: middle;\ +}\ +.ace_optionsMenuEntry button[ace_selected_button=true] {\ +background: #e7e7e7;\ +box-shadow: 1px 0px 2px 0px #adadad inset;\ +border-color: #adadad;\ +}\ +.ace_optionsMenuEntry button {\ +background: white;\ +border: 1px solid lightgray;\ +margin: 0px;\ +}\ +.ace_optionsMenuEntry button:hover{\ +background: #f0f0f0;\ +}"; +dom.importCssString(cssText, "settings_menu.css", false); + +module.exports.overlayPage = function overlayPage(editor, contentElement, callback) { + var closer = document.createElement('div'); + var ignoreFocusOut = false; + + function documentEscListener(e) { + if (e.keyCode === 27) { + close(); + } + } + + function close() { + if (!closer) return; + document.removeEventListener('keydown', documentEscListener); + closer.parentNode.removeChild(closer); + if (editor) { + editor.focus(); + } + closer = null; + callback && callback(); + } + function setIgnoreFocusOut(ignore) { + ignoreFocusOut = ignore; + if (ignore) { + closer.style.pointerEvents = "none"; + contentElement.style.pointerEvents = "auto"; + } + } + + closer.style.cssText = 'margin: 0; padding: 0; ' + + 'position: fixed; top:0; bottom:0; left:0; right:0;' + + 'z-index: 9990; ' + + (editor ? 'background-color: rgba(0, 0, 0, 0.3);' : ''); + closer.addEventListener('click', function(e) { + if (!ignoreFocusOut) { + close(); + } + }); + document.addEventListener('keydown', documentEscListener); + + contentElement.addEventListener('click', function (e) { + e.stopPropagation(); + }); + + closer.appendChild(contentElement); + document.body.appendChild(closer); + if (editor) { + editor.blur(); + } + return { + close: close, + setIgnoreFocusOut: setIgnoreFocusOut + }; +}; + +}); + +define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",["require","exports","module","ace/lib/keys"], function(require, exports, module) { +"use strict"; +var keys = require("../../lib/keys"); +module.exports.getEditorKeybordShortcuts = function(editor) { + var KEY_MODS = keys.KEY_MODS; + var keybindings = []; + var commandMap = {}; + editor.keyBinding.$handlers.forEach(function(handler) { + var ckb = handler.commandKeyBinding; + for (var i in ckb) { + var key = i.replace(/(^|-)\w/g, function(x) { return x.toUpperCase(); }); + var commands = ckb[i]; + if (!Array.isArray(commands)) + commands = [commands]; + commands.forEach(function(command) { + if (typeof command != "string") + command = command.name; + if (commandMap[command]) { + commandMap[command].key += "|" + key; + } else { + commandMap[command] = {key: key, command: command}; + keybindings.push(commandMap[command]); + } + }); + } + }); + return keybindings; +}; + +}); + +define("ace/ext/keybinding_menu",["require","exports","module","ace/editor","ace/ext/menu_tools/overlay_page","ace/ext/menu_tools/get_editor_keyboard_shortcuts"], function(require, exports, module) { + "use strict"; + var Editor = require("../editor").Editor; + function showKeyboardShortcuts (editor) { + if(!document.getElementById('kbshortcutmenu')) { + var overlayPage = require('./menu_tools/overlay_page').overlayPage; + var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts; + var kb = getEditorKeybordShortcuts(editor); + var el = document.createElement('div'); + var commands = kb.reduce(function(previous, current) { + return previous + '
' + + current.command + ' : ' + + '' + current.key + '
'; + }, ''); + + el.id = 'kbshortcutmenu'; + el.innerHTML = '

Keyboard Shortcuts

' + commands + ''; + overlayPage(editor, el); + } + } + module.exports.init = function(editor) { + Editor.prototype.showKeyboardShortcuts = function() { + showKeyboardShortcuts(this); + }; + editor.commands.addCommands([{ + name: "showKeyboardShortcuts", + bindKey: {win: "Ctrl-Alt-h", mac: "Command-Alt-h"}, + exec: function(editor, line) { + editor.showKeyboardShortcuts(); + } + }]); + }; + +}); (function() { + window.require(["ace/ext/keybinding_menu"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-language_tools.js b/app/Resources/ui/js/ace/ext-language_tools.js new file mode 100644 index 00000000..e0316dcc --- /dev/null +++ b/app/Resources/ui/js/ace/ext-language_tools.js @@ -0,0 +1,2189 @@ +define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module) { +"use strict"; +var dom = require("./lib/dom"); +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var lang = require("./lib/lang"); +var Range = require("./range").Range; +var RangeList = require("./range_list").RangeList; +var HashHandler = require("./keyboard/hash_handler").HashHandler; +var Tokenizer = require("./tokenizer").Tokenizer; +var clipboard = require("./clipboard"); + +var VARIABLES = { + CURRENT_WORD: function(editor) { + return editor.session.getTextRange(editor.session.getWordRange()); + }, + SELECTION: function(editor, name, indentation) { + var text = editor.session.getTextRange(); + if (indentation) + return text.replace(/\n\r?([ \t]*\S)/g, "\n" + indentation + "$1"); + return text; + }, + CURRENT_LINE: function(editor) { + return editor.session.getLine(editor.getCursorPosition().row); + }, + PREV_LINE: function(editor) { + return editor.session.getLine(editor.getCursorPosition().row - 1); + }, + LINE_INDEX: function(editor) { + return editor.getCursorPosition().row; + }, + LINE_NUMBER: function(editor) { + return editor.getCursorPosition().row + 1; + }, + SOFT_TABS: function(editor) { + return editor.session.getUseSoftTabs() ? "YES" : "NO"; + }, + TAB_SIZE: function(editor) { + return editor.session.getTabSize(); + }, + CLIPBOARD: function(editor) { + return clipboard.getText && clipboard.getText(); + }, + FILENAME: function(editor) { + return /[^/\\]*$/.exec(this.FILEPATH(editor))[0]; + }, + FILENAME_BASE: function(editor) { + return /[^/\\]*$/.exec(this.FILEPATH(editor))[0].replace(/\.[^.]*$/, ""); + }, + DIRECTORY: function(editor) { + return this.FILEPATH(editor).replace(/[^/\\]*$/, ""); + }, + FILEPATH: function(editor) { return "/not implemented.txt"; }, + WORKSPACE_NAME: function() { return "Unknown"; }, + FULLNAME: function() { return "Unknown"; }, + BLOCK_COMMENT_START: function(editor) { + var mode = editor.session.$mode || {}; + return mode.blockComment && mode.blockComment.start || ""; + }, + BLOCK_COMMENT_END: function(editor) { + var mode = editor.session.$mode || {}; + return mode.blockComment && mode.blockComment.end || ""; + }, + LINE_COMMENT: function(editor) { + var mode = editor.session.$mode || {}; + return mode.lineCommentStart || ""; + }, + CURRENT_YEAR: date.bind(null, {year: "numeric"}), + CURRENT_YEAR_SHORT: date.bind(null, {year: "2-digit"}), + CURRENT_MONTH: date.bind(null, {month: "numeric"}), + CURRENT_MONTH_NAME: date.bind(null, {month: "long"}), + CURRENT_MONTH_NAME_SHORT: date.bind(null, {month: "short"}), + CURRENT_DATE: date.bind(null, {day: "2-digit"}), + CURRENT_DAY_NAME: date.bind(null, {weekday: "long"}), + CURRENT_DAY_NAME_SHORT: date.bind(null, {weekday: "short"}), + CURRENT_HOUR: date.bind(null, {hour: "2-digit", hour12: false}), + CURRENT_MINUTE: date.bind(null, {minute: "2-digit"}), + CURRENT_SECOND: date.bind(null, {second: "2-digit"}) +}; + +VARIABLES.SELECTED_TEXT = VARIABLES.SELECTION; + +function date(dateFormat) { + var str = new Date().toLocaleString("en-us", dateFormat); + return str.length == 1 ? "0" + str : str; +} + +var SnippetManager = function() { + this.snippetMap = {}; + this.snippetNameMap = {}; +}; + +(function() { + oop.implement(this, EventEmitter); + + this.getTokenizer = function() { + return SnippetManager.$tokenizer || this.createTokenizer(); + }; + + this.createTokenizer = function() { + function TabstopToken(str) { + str = str.substr(1); + if (/^\d+$/.test(str)) + return [{tabstopId: parseInt(str, 10)}]; + return [{text: str}]; + } + function escape(ch) { + return "(?:[^\\\\" + ch + "]|\\\\.)"; + } + var formatMatcher = { + regex: "/(" + escape("/") + "+)/", + onMatch: function(val, state, stack) { + var ts = stack[0]; + ts.fmtString = true; + ts.guard = val.slice(1, -1); + ts.flag = ""; + return ""; + }, + next: "formatString" + }; + + SnippetManager.$tokenizer = new Tokenizer({ + start: [ + {regex: /\\./, onMatch: function(val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) { + val = ch; + } else if ("`$\\".indexOf(ch) != -1) { + val = ch; + } + return [val]; + }}, + {regex: /}/, onMatch: function(val, state, stack) { + return [stack.length ? stack.shift() : val]; + }}, + {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken}, + {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) { + var t = TabstopToken(str.substr(1)); + stack.unshift(t[0]); + return t; + }, next: "snippetVar"}, + {regex: /\n/, token: "newline", merge: false} + ], + snippetVar: [ + {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) { + var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function(operator) { + return operator.length == 2 ? operator[1] : "\x00"; + }).split("\x00").map(function(value){ + return {value: value}; + }); + stack[0].choices = choices; + return [choices[0]]; + }, next: "start"}, + formatMatcher, + {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"} + ], + formatString: [ + {regex: /:/, onMatch: function(val, state, stack) { + if (stack.length && stack[0].expectElse) { + stack[0].expectElse = false; + stack[0].ifEnd = {elseEnd: stack[0]}; + return [stack[0].ifEnd]; + } + return ":"; + }}, + {regex: /\\./, onMatch: function(val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) + val = ch; + else if ("`$\\".indexOf(ch) != -1) + val = ch; + else if (ch == "n") + val = "\n"; + else if (ch == "t") + val = "\t"; + else if ("ulULE".indexOf(ch) != -1) + val = {changeCase: ch, local: ch > "a"}; + return [val]; + }}, + {regex: "/\\w*}", onMatch: function(val, state, stack) { + var next = stack.shift(); + if (next) + next.flag = val.slice(1, -1); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start"}, + {regex: /\$(?:\d+|\w+)/, onMatch: function(val, state, stack) { + return [{text: val.slice(1)}]; + }}, + {regex: /\${\w+/, onMatch: function(val, state, stack) { + var token = {text: val.slice(2)}; + stack.unshift(token); + return [token]; + }, next: "formatStringVar"}, + {regex: /\n/, token: "newline", merge: false}, + {regex: /}/, onMatch: function(val, state, stack) { + var next = stack.shift(); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start"} + ], + formatStringVar: [ + {regex: /:\/\w+}/, onMatch: function(val, state, stack) { + var ts = stack[0]; + ts.formatFunction = val.slice(2, -1); + return [stack.shift()]; + }, next: "formatString"}, + formatMatcher, + {regex: /:[\?\-+]?/, onMatch: function(val, state, stack) { + if (val[1] == "+") + stack[0].ifEnd = stack[0]; + if (val[1] == "?") + stack[0].expectElse = true; + }, next: "formatString"}, + {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString"} + ] + }); + return SnippetManager.$tokenizer; + }; + + this.tokenizeTmSnippet = function(str, startState) { + return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) { + return x.value || x; + }); + }; + + this.getVariableValue = function(editor, name, indentation) { + if (/^\d+$/.test(name)) + return (this.variables.__ || {})[name] || ""; + if (/^[A-Z]\d+$/.test(name)) + return (this.variables[name[0] + "__"] || {})[name.substr(1)] || ""; + + name = name.replace(/^TM_/, ""); + if (!this.variables.hasOwnProperty(name)) + return ""; + var value = this.variables[name]; + if (typeof value == "function") + value = this.variables[name](editor, name, indentation); + return value == null ? "" : value; + }; + + this.variables = VARIABLES; + this.tmStrFormat = function(str, ch, editor) { + if (!ch.fmt) return str; + var flag = ch.flag || ""; + var re = ch.guard; + re = new RegExp(re, flag.replace(/[^gim]/g, "")); + var fmtTokens = typeof ch.fmt == "string" ? this.tokenizeTmSnippet(ch.fmt, "formatString") : ch.fmt; + var _self = this; + var formatted = str.replace(re, function() { + var oldArgs = _self.variables.__; + _self.variables.__ = [].slice.call(arguments); + var fmtParts = _self.resolveVariables(fmtTokens, editor); + var gChangeCase = "E"; + for (var i = 0; i < fmtParts.length; i++) { + var ch = fmtParts[i]; + if (typeof ch == "object") { + fmtParts[i] = ""; + if (ch.changeCase && ch.local) { + var next = fmtParts[i + 1]; + if (next && typeof next == "string") { + if (ch.changeCase == "u") + fmtParts[i] = next[0].toUpperCase(); + else + fmtParts[i] = next[0].toLowerCase(); + fmtParts[i + 1] = next.substr(1); + } + } else if (ch.changeCase) { + gChangeCase = ch.changeCase; + } + } else if (gChangeCase == "U") { + fmtParts[i] = ch.toUpperCase(); + } else if (gChangeCase == "L") { + fmtParts[i] = ch.toLowerCase(); + } + } + _self.variables.__ = oldArgs; + return fmtParts.join(""); + }); + return formatted; + }; + + this.tmFormatFunction = function(str, ch, editor) { + if (ch.formatFunction == "upcase") + return str.toUpperCase(); + if (ch.formatFunction == "downcase") + return str.toLowerCase(); + return str; + }; + + this.resolveVariables = function(snippet, editor) { + var result = []; + var indentation = ""; + var afterNewLine = true; + for (var i = 0; i < snippet.length; i++) { + var ch = snippet[i]; + if (typeof ch == "string") { + result.push(ch); + if (ch == "\n") { + afterNewLine = true; + indentation = ""; + } + else if (afterNewLine) { + indentation = /^\t*/.exec(ch)[0]; + afterNewLine = /\S/.test(ch); + } + continue; + } + if (!ch) continue; + afterNewLine = false; + + if (ch.fmtString) { + var j = snippet.indexOf(ch, i + 1); + if (j == -1) j = snippet.length; + ch.fmt = snippet.slice(i + 1, j); + i = j; + } + + if (ch.text) { + var value = this.getVariableValue(editor, ch.text, indentation) + ""; + if (ch.fmtString) + value = this.tmStrFormat(value, ch, editor); + if (ch.formatFunction) + value = this.tmFormatFunction(value, ch, editor); + + if (value && !ch.ifEnd) { + result.push(value); + gotoNext(ch); + } else if (!value && ch.ifEnd) { + gotoNext(ch.ifEnd); + } + } else if (ch.elseEnd) { + gotoNext(ch.elseEnd); + } else if (ch.tabstopId != null) { + result.push(ch); + } else if (ch.changeCase != null) { + result.push(ch); + } + } + function gotoNext(ch) { + var i1 = snippet.indexOf(ch, i + 1); + if (i1 != -1) + i = i1; + } + return result; + }; + + this.insertSnippetForSelection = function(editor, snippetText) { + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var tabString = editor.session.getTabString(); + var indentString = line.match(/^\s*/)[0]; + + if (cursor.column < indentString.length) + indentString = indentString.slice(0, cursor.column); + + snippetText = snippetText.replace(/\r/g, ""); + var tokens = this.tokenizeTmSnippet(snippetText); + tokens = this.resolveVariables(tokens, editor); + tokens = tokens.map(function(x) { + if (x == "\n") + return x + indentString; + if (typeof x == "string") + return x.replace(/\t/g, tabString); + return x; + }); + var tabstops = []; + tokens.forEach(function(p, i) { + if (typeof p != "object") + return; + var id = p.tabstopId; + var ts = tabstops[id]; + if (!ts) { + ts = tabstops[id] = []; + ts.index = id; + ts.value = ""; + ts.parents = {}; + } + if (ts.indexOf(p) !== -1) + return; + if (p.choices && !ts.choices) + ts.choices = p.choices; + ts.push(p); + var i1 = tokens.indexOf(p, i + 1); + if (i1 === -1) + return; + + var value = tokens.slice(i + 1, i1); + var isNested = value.some(function(t) {return typeof t === "object";}); + if (isNested && !ts.value) { + ts.value = value; + } else if (value.length && (!ts.value || typeof ts.value !== "string")) { + ts.value = value.join(""); + } + }); + tabstops.forEach(function(ts) {ts.length = 0;}); + var expanding = {}; + function copyValue(val) { + var copy = []; + for (var i = 0; i < val.length; i++) { + var p = val[i]; + if (typeof p == "object") { + if (expanding[p.tabstopId]) + continue; + var j = val.lastIndexOf(p, i - 1); + p = copy[j] || {tabstopId: p.tabstopId}; + } + copy[i] = p; + } + return copy; + } + for (var i = 0; i < tokens.length; i++) { + var p = tokens[i]; + if (typeof p != "object") + continue; + var id = p.tabstopId; + var ts = tabstops[id]; + var i1 = tokens.indexOf(p, i + 1); + if (expanding[id]) { + if (expanding[id] === p) { + delete expanding[id]; + Object.keys(expanding).forEach(function(parentId) { + ts.parents[parentId] = true; + }); + } + continue; + } + expanding[id] = p; + var value = ts.value; + if (typeof value !== "string") + value = copyValue(value); + else if (p.fmt) + value = this.tmStrFormat(value, p, editor); + tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); + + if (ts.indexOf(p) === -1) + ts.push(p); + } + var row = 0, column = 0; + var text = ""; + tokens.forEach(function(t) { + if (typeof t === "string") { + var lines = t.split("\n"); + if (lines.length > 1){ + column = lines[lines.length - 1].length; + row += lines.length - 1; + } else + column += t.length; + text += t; + } else if (t) { + if (!t.start) + t.start = {row: row, column: column}; + else + t.end = {row: row, column: column}; + } + }); + var range = editor.getSelectionRange(); + var end = editor.session.replace(range, text); + + var tabstopManager = new TabstopManager(editor); + var selectionId = editor.inVirtualSelectionMode && editor.selection.index; + tabstopManager.addTabstops(tabstops, range.start, end, selectionId); + }; + + this.insertSnippet = function(editor, snippetText) { + var self = this; + if (editor.inVirtualSelectionMode) + return self.insertSnippetForSelection(editor, snippetText); + + editor.forEachSelection(function() { + self.insertSnippetForSelection(editor, snippetText); + }, null, {keepOrder: true}); + + if (editor.tabstopManager) + editor.tabstopManager.tabNext(); + }; + + this.$getScope = function(editor) { + var scope = editor.session.$mode.$id || ""; + scope = scope.split("/").pop(); + if (scope === "html" || scope === "php") { + if (scope === "php" && !editor.session.$mode.inlinePhp) + scope = "html"; + var c = editor.getCursorPosition(); + var state = editor.session.getState(c.row); + if (typeof state === "object") { + state = state[0]; + } + if (state.substring) { + if (state.substring(0, 3) == "js-") + scope = "javascript"; + else if (state.substring(0, 4) == "css-") + scope = "css"; + else if (state.substring(0, 4) == "php-") + scope = "php"; + } + } + + return scope; + }; + + this.getActiveScopes = function(editor) { + var scope = this.$getScope(editor); + var scopes = [scope]; + var snippetMap = this.snippetMap; + if (snippetMap[scope] && snippetMap[scope].includeScopes) { + scopes.push.apply(scopes, snippetMap[scope].includeScopes); + } + scopes.push("_"); + return scopes; + }; + + this.expandWithTab = function(editor, options) { + var self = this; + var result = editor.forEachSelection(function() { + return self.expandSnippetForSelection(editor, options); + }, null, {keepOrder: true}); + if (result && editor.tabstopManager) + editor.tabstopManager.tabNext(); + return result; + }; + + this.expandSnippetForSelection = function(editor, options) { + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var before = line.substring(0, cursor.column); + var after = line.substr(cursor.column); + + var snippetMap = this.snippetMap; + var snippet; + this.getActiveScopes(editor).some(function(scope) { + var snippets = snippetMap[scope]; + if (snippets) + snippet = this.findMatchingSnippet(snippets, before, after); + return !!snippet; + }, this); + if (!snippet) + return false; + if (options && options.dryRun) + return true; + editor.session.doc.removeInLine(cursor.row, + cursor.column - snippet.replaceBefore.length, + cursor.column + snippet.replaceAfter.length + ); + + this.variables.M__ = snippet.matchBefore; + this.variables.T__ = snippet.matchAfter; + this.insertSnippetForSelection(editor, snippet.content); + + this.variables.M__ = this.variables.T__ = null; + return true; + }; + + this.findMatchingSnippet = function(snippetList, before, after) { + for (var i = snippetList.length; i--;) { + var s = snippetList[i]; + if (s.startRe && !s.startRe.test(before)) + continue; + if (s.endRe && !s.endRe.test(after)) + continue; + if (!s.startRe && !s.endRe) + continue; + + s.matchBefore = s.startRe ? s.startRe.exec(before) : [""]; + s.matchAfter = s.endRe ? s.endRe.exec(after) : [""]; + s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : ""; + s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : ""; + return s; + } + }; + + this.snippetMap = {}; + this.snippetNameMap = {}; + this.register = function(snippets, scope) { + var snippetMap = this.snippetMap; + var snippetNameMap = this.snippetNameMap; + var self = this; + + if (!snippets) + snippets = []; + + function wrapRegexp(src) { + if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) + src = "(?:" + src + ")"; + + return src || ""; + } + function guardedRegexp(re, guard, opening) { + re = wrapRegexp(re); + guard = wrapRegexp(guard); + if (opening) { + re = guard + re; + if (re && re[re.length - 1] != "$") + re = re + "$"; + } else { + re = re + guard; + if (re && re[0] != "^") + re = "^" + re; + } + return new RegExp(re); + } + + function addSnippet(s) { + if (!s.scope) + s.scope = scope || "_"; + scope = s.scope; + if (!snippetMap[scope]) { + snippetMap[scope] = []; + snippetNameMap[scope] = {}; + } + + var map = snippetNameMap[scope]; + if (s.name) { + var old = map[s.name]; + if (old) + self.unregister(old); + map[s.name] = s; + } + snippetMap[scope].push(s); + + if (s.prefix) + s.tabTrigger = s.prefix; + + if (!s.content && s.body) + s.content = Array.isArray(s.body) ? s.body.join("\n") : s.body; + + if (s.tabTrigger && !s.trigger) { + if (!s.guard && /^\w/.test(s.tabTrigger)) + s.guard = "\\b"; + s.trigger = lang.escapeRegExp(s.tabTrigger); + } + + if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard) + return; + + s.startRe = guardedRegexp(s.trigger, s.guard, true); + s.triggerRe = new RegExp(s.trigger); + + s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true); + s.endTriggerRe = new RegExp(s.endTrigger); + } + + if (Array.isArray(snippets)) { + snippets.forEach(addSnippet); + } else { + Object.keys(snippets).forEach(function(key) { + addSnippet(snippets[key]); + }); + } + + this._signal("registerSnippets", {scope: scope}); + }; + this.unregister = function(snippets, scope) { + var snippetMap = this.snippetMap; + var snippetNameMap = this.snippetNameMap; + + function removeSnippet(s) { + var nameMap = snippetNameMap[s.scope||scope]; + if (nameMap && nameMap[s.name]) { + delete nameMap[s.name]; + var map = snippetMap[s.scope||scope]; + var i = map && map.indexOf(s); + if (i >= 0) + map.splice(i, 1); + } + } + if (snippets.content) + removeSnippet(snippets); + else if (Array.isArray(snippets)) + snippets.forEach(removeSnippet); + }; + this.parseSnippetFile = function(str) { + str = str.replace(/\r/g, ""); + var list = [], snippet = {}; + var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; + var m; + while (m = re.exec(str)) { + if (m[1]) { + try { + snippet = JSON.parse(m[1]); + list.push(snippet); + } catch (e) {} + } if (m[4]) { + snippet.content = m[4].replace(/^\t/gm, ""); + list.push(snippet); + snippet = {}; + } else { + var key = m[2], val = m[3]; + if (key == "regex") { + var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g; + snippet.guard = guardRe.exec(val)[1]; + snippet.trigger = guardRe.exec(val)[1]; + snippet.endTrigger = guardRe.exec(val)[1]; + snippet.endGuard = guardRe.exec(val)[1]; + } else if (key == "snippet") { + snippet.tabTrigger = val.match(/^\S*/)[0]; + if (!snippet.name) + snippet.name = val; + } else if (key) { + snippet[key] = val; + } + } + } + return list; + }; + this.getSnippetByName = function(name, editor) { + var snippetMap = this.snippetNameMap; + var snippet; + this.getActiveScopes(editor).some(function(scope) { + var snippets = snippetMap[scope]; + if (snippets) + snippet = snippets[name]; + return !!snippet; + }, this); + return snippet; + }; + +}).call(SnippetManager.prototype); + + +var TabstopManager = function(editor) { + if (editor.tabstopManager) + return editor.tabstopManager; + editor.tabstopManager = this; + this.$onChange = this.onChange.bind(this); + this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; + this.$onChangeSession = this.onChangeSession.bind(this); + this.$onAfterExec = this.onAfterExec.bind(this); + this.attach(editor); +}; +(function() { + this.attach = function(editor) { + this.index = 0; + this.ranges = []; + this.tabstops = []; + this.$openTabstops = null; + this.selectedTabstop = null; + + this.editor = editor; + this.editor.on("change", this.$onChange); + this.editor.on("changeSelection", this.$onChangeSelection); + this.editor.on("changeSession", this.$onChangeSession); + this.editor.commands.on("afterExec", this.$onAfterExec); + this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + }; + this.detach = function() { + this.tabstops.forEach(this.removeTabstopMarkers, this); + this.ranges = null; + this.tabstops = null; + this.selectedTabstop = null; + this.editor.removeListener("change", this.$onChange); + this.editor.removeListener("changeSelection", this.$onChangeSelection); + this.editor.removeListener("changeSession", this.$onChangeSession); + this.editor.commands.removeListener("afterExec", this.$onAfterExec); + this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); + this.editor.tabstopManager = null; + this.editor = null; + }; + + this.onChange = function(delta) { + var isRemove = delta.action[0] == "r"; + var selectedTabstop = this.selectedTabstop || {}; + var parents = selectedTabstop.parents || {}; + var tabstops = (this.tabstops || []).slice(); + for (var i = 0; i < tabstops.length; i++) { + var ts = tabstops[i]; + var active = ts == selectedTabstop || parents[ts.index]; + ts.rangeList.$bias = active ? 0 : 1; + + if (delta.action == "remove" && ts !== selectedTabstop) { + var parentActive = ts.parents && ts.parents[selectedTabstop.index]; + var startIndex = ts.rangeList.pointIndex(delta.start, parentActive); + startIndex = startIndex < 0 ? -startIndex - 1 : startIndex + 1; + var endIndex = ts.rangeList.pointIndex(delta.end, parentActive); + endIndex = endIndex < 0 ? -endIndex - 1 : endIndex - 1; + var toRemove = ts.rangeList.ranges.slice(startIndex, endIndex); + for (var j = 0; j < toRemove.length; j++) + this.removeRange(toRemove[j]); + } + ts.rangeList.$onChange(delta); + } + var session = this.editor.session; + if (!this.$inChange && isRemove && session.getLength() == 1 && !session.getValue()) + this.detach(); + }; + this.updateLinkedFields = function() { + var ts = this.selectedTabstop; + if (!ts || !ts.hasLinkedRanges || !ts.firstNonLinked) + return; + this.$inChange = true; + var session = this.editor.session; + var text = session.getTextRange(ts.firstNonLinked); + for (var i = 0; i < ts.length; i++) { + var range = ts[i]; + if (!range.linked) + continue; + var original = range.original; + var fmt = exports.snippetManager.tmStrFormat(text, original, this.editor); + session.replace(range, fmt); + } + this.$inChange = false; + }; + this.onAfterExec = function(e) { + if (e.command && !e.command.readOnly) + this.updateLinkedFields(); + }; + this.onChangeSelection = function() { + if (!this.editor) + return; + var lead = this.editor.selection.lead; + var anchor = this.editor.selection.anchor; + var isEmpty = this.editor.selection.isEmpty(); + for (var i = 0; i < this.ranges.length; i++) { + if (this.ranges[i].linked) + continue; + var containsLead = this.ranges[i].contains(lead.row, lead.column); + var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column); + if (containsLead && containsAnchor) + return; + } + this.detach(); + }; + this.onChangeSession = function() { + this.detach(); + }; + this.tabNext = function(dir) { + var max = this.tabstops.length; + var index = this.index + (dir || 1); + index = Math.min(Math.max(index, 1), max); + if (index == max) + index = 0; + this.selectTabstop(index); + if (index === 0) + this.detach(); + }; + this.selectTabstop = function(index) { + this.$openTabstops = null; + var ts = this.tabstops[this.index]; + if (ts) + this.addTabstopMarkers(ts); + this.index = index; + ts = this.tabstops[this.index]; + if (!ts || !ts.length) + return; + + this.selectedTabstop = ts; + var range = ts.firstNonLinked || ts; + if (ts.choices) range.cursor = range.start; + if (!this.editor.inVirtualSelectionMode) { + var sel = this.editor.multiSelect; + sel.toSingleRange(range); + for (var i = 0; i < ts.length; i++) { + if (ts.hasLinkedRanges && ts[i].linked) + continue; + sel.addRange(ts[i].clone(), true); + } + } else { + this.editor.selection.fromOrientedRange(range); + } + + this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + if (this.selectedTabstop && this.selectedTabstop.choices) + this.editor.execCommand("startAutocomplete", {matches: this.selectedTabstop.choices}); + }; + this.addTabstops = function(tabstops, start, end) { + var useLink = this.useLink || !this.editor.getOption("enableMultiselect"); + + if (!this.$openTabstops) + this.$openTabstops = []; + if (!tabstops[0]) { + var p = Range.fromPoints(end, end); + moveRelative(p.start, start); + moveRelative(p.end, start); + tabstops[0] = [p]; + tabstops[0].index = 0; + } + + var i = this.index; + var arg = [i + 1, 0]; + var ranges = this.ranges; + tabstops.forEach(function(ts, index) { + var dest = this.$openTabstops[index] || ts; + + for (var i = 0; i < ts.length; i++) { + var p = ts[i]; + var range = Range.fromPoints(p.start, p.end || p.start); + movePoint(range.start, start); + movePoint(range.end, start); + range.original = p; + range.tabstop = dest; + ranges.push(range); + if (dest != ts) + dest.unshift(range); + else + dest[i] = range; + if (p.fmtString || (dest.firstNonLinked && useLink)) { + range.linked = true; + dest.hasLinkedRanges = true; + } else if (!dest.firstNonLinked) + dest.firstNonLinked = range; + } + if (!dest.firstNonLinked) + dest.hasLinkedRanges = false; + if (dest === ts) { + arg.push(dest); + this.$openTabstops[index] = dest; + } + this.addTabstopMarkers(dest); + dest.rangeList = dest.rangeList || new RangeList(); + dest.rangeList.$bias = 0; + dest.rangeList.addList(dest); + }, this); + + if (arg.length > 2) { + if (this.tabstops.length) + arg.push(arg.splice(2, 1)[0]); + this.tabstops.splice.apply(this.tabstops, arg); + } + }; + + this.addTabstopMarkers = function(ts) { + var session = this.editor.session; + ts.forEach(function(range) { + if (!range.markerId) + range.markerId = session.addMarker(range, "ace_snippet-marker", "text"); + }); + }; + this.removeTabstopMarkers = function(ts) { + var session = this.editor.session; + ts.forEach(function(range) { + session.removeMarker(range.markerId); + range.markerId = null; + }); + }; + this.removeRange = function(range) { + var i = range.tabstop.indexOf(range); + if (i != -1) range.tabstop.splice(i, 1); + i = this.ranges.indexOf(range); + if (i != -1) this.ranges.splice(i, 1); + i = range.tabstop.rangeList.ranges.indexOf(range); + if (i != -1) range.tabstop.splice(i, 1); + this.editor.session.removeMarker(range.markerId); + if (!range.tabstop.length) { + i = this.tabstops.indexOf(range.tabstop); + if (i != -1) + this.tabstops.splice(i, 1); + if (!this.tabstops.length) + this.detach(); + } + }; + + this.keyboardHandler = new HashHandler(); + this.keyboardHandler.bindKeys({ + "Tab": function(editor) { + if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) + return; + editor.tabstopManager.tabNext(1); + editor.renderer.scrollCursorIntoView(); + }, + "Shift-Tab": function(editor) { + editor.tabstopManager.tabNext(-1); + editor.renderer.scrollCursorIntoView(); + }, + "Esc": function(editor) { + editor.tabstopManager.detach(); + } + }); +}).call(TabstopManager.prototype); + + + +var movePoint = function(point, diff) { + if (point.row == 0) + point.column += diff.column; + point.row += diff.row; +}; + +var moveRelative = function(point, start) { + if (point.row == start.row) + point.column -= start.column; + point.row -= start.row; +}; + + +dom.importCssString("\ +.ace_snippet-marker {\ + -moz-box-sizing: border-box;\ + box-sizing: border-box;\ + background: rgba(194, 193, 208, 0.09);\ + border: 1px dotted rgba(211, 208, 235, 0.62);\ + position: absolute;\ +}", "snippets.css", false); + +exports.snippetManager = new SnippetManager(); + + +var Editor = require("./editor").Editor; +(function() { + this.insertSnippet = function(content, options) { + return exports.snippetManager.insertSnippet(this, content, options); + }; + this.expandSnippet = function(options) { + return exports.snippetManager.expandWithTab(this, options); + }; +}).call(Editor.prototype); + +}); + +define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var Renderer = require("../virtual_renderer").VirtualRenderer; +var Editor = require("../editor").Editor; +var Range = require("../range").Range; +var event = require("../lib/event"); +var lang = require("../lib/lang"); +var dom = require("../lib/dom"); + +var $singleLineEditor = function(el) { + var renderer = new Renderer(el); + + renderer.$maxLines = 4; + + var editor = new Editor(renderer); + + editor.setHighlightActiveLine(false); + editor.setShowPrintMargin(false); + editor.renderer.setShowGutter(false); + editor.renderer.setHighlightGutterLine(false); + + editor.$mouseHandler.$focusTimeout = 0; + editor.$highlightTagPending = true; + + return editor; +}; + +var AcePopup = function(parentNode) { + var el = dom.createElement("div"); + var popup = new $singleLineEditor(el); + + if (parentNode) + parentNode.appendChild(el); + el.style.display = "none"; + popup.renderer.content.style.cursor = "default"; + popup.renderer.setStyle("ace_autocomplete"); + + popup.setOption("displayIndentGuides", false); + popup.setOption("dragDelay", 150); + + var noop = function(){}; + + popup.focus = noop; + popup.$isFocused = true; + + popup.renderer.$cursorLayer.restartTimer = noop; + popup.renderer.$cursorLayer.element.style.opacity = 0; + + popup.renderer.$maxLines = 8; + popup.renderer.$keepTextAreaAtCursor = false; + + popup.setHighlightActiveLine(false); + popup.session.highlight(""); + popup.session.$searchHighlight.clazz = "ace_highlight-marker"; + + popup.on("mousedown", function(e) { + var pos = e.getDocumentPosition(); + popup.selection.moveToPosition(pos); + selectionMarker.start.row = selectionMarker.end.row = pos.row; + e.stop(); + }); + + var lastMouseEvent; + var hoverMarker = new Range(-1,0,-1,Infinity); + var selectionMarker = new Range(-1,0,-1,Infinity); + selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine"); + popup.setSelectOnHover = function(val) { + if (!val) { + hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine"); + } else if (hoverMarker.id) { + popup.session.removeMarker(hoverMarker.id); + hoverMarker.id = null; + } + }; + popup.setSelectOnHover(false); + popup.on("mousemove", function(e) { + if (!lastMouseEvent) { + lastMouseEvent = e; + return; + } + if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) { + return; + } + lastMouseEvent = e; + lastMouseEvent.scrollTop = popup.renderer.scrollTop; + var row = lastMouseEvent.getDocumentPosition().row; + if (hoverMarker.start.row != row) { + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row); + } + }); + popup.renderer.on("beforeRender", function() { + if (lastMouseEvent && hoverMarker.start.row != -1) { + lastMouseEvent.$pos = null; + var row = lastMouseEvent.getDocumentPosition().row; + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row, true); + } + }); + popup.renderer.on("afterRender", function() { + var row = popup.getRow(); + var t = popup.renderer.$textLayer; + var selected = t.element.childNodes[row - t.config.firstRow]; + if (selected !== t.selectedNode && t.selectedNode) + dom.removeCssClass(t.selectedNode, "ace_selected"); + t.selectedNode = selected; + if (selected) + dom.addCssClass(selected, "ace_selected"); + }); + var hideHoverMarker = function() { setHoverMarker(-1); }; + var setHoverMarker = function(row, suppressRedraw) { + if (row !== hoverMarker.start.row) { + hoverMarker.start.row = hoverMarker.end.row = row; + if (!suppressRedraw) + popup.session._emit("changeBackMarker"); + popup._emit("changeHoverMarker"); + } + }; + popup.getHoveredRow = function() { + return hoverMarker.start.row; + }; + + event.addListener(popup.container, "mouseout", hideHoverMarker); + popup.on("hide", hideHoverMarker); + popup.on("changeSelection", hideHoverMarker); + + popup.session.doc.getLength = function() { + return popup.data.length; + }; + popup.session.doc.getLine = function(i) { + var data = popup.data[i]; + if (typeof data == "string") + return data; + return (data && data.value) || ""; + }; + + var bgTokenizer = popup.session.bgTokenizer; + bgTokenizer.$tokenizeRow = function(row) { + var data = popup.data[row]; + var tokens = []; + if (!data) + return tokens; + if (typeof data == "string") + data = {value: data}; + var caption = data.caption || data.value || data.name; + + function addToken(value, className) { + value && tokens.push({ + type: (data.className || "") + (className || ""), + value: value + }); + } + + var lower = caption.toLowerCase(); + var filterText = (popup.filterText || "").toLowerCase(); + var lastIndex = 0; + var lastI = 0; + for (var i = 0; i <= filterText.length; i++) { + if (i != lastI && (data.matchMask & (1 << i) || i == filterText.length)) { + var sub = filterText.slice(lastI, i); + lastI = i; + var index = lower.indexOf(sub, lastIndex); + if (index == -1) continue; + addToken(caption.slice(lastIndex, index), ""); + lastIndex = index + sub.length; + addToken(caption.slice(index, lastIndex), "completion-highlight"); + } + } + addToken(caption.slice(lastIndex, caption.length), ""); + + if (data.meta) + tokens.push({type: "completion-meta", value: data.meta}); + if (data.message) + tokens.push({type: "completion-message", value: data.message}); + + return tokens; + }; + bgTokenizer.$updateOnChange = noop; + bgTokenizer.start = noop; + + popup.session.$computeWidth = function() { + return this.screenWidth = 0; + }; + popup.isOpen = false; + popup.isTopdown = false; + popup.autoSelect = true; + popup.filterText = ""; + + popup.data = []; + popup.setData = function(list, filterText) { + popup.filterText = filterText || ""; + popup.setValue(lang.stringRepeat("\n", list.length), -1); + popup.data = list || []; + popup.setRow(0); + }; + popup.getData = function(row) { + return popup.data[row]; + }; + + popup.getRow = function() { + return selectionMarker.start.row; + }; + popup.setRow = function(line) { + line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length, line)); + if (selectionMarker.start.row != line) { + popup.selection.clearSelection(); + selectionMarker.start.row = selectionMarker.end.row = line || 0; + popup.session._emit("changeBackMarker"); + popup.moveCursorTo(line || 0, 0); + if (popup.isOpen) + popup._signal("select"); + } + }; + + popup.on("changeSelection", function() { + if (popup.isOpen) + popup.setRow(popup.selection.lead.row); + popup.renderer.scrollCursorIntoView(); + }); + + popup.hide = function() { + this.container.style.display = "none"; + this._signal("hide"); + popup.isOpen = false; + }; + popup.show = function(pos, lineHeight, topdownOnly) { + var el = this.container; + var screenHeight = window.innerHeight; + var screenWidth = window.innerWidth; + var renderer = this.renderer; + var maxH = renderer.$maxLines * lineHeight * 1.4; + var top = pos.top + this.$borderSize; + var allowTopdown = top > screenHeight / 2 && !topdownOnly; + if (allowTopdown && top + lineHeight + maxH > screenHeight) { + renderer.$maxPixelHeight = top - 2 * this.$borderSize; + el.style.top = ""; + el.style.bottom = screenHeight - top + "px"; + popup.isTopdown = false; + } else { + top += lineHeight; + renderer.$maxPixelHeight = screenHeight - top - 0.2 * lineHeight; + el.style.top = top + "px"; + el.style.bottom = ""; + popup.isTopdown = true; + } + + el.style.display = ""; + + var left = pos.left; + if (left + el.offsetWidth > screenWidth) + left = screenWidth - el.offsetWidth; + + el.style.left = left + "px"; + + this._signal("show"); + lastMouseEvent = null; + popup.isOpen = true; + }; + + popup.goTo = function(where) { + var row = this.getRow(); + var max = this.session.getLength() - 1; + + switch(where) { + case "up": row = row <= 0 ? max : row - 1; break; + case "down": row = row >= max ? -1 : row + 1; break; + case "start": row = 0; break; + case "end": row = max; break; + } + + this.setRow(row); + }; + + + popup.getTextLeftOffset = function() { + return this.$borderSize + this.renderer.$padding + this.$imageSize; + }; + + popup.$imageSize = 0; + popup.$borderSize = 1; + + return popup; +}; + +dom.importCssString("\ +.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\ + background-color: #CAD6FA;\ + z-index: 1;\ +}\ +.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\ + background-color: #3a674e;\ +}\ +.ace_editor.ace_autocomplete .ace_line-hover {\ + border: 1px solid #abbffe;\ + margin-top: -1px;\ + background: rgba(233,233,253,0.4);\ + position: absolute;\ + z-index: 2;\ +}\ +.ace_dark.ace_editor.ace_autocomplete .ace_line-hover {\ + border: 1px solid rgba(109, 150, 13, 0.8);\ + background: rgba(58, 103, 78, 0.62);\ +}\ +.ace_completion-meta {\ + opacity: 0.5;\ + margin: 0.9em;\ +}\ +.ace_completion-message {\ + color: blue;\ +}\ +.ace_editor.ace_autocomplete .ace_completion-highlight{\ + color: #2d69c7;\ +}\ +.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{\ + color: #93ca12;\ +}\ +.ace_editor.ace_autocomplete {\ + width: 300px;\ + z-index: 200000;\ + border: 1px lightgray solid;\ + position: fixed;\ + box-shadow: 2px 3px 5px rgba(0,0,0,.2);\ + line-height: 1.4;\ + background: #fefefe;\ + color: #111;\ +}\ +.ace_dark.ace_editor.ace_autocomplete {\ + border: 1px #484747 solid;\ + box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51);\ + line-height: 1.4;\ + background: #25282c;\ + color: #c1c1c1;\ +}", "autocompletion.css", false); + +exports.AcePopup = AcePopup; +exports.$singleLineEditor = $singleLineEditor; +}); + +define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.parForEach = function(array, fn, callback) { + var completed = 0; + var arLength = array.length; + if (arLength === 0) + callback(); + for (var i = 0; i < arLength; i++) { + fn(array[i], function(result, err) { + completed++; + if (completed === arLength) + callback(result, err); + }); + } +}; + +var ID_REGEX = /[a-zA-Z_0-9\$\-\u00A2-\u2000\u2070-\uFFFF]/; + +exports.retrievePrecedingIdentifier = function(text, pos, regex) { + regex = regex || ID_REGEX; + var buf = []; + for (var i = pos-1; i >= 0; i--) { + if (regex.test(text[i])) + buf.push(text[i]); + else + break; + } + return buf.reverse().join(""); +}; + +exports.retrieveFollowingIdentifier = function(text, pos, regex) { + regex = regex || ID_REGEX; + var buf = []; + for (var i = pos; i < text.length; i++) { + if (regex.test(text[i])) + buf.push(text[i]); + else + break; + } + return buf; +}; + +exports.getCompletionPrefix = function (editor) { + var pos = editor.getCursorPosition(); + var line = editor.session.getLine(pos.row); + var prefix; + editor.completers.forEach(function(completer) { + if (completer.identifierRegexps) { + completer.identifierRegexps.forEach(function(identifierRegex) { + if (!prefix && identifierRegex) + prefix = this.retrievePrecedingIdentifier(line, pos.column, identifierRegex); + }.bind(this)); + } + }.bind(this)); + return prefix || this.retrievePrecedingIdentifier(line, pos.column); +}; + +}); + +define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/lang","ace/lib/dom","ace/snippets","ace/config"], function(require, exports, module) { +"use strict"; + +var HashHandler = require("./keyboard/hash_handler").HashHandler; +var AcePopup = require("./autocomplete/popup").AcePopup; +var util = require("./autocomplete/util"); +var lang = require("./lib/lang"); +var dom = require("./lib/dom"); +var snippetManager = require("./snippets").snippetManager; +var config = require("./config"); + +var Autocomplete = function() { + this.autoInsert = false; + this.autoSelect = true; + this.exactMatch = false; + this.gatherCompletionsId = 0; + this.keyboardHandler = new HashHandler(); + this.keyboardHandler.bindKeys(this.commands); + + this.blurListener = this.blurListener.bind(this); + this.changeListener = this.changeListener.bind(this); + this.mousedownListener = this.mousedownListener.bind(this); + this.mousewheelListener = this.mousewheelListener.bind(this); + + this.changeTimer = lang.delayedCall(function() { + this.updateCompletions(true); + }.bind(this)); + + this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50); +}; + +(function() { + + this.$init = function() { + this.popup = new AcePopup(document.body || document.documentElement); + this.popup.on("click", function(e) { + this.insertMatch(); + e.stop(); + }.bind(this)); + this.popup.focus = this.editor.focus.bind(this.editor); + this.popup.on("show", this.tooltipTimer.bind(null, null)); + this.popup.on("select", this.tooltipTimer.bind(null, null)); + this.popup.on("changeHoverMarker", this.tooltipTimer.bind(null, null)); + return this.popup; + }; + + this.getPopup = function() { + return this.popup || this.$init(); + }; + + this.openPopup = function(editor, prefix, keepPopupPosition) { + if (!this.popup) + this.$init(); + + this.popup.autoSelect = this.autoSelect; + + this.popup.setData(this.completions.filtered, this.completions.filterText); + + editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + + var renderer = editor.renderer; + this.popup.setRow(this.autoSelect ? 0 : -1); + if (!keepPopupPosition) { + this.popup.setTheme(editor.getTheme()); + this.popup.setFontSize(editor.getFontSize()); + + var lineHeight = renderer.layerConfig.lineHeight; + + var pos = renderer.$cursorLayer.getPixelPosition(this.base, true); + pos.left -= this.popup.getTextLeftOffset(); + + var rect = editor.container.getBoundingClientRect(); + pos.top += rect.top - renderer.layerConfig.offset; + pos.left += rect.left - editor.renderer.scrollLeft; + pos.left += renderer.gutterWidth; + + this.popup.show(pos, lineHeight); + } else if (keepPopupPosition && !prefix) { + this.detach(); + } + this.changeTimer.cancel(); + }; + + this.detach = function() { + this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); + this.editor.off("changeSelection", this.changeListener); + this.editor.off("blur", this.blurListener); + this.editor.off("mousedown", this.mousedownListener); + this.editor.off("mousewheel", this.mousewheelListener); + this.changeTimer.cancel(); + this.hideDocTooltip(); + + this.gatherCompletionsId += 1; + if (this.popup && this.popup.isOpen) + this.popup.hide(); + + if (this.base) + this.base.detach(); + this.activated = false; + this.completions = this.base = null; + }; + + this.changeListener = function(e) { + var cursor = this.editor.selection.lead; + if (cursor.row != this.base.row || cursor.column < this.base.column) { + this.detach(); + } + if (this.activated) + this.changeTimer.schedule(); + else + this.detach(); + }; + + this.blurListener = function(e) { + var el = document.activeElement; + var text = this.editor.textInput.getElement(); + var fromTooltip = e.relatedTarget && this.tooltipNode && this.tooltipNode.contains(e.relatedTarget); + var container = this.popup && this.popup.container; + if (el != text && el.parentNode != container && !fromTooltip + && el != this.tooltipNode && e.relatedTarget != text + ) { + this.detach(); + } + }; + + this.mousedownListener = function(e) { + this.detach(); + }; + + this.mousewheelListener = function(e) { + this.detach(); + }; + + this.goTo = function(where) { + this.popup.goTo(where); + }; + + this.insertMatch = function(data, options) { + if (!data) + data = this.popup.getData(this.popup.getRow()); + if (!data) + return false; + + var completions = this.completions; + this.editor.startOperation({command: {name: "insertMatch"}}); + if (data.completer && data.completer.insertMatch) { + data.completer.insertMatch(this.editor, data); + } else { + if (!completions) + return false; + if (completions.filterText) { + var ranges = this.editor.selection.getAllRanges(); + for (var i = 0, range; range = ranges[i]; i++) { + range.start.column -= completions.filterText.length; + this.editor.session.remove(range); + } + } + if (data.snippet) + snippetManager.insertSnippet(this.editor, data.snippet); + else + this.editor.execCommand("insertstring", data.value || data); + } + if (this.completions == completions) + this.detach(); + this.editor.endOperation(); + }; + + + this.commands = { + "Up": function(editor) { editor.completer.goTo("up"); }, + "Down": function(editor) { editor.completer.goTo("down"); }, + "Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); }, + "Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); }, + + "Esc": function(editor) { editor.completer.detach(); }, + "Return": function(editor) { return editor.completer.insertMatch(); }, + "Shift-Return": function(editor) { editor.completer.insertMatch(null, {deleteSuffix: true}); }, + "Tab": function(editor) { + var result = editor.completer.insertMatch(); + if (!result && !editor.tabstopManager) + editor.completer.goTo("down"); + else + return result; + }, + + "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); }, + "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); } + }; + + this.gatherCompletions = function(editor, callback) { + var session = editor.getSession(); + var pos = editor.getCursorPosition(); + + var prefix = util.getCompletionPrefix(editor); + + this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length); + this.base.$insertRight = true; + + var matches = []; + var total = editor.completers.length; + editor.completers.forEach(function(completer, i) { + completer.getCompletions(editor, session, pos, prefix, function(err, results) { + if (!err && results) + matches = matches.concat(results); + callback(null, { + prefix: util.getCompletionPrefix(editor), + matches: matches, + finished: (--total === 0) + }); + }); + }); + return true; + }; + + this.showPopup = function(editor, options) { + if (this.editor) + this.detach(); + + this.activated = true; + + this.editor = editor; + if (editor.completer != this) { + if (editor.completer) + editor.completer.detach(); + editor.completer = this; + } + + editor.on("changeSelection", this.changeListener); + editor.on("blur", this.blurListener); + editor.on("mousedown", this.mousedownListener); + editor.on("mousewheel", this.mousewheelListener); + + this.updateCompletions(false, options); + }; + + this.updateCompletions = function(keepPopupPosition, options) { + if (keepPopupPosition && this.base && this.completions) { + var pos = this.editor.getCursorPosition(); + var prefix = this.editor.session.getTextRange({start: this.base, end: pos}); + if (prefix == this.completions.filterText) + return; + this.completions.setFilter(prefix); + if (!this.completions.filtered.length) + return this.detach(); + if (this.completions.filtered.length == 1 + && this.completions.filtered[0].value == prefix + && !this.completions.filtered[0].snippet) + return this.detach(); + this.openPopup(this.editor, prefix, keepPopupPosition); + return; + } + + if (options && options.matches) { + var pos = this.editor.getSelectionRange().start; + this.base = this.editor.session.doc.createAnchor(pos.row, pos.column); + this.base.$insertRight = true; + this.completions = new FilteredList(options.matches); + return this.openPopup(this.editor, "", keepPopupPosition); + } + var _id = this.gatherCompletionsId; + var detachIfFinished = function(results) { + if (!results.finished) return; + return this.detach(); + }.bind(this); + + var processResults = function(results) { + var prefix = results.prefix; + var matches = results.matches; + + this.completions = new FilteredList(matches); + + if (this.exactMatch) + this.completions.exactMatch = true; + + this.completions.setFilter(prefix); + var filtered = this.completions.filtered; + if (!filtered.length) + return detachIfFinished(results); + if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet) + return detachIfFinished(results); + if (this.autoInsert && filtered.length == 1 && results.finished) + return this.insertMatch(filtered[0]); + + this.openPopup(this.editor, prefix, keepPopupPosition); + }.bind(this); + + var isImmediate = true; + var immediateResults = null; + this.gatherCompletions(this.editor, function(err, results) { + var prefix = results.prefix; + var matches = results && results.matches; + + if (!matches || !matches.length) + return detachIfFinished(results); + if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId) + return; + if (isImmediate) { + immediateResults = results; + return; + } + + processResults(results); + }.bind(this)); + + isImmediate = false; + if (immediateResults) { + var results = immediateResults; + immediateResults = null; + processResults(results); + } + }; + + this.cancelContextMenu = function() { + this.editor.$mouseHandler.cancelContextMenu(); + }; + + this.updateDocTooltip = function() { + var popup = this.popup; + var all = popup.data; + var selected = all && (all[popup.getHoveredRow()] || all[popup.getRow()]); + var doc = null; + if (!selected || !this.editor || !this.popup.isOpen) + return this.hideDocTooltip(); + this.editor.completers.some(function(completer) { + if (completer.getDocTooltip) + doc = completer.getDocTooltip(selected); + return doc; + }); + if (!doc && typeof selected != "string") + doc = selected; + + if (typeof doc == "string") + doc = {docText: doc}; + if (!doc || !(doc.docHTML || doc.docText)) + return this.hideDocTooltip(); + this.showDocTooltip(doc); + }; + + this.showDocTooltip = function(item) { + if (!this.tooltipNode) { + this.tooltipNode = dom.createElement("div"); + this.tooltipNode.className = "ace_tooltip ace_doc-tooltip"; + this.tooltipNode.style.margin = 0; + this.tooltipNode.style.pointerEvents = "auto"; + this.tooltipNode.tabIndex = -1; + this.tooltipNode.onblur = this.blurListener.bind(this); + this.tooltipNode.onclick = this.onTooltipClick.bind(this); + } + + var tooltipNode = this.tooltipNode; + if (item.docHTML) { + tooltipNode.innerHTML = item.docHTML; + } else if (item.docText) { + tooltipNode.textContent = item.docText; + } + + if (!tooltipNode.parentNode) + document.body.appendChild(tooltipNode); + var popup = this.popup; + var rect = popup.container.getBoundingClientRect(); + tooltipNode.style.top = popup.container.style.top; + tooltipNode.style.bottom = popup.container.style.bottom; + + tooltipNode.style.display = "block"; + if (window.innerWidth - rect.right < 320) { + if (rect.left < 320) { + if(popup.isTopdown) { + tooltipNode.style.top = rect.bottom + "px"; + tooltipNode.style.left = rect.left + "px"; + tooltipNode.style.right = ""; + tooltipNode.style.bottom = ""; + } else { + tooltipNode.style.top = popup.container.offsetTop - tooltipNode.offsetHeight + "px"; + tooltipNode.style.left = rect.left + "px"; + tooltipNode.style.right = ""; + tooltipNode.style.bottom = ""; + } + } else { + tooltipNode.style.right = window.innerWidth - rect.left + "px"; + tooltipNode.style.left = ""; + } + } else { + tooltipNode.style.left = (rect.right + 1) + "px"; + tooltipNode.style.right = ""; + } + }; + + this.hideDocTooltip = function() { + this.tooltipTimer.cancel(); + if (!this.tooltipNode) return; + var el = this.tooltipNode; + if (!this.editor.isFocused() && document.activeElement == el) + this.editor.focus(); + this.tooltipNode = null; + if (el.parentNode) + el.parentNode.removeChild(el); + }; + + this.onTooltipClick = function(e) { + var a = e.target; + while (a && a != this.tooltipNode) { + if (a.nodeName == "A" && a.href) { + a.rel = "noreferrer"; + a.target = "_blank"; + break; + } + a = a.parentNode; + } + }; + + this.destroy = function() { + this.detach(); + if (this.popup) { + this.popup.destroy(); + var el = this.popup.container; + if (el && el.parentNode) + el.parentNode.removeChild(el); + } + if (this.editor && this.editor.completer == this) + this.editor.completer == null; + this.popup = null; + }; + +}).call(Autocomplete.prototype); + + +Autocomplete.for = function(editor) { + if (editor.completer) { + return editor.completer; + } + if (config.get("sharedPopups")) { + if (!Autocomplete.$shared) + Autocomplete.$sharedInstance = new Autocomplete(); + editor.completer = Autocomplete.$sharedInstance; + } else { + editor.completer = new Autocomplete(); + editor.once("destroy", function(e, editor) { + editor.completer.destroy(); + }); + } + return editor.completer; +}; + +Autocomplete.startCommand = { + name: "startAutocomplete", + exec: function(editor, options) { + var completer = Autocomplete.for(editor); + completer.autoInsert = false; + completer.autoSelect = true; + completer.showPopup(editor, options); + completer.cancelContextMenu(); + }, + bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space" +}; + +var FilteredList = function(array, filterText) { + this.all = array; + this.filtered = array; + this.filterText = filterText || ""; + this.exactMatch = false; +}; +(function(){ + this.setFilter = function(str) { + if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0) + var matches = this.filtered; + else + var matches = this.all; + + this.filterText = str; + matches = this.filterCompletions(matches, this.filterText); + matches = matches.sort(function(a, b) { + return b.exactMatch - a.exactMatch || b.$score - a.$score + || (a.caption || a.value).localeCompare(b.caption || b.value); + }); + var prev = null; + matches = matches.filter(function(item){ + var caption = item.snippet || item.caption || item.value; + if (caption === prev) return false; + prev = caption; + return true; + }); + + this.filtered = matches; + }; + this.filterCompletions = function(items, needle) { + var results = []; + var upper = needle.toUpperCase(); + var lower = needle.toLowerCase(); + loop: for (var i = 0, item; item = items[i]; i++) { + var caption = item.caption || item.value || item.snippet; + if (!caption) continue; + var lastIndex = -1; + var matchMask = 0; + var penalty = 0; + var index, distance; + + if (this.exactMatch) { + if (needle !== caption.substr(0, needle.length)) + continue loop; + } else { + var fullMatchIndex = caption.toLowerCase().indexOf(lower); + if (fullMatchIndex > -1) { + penalty = fullMatchIndex; + } else { + for (var j = 0; j < needle.length; j++) { + var i1 = caption.indexOf(lower[j], lastIndex + 1); + var i2 = caption.indexOf(upper[j], lastIndex + 1); + index = (i1 >= 0) ? ((i2 < 0 || i1 < i2) ? i1 : i2) : i2; + if (index < 0) + continue loop; + distance = index - lastIndex - 1; + if (distance > 0) { + if (lastIndex === -1) + penalty += 10; + penalty += distance; + matchMask = matchMask | (1 << j); + } + lastIndex = index; + } + } + } + item.matchMask = matchMask; + item.exactMatch = penalty ? 0 : 1; + item.$score = (item.score || 0) - penalty; + results.push(item); + } + var keywords = []; + for (var i=0, j=results.length; i=0;){ + if (!results[i]) continue + if (results[i].meta=='local' && keywords.indexOf(results[i].caption)!=-1){ + results.splice(i,1) + } + } + + return results; + }; +}).call(FilteredList.prototype); + +exports.Autocomplete = Autocomplete; +exports.FilteredList = FilteredList; + +}); + +define("ace/autocomplete/text_completer",["require","exports","module","ace/range"], function(require, exports, module) { + var Range = require("../range").Range; + + var splitRegex = /[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/; + + function getWordIndex(doc, pos) { + var textBefore = doc.getTextRange(Range.fromPoints({row: 0, column:0}, pos)); + return textBefore.split(splitRegex).length - 1; + } + function wordDistance(doc, pos) { + var prefixPos = getWordIndex(doc, pos); + var words = doc.getValue().split(splitRegex); + var wordScores = Object.create(null); + + var currentWord = words[prefixPos]; + + words.forEach(function(word, idx) { + if (!word || word === currentWord) return; + + var distance = Math.abs(prefixPos - idx); + var score = words.length - distance; + if (wordScores[word]) { + wordScores[word] = Math.max(score, wordScores[word]); + } else { + wordScores[word] = score; + } + }); + return wordScores; + } + + exports.getCompletions = function(editor, session, pos, prefix, callback) { + var wordScore = wordDistance(session, pos); + var wordList = Object.keys(wordScore); + callback(null, wordList.map(function(word) { + return { + caption: word, + value: word, + score: wordScore[word], + meta: "local" + }; + })); + }; +}); + +define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/lib/lang","ace/autocomplete/util","ace/autocomplete/text_completer","ace/editor","ace/config"], function(require, exports, module) { +"use strict"; + +var snippetManager = require("../snippets").snippetManager; +var Autocomplete = require("../autocomplete").Autocomplete; +var config = require("../config"); +var lang = require("../lib/lang"); +var util = require("../autocomplete/util"); + +var textCompleter = require("../autocomplete/text_completer"); +var keyWordCompleter = { + getCompletions: function(editor, session, pos, prefix, callback) { + if (session.$mode.completer) { + return session.$mode.completer.getCompletions(editor, session, pos, prefix, callback); + } + var state = editor.session.getState(pos.row); + var completions = session.$mode.getCompletions(state, session, pos, prefix); + callback(null, completions); + } +}; + +var transformSnippetTooltip = function(str) { + var record = {}; + return str.replace(/\${(\d+)(:(.*?))?}/g, function(_, p1, p2, p3) { + return (record[p1] = p3 || ''); + }).replace(/\$(\d+?)/g, function (_, p1) { + return record[p1]; + }); +}; + +var snippetCompleter = { + getCompletions: function(editor, session, pos, prefix, callback) { + var scopes = []; + var token = session.getTokenAt(pos.row, pos.column); + if (token && token.type.match(/(tag-name|tag-open|tag-whitespace|attribute-name|attribute-value)\.xml$/)) + scopes.push('html-tag'); + else + scopes = snippetManager.getActiveScopes(editor); + + var snippetMap = snippetManager.snippetMap; + var completions = []; + scopes.forEach(function(scope) { + var snippets = snippetMap[scope] || []; + for (var i = snippets.length; i--;) { + var s = snippets[i]; + var caption = s.name || s.tabTrigger; + if (!caption) + continue; + completions.push({ + caption: caption, + snippet: s.content, + meta: s.tabTrigger && !s.name ? s.tabTrigger + "\u21E5 " : "snippet", + type: "snippet" + }); + } + }, this); + callback(null, completions); + }, + getDocTooltip: function(item) { + if (item.type == "snippet" && !item.docHTML) { + item.docHTML = [ + "", lang.escapeHTML(item.caption), "", "
", + lang.escapeHTML(transformSnippetTooltip(item.snippet)) + ].join(""); + } + } +}; + +var completers = [snippetCompleter, textCompleter, keyWordCompleter]; +exports.setCompleters = function(val) { + completers.length = 0; + if (val) completers.push.apply(completers, val); +}; +exports.addCompleter = function(completer) { + completers.push(completer); +}; +exports.textCompleter = textCompleter; +exports.keyWordCompleter = keyWordCompleter; +exports.snippetCompleter = snippetCompleter; + +var expandSnippet = { + name: "expandSnippet", + exec: function(editor) { + return snippetManager.expandWithTab(editor); + }, + bindKey: "Tab" +}; + +var onChangeMode = function(e, editor) { + loadSnippetsForMode(editor.session.$mode); +}; + +var loadSnippetsForMode = function(mode) { + if (typeof mode == "string") + mode = config.$modes[mode]; + if (!mode) + return; + if (!snippetManager.files) + snippetManager.files = {}; + + loadSnippetFile(mode.$id, mode.snippetFileId); + if (mode.modes) + mode.modes.forEach(loadSnippetsForMode); +}; + +var loadSnippetFile = function(id, snippetFilePath) { + if (!snippetFilePath || !id || snippetManager.files[id]) + return; + snippetManager.files[id] = {}; + config.loadModule(snippetFilePath, function(m) { + if (!m) return; + snippetManager.files[id] = m; + if (!m.snippets && m.snippetText) + m.snippets = snippetManager.parseSnippetFile(m.snippetText); + snippetManager.register(m.snippets || [], m.scope); + if (m.includeScopes) { + snippetManager.snippetMap[m.scope].includeScopes = m.includeScopes; + m.includeScopes.forEach(function(x) { + loadSnippetsForMode("ace/mode/" + x); + }); + } + }); +}; + +var doLiveAutocomplete = function(e) { + var editor = e.editor; + var hasCompleter = editor.completer && editor.completer.activated; + if (e.command.name === "backspace") { + if (hasCompleter && !util.getCompletionPrefix(editor)) + editor.completer.detach(); + } + else if (e.command.name === "insertstring") { + var prefix = util.getCompletionPrefix(editor); + if (prefix && !hasCompleter) { + var completer = Autocomplete.for(editor); + completer.autoInsert = false; + completer.showPopup(editor); + } + } +}; + +var Editor = require("../editor").Editor; +require("../config").defineOptions(Editor.prototype, "editor", { + enableBasicAutocompletion: { + set: function(val) { + if (val) { + if (!this.completers) + this.completers = Array.isArray(val)? val: completers; + this.commands.addCommand(Autocomplete.startCommand); + } else { + this.commands.removeCommand(Autocomplete.startCommand); + } + }, + value: false + }, + enableLiveAutocompletion: { + set: function(val) { + if (val) { + if (!this.completers) + this.completers = Array.isArray(val)? val: completers; + this.commands.on('afterExec', doLiveAutocomplete); + } else { + this.commands.removeListener('afterExec', doLiveAutocomplete); + } + }, + value: false + }, + enableSnippets: { + set: function(val) { + if (val) { + this.commands.addCommand(expandSnippet); + this.on("changeMode", onChangeMode); + onChangeMode(null, this); + } else { + this.commands.removeCommand(expandSnippet); + this.off("changeMode", onChangeMode); + } + }, + value: false + } +}); +}); (function() { + window.require(["ace/ext/language_tools"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-linking.js b/app/Resources/ui/js/ace/ext-linking.js new file mode 100644 index 00000000..147efe94 --- /dev/null +++ b/app/Resources/ui/js/ace/ext-linking.js @@ -0,0 +1,64 @@ +define("ace/ext/linking",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) { + +var Editor = require("../editor").Editor; + +require("../config").defineOptions(Editor.prototype, "editor", { + enableLinking: { + set: function(val) { + if (val) { + this.on("click", onClick); + this.on("mousemove", onMouseMove); + } else { + this.off("click", onClick); + this.off("mousemove", onMouseMove); + } + }, + value: false + } +}); + +exports.previousLinkingHover = false; + +function onMouseMove(e) { + var editor = e.editor; + var ctrl = e.getAccelKey(); + + if (ctrl) { + var editor = e.editor; + var docPos = e.getDocumentPosition(); + var session = editor.session; + var token = session.getTokenAt(docPos.row, docPos.column); + + if (exports.previousLinkingHover && exports.previousLinkingHover != token) { + editor._emit("linkHoverOut"); + } + editor._emit("linkHover", {position: docPos, token: token}); + exports.previousLinkingHover = token; + } else if (exports.previousLinkingHover) { + editor._emit("linkHoverOut"); + exports.previousLinkingHover = false; + } +} + +function onClick(e) { + var ctrl = e.getAccelKey(); + var button = e.getButton(); + + if (button == 0 && ctrl) { + var editor = e.editor; + var docPos = e.getDocumentPosition(); + var session = editor.session; + var token = session.getTokenAt(docPos.row, docPos.column); + + editor._emit("linkClick", {position: docPos, token: token}); + } +} + +}); (function() { + window.require(["ace/ext/linking"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-modelist.js b/app/Resources/ui/js/ace/ext-modelist.js new file mode 100644 index 00000000..20a8fa7a --- /dev/null +++ b/app/Resources/ui/js/ace/ext-modelist.js @@ -0,0 +1,253 @@ +define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var modes = []; +function getModeForPath(path) { + var mode = modesByName.text; + var fileName = path.split(/[\/\\]/).pop(); + for (var i = 0; i < modes.length; i++) { + if (modes[i].supportsFile(fileName)) { + mode = modes[i]; + break; + } + } + return mode; +} + +var Mode = function(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function(a, b){ + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } else { + re = "^.*\\.(" + extensions + ")$"; + } + + this.extRe = new RegExp(re, "gi"); +}; + +Mode.prototype.supportsFile = function(filename) { + return filename.match(this.extRe); +}; +var supportedModes = { + ABAP: ["abap"], + ABC: ["abc"], + ActionScript:["as"], + ADA: ["ada|adb"], + Alda: ["alda"], + Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], + Apex: ["apex|cls|trigger|tgr"], + AQL: ["aql"], + AsciiDoc: ["asciidoc|adoc"], + ASL: ["dsl|asl|asl.json"], + Assembly_x86:["asm|a"], + AutoHotKey: ["ahk"], + BatchFile: ["bat|cmd"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm"], + Crystal: ["cr"], + CSharp: ["cs"], + Csound_Document: ["csd"], + Csound_Orchestra: ["orc"], + Csound_Score: ["sco"], + CSS: ["css"], + Curly: ["curly"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Edifact: ["edi"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], + FSL: ["fsl"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], + GraphQLSchema: ["gql"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], + Haskell_Cabal: ["cabal"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml|vue|we|wpy"], + HTML_Elixir: ["eex|html.eex"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Ion: ["ion"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|jsx|cjs|mjs"], + JSON: ["json"], + JSON5: ["json5"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSSM: ["jssm|jssm_state"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + Latte: ["latte"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + Log: ["log"], + LogiQL: ["logic|lql"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MediaWiki: ["wiki|mediawiki"], + MEL: ["mel"], + MIPS: ["s|asm"], + MIXAL: ["mixal"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Nginx: ["nginx|conf"], + Nim: ["nim"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + Nunjucks: ["nunjucks|nunjs|nj|njk"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + PartiQL: ["partiql|pql"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP_Laravel_blade: ["blade.php"], + PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], + Pig: ["pig"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prisma: ["prisma"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + Puppet: ["epp|pp"], + Python: ["py"], + QML: ["qml"], + R: ["r"], + Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + Red: ["red|reds"], + RHTML: ["Rhtml"], + Robot: ["robot|resource"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SaC: ["sac"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala|sbt"], + Scheme: ["scm|sm|rkt|oak|scheme"], + Scrypt: ["scrypt"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Slim: ["slim|skim"], + Smarty: ["smarty|tpl"], + Smithy: ["smithy"], + snippets: ["snippets"], + Soy_Template:["soy"], + Space: ["space"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Terraform: ["tf", "tfvars", "terragrunt"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSX: ["tsx"], + Twig: ["twig|swig"], + Typescript: ["ts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], + Visualforce: ["vfp|component|page"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Zeek: ["zeek|bro"], + Django: ["html"] +}; + +var nameOverrides = { + ObjectiveC: "Objective-C", + CSharp: "C#", + golang: "Go", + C_Cpp: "C and C++", + Csound_Document: "Csound Document", + Csound_Orchestra: "Csound", + Csound_Score: "Csound Score", + coffee: "CoffeeScript", + HTML_Ruby: "HTML (Ruby)", + HTML_Elixir: "HTML (Elixir)", + FTL: "FreeMarker", + PHP_Laravel_blade: "PHP (Blade Template)", + Perl6: "Perl 6", + AutoHotKey: "AutoHotkey / AutoIt" +}; + +var modesByName = {}; +for (var name in supportedModes) { + var data = supportedModes[name]; + var displayName = (nameOverrides[name] || name).replace(/_/g, " "); + var filename = name.toLowerCase(); + var mode = new Mode(filename, displayName, data[0]); + modesByName[filename] = mode; + modes.push(mode); +} + +module.exports = { + getModeForPath: getModeForPath, + modes: modes, + modesByName: modesByName +}; + +}); (function() { + window.require(["ace/ext/modelist"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-options.js b/app/Resources/ui/js/ace/ext-options.js new file mode 100644 index 00000000..be4b96da --- /dev/null +++ b/app/Resources/ui/js/ace/ext-options.js @@ -0,0 +1,804 @@ +define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +'use strict'; +var dom = require("../../lib/dom"); +var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ +background-color: #F7F7F7;\ +color: black;\ +box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ +padding: 1em 0.5em 2em 1em;\ +overflow: auto;\ +position: absolute;\ +margin: 0;\ +bottom: 0;\ +right: 0;\ +top: 0;\ +z-index: 9991;\ +cursor: default;\ +}\ +.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ +box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ +background-color: rgba(255, 255, 255, 0.6);\ +color: black;\ +}\ +.ace_optionsMenuEntry:hover {\ +background-color: rgba(100, 100, 100, 0.1);\ +transition: all 0.3s\ +}\ +.ace_closeButton {\ +background: rgba(245, 146, 146, 0.5);\ +border: 1px solid #F48A8A;\ +border-radius: 50%;\ +padding: 7px;\ +position: absolute;\ +right: -8px;\ +top: -8px;\ +z-index: 100000;\ +}\ +.ace_closeButton{\ +background: rgba(245, 146, 146, 0.9);\ +}\ +.ace_optionsMenuKey {\ +color: darkslateblue;\ +font-weight: bold;\ +}\ +.ace_optionsMenuCommand {\ +color: darkcyan;\ +font-weight: normal;\ +}\ +.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\ +vertical-align: middle;\ +}\ +.ace_optionsMenuEntry button[ace_selected_button=true] {\ +background: #e7e7e7;\ +box-shadow: 1px 0px 2px 0px #adadad inset;\ +border-color: #adadad;\ +}\ +.ace_optionsMenuEntry button {\ +background: white;\ +border: 1px solid lightgray;\ +margin: 0px;\ +}\ +.ace_optionsMenuEntry button:hover{\ +background: #f0f0f0;\ +}"; +dom.importCssString(cssText, "settings_menu.css", false); + +module.exports.overlayPage = function overlayPage(editor, contentElement, callback) { + var closer = document.createElement('div'); + var ignoreFocusOut = false; + + function documentEscListener(e) { + if (e.keyCode === 27) { + close(); + } + } + + function close() { + if (!closer) return; + document.removeEventListener('keydown', documentEscListener); + closer.parentNode.removeChild(closer); + if (editor) { + editor.focus(); + } + closer = null; + callback && callback(); + } + function setIgnoreFocusOut(ignore) { + ignoreFocusOut = ignore; + if (ignore) { + closer.style.pointerEvents = "none"; + contentElement.style.pointerEvents = "auto"; + } + } + + closer.style.cssText = 'margin: 0; padding: 0; ' + + 'position: fixed; top:0; bottom:0; left:0; right:0;' + + 'z-index: 9990; ' + + (editor ? 'background-color: rgba(0, 0, 0, 0.3);' : ''); + closer.addEventListener('click', function(e) { + if (!ignoreFocusOut) { + close(); + } + }); + document.addEventListener('keydown', documentEscListener); + + contentElement.addEventListener('click', function (e) { + e.stopPropagation(); + }); + + closer.appendChild(contentElement); + document.body.appendChild(closer); + if (editor) { + editor.blur(); + } + return { + close: close, + setIgnoreFocusOut: setIgnoreFocusOut + }; +}; + +}); + +define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var modes = []; +function getModeForPath(path) { + var mode = modesByName.text; + var fileName = path.split(/[\/\\]/).pop(); + for (var i = 0; i < modes.length; i++) { + if (modes[i].supportsFile(fileName)) { + mode = modes[i]; + break; + } + } + return mode; +} + +var Mode = function(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function(a, b){ + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } else { + re = "^.*\\.(" + extensions + ")$"; + } + + this.extRe = new RegExp(re, "gi"); +}; + +Mode.prototype.supportsFile = function(filename) { + return filename.match(this.extRe); +}; +var supportedModes = { + ABAP: ["abap"], + ABC: ["abc"], + ActionScript:["as"], + ADA: ["ada|adb"], + Alda: ["alda"], + Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], + Apex: ["apex|cls|trigger|tgr"], + AQL: ["aql"], + AsciiDoc: ["asciidoc|adoc"], + ASL: ["dsl|asl|asl.json"], + Assembly_x86:["asm|a"], + AutoHotKey: ["ahk"], + BatchFile: ["bat|cmd"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm"], + Crystal: ["cr"], + CSharp: ["cs"], + Csound_Document: ["csd"], + Csound_Orchestra: ["orc"], + Csound_Score: ["sco"], + CSS: ["css"], + Curly: ["curly"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Edifact: ["edi"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], + FSL: ["fsl"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], + GraphQLSchema: ["gql"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], + Haskell_Cabal: ["cabal"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml|vue|we|wpy"], + HTML_Elixir: ["eex|html.eex"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Ion: ["ion"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|jsx|cjs|mjs"], + JSON: ["json"], + JSON5: ["json5"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSSM: ["jssm|jssm_state"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + Latte: ["latte"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + Log: ["log"], + LogiQL: ["logic|lql"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MediaWiki: ["wiki|mediawiki"], + MEL: ["mel"], + MIPS: ["s|asm"], + MIXAL: ["mixal"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Nginx: ["nginx|conf"], + Nim: ["nim"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + Nunjucks: ["nunjucks|nunjs|nj|njk"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + PartiQL: ["partiql|pql"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP_Laravel_blade: ["blade.php"], + PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], + Pig: ["pig"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prisma: ["prisma"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + Puppet: ["epp|pp"], + Python: ["py"], + QML: ["qml"], + R: ["r"], + Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + Red: ["red|reds"], + RHTML: ["Rhtml"], + Robot: ["robot|resource"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SaC: ["sac"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala|sbt"], + Scheme: ["scm|sm|rkt|oak|scheme"], + Scrypt: ["scrypt"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Slim: ["slim|skim"], + Smarty: ["smarty|tpl"], + Smithy: ["smithy"], + snippets: ["snippets"], + Soy_Template:["soy"], + Space: ["space"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Terraform: ["tf", "tfvars", "terragrunt"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSX: ["tsx"], + Twig: ["twig|swig"], + Typescript: ["ts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], + Visualforce: ["vfp|component|page"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Zeek: ["zeek|bro"], + Django: ["html"] +}; + +var nameOverrides = { + ObjectiveC: "Objective-C", + CSharp: "C#", + golang: "Go", + C_Cpp: "C and C++", + Csound_Document: "Csound Document", + Csound_Orchestra: "Csound", + Csound_Score: "Csound Score", + coffee: "CoffeeScript", + HTML_Ruby: "HTML (Ruby)", + HTML_Elixir: "HTML (Elixir)", + FTL: "FreeMarker", + PHP_Laravel_blade: "PHP (Blade Template)", + Perl6: "Perl 6", + AutoHotKey: "AutoHotkey / AutoIt" +}; + +var modesByName = {}; +for (var name in supportedModes) { + var data = supportedModes[name]; + var displayName = (nameOverrides[name] || name).replace(/_/g, " "); + var filename = name.toLowerCase(); + var mode = new Mode(filename, displayName, data[0]); + modesByName[filename] = mode; + modes.push(mode); +} + +module.exports = { + getModeForPath: getModeForPath, + modes: modes, + modesByName: modesByName +}; + +}); + +define("ace/ext/themelist",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var themeData = [ + ["Chrome" ], + ["Clouds" ], + ["Crimson Editor" ], + ["Dawn" ], + ["Dreamweaver" ], + ["Eclipse" ], + ["GitHub" ], + ["IPlastic" ], + ["Solarized Light"], + ["TextMate" ], + ["Tomorrow" ], + ["XCode" ], + ["Kuroir"], + ["KatzenMilch"], + ["SQL Server" ,"sqlserver" , "light"], + ["Ambiance" ,"ambiance" , "dark"], + ["Chaos" ,"chaos" , "dark"], + ["Clouds Midnight" ,"clouds_midnight" , "dark"], + ["Dracula" ,"" , "dark"], + ["Cobalt" ,"cobalt" , "dark"], + ["Gruvbox" ,"gruvbox" , "dark"], + ["Green on Black" ,"gob" , "dark"], + ["idle Fingers" ,"idle_fingers" , "dark"], + ["krTheme" ,"kr_theme" , "dark"], + ["Merbivore" ,"merbivore" , "dark"], + ["Merbivore Soft" ,"merbivore_soft" , "dark"], + ["Mono Industrial" ,"mono_industrial" , "dark"], + ["Monokai" ,"monokai" , "dark"], + ["Nord Dark" ,"nord_dark" , "dark"], + ["One Dark" ,"one_dark" , "dark"], + ["Pastel on dark" ,"pastel_on_dark" , "dark"], + ["Solarized Dark" ,"solarized_dark" , "dark"], + ["Terminal" ,"terminal" , "dark"], + ["Tomorrow Night" ,"tomorrow_night" , "dark"], + ["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"], + ["Tomorrow Night Bright","tomorrow_night_bright" , "dark"], + ["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"], + ["Twilight" ,"twilight" , "dark"], + ["Vibrant Ink" ,"vibrant_ink" , "dark"] +]; + + +exports.themesByName = {}; +exports.themes = themeData.map(function(data) { + var name = data[1] || data[0].replace(/ /g, "_").toLowerCase(); + var theme = { + caption: data[0], + theme: "ace/theme/" + name, + isDark: data[2] == "dark", + name: name + }; + exports.themesByName[name] = theme; + return theme; +}); + +}); + +define("ace/ext/options",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/lib/oop","ace/config","ace/lib/event_emitter","ace/ext/modelist","ace/ext/themelist"], function(require, exports, module) { +"use strict"; + +require("./menu_tools/overlay_page"); + +var dom = require("../lib/dom"); +var oop = require("../lib/oop"); +var config = require("../config"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var buildDom = dom.buildDom; + +var modelist = require("./modelist"); +var themelist = require("./themelist"); + +var themes = { Bright: [], Dark: [] }; +themelist.themes.forEach(function(x) { + themes[x.isDark ? "Dark" : "Bright"].push({ caption: x.caption, value: x.theme }); +}); + +var modes = modelist.modes.map(function(x){ + return { caption: x.caption, value: x.mode }; +}); + + +var optionGroups = { + Main: { + Mode: { + path: "mode", + type: "select", + items: modes + }, + Theme: { + path: "theme", + type: "select", + items: themes + }, + "Keybinding": { + type: "buttonBar", + path: "keyboardHandler", + items: [ + { caption : "Ace", value : null }, + { caption : "Vim", value : "ace/keyboard/vim" }, + { caption : "Emacs", value : "ace/keyboard/emacs" }, + { caption : "Sublime", value : "ace/keyboard/sublime" }, + { caption : "VSCode", value : "ace/keyboard/vscode" } + ] + }, + "Font Size": { + path: "fontSize", + type: "number", + defaultValue: 12, + defaults: [ + {caption: "12px", value: 12}, + {caption: "24px", value: 24} + ] + }, + "Soft Wrap": { + type: "buttonBar", + path: "wrap", + items: [ + { caption : "Off", value : "off" }, + { caption : "View", value : "free" }, + { caption : "margin", value : "printMargin" }, + { caption : "40", value : "40" } + ] + }, + "Cursor Style": { + path: "cursorStyle", + items: [ + { caption : "Ace", value : "ace" }, + { caption : "Slim", value : "slim" }, + { caption : "Smooth", value : "smooth" }, + { caption : "Smooth And Slim", value : "smooth slim" }, + { caption : "Wide", value : "wide" } + ] + }, + "Folding": { + path: "foldStyle", + items: [ + { caption : "Manual", value : "manual" }, + { caption : "Mark begin", value : "markbegin" }, + { caption : "Mark begin and end", value : "markbeginend" } + ] + }, + "Soft Tabs": [{ + path: "useSoftTabs" + }, { + ariaLabel: "Tab Size", + path: "tabSize", + type: "number", + values: [2, 3, 4, 8, 16] + }], + "Overscroll": { + type: "buttonBar", + path: "scrollPastEnd", + items: [ + { caption : "None", value : 0 }, + { caption : "Half", value : 0.5 }, + { caption : "Full", value : 1 } + ] + } + }, + More: { + "Atomic soft tabs": { + path: "navigateWithinSoftTabs" + }, + "Enable Behaviours": { + path: "behavioursEnabled" + }, + "Wrap with quotes": { + path: "wrapBehavioursEnabled" + }, + "Enable Auto Indent": { + path: "enableAutoIndent" + }, + "Full Line Selection": { + type: "checkbox", + values: "text|line", + path: "selectionStyle" + }, + "Highlight Active Line": { + path: "highlightActiveLine" + }, + "Show Invisibles": { + path: "showInvisibles" + }, + "Show Indent Guides": { + path: "displayIndentGuides" + }, + "Persistent HScrollbar": { + path: "hScrollBarAlwaysVisible" + }, + "Persistent VScrollbar": { + path: "vScrollBarAlwaysVisible" + }, + "Animate scrolling": { + path: "animatedScroll" + }, + "Show Gutter": { + path: "showGutter" + }, + "Show Line Numbers": { + path: "showLineNumbers" + }, + "Relative Line Numbers": { + path: "relativeLineNumbers" + }, + "Fixed Gutter Width": { + path: "fixedWidthGutter" + }, + "Show Print Margin": [{ + path: "showPrintMargin" + }, { + ariaLabel: "Print Margin", + type: "number", + path: "printMarginColumn" + }], + "Indented Soft Wrap": { + path: "indentedSoftWrap" + }, + "Highlight selected word": { + path: "highlightSelectedWord" + }, + "Fade Fold Widgets": { + path: "fadeFoldWidgets" + }, + "Use textarea for IME": { + path: "useTextareaForIME" + }, + "Merge Undo Deltas": { + path: "mergeUndoDeltas", + items: [ + { caption : "Always", value : "always" }, + { caption : "Never", value : "false" }, + { caption : "Timed", value : "true" } + ] + }, + "Elastic Tabstops": { + path: "useElasticTabstops" + }, + "Incremental Search": { + path: "useIncrementalSearch" + }, + "Read-only": { + path: "readOnly" + }, + "Copy without selection": { + path: "copyWithEmptySelection" + }, + "Live Autocompletion": { + path: "enableLiveAutocompletion" + } + } +}; + + +var OptionPanel = function(editor, element) { + this.editor = editor; + this.container = element || document.createElement("div"); + this.groups = []; + this.options = {}; +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.add = function(config) { + if (config.Main) + oop.mixin(optionGroups.Main, config.Main); + if (config.More) + oop.mixin(optionGroups.More, config.More); + }; + + this.render = function() { + this.container.innerHTML = ""; + buildDom(["table", {role: "presentation", id: "controls"}, + this.renderOptionGroup(optionGroups.Main), + ["tr", null, ["td", {colspan: 2}, + ["table", {role: "presentation", id: "more-controls"}, + this.renderOptionGroup(optionGroups.More) + ] + ]], + ["tr", null, ["td", {colspan: 2}, "version " + config.version]] + ], this.container); + }; + + this.renderOptionGroup = function(group) { + return Object.keys(group).map(function(key, i) { + var item = group[key]; + if (!item.position) + item.position = i / 10000; + if (!item.label) + item.label = key; + return item; + }).sort(function(a, b) { + return a.position - b.position; + }).map(function(item) { + return this.renderOption(item.label, item); + }, this); + }; + + this.renderOptionControl = function(key, option) { + var self = this; + if (Array.isArray(option)) { + return option.map(function(x) { + return self.renderOptionControl(key, x); + }); + } + var control; + + var value = self.getOption(option); + + if (option.values && option.type != "checkbox") { + if (typeof option.values == "string") + option.values = option.values.split("|"); + option.items = option.values.map(function(v) { + return { value: v, name: v }; + }); + } + + if (option.type == "buttonBar") { + control = ["div", {role: "group", "aria-labelledby": option.path + "-label"}, option.items.map(function(item) { + return ["button", { + value: item.value, + ace_selected_button: value == item.value, + 'aria-pressed': value == item.value, + onclick: function() { + self.setOption(option, item.value); + var nodes = this.parentNode.querySelectorAll("[ace_selected_button]"); + for (var i = 0; i < nodes.length; i++) { + nodes[i].removeAttribute("ace_selected_button"); + nodes[i].setAttribute("aria-pressed", false); + } + this.setAttribute("ace_selected_button", true); + this.setAttribute("aria-pressed", true); + } + }, item.desc || item.caption || item.name]; + })]; + } else if (option.type == "number") { + control = ["input", {type: "number", value: value || option.defaultValue, style:"width:3em", oninput: function() { + self.setOption(option, parseInt(this.value)); + }}]; + if (option.ariaLabel) { + control[1]["aria-label"] = option.ariaLabel; + } else { + control[1].id = key; + } + if (option.defaults) { + control = [control, option.defaults.map(function(item) { + return ["button", {onclick: function() { + var input = this.parentNode.firstChild; + input.value = item.value; + input.oninput(); + }}, item.caption]; + })]; + } + } else if (option.items) { + var buildItems = function(items) { + return items.map(function(item) { + return ["option", { value: item.value || item.name }, item.desc || item.caption || item.name]; + }); + }; + + var items = Array.isArray(option.items) + ? buildItems(option.items) + : Object.keys(option.items).map(function(key) { + return ["optgroup", {"label": key}, buildItems(option.items[key])]; + }); + control = ["select", { id: key, value: value, onchange: function() { + self.setOption(option, this.value); + } }, items]; + } else { + if (typeof option.values == "string") + option.values = option.values.split("|"); + if (option.values) value = value == option.values[1]; + control = ["input", { type: "checkbox", id: key, checked: value || null, onchange: function() { + var value = this.checked; + if (option.values) value = option.values[value ? 1 : 0]; + self.setOption(option, value); + }}]; + if (option.type == "checkedNumber") { + control = [control, []]; + } + } + return control; + }; + + this.renderOption = function(key, option) { + if (option.path && !option.onchange && !this.editor.$options[option.path]) + return; + var path = Array.isArray(option) ? option[0].path : option.path; + this.options[path] = option; + var safeKey = "-" + path; + var safeId = path + "-label"; + var control = this.renderOptionControl(safeKey, option); + return ["tr", {class: "ace_optionsMenuEntry"}, ["td", + ["label", {for: safeKey, id: safeId}, key] + ], ["td", control]]; + }; + + this.setOption = function(option, value) { + if (typeof option == "string") + option = this.options[option]; + if (value == "false") value = false; + if (value == "true") value = true; + if (value == "null") value = null; + if (value == "undefined") value = undefined; + if (typeof value == "string" && parseFloat(value).toString() == value) + value = parseFloat(value); + if (option.onchange) + option.onchange(value); + else if (option.path) + this.editor.setOption(option.path, value); + this._signal("setOption", {name: option.path, value: value}); + }; + + this.getOption = function(option) { + if (option.getValue) + return option.getValue(); + return this.editor.getOption(option.path); + }; + +}).call(OptionPanel.prototype); + +exports.OptionPanel = OptionPanel; + +}); (function() { + window.require(["ace/ext/options"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-prompt.js b/app/Resources/ui/js/ace/ext-prompt.js new file mode 100644 index 00000000..247c16a0 --- /dev/null +++ b/app/Resources/ui/js/ace/ext-prompt.js @@ -0,0 +1,2825 @@ +define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",["require","exports","module","ace/lib/keys"], function(require, exports, module) { +"use strict"; +var keys = require("../../lib/keys"); +module.exports.getEditorKeybordShortcuts = function(editor) { + var KEY_MODS = keys.KEY_MODS; + var keybindings = []; + var commandMap = {}; + editor.keyBinding.$handlers.forEach(function(handler) { + var ckb = handler.commandKeyBinding; + for (var i in ckb) { + var key = i.replace(/(^|-)\w/g, function(x) { return x.toUpperCase(); }); + var commands = ckb[i]; + if (!Array.isArray(commands)) + commands = [commands]; + commands.forEach(function(command) { + if (typeof command != "string") + command = command.name; + if (commandMap[command]) { + commandMap[command].key += "|" + key; + } else { + commandMap[command] = {key: key, command: command}; + keybindings.push(commandMap[command]); + } + }); + } + }); + return keybindings; +}; + +}); + +define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var Renderer = require("../virtual_renderer").VirtualRenderer; +var Editor = require("../editor").Editor; +var Range = require("../range").Range; +var event = require("../lib/event"); +var lang = require("../lib/lang"); +var dom = require("../lib/dom"); + +var $singleLineEditor = function(el) { + var renderer = new Renderer(el); + + renderer.$maxLines = 4; + + var editor = new Editor(renderer); + + editor.setHighlightActiveLine(false); + editor.setShowPrintMargin(false); + editor.renderer.setShowGutter(false); + editor.renderer.setHighlightGutterLine(false); + + editor.$mouseHandler.$focusTimeout = 0; + editor.$highlightTagPending = true; + + return editor; +}; + +var AcePopup = function(parentNode) { + var el = dom.createElement("div"); + var popup = new $singleLineEditor(el); + + if (parentNode) + parentNode.appendChild(el); + el.style.display = "none"; + popup.renderer.content.style.cursor = "default"; + popup.renderer.setStyle("ace_autocomplete"); + + popup.setOption("displayIndentGuides", false); + popup.setOption("dragDelay", 150); + + var noop = function(){}; + + popup.focus = noop; + popup.$isFocused = true; + + popup.renderer.$cursorLayer.restartTimer = noop; + popup.renderer.$cursorLayer.element.style.opacity = 0; + + popup.renderer.$maxLines = 8; + popup.renderer.$keepTextAreaAtCursor = false; + + popup.setHighlightActiveLine(false); + popup.session.highlight(""); + popup.session.$searchHighlight.clazz = "ace_highlight-marker"; + + popup.on("mousedown", function(e) { + var pos = e.getDocumentPosition(); + popup.selection.moveToPosition(pos); + selectionMarker.start.row = selectionMarker.end.row = pos.row; + e.stop(); + }); + + var lastMouseEvent; + var hoverMarker = new Range(-1,0,-1,Infinity); + var selectionMarker = new Range(-1,0,-1,Infinity); + selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine"); + popup.setSelectOnHover = function(val) { + if (!val) { + hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine"); + } else if (hoverMarker.id) { + popup.session.removeMarker(hoverMarker.id); + hoverMarker.id = null; + } + }; + popup.setSelectOnHover(false); + popup.on("mousemove", function(e) { + if (!lastMouseEvent) { + lastMouseEvent = e; + return; + } + if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) { + return; + } + lastMouseEvent = e; + lastMouseEvent.scrollTop = popup.renderer.scrollTop; + var row = lastMouseEvent.getDocumentPosition().row; + if (hoverMarker.start.row != row) { + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row); + } + }); + popup.renderer.on("beforeRender", function() { + if (lastMouseEvent && hoverMarker.start.row != -1) { + lastMouseEvent.$pos = null; + var row = lastMouseEvent.getDocumentPosition().row; + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row, true); + } + }); + popup.renderer.on("afterRender", function() { + var row = popup.getRow(); + var t = popup.renderer.$textLayer; + var selected = t.element.childNodes[row - t.config.firstRow]; + if (selected !== t.selectedNode && t.selectedNode) + dom.removeCssClass(t.selectedNode, "ace_selected"); + t.selectedNode = selected; + if (selected) + dom.addCssClass(selected, "ace_selected"); + }); + var hideHoverMarker = function() { setHoverMarker(-1); }; + var setHoverMarker = function(row, suppressRedraw) { + if (row !== hoverMarker.start.row) { + hoverMarker.start.row = hoverMarker.end.row = row; + if (!suppressRedraw) + popup.session._emit("changeBackMarker"); + popup._emit("changeHoverMarker"); + } + }; + popup.getHoveredRow = function() { + return hoverMarker.start.row; + }; + + event.addListener(popup.container, "mouseout", hideHoverMarker); + popup.on("hide", hideHoverMarker); + popup.on("changeSelection", hideHoverMarker); + + popup.session.doc.getLength = function() { + return popup.data.length; + }; + popup.session.doc.getLine = function(i) { + var data = popup.data[i]; + if (typeof data == "string") + return data; + return (data && data.value) || ""; + }; + + var bgTokenizer = popup.session.bgTokenizer; + bgTokenizer.$tokenizeRow = function(row) { + var data = popup.data[row]; + var tokens = []; + if (!data) + return tokens; + if (typeof data == "string") + data = {value: data}; + var caption = data.caption || data.value || data.name; + + function addToken(value, className) { + value && tokens.push({ + type: (data.className || "") + (className || ""), + value: value + }); + } + + var lower = caption.toLowerCase(); + var filterText = (popup.filterText || "").toLowerCase(); + var lastIndex = 0; + var lastI = 0; + for (var i = 0; i <= filterText.length; i++) { + if (i != lastI && (data.matchMask & (1 << i) || i == filterText.length)) { + var sub = filterText.slice(lastI, i); + lastI = i; + var index = lower.indexOf(sub, lastIndex); + if (index == -1) continue; + addToken(caption.slice(lastIndex, index), ""); + lastIndex = index + sub.length; + addToken(caption.slice(index, lastIndex), "completion-highlight"); + } + } + addToken(caption.slice(lastIndex, caption.length), ""); + + if (data.meta) + tokens.push({type: "completion-meta", value: data.meta}); + if (data.message) + tokens.push({type: "completion-message", value: data.message}); + + return tokens; + }; + bgTokenizer.$updateOnChange = noop; + bgTokenizer.start = noop; + + popup.session.$computeWidth = function() { + return this.screenWidth = 0; + }; + popup.isOpen = false; + popup.isTopdown = false; + popup.autoSelect = true; + popup.filterText = ""; + + popup.data = []; + popup.setData = function(list, filterText) { + popup.filterText = filterText || ""; + popup.setValue(lang.stringRepeat("\n", list.length), -1); + popup.data = list || []; + popup.setRow(0); + }; + popup.getData = function(row) { + return popup.data[row]; + }; + + popup.getRow = function() { + return selectionMarker.start.row; + }; + popup.setRow = function(line) { + line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length, line)); + if (selectionMarker.start.row != line) { + popup.selection.clearSelection(); + selectionMarker.start.row = selectionMarker.end.row = line || 0; + popup.session._emit("changeBackMarker"); + popup.moveCursorTo(line || 0, 0); + if (popup.isOpen) + popup._signal("select"); + } + }; + + popup.on("changeSelection", function() { + if (popup.isOpen) + popup.setRow(popup.selection.lead.row); + popup.renderer.scrollCursorIntoView(); + }); + + popup.hide = function() { + this.container.style.display = "none"; + this._signal("hide"); + popup.isOpen = false; + }; + popup.show = function(pos, lineHeight, topdownOnly) { + var el = this.container; + var screenHeight = window.innerHeight; + var screenWidth = window.innerWidth; + var renderer = this.renderer; + var maxH = renderer.$maxLines * lineHeight * 1.4; + var top = pos.top + this.$borderSize; + var allowTopdown = top > screenHeight / 2 && !topdownOnly; + if (allowTopdown && top + lineHeight + maxH > screenHeight) { + renderer.$maxPixelHeight = top - 2 * this.$borderSize; + el.style.top = ""; + el.style.bottom = screenHeight - top + "px"; + popup.isTopdown = false; + } else { + top += lineHeight; + renderer.$maxPixelHeight = screenHeight - top - 0.2 * lineHeight; + el.style.top = top + "px"; + el.style.bottom = ""; + popup.isTopdown = true; + } + + el.style.display = ""; + + var left = pos.left; + if (left + el.offsetWidth > screenWidth) + left = screenWidth - el.offsetWidth; + + el.style.left = left + "px"; + + this._signal("show"); + lastMouseEvent = null; + popup.isOpen = true; + }; + + popup.goTo = function(where) { + var row = this.getRow(); + var max = this.session.getLength() - 1; + + switch(where) { + case "up": row = row <= 0 ? max : row - 1; break; + case "down": row = row >= max ? -1 : row + 1; break; + case "start": row = 0; break; + case "end": row = max; break; + } + + this.setRow(row); + }; + + + popup.getTextLeftOffset = function() { + return this.$borderSize + this.renderer.$padding + this.$imageSize; + }; + + popup.$imageSize = 0; + popup.$borderSize = 1; + + return popup; +}; + +dom.importCssString("\ +.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\ + background-color: #CAD6FA;\ + z-index: 1;\ +}\ +.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\ + background-color: #3a674e;\ +}\ +.ace_editor.ace_autocomplete .ace_line-hover {\ + border: 1px solid #abbffe;\ + margin-top: -1px;\ + background: rgba(233,233,253,0.4);\ + position: absolute;\ + z-index: 2;\ +}\ +.ace_dark.ace_editor.ace_autocomplete .ace_line-hover {\ + border: 1px solid rgba(109, 150, 13, 0.8);\ + background: rgba(58, 103, 78, 0.62);\ +}\ +.ace_completion-meta {\ + opacity: 0.5;\ + margin: 0.9em;\ +}\ +.ace_completion-message {\ + color: blue;\ +}\ +.ace_editor.ace_autocomplete .ace_completion-highlight{\ + color: #2d69c7;\ +}\ +.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{\ + color: #93ca12;\ +}\ +.ace_editor.ace_autocomplete {\ + width: 300px;\ + z-index: 200000;\ + border: 1px lightgray solid;\ + position: fixed;\ + box-shadow: 2px 3px 5px rgba(0,0,0,.2);\ + line-height: 1.4;\ + background: #fefefe;\ + color: #111;\ +}\ +.ace_dark.ace_editor.ace_autocomplete {\ + border: 1px #484747 solid;\ + box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51);\ + line-height: 1.4;\ + background: #25282c;\ + color: #c1c1c1;\ +}", "autocompletion.css", false); + +exports.AcePopup = AcePopup; +exports.$singleLineEditor = $singleLineEditor; +}); + +define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.parForEach = function(array, fn, callback) { + var completed = 0; + var arLength = array.length; + if (arLength === 0) + callback(); + for (var i = 0; i < arLength; i++) { + fn(array[i], function(result, err) { + completed++; + if (completed === arLength) + callback(result, err); + }); + } +}; + +var ID_REGEX = /[a-zA-Z_0-9\$\-\u00A2-\u2000\u2070-\uFFFF]/; + +exports.retrievePrecedingIdentifier = function(text, pos, regex) { + regex = regex || ID_REGEX; + var buf = []; + for (var i = pos-1; i >= 0; i--) { + if (regex.test(text[i])) + buf.push(text[i]); + else + break; + } + return buf.reverse().join(""); +}; + +exports.retrieveFollowingIdentifier = function(text, pos, regex) { + regex = regex || ID_REGEX; + var buf = []; + for (var i = pos; i < text.length; i++) { + if (regex.test(text[i])) + buf.push(text[i]); + else + break; + } + return buf; +}; + +exports.getCompletionPrefix = function (editor) { + var pos = editor.getCursorPosition(); + var line = editor.session.getLine(pos.row); + var prefix; + editor.completers.forEach(function(completer) { + if (completer.identifierRegexps) { + completer.identifierRegexps.forEach(function(identifierRegex) { + if (!prefix && identifierRegex) + prefix = this.retrievePrecedingIdentifier(line, pos.column, identifierRegex); + }.bind(this)); + } + }.bind(this)); + return prefix || this.retrievePrecedingIdentifier(line, pos.column); +}; + +}); + +define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module) { +"use strict"; +var dom = require("./lib/dom"); +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var lang = require("./lib/lang"); +var Range = require("./range").Range; +var RangeList = require("./range_list").RangeList; +var HashHandler = require("./keyboard/hash_handler").HashHandler; +var Tokenizer = require("./tokenizer").Tokenizer; +var clipboard = require("./clipboard"); + +var VARIABLES = { + CURRENT_WORD: function(editor) { + return editor.session.getTextRange(editor.session.getWordRange()); + }, + SELECTION: function(editor, name, indentation) { + var text = editor.session.getTextRange(); + if (indentation) + return text.replace(/\n\r?([ \t]*\S)/g, "\n" + indentation + "$1"); + return text; + }, + CURRENT_LINE: function(editor) { + return editor.session.getLine(editor.getCursorPosition().row); + }, + PREV_LINE: function(editor) { + return editor.session.getLine(editor.getCursorPosition().row - 1); + }, + LINE_INDEX: function(editor) { + return editor.getCursorPosition().row; + }, + LINE_NUMBER: function(editor) { + return editor.getCursorPosition().row + 1; + }, + SOFT_TABS: function(editor) { + return editor.session.getUseSoftTabs() ? "YES" : "NO"; + }, + TAB_SIZE: function(editor) { + return editor.session.getTabSize(); + }, + CLIPBOARD: function(editor) { + return clipboard.getText && clipboard.getText(); + }, + FILENAME: function(editor) { + return /[^/\\]*$/.exec(this.FILEPATH(editor))[0]; + }, + FILENAME_BASE: function(editor) { + return /[^/\\]*$/.exec(this.FILEPATH(editor))[0].replace(/\.[^.]*$/, ""); + }, + DIRECTORY: function(editor) { + return this.FILEPATH(editor).replace(/[^/\\]*$/, ""); + }, + FILEPATH: function(editor) { return "/not implemented.txt"; }, + WORKSPACE_NAME: function() { return "Unknown"; }, + FULLNAME: function() { return "Unknown"; }, + BLOCK_COMMENT_START: function(editor) { + var mode = editor.session.$mode || {}; + return mode.blockComment && mode.blockComment.start || ""; + }, + BLOCK_COMMENT_END: function(editor) { + var mode = editor.session.$mode || {}; + return mode.blockComment && mode.blockComment.end || ""; + }, + LINE_COMMENT: function(editor) { + var mode = editor.session.$mode || {}; + return mode.lineCommentStart || ""; + }, + CURRENT_YEAR: date.bind(null, {year: "numeric"}), + CURRENT_YEAR_SHORT: date.bind(null, {year: "2-digit"}), + CURRENT_MONTH: date.bind(null, {month: "numeric"}), + CURRENT_MONTH_NAME: date.bind(null, {month: "long"}), + CURRENT_MONTH_NAME_SHORT: date.bind(null, {month: "short"}), + CURRENT_DATE: date.bind(null, {day: "2-digit"}), + CURRENT_DAY_NAME: date.bind(null, {weekday: "long"}), + CURRENT_DAY_NAME_SHORT: date.bind(null, {weekday: "short"}), + CURRENT_HOUR: date.bind(null, {hour: "2-digit", hour12: false}), + CURRENT_MINUTE: date.bind(null, {minute: "2-digit"}), + CURRENT_SECOND: date.bind(null, {second: "2-digit"}) +}; + +VARIABLES.SELECTED_TEXT = VARIABLES.SELECTION; + +function date(dateFormat) { + var str = new Date().toLocaleString("en-us", dateFormat); + return str.length == 1 ? "0" + str : str; +} + +var SnippetManager = function() { + this.snippetMap = {}; + this.snippetNameMap = {}; +}; + +(function() { + oop.implement(this, EventEmitter); + + this.getTokenizer = function() { + return SnippetManager.$tokenizer || this.createTokenizer(); + }; + + this.createTokenizer = function() { + function TabstopToken(str) { + str = str.substr(1); + if (/^\d+$/.test(str)) + return [{tabstopId: parseInt(str, 10)}]; + return [{text: str}]; + } + function escape(ch) { + return "(?:[^\\\\" + ch + "]|\\\\.)"; + } + var formatMatcher = { + regex: "/(" + escape("/") + "+)/", + onMatch: function(val, state, stack) { + var ts = stack[0]; + ts.fmtString = true; + ts.guard = val.slice(1, -1); + ts.flag = ""; + return ""; + }, + next: "formatString" + }; + + SnippetManager.$tokenizer = new Tokenizer({ + start: [ + {regex: /\\./, onMatch: function(val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) { + val = ch; + } else if ("`$\\".indexOf(ch) != -1) { + val = ch; + } + return [val]; + }}, + {regex: /}/, onMatch: function(val, state, stack) { + return [stack.length ? stack.shift() : val]; + }}, + {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken}, + {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) { + var t = TabstopToken(str.substr(1)); + stack.unshift(t[0]); + return t; + }, next: "snippetVar"}, + {regex: /\n/, token: "newline", merge: false} + ], + snippetVar: [ + {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) { + var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function(operator) { + return operator.length == 2 ? operator[1] : "\x00"; + }).split("\x00").map(function(value){ + return {value: value}; + }); + stack[0].choices = choices; + return [choices[0]]; + }, next: "start"}, + formatMatcher, + {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"} + ], + formatString: [ + {regex: /:/, onMatch: function(val, state, stack) { + if (stack.length && stack[0].expectElse) { + stack[0].expectElse = false; + stack[0].ifEnd = {elseEnd: stack[0]}; + return [stack[0].ifEnd]; + } + return ":"; + }}, + {regex: /\\./, onMatch: function(val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) + val = ch; + else if ("`$\\".indexOf(ch) != -1) + val = ch; + else if (ch == "n") + val = "\n"; + else if (ch == "t") + val = "\t"; + else if ("ulULE".indexOf(ch) != -1) + val = {changeCase: ch, local: ch > "a"}; + return [val]; + }}, + {regex: "/\\w*}", onMatch: function(val, state, stack) { + var next = stack.shift(); + if (next) + next.flag = val.slice(1, -1); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start"}, + {regex: /\$(?:\d+|\w+)/, onMatch: function(val, state, stack) { + return [{text: val.slice(1)}]; + }}, + {regex: /\${\w+/, onMatch: function(val, state, stack) { + var token = {text: val.slice(2)}; + stack.unshift(token); + return [token]; + }, next: "formatStringVar"}, + {regex: /\n/, token: "newline", merge: false}, + {regex: /}/, onMatch: function(val, state, stack) { + var next = stack.shift(); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start"} + ], + formatStringVar: [ + {regex: /:\/\w+}/, onMatch: function(val, state, stack) { + var ts = stack[0]; + ts.formatFunction = val.slice(2, -1); + return [stack.shift()]; + }, next: "formatString"}, + formatMatcher, + {regex: /:[\?\-+]?/, onMatch: function(val, state, stack) { + if (val[1] == "+") + stack[0].ifEnd = stack[0]; + if (val[1] == "?") + stack[0].expectElse = true; + }, next: "formatString"}, + {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString"} + ] + }); + return SnippetManager.$tokenizer; + }; + + this.tokenizeTmSnippet = function(str, startState) { + return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) { + return x.value || x; + }); + }; + + this.getVariableValue = function(editor, name, indentation) { + if (/^\d+$/.test(name)) + return (this.variables.__ || {})[name] || ""; + if (/^[A-Z]\d+$/.test(name)) + return (this.variables[name[0] + "__"] || {})[name.substr(1)] || ""; + + name = name.replace(/^TM_/, ""); + if (!this.variables.hasOwnProperty(name)) + return ""; + var value = this.variables[name]; + if (typeof value == "function") + value = this.variables[name](editor, name, indentation); + return value == null ? "" : value; + }; + + this.variables = VARIABLES; + this.tmStrFormat = function(str, ch, editor) { + if (!ch.fmt) return str; + var flag = ch.flag || ""; + var re = ch.guard; + re = new RegExp(re, flag.replace(/[^gim]/g, "")); + var fmtTokens = typeof ch.fmt == "string" ? this.tokenizeTmSnippet(ch.fmt, "formatString") : ch.fmt; + var _self = this; + var formatted = str.replace(re, function() { + var oldArgs = _self.variables.__; + _self.variables.__ = [].slice.call(arguments); + var fmtParts = _self.resolveVariables(fmtTokens, editor); + var gChangeCase = "E"; + for (var i = 0; i < fmtParts.length; i++) { + var ch = fmtParts[i]; + if (typeof ch == "object") { + fmtParts[i] = ""; + if (ch.changeCase && ch.local) { + var next = fmtParts[i + 1]; + if (next && typeof next == "string") { + if (ch.changeCase == "u") + fmtParts[i] = next[0].toUpperCase(); + else + fmtParts[i] = next[0].toLowerCase(); + fmtParts[i + 1] = next.substr(1); + } + } else if (ch.changeCase) { + gChangeCase = ch.changeCase; + } + } else if (gChangeCase == "U") { + fmtParts[i] = ch.toUpperCase(); + } else if (gChangeCase == "L") { + fmtParts[i] = ch.toLowerCase(); + } + } + _self.variables.__ = oldArgs; + return fmtParts.join(""); + }); + return formatted; + }; + + this.tmFormatFunction = function(str, ch, editor) { + if (ch.formatFunction == "upcase") + return str.toUpperCase(); + if (ch.formatFunction == "downcase") + return str.toLowerCase(); + return str; + }; + + this.resolveVariables = function(snippet, editor) { + var result = []; + var indentation = ""; + var afterNewLine = true; + for (var i = 0; i < snippet.length; i++) { + var ch = snippet[i]; + if (typeof ch == "string") { + result.push(ch); + if (ch == "\n") { + afterNewLine = true; + indentation = ""; + } + else if (afterNewLine) { + indentation = /^\t*/.exec(ch)[0]; + afterNewLine = /\S/.test(ch); + } + continue; + } + if (!ch) continue; + afterNewLine = false; + + if (ch.fmtString) { + var j = snippet.indexOf(ch, i + 1); + if (j == -1) j = snippet.length; + ch.fmt = snippet.slice(i + 1, j); + i = j; + } + + if (ch.text) { + var value = this.getVariableValue(editor, ch.text, indentation) + ""; + if (ch.fmtString) + value = this.tmStrFormat(value, ch, editor); + if (ch.formatFunction) + value = this.tmFormatFunction(value, ch, editor); + + if (value && !ch.ifEnd) { + result.push(value); + gotoNext(ch); + } else if (!value && ch.ifEnd) { + gotoNext(ch.ifEnd); + } + } else if (ch.elseEnd) { + gotoNext(ch.elseEnd); + } else if (ch.tabstopId != null) { + result.push(ch); + } else if (ch.changeCase != null) { + result.push(ch); + } + } + function gotoNext(ch) { + var i1 = snippet.indexOf(ch, i + 1); + if (i1 != -1) + i = i1; + } + return result; + }; + + this.insertSnippetForSelection = function(editor, snippetText) { + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var tabString = editor.session.getTabString(); + var indentString = line.match(/^\s*/)[0]; + + if (cursor.column < indentString.length) + indentString = indentString.slice(0, cursor.column); + + snippetText = snippetText.replace(/\r/g, ""); + var tokens = this.tokenizeTmSnippet(snippetText); + tokens = this.resolveVariables(tokens, editor); + tokens = tokens.map(function(x) { + if (x == "\n") + return x + indentString; + if (typeof x == "string") + return x.replace(/\t/g, tabString); + return x; + }); + var tabstops = []; + tokens.forEach(function(p, i) { + if (typeof p != "object") + return; + var id = p.tabstopId; + var ts = tabstops[id]; + if (!ts) { + ts = tabstops[id] = []; + ts.index = id; + ts.value = ""; + ts.parents = {}; + } + if (ts.indexOf(p) !== -1) + return; + if (p.choices && !ts.choices) + ts.choices = p.choices; + ts.push(p); + var i1 = tokens.indexOf(p, i + 1); + if (i1 === -1) + return; + + var value = tokens.slice(i + 1, i1); + var isNested = value.some(function(t) {return typeof t === "object";}); + if (isNested && !ts.value) { + ts.value = value; + } else if (value.length && (!ts.value || typeof ts.value !== "string")) { + ts.value = value.join(""); + } + }); + tabstops.forEach(function(ts) {ts.length = 0;}); + var expanding = {}; + function copyValue(val) { + var copy = []; + for (var i = 0; i < val.length; i++) { + var p = val[i]; + if (typeof p == "object") { + if (expanding[p.tabstopId]) + continue; + var j = val.lastIndexOf(p, i - 1); + p = copy[j] || {tabstopId: p.tabstopId}; + } + copy[i] = p; + } + return copy; + } + for (var i = 0; i < tokens.length; i++) { + var p = tokens[i]; + if (typeof p != "object") + continue; + var id = p.tabstopId; + var ts = tabstops[id]; + var i1 = tokens.indexOf(p, i + 1); + if (expanding[id]) { + if (expanding[id] === p) { + delete expanding[id]; + Object.keys(expanding).forEach(function(parentId) { + ts.parents[parentId] = true; + }); + } + continue; + } + expanding[id] = p; + var value = ts.value; + if (typeof value !== "string") + value = copyValue(value); + else if (p.fmt) + value = this.tmStrFormat(value, p, editor); + tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); + + if (ts.indexOf(p) === -1) + ts.push(p); + } + var row = 0, column = 0; + var text = ""; + tokens.forEach(function(t) { + if (typeof t === "string") { + var lines = t.split("\n"); + if (lines.length > 1){ + column = lines[lines.length - 1].length; + row += lines.length - 1; + } else + column += t.length; + text += t; + } else if (t) { + if (!t.start) + t.start = {row: row, column: column}; + else + t.end = {row: row, column: column}; + } + }); + var range = editor.getSelectionRange(); + var end = editor.session.replace(range, text); + + var tabstopManager = new TabstopManager(editor); + var selectionId = editor.inVirtualSelectionMode && editor.selection.index; + tabstopManager.addTabstops(tabstops, range.start, end, selectionId); + }; + + this.insertSnippet = function(editor, snippetText) { + var self = this; + if (editor.inVirtualSelectionMode) + return self.insertSnippetForSelection(editor, snippetText); + + editor.forEachSelection(function() { + self.insertSnippetForSelection(editor, snippetText); + }, null, {keepOrder: true}); + + if (editor.tabstopManager) + editor.tabstopManager.tabNext(); + }; + + this.$getScope = function(editor) { + var scope = editor.session.$mode.$id || ""; + scope = scope.split("/").pop(); + if (scope === "html" || scope === "php") { + if (scope === "php" && !editor.session.$mode.inlinePhp) + scope = "html"; + var c = editor.getCursorPosition(); + var state = editor.session.getState(c.row); + if (typeof state === "object") { + state = state[0]; + } + if (state.substring) { + if (state.substring(0, 3) == "js-") + scope = "javascript"; + else if (state.substring(0, 4) == "css-") + scope = "css"; + else if (state.substring(0, 4) == "php-") + scope = "php"; + } + } + + return scope; + }; + + this.getActiveScopes = function(editor) { + var scope = this.$getScope(editor); + var scopes = [scope]; + var snippetMap = this.snippetMap; + if (snippetMap[scope] && snippetMap[scope].includeScopes) { + scopes.push.apply(scopes, snippetMap[scope].includeScopes); + } + scopes.push("_"); + return scopes; + }; + + this.expandWithTab = function(editor, options) { + var self = this; + var result = editor.forEachSelection(function() { + return self.expandSnippetForSelection(editor, options); + }, null, {keepOrder: true}); + if (result && editor.tabstopManager) + editor.tabstopManager.tabNext(); + return result; + }; + + this.expandSnippetForSelection = function(editor, options) { + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var before = line.substring(0, cursor.column); + var after = line.substr(cursor.column); + + var snippetMap = this.snippetMap; + var snippet; + this.getActiveScopes(editor).some(function(scope) { + var snippets = snippetMap[scope]; + if (snippets) + snippet = this.findMatchingSnippet(snippets, before, after); + return !!snippet; + }, this); + if (!snippet) + return false; + if (options && options.dryRun) + return true; + editor.session.doc.removeInLine(cursor.row, + cursor.column - snippet.replaceBefore.length, + cursor.column + snippet.replaceAfter.length + ); + + this.variables.M__ = snippet.matchBefore; + this.variables.T__ = snippet.matchAfter; + this.insertSnippetForSelection(editor, snippet.content); + + this.variables.M__ = this.variables.T__ = null; + return true; + }; + + this.findMatchingSnippet = function(snippetList, before, after) { + for (var i = snippetList.length; i--;) { + var s = snippetList[i]; + if (s.startRe && !s.startRe.test(before)) + continue; + if (s.endRe && !s.endRe.test(after)) + continue; + if (!s.startRe && !s.endRe) + continue; + + s.matchBefore = s.startRe ? s.startRe.exec(before) : [""]; + s.matchAfter = s.endRe ? s.endRe.exec(after) : [""]; + s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : ""; + s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : ""; + return s; + } + }; + + this.snippetMap = {}; + this.snippetNameMap = {}; + this.register = function(snippets, scope) { + var snippetMap = this.snippetMap; + var snippetNameMap = this.snippetNameMap; + var self = this; + + if (!snippets) + snippets = []; + + function wrapRegexp(src) { + if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) + src = "(?:" + src + ")"; + + return src || ""; + } + function guardedRegexp(re, guard, opening) { + re = wrapRegexp(re); + guard = wrapRegexp(guard); + if (opening) { + re = guard + re; + if (re && re[re.length - 1] != "$") + re = re + "$"; + } else { + re = re + guard; + if (re && re[0] != "^") + re = "^" + re; + } + return new RegExp(re); + } + + function addSnippet(s) { + if (!s.scope) + s.scope = scope || "_"; + scope = s.scope; + if (!snippetMap[scope]) { + snippetMap[scope] = []; + snippetNameMap[scope] = {}; + } + + var map = snippetNameMap[scope]; + if (s.name) { + var old = map[s.name]; + if (old) + self.unregister(old); + map[s.name] = s; + } + snippetMap[scope].push(s); + + if (s.prefix) + s.tabTrigger = s.prefix; + + if (!s.content && s.body) + s.content = Array.isArray(s.body) ? s.body.join("\n") : s.body; + + if (s.tabTrigger && !s.trigger) { + if (!s.guard && /^\w/.test(s.tabTrigger)) + s.guard = "\\b"; + s.trigger = lang.escapeRegExp(s.tabTrigger); + } + + if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard) + return; + + s.startRe = guardedRegexp(s.trigger, s.guard, true); + s.triggerRe = new RegExp(s.trigger); + + s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true); + s.endTriggerRe = new RegExp(s.endTrigger); + } + + if (Array.isArray(snippets)) { + snippets.forEach(addSnippet); + } else { + Object.keys(snippets).forEach(function(key) { + addSnippet(snippets[key]); + }); + } + + this._signal("registerSnippets", {scope: scope}); + }; + this.unregister = function(snippets, scope) { + var snippetMap = this.snippetMap; + var snippetNameMap = this.snippetNameMap; + + function removeSnippet(s) { + var nameMap = snippetNameMap[s.scope||scope]; + if (nameMap && nameMap[s.name]) { + delete nameMap[s.name]; + var map = snippetMap[s.scope||scope]; + var i = map && map.indexOf(s); + if (i >= 0) + map.splice(i, 1); + } + } + if (snippets.content) + removeSnippet(snippets); + else if (Array.isArray(snippets)) + snippets.forEach(removeSnippet); + }; + this.parseSnippetFile = function(str) { + str = str.replace(/\r/g, ""); + var list = [], snippet = {}; + var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; + var m; + while (m = re.exec(str)) { + if (m[1]) { + try { + snippet = JSON.parse(m[1]); + list.push(snippet); + } catch (e) {} + } if (m[4]) { + snippet.content = m[4].replace(/^\t/gm, ""); + list.push(snippet); + snippet = {}; + } else { + var key = m[2], val = m[3]; + if (key == "regex") { + var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g; + snippet.guard = guardRe.exec(val)[1]; + snippet.trigger = guardRe.exec(val)[1]; + snippet.endTrigger = guardRe.exec(val)[1]; + snippet.endGuard = guardRe.exec(val)[1]; + } else if (key == "snippet") { + snippet.tabTrigger = val.match(/^\S*/)[0]; + if (!snippet.name) + snippet.name = val; + } else if (key) { + snippet[key] = val; + } + } + } + return list; + }; + this.getSnippetByName = function(name, editor) { + var snippetMap = this.snippetNameMap; + var snippet; + this.getActiveScopes(editor).some(function(scope) { + var snippets = snippetMap[scope]; + if (snippets) + snippet = snippets[name]; + return !!snippet; + }, this); + return snippet; + }; + +}).call(SnippetManager.prototype); + + +var TabstopManager = function(editor) { + if (editor.tabstopManager) + return editor.tabstopManager; + editor.tabstopManager = this; + this.$onChange = this.onChange.bind(this); + this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; + this.$onChangeSession = this.onChangeSession.bind(this); + this.$onAfterExec = this.onAfterExec.bind(this); + this.attach(editor); +}; +(function() { + this.attach = function(editor) { + this.index = 0; + this.ranges = []; + this.tabstops = []; + this.$openTabstops = null; + this.selectedTabstop = null; + + this.editor = editor; + this.editor.on("change", this.$onChange); + this.editor.on("changeSelection", this.$onChangeSelection); + this.editor.on("changeSession", this.$onChangeSession); + this.editor.commands.on("afterExec", this.$onAfterExec); + this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + }; + this.detach = function() { + this.tabstops.forEach(this.removeTabstopMarkers, this); + this.ranges = null; + this.tabstops = null; + this.selectedTabstop = null; + this.editor.removeListener("change", this.$onChange); + this.editor.removeListener("changeSelection", this.$onChangeSelection); + this.editor.removeListener("changeSession", this.$onChangeSession); + this.editor.commands.removeListener("afterExec", this.$onAfterExec); + this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); + this.editor.tabstopManager = null; + this.editor = null; + }; + + this.onChange = function(delta) { + var isRemove = delta.action[0] == "r"; + var selectedTabstop = this.selectedTabstop || {}; + var parents = selectedTabstop.parents || {}; + var tabstops = (this.tabstops || []).slice(); + for (var i = 0; i < tabstops.length; i++) { + var ts = tabstops[i]; + var active = ts == selectedTabstop || parents[ts.index]; + ts.rangeList.$bias = active ? 0 : 1; + + if (delta.action == "remove" && ts !== selectedTabstop) { + var parentActive = ts.parents && ts.parents[selectedTabstop.index]; + var startIndex = ts.rangeList.pointIndex(delta.start, parentActive); + startIndex = startIndex < 0 ? -startIndex - 1 : startIndex + 1; + var endIndex = ts.rangeList.pointIndex(delta.end, parentActive); + endIndex = endIndex < 0 ? -endIndex - 1 : endIndex - 1; + var toRemove = ts.rangeList.ranges.slice(startIndex, endIndex); + for (var j = 0; j < toRemove.length; j++) + this.removeRange(toRemove[j]); + } + ts.rangeList.$onChange(delta); + } + var session = this.editor.session; + if (!this.$inChange && isRemove && session.getLength() == 1 && !session.getValue()) + this.detach(); + }; + this.updateLinkedFields = function() { + var ts = this.selectedTabstop; + if (!ts || !ts.hasLinkedRanges || !ts.firstNonLinked) + return; + this.$inChange = true; + var session = this.editor.session; + var text = session.getTextRange(ts.firstNonLinked); + for (var i = 0; i < ts.length; i++) { + var range = ts[i]; + if (!range.linked) + continue; + var original = range.original; + var fmt = exports.snippetManager.tmStrFormat(text, original, this.editor); + session.replace(range, fmt); + } + this.$inChange = false; + }; + this.onAfterExec = function(e) { + if (e.command && !e.command.readOnly) + this.updateLinkedFields(); + }; + this.onChangeSelection = function() { + if (!this.editor) + return; + var lead = this.editor.selection.lead; + var anchor = this.editor.selection.anchor; + var isEmpty = this.editor.selection.isEmpty(); + for (var i = 0; i < this.ranges.length; i++) { + if (this.ranges[i].linked) + continue; + var containsLead = this.ranges[i].contains(lead.row, lead.column); + var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column); + if (containsLead && containsAnchor) + return; + } + this.detach(); + }; + this.onChangeSession = function() { + this.detach(); + }; + this.tabNext = function(dir) { + var max = this.tabstops.length; + var index = this.index + (dir || 1); + index = Math.min(Math.max(index, 1), max); + if (index == max) + index = 0; + this.selectTabstop(index); + if (index === 0) + this.detach(); + }; + this.selectTabstop = function(index) { + this.$openTabstops = null; + var ts = this.tabstops[this.index]; + if (ts) + this.addTabstopMarkers(ts); + this.index = index; + ts = this.tabstops[this.index]; + if (!ts || !ts.length) + return; + + this.selectedTabstop = ts; + var range = ts.firstNonLinked || ts; + if (ts.choices) range.cursor = range.start; + if (!this.editor.inVirtualSelectionMode) { + var sel = this.editor.multiSelect; + sel.toSingleRange(range); + for (var i = 0; i < ts.length; i++) { + if (ts.hasLinkedRanges && ts[i].linked) + continue; + sel.addRange(ts[i].clone(), true); + } + } else { + this.editor.selection.fromOrientedRange(range); + } + + this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + if (this.selectedTabstop && this.selectedTabstop.choices) + this.editor.execCommand("startAutocomplete", {matches: this.selectedTabstop.choices}); + }; + this.addTabstops = function(tabstops, start, end) { + var useLink = this.useLink || !this.editor.getOption("enableMultiselect"); + + if (!this.$openTabstops) + this.$openTabstops = []; + if (!tabstops[0]) { + var p = Range.fromPoints(end, end); + moveRelative(p.start, start); + moveRelative(p.end, start); + tabstops[0] = [p]; + tabstops[0].index = 0; + } + + var i = this.index; + var arg = [i + 1, 0]; + var ranges = this.ranges; + tabstops.forEach(function(ts, index) { + var dest = this.$openTabstops[index] || ts; + + for (var i = 0; i < ts.length; i++) { + var p = ts[i]; + var range = Range.fromPoints(p.start, p.end || p.start); + movePoint(range.start, start); + movePoint(range.end, start); + range.original = p; + range.tabstop = dest; + ranges.push(range); + if (dest != ts) + dest.unshift(range); + else + dest[i] = range; + if (p.fmtString || (dest.firstNonLinked && useLink)) { + range.linked = true; + dest.hasLinkedRanges = true; + } else if (!dest.firstNonLinked) + dest.firstNonLinked = range; + } + if (!dest.firstNonLinked) + dest.hasLinkedRanges = false; + if (dest === ts) { + arg.push(dest); + this.$openTabstops[index] = dest; + } + this.addTabstopMarkers(dest); + dest.rangeList = dest.rangeList || new RangeList(); + dest.rangeList.$bias = 0; + dest.rangeList.addList(dest); + }, this); + + if (arg.length > 2) { + if (this.tabstops.length) + arg.push(arg.splice(2, 1)[0]); + this.tabstops.splice.apply(this.tabstops, arg); + } + }; + + this.addTabstopMarkers = function(ts) { + var session = this.editor.session; + ts.forEach(function(range) { + if (!range.markerId) + range.markerId = session.addMarker(range, "ace_snippet-marker", "text"); + }); + }; + this.removeTabstopMarkers = function(ts) { + var session = this.editor.session; + ts.forEach(function(range) { + session.removeMarker(range.markerId); + range.markerId = null; + }); + }; + this.removeRange = function(range) { + var i = range.tabstop.indexOf(range); + if (i != -1) range.tabstop.splice(i, 1); + i = this.ranges.indexOf(range); + if (i != -1) this.ranges.splice(i, 1); + i = range.tabstop.rangeList.ranges.indexOf(range); + if (i != -1) range.tabstop.splice(i, 1); + this.editor.session.removeMarker(range.markerId); + if (!range.tabstop.length) { + i = this.tabstops.indexOf(range.tabstop); + if (i != -1) + this.tabstops.splice(i, 1); + if (!this.tabstops.length) + this.detach(); + } + }; + + this.keyboardHandler = new HashHandler(); + this.keyboardHandler.bindKeys({ + "Tab": function(editor) { + if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) + return; + editor.tabstopManager.tabNext(1); + editor.renderer.scrollCursorIntoView(); + }, + "Shift-Tab": function(editor) { + editor.tabstopManager.tabNext(-1); + editor.renderer.scrollCursorIntoView(); + }, + "Esc": function(editor) { + editor.tabstopManager.detach(); + } + }); +}).call(TabstopManager.prototype); + + + +var movePoint = function(point, diff) { + if (point.row == 0) + point.column += diff.column; + point.row += diff.row; +}; + +var moveRelative = function(point, start) { + if (point.row == start.row) + point.column -= start.column; + point.row -= start.row; +}; + + +dom.importCssString("\ +.ace_snippet-marker {\ + -moz-box-sizing: border-box;\ + box-sizing: border-box;\ + background: rgba(194, 193, 208, 0.09);\ + border: 1px dotted rgba(211, 208, 235, 0.62);\ + position: absolute;\ +}", "snippets.css", false); + +exports.snippetManager = new SnippetManager(); + + +var Editor = require("./editor").Editor; +(function() { + this.insertSnippet = function(content, options) { + return exports.snippetManager.insertSnippet(this, content, options); + }; + this.expandSnippet = function(options) { + return exports.snippetManager.expandWithTab(this, options); + }; +}).call(Editor.prototype); + +}); + +define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/lang","ace/lib/dom","ace/snippets","ace/config"], function(require, exports, module) { +"use strict"; + +var HashHandler = require("./keyboard/hash_handler").HashHandler; +var AcePopup = require("./autocomplete/popup").AcePopup; +var util = require("./autocomplete/util"); +var lang = require("./lib/lang"); +var dom = require("./lib/dom"); +var snippetManager = require("./snippets").snippetManager; +var config = require("./config"); + +var Autocomplete = function() { + this.autoInsert = false; + this.autoSelect = true; + this.exactMatch = false; + this.gatherCompletionsId = 0; + this.keyboardHandler = new HashHandler(); + this.keyboardHandler.bindKeys(this.commands); + + this.blurListener = this.blurListener.bind(this); + this.changeListener = this.changeListener.bind(this); + this.mousedownListener = this.mousedownListener.bind(this); + this.mousewheelListener = this.mousewheelListener.bind(this); + + this.changeTimer = lang.delayedCall(function() { + this.updateCompletions(true); + }.bind(this)); + + this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50); +}; + +(function() { + + this.$init = function() { + this.popup = new AcePopup(document.body || document.documentElement); + this.popup.on("click", function(e) { + this.insertMatch(); + e.stop(); + }.bind(this)); + this.popup.focus = this.editor.focus.bind(this.editor); + this.popup.on("show", this.tooltipTimer.bind(null, null)); + this.popup.on("select", this.tooltipTimer.bind(null, null)); + this.popup.on("changeHoverMarker", this.tooltipTimer.bind(null, null)); + return this.popup; + }; + + this.getPopup = function() { + return this.popup || this.$init(); + }; + + this.openPopup = function(editor, prefix, keepPopupPosition) { + if (!this.popup) + this.$init(); + + this.popup.autoSelect = this.autoSelect; + + this.popup.setData(this.completions.filtered, this.completions.filterText); + + editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + + var renderer = editor.renderer; + this.popup.setRow(this.autoSelect ? 0 : -1); + if (!keepPopupPosition) { + this.popup.setTheme(editor.getTheme()); + this.popup.setFontSize(editor.getFontSize()); + + var lineHeight = renderer.layerConfig.lineHeight; + + var pos = renderer.$cursorLayer.getPixelPosition(this.base, true); + pos.left -= this.popup.getTextLeftOffset(); + + var rect = editor.container.getBoundingClientRect(); + pos.top += rect.top - renderer.layerConfig.offset; + pos.left += rect.left - editor.renderer.scrollLeft; + pos.left += renderer.gutterWidth; + + this.popup.show(pos, lineHeight); + } else if (keepPopupPosition && !prefix) { + this.detach(); + } + this.changeTimer.cancel(); + }; + + this.detach = function() { + this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); + this.editor.off("changeSelection", this.changeListener); + this.editor.off("blur", this.blurListener); + this.editor.off("mousedown", this.mousedownListener); + this.editor.off("mousewheel", this.mousewheelListener); + this.changeTimer.cancel(); + this.hideDocTooltip(); + + this.gatherCompletionsId += 1; + if (this.popup && this.popup.isOpen) + this.popup.hide(); + + if (this.base) + this.base.detach(); + this.activated = false; + this.completions = this.base = null; + }; + + this.changeListener = function(e) { + var cursor = this.editor.selection.lead; + if (cursor.row != this.base.row || cursor.column < this.base.column) { + this.detach(); + } + if (this.activated) + this.changeTimer.schedule(); + else + this.detach(); + }; + + this.blurListener = function(e) { + var el = document.activeElement; + var text = this.editor.textInput.getElement(); + var fromTooltip = e.relatedTarget && this.tooltipNode && this.tooltipNode.contains(e.relatedTarget); + var container = this.popup && this.popup.container; + if (el != text && el.parentNode != container && !fromTooltip + && el != this.tooltipNode && e.relatedTarget != text + ) { + this.detach(); + } + }; + + this.mousedownListener = function(e) { + this.detach(); + }; + + this.mousewheelListener = function(e) { + this.detach(); + }; + + this.goTo = function(where) { + this.popup.goTo(where); + }; + + this.insertMatch = function(data, options) { + if (!data) + data = this.popup.getData(this.popup.getRow()); + if (!data) + return false; + + var completions = this.completions; + this.editor.startOperation({command: {name: "insertMatch"}}); + if (data.completer && data.completer.insertMatch) { + data.completer.insertMatch(this.editor, data); + } else { + if (!completions) + return false; + if (completions.filterText) { + var ranges = this.editor.selection.getAllRanges(); + for (var i = 0, range; range = ranges[i]; i++) { + range.start.column -= completions.filterText.length; + this.editor.session.remove(range); + } + } + if (data.snippet) + snippetManager.insertSnippet(this.editor, data.snippet); + else + this.editor.execCommand("insertstring", data.value || data); + } + if (this.completions == completions) + this.detach(); + this.editor.endOperation(); + }; + + + this.commands = { + "Up": function(editor) { editor.completer.goTo("up"); }, + "Down": function(editor) { editor.completer.goTo("down"); }, + "Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); }, + "Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); }, + + "Esc": function(editor) { editor.completer.detach(); }, + "Return": function(editor) { return editor.completer.insertMatch(); }, + "Shift-Return": function(editor) { editor.completer.insertMatch(null, {deleteSuffix: true}); }, + "Tab": function(editor) { + var result = editor.completer.insertMatch(); + if (!result && !editor.tabstopManager) + editor.completer.goTo("down"); + else + return result; + }, + + "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); }, + "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); } + }; + + this.gatherCompletions = function(editor, callback) { + var session = editor.getSession(); + var pos = editor.getCursorPosition(); + + var prefix = util.getCompletionPrefix(editor); + + this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length); + this.base.$insertRight = true; + + var matches = []; + var total = editor.completers.length; + editor.completers.forEach(function(completer, i) { + completer.getCompletions(editor, session, pos, prefix, function(err, results) { + if (!err && results) + matches = matches.concat(results); + callback(null, { + prefix: util.getCompletionPrefix(editor), + matches: matches, + finished: (--total === 0) + }); + }); + }); + return true; + }; + + this.showPopup = function(editor, options) { + if (this.editor) + this.detach(); + + this.activated = true; + + this.editor = editor; + if (editor.completer != this) { + if (editor.completer) + editor.completer.detach(); + editor.completer = this; + } + + editor.on("changeSelection", this.changeListener); + editor.on("blur", this.blurListener); + editor.on("mousedown", this.mousedownListener); + editor.on("mousewheel", this.mousewheelListener); + + this.updateCompletions(false, options); + }; + + this.updateCompletions = function(keepPopupPosition, options) { + if (keepPopupPosition && this.base && this.completions) { + var pos = this.editor.getCursorPosition(); + var prefix = this.editor.session.getTextRange({start: this.base, end: pos}); + if (prefix == this.completions.filterText) + return; + this.completions.setFilter(prefix); + if (!this.completions.filtered.length) + return this.detach(); + if (this.completions.filtered.length == 1 + && this.completions.filtered[0].value == prefix + && !this.completions.filtered[0].snippet) + return this.detach(); + this.openPopup(this.editor, prefix, keepPopupPosition); + return; + } + + if (options && options.matches) { + var pos = this.editor.getSelectionRange().start; + this.base = this.editor.session.doc.createAnchor(pos.row, pos.column); + this.base.$insertRight = true; + this.completions = new FilteredList(options.matches); + return this.openPopup(this.editor, "", keepPopupPosition); + } + var _id = this.gatherCompletionsId; + var detachIfFinished = function(results) { + if (!results.finished) return; + return this.detach(); + }.bind(this); + + var processResults = function(results) { + var prefix = results.prefix; + var matches = results.matches; + + this.completions = new FilteredList(matches); + + if (this.exactMatch) + this.completions.exactMatch = true; + + this.completions.setFilter(prefix); + var filtered = this.completions.filtered; + if (!filtered.length) + return detachIfFinished(results); + if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet) + return detachIfFinished(results); + if (this.autoInsert && filtered.length == 1 && results.finished) + return this.insertMatch(filtered[0]); + + this.openPopup(this.editor, prefix, keepPopupPosition); + }.bind(this); + + var isImmediate = true; + var immediateResults = null; + this.gatherCompletions(this.editor, function(err, results) { + var prefix = results.prefix; + var matches = results && results.matches; + + if (!matches || !matches.length) + return detachIfFinished(results); + if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId) + return; + if (isImmediate) { + immediateResults = results; + return; + } + + processResults(results); + }.bind(this)); + + isImmediate = false; + if (immediateResults) { + var results = immediateResults; + immediateResults = null; + processResults(results); + } + }; + + this.cancelContextMenu = function() { + this.editor.$mouseHandler.cancelContextMenu(); + }; + + this.updateDocTooltip = function() { + var popup = this.popup; + var all = popup.data; + var selected = all && (all[popup.getHoveredRow()] || all[popup.getRow()]); + var doc = null; + if (!selected || !this.editor || !this.popup.isOpen) + return this.hideDocTooltip(); + this.editor.completers.some(function(completer) { + if (completer.getDocTooltip) + doc = completer.getDocTooltip(selected); + return doc; + }); + if (!doc && typeof selected != "string") + doc = selected; + + if (typeof doc == "string") + doc = {docText: doc}; + if (!doc || !(doc.docHTML || doc.docText)) + return this.hideDocTooltip(); + this.showDocTooltip(doc); + }; + + this.showDocTooltip = function(item) { + if (!this.tooltipNode) { + this.tooltipNode = dom.createElement("div"); + this.tooltipNode.className = "ace_tooltip ace_doc-tooltip"; + this.tooltipNode.style.margin = 0; + this.tooltipNode.style.pointerEvents = "auto"; + this.tooltipNode.tabIndex = -1; + this.tooltipNode.onblur = this.blurListener.bind(this); + this.tooltipNode.onclick = this.onTooltipClick.bind(this); + } + + var tooltipNode = this.tooltipNode; + if (item.docHTML) { + tooltipNode.innerHTML = item.docHTML; + } else if (item.docText) { + tooltipNode.textContent = item.docText; + } + + if (!tooltipNode.parentNode) + document.body.appendChild(tooltipNode); + var popup = this.popup; + var rect = popup.container.getBoundingClientRect(); + tooltipNode.style.top = popup.container.style.top; + tooltipNode.style.bottom = popup.container.style.bottom; + + tooltipNode.style.display = "block"; + if (window.innerWidth - rect.right < 320) { + if (rect.left < 320) { + if(popup.isTopdown) { + tooltipNode.style.top = rect.bottom + "px"; + tooltipNode.style.left = rect.left + "px"; + tooltipNode.style.right = ""; + tooltipNode.style.bottom = ""; + } else { + tooltipNode.style.top = popup.container.offsetTop - tooltipNode.offsetHeight + "px"; + tooltipNode.style.left = rect.left + "px"; + tooltipNode.style.right = ""; + tooltipNode.style.bottom = ""; + } + } else { + tooltipNode.style.right = window.innerWidth - rect.left + "px"; + tooltipNode.style.left = ""; + } + } else { + tooltipNode.style.left = (rect.right + 1) + "px"; + tooltipNode.style.right = ""; + } + }; + + this.hideDocTooltip = function() { + this.tooltipTimer.cancel(); + if (!this.tooltipNode) return; + var el = this.tooltipNode; + if (!this.editor.isFocused() && document.activeElement == el) + this.editor.focus(); + this.tooltipNode = null; + if (el.parentNode) + el.parentNode.removeChild(el); + }; + + this.onTooltipClick = function(e) { + var a = e.target; + while (a && a != this.tooltipNode) { + if (a.nodeName == "A" && a.href) { + a.rel = "noreferrer"; + a.target = "_blank"; + break; + } + a = a.parentNode; + } + }; + + this.destroy = function() { + this.detach(); + if (this.popup) { + this.popup.destroy(); + var el = this.popup.container; + if (el && el.parentNode) + el.parentNode.removeChild(el); + } + if (this.editor && this.editor.completer == this) + this.editor.completer == null; + this.popup = null; + }; + +}).call(Autocomplete.prototype); + + +Autocomplete.for = function(editor) { + if (editor.completer) { + return editor.completer; + } + if (config.get("sharedPopups")) { + if (!Autocomplete.$shared) + Autocomplete.$sharedInstance = new Autocomplete(); + editor.completer = Autocomplete.$sharedInstance; + } else { + editor.completer = new Autocomplete(); + editor.once("destroy", function(e, editor) { + editor.completer.destroy(); + }); + } + return editor.completer; +}; + +Autocomplete.startCommand = { + name: "startAutocomplete", + exec: function(editor, options) { + var completer = Autocomplete.for(editor); + completer.autoInsert = false; + completer.autoSelect = true; + completer.showPopup(editor, options); + completer.cancelContextMenu(); + }, + bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space" +}; + +var FilteredList = function(array, filterText) { + this.all = array; + this.filtered = array; + this.filterText = filterText || ""; + this.exactMatch = false; +}; +(function(){ + this.setFilter = function(str) { + if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0) + var matches = this.filtered; + else + var matches = this.all; + + this.filterText = str; + matches = this.filterCompletions(matches, this.filterText); + matches = matches.sort(function(a, b) { + return b.exactMatch - a.exactMatch || b.$score - a.$score + || (a.caption || a.value).localeCompare(b.caption || b.value); + }); + var prev = null; + matches = matches.filter(function(item){ + var caption = item.snippet || item.caption || item.value; + if (caption === prev) return false; + prev = caption; + return true; + }); + + this.filtered = matches; + }; + this.filterCompletions = function(items, needle) { + var results = []; + var upper = needle.toUpperCase(); + var lower = needle.toLowerCase(); + loop: for (var i = 0, item; item = items[i]; i++) { + var caption = item.caption || item.value || item.snippet; + if (!caption) continue; + var lastIndex = -1; + var matchMask = 0; + var penalty = 0; + var index, distance; + + if (this.exactMatch) { + if (needle !== caption.substr(0, needle.length)) + continue loop; + } else { + var fullMatchIndex = caption.toLowerCase().indexOf(lower); + if (fullMatchIndex > -1) { + penalty = fullMatchIndex; + } else { + for (var j = 0; j < needle.length; j++) { + var i1 = caption.indexOf(lower[j], lastIndex + 1); + var i2 = caption.indexOf(upper[j], lastIndex + 1); + index = (i1 >= 0) ? ((i2 < 0 || i1 < i2) ? i1 : i2) : i2; + if (index < 0) + continue loop; + distance = index - lastIndex - 1; + if (distance > 0) { + if (lastIndex === -1) + penalty += 10; + penalty += distance; + matchMask = matchMask | (1 << j); + } + lastIndex = index; + } + } + } + item.matchMask = matchMask; + item.exactMatch = penalty ? 0 : 1; + item.$score = (item.score || 0) - penalty; + results.push(item); + } + var keywords = []; + for (var i=0, j=results.length; i=0;){ + if (!results[i]) continue + if (results[i].meta=='local' && keywords.indexOf(results[i].caption)!=-1){ + results.splice(i,1) + } + } + + return results; + }; +}).call(FilteredList.prototype); + +exports.Autocomplete = Autocomplete; +exports.FilteredList = FilteredList; + +}); + +define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +'use strict'; +var dom = require("../../lib/dom"); +var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ +background-color: #F7F7F7;\ +color: black;\ +box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ +padding: 1em 0.5em 2em 1em;\ +overflow: auto;\ +position: absolute;\ +margin: 0;\ +bottom: 0;\ +right: 0;\ +top: 0;\ +z-index: 9991;\ +cursor: default;\ +}\ +.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ +box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ +background-color: rgba(255, 255, 255, 0.6);\ +color: black;\ +}\ +.ace_optionsMenuEntry:hover {\ +background-color: rgba(100, 100, 100, 0.1);\ +transition: all 0.3s\ +}\ +.ace_closeButton {\ +background: rgba(245, 146, 146, 0.5);\ +border: 1px solid #F48A8A;\ +border-radius: 50%;\ +padding: 7px;\ +position: absolute;\ +right: -8px;\ +top: -8px;\ +z-index: 100000;\ +}\ +.ace_closeButton{\ +background: rgba(245, 146, 146, 0.9);\ +}\ +.ace_optionsMenuKey {\ +color: darkslateblue;\ +font-weight: bold;\ +}\ +.ace_optionsMenuCommand {\ +color: darkcyan;\ +font-weight: normal;\ +}\ +.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\ +vertical-align: middle;\ +}\ +.ace_optionsMenuEntry button[ace_selected_button=true] {\ +background: #e7e7e7;\ +box-shadow: 1px 0px 2px 0px #adadad inset;\ +border-color: #adadad;\ +}\ +.ace_optionsMenuEntry button {\ +background: white;\ +border: 1px solid lightgray;\ +margin: 0px;\ +}\ +.ace_optionsMenuEntry button:hover{\ +background: #f0f0f0;\ +}"; +dom.importCssString(cssText, "settings_menu.css", false); + +module.exports.overlayPage = function overlayPage(editor, contentElement, callback) { + var closer = document.createElement('div'); + var ignoreFocusOut = false; + + function documentEscListener(e) { + if (e.keyCode === 27) { + close(); + } + } + + function close() { + if (!closer) return; + document.removeEventListener('keydown', documentEscListener); + closer.parentNode.removeChild(closer); + if (editor) { + editor.focus(); + } + closer = null; + callback && callback(); + } + function setIgnoreFocusOut(ignore) { + ignoreFocusOut = ignore; + if (ignore) { + closer.style.pointerEvents = "none"; + contentElement.style.pointerEvents = "auto"; + } + } + + closer.style.cssText = 'margin: 0; padding: 0; ' + + 'position: fixed; top:0; bottom:0; left:0; right:0;' + + 'z-index: 9990; ' + + (editor ? 'background-color: rgba(0, 0, 0, 0.3);' : ''); + closer.addEventListener('click', function(e) { + if (!ignoreFocusOut) { + close(); + } + }); + document.addEventListener('keydown', documentEscListener); + + contentElement.addEventListener('click', function (e) { + e.stopPropagation(); + }); + + closer.appendChild(contentElement); + document.body.appendChild(closer); + if (editor) { + editor.blur(); + } + return { + close: close, + setIgnoreFocusOut: setIgnoreFocusOut + }; +}; + +}); + +define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var modes = []; +function getModeForPath(path) { + var mode = modesByName.text; + var fileName = path.split(/[\/\\]/).pop(); + for (var i = 0; i < modes.length; i++) { + if (modes[i].supportsFile(fileName)) { + mode = modes[i]; + break; + } + } + return mode; +} + +var Mode = function(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function(a, b){ + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } else { + re = "^.*\\.(" + extensions + ")$"; + } + + this.extRe = new RegExp(re, "gi"); +}; + +Mode.prototype.supportsFile = function(filename) { + return filename.match(this.extRe); +}; +var supportedModes = { + ABAP: ["abap"], + ABC: ["abc"], + ActionScript:["as"], + ADA: ["ada|adb"], + Alda: ["alda"], + Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], + Apex: ["apex|cls|trigger|tgr"], + AQL: ["aql"], + AsciiDoc: ["asciidoc|adoc"], + ASL: ["dsl|asl|asl.json"], + Assembly_x86:["asm|a"], + AutoHotKey: ["ahk"], + BatchFile: ["bat|cmd"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm"], + Crystal: ["cr"], + CSharp: ["cs"], + Csound_Document: ["csd"], + Csound_Orchestra: ["orc"], + Csound_Score: ["sco"], + CSS: ["css"], + Curly: ["curly"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Edifact: ["edi"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], + FSL: ["fsl"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], + GraphQLSchema: ["gql"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], + Haskell_Cabal: ["cabal"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml|vue|we|wpy"], + HTML_Elixir: ["eex|html.eex"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Ion: ["ion"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|jsx|cjs|mjs"], + JSON: ["json"], + JSON5: ["json5"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSSM: ["jssm|jssm_state"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + Latte: ["latte"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + Log: ["log"], + LogiQL: ["logic|lql"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MediaWiki: ["wiki|mediawiki"], + MEL: ["mel"], + MIPS: ["s|asm"], + MIXAL: ["mixal"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Nginx: ["nginx|conf"], + Nim: ["nim"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + Nunjucks: ["nunjucks|nunjs|nj|njk"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + PartiQL: ["partiql|pql"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP_Laravel_blade: ["blade.php"], + PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], + Pig: ["pig"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prisma: ["prisma"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + Puppet: ["epp|pp"], + Python: ["py"], + QML: ["qml"], + R: ["r"], + Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + Red: ["red|reds"], + RHTML: ["Rhtml"], + Robot: ["robot|resource"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SaC: ["sac"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala|sbt"], + Scheme: ["scm|sm|rkt|oak|scheme"], + Scrypt: ["scrypt"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Slim: ["slim|skim"], + Smarty: ["smarty|tpl"], + Smithy: ["smithy"], + snippets: ["snippets"], + Soy_Template:["soy"], + Space: ["space"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Terraform: ["tf", "tfvars", "terragrunt"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSX: ["tsx"], + Twig: ["twig|swig"], + Typescript: ["ts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], + Visualforce: ["vfp|component|page"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Zeek: ["zeek|bro"], + Django: ["html"] +}; + +var nameOverrides = { + ObjectiveC: "Objective-C", + CSharp: "C#", + golang: "Go", + C_Cpp: "C and C++", + Csound_Document: "Csound Document", + Csound_Orchestra: "Csound", + Csound_Score: "Csound Score", + coffee: "CoffeeScript", + HTML_Ruby: "HTML (Ruby)", + HTML_Elixir: "HTML (Elixir)", + FTL: "FreeMarker", + PHP_Laravel_blade: "PHP (Blade Template)", + Perl6: "Perl 6", + AutoHotKey: "AutoHotkey / AutoIt" +}; + +var modesByName = {}; +for (var name in supportedModes) { + var data = supportedModes[name]; + var displayName = (nameOverrides[name] || name).replace(/_/g, " "); + var filename = name.toLowerCase(); + var mode = new Mode(filename, displayName, data[0]); + modesByName[filename] = mode; + modes.push(mode); +} + +module.exports = { + getModeForPath: getModeForPath, + modes: modes, + modesByName: modesByName +}; + +}); + +define("ace/ext/prompt",["require","exports","module","ace/range","ace/lib/dom","ace/ext/menu_tools/get_editor_keyboard_shortcuts","ace/autocomplete","ace/autocomplete/popup","ace/autocomplete/popup","ace/undomanager","ace/tokenizer","ace/ext/menu_tools/overlay_page","ace/ext/modelist"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +var dom = require("../lib/dom"); +var shortcuts = require("../ext/menu_tools/get_editor_keyboard_shortcuts"); +var FilteredList= require("../autocomplete").FilteredList; +var AcePopup = require('../autocomplete/popup').AcePopup; +var $singleLineEditor = require('../autocomplete/popup').$singleLineEditor; +var UndoManager = require("../undomanager").UndoManager; +var Tokenizer = require("../tokenizer").Tokenizer; +var overlayPage = require("./menu_tools/overlay_page").overlayPage; +var modelist = require("./modelist"); +var openPrompt; + +function prompt(editor, message, options, callback) { + if (typeof message == "object") { + return prompt(editor, "", message, options); + } + if (openPrompt) { + var lastPrompt = openPrompt; + editor = lastPrompt.editor; + lastPrompt.close(); + if (lastPrompt.name && lastPrompt.name == options.name) + return; + } + if (options.$type) + return prompt[options.$type](editor, callback); + + var cmdLine = $singleLineEditor(); + cmdLine.session.setUndoManager(new UndoManager()); + + var el = dom.buildDom(["div", {class: "ace_prompt_container" + (options.hasDescription ? " input-box-with-description" : "")}]); + var overlay = overlayPage(editor, el, done); + el.appendChild(cmdLine.container); + + if (editor) { + editor.cmdLine = cmdLine; + cmdLine.setOption("fontSize", editor.getOption("fontSize")); + } + if (message) { + cmdLine.setValue(message, 1); + } + if (options.selection) { + cmdLine.selection.setRange({ + start: cmdLine.session.doc.indexToPosition(options.selection[0]), + end: cmdLine.session.doc.indexToPosition(options.selection[1]) + }); + } + + if (options.getCompletions) { + var popup = new AcePopup(); + popup.renderer.setStyle("ace_autocomplete_inline"); + popup.container.style.display = "block"; + popup.container.style.maxWidth = "600px"; + popup.container.style.width = "100%"; + popup.container.style.marginTop = "3px"; + popup.renderer.setScrollMargin(2, 2, 0, 0); + popup.autoSelect = false; + popup.renderer.$maxLines = 15; + popup.setRow(-1); + popup.on("click", function(e) { + var data = popup.getData(popup.getRow()); + if (!data.error) { + cmdLine.setValue(data.value || data.name || data); + accept(); + e.stop(); + } + }); + el.appendChild(popup.container); + updateCompletions(); + } + + if (options.$rules) { + var tokenizer = new Tokenizer(options.$rules); + cmdLine.session.bgTokenizer.setTokenizer(tokenizer); + } + + if (options.placeholder) { + cmdLine.setOption("placeholder", options.placeholder); + } + + if (options.hasDescription) { + var promptTextContainer = dom.buildDom(["div", {class: "ace_prompt_text_container"}]); + dom.buildDom(options.prompt || "Press 'Enter' to confirm or 'Escape' to cancel", promptTextContainer); + el.appendChild(promptTextContainer); + } + + overlay.setIgnoreFocusOut(options.ignoreFocusOut); + + function accept() { + var val; + if (popup && popup.getCursorPosition().row > 0) { + val = valueFromRecentList(); + } else { + val = cmdLine.getValue(); + } + var curData = popup ? popup.getData(popup.getRow()) : val; + if (curData && !curData.error) { + done(); + options.onAccept && options.onAccept({ + value: val, + item: curData + }, cmdLine); + } + } + + var keys = { + "Enter": accept, + "Esc|Shift-Esc": function() { + options.onCancel && options.onCancel(cmdLine.getValue(), cmdLine); + done(); + } + }; + + if (popup) { + Object.assign(keys, { + "Up": function(editor) { popup.goTo("up"); valueFromRecentList();}, + "Down": function(editor) { popup.goTo("down"); valueFromRecentList();}, + "Ctrl-Up|Ctrl-Home": function(editor) { popup.goTo("start"); valueFromRecentList();}, + "Ctrl-Down|Ctrl-End": function(editor) { popup.goTo("end"); valueFromRecentList();}, + "Tab": function(editor) { + popup.goTo("down"); valueFromRecentList(); + }, + "PageUp": function(editor) { popup.gotoPageUp(); valueFromRecentList();}, + "PageDown": function(editor) { popup.gotoPageDown(); valueFromRecentList();} + }); + } + + cmdLine.commands.bindKeys(keys); + + function done() { + overlay.close(); + callback && callback(); + openPrompt = null; + } + + cmdLine.on("input", function() { + options.onInput && options.onInput(); + updateCompletions(); + }); + + function updateCompletions() { + if (options.getCompletions) { + var prefix; + if (options.getPrefix) { + prefix = options.getPrefix(cmdLine); + } + + var completions = options.getCompletions(cmdLine); + popup.setData(completions, prefix); + popup.resize(true); + } + } + + function valueFromRecentList() { + var current = popup.getData(popup.getRow()); + if (current && !current.error) + return current.value || current.caption || current; + } + + cmdLine.resize(true); + if (popup) { + popup.resize(true); + } + cmdLine.focus(); + + openPrompt = { + close: done, + name: options.name, + editor: editor + }; +} + +prompt.gotoLine = function(editor, callback) { + function stringifySelection(selection) { + if (!Array.isArray(selection)) + selection = [selection]; + return selection.map(function(r) { + var cursor = r.isBackwards ? r.start: r.end; + var anchor = r.isBackwards ? r.end: r.start; + var row = anchor.row; + var s = (row + 1) + ":" + anchor.column; + + if (anchor.row == cursor.row) { + if (anchor.column != cursor.column) + s += ">" + ":" + cursor.column; + } else { + s += ">" + (cursor.row + 1) + ":" + cursor.column; + } + return s; + }).reverse().join(", "); + } + + prompt(editor, ":" + stringifySelection(editor.selection.toJSON()), { + name: "gotoLine", + selection: [1, Number.MAX_VALUE], + onAccept: function(data) { + var value = data.value; + var _history = prompt.gotoLine._history; + if (!_history) + prompt.gotoLine._history = _history = []; + if (_history.indexOf(value) != -1) + _history.splice(_history.indexOf(value), 1); + _history.unshift(value); + if (_history.length > 20) _history.length = 20; + + + var pos = editor.getCursorPosition(); + var ranges = []; + value.replace(/^:/, "").split(/,/).map(function(str) { + var parts = str.split(/([<>:+-]|c?\d+)|[^c\d<>:+-]+/).filter(Boolean); + var i = 0; + function readPosition() { + var c = parts[i++]; + if (!c) return; + if (c[0] == "c") { + var index = parseInt(c.slice(1)) || 0; + return editor.session.doc.indexToPosition(index); + } + var row = pos.row; + var column = 0; + if (/\d/.test(c)) { + row = parseInt(c) - 1; + c = parts[i++]; + } + if (c == ":") { + c = parts[i++]; + if (/\d/.test(c)) { + column = parseInt(c) || 0; + } + } + return {row: row, column: column}; + } + pos = readPosition(); + var range = Range.fromPoints(pos, pos); + if (parts[i] == ">") { + i++; + range.end = readPosition(); + } + else if (parts[i] == "<") { + i++; + range.start = readPosition(); + } + ranges.unshift(range); + }); + editor.selection.fromJSON(ranges); + var scrollTop = editor.renderer.scrollTop; + editor.renderer.scrollSelectionIntoView( + editor.selection.anchor, + editor.selection.cursor, + 0.5 + ); + editor.renderer.animateScrolling(scrollTop); + }, + history: function() { + var undoManager = editor.session.getUndoManager(); + if (!prompt.gotoLine._history) + return []; + return prompt.gotoLine._history; + + }, + getCompletions: function(cmdLine) { + var value = cmdLine.getValue(); + var m = value.replace(/^:/, "").split(":"); + var row = Math.min(parseInt(m[0]) || 1, editor.session.getLength()) - 1; + var line = editor.session.getLine(row); + var current = value + " " + line; + return [current].concat(this.history()); + }, + $rules: { + start: [{ + regex: /\d+/, + token: "string" + }, { + regex: /[:,><+\-c]/, + token: "keyword" + }] + } + }); +}; + +prompt.commands = function(editor, callback) { + function normalizeName(name) { + return (name || "").replace(/^./, function(x) { + return x.toUpperCase(x); + }).replace(/[a-z][A-Z]/g, function(x) { + return x[0] + " " + x[1].toLowerCase(x); + }); + } + function getEditorCommandsByName(excludeCommands) { + var commandsByName = []; + var commandMap = {}; + editor.keyBinding.$handlers.forEach(function(handler) { + var platform = handler.platform; + var cbn = handler.byName; + for (var i in cbn) { + var key = cbn[i].bindKey; + if (typeof key !== "string") { + key = key && key[platform] || ""; + } + var commands = cbn[i]; + var description = commands.description || normalizeName(commands.name); + if (!Array.isArray(commands)) + commands = [commands]; + commands.forEach(function(command) { + if (typeof command != "string") + command = command.name; + var needle = excludeCommands.find(function(el) { + return el === command; + }); + if (!needle) { + if (commandMap[command]) { + commandMap[command].key += "|" + key; + } else { + commandMap[command] = {key: key, command: command, description: description}; + commandsByName.push(commandMap[command]); + } + } + }); + } + }); + return commandsByName; + } + var excludeCommandsList = ["insertstring", "inserttext", "setIndentation", "paste"]; + var shortcutsArray = getEditorCommandsByName(excludeCommandsList); + shortcutsArray = shortcutsArray.map(function(item) { + return {value: item.description, meta: item.key, command: item.command}; + }); + prompt(editor, "", { + name: "commands", + selection: [0, Number.MAX_VALUE], + maxHistoryCount: 5, + onAccept: function(data) { + if (data.item) { + var commandName = data.item.command; + this.addToHistory(data.item); + + editor.execCommand(commandName); + } + }, + addToHistory: function(item) { + var history = this.history(); + history.unshift(item); + delete item.message; + for (var i = 1; i < history.length; i++) { + if (history[i]["command"] == item.command ) { + history.splice(i, 1); + break; + } + } + if (this.maxHistoryCount > 0 && history.length > this.maxHistoryCount) { + history.splice(history.length - 1, 1); + } + prompt.commands.history = history; + }, + history: function() { + return prompt.commands.history || []; + }, + getPrefix: function(cmdLine) { + var currentPos = cmdLine.getCursorPosition(); + var filterValue = cmdLine.getValue(); + return filterValue.substring(0, currentPos.column); + }, + getCompletions: function(cmdLine) { + function getFilteredCompletions(commands, prefix) { + var resultCommands = JSON.parse(JSON.stringify(commands)); + + var filtered = new FilteredList(resultCommands); + return filtered.filterCompletions(resultCommands, prefix); + } + + function getUniqueCommandList(commands, usedCommands) { + if (!usedCommands || !usedCommands.length) { + return commands; + } + var excludeCommands = []; + usedCommands.forEach(function(item) { + excludeCommands.push(item.command); + }); + + var resultCommands = []; + + commands.forEach(function(item) { + if (excludeCommands.indexOf(item.command) === -1) { + resultCommands.push(item); + } + }); + + return resultCommands; + } + + var prefix = this.getPrefix(cmdLine); + var recentlyUsedCommands = getFilteredCompletions(this.history(), prefix); + var otherCommands = getUniqueCommandList(shortcutsArray, recentlyUsedCommands); + otherCommands = getFilteredCompletions(otherCommands, prefix); + + if (recentlyUsedCommands.length && otherCommands.length) { + recentlyUsedCommands[0]["message"] = " Recently used"; + otherCommands[0]["message"] = " Other commands"; + } + + var completions = recentlyUsedCommands.concat(otherCommands); + return completions.length > 0 ? completions : [{ + value: "No matching commands", + error: 1 + }]; + } + }); +}; + +prompt.modes = function(editor, callback) { + var modesArray = modelist.modes; + modesArray = modesArray.map(function(item) { + return {value: item.caption, mode: item.name}; + }); + prompt(editor, "", { + name: "modes", + selection: [0, Number.MAX_VALUE], + onAccept: function(data) { + if (data.item) { + var modeName = "ace/mode/" + data.item.mode; + editor.session.setMode(modeName); + } + }, + getPrefix: function(cmdLine) { + var currentPos = cmdLine.getCursorPosition(); + var filterValue = cmdLine.getValue(); + return filterValue.substring(0, currentPos.column); + }, + getCompletions: function(cmdLine) { + function getFilteredCompletions(modes, prefix) { + var resultCommands = JSON.parse(JSON.stringify(modes)); + + var filtered = new FilteredList(resultCommands); + return filtered.filterCompletions(resultCommands, prefix); + } + + var prefix = this.getPrefix(cmdLine); + var completions = getFilteredCompletions(modesArray, prefix); + return completions.length > 0 ? completions : [{ + "caption": "No mode matching", + "value": "No mode matching", + "error": 1 + }]; + } + }); +}; + +dom.importCssString(".ace_prompt_container {\ + max-width: 600px;\ + width: 100%;\ + margin: 20px auto;\ + padding: 3px;\ + background: white;\ + border-radius: 2px;\ + box-shadow: 0px 2px 3px 0px #555;\ +}", "promtp.css", false); + + +exports.prompt = prompt; + +}); (function() { + window.require(["ace/ext/prompt"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-rtl.js b/app/Resources/ui/js/ace/ext-rtl.js new file mode 100644 index 00000000..39ebfd9d --- /dev/null +++ b/app/Resources/ui/js/ace/ext-rtl.js @@ -0,0 +1,122 @@ +define("ace/ext/rtl",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) { +"use strict"; + +var commands = [{ + name: "leftToRight", + bindKey: { win: "Ctrl-Alt-Shift-L", mac: "Command-Alt-Shift-L" }, + exec: function(editor) { + editor.session.$bidiHandler.setRtlDirection(editor, false); + }, + readOnly: true +}, { + name: "rightToLeft", + bindKey: { win: "Ctrl-Alt-Shift-R", mac: "Command-Alt-Shift-R" }, + exec: function(editor) { + editor.session.$bidiHandler.setRtlDirection(editor, true); + }, + readOnly: true +}]; + +var Editor = require("../editor").Editor; +require("../config").defineOptions(Editor.prototype, "editor", { + rtlText: { + set: function(val) { + if (val) { + this.on("change", onChange); + this.on("changeSelection", onChangeSelection); + this.renderer.on("afterRender", updateLineDirection); + this.commands.on("exec", onCommandEmitted); + this.commands.addCommands(commands); + } else { + this.off("change", onChange); + this.off("changeSelection", onChangeSelection); + this.renderer.off("afterRender", updateLineDirection); + this.commands.off("exec", onCommandEmitted); + this.commands.removeCommands(commands); + clearTextLayer(this.renderer); + } + this.renderer.updateFull(); + } + }, + rtl: { + set: function(val) { + this.session.$bidiHandler.$isRtl = val; + if (val) { + this.setOption("rtlText", false); + this.renderer.on("afterRender", updateLineDirection); + this.session.$bidiHandler.seenBidi = true; + } else { + this.renderer.off("afterRender", updateLineDirection); + clearTextLayer(this.renderer); + } + this.renderer.updateFull(); + } + } +}); +function onChangeSelection(e, editor) { + var lead = editor.getSelection().lead; + if (editor.session.$bidiHandler.isRtlLine(lead.row)) { + if (lead.column === 0) { + if (editor.session.$bidiHandler.isMoveLeftOperation && lead.row > 0) { + editor.getSelection().moveCursorTo(lead.row - 1, editor.session.getLine(lead.row - 1).length); + } else { + if (editor.getSelection().isEmpty()) + lead.column += 1; + else + lead.setPosition(lead.row, lead.column + 1); + } + } + } +} + +function onCommandEmitted(commadEvent) { + commadEvent.editor.session.$bidiHandler.isMoveLeftOperation = /gotoleft|selectleft|backspace|removewordleft/.test(commadEvent.command.name); +} +function onChange(delta, editor) { + var session = editor.session; + session.$bidiHandler.currentRow = null; + if (session.$bidiHandler.isRtlLine(delta.start.row) && delta.action === 'insert' && delta.lines.length > 1) { + for (var row = delta.start.row; row < delta.end.row; row++) { + if (session.getLine(row + 1).charAt(0) !== session.$bidiHandler.RLE) + session.doc.$lines[row + 1] = session.$bidiHandler.RLE + session.getLine(row + 1); + } + } +} + +function updateLineDirection(e, renderer) { + var session = renderer.session; + var $bidiHandler = session.$bidiHandler; + var cells = renderer.$textLayer.$lines.cells; + var width = renderer.layerConfig.width - renderer.layerConfig.padding + "px"; + cells.forEach(function(cell) { + var style = cell.element.style; + if ($bidiHandler && $bidiHandler.isRtlLine(cell.row)) { + style.direction = "rtl"; + style.textAlign = "right"; + style.width = width; + } else { + style.direction = ""; + style.textAlign = ""; + style.width = ""; + } + }); +} + +function clearTextLayer(renderer) { + var lines = renderer.$textLayer.$lines; + lines.cells.forEach(clear); + lines.cellCache.forEach(clear); + function clear(cell) { + var style = cell.element.style; + style.direction = style.textAlign = style.width = ""; + } +} + +}); (function() { + window.require(["ace/ext/rtl"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-searchbox.js b/app/Resources/ui/js/ace/ext-searchbox.js new file mode 100644 index 00000000..8be7e8c1 --- /dev/null +++ b/app/Resources/ui/js/ace/ext-searchbox.js @@ -0,0 +1,514 @@ +define("ace/ext/searchbox",["require","exports","module","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/keyboard/hash_handler","ace/lib/keys"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var event = require("../lib/event"); +var searchboxCss = "\ +.ace_search {\ +background-color: #ddd;\ +color: #666;\ +border: 1px solid #cbcbcb;\ +border-top: 0 none;\ +overflow: hidden;\ +margin: 0;\ +padding: 4px 6px 0 4px;\ +position: absolute;\ +top: 0;\ +z-index: 99;\ +white-space: normal;\ +}\ +.ace_search.left {\ +border-left: 0 none;\ +border-radius: 0px 0px 5px 0px;\ +left: 0;\ +}\ +.ace_search.right {\ +border-radius: 0px 0px 0px 5px;\ +border-right: 0 none;\ +right: 0;\ +}\ +.ace_search_form, .ace_replace_form {\ +margin: 0 20px 4px 0;\ +overflow: hidden;\ +line-height: 1.9;\ +}\ +.ace_replace_form {\ +margin-right: 0;\ +}\ +.ace_search_form.ace_nomatch {\ +outline: 1px solid red;\ +}\ +.ace_search_field {\ +border-radius: 3px 0 0 3px;\ +background-color: white;\ +color: black;\ +border: 1px solid #cbcbcb;\ +border-right: 0 none;\ +outline: 0;\ +padding: 0;\ +font-size: inherit;\ +margin: 0;\ +line-height: inherit;\ +padding: 0 6px;\ +min-width: 17em;\ +vertical-align: top;\ +min-height: 1.8em;\ +box-sizing: content-box;\ +}\ +.ace_searchbtn {\ +border: 1px solid #cbcbcb;\ +line-height: inherit;\ +display: inline-block;\ +padding: 0 6px;\ +background: #fff;\ +border-right: 0 none;\ +border-left: 1px solid #dcdcdc;\ +cursor: pointer;\ +margin: 0;\ +position: relative;\ +color: #666;\ +}\ +.ace_searchbtn:last-child {\ +border-radius: 0 3px 3px 0;\ +border-right: 1px solid #cbcbcb;\ +}\ +.ace_searchbtn:disabled {\ +background: none;\ +cursor: default;\ +}\ +.ace_searchbtn:hover {\ +background-color: #eef1f6;\ +}\ +.ace_searchbtn.prev, .ace_searchbtn.next {\ +padding: 0px 0.7em\ +}\ +.ace_searchbtn.prev:after, .ace_searchbtn.next:after {\ +content: \"\";\ +border: solid 2px #888;\ +width: 0.5em;\ +height: 0.5em;\ +border-width: 2px 0 0 2px;\ +display:inline-block;\ +transform: rotate(-45deg);\ +}\ +.ace_searchbtn.next:after {\ +border-width: 0 2px 2px 0 ;\ +}\ +.ace_searchbtn_close {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\ +border-radius: 50%;\ +border: 0 none;\ +color: #656565;\ +cursor: pointer;\ +font: 16px/16px Arial;\ +padding: 0;\ +height: 14px;\ +width: 14px;\ +top: 9px;\ +right: 7px;\ +position: absolute;\ +}\ +.ace_searchbtn_close:hover {\ +background-color: #656565;\ +background-position: 50% 100%;\ +color: white;\ +}\ +.ace_button {\ +margin-left: 2px;\ +cursor: pointer;\ +-webkit-user-select: none;\ +-moz-user-select: none;\ +-o-user-select: none;\ +-ms-user-select: none;\ +user-select: none;\ +overflow: hidden;\ +opacity: 0.7;\ +border: 1px solid rgba(100,100,100,0.23);\ +padding: 1px;\ +box-sizing: border-box!important;\ +color: black;\ +}\ +.ace_button:hover {\ +background-color: #eee;\ +opacity:1;\ +}\ +.ace_button:active {\ +background-color: #ddd;\ +}\ +.ace_button.checked {\ +border-color: #3399ff;\ +opacity:1;\ +}\ +.ace_search_options{\ +margin-bottom: 3px;\ +text-align: right;\ +-webkit-user-select: none;\ +-moz-user-select: none;\ +-o-user-select: none;\ +-ms-user-select: none;\ +user-select: none;\ +clear: both;\ +}\ +.ace_search_counter {\ +float: left;\ +font-family: arial;\ +padding: 0 8px;\ +}"; +var HashHandler = require("../keyboard/hash_handler").HashHandler; +var keyUtil = require("../lib/keys"); + +var MAX_COUNT = 999; + +dom.importCssString(searchboxCss, "ace_searchbox", false); + +var SearchBox = function(editor, range, showReplaceForm) { + var div = dom.createElement("div"); + dom.buildDom(["div", {class:"ace_search right"}, + ["span", {action: "hide", class: "ace_searchbtn_close"}], + ["div", {class: "ace_search_form"}, + ["input", {class: "ace_search_field", placeholder: "Search for", spellcheck: "false"}], + ["span", {action: "findPrev", class: "ace_searchbtn prev"}, "\u200b"], + ["span", {action: "findNext", class: "ace_searchbtn next"}, "\u200b"], + ["span", {action: "findAll", class: "ace_searchbtn", title: "Alt-Enter"}, "All"] + ], + ["div", {class: "ace_replace_form"}, + ["input", {class: "ace_search_field", placeholder: "Replace with", spellcheck: "false"}], + ["span", {action: "replaceAndFindNext", class: "ace_searchbtn"}, "Replace"], + ["span", {action: "replaceAll", class: "ace_searchbtn"}, "All"] + ], + ["div", {class: "ace_search_options"}, + ["span", {action: "toggleReplace", class: "ace_button", title: "Toggle Replace mode", + style: "float:left;margin-top:-2px;padding:0 5px;"}, "+"], + ["span", {class: "ace_search_counter"}], + ["span", {action: "toggleRegexpMode", class: "ace_button", title: "RegExp Search"}, ".*"], + ["span", {action: "toggleCaseSensitive", class: "ace_button", title: "CaseSensitive Search"}, "Aa"], + ["span", {action: "toggleWholeWords", class: "ace_button", title: "Whole Word Search"}, "\\b"], + ["span", {action: "searchInSelection", class: "ace_button", title: "Search In Selection"}, "S"] + ] + ], div); + this.element = div.firstChild; + + this.setSession = this.setSession.bind(this); + + this.$init(); + this.setEditor(editor); + dom.importCssString(searchboxCss, "ace_searchbox", editor.container); +}; + +(function() { + this.setEditor = function(editor) { + editor.searchBox = this; + editor.renderer.scroller.appendChild(this.element); + this.editor = editor; + }; + + this.setSession = function(e) { + this.searchRange = null; + this.$syncOptions(true); + }; + + this.$initElements = function(sb) { + this.searchBox = sb.querySelector(".ace_search_form"); + this.replaceBox = sb.querySelector(".ace_replace_form"); + this.searchOption = sb.querySelector("[action=searchInSelection]"); + this.replaceOption = sb.querySelector("[action=toggleReplace]"); + this.regExpOption = sb.querySelector("[action=toggleRegexpMode]"); + this.caseSensitiveOption = sb.querySelector("[action=toggleCaseSensitive]"); + this.wholeWordOption = sb.querySelector("[action=toggleWholeWords]"); + this.searchInput = this.searchBox.querySelector(".ace_search_field"); + this.replaceInput = this.replaceBox.querySelector(".ace_search_field"); + this.searchCounter = sb.querySelector(".ace_search_counter"); + }; + + this.$init = function() { + var sb = this.element; + + this.$initElements(sb); + + var _this = this; + event.addListener(sb, "mousedown", function(e) { + setTimeout(function(){ + _this.activeInput.focus(); + }, 0); + event.stopPropagation(e); + }); + event.addListener(sb, "click", function(e) { + var t = e.target || e.srcElement; + var action = t.getAttribute("action"); + if (action && _this[action]) + _this[action](); + else if (_this.$searchBarKb.commands[action]) + _this.$searchBarKb.commands[action].exec(_this); + event.stopPropagation(e); + }); + + event.addCommandKeyListener(sb, function(e, hashId, keyCode) { + var keyString = keyUtil.keyCodeToString(keyCode); + var command = _this.$searchBarKb.findKeyCommand(hashId, keyString); + if (command && command.exec) { + command.exec(_this); + event.stopEvent(e); + } + }); + + this.$onChange = lang.delayedCall(function() { + _this.find(false, false); + }); + + event.addListener(this.searchInput, "input", function() { + _this.$onChange.schedule(20); + }); + event.addListener(this.searchInput, "focus", function() { + _this.activeInput = _this.searchInput; + _this.searchInput.value && _this.highlight(); + }); + event.addListener(this.replaceInput, "focus", function() { + _this.activeInput = _this.replaceInput; + _this.searchInput.value && _this.highlight(); + }); + }; + this.$closeSearchBarKb = new HashHandler([{ + bindKey: "Esc", + name: "closeSearchBar", + exec: function(editor) { + editor.searchBox.hide(); + } + }]); + this.$searchBarKb = new HashHandler(); + this.$searchBarKb.bindKeys({ + "Ctrl-f|Command-f": function(sb) { + var isReplace = sb.isReplace = !sb.isReplace; + sb.replaceBox.style.display = isReplace ? "" : "none"; + sb.replaceOption.checked = false; + sb.$syncOptions(); + sb.searchInput.focus(); + }, + "Ctrl-H|Command-Option-F": function(sb) { + if (sb.editor.getReadOnly()) + return; + sb.replaceOption.checked = true; + sb.$syncOptions(); + sb.replaceInput.focus(); + }, + "Ctrl-G|Command-G": function(sb) { + sb.findNext(); + }, + "Ctrl-Shift-G|Command-Shift-G": function(sb) { + sb.findPrev(); + }, + "esc": function(sb) { + setTimeout(function() { sb.hide();}); + }, + "Return": function(sb) { + if (sb.activeInput == sb.replaceInput) + sb.replace(); + sb.findNext(); + }, + "Shift-Return": function(sb) { + if (sb.activeInput == sb.replaceInput) + sb.replace(); + sb.findPrev(); + }, + "Alt-Return": function(sb) { + if (sb.activeInput == sb.replaceInput) + sb.replaceAll(); + sb.findAll(); + }, + "Tab": function(sb) { + (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus(); + } + }); + + this.$searchBarKb.addCommands([{ + name: "toggleRegexpMode", + bindKey: {win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/"}, + exec: function(sb) { + sb.regExpOption.checked = !sb.regExpOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleCaseSensitive", + bindKey: {win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I"}, + exec: function(sb) { + sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleWholeWords", + bindKey: {win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W"}, + exec: function(sb) { + sb.wholeWordOption.checked = !sb.wholeWordOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleReplace", + exec: function(sb) { + sb.replaceOption.checked = !sb.replaceOption.checked; + sb.$syncOptions(); + } + }, { + name: "searchInSelection", + exec: function(sb) { + sb.searchOption.checked = !sb.searchRange; + sb.setSearchRange(sb.searchOption.checked && sb.editor.getSelectionRange()); + sb.$syncOptions(); + } + }]); + + this.setSearchRange = function(range) { + this.searchRange = range; + if (range) { + this.searchRangeMarker = this.editor.session.addMarker(range, "ace_active-line"); + } else if (this.searchRangeMarker) { + this.editor.session.removeMarker(this.searchRangeMarker); + this.searchRangeMarker = null; + } + }; + + this.$syncOptions = function(preventScroll) { + dom.setCssClass(this.replaceOption, "checked", this.searchRange); + dom.setCssClass(this.searchOption, "checked", this.searchOption.checked); + this.replaceOption.textContent = this.replaceOption.checked ? "-" : "+"; + dom.setCssClass(this.regExpOption, "checked", this.regExpOption.checked); + dom.setCssClass(this.wholeWordOption, "checked", this.wholeWordOption.checked); + dom.setCssClass(this.caseSensitiveOption, "checked", this.caseSensitiveOption.checked); + var readOnly = this.editor.getReadOnly(); + this.replaceOption.style.display = readOnly ? "none" : ""; + this.replaceBox.style.display = this.replaceOption.checked && !readOnly ? "" : "none"; + this.find(false, false, preventScroll); + }; + + this.highlight = function(re) { + this.editor.session.highlight(re || this.editor.$search.$options.re); + this.editor.renderer.updateBackMarkers(); + }; + this.find = function(skipCurrent, backwards, preventScroll) { + var range = this.editor.find(this.searchInput.value, { + skipCurrent: skipCurrent, + backwards: backwards, + wrap: true, + regExp: this.regExpOption.checked, + caseSensitive: this.caseSensitiveOption.checked, + wholeWord: this.wholeWordOption.checked, + preventScroll: preventScroll, + range: this.searchRange + }); + var noMatch = !range && this.searchInput.value; + dom.setCssClass(this.searchBox, "ace_nomatch", noMatch); + this.editor._emit("findSearchBox", { match: !noMatch }); + this.highlight(); + this.updateCounter(); + }; + this.updateCounter = function() { + var editor = this.editor; + var regex = editor.$search.$options.re; + var all = 0; + var before = 0; + if (regex) { + var value = this.searchRange + ? editor.session.getTextRange(this.searchRange) + : editor.getValue(); + + var offset = editor.session.doc.positionToIndex(editor.selection.anchor); + if (this.searchRange) + offset -= editor.session.doc.positionToIndex(this.searchRange.start); + + var last = regex.lastIndex = 0; + var m; + while ((m = regex.exec(value))) { + all++; + last = m.index; + if (last <= offset) + before++; + if (all > MAX_COUNT) + break; + if (!m[0]) { + regex.lastIndex = last += 1; + if (last >= value.length) + break; + } + } + } + this.searchCounter.textContent = before + " of " + (all > MAX_COUNT ? MAX_COUNT + "+" : all); + }; + this.findNext = function() { + this.find(true, false); + }; + this.findPrev = function() { + this.find(true, true); + }; + this.findAll = function(){ + var range = this.editor.findAll(this.searchInput.value, { + regExp: this.regExpOption.checked, + caseSensitive: this.caseSensitiveOption.checked, + wholeWord: this.wholeWordOption.checked + }); + var noMatch = !range && this.searchInput.value; + dom.setCssClass(this.searchBox, "ace_nomatch", noMatch); + this.editor._emit("findSearchBox", { match: !noMatch }); + this.highlight(); + this.hide(); + }; + this.replace = function() { + if (!this.editor.getReadOnly()) + this.editor.replace(this.replaceInput.value); + }; + this.replaceAndFindNext = function() { + if (!this.editor.getReadOnly()) { + this.editor.replace(this.replaceInput.value); + this.findNext(); + } + }; + this.replaceAll = function() { + if (!this.editor.getReadOnly()) + this.editor.replaceAll(this.replaceInput.value); + }; + + this.hide = function() { + this.active = false; + this.setSearchRange(null); + this.editor.off("changeSession", this.setSession); + + this.element.style.display = "none"; + this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb); + this.editor.focus(); + }; + this.show = function(value, isReplace) { + this.active = true; + this.editor.on("changeSession", this.setSession); + this.element.style.display = ""; + this.replaceOption.checked = isReplace; + + if (value) + this.searchInput.value = value; + + this.searchInput.focus(); + this.searchInput.select(); + + this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb); + + this.$syncOptions(true); + }; + + this.isFocused = function() { + var el = document.activeElement; + return el == this.searchInput || el == this.replaceInput; + }; +}).call(SearchBox.prototype); + +exports.SearchBox = SearchBox; + +exports.Search = function(editor, isReplace) { + var sb = editor.searchBox || new SearchBox(editor); + sb.show(editor.session.getTextRange(), isReplace); +}; + +}); (function() { + window.require(["ace/ext/searchbox"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-settings_menu.js b/app/Resources/ui/js/ace/ext-settings_menu.js new file mode 100644 index 00000000..e31c8867 --- /dev/null +++ b/app/Resources/ui/js/ace/ext-settings_menu.js @@ -0,0 +1,825 @@ +define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +'use strict'; +var dom = require("../../lib/dom"); +var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ +background-color: #F7F7F7;\ +color: black;\ +box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ +padding: 1em 0.5em 2em 1em;\ +overflow: auto;\ +position: absolute;\ +margin: 0;\ +bottom: 0;\ +right: 0;\ +top: 0;\ +z-index: 9991;\ +cursor: default;\ +}\ +.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ +box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ +background-color: rgba(255, 255, 255, 0.6);\ +color: black;\ +}\ +.ace_optionsMenuEntry:hover {\ +background-color: rgba(100, 100, 100, 0.1);\ +transition: all 0.3s\ +}\ +.ace_closeButton {\ +background: rgba(245, 146, 146, 0.5);\ +border: 1px solid #F48A8A;\ +border-radius: 50%;\ +padding: 7px;\ +position: absolute;\ +right: -8px;\ +top: -8px;\ +z-index: 100000;\ +}\ +.ace_closeButton{\ +background: rgba(245, 146, 146, 0.9);\ +}\ +.ace_optionsMenuKey {\ +color: darkslateblue;\ +font-weight: bold;\ +}\ +.ace_optionsMenuCommand {\ +color: darkcyan;\ +font-weight: normal;\ +}\ +.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\ +vertical-align: middle;\ +}\ +.ace_optionsMenuEntry button[ace_selected_button=true] {\ +background: #e7e7e7;\ +box-shadow: 1px 0px 2px 0px #adadad inset;\ +border-color: #adadad;\ +}\ +.ace_optionsMenuEntry button {\ +background: white;\ +border: 1px solid lightgray;\ +margin: 0px;\ +}\ +.ace_optionsMenuEntry button:hover{\ +background: #f0f0f0;\ +}"; +dom.importCssString(cssText, "settings_menu.css", false); + +module.exports.overlayPage = function overlayPage(editor, contentElement, callback) { + var closer = document.createElement('div'); + var ignoreFocusOut = false; + + function documentEscListener(e) { + if (e.keyCode === 27) { + close(); + } + } + + function close() { + if (!closer) return; + document.removeEventListener('keydown', documentEscListener); + closer.parentNode.removeChild(closer); + if (editor) { + editor.focus(); + } + closer = null; + callback && callback(); + } + function setIgnoreFocusOut(ignore) { + ignoreFocusOut = ignore; + if (ignore) { + closer.style.pointerEvents = "none"; + contentElement.style.pointerEvents = "auto"; + } + } + + closer.style.cssText = 'margin: 0; padding: 0; ' + + 'position: fixed; top:0; bottom:0; left:0; right:0;' + + 'z-index: 9990; ' + + (editor ? 'background-color: rgba(0, 0, 0, 0.3);' : ''); + closer.addEventListener('click', function(e) { + if (!ignoreFocusOut) { + close(); + } + }); + document.addEventListener('keydown', documentEscListener); + + contentElement.addEventListener('click', function (e) { + e.stopPropagation(); + }); + + closer.appendChild(contentElement); + document.body.appendChild(closer); + if (editor) { + editor.blur(); + } + return { + close: close, + setIgnoreFocusOut: setIgnoreFocusOut + }; +}; + +}); + +define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var modes = []; +function getModeForPath(path) { + var mode = modesByName.text; + var fileName = path.split(/[\/\\]/).pop(); + for (var i = 0; i < modes.length; i++) { + if (modes[i].supportsFile(fileName)) { + mode = modes[i]; + break; + } + } + return mode; +} + +var Mode = function(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function(a, b){ + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } else { + re = "^.*\\.(" + extensions + ")$"; + } + + this.extRe = new RegExp(re, "gi"); +}; + +Mode.prototype.supportsFile = function(filename) { + return filename.match(this.extRe); +}; +var supportedModes = { + ABAP: ["abap"], + ABC: ["abc"], + ActionScript:["as"], + ADA: ["ada|adb"], + Alda: ["alda"], + Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], + Apex: ["apex|cls|trigger|tgr"], + AQL: ["aql"], + AsciiDoc: ["asciidoc|adoc"], + ASL: ["dsl|asl|asl.json"], + Assembly_x86:["asm|a"], + AutoHotKey: ["ahk"], + BatchFile: ["bat|cmd"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm"], + Crystal: ["cr"], + CSharp: ["cs"], + Csound_Document: ["csd"], + Csound_Orchestra: ["orc"], + Csound_Score: ["sco"], + CSS: ["css"], + Curly: ["curly"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Edifact: ["edi"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], + FSL: ["fsl"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], + GraphQLSchema: ["gql"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], + Haskell_Cabal: ["cabal"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml|vue|we|wpy"], + HTML_Elixir: ["eex|html.eex"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Ion: ["ion"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|jsx|cjs|mjs"], + JSON: ["json"], + JSON5: ["json5"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSSM: ["jssm|jssm_state"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + Latte: ["latte"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + Log: ["log"], + LogiQL: ["logic|lql"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MediaWiki: ["wiki|mediawiki"], + MEL: ["mel"], + MIPS: ["s|asm"], + MIXAL: ["mixal"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Nginx: ["nginx|conf"], + Nim: ["nim"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + Nunjucks: ["nunjucks|nunjs|nj|njk"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + PartiQL: ["partiql|pql"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP_Laravel_blade: ["blade.php"], + PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], + Pig: ["pig"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prisma: ["prisma"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + Puppet: ["epp|pp"], + Python: ["py"], + QML: ["qml"], + R: ["r"], + Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + Red: ["red|reds"], + RHTML: ["Rhtml"], + Robot: ["robot|resource"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SaC: ["sac"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala|sbt"], + Scheme: ["scm|sm|rkt|oak|scheme"], + Scrypt: ["scrypt"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Slim: ["slim|skim"], + Smarty: ["smarty|tpl"], + Smithy: ["smithy"], + snippets: ["snippets"], + Soy_Template:["soy"], + Space: ["space"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Terraform: ["tf", "tfvars", "terragrunt"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSX: ["tsx"], + Twig: ["twig|swig"], + Typescript: ["ts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], + Visualforce: ["vfp|component|page"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Zeek: ["zeek|bro"], + Django: ["html"] +}; + +var nameOverrides = { + ObjectiveC: "Objective-C", + CSharp: "C#", + golang: "Go", + C_Cpp: "C and C++", + Csound_Document: "Csound Document", + Csound_Orchestra: "Csound", + Csound_Score: "Csound Score", + coffee: "CoffeeScript", + HTML_Ruby: "HTML (Ruby)", + HTML_Elixir: "HTML (Elixir)", + FTL: "FreeMarker", + PHP_Laravel_blade: "PHP (Blade Template)", + Perl6: "Perl 6", + AutoHotKey: "AutoHotkey / AutoIt" +}; + +var modesByName = {}; +for (var name in supportedModes) { + var data = supportedModes[name]; + var displayName = (nameOverrides[name] || name).replace(/_/g, " "); + var filename = name.toLowerCase(); + var mode = new Mode(filename, displayName, data[0]); + modesByName[filename] = mode; + modes.push(mode); +} + +module.exports = { + getModeForPath: getModeForPath, + modes: modes, + modesByName: modesByName +}; + +}); + +define("ace/ext/themelist",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var themeData = [ + ["Chrome" ], + ["Clouds" ], + ["Crimson Editor" ], + ["Dawn" ], + ["Dreamweaver" ], + ["Eclipse" ], + ["GitHub" ], + ["IPlastic" ], + ["Solarized Light"], + ["TextMate" ], + ["Tomorrow" ], + ["XCode" ], + ["Kuroir"], + ["KatzenMilch"], + ["SQL Server" ,"sqlserver" , "light"], + ["Ambiance" ,"ambiance" , "dark"], + ["Chaos" ,"chaos" , "dark"], + ["Clouds Midnight" ,"clouds_midnight" , "dark"], + ["Dracula" ,"" , "dark"], + ["Cobalt" ,"cobalt" , "dark"], + ["Gruvbox" ,"gruvbox" , "dark"], + ["Green on Black" ,"gob" , "dark"], + ["idle Fingers" ,"idle_fingers" , "dark"], + ["krTheme" ,"kr_theme" , "dark"], + ["Merbivore" ,"merbivore" , "dark"], + ["Merbivore Soft" ,"merbivore_soft" , "dark"], + ["Mono Industrial" ,"mono_industrial" , "dark"], + ["Monokai" ,"monokai" , "dark"], + ["Nord Dark" ,"nord_dark" , "dark"], + ["One Dark" ,"one_dark" , "dark"], + ["Pastel on dark" ,"pastel_on_dark" , "dark"], + ["Solarized Dark" ,"solarized_dark" , "dark"], + ["Terminal" ,"terminal" , "dark"], + ["Tomorrow Night" ,"tomorrow_night" , "dark"], + ["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"], + ["Tomorrow Night Bright","tomorrow_night_bright" , "dark"], + ["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"], + ["Twilight" ,"twilight" , "dark"], + ["Vibrant Ink" ,"vibrant_ink" , "dark"] +]; + + +exports.themesByName = {}; +exports.themes = themeData.map(function(data) { + var name = data[1] || data[0].replace(/ /g, "_").toLowerCase(); + var theme = { + caption: data[0], + theme: "ace/theme/" + name, + isDark: data[2] == "dark", + name: name + }; + exports.themesByName[name] = theme; + return theme; +}); + +}); + +define("ace/ext/options",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/lib/oop","ace/config","ace/lib/event_emitter","ace/ext/modelist","ace/ext/themelist"], function(require, exports, module) { +"use strict"; + +require("./menu_tools/overlay_page"); + +var dom = require("../lib/dom"); +var oop = require("../lib/oop"); +var config = require("../config"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var buildDom = dom.buildDom; + +var modelist = require("./modelist"); +var themelist = require("./themelist"); + +var themes = { Bright: [], Dark: [] }; +themelist.themes.forEach(function(x) { + themes[x.isDark ? "Dark" : "Bright"].push({ caption: x.caption, value: x.theme }); +}); + +var modes = modelist.modes.map(function(x){ + return { caption: x.caption, value: x.mode }; +}); + + +var optionGroups = { + Main: { + Mode: { + path: "mode", + type: "select", + items: modes + }, + Theme: { + path: "theme", + type: "select", + items: themes + }, + "Keybinding": { + type: "buttonBar", + path: "keyboardHandler", + items: [ + { caption : "Ace", value : null }, + { caption : "Vim", value : "ace/keyboard/vim" }, + { caption : "Emacs", value : "ace/keyboard/emacs" }, + { caption : "Sublime", value : "ace/keyboard/sublime" }, + { caption : "VSCode", value : "ace/keyboard/vscode" } + ] + }, + "Font Size": { + path: "fontSize", + type: "number", + defaultValue: 12, + defaults: [ + {caption: "12px", value: 12}, + {caption: "24px", value: 24} + ] + }, + "Soft Wrap": { + type: "buttonBar", + path: "wrap", + items: [ + { caption : "Off", value : "off" }, + { caption : "View", value : "free" }, + { caption : "margin", value : "printMargin" }, + { caption : "40", value : "40" } + ] + }, + "Cursor Style": { + path: "cursorStyle", + items: [ + { caption : "Ace", value : "ace" }, + { caption : "Slim", value : "slim" }, + { caption : "Smooth", value : "smooth" }, + { caption : "Smooth And Slim", value : "smooth slim" }, + { caption : "Wide", value : "wide" } + ] + }, + "Folding": { + path: "foldStyle", + items: [ + { caption : "Manual", value : "manual" }, + { caption : "Mark begin", value : "markbegin" }, + { caption : "Mark begin and end", value : "markbeginend" } + ] + }, + "Soft Tabs": [{ + path: "useSoftTabs" + }, { + ariaLabel: "Tab Size", + path: "tabSize", + type: "number", + values: [2, 3, 4, 8, 16] + }], + "Overscroll": { + type: "buttonBar", + path: "scrollPastEnd", + items: [ + { caption : "None", value : 0 }, + { caption : "Half", value : 0.5 }, + { caption : "Full", value : 1 } + ] + } + }, + More: { + "Atomic soft tabs": { + path: "navigateWithinSoftTabs" + }, + "Enable Behaviours": { + path: "behavioursEnabled" + }, + "Wrap with quotes": { + path: "wrapBehavioursEnabled" + }, + "Enable Auto Indent": { + path: "enableAutoIndent" + }, + "Full Line Selection": { + type: "checkbox", + values: "text|line", + path: "selectionStyle" + }, + "Highlight Active Line": { + path: "highlightActiveLine" + }, + "Show Invisibles": { + path: "showInvisibles" + }, + "Show Indent Guides": { + path: "displayIndentGuides" + }, + "Persistent HScrollbar": { + path: "hScrollBarAlwaysVisible" + }, + "Persistent VScrollbar": { + path: "vScrollBarAlwaysVisible" + }, + "Animate scrolling": { + path: "animatedScroll" + }, + "Show Gutter": { + path: "showGutter" + }, + "Show Line Numbers": { + path: "showLineNumbers" + }, + "Relative Line Numbers": { + path: "relativeLineNumbers" + }, + "Fixed Gutter Width": { + path: "fixedWidthGutter" + }, + "Show Print Margin": [{ + path: "showPrintMargin" + }, { + ariaLabel: "Print Margin", + type: "number", + path: "printMarginColumn" + }], + "Indented Soft Wrap": { + path: "indentedSoftWrap" + }, + "Highlight selected word": { + path: "highlightSelectedWord" + }, + "Fade Fold Widgets": { + path: "fadeFoldWidgets" + }, + "Use textarea for IME": { + path: "useTextareaForIME" + }, + "Merge Undo Deltas": { + path: "mergeUndoDeltas", + items: [ + { caption : "Always", value : "always" }, + { caption : "Never", value : "false" }, + { caption : "Timed", value : "true" } + ] + }, + "Elastic Tabstops": { + path: "useElasticTabstops" + }, + "Incremental Search": { + path: "useIncrementalSearch" + }, + "Read-only": { + path: "readOnly" + }, + "Copy without selection": { + path: "copyWithEmptySelection" + }, + "Live Autocompletion": { + path: "enableLiveAutocompletion" + } + } +}; + + +var OptionPanel = function(editor, element) { + this.editor = editor; + this.container = element || document.createElement("div"); + this.groups = []; + this.options = {}; +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.add = function(config) { + if (config.Main) + oop.mixin(optionGroups.Main, config.Main); + if (config.More) + oop.mixin(optionGroups.More, config.More); + }; + + this.render = function() { + this.container.innerHTML = ""; + buildDom(["table", {role: "presentation", id: "controls"}, + this.renderOptionGroup(optionGroups.Main), + ["tr", null, ["td", {colspan: 2}, + ["table", {role: "presentation", id: "more-controls"}, + this.renderOptionGroup(optionGroups.More) + ] + ]], + ["tr", null, ["td", {colspan: 2}, "version " + config.version]] + ], this.container); + }; + + this.renderOptionGroup = function(group) { + return Object.keys(group).map(function(key, i) { + var item = group[key]; + if (!item.position) + item.position = i / 10000; + if (!item.label) + item.label = key; + return item; + }).sort(function(a, b) { + return a.position - b.position; + }).map(function(item) { + return this.renderOption(item.label, item); + }, this); + }; + + this.renderOptionControl = function(key, option) { + var self = this; + if (Array.isArray(option)) { + return option.map(function(x) { + return self.renderOptionControl(key, x); + }); + } + var control; + + var value = self.getOption(option); + + if (option.values && option.type != "checkbox") { + if (typeof option.values == "string") + option.values = option.values.split("|"); + option.items = option.values.map(function(v) { + return { value: v, name: v }; + }); + } + + if (option.type == "buttonBar") { + control = ["div", {role: "group", "aria-labelledby": option.path + "-label"}, option.items.map(function(item) { + return ["button", { + value: item.value, + ace_selected_button: value == item.value, + 'aria-pressed': value == item.value, + onclick: function() { + self.setOption(option, item.value); + var nodes = this.parentNode.querySelectorAll("[ace_selected_button]"); + for (var i = 0; i < nodes.length; i++) { + nodes[i].removeAttribute("ace_selected_button"); + nodes[i].setAttribute("aria-pressed", false); + } + this.setAttribute("ace_selected_button", true); + this.setAttribute("aria-pressed", true); + } + }, item.desc || item.caption || item.name]; + })]; + } else if (option.type == "number") { + control = ["input", {type: "number", value: value || option.defaultValue, style:"width:3em", oninput: function() { + self.setOption(option, parseInt(this.value)); + }}]; + if (option.ariaLabel) { + control[1]["aria-label"] = option.ariaLabel; + } else { + control[1].id = key; + } + if (option.defaults) { + control = [control, option.defaults.map(function(item) { + return ["button", {onclick: function() { + var input = this.parentNode.firstChild; + input.value = item.value; + input.oninput(); + }}, item.caption]; + })]; + } + } else if (option.items) { + var buildItems = function(items) { + return items.map(function(item) { + return ["option", { value: item.value || item.name }, item.desc || item.caption || item.name]; + }); + }; + + var items = Array.isArray(option.items) + ? buildItems(option.items) + : Object.keys(option.items).map(function(key) { + return ["optgroup", {"label": key}, buildItems(option.items[key])]; + }); + control = ["select", { id: key, value: value, onchange: function() { + self.setOption(option, this.value); + } }, items]; + } else { + if (typeof option.values == "string") + option.values = option.values.split("|"); + if (option.values) value = value == option.values[1]; + control = ["input", { type: "checkbox", id: key, checked: value || null, onchange: function() { + var value = this.checked; + if (option.values) value = option.values[value ? 1 : 0]; + self.setOption(option, value); + }}]; + if (option.type == "checkedNumber") { + control = [control, []]; + } + } + return control; + }; + + this.renderOption = function(key, option) { + if (option.path && !option.onchange && !this.editor.$options[option.path]) + return; + var path = Array.isArray(option) ? option[0].path : option.path; + this.options[path] = option; + var safeKey = "-" + path; + var safeId = path + "-label"; + var control = this.renderOptionControl(safeKey, option); + return ["tr", {class: "ace_optionsMenuEntry"}, ["td", + ["label", {for: safeKey, id: safeId}, key] + ], ["td", control]]; + }; + + this.setOption = function(option, value) { + if (typeof option == "string") + option = this.options[option]; + if (value == "false") value = false; + if (value == "true") value = true; + if (value == "null") value = null; + if (value == "undefined") value = undefined; + if (typeof value == "string" && parseFloat(value).toString() == value) + value = parseFloat(value); + if (option.onchange) + option.onchange(value); + else if (option.path) + this.editor.setOption(option.path, value); + this._signal("setOption", {name: option.path, value: value}); + }; + + this.getOption = function(option) { + if (option.getValue) + return option.getValue(); + return this.editor.getOption(option.path); + }; + +}).call(OptionPanel.prototype); + +exports.OptionPanel = OptionPanel; + +}); + +define("ace/ext/settings_menu",["require","exports","module","ace/ext/options","ace/ext/menu_tools/overlay_page","ace/editor"], function(require, exports, module) { +"use strict"; +var OptionPanel = require("./options").OptionPanel; +var overlayPage = require('./menu_tools/overlay_page').overlayPage; +function showSettingsMenu(editor) { + if (!document.getElementById('ace_settingsmenu')) { + var options = new OptionPanel(editor); + options.render(); + options.container.id = "ace_settingsmenu"; + overlayPage(editor, options.container); + options.container.querySelector("select,input,button,checkbox").focus(); + } +} +module.exports.init = function() { + var Editor = require("../editor").Editor; + Editor.prototype.showSettingsMenu = function() { + showSettingsMenu(this); + }; +}; +}); (function() { + window.require(["ace/ext/settings_menu"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-spellcheck.js b/app/Resources/ui/js/ace/ext-spellcheck.js new file mode 100644 index 00000000..10d3901f --- /dev/null +++ b/app/Resources/ui/js/ace/ext-spellcheck.js @@ -0,0 +1,73 @@ +define("ace/ext/spellcheck",["require","exports","module","ace/lib/event","ace/editor","ace/config"], function(require, exports, module) { +"use strict"; +var event = require("../lib/event"); + +exports.contextMenuHandler = function(e){ + var host = e.target; + var text = host.textInput.getElement(); + if (!host.selection.isEmpty()) + return; + var c = host.getCursorPosition(); + var r = host.session.getWordRange(c.row, c.column); + var w = host.session.getTextRange(r); + + host.session.tokenRe.lastIndex = 0; + if (!host.session.tokenRe.test(w)) + return; + var PLACEHOLDER = "\x01\x01"; + var value = w + " " + PLACEHOLDER; + text.value = value; + text.setSelectionRange(w.length, w.length + 1); + text.setSelectionRange(0, 0); + text.setSelectionRange(0, w.length); + + var afterKeydown = false; + event.addListener(text, "keydown", function onKeydown() { + event.removeListener(text, "keydown", onKeydown); + afterKeydown = true; + }); + + host.textInput.setInputHandler(function(newVal) { + if (newVal == value) + return ''; + if (newVal.lastIndexOf(value, 0) === 0) + return newVal.slice(value.length); + if (newVal.substr(text.selectionEnd) == value) + return newVal.slice(0, -value.length); + if (newVal.slice(-2) == PLACEHOLDER) { + var val = newVal.slice(0, -2); + if (val.slice(-1) == " ") { + if (afterKeydown) + return val.substring(0, text.selectionEnd); + val = val.slice(0, -1); + host.session.replace(r, val); + return ""; + } + } + + return newVal; + }); +}; +var Editor = require("../editor").Editor; +require("../config").defineOptions(Editor.prototype, "editor", { + spellcheck: { + set: function(val) { + var text = this.textInput.getElement(); + text.spellcheck = !!val; + if (!val) + this.removeListener("nativecontextmenu", exports.contextMenuHandler); + else + this.on("nativecontextmenu", exports.contextMenuHandler); + }, + value: true + } +}); + +}); (function() { + window.require(["ace/ext/spellcheck"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-split.js b/app/Resources/ui/js/ace/ext-split.js new file mode 100644 index 00000000..ca286bce --- /dev/null +++ b/app/Resources/ui/js/ace/ext-split.js @@ -0,0 +1,207 @@ +define("ace/split",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/editor","ace/virtual_renderer","ace/edit_session"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var Editor = require("./editor").Editor; +var Renderer = require("./virtual_renderer").VirtualRenderer; +var EditSession = require("./edit_session").EditSession; + + +var Split = function(container, theme, splits) { + this.BELOW = 1; + this.BESIDE = 0; + + this.$container = container; + this.$theme = theme; + this.$splits = 0; + this.$editorCSS = ""; + this.$editors = []; + this.$orientation = this.BESIDE; + + this.setSplits(splits || 1); + this.$cEditor = this.$editors[0]; + + + this.on("focus", function(editor) { + this.$cEditor = editor; + }.bind(this)); +}; + +(function(){ + + oop.implement(this, EventEmitter); + + this.$createEditor = function() { + var el = document.createElement("div"); + el.className = this.$editorCSS; + el.style.cssText = "position: absolute; top:0px; bottom:0px"; + this.$container.appendChild(el); + var editor = new Editor(new Renderer(el, this.$theme)); + + editor.on("focus", function() { + this._emit("focus", editor); + }.bind(this)); + + this.$editors.push(editor); + editor.setFontSize(this.$fontSize); + return editor; + }; + + this.setSplits = function(splits) { + var editor; + if (splits < 1) { + throw "The number of splits have to be > 0!"; + } + + if (splits == this.$splits) { + return; + } else if (splits > this.$splits) { + while (this.$splits < this.$editors.length && this.$splits < splits) { + editor = this.$editors[this.$splits]; + this.$container.appendChild(editor.container); + editor.setFontSize(this.$fontSize); + this.$splits ++; + } + while (this.$splits < splits) { + this.$createEditor(); + this.$splits ++; + } + } else { + while (this.$splits > splits) { + editor = this.$editors[this.$splits - 1]; + this.$container.removeChild(editor.container); + this.$splits --; + } + } + this.resize(); + }; + this.getSplits = function() { + return this.$splits; + }; + this.getEditor = function(idx) { + return this.$editors[idx]; + }; + this.getCurrentEditor = function() { + return this.$cEditor; + }; + this.focus = function() { + this.$cEditor.focus(); + }; + this.blur = function() { + this.$cEditor.blur(); + }; + this.setTheme = function(theme) { + this.$editors.forEach(function(editor) { + editor.setTheme(theme); + }); + }; + this.setKeyboardHandler = function(keybinding) { + this.$editors.forEach(function(editor) { + editor.setKeyboardHandler(keybinding); + }); + }; + this.forEach = function(callback, scope) { + this.$editors.forEach(callback, scope); + }; + + + this.$fontSize = ""; + this.setFontSize = function(size) { + this.$fontSize = size; + this.forEach(function(editor) { + editor.setFontSize(size); + }); + }; + + this.$cloneSession = function(session) { + var s = new EditSession(session.getDocument(), session.getMode()); + + var undoManager = session.getUndoManager(); + s.setUndoManager(undoManager); + s.setTabSize(session.getTabSize()); + s.setUseSoftTabs(session.getUseSoftTabs()); + s.setOverwrite(session.getOverwrite()); + s.setBreakpoints(session.getBreakpoints()); + s.setUseWrapMode(session.getUseWrapMode()); + s.setUseWorker(session.getUseWorker()); + s.setWrapLimitRange(session.$wrapLimitRange.min, + session.$wrapLimitRange.max); + s.$foldData = session.$cloneFoldData(); + + return s; + }; + this.setSession = function(session, idx) { + var editor; + if (idx == null) { + editor = this.$cEditor; + } else { + editor = this.$editors[idx]; + } + var isUsed = this.$editors.some(function(editor) { + return editor.session === session; + }); + + if (isUsed) { + session = this.$cloneSession(session); + } + editor.setSession(session); + return session; + }; + this.getOrientation = function() { + return this.$orientation; + }; + this.setOrientation = function(orientation) { + if (this.$orientation == orientation) { + return; + } + this.$orientation = orientation; + this.resize(); + }; + this.resize = function() { + var width = this.$container.clientWidth; + var height = this.$container.clientHeight; + var editor; + + if (this.$orientation == this.BESIDE) { + var editorWidth = width / this.$splits; + for (var i = 0; i < this.$splits; i++) { + editor = this.$editors[i]; + editor.container.style.width = editorWidth + "px"; + editor.container.style.top = "0px"; + editor.container.style.left = i * editorWidth + "px"; + editor.container.style.height = height + "px"; + editor.resize(); + } + } else { + var editorHeight = height / this.$splits; + for (var i = 0; i < this.$splits; i++) { + editor = this.$editors[i]; + editor.container.style.width = width + "px"; + editor.container.style.top = i * editorHeight + "px"; + editor.container.style.left = "0px"; + editor.container.style.height = editorHeight + "px"; + editor.resize(); + } + } + }; + +}).call(Split.prototype); + +exports.Split = Split; +}); + +define("ace/ext/split",["require","exports","module","ace/split"], function(require, exports, module) { +"use strict"; +module.exports = require("../split"); + +}); (function() { + window.require(["ace/ext/split"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-static_highlight.js b/app/Resources/ui/js/ace/ext-static_highlight.js new file mode 100644 index 00000000..93b0840b --- /dev/null +++ b/app/Resources/ui/js/ace/ext-static_highlight.js @@ -0,0 +1,229 @@ +define("ace/ext/static_highlight",["require","exports","module","ace/edit_session","ace/layer/text","ace/config","ace/lib/dom","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var EditSession = require("../edit_session").EditSession; +var TextLayer = require("../layer/text").Text; +var baseStyles = ".ace_static_highlight {\ +font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', 'Droid Sans Mono', monospace;\ +font-size: 12px;\ +white-space: pre-wrap\ +}\ +.ace_static_highlight .ace_gutter {\ +width: 2em;\ +text-align: right;\ +padding: 0 3px 0 0;\ +margin-right: 3px;\ +contain: none;\ +}\ +.ace_static_highlight.ace_show_gutter .ace_line {\ +padding-left: 2.6em;\ +}\ +.ace_static_highlight .ace_line { position: relative; }\ +.ace_static_highlight .ace_gutter-cell {\ +-moz-user-select: -moz-none;\ +-khtml-user-select: none;\ +-webkit-user-select: none;\ +user-select: none;\ +top: 0;\ +bottom: 0;\ +left: 0;\ +position: absolute;\ +}\ +.ace_static_highlight .ace_gutter-cell:before {\ +content: counter(ace_line, decimal);\ +counter-increment: ace_line;\ +}\ +.ace_static_highlight {\ +counter-reset: ace_line;\ +}\ +"; +var config = require("../config"); +var dom = require("../lib/dom"); +var escapeHTML = require("../lib/lang").escapeHTML; + +function Element(type) { + this.type = type; + this.style = {}; + this.textContent = ""; +} +Element.prototype.cloneNode = function() { + return this; +}; +Element.prototype.appendChild = function(child) { + this.textContent += child.toString(); +}; +Element.prototype.toString = function() { + var stringBuilder = []; + if (this.type != "fragment") { + stringBuilder.push("<", this.type); + if (this.className) + stringBuilder.push(" class='", this.className, "'"); + var styleStr = []; + for (var key in this.style) { + styleStr.push(key, ":", this.style[key]); + } + if (styleStr.length) + stringBuilder.push(" style='", styleStr.join(""), "'"); + stringBuilder.push(">"); + } + + if (this.textContent) { + stringBuilder.push(this.textContent); + } + + if (this.type != "fragment") { + stringBuilder.push(""); + } + + return stringBuilder.join(""); +}; + + +var simpleDom = { + createTextNode: function(textContent, element) { + return escapeHTML(textContent); + }, + createElement: function(type) { + return new Element(type); + }, + createFragment: function() { + return new Element("fragment"); + } +}; + +var SimpleTextLayer = function() { + this.config = {}; + this.dom = simpleDom; +}; +SimpleTextLayer.prototype = TextLayer.prototype; + +var highlight = function(el, opts, callback) { + var m = el.className.match(/lang-(\w+)/); + var mode = opts.mode || m && ("ace/mode/" + m[1]); + if (!mode) + return false; + var theme = opts.theme || "ace/theme/textmate"; + + var data = ""; + var nodes = []; + + if (el.firstElementChild) { + var textLen = 0; + for (var i = 0; i < el.childNodes.length; i++) { + var ch = el.childNodes[i]; + if (ch.nodeType == 3) { + textLen += ch.data.length; + data += ch.data; + } else { + nodes.push(textLen, ch); + } + } + } else { + data = el.textContent; + if (opts.trim) + data = data.trim(); + } + + highlight.render(data, mode, theme, opts.firstLineNumber, !opts.showGutter, function (highlighted) { + dom.importCssString(highlighted.css, "ace_highlight"); + el.innerHTML = highlighted.html; + var container = el.firstChild.firstChild; + for (var i = 0; i < nodes.length; i += 2) { + var pos = highlighted.session.doc.indexToPosition(nodes[i]); + var node = nodes[i + 1]; + var lineEl = container.children[pos.row]; + lineEl && lineEl.appendChild(node); + } + callback && callback(); + }); +}; +highlight.render = function(input, mode, theme, lineStart, disableGutter, callback) { + var waiting = 1; + var modeCache = EditSession.prototype.$modes; + if (typeof theme == "string") { + waiting++; + config.loadModule(['theme', theme], function(m) { + theme = m; + --waiting || done(); + }); + } + var modeOptions; + if (mode && typeof mode === "object" && !mode.getTokenizer) { + modeOptions = mode; + mode = modeOptions.path; + } + if (typeof mode == "string") { + waiting++; + config.loadModule(['mode', mode], function(m) { + if (!modeCache[mode] || modeOptions) + modeCache[mode] = new m.Mode(modeOptions); + mode = modeCache[mode]; + --waiting || done(); + }); + } + function done() { + var result = highlight.renderSync(input, mode, theme, lineStart, disableGutter); + return callback ? callback(result) : result; + } + return --waiting || done(); +}; +highlight.renderSync = function(input, mode, theme, lineStart, disableGutter) { + lineStart = parseInt(lineStart || 1, 10); + + var session = new EditSession(""); + session.setUseWorker(false); + session.setMode(mode); + + var textLayer = new SimpleTextLayer(); + textLayer.setSession(session); + Object.keys(textLayer.$tabStrings).forEach(function(k) { + if (typeof textLayer.$tabStrings[k] == "string") { + var el = simpleDom.createFragment(); + el.textContent = textLayer.$tabStrings[k]; + textLayer.$tabStrings[k] = el; + } + }); + + session.setValue(input); + var length = session.getLength(); + + var outerEl = simpleDom.createElement("div"); + outerEl.className = theme.cssClass; + + var innerEl = simpleDom.createElement("div"); + innerEl.className = "ace_static_highlight" + (disableGutter ? "" : " ace_show_gutter"); + innerEl.style["counter-reset"] = "ace_line " + (lineStart - 1); + + for (var ix = 0; ix < length; ix++) { + var lineEl = simpleDom.createElement("div"); + lineEl.className = "ace_line"; + + if (!disableGutter) { + var gutterEl = simpleDom.createElement("span"); + gutterEl.className ="ace_gutter ace_gutter-cell"; + gutterEl.textContent = ""; + lineEl.appendChild(gutterEl); + } + textLayer.$renderLine(lineEl, ix, false); + lineEl.textContent += "\n"; + innerEl.appendChild(lineEl); + } + outerEl.appendChild(innerEl); + + return { + css: baseStyles + theme.cssText, + html: outerEl.toString(), + session: session + }; +}; + +module.exports = highlight; +module.exports.highlight = highlight; +}); (function() { + window.require(["ace/ext/static_highlight"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-statusbar.js b/app/Resources/ui/js/ace/ext-statusbar.js new file mode 100644 index 00000000..936cc4fd --- /dev/null +++ b/app/Resources/ui/js/ace/ext-statusbar.js @@ -0,0 +1,56 @@ +define("ace/ext/statusbar",["require","exports","module","ace/lib/dom","ace/lib/lang"], function(require, exports, module) { +"use strict"; +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); + +var StatusBar = function(editor, parentNode) { + this.element = dom.createElement("div"); + this.element.className = "ace_status-indicator"; + this.element.style.cssText = "display: inline-block;"; + parentNode.appendChild(this.element); + + var statusUpdate = lang.delayedCall(function(){ + this.updateStatus(editor); + }.bind(this)).schedule.bind(null, 100); + + editor.on("changeStatus", statusUpdate); + editor.on("changeSelection", statusUpdate); + editor.on("keyboardActivity", statusUpdate); +}; + +(function(){ + this.updateStatus = function(editor) { + var status = []; + function add(str, separator) { + str && status.push(str, separator || "|"); + } + + add(editor.keyBinding.getStatusText(editor)); + if (editor.commands.recording) + add("REC"); + + var sel = editor.selection; + var c = sel.lead; + + if (!sel.isEmpty()) { + var r = editor.getSelectionRange(); + add("(" + (r.end.row - r.start.row) + ":" +(r.end.column - r.start.column) + ")", " "); + } + add(c.row + ":" + c.column, " "); + if (sel.rangeCount) + add("[" + sel.rangeCount + "]", " "); + status.pop(); + this.element.textContent = status.join(""); + }; +}).call(StatusBar.prototype); + +exports.StatusBar = StatusBar; + +}); (function() { + window.require(["ace/ext/statusbar"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-textarea.js b/app/Resources/ui/js/ace/ext-textarea.js new file mode 100644 index 00000000..c4bc96bd --- /dev/null +++ b/app/Resources/ui/js/ace/ext-textarea.js @@ -0,0 +1,430 @@ +define("ace/ext/textarea",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/net","ace/ace"], function(require, exports, module) { +"use strict"; + +var event = require("../lib/event"); +var UA = require("../lib/useragent"); +var net = require("../lib/net"); +var ace = require("../ace"); + +module.exports = exports = ace; +var getCSSProperty = function(element, container, property) { + var ret = element.style[property]; + + if (!ret) { + if (window.getComputedStyle) { + ret = window.getComputedStyle(element, '').getPropertyValue(property); + } else { + ret = element.currentStyle[property]; + } + } + + if (!ret || ret == 'auto' || ret == 'intrinsic') { + ret = container.style[property]; + } + return ret; +}; + +function applyStyles(elm, styles) { + for (var style in styles) { + elm.style[style] = styles[style]; + } +} + +function setupContainer(element, getValue) { + if (element.type != 'textarea') { + throw new Error("Textarea required!"); + } + + var parentNode = element.parentNode; + var container = document.createElement('div'); + var resizeEvent = function() { + var style = 'position:relative;'; + [ + 'margin-top', 'margin-left', 'margin-right', 'margin-bottom' + ].forEach(function(item) { + style += item + ':' + + getCSSProperty(element, container, item) + ';'; + }); + var width = getCSSProperty(element, container, 'width') || (element.clientWidth + "px"); + var height = getCSSProperty(element, container, 'height') || (element.clientHeight + "px"); + style += 'height:' + height + ';width:' + width + ';'; + style += 'display:inline-block;'; + container.setAttribute('style', style); + }; + event.addListener(window, 'resize', resizeEvent); + resizeEvent(); + parentNode.insertBefore(container, element.nextSibling); + while (parentNode !== document) { + if (parentNode.tagName.toUpperCase() === 'FORM') { + var oldSumit = parentNode.onsubmit; + parentNode.onsubmit = function(evt) { + element.value = getValue(); + if (oldSumit) { + oldSumit.call(this, evt); + } + }; + break; + } + parentNode = parentNode.parentNode; + } + return container; +} + +exports.transformTextarea = function(element, options) { + var isFocused = element.autofocus || document.activeElement == element; + var session; + var container = setupContainer(element, function() { + return session.getValue(); + }); + element.style.display = 'none'; + container.style.background = 'white'; + var editorDiv = document.createElement("div"); + applyStyles(editorDiv, { + top: "0px", + left: "0px", + right: "0px", + bottom: "0px", + border: "1px solid gray", + position: "absolute" + }); + container.appendChild(editorDiv); + + var settingOpener = document.createElement("div"); + applyStyles(settingOpener, { + position: "absolute", + right: "0px", + bottom: "0px", + cursor: "nw-resize", + border: "solid 9px", + borderColor: "lightblue gray gray #ceade6", + zIndex: 101 + }); + + var settingDiv = document.createElement("div"); + var settingDivStyles = { + top: "0px", + left: "20%", + right: "0px", + bottom: "0px", + position: "absolute", + padding: "5px", + zIndex: 100, + color: "white", + display: "none", + overflow: "auto", + fontSize: "14px", + boxShadow: "-5px 2px 3px gray" + }; + if (!UA.isOldIE) { + settingDivStyles.backgroundColor = "rgba(0, 0, 0, 0.6)"; + } else { + settingDivStyles.backgroundColor = "#333"; + } + + applyStyles(settingDiv, settingDivStyles); + container.appendChild(settingDiv); + + options = options || exports.defaultOptions; + var editor = ace.edit(editorDiv); + session = editor.getSession(); + + session.setValue(element.value || element.innerHTML); + if (isFocused) + editor.focus(); + container.appendChild(settingOpener); + setupApi(editor, editorDiv, settingDiv, ace, options); + setupSettingPanel(settingDiv, settingOpener, editor); + + var state = ""; + event.addListener(settingOpener, "mousemove", function(e) { + var rect = this.getBoundingClientRect(); + var x = e.clientX - rect.left, y = e.clientY - rect.top; + if (x + y < (rect.width + rect.height)/2) { + this.style.cursor = "pointer"; + state = "toggle"; + } else { + state = "resize"; + this.style.cursor = "nw-resize"; + } + }); + + event.addListener(settingOpener, "mousedown", function(e) { + e.preventDefault(); + if (state == "toggle") { + editor.setDisplaySettings(); + return; + } + container.style.zIndex = 100000; + var rect = container.getBoundingClientRect(); + var startX = rect.width + rect.left - e.clientX; + var startY = rect.height + rect.top - e.clientY; + event.capture(settingOpener, function(e) { + container.style.width = e.clientX - rect.left + startX + "px"; + container.style.height = e.clientY - rect.top + startY + "px"; + editor.resize(); + }, function() {}); + }); + + return editor; +}; + +function load(url, module, callback) { + net.loadScript(url, function() { + require([module], callback); + }); +} + +function setupApi(editor, editorDiv, settingDiv, ace, options) { + var session = editor.getSession(); + var renderer = editor.renderer; + + function toBool(value) { + return value === "true" || value == true; + } + + editor.setDisplaySettings = function(display) { + if (display == null) + display = settingDiv.style.display == "none"; + if (display) { + settingDiv.style.display = "block"; + settingDiv.hideButton.focus(); + editor.on("focus", function onFocus() { + editor.removeListener("focus", onFocus); + settingDiv.style.display = "none"; + }); + } else { + editor.focus(); + } + }; + + editor.$setOption = editor.setOption; + editor.$getOption = editor.getOption; + editor.setOption = function(key, value) { + switch (key) { + case "mode": + editor.$setOption("mode", "ace/mode/" + value); + break; + case "theme": + editor.$setOption("theme", "ace/theme/" + value); + break; + case "keybindings": + switch (value) { + case "vim": + editor.setKeyboardHandler("ace/keyboard/vim"); + break; + case "emacs": + editor.setKeyboardHandler("ace/keyboard/emacs"); + break; + default: + editor.setKeyboardHandler(null); + } + break; + + case "wrap": + case "fontSize": + editor.$setOption(key, value); + break; + + default: + editor.$setOption(key, toBool(value)); + } + }; + + editor.getOption = function(key) { + switch (key) { + case "mode": + return editor.$getOption("mode").substr("ace/mode/".length); + break; + + case "theme": + return editor.$getOption("theme").substr("ace/theme/".length); + break; + + case "keybindings": + var value = editor.getKeyboardHandler(); + switch (value && value.$id) { + case "ace/keyboard/vim": + return "vim"; + case "ace/keyboard/emacs": + return "emacs"; + default: + return "ace"; + } + break; + + default: + return editor.$getOption(key); + } + }; + + editor.setOptions(options); + return editor; +} + +function setupSettingPanel(settingDiv, settingOpener, editor) { + var BOOL = null; + + var desc = { + mode: "Mode:", + wrap: "Soft Wrap:", + theme: "Theme:", + fontSize: "Font Size:", + showGutter: "Display Gutter:", + keybindings: "Keyboard", + showPrintMargin: "Show Print Margin:", + useSoftTabs: "Use Soft Tabs:", + showInvisibles: "Show Invisibles" + }; + + var optionValues = { + mode: { + text: "Plain", + javascript: "JavaScript", + xml: "XML", + html: "HTML", + css: "CSS", + scss: "SCSS", + python: "Python", + php: "PHP", + java: "Java", + ruby: "Ruby", + c_cpp: "C/C++", + coffee: "CoffeeScript", + json: "json", + perl: "Perl", + clojure: "Clojure", + ocaml: "OCaml", + csharp: "C#", + haxe: "haXe", + svg: "SVG", + textile: "Textile", + groovy: "Groovy", + liquid: "Liquid", + Scala: "Scala" + }, + theme: { + clouds: "Clouds", + clouds_midnight: "Clouds Midnight", + cobalt: "Cobalt", + crimson_editor: "Crimson Editor", + dawn: "Dawn", + gob: "Green on Black", + eclipse: "Eclipse", + idle_fingers: "Idle Fingers", + kr_theme: "Kr Theme", + merbivore: "Merbivore", + merbivore_soft: "Merbivore Soft", + mono_industrial: "Mono Industrial", + monokai: "Monokai", + pastel_on_dark: "Pastel On Dark", + solarized_dark: "Solarized Dark", + solarized_light: "Solarized Light", + textmate: "Textmate", + twilight: "Twilight", + vibrant_ink: "Vibrant Ink" + }, + showGutter: BOOL, + fontSize: { + "10px": "10px", + "11px": "11px", + "12px": "12px", + "14px": "14px", + "16px": "16px" + }, + wrap: { + off: "Off", + 40: "40", + 80: "80", + free: "Free" + }, + keybindings: { + ace: "ace", + vim: "vim", + emacs: "emacs" + }, + showPrintMargin: BOOL, + useSoftTabs: BOOL, + showInvisibles: BOOL + }; + + var table = []; + table.push(""); + + function renderOption(builder, option, obj, cValue) { + if (!obj) { + builder.push( + "" + ); + return; + } + builder.push(""); + } + + for (var option in exports.defaultOptions) { + table.push(""); + table.push(""); + } + table.push("
SettingValue
", desc[option], ""); + renderOption(table, option, optionValues[option], editor.getOption(option)); + table.push("
"); + settingDiv.innerHTML = table.join(""); + + var onChange = function(e) { + var select = e.currentTarget; + editor.setOption(select.title, select.value); + }; + var onClick = function(e) { + var cb = e.currentTarget; + editor.setOption(cb.title, cb.checked); + }; + var selects = settingDiv.getElementsByTagName("select"); + for (var i = 0; i < selects.length; i++) + selects[i].onchange = onChange; + var cbs = settingDiv.getElementsByTagName("input"); + for (var i = 0; i < cbs.length; i++) + cbs[i].onclick = onClick; + + + var button = document.createElement("input"); + button.type = "button"; + button.value = "Hide"; + event.addListener(button, "click", function() { + editor.setDisplaySettings(false); + }); + settingDiv.appendChild(button); + settingDiv.hideButton = button; +} +exports.defaultOptions = { + mode: "javascript", + theme: "textmate", + wrap: "off", + fontSize: "12px", + showGutter: "false", + keybindings: "ace", + showPrintMargin: "false", + useSoftTabs: "true", + showInvisibles: "false" +}; + +}); (function() { + window.require(["ace/ext/textarea"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-themelist.js b/app/Resources/ui/js/ace/ext-themelist.js new file mode 100644 index 00000000..6412884d --- /dev/null +++ b/app/Resources/ui/js/ace/ext-themelist.js @@ -0,0 +1,67 @@ +define("ace/ext/themelist",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var themeData = [ + ["Chrome" ], + ["Clouds" ], + ["Crimson Editor" ], + ["Dawn" ], + ["Dreamweaver" ], + ["Eclipse" ], + ["GitHub" ], + ["IPlastic" ], + ["Solarized Light"], + ["TextMate" ], + ["Tomorrow" ], + ["XCode" ], + ["Kuroir"], + ["KatzenMilch"], + ["SQL Server" ,"sqlserver" , "light"], + ["Ambiance" ,"ambiance" , "dark"], + ["Chaos" ,"chaos" , "dark"], + ["Clouds Midnight" ,"clouds_midnight" , "dark"], + ["Dracula" ,"" , "dark"], + ["Cobalt" ,"cobalt" , "dark"], + ["Gruvbox" ,"gruvbox" , "dark"], + ["Green on Black" ,"gob" , "dark"], + ["idle Fingers" ,"idle_fingers" , "dark"], + ["krTheme" ,"kr_theme" , "dark"], + ["Merbivore" ,"merbivore" , "dark"], + ["Merbivore Soft" ,"merbivore_soft" , "dark"], + ["Mono Industrial" ,"mono_industrial" , "dark"], + ["Monokai" ,"monokai" , "dark"], + ["Nord Dark" ,"nord_dark" , "dark"], + ["One Dark" ,"one_dark" , "dark"], + ["Pastel on dark" ,"pastel_on_dark" , "dark"], + ["Solarized Dark" ,"solarized_dark" , "dark"], + ["Terminal" ,"terminal" , "dark"], + ["Tomorrow Night" ,"tomorrow_night" , "dark"], + ["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"], + ["Tomorrow Night Bright","tomorrow_night_bright" , "dark"], + ["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"], + ["Twilight" ,"twilight" , "dark"], + ["Vibrant Ink" ,"vibrant_ink" , "dark"] +]; + + +exports.themesByName = {}; +exports.themes = themeData.map(function(data) { + var name = data[1] || data[0].replace(/ /g, "_").toLowerCase(); + var theme = { + caption: data[0], + theme: "ace/theme/" + name, + isDark: data[2] == "dark", + name: name + }; + exports.themesByName[name] = theme; + return theme; +}); + +}); (function() { + window.require(["ace/ext/themelist"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/ext-whitespace.js b/app/Resources/ui/js/ace/ext-whitespace.js new file mode 100644 index 00000000..f6d45930 --- /dev/null +++ b/app/Resources/ui/js/ace/ext-whitespace.js @@ -0,0 +1,213 @@ +define("ace/ext/whitespace",["require","exports","module","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var lang = require("../lib/lang"); +exports.$detectIndentation = function(lines, fallback) { + var stats = []; + var changes = []; + var tabIndents = 0; + var prevSpaces = 0; + var max = Math.min(lines.length, 1000); + for (var i = 0; i < max; i++) { + var line = lines[i]; + if (!/^\s*[^*+\-\s]/.test(line)) + continue; + + if (line[0] == "\t") { + tabIndents++; + prevSpaces = -Number.MAX_VALUE; + } else { + var spaces = line.match(/^ */)[0].length; + if (spaces && line[spaces] != "\t") { + var diff = spaces - prevSpaces; + if (diff > 0 && !(prevSpaces%diff) && !(spaces%diff)) + changes[diff] = (changes[diff] || 0) + 1; + + stats[spaces] = (stats[spaces] || 0) + 1; + } + prevSpaces = spaces; + } + while (i < max && line[line.length - 1] == "\\") + line = lines[i++]; + } + + function getScore(indent) { + var score = 0; + for (var i = indent; i < stats.length; i += indent) + score += stats[i] || 0; + return score; + } + + var changesTotal = changes.reduce(function(a,b){return a+b;}, 0); + + var first = {score: 0, length: 0}; + var spaceIndents = 0; + for (var i = 1; i < 12; i++) { + var score = getScore(i); + if (i == 1) { + spaceIndents = score; + score = stats[1] ? 0.9 : 0.8; + if (!stats.length) + score = 0; + } else + score /= spaceIndents; + + if (changes[i]) + score += changes[i] / changesTotal; + + if (score > first.score) + first = {score: score, length: i}; + } + + if (first.score && first.score > 1.4) + var tabLength = first.length; + + if (tabIndents > spaceIndents + 1) { + if (tabLength == 1 || spaceIndents < tabIndents / 4 || first.score < 1.8) + tabLength = undefined; + return {ch: "\t", length: tabLength}; + } + if (spaceIndents > tabIndents + 1) + return {ch: " ", length: tabLength}; +}; + +exports.detectIndentation = function(session) { + var lines = session.getLines(0, 1000); + var indent = exports.$detectIndentation(lines) || {}; + + if (indent.ch) + session.setUseSoftTabs(indent.ch == " "); + + if (indent.length) + session.setTabSize(indent.length); + return indent; +}; +exports.trimTrailingSpace = function(session, options) { + var doc = session.getDocument(); + var lines = doc.getAllLines(); + + var min = options && options.trimEmpty ? -1 : 0; + var cursors = [], ci = -1; + if (options && options.keepCursorPosition) { + if (session.selection.rangeCount) { + session.selection.rangeList.ranges.forEach(function(x, i, ranges) { + var next = ranges[i + 1]; + if (next && next.cursor.row == x.cursor.row) + return; + cursors.push(x.cursor); + }); + } else { + cursors.push(session.selection.getCursor()); + } + ci = 0; + } + var cursorRow = cursors[ci] && cursors[ci].row; + + for (var i = 0, l=lines.length; i < l; i++) { + var line = lines[i]; + var index = line.search(/\s+$/); + + if (i == cursorRow) { + if (index < cursors[ci].column && index > min) + index = cursors[ci].column; + ci++; + cursorRow = cursors[ci] ? cursors[ci].row : -1; + } + + if (index > min) + doc.removeInLine(i, index, line.length); + } +}; + +exports.convertIndentation = function(session, ch, len) { + var oldCh = session.getTabString()[0]; + var oldLen = session.getTabSize(); + if (!len) len = oldLen; + if (!ch) ch = oldCh; + + var tab = ch == "\t" ? ch: lang.stringRepeat(ch, len); + + var doc = session.doc; + var lines = doc.getAllLines(); + + var cache = {}; + var spaceCache = {}; + for (var i = 0, l=lines.length; i < l; i++) { + var line = lines[i]; + var match = line.match(/^\s*/)[0]; + if (match) { + var w = session.$getStringScreenWidth(match)[0]; + var tabCount = Math.floor(w/oldLen); + var reminder = w%oldLen; + var toInsert = cache[tabCount] || (cache[tabCount] = lang.stringRepeat(tab, tabCount)); + toInsert += spaceCache[reminder] || (spaceCache[reminder] = lang.stringRepeat(" ", reminder)); + + if (toInsert != match) { + doc.removeInLine(i, 0, match.length); + doc.insertInLine({row: i, column: 0}, toInsert); + } + } + } + session.setTabSize(len); + session.setUseSoftTabs(ch == " "); +}; + +exports.$parseStringArg = function(text) { + var indent = {}; + if (/t/.test(text)) + indent.ch = "\t"; + else if (/s/.test(text)) + indent.ch = " "; + var m = text.match(/\d+/); + if (m) + indent.length = parseInt(m[0], 10); + return indent; +}; + +exports.$parseArg = function(arg) { + if (!arg) + return {}; + if (typeof arg == "string") + return exports.$parseStringArg(arg); + if (typeof arg.text == "string") + return exports.$parseStringArg(arg.text); + return arg; +}; + +exports.commands = [{ + name: "detectIndentation", + description: "Detect indentation from content", + exec: function(editor) { + exports.detectIndentation(editor.session); + } +}, { + name: "trimTrailingSpace", + description: "Trim trailing whitespace", + exec: function(editor, args) { + exports.trimTrailingSpace(editor.session, args); + } +}, { + name: "convertIndentation", + description: "Convert indentation to ...", + exec: function(editor, arg) { + var indent = exports.$parseArg(arg); + exports.convertIndentation(editor.session, indent.ch, indent.length); + } +}, { + name: "setIndentation", + description: "Set indentation", + exec: function(editor, arg) { + var indent = exports.$parseArg(arg); + indent.length && editor.session.setTabSize(indent.length); + indent.ch && editor.session.setUseSoftTabs(indent.ch == " "); + } +}]; + +}); (function() { + window.require(["ace/ext/whitespace"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/keybinding-emacs.js b/app/Resources/ui/js/ace/keybinding-emacs.js new file mode 100644 index 00000000..07ffa85c --- /dev/null +++ b/app/Resources/ui/js/ace/keybinding-emacs.js @@ -0,0 +1,1169 @@ +define("ace/occur",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/edit_session","ace/search_highlight","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var Range = require("./range").Range; +var Search = require("./search").Search; +var EditSession = require("./edit_session").EditSession; +var SearchHighlight = require("./search_highlight").SearchHighlight; +function Occur() {} + +oop.inherits(Occur, Search); + +(function() { + this.enter = function(editor, options) { + if (!options.needle) return false; + var pos = editor.getCursorPosition(); + this.displayOccurContent(editor, options); + var translatedPos = this.originalToOccurPosition(editor.session, pos); + editor.moveCursorToPosition(translatedPos); + return true; + }; + this.exit = function(editor, options) { + var pos = options.translatePosition && editor.getCursorPosition(); + var translatedPos = pos && this.occurToOriginalPosition(editor.session, pos); + this.displayOriginalContent(editor); + if (translatedPos) + editor.moveCursorToPosition(translatedPos); + return true; + }; + + this.highlight = function(sess, regexp) { + var hl = sess.$occurHighlight = sess.$occurHighlight || sess.addDynamicMarker( + new SearchHighlight(null, "ace_occur-highlight", "text")); + hl.setRegexp(regexp); + sess._emit("changeBackMarker"); // force highlight layer redraw + }; + + this.displayOccurContent = function(editor, options) { + this.$originalSession = editor.session; + var found = this.matchingLines(editor.session, options); + var lines = found.map(function(foundLine) { return foundLine.content; }); + var occurSession = new EditSession(lines.join('\n')); + occurSession.$occur = this; + occurSession.$occurMatchingLines = found; + editor.setSession(occurSession); + this.$useEmacsStyleLineStart = this.$originalSession.$useEmacsStyleLineStart; + occurSession.$useEmacsStyleLineStart = this.$useEmacsStyleLineStart; + this.highlight(occurSession, options.re); + occurSession._emit('changeBackMarker'); + }; + + this.displayOriginalContent = function(editor) { + editor.setSession(this.$originalSession); + this.$originalSession.$useEmacsStyleLineStart = this.$useEmacsStyleLineStart; + }; + this.originalToOccurPosition = function(session, pos) { + var lines = session.$occurMatchingLines; + var nullPos = {row: 0, column: 0}; + if (!lines) return nullPos; + for (var i = 0; i < lines.length; i++) { + if (lines[i].row === pos.row) + return {row: i, column: pos.column}; + } + return nullPos; + }; + this.occurToOriginalPosition = function(session, pos) { + var lines = session.$occurMatchingLines; + if (!lines || !lines[pos.row]) + return pos; + return {row: lines[pos.row].row, column: pos.column}; + }; + + this.matchingLines = function(session, options) { + options = oop.mixin({}, options); + if (!session || !options.needle) return []; + var search = new Search(); + search.set(options); + return search.findAll(session).reduce(function(lines, range) { + var row = range.start.row; + var last = lines[lines.length-1]; + return last && last.row === row ? + lines : + lines.concat({row: row, content: session.getLine(row)}); + }, []); + }; + +}).call(Occur.prototype); + +var dom = require('./lib/dom'); +dom.importCssString(".ace_occur-highlight {\n\ + border-radius: 4px;\n\ + background-color: rgba(87, 255, 8, 0.25);\n\ + position: absolute;\n\ + z-index: 4;\n\ + box-sizing: border-box;\n\ + box-shadow: 0 0 4px rgb(91, 255, 50);\n\ +}\n\ +.ace_dark .ace_occur-highlight {\n\ + background-color: rgb(80, 140, 85);\n\ + box-shadow: 0 0 4px rgb(60, 120, 70);\n\ +}\n", "incremental-occur-highlighting", false); + +exports.Occur = Occur; + +}); + +define("ace/commands/occur_commands",["require","exports","module","ace/config","ace/occur","ace/keyboard/hash_handler","ace/lib/oop"], function(require, exports, module) { + +var config = require("../config"), + Occur = require("../occur").Occur; +var occurStartCommand = { + name: "occur", + exec: function(editor, options) { + var alreadyInOccur = !!editor.session.$occur; + var occurSessionActive = new Occur().enter(editor, options); + if (occurSessionActive && !alreadyInOccur) + OccurKeyboardHandler.installIn(editor); + }, + readOnly: true +}; + +var occurCommands = [{ + name: "occurexit", + bindKey: 'esc|Ctrl-G', + exec: function(editor) { + var occur = editor.session.$occur; + if (!occur) return; + occur.exit(editor, {}); + if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor); + }, + readOnly: true +}, { + name: "occuraccept", + bindKey: 'enter', + exec: function(editor) { + var occur = editor.session.$occur; + if (!occur) return; + occur.exit(editor, {translatePosition: true}); + if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor); + }, + readOnly: true +}]; + +var HashHandler = require("../keyboard/hash_handler").HashHandler; +var oop = require("../lib/oop"); + + +function OccurKeyboardHandler() {} + +oop.inherits(OccurKeyboardHandler, HashHandler); + +(function() { + + this.isOccurHandler = true; + + this.attach = function(editor) { + HashHandler.call(this, occurCommands, editor.commands.platform); + this.$editor = editor; + }; + + var handleKeyboard$super = this.handleKeyboard; + this.handleKeyboard = function(data, hashId, key, keyCode) { + var cmd = handleKeyboard$super.call(this, data, hashId, key, keyCode); + return (cmd && cmd.command) ? cmd : undefined; + }; + +}).call(OccurKeyboardHandler.prototype); + +OccurKeyboardHandler.installIn = function(editor) { + var handler = new this(); + editor.keyBinding.addKeyboardHandler(handler); + editor.commands.addCommands(occurCommands); +}; + +OccurKeyboardHandler.uninstallFrom = function(editor) { + editor.commands.removeCommands(occurCommands); + var handler = editor.getKeyboardHandler(); + if (handler.isOccurHandler) + editor.keyBinding.removeKeyboardHandler(handler); +}; + +exports.occurStartCommand = occurStartCommand; + +}); + +define("ace/commands/incremental_search_commands",["require","exports","module","ace/config","ace/lib/oop","ace/keyboard/hash_handler","ace/commands/occur_commands"], function(require, exports, module) { + +var config = require("../config"); +var oop = require("../lib/oop"); +var HashHandler = require("../keyboard/hash_handler").HashHandler; +var occurStartCommand = require("./occur_commands").occurStartCommand; +exports.iSearchStartCommands = [{ + name: "iSearch", + bindKey: {win: "Ctrl-F", mac: "Command-F"}, + exec: function(editor, options) { + config.loadModule(["core", "ace/incremental_search"], function(e) { + var iSearch = e.iSearch = e.iSearch || new e.IncrementalSearch(); + iSearch.activate(editor, options.backwards); + if (options.jumpToFirstMatch) iSearch.next(options); + }); + }, + readOnly: true +}, { + name: "iSearchBackwards", + exec: function(editor, jumpToNext) { editor.execCommand('iSearch', {backwards: true}); }, + readOnly: true +}, { + name: "iSearchAndGo", + bindKey: {win: "Ctrl-K", mac: "Command-G"}, + exec: function(editor, jumpToNext) { editor.execCommand('iSearch', {jumpToFirstMatch: true, useCurrentOrPrevSearch: true}); }, + readOnly: true +}, { + name: "iSearchBackwardsAndGo", + bindKey: {win: "Ctrl-Shift-K", mac: "Command-Shift-G"}, + exec: function(editor) { editor.execCommand('iSearch', {jumpToFirstMatch: true, backwards: true, useCurrentOrPrevSearch: true}); }, + readOnly: true +}]; +exports.iSearchCommands = [{ + name: "restartSearch", + bindKey: {win: "Ctrl-F", mac: "Command-F"}, + exec: function(iSearch) { + iSearch.cancelSearch(true); + } +}, { + name: "searchForward", + bindKey: {win: "Ctrl-S|Ctrl-K", mac: "Ctrl-S|Command-G"}, + exec: function(iSearch, options) { + options.useCurrentOrPrevSearch = true; + iSearch.next(options); + } +}, { + name: "searchBackward", + bindKey: {win: "Ctrl-R|Ctrl-Shift-K", mac: "Ctrl-R|Command-Shift-G"}, + exec: function(iSearch, options) { + options.useCurrentOrPrevSearch = true; + options.backwards = true; + iSearch.next(options); + } +}, { + name: "extendSearchTerm", + exec: function(iSearch, string) { + iSearch.addString(string); + } +}, { + name: "extendSearchTermSpace", + bindKey: "space", + exec: function(iSearch) { iSearch.addString(' '); } +}, { + name: "shrinkSearchTerm", + bindKey: "backspace", + exec: function(iSearch) { + iSearch.removeChar(); + } +}, { + name: 'confirmSearch', + bindKey: 'return', + exec: function(iSearch) { iSearch.deactivate(); } +}, { + name: 'cancelSearch', + bindKey: 'esc|Ctrl-G', + exec: function(iSearch) { iSearch.deactivate(true); } +}, { + name: 'occurisearch', + bindKey: 'Ctrl-O', + exec: function(iSearch) { + var options = oop.mixin({}, iSearch.$options); + iSearch.deactivate(); + occurStartCommand.exec(iSearch.$editor, options); + } +}, { + name: "yankNextWord", + bindKey: "Ctrl-w", + exec: function(iSearch) { + var ed = iSearch.$editor, + range = ed.selection.getRangeOfMovements(function(sel) { sel.moveCursorWordRight(); }), + string = ed.session.getTextRange(range); + iSearch.addString(string); + } +}, { + name: "yankNextChar", + bindKey: "Ctrl-Alt-y", + exec: function(iSearch) { + var ed = iSearch.$editor, + range = ed.selection.getRangeOfMovements(function(sel) { sel.moveCursorRight(); }), + string = ed.session.getTextRange(range); + iSearch.addString(string); + } +}, { + name: 'recenterTopBottom', + bindKey: 'Ctrl-l', + exec: function(iSearch) { iSearch.$editor.execCommand('recenterTopBottom'); } +}, { + name: 'selectAllMatches', + bindKey: 'Ctrl-space', + exec: function(iSearch) { + var ed = iSearch.$editor, + hl = ed.session.$isearchHighlight, + ranges = hl && hl.cache ? hl.cache + .reduce(function(ranges, ea) { + return ranges.concat(ea ? ea : []); }, []) : []; + iSearch.deactivate(false); + ranges.forEach(ed.selection.addRange.bind(ed.selection)); + } +}, { + name: 'searchAsRegExp', + bindKey: 'Alt-r', + exec: function(iSearch) { + iSearch.convertNeedleToRegExp(); + } +}].map(function(cmd) { + cmd.readOnly = true; + cmd.isIncrementalSearchCommand = true; + cmd.scrollIntoView = "animate-cursor"; + return cmd; +}); + +function IncrementalSearchKeyboardHandler(iSearch) { + this.$iSearch = iSearch; +} + +oop.inherits(IncrementalSearchKeyboardHandler, HashHandler); + +(function() { + + this.attach = function(editor) { + var iSearch = this.$iSearch; + HashHandler.call(this, exports.iSearchCommands, editor.commands.platform); + this.$commandExecHandler = editor.commands.on('exec', function(e) { + if (!e.command.isIncrementalSearchCommand) + return iSearch.deactivate(); + e.stopPropagation(); + e.preventDefault(); + var scrollTop = editor.session.getScrollTop(); + var result = e.command.exec(iSearch, e.args || {}); + editor.renderer.scrollCursorIntoView(null, 0.5); + editor.renderer.animateScrolling(scrollTop); + return result; + }); + }; + + this.detach = function(editor) { + if (!this.$commandExecHandler) return; + editor.commands.off('exec', this.$commandExecHandler); + delete this.$commandExecHandler; + }; + + var handleKeyboard$super = this.handleKeyboard; + this.handleKeyboard = function(data, hashId, key, keyCode) { + if (((hashId === 1/*ctrl*/ || hashId === 8/*command*/) && key === 'v') + || (hashId === 1/*ctrl*/ && key === 'y')) return null; + var cmd = handleKeyboard$super.call(this, data, hashId, key, keyCode); + if (cmd && cmd.command) { return cmd; } + if (hashId == -1) { + var extendCmd = this.commands.extendSearchTerm; + if (extendCmd) { return {command: extendCmd, args: key}; } + } + return false; + }; + +}).call(IncrementalSearchKeyboardHandler.prototype); + + +exports.IncrementalSearchKeyboardHandler = IncrementalSearchKeyboardHandler; + +}); + +define("ace/incremental_search",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/search_highlight","ace/commands/incremental_search_commands","ace/lib/dom","ace/commands/command_manager","ace/editor","ace/config"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var Range = require("./range").Range; +var Search = require("./search").Search; +var SearchHighlight = require("./search_highlight").SearchHighlight; +var iSearchCommandModule = require("./commands/incremental_search_commands"); +var ISearchKbd = iSearchCommandModule.IncrementalSearchKeyboardHandler; +function IncrementalSearch() { + this.$options = {wrap: false, skipCurrent: false}; + this.$keyboardHandler = new ISearchKbd(this); +} + +oop.inherits(IncrementalSearch, Search); + +function isRegExp(obj) { + return obj instanceof RegExp; +} + +function regExpToObject(re) { + var string = String(re), + start = string.indexOf('/'), + flagStart = string.lastIndexOf('/'); + return { + expression: string.slice(start+1, flagStart), + flags: string.slice(flagStart+1) + }; +} + +function stringToRegExp(string, flags) { + try { + return new RegExp(string, flags); + } catch (e) { return string; } +} + +function objectToRegExp(obj) { + return stringToRegExp(obj.expression, obj.flags); +} + +(function() { + + this.activate = function(editor, backwards) { + this.$editor = editor; + this.$startPos = this.$currentPos = editor.getCursorPosition(); + this.$options.needle = ''; + this.$options.backwards = backwards; + editor.keyBinding.addKeyboardHandler(this.$keyboardHandler); + this.$originalEditorOnPaste = editor.onPaste; + editor.onPaste = this.onPaste.bind(this); + this.$mousedownHandler = editor.on('mousedown', this.onMouseDown.bind(this)); + this.selectionFix(editor); + this.statusMessage(true); + }; + + this.deactivate = function(reset) { + this.cancelSearch(reset); + var editor = this.$editor; + editor.keyBinding.removeKeyboardHandler(this.$keyboardHandler); + if (this.$mousedownHandler) { + editor.off('mousedown', this.$mousedownHandler); + delete this.$mousedownHandler; + } + editor.onPaste = this.$originalEditorOnPaste; + this.message(''); + }; + + this.selectionFix = function(editor) { + if (editor.selection.isEmpty() && !editor.session.$emacsMark) { + editor.clearSelection(); + } + }; + + this.highlight = function(regexp) { + var sess = this.$editor.session, + hl = sess.$isearchHighlight = sess.$isearchHighlight || sess.addDynamicMarker( + new SearchHighlight(null, "ace_isearch-result", "text")); + hl.setRegexp(regexp); + sess._emit("changeBackMarker"); // force highlight layer redraw + }; + + this.cancelSearch = function(reset) { + var e = this.$editor; + this.$prevNeedle = this.$options.needle; + this.$options.needle = ''; + if (reset) { + e.moveCursorToPosition(this.$startPos); + this.$currentPos = this.$startPos; + } else { + e.pushEmacsMark && e.pushEmacsMark(this.$startPos, false); + } + this.highlight(null); + return Range.fromPoints(this.$currentPos, this.$currentPos); + }; + + this.highlightAndFindWithNeedle = function(moveToNext, needleUpdateFunc) { + if (!this.$editor) return null; + var options = this.$options; + if (needleUpdateFunc) { + options.needle = needleUpdateFunc.call(this, options.needle || '') || ''; + } + if (options.needle.length === 0) { + this.statusMessage(true); + return this.cancelSearch(true); + } + options.start = this.$currentPos; + var session = this.$editor.session, + found = this.find(session), + shouldSelect = this.$editor.emacsMark ? + !!this.$editor.emacsMark() : !this.$editor.selection.isEmpty(); + if (found) { + if (options.backwards) found = Range.fromPoints(found.end, found.start); + this.$editor.selection.setRange(Range.fromPoints(shouldSelect ? this.$startPos : found.end, found.end)); + if (moveToNext) this.$currentPos = found.end; + this.highlight(options.re); + } + + this.statusMessage(found); + + return found; + }; + + this.addString = function(s) { + return this.highlightAndFindWithNeedle(false, function(needle) { + if (!isRegExp(needle)) + return needle + s; + var reObj = regExpToObject(needle); + reObj.expression += s; + return objectToRegExp(reObj); + }); + }; + + this.removeChar = function(c) { + return this.highlightAndFindWithNeedle(false, function(needle) { + if (!isRegExp(needle)) + return needle.substring(0, needle.length-1); + var reObj = regExpToObject(needle); + reObj.expression = reObj.expression.substring(0, reObj.expression.length-1); + return objectToRegExp(reObj); + }); + }; + + this.next = function(options) { + options = options || {}; + this.$options.backwards = !!options.backwards; + this.$currentPos = this.$editor.getCursorPosition(); + return this.highlightAndFindWithNeedle(true, function(needle) { + return options.useCurrentOrPrevSearch && needle.length === 0 ? + this.$prevNeedle || '' : needle; + }); + }; + + this.onMouseDown = function(evt) { + this.deactivate(); + return true; + }; + + this.onPaste = function(text) { + this.addString(text); + }; + + this.convertNeedleToRegExp = function() { + return this.highlightAndFindWithNeedle(false, function(needle) { + return isRegExp(needle) ? needle : stringToRegExp(needle, 'ig'); + }); + }; + + this.convertNeedleToString = function() { + return this.highlightAndFindWithNeedle(false, function(needle) { + return isRegExp(needle) ? regExpToObject(needle).expression : needle; + }); + }; + + this.statusMessage = function(found) { + var options = this.$options, msg = ''; + msg += options.backwards ? 'reverse-' : ''; + msg += 'isearch: ' + options.needle; + msg += found ? '' : ' (not found)'; + this.message(msg); + }; + + this.message = function(msg) { + if (this.$editor.showCommandLine) { + this.$editor.showCommandLine(msg); + this.$editor.focus(); + } + }; + +}).call(IncrementalSearch.prototype); + + +exports.IncrementalSearch = IncrementalSearch; + +var dom = require('./lib/dom'); +dom.importCssString("\ +.ace_marker-layer .ace_isearch-result {\ + position: absolute;\ + z-index: 6;\ + box-sizing: border-box;\ +}\ +div.ace_isearch-result {\ + border-radius: 4px;\ + background-color: rgba(255, 200, 0, 0.5);\ + box-shadow: 0 0 4px rgb(255, 200, 0);\ +}\ +.ace_dark div.ace_isearch-result {\ + background-color: rgb(100, 110, 160);\ + box-shadow: 0 0 4px rgb(80, 90, 140);\ +}", "incremental-search-highlighting", false); +var commands = require("./commands/command_manager"); +(function() { + this.setupIncrementalSearch = function(editor, val) { + if (this.usesIncrementalSearch == val) return; + this.usesIncrementalSearch = val; + var iSearchCommands = iSearchCommandModule.iSearchStartCommands; + var method = val ? 'addCommands' : 'removeCommands'; + this[method](iSearchCommands); + }; +}).call(commands.CommandManager.prototype); +var Editor = require("./editor").Editor; +require("./config").defineOptions(Editor.prototype, "editor", { + useIncrementalSearch: { + set: function(val) { + this.keyBinding.$handlers.forEach(function(handler) { + if (handler.setupIncrementalSearch) { + handler.setupIncrementalSearch(this, val); + } + }); + this._emit('incrementalSearchSettingChanged', {isEnabled: val}); + } + } +}); + +}); + +define("ace/keyboard/emacs",["require","exports","module","ace/lib/dom","ace/incremental_search","ace/commands/incremental_search_commands","ace/keyboard/hash_handler","ace/lib/keys"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); +require("../incremental_search"); +var iSearchCommandModule = require("../commands/incremental_search_commands"); + + +var HashHandler = require("./hash_handler").HashHandler; +exports.handler = new HashHandler(); + +exports.handler.isEmacs = true; +exports.handler.$id = "ace/keyboard/emacs"; + +var initialized = false; +var $formerLongWords; +var $formerLineStart; + +exports.handler.attach = function(editor) { + if (!initialized) { + initialized = true; + dom.importCssString('\ + .emacs-mode .ace_cursor{\ + border: 1px rgba(50,250,50,0.8) solid!important;\ + box-sizing: border-box!important;\ + background-color: rgba(0,250,0,0.9);\ + opacity: 0.5;\ + }\ + .emacs-mode .ace_hidden-cursors .ace_cursor{\ + opacity: 1;\ + background-color: transparent;\ + }\ + .emacs-mode .ace_overwrite-cursors .ace_cursor {\ + opacity: 1;\ + background-color: transparent;\ + border-width: 0 0 2px 2px !important;\ + }\ + .emacs-mode .ace_text-layer {\ + z-index: 4\ + }\ + .emacs-mode .ace_cursor-layer {\ + z-index: 2\ + }', 'emacsMode' + ); + } + $formerLongWords = editor.session.$selectLongWords; + editor.session.$selectLongWords = true; + $formerLineStart = editor.session.$useEmacsStyleLineStart; + editor.session.$useEmacsStyleLineStart = true; + + editor.session.$emacsMark = null; // the active mark + editor.session.$emacsMarkRing = editor.session.$emacsMarkRing || []; + + editor.emacsMark = function() { + return this.session.$emacsMark; + }; + + editor.setEmacsMark = function(p) { + this.session.$emacsMark = p; + }; + + editor.pushEmacsMark = function(p, activate) { + var prevMark = this.session.$emacsMark; + if (prevMark) + this.session.$emacsMarkRing.push(prevMark); + if (!p || activate) this.setEmacsMark(p); + else this.session.$emacsMarkRing.push(p); + }; + + editor.popEmacsMark = function() { + var mark = this.emacsMark(); + if (mark) { this.setEmacsMark(null); return mark; } + return this.session.$emacsMarkRing.pop(); + }; + + editor.getLastEmacsMark = function(p) { + return this.session.$emacsMark || this.session.$emacsMarkRing.slice(-1)[0]; + }; + + editor.emacsMarkForSelection = function(replacement) { + var sel = this.selection, + multiRangeLength = this.multiSelect ? + this.multiSelect.getAllRanges().length : 1, + selIndex = sel.index || 0, + markRing = this.session.$emacsMarkRing, + markIndex = markRing.length - (multiRangeLength - selIndex), + lastMark = markRing[markIndex] || sel.anchor; + if (replacement) { + markRing.splice(markIndex, 1, + "row" in replacement && "column" in replacement ? + replacement : undefined); + } + return lastMark; + }; + + editor.on("click", $resetMarkMode); + editor.on("changeSession", $kbSessionChange); + editor.renderer.$blockCursor = true; + editor.setStyle("emacs-mode"); + editor.commands.addCommands(commands); + exports.handler.platform = editor.commands.platform; + editor.$emacsModeHandler = this; + editor.on('copy', this.onCopy); + editor.on('paste', this.onPaste); +}; + +exports.handler.detach = function(editor) { + editor.renderer.$blockCursor = false; + editor.session.$selectLongWords = $formerLongWords; + editor.session.$useEmacsStyleLineStart = $formerLineStart; + editor.off("click", $resetMarkMode); + editor.off("changeSession", $kbSessionChange); + editor.unsetStyle("emacs-mode"); + editor.commands.removeCommands(commands); + editor.off('copy', this.onCopy); + editor.off('paste', this.onPaste); + editor.$emacsModeHandler = null; +}; + +var $kbSessionChange = function(e) { + if (e.oldSession) { + e.oldSession.$selectLongWords = $formerLongWords; + e.oldSession.$useEmacsStyleLineStart = $formerLineStart; + } + + $formerLongWords = e.session.$selectLongWords; + e.session.$selectLongWords = true; + $formerLineStart = e.session.$useEmacsStyleLineStart; + e.session.$useEmacsStyleLineStart = true; + + if (!e.session.hasOwnProperty('$emacsMark')) + e.session.$emacsMark = null; + if (!e.session.hasOwnProperty('$emacsMarkRing')) + e.session.$emacsMarkRing = []; +}; + +var $resetMarkMode = function(e) { + e.editor.session.$emacsMark = null; +}; + +var keys = require("../lib/keys").KEY_MODS; +var eMods = {C: "ctrl", S: "shift", M: "alt", CMD: "command"}; +var combinations = ["C-S-M-CMD", + "S-M-CMD", "C-M-CMD", "C-S-CMD", "C-S-M", + "M-CMD", "S-CMD", "S-M", "C-CMD", "C-M", "C-S", + "CMD", "M", "S", "C"]; +combinations.forEach(function(c) { + var hashId = 0; + c.split("-").forEach(function(c) { + hashId = hashId | keys[eMods[c]]; + }); + eMods[hashId] = c.toLowerCase() + "-"; +}); + +exports.handler.onCopy = function(e, editor) { + if (editor.$handlesEmacsOnCopy) return; + editor.$handlesEmacsOnCopy = true; + exports.handler.commands.killRingSave.exec(editor); + editor.$handlesEmacsOnCopy = false; +}; + +exports.handler.onPaste = function(e, editor) { + editor.pushEmacsMark(editor.getCursorPosition()); +}; + +exports.handler.bindKey = function(key, command) { + if (typeof key == "object") + key = key[this.platform]; + if (!key) + return; + + var ckb = this.commandKeyBinding; + key.split("|").forEach(function(keyPart) { + keyPart = keyPart.toLowerCase(); + ckb[keyPart] = command; + var keyParts = keyPart.split(" ").slice(0,-1); + keyParts.reduce(function(keyMapKeys, keyPart, i) { + var prefix = keyMapKeys[i-1] ? keyMapKeys[i-1] + ' ' : ''; + return keyMapKeys.concat([prefix + keyPart]); + }, []).forEach(function(keyPart) { + if (!ckb[keyPart]) ckb[keyPart] = "null"; + }); + }, this); +}; + +exports.handler.getStatusText = function(editor, data) { + var str = ""; + if (data.count) + str += data.count; + if (data.keyChain) + str += " " + data.keyChain; + return str; +}; + +exports.handler.handleKeyboard = function(data, hashId, key, keyCode) { + if (keyCode === -1) return undefined; + + var editor = data.editor; + editor._signal("changeStatus"); + if (hashId == -1) { + editor.pushEmacsMark(); + if (data.count) { + var str = new Array(data.count + 1).join(key); + data.count = null; + return {command: "insertstring", args: str}; + } + } + + var modifier = eMods[hashId]; + if (modifier == "c-" || data.count) { + var count = parseInt(key[key.length - 1]); + if (typeof count === 'number' && !isNaN(count)) { + data.count = Math.max(data.count, 0) || 0; + data.count = 10 * data.count + count; + return {command: "null"}; + } + } + if (modifier) key = modifier + key; + if (data.keyChain) key = data.keyChain += " " + key; + var command = this.commandKeyBinding[key]; + data.keyChain = command == "null" ? key : ""; + if (!command) return undefined; + if (command === "null") return {command: "null"}; + + if (command === "universalArgument") { + data.count = -4; + return {command: "null"}; + } + var args; + if (typeof command !== "string") { + args = command.args; + if (command.command) command = command.command; + if (command === "goorselect") { + command = editor.emacsMark() ? args[1] : args[0]; + args = null; + } + } + + if (typeof command === "string") { + if (command === "insertstring" || + command === "splitline" || + command === "togglecomment") { + editor.pushEmacsMark(); + } + command = this.commands[command] || editor.commands.commands[command]; + if (!command) return undefined; + } + + if (!command.readOnly && !command.isYank) + data.lastCommand = null; + + if (!command.readOnly && editor.emacsMark()) + editor.setEmacsMark(null); + + if (data.count) { + var count = data.count; + data.count = 0; + if (!command || !command.handlesCount) { + return { + args: args, + command: { + exec: function(editor, args) { + for (var i = 0; i < count; i++) + command.exec(editor, args); + }, + multiSelectAction: command.multiSelectAction + } + }; + } else { + if (!args) args = {}; + if (typeof args === 'object') args.count = count; + } + } + + return {command: command, args: args}; +}; + +exports.emacsKeys = { + "Up|C-p" : {command: "goorselect", args: ["golineup","selectup"]}, + "Down|C-n" : {command: "goorselect", args: ["golinedown","selectdown"]}, + "Left|C-b" : {command: "goorselect", args: ["gotoleft","selectleft"]}, + "Right|C-f" : {command: "goorselect", args: ["gotoright","selectright"]}, + "C-Left|M-b" : {command: "goorselect", args: ["gotowordleft","selectwordleft"]}, + "C-Right|M-f" : {command: "goorselect", args: ["gotowordright","selectwordright"]}, + "Home|C-a" : {command: "goorselect", args: ["gotolinestart","selecttolinestart"]}, + "End|C-e" : {command: "goorselect", args: ["gotolineend","selecttolineend"]}, + "C-Home|S-M-,": {command: "goorselect", args: ["gotostart","selecttostart"]}, + "C-End|S-M-." : {command: "goorselect", args: ["gotoend","selecttoend"]}, + "S-Up|S-C-p" : "selectup", + "S-Down|S-C-n" : "selectdown", + "S-Left|S-C-b" : "selectleft", + "S-Right|S-C-f" : "selectright", + "S-C-Left|S-M-b" : "selectwordleft", + "S-C-Right|S-M-f" : "selectwordright", + "S-Home|S-C-a" : "selecttolinestart", + "S-End|S-C-e" : "selecttolineend", + "S-C-Home" : "selecttostart", + "S-C-End" : "selecttoend", + + "C-l" : "recenterTopBottom", + "M-s" : "centerselection", + "M-g": "gotoline", + "C-x C-p": "selectall", + "C-Down": {command: "goorselect", args: ["gotopagedown","selectpagedown"]}, + "C-Up": {command: "goorselect", args: ["gotopageup","selectpageup"]}, + "PageDown|C-v": {command: "goorselect", args: ["gotopagedown","selectpagedown"]}, + "PageUp|M-v": {command: "goorselect", args: ["gotopageup","selectpageup"]}, + "S-C-Down": "selectpagedown", + "S-C-Up": "selectpageup", + + "C-s": "iSearch", + "C-r": "iSearchBackwards", + + "M-C-s": "findnext", + "M-C-r": "findprevious", + "S-M-5": "replace", + "Backspace": "backspace", + "Delete|C-d": "del", + "Return|C-m": {command: "insertstring", args: "\n"}, // "newline" + "C-o": "splitline", + + "M-d|C-Delete": {command: "killWord", args: "right"}, + "C-Backspace|M-Backspace|M-Delete": {command: "killWord", args: "left"}, + "C-k": "killLine", + + "C-y|S-Delete": "yank", + "M-y": "yankRotate", + "C-g": "keyboardQuit", + + "C-w|C-S-W": "killRegion", + "M-w": "killRingSave", + "C-Space": "setMark", + "C-x C-x": "exchangePointAndMark", + + "C-t": "transposeletters", + "M-u": "touppercase", // Doesn't work + "M-l": "tolowercase", + "M-/": "autocomplete", // Doesn't work + "C-u": "universalArgument", + + "M-;": "togglecomment", + + "C-/|C-x u|S-C--|C-z": "undo", + "S-C-/|S-C-x u|C--|S-C-z": "redo", // infinite undo? + "C-x r": "selectRectangularRegion", + "M-x": {command: "focusCommandLine", args: "M-x "} +}; + + +exports.handler.bindKeys(exports.emacsKeys); + +exports.handler.addCommands({ + recenterTopBottom: function(editor) { + var renderer = editor.renderer; + var pos = renderer.$cursorLayer.getPixelPosition(); + var h = renderer.$size.scrollerHeight - renderer.lineHeight; + var scrollTop = renderer.scrollTop; + if (Math.abs(pos.top - scrollTop) < 2) { + scrollTop = pos.top - h; + } else if (Math.abs(pos.top - scrollTop - h * 0.5) < 2) { + scrollTop = pos.top; + } else { + scrollTop = pos.top - h * 0.5; + } + editor.session.setScrollTop(scrollTop); + }, + selectRectangularRegion: function(editor) { + editor.multiSelect.toggleBlockSelection(); + }, + setMark: { + exec: function(editor, args) { + + if (args && args.count) { + if (editor.inMultiSelectMode) editor.forEachSelection(moveToMark); + else moveToMark(); + moveToMark(); + return; + } + + var mark = editor.emacsMark(), + ranges = editor.selection.getAllRanges(), + rangePositions = ranges.map(function(r) { return {row: r.start.row, column: r.start.column}; }), + transientMarkModeActive = true, + hasNoSelection = ranges.every(function(range) { return range.isEmpty(); }); + if (transientMarkModeActive && (mark || !hasNoSelection)) { + if (editor.inMultiSelectMode) editor.forEachSelection({exec: editor.clearSelection.bind(editor)}); + else editor.clearSelection(); + if (mark) editor.pushEmacsMark(null); + return; + } + + if (!mark) { + rangePositions.forEach(function(pos) { editor.pushEmacsMark(pos); }); + editor.setEmacsMark(rangePositions[rangePositions.length-1]); + return; + } + + function moveToMark() { + var mark = editor.popEmacsMark(); + mark && editor.moveCursorToPosition(mark); + } + + }, + readOnly: true, + handlesCount: true + }, + exchangePointAndMark: { + exec: function exchangePointAndMark$exec(editor, args) { + var sel = editor.selection; + if (!args.count && !sel.isEmpty()) { // just invert selection + sel.setSelectionRange(sel.getRange(), !sel.isBackwards()); + return; + } + + if (args.count) { // replace mark and point + var pos = {row: sel.lead.row, column: sel.lead.column}; + sel.clearSelection(); + sel.moveCursorToPosition(editor.emacsMarkForSelection(pos)); + } else { // create selection to last mark + sel.selectToPosition(editor.emacsMarkForSelection()); + } + }, + readOnly: true, + handlesCount: true, + multiSelectAction: "forEach" + }, + killWord: { + exec: function(editor, dir) { + editor.clearSelection(); + if (dir == "left") + editor.selection.selectWordLeft(); + else + editor.selection.selectWordRight(); + + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + exports.killRing.add(text); + + editor.session.remove(range); + editor.clearSelection(); + }, + multiSelectAction: "forEach" + }, + killLine: function(editor) { + editor.pushEmacsMark(null); + editor.clearSelection(); + var range = editor.getSelectionRange(); + var line = editor.session.getLine(range.start.row); + range.end.column = line.length; + line = line.substr(range.start.column); + + var foldLine = editor.session.getFoldLine(range.start.row); + if (foldLine && range.end.row != foldLine.end.row) { + range.end.row = foldLine.end.row; + line = "x"; + } + if (/^\s*$/.test(line)) { + range.end.row++; + line = editor.session.getLine(range.end.row); + range.end.column = /^\s*$/.test(line) ? line.length : 0; + } + var text = editor.session.getTextRange(range); + if (editor.prevOp.command == this) + exports.killRing.append(text); + else + exports.killRing.add(text); + + editor.session.remove(range); + editor.clearSelection(); + }, + yank: function(editor) { + editor.onPaste(exports.killRing.get() || ''); + editor.keyBinding.$data.lastCommand = "yank"; + }, + yankRotate: function(editor) { + if (editor.keyBinding.$data.lastCommand != "yank") + return; + editor.undo(); + editor.session.$emacsMarkRing.pop(); // also undo recording mark + editor.onPaste(exports.killRing.rotate()); + editor.keyBinding.$data.lastCommand = "yank"; + }, + killRegion: { + exec: function(editor) { + exports.killRing.add(editor.getCopyText()); + editor.commands.byName.cut.exec(editor); + editor.setEmacsMark(null); + }, + readOnly: true, + multiSelectAction: "forEach" + }, + killRingSave: { + exec: function(editor) { + + editor.$handlesEmacsOnCopy = true; + var marks = editor.session.$emacsMarkRing.slice(), + deselectedMarks = []; + exports.killRing.add(editor.getCopyText()); + + setTimeout(function() { + function deselect() { + var sel = editor.selection, range = sel.getRange(), + pos = sel.isBackwards() ? range.end : range.start; + deselectedMarks.push({row: pos.row, column: pos.column}); + sel.clearSelection(); + } + editor.$handlesEmacsOnCopy = false; + if (editor.inMultiSelectMode) editor.forEachSelection({exec: deselect}); + else deselect(); + editor.setEmacsMark(null); + editor.session.$emacsMarkRing = marks.concat(deselectedMarks.reverse()); + }, 0); + }, + readOnly: true + }, + keyboardQuit: function(editor) { + editor.selection.clearSelection(); + editor.setEmacsMark(null); + editor.keyBinding.$data.count = null; + }, + focusCommandLine: function(editor, arg) { + if (editor.showCommandLine) + editor.showCommandLine(arg); + } +}); + +exports.handler.addCommands(iSearchCommandModule.iSearchStartCommands); + +var commands = exports.handler.commands; +commands.yank.isYank = true; +commands.yankRotate.isYank = true; + +exports.killRing = { + $data: [], + add: function(str) { + str && this.$data.push(str); + if (this.$data.length > 30) + this.$data.shift(); + }, + append: function(str) { + var idx = this.$data.length - 1; + var text = this.$data[idx] || ""; + if (str) text += str; + if (text) this.$data[idx] = text; + }, + get: function(n) { + n = n || 1; + return this.$data.slice(this.$data.length-n, this.$data.length).reverse().join('\n'); + }, + pop: function() { + if (this.$data.length > 1) + this.$data.pop(); + return this.get(); + }, + rotate: function() { + this.$data.unshift(this.$data.pop()); + return this.get(); + } +}; + +}); (function() { + window.require(["ace/keyboard/emacs"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/keybinding-sublime.js b/app/Resources/ui/js/ace/keybinding-sublime.js new file mode 100644 index 00000000..21fcb380 --- /dev/null +++ b/app/Resources/ui/js/ace/keybinding-sublime.js @@ -0,0 +1,422 @@ +define("ace/keyboard/sublime",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module) { +"use strict"; + +var HashHandler = require("../keyboard/hash_handler").HashHandler; + +function moveBySubWords(editor, direction, extend) { + var selection = editor.selection; + var row = selection.lead.row; + var column = selection.lead.column; + + var line = editor.session.getLine(row); + if (!line[column + direction]) { + var method = (extend ? "selectWord" : "moveCursorShortWord") + + (direction == 1 ? "Right" : "Left"); + return editor.selection[method](); + } + if (direction == -1) column--; + while (line[column]) { + var type = getType(line[column]) + getType(line[column + direction]); + column += direction; + if (direction == 1) { + if (type == "WW" && getType(line[column + 1]) == "w") + break; + } + else { + if (type == "wW") { + if (getType(line[column - 1]) == "W") { + column -= 1; + break; + } else { + continue; + } + } + if (type == "Ww") + break; + } + if (/w[s_oW]|_[sWo]|o[s_wW]|s[W]|W[so]/.test(type)) + break; + } + if (direction == -1) column++; + if (extend) + editor.selection.moveCursorTo(row, column); + else + editor.selection.moveTo(row, column); + + function getType(x) { + if (!x) return "-"; + if (/\s/.test(x)) return "s"; + if (x == "_") return "_"; + if (x.toUpperCase() == x && x.toLowerCase() != x) return "W"; + if (x.toUpperCase() != x && x.toLowerCase() == x) return "w"; + return "o"; + } +} + +exports.handler = new HashHandler(); + +exports.handler.addCommands([{ + name: "find_all_under", + exec: function(editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + editor.findAll(); + }, + readOnly: true +}, { + name: "find_under", + exec: function(editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + editor.findNext(); + }, + readOnly: true +}, { + name: "find_under_prev", + exec: function(editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + editor.findPrevious(); + }, + readOnly: true +}, { + name: "find_under_expand", + exec: function(editor) { + editor.selectMore(1, false, true); + }, + scrollIntoView: "animate", + readOnly: true +}, { + name: "find_under_expand_skip", + exec: function(editor) { + editor.selectMore(1, true, true); + }, + scrollIntoView: "animate", + readOnly: true +}, { + name: "delete_to_hard_bol", + exec: function(editor) { + var pos = editor.selection.getCursor(); + editor.session.remove({ + start: { row: pos.row, column: 0 }, + end: pos + }); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "delete_to_hard_eol", + exec: function(editor) { + var pos = editor.selection.getCursor(); + editor.session.remove({ + start: pos, + end: { row: pos.row, column: Infinity } + }); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "moveToWordStartLeft", + exec: function(editor) { + editor.selection.moveCursorLongWordLeft(); + editor.clearSelection(); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "moveToWordEndRight", + exec: function(editor) { + editor.selection.moveCursorLongWordRight(); + editor.clearSelection(); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "selectToWordStartLeft", + exec: function(editor) { + var sel = editor.selection; + sel.$moveSelection(sel.moveCursorLongWordLeft); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "selectToWordEndRight", + exec: function(editor) { + var sel = editor.selection; + sel.$moveSelection(sel.moveCursorLongWordRight); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "selectSubWordRight", + exec: function(editor) { + moveBySubWords(editor, 1, true); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectSubWordLeft", + exec: function(editor) { + moveBySubWords(editor, -1, true); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "moveSubWordRight", + exec: function(editor) { + moveBySubWords(editor, 1); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "moveSubWordLeft", + exec: function(editor) { + moveBySubWords(editor, -1); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}]); + + +[{ + bindKey: { mac: "cmd-k cmd-backspace|cmd-backspace", win: "ctrl-shift-backspace|ctrl-k ctrl-backspace" }, + name: "removetolinestarthard" +}, { + bindKey: { mac: "cmd-k cmd-k|cmd-delete|ctrl-k", win: "ctrl-shift-delete|ctrl-k ctrl-k" }, + name: "removetolineendhard" +}, { + bindKey: { mac: "cmd-shift-d", win: "ctrl-shift-d" }, + name: "duplicateSelection" +}, { + bindKey: { mac: "cmd-l", win: "ctrl-l" }, + name: "expandtoline" +}, +{ + bindKey: {mac: "cmd-shift-a", win: "ctrl-shift-a"}, + name: "expandSelection", + args: {to: "tag"} +}, { + bindKey: {mac: "cmd-shift-j", win: "ctrl-shift-j"}, + name: "expandSelection", + args: {to: "indentation"} +}, { + bindKey: {mac: "ctrl-shift-m", win: "ctrl-shift-m"}, + name: "expandSelection", + args: {to: "brackets"} +}, { + bindKey: {mac: "cmd-shift-space", win: "ctrl-shift-space"}, + name: "expandSelection", + args: {to: "scope"} +}, +{ + bindKey: { mac: "ctrl-cmd-g", win: "alt-f3" }, + name: "find_all_under" +}, { + bindKey: { mac: "alt-cmd-g", win: "ctrl-f3" }, + name: "find_under" +}, { + bindKey: { mac: "shift-alt-cmd-g", win: "ctrl-shift-f3" }, + name: "find_under_prev" +}, { + bindKey: { mac: "cmd-g", win: "f3" }, + name: "findnext" +}, { + bindKey: { mac: "shift-cmd-g", win: "shift-f3" }, + name: "findprevious" +}, { + bindKey: { mac: "cmd-d", win: "ctrl-d" }, + name: "find_under_expand" +}, { + bindKey: { mac: "cmd-k cmd-d", win: "ctrl-k ctrl-d" }, + name: "find_under_expand_skip" +}, +{ + bindKey: { mac: "cmd-alt-[", win: "ctrl-shift-[" }, + name: "toggleFoldWidget" +}, { + bindKey: { mac: "cmd-alt-]", win: "ctrl-shift-]" }, + name: "unfold" +}, { + bindKey: { mac: "cmd-k cmd-0|cmd-k cmd-j", win: "ctrl-k ctrl-0|ctrl-k ctrl-j" }, + name: "unfoldall" +}, { + bindKey: { mac: "cmd-k cmd-1", win: "ctrl-k ctrl-1" }, + name: "foldOther", + args: { level: 1 } +}, +{ + bindKey: { win: "ctrl-left", mac: "alt-left" }, + name: "moveToWordStartLeft" +}, { + bindKey: { win: "ctrl-right", mac: "alt-right" }, + name: "moveToWordEndRight" +}, { + bindKey: { win: "ctrl-shift-left", mac: "alt-shift-left" }, + name: "selectToWordStartLeft" +}, { + bindKey: { win: "ctrl-shift-right", mac: "alt-shift-right" }, + name: "selectToWordEndRight" +}, +{ + bindKey: {mac: "ctrl-alt-shift-right|ctrl-shift-right", win: "alt-shift-right"}, + name: "selectSubWordRight" +}, { + bindKey: {mac: "ctrl-alt-shift-left|ctrl-shift-left", win: "alt-shift-left"}, + name: "selectSubWordLeft" +}, { + bindKey: {mac: "ctrl-alt-right|ctrl-right", win: "alt-right"}, + name: "moveSubWordRight" +}, { + bindKey: {mac: "ctrl-alt-left|ctrl-left", win: "alt-left"}, + name: "moveSubWordLeft" +}, +{ + bindKey: { mac: "ctrl-m", win: "ctrl-m" }, + name: "jumptomatching", + args: { to: "brackets" } +}, +{ + bindKey: { mac: "ctrl-f6", win: "ctrl-f6" }, + name: "goToNextError" +}, { + bindKey: { mac: "ctrl-shift-f6", win: "ctrl-shift-f6" }, + name: "goToPreviousError" +}, + +{ + bindKey: { mac: "ctrl-o" }, + name: "splitline" +}, +{ + bindKey: {mac: "ctrl-shift-w", win: "alt-shift-w"}, + name: "surrowndWithTag" +},{ + bindKey: {mac: "cmd-alt-.", win: "alt-."}, + name: "close_tag" +}, +{ + bindKey: { mac: "cmd-j", win: "ctrl-j" }, + name: "joinlines" +}, + +{ + bindKey: {mac: "ctrl--", win: "alt--"}, + name: "jumpBack" +}, { + bindKey: {mac: "ctrl-shift--", win: "alt-shift--"}, + name: "jumpForward" +}, + +{ + bindKey: { mac: "cmd-k cmd-l", win: "ctrl-k ctrl-l" }, + name: "tolowercase" +}, { + bindKey: { mac: "cmd-k cmd-u", win: "ctrl-k ctrl-u" }, + name: "touppercase" +}, + +{ + bindKey: {mac: "cmd-shift-v", win: "ctrl-shift-v"}, + name: "paste_and_indent" +}, { + bindKey: {mac: "cmd-k cmd-v|cmd-alt-v", win: "ctrl-k ctrl-v"}, + name: "paste_from_history" +}, + +{ + bindKey: { mac: "cmd-shift-enter", win: "ctrl-shift-enter" }, + name: "addLineBefore" +}, { + bindKey: { mac: "cmd-enter", win: "ctrl-enter" }, + name: "addLineAfter" +}, { + bindKey: { mac: "ctrl-shift-k", win: "ctrl-shift-k" }, + name: "removeline" +}, { + bindKey: { mac: "ctrl-alt-up", win: "ctrl-up" }, + name: "scrollup" +}, { + bindKey: { mac: "ctrl-alt-down", win: "ctrl-down" }, + name: "scrolldown" +}, { + bindKey: { mac: "cmd-a", win: "ctrl-a" }, + name: "selectall" +}, { + bindKey: { linux: "alt-shift-down", mac: "ctrl-shift-down", win: "ctrl-alt-down" }, + name: "addCursorBelow" +}, { + bindKey: { linux: "alt-shift-up", mac: "ctrl-shift-up", win: "ctrl-alt-up" }, + name: "addCursorAbove" +}, + + +{ + bindKey: { mac: "cmd-k cmd-c|ctrl-l", win: "ctrl-k ctrl-c" }, + name: "centerselection" +}, + +{ + bindKey: { mac: "f5", win: "f9" }, + name: "sortlines" +}, +{ + bindKey: {mac: "ctrl-f5", win: "ctrl-f9"}, + name: "sortlines", + args: {caseSensitive: true} +}, +{ + bindKey: { mac: "cmd-shift-l", win: "ctrl-shift-l" }, + name: "splitSelectionIntoLines" +}, { + bindKey: { mac: "ctrl-cmd-down", win: "ctrl-shift-down" }, + name: "movelinesdown" +}, { + bindKey: { mac: "ctrl-cmd-up", win: "ctrl-shift-up" }, + name: "movelinesup" +}, { + bindKey: { mac: "alt-down", win: "alt-down" }, + name: "modifyNumberDown" +}, { + bindKey: { mac: "alt-up", win: "alt-up" }, + name: "modifyNumberUp" +}, { + bindKey: { mac: "cmd-/", win: "ctrl-/" }, + name: "togglecomment" +}, { + bindKey: { mac: "cmd-alt-/", win: "ctrl-shift-/" }, + name: "toggleBlockComment" +}, + + +{ + bindKey: { linux: "ctrl-alt-q", mac: "ctrl-q", win: "ctrl-q" }, + name: "togglerecording" +}, { + bindKey: { linux: "ctrl-alt-shift-q", mac: "ctrl-shift-q", win: "ctrl-shift-q" }, + name: "replaymacro" +}, + +{ + bindKey: { mac: "ctrl-t", win: "ctrl-t" }, + name: "transpose" +} + +].forEach(function(binding) { + var command = exports.handler.commands[binding.name]; + if (command) + command.bindKey = binding.bindKey; + exports.handler.bindKey(binding.bindKey, command || binding.name); +}); + +}); (function() { + window.require(["ace/keyboard/sublime"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/keybinding-vim.js b/app/Resources/ui/js/ace/keybinding-vim.js new file mode 100644 index 00000000..bfb7e0ba --- /dev/null +++ b/app/Resources/ui/js/ace/keybinding-vim.js @@ -0,0 +1,6283 @@ +define("ace/ext/hardwrap",["require","exports","module","ace/range","ace/editor","ace/config"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +function hardWrap(editor, options) { + var max = options.column || editor.getOption("printMarginColumn"); + var allowMerge = options.allowMerge != false; + + var row = Math.min(options.startRow, options.endRow); + var endRow = Math.max(options.startRow, options.endRow); + + var session = editor.session; + + while (row <= endRow) { + var line = session.getLine(row); + if (line.length > max) { + var space = findSpace(line, max, 5); + if (space) { + var indentation = /^\s*/.exec(line)[0]; + session.replace(new Range(row,space.start,row,space.end), "\n" + indentation); + } + endRow++; + } else if (allowMerge && /\S/.test(line) && row != endRow) { + var nextLine = session.getLine(row + 1); + if (nextLine && /\S/.test(nextLine)) { + var trimmedLine = line.replace(/\s+$/, ""); + var trimmedNextLine = nextLine.replace(/^\s+/, ""); + var mergedLine = trimmedLine + " " + trimmedNextLine; + + var space = findSpace(mergedLine, max, 5); + if (space && space.start > trimmedLine.length || mergedLine.length < max) { + var replaceRange = new Range(row,trimmedLine.length,row + 1,nextLine.length - trimmedNextLine.length); + session.replace(replaceRange, " "); + row--; + endRow--; + } else if (trimmedLine.length < line.length) { + session.remove(new Range(row, trimmedLine.length, row, line.length)); + } + } + } + row++; + } + + function findSpace(line, max, min) { + if (line.length < max) + return; + var before = line.slice(0, max); + var after = line.slice(max); + var spaceAfter = /^(?:(\s+)|(\S+)(\s+))/.exec(after); + var spaceBefore = /(?:(\s+)|(\s+)(\S+))$/.exec(before); + var start = 0; + var end = 0; + if (spaceBefore && !spaceBefore[2]) { + start = max - spaceBefore[1].length; + end = max; + } + if (spaceAfter && !spaceAfter[2]) { + if (!start) + start = max; + end = max + spaceAfter[1].length; + } + if (start) { + return { + start: start, + end: end + }; + } + if (spaceBefore && spaceBefore[2] && spaceBefore.index > min) { + return { + start: spaceBefore.index, + end: spaceBefore.index + spaceBefore[2].length + }; + } + if (spaceAfter && spaceAfter[2]) { + start = max + spaceAfter[2].length; + return { + start: start, + end: start + spaceAfter[3].length + }; + } + } + +} + +function wrapAfterInput(e) { + if (e.command.name == "insertstring" && /\S/.test(e.args)) { + var editor = e.editor; + var cursor = editor.selection.cursor; + if (cursor.column <= editor.renderer.$printMarginColumn) return; + var lastDelta = editor.session.$undoManager.$lastDelta; + + hardWrap(editor, { + startRow: cursor.row, endRow: cursor.row, + allowMerge: false + }); + if (lastDelta != editor.session.$undoManager.$lastDelta) + editor.session.markUndoGroup(); + } +} + +var Editor = require("../editor").Editor; +require("../config").defineOptions(Editor.prototype, "editor", { + hardWrap: { + set: function(val) { + if (val) { + this.commands.on("afterExec", wrapAfterInput); + } else { + this.commands.off("afterExec", wrapAfterInput); + } + }, + value: false + } +}); + +exports.hardWrap = hardWrap; + +}); + +define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/dom","ace/lib/oop","ace/lib/keys","ace/lib/event","ace/search","ace/lib/useragent","ace/search_highlight","ace/commands/multi_select_commands","ace/mode/text","ace/ext/hardwrap","ace/multi_select"], function(require, exports, module) { + 'use strict'; + + function log() { + var d = ""; + function format(p) { + if (typeof p != "object") + return p + ""; + if ("line" in p) { + return p.line + ":" + p.ch; + } + if ("anchor" in p) { + return format(p.anchor) + "->" + format(p.head); + } + if (Array.isArray(p)) + return "[" + p.map(function(x) { + return format(x); + }) + "]"; + return JSON.stringify(p); + } + for (var i = 0; i < arguments.length; i++) { + var p = arguments[i]; + var f = format(p); + d += f + " "; + } + console.log(d); + } + var Range = require("../range").Range; + var EventEmitter = require("../lib/event_emitter").EventEmitter; + var dom = require("../lib/dom"); + var oop = require("../lib/oop"); + var KEYS = require("../lib/keys"); + var event = require("../lib/event"); + var Search = require("../search").Search; + var useragent = require("../lib/useragent"); + var SearchHighlight = require("../search_highlight").SearchHighlight; + var multiSelectCommands = require("../commands/multi_select_commands"); + var TextModeTokenRe = require("../mode/text").Mode.prototype.tokenRe; + var hardWrap = require("../ext/hardwrap").hardWrap; + require("../multi_select"); + + var CodeMirror = function(ace) { + this.ace = ace; + this.state = {}; + this.marks = {}; + this.options = {}; + this.$uid = 0; + this.onChange = this.onChange.bind(this); + this.onSelectionChange = this.onSelectionChange.bind(this); + this.onBeforeEndOperation = this.onBeforeEndOperation.bind(this); + this.ace.on('change', this.onChange); + this.ace.on('changeSelection', this.onSelectionChange); + this.ace.on('beforeEndOperation', this.onBeforeEndOperation); + }; + CodeMirror.Pos = function(line, ch) { + if (!(this instanceof Pos)) return new Pos(line, ch); + this.line = line; this.ch = ch; + }; + CodeMirror.defineOption = function(name, val, setter) {}; + CodeMirror.commands = { + redo: function(cm) { cm.ace.redo(); }, + undo: function(cm) { cm.ace.undo(); }, + newlineAndIndent: function(cm) { cm.ace.insert("\n"); }, + goLineLeft: function(cm) { cm.ace.selection.moveCursorLineStart(); }, + goLineRight: function(cm) { cm.ace.selection.moveCursorLineEnd(); } + }; + CodeMirror.keyMap = {}; + CodeMirror.addClass = CodeMirror.rmClass = function() {}; + CodeMirror.e_stop = CodeMirror.e_preventDefault = event.stopEvent; + CodeMirror.keyName = function(e) { + var key = (KEYS[e.keyCode] || e.key || ""); + if (key.length == 1) key = key.toUpperCase(); + key = event.getModifierString(e).replace(/(^|-)\w/g, function(m) { + return m.toUpperCase(); + }) + key; + return key; + }; + CodeMirror.keyMap['default'] = function(key) { + return function(cm) { + var cmd = cm.ace.commands.commandKeyBinding[key.toLowerCase()]; + return cmd && cm.ace.execCommand(cmd) !== false; + }; + }; + CodeMirror.lookupKey = function lookupKey(key, map, handle) { + if (!map) map = "default"; + if (typeof map == "string") + map = CodeMirror.keyMap[map]; + var found = typeof map == "function" ? map(key) : map[key]; + if (found === false) return "nothing"; + if (found === "...") return "multi"; + if (found != null && handle(found)) return "handled"; + + if (map.fallthrough) { + if (!Array.isArray(map.fallthrough)) + return lookupKey(key, map.fallthrough, handle); + for (var i = 0; i < map.fallthrough.length; i++) { + var result = lookupKey(key, map.fallthrough[i], handle); + if (result) return result; + } + } + }; + + + CodeMirror.findMatchingTag = function(cm, head) { + + }; + + CodeMirror.signal = function(o, name, e) { return o._signal(name, e) }; + CodeMirror.on = event.addListener; + CodeMirror.off = event.removeListener; + CodeMirror.isWordChar = function(ch) { + if (ch < "\x7f") return /^\w$/.test(ch); + TextModeTokenRe.lastIndex = 0; + return TextModeTokenRe.test(ch); + }; + +(function() { + oop.implement(CodeMirror.prototype, EventEmitter); + + this.destroy = function() { + this.ace.off('change', this.onChange); + this.ace.off('changeSelection', this.onSelectionChange); + this.ace.off('beforeEndOperation', this.onBeforeEndOperation); + this.removeOverlay(); + }; + this.virtualSelectionMode = function() { + return this.ace.inVirtualSelectionMode && this.ace.selection.index; + }; + this.onChange = function(delta) { + var change = { text: delta.action[0] == 'i' ? delta.lines : [] }; + var curOp = this.curOp = this.curOp || {}; + if (!curOp.changeHandlers) + curOp.changeHandlers = this._eventRegistry["change"] && this._eventRegistry["change"].slice(); + if (!curOp.lastChange) { + curOp.lastChange = curOp.change = change; + } else { + curOp.lastChange.next = curOp.lastChange = change; + } + this.$updateMarkers(delta); + }; + this.onSelectionChange = function() { + var curOp = this.curOp = this.curOp || {}; + if (!curOp.cursorActivityHandlers) + curOp.cursorActivityHandlers = this._eventRegistry["cursorActivity"] && this._eventRegistry["cursorActivity"].slice(); + this.curOp.cursorActivity = true; + if (this.ace.inMultiSelectMode) { + this.ace.keyBinding.removeKeyboardHandler(multiSelectCommands.keyboardHandler); + } + }; + this.operation = function(fn, force) { + if (!force && this.curOp || force && this.curOp && this.curOp.force) { + return fn(); + } + if (force || !this.ace.curOp) { + if (this.curOp) + this.onBeforeEndOperation(); + } + if (!this.ace.curOp) { + var prevOp = this.ace.prevOp; + this.ace.startOperation({ + command: { name: "vim", scrollIntoView: "cursor" } + }); + } + var curOp = this.curOp = this.curOp || {}; + this.curOp.force = force; + var result = fn(); + if (this.ace.curOp && this.ace.curOp.command.name == "vim") { + if (this.state.dialog) + this.ace.curOp.command.scrollIntoView = false; + this.ace.endOperation(); + if (!curOp.cursorActivity && !curOp.lastChange && prevOp) + this.ace.prevOp = prevOp; + } + if (force || !this.ace.curOp) { + if (this.curOp) + this.onBeforeEndOperation(); + } + return result; + }; + this.onBeforeEndOperation = function() { + var op = this.curOp; + if (op) { + if (op.change) { this.signal("change", op.change, op); } + if (op && op.cursorActivity) { this.signal("cursorActivity", null, op); } + this.curOp = null; + } + }; + + this.signal = function(eventName, e, handlers) { + var listeners = handlers ? handlers[eventName + "Handlers"] + : (this._eventRegistry || {})[eventName]; + if (!listeners) + return; + listeners = listeners.slice(); + for (var i=0; i 0) { + point.row += rowShift; + point.column += point.row == end.row ? colShift : 0; + continue; + } + if (!isInsert && cmp2 <= 0) { + point.row = start.row; + point.column = start.column; + if (cmp2 === 0) + point.bias = 1; + } + } + }; + var Marker = function(cm, id, row, column) { + this.cm = cm; + this.id = id; + this.row = row; + this.column = column; + cm.marks[this.id] = this; + }; + Marker.prototype.clear = function() { delete this.cm.marks[this.id] }; + Marker.prototype.find = function() { return toCmPos(this) }; + this.setBookmark = function(cursor, options) { + var bm = new Marker(this, this.$uid++, cursor.line, cursor.ch); + if (!options || !options.insertLeft) + bm.$insertRight = true; + this.marks[bm.id] = bm; + return bm; + }; + this.moveH = function(increment, unit) { + if (unit == 'char') { + var sel = this.ace.selection; + sel.clearSelection(); + sel.moveCursorBy(0, increment); + } + }; + this.findPosV = function(start, amount, unit, goalColumn) { + if (unit == 'page') { + var renderer = this.ace.renderer; + var config = renderer.layerConfig; + amount = amount * Math.floor(config.height / config.lineHeight); + unit = 'line'; + } + if (unit == 'line') { + var screenPos = this.ace.session.documentToScreenPosition(start.line, start.ch); + if (goalColumn != null) + screenPos.column = goalColumn; + screenPos.row += amount; + screenPos.row = Math.min(Math.max(0, screenPos.row), this.ace.session.getScreenLength() - 1); + var pos = this.ace.session.screenToDocumentPosition(screenPos.row, screenPos.column); + return toCmPos(pos); + } else { + debugger; + } + }; + this.charCoords = function(pos, mode) { + if (mode == 'div' || !mode) { + var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch); + return {left: sc.column, top: sc.row}; + }if (mode == 'local') { + var renderer = this.ace.renderer; + var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch); + var lh = renderer.layerConfig.lineHeight; + var cw = renderer.layerConfig.characterWidth; + var top = lh * sc.row; + return {left: sc.column * cw, top: top, bottom: top + lh}; + } + }; + this.coordsChar = function(pos, mode) { + var renderer = this.ace.renderer; + if (mode == 'local') { + var row = Math.max(0, Math.floor(pos.top / renderer.lineHeight)); + var col = Math.max(0, Math.floor(pos.left / renderer.characterWidth)); + var ch = renderer.session.screenToDocumentPosition(row, col); + return toCmPos(ch); + } else if (mode == 'div') { + throw "not implemented"; + } + }; + this.getSearchCursor = function(query, pos, caseFold) { + var caseSensitive = false; + var isRegexp = false; + if (query instanceof RegExp && !query.global) { + caseSensitive = !query.ignoreCase; + query = query.source; + isRegexp = true; + } + if (query == "\\n") { query = "\n"; isRegexp = false; } + var search = new Search(); + if (pos.ch == undefined) pos.ch = Number.MAX_VALUE; + var acePos = {row: pos.line, column: pos.ch}; + var cm = this; + var last = null; + return { + findNext: function() { return this.find(false) }, + findPrevious: function() {return this.find(true) }, + find: function(back) { + search.setOptions({ + needle: query, + caseSensitive: caseSensitive, + wrap: false, + backwards: back, + regExp: isRegexp, + start: last || acePos + }); + var range = search.find(cm.ace.session); + last = range; + return last && [!last.isEmpty()]; + }, + from: function() { return last && toCmPos(last.start) }, + to: function() { return last && toCmPos(last.end) }, + replace: function(text) { + if (last) { + last.end = cm.ace.session.doc.replace(last, text); + } + } + }; + }; + this.scrollTo = function(x, y) { + var renderer = this.ace.renderer; + var config = renderer.layerConfig; + var maxHeight = config.maxHeight; + maxHeight -= (renderer.$size.scrollerHeight - renderer.lineHeight) * renderer.$scrollPastEnd; + if (y != null) this.ace.session.setScrollTop(Math.max(0, Math.min(y, maxHeight))); + if (x != null) this.ace.session.setScrollLeft(Math.max(0, Math.min(x, config.width))); + }; + this.scrollInfo = function() { return 0; }; + this.scrollIntoView = function(pos, margin) { + if (pos) { + var renderer = this.ace.renderer; + var viewMargin = { "top": 0, "bottom": margin }; + renderer.scrollCursorIntoView(toAcePos(pos), + (renderer.lineHeight * 2) / renderer.$size.scrollerHeight, viewMargin); + } + }; + this.getLine = function(row) { return this.ace.session.getLine(row) }; + this.getRange = function(s, e) { + return this.ace.session.getTextRange(new Range(s.line, s.ch, e.line, e.ch)); + }; + this.replaceRange = function(text, s, e) { + if (!e) e = s; + var range = new Range(s.line, s.ch, e.line, e.ch); + this.ace.session.$clipRangeToDocument(range); + return this.ace.session.replace(range, text); + }; + this.replaceSelection = + this.replaceSelections = function(p) { + var sel = this.ace.selection; + if (this.ace.inVirtualSelectionMode) { + this.ace.session.replace(sel.getRange(), p[0] || ""); + return; + } + sel.inVirtualSelectionMode = true; + var ranges = sel.rangeList.ranges; + if (!ranges.length) ranges = [this.ace.multiSelect.getRange()]; + for (var i = ranges.length; i--;) + this.ace.session.replace(ranges[i], p[i] || ""); + sel.inVirtualSelectionMode = false; + }; + this.getSelection = function() { + return this.ace.getSelectedText(); + }; + this.getSelections = function() { + return this.listSelections().map(function(x) { + return this.getRange(x.anchor, x.head); + }, this); + }; + this.getInputField = function() { + return this.ace.textInput.getElement(); + }; + this.getWrapperElement = function() { + return this.ace.container; + }; + var optMap = { + indentWithTabs: "useSoftTabs", + indentUnit: "tabSize", + tabSize: "tabSize", + firstLineNumber: "firstLineNumber", + readOnly: "readOnly" + }; + this.setOption = function(name, val) { + this.state[name] = val; + switch (name) { + case 'indentWithTabs': + name = optMap[name]; + val = !val; + break; + case 'keyMap': + this.state.$keyMap = val; + return; + break; + default: + name = optMap[name]; + } + if (name) + this.ace.setOption(name, val); + }; + this.getOption = function(name) { + var val; + var aceOpt = optMap[name]; + if (aceOpt) + val = this.ace.getOption(aceOpt); + switch (name) { + case 'indentWithTabs': + name = optMap[name]; + return !val; + case 'keyMap': + return this.state.$keyMap || 'vim'; + } + return aceOpt ? val : this.state[name]; + }; + this.toggleOverwrite = function(on) { + this.state.overwrite = on; + return this.ace.setOverwrite(on); + }; + this.addOverlay = function(o) { + if (!this.$searchHighlight || !this.$searchHighlight.session) { + var highlight = new SearchHighlight(null, "ace_highlight-marker", "text"); + var marker = this.ace.session.addDynamicMarker(highlight); + highlight.id = marker.id; + highlight.session = this.ace.session; + highlight.destroy = function(o) { + highlight.session.off("change", highlight.updateOnChange); + highlight.session.off("changeEditor", highlight.destroy); + highlight.session.removeMarker(highlight.id); + highlight.session = null; + }; + highlight.updateOnChange = function(delta) { + var row = delta.start.row; + if (row == delta.end.row) highlight.cache[row] = undefined; + else highlight.cache.splice(row, highlight.cache.length); + }; + highlight.session.on("changeEditor", highlight.destroy); + highlight.session.on("change", highlight.updateOnChange); + } + var re = new RegExp(o.query.source, "gmi"); + this.$searchHighlight = o.highlight = highlight; + this.$searchHighlight.setRegexp(re); + this.ace.renderer.updateBackMarkers(); + }; + this.removeOverlay = function(o) { + if (this.$searchHighlight && this.$searchHighlight.session) { + this.$searchHighlight.destroy(); + } + }; + this.getScrollInfo = function() { + var renderer = this.ace.renderer; + var config = renderer.layerConfig; + return { + left: renderer.scrollLeft, + top: renderer.scrollTop, + height: config.maxHeight, + width: config.width, + clientHeight: config.height, + clientWidth: config.width + }; + }; + this.getValue = function() { + return this.ace.getValue(); + }; + this.setValue = function(v) { + return this.ace.setValue(v, -1); + }; + this.getTokenTypeAt = function(pos) { + var token = this.ace.session.getTokenAt(pos.line, pos.ch); + return token && /comment|string/.test(token.type) ? "string" : ""; + }; + this.findMatchingBracket = function(pos) { + var m = this.ace.session.findMatchingBracket(toAcePos(pos)); + return {to: m && toCmPos(m)}; + }; + this.indentLine = function(line, method) { + if (method === true) + this.ace.session.indentRows(line, line, "\t"); + else if (method === false) + this.ace.session.outdentRows(new Range(line, 0, line, 0)); + }; + this.indexFromPos = function(pos) { + return this.ace.session.doc.positionToIndex(toAcePos(pos)); + }; + this.posFromIndex = function(index) { + return toCmPos(this.ace.session.doc.indexToPosition(index)); + }; + this.focus = function(index) { + return this.ace.textInput.focus(); + }; + this.blur = function(index) { + return this.ace.blur(); + }; + this.defaultTextHeight = function(index) { + return this.ace.renderer.layerConfig.lineHeight; + }; + this.scanForBracket = function(pos, dir, _, options) { + var re = options.bracketRegex.source; + var tokenRe = /paren|text|operator|tag/; + if (dir == 1) { + var m = this.ace.session.$findClosingBracket(re.slice(1, 2), toAcePos(pos), tokenRe); + } else { + var m = this.ace.session.$findOpeningBracket(re.slice(-2, -1), {row: pos.line, column: pos.ch + 1}, tokenRe); + } + return m && {pos: toCmPos(m)}; + }; + this.refresh = function() { + return this.ace.resize(true); + }; + this.getMode = function() { + return { name : this.getOption("mode") }; + }; + this.execCommand = function(name) { + if (CodeMirror.commands.hasOwnProperty(name)) return CodeMirror.commands[name](this); + if (name == "indentAuto") return this.ace.execCommand("autoindent"); + console.log(name + " is not implemented"); + }; + this.getLineNumber = function(handle) { + return handle.row; + } + this.getLineHandle = function(row) { + return {text: this.ace.session.getLine(row), row: row}; + } +}).call(CodeMirror.prototype); + function toAcePos(cmPos) { + return {row: cmPos.line, column: cmPos.ch}; + } + function toCmPos(acePos) { + return new Pos(acePos.row, acePos.column); + } + + var StringStream = CodeMirror.StringStream = function(string, tabSize) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + }; + + StringStream.prototype = { + eol: function() {return this.pos >= this.string.length;}, + sol: function() {return this.pos == this.lineStart;}, + peek: function() {return this.string.charAt(this.pos) || undefined;}, + next: function() { + if (this.pos < this.string.length) + return this.string.charAt(this.pos++); + }, + eat: function(match) { + var ch = this.string.charAt(this.pos); + if (typeof match == "string") var ok = ch == match; + else var ok = ch && (match.test ? match.test(ch) : match(ch)); + if (ok) {++this.pos; return ch;} + }, + eatWhile: function(match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start; + }, + eatSpace: function() { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; + return this.pos > start; + }, + skipToEnd: function() {this.pos = this.string.length;}, + skipTo: function(ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true;} + }, + backUp: function(n) {this.pos -= n;}, + column: function() { + throw "not implemented"; + }, + indentation: function() { + throw "not implemented"; + }, + match: function(pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) this.pos += pattern.length; + return true; + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) return null; + if (match && consume !== false) this.pos += match[0].length; + return match; + } + }, + current: function(){return this.string.slice(this.start, this.pos);}, + hideFirstChars: function(n, inner) { + this.lineStart += n; + try { return inner(); } + finally { this.lineStart -= n; } + } + }; +CodeMirror.defineExtension = function(name, fn) { + CodeMirror.prototype[name] = fn; +}; +dom.importCssString(".normal-mode .ace_cursor{\ + border: none;\ + background-color: rgba(255,0,0,0.5);\ +}\ +.normal-mode .ace_hidden-cursors .ace_cursor{\ + background-color: transparent;\ + border: 1px solid red;\ + opacity: 0.7\ +}\ +.ace_dialog {\ + position: absolute;\ + left: 0; right: 0;\ + background: inherit;\ + z-index: 15;\ + padding: .1em .8em;\ + overflow: hidden;\ + color: inherit;\ +}\ +.ace_dialog-top {\ + border-bottom: 1px solid #444;\ + top: 0;\ +}\ +.ace_dialog-bottom {\ + border-top: 1px solid #444;\ + bottom: 0;\ +}\ +.ace_dialog input {\ + border: none;\ + outline: none;\ + background: transparent;\ + width: 20em;\ + color: inherit;\ + font-family: monospace;\ +}", "vimMode", false); +(function() { + function dialogDiv(cm, template, bottom) { + var wrap = cm.ace.container; + var dialog; + dialog = wrap.appendChild(document.createElement("div")); + if (bottom) + dialog.className = "ace_dialog ace_dialog-bottom"; + else + dialog.className = "ace_dialog ace_dialog-top"; + + if (typeof template == "string") { + dialog.innerHTML = template; + } else { // Assuming it's a detached DOM element. + dialog.appendChild(template); + } + return dialog; + } + + function closeNotification(cm, newVal) { + if (cm.state.currentNotificationClose) + cm.state.currentNotificationClose(); + cm.state.currentNotificationClose = newVal; + } + + CodeMirror.defineExtension("openDialog", function(template, callback, options) { + if (this.virtualSelectionMode()) return; + if (!options) options = {}; + + closeNotification(this, null); + + var dialog = dialogDiv(this, template, options.bottom); + var closed = false, me = this; + this.state.dialog = dialog; + function close(newVal) { + if (typeof newVal == 'string') { + inp.value = newVal; + } else { + if (closed) return; + + if (newVal && newVal.type == "blur") { + if (document.activeElement === inp) + return; + } + + if (me.state.dialog == dialog) { + me.state.dialog = null; + me.focus(); + } + closed = true; + dialog.remove(); + + if (options.onClose) options.onClose(dialog); + var cm = me; + if (cm.state.vim) { + cm.state.vim.status = null; + cm.ace._signal("changeStatus"); + cm.ace.renderer.$loop.schedule(cm.ace.renderer.CHANGE_CURSOR); + } + } + } + + var inp = dialog.getElementsByTagName("input")[0], button; + if (inp) { + if (options.value) { + inp.value = options.value; + if (options.selectValueOnOpen !== false) inp.select(); + } + + if (options.onInput) + CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);}); + if (options.onKeyUp) + CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);}); + + CodeMirror.on(inp, "keydown", function(e) { + if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; } + if (e.keyCode == 13) callback(inp.value); + if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { + CodeMirror.e_stop(e); + close(); + } + }); + + if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close); + + inp.focus(); + } else if (button = dialog.getElementsByTagName("button")[0]) { + CodeMirror.on(button, "click", function() { + close(); + me.focus(); + }); + + if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); + + button.focus(); + } + return close; + }); + + CodeMirror.defineExtension("openNotification", function(template, options) { + if (this.virtualSelectionMode()) return; + closeNotification(this, close); + var dialog = dialogDiv(this, template, options && options.bottom); + var closed = false, doneTimer; + var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; + + function close() { + if (closed) return; + closed = true; + clearTimeout(doneTimer); + dialog.remove(); + } + + CodeMirror.on(dialog, 'click', function(e) { + CodeMirror.e_preventDefault(e); + close(); + }); + + if (duration) + doneTimer = setTimeout(close, duration); + + return close; + }); +})(); + + + var Pos = CodeMirror.Pos; + + function transformCursor(cm, range) { + var vim = cm.state.vim; + if (!vim || vim.insertMode) return range.head; + var head = vim.sel.head; + if (!head) return range.head; + + if (vim.visualBlock) { + if (range.head.line != head.line) { + return; + } + } + if (range.from() == range.anchor && !range.empty()) { + if (range.head.line == head.line && range.head.ch != head.ch) + return new Pos(range.head.line, range.head.ch - 1); + } + + return range.head; + } + + var defaultKeymap = [ + { keys: '', type: 'keyToKey', toKeys: 'h' }, + { keys: '', type: 'keyToKey', toKeys: 'l' }, + { keys: '', type: 'keyToKey', toKeys: 'k' }, + { keys: '', type: 'keyToKey', toKeys: 'j' }, + { keys: 'g', type: 'keyToKey', toKeys: 'gk' }, + { keys: 'g', type: 'keyToKey', toKeys: 'gj' }, + { keys: '', type: 'keyToKey', toKeys: 'l' }, + { keys: '', type: 'keyToKey', toKeys: 'h', context: 'normal'}, + { keys: '', type: 'keyToKey', toKeys: 'x', context: 'normal'}, + { keys: '', type: 'keyToKey', toKeys: 'W' }, + { keys: '', type: 'keyToKey', toKeys: 'B', context: 'normal' }, + { keys: '', type: 'keyToKey', toKeys: 'w' }, + { keys: '', type: 'keyToKey', toKeys: 'b', context: 'normal' }, + { keys: '', type: 'keyToKey', toKeys: 'j' }, + { keys: '', type: 'keyToKey', toKeys: 'k' }, + { keys: '', type: 'keyToKey', toKeys: '' }, + { keys: '', type: 'keyToKey', toKeys: '' }, + { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, + { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, + { keys: '', type: 'keyToKey', toKeys: '' }, // ace_patch ipad keyboard sends C-Esc instead of C-[ + { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, + { keys: 's', type: 'keyToKey', toKeys: 'cl', context: 'normal' }, + { keys: 's', type: 'keyToKey', toKeys: 'c', context: 'visual'}, + { keys: 'S', type: 'keyToKey', toKeys: 'cc', context: 'normal' }, + { keys: 'S', type: 'keyToKey', toKeys: 'VdO', context: 'visual' }, + { keys: '', type: 'keyToKey', toKeys: '0' }, + { keys: '', type: 'keyToKey', toKeys: '$' }, + { keys: '', type: 'keyToKey', toKeys: '' }, + { keys: '', type: 'keyToKey', toKeys: '' }, + { keys: '', type: 'keyToKey', toKeys: 'j^', context: 'normal' }, + { keys: '', type: 'keyToKey', toKeys: 'i', context: 'normal'}, + { keys: '', type: 'action', action: 'toggleOverwrite', context: 'insert' }, + { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true }}, + { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true }}, + { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true }}, + { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false }}, + { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true }}, + { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true }}, + { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true }}, + { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true }}, + { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false }}, + { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false }}, + { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true }}, + { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true }}, + { keys: 'E', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true }}, + { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }}, + { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true }}, + { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true }}, + { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true }}, + { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true }}, + { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true }}, + { keys: '(', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: false }}, + { keys: ')', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: true }}, + { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true }}, + { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false }}, + { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true }}, + { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true }}, + { keys: 'gg', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }}, + { keys: 'G', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }}, + {keys: "g$", type: "motion", motion: "moveToEndOfDisplayLine"}, + {keys: "g^", type: "motion", motion: "moveToStartOfDisplayLine"}, + {keys: "g0", type: "motion", motion: "moveToStartOfDisplayLine"}, + { keys: '0', type: 'motion', motion: 'moveToStartOfLine' }, + { keys: '^', type: 'motion', motion: 'moveToFirstNonWhiteSpaceCharacter' }, + { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true }}, + { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar:true }}, + { keys: '_', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true, repeatOffset:-1 }}, + { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true }}, + { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true }}, + { keys: 'f', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true , inclusive: true }}, + { keys: 'F', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false }}, + { keys: 't', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true }}, + { keys: 'T', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false }}, + { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true }}, + { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false }}, + { keys: '\'', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true, linewise: true}}, + { keys: '`', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true}}, + { keys: ']`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } }, + { keys: '[`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } }, + { keys: ']\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } }, + { keys: '[\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } }, + { keys: ']p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true, matchIndent: true}}, + { keys: '[p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true, matchIndent: true}}, + { keys: ']', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true}}, + { keys: '[', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true}}, + { keys: '|', type: 'motion', motion: 'moveToColumn'}, + { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context:'visual'}, + { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: {sameLine: true}, context:'visual'}, + { keys: 'd', type: 'operator', operator: 'delete' }, + { keys: 'y', type: 'operator', operator: 'yank' }, + { keys: 'c', type: 'operator', operator: 'change' }, + { keys: '=', type: 'operator', operator: 'indentAuto' }, + { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true }}, + { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false }}, + { keys: 'g~', type: 'operator', operator: 'changeCase' }, + { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, isEdit: true }, + { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, isEdit: true }, + { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true }}, + { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true }}, + { keys: 'gn', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: true }}, + { keys: 'gN', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: false }}, + { keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false }}, + { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }}, + { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, + { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual'}, + { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'expandToLine', motionArgs: { linewise: true }, context: 'normal'}, + { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual'}, + { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, + { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual'}, + { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal'}, + { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual'}, + { keys: '', type: 'operatorMotion', operator: 'delete', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }, context: 'insert' }, + { keys: '', type: 'idle', context: 'normal' }, + { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true }}, + { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false }}, + { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true }}, + { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true }}, + { keys: 'a', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'charAfter' }, context: 'normal' }, + { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'eol' }, context: 'normal' }, + { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'endOfSelectedArea' }, context: 'visual' }, + { keys: 'i', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'inplace' }, context: 'normal' }, + { keys: 'gi', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'lastEdit' }, context: 'normal' }, + { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank'}, context: 'normal' }, + { keys: 'gI', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'bol'}, context: 'normal' }, + { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'startOfSelectedArea' }, context: 'visual' }, + { keys: 'o', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: true }, context: 'normal' }, + { keys: 'O', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: false }, context: 'normal' }, + { keys: 'v', type: 'action', action: 'toggleVisualMode' }, + { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true }}, + { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }}, + { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }}, + { keys: 'gv', type: 'action', action: 'reselectLastSelection' }, + { keys: 'J', type: 'action', action: 'joinLines', isEdit: true }, + { keys: 'gJ', type: 'action', action: 'joinLines', actionArgs: { keepSpaces: true }, isEdit: true }, + { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true }}, + { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true }}, + { keys: 'r', type: 'action', action: 'replace', isEdit: true }, + { keys: '@', type: 'action', action: 'replayMacro' }, + { keys: 'q', type: 'action', action: 'enterMacroRecordMode' }, + { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }, context: 'normal'}, + { keys: 'R', type: 'operator', operator: 'change', operatorArgs: { linewise: true, fullLine: true }, context: 'visual', exitVisualBlock: true}, + { keys: 'u', type: 'action', action: 'undo', context: 'normal' }, + { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, context: 'visual', isEdit: true }, + { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, context: 'visual', isEdit: true }, + { keys: '', type: 'action', action: 'redo' }, + { keys: 'm', type: 'action', action: 'setMark' }, + { keys: '"', type: 'action', action: 'setRegister' }, + { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }}, + { keys: 'z.', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, + { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }}, + { keys: 'z', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, + { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }}, + { keys: 'zb', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, + { keys: '.', type: 'action', action: 'repeatLastEdit' }, + { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: true, backtrack: false}}, + { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: false, backtrack: false}}, + { keys: '', type: 'action', action: 'indent', actionArgs: { indentRight: true }, context: 'insert' }, + { keys: '', type: 'action', action: 'indent', actionArgs: { indentRight: false }, context: 'insert' }, + { keys: 'a', type: 'motion', motion: 'textObjectManipulation' }, + { keys: 'i', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true }}, + { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }}, + { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }}, + { keys: '*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }}, + { keys: '#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }}, + { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }}, + { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }}, + { keys: ':', type: 'ex' } + ]; + var defaultKeymapLength = defaultKeymap.length; + var defaultExCommandMap = [ + { name: 'colorscheme', shortName: 'colo' }, + { name: 'map' }, + { name: 'imap', shortName: 'im' }, + { name: 'nmap', shortName: 'nm' }, + { name: 'vmap', shortName: 'vm' }, + { name: 'unmap' }, + { name: 'write', shortName: 'w' }, + { name: 'undo', shortName: 'u' }, + { name: 'redo', shortName: 'red' }, + { name: 'set', shortName: 'se' }, + { name: 'setlocal', shortName: 'setl' }, + { name: 'setglobal', shortName: 'setg' }, + { name: 'sort', shortName: 'sor' }, + { name: 'substitute', shortName: 's', possiblyAsync: true }, + { name: 'nohlsearch', shortName: 'noh' }, + { name: 'yank', shortName: 'y' }, + { name: 'delmarks', shortName: 'delm' }, + { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true }, + { name: 'vglobal', shortName: 'v' }, + { name: 'global', shortName: 'g' } + ]; + + var Vim = function() { return vimApi; } //{ + function enterVimMode(cm) { + cm.setOption('disableInput', true); + cm.setOption('showCursorWhenSelecting', false); + CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); + cm.on('cursorActivity', onCursorActivity); + maybeInitVimState(cm); + CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm)); + } + + function leaveVimMode(cm) { + cm.setOption('disableInput', false); + cm.off('cursorActivity', onCursorActivity); + CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm)); + cm.state.vim = null; + } + + function detachVimMap(cm, next) { + if (this == CodeMirror.keyMap.vim) { + cm.options.$customCursor = null; + CodeMirror.rmClass(cm.getWrapperElement(), "cm-fat-cursor"); + } + + if (!next || next.attach != attachVimMap) + leaveVimMode(cm); + } + function attachVimMap(cm, prev) { + if (this == CodeMirror.keyMap.vim) { + if (cm.curOp) cm.curOp.selectionChanged = true; + cm.options.$customCursor = transformCursor; + CodeMirror.addClass(cm.getWrapperElement(), "cm-fat-cursor"); + } + + if (!prev || prev.attach != attachVimMap) + enterVimMode(cm); + } + CodeMirror.defineOption('vimMode', false, function(cm, val, prev) { + if (val && cm.getOption("keyMap") != "vim") + cm.setOption("keyMap", "vim"); + else if (!val && prev != CodeMirror.Init && /^vim/.test(cm.getOption("keyMap"))) + cm.setOption("keyMap", "default"); + }); + + function cmKey(key, cm) { + if (!cm) { return undefined; } + if (this[key]) { return this[key]; } + var vimKey = cmKeyToVimKey(key); + if (!vimKey) { + return false; + } + var cmd = vimApi.findKey(cm, vimKey); + if (typeof cmd == 'function') { + CodeMirror.signal(cm, 'vim-keypress', vimKey); + } + return cmd; + } + + var modifiers = {Shift:'S',Ctrl:'C',Alt:'A',Cmd:'D',Mod:'A',CapsLock:''}; + var specialKeys = {Enter:'CR',Backspace:'BS',Delete:'Del',Insert:'Ins'}; + function cmKeyToVimKey(key) { + if (key.charAt(0) == '\'') { + return key.charAt(1); + } + var pieces = key.split(/-(?!$)/); + var lastPiece = pieces[pieces.length - 1]; + if (pieces.length == 1 && pieces[0].length == 1) { + return false; + } else if (pieces.length == 2 && pieces[0] == 'Shift' && lastPiece.length == 1) { + return false; + } + var hasCharacter = false; + for (var i = 0; i < pieces.length; i++) { + var piece = pieces[i]; + if (piece in modifiers) { pieces[i] = modifiers[piece]; } + else { hasCharacter = true; } + if (piece in specialKeys) { pieces[i] = specialKeys[piece]; } + } + if (!hasCharacter) { + return false; + } + if (isUpperCase(lastPiece)) { + pieces[pieces.length - 1] = lastPiece.toLowerCase(); + } + return '<' + pieces.join('-') + '>'; + } + + function getOnPasteFn(cm) { + var vim = cm.state.vim; + if (!vim.onPasteFn) { + vim.onPasteFn = function() { + if (!vim.insertMode) { + cm.setCursor(offsetCursor(cm.getCursor(), 0, 1)); + actions.enterInsertMode(cm, {}, vim); + } + }; + } + return vim.onPasteFn; + } + + var numberRegex = /[\d]/; + var wordCharTest = [CodeMirror.isWordChar, function(ch) { + return ch && !CodeMirror.isWordChar(ch) && !/\s/.test(ch); + }], bigWordCharTest = [function(ch) { + return /\S/.test(ch); + }]; + function makeKeyRange(start, size) { + var keys = []; + for (var i = start; i < start + size; i++) { + keys.push(String.fromCharCode(i)); + } + return keys; + } + var upperCaseAlphabet = makeKeyRange(65, 26); + var lowerCaseAlphabet = makeKeyRange(97, 26); + var numbers = makeKeyRange(48, 10); + var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']); + var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '"', '.', ':', '_', '/']); + var upperCaseChars; + try { upperCaseChars = new RegExp("^[\\p{Lu}]$", "u"); } + catch (_) { upperCaseChars = /^[A-Z]$/; } + + function isLine(cm, line) { + return line >= cm.firstLine() && line <= cm.lastLine(); + } + function isLowerCase(k) { + return (/^[a-z]$/).test(k); + } + function isMatchableSymbol(k) { + return '()[]{}'.indexOf(k) != -1; + } + function isNumber(k) { + return numberRegex.test(k); + } + function isUpperCase(k) { + return upperCaseChars.test(k); + } + function isWhiteSpaceString(k) { + return (/^\s*$/).test(k); + } + function isEndOfSentenceSymbol(k) { + return '.?!'.indexOf(k) != -1; + } + function inArray(val, arr) { + for (var i = 0; i < arr.length; i++) { + if (arr[i] == val) { + return true; + } + } + return false; + } + + var options = {}; + function defineOption(name, defaultValue, type, aliases, callback) { + if (defaultValue === undefined && !callback) { + throw Error('defaultValue is required unless callback is provided'); + } + if (!type) { type = 'string'; } + options[name] = { + type: type, + defaultValue: defaultValue, + callback: callback + }; + if (aliases) { + for (var i = 0; i < aliases.length; i++) { + options[aliases[i]] = options[name]; + } + } + if (defaultValue) { + setOption(name, defaultValue); + } + } + + function setOption(name, value, cm, cfg) { + var option = options[name]; + cfg = cfg || {}; + var scope = cfg.scope; + if (!option) { + return new Error('Unknown option: ' + name); + } + if (option.type == 'boolean') { + if (value && value !== true) { + return new Error('Invalid argument: ' + name + '=' + value); + } else if (value !== false) { + value = true; + } + } + if (option.callback) { + if (scope !== 'local') { + option.callback(value, undefined); + } + if (scope !== 'global' && cm) { + option.callback(value, cm); + } + } else { + if (scope !== 'local') { + option.value = option.type == 'boolean' ? !!value : value; + } + if (scope !== 'global' && cm) { + cm.state.vim.options[name] = {value: value}; + } + } + } + + function getOption(name, cm, cfg) { + var option = options[name]; + cfg = cfg || {}; + var scope = cfg.scope; + if (!option) { + return new Error('Unknown option: ' + name); + } + if (option.callback) { + var local = cm && option.callback(undefined, cm); + if (scope !== 'global' && local !== undefined) { + return local; + } + if (scope !== 'local') { + return option.callback(); + } + return; + } else { + var local = (scope !== 'global') && (cm && cm.state.vim.options[name]); + return (local || (scope !== 'local') && option || {}).value; + } + } + + defineOption('filetype', undefined, 'string', ['ft'], function(name, cm) { + if (cm === undefined) { + return; + } + if (name === undefined) { + var mode = cm.getOption('mode'); + return mode == 'null' ? '' : mode; + } else { + var mode = name == '' ? 'null' : name; + cm.setOption('mode', mode); + } + }); + + var createCircularJumpList = function() { + var size = 100; + var pointer = -1; + var head = 0; + var tail = 0; + var buffer = new Array(size); + function add(cm, oldCur, newCur) { + var current = pointer % size; + var curMark = buffer[current]; + function useNextSlot(cursor) { + var next = ++pointer % size; + var trashMark = buffer[next]; + if (trashMark) { + trashMark.clear(); + } + buffer[next] = cm.setBookmark(cursor); + } + if (curMark) { + var markPos = curMark.find(); + if (markPos && !cursorEqual(markPos, oldCur)) { + useNextSlot(oldCur); + } + } else { + useNextSlot(oldCur); + } + useNextSlot(newCur); + head = pointer; + tail = pointer - size + 1; + if (tail < 0) { + tail = 0; + } + } + function move(cm, offset) { + pointer += offset; + if (pointer > head) { + pointer = head; + } else if (pointer < tail) { + pointer = tail; + } + var mark = buffer[(size + pointer) % size]; + if (mark && !mark.find()) { + var inc = offset > 0 ? 1 : -1; + var newCur; + var oldCur = cm.getCursor(); + do { + pointer += inc; + mark = buffer[(size + pointer) % size]; + if (mark && + (newCur = mark.find()) && + !cursorEqual(oldCur, newCur)) { + break; + } + } while (pointer < head && pointer > tail); + } + return mark; + } + function find(cm, offset) { + var oldPointer = pointer; + var mark = move(cm, offset); + pointer = oldPointer; + return mark && mark.find(); + } + return { + cachedCursor: undefined, //used for # and * jumps + add: add, + find: find, + move: move + }; + }; + var createInsertModeChanges = function(c) { + if (c) { + return { + changes: c.changes, + expectCursorActivityForChange: c.expectCursorActivityForChange + }; + } + return { + changes: [], + expectCursorActivityForChange: false + }; + }; + + function MacroModeState() { + this.latestRegister = undefined; + this.isPlaying = false; + this.isRecording = false; + this.replaySearchQueries = []; + this.onRecordingDone = undefined; + this.lastInsertModeChanges = createInsertModeChanges(); + } + MacroModeState.prototype = { + exitMacroRecordMode: function() { + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.onRecordingDone) { + macroModeState.onRecordingDone(); // close dialog + } + macroModeState.onRecordingDone = undefined; + macroModeState.isRecording = false; + }, + enterMacroRecordMode: function(cm, registerName) { + var register = + vimGlobalState.registerController.getRegister(registerName); + if (register) { + register.clear(); + this.latestRegister = registerName; + if (cm.openDialog) { + this.onRecordingDone = cm.openDialog( + document.createTextNode('(recording)['+registerName+']'), null, {bottom:true}); + } + this.isRecording = true; + } + } + }; + + function maybeInitVimState(cm) { + if (!cm.state.vim) { + cm.state.vim = { + inputState: new InputState(), + lastEditInputState: undefined, + lastEditActionCommand: undefined, + lastHPos: -1, + lastHSPos: -1, + lastMotion: null, + marks: {}, + insertMode: false, + insertModeRepeat: undefined, + visualMode: false, + visualLine: false, + visualBlock: false, + lastSelection: null, + lastPastedText: null, + sel: {}, + options: {} + }; + } + return cm.state.vim; + } + var vimGlobalState; + function resetVimGlobalState() { + vimGlobalState = { + searchQuery: null, + searchIsReversed: false, + lastSubstituteReplacePart: undefined, + jumpList: createCircularJumpList(), + macroModeState: new MacroModeState, + lastCharacterSearch: {increment:0, forward:true, selectedCharacter:''}, + registerController: new RegisterController({}), + searchHistoryController: new HistoryController(), + exCommandHistoryController : new HistoryController() + }; + for (var optionName in options) { + var option = options[optionName]; + option.value = option.defaultValue; + } + } + + var lastInsertModeKeyTimer; + var vimApi= { + buildKeyMap: function() { + }, + getRegisterController: function() { + return vimGlobalState.registerController; + }, + resetVimGlobalState_: resetVimGlobalState, + getVimGlobalState_: function() { + return vimGlobalState; + }, + maybeInitVimState_: maybeInitVimState, + + suppressErrorLogging: false, + + InsertModeKey: InsertModeKey, + map: function(lhs, rhs, ctx) { + exCommandDispatcher.map(lhs, rhs, ctx); + }, + unmap: function(lhs, ctx) { + return exCommandDispatcher.unmap(lhs, ctx); + }, + noremap: function(lhs, rhs, ctx) { + function toCtxArray(ctx) { + return ctx ? [ctx] : ['normal', 'insert', 'visual']; + } + var ctxsToMap = toCtxArray(ctx); + var actualLength = defaultKeymap.length, origLength = defaultKeymapLength; + for (var i = actualLength - origLength; + i < actualLength && ctxsToMap.length; + i++) { + var mapping = defaultKeymap[i]; + if (mapping.keys == rhs && + (!ctx || !mapping.context || mapping.context === ctx) && + mapping.type.substr(0, 2) !== 'ex' && + mapping.type.substr(0, 3) !== 'key') { + var newMapping = {}; + for (var key in mapping) { + newMapping[key] = mapping[key]; + } + newMapping.keys = lhs; + if (ctx && !newMapping.context) { + newMapping.context = ctx; + } + this._mapCommand(newMapping); + var mappedCtxs = toCtxArray(mapping.context); + ctxsToMap = ctxsToMap.filter(function(el) { return mappedCtxs.indexOf(el) === -1; }); + } + } + }, + mapclear: function(ctx) { + var actualLength = defaultKeymap.length, + origLength = defaultKeymapLength; + var userKeymap = defaultKeymap.slice(0, actualLength - origLength); + defaultKeymap = defaultKeymap.slice(actualLength - origLength); + if (ctx) { + for (var i = userKeymap.length - 1; i >= 0; i--) { + var mapping = userKeymap[i]; + if (ctx !== mapping.context) { + if (mapping.context) { + this._mapCommand(mapping); + } else { + var contexts = ['normal', 'insert', 'visual']; + for (var j in contexts) { + if (contexts[j] !== ctx) { + var newMapping = {}; + for (var key in mapping) { + newMapping[key] = mapping[key]; + } + newMapping.context = contexts[j]; + this._mapCommand(newMapping); + } + } + } + } + } + } + }, + setOption: setOption, + getOption: getOption, + defineOption: defineOption, + defineEx: function(name, prefix, func){ + if (!prefix) { + prefix = name; + } else if (name.indexOf(prefix) !== 0) { + throw new Error('(Vim.defineEx) "'+prefix+'" is not a prefix of "'+name+'", command not registered'); + } + exCommands[name]=func; + exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'}; + }, + handleKey: function (cm, key, origin) { + var command = this.findKey(cm, key, origin); + if (typeof command === 'function') { + return command(); + } + }, + findKey: function(cm, key, origin) { + var vim = maybeInitVimState(cm); + function handleMacroRecording() { + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isRecording) { + if (key == 'q') { + macroModeState.exitMacroRecordMode(); + clearInputState(cm); + return true; + } + if (origin != 'mapping') { + logKey(macroModeState, key); + } + } + } + function handleEsc() { + if (key == '') { + clearInputState(cm); + if (vim.visualMode) { + exitVisualMode(cm); + } else if (vim.insertMode) { + exitInsertMode(cm); + } + return true; + } + } + function doKeyToKey(keys) { + var match; + while (keys) { + match = (/<\w+-.+?>|<\w+>|./).exec(keys); + key = match[0]; + keys = keys.substring(match.index + key.length); + vimApi.handleKey(cm, key, 'mapping'); + } + } + + function handleKeyInsertMode() { + if (handleEsc()) { return true; } + var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; + var keysAreChars = key.length == 1; + var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); + while (keys.length > 1 && match.type != 'full') { + var keys = vim.inputState.keyBuffer = keys.slice(1); + var thisMatch = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); + if (thisMatch.type != 'none') { match = thisMatch; } + } + if (match.type == 'none') { clearInputState(cm); return false; } + else if (match.type == 'partial') { + if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); } + lastInsertModeKeyTimer = window.setTimeout( + function() { if (vim.insertMode && vim.inputState.keyBuffer) { clearInputState(cm); } }, + getOption('insertModeEscKeysTimeout')); + return !keysAreChars; + } + + if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); } + if (keysAreChars) { + var selections = cm.listSelections(); + for (var i = 0; i < selections.length; i++) { + var here = selections[i].head; + cm.replaceRange('', offsetCursor(here, 0, -(keys.length - 1)), here, '+input'); + } + vimGlobalState.macroModeState.lastInsertModeChanges.changes.pop(); + } + clearInputState(cm); + return match.command; + } + + function handleKeyNonInsertMode() { + if (handleMacroRecording() || handleEsc()) { return true; } + + var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; + if (/^[1-9]\d*$/.test(keys)) { return true; } + + var keysMatcher = /^(\d*)(.*)$/.exec(keys); + if (!keysMatcher) { clearInputState(cm); return false; } + var context = vim.visualMode ? 'visual' : + 'normal'; + var mainKey = keysMatcher[2] || keysMatcher[1]; + if (vim.inputState.operatorShortcut && vim.inputState.operatorShortcut.slice(-1) == mainKey) { + mainKey = vim.inputState.operatorShortcut; + } + var match = commandDispatcher.matchCommand(mainKey, defaultKeymap, vim.inputState, context); + if (match.type == 'none') { clearInputState(cm); return false; } + else if (match.type == 'partial') { return true; } + else if (match.type == 'clear') { clearInputState(cm); return true; } // ace_patch + + vim.inputState.keyBuffer = ''; + var keysMatcher = /^(\d*)(.*)$/.exec(keys); + if (keysMatcher[1] && keysMatcher[1] != '0') { + vim.inputState.pushRepeatDigit(keysMatcher[1]); + } + return match.command; + } + + var command; + if (vim.insertMode) { command = handleKeyInsertMode(); } + else { command = handleKeyNonInsertMode(); } + if (command === false) { + return undefined; //ace_patch + } else if (command === true) { + return function() { return true; }; + } else { + return function() { + if ((command.operator || command.isEdit) && cm.getOption('readOnly')) + return; // ace_patch + return cm.operation(function() { + cm.curOp.isVimOp = true; + try { + if (command.type == 'keyToKey') { + doKeyToKey(command.toKeys); + } else { + commandDispatcher.processCommand(cm, vim, command); + } + } catch (e) { + cm.state.vim = undefined; + maybeInitVimState(cm); + if (!vimApi.suppressErrorLogging) { + console['log'](e); + } + throw e; + } + return true; + }); + }; + } + }, + handleEx: function(cm, input) { + exCommandDispatcher.processCommand(cm, input); + }, + + defineMotion: defineMotion, + defineAction: defineAction, + defineOperator: defineOperator, + mapCommand: mapCommand, + _mapCommand: _mapCommand, + + defineRegister: defineRegister, + + exitVisualMode: exitVisualMode, + exitInsertMode: exitInsertMode + }; + function InputState() { + this.prefixRepeat = []; + this.motionRepeat = []; + + this.operator = null; + this.operatorArgs = null; + this.motion = null; + this.motionArgs = null; + this.keyBuffer = []; // For matching multi-key commands. + this.registerName = null; // Defaults to the unnamed register. + } + InputState.prototype.pushRepeatDigit = function(n) { + if (!this.operator) { + this.prefixRepeat = this.prefixRepeat.concat(n); + } else { + this.motionRepeat = this.motionRepeat.concat(n); + } + }; + InputState.prototype.getRepeat = function() { + var repeat = 0; + if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) { + repeat = 1; + if (this.prefixRepeat.length > 0) { + repeat *= parseInt(this.prefixRepeat.join(''), 10); + } + if (this.motionRepeat.length > 0) { + repeat *= parseInt(this.motionRepeat.join(''), 10); + } + } + return repeat; + }; + + function clearInputState(cm, reason) { + cm.state.vim.inputState = new InputState(); + CodeMirror.signal(cm, 'vim-command-done', reason); + } + function Register(text, linewise, blockwise) { + this.clear(); + this.keyBuffer = [text || '']; + this.insertModeChanges = []; + this.searchQueries = []; + this.linewise = !!linewise; + this.blockwise = !!blockwise; + } + Register.prototype = { + setText: function(text, linewise, blockwise) { + this.keyBuffer = [text || '']; + this.linewise = !!linewise; + this.blockwise = !!blockwise; + }, + pushText: function(text, linewise) { + if (linewise) { + if (!this.linewise) { + this.keyBuffer.push('\n'); + } + this.linewise = true; + } + this.keyBuffer.push(text); + }, + pushInsertModeChanges: function(changes) { + this.insertModeChanges.push(createInsertModeChanges(changes)); + }, + pushSearchQuery: function(query) { + this.searchQueries.push(query); + }, + clear: function() { + this.keyBuffer = []; + this.insertModeChanges = []; + this.searchQueries = []; + this.linewise = false; + }, + toString: function() { + return this.keyBuffer.join(''); + } + }; + function defineRegister(name, register) { + var registers = vimGlobalState.registerController.registers; + if (!name || name.length != 1) { + throw Error('Register name must be 1 character'); + } + registers[name] = register; + validRegisters.push(name); + } + function RegisterController(registers) { + this.registers = registers; + this.unnamedRegister = registers['"'] = new Register(); + registers['.'] = new Register(); + registers[':'] = new Register(); + registers['/'] = new Register(); + } + RegisterController.prototype = { + pushText: function(registerName, operator, text, linewise, blockwise) { + if (registerName === '_') return; + if (linewise && text.charAt(text.length - 1) !== '\n'){ + text += '\n'; + } + var register = this.isValidRegister(registerName) ? + this.getRegister(registerName) : null; + if (!register) { + switch (operator) { + case 'yank': + this.registers['0'] = new Register(text, linewise, blockwise); + break; + case 'delete': + case 'change': + if (text.indexOf('\n') == -1) { + this.registers['-'] = new Register(text, linewise); + } else { + this.shiftNumericRegisters_(); + this.registers['1'] = new Register(text, linewise); + } + break; + } + this.unnamedRegister.setText(text, linewise, blockwise); + return; + } + var append = isUpperCase(registerName); + if (append) { + register.pushText(text, linewise); + } else { + register.setText(text, linewise, blockwise); + } + this.unnamedRegister.setText(register.toString(), linewise); + }, + getRegister: function(name) { + if (!this.isValidRegister(name)) { + return this.unnamedRegister; + } + name = name.toLowerCase(); + if (!this.registers[name]) { + this.registers[name] = new Register(); + } + return this.registers[name]; + }, + isValidRegister: function(name) { + return name && inArray(name, validRegisters); + }, + shiftNumericRegisters_: function() { + for (var i = 9; i >= 2; i--) { + this.registers[i] = this.getRegister('' + (i - 1)); + } + } + }; + function HistoryController() { + this.historyBuffer = []; + this.iterator = 0; + this.initialPrefix = null; + } + HistoryController.prototype = { + nextMatch: function (input, up) { + var historyBuffer = this.historyBuffer; + var dir = up ? -1 : 1; + if (this.initialPrefix === null) this.initialPrefix = input; + for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i+= dir) { + var element = historyBuffer[i]; + for (var j = 0; j <= element.length; j++) { + if (this.initialPrefix == element.substring(0, j)) { + this.iterator = i; + return element; + } + } + } + if (i >= historyBuffer.length) { + this.iterator = historyBuffer.length; + return this.initialPrefix; + } + if (i < 0 ) return input; + }, + pushInput: function(input) { + var index = this.historyBuffer.indexOf(input); + if (index > -1) this.historyBuffer.splice(index, 1); + if (input.length) this.historyBuffer.push(input); + }, + reset: function() { + this.initialPrefix = null; + this.iterator = this.historyBuffer.length; + } + }; + var commandDispatcher = { + matchCommand: function(keys, keyMap, inputState, context) { + var matches = commandMatches(keys, keyMap, context, inputState); + if (!matches.full && !matches.partial) { + return {type: 'none'}; + } else if (!matches.full && matches.partial) { + return {type: 'partial'}; + } + + var bestMatch; + for (var i = 0; i < matches.full.length; i++) { + var match = matches.full[i]; + if (!bestMatch) { + bestMatch = match; + } + } + if (bestMatch.keys.slice(-11) == '') { + var character = lastChar(keys); + if (!character || character.length > 1) return {type: 'clear'}; //ace_patch + inputState.selectedCharacter = character; + } + return {type: 'full', command: bestMatch}; + }, + processCommand: function(cm, vim, command) { + vim.inputState.repeatOverride = command.repeatOverride; + switch (command.type) { + case 'motion': + this.processMotion(cm, vim, command); + break; + case 'operator': + this.processOperator(cm, vim, command); + break; + case 'operatorMotion': + this.processOperatorMotion(cm, vim, command); + break; + case 'action': + this.processAction(cm, vim, command); + break; + case 'search': + this.processSearch(cm, vim, command); + break; + case 'ex': + case 'keyToEx': + this.processEx(cm, vim, command); + break; + default: + break; + } + }, + processMotion: function(cm, vim, command) { + vim.inputState.motion = command.motion; + vim.inputState.motionArgs = copyArgs(command.motionArgs); + this.evalInput(cm, vim); + }, + processOperator: function(cm, vim, command) { + var inputState = vim.inputState; + if (inputState.operator) { + if (inputState.operator == command.operator) { + inputState.motion = 'expandToLine'; + inputState.motionArgs = { linewise: true }; + this.evalInput(cm, vim); + return; + } else { + clearInputState(cm); + } + } + inputState.operator = command.operator; + inputState.operatorArgs = copyArgs(command.operatorArgs); + if (command.keys.length > 1) { + inputState.operatorShortcut = command.keys; + } + if (command.exitVisualBlock) { + vim.visualBlock = false; + updateCmSelection(cm); + } + if (vim.visualMode) { + this.evalInput(cm, vim); + } + }, + processOperatorMotion: function(cm, vim, command) { + var visualMode = vim.visualMode; + var operatorMotionArgs = copyArgs(command.operatorMotionArgs); + if (operatorMotionArgs) { + if (visualMode && operatorMotionArgs.visualLine) { + vim.visualLine = true; + } + } + this.processOperator(cm, vim, command); + if (!visualMode) { + this.processMotion(cm, vim, command); + } + }, + processAction: function(cm, vim, command) { + var inputState = vim.inputState; + var repeat = inputState.getRepeat(); + var repeatIsExplicit = !!repeat; + var actionArgs = copyArgs(command.actionArgs) || {}; + if (inputState.selectedCharacter) { + actionArgs.selectedCharacter = inputState.selectedCharacter; + } + if (command.operator) { + this.processOperator(cm, vim, command); + } + if (command.motion) { + this.processMotion(cm, vim, command); + } + if (command.motion || command.operator) { + this.evalInput(cm, vim); + } + actionArgs.repeat = repeat || 1; + actionArgs.repeatIsExplicit = repeatIsExplicit; + actionArgs.registerName = inputState.registerName; + clearInputState(cm); + vim.lastMotion = null; + if (command.isEdit) { + this.recordLastEdit(vim, inputState, command); + } + actions[command.action](cm, actionArgs, vim); + }, + processSearch: function(cm, vim, command) { + if (!cm.getSearchCursor) { + return; + } + var forward = command.searchArgs.forward; + var wholeWordOnly = command.searchArgs.wholeWordOnly; + getSearchState(cm).setReversed(!forward); + var promptPrefix = (forward) ? '/' : '?'; + var originalQuery = getSearchState(cm).getQuery(); + var originalScrollPos = cm.getScrollInfo(); + function handleQuery(query, ignoreCase, smartCase) { + vimGlobalState.searchHistoryController.pushInput(query); + vimGlobalState.searchHistoryController.reset(); + try { + updateSearchQuery(cm, query, ignoreCase, smartCase); + } catch (e) { + showConfirm(cm, 'Invalid regex: ' + query); + clearInputState(cm); + return; + } + commandDispatcher.processMotion(cm, vim, { + type: 'motion', + motion: 'findNext', + motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist } + }); + } + function onPromptClose(query) { + handleQuery(query, true /** ignoreCase */, true /** smartCase */); + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isRecording) { + logSearchQuery(macroModeState, query); + } + } + function onPromptKeyUp(e, query, close) { + var keyName = CodeMirror.keyName(e), up, offset; + if (keyName == 'Up' || keyName == 'Down') { + up = keyName == 'Up' ? true : false; + offset = e.target ? e.target.selectionEnd : 0; + query = vimGlobalState.searchHistoryController.nextMatch(query, up) || ''; + close(query); + if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length); + } else { + if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') + vimGlobalState.searchHistoryController.reset(); + } + var parsedQuery; + try { + parsedQuery = updateSearchQuery(cm, query, + true /** ignoreCase */, true /** smartCase */); + } catch (e) { + } + if (parsedQuery) { + cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30); + } else { + clearSearchHighlight(cm); + cm.scrollTo(originalScrollPos.left, originalScrollPos.top); + } + } + function onPromptKeyDown(e, query, close) { + var keyName = CodeMirror.keyName(e); + if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || + (keyName == 'Backspace' && query == '')) { + vimGlobalState.searchHistoryController.pushInput(query); + vimGlobalState.searchHistoryController.reset(); + updateSearchQuery(cm, originalQuery); + clearSearchHighlight(cm); + cm.scrollTo(originalScrollPos.left, originalScrollPos.top); + CodeMirror.e_stop(e); + clearInputState(cm); + close(); + cm.focus(); + } else if (keyName == 'Up' || keyName == 'Down') { + CodeMirror.e_stop(e); + } else if (keyName == 'Ctrl-U') { + CodeMirror.e_stop(e); + close(''); + } + } + switch (command.searchArgs.querySrc) { + case 'prompt': + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isPlaying) { + var query = macroModeState.replaySearchQueries.shift(); + handleQuery(query, true /** ignoreCase */, false /** smartCase */); + } else { + showPrompt(cm, { + onClose: onPromptClose, + prefix: promptPrefix, + desc: '(JavaScript regexp)', + onKeyUp: onPromptKeyUp, + onKeyDown: onPromptKeyDown + }); + } + break; + case 'wordUnderCursor': + var word = expandWordUnderCursor(cm, false /** inclusive */, + true /** forward */, false /** bigWord */, + true /** noSymbol */); + var isKeyword = true; + if (!word) { + word = expandWordUnderCursor(cm, false /** inclusive */, + true /** forward */, false /** bigWord */, + false /** noSymbol */); + isKeyword = false; + } + if (!word) { + return; + } + var query = cm.getLine(word.start.line).substring(word.start.ch, + word.end.ch); + if (isKeyword && wholeWordOnly) { + query = '\\b' + query + '\\b'; + } else { + query = escapeRegex(query); + } + vimGlobalState.jumpList.cachedCursor = cm.getCursor(); + cm.setCursor(word.start); + + handleQuery(query, true /** ignoreCase */, false /** smartCase */); + break; + } + }, + processEx: function(cm, vim, command) { + function onPromptClose(input) { + vimGlobalState.exCommandHistoryController.pushInput(input); + vimGlobalState.exCommandHistoryController.reset(); + exCommandDispatcher.processCommand(cm, input); + } + function onPromptKeyDown(e, input, close) { + var keyName = CodeMirror.keyName(e), up, offset; + if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || + (keyName == 'Backspace' && input == '')) { + vimGlobalState.exCommandHistoryController.pushInput(input); + vimGlobalState.exCommandHistoryController.reset(); + CodeMirror.e_stop(e); + clearInputState(cm); + close(); + cm.focus(); + } + if (keyName == 'Up' || keyName == 'Down') { + CodeMirror.e_stop(e); + up = keyName == 'Up' ? true : false; + offset = e.target ? e.target.selectionEnd : 0; + input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || ''; + close(input); + if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length); + } else if (keyName == 'Ctrl-U') { + CodeMirror.e_stop(e); + close(''); + } else { + if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') + vimGlobalState.exCommandHistoryController.reset(); + } + } + if (command.type == 'keyToEx') { + exCommandDispatcher.processCommand(cm, command.exArgs.input); + } else { + if (vim.visualMode) { + showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\'<,\'>', + onKeyDown: onPromptKeyDown, selectValueOnOpen: false}); + } else { + showPrompt(cm, { onClose: onPromptClose, prefix: ':', + onKeyDown: onPromptKeyDown}); + } + } + }, + evalInput: function(cm, vim) { + var inputState = vim.inputState; + var motion = inputState.motion; + var motionArgs = inputState.motionArgs || {}; + var operator = inputState.operator; + var operatorArgs = inputState.operatorArgs || {}; + var registerName = inputState.registerName; + var sel = vim.sel; + var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head): cm.getCursor('head')); + var origAnchor = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.anchor) : cm.getCursor('anchor')); + var oldHead = copyCursor(origHead); + var oldAnchor = copyCursor(origAnchor); + var newHead, newAnchor; + var repeat; + if (operator) { + this.recordLastEdit(vim, inputState); + } + if (inputState.repeatOverride !== undefined) { + repeat = inputState.repeatOverride; + } else { + repeat = inputState.getRepeat(); + } + if (repeat > 0 && motionArgs.explicitRepeat) { + motionArgs.repeatIsExplicit = true; + } else if (motionArgs.noRepeat || + (!motionArgs.explicitRepeat && repeat === 0)) { + repeat = 1; + motionArgs.repeatIsExplicit = false; + } + if (inputState.selectedCharacter) { + motionArgs.selectedCharacter = operatorArgs.selectedCharacter = + inputState.selectedCharacter; + } + motionArgs.repeat = repeat; + clearInputState(cm); + if (motion) { + var motionResult = motions[motion](cm, origHead, motionArgs, vim, inputState); + vim.lastMotion = motions[motion]; + if (!motionResult) { + return; + } + if (motionArgs.toJumplist) { + if (!operator && cm.ace.curOp != null) + cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace_patch + var jumpList = vimGlobalState.jumpList; + var cachedCursor = jumpList.cachedCursor; + if (cachedCursor) { + recordJumpPosition(cm, cachedCursor, motionResult); + delete jumpList.cachedCursor; + } else { + recordJumpPosition(cm, origHead, motionResult); + } + } + if (motionResult instanceof Array) { + newAnchor = motionResult[0]; + newHead = motionResult[1]; + } else { + newHead = motionResult; + } + if (!newHead) { + newHead = copyCursor(origHead); + } + if (vim.visualMode) { + if (!(vim.visualBlock && newHead.ch === Infinity)) { + newHead = clipCursorToContent(cm, newHead); + } + if (newAnchor) { + newAnchor = clipCursorToContent(cm, newAnchor); + } + newAnchor = newAnchor || oldAnchor; + sel.anchor = newAnchor; + sel.head = newHead; + updateCmSelection(cm); + updateMark(cm, vim, '<', + cursorIsBefore(newAnchor, newHead) ? newAnchor + : newHead); + updateMark(cm, vim, '>', + cursorIsBefore(newAnchor, newHead) ? newHead + : newAnchor); + } else if (!operator) { + newHead = clipCursorToContent(cm, newHead); + cm.setCursor(newHead.line, newHead.ch); + } + } + if (operator) { + if (operatorArgs.lastSel) { + newAnchor = oldAnchor; + var lastSel = operatorArgs.lastSel; + var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line); + var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch); + if (lastSel.visualLine) { + newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + } else if (lastSel.visualBlock) { + newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset); + } else if (lastSel.head.line == lastSel.anchor.line) { + newHead = new Pos(oldAnchor.line, oldAnchor.ch + chOffset); + } else { + newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + } + vim.visualMode = true; + vim.visualLine = lastSel.visualLine; + vim.visualBlock = lastSel.visualBlock; + sel = vim.sel = { + anchor: newAnchor, + head: newHead + }; + updateCmSelection(cm); + } else if (vim.visualMode) { + operatorArgs.lastSel = { + anchor: copyCursor(sel.anchor), + head: copyCursor(sel.head), + visualBlock: vim.visualBlock, + visualLine: vim.visualLine + }; + } + var curStart, curEnd, linewise, mode; + var cmSel; + if (vim.visualMode) { + curStart = cursorMin(sel.head, sel.anchor); + curEnd = cursorMax(sel.head, sel.anchor); + linewise = vim.visualLine || operatorArgs.linewise; + mode = vim.visualBlock ? 'block' : + linewise ? 'line' : + 'char'; + cmSel = makeCmSelection(cm, { + anchor: curStart, + head: curEnd + }, mode); + if (linewise) { + var ranges = cmSel.ranges; + if (mode == 'block') { + for (var i = 0; i < ranges.length; i++) { + ranges[i].head.ch = lineLength(cm, ranges[i].head.line); + } + } else if (mode == 'line') { + ranges[0].head = new Pos(ranges[0].head.line + 1, 0); + } + } + } else { + curStart = copyCursor(newAnchor || oldAnchor); + curEnd = copyCursor(newHead || oldHead); + if (cursorIsBefore(curEnd, curStart)) { + var tmp = curStart; + curStart = curEnd; + curEnd = tmp; + } + linewise = motionArgs.linewise || operatorArgs.linewise; + if (linewise) { + expandSelectionToLine(cm, curStart, curEnd); + } else if (motionArgs.forward) { + clipToLine(cm, curStart, curEnd); + } + mode = 'char'; + var exclusive = !motionArgs.inclusive || linewise; + cmSel = makeCmSelection(cm, { + anchor: curStart, + head: curEnd + }, mode, exclusive); + } + cm.setSelections(cmSel.ranges, cmSel.primary); + vim.lastMotion = null; + operatorArgs.repeat = repeat; // For indent in visual mode. + operatorArgs.registerName = registerName; + operatorArgs.linewise = linewise; + var operatorMoveTo = operators[operator]( + cm, operatorArgs, cmSel.ranges, oldAnchor, newHead); + if (vim.visualMode) { + exitVisualMode(cm, operatorMoveTo != null); + } + if (operatorMoveTo) { + cm.setCursor(operatorMoveTo); + } + } + }, + recordLastEdit: function(vim, inputState, actionCommand) { + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isPlaying) { return; } + vim.lastEditInputState = inputState; + vim.lastEditActionCommand = actionCommand; + macroModeState.lastInsertModeChanges.changes = []; + macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false; + macroModeState.lastInsertModeChanges.visualBlock = vim.visualBlock ? vim.sel.head.line - vim.sel.anchor.line : 0; + } + }; + var motions = { + moveToTopLine: function(cm, _head, motionArgs) { + var line = getUserVisibleLines(cm).top + motionArgs.repeat -1; + return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); + }, + moveToMiddleLine: function(cm) { + var range = getUserVisibleLines(cm); + var line = Math.floor((range.top + range.bottom) * 0.5); + return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); + }, + moveToBottomLine: function(cm, _head, motionArgs) { + var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1; + return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); + }, + expandToLine: function(_cm, head, motionArgs) { + var cur = head; + return new Pos(cur.line + motionArgs.repeat - 1, Infinity); + }, + findNext: function(cm, _head, motionArgs) { + var state = getSearchState(cm); + var query = state.getQuery(); + if (!query) { + return; + } + var prev = !motionArgs.forward; + prev = (state.isReversed()) ? !prev : prev; + highlightSearchMatches(cm, query); + return findNext(cm, prev/** prev */, query, motionArgs.repeat); + }, + findAndSelectNextInclusive: function(cm, _head, motionArgs, vim, prevInputState) { + var state = getSearchState(cm); + var query = state.getQuery(); + + if (!query) { + return; + } + + var prev = !motionArgs.forward; + prev = (state.isReversed()) ? !prev : prev; + var next = findNextFromAndToInclusive(cm, prev, query, motionArgs.repeat, vim); + if (!next) { + return; + } + if (prevInputState.operator) { + return next; + } + + var from = next[0]; + var to = new Pos(next[1].line, next[1].ch - 1); + + if (vim.visualMode) { + if (vim.visualLine || vim.visualBlock) { + vim.visualLine = false; + vim.visualBlock = false; + CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: ""}); + } + var anchor = vim.sel.anchor; + if (anchor) { + if (state.isReversed()) { + if (motionArgs.forward) { + return [anchor, from]; + } + + return [anchor, to]; + } else { + if (motionArgs.forward) { + return [anchor, to]; + } + + return [anchor, from]; + } + } + } else { + vim.visualMode = true; + vim.visualLine = false; + vim.visualBlock = false; + CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: ""}); + } + + return prev ? [to, from] : [from, to]; + }, + goToMark: function(cm, _head, motionArgs, vim) { + var pos = getMarkPos(cm, vim, motionArgs.selectedCharacter); + if (pos) { + return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos; + } + return null; + }, + moveToOtherHighlightedEnd: function(cm, _head, motionArgs, vim) { + if (vim.visualBlock && motionArgs.sameLine) { + var sel = vim.sel; + return [ + clipCursorToContent(cm, new Pos(sel.anchor.line, sel.head.ch)), + clipCursorToContent(cm, new Pos(sel.head.line, sel.anchor.ch)) + ]; + } else { + return ([vim.sel.head, vim.sel.anchor]); + } + }, + jumpToMark: function(cm, head, motionArgs, vim) { + var best = head; + for (var i = 0; i < motionArgs.repeat; i++) { + var cursor = best; + for (var key in vim.marks) { + if (!isLowerCase(key)) { + continue; + } + var mark = vim.marks[key].find(); + var isWrongDirection = (motionArgs.forward) ? + cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark); + + if (isWrongDirection) { + continue; + } + if (motionArgs.linewise && (mark.line == cursor.line)) { + continue; + } + + var equal = cursorEqual(cursor, best); + var between = (motionArgs.forward) ? + cursorIsBetween(cursor, mark, best) : + cursorIsBetween(best, mark, cursor); + + if (equal || between) { + best = mark; + } + } + } + + if (motionArgs.linewise) { + best = new Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line))); + } + return best; + }, + moveByCharacters: function(_cm, head, motionArgs) { + var cur = head; + var repeat = motionArgs.repeat; + var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat; + return new Pos(cur.line, ch); + }, + moveByLines: function(cm, head, motionArgs, vim) { + var cur = head; + var endCh = cur.ch; + switch (vim.lastMotion) { + case this.moveByLines: + case this.moveByDisplayLines: + case this.moveByScroll: + case this.moveToColumn: + case this.moveToEol: + endCh = vim.lastHPos; + break; + default: + vim.lastHPos = endCh; + } + var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0); + var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat; + var first = cm.firstLine(); + var last = cm.lastLine(); + if (line < first && cur.line == first){ + return this.moveToStartOfLine(cm, head, motionArgs, vim); + } else if (line > last && cur.line == last){ + return moveToEol(cm, head, motionArgs, vim, true); + } + var fold = cm.ace.session.getFoldLine(line); + if (fold) { + if (motionArgs.forward) { + if (line > fold.start.row) + line = fold.end.row + 1; + } else { + line = fold.start.row; + } + } + if (motionArgs.toFirstChar){ + endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line)); + vim.lastHPos = endCh; + } + vim.lastHSPos = cm.charCoords(new Pos(line, endCh),'div').left; + return new Pos(line, endCh); + }, + moveByDisplayLines: function(cm, head, motionArgs, vim) { + var cur = head; + switch (vim.lastMotion) { + case this.moveByDisplayLines: + case this.moveByScroll: + case this.moveByLines: + case this.moveToColumn: + case this.moveToEol: + break; + default: + vim.lastHSPos = cm.charCoords(cur,'div').left; + } + var repeat = motionArgs.repeat; + var res=cm.findPosV(cur,(motionArgs.forward ? repeat : -repeat),'line',vim.lastHSPos); + if (res.hitSide) { + if (motionArgs.forward) { + var lastCharCoords = cm.charCoords(res, 'div'); + var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos }; + var res = cm.coordsChar(goalCoords, 'div'); + } else { + var resCoords = cm.charCoords(new Pos(cm.firstLine(), 0), 'div'); + resCoords.left = vim.lastHSPos; + res = cm.coordsChar(resCoords, 'div'); + } + } + vim.lastHPos = res.ch; + return res; + }, + moveByPage: function(cm, head, motionArgs) { + var curStart = head; + var repeat = motionArgs.repeat; + return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page'); + }, + moveByParagraph: function(cm, head, motionArgs) { + var dir = motionArgs.forward ? 1 : -1; + return findParagraph(cm, head, motionArgs.repeat, dir); + }, + moveBySentence: function(cm, head, motionArgs) { + var dir = motionArgs.forward ? 1 : -1; + return findSentence(cm, head, motionArgs.repeat, dir); + }, + moveByScroll: function(cm, head, motionArgs, vim) { + var scrollbox = cm.getScrollInfo(); + var curEnd = null; + var repeat = motionArgs.repeat; + if (!repeat) { + repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight()); + } + var orig = cm.charCoords(head, 'local'); + motionArgs.repeat = repeat; + var curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim); + if (!curEnd) { + return null; + } + var dest = cm.charCoords(curEnd, 'local'); + cm.scrollTo(null, scrollbox.top + dest.top - orig.top); + return curEnd; + }, + moveByWords: function(cm, head, motionArgs) { + return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward, + !!motionArgs.wordEnd, !!motionArgs.bigWord); + }, + moveTillCharacter: function(cm, _head, motionArgs) { + var repeat = motionArgs.repeat; + var curEnd = moveToCharacter(cm, repeat, motionArgs.forward, + motionArgs.selectedCharacter); + var increment = motionArgs.forward ? -1 : 1; + recordLastCharacterSearch(increment, motionArgs); + if (!curEnd) return null; + curEnd.ch += increment; + return curEnd; + }, + moveToCharacter: function(cm, head, motionArgs) { + var repeat = motionArgs.repeat; + recordLastCharacterSearch(0, motionArgs); + return moveToCharacter(cm, repeat, motionArgs.forward, + motionArgs.selectedCharacter) || head; + }, + moveToSymbol: function(cm, head, motionArgs) { + var repeat = motionArgs.repeat; + return findSymbol(cm, repeat, motionArgs.forward, + motionArgs.selectedCharacter) || head; + }, + moveToColumn: function(cm, head, motionArgs, vim) { + var repeat = motionArgs.repeat; + vim.lastHPos = repeat - 1; + vim.lastHSPos = cm.charCoords(head,'div').left; + return moveToColumn(cm, repeat); + }, + moveToEol: function(cm, head, motionArgs, vim) { + return moveToEol(cm, head, motionArgs, vim, false); + }, + moveToFirstNonWhiteSpaceCharacter: function(cm, head) { + var cursor = head; + return new Pos(cursor.line, + findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line))); + }, + moveToMatchedSymbol: function(cm, head) { + var cursor = head; + var line = cursor.line; + var ch = cursor.ch; + var lineText = cm.getLine(line); + var symbol; + for (; ch < lineText.length; ch++) { + symbol = lineText.charAt(ch); + if (symbol && isMatchableSymbol(symbol)) { + var style = cm.getTokenTypeAt(new Pos(line, ch + 1)); + if (style !== "string" && style !== "comment") { + break; + } + } + } + if (ch < lineText.length) { + var re = /[<>]/.test(lineText[ch]) ? /[(){}[\]<>]/ : /[(){}[\]]/; //ace_patch? + var matched = cm.findMatchingBracket(new Pos(line, ch+1), {bracketRegex: re}); + return matched.to; + } else { + return cursor; + } + }, + moveToStartOfLine: function(_cm, head) { + return new Pos(head.line, 0); + }, + moveToLineOrEdgeOfDocument: function(cm, _head, motionArgs) { + var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine(); + if (motionArgs.repeatIsExplicit) { + lineNum = motionArgs.repeat - cm.getOption('firstLineNumber'); + } + return new Pos(lineNum, + findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum))); + }, + moveToStartOfDisplayLine: function(cm) { + cm.execCommand("goLineLeft"); + return cm.getCursor(); + }, + moveToEndOfDisplayLine: function(cm) { + cm.execCommand("goLineRight"); + var head = cm.getCursor(); + if (head.sticky == "before") head.ch--; + return head; + }, + textObjectManipulation: function(cm, head, motionArgs, vim) { + var mirroredPairs = {'(': ')', ')': '(', + '{': '}', '}': '{', + '[': ']', ']': '[', + '<': '>', '>': '<'}; + var selfPaired = {'\'': true, '"': true, '`': true}; + + var character = motionArgs.selectedCharacter; + if (character == 'b') { + character = '('; + } else if (character == 'B') { + character = '{'; + } + var inclusive = !motionArgs.textObjectInner; + + var tmp; + if (mirroredPairs[character]) { + tmp = selectCompanionObject(cm, head, character, inclusive); + } else if (selfPaired[character]) { + tmp = findBeginningAndEnd(cm, head, character, inclusive); + } else if (character === 'W') { + tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, + true /** bigWord */); + } else if (character === 'w') { + tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, + false /** bigWord */); + } else if (character === 'p') { + tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive); + motionArgs.linewise = true; + if (vim.visualMode) { + if (!vim.visualLine) { vim.visualLine = true; } + } else { + var operatorArgs = vim.inputState.operatorArgs; + if (operatorArgs) { operatorArgs.linewise = true; } + tmp.end.line--; + } + } else if (character === 't') { + tmp = expandTagUnderCursor(cm, head, inclusive); + } else { + return null; + } + + if (!cm.state.vim.visualMode) { + return [tmp.start, tmp.end]; + } else { + return expandSelection(cm, tmp.start, tmp.end); + } + }, + + repeatLastCharacterSearch: function(cm, head, motionArgs) { + var lastSearch = vimGlobalState.lastCharacterSearch; + var repeat = motionArgs.repeat; + var forward = motionArgs.forward === lastSearch.forward; + var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1); + cm.moveH(-increment, 'char'); + motionArgs.inclusive = forward ? true : false; + var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter); + if (!curEnd) { + cm.moveH(increment, 'char'); + return head; + } + curEnd.ch += increment; + return curEnd; + } + }; + + function defineMotion(name, fn) { + motions[name] = fn; + } + + function fillArray(val, times) { + var arr = []; + for (var i = 0; i < times; i++) { + arr.push(val); + } + return arr; + } + var operators = { + change: function(cm, args, ranges) { + var finalHead, text; + var vim = cm.state.vim; + var anchor = ranges[0].anchor, + head = ranges[0].head; + if (!vim.visualMode) { + text = cm.getRange(anchor, head); + var lastState = vim.lastEditInputState || {}; + if (lastState.motion == "moveByWords" && !isWhiteSpaceString(text)) { + var match = (/\s+$/).exec(text); + if (match && lastState.motionArgs && lastState.motionArgs.forward) { + head = offsetCursor(head, 0, - match[0].length); + text = text.slice(0, - match[0].length); + } + } + var prevLineEnd = new Pos(anchor.line - 1, Number.MAX_VALUE); + var wasLastLine = cm.firstLine() == cm.lastLine(); + if (head.line > cm.lastLine() && args.linewise && !wasLastLine) { + cm.replaceRange('', prevLineEnd, head); + } else { + cm.replaceRange('', anchor, head); + } + if (args.linewise) { + if (!wasLastLine) { + cm.setCursor(prevLineEnd); + CodeMirror.commands.newlineAndIndent(cm); + } + anchor.ch = Number.MAX_VALUE; + } + finalHead = anchor; + } else if (args.fullLine) { + head.ch = Number.MAX_VALUE; + head.line--; + cm.setSelection(anchor, head) + text = cm.getSelection(); + cm.replaceSelection(""); + finalHead = anchor; + } else { + text = cm.getSelection(); + var replacement = fillArray('', ranges.length); + cm.replaceSelections(replacement); + finalHead = cursorMin(ranges[0].head, ranges[0].anchor); + } + vimGlobalState.registerController.pushText( + args.registerName, 'change', text, + args.linewise, ranges.length > 1); + actions.enterInsertMode(cm, {head: finalHead}, cm.state.vim); + }, + 'delete': function(cm, args, ranges) { + var finalHead, text; + var vim = cm.state.vim; + if (!vim.visualBlock) { + var anchor = ranges[0].anchor, + head = ranges[0].head; + if (args.linewise && + head.line != cm.firstLine() && + anchor.line == cm.lastLine() && + anchor.line == head.line - 1) { + if (anchor.line == cm.firstLine()) { + anchor.ch = 0; + } else { + anchor = new Pos(anchor.line - 1, lineLength(cm, anchor.line - 1)); + } + } + text = cm.getRange(anchor, head); + cm.replaceRange('', anchor, head); + finalHead = anchor; + if (args.linewise) { + finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor); + } + } else { + text = cm.getSelection(); + var replacement = fillArray('', ranges.length); + cm.replaceSelections(replacement); + finalHead = cursorMin(ranges[0].head, ranges[0].anchor); + } + vimGlobalState.registerController.pushText( + args.registerName, 'delete', text, + args.linewise, vim.visualBlock); + return clipCursorToContent(cm, finalHead); + }, + indent: function(cm, args, ranges) { + var vim = cm.state.vim; + var startLine = ranges[0].anchor.line; + var endLine = vim.visualBlock ? + ranges[ranges.length - 1].anchor.line : + ranges[0].head.line; + var repeat = (vim.visualMode) ? args.repeat : 1; + if (args.linewise) { + endLine--; + } + for (var i = startLine; i <= endLine; i++) { + for (var j = 0; j < repeat; j++) { + cm.indentLine(i, args.indentRight); + } + } + return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor); + }, + indentAuto: function(cm, _args, ranges) { + if (ranges.length > 1) { // ace_patch + cm.setSelection(ranges[0].anchor, ranges[ranges.length - 1].head); + } + cm.execCommand("indentAuto"); + return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor); + }, + changeCase: function(cm, args, ranges, oldAnchor, newHead) { + var selections = cm.getSelections(); + var swapped = []; + var toLower = args.toLower; + for (var j = 0; j < selections.length; j++) { + var toSwap = selections[j]; + var text = ''; + if (toLower === true) { + text = toSwap.toLowerCase(); + } else if (toLower === false) { + text = toSwap.toUpperCase(); + } else { + for (var i = 0; i < toSwap.length; i++) { + var character = toSwap.charAt(i); + text += isUpperCase(character) ? character.toLowerCase() : + character.toUpperCase(); + } + } + swapped.push(text); + } + cm.replaceSelections(swapped); + if (args.shouldMoveCursor){ + return newHead; + } else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) { + return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor); + } else if (args.linewise){ + return oldAnchor; + } else { + return cursorMin(ranges[0].anchor, ranges[0].head); + } + }, + yank: function(cm, args, ranges, oldAnchor) { + var vim = cm.state.vim; + var text = cm.getSelection(); + var endPos = vim.visualMode + ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor) + : oldAnchor; + vimGlobalState.registerController.pushText( + args.registerName, 'yank', + text, args.linewise, vim.visualBlock); + return endPos; + } + }; + + function defineOperator(name, fn) { + operators[name] = fn; + } + + var actions = { + jumpListWalk: function(cm, actionArgs, vim) { + if (vim.visualMode) { + return; + } + var repeat = actionArgs.repeat; + var forward = actionArgs.forward; + var jumpList = vimGlobalState.jumpList; + + var mark = jumpList.move(cm, forward ? repeat : -repeat); + var markPos = mark ? mark.find() : undefined; + markPos = markPos ? markPos : cm.getCursor(); + cm.setCursor(markPos); + cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace_patch + }, + scroll: function(cm, actionArgs, vim) { + if (vim.visualMode) { + return; + } + var repeat = actionArgs.repeat || 1; + var lineHeight = cm.defaultTextHeight(); + var top = cm.getScrollInfo().top; + var delta = lineHeight * repeat; + var newPos = actionArgs.forward ? top + delta : top - delta; + var cursor = copyCursor(cm.getCursor()); + var cursorCoords = cm.charCoords(cursor, 'local'); + if (actionArgs.forward) { + if (newPos > cursorCoords.top) { + cursor.line += (newPos - cursorCoords.top) / lineHeight; + cursor.line = Math.ceil(cursor.line); + cm.setCursor(cursor); + cursorCoords = cm.charCoords(cursor, 'local'); + cm.scrollTo(null, cursorCoords.top); + } else { + cm.scrollTo(null, newPos); + } + } else { + var newBottom = newPos + cm.getScrollInfo().clientHeight; + if (newBottom < cursorCoords.bottom) { + cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight; + cursor.line = Math.floor(cursor.line); + cm.setCursor(cursor); + cursorCoords = cm.charCoords(cursor, 'local'); + cm.scrollTo( + null, cursorCoords.bottom - cm.getScrollInfo().clientHeight); + } else { + cm.scrollTo(null, newPos); + } + } + }, + scrollToCursor: function(cm, actionArgs) { + var lineNum = cm.getCursor().line; + var charCoords = cm.charCoords(new Pos(lineNum, 0), 'local'); + var height = cm.getScrollInfo().clientHeight; + var y = charCoords.top; + var lineHeight = charCoords.bottom - y; + switch (actionArgs.position) { + case 'center': y = y - (height / 2) + lineHeight; + break; + case 'bottom': y = y - height + lineHeight; + break; + } + cm.scrollTo(null, y); + }, + replayMacro: function(cm, actionArgs, vim) { + var registerName = actionArgs.selectedCharacter; + var repeat = actionArgs.repeat; + var macroModeState = vimGlobalState.macroModeState; + if (registerName == '@') { + registerName = macroModeState.latestRegister; + } else { + macroModeState.latestRegister = registerName; + } + while(repeat--){ + executeMacroRegister(cm, vim, macroModeState, registerName); + } + }, + enterMacroRecordMode: function(cm, actionArgs) { + var macroModeState = vimGlobalState.macroModeState; + var registerName = actionArgs.selectedCharacter; + if (vimGlobalState.registerController.isValidRegister(registerName)) { + macroModeState.enterMacroRecordMode(cm, registerName); + } + }, + toggleOverwrite: function(cm) { + if (!cm.state.overwrite) { + cm.toggleOverwrite(true); + cm.setOption('keyMap', 'vim-replace'); + CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"}); + } else { + cm.toggleOverwrite(false); + cm.setOption('keyMap', 'vim-insert'); + CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"}); + } + }, + enterInsertMode: function(cm, actionArgs, vim) { + if (cm.getOption('readOnly')) { return; } + vim.insertMode = true; + vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1; + var insertAt = (actionArgs) ? actionArgs.insertAt : null; + var sel = vim.sel; + var head = actionArgs.head || cm.getCursor('head'); + var height = cm.listSelections().length; + if (insertAt == 'eol') { + head = new Pos(head.line, lineLength(cm, head.line)); + } else if (insertAt == 'bol') { + head = new Pos(head.line, 0); + } else if (insertAt == 'charAfter') { + head = offsetCursor(head, 0, 1); + } else if (insertAt == 'firstNonBlank') { + head = motions.moveToFirstNonWhiteSpaceCharacter(cm, head); + } else if (insertAt == 'startOfSelectedArea') { + if (!vim.visualMode) + return; + if (!vim.visualBlock) { + if (sel.head.line < sel.anchor.line) { + head = sel.head; + } else { + head = new Pos(sel.anchor.line, 0); + } + } else { + head = new Pos( + Math.min(sel.head.line, sel.anchor.line), + Math.min(sel.head.ch, sel.anchor.ch)); + height = Math.abs(sel.head.line - sel.anchor.line) + 1; + } + } else if (insertAt == 'endOfSelectedArea') { + if (!vim.visualMode) + return; + if (!vim.visualBlock) { + if (sel.head.line >= sel.anchor.line) { + head = offsetCursor(sel.head, 0, 1); + } else { + head = new Pos(sel.anchor.line, 0); + } + } else { + head = new Pos( + Math.min(sel.head.line, sel.anchor.line), + Math.max(sel.head.ch, sel.anchor.ch) + 1); + height = Math.abs(sel.head.line - sel.anchor.line) + 1; + } + } else if (insertAt == 'inplace') { + if (vim.visualMode){ + return; + } + } else if (insertAt == 'lastEdit') { + head = getLastEditPos(cm) || head; + } + cm.setOption('disableInput', false); + if (actionArgs && actionArgs.replace) { + cm.toggleOverwrite(true); + cm.setOption('keyMap', 'vim-replace'); + CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"}); + } else { + cm.toggleOverwrite(false); + cm.setOption('keyMap', 'vim-insert'); + CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"}); + } + if (!vimGlobalState.macroModeState.isPlaying) { + cm.on('change', onChange); + CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); + } + if (vim.visualMode) { + exitVisualMode(cm); + } + selectForInsert(cm, head, height); + }, + toggleVisualMode: function(cm, actionArgs, vim) { + var repeat = actionArgs.repeat; + var anchor = cm.getCursor(); + var head; + if (!vim.visualMode) { + vim.visualMode = true; + vim.visualLine = !!actionArgs.linewise; + vim.visualBlock = !!actionArgs.blockwise; + head = clipCursorToContent( + cm, new Pos(anchor.line, anchor.ch + repeat - 1)); + vim.sel = { + anchor: anchor, + head: head + }; + CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : ""}); + updateCmSelection(cm); + updateMark(cm, vim, '<', cursorMin(anchor, head)); + updateMark(cm, vim, '>', cursorMax(anchor, head)); + } else if (vim.visualLine ^ actionArgs.linewise || + vim.visualBlock ^ actionArgs.blockwise) { + vim.visualLine = !!actionArgs.linewise; + vim.visualBlock = !!actionArgs.blockwise; + CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : ""}); + updateCmSelection(cm); + } else { + exitVisualMode(cm); + } + }, + reselectLastSelection: function(cm, _actionArgs, vim) { + var lastSelection = vim.lastSelection; + if (vim.visualMode) { + updateLastSelection(cm, vim); + } + if (lastSelection) { + var anchor = lastSelection.anchorMark.find(); + var head = lastSelection.headMark.find(); + if (!anchor || !head) { + return; + } + vim.sel = { + anchor: anchor, + head: head + }; + vim.visualMode = true; + vim.visualLine = lastSelection.visualLine; + vim.visualBlock = lastSelection.visualBlock; + updateCmSelection(cm); + updateMark(cm, vim, '<', cursorMin(anchor, head)); + updateMark(cm, vim, '>', cursorMax(anchor, head)); + CodeMirror.signal(cm, 'vim-mode-change', { + mode: 'visual', + subMode: vim.visualLine ? 'linewise' : + vim.visualBlock ? 'blockwise' : ''}); + } + }, + joinLines: function(cm, actionArgs, vim) { + var curStart, curEnd; + if (vim.visualMode) { + curStart = cm.getCursor('anchor'); + curEnd = cm.getCursor('head'); + if (cursorIsBefore(curEnd, curStart)) { + var tmp = curEnd; + curEnd = curStart; + curStart = tmp; + } + curEnd.ch = lineLength(cm, curEnd.line) - 1; + } else { + var repeat = Math.max(actionArgs.repeat, 2); + curStart = cm.getCursor(); + curEnd = clipCursorToContent(cm, new Pos(curStart.line + repeat - 1, + Infinity)); + } + var finalCh = 0; + for (var i = curStart.line; i < curEnd.line; i++) { + finalCh = lineLength(cm, curStart.line); + var tmp = new Pos(curStart.line + 1, + lineLength(cm, curStart.line + 1)); + var text = cm.getRange(curStart, tmp); + text = actionArgs.keepSpaces + ? text.replace(/\n\r?/g, '') + : text.replace(/\n\s*/g, ' '); + cm.replaceRange(text, curStart, tmp); + } + var curFinalPos = new Pos(curStart.line, finalCh); + if (vim.visualMode) { + exitVisualMode(cm, false); + } + cm.setCursor(curFinalPos); + }, + newLineAndEnterInsertMode: function(cm, actionArgs, vim) { + vim.insertMode = true; + var insertAt = copyCursor(cm.getCursor()); + if (insertAt.line === cm.firstLine() && !actionArgs.after) { + cm.replaceRange('\n', new Pos(cm.firstLine(), 0)); + cm.setCursor(cm.firstLine(), 0); + } else { + insertAt.line = (actionArgs.after) ? insertAt.line : + insertAt.line - 1; + insertAt.ch = lineLength(cm, insertAt.line); + cm.setCursor(insertAt); + var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment || + CodeMirror.commands.newlineAndIndent; + newlineFn(cm); + } + this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim); + }, + paste: function(cm, actionArgs, vim) { + var cur = copyCursor(cm.getCursor()); + var register = vimGlobalState.registerController.getRegister( + actionArgs.registerName); + var text = register.toString(); + if (!text) { + return; + } + if (actionArgs.matchIndent) { + var tabSize = cm.getOption("tabSize"); + var whitespaceLength = function(str) { + var tabs = (str.split("\t").length - 1); + var spaces = (str.split(" ").length - 1); + return tabs * tabSize + spaces * 1; + }; + var currentLine = cm.getLine(cm.getCursor().line); + var indent = whitespaceLength(currentLine.match(/^\s*/)[0]); + var chompedText = text.replace(/\n$/, ''); + var wasChomped = text !== chompedText; + var firstIndent = whitespaceLength(text.match(/^\s*/)[0]); + var text = chompedText.replace(/^\s*/gm, function(wspace) { + var newIndent = indent + (whitespaceLength(wspace) - firstIndent); + if (newIndent < 0) { + return ""; + } + else if (cm.getOption("indentWithTabs")) { + var quotient = Math.floor(newIndent / tabSize); + return Array(quotient + 1).join('\t'); + } + else { + return Array(newIndent + 1).join(' '); + } + }); + text += wasChomped ? "\n" : ""; + } + if (actionArgs.repeat > 1) { + var text = Array(actionArgs.repeat + 1).join(text); + } + var linewise = register.linewise; + var blockwise = register.blockwise; + if (blockwise) { + text = text.split('\n'); + if (linewise) { + text.pop(); + } + for (var i = 0; i < text.length; i++) { + text[i] = (text[i] == '') ? ' ' : text[i]; + } + cur.ch += actionArgs.after ? 1 : 0; + cur.ch = Math.min(lineLength(cm, cur.line), cur.ch); + } else if (linewise) { + if(vim.visualMode) { + text = vim.visualLine ? text.slice(0, -1) : '\n' + text.slice(0, text.length - 1) + '\n'; + } else if (actionArgs.after) { + text = '\n' + text.slice(0, text.length - 1); + cur.ch = lineLength(cm, cur.line); + } else { + cur.ch = 0; + } + } else { + cur.ch += actionArgs.after ? 1 : 0; + } + var curPosFinal; + var idx; + if (vim.visualMode) { + vim.lastPastedText = text; + var lastSelectionCurEnd; + var selectedArea = getSelectedAreaRange(cm, vim); + var selectionStart = selectedArea[0]; + var selectionEnd = selectedArea[1]; + var selectedText = cm.getSelection(); + var selections = cm.listSelections(); + var emptyStrings = new Array(selections.length).join('1').split('1'); + if (vim.lastSelection) { + lastSelectionCurEnd = vim.lastSelection.headMark.find(); + } + vimGlobalState.registerController.unnamedRegister.setText(selectedText); + if (blockwise) { + cm.replaceSelections(emptyStrings); + selectionEnd = new Pos(selectionStart.line + text.length-1, selectionStart.ch); + cm.setCursor(selectionStart); + selectBlock(cm, selectionEnd); + cm.replaceSelections(text); + curPosFinal = selectionStart; + } else if (vim.visualBlock) { + cm.replaceSelections(emptyStrings); + cm.setCursor(selectionStart); + cm.replaceRange(text, selectionStart, selectionStart); + curPosFinal = selectionStart; + } else { + cm.replaceRange(text, selectionStart, selectionEnd); + curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1); + } + if(lastSelectionCurEnd) { + vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd); + } + if (linewise) { + curPosFinal.ch=0; + } + } else { + if (blockwise) { + cm.setCursor(cur); + for (var i = 0; i < text.length; i++) { + var line = cur.line+i; + if (line > cm.lastLine()) { + cm.replaceRange('\n', new Pos(line, 0)); + } + var lastCh = lineLength(cm, line); + if (lastCh < cur.ch) { + extendLineToColumn(cm, line, cur.ch); + } + } + cm.setCursor(cur); + selectBlock(cm, new Pos(cur.line + text.length-1, cur.ch)); + cm.replaceSelections(text); + curPosFinal = cur; + } else { + cm.replaceRange(text, cur); + if (linewise && actionArgs.after) { + curPosFinal = new Pos( + cur.line + 1, + findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1))); + } else if (linewise && !actionArgs.after) { + curPosFinal = new Pos( + cur.line, + findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line))); + } else if (!linewise && actionArgs.after) { + idx = cm.indexFromPos(cur); + curPosFinal = cm.posFromIndex(idx + text.length - 1); + } else { + idx = cm.indexFromPos(cur); + curPosFinal = cm.posFromIndex(idx + text.length); + } + } + } + if (vim.visualMode) { + exitVisualMode(cm, false); + } + cm.setCursor(curPosFinal); + }, + undo: function(cm, actionArgs) { + cm.operation(function() { + repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)(); + cm.setCursor(cm.getCursor('anchor')); + }); + }, + redo: function(cm, actionArgs) { + repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)(); + }, + setRegister: function(_cm, actionArgs, vim) { + vim.inputState.registerName = actionArgs.selectedCharacter; + }, + setMark: function(cm, actionArgs, vim) { + var markName = actionArgs.selectedCharacter; + updateMark(cm, vim, markName, cm.getCursor()); + }, + replace: function(cm, actionArgs, vim) { + var replaceWith = actionArgs.selectedCharacter; + var curStart = cm.getCursor(); + var replaceTo; + var curEnd; + var selections = cm.listSelections(); + if (vim.visualMode) { + curStart = cm.getCursor('start'); + curEnd = cm.getCursor('end'); + } else { + var line = cm.getLine(curStart.line); + replaceTo = curStart.ch + actionArgs.repeat; + if (replaceTo > line.length) { + replaceTo=line.length; + } + curEnd = new Pos(curStart.line, replaceTo); + } + if (replaceWith=='\n') { + if (!vim.visualMode) cm.replaceRange('', curStart, curEnd); + (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm); + } else { + var replaceWithStr = cm.getRange(curStart, curEnd); + replaceWithStr = replaceWithStr.replace(/[^\n]/g, replaceWith); + if (vim.visualBlock) { + var spaces = new Array(cm.getOption("tabSize")+1).join(' '); + replaceWithStr = cm.getSelection(); + replaceWithStr = replaceWithStr.replace(/\t/g, spaces).replace(/[^\n]/g, replaceWith).split('\n'); + cm.replaceSelections(replaceWithStr); + } else { + cm.replaceRange(replaceWithStr, curStart, curEnd); + } + if (vim.visualMode) { + curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ? + selections[0].anchor : selections[0].head; + cm.setCursor(curStart); + exitVisualMode(cm, false); + } else { + cm.setCursor(offsetCursor(curEnd, 0, -1)); + } + } + }, + incrementNumberToken: function(cm, actionArgs) { + var cur = cm.getCursor(); + var lineStr = cm.getLine(cur.line); + var re = /(-?)(?:(0x)([\da-f]+)|(0b|0|)(\d+))/gi; + var match; + var start; + var end; + var numberStr; + while ((match = re.exec(lineStr)) !== null) { + start = match.index; + end = start + match[0].length; + if (cur.ch < end)break; + } + if (!actionArgs.backtrack && (end <= cur.ch))return; + if (match) { + var baseStr = match[2] || match[4] + var digits = match[3] || match[5] + var increment = actionArgs.increase ? 1 : -1; + var base = {'0b': 2, '0': 8, '': 10, '0x': 16}[baseStr.toLowerCase()]; + var number = parseInt(match[1] + digits, base) + (increment * actionArgs.repeat); + numberStr = number.toString(base); + var zeroPadding = baseStr ? new Array(digits.length - numberStr.length + 1 + match[1].length).join('0') : '' + if (numberStr.charAt(0) === '-') { + numberStr = '-' + baseStr + zeroPadding + numberStr.substr(1); + } else { + numberStr = baseStr + zeroPadding + numberStr; + } + var from = new Pos(cur.line, start); + var to = new Pos(cur.line, end); + cm.replaceRange(numberStr, from, to); + } else { + return; + } + cm.setCursor(new Pos(cur.line, start + numberStr.length - 1)); + }, + repeatLastEdit: function(cm, actionArgs, vim) { + var lastEditInputState = vim.lastEditInputState; + if (!lastEditInputState) { return; } + var repeat = actionArgs.repeat; + if (repeat && actionArgs.repeatIsExplicit) { + vim.lastEditInputState.repeatOverride = repeat; + } else { + repeat = vim.lastEditInputState.repeatOverride || repeat; + } + repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */); + }, + indent: function(cm, actionArgs) { + cm.indentLine(cm.getCursor().line, actionArgs.indentRight); + }, + exitInsertMode: exitInsertMode + }; + + function defineAction(name, fn) { + actions[name] = fn; + } + function clipCursorToContent(cm, cur) { + var vim = cm.state.vim; + var includeLineBreak = vim.insertMode || vim.visualMode; + var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine() ); + var maxCh = lineLength(cm, line) - 1 + !!includeLineBreak; + var ch = Math.min(Math.max(0, cur.ch), maxCh); + return new Pos(line, ch); + } + function copyArgs(args) { + var ret = {}; + for (var prop in args) { + if (args.hasOwnProperty(prop)) { + ret[prop] = args[prop]; + } + } + return ret; + } + function offsetCursor(cur, offsetLine, offsetCh) { + if (typeof offsetLine === 'object') { + offsetCh = offsetLine.ch; + offsetLine = offsetLine.line; + } + return new Pos(cur.line + offsetLine, cur.ch + offsetCh); + } + function commandMatches(keys, keyMap, context, inputState) { + var match, partial = [], full = []; + for (var i = 0; i < keyMap.length; i++) { + var command = keyMap[i]; + if (context == 'insert' && command.context != 'insert' || + command.context && command.context != context || + inputState.operator && command.type == 'action' || + !(match = commandMatch(keys, command.keys))) { continue; } + if (match == 'partial') { partial.push(command); } + if (match == 'full') { full.push(command); } + } + return { + partial: partial.length && partial, + full: full.length && full + }; + } + function commandMatch(pressed, mapped) { + if (mapped.slice(-11) == '') { + var prefixLen = mapped.length - 11; + var pressedPrefix = pressed.slice(0, prefixLen); + var mappedPrefix = mapped.slice(0, prefixLen); + return pressedPrefix == mappedPrefix && pressed.length > prefixLen ? 'full' : + mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false; + } else { + return pressed == mapped ? 'full' : + mapped.indexOf(pressed) == 0 ? 'partial' : false; + } + } + function lastChar(keys) { + var match = /^.*(<[^>]+>)$/.exec(keys); + var selectedCharacter = match ? match[1] : keys.slice(-1); + if (selectedCharacter.length > 1){ + switch(selectedCharacter){ + case '': + selectedCharacter='\n'; + break; + case '': + selectedCharacter=' '; + break; + default: + selectedCharacter=''; + break; + } + } + return selectedCharacter; + } + function repeatFn(cm, fn, repeat) { + return function() { + for (var i = 0; i < repeat; i++) { + fn(cm); + } + }; + } + function copyCursor(cur) { + return new Pos(cur.line, cur.ch); + } + function cursorEqual(cur1, cur2) { + return cur1.ch == cur2.ch && cur1.line == cur2.line; + } + function cursorIsBefore(cur1, cur2) { + if (cur1.line < cur2.line) { + return true; + } + if (cur1.line == cur2.line && cur1.ch < cur2.ch) { + return true; + } + return false; + } + function cursorMin(cur1, cur2) { + if (arguments.length > 2) { + cur2 = cursorMin.apply(undefined, Array.prototype.slice.call(arguments, 1)); + } + return cursorIsBefore(cur1, cur2) ? cur1 : cur2; + } + function cursorMax(cur1, cur2) { + if (arguments.length > 2) { + cur2 = cursorMax.apply(undefined, Array.prototype.slice.call(arguments, 1)); + } + return cursorIsBefore(cur1, cur2) ? cur2 : cur1; + } + function cursorIsBetween(cur1, cur2, cur3) { + var cur1before2 = cursorIsBefore(cur1, cur2); + var cur2before3 = cursorIsBefore(cur2, cur3); + return cur1before2 && cur2before3; + } + function lineLength(cm, lineNum) { + return cm.getLine(lineNum).length; + } + function trim(s) { + if (s.trim) { + return s.trim(); + } + return s.replace(/^\s+|\s+$/g, ''); + } + function escapeRegex(s) { + return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, '\\$1'); + } + function extendLineToColumn(cm, lineNum, column) { + var endCh = lineLength(cm, lineNum); + var spaces = new Array(column-endCh+1).join(' '); + cm.setCursor(new Pos(lineNum, endCh)); + cm.replaceRange(spaces, cm.getCursor()); + } + function selectBlock(cm, selectionEnd) { + var selections = [], ranges = cm.listSelections(); + var head = copyCursor(cm.clipPos(selectionEnd)); + var isClipped = !cursorEqual(selectionEnd, head); + var curHead = cm.getCursor('head'); + var primIndex = getIndex(ranges, curHead); + var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor); + var max = ranges.length - 1; + var index = max - primIndex > primIndex ? max : 0; + var base = ranges[index].anchor; + + var firstLine = Math.min(base.line, head.line); + var lastLine = Math.max(base.line, head.line); + var baseCh = base.ch, headCh = head.ch; + + var dir = ranges[index].head.ch - baseCh; + var newDir = headCh - baseCh; + if (dir > 0 && newDir <= 0) { + baseCh++; + if (!isClipped) { headCh--; } + } else if (dir < 0 && newDir >= 0) { + baseCh--; + if (!wasClipped) { headCh++; } + } else if (dir < 0 && newDir == -1) { + baseCh--; + headCh++; + } + for (var line = firstLine; line <= lastLine; line++) { + var range = {anchor: new Pos(line, baseCh), head: new Pos(line, headCh)}; + selections.push(range); + } + cm.setSelections(selections); + selectionEnd.ch = headCh; + base.ch = baseCh; + return base; + } + function selectForInsert(cm, head, height) { + var sel = []; + for (var i = 0; i < height; i++) { + var lineHead = offsetCursor(head, i, 0); + sel.push({anchor: lineHead, head: lineHead}); + } + cm.setSelections(sel, 0); + } + function getIndex(ranges, cursor, end) { + for (var i = 0; i < ranges.length; i++) { + var atAnchor = end != 'head' && cursorEqual(ranges[i].anchor, cursor); + var atHead = end != 'anchor' && cursorEqual(ranges[i].head, cursor); + if (atAnchor || atHead) { + return i; + } + } + return -1; + } + function getSelectedAreaRange(cm, vim) { + var lastSelection = vim.lastSelection; + var getCurrentSelectedAreaRange = function() { + var selections = cm.listSelections(); + var start = selections[0]; + var end = selections[selections.length-1]; + var selectionStart = cursorIsBefore(start.anchor, start.head) ? start.anchor : start.head; + var selectionEnd = cursorIsBefore(end.anchor, end.head) ? end.head : end.anchor; + return [selectionStart, selectionEnd]; + }; + var getLastSelectedAreaRange = function() { + var selectionStart = cm.getCursor(); + var selectionEnd = cm.getCursor(); + var block = lastSelection.visualBlock; + if (block) { + var width = block.width; + var height = block.height; + selectionEnd = new Pos(selectionStart.line + height, selectionStart.ch + width); + var selections = []; + for (var i = selectionStart.line; i < selectionEnd.line; i++) { + var anchor = new Pos(i, selectionStart.ch); + var head = new Pos(i, selectionEnd.ch); + var range = {anchor: anchor, head: head}; + selections.push(range); + } + cm.setSelections(selections); + } else { + var start = lastSelection.anchorMark.find(); + var end = lastSelection.headMark.find(); + var line = end.line - start.line; + var ch = end.ch - start.ch; + selectionEnd = {line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch}; + if (lastSelection.visualLine) { + selectionStart = new Pos(selectionStart.line, 0); + selectionEnd = new Pos(selectionEnd.line, lineLength(cm, selectionEnd.line)); + } + cm.setSelection(selectionStart, selectionEnd); + } + return [selectionStart, selectionEnd]; + }; + if (!vim.visualMode) { + return getLastSelectedAreaRange(); + } else { + return getCurrentSelectedAreaRange(); + } + } + function updateLastSelection(cm, vim) { + var anchor = vim.sel.anchor; + var head = vim.sel.head; + if (vim.lastPastedText) { + head = cm.posFromIndex(cm.indexFromPos(anchor) + vim.lastPastedText.length); + vim.lastPastedText = null; + } + vim.lastSelection = {'anchorMark': cm.setBookmark(anchor), + 'headMark': cm.setBookmark(head), + 'anchor': copyCursor(anchor), + 'head': copyCursor(head), + 'visualMode': vim.visualMode, + 'visualLine': vim.visualLine, + 'visualBlock': vim.visualBlock}; + } + function expandSelection(cm, start, end) { + var sel = cm.state.vim.sel; + var head = sel.head; + var anchor = sel.anchor; + var tmp; + if (cursorIsBefore(end, start)) { + tmp = end; + end = start; + start = tmp; + } + if (cursorIsBefore(head, anchor)) { + head = cursorMin(start, head); + anchor = cursorMax(anchor, end); + } else { + anchor = cursorMin(start, anchor); + head = cursorMax(head, end); + head = offsetCursor(head, 0, -1); + if (head.ch == -1 && head.line != cm.firstLine()) { + head = new Pos(head.line - 1, lineLength(cm, head.line - 1)); + } + } + return [anchor, head]; + } + function updateCmSelection(cm, sel, mode) { + var vim = cm.state.vim; + sel = sel || vim.sel; + var mode = mode || + vim.visualLine ? 'line' : vim.visualBlock ? 'block' : 'char'; + var cmSel = makeCmSelection(cm, sel, mode); + cm.setSelections(cmSel.ranges, cmSel.primary); + } + function makeCmSelection(cm, sel, mode, exclusive) { + var head = copyCursor(sel.head); + var anchor = copyCursor(sel.anchor); + if (mode == 'char') { + var headOffset = !exclusive && !cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; + var anchorOffset = cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; + head = offsetCursor(sel.head, 0, headOffset); + anchor = offsetCursor(sel.anchor, 0, anchorOffset); + return { + ranges: [{anchor: anchor, head: head}], + primary: 0 + }; + } else if (mode == 'line') { + if (!cursorIsBefore(sel.head, sel.anchor)) { + anchor.ch = 0; + + var lastLine = cm.lastLine(); + if (head.line > lastLine) { + head.line = lastLine; + } + head.ch = lineLength(cm, head.line); + } else { + head.ch = 0; + anchor.ch = lineLength(cm, anchor.line); + } + return { + ranges: [{anchor: anchor, head: head}], + primary: 0 + }; + } else if (mode == 'block') { + var top = Math.min(anchor.line, head.line), + fromCh = anchor.ch, + bottom = Math.max(anchor.line, head.line), + toCh = head.ch; + if (fromCh < toCh) { toCh += 1 } + else { fromCh += 1 }; + var height = bottom - top + 1; + var primary = head.line == top ? 0 : height - 1; + var ranges = []; + for (var i = 0; i < height; i++) { + ranges.push({ + anchor: new Pos(top + i, fromCh), + head: new Pos(top + i, toCh) + }); + } + return { + ranges: ranges, + primary: primary + }; + } + } + function getHead(cm) { + var cur = cm.getCursor('head'); + if (cm.getSelection().length == 1) { + cur = cursorMin(cur, cm.getCursor('anchor')); + } + return cur; + } + function exitVisualMode(cm, moveHead) { + var vim = cm.state.vim; + if (moveHead !== false) { + cm.setCursor(clipCursorToContent(cm, vim.sel.head)); + } + updateLastSelection(cm, vim); + vim.visualMode = false; + vim.visualLine = false; + vim.visualBlock = false; + if (!vim.insertMode) CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); + } + function clipToLine(cm, curStart, curEnd) { + var selection = cm.getRange(curStart, curEnd); + if (/\n\s*$/.test(selection)) { + var lines = selection.split('\n'); + lines.pop(); + var line; + for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) { + curEnd.line--; + curEnd.ch = 0; + } + if (line) { + curEnd.line--; + curEnd.ch = lineLength(cm, curEnd.line); + } else { + curEnd.ch = 0; + } + } + } + function expandSelectionToLine(_cm, curStart, curEnd) { + curStart.ch = 0; + curEnd.ch = 0; + curEnd.line++; + } + + function findFirstNonWhiteSpaceCharacter(text) { + if (!text) { + return 0; + } + var firstNonWS = text.search(/\S/); + return firstNonWS == -1 ? text.length : firstNonWS; + } + + function expandWordUnderCursor(cm, inclusive, _forward, bigWord, noSymbol) { + var cur = getHead(cm); + var line = cm.getLine(cur.line); + var idx = cur.ch; + var test = noSymbol ? wordCharTest[0] : bigWordCharTest [0]; + while (!test(line.charAt(idx))) { + idx++; + if (idx >= line.length) { return null; } + } + + if (bigWord) { + test = bigWordCharTest[0]; + } else { + test = wordCharTest[0]; + if (!test(line.charAt(idx))) { + test = wordCharTest[1]; + } + } + + var end = idx, start = idx; + while (test(line.charAt(end)) && end < line.length) { end++; } + while (test(line.charAt(start)) && start >= 0) { start--; } + start++; + + if (inclusive) { + var wordEnd = end; + while (/\s/.test(line.charAt(end)) && end < line.length) { end++; } + if (wordEnd == end) { + var wordStart = start; + while (/\s/.test(line.charAt(start - 1)) && start > 0) { start--; } + if (!start) { start = wordStart; } + } + } + return { start: new Pos(cur.line, start), end: new Pos(cur.line, end) }; + } + function expandTagUnderCursor(cm, head, inclusive) { + var cur = head; + if (!CodeMirror.findMatchingTag || !CodeMirror.findEnclosingTag) { + return { start: cur, end: cur }; + } + + var tags = CodeMirror.findMatchingTag(cm, head) || CodeMirror.findEnclosingTag(cm, head); + if (!tags || !tags.open || !tags.close) { + return { start: cur, end: cur }; + } + + if (inclusive) { + return { start: tags.open.from, end: tags.close.to }; + } + return { start: tags.open.to, end: tags.close.from }; + } + + function recordJumpPosition(cm, oldCur, newCur) { + if (!cursorEqual(oldCur, newCur)) { + vimGlobalState.jumpList.add(cm, oldCur, newCur); + } + } + + function recordLastCharacterSearch(increment, args) { + vimGlobalState.lastCharacterSearch.increment = increment; + vimGlobalState.lastCharacterSearch.forward = args.forward; + vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter; + } + + var symbolToMode = { + '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket', + '[': 'section', ']': 'section', + '*': 'comment', '/': 'comment', + 'm': 'method', 'M': 'method', + '#': 'preprocess' + }; + var findSymbolModes = { + bracket: { + isComplete: function(state) { + if (state.nextCh === state.symb) { + state.depth++; + if (state.depth >= 1)return true; + } else if (state.nextCh === state.reverseSymb) { + state.depth--; + } + return false; + } + }, + section: { + init: function(state) { + state.curMoveThrough = true; + state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}'; + }, + isComplete: function(state) { + return state.index === 0 && state.nextCh === state.symb; + } + }, + comment: { + isComplete: function(state) { + var found = state.lastCh === '*' && state.nextCh === '/'; + state.lastCh = state.nextCh; + return found; + } + }, + method: { + init: function(state) { + state.symb = (state.symb === 'm' ? '{' : '}'); + state.reverseSymb = state.symb === '{' ? '}' : '{'; + }, + isComplete: function(state) { + if (state.nextCh === state.symb)return true; + return false; + } + }, + preprocess: { + init: function(state) { + state.index = 0; + }, + isComplete: function(state) { + if (state.nextCh === '#') { + var token = state.lineText.match(/^#(\w+)/)[1]; + if (token === 'endif') { + if (state.forward && state.depth === 0) { + return true; + } + state.depth++; + } else if (token === 'if') { + if (!state.forward && state.depth === 0) { + return true; + } + state.depth--; + } + if (token === 'else' && state.depth === 0)return true; + } + return false; + } + } + }; + function findSymbol(cm, repeat, forward, symb) { + var cur = copyCursor(cm.getCursor()); + var increment = forward ? 1 : -1; + var endLine = forward ? cm.lineCount() : -1; + var curCh = cur.ch; + var line = cur.line; + var lineText = cm.getLine(line); + var state = { + lineText: lineText, + nextCh: lineText.charAt(curCh), + lastCh: null, + index: curCh, + symb: symb, + reverseSymb: (forward ? { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb], + forward: forward, + depth: 0, + curMoveThrough: false + }; + var mode = symbolToMode[symb]; + if (!mode)return cur; + var init = findSymbolModes[mode].init; + var isComplete = findSymbolModes[mode].isComplete; + if (init) { init(state); } + while (line !== endLine && repeat) { + state.index += increment; + state.nextCh = state.lineText.charAt(state.index); + if (!state.nextCh) { + line += increment; + state.lineText = cm.getLine(line) || ''; + if (increment > 0) { + state.index = 0; + } else { + var lineLen = state.lineText.length; + state.index = (lineLen > 0) ? (lineLen-1) : 0; + } + state.nextCh = state.lineText.charAt(state.index); + } + if (isComplete(state)) { + cur.line = line; + cur.ch = state.index; + repeat--; + } + } + if (state.nextCh || state.curMoveThrough) { + return new Pos(line, state.index); + } + return cur; + } + function findWord(cm, cur, forward, bigWord, emptyLineIsWord) { + var lineNum = cur.line; + var pos = cur.ch; + var line = cm.getLine(lineNum); + var dir = forward ? 1 : -1; + var charTests = bigWord ? bigWordCharTest: wordCharTest; + + if (emptyLineIsWord && line == '') { + lineNum += dir; + line = cm.getLine(lineNum); + if (!isLine(cm, lineNum)) { + return null; + } + pos = (forward) ? 0 : line.length; + } + + while (true) { + if (emptyLineIsWord && line == '') { + return { from: 0, to: 0, line: lineNum }; + } + var stop = (dir > 0) ? line.length : -1; + var wordStart = stop, wordEnd = stop; + while (pos != stop) { + var foundWord = false; + for (var i = 0; i < charTests.length && !foundWord; ++i) { + if (charTests[i](line.charAt(pos))) { + wordStart = pos; + while (pos != stop && charTests[i](line.charAt(pos))) { + pos += dir; + } + wordEnd = pos; + foundWord = wordStart != wordEnd; + if (wordStart == cur.ch && lineNum == cur.line && + wordEnd == wordStart + dir) { + continue; + } else { + return { + from: Math.min(wordStart, wordEnd + 1), + to: Math.max(wordStart, wordEnd), + line: lineNum }; + } + } + } + if (!foundWord) { + pos += dir; + } + } + lineNum += dir; + if (!isLine(cm, lineNum)) { + return null; + } + line = cm.getLine(lineNum); + pos = (dir > 0) ? 0 : line.length; + } + } + function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) { + var curStart = copyCursor(cur); + var words = []; + if (forward && !wordEnd || !forward && wordEnd) { + repeat++; + } + var emptyLineIsWord = !(forward && wordEnd); + for (var i = 0; i < repeat; i++) { + var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord); + if (!word) { + var eodCh = lineLength(cm, cm.lastLine()); + words.push(forward + ? {line: cm.lastLine(), from: eodCh, to: eodCh} + : {line: 0, from: 0, to: 0}); + break; + } + words.push(word); + cur = new Pos(word.line, forward ? (word.to - 1) : word.from); + } + var shortCircuit = words.length != repeat; + var firstWord = words[0]; + var lastWord = words.pop(); + if (forward && !wordEnd) { + if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) { + lastWord = words.pop(); + } + return new Pos(lastWord.line, lastWord.from); + } else if (forward && wordEnd) { + return new Pos(lastWord.line, lastWord.to - 1); + } else if (!forward && wordEnd) { + if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) { + lastWord = words.pop(); + } + return new Pos(lastWord.line, lastWord.to); + } else { + return new Pos(lastWord.line, lastWord.from); + } + } + + function moveToEol(cm, head, motionArgs, vim, keepHPos) { + var cur = head; + var retval= new Pos(cur.line + motionArgs.repeat - 1, Infinity); + var end=cm.clipPos(retval); + end.ch--; + if (!keepHPos) { + vim.lastHPos = Infinity; + vim.lastHSPos = cm.charCoords(end,'div').left; + } + return retval; + } + + function moveToCharacter(cm, repeat, forward, character) { + var cur = cm.getCursor(); + var start = cur.ch; + var idx; + for (var i = 0; i < repeat; i ++) { + var line = cm.getLine(cur.line); + idx = charIdxInLine(start, line, character, forward, true); + if (idx == -1) { + return null; + } + start = idx; + } + return new Pos(cm.getCursor().line, idx); + } + + function moveToColumn(cm, repeat) { + var line = cm.getCursor().line; + return clipCursorToContent(cm, new Pos(line, repeat - 1)); + } + + function updateMark(cm, vim, markName, pos) { + if (!inArray(markName, validMarks)) { + return; + } + if (vim.marks[markName]) { + vim.marks[markName].clear(); + } + vim.marks[markName] = cm.setBookmark(pos); + } + + function charIdxInLine(start, line, character, forward, includeChar) { + var idx; + if (forward) { + idx = line.indexOf(character, start + 1); + if (idx != -1 && !includeChar) { + idx -= 1; + } + } else { + idx = line.lastIndexOf(character, start - 1); + if (idx != -1 && !includeChar) { + idx += 1; + } + } + return idx; + } + + function findParagraph(cm, head, repeat, dir, inclusive) { + var line = head.line; + var min = cm.firstLine(); + var max = cm.lastLine(); + var start, end, i = line; + function isEmpty(i) { return !/\S/.test(cm.getLine(i)); } // ace_patch + function isBoundary(i, dir, any) { + if (any) { return isEmpty(i) != isEmpty(i + dir); } + return !isEmpty(i) && isEmpty(i + dir); + } + function skipFold(i) { + dir = dir > 0 ? 1 : -1; + var foldLine = cm.ace.session.getFoldLine(i); + if (foldLine) { + if (i + dir > foldLine.start.row && i + dir < foldLine.end.row) + dir = (dir > 0 ? foldLine.end.row : foldLine.start.row) - i; + } + } + if (dir) { + while (min <= i && i <= max && repeat > 0) { + skipFold(i); + if (isBoundary(i, dir)) { repeat--; } + i += dir; + } + return new Pos(i, 0); + } + + var vim = cm.state.vim; + if (vim.visualLine && isBoundary(line, 1, true)) { + var anchor = vim.sel.anchor; + if (isBoundary(anchor.line, -1, true)) { + if (!inclusive || anchor.line != line) { + line += 1; + } + } + } + var startState = isEmpty(line); + for (i = line; i <= max && repeat; i++) { + if (isBoundary(i, 1, true)) { + if (!inclusive || isEmpty(i) != startState) { + repeat--; + } + } + } + end = new Pos(i, 0); + if (i > max && !startState) { startState = true; } + else { inclusive = false; } + for (i = line; i > min; i--) { + if (!inclusive || isEmpty(i) == startState || i == line) { + if (isBoundary(i, -1, true)) { break; } + } + } + start = new Pos(i, 0); + return { start: start, end: end }; + } + + function findSentence(cm, cur, repeat, dir) { + function nextChar(cm, idx) { + if (idx.pos + idx.dir < 0 || idx.pos + idx.dir >= idx.line.length) { + idx.ln += idx.dir; + if (!isLine(cm, idx.ln)) { + idx.line = null; + idx.ln = null; + idx.pos = null; + return; + } + idx.line = cm.getLine(idx.ln); + idx.pos = (idx.dir > 0) ? 0 : idx.line.length - 1; + } + else { + idx.pos += idx.dir; + } + } + function forward(cm, ln, pos, dir) { + var line = cm.getLine(ln); + var stop = (line === ""); + + var curr = { + line: line, + ln: ln, + pos: pos, + dir: dir, + } + + var last_valid = { + ln: curr.ln, + pos: curr.pos, + } + + var skip_empty_lines = (curr.line === ""); + nextChar(cm, curr); + + while (curr.line !== null) { + last_valid.ln = curr.ln; + last_valid.pos = curr.pos; + + if (curr.line === "" && !skip_empty_lines) { + return { ln: curr.ln, pos: curr.pos, }; + } + else if (stop && curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { + return { ln: curr.ln, pos: curr.pos, }; + } + else if (isEndOfSentenceSymbol(curr.line[curr.pos]) + && !stop + && (curr.pos === curr.line.length - 1 + || isWhiteSpaceString(curr.line[curr.pos + 1]))) { + stop = true; + } + + nextChar(cm, curr); + } + var line = cm.getLine(last_valid.ln); + last_valid.pos = 0; + for(var i = line.length - 1; i >= 0; --i) { + if (!isWhiteSpaceString(line[i])) { + last_valid.pos = i; + break; + } + } + + return last_valid; + + } + function reverse(cm, ln, pos, dir) { + var line = cm.getLine(ln); + + var curr = { + line: line, + ln: ln, + pos: pos, + dir: dir, + } + + var last_valid = { + ln: curr.ln, + pos: null, + }; + + var skip_empty_lines = (curr.line === ""); + nextChar(cm, curr); + + while (curr.line !== null) { + + if (curr.line === "" && !skip_empty_lines) { + if (last_valid.pos !== null) { + return last_valid; + } + else { + return { ln: curr.ln, pos: curr.pos }; + } + } + else if (isEndOfSentenceSymbol(curr.line[curr.pos]) + && last_valid.pos !== null + && !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) { + return last_valid; + } + else if (curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { + skip_empty_lines = false; + last_valid = { ln: curr.ln, pos: curr.pos } + } + + nextChar(cm, curr); + } + var line = cm.getLine(last_valid.ln); + last_valid.pos = 0; + for(var i = 0; i < line.length; ++i) { + if (!isWhiteSpaceString(line[i])) { + last_valid.pos = i; + break; + } + } + return last_valid; + } + + var curr_index = { + ln: cur.line, + pos: cur.ch, + }; + + while (repeat > 0) { + if (dir < 0) { + curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir); + } + else { + curr_index = forward(cm, curr_index.ln, curr_index.pos, dir); + } + repeat--; + } + + return new Pos(curr_index.ln, curr_index.pos); + } + function selectCompanionObject(cm, head, symb, inclusive) { + var cur = head, start, end; + + var bracketRegexp = ({ + '(': /[()]/, ')': /[()]/, + '[': /[[\]]/, ']': /[[\]]/, + '{': /[{}]/, '}': /[{}]/, + '<': /[<>]/, '>': /[<>]/})[symb]; + var openSym = ({ + '(': '(', ')': '(', + '[': '[', ']': '[', + '{': '{', '}': '{', + '<': '<', '>': '<'})[symb]; + var curChar = cm.getLine(cur.line).charAt(cur.ch); + var offset = curChar === openSym ? 1 : 0; + + start = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), -1, undefined, {'bracketRegex': bracketRegexp}); + end = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), 1, undefined, {'bracketRegex': bracketRegexp}); + + if (!start || !end) { + return { start: cur, end: cur }; + } + + start = start.pos; + end = end.pos; + + if ((start.line == end.line && start.ch > end.ch) + || (start.line > end.line)) { + var tmp = start; + start = end; + end = tmp; + } + + if (inclusive) { + end.ch += 1; + } else { + start.ch += 1; + } + + return { start: start, end: end }; + } + function findBeginningAndEnd(cm, head, symb, inclusive) { + var cur = copyCursor(head); + var line = cm.getLine(cur.line); + var chars = line.split(''); + var start, end, i, len; + var firstIndex = chars.indexOf(symb); + if (cur.ch < firstIndex) { + cur.ch = firstIndex; + } + else if (firstIndex < cur.ch && chars[cur.ch] == symb) { + end = cur.ch; // assign end to the current cursor + --cur.ch; // make sure to look backwards + } + if (chars[cur.ch] == symb && !end) { + start = cur.ch + 1; // assign start to ahead of the cursor + } else { + for (i = cur.ch; i > -1 && !start; i--) { + if (chars[i] == symb) { + start = i + 1; + } + } + } + if (start && !end) { + for (i = start, len = chars.length; i < len && !end; i++) { + if (chars[i] == symb) { + end = i; + } + } + } + if (!start || !end) { + return { start: cur, end: cur }; + } + if (inclusive) { + --start; ++end; + } + + return { + start: new Pos(cur.line, start), + end: new Pos(cur.line, end) + }; + } + defineOption('pcre', true, 'boolean'); + function SearchState() {} + SearchState.prototype = { + getQuery: function() { + return vimGlobalState.query; + }, + setQuery: function(query) { + vimGlobalState.query = query; + }, + getOverlay: function() { + return this.searchOverlay; + }, + setOverlay: function(overlay) { + this.searchOverlay = overlay; + }, + isReversed: function() { + return vimGlobalState.isReversed; + }, + setReversed: function(reversed) { + vimGlobalState.isReversed = reversed; + }, + getScrollbarAnnotate: function() { + return this.annotate; + }, + setScrollbarAnnotate: function(annotate) { + this.annotate = annotate; + } + }; + function getSearchState(cm) { + var vim = cm.state.vim; + return vim.searchState_ || (vim.searchState_ = new SearchState()); + } + function splitBySlash(argString) { + return splitBySeparator(argString, '/'); + } + + function findUnescapedSlashes(argString) { + return findUnescapedSeparators(argString, '/'); + } + + function splitBySeparator(argString, separator) { + var slashes = findUnescapedSeparators(argString, separator) || []; + if (!slashes.length) return []; + var tokens = []; + if (slashes[0] !== 0) return; + for (var i = 0; i < slashes.length; i++) { + if (typeof slashes[i] == 'number') + tokens.push(argString.substring(slashes[i] + 1, slashes[i+1])); + } + return tokens; + } + + function findUnescapedSeparators(str, separator) { + if (!separator) + separator = '/'; + + var escapeNextChar = false; + var slashes = []; + for (var i = 0; i < str.length; i++) { + var c = str.charAt(i); + if (!escapeNextChar && c == separator) { + slashes.push(i); + } + escapeNextChar = !escapeNextChar && (c == '\\'); + } + return slashes; + } + function translateRegex(str) { + var specials = '|(){'; + var unescape = '}'; + var escapeNextChar = false; + var out = []; + for (var i = -1; i < str.length; i++) { + var c = str.charAt(i) || ''; + var n = str.charAt(i+1) || ''; + var specialComesNext = (n && specials.indexOf(n) != -1); + if (escapeNextChar) { + if (c !== '\\' || !specialComesNext) { + out.push(c); + } + escapeNextChar = false; + } else { + if (c === '\\') { + escapeNextChar = true; + if (n && unescape.indexOf(n) != -1) { + specialComesNext = true; + } + if (!specialComesNext || n === '\\') { + out.push(c); + } + } else { + out.push(c); + if (specialComesNext && n !== '\\') { + out.push('\\'); + } + } + } + } + return out.join(''); + } + var charUnescapes = {'\\n': '\n', '\\r': '\r', '\\t': '\t'}; + function translateRegexReplace(str) { + var escapeNextChar = false; + var out = []; + for (var i = -1; i < str.length; i++) { + var c = str.charAt(i) || ''; + var n = str.charAt(i+1) || ''; + if (charUnescapes[c + n]) { + out.push(charUnescapes[c+n]); + i++; + } else if (escapeNextChar) { + out.push(c); + escapeNextChar = false; + } else { + if (c === '\\') { + escapeNextChar = true; + if ((isNumber(n) || n === '$')) { + out.push('$'); + } else if (n !== '/' && n !== '\\') { + out.push('\\'); + } + } else { + if (c === '$') { + out.push('$'); + } + out.push(c); + if (n === '/') { + out.push('\\'); + } + } + } + } + return out.join(''); + } + var unescapes = {'\\/': '/', '\\\\': '\\', '\\n': '\n', '\\r': '\r', '\\t': '\t', '\\&':'&'}; + function unescapeRegexReplace(str) { + var stream = new CodeMirror.StringStream(str); + var output = []; + while (!stream.eol()) { + while (stream.peek() && stream.peek() != '\\') { + output.push(stream.next()); + } + var matched = false; + for (var matcher in unescapes) { + if (stream.match(matcher, true)) { + matched = true; + output.push(unescapes[matcher]); + break; + } + } + if (!matched) { + output.push(stream.next()); + } + } + return output.join(''); + } + function parseQuery(query, ignoreCase, smartCase) { + var lastSearchRegister = vimGlobalState.registerController.getRegister('/'); + lastSearchRegister.setText(query); + if (query instanceof RegExp) { return query; } + var slashes = findUnescapedSlashes(query); + var regexPart; + var forceIgnoreCase; + if (!slashes.length) { + regexPart = query; + } else { + regexPart = query.substring(0, slashes[0]); + var flagsPart = query.substring(slashes[0]); + forceIgnoreCase = (flagsPart.indexOf('i') != -1); + } + if (!regexPart) { + return null; + } + if (!getOption('pcre')) { + regexPart = translateRegex(regexPart); + } + if (smartCase) { + ignoreCase = (/^[^A-Z]*$/).test(regexPart); + } + var regexp = new RegExp(regexPart, + (ignoreCase || forceIgnoreCase) ? 'im' : 'm'); + return regexp; + } + function hdom(n) { + if (typeof n === 'string') n = document.createElement(n); + for (var a, i = 1; i < arguments.length; i++) { + if (!(a = arguments[i])) continue; + if (typeof a !== 'object') a = document.createTextNode(a); + if (a.nodeType) n.appendChild(a); + else for (var key in a) { + if (!Object.prototype.hasOwnProperty.call(a, key)) continue; + if (key[0] === '$') n.style[key.slice(1)] = a[key]; + else n.setAttribute(key, a[key]); + } + } + return n; + } + + function showConfirm(cm, template) { + var pre = hdom('span', {$color: 'red', $whiteSpace: 'pre', class: 'cm-vim-message'}, template); //ace_patch span instead of pre + if (cm.openNotification) { + cm.openNotification(pre, {bottom: true, duration: 5000}); + } else { + alert(pre.innerText); + } + } + + function makePrompt(prefix, desc) { + return hdom(document.createDocumentFragment(), + hdom('span', {$fontFamily: 'monospace', $whiteSpace: 'pre'}, + prefix, + hdom('input', {type: 'text', autocorrect: 'off', + autocapitalize: 'off', spellcheck: 'false'})), + desc && hdom('span', {$color: '#888'}, desc)); + } + + function showPrompt(cm, options) { + var template = makePrompt(options.prefix, options.desc); + if (cm.openDialog) { + cm.openDialog(template, options.onClose, { + onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp, + bottom: true, selectValueOnOpen: false, value: options.value + }); + } + else { + var shortText = ''; + if (typeof options.prefix != "string" && options.prefix) shortText += options.prefix.textContent; + if (options.desc) shortText += " " + options.desc; + options.onClose(prompt(shortText, '')); + } + } + + function regexEqual(r1, r2) { + if (r1 instanceof RegExp && r2 instanceof RegExp) { + var props = ['global', 'multiline', 'ignoreCase', 'source']; + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + if (r1[prop] !== r2[prop]) { + return false; + } + } + return true; + } + return false; + } + function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) { + if (!rawQuery) { + return; + } + var state = getSearchState(cm); + var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase); + if (!query) { + return; + } + highlightSearchMatches(cm, query); + if (regexEqual(query, state.getQuery())) { + return query; + } + state.setQuery(query); + return query; + } + function searchOverlay(query) { + if (query.source.charAt(0) == '^') { + var matchSol = true; + } + return { + token: function(stream) { + if (matchSol && !stream.sol()) { + stream.skipToEnd(); + return; + } + var match = stream.match(query, false); + if (match) { + if (match[0].length == 0) { + stream.next(); + return 'searching'; + } + if (!stream.sol()) { + stream.backUp(1); + if (!query.exec(stream.next() + match[0])) { + stream.next(); + return null; + } + } + stream.match(query); + return 'searching'; + } + while (!stream.eol()) { + stream.next(); + if (stream.match(query, false)) break; + } + }, + query: query + }; + } + function highlightSearchMatches(cm, query) { + var searchState = getSearchState(cm); + var overlay = searchState.getOverlay(); + if (!overlay || query != overlay.query) { + if (overlay) { + cm.removeOverlay(overlay); + } + overlay = searchOverlay(query); + cm.addOverlay(overlay); + if (cm.showMatchesOnScrollbar) { + if (searchState.getScrollbarAnnotate()) { + searchState.getScrollbarAnnotate().clear(); + } + searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query)); + } + searchState.setOverlay(overlay); + } + } + function findNext(cm, prev, query, repeat) { + if (repeat === undefined) { repeat = 1; } + return cm.operation(function() { + var pos = cm.getCursor(); + var cursor = cm.getSearchCursor(query, pos); + for (var i = 0; i < repeat; i++) { + var found = cursor.find(prev); + if (i == 0 && found && cursorEqual(cursor.from(), pos)) { + var lastEndPos = prev ? cursor.from() : cursor.to(); + found = cursor.find(prev); + if (found && !found[0] && cursorEqual(cursor.from(), lastEndPos)) { + if (cm.getLine(lastEndPos.line).length == lastEndPos.ch) + found = cursor.find(prev); + } + } + if (!found) { + cursor = cm.getSearchCursor(query, + (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) ); + if (!cursor.find(prev)) { + return; + } + } + } + return cursor.from(); + }); + } + function findNextFromAndToInclusive(cm, prev, query, repeat, vim) { + if (repeat === undefined) { repeat = 1; } + return cm.operation(function() { + var pos = cm.getCursor(); + var cursor = cm.getSearchCursor(query, pos); + var found = cursor.find(!prev); + if (!vim.visualMode && found && cursorEqual(cursor.from(), pos)) { + cursor.find(!prev); + } + + for (var i = 0; i < repeat; i++) { + found = cursor.find(prev); + if (!found) { + cursor = cm.getSearchCursor(query, + (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) ); + if (!cursor.find(prev)) { + return; + } + } + } + return [cursor.from(), cursor.to()]; + }); + } + function clearSearchHighlight(cm) { + var state = getSearchState(cm); + cm.removeOverlay(getSearchState(cm).getOverlay()); + state.setOverlay(null); + if (state.getScrollbarAnnotate()) { + state.getScrollbarAnnotate().clear(); + state.setScrollbarAnnotate(null); + } + } + function isInRange(pos, start, end) { + if (typeof pos != 'number') { + pos = pos.line; + } + if (start instanceof Array) { + return inArray(pos, start); + } else { + if (typeof end == 'number') { + return (pos >= start && pos <= end); + } else { + return pos == start; + } + } + } + function getUserVisibleLines(cm) { + var renderer = cm.ace.renderer; + return { + top: renderer.getFirstFullyVisibleRow(), + bottom: renderer.getLastFullyVisibleRow() + } + } + + function getMarkPos(cm, vim, markName) { + if (markName == '\'' || markName == '`') { + return vimGlobalState.jumpList.find(cm, -1) || new Pos(0, 0); + } else if (markName == '.') { + return getLastEditPos(cm); + } + + var mark = vim.marks[markName]; + return mark && mark.find(); + } + + function getLastEditPos(cm) { + var undoManager = cm.ace.session.$undoManager; + if (undoManager && undoManager.$lastDelta) + return toCmPos(undoManager.$lastDelta.end); + } + + var ExCommandDispatcher = function() { + this.buildCommandMap_(); + }; + ExCommandDispatcher.prototype = { + processCommand: function(cm, input, opt_params) { + var that = this; + cm.operation(function () { + cm.curOp.isVimOp = true; + that._processCommand(cm, input, opt_params); + }); + }, + _processCommand: function(cm, input, opt_params) { + var vim = cm.state.vim; + var commandHistoryRegister = vimGlobalState.registerController.getRegister(':'); + var previousCommand = commandHistoryRegister.toString(); + if (vim.visualMode) { + exitVisualMode(cm); + } + var inputStream = new CodeMirror.StringStream(input); + commandHistoryRegister.setText(input); + var params = opt_params || {}; + params.input = input; + try { + this.parseInput_(cm, inputStream, params); + } catch(e) { + showConfirm(cm, e.toString()); + throw e; + } + var command; + var commandName; + if (!params.commandName) { + if (params.line !== undefined) { + commandName = 'move'; + } + } else { + command = this.matchCommand_(params.commandName); + if (command) { + commandName = command.name; + if (command.excludeFromCommandHistory) { + commandHistoryRegister.setText(previousCommand); + } + this.parseCommandArgs_(inputStream, params, command); + if (command.type == 'exToKey') { + for (var i = 0; i < command.toKeys.length; i++) { + vimApi.handleKey(cm, command.toKeys[i], 'mapping'); + } + return; + } else if (command.type == 'exToEx') { + this.processCommand(cm, command.toInput); + return; + } + } + } + if (!commandName) { + showConfirm(cm, 'Not an editor command ":' + input + '"'); + return; + } + try { + exCommands[commandName](cm, params); + if ((!command || !command.possiblyAsync) && params.callback) { + params.callback(); + } + } catch(e) { + showConfirm(cm, e.toString()); + throw e; + } + }, + parseInput_: function(cm, inputStream, result) { + inputStream.eatWhile(':'); + if (inputStream.eat('%')) { + result.line = cm.firstLine(); + result.lineEnd = cm.lastLine(); + } else { + result.line = this.parseLineSpec_(cm, inputStream); + if (result.line !== undefined && inputStream.eat(',')) { + result.lineEnd = this.parseLineSpec_(cm, inputStream); + } + } + var commandMatch = inputStream.match(/^(\w+|!!|@@|[!#&*<=>@~])/); + if (commandMatch) { + result.commandName = commandMatch[1]; + } else { + result.commandName = inputStream.match(/.*/)[0]; + } + + return result; + }, + parseLineSpec_: function(cm, inputStream) { + var numberMatch = inputStream.match(/^(\d+)/); + if (numberMatch) { + return parseInt(numberMatch[1], 10) - 1; + } + switch (inputStream.next()) { + case '.': + return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); + case '$': + return this.parseLineSpecOffset_(inputStream, cm.lastLine()); + case '\'': + var markName = inputStream.next(); + var markPos = getMarkPos(cm, cm.state.vim, markName); + if (!markPos) throw new Error('Mark not set'); + return this.parseLineSpecOffset_(inputStream, markPos.line); + case '-': + case '+': + inputStream.backUp(1); + return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); + default: + inputStream.backUp(1); + return undefined; + } + }, + parseLineSpecOffset_: function(inputStream, line) { + var offsetMatch = inputStream.match(/^([+-])?(\d+)/); + if (offsetMatch) { + var offset = parseInt(offsetMatch[2], 10); + if (offsetMatch[1] == "-") { + line -= offset; + } else { + line += offset; + } + } + return line; + }, + parseCommandArgs_: function(inputStream, params, command) { + if (inputStream.eol()) { + return; + } + params.argString = inputStream.match(/.*/)[0]; + var delim = command.argDelimiter || /\s+/; + var args = trim(params.argString).split(delim); + if (args.length && args[0]) { + params.args = args; + } + }, + matchCommand_: function(commandName) { + for (var i = commandName.length; i > 0; i--) { + var prefix = commandName.substring(0, i); + if (this.commandMap_[prefix]) { + var command = this.commandMap_[prefix]; + if (command.name.indexOf(commandName) === 0) { + return command; + } + } + } + return null; + }, + buildCommandMap_: function() { + this.commandMap_ = {}; + for (var i = 0; i < defaultExCommandMap.length; i++) { + var command = defaultExCommandMap[i]; + var key = command.shortName || command.name; + this.commandMap_[key] = command; + } + }, + map: function(lhs, rhs, ctx) { + if (lhs != ':' && lhs.charAt(0) == ':') { + if (ctx) { throw Error('Mode not supported for ex mappings'); } + var commandName = lhs.substring(1); + if (rhs != ':' && rhs.charAt(0) == ':') { + this.commandMap_[commandName] = { + name: commandName, + type: 'exToEx', + toInput: rhs.substring(1), + user: true + }; + } else { + this.commandMap_[commandName] = { + name: commandName, + type: 'exToKey', + toKeys: rhs, + user: true + }; + } + } else { + if (rhs != ':' && rhs.charAt(0) == ':') { + var mapping = { + keys: lhs, + type: 'keyToEx', + exArgs: { input: rhs.substring(1) } + }; + if (ctx) { mapping.context = ctx; } + defaultKeymap.unshift(mapping); + } else { + var mapping = { + keys: lhs, + type: 'keyToKey', + toKeys: rhs + }; + if (ctx) { mapping.context = ctx; } + defaultKeymap.unshift(mapping); + } + } + }, + unmap: function(lhs, ctx) { + if (lhs != ':' && lhs.charAt(0) == ':') { + if (ctx) { throw Error('Mode not supported for ex mappings'); } + var commandName = lhs.substring(1); + if (this.commandMap_[commandName] && this.commandMap_[commandName].user) { + delete this.commandMap_[commandName]; + return true; + } + } else { + var keys = lhs; + for (var i = 0; i < defaultKeymap.length; i++) { + if (keys == defaultKeymap[i].keys + && defaultKeymap[i].context === ctx) { + defaultKeymap.splice(i, 1); + return true; + } + } + } + } + }; + + var exCommands = { + colorscheme: function(cm, params) { + if (!params.args || params.args.length < 1) { + showConfirm(cm, cm.getOption('theme')); + return; + } + cm.setOption('theme', params.args[0]); + }, + map: function(cm, params, ctx) { + var mapArgs = params.args; + if (!mapArgs || mapArgs.length < 2) { + if (cm) { + showConfirm(cm, 'Invalid mapping: ' + params.input); + } + return; + } + exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx); + }, + imap: function(cm, params) { this.map(cm, params, 'insert'); }, + nmap: function(cm, params) { this.map(cm, params, 'normal'); }, + vmap: function(cm, params) { this.map(cm, params, 'visual'); }, + unmap: function(cm, params, ctx) { + var mapArgs = params.args; + if (!mapArgs || mapArgs.length < 1 || !exCommandDispatcher.unmap(mapArgs[0], ctx)) { + if (cm) { + showConfirm(cm, 'No such mapping: ' + params.input); + } + } + }, + move: function(cm, params) { + commandDispatcher.processCommand(cm, cm.state.vim, { + type: 'motion', + motion: 'moveToLineOrEdgeOfDocument', + motionArgs: { forward: false, explicitRepeat: true, + linewise: true }, + repeatOverride: params.line+1}); + }, + set: function(cm, params) { + var setArgs = params.args; + var setCfg = params.setCfg || {}; + if (!setArgs || setArgs.length < 1) { + if (cm) { + showConfirm(cm, 'Invalid mapping: ' + params.input); + } + return; + } + var expr = setArgs[0].split('='); + var optionName = expr[0]; + var value = expr[1]; + var forceGet = false; + + if (optionName.charAt(optionName.length - 1) == '?') { + if (value) { throw Error('Trailing characters: ' + params.argString); } + optionName = optionName.substring(0, optionName.length - 1); + forceGet = true; + } + if (value === undefined && optionName.substring(0, 2) == 'no') { + optionName = optionName.substring(2); + value = false; + } + + var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean'; + if (optionIsBoolean && value == undefined) { + value = true; + } + if (!optionIsBoolean && value === undefined || forceGet) { + var oldValue = getOption(optionName, cm, setCfg); + if (oldValue instanceof Error) { + showConfirm(cm, oldValue.message); + } else if (oldValue === true || oldValue === false) { + showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName); + } else { + showConfirm(cm, ' ' + optionName + '=' + oldValue); + } + } else { + var setOptionReturn = setOption(optionName, value, cm, setCfg); + if (setOptionReturn instanceof Error) { + showConfirm(cm, setOptionReturn.message); + } + } + }, + setlocal: function (cm, params) { + params.setCfg = {scope: 'local'}; + this.set(cm, params); + }, + setglobal: function (cm, params) { + params.setCfg = {scope: 'global'}; + this.set(cm, params); + }, + registers: function(cm, params) { + var regArgs = params.args; + var registers = vimGlobalState.registerController.registers; + var regInfo = '----------Registers----------\n\n'; + if (!regArgs) { + for (var registerName in registers) { + var text = registers[registerName].toString(); + if (text.length) { + regInfo += '"' + registerName + ' ' + text + '\n' + } + } + } else { + var registerName; + regArgs = regArgs.join(''); + for (var i = 0; i < regArgs.length; i++) { + registerName = regArgs.charAt(i); + if (!vimGlobalState.registerController.isValidRegister(registerName)) { + continue; + } + var register = registers[registerName] || new Register(); + regInfo += '"' + registerName + ' ' + register.toString() + '\n' + } + } + showConfirm(cm, regInfo); + }, + sort: function(cm, params) { + var reverse, ignoreCase, unique, number, pattern; + function parseArgs() { + if (params.argString) { + var args = new CodeMirror.StringStream(params.argString); + if (args.eat('!')) { reverse = true; } + if (args.eol()) { return; } + if (!args.eatSpace()) { return 'Invalid arguments'; } + var opts = args.match(/([dinuox]+)?\s*(\/.+\/)?\s*/); + if (!opts && !args.eol()) { return 'Invalid arguments'; } + if (opts[1]) { + ignoreCase = opts[1].indexOf('i') != -1; + unique = opts[1].indexOf('u') != -1; + var decimal = opts[1].indexOf('d') != -1 || opts[1].indexOf('n') != -1 && 1; + var hex = opts[1].indexOf('x') != -1 && 1; + var octal = opts[1].indexOf('o') != -1 && 1; + if (decimal + hex + octal > 1) { return 'Invalid arguments'; } + number = decimal && 'decimal' || hex && 'hex' || octal && 'octal'; + } + if (opts[2]) { + pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : ''); + } + } + } + var err = parseArgs(); + if (err) { + showConfirm(cm, err + ': ' + params.argString); + return; + } + var lineStart = params.line || cm.firstLine(); + var lineEnd = params.lineEnd || params.line || cm.lastLine(); + if (lineStart == lineEnd) { return; } + var curStart = new Pos(lineStart, 0); + var curEnd = new Pos(lineEnd, lineLength(cm, lineEnd)); + var text = cm.getRange(curStart, curEnd).split('\n'); + var numberRegex = pattern ? pattern : + (number == 'decimal') ? /(-?)([\d]+)/ : + (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i : + (number == 'octal') ? /([0-7]+)/ : null; + var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null; + var numPart = [], textPart = []; + if (number || pattern) { + for (var i = 0; i < text.length; i++) { + var matchPart = pattern ? text[i].match(pattern) : null; + if (matchPart && matchPart[0] != '') { + numPart.push(matchPart); + } else if (!pattern && numberRegex.exec(text[i])) { + numPart.push(text[i]); + } else { + textPart.push(text[i]); + } + } + } else { + textPart = text; + } + function compareFn(a, b) { + if (reverse) { var tmp; tmp = a; a = b; b = tmp; } + if (ignoreCase) { a = a.toLowerCase(); b = b.toLowerCase(); } + var anum = number && numberRegex.exec(a); + var bnum = number && numberRegex.exec(b); + if (!anum) { return a < b ? -1 : 1; } + anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix); + bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix); + return anum - bnum; + } + function comparePatternFn(a, b) { + if (reverse) { var tmp; tmp = a; a = b; b = tmp; } + if (ignoreCase) { a[0] = a[0].toLowerCase(); b[0] = b[0].toLowerCase(); } + return (a[0] < b[0]) ? -1 : 1; + } + numPart.sort(pattern ? comparePatternFn : compareFn); + if (pattern) { + for (var i = 0; i < numPart.length; i++) { + numPart[i] = numPart[i].input; + } + } else if (!number) { textPart.sort(compareFn); } + text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart); + if (unique) { // Remove duplicate lines + var textOld = text; + var lastLine; + text = []; + for (var i = 0; i < textOld.length; i++) { + if (textOld[i] != lastLine) { + text.push(textOld[i]); + } + lastLine = textOld[i]; + } + } + cm.replaceRange(text.join('\n'), curStart, curEnd); + }, + vglobal: function(cm, params) { + this.global(cm, params); + }, + global: function(cm, params) { + var argString = params.argString; + if (!argString) { + showConfirm(cm, 'Regular Expression missing from global'); + return; + } + var inverted = params.commandName[0] === 'v'; + var lineStart = (params.line !== undefined) ? params.line : cm.firstLine(); + var lineEnd = params.lineEnd || params.line || cm.lastLine(); + var tokens = splitBySlash(argString); + var regexPart = argString, cmd; + if (tokens.length) { + regexPart = tokens[0]; + cmd = tokens.slice(1, tokens.length).join('/'); + } + if (regexPart) { + try { + updateSearchQuery(cm, regexPart, true /** ignoreCase */, + true /** smartCase */); + } catch (e) { + showConfirm(cm, 'Invalid regex: ' + regexPart); + return; + } + } + var query = getSearchState(cm).getQuery(); + var matchedLines = []; + for (var i = lineStart; i <= lineEnd; i++) { + var line = cm.getLineHandle(i); + var matched = query.test(line.text); + if (matched !== inverted) { + matchedLines.push(cmd ? line : line.text); + } + } + if (!cmd) { + showConfirm(cm, matchedLines.join('\n')); + return; + } + var index = 0; + var nextCommand = function() { + if (index < matchedLines.length) { + var line = matchedLines[index++]; + var lineNum = cm.getLineNumber(line); + if (lineNum == null) { + nextCommand(); + return; + } + var command = (lineNum + 1) + cmd; + exCommandDispatcher.processCommand(cm, command, { + callback: nextCommand + }); + } + }; + nextCommand(); + }, + substitute: function(cm, params) { + if (!cm.getSearchCursor) { + throw new Error('Search feature not available. Requires searchcursor.js or ' + + 'any other getSearchCursor implementation.'); + } + var argString = params.argString; + var tokens = argString ? splitBySeparator(argString, argString[0]) : []; + var regexPart, replacePart = '', trailing, flagsPart, count; + var confirm = false; // Whether to confirm each replace. + var global = false; // True to replace all instances on a line, false to replace only 1. + if (tokens.length) { + regexPart = tokens[0]; + if (getOption('pcre') && regexPart !== '') { + regexPart = new RegExp(regexPart).source; //normalize not escaped characters + } + replacePart = tokens[1]; + if (replacePart !== undefined) { + if (getOption('pcre')) { + replacePart = unescapeRegexReplace(replacePart.replace(/([^\\])&/g,"$1$$&")); + } else { + replacePart = translateRegexReplace(replacePart); + } + vimGlobalState.lastSubstituteReplacePart = replacePart; + } + trailing = tokens[2] ? tokens[2].split(' ') : []; + } else { + if (argString && argString.length) { + showConfirm(cm, 'Substitutions should be of the form ' + + ':s/pattern/replace/'); + return; + } + } + if (trailing) { + flagsPart = trailing[0]; + count = parseInt(trailing[1]); + if (flagsPart) { + if (flagsPart.indexOf('c') != -1) { + confirm = true; + } + if (flagsPart.indexOf('g') != -1) { + global = true; + } + if (getOption('pcre')) { + regexPart = regexPart + '/' + flagsPart; + } else { + regexPart = regexPart.replace(/\//g, "\\/") + '/' + flagsPart; + } + } + } + if (regexPart) { + try { + updateSearchQuery(cm, regexPart, true /** ignoreCase */, + true /** smartCase */); + } catch (e) { + showConfirm(cm, 'Invalid regex: ' + regexPart); + return; + } + } + replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart; + if (replacePart === undefined) { + showConfirm(cm, 'No previous substitute regular expression'); + return; + } + var state = getSearchState(cm); + var query = state.getQuery(); + var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line; + var lineEnd = params.lineEnd || lineStart; + if (lineStart == cm.firstLine() && lineEnd == cm.lastLine()) { + lineEnd = Infinity; + } + if (count) { + lineStart = lineEnd; + lineEnd = lineStart + count - 1; + } + var startPos = clipCursorToContent(cm, new Pos(lineStart, 0)); + var cursor = cm.getSearchCursor(query, startPos); + doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback); + }, + redo: CodeMirror.commands.redo, + undo: CodeMirror.commands.undo, + write: function(cm) { + if (CodeMirror.commands.save) { + CodeMirror.commands.save(cm); + } else if (cm.save) { + cm.save(); + } + }, + nohlsearch: function(cm) { + clearSearchHighlight(cm); + }, + yank: function (cm) { + var cur = copyCursor(cm.getCursor()); + var line = cur.line; + var lineText = cm.getLine(line); + vimGlobalState.registerController.pushText( + '0', 'yank', lineText, true, true); + }, + delmarks: function(cm, params) { + if (!params.argString || !trim(params.argString)) { + showConfirm(cm, 'Argument required'); + return; + } + + var state = cm.state.vim; + var stream = new CodeMirror.StringStream(trim(params.argString)); + while (!stream.eol()) { + stream.eatSpace(); + var count = stream.pos; + + if (!stream.match(/[a-zA-Z]/, false)) { + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); + return; + } + + var sym = stream.next(); + if (stream.match('-', true)) { + if (!stream.match(/[a-zA-Z]/, false)) { + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); + return; + } + + var startMark = sym; + var finishMark = stream.next(); + if (isLowerCase(startMark) && isLowerCase(finishMark) || + isUpperCase(startMark) && isUpperCase(finishMark)) { + var start = startMark.charCodeAt(0); + var finish = finishMark.charCodeAt(0); + if (start >= finish) { + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); + return; + } + for (var j = 0; j <= finish - start; j++) { + var mark = String.fromCharCode(start + j); + delete state.marks[mark]; + } + } else { + showConfirm(cm, 'Invalid argument: ' + startMark + '-'); + return; + } + } else { + delete state.marks[sym]; + } + } + } + }; + + var exCommandDispatcher = new ExCommandDispatcher(); + function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query, + replaceWith, callback) { + cm.state.vim.exMode = true; + var done = false; + var lastPos, modifiedLineNumber, joined; + function replaceAll() { + cm.operation(function() { + while (!done) { + replace(); + next(); + } + stop(); + }); + } + function replace() { + var text = cm.getRange(searchCursor.from(), searchCursor.to()); + var newText = text.replace(query, replaceWith); + var unmodifiedLineNumber = searchCursor.to().line; + searchCursor.replace(newText); + modifiedLineNumber = searchCursor.to().line; + lineEnd += modifiedLineNumber - unmodifiedLineNumber; + joined = modifiedLineNumber < unmodifiedLineNumber; + } + function findNextValidMatch() { + var lastMatchTo = lastPos && copyCursor(searchCursor.to()); + var match = searchCursor.findNext(); + if (match && !match[0] && lastMatchTo && cursorEqual(searchCursor.from(), lastMatchTo)) { + match = searchCursor.findNext(); + } + return match; + } + function next() { + while(findNextValidMatch() && + isInRange(searchCursor.from(), lineStart, lineEnd)) { + if (!global && searchCursor.from().line == modifiedLineNumber && !joined) { + continue; + } + cm.scrollIntoView(searchCursor.from(), 30); + cm.setSelection(searchCursor.from(), searchCursor.to()); + lastPos = searchCursor.from(); + done = false; + return; + } + done = true; + } + function stop(close) { + if (close) { close(); } + cm.focus(); + if (lastPos) { + cm.setCursor(lastPos); + var vim = cm.state.vim; + vim.exMode = false; + vim.lastHPos = vim.lastHSPos = lastPos.ch; + } + if (callback) { callback(); } + } + function onPromptKeyDown(e, _value, close) { + CodeMirror.e_stop(e); + var keyName = CodeMirror.keyName(e); + switch (keyName) { + case 'Y': + replace(); next(); break; + case 'N': + next(); break; + case 'A': + var savedCallback = callback; + callback = undefined; + cm.operation(replaceAll); + callback = savedCallback; + break; + case 'L': + replace(); + case 'Q': + case 'Esc': + case 'Ctrl-C': + case 'Ctrl-[': + stop(close); + break; + } + if (done) { stop(close); } + return true; + } + next(); + if (done) { + showConfirm(cm, 'No matches for ' + query.source); + return; + } + if (!confirm) { + replaceAll(); + if (callback) { callback(); } + return; + } + showPrompt(cm, { + prefix: hdom('span', 'replace with ', hdom('strong', replaceWith), ' (y/n/a/q/l)'), + onKeyDown: onPromptKeyDown + }); + } + + CodeMirror.keyMap.vim = { + attach: attachVimMap, + detach: detachVimMap, + call: cmKey + }; + + function exitInsertMode(cm) { + var vim = cm.state.vim; + var macroModeState = vimGlobalState.macroModeState; + var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.'); + var isPlaying = macroModeState.isPlaying; + var lastChange = macroModeState.lastInsertModeChanges; + if (!isPlaying) { + cm.off('change', onChange); + CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); + } + if (!isPlaying && vim.insertModeRepeat > 1) { + repeatLastEdit(cm, vim, vim.insertModeRepeat - 1, + true /** repeatForInsert */); + vim.lastEditInputState.repeatOverride = vim.insertModeRepeat; + } + delete vim.insertModeRepeat; + vim.insertMode = false; + cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1); + cm.setOption('keyMap', 'vim'); + cm.setOption('disableInput', true); + cm.toggleOverwrite(false); // exit replace mode if we were in it. + insertModeChangeRegister.setText(lastChange.changes.join('')); + CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); + if (macroModeState.isRecording) { + logInsertModeChange(macroModeState); + } + } + + function _mapCommand(command) { + defaultKeymap.unshift(command); + } + + function mapCommand(keys, type, name, args, extra) { + var command = {keys: keys, type: type}; + command[type] = name; + command[type + "Args"] = args; + for (var key in extra) + command[key] = extra[key]; + _mapCommand(command); + } + defineOption('insertModeEscKeysTimeout', 200, 'number'); + + CodeMirror.keyMap['vim-insert'] = { + fallthrough: ['default'], + attach: attachVimMap, + detach: detachVimMap, + call: cmKey + }; + + CodeMirror.keyMap['vim-replace'] = { + 'Backspace': 'goCharLeft', + fallthrough: ['vim-insert'], + attach: attachVimMap, + detach: detachVimMap, + call: cmKey + }; + + function executeMacroRegister(cm, vim, macroModeState, registerName) { + var register = vimGlobalState.registerController.getRegister(registerName); + if (registerName == ':') { + if (register.keyBuffer[0]) { + exCommandDispatcher.processCommand(cm, register.keyBuffer[0]); + } + macroModeState.isPlaying = false; + return; + } + var keyBuffer = register.keyBuffer; + var imc = 0; + macroModeState.isPlaying = true; + macroModeState.replaySearchQueries = register.searchQueries.slice(0); + for (var i = 0; i < keyBuffer.length; i++) { + var text = keyBuffer[i]; + var match, key; + while (text) { + match = (/<\w+-.+?>|<\w+>|./).exec(text); + key = match[0]; + text = text.substring(match.index + key.length); + vimApi.handleKey(cm, key, 'macro'); + if (vim.insertMode) { + var changes = register.insertModeChanges[imc++].changes; + vimGlobalState.macroModeState.lastInsertModeChanges.changes = + changes; + repeatInsertModeChanges(cm, changes, 1); + exitInsertMode(cm); + } + } + } + macroModeState.isPlaying = false; + } + + function logKey(macroModeState, key) { + if (macroModeState.isPlaying) { return; } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register) { + register.pushText(key); + } + } + + function logInsertModeChange(macroModeState) { + if (macroModeState.isPlaying) { return; } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register && register.pushInsertModeChanges) { + register.pushInsertModeChanges(macroModeState.lastInsertModeChanges); + } + } + + function logSearchQuery(macroModeState, query) { + if (macroModeState.isPlaying) { return; } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register && register.pushSearchQuery) { + register.pushSearchQuery(query); + } + } + function onChange(cm, changeObj) { + var macroModeState = vimGlobalState.macroModeState; + var lastChange = macroModeState.lastInsertModeChanges; + if (!macroModeState.isPlaying) { + while(changeObj) { + lastChange.expectCursorActivityForChange = true; + if (lastChange.ignoreCount > 1) { + lastChange.ignoreCount--; + } else if (changeObj.origin == '+input' || changeObj.origin == 'paste' + || changeObj.origin === undefined /* only in testing */) { + var selectionCount = cm.listSelections().length; + if (selectionCount > 1) + lastChange.ignoreCount = selectionCount; + var text = changeObj.text.join('\n'); + if (lastChange.maybeReset) { + lastChange.changes = []; + lastChange.maybeReset = false; + } + if (text) { + if (cm.state.overwrite && !/\n/.test(text)) { + lastChange.changes.push([text]); + } else { + lastChange.changes.push(text); + } + } + } + changeObj = changeObj.next; + } + } + } + function onCursorActivity(cm) { + var vim = cm.state.vim; + if (vim.insertMode) { + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isPlaying) { return; } + var lastChange = macroModeState.lastInsertModeChanges; + if (lastChange.expectCursorActivityForChange) { + lastChange.expectCursorActivityForChange = false; + } else { + lastChange.maybeReset = true; + } + } else if (!cm.curOp.isVimOp) { + handleExternalSelection(cm, vim); + } + } + function handleExternalSelection(cm, vim, keepHPos) { + var anchor = cm.getCursor('anchor'); + var head = cm.getCursor('head'); + if (vim.visualMode && !cm.somethingSelected()) { + exitVisualMode(cm, false); + } else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) { + vim.visualMode = true; + vim.visualLine = false; + CodeMirror.signal(cm, "vim-mode-change", {mode: "visual"}); + } + if (vim.visualMode) { + var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; + var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; + head = offsetCursor(head, 0, headOffset); + anchor = offsetCursor(anchor, 0, anchorOffset); + vim.sel = { + anchor: anchor, + head: head + }; + updateMark(cm, vim, '<', cursorMin(head, anchor)); + updateMark(cm, vim, '>', cursorMax(head, anchor)); + } else if (!vim.insertMode && !keepHPos) { + vim.lastHPos = cm.getCursor().ch; + } + } + function InsertModeKey(keyName) { + this.keyName = keyName; + } + function onKeyEventTargetKeyDown(e) { + var macroModeState = vimGlobalState.macroModeState; + var lastChange = macroModeState.lastInsertModeChanges; + var keyName = CodeMirror.keyName(e); + if (!keyName) { return; } + function onKeyFound() { + if (lastChange.maybeReset) { + lastChange.changes = []; + lastChange.maybeReset = false; + } + lastChange.changes.push(new InsertModeKey(keyName)); + return true; + } + if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) { + CodeMirror.lookupKey(keyName, 'vim-insert', onKeyFound); + } + } + function repeatLastEdit(cm, vim, repeat, repeatForInsert) { + var macroModeState = vimGlobalState.macroModeState; + macroModeState.isPlaying = true; + var isAction = !!vim.lastEditActionCommand; + var cachedInputState = vim.inputState; + function repeatCommand() { + if (isAction) { + commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand); + } else { + commandDispatcher.evalInput(cm, vim); + } + } + function repeatInsert(repeat) { + if (macroModeState.lastInsertModeChanges.changes.length > 0) { + repeat = !vim.lastEditActionCommand ? 1 : repeat; + var changeObject = macroModeState.lastInsertModeChanges; + repeatInsertModeChanges(cm, changeObject.changes, repeat); + } + } + vim.inputState = vim.lastEditInputState; + if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) { + for (var i = 0; i < repeat; i++) { + repeatCommand(); + repeatInsert(1); + } + } else { + if (!repeatForInsert) { + repeatCommand(); + } + repeatInsert(repeat); + } + vim.inputState = cachedInputState; + if (vim.insertMode && !repeatForInsert) { + exitInsertMode(cm); + } + macroModeState.isPlaying = false; + } + + function repeatInsertModeChanges(cm, changes, repeat) { + function keyHandler(binding) { + if (typeof binding == 'string') { + CodeMirror.commands[binding](cm); + } else { + binding(cm); + } + return true; + } + var head = cm.getCursor('head'); + var visualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.visualBlock; + if (visualBlock) { + selectForInsert(cm, head, visualBlock + 1); + repeat = cm.listSelections().length; + cm.setCursor(head); + } + for (var i = 0; i < repeat; i++) { + if (visualBlock) { + cm.setCursor(offsetCursor(head, i, 0)); + } + for (var j = 0; j < changes.length; j++) { + var change = changes[j]; + if (change instanceof InsertModeKey) { + CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler); + } else if (typeof change == "string") { + cm.replaceSelection(change); + } else { + var start = cm.getCursor(); + var end = offsetCursor(start, 0, change[0].length); + cm.replaceRange(change[0], start, end); + cm.setCursor(end); + } + } + } + if (visualBlock) { + cm.setCursor(offsetCursor(head, 0, 1)); + } + } + + resetVimGlobalState(); + CodeMirror.Vim = Vim(); + + Vim = CodeMirror.Vim; + + var specialKey = {'return':'CR',backspace:'BS','delete':'Del',esc:'Esc', + left:'Left',right:'Right',up:'Up',down:'Down',space: 'Space',insert: 'Ins', + home:'Home',end:'End',pageup:'PageUp',pagedown:'PageDown', enter: 'CR' + }; + function lookupKey(hashId, key, e) { + if (key.length > 1 && key[0] == "n") { + key = key.replace("numpad", ""); + } + key = specialKey[key] || key; + var name = ''; + if (e.ctrlKey) { name += 'C-'; } + if (e.altKey) { name += 'A-'; } + if ((name || key.length > 1) && e.shiftKey) { name += 'S-'; } + + name += key; + if (name.length > 1) { name = '<' + name + '>'; } + return name; + } + var handleKey = Vim.handleKey.bind(Vim); + Vim.handleKey = function(cm, key, origin) { + return cm.operation(function() { + return handleKey(cm, key, origin); + }, true); + } + function cloneVimState(state) { + var n = new state.constructor(); + Object.keys(state).forEach(function(key) { + var o = state[key]; + if (Array.isArray(o)) + o = o.slice(); + else if (o && typeof o == "object" && o.constructor != Object) + o = cloneVimState(o); + n[key] = o; + }); + if (state.sel) { + n.sel = { + head: state.sel.head && copyCursor(state.sel.head), + anchor: state.sel.anchor && copyCursor(state.sel.anchor) + }; + } + return n; + } + function multiSelectHandleKey(cm, key, origin) { + var isHandled = false; + var vim = Vim.maybeInitVimState_(cm); + var visualBlock = vim.visualBlock || vim.wasInVisualBlock; + + var wasMultiselect = cm.ace.inMultiSelectMode; + if (vim.wasInVisualBlock && !wasMultiselect) { + vim.wasInVisualBlock = false; + } else if (wasMultiselect && vim.visualBlock) { + vim.wasInVisualBlock = true; + } + + if (key == '' && !vim.insertMode && !vim.visualMode && wasMultiselect) { + cm.ace.exitMultiSelectMode(); + } else if (visualBlock || !wasMultiselect || cm.ace.inVirtualSelectionMode) { + isHandled = Vim.handleKey(cm, key, origin); + } else { + var old = cloneVimState(vim); + cm.operation(function() { + cm.ace.forEachSelection(function() { + var sel = cm.ace.selection; + cm.state.vim.lastHPos = sel.$desiredColumn == null ? sel.lead.column : sel.$desiredColumn; + var head = cm.getCursor("head"); + var anchor = cm.getCursor("anchor"); + var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; + var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; + head = offsetCursor(head, 0, headOffset); + anchor = offsetCursor(anchor, 0, anchorOffset); + cm.state.vim.sel.head = head; + cm.state.vim.sel.anchor = anchor; + + isHandled = handleKey(cm, key, origin); + sel.$desiredColumn = cm.state.vim.lastHPos == -1 ? null : cm.state.vim.lastHPos; + if (cm.virtualSelectionMode()) { + cm.state.vim = cloneVimState(old); + } + }); + if (cm.curOp.cursorActivity && !isHandled) + cm.curOp.cursorActivity = false; + }, true); + } + if (isHandled && !vim.visualMode && !vim.insert && vim.visualMode != cm.somethingSelected()) { + handleExternalSelection(cm, vim, true); + } + return isHandled; + } + exports.CodeMirror = CodeMirror; + var getVim = Vim.maybeInitVimState_; + exports.handler = { + $id: "ace/keyboard/vim", + drawCursor: function(element, pixelPos, config, sel, session) { + var vim = this.state.vim || {}; + var w = config.characterWidth; + var h = config.lineHeight; + var top = pixelPos.top; + var left = pixelPos.left; + if (!vim.insertMode) { + var isbackwards = !sel.cursor + ? session.selection.isBackwards() || session.selection.isEmpty() + : Range.comparePoints(sel.cursor, sel.start) <= 0; + if (!isbackwards && left > w) + left -= w; + } + if (!vim.insertMode && vim.status) { + h = h / 2; + top += h; + } + dom.translate(element, left, top); + dom.setStyle(element.style, "width", w + "px"); + dom.setStyle(element.style, "height", h + "px"); + }, + handleKeyboard: function(data, hashId, key, keyCode, e) { + var editor = data.editor; + var cm = editor.state.cm; + var vim = getVim(cm); + if (keyCode == -1) return; + if (!vim.insertMode) { + if (hashId == -1) { + if (key.charCodeAt(0) > 0xFF) { + if (data.inputKey) { + key = data.inputKey; + if (key && data.inputHash == 4) + key = key.toUpperCase(); + } + } + data.inputChar = key; + } + else if (hashId == 4 || hashId == 0) { + if (data.inputKey == key && data.inputHash == hashId && data.inputChar) { + key = data.inputChar; + hashId = -1 + } + else { + data.inputChar = null; + data.inputKey = key; + data.inputHash = hashId; + } + } + else { + data.inputChar = data.inputKey = null; + } + } + + if (cm.state.overwrite && vim.insertMode && key == "backspace" && hashId == 0) { + return {command: "gotoleft"} + } + if (key == "c" && hashId == 1) { // key == "ctrl-c" + if (!useragent.isMac && editor.getCopyText()) { + editor.once("copy", function() { + if (vim.insertMode) editor.selection.clearSelection(); + else cm.operation(function() { exitVisualMode(cm); }); + }); + return {command: "null", passEvent: true}; + } + } + + if (key == "esc" && !vim.insertMode && !vim.visualMode && !cm.ace.inMultiSelectMode) { + var searchState = getSearchState(cm); + var overlay = searchState.getOverlay(); + if (overlay) cm.removeOverlay(overlay); + } + + if (hashId == -1 || hashId & 1 || hashId === 0 && key.length > 1) { + var insertMode = vim.insertMode; + var name = lookupKey(hashId, key, e || {}); + if (vim.status == null) + vim.status = ""; + var isHandled = multiSelectHandleKey(cm, name, 'user'); + vim = getVim(cm); // may be changed by multiSelectHandleKey + if (isHandled && vim.status != null) + vim.status += name; + else if (vim.status == null) + vim.status = ""; + cm._signal("changeStatus"); + if (!isHandled && (hashId != -1 || insertMode)) + return; + return {command: "null", passEvent: !isHandled}; + } + }, + attach: function(editor) { + if (!editor.state) editor.state = {}; + var cm = new CodeMirror(editor); + editor.state.cm = cm; + editor.$vimModeHandler = this; + CodeMirror.keyMap.vim.attach(cm); + getVim(cm).status = null; + cm.on('vim-command-done', function() { + if (cm.virtualSelectionMode()) return; + getVim(cm).status = null; + cm.ace._signal("changeStatus"); + cm.ace.session.markUndoGroup(); + }); + cm.on("changeStatus", function() { + cm.ace.renderer.updateCursor(); + cm.ace._signal("changeStatus"); + }); + cm.on("vim-mode-change", function() { + if (cm.virtualSelectionMode()) return; + updateInputMode(); + cm._signal("changeStatus"); + }); + function updateInputMode() { + var isIntsert = getVim(cm).insertMode; + cm.ace.renderer.setStyle("normal-mode", !isIntsert); + editor.textInput.setCommandMode(!isIntsert); + editor.renderer.$keepTextAreaAtCursor = isIntsert; + editor.renderer.$blockCursor = !isIntsert; + } + updateInputMode(); + editor.renderer.$cursorLayer.drawCursor = this.drawCursor.bind(cm); + }, + detach: function(editor) { + var cm = editor.state.cm; + CodeMirror.keyMap.vim.detach(cm); + cm.destroy(); + editor.state.cm = null; + editor.$vimModeHandler = null; + editor.renderer.$cursorLayer.drawCursor = null; + editor.renderer.setStyle("normal-mode", false); + editor.textInput.setCommandMode(false); + editor.renderer.$keepTextAreaAtCursor = true; + }, + getStatusText: function(editor) { + var cm = editor.state.cm; + var vim = getVim(cm); + if (vim.insertMode) + return "INSERT"; + var status = ""; + if (vim.visualMode) { + status += "VISUAL"; + if (vim.visualLine) + status += " LINE"; + if (vim.visualBlock) + status += " BLOCK"; + } + if (vim.status) + status += (status ? " " : "") + vim.status; + return status; + } + }; + Vim.defineOption({ + name: "wrap", + set: function(value, cm) { + if (cm) {cm.ace.setOption("wrap", value)} + }, + type: "boolean" + }, false); + Vim.defineEx('write', 'w', function() { + console.log(':write is not implemented') + }); + defaultKeymap.push( + { keys: 'zc', type: 'action', action: 'fold', actionArgs: { open: false } }, + { keys: 'zC', type: 'action', action: 'fold', actionArgs: { open: false, all: true } }, + { keys: 'zo', type: 'action', action: 'fold', actionArgs: { open: true } }, + { keys: 'zO', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, + { keys: 'za', type: 'action', action: 'fold', actionArgs: { toggle: true } }, + { keys: 'zA', type: 'action', action: 'fold', actionArgs: { toggle: true, all: true } }, + { keys: 'zf', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, + { keys: 'zd', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, + + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorAbove" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorBelow" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorAboveSkipCurrent" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorBelowSkipCurrent" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectMoreBefore" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectMoreAfter" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectNextBefore" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectNextAfter" } } + ); + + defaultKeymap.push({ + keys: 'gq', + type: 'operator', + operator: 'hardWrap' + }); + Vim.defineOperator("hardWrap", function(cm, operatorArgs, ranges, oldAnchor, newHead) { + var anchor = ranges[0].anchor.line; + var head = ranges[0].head.line; + if (operatorArgs.linewise) head--; + hardWrap(cm.ace, {startRow: anchor, endRow: head}); + return Pos(head, 0); + }); + defineOption('textwidth', undefined, 'number', ['tw'], function(width, cm) { + if (cm === undefined) { + return; + } + if (width === undefined) { + var value = cm.ace.getOption('printMarginColumn'); + return value; + } else { + var column = Math.round(width); + if (column > 1) { + cm.ace.setOption('printMarginColumn', column); + } + } + }); + + actions.aceCommand = function(cm, actionArgs, vim) { + cm.vimCmd = actionArgs; + if (cm.ace.inVirtualSelectionMode) + cm.ace.on("beforeEndOperation", delayedExecAceCommand); + else + delayedExecAceCommand(null, cm.ace); + }; + function delayedExecAceCommand(op, ace) { + ace.off("beforeEndOperation", delayedExecAceCommand); + var cmd = ace.state.cm.vimCmd; + if (cmd) { + ace.execCommand(cmd.exec ? cmd : cmd.name, cmd.args); + } + ace.curOp = ace.prevOp; + } + actions.fold = function(cm, actionArgs, vim) { + cm.ace.execCommand(['toggleFoldWidget', 'toggleFoldWidget', 'foldOther', 'unfoldall' + ][(actionArgs.all ? 2 : 0) + (actionArgs.open ? 1 : 0)]); + }; + + exports.handler.defaultKeymap = defaultKeymap; + exports.handler.actions = actions; + exports.Vim = Vim; +}); (function() { + window.require(["ace/keyboard/vim"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/keybinding-vscode.js b/app/Resources/ui/js/ace/keybinding-vscode.js new file mode 100644 index 00000000..5ab34483 --- /dev/null +++ b/app/Resources/ui/js/ace/keybinding-vscode.js @@ -0,0 +1,262 @@ +define("ace/keyboard/vscode",["require","exports","module","ace/keyboard/hash_handler","ace/config"], function(require, exports, module) { +"use strict"; + +var HashHandler = require("../keyboard/hash_handler").HashHandler; +var config = require("../config"); + +exports.handler = new HashHandler(); +exports.handler.$id = "ace/keyboard/vscode"; + +exports.handler.addCommands([{ + name: "toggleWordWrap", + exec: function(editor) { + var wrapUsed = editor.session.getUseWrapMode(); + editor.session.setUseWrapMode(!wrapUsed); + }, + readOnly: true +}, { + name: "navigateToLastEditLocation", + exec: function(editor) { + var lastDelta = editor.session.getUndoManager().$lastDelta; + var range = (lastDelta.action == "remove")? lastDelta.start: lastDelta.end; + editor.moveCursorTo(range.row, range.column); + editor.clearSelection(); + } +}, { + name: "replaceAll", + exec: function (editor) { + if (!editor.searchBox) { + config.loadModule("ace/ext/searchbox", function(e) { + e.Search(editor, true); + }); + } else { + if (editor.searchBox.active === true && editor.searchBox.replaceOption.checked === true) { + editor.searchBox.replaceAll(); + } + } + } +}, { + name: "replaceOne", + exec: function (editor) { + if (!editor.searchBox) { + config.loadModule("ace/ext/searchbox", function(e) { + e.Search(editor, true); + }); + } else { + if (editor.searchBox.active === true && editor.searchBox.replaceOption.checked === true) { + editor.searchBox.replace(); + } + } + } +}, { + name: "selectAllMatches", + exec: function (editor) { + if (!editor.searchBox) { + config.loadModule("ace/ext/searchbox", function(e) { + e.Search(editor, false); + }); + } else { + if (editor.searchBox.active === true) { + editor.searchBox.findAll(); + } + } + } +}, { + name: "toggleFindCaseSensitive", + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function(e) { + e.Search(editor, false); + var sb = editor.searchBox; + sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked; + sb.$syncOptions(); + }); + + } +}, { + name: "toggleFindInSelection", + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function(e) { + e.Search(editor, false); + var sb = editor.searchBox; + sb.searchOption.checked = !sb.searchRange; + sb.setSearchRange(sb.searchOption.checked && sb.editor.getSelectionRange()); + sb.$syncOptions(); + }); + } +}, { + name: "toggleFindRegex", + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function(e) { + e.Search(editor, false); + var sb = editor.searchBox; + sb.regExpOption.checked = !sb.regExpOption.checked; + sb.$syncOptions(); + }); + } +}, { + name: "toggleFindWholeWord", + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function(e) { + e.Search(editor, false); + var sb = editor.searchBox; + sb.wholeWordOption.checked = !sb.wholeWordOption.checked; + sb.$syncOptions(); + }); + } +}, { + name: "removeSecondaryCursors", + exec: function (editor) { + var ranges = editor.selection.ranges; + if (ranges && ranges.length > 1) + editor.selection.toSingleRange(ranges[ranges.length - 1]); + else + editor.selection.clearSelection(); + } +}]); + + +[{ + bindKey: {mac: "Ctrl-G", win: "Ctrl-G"}, + name: "gotoline" +}, { + bindKey: {mac: "Command-Shift-L|Command-F2", win: "Ctrl-Shift-L|Ctrl-F2"}, + name: "findAll" +}, { + bindKey: {mac: "Shift-F8|Shift-Option-F8", win: "Shift-F8|Shift-Alt-F8"}, + name: "goToPreviousError" +}, { + bindKey: {mac: "F8|Option-F8", win: "F8|Alt-F8"}, + name: "goToNextError" +}, { + bindKey: {mac: "Command-Shift-P|F1", win: "Ctrl-Shift-P|F1"}, + name: "openCommandPallete" +}, { + bindKey: {mac: "Command-K|Command-S", win: "Ctrl-K|Ctrl-S"}, + name: "showKeyboardShortcuts" +}, { + bindKey: {mac: "Shift-Option-Up", win: "Alt-Shift-Up"}, + name: "copylinesup" +}, { + bindKey: {mac: "Shift-Option-Down", win: "Alt-Shift-Down"}, + name: "copylinesdown" +}, { + bindKey: {mac: "Command-Shift-K", win: "Ctrl-Shift-K"}, + name: "removeline" +}, { + bindKey: {mac: "Command-Enter", win: "Ctrl-Enter"}, + name: "addLineAfter" +}, { + bindKey: {mac: "Command-Shift-Enter", win: "Ctrl-Shift-Enter"}, + name: "addLineBefore" +}, { + bindKey: {mac: "Command-Shift-\\", win: "Ctrl-Shift-\\"}, + name: "jumptomatching" +}, { + bindKey: {mac: "Command-]", win: "Ctrl-]"}, + name: "blockindent" +}, { + bindKey: {mac: "Command-[", win: "Ctrl-["}, + name: "blockoutdent" +}, { + bindKey: {mac: "Ctrl-PageDown", win: "Alt-PageDown"}, + name: "pagedown" +}, { + bindKey: {mac: "Ctrl-PageUp", win: "Alt-PageUp"}, + name: "pageup" +}, { + bindKey: {mac: "Shift-Option-A", win: "Shift-Alt-A"}, + name: "toggleBlockComment" +}, { + bindKey: {mac: "Option-Z", win: "Alt-Z"}, + name: "toggleWordWrap" +}, { + bindKey: {mac: "Command-G", win: "F3|Ctrl-K Ctrl-D"}, + name: "findnext" +}, { + bindKey: {mac: "Command-Shift-G", win: "Shift-F3"}, + name: "findprevious" +}, { + bindKey: {mac: "Option-Enter", win: "Alt-Enter"}, + name: "selectAllMatches" +}, { + bindKey: {mac: "Command-D", win: "Ctrl-D"}, + name: "selectMoreAfter" +}, { + bindKey: {mac: "Command-K Command-D", win: "Ctrl-K Ctrl-D"}, + name: "selectOrFindNext" +}, { + bindKey: {mac: "Shift-Option-I", win: "Shift-Alt-I"}, + name: "splitSelectionIntoLines" +}, { + bindKey: {mac: "Command-K M", win: "Ctrl-K M"}, + name: "modeSelect" +}, { + bindKey: {mac: "Command-Option-[", win: "Ctrl-Shift-["}, + name: "toggleFoldWidget" +}, { + bindKey: {mac: "Command-Option-]", win: "Ctrl-Shift-]"}, + name: "toggleFoldWidget" +}, { + bindKey: {mac: "Command-K Command-0", win: "Ctrl-K Ctrl-0"}, + name: "foldall" +}, { + bindKey: {mac: "Command-K Command-J", win: "Ctrl-K Ctrl-J"}, + name: "unfoldall" +}, { + bindKey: { mac: "Command-K Command-1", win: "Ctrl-K Ctrl-1" }, + name: "foldOther" +}, { + bindKey: { mac: "Command-K Command-Q", win: "Ctrl-K Ctrl-Q" }, + name: "navigateToLastEditLocation" +}, { + bindKey: { mac: "Command-K Command-R|Command-K Command-S", win: "Ctrl-K Ctrl-R|Ctrl-K Ctrl-S" }, + name: "showKeyboardShortcuts" +}, { + bindKey: { mac: "Command-K Command-X", win: "Ctrl-K Ctrl-X" }, + name: "trimTrailingSpace" +}, { + bindKey: {mac: "Shift-Down|Command-Shift-Down", win: "Shift-Down|Ctrl-Shift-Down"}, + name: "selectdown" +}, { + bindKey: {mac: "Shift-Up|Command-Shift-Up", win: "Shift-Up|Ctrl-Shift-Up"}, + name: "selectup" +}, { + bindKey: {mac: "Command-Alt-Enter", win: "Ctrl-Alt-Enter"}, + name: "replaceAll" +}, { + bindKey: {mac: "Command-Shift-1", win: "Ctrl-Shift-1"}, + name: "replaceOne" +}, { + bindKey: {mac: "Option-C", win: "Alt-C"}, + name: "toggleFindCaseSensitive" +}, { + bindKey: {mac: "Option-L", win: "Alt-L"}, + name: "toggleFindInSelection" +}, { + bindKey: {mac: "Option-R", win: "Alt-R"}, + name: "toggleFindRegex" +}, { + bindKey: {mac: "Option-W", win: "Alt-W"}, + name: "toggleFindWholeWord" +}, { + bindKey: {mac: "Command-L", win: "Ctrl-L"}, + name: "expandtoline" +}, { + bindKey: {mac: "Shift-Esc", win: "Shift-Esc"}, + name: "removeSecondaryCursors" +} +].forEach(function(binding) { + var command = exports.handler.commands[binding.name]; + if (command) + command.bindKey = binding.bindKey; + exports.handler.bindKey(binding.bindKey, command || binding.name); +}); + +}); (function() { + window.require(["ace/keyboard/vscode"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/mode-plotdevice.js b/app/Resources/ui/js/ace/mode-plotdevice.js new file mode 100644 index 00000000..65835665 --- /dev/null +++ b/app/Resources/ui/js/ace/mode-plotdevice.js @@ -0,0 +1,579 @@ +define("ace/mode/plotdevice_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PlotDeviceHighlightRules = function() { + + var keywords = ( + "and|as|assert|break|class|continue|def|del|elif|else|except|exec|" + + "finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|" + + "raise|return|try|while|with|yield|async|await|nonlocal" + ).split("|"); + + var builtinConstants = ( + "True|False|None|NotImplemented|Ellipsis|__debug__" + ).split("|"); + + var builtinFunctions = ( + "abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|" + + "eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|" + + "binfile|bin|iter|property|tuple|bool|filter|len|range|type|bytearray|" + + "float|list|raw_input|unichr|callable|format|locals|reduce|unicode|" + + "chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|" + + "cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|" + + "__import__|complex|hash|min|apply|delattr|help|next|setattr|set|" + + "buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern|" + + "ascii|breakpoint|bytes" + ).split("|"); + + + var plodClasses = [ + 'Bezier', 'BezierPath', 'Color', 'Curve', 'Effect', 'Family', 'Font', + 'Gradient', 'Grob', 'Image', 'Mask', 'PathElement', 'Pattern', 'Point', + 'Region', 'Shadow', 'Size', 'Stylesheet', 'Text', 'Transform', 'Variable', + 'adict', 'ddict', 'odict' + ] + + var plodInteractive = ["MOUSEX", "MOUSEY", "KEY_UP", "KEY_DOWN", "KEY_LEFT", "KEY_RIGHT", "keydown", "mousedown", "keycode", "key"] + + var plodNumeric = [ + 'BEVEL', 'BOOLEAN', 'BUTT', 'BUTTON', 'CENTER', 'CLOSE', 'CMYK', 'CORNER', + 'CURVETO', 'DEFAULT', 'DEGREES', 'FORTYFIVE', 'FRAME', 'GREY', 'HEIGHT', 'HSV', + 'JUSTIFY', 'KEY_BACKSPACE', 'KEY_DOWN', 'KEY_ESC', 'KEY_LEFT', 'KEY_RIGHT', + 'KEY_TAB', 'KEY_UP', 'LEFT', 'LINETO', 'MITER', 'MOUSEX', 'MOUSEY', 'mousedown', + 'MOVETO', 'NORMAL', 'NUMBER', + 'PAGENUM', 'PERCENT', 'RADIANS', 'RGB', 'RIGHT', 'ROUND', 'SQUARE', 'TEXT', 'WIDTH', + 'cm', 'inch', 'mm', 'pi', 'pica', 'px', 'tau' + ] + + var plodFunctions = [ + 'align', 'alpha', 'arc', 'arcto', 'arrow', 'autoclosepath', 'autotext', + 'background', 'beginclip', 'beginpath', 'bezier', 'blend', 'canvas', + 'capstyle', 'choice', 'clear', 'clip', 'closepath', 'color', 'colormode', + 'colorrange', 'curveto', 'drawpath', 'ellipse', 'endclip', 'endpath', + 'export', 'files', 'fill', 'findpath', 'font', 'fonts', 'fontsize', + 'geometry', 'grid', 'image', 'imagesize', 'joinstyle', 'layout', 'line', 'lineheight', + 'lineto', 'mask', 'measure', 'moveto', 'nofill', 'noshadow', 'nostroke', + 'order', 'ordered', 'outputmode', 'oval', 'paginate', 'pen', 'plot', 'poly', 'pop', + 'push', 'random', 'read', 'rect', 'reset', 'rotate', 'scale', 'shadow', + 'shuffled', 'size', 'skew', 'speed', 'star', 'stroke', 'strokewidth', + 'stylesheet', 'text', 'textheight', 'textmetrics', 'textpath', 'textwidth', + 'transform', 'translate', "var", 'ximport' + ] + + var colorEntities = ('aliceblue|antiquewhite|aqua|aquamarine|azure|bark|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|snow|springgreen|steelblue|tan|teal|thistle|tomato|transparent|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen'); + var colorCodes = '(#?[a-f0-9]{3}([a-f0-9]{3}([a-f0-9]{2})?)?\\b)' + + var keywordMapper = this.createKeywordMapper({ + "invalid.deprecated": "debugger", + "support.function": builtinFunctions.concat(plodFunctions).join("|"), + "variable.language": "self|cls", + "constant.language": builtinConstants.concat(plodInteractive).join("|"), + "constant.numeric": plodNumeric.join("|"), + "keyword": keywords.concat(plodClasses).join("|") + }, "identifier"); + + + var strPre = "[uU]?"; + var strRawPre = "[rR]"; + var strFormatPre = "[fF]"; + var strRawFormatPre = "(?:[rR][fF]|[fF][rR])"; + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var octInteger = "(?:0[oO]?[0-7]+)"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var binInteger = "(?:0[bB][01]+)"; + var integer = "(?:" + decimalInteger + "|" + octInteger + "|" + hexInteger + "|" + binInteger + ")"; + + var exponent = "(?:[eE][+-]?\\d+)"; + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + exponent + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + var colorString = "'(" + colorCodes + "|" + colorEntities + ")'" + var qcolorString = '"(' + colorCodes + '|' + colorEntities + ')"' + var stringEscape = "\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})"; + + this.$rules = { + "start" : [ { + token : "keyword", + regex : '\\bdef\\b|\\bclass\\b', + next : "define" + }, { + token : "constant.numeric", // string containing a hex or named color + regex : colorString + }, { + token : "constant.numeric", // string containing a hex or named color + regex : qcolorString + }, { + token : "comment", + regex : "#.*$" + }, { + token : "string", // multi line """ string start + regex : strPre + '"{3}', + next : "qqstring3" + }, { + token : "string", // " string + regex : strPre + '"(?=.)', + next : "qqstring" + }, { + token : "string", // multi line ''' string start + regex : strPre + "'{3}", + next : "qstring3" + }, { + token : "string", // ' string + regex : strPre + "'(?=.)", + next : "qstring" + }, { + token: "string", + regex: strRawPre + '"{3}', + next: "rawqqstring3" + }, { + token: "string", + regex: strRawPre + '"(?=.)', + next: "rawqqstring" + }, { + token: "string", + regex: strRawPre + "'{3}", + next: "rawqstring3" + }, { + token: "string", + regex: strRawPre + "'(?=.)", + next: "rawqstring" + }, { + token: "string", + regex: strFormatPre + '"{3}', + next: "fqqstring3" + }, { + token: "string", + regex: strFormatPre + '"(?=.)', + next: "fqqstring" + }, { + token: "string", + regex: strFormatPre + "'{3}", + next: "fqstring3" + }, { + token: "string", + regex: strFormatPre + "'(?=.)", + next: "fqstring" + },{ + token: "string", + regex: strRawFormatPre + '"{3}', + next: "rfqqstring3" + }, { + token: "string", + regex: strRawFormatPre + '"(?=.)', + next: "rfqqstring" + }, { + token: "string", + regex: strRawFormatPre + "'{3}", + next: "rfqstring3" + }, { + token: "string", + regex: strRawFormatPre + "'(?=.)", + next: "rfqstring" + }, { + token: "keyword.operator", + regex: "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|%|@|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token: "punctuation", + regex: ",|:|;|\\->|\\+=|\\-=|\\*=|\\/=|\\/\\/=|%=|@=|&=|\\|=|^=|>>=|<<=|\\*\\*=" + }, { + token: "paren.lparen", + regex: "[\\[\\(\\{]" + }, { + token: "paren.rparen", + regex: "[\\]\\)\\}]" + }, { + token: ["keyword", "text", "entity.name.function"], + regex: "(def|class)(\\s+)([\\u00BF-\\u1FFF\\u2C00-\\uD7FF\\w]+)" + }, { + token: "text", + regex: "\\s+" + }, { + include: "constants" + }], + "define":[ + { + token : "constant.language", + regex : "def|class" + }, + { + token : "variable.language", + regex : "[A-Za-z_][A-Za-z0-9_]*", + next : "start" + }, + { + token : "text", + regex : "\\s+" + } + ], + "qqstring3": [{ + token: "constant.language.escape", + regex: stringEscape + }, { + token: "string", // multi line """ string end + regex: '"{3}', + next: "start" + }, { + defaultToken: "string" + }], + "qstring3": [{ + token: "constant.language.escape", + regex: stringEscape + }, { + token: "string", // multi line ''' string end + regex: "'{3}", + next: "start" + }, { + defaultToken: "string" + }], + "qqstring": [{ + token: "constant.language.escape", + regex: stringEscape + }, { + token: "string", + regex: "\\\\$", + next: "qqstring" + }, { + token: "string", + regex: '"|$', + next: "start" + }, { + defaultToken: "string" + }], + "qstring": [{ + token: "constant.language.escape", + regex: stringEscape + }, { + token: "string", + regex: "\\\\$", + next: "qstring" + }, { + token: "string", + regex: "'|$", + next: "start" + }, { + defaultToken: "string" + }], + "rawqqstring3": [{ + token: "string", // multi line """ string end + regex: '"{3}', + next: "start" + }, { + defaultToken: "string" + }], + "rawqstring3": [{ + token: "string", // multi line ''' string end + regex: "'{3}", + next: "start" + }, { + defaultToken: "string" + }], + "rawqqstring": [{ + token: "string", + regex: "\\\\$", + next: "rawqqstring" + }, { + token: "string", + regex: '"|$', + next: "start" + }, { + defaultToken: "string" + }], + "rawqstring": [{ + token: "string", + regex: "\\\\$", + next: "rawqstring" + }, { + token: "string", + regex: "'|$", + next: "start" + }, { + defaultToken: "string" + }], + "fqqstring3": [{ + token: "constant.language.escape", + regex: stringEscape + }, { + token: "string", // multi line """ string end + regex: '"{3}', + next: "start" + }, { + token: "paren.lparen", + regex: "{", + push: "fqstringParRules" + }, { + defaultToken: "string" + }], + "fqstring3": [{ + token: "constant.language.escape", + regex: stringEscape + }, { + token: "string", // multi line ''' string end + regex: "'{3}", + next: "start" + }, { + token: "paren.lparen", + regex: "{", + push: "fqstringParRules" + }, { + defaultToken: "string" + }], + "fqqstring": [{ + token: "constant.language.escape", + regex: stringEscape + }, { + token: "string", + regex: "\\\\$", + next: "fqqstring" + }, { + token: "string", + regex: '"|$', + next: "start" + }, { + token: "paren.lparen", + regex: "{", + push: "fqstringParRules" + }, { + defaultToken: "string" + }], + "fqstring": [{ + token: "constant.language.escape", + regex: stringEscape + }, { + token: "string", + regex: "'|$", + next: "start" + }, { + token: "paren.lparen", + regex: "{", + push: "fqstringParRules" + }, { + defaultToken: "string" + }], + "rfqqstring3": [{ + token: "string", // multi line """ string end + regex: '"{3}', + next: "start" + }, { + token: "paren.lparen", + regex: "{", + push: "fqstringParRules" + }, { + defaultToken: "string" + }], + "rfqstring3": [{ + token: "string", // multi line ''' string end + regex: "'{3}", + next: "start" + }, { + token: "paren.lparen", + regex: "{", + push: "fqstringParRules" + }, { + defaultToken: "string" + }], + "rfqqstring": [{ + token: "string", + regex: "\\\\$", + next: "rfqqstring" + }, { + token: "string", + regex: '"|$', + next: "start" + }, { + token: "paren.lparen", + regex: "{", + push: "fqstringParRules" + }, { + defaultToken: "string" + }], + "rfqstring": [{ + token: "string", + regex: "'|$", + next: "start" + }, { + token: "paren.lparen", + regex: "{", + push: "fqstringParRules" + }, { + defaultToken: "string" + }], + "fqstringParRules": [{//TODO: nested {} + token: "paren.lparen", + regex: "[\\[\\(]" + }, { + token: "paren.rparen", + regex: "[\\]\\)]" + }, { + token: "string", + regex: "\\s+" + }, { + token: "string", + regex: "'[^']*'" + }, { + token: "string", + regex: '"[^"]*"' + }, { + token: "function.support", + regex: "(!s|!r|!a)" + }, { + include: "constants" + },{ + token: 'paren.rparen', + regex: "}", + next: 'pop' + },{ + token: 'paren.lparen', + regex: "{", + push: "fqstringParRules" + }], + "constants": [{ + token: "constant.numeric", // imaginary + regex: "(?:" + floatNumber + "|\\d+)[jJ]\\b" + }, { + token: "constant.numeric", // float + regex: floatNumber + }, { + token: "constant.numeric", // long integer + regex: integer + "[lL]\\b" + }, { + token: "constant.numeric", // integer + regex: integer + "\\b" + }, { + token: ["punctuation", "function.support"],// method + regex: "(\\.)([a-zA-Z_]+)\\b" + }, { + token: keywordMapper, + regex: "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }] + }; + this.normalizeRules(); +}; + +oop.inherits(PlotDeviceHighlightRules, TextHighlightRules); + +exports.PlotDeviceHighlightRules = PlotDeviceHighlightRules; +}); + +define("ace/mode/folding/pythonic",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(markers) { + this.foldingStartMarker = new RegExp("([\\[{])(?:\\s*)$|(" + markers + ")(?:\\s*)(?:#.*)?$"); +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + if (match[1]) + return this.openingBracketBlock(session, match[1], row, match.index); + if (match[2]) + return this.indentationBlock(session, row, match.index + match[2].length); + return this.indentationBlock(session, row); + } + }; + +}).call(FoldMode.prototype); + +}); + +define("ace/mode/plotdevice",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/plotdevice_highlight_rules","ace/mode/folding/pythonic","ace/mode/behaviour/cstyle","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var PlotDeviceHighlightRules = require("./plotdevice_highlight_rules").PlotDeviceHighlightRules; +var PythonFoldMode = require("./folding/pythonic").FoldMode; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var Range = require("../range").Range; + +var Mode = function() { + this.HighlightRules = PlotDeviceHighlightRules; + this.foldingRules = new PythonFoldMode("\\:"); + this.$behaviour = new CstyleBehaviour(); // this.$defaultBehaviour +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[\:]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + var outdents = { + "pass": 1, + "return": 1, + "raise": 1, + "break": 1, + "continue": 1 + }; + + this.checkOutdent = function(state, line, input) { + if (input !== "\r\n" && input !== "\r" && input !== "\n") + return false; + + var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens; + + if (!tokens) + return false; + do { + var last = tokens.pop(); + } while (last && (last.type == "comment" || (last.type == "text" && last.value.match(/^\s+$/)))); + + if (!last) + return false; + + return (last.type == "keyword" && outdents[last.value]); + }; + + this.autoOutdent = function(state, doc, row) { + + row += 1; + var indent = this.$getIndent(doc.getLine(row)); + var tab = doc.getTabString(); + if (indent.slice(-tab.length) == tab) + doc.remove(new Range(row, indent.length-tab.length, row, indent.length)); + }; + + this.$id = "ace/mode/plotdevice"; + this.snippetFileId = "ace/snippets/plotdevice"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); (function() { + window.require(["ace/mode/plotdevice"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/mode-text.js b/app/Resources/ui/js/ace/mode-text.js new file mode 100644 index 00000000..13aa31f2 --- /dev/null +++ b/app/Resources/ui/js/ace/mode-text.js @@ -0,0 +1,9 @@ + +; (function() { + window.require(["ace/mode/text"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/snippets/plotdevice.js b/app/Resources/ui/js/ace/snippets/plotdevice.js new file mode 100644 index 00000000..b8ebfb76 --- /dev/null +++ b/app/Resources/ui/js/ace/snippets/plotdevice.js @@ -0,0 +1,276 @@ +define("ace/snippets/plotdevice",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "### general purpose\n\ +\n\ +snippet {\n\ + {\"${1:k}\":${2:v}, kw$3}\n\ +snippet kw\n\ + \"${1:k}\":${2:v}, kw$3\n\ +snippet dict\n\ + dict(${1:k}=${2:v}, dkw$3)\n\ +snippet dkw\n\ + ${1:k}=${2:v}, dkw$3\n\ +snippet t\n\ + True\n\ +snippet f\n\ + False\n\ +snippet lorem\n\ + lorem = \"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\"\n\ +snippet draw\n\ + def draw(state):\n\ + print(FRAME$1)\n\ +snippet setup\n\ + def setup(state):\n\ + $1\n\ +snippet stop\n\ + def stop(state):\n\ + $1\n\ +snippet anim\n\ + speed(${1:30})$2\n\ + def setup(state):\n\ + pass\n\ + def draw(state):\n\ + print(FRAME)\n\ + def stop(state):\n\ + pass\n\ +\n\ +\n\ +### Some handy abbreviations borrowed from python.snippets\n\ +\n\ +snippet #!\n\ + #!/usr/bin/env python3 -m plotdevice\n\ +snippet imp\n\ + import ${1:module}\n\ +snippet from\n\ + from ${1:package} import ${2:module}\n\ +snippet wh\n\ + while ${1:condition}:\n\ + ${2:# TODO: write code...}\n\ +snippet with\n\ + with ${1:expr} as ${2:var}:\n\ + ${3:# TODO: write code...}\n\ +# New Class\n\ +snippet cl\n\ + class ${1:ClassName}(${2:object}):\n\ + \"\"\"${3:docstring for $1}\"\"\"\n\ + def __init__(self, ${4:arg}):\n\ + ${5:super($1, self).__init__()}\n\ + self.$4 = $4\n\ + ${6}\n\ +# New Function\n\ +snippet def\n\ + def ${1:fname}($2):\n\ + ${3}\n\ +# New Method\n\ +snippet defs\n\ + def ${1:mname}(self, ${2:arg}):\n\ + ${3}\n\ +# self\n\ +snippet .\n\ + self.\n\ +# Ifs\n\ +snippet if\n\ + if ${1:condition}:\n\ + ${2}\n\ +snippet el\n\ + else:\n\ + ${1}\n\ +snippet ei\n\ + elif ${1:condition}:\n\ + ${2}\n\ +# For\n\ +snippet for\n\ + for ${1:item} in ${2:items}:\n\ + ${3}\n\ +# Lambda\n\ +snippet ld\n\ + ${1:var} = lambda ${2:vars} : ${3:action}\n\ +snippet try\n\ + try:\n\ + ${1:# TODO: write code...}\n\ + except ${2:Exception} as ${3:e}:\n\ + ${4:raise $3}\n\ +snippet ifmain\n\ + if __name__ == '__main__':\n\ + ${1:main()}\n\ +# __dunder__\n\ +snippet _\n\ + __${1:init}__${2}\n\ +snippet pprint\n\ + import pprint; pprint.pprint(${1})${2}\n\ +# Encodes\n\ +snippet cutf8\n\ + # -*- coding: utf-8 -*-\n\ +\n\ +\n\ +### signatures for the plotdevice api\n\ +\n\ +snippet align\n\ + align(${1:LEFT/RIGHT/CENTER/JUSTIFY})\n\ +snippet alpha\n\ + alpha(${1:1.0})\n\ +snippet arc\n\ + arc(${1:x}, ${2:y}, ${3:radius}${4:, range=${5:None}, ccw=${6:False}, close=${7:False}})\n\ +snippet arcto\n\ + arcto(${1:x}, ${2:y}${3:, cx=${4:None}, cy=${5:None}, radius=${6:None}, ccw=${7:False}, close=${8:False}})\n\ +snippet arrow\n\ + arrow(${1:x}, ${2:y}${3:, width=${4:100}, type=${5:NORMAL/FORTYFIVE}, plot=${6:True}})\n\ +snippet autoclosepath\n\ + autoclosepath(${1:close=${2:True}})\n\ +snippet autotext\n\ + autotext(${1:sourceFile})\n\ +snippet background\n\ + background()\n\ +snippet beginclip\n\ + beginclip(${1:stencil}${2:, mask=${3:False}, channel=${4:None}})\n\ +snippet beginpath\n\ + beginpath(${1:${2:x}, ${3:y}})\n\ +snippet bezier\n\ + bezier(${1:${2:x}, ${3:y}}, close=${4:True}, plot=${5:True})\n\ +snippet blend\n\ + blend(\"${1:normal}\")\n\ +snippet capstyle\n\ + capstyle(${1:style=${2:BUTT/ROUND/SQUARE}})\n\ +snippet choice\n\ + choice(${1:seq})\n\ +snippet clear\n\ + clear(${1:all})\n\ +snippet clip\n\ + clip(${1:stencil}${2:, channel=\"${3:black/white/alpha/red/green/blue}\"})\n\ +snippet mask\n\ + mask(${1:stencil}${2:, channel=\"${3:black/white/alpha/red/green/blue}\"})\n\ +snippet closepath\n\ + closepath()\n\ +snippet color\n\ + color(\"${1:black}\")\n\ +snippet colormode\n\ + colormode(${1:mode=${2:RGB/HSB/CMYK}, range=${3:None}})\n\ +snippet colorrange\n\ + colorrange(${1:maxval})\n\ +snippet curveto\n\ + curveto(${1:x1}, ${2:y1}, ${3:x2}, ${4:y2}, ${5:x}, ${6:y}${7:, close=${8:False}})\n\ +snippet drawpath\n\ + drawpath(${1:path})\n\ +snippet ellipse\n\ + ellipse(${1:x}, ${2:y}, ${3:width}, ${4:height}${5:, range=${6:None}, ccw=${7:False}, close=${8:False}, plot=${9:True}})\n\ +snippet endclip\n\ + endclip()\n\ +snippet endpath\n\ + endpath(${1:plot=${2:True}})\n\ +snippet export\n\ + export(\"${1:${2:document}.${3:mov}}\"${4:, fps=${5:None}, loop=${6:None}, bitrate=${7:1.0}})\n\ +snippet files\n\ + files(\"${1:${2:*}.${3:json}}\", case=${4:True}})\n\ +snippet fill\n\ + fill(${1:\"#${2:000}\"})\n\ +snippet findpath\n\ + findpath(${1:points}${2:, curvature=${3:1.0}})\n\ +snippet findvar\n\ + findvar(${1:name})\n\ +snippet font\n\ + font(\"${1:HelveticaNeue-Medium}\", ${2:12}})\n\ +snippet fonts\n\ + fonts(${1:like=\"${2:akzidenz}\", western=${3:True}})\n\ +snippet fontsize\n\ + fontsize(${1:12})\n\ +snippet geometry\n\ + geometry(${1:DEGREES/RADIANS/PERCENT})\n\ +snippet grid\n\ + grid(${1:cols}, ${2:rows}${3:, colSize=${4:1}, rowSize=${5:1}, shuffled=${6:False}})\n\ +snippet image\n\ + image(\"${1:image.png}\", ${2:x}, ${3:y}${4:, width=${5:None}, height=${6:None}, plot=${7:True}})\n\ +snippet imagesize\n\ + imagesize(\"${1:image.png}\"${2:, data=${3:None}})\n\ +snippet joinstyle\n\ + joinstyle(${1:MITER/ROUND/BEVEL})\n\ +snippet line\n\ + line(${1:x1}, ${2:y1}, ${3:x2}, ${4:y2}${5:, plot=${6:True}})\n\ +snippet lineheight\n\ + lineheight(${1:None})\n\ +snippet lineto\n\ + lineto(${1:x}, ${2:y}${3:, close=${4:False}})\n\ +snippet measure\n\ + measure(${1:obj})\n\ +snippet moveto\n\ + moveto(${1:x}, ${2:y})\n\ +snippet nofill\n\ + nofill()\n\ +snippet nostroke\n\ + nostroke()\n\ +snippet noshadow\n\ + noshadow()\n\ +snippet ordered\n\ + ordered(${1:seq})\n\ +snippet outputmode\n\ + outputmode(${1:RGB/CMYK})\n\ +snippet oval\n\ + oval(${1:x}, ${2:y}, ${3:width}, ${4:height}${5:, range=${6:None}, ccw=${7:False}, close=${8:False}, plot=${9:True}})\n\ +snippet pen\n\ + pen(${1:nib})\n\ +snippet plot\n\ + plot(${1:obj})\n\ +snippet poly\n\ + poly(${1:x}, ${2:y}, ${3:radius}, ${4:sides=4}${5:, plot=${6:True}})\n\ +snippet pop\n\ + pop()\n\ +snippet push\n\ + push()\n\ +snippet random\n\ + random(${1:v1=${2:None}, v2=${3:None}})\n\ +snippet read\n\ + read(${1:pth}${2:, format=${3:None}, encoding=${4:utf-8}, cols=${5:None}})\n\ +snippet rect\n\ + rect(${1:x}, ${2:y}, ${3:width}, ${4:height}${5:, roundness=${6:0.0}, plot=${7:True}})\n\ +snippet reset\n\ + reset()\n\ +snippet rotate\n\ + rotate(${1:theta})\n\ +snippet scale\n\ + scale(${1:x=${2:1}, y=${3:None}})\n\ +snippet shadow\n\ + shadow(${1:\"black\"}, blur=${2:10}, offset=${3:10})))\n\ +snippet shuffled\n\ + shuffled(${2:seq})\n\ +snippet size\n\ + size(${1:width}, ${2:height}, unit=${4:px}})\n\ +snippet skew\n\ + skew(${1:horizontal}, ${2:vertical})\n\ +snippet speed\n\ + speed(${1:fps})\n\ +snippet star\n\ + star(${1:x}, ${2:y}${3:, points=${4:20}, outer=${5:100}, inner=${6:None}, plot=${7:True}}})\n\ +snippet stroke\n\ + stroke()\n\ +snippet strokewidth\n\ + strokewidth(${1:width})\n\ +snippet text\n\ + text(\"${1:txt}\", ${2:x}, ${3:y}${4:, width=${5:None}, height=${6:None}, outline=${7:False}, plot=${8:True}})\n\ +snippet textheight\n\ + textheight(\"${1:txt}\"${2:, width=${3:None}})\n\ +snippet textmetrics\n\ + textmetrics(\"${1:txt}\"${2:, width=${3:None}, height=${4:None}})\n\ +snippet textpath\n\ + textpath(\"${1:txt}\", ${2:x}, ${3:y}${4:, width=${5:None}, height=${6:None}})\n\ +snippet textwidth\n\ + textwidth(\"${1:txt}\"${2:, width=${3:None}})\n\ +snippet transform\n\ + transform()\n\ +snippet transform()\n\ + with transform(${1:${2:CENTER/CORNER, }${3:...}}):\n\ + $4\n\ +snippet translate\n\ + translate(${1:x}, ${2:y})\n\ +snippet ximport\n\ + ${1:libName} = ximport(\"$1\")\n\ +"; +exports.scope = "plotdevice"; + +}); (function() { + window.require(["ace/snippets/plotdevice"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/snippets/text.js b/app/Resources/ui/js/ace/snippets/text.js new file mode 100644 index 00000000..85b4d10e --- /dev/null +++ b/app/Resources/ui/js/ace/snippets/text.js @@ -0,0 +1,9 @@ + +; (function() { + window.require(["ace/snippets/text"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-ambiance.js b/app/Resources/ui/js/ace/theme-ambiance.js new file mode 100644 index 00000000..0830aed5 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-ambiance.js @@ -0,0 +1,185 @@ +define("ace/theme/ambiance",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-ambiance"; +exports.cssText = ".ace-ambiance .ace_gutter {\ +background-color: #3d3d3d;\ +background-image: linear-gradient(left, #3D3D3D, #333);\ +background-repeat: repeat-x;\ +border-right: 1px solid #4d4d4d;\ +text-shadow: 0px 1px 1px #4d4d4d;\ +color: #222;\ +}\ +.ace-ambiance .ace_gutter-layer {\ +background: repeat left top;\ +}\ +.ace-ambiance .ace_gutter-active-line {\ +background-color: #3F3F3F;\ +}\ +.ace-ambiance .ace_fold-widget {\ +text-align: center;\ +}\ +.ace-ambiance .ace_fold-widget:hover {\ +color: #777;\ +}\ +.ace-ambiance .ace_fold-widget.ace_start,\ +.ace-ambiance .ace_fold-widget.ace_end,\ +.ace-ambiance .ace_fold-widget.ace_closed{\ +background: none !important;\ +border: none;\ +box-shadow: none;\ +}\ +.ace-ambiance .ace_fold-widget.ace_start:after {\ +content: '▾'\ +}\ +.ace-ambiance .ace_fold-widget.ace_end:after {\ +content: '▴'\ +}\ +.ace-ambiance .ace_fold-widget.ace_closed:after {\ +content: '‣'\ +}\ +.ace-ambiance .ace_print-margin {\ +border-left: 1px dotted #2D2D2D;\ +right: 0;\ +background: #262626;\ +}\ +.ace-ambiance .ace_scroller {\ +-webkit-box-shadow: inset 0 0 10px black;\ +-moz-box-shadow: inset 0 0 10px black;\ +-o-box-shadow: inset 0 0 10px black;\ +box-shadow: inset 0 0 10px black;\ +}\ +.ace-ambiance {\ +color: #E6E1DC;\ +background-color: #202020;\ +}\ +.ace-ambiance .ace_cursor {\ +border-left: 1px solid #7991E8;\ +}\ +.ace-ambiance .ace_overwrite-cursors .ace_cursor {\ +border: 1px solid #FFE300;\ +background: #766B13;\ +}\ +.ace-ambiance.normal-mode .ace_cursor-layer {\ +z-index: 0;\ +}\ +.ace-ambiance .ace_marker-layer .ace_selection {\ +background: rgba(221, 240, 255, 0.20);\ +}\ +.ace-ambiance .ace_marker-layer .ace_selected-word {\ +border-radius: 4px;\ +border: 8px solid #3f475d;\ +box-shadow: 0 0 4px black;\ +}\ +.ace-ambiance .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174);\ +}\ +.ace-ambiance .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 255, 255, 0.25);\ +}\ +.ace-ambiance .ace_marker-layer .ace_active-line {\ +background: rgba(255, 255, 255, 0.031);\ +}\ +.ace-ambiance .ace_invisible {\ +color: #333;\ +}\ +.ace-ambiance .ace_paren {\ +color: #24C2C7;\ +}\ +.ace-ambiance .ace_keyword {\ +color: #cda869;\ +}\ +.ace-ambiance .ace_keyword.ace_operator {\ +color: #fa8d6a;\ +}\ +.ace-ambiance .ace_punctuation.ace_operator {\ +color: #fa8d6a;\ +}\ +.ace-ambiance .ace_identifier {\ +}\ +.ace-ambiance .ace-statement {\ +color: #cda869;\ +}\ +.ace-ambiance .ace_constant {\ +color: #CF7EA9;\ +}\ +.ace-ambiance .ace_constant.ace_language {\ +color: #CF7EA9;\ +}\ +.ace-ambiance .ace_constant.ace_library {\ +}\ +.ace-ambiance .ace_constant.ace_numeric {\ +color: #78CF8A;\ +}\ +.ace-ambiance .ace_invalid {\ +text-decoration: underline;\ +}\ +.ace-ambiance .ace_invalid.ace_illegal {\ +color:#F8F8F8;\ +background-color: rgba(86, 45, 86, 0.75);\ +}\ +.ace-ambiance .ace_invalid,\ +.ace-ambiance .ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #D2A8A1;\ +}\ +.ace-ambiance .ace_support {\ +color: #9B859D;\ +}\ +.ace-ambiance .ace_support.ace_function {\ +color: #DAD085;\ +}\ +.ace-ambiance .ace_function.ace_buildin {\ +color: #9b859d;\ +}\ +.ace-ambiance .ace_string {\ +color: #8f9d6a;\ +}\ +.ace-ambiance .ace_string.ace_regexp {\ +color: #DAD085;\ +}\ +.ace-ambiance .ace_comment {\ +font-style: italic;\ +color: #555;\ +}\ +.ace-ambiance .ace_comment.ace_doc {\ +}\ +.ace-ambiance .ace_comment.ace_doc.ace_tag {\ +color: #666;\ +font-style: normal;\ +}\ +.ace-ambiance .ace_definition,\ +.ace-ambiance .ace_type {\ +color: #aac6e3;\ +}\ +.ace-ambiance .ace_variable {\ +color: #9999cc;\ +}\ +.ace-ambiance .ace_variable.ace_language {\ +color: #9b859d;\ +}\ +.ace-ambiance .ace_xml-pe {\ +color: #494949;\ +}\ +.ace-ambiance .ace_gutter-layer,\ +.ace-ambiance .ace_text-layer {\ +background-image: url(\"data:image/png;base64,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\");\ +}\ +.ace-ambiance .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); + +}); (function() { + window.require(["ace/theme/ambiance"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-blackboard.js b/app/Resources/ui/js/ace/theme-blackboard.js new file mode 100644 index 00000000..4dee0195 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-blackboard.js @@ -0,0 +1,92 @@ +define("ace/theme/blackboard",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-blackboard"; +exports.cssText = "\ +.ace-blackboard .ace_gutter {\ +background: #0c1021;\ +color: #AEAEAE;\ +}\ +.ace-blackboard .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-blackboard {\ +background-color: #0C1021;\ +color: #F8F8F8;\ +}\ +.ace-blackboard .ace_cursor {\ +color: rgba(255, 255, 255, 0.65);\ +}\ +.ace-blackboard .ace_marker-layer .ace_selection {\ +background: #325087;\ +}\ +.ace-blackboard.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #0C1021;\ +border-radius: 2px;\ +}\ +.ace-blackboard .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174);\ +}\ +.ace-blackboard .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 255, 255, 0.25);\ +}\ +.ace-blackboard .ace_marker-layer .ace_active-line {\ +background: rgba(255, 255, 255, 0.059);\ +}\ +.ace-blackboard .ace_gutter-active-line {\ +background-color: rgba(255, 255, 255, 0.059);\ +}\ +.ace-blackboard .ace_marker-layer .ace_selected-word {\ +border: 1px solid #253B76;\ +}\ +.ace-blackboard .ace_fold {\ +background-color: #FBDE2D;\ +border-color: #F8F8F8;\ +}\ +.ace-blackboard .ace_keyword,\ +.ace-blackboard .ace_storage {\ +color: #FBDE2D;\ +}\ +.ace-blackboard .ace_constant {\ +color: #D8FA3C;\ +}\ +.ace-blackboard .ace_support {\ +color: #8DA6CE;\ +}\ +.ace-blackboard .ace_invalid.ace_illegal {\ +color: #F8F8F8;\ +background-color: #9D1E15;\ +}\ +.ace-blackboard .ace_invalid.ace_deprecated {\ +font-style: italic;\ +color: #AB2A1D;\ +}\ +.ace-blackboard .ace_string {\ +color: #61CE3C;\ +}\ +.ace-blackboard .ace_invisible{\ +color:rgba(174, 174, 174, 0.5);\ +}\ +.ace-blackboard .ace_comment {\ +color: #AEAEAE;\ +}\ +.ace-blackboard .ace_meta.ace_tag {\ +color: #7F90AA;\ +}\ +.ace-blackboard .ace_variable,\ +.ace-blackboard .ace_variable.ace_language {\ +color:rgba(255, 100, 0, 1.0);\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); (function() { + window.require(["ace/theme/blackboard"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-chaos.js b/app/Resources/ui/js/ace/theme-chaos.js new file mode 100644 index 00000000..630a72f7 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-chaos.js @@ -0,0 +1,163 @@ +define("ace/theme/chaos",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-chaos"; +exports.cssText = ".ace-chaos .ace_gutter {\ +background: #141414;\ +color: #595959;\ +border-right: 1px solid #282828;\ +}\ +.ace-chaos .ace_gutter-cell.ace_warning {\ +background-image: none;\ +background: #FC0;\ +border-left: none;\ +padding-left: 0;\ +color: #000;\ +}\ +.ace-chaos .ace_gutter-cell.ace_error {\ +background-position: -6px center;\ +background-image: none;\ +background: #F10;\ +border-left: none;\ +padding-left: 0;\ +color: #000;\ +}\ +.ace-chaos .ace_print-margin {\ +border-left: 1px solid #555;\ +right: 0;\ +background: #1D1D1D;\ +}\ +.ace-chaos {\ +background-color: #161616;\ +color: #E6E1DC;\ +}\ +.ace-chaos .ace_cursor {\ +border-left: 2px solid #FFFFFF;\ +}\ +.ace-chaos .ace_cursor.ace_overwrite {\ +border-left: 0px;\ +border-bottom: 1px solid #FFFFFF;\ +}\ +.ace-chaos .ace_marker-layer .ace_selection {\ +background: #494836;\ +}\ +.ace-chaos .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174);\ +}\ +.ace-chaos .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #FCE94F;\ +}\ +.ace-chaos .ace_marker-layer .ace_active-line {\ +background: #333;\ +}\ +.ace-chaos .ace_gutter-active-line {\ +background-color: #222;\ +}\ +.ace-chaos .ace_invisible {\ +color: #404040;\ +}\ +.ace-chaos .ace_keyword {\ +color:#00698F;\ +}\ +.ace-chaos .ace_keyword.ace_operator {\ +color:#FF308F;\ +}\ +.ace-chaos .ace_constant {\ +color:#1EDAFB;\ +}\ +.ace-chaos .ace_constant.ace_language {\ +color:#FDC251;\ +}\ +.ace-chaos .ace_constant.ace_library {\ +color:#8DFF0A;\ +}\ +.ace-chaos .ace_constant.ace_numeric {\ +color:#58C554;\ +}\ +.ace-chaos .ace_invalid {\ +color:#FFFFFF;\ +background-color:#990000;\ +}\ +.ace-chaos .ace_invalid.ace_deprecated {\ +color:#FFFFFF;\ +background-color:#990000;\ +}\ +.ace-chaos .ace_support {\ +color: #999;\ +}\ +.ace-chaos .ace_support.ace_function {\ +color:#00AEEF;\ +}\ +.ace-chaos .ace_function {\ +color:#00AEEF;\ +}\ +.ace-chaos .ace_string {\ +color:#58C554;\ +}\ +.ace-chaos .ace_comment {\ +color:#555;\ +font-style:italic;\ +padding-bottom: 0px;\ +}\ +.ace-chaos .ace_variable {\ +color:#997744;\ +}\ +.ace-chaos .ace_meta.ace_tag {\ +color:#BE53E6;\ +}\ +.ace-chaos .ace_entity.ace_other.ace_attribute-name {\ +color:#FFFF89;\ +}\ +.ace-chaos .ace_markup.ace_underline {\ +text-decoration: underline;\ +}\ +.ace-chaos .ace_fold-widget {\ +text-align: center;\ +}\ +.ace-chaos .ace_fold-widget:hover {\ +color: #777;\ +}\ +.ace-chaos .ace_fold-widget.ace_start,\ +.ace-chaos .ace_fold-widget.ace_end,\ +.ace-chaos .ace_fold-widget.ace_closed{\ +background: none !important;\ +border: none;\ +box-shadow: none;\ +}\ +.ace-chaos .ace_fold-widget.ace_start:after {\ +content: '▾'\ +}\ +.ace-chaos .ace_fold-widget.ace_end:after {\ +content: '▴'\ +}\ +.ace-chaos .ace_fold-widget.ace_closed:after {\ +content: '‣'\ +}\ +.ace-chaos .ace_indent-guide {\ +border-right:1px dotted #333;\ +margin-right:-1px;\ +}\ +.ace-chaos .ace_fold { \ +background: #222; \ +border-radius: 3px; \ +color: #7AF; \ +border: none; \ +}\ +.ace-chaos .ace_fold:hover {\ +background: #CCC; \ +color: #000;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); + +}); (function() { + window.require(["ace/theme/chaos"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-chrome.js b/app/Resources/ui/js/ace/theme-chrome.js new file mode 100644 index 00000000..534625a7 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-chrome.js @@ -0,0 +1,134 @@ +define("ace/theme/chrome",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-chrome"; +exports.cssText = ".ace-chrome .ace_gutter {\ +background: #ebebeb;\ +color: #333;\ +overflow : hidden;\ +}\ +.ace-chrome .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-chrome {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-chrome .ace_cursor {\ +color: black;\ +}\ +.ace-chrome .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-chrome .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-chrome .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-chrome .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-chrome .ace_invalid {\ +background-color: rgb(153, 0, 0);\ +color: white;\ +}\ +.ace-chrome .ace_fold {\ +}\ +.ace-chrome .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-chrome .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-chrome .ace_support.ace_type,\ +.ace-chrome .ace_support.ace_class\ +.ace-chrome .ace_support.ace_other {\ +color: rgb(109, 121, 222);\ +}\ +.ace-chrome .ace_variable.ace_parameter {\ +font-style:italic;\ +color:#FD971F;\ +}\ +.ace-chrome .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-chrome .ace_comment {\ +color: #236e24;\ +}\ +.ace-chrome .ace_comment.ace_doc {\ +color: #236e24;\ +}\ +.ace-chrome .ace_comment.ace_doc.ace_tag {\ +color: #236e24;\ +}\ +.ace-chrome .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-chrome .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-chrome .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-chrome .ace_entity.ace_name.ace_function {\ +color: #0000A2;\ +}\ +.ace-chrome .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-chrome .ace_list {\ +color:rgb(185, 6, 144);\ +}\ +.ace-chrome .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-chrome .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-chrome .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-chrome .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-chrome .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-chrome .ace_gutter-active-line {\ +background-color : #dcdcdc;\ +}\ +.ace-chrome .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-chrome .ace_storage,\ +.ace-chrome .ace_keyword,\ +.ace-chrome .ace_meta.ace_tag {\ +color: rgb(147, 15, 128);\ +}\ +.ace-chrome .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-chrome .ace_string {\ +color: #1A1AA6;\ +}\ +.ace-chrome .ace_entity.ace_other.ace_attribute-name {\ +color: #994409;\ +}\ +.ace-chrome .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/chrome"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-cloud9_day.js b/app/Resources/ui/js/ace/theme-cloud9_day.js new file mode 100644 index 00000000..1e5ee0ea --- /dev/null +++ b/app/Resources/ui/js/ace/theme-cloud9_day.js @@ -0,0 +1,135 @@ +define("ace/theme/cloud9_day",["require","exports","module","ace/lib/dom"], function (require, exports, module) { + "use strict"; + + exports.isDark = false; + exports.cssClass = "ace-cloud9-day"; + exports.cssText = ".ace-cloud9-day .ace_gutter {\ +background: #ECECEC;\ +color: #333;\ +}\ +.ace-cloud9-day .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-cloud9-day .ace_fold {\ +background-color: #6B72E6;\ +}\ +.ace-cloud9-day {\ +background-color: #FBFBFB;\ +color: black;\ +}\ +.ace-cloud9-day .ace_cursor {\ +color: black;\ +}\ +.ace-cloud9-day .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-cloud9-day .ace_storage,\ +.ace-cloud9-day .ace_keyword {\ +color: rgb(24, 122, 234);\ +}\ +.ace-cloud9-day .ace_constant {\ +color: rgb(197, 6, 11);\ +}\ +.ace-cloud9-day .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-cloud9-day .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-cloud9-day .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-cloud9-day .ace_invalid {\ +background-color: rgba(255, 0, 0, 0.1);\ +color: red;\ +}\ +.ace-cloud9-day .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-cloud9-day .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-cloud9-day .ace_support.ace_type,\ +.ace-cloud9-day .ace_support.ace_class {\ +color: rgb(109, 121, 222);\ +}\ +.ace-cloud9-day .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-cloud9-day .ace_string {\ +color: rgb(3, 106, 7);\ +}\ +.ace-cloud9-day .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-cloud9-day .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-cloud9-day .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-cloud9-day .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-cloud9-day .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-cloud9-day .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-cloud9-day .ace_entity.ace_name.ace_function {\ +color: #0000A2;\ +}\ +.ace-cloud9-day .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-cloud9-day .ace_list {\ +color: rgb(185, 6, 144);\ +}\ +.ace-cloud9-day .ace_meta.ace_tag {\ +color: rgb(0, 22, 142);\ +}\ +.ace-cloud9-day .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-cloud9-day .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-cloud9-day.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px white;\ +}\ +.ace-cloud9-day .ace_marker-layer .ace_step {\ +background: rgb(247, 237, 137);\ +}\ +.ace-cloud9-day .ace_marker-layer .ace_stack {\ +background: #BAE0A0;\ +}\ +.ace-cloud9-day .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-cloud9-day .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-cloud9-day .ace_gutter-active-line {\ +background-color: #E5E5E5;\ +}\ +.ace-cloud9-day .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-cloud9-day .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + + var dom = require("../lib/dom"); + dom.importCssString(exports.cssText, exports.cssClass); +}); (function() { + window.require(["ace/theme/cloud9_day"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-cloud9_night.js b/app/Resources/ui/js/ace/theme-cloud9_night.js new file mode 100644 index 00000000..c7d5186a --- /dev/null +++ b/app/Resources/ui/js/ace/theme-cloud9_night.js @@ -0,0 +1,129 @@ +define("ace/theme/cloud9_night",["require","exports","module","ace/lib/dom"], function (require, exports, module) { + exports.isDark = true; + exports.cssClass = "ace-cloud9-night"; + exports.cssText = ".ace-cloud9-night .ace_gutter {\ +background: #303130;\ +color: #eee\ +}\ +.ace-cloud9-night .ace_print-margin {\ +width: 1px;\ +background: #222\ +}\ +.ace-cloud9-night {\ +background-color: #181818;\ +color: #EBEBEB\ +}\ +.ace-cloud9-night .ace_cursor {\ +color: #9F9F9F\ +}\ +.ace-cloud9-night .ace_marker-layer .ace_selection {\ +background: #424242\ +}\ +.ace-cloud9-night.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #000000;\ +border-radius: 2px\ +}\ +.ace-cloud9-night .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-cloud9-night .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #888888\ +}\ +.ace-cloud9-night .ace_marker-layer .ace_highlight {\ +border: 1px solid rgb(110, 119, 0);\ +border-bottom: 0;\ +box-shadow: inset 0 -1px rgb(110, 119, 0);\ +margin: -1px 0 0 -1px;\ +background: rgba(255, 235, 0, 0.1);\ +}\ +.ace-cloud9-night .ace_marker-layer .ace_active-line {\ +background: #292929\ +}\ +.ace-cloud9-night .ace_gutter-active-line {\ +background-color: #3D3D3D\ +}\ +.ace-cloud9-night .ace_stack {\ +background-color: rgb(66, 90, 44)\ +}\ +.ace-cloud9-night .ace_marker-layer .ace_selected-word {\ +border: 1px solid #888888\ +}\ +.ace-cloud9-night .ace_invisible {\ +color: #343434\ +}\ +.ace-cloud9-night .ace_keyword,\ +.ace-cloud9-night .ace_meta,\ +.ace-cloud9-night .ace_storage,\ +.ace-cloud9-night .ace_storage.ace_type,\ +.ace-cloud9-night .ace_support.ace_type {\ +color: #C397D8\ +}\ +.ace-cloud9-night .ace_keyword.ace_operator {\ +color: #70C0B1\ +}\ +.ace-cloud9-night .ace_constant.ace_character,\ +.ace-cloud9-night .ace_constant.ace_language,\ +.ace-cloud9-night .ace_constant.ace_numeric,\ +.ace-cloud9-night .ace_keyword.ace_other.ace_unit,\ +.ace-cloud9-night .ace_support.ace_constant,\ +.ace-cloud9-night .ace_variable.ace_parameter {\ +color: #E78C45\ +}\ +.ace-cloud9-night .ace_constant.ace_other {\ +color: #EEEEEE\ +}\ +.ace-cloud9-night .ace_invalid {\ +color: #CED2CF;\ +background-color: #DF5F5F\ +}\ +.ace-cloud9-night .ace_invalid.ace_deprecated {\ +color: #CED2CF;\ +background-color: #B798BF\ +}\ +.ace-cloud9-night .ace_fold {\ +background-color: #7AA6DA;\ +border-color: #DEDEDE\ +}\ +.ace-cloud9-night .ace_entity.ace_name.ace_function,\ +.ace-cloud9-night .ace_support.ace_function,\ +.ace-cloud9-night .ace_variable:not(.ace_parameter),\ +.ace-cloud9-night .ace_constant:not(.ace_numeric) {\ +color: #7AA6DA\ +}\ +.ace-cloud9-night .ace_support.ace_class,\ +.ace-cloud9-night .ace_support.ace_type {\ +color: #E7C547\ +}\ +.ace-cloud9-night .ace_heading,\ +.ace-cloud9-night .ace_markup.ace_heading,\ +.ace-cloud9-night .ace_string {\ +color: #B9CA4A\ +}\ +.ace-cloud9-night .ace_entity.ace_name.ace_tag,\ +.ace-cloud9-night .ace_entity.ace_other.ace_attribute-name,\ +.ace-cloud9-night .ace_meta.ace_tag,\ +.ace-cloud9-night .ace_string.ace_regexp,\ +.ace-cloud9-night .ace_variable {\ +color: #D54E53\ +}\ +.ace-cloud9-night .ace_comment {\ +color: #969896\ +}\ +.ace-cloud9-night .ace_c9searchresults.ace_keyword {\ +color: #C2C280;\ +}\ +.ace-cloud9-night .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ +}"; + + var dom = require("../lib/dom"); + dom.importCssString(exports.cssText, exports.cssClass); +}); (function() { + window.require(["ace/theme/cloud9_night"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-cloud9_night_low_color.js b/app/Resources/ui/js/ace/theme-cloud9_night_low_color.js new file mode 100644 index 00000000..0ee9b235 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-cloud9_night_low_color.js @@ -0,0 +1,118 @@ +define("ace/theme/cloud9_night_low_color",["require","exports","module","ace/lib/dom"], function (require, exports, module) { + exports.isDark = true; + exports.cssClass = "ace-cloud9-night-low-color"; + exports.cssText = ".ace-cloud9-night-low-color .ace_gutter {\ +background: #303130;\ +color: #eee\ +}\ +.ace-cloud9-night-low-color .ace_print-margin {\ +width: 1px;\ +background: #222\ +}\ +.ace-cloud9-night-low-color {\ +background-color: #181818;\ +color: #EBEBEB\ +}\ +.ace-cloud9-night-low-color .ace_cursor {\ +color: #9F9F9F\ +}\ +.ace-cloud9-night-low-color .ace_marker-layer .ace_selection {\ +background: #424242\ +}\ +.ace-cloud9-night-low-color.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #000000;\ +border-radius: 2px\ +}\ +.ace-cloud9-night-low-color .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-cloud9-night-low-color .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #888888\ +}\ +.ace-cloud9-night-low-color .ace_marker-layer .ace_highlight {\ +border: 1px solid rgb(110, 119, 0);\ +border-bottom: 0;\ +box-shadow: inset 0 -1px rgb(110, 119, 0);\ +margin: -1px 0 0 -1px;\ +background: rgba(255, 235, 0, 0.1);\ +}\ +.ace-cloud9-night-low-color .ace_marker-layer .ace_active-line {\ +background: #292929\ +}\ +.ace-cloud9-night-low-color .ace_gutter-active-line {\ +background-color: #3D3D3D\ +}\ +.ace-cloud9-night-low-color .ace_stack {\ +background-color: rgb(66, 90, 44)\ +}\ +.ace-cloud9-night-low-color .ace_marker-layer .ace_selected-word {\ +border: 1px solid #888888\ +}\ +.ace-cloud9-night-low-color .ace_invisible {\ +color: #343434\ +}\ +.ace-cloud9-night-low-color .ace_keyword,\ +.ace-cloud9-night-low-color .ace_meta,\ +.ace-cloud9-night-low-color .ace_storage {\ +color: #C397D8\ +}\ +.ace-cloud9-night-low-color .ace_keyword.ace_operator {\ +color: #70C0B1\ +}\ +.ace-cloud9-night-low-color .ace_constant.ace_character,\ +.ace-cloud9-night-low-color .ace_constant.ace_language,\ +.ace-cloud9-night-low-color .ace_constant.ace_numeric,\ +.ace-cloud9-night-low-color .ace_keyword.ace_other.ace_unit {\ +color: #DAA637\ +}\ +.ace-cloud9-night-low-color .ace_constant.ace_other {\ +color: #EEEEEE\ +}\ +.ace-cloud9-night-low-color .ace_invalid {\ +color: #CED2CF;\ +background-color: #DF5F5F\ +}\ +.ace-cloud9-night-low-color .ace_invalid.ace_deprecated {\ +color: #CED2CF;\ +background-color: #B798BF\ +}\ +.ace-cloud9-night-low-color .ace_fold {\ +background-color: #7AA6DA;\ +border-color: #DEDEDE\ +}\ +.ace-cloud9-night-low-color .ace_entity.ace_name.ace_function,\ +.ace-cloud9-night-low-color .ace_support.ace_function,\ +.ace-cloud9-night-low-color .ace_variable:not(.ace_parameter),\ +.ace-cloud9-night-low-color .ace_constant:not(.ace_numeric) {\ +color: #7AA6DA\ +}\ +.ace-cloud9-night-low-color .ace_support.ace_class,\ +.ace-cloud9-night-low-color .ace_support.ace_type {\ +color: #E7C547\ +}\ +.ace-cloud9-night-low-color .ace_heading,\ +.ace-cloud9-night-low-color .ace_markup.ace_heading,\ +.ace-cloud9-night-low-color .ace_string {\ +color: #B9CA4A\ +}\ +.ace-cloud9-night-low-color .ace_comment {\ +color: #969896\ +}\ +.ace-cloud9-night-low-color .ace_c9searchresults.ace_keyword {\ +color: #C2C280;\ +}\ +.ace-cloud9-night-low-color .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ +}"; + + var dom = require("../lib/dom"); + dom.importCssString(exports.cssText, exports.cssClass); +}); (function() { + window.require(["ace/theme/cloud9_night_low_color"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-clouds.js b/app/Resources/ui/js/ace/theme-clouds.js new file mode 100644 index 00000000..2673f62f --- /dev/null +++ b/app/Resources/ui/js/ace/theme-clouds.js @@ -0,0 +1,102 @@ +define("ace/theme/clouds",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-clouds"; +exports.cssText = ".ace-clouds .ace_gutter {\ +background: #ebebeb;\ +color: #333\ +}\ +.ace-clouds .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-clouds {\ +background-color: #FFFFFF;\ +color: #000000\ +}\ +.ace-clouds .ace_cursor {\ +color: #000000\ +}\ +.ace-clouds .ace_marker-layer .ace_selection {\ +background: #BDD5FC\ +}\ +.ace-clouds.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #FFFFFF;\ +}\ +.ace-clouds .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0)\ +}\ +.ace-clouds .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #BFBFBF\ +}\ +.ace-clouds .ace_marker-layer .ace_active-line {\ +background: #FFFBD1\ +}\ +.ace-clouds .ace_gutter-active-line {\ +background-color : #dcdcdc\ +}\ +.ace-clouds .ace_marker-layer .ace_selected-word {\ +border: 1px solid #BDD5FC\ +}\ +.ace-clouds .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-clouds .ace_keyword,\ +.ace-clouds .ace_meta,\ +.ace-clouds .ace_support.ace_constant.ace_property-value {\ +color: #AF956F\ +}\ +.ace-clouds .ace_keyword.ace_operator {\ +color: #484848\ +}\ +.ace-clouds .ace_keyword.ace_other.ace_unit {\ +color: #96DC5F\ +}\ +.ace-clouds .ace_constant.ace_language {\ +color: #39946A\ +}\ +.ace-clouds .ace_constant.ace_numeric {\ +color: #46A609\ +}\ +.ace-clouds .ace_constant.ace_character.ace_entity {\ +color: #BF78CC\ +}\ +.ace-clouds .ace_invalid {\ +background-color: #FF002A\ +}\ +.ace-clouds .ace_fold {\ +background-color: #AF956F;\ +border-color: #000000\ +}\ +.ace-clouds .ace_storage,\ +.ace-clouds .ace_support.ace_class,\ +.ace-clouds .ace_support.ace_function,\ +.ace-clouds .ace_support.ace_other,\ +.ace-clouds .ace_support.ace_type {\ +color: #C52727\ +}\ +.ace-clouds .ace_string {\ +color: #5D90CD\ +}\ +.ace-clouds .ace_comment {\ +color: #BCC8BA\ +}\ +.ace-clouds .ace_entity.ace_name.ace_tag,\ +.ace-clouds .ace_entity.ace_other.ace_attribute-name {\ +color: #606060\ +}\ +.ace-clouds .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/clouds"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-clouds_midnight.js b/app/Resources/ui/js/ace/theme-clouds_midnight.js new file mode 100644 index 00000000..d88ece21 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-clouds_midnight.js @@ -0,0 +1,103 @@ +define("ace/theme/clouds_midnight",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-clouds-midnight"; +exports.cssText = ".ace-clouds-midnight .ace_gutter {\ +background: #232323;\ +color: #929292\ +}\ +.ace-clouds-midnight .ace_print-margin {\ +width: 1px;\ +background: #232323\ +}\ +.ace-clouds-midnight {\ +background-color: #191919;\ +color: #929292\ +}\ +.ace-clouds-midnight .ace_cursor {\ +color: #7DA5DC\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_selection {\ +background: #000000\ +}\ +.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #191919;\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #BFBFBF\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_active-line {\ +background: rgba(215, 215, 215, 0.031)\ +}\ +.ace-clouds-midnight .ace_gutter-active-line {\ +background-color: rgba(215, 215, 215, 0.031)\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_selected-word {\ +border: 1px solid #000000\ +}\ +.ace-clouds-midnight .ace_invisible {\ +color: #666\ +}\ +.ace-clouds-midnight .ace_keyword,\ +.ace-clouds-midnight .ace_meta,\ +.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {\ +color: #927C5D\ +}\ +.ace-clouds-midnight .ace_keyword.ace_operator {\ +color: #4B4B4B\ +}\ +.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {\ +color: #366F1A\ +}\ +.ace-clouds-midnight .ace_constant.ace_language {\ +color: #39946A\ +}\ +.ace-clouds-midnight .ace_constant.ace_numeric {\ +color: #46A609\ +}\ +.ace-clouds-midnight .ace_constant.ace_character.ace_entity {\ +color: #A165AC\ +}\ +.ace-clouds-midnight .ace_invalid {\ +color: #FFFFFF;\ +background-color: #E92E2E\ +}\ +.ace-clouds-midnight .ace_fold {\ +background-color: #927C5D;\ +border-color: #929292\ +}\ +.ace-clouds-midnight .ace_storage,\ +.ace-clouds-midnight .ace_support.ace_class,\ +.ace-clouds-midnight .ace_support.ace_function,\ +.ace-clouds-midnight .ace_support.ace_other,\ +.ace-clouds-midnight .ace_support.ace_type {\ +color: #E92E2E\ +}\ +.ace-clouds-midnight .ace_string {\ +color: #5D90CD\ +}\ +.ace-clouds-midnight .ace_comment {\ +color: #3C403B\ +}\ +.ace-clouds-midnight .ace_entity.ace_name.ace_tag,\ +.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {\ +color: #606060\ +}\ +.ace-clouds-midnight .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/clouds_midnight"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-cobalt.js b/app/Resources/ui/js/ace/theme-cobalt.js new file mode 100644 index 00000000..5459c756 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-cobalt.js @@ -0,0 +1,120 @@ +define("ace/theme/cobalt",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-cobalt"; +exports.cssText = ".ace-cobalt .ace_gutter {\ +background: #011e3a;\ +color: rgb(128,145,160)\ +}\ +.ace-cobalt .ace_print-margin {\ +width: 1px;\ +background: #555555\ +}\ +.ace-cobalt {\ +background-color: #002240;\ +color: #FFFFFF\ +}\ +.ace-cobalt .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-cobalt .ace_marker-layer .ace_selection {\ +background: rgba(179, 101, 57, 0.75)\ +}\ +.ace-cobalt.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #002240;\ +}\ +.ace-cobalt .ace_marker-layer .ace_step {\ +background: rgb(127, 111, 19)\ +}\ +.ace-cobalt .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 255, 255, 0.15)\ +}\ +.ace-cobalt .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.35)\ +}\ +.ace-cobalt .ace_gutter-active-line {\ +background-color: rgba(0, 0, 0, 0.35)\ +}\ +.ace-cobalt .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(179, 101, 57, 0.75)\ +}\ +.ace-cobalt .ace_invisible {\ +color: rgba(255, 255, 255, 0.15)\ +}\ +.ace-cobalt .ace_keyword,\ +.ace-cobalt .ace_meta {\ +color: #FF9D00\ +}\ +.ace-cobalt .ace_constant,\ +.ace-cobalt .ace_constant.ace_character,\ +.ace-cobalt .ace_constant.ace_character.ace_escape,\ +.ace-cobalt .ace_constant.ace_other {\ +color: #FF628C\ +}\ +.ace-cobalt .ace_invalid {\ +color: #F8F8F8;\ +background-color: #800F00\ +}\ +.ace-cobalt .ace_support {\ +color: #80FFBB\ +}\ +.ace-cobalt .ace_support.ace_constant {\ +color: #EB939A\ +}\ +.ace-cobalt .ace_fold {\ +background-color: #FF9D00;\ +border-color: #FFFFFF\ +}\ +.ace-cobalt .ace_support.ace_function {\ +color: #FFB054\ +}\ +.ace-cobalt .ace_storage {\ +color: #FFEE80\ +}\ +.ace-cobalt .ace_entity {\ +color: #FFDD00\ +}\ +.ace-cobalt .ace_string {\ +color: #3AD900\ +}\ +.ace-cobalt .ace_string.ace_regexp {\ +color: #80FFC2\ +}\ +.ace-cobalt .ace_comment {\ +font-style: italic;\ +color: #0088FF\ +}\ +.ace-cobalt .ace_heading,\ +.ace-cobalt .ace_markup.ace_heading {\ +color: #C8E4FD;\ +background-color: #001221\ +}\ +.ace-cobalt .ace_list,\ +.ace-cobalt .ace_markup.ace_list {\ +background-color: #130D26\ +}\ +.ace-cobalt .ace_variable {\ +color: #CCCCCC\ +}\ +.ace-cobalt .ace_variable.ace_language {\ +color: #FF80E1\ +}\ +.ace-cobalt .ace_meta.ace_tag {\ +color: #9EFFFF\ +}\ +.ace-cobalt .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/cobalt"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-crimson_editor.js b/app/Resources/ui/js/ace/theme-crimson_editor.js new file mode 100644 index 00000000..b162e5be --- /dev/null +++ b/app/Resources/ui/js/ace/theme-crimson_editor.js @@ -0,0 +1,125 @@ +define("ace/theme/crimson_editor",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +exports.isDark = false; +exports.cssText = ".ace-crimson-editor .ace_gutter {\ +background: #ebebeb;\ +color: #333;\ +overflow : hidden;\ +}\ +.ace-crimson-editor .ace_gutter-layer {\ +width: 100%;\ +text-align: right;\ +}\ +.ace-crimson-editor .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-crimson-editor {\ +background-color: #FFFFFF;\ +color: rgb(64, 64, 64);\ +}\ +.ace-crimson-editor .ace_cursor {\ +color: black;\ +}\ +.ace-crimson-editor .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-crimson-editor .ace_identifier {\ +color: black;\ +}\ +.ace-crimson-editor .ace_keyword {\ +color: blue;\ +}\ +.ace-crimson-editor .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-crimson-editor .ace_constant.ace_language {\ +color: rgb(255, 156, 0);\ +}\ +.ace-crimson-editor .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-crimson-editor .ace_invalid {\ +text-decoration: line-through;\ +color: rgb(224, 0, 0);\ +}\ +.ace-crimson-editor .ace_fold {\ +}\ +.ace-crimson-editor .ace_support.ace_function {\ +color: rgb(192, 0, 0);\ +}\ +.ace-crimson-editor .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-crimson-editor .ace_support.ace_type,\ +.ace-crimson-editor .ace_support.ace_class {\ +color: rgb(109, 121, 222);\ +}\ +.ace-crimson-editor .ace_keyword.ace_operator {\ +color: rgb(49, 132, 149);\ +}\ +.ace-crimson-editor .ace_string {\ +color: rgb(128, 0, 128);\ +}\ +.ace-crimson-editor .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-crimson-editor .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-crimson-editor .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-crimson-editor .ace_constant.ace_numeric {\ +color: rgb(0, 0, 64);\ +}\ +.ace-crimson-editor .ace_variable {\ +color: rgb(0, 64, 128);\ +}\ +.ace-crimson-editor .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_active-line {\ +background: rgb(232, 242, 254);\ +}\ +.ace-crimson-editor .ace_gutter-active-line {\ +background-color : #dcdcdc;\ +}\ +.ace-crimson-editor .ace_meta.ace_tag {\ +color:rgb(28, 2, 255);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-crimson-editor .ace_string.ace_regex {\ +color: rgb(192, 0, 192);\ +}\ +.ace-crimson-editor .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + +exports.cssClass = "ace-crimson-editor"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/crimson_editor"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-dawn.js b/app/Resources/ui/js/ace/theme-dawn.js new file mode 100644 index 00000000..923dad68 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-dawn.js @@ -0,0 +1,115 @@ +define("ace/theme/dawn",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-dawn"; +exports.cssText = ".ace-dawn .ace_gutter {\ +background: #ebebeb;\ +color: #333\ +}\ +.ace-dawn .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-dawn {\ +background-color: #F9F9F9;\ +color: #080808\ +}\ +.ace-dawn .ace_cursor {\ +color: #000000\ +}\ +.ace-dawn .ace_marker-layer .ace_selection {\ +background: rgba(39, 95, 255, 0.30)\ +}\ +.ace-dawn.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #F9F9F9;\ +}\ +.ace-dawn .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0)\ +}\ +.ace-dawn .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(75, 75, 126, 0.50)\ +}\ +.ace-dawn .ace_marker-layer .ace_active-line {\ +background: rgba(36, 99, 180, 0.12)\ +}\ +.ace-dawn .ace_gutter-active-line {\ +background-color : #dcdcdc\ +}\ +.ace-dawn .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(39, 95, 255, 0.30)\ +}\ +.ace-dawn .ace_invisible {\ +color: rgba(75, 75, 126, 0.50)\ +}\ +.ace-dawn .ace_keyword,\ +.ace-dawn .ace_meta {\ +color: #794938\ +}\ +.ace-dawn .ace_constant,\ +.ace-dawn .ace_constant.ace_character,\ +.ace-dawn .ace_constant.ace_character.ace_escape,\ +.ace-dawn .ace_constant.ace_other {\ +color: #811F24\ +}\ +.ace-dawn .ace_invalid.ace_illegal {\ +text-decoration: underline;\ +font-style: italic;\ +color: #F8F8F8;\ +background-color: #B52A1D\ +}\ +.ace-dawn .ace_invalid.ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #B52A1D\ +}\ +.ace-dawn .ace_support {\ +color: #691C97\ +}\ +.ace-dawn .ace_support.ace_constant {\ +color: #B4371F\ +}\ +.ace-dawn .ace_fold {\ +background-color: #794938;\ +border-color: #080808\ +}\ +.ace-dawn .ace_list,\ +.ace-dawn .ace_markup.ace_list,\ +.ace-dawn .ace_support.ace_function {\ +color: #693A17\ +}\ +.ace-dawn .ace_storage {\ +font-style: italic;\ +color: #A71D5D\ +}\ +.ace-dawn .ace_string {\ +color: #0B6125\ +}\ +.ace-dawn .ace_string.ace_regexp {\ +color: #CF5628\ +}\ +.ace-dawn .ace_comment {\ +font-style: italic;\ +color: #5A525F\ +}\ +.ace-dawn .ace_heading,\ +.ace-dawn .ace_markup.ace_heading {\ +color: #19356D\ +}\ +.ace-dawn .ace_variable {\ +color: #234A97\ +}\ +.ace-dawn .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/dawn"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-dracula.js b/app/Resources/ui/js/ace/theme-dracula.js new file mode 100644 index 00000000..3085b9d9 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-dracula.js @@ -0,0 +1,135 @@ +define("ace/theme/dracula",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-dracula"; +exports.cssText = "\ +.ace-dracula .ace_gutter {\ +background: #282a36;\ +color: rgb(144,145,148)\ +}\ +.ace-dracula .ace_print-margin {\ +width: 1px;\ +background: #44475a\ +}\ +.ace-dracula {\ +background-color: #282a36;\ +color: #f8f8f2\ +}\ +.ace-dracula .ace_cursor {\ +color: #f8f8f0\ +}\ +.ace-dracula .ace_marker-layer .ace_selection {\ +background: #44475a\ +}\ +.ace-dracula.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #282a36;\ +border-radius: 2px\ +}\ +.ace-dracula .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174)\ +}\ +.ace-dracula .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #a29709\ +}\ +.ace-dracula .ace_marker-layer .ace_active-line {\ +background: #44475a\ +}\ +.ace-dracula .ace_gutter-active-line {\ +background-color: #44475a\ +}\ +.ace-dracula .ace_marker-layer .ace_selected-word {\ +box-shadow: 0px 0px 0px 1px #a29709;\ +border-radius: 3px;\ +}\ +.ace-dracula .ace_fold {\ +background-color: #50fa7b;\ +border-color: #f8f8f2\ +}\ +.ace-dracula .ace_keyword {\ +color: #ff79c6\ +}\ +.ace-dracula .ace_constant.ace_language {\ +color: #bd93f9\ +}\ +.ace-dracula .ace_constant.ace_numeric {\ +color: #bd93f9\ +}\ +.ace-dracula .ace_constant.ace_character {\ +color: #bd93f9\ +}\ +.ace-dracula .ace_constant.ace_character.ace_escape {\ +color: #ff79c6\ +}\ +.ace-dracula .ace_constant.ace_other {\ +color: #bd93f9\ +}\ +.ace-dracula .ace_support.ace_function {\ +color: #8be9fd\ +}\ +.ace-dracula .ace_support.ace_constant {\ +color: #6be5fd\ +}\ +.ace-dracula .ace_support.ace_class {\ +font-style: italic;\ +color: #66d9ef\ +}\ +.ace-dracula .ace_support.ace_type {\ +font-style: italic;\ +color: #66d9ef\ +}\ +.ace-dracula .ace_storage {\ +color: #ff79c6\ +}\ +.ace-dracula .ace_storage.ace_type {\ +font-style: italic;\ +color: #8be9fd\ +}\ +.ace-dracula .ace_invalid {\ +color: #F8F8F0;\ +background-color: #ff79c6\ +}\ +.ace-dracula .ace_invalid.ace_deprecated {\ +color: #F8F8F0;\ +background-color: #bd93f9\ +}\ +.ace-dracula .ace_string {\ +color: #f1fa8c\ +}\ +.ace-dracula .ace_comment {\ +color: #6272a4\ +}\ +.ace-dracula .ace_variable {\ +color: #50fa7b\ +}\ +.ace-dracula .ace_variable.ace_parameter {\ +font-style: italic;\ +color: #ffb86c\ +}\ +.ace-dracula .ace_entity.ace_other.ace_attribute-name {\ +color: #50fa7b\ +}\ +.ace-dracula .ace_entity.ace_name.ace_function {\ +color: #50fa7b\ +}\ +.ace-dracula .ace_entity.ace_name.ace_tag {\ +color: #ff79c6\ +}\ +.ace-dracula .ace_invisible {\ +color: #626680;\ +}\ +.ace-dracula .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\ +}"; +exports.$selectionColorConflict = true; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/dracula"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-dreamweaver.js b/app/Resources/ui/js/ace/theme-dreamweaver.js new file mode 100644 index 00000000..fa9771e9 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-dreamweaver.js @@ -0,0 +1,148 @@ +define("ace/theme/dreamweaver",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +exports.isDark = false; +exports.cssClass = "ace-dreamweaver"; +exports.cssText = ".ace-dreamweaver .ace_gutter {\ +background: #e8e8e8;\ +color: #333;\ +}\ +.ace-dreamweaver .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-dreamweaver {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-dreamweaver .ace_fold {\ +background-color: #757AD8;\ +}\ +.ace-dreamweaver .ace_cursor {\ +color: black;\ +}\ +.ace-dreamweaver .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-dreamweaver .ace_storage,\ +.ace-dreamweaver .ace_keyword {\ +color: blue;\ +}\ +.ace-dreamweaver .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-dreamweaver .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-dreamweaver .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-dreamweaver .ace_invalid {\ +background-color: rgb(153, 0, 0);\ +color: white;\ +}\ +.ace-dreamweaver .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-dreamweaver .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-dreamweaver .ace_support.ace_type,\ +.ace-dreamweaver .ace_support.ace_class {\ +color: #009;\ +}\ +.ace-dreamweaver .ace_support.ace_php_tag {\ +color: #f00;\ +}\ +.ace-dreamweaver .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-dreamweaver .ace_string {\ +color: #00F;\ +}\ +.ace-dreamweaver .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-dreamweaver .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-dreamweaver .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-dreamweaver .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-dreamweaver .ace_variable {\ +color: #06F\ +}\ +.ace-dreamweaver .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-dreamweaver .ace_entity.ace_name.ace_function {\ +color: #00F;\ +}\ +.ace-dreamweaver .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-dreamweaver .ace_list {\ +color:rgb(185, 6, 144);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-dreamweaver .ace_gutter-active-line {\ +background-color : #DCDCDC;\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-dreamweaver .ace_meta.ace_tag {\ +color:#009;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {\ +color:#060;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_form {\ +color:#F90;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_image {\ +color:#909;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_script {\ +color:#900;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_style {\ +color:#909;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_table {\ +color:#099;\ +}\ +.ace-dreamweaver .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-dreamweaver .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/dreamweaver"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-eclipse.js b/app/Resources/ui/js/ace/theme-eclipse.js new file mode 100644 index 00000000..5deddde3 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-eclipse.js @@ -0,0 +1,105 @@ +define("ace/theme/eclipse",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +exports.isDark = false; +exports.cssText = ".ace-eclipse .ace_gutter {\ +background: #ebebeb;\ +border-right: 1px solid rgb(159, 159, 159);\ +color: rgb(136, 136, 136);\ +}\ +.ace-eclipse .ace_print-margin {\ +width: 1px;\ +background: #ebebeb;\ +}\ +.ace-eclipse {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-eclipse .ace_fold {\ +background-color: rgb(60, 76, 114);\ +}\ +.ace-eclipse .ace_cursor {\ +color: black;\ +}\ +.ace-eclipse .ace_storage,\ +.ace-eclipse .ace_keyword,\ +.ace-eclipse .ace_variable {\ +color: rgb(127, 0, 85);\ +}\ +.ace-eclipse .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-eclipse .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-eclipse .ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-eclipse .ace_string {\ +color: rgb(42, 0, 255);\ +}\ +.ace-eclipse .ace_comment {\ +color: rgb(113, 150, 130);\ +}\ +.ace-eclipse .ace_comment.ace_doc {\ +color: rgb(63, 95, 191);\ +}\ +.ace-eclipse .ace_comment.ace_doc.ace_tag {\ +color: rgb(127, 159, 191);\ +}\ +.ace-eclipse .ace_constant.ace_numeric {\ +color: darkblue;\ +}\ +.ace-eclipse .ace_tag {\ +color: rgb(25, 118, 116);\ +}\ +.ace-eclipse .ace_type {\ +color: rgb(127, 0, 127);\ +}\ +.ace-eclipse .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-eclipse .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-eclipse .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-eclipse .ace_meta.ace_tag {\ +color:rgb(25, 118, 116);\ +}\ +.ace-eclipse .ace_invisible {\ +color: #ddd;\ +}\ +.ace-eclipse .ace_entity.ace_other.ace_attribute-name {\ +color:rgb(127, 0, 127);\ +}\ +.ace-eclipse .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0);\ +}\ +.ace-eclipse .ace_active-line {\ +background: rgb(232, 242, 254);\ +}\ +.ace-eclipse .ace_gutter-active-line {\ +background-color : #DADADA;\ +}\ +.ace-eclipse .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgb(181, 213, 255);\ +}\ +.ace-eclipse .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + +exports.cssClass = "ace-eclipse"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/eclipse"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-github.js b/app/Resources/ui/js/ace/theme-github.js new file mode 100644 index 00000000..12d70bc7 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-github.js @@ -0,0 +1,110 @@ +define("ace/theme/github",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-github"; +exports.cssText = "\ +.ace-github .ace_gutter {\ +background: #e8e8e8;\ +color: #AAA;\ +}\ +.ace-github {\ +background: #fff;\ +color: #000;\ +}\ +.ace-github .ace_keyword {\ +font-weight: bold;\ +}\ +.ace-github .ace_string {\ +color: #D14;\ +}\ +.ace-github .ace_variable.ace_class {\ +color: teal;\ +}\ +.ace-github .ace_constant.ace_numeric {\ +color: #099;\ +}\ +.ace-github .ace_constant.ace_buildin {\ +color: #0086B3;\ +}\ +.ace-github .ace_support.ace_function {\ +color: #0086B3;\ +}\ +.ace-github .ace_comment {\ +color: #998;\ +font-style: italic;\ +}\ +.ace-github .ace_variable.ace_language {\ +color: #0086B3;\ +}\ +.ace-github .ace_paren {\ +font-weight: bold;\ +}\ +.ace-github .ace_boolean {\ +font-weight: bold;\ +}\ +.ace-github .ace_string.ace_regexp {\ +color: #009926;\ +font-weight: normal;\ +}\ +.ace-github .ace_variable.ace_instance {\ +color: teal;\ +}\ +.ace-github .ace_constant.ace_language {\ +font-weight: bold;\ +}\ +.ace-github .ace_cursor {\ +color: black;\ +}\ +.ace-github.ace_focus .ace_marker-layer .ace_active-line {\ +background: rgb(255, 255, 204);\ +}\ +.ace-github .ace_marker-layer .ace_active-line {\ +background: rgb(245, 245, 245);\ +}\ +.ace-github .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-github.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px white;\ +}\ +.ace-github.ace_nobold .ace_line > span {\ +font-weight: normal !important;\ +}\ +.ace-github .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-github .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-github .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-github .ace_gutter-active-line {\ +background-color : rgba(0, 0, 0, 0.07);\ +}\ +.ace-github .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-github .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-github .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-github .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + + var dom = require("../lib/dom"); + dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/github"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-gob.js b/app/Resources/ui/js/ace/theme-gob.js new file mode 100644 index 00000000..7326db1e --- /dev/null +++ b/app/Resources/ui/js/ace/theme-gob.js @@ -0,0 +1,119 @@ +define("ace/theme/gob",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-gob"; +exports.cssText = ".ace-gob .ace_gutter {\ +background: #0B1818;\ +color: #03EE03\ +}\ +.ace-gob .ace_print-margin {\ +width: 1px;\ +background: #131313\ +}\ +.ace-gob {\ +background-color: #0B0B0B;\ +color: #00FF00\ +}\ +.ace-gob .ace_cursor {\ +border-color: rgba(16, 248, 255, 0.90);\ +background-color: rgba(16, 240, 248, 0.70);\ +opacity: 0.4;\ +}\ +.ace-gob .ace_marker-layer .ace_selection {\ +background: rgba(221, 240, 255, 0.20)\ +}\ +.ace-gob.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #141414;\ +}\ +.ace-gob .ace_marker-layer .ace_step {\ +background: rgb(16, 128, 0)\ +}\ +.ace-gob .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(64, 255, 255, 0.25)\ +}\ +.ace-gob .ace_marker-layer .ace_active-line {\ +background: rgba(255, 255, 255, 0.04)\ +}\ +.ace-gob .ace_gutter-active-line {\ +background-color: rgba(255, 255, 255, 0.04)\ +}\ +.ace-gob .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(192, 240, 255, 0.20)\ +}\ +.ace-gob .ace_invisible {\ +color: rgba(255, 255, 255, 0.25)\ +}\ +.ace-gob .ace_keyword,\ +.ace-gob .ace_meta {\ +color: #10D8E8\ +}\ +.ace-gob .ace_constant,\ +.ace-gob .ace_constant.ace_character,\ +.ace-gob .ace_constant.ace_character.ace_escape,\ +.ace-gob .ace_constant.ace_other,\ +.ace-gob .ace_heading,\ +.ace-gob .ace_markup.ace_heading,\ +.ace-gob .ace_support.ace_constant {\ +color: #10F0A0\ +}\ +.ace-gob .ace_invalid.ace_illegal {\ +color: #F8F8F8;\ +background-color: rgba(86, 45, 86, 0.75)\ +}\ +.ace-gob .ace_invalid.ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #20F8C0\ +}\ +.ace-gob .ace_support {\ +color: #20E8B0\ +}\ +.ace-gob .ace_fold {\ +background-color: #50B8B8;\ +border-color: #70F8F8\ +}\ +.ace-gob .ace_support.ace_function {\ +color: #00F800\ +}\ +.ace-gob .ace_list,\ +.ace-gob .ace_markup.ace_list,\ +.ace-gob .ace_storage {\ +color: #10FF98\ +}\ +.ace-gob .ace_entity.ace_name.ace_function,\ +.ace-gob .ace_meta.ace_tag,\ +.ace-gob .ace_variable {\ +color: #00F868\ +}\ +.ace-gob .ace_string {\ +color: #10F060\ +}\ +.ace-gob .ace_string.ace_regexp {\ +color: #20F090;\ +}\ +.ace-gob .ace_comment {\ +font-style: italic;\ +color: #00E060;\ +}\ +.ace-gob .ace_variable {\ +color: #00F888;\ +}\ +.ace-gob .ace_xml-pe {\ +color: #488858;\ +}\ +.ace-gob .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/gob"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-gruvbox.js b/app/Resources/ui/js/ace/theme-gruvbox.js new file mode 100644 index 00000000..c52e8f0f --- /dev/null +++ b/app/Resources/ui/js/ace/theme-gruvbox.js @@ -0,0 +1,89 @@ +define("ace/theme/gruvbox",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-gruvbox"; +exports.cssText = ".ace-gruvbox .ace_gutter-active-line {\ +background-color: #3C3836;\ +}\ +.ace-gruvbox {\ +color: #EBDAB4;\ +background-color: #1D2021;\ +}\ +.ace-gruvbox .ace_invisible {\ +color: #504945;\ +}\ +.ace-gruvbox .ace_marker-layer .ace_selection {\ +background: rgba(179, 101, 57, 0.75)\ +}\ +.ace-gruvbox.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #002240;\ +}\ +.ace-gruvbox .ace_keyword {\ +color: #8ec07c;\ +}\ +.ace-gruvbox .ace_comment {\ +font-style: italic;\ +color: #928375;\ +}\ +.ace-gruvbox .ace-statement {\ +color: red;\ +}\ +.ace-gruvbox .ace_variable {\ +color: #84A598;\ +}\ +.ace-gruvbox .ace_variable.ace_language {\ +color: #D2879B;\ +}\ +.ace-gruvbox .ace_constant {\ +color: #C2859A;\ +}\ +.ace-gruvbox .ace_constant.ace_language {\ +color: #C2859A;\ +}\ +.ace-gruvbox .ace_constant.ace_numeric {\ +color: #C2859A;\ +}\ +.ace-gruvbox .ace_string {\ +color: #B8BA37;\ +}\ +.ace-gruvbox .ace_support {\ +color: #F9BC41;\ +}\ +.ace-gruvbox .ace_support.ace_function {\ +color: #F84B3C;\ +}\ +.ace-gruvbox .ace_storage {\ +color: #8FBF7F;\ +}\ +.ace-gruvbox .ace_keyword.ace_operator {\ +color: #EBDAB4;\ +}\ +.ace-gruvbox .ace_punctuation.ace_operator {\ +color: yellow;\ +}\ +.ace-gruvbox .ace_marker-layer .ace_active-line {\ +background: #3C3836;\ +}\ +.ace-gruvbox .ace_marker-layer .ace_selected-word {\ +border-radius: 4px;\ +border: 8px solid #3f475d;\ +}\ +.ace-gruvbox .ace_print-margin {\ +width: 5px;\ +background: #3C3836;\ +}\ +.ace-gruvbox .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); + +}); (function() { + window.require(["ace/theme/gruvbox"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-gruvbox_dark_hard.js b/app/Resources/ui/js/ace/theme-gruvbox_dark_hard.js new file mode 100644 index 00000000..3c6ae39b --- /dev/null +++ b/app/Resources/ui/js/ace/theme-gruvbox_dark_hard.js @@ -0,0 +1,137 @@ +define("ace/theme/gruvbox_dark_hard",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-gruvbox-dark-hard"; +exports.cssText = ".ace-gruvbox-dark-hard .ace_gutter {\ +background: #1d2021;\ +color: rgb(132,126,106)\ +}\ +.ace-gruvbox-dark-hard .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-gruvbox-dark-hard {\ +background-color: #1d2021;\ +color: rgba(235, 219, 178, 0.50)\ +}\ +.ace-gruvbox-dark-hard .ace_cursor {\ +color: #a89984\ +}\ +.ace-gruvbox-dark-hard .ace_marker-layer .ace_selection {\ +background: #3c3836\ +}\ +.ace-gruvbox-dark-hard.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #1d2021;\ +border-radius: 2px\ +}\ +.ace-gruvbox-dark-hard .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174)\ +}\ +.ace-gruvbox-dark-hard .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(235, 219, 178, 0.15)\ +}\ +.ace-gruvbox-dark-hard .ace_marker-layer .ace_active-line {\ +background: #3c3836\ +}\ +.ace-gruvbox-dark-hard .ace_gutter-active-line {\ +background-color: #3c3836\ +}\ +.ace-gruvbox-dark-hard .ace_marker-layer .ace_selected-word {\ +border: 1px solid #3c3836\ +}\ +.ace-gruvbox-dark-hard .ace_fold {\ +background-color: #b8bb26;\ +border-color: rgba(235, 219, 178, 0.50)\ +}\ +.ace-gruvbox-dark-hard .ace_keyword {\ +color: #fb4934\ +}\ +.ace-gruvbox-dark-hard .ace_keyword.ace_operator {\ +color: #8ec07c\ +}\ +.ace-gruvbox-dark-hard .ace_keyword.ace_other.ace_unit {\ +color: #b16286\ +}\ +.ace-gruvbox-dark-hard .ace_constant {\ +color: #d3869b\ +}\ +.ace-gruvbox-dark-hard .ace_constant.ace_numeric {\ +color: #d3869b\ +}\ +.ace-gruvbox-dark-hard .ace_constant.ace_character.ace_escape {\ +color: #fb4934\ +}\ +.ace-gruvbox-dark-hard .ace_constant.ace_other {\ +color: #d3869b\ +}\ +.ace-gruvbox-dark-hard .ace_support.ace_function {\ +color: #8ec07c\ +}\ +.ace-gruvbox-dark-hard .ace_support.ace_constant {\ +color: #d3869b\ +}\ +.ace-gruvbox-dark-hard .ace_support.ace_constant.ace_property-value {\ +color: #f9f5d7\ +}\ +.ace-gruvbox-dark-hard .ace_support.ace_class {\ +color: #fabd2f\ +}\ +.ace-gruvbox-dark-hard .ace_support.ace_type {\ +color: #fabd2f\ +}\ +.ace-gruvbox-dark-hard .ace_storage {\ +color: #fb4934\ +}\ +.ace-gruvbox-dark-hard .ace_invalid {\ +color: #f9f5d7;\ +background-color: #fb4934\ +}\ +.ace-gruvbox-dark-hard .ace_string {\ +color: #b8bb26\ +}\ +.ace-gruvbox-dark-hard .ace_string.ace_regexp {\ +color: #b8bb26\ +}\ +.ace-gruvbox-dark-hard .ace_comment {\ +font-style: italic;\ +color: #928374\ +}\ +.ace-gruvbox-dark-hard .ace_variable {\ +color: #83a598\ +}\ +.ace-gruvbox-dark-hard .ace_variable.ace_language {\ +color: #d3869b\ +}\ +.ace-gruvbox-dark-hard .ace_variable.ace_parameter {\ +color: #f9f5d7\ +}\ +.ace-gruvbox-dark-hard .ace_meta.ace_tag {\ +color: #f9f5d7\ +}\ +.ace-gruvbox-dark-hard .ace_entity.ace_other.ace_attribute-name {\ +color: #fabd2f\ +}\ +.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_function {\ +color: #b8bb26\ +}\ +.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_tag {\ +color: #83a598\ +}\ +.ace-gruvbox-dark-hard .ace_markup.ace_heading {\ +color: #b8bb26\ +}\ +.ace-gruvbox-dark-hard .ace_markup.ace_list {\ +color: #83a598\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); (function() { + window.require(["ace/theme/gruvbox_dark_hard"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-gruvbox_light_hard.js b/app/Resources/ui/js/ace/theme-gruvbox_light_hard.js new file mode 100644 index 00000000..403d4b6c --- /dev/null +++ b/app/Resources/ui/js/ace/theme-gruvbox_light_hard.js @@ -0,0 +1,137 @@ +define("ace/theme/gruvbox_light_hard",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-gruvbox-light-hard"; +exports.cssText = ".ace-gruvbox-light-hard .ace_gutter {\ +background: #f9f5d7;\ +color: rgb(155,151,135)\ +}\ +.ace-gruvbox-light-hard .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-gruvbox-light-hard {\ +background-color: #f9f5d7;\ +color: rgba(60, 56, 54, 0.50)\ +}\ +.ace-gruvbox-light-hard .ace_cursor {\ +color: #7c6f64\ +}\ +.ace-gruvbox-light-hard .ace_marker-layer .ace_selection {\ +background: #ebdbb2\ +}\ +.ace-gruvbox-light-hard.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #f9f5d7;\ +border-radius: 2px\ +}\ +.ace-gruvbox-light-hard .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174)\ +}\ +.ace-gruvbox-light-hard .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(60, 56, 54, 0.15)\ +}\ +.ace-gruvbox-light-hard .ace_marker-layer .ace_active-line {\ +background: #ebdbb2\ +}\ +.ace-gruvbox-light-hard .ace_gutter-active-line {\ +background-color: #ebdbb2\ +}\ +.ace-gruvbox-light-hard .ace_marker-layer .ace_selected-word {\ +border: 1px solid #ebdbb2\ +}\ +.ace-gruvbox-light-hard .ace_fold {\ +background-color: #79740e;\ +border-color: rgba(60, 56, 54, 0.50)\ +}\ +.ace-gruvbox-light-hard .ace_keyword {\ +color: #9d0006\ +}\ +.ace-gruvbox-light-hard .ace_keyword.ace_operator {\ +color: #427b58\ +}\ +.ace-gruvbox-light-hard .ace_keyword.ace_other.ace_unit {\ +color: #b16286\ +}\ +.ace-gruvbox-light-hard .ace_constant {\ +color: #8f3f71\ +}\ +.ace-gruvbox-light-hard .ace_constant.ace_numeric {\ +color: #8f3f71\ +}\ +.ace-gruvbox-light-hard .ace_constant.ace_character.ace_escape {\ +color: #9d0006\ +}\ +.ace-gruvbox-light-hard .ace_constant.ace_other {\ +color: #8f3f71\ +}\ +.ace-gruvbox-light-hard .ace_support.ace_function {\ +color: #427b58\ +}\ +.ace-gruvbox-light-hard .ace_support.ace_constant {\ +color: #8f3f71\ +}\ +.ace-gruvbox-light-hard .ace_support.ace_constant.ace_property-value {\ +color: #1d2021\ +}\ +.ace-gruvbox-light-hard .ace_support.ace_class {\ +color: #b57614\ +}\ +.ace-gruvbox-light-hard .ace_support.ace_type {\ +color: #b57614\ +}\ +.ace-gruvbox-light-hard .ace_storage {\ +color: #9d0006\ +}\ +.ace-gruvbox-light-hard .ace_invalid {\ +color: #1d2021;\ +background-color: #9d0006\ +}\ +.ace-gruvbox-light-hard .ace_string {\ +color: #79740e\ +}\ +.ace-gruvbox-light-hard .ace_string.ace_regexp {\ +color: #79740e\ +}\ +.ace-gruvbox-light-hard .ace_comment {\ +font-style: italic;\ +color: #928374\ +}\ +.ace-gruvbox-light-hard .ace_variable {\ +color: #076678\ +}\ +.ace-gruvbox-light-hard .ace_variable.ace_language {\ +color: #8f3f71\ +}\ +.ace-gruvbox-light-hard .ace_variable.ace_parameter {\ +color: #1d2021\ +}\ +.ace-gruvbox-light-hard .ace_meta.ace_tag {\ +color: #1d2021\ +}\ +.ace-gruvbox-light-hard .ace_entity.ace_other.ace_attribute-name {\ +color: #b57614\ +}\ +.ace-gruvbox-light-hard .ace_entity.ace_name.ace_function {\ +color: #79740e\ +}\ +.ace-gruvbox-light-hard .ace_entity.ace_name.ace_tag {\ +color: #076678\ +}\ +.ace-gruvbox-light-hard .ace_markup.ace_heading {\ +color: #79740e\ +}\ +.ace-gruvbox-light-hard .ace_markup.ace_list {\ +color: #076678\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); (function() { + window.require(["ace/theme/gruvbox_light_hard"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-idle_fingers.js b/app/Resources/ui/js/ace/theme-idle_fingers.js new file mode 100644 index 00000000..1af5e27a --- /dev/null +++ b/app/Resources/ui/js/ace/theme-idle_fingers.js @@ -0,0 +1,103 @@ +define("ace/theme/idle_fingers",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-idle-fingers"; +exports.cssText = ".ace-idle-fingers .ace_gutter {\ +background: #3b3b3b;\ +color: rgb(153,153,153)\ +}\ +.ace-idle-fingers .ace_print-margin {\ +width: 1px;\ +background: #3b3b3b\ +}\ +.ace-idle-fingers {\ +background-color: #323232;\ +color: #FFFFFF\ +}\ +.ace-idle-fingers .ace_cursor {\ +color: #91FF00\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_selection {\ +background: rgba(90, 100, 126, 0.88)\ +}\ +.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #323232;\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404040\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_active-line {\ +background: #353637\ +}\ +.ace-idle-fingers .ace_gutter-active-line {\ +background-color: #353637\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(90, 100, 126, 0.88)\ +}\ +.ace-idle-fingers .ace_invisible {\ +color: #404040\ +}\ +.ace-idle-fingers .ace_keyword,\ +.ace-idle-fingers .ace_meta {\ +color: #CC7833\ +}\ +.ace-idle-fingers .ace_constant,\ +.ace-idle-fingers .ace_constant.ace_character,\ +.ace-idle-fingers .ace_constant.ace_character.ace_escape,\ +.ace-idle-fingers .ace_constant.ace_other,\ +.ace-idle-fingers .ace_support.ace_constant {\ +color: #6C99BB\ +}\ +.ace-idle-fingers .ace_invalid {\ +color: #FFFFFF;\ +background-color: #FF0000\ +}\ +.ace-idle-fingers .ace_fold {\ +background-color: #CC7833;\ +border-color: #FFFFFF\ +}\ +.ace-idle-fingers .ace_support.ace_function {\ +color: #B83426\ +}\ +.ace-idle-fingers .ace_variable.ace_parameter {\ +font-style: italic\ +}\ +.ace-idle-fingers .ace_string {\ +color: #A5C261\ +}\ +.ace-idle-fingers .ace_string.ace_regexp {\ +color: #CCCC33\ +}\ +.ace-idle-fingers .ace_comment {\ +font-style: italic;\ +color: #BC9458\ +}\ +.ace-idle-fingers .ace_meta.ace_tag {\ +color: #FFE5BB\ +}\ +.ace-idle-fingers .ace_entity.ace_name {\ +color: #FFC66D\ +}\ +.ace-idle-fingers .ace_collab.ace_user1 {\ +color: #323232;\ +background-color: #FFF980\ +}\ +.ace-idle-fingers .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/idle_fingers"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-iplastic.js b/app/Resources/ui/js/ace/theme-iplastic.js new file mode 100644 index 00000000..6eaf7abe --- /dev/null +++ b/app/Resources/ui/js/ace/theme-iplastic.js @@ -0,0 +1,128 @@ +define("ace/theme/iplastic",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-iplastic"; +exports.cssText = ".ace-iplastic .ace_gutter {\ +background: #dddddd;\ +color: #666666\ +}\ +.ace-iplastic .ace_print-margin {\ +width: 1px;\ +background: #bbbbbb\ +}\ +.ace-iplastic {\ +background-color: #eeeeee;\ +color: #333333\ +}\ +.ace-iplastic .ace_cursor {\ +color: #333\ +}\ +.ace-iplastic .ace_marker-layer .ace_selection {\ +background: #BAD6FD;\ +}\ +.ace-iplastic.ace_multiselect .ace_selection.ace_start {\ +border-radius: 4px\ +}\ +.ace-iplastic .ace_marker-layer .ace_step {\ +background: #444444\ +}\ +.ace-iplastic .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #49483E;\ +background: #FFF799\ +}\ +.ace-iplastic .ace_marker-layer .ace_active-line {\ +background: #e5e5e5\ +}\ +.ace-iplastic .ace_gutter-active-line {\ +background-color: #eeeeee\ +}\ +.ace-iplastic .ace_marker-layer .ace_selected-word {\ +border: 1px solid #555555;\ +border-radius:4px\ +}\ +.ace-iplastic .ace_invisible {\ +color: #999999\ +}\ +.ace-iplastic .ace_entity.ace_name.ace_tag,\ +.ace-iplastic .ace_keyword,\ +.ace-iplastic .ace_meta.ace_tag,\ +.ace-iplastic .ace_storage {\ +color: #0000FF\ +}\ +.ace-iplastic .ace_punctuation,\ +.ace-iplastic .ace_punctuation.ace_tag {\ +color: #000\ +}\ +.ace-iplastic .ace_constant {\ +color: #333333;\ +font-weight: 700\ +}\ +.ace-iplastic .ace_constant.ace_character,\ +.ace-iplastic .ace_constant.ace_language,\ +.ace-iplastic .ace_constant.ace_numeric,\ +.ace-iplastic .ace_constant.ace_other {\ +color: #0066FF;\ +font-weight: 700\ +}\ +.ace-iplastic .ace_constant.ace_numeric{\ +font-weight: 100\ +}\ +.ace-iplastic .ace_invalid {\ +color: #F8F8F0;\ +background-color: #F92672\ +}\ +.ace-iplastic .ace_invalid.ace_deprecated {\ +color: #F8F8F0;\ +background-color: #AE81FF\ +}\ +.ace-iplastic .ace_support.ace_constant,\ +.ace-iplastic .ace_support.ace_function {\ +color: #333333;\ +font-weight: 700\ +}\ +.ace-iplastic .ace_fold {\ +background-color: #464646;\ +border-color: #F8F8F2\ +}\ +.ace-iplastic .ace_storage.ace_type,\ +.ace-iplastic .ace_support.ace_class,\ +.ace-iplastic .ace_support.ace_type {\ +color: #3333fc;\ +font-weight: 700\ +}\ +.ace-iplastic .ace_entity.ace_name.ace_function,\ +.ace-iplastic .ace_entity.ace_other,\ +.ace-iplastic .ace_entity.ace_other.ace_attribute-name,\ +.ace-iplastic .ace_variable {\ +color: #3366cc;\ +font-style: italic\ +}\ +.ace-iplastic .ace_variable.ace_parameter {\ +font-style: italic;\ +color: #2469E0\ +}\ +.ace-iplastic .ace_string {\ +color: #a55f03\ +}\ +.ace-iplastic .ace_comment {\ +color: #777777;\ +font-style: italic\ +}\ +.ace-iplastic .ace_fold-widget {\ +background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==);\ +}\ +.ace-iplastic .ace_indent-guide {\ +background: url(data:image/png;base64,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) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/iplastic"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-katzenmilch.js b/app/Resources/ui/js/ace/theme-katzenmilch.js new file mode 100644 index 00000000..596d9702 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-katzenmilch.js @@ -0,0 +1,128 @@ +define("ace/theme/katzenmilch",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-katzenmilch"; +exports.cssText = ".ace-katzenmilch .ace_gutter,\ +.ace-katzenmilch .ace_gutter {\ +background: #e8e8e8;\ +color: #333\ +}\ +.ace-katzenmilch .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-katzenmilch {\ +background-color: #f3f2f3;\ +color: rgba(15, 0, 9, 1.0)\ +}\ +.ace-katzenmilch .ace_cursor {\ +border-left: 2px solid #100011\ +}\ +.ace-katzenmilch .ace_overwrite-cursors .ace_cursor {\ +border-left: 0px;\ +border-bottom: 1px solid #100011\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_selection {\ +background: rgba(100, 5, 208, 0.27)\ +}\ +.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #f3f2f3;\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174)\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(0, 0, 0, 0.33);\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_active-line {\ +background: rgb(232, 242, 254)\ +}\ +.ace-katzenmilch .ace_gutter-active-line {\ +background-color: rgb(232, 242, 254)\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(100, 5, 208, 0.27)\ +}\ +.ace-katzenmilch .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-katzenmilch .ace_fold {\ +background-color: rgba(2, 95, 73, 0.97);\ +border-color: rgba(15, 0, 9, 1.0)\ +}\ +.ace-katzenmilch .ace_keyword {\ +color: #674Aa8;\ +rbackground-color: rgba(163, 170, 216, 0.055)\ +}\ +.ace-katzenmilch .ace_constant.ace_language {\ +color: #7D7e52;\ +rbackground-color: rgba(189, 190, 130, 0.059)\ +}\ +.ace-katzenmilch .ace_constant.ace_numeric {\ +color: rgba(79, 130, 123, 0.93);\ +rbackground-color: rgba(119, 194, 187, 0.059)\ +}\ +.ace-katzenmilch .ace_constant.ace_character,\ +.ace-katzenmilch .ace_constant.ace_other {\ +color: rgba(2, 95, 105, 1.0);\ +rbackground-color: rgba(127, 34, 153, 0.063)\ +}\ +.ace-katzenmilch .ace_support.ace_function {\ +color: #9D7e62;\ +rbackground-color: rgba(189, 190, 130, 0.039)\ +}\ +.ace-katzenmilch .ace_support.ace_class {\ +color: rgba(239, 106, 167, 1.0);\ +rbackground-color: rgba(239, 106, 167, 0.063)\ +}\ +.ace-katzenmilch .ace_storage {\ +color: rgba(123, 92, 191, 1.0);\ +rbackground-color: rgba(139, 93, 223, 0.051)\ +}\ +.ace-katzenmilch .ace_invalid {\ +color: #DFDFD5;\ +rbackground-color: #CC1B27\ +}\ +.ace-katzenmilch .ace_string {\ +color: #5a5f9b;\ +rbackground-color: rgba(170, 175, 219, 0.035)\ +}\ +.ace-katzenmilch .ace_comment {\ +font-style: italic;\ +color: rgba(64, 79, 80, 0.67);\ +rbackground-color: rgba(95, 15, 255, 0.0078)\ +}\ +.ace-katzenmilch .ace_entity.ace_name.ace_function,\ +.ace-katzenmilch .ace_variable {\ +color: rgba(2, 95, 73, 0.97);\ +rbackground-color: rgba(34, 255, 73, 0.12)\ +}\ +.ace-katzenmilch .ace_variable.ace_language {\ +color: #316fcf;\ +rbackground-color: rgba(58, 175, 255, 0.039)\ +}\ +.ace-katzenmilch .ace_variable.ace_parameter {\ +font-style: italic;\ +color: rgba(51, 150, 159, 0.87);\ +rbackground-color: rgba(5, 214, 249, 0.043)\ +}\ +.ace-katzenmilch .ace_entity.ace_other.ace_attribute-name {\ +color: rgba(73, 70, 194, 0.93);\ +rbackground-color: rgba(73, 134, 194, 0.035)\ +}\ +.ace-katzenmilch .ace_entity.ace_name.ace_tag {\ +color: #3976a2;\ +rbackground-color: rgba(73, 166, 210, 0.039)\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/katzenmilch"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-kr_theme.js b/app/Resources/ui/js/ace/theme-kr_theme.js new file mode 100644 index 00000000..1509c0b1 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-kr_theme.js @@ -0,0 +1,111 @@ +define("ace/theme/kr_theme",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-kr-theme"; +exports.cssText = ".ace-kr-theme .ace_gutter {\ +background: #1c1917;\ +color: #FCFFE0\ +}\ +.ace-kr-theme .ace_print-margin {\ +width: 1px;\ +background: #1c1917\ +}\ +.ace-kr-theme {\ +background-color: #0B0A09;\ +color: #FCFFE0\ +}\ +.ace-kr-theme .ace_cursor {\ +color: #FF9900\ +}\ +.ace-kr-theme .ace_marker-layer .ace_selection {\ +background: rgba(170, 0, 255, 0.45)\ +}\ +.ace-kr-theme.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #0B0A09;\ +}\ +.ace-kr-theme .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-kr-theme .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 177, 111, 0.32)\ +}\ +.ace-kr-theme .ace_marker-layer .ace_active-line {\ +background: #38403D\ +}\ +.ace-kr-theme .ace_gutter-active-line {\ +background-color : #38403D\ +}\ +.ace-kr-theme .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(170, 0, 255, 0.45)\ +}\ +.ace-kr-theme .ace_invisible {\ +color: rgba(255, 177, 111, 0.32)\ +}\ +.ace-kr-theme .ace_keyword,\ +.ace-kr-theme .ace_meta {\ +color: #949C8B\ +}\ +.ace-kr-theme .ace_constant,\ +.ace-kr-theme .ace_constant.ace_character,\ +.ace-kr-theme .ace_constant.ace_character.ace_escape,\ +.ace-kr-theme .ace_constant.ace_other {\ +color: rgba(210, 117, 24, 0.76)\ +}\ +.ace-kr-theme .ace_invalid {\ +color: #F8F8F8;\ +background-color: #A41300\ +}\ +.ace-kr-theme .ace_support {\ +color: #9FC28A\ +}\ +.ace-kr-theme .ace_support.ace_constant {\ +color: #C27E66\ +}\ +.ace-kr-theme .ace_fold {\ +background-color: #949C8B;\ +border-color: #FCFFE0\ +}\ +.ace-kr-theme .ace_support.ace_function {\ +color: #85873A\ +}\ +.ace-kr-theme .ace_storage {\ +color: #FFEE80\ +}\ +.ace-kr-theme .ace_string {\ +color: rgba(164, 161, 181, 0.8)\ +}\ +.ace-kr-theme .ace_string.ace_regexp {\ +color: rgba(125, 255, 192, 0.65)\ +}\ +.ace-kr-theme .ace_comment {\ +font-style: italic;\ +color: #706D5B\ +}\ +.ace-kr-theme .ace_variable {\ +color: #D1A796\ +}\ +.ace-kr-theme .ace_list,\ +.ace-kr-theme .ace_markup.ace_list {\ +background-color: #0F0040\ +}\ +.ace-kr-theme .ace_variable.ace_language {\ +color: #FF80E1\ +}\ +.ace-kr-theme .ace_meta.ace_tag {\ +color: #BABD9C\ +}\ +.ace-kr-theme .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/kr_theme"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-kuroir.js b/app/Resources/ui/js/ace/theme-kuroir.js new file mode 100644 index 00000000..85af8e85 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-kuroir.js @@ -0,0 +1,68 @@ +define("ace/theme/kuroir",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-kuroir"; +exports.cssText = "\ +.ace-kuroir .ace_gutter {\ +background: #e8e8e8;\ +color: #333;\ +}\ +.ace-kuroir .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-kuroir {\ +background-color: #E8E9E8;\ +color: #363636;\ +}\ +.ace-kuroir .ace_cursor {\ +color: #202020;\ +}\ +.ace-kuroir .ace_marker-layer .ace_selection {\ +background: rgba(245, 170, 0, 0.57);\ +}\ +.ace-kuroir.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #E8E9E8;\ +}\ +.ace-kuroir .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174);\ +}\ +.ace-kuroir .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(0, 0, 0, 0.29);\ +}\ +.ace-kuroir .ace_marker-layer .ace_active-line {\ +background: rgba(203, 220, 47, 0.22);\ +}\ +.ace-kuroir .ace_gutter-active-line {\ +background-color: rgba(203, 220, 47, 0.22);\ +}\ +.ace-kuroir .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(245, 170, 0, 0.57);\ +}\ +.ace-kuroir .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-kuroir .ace_fold {\ +border-color: #363636;\ +}\ +.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;\ +background-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;\ +font-style:italic;\ +color:#FD1732;\ +background-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;\ +background-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);\ +background-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;\ +background-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/kuroir"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-merbivore.js b/app/Resources/ui/js/ace/theme-merbivore.js new file mode 100644 index 00000000..e638fb1c --- /dev/null +++ b/app/Resources/ui/js/ace/theme-merbivore.js @@ -0,0 +1,102 @@ +define("ace/theme/merbivore",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-merbivore"; +exports.cssText = ".ace-merbivore .ace_gutter {\ +background: #202020;\ +color: #E6E1DC\ +}\ +.ace-merbivore .ace_print-margin {\ +width: 1px;\ +background: #555651\ +}\ +.ace-merbivore {\ +background-color: #161616;\ +color: #E6E1DC\ +}\ +.ace-merbivore .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-merbivore .ace_marker-layer .ace_selection {\ +background: #454545\ +}\ +.ace-merbivore.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #161616;\ +}\ +.ace-merbivore .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-merbivore .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404040\ +}\ +.ace-merbivore .ace_marker-layer .ace_active-line {\ +background: #333435\ +}\ +.ace-merbivore .ace_gutter-active-line {\ +background-color: #333435\ +}\ +.ace-merbivore .ace_marker-layer .ace_selected-word {\ +border: 1px solid #454545\ +}\ +.ace-merbivore .ace_invisible {\ +color: #404040\ +}\ +.ace-merbivore .ace_entity.ace_name.ace_tag,\ +.ace-merbivore .ace_keyword,\ +.ace-merbivore .ace_meta,\ +.ace-merbivore .ace_meta.ace_tag,\ +.ace-merbivore .ace_storage,\ +.ace-merbivore .ace_support.ace_function {\ +color: #FC6F09\ +}\ +.ace-merbivore .ace_constant,\ +.ace-merbivore .ace_constant.ace_character,\ +.ace-merbivore .ace_constant.ace_character.ace_escape,\ +.ace-merbivore .ace_constant.ace_other,\ +.ace-merbivore .ace_support.ace_type {\ +color: #1EDAFB\ +}\ +.ace-merbivore .ace_constant.ace_character.ace_escape {\ +color: #519F50\ +}\ +.ace-merbivore .ace_constant.ace_language {\ +color: #FDC251\ +}\ +.ace-merbivore .ace_constant.ace_library,\ +.ace-merbivore .ace_string,\ +.ace-merbivore .ace_support.ace_constant {\ +color: #8DFF0A\ +}\ +.ace-merbivore .ace_constant.ace_numeric {\ +color: #58C554\ +}\ +.ace-merbivore .ace_invalid {\ +color: #FFFFFF;\ +background-color: #990000\ +}\ +.ace-merbivore .ace_fold {\ +background-color: #FC6F09;\ +border-color: #E6E1DC\ +}\ +.ace-merbivore .ace_comment {\ +font-style: italic;\ +color: #AD2EA4\ +}\ +.ace-merbivore .ace_entity.ace_other.ace_attribute-name {\ +color: #FFFF89\ +}\ +.ace-merbivore .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/merbivore"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-merbivore_soft.js b/app/Resources/ui/js/ace/theme-merbivore_soft.js new file mode 100644 index 00000000..d79865b0 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-merbivore_soft.js @@ -0,0 +1,103 @@ +define("ace/theme/merbivore_soft",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-merbivore-soft"; +exports.cssText = ".ace-merbivore-soft .ace_gutter {\ +background: #262424;\ +color: #E6E1DC\ +}\ +.ace-merbivore-soft .ace_print-margin {\ +width: 1px;\ +background: #262424\ +}\ +.ace-merbivore-soft {\ +background-color: #1C1C1C;\ +color: #E6E1DC\ +}\ +.ace-merbivore-soft .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_selection {\ +background: #494949\ +}\ +.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #1C1C1C;\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404040\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_active-line {\ +background: #333435\ +}\ +.ace-merbivore-soft .ace_gutter-active-line {\ +background-color: #333435\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_selected-word {\ +border: 1px solid #494949\ +}\ +.ace-merbivore-soft .ace_invisible {\ +color: #404040\ +}\ +.ace-merbivore-soft .ace_entity.ace_name.ace_tag,\ +.ace-merbivore-soft .ace_keyword,\ +.ace-merbivore-soft .ace_meta,\ +.ace-merbivore-soft .ace_meta.ace_tag,\ +.ace-merbivore-soft .ace_storage {\ +color: #FC803A\ +}\ +.ace-merbivore-soft .ace_constant,\ +.ace-merbivore-soft .ace_constant.ace_character,\ +.ace-merbivore-soft .ace_constant.ace_character.ace_escape,\ +.ace-merbivore-soft .ace_constant.ace_other,\ +.ace-merbivore-soft .ace_support.ace_type {\ +color: #68C1D8\ +}\ +.ace-merbivore-soft .ace_constant.ace_character.ace_escape {\ +color: #B3E5B4\ +}\ +.ace-merbivore-soft .ace_constant.ace_language {\ +color: #E1C582\ +}\ +.ace-merbivore-soft .ace_constant.ace_library,\ +.ace-merbivore-soft .ace_string,\ +.ace-merbivore-soft .ace_support.ace_constant {\ +color: #8EC65F\ +}\ +.ace-merbivore-soft .ace_constant.ace_numeric {\ +color: #7FC578\ +}\ +.ace-merbivore-soft .ace_invalid,\ +.ace-merbivore-soft .ace_invalid.ace_deprecated {\ +color: #FFFFFF;\ +background-color: #FE3838\ +}\ +.ace-merbivore-soft .ace_fold {\ +background-color: #FC803A;\ +border-color: #E6E1DC\ +}\ +.ace-merbivore-soft .ace_comment,\ +.ace-merbivore-soft .ace_meta {\ +font-style: italic;\ +color: #AC4BB8\ +}\ +.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {\ +color: #EAF1A3\ +}\ +.ace-merbivore-soft .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/merbivore_soft"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-mono_industrial.js b/app/Resources/ui/js/ace/theme-mono_industrial.js new file mode 100644 index 00000000..0bd57662 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-mono_industrial.js @@ -0,0 +1,114 @@ +define("ace/theme/mono_industrial",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-mono-industrial"; +exports.cssText = ".ace-mono-industrial .ace_gutter {\ +background: #1d2521;\ +color: #C5C9C9\ +}\ +.ace-mono-industrial .ace_print-margin {\ +width: 1px;\ +background: #555651\ +}\ +.ace-mono-industrial {\ +background-color: #222C28;\ +color: #FFFFFF\ +}\ +.ace-mono-industrial .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_selection {\ +background: rgba(145, 153, 148, 0.40)\ +}\ +.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #222C28;\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(102, 108, 104, 0.50)\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_active-line {\ +background: rgba(12, 13, 12, 0.25)\ +}\ +.ace-mono-industrial .ace_gutter-active-line {\ +background-color: rgba(12, 13, 12, 0.25)\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(145, 153, 148, 0.40)\ +}\ +.ace-mono-industrial .ace_invisible {\ +color: rgba(102, 108, 104, 0.50)\ +}\ +.ace-mono-industrial .ace_string {\ +background-color: #151C19;\ +color: #FFFFFF\ +}\ +.ace-mono-industrial .ace_keyword,\ +.ace-mono-industrial .ace_meta {\ +color: #A39E64\ +}\ +.ace-mono-industrial .ace_constant,\ +.ace-mono-industrial .ace_constant.ace_character,\ +.ace-mono-industrial .ace_constant.ace_character.ace_escape,\ +.ace-mono-industrial .ace_constant.ace_numeric,\ +.ace-mono-industrial .ace_constant.ace_other {\ +color: #E98800\ +}\ +.ace-mono-industrial .ace_entity.ace_name.ace_function,\ +.ace-mono-industrial .ace_keyword.ace_operator,\ +.ace-mono-industrial .ace_variable {\ +color: #A8B3AB\ +}\ +.ace-mono-industrial .ace_invalid {\ +color: #FFFFFF;\ +background-color: rgba(153, 0, 0, 0.68)\ +}\ +.ace-mono-industrial .ace_support.ace_constant {\ +color: #C87500\ +}\ +.ace-mono-industrial .ace_fold {\ +background-color: #A8B3AB;\ +border-color: #FFFFFF\ +}\ +.ace-mono-industrial .ace_support.ace_function {\ +color: #588E60\ +}\ +.ace-mono-industrial .ace_entity.ace_name,\ +.ace-mono-industrial .ace_support.ace_class,\ +.ace-mono-industrial .ace_support.ace_type {\ +color: #5778B6\ +}\ +.ace-mono-industrial .ace_storage {\ +color: #C23B00\ +}\ +.ace-mono-industrial .ace_variable.ace_language,\ +.ace-mono-industrial .ace_variable.ace_parameter {\ +color: #648BD2\ +}\ +.ace-mono-industrial .ace_comment {\ +color: #666C68;\ +background-color: #151C19\ +}\ +.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\ +color: #909993\ +}\ +.ace-mono-industrial .ace_entity.ace_name.ace_tag {\ +color: #A65EFF\ +}\ +.ace-mono-industrial .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/mono_industrial"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-monokai.js b/app/Resources/ui/js/ace/theme-monokai.js new file mode 100644 index 00000000..7eed6b44 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-monokai.js @@ -0,0 +1,112 @@ +define("ace/theme/monokai",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-monokai"; +exports.cssText = ".ace-monokai .ace_gutter {\ +background: #2F3129;\ +color: #8F908A\ +}\ +.ace-monokai .ace_print-margin {\ +width: 1px;\ +background: #555651\ +}\ +.ace-monokai {\ +background-color: #272822;\ +color: #F8F8F2\ +}\ +.ace-monokai .ace_cursor {\ +color: #F8F8F0\ +}\ +.ace-monokai .ace_marker-layer .ace_selection {\ +background: #49483E\ +}\ +.ace-monokai.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #272822;\ +}\ +.ace-monokai .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-monokai .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #49483E\ +}\ +.ace-monokai .ace_marker-layer .ace_active-line {\ +background: #202020\ +}\ +.ace-monokai .ace_gutter-active-line {\ +background-color: #272727\ +}\ +.ace-monokai .ace_marker-layer .ace_selected-word {\ +border: 1px solid #49483E\ +}\ +.ace-monokai .ace_invisible {\ +color: #52524d\ +}\ +.ace-monokai .ace_entity.ace_name.ace_tag,\ +.ace-monokai .ace_keyword,\ +.ace-monokai .ace_meta.ace_tag,\ +.ace-monokai .ace_storage {\ +color: #F92672\ +}\ +.ace-monokai .ace_punctuation,\ +.ace-monokai .ace_punctuation.ace_tag {\ +color: #fff\ +}\ +.ace-monokai .ace_constant.ace_character,\ +.ace-monokai .ace_constant.ace_language,\ +.ace-monokai .ace_constant.ace_numeric,\ +.ace-monokai .ace_constant.ace_other {\ +color: #AE81FF\ +}\ +.ace-monokai .ace_invalid {\ +color: #F8F8F0;\ +background-color: #F92672\ +}\ +.ace-monokai .ace_invalid.ace_deprecated {\ +color: #F8F8F0;\ +background-color: #AE81FF\ +}\ +.ace-monokai .ace_support.ace_constant,\ +.ace-monokai .ace_support.ace_function {\ +color: #66D9EF\ +}\ +.ace-monokai .ace_fold {\ +background-color: #A6E22E;\ +border-color: #F8F8F2\ +}\ +.ace-monokai .ace_storage.ace_type,\ +.ace-monokai .ace_support.ace_class,\ +.ace-monokai .ace_support.ace_type {\ +font-style: italic;\ +color: #66D9EF\ +}\ +.ace-monokai .ace_entity.ace_name.ace_function,\ +.ace-monokai .ace_entity.ace_other,\ +.ace-monokai .ace_entity.ace_other.ace_attribute-name,\ +.ace-monokai .ace_variable {\ +color: #A6E22E\ +}\ +.ace-monokai .ace_variable.ace_parameter {\ +font-style: italic;\ +color: #FD971F\ +}\ +.ace-monokai .ace_string {\ +color: #E6DB74\ +}\ +.ace-monokai .ace_comment {\ +color: #75715E\ +}\ +.ace-monokai .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/monokai"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-nord_dark.js b/app/Resources/ui/js/ace/theme-nord_dark.js new file mode 100644 index 00000000..c97f5831 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-nord_dark.js @@ -0,0 +1,102 @@ +define("ace/theme/nord_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-nord-dark"; +exports.cssText = ".ace-nord-dark .ace_gutter {\ +color: #616e88;\ +}\ +.ace-nord-dark .ace_print-margin {\ +width: 1px;\ +background: #4c566a;\ +}\ +.ace-nord-dark {\ +background-color: #2e3440;\ +color: #d8dee9;\ +}\ +.ace-nord-dark .ace_entity.ace_other.ace_attribute-name,\ +.ace-nord-dark .ace_storage {\ +color: #d8dee9;\ +}\ +.ace-nord-dark .ace_cursor {\ +color: #d8dee9;\ +},\ +.ace-nord-dark .ace_string.ace_regexp {\ +color: #bf616a;\ +}\ +.ace-nord-dark .ace_marker-layer .ace_active-line {\ +background: #434c5ecc;\ +}\ +.ace-nord-dark .ace_marker-layer .ace_selection {\ +background: #434c5ecc;\ +}\ +.ace-nord-dark.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #2e3440;\ +}\ +.ace-nord-dark .ace_marker-layer .ace_step {\ +background: #ebcb8b;\ +}\ +.ace-nord-dark .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #88c0d066;\ +}\ +.ace-nord-dark .ace_gutter-active-line {\ +background-color: #434c5ecc;\ +}\ +.ace-nord-dark .ace_marker-layer .ace_selected-word {\ +border: 1px solid #88c0d066;\ +}\ +.ace-nord-dark .ace_invisible {\ +color: #4c566a;\ +}\ +.ace-nord-dark .ace_keyword,\ +.ace-nord-dark .ace_meta,\ +.ace-nord-dark .ace_support.ace_class,\ +.ace-nord-dark .ace_support.ace_type {\ +color: #81a1c1;\ +}\ +.ace-nord-dark .ace_constant.ace_character,\ +.ace-nord-dark .ace_constant.ace_other {\ +color: #d8dee9;\ +}\ +.ace-nord-dark .ace_constant.ace_language {\ +color: #5e81ac;\ +}\ +.ace-nord-dark .ace_constant.ace_escape {\ +color: #ebcB8b;\ +}\ +.ace-nord-dark .ace_constant.ace_numeric {\ +color: #b48ead;\ +}\ +.ace-nord-dark .ace_fold {\ +background-color: #4c566a;\ +border-color: #d8dee9;\ +}\ +.ace-nord-dark .ace_entity.ace_name.ace_function,\ +.ace-nord-dark .ace_entity.ace_name.ace_tag,\ +.ace-nord-dark .ace_support.ace_function,\ +.ace-nord-dark .ace_variable,\ +.ace-nord-dark .ace_variable.ace_language {\ +color: #8fbcbb;\ +}\ +.ace-nord-dark .ace_string {\ +color: #a3be8c;\ +}\ +.ace-nord-dark .ace_comment {\ +color: #616e88;\ +}\ +.ace-nord-dark .ace_indent-guide {\ +box-shadow: inset -1px 0 0 0 #434c5eb3;\ +}\ +"; +exports.$selectionColorConflict = true; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/nord_dark"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-one_dark.js b/app/Resources/ui/js/ace/theme-one_dark.js new file mode 100644 index 00000000..b99f2287 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-one_dark.js @@ -0,0 +1,139 @@ +define("ace/theme/one_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + + exports.isDark = true; + exports.cssClass = "ace-one-dark"; + exports.cssText = ".ace-one-dark .ace_gutter {\ +background: #282c34;\ +color: #6a6f7a\ +}\ +.ace-one-dark .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-one-dark {\ +background-color: #282c34;\ +color: #abb2bf\ +}\ +.ace-one-dark .ace_cursor {\ +color: #528bff\ +}\ +.ace-one-dark .ace_marker-layer .ace_selection {\ +background: #3d4350\ +}\ +.ace-one-dark.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0 #282c34;\ +border-radius: 2px\ +}\ +.ace-one-dark .ace_marker-layer .ace_step {\ +background: #c6dbae\ +}\ +.ace-one-dark .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #747369\ +}\ +.ace-one-dark .ace_marker-layer .ace_active-line {\ +background: rgba(76, 87, 103, .19)\ +}\ +.ace-one-dark .ace_gutter-active-line {\ +background-color: rgba(76, 87, 103, .19)\ +}\ +.ace-one-dark .ace_marker-layer .ace_selected-word {\ +border: 1px solid #3d4350\ +}\ +.ace-one-dark .ace_fold {\ +background-color: #61afef;\ +border-color: #abb2bf\ +}\ +.ace-one-dark .ace_keyword {\ +color: #c678dd\ +}\ +.ace-one-dark .ace_keyword.ace_operator {\ +color: #c678dd\ +}\ +.ace-one-dark .ace_keyword.ace_other.ace_unit {\ +color: #d19a66\ +}\ +.ace-one-dark .ace_constant.ace_language {\ +color: #d19a66\ +}\ +.ace-one-dark .ace_constant.ace_numeric {\ +color: #d19a66\ +}\ +.ace-one-dark .ace_constant.ace_character {\ +color: #56b6c2\ +}\ +.ace-one-dark .ace_constant.ace_other {\ +color: #56b6c2\ +}\ +.ace-one-dark .ace_support.ace_function {\ +color: #61afef\ +}\ +.ace-one-dark .ace_support.ace_constant {\ +color: #d19a66\ +}\ +.ace-one-dark .ace_support.ace_class {\ +color: #e5c07b\ +}\ +.ace-one-dark .ace_support.ace_type {\ +color: #e5c07b\ +}\ +.ace-one-dark .ace_storage {\ +color: #c678dd\ +}\ +.ace-one-dark .ace_storage.ace_type {\ +color: #c678dd\ +}\ +.ace-one-dark .ace_invalid {\ +color: #fff;\ +background-color: #f2777a\ +}\ +.ace-one-dark .ace_invalid.ace_deprecated {\ +color: #272b33;\ +background-color: #d27b53\ +}\ +.ace-one-dark .ace_string {\ +color: #98c379\ +}\ +.ace-one-dark .ace_string.ace_regexp {\ +color: #e06c75\ +}\ +.ace-one-dark .ace_comment {\ +font-style: italic;\ +color: #5c6370\ +}\ +.ace-one-dark .ace_variable {\ +color: #e06c75\ +}\ +.ace-one-dark .ace_variable.ace_parameter {\ +color: #d19a66\ +}\ +.ace-one-dark .ace_meta.ace_tag {\ +color: #e06c75\ +}\ +.ace-one-dark .ace_entity.ace_other.ace_attribute-name {\ +color: #e06c75\ +}\ +.ace-one-dark .ace_entity.ace_name.ace_function {\ +color: #61afef\ +}\ +.ace-one-dark .ace_entity.ace_name.ace_tag {\ +color: #e06c75\ +}\ +.ace-one-dark .ace_markup.ace_heading {\ +color: #98c379\ +}\ +.ace-one-dark .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\ +}\ +"; + + var dom = require("../lib/dom"); + dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { + window.require(["ace/theme/one_dark"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-pastel_on_dark.js b/app/Resources/ui/js/ace/theme-pastel_on_dark.js new file mode 100644 index 00000000..cc51053d --- /dev/null +++ b/app/Resources/ui/js/ace/theme-pastel_on_dark.js @@ -0,0 +1,115 @@ +define("ace/theme/pastel_on_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-pastel-on-dark"; +exports.cssText = ".ace-pastel-on-dark .ace_gutter {\ +background: #353030;\ +color: #8F938F\ +}\ +.ace-pastel-on-dark .ace_print-margin {\ +width: 1px;\ +background: #353030\ +}\ +.ace-pastel-on-dark {\ +background-color: #2C2828;\ +color: #8F938F\ +}\ +.ace-pastel-on-dark .ace_cursor {\ +color: #A7A7A7\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_selection {\ +background: rgba(221, 240, 255, 0.20)\ +}\ +.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #2C2828;\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 255, 255, 0.25)\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_active-line {\ +background: rgba(255, 255, 255, 0.031)\ +}\ +.ace-pastel-on-dark .ace_gutter-active-line {\ +background-color: rgba(255, 255, 255, 0.031)\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(221, 240, 255, 0.20)\ +}\ +.ace-pastel-on-dark .ace_invisible {\ +color: rgba(255, 255, 255, 0.25)\ +}\ +.ace-pastel-on-dark .ace_keyword,\ +.ace-pastel-on-dark .ace_meta {\ +color: #757aD8\ +}\ +.ace-pastel-on-dark .ace_constant,\ +.ace-pastel-on-dark .ace_constant.ace_character,\ +.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,\ +.ace-pastel-on-dark .ace_constant.ace_other {\ +color: #4FB7C5\ +}\ +.ace-pastel-on-dark .ace_keyword.ace_operator {\ +color: #797878\ +}\ +.ace-pastel-on-dark .ace_constant.ace_character {\ +color: #AFA472\ +}\ +.ace-pastel-on-dark .ace_constant.ace_language {\ +color: #DE8E30\ +}\ +.ace-pastel-on-dark .ace_constant.ace_numeric {\ +color: #CCCCCC\ +}\ +.ace-pastel-on-dark .ace_invalid,\ +.ace-pastel-on-dark .ace_invalid.ace_illegal {\ +color: #F8F8F8;\ +background-color: rgba(86, 45, 86, 0.75)\ +}\ +.ace-pastel-on-dark .ace_invalid.ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #D2A8A1\ +}\ +.ace-pastel-on-dark .ace_fold {\ +background-color: #757aD8;\ +border-color: #8F938F\ +}\ +.ace-pastel-on-dark .ace_support.ace_function {\ +color: #AEB2F8\ +}\ +.ace-pastel-on-dark .ace_string {\ +color: #66A968\ +}\ +.ace-pastel-on-dark .ace_string.ace_regexp {\ +color: #E9C062\ +}\ +.ace-pastel-on-dark .ace_comment {\ +color: #A6C6FF\ +}\ +.ace-pastel-on-dark .ace_variable {\ +color: #BEBF55\ +}\ +.ace-pastel-on-dark .ace_variable.ace_language {\ +color: #C1C144\ +}\ +.ace-pastel-on-dark .ace_xml-pe {\ +color: #494949\ +}\ +.ace-pastel-on-dark .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/pastel_on_dark"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-solarized_dark.js b/app/Resources/ui/js/ace/theme-solarized_dark.js new file mode 100644 index 00000000..e9a2664d --- /dev/null +++ b/app/Resources/ui/js/ace/theme-solarized_dark.js @@ -0,0 +1,95 @@ +define("ace/theme/solarized_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-solarized-dark"; +exports.cssText = ".ace-solarized-dark .ace_gutter {\ +background: #01313f;\ +color: #d0edf7\ +}\ +.ace-solarized-dark .ace_print-margin {\ +width: 1px;\ +background: #33555E\ +}\ +.ace-solarized-dark {\ +background-color: #002B36;\ +color: #93A1A1\ +}\ +.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\ +.ace-solarized-dark .ace_storage {\ +color: #93A1A1\ +}\ +.ace-solarized-dark .ace_cursor,\ +.ace-solarized-dark .ace_string.ace_regexp {\ +color: #D30102\ +}\ +.ace-solarized-dark .ace_marker-layer .ace_active-line,\ +.ace-solarized-dark .ace_marker-layer .ace_selection {\ +background: rgba(255, 255, 255, 0.1)\ +}\ +.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #002B36;\ +}\ +.ace-solarized-dark .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-solarized-dark .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(147, 161, 161, 0.50)\ +}\ +.ace-solarized-dark .ace_gutter-active-line {\ +background-color: #0d3440\ +}\ +.ace-solarized-dark .ace_marker-layer .ace_selected-word {\ +border: 1px solid #073642\ +}\ +.ace-solarized-dark .ace_invisible {\ +color: rgba(147, 161, 161, 0.50)\ +}\ +.ace-solarized-dark .ace_keyword,\ +.ace-solarized-dark .ace_meta,\ +.ace-solarized-dark .ace_support.ace_class,\ +.ace-solarized-dark .ace_support.ace_type {\ +color: #859900\ +}\ +.ace-solarized-dark .ace_constant.ace_character,\ +.ace-solarized-dark .ace_constant.ace_other {\ +color: #CB4B16\ +}\ +.ace-solarized-dark .ace_constant.ace_language {\ +color: #B58900\ +}\ +.ace-solarized-dark .ace_constant.ace_numeric {\ +color: #D33682\ +}\ +.ace-solarized-dark .ace_fold {\ +background-color: #268BD2;\ +border-color: #93A1A1\ +}\ +.ace-solarized-dark .ace_entity.ace_name.ace_function,\ +.ace-solarized-dark .ace_entity.ace_name.ace_tag,\ +.ace-solarized-dark .ace_support.ace_function,\ +.ace-solarized-dark .ace_variable,\ +.ace-solarized-dark .ace_variable.ace_language {\ +color: #268BD2\ +}\ +.ace-solarized-dark .ace_string {\ +color: #2AA198\ +}\ +.ace-solarized-dark .ace_comment {\ +font-style: italic;\ +color: #657B83\ +}\ +.ace-solarized-dark .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/solarized_dark"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-solarized_light.js b/app/Resources/ui/js/ace/theme-solarized_light.js new file mode 100644 index 00000000..2746ea63 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-solarized_light.js @@ -0,0 +1,98 @@ +define("ace/theme/solarized_light",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-solarized-light"; +exports.cssText = ".ace-solarized-light .ace_gutter {\ +background: #fbf1d3;\ +color: #333\ +}\ +.ace-solarized-light .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-solarized-light {\ +background-color: #FDF6E3;\ +color: #586E75\ +}\ +.ace-solarized-light .ace_cursor {\ +color: #000000\ +}\ +.ace-solarized-light .ace_marker-layer .ace_selection {\ +background: rgba(7, 54, 67, 0.09)\ +}\ +.ace-solarized-light.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #FDF6E3;\ +}\ +.ace-solarized-light .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0)\ +}\ +.ace-solarized-light .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(147, 161, 161, 0.50)\ +}\ +.ace-solarized-light .ace_marker-layer .ace_active-line {\ +background: #EEE8D5\ +}\ +.ace-solarized-light .ace_gutter-active-line {\ +background-color : #EDE5C1\ +}\ +.ace-solarized-light .ace_marker-layer .ace_selected-word {\ +border: 1px solid #7f9390\ +}\ +.ace-solarized-light .ace_invisible {\ +color: rgba(147, 161, 161, 0.50)\ +}\ +.ace-solarized-light .ace_keyword,\ +.ace-solarized-light .ace_meta,\ +.ace-solarized-light .ace_support.ace_class,\ +.ace-solarized-light .ace_support.ace_type {\ +color: #859900\ +}\ +.ace-solarized-light .ace_constant.ace_character,\ +.ace-solarized-light .ace_constant.ace_other {\ +color: #CB4B16\ +}\ +.ace-solarized-light .ace_constant.ace_language {\ +color: #B58900\ +}\ +.ace-solarized-light .ace_constant.ace_numeric {\ +color: #D33682\ +}\ +.ace-solarized-light .ace_fold {\ +background-color: #268BD2;\ +border-color: #586E75\ +}\ +.ace-solarized-light .ace_entity.ace_name.ace_function,\ +.ace-solarized-light .ace_entity.ace_name.ace_tag,\ +.ace-solarized-light .ace_support.ace_function,\ +.ace-solarized-light .ace_variable,\ +.ace-solarized-light .ace_variable.ace_language {\ +color: #268BD2\ +}\ +.ace-solarized-light .ace_storage {\ +color: #073642\ +}\ +.ace-solarized-light .ace_string {\ +color: #2AA198\ +}\ +.ace-solarized-light .ace_string.ace_regexp {\ +color: #D30102\ +}\ +.ace-solarized-light .ace_comment,\ +.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {\ +color: #93A1A1\ +}\ +.ace-solarized-light .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/solarized_light"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-sqlserver.js b/app/Resources/ui/js/ace/theme-sqlserver.js new file mode 100644 index 00000000..1b626a28 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-sqlserver.js @@ -0,0 +1,145 @@ +define("ace/theme/sqlserver",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-sqlserver"; +exports.cssText = ".ace-sqlserver .ace_gutter {\ +background: #ebebeb;\ +color: #333;\ +overflow: hidden;\ +}\ +.ace-sqlserver .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-sqlserver {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-sqlserver .ace_identifier {\ +color: black;\ +}\ +.ace-sqlserver .ace_keyword {\ +color: #0000FF;\ +}\ +.ace-sqlserver .ace_numeric {\ +color: black;\ +}\ +.ace-sqlserver .ace_storage {\ +color: #11B7BE;\ +}\ +.ace-sqlserver .ace_keyword.ace_operator,\ +.ace-sqlserver .ace_lparen,\ +.ace-sqlserver .ace_rparen,\ +.ace-sqlserver .ace_punctuation {\ +color: #808080;\ +}\ +.ace-sqlserver .ace_set.ace_statement {\ +color: #0000FF;\ +text-decoration: underline;\ +}\ +.ace-sqlserver .ace_cursor {\ +color: black;\ +}\ +.ace-sqlserver .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-sqlserver .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-sqlserver .ace_constant.ace_language {\ +color: #979797;\ +}\ +.ace-sqlserver .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-sqlserver .ace_invalid {\ +background-color: rgb(153, 0, 0);\ +color: white;\ +}\ +.ace-sqlserver .ace_support.ace_function {\ +color: #FF00FF;\ +}\ +.ace-sqlserver .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-sqlserver .ace_class {\ +color: #008080;\ +}\ +.ace-sqlserver .ace_support.ace_other {\ +color: #6D79DE;\ +}\ +.ace-sqlserver .ace_variable.ace_parameter {\ +font-style: italic;\ +color: #FD971F;\ +}\ +.ace-sqlserver .ace_comment {\ +color: #008000;\ +}\ +.ace-sqlserver .ace_constant.ace_numeric {\ +color: black;\ +}\ +.ace-sqlserver .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-sqlserver .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-sqlserver .ace_support.ace_storedprocedure {\ +color: #800000;\ +}\ +.ace-sqlserver .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-sqlserver .ace_list {\ +color: rgb(185, 6, 144);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-sqlserver .ace_gutter-active-line {\ +background-color: #dcdcdc;\ +}\ +.ace-sqlserver .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-sqlserver .ace_meta.ace_tag {\ +color: #0000FF;\ +}\ +.ace-sqlserver .ace_string.ace_regex {\ +color: #FF0000;\ +}\ +.ace-sqlserver .ace_string {\ +color: #FF0000;\ +}\ +.ace-sqlserver .ace_entity.ace_other.ace_attribute-name {\ +color: #994409;\ +}\ +.ace-sqlserver .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/sqlserver"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-terminal.js b/app/Resources/ui/js/ace/theme-terminal.js new file mode 100644 index 00000000..b10de0bd --- /dev/null +++ b/app/Resources/ui/js/ace/theme-terminal.js @@ -0,0 +1,121 @@ +define("ace/theme/terminal",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-terminal-theme"; +exports.cssText = ".ace-terminal-theme .ace_gutter {\ +background: #1a0005;\ +color: steelblue\ +}\ +.ace-terminal-theme .ace_print-margin {\ +width: 1px;\ +background: #1a1a1a\ +}\ +.ace-terminal-theme {\ +background-color: black;\ +color: #DEDEDE\ +}\ +.ace-terminal-theme .ace_cursor {\ +color: #9F9F9F\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_selection {\ +background: #424242\ +}\ +.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px black;\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_step {\ +background: rgb(0, 0, 0)\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_bracket {\ +background: #090;\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_bracket-start {\ +background: #090;\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #900\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_active-line {\ +background: #2A2A2A\ +}\ +.ace-terminal-theme .ace_gutter-active-line {\ +background-color: #2A112A\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_selected-word {\ +border: 1px solid #424242\ +}\ +.ace-terminal-theme .ace_invisible {\ +color: #343434\ +}\ +.ace-terminal-theme .ace_keyword,\ +.ace-terminal-theme .ace_meta,\ +.ace-terminal-theme .ace_storage,\ +.ace-terminal-theme .ace_storage.ace_type,\ +.ace-terminal-theme .ace_support.ace_type {\ +color: tomato\ +}\ +.ace-terminal-theme .ace_keyword.ace_operator {\ +color: deeppink\ +}\ +.ace-terminal-theme .ace_constant.ace_character,\ +.ace-terminal-theme .ace_constant.ace_language,\ +.ace-terminal-theme .ace_constant.ace_numeric,\ +.ace-terminal-theme .ace_keyword.ace_other.ace_unit,\ +.ace-terminal-theme .ace_support.ace_constant,\ +.ace-terminal-theme .ace_variable.ace_parameter {\ +color: #E78C45\ +}\ +.ace-terminal-theme .ace_constant.ace_other {\ +color: gold\ +}\ +.ace-terminal-theme .ace_invalid {\ +color: yellow;\ +background-color: red\ +}\ +.ace-terminal-theme .ace_invalid.ace_deprecated {\ +color: #CED2CF;\ +background-color: #B798BF\ +}\ +.ace-terminal-theme .ace_fold {\ +background-color: #7AA6DA;\ +border-color: #DEDEDE\ +}\ +.ace-terminal-theme .ace_entity.ace_name.ace_function,\ +.ace-terminal-theme .ace_support.ace_function,\ +.ace-terminal-theme .ace_variable {\ +color: #7AA6DA\ +}\ +.ace-terminal-theme .ace_support.ace_class,\ +.ace-terminal-theme .ace_support.ace_type {\ +color: #E7C547\ +}\ +.ace-terminal-theme .ace_heading,\ +.ace-terminal-theme .ace_string {\ +color: #B9CA4A\ +}\ +.ace-terminal-theme .ace_entity.ace_name.ace_tag,\ +.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,\ +.ace-terminal-theme .ace_meta.ace_tag,\ +.ace-terminal-theme .ace_string.ace_regexp,\ +.ace-terminal-theme .ace_variable {\ +color: #D54E53\ +}\ +.ace-terminal-theme .ace_comment {\ +color: orangered\ +}\ +.ace-terminal-theme .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/terminal"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-textmate.js b/app/Resources/ui/js/ace/theme-textmate.js new file mode 100644 index 00000000..dc651d74 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-textmate.js @@ -0,0 +1,137 @@ +define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +exports.isDark = false; +exports.cssClass = "ace-tm"; +exports.cssText = ".ace-tm .ace_gutter {\ +background: #f0f0f0;\ +color: #333;\ +}\ +.ace-tm .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-tm .ace_fold {\ +background-color: #6B72E6;\ +}\ +.ace-tm {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-tm .ace_cursor {\ +color: black;\ +}\ +.ace-tm .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-tm .ace_storage,\ +.ace-tm .ace_keyword {\ +color: blue;\ +}\ +.ace-tm .ace_constant {\ +color: rgb(197, 6, 11);\ +}\ +.ace-tm .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-tm .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-tm .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_invalid {\ +background-color: rgba(255, 0, 0, 0.1);\ +color: red;\ +}\ +.ace-tm .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-tm .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_support.ace_type,\ +.ace-tm .ace_support.ace_class {\ +color: rgb(109, 121, 222);\ +}\ +.ace-tm .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-tm .ace_string {\ +color: rgb(3, 106, 7);\ +}\ +.ace-tm .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-tm .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-tm .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-tm .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-tm .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-tm .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-tm .ace_entity.ace_name.ace_function {\ +color: #0000A2;\ +}\ +.ace-tm .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-tm .ace_list {\ +color:rgb(185, 6, 144);\ +}\ +.ace-tm .ace_meta.ace_tag {\ +color:rgb(0, 22, 142);\ +}\ +.ace-tm .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-tm .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-tm.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px white;\ +}\ +.ace-tm .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-tm .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-tm .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-tm .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-tm .ace_gutter-active-line {\ +background-color : #dcdcdc;\ +}\ +.ace-tm .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-tm .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}\ +"; +exports.$id = "ace/theme/textmate"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/textmate"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-tomorrow.js b/app/Resources/ui/js/ace/theme-tomorrow.js new file mode 100644 index 00000000..b1f73da8 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-tomorrow.js @@ -0,0 +1,115 @@ +define("ace/theme/tomorrow",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-tomorrow"; +exports.cssText = ".ace-tomorrow .ace_gutter {\ +background: #f6f6f6;\ +color: #4D4D4C\ +}\ +.ace-tomorrow .ace_print-margin {\ +width: 1px;\ +background: #f6f6f6\ +}\ +.ace-tomorrow {\ +background-color: #FFFFFF;\ +color: #4D4D4C\ +}\ +.ace-tomorrow .ace_cursor {\ +color: #AEAFAD\ +}\ +.ace-tomorrow .ace_marker-layer .ace_selection {\ +background: #D6D6D6\ +}\ +.ace-tomorrow.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #FFFFFF;\ +}\ +.ace-tomorrow .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0)\ +}\ +.ace-tomorrow .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #D1D1D1\ +}\ +.ace-tomorrow .ace_marker-layer .ace_active-line {\ +background: #EFEFEF\ +}\ +.ace-tomorrow .ace_gutter-active-line {\ +background-color : #dcdcdc\ +}\ +.ace-tomorrow .ace_marker-layer .ace_selected-word {\ +border: 1px solid #D6D6D6\ +}\ +.ace-tomorrow .ace_invisible {\ +color: #D1D1D1\ +}\ +.ace-tomorrow .ace_keyword,\ +.ace-tomorrow .ace_meta,\ +.ace-tomorrow .ace_storage,\ +.ace-tomorrow .ace_storage.ace_type,\ +.ace-tomorrow .ace_support.ace_type {\ +color: #8959A8\ +}\ +.ace-tomorrow .ace_keyword.ace_operator {\ +color: #3E999F\ +}\ +.ace-tomorrow .ace_constant.ace_character,\ +.ace-tomorrow .ace_constant.ace_language,\ +.ace-tomorrow .ace_constant.ace_numeric,\ +.ace-tomorrow .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow .ace_support.ace_constant,\ +.ace-tomorrow .ace_variable.ace_parameter {\ +color: #F5871F\ +}\ +.ace-tomorrow .ace_constant.ace_other {\ +color: #666969\ +}\ +.ace-tomorrow .ace_invalid {\ +color: #FFFFFF;\ +background-color: #C82829\ +}\ +.ace-tomorrow .ace_invalid.ace_deprecated {\ +color: #FFFFFF;\ +background-color: #8959A8\ +}\ +.ace-tomorrow .ace_fold {\ +background-color: #4271AE;\ +border-color: #4D4D4C\ +}\ +.ace-tomorrow .ace_entity.ace_name.ace_function,\ +.ace-tomorrow .ace_support.ace_function,\ +.ace-tomorrow .ace_variable {\ +color: #4271AE\ +}\ +.ace-tomorrow .ace_support.ace_class,\ +.ace-tomorrow .ace_support.ace_type {\ +color: #C99E00\ +}\ +.ace-tomorrow .ace_heading,\ +.ace-tomorrow .ace_markup.ace_heading,\ +.ace-tomorrow .ace_string {\ +color: #718C00\ +}\ +.ace-tomorrow .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow .ace_meta.ace_tag,\ +.ace-tomorrow .ace_string.ace_regexp,\ +.ace-tomorrow .ace_variable {\ +color: #C82829\ +}\ +.ace-tomorrow .ace_comment {\ +color: #8E908C\ +}\ +.ace-tomorrow .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/tomorrow"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-tomorrow_night.js b/app/Resources/ui/js/ace/theme-tomorrow_night.js new file mode 100644 index 00000000..36c748fd --- /dev/null +++ b/app/Resources/ui/js/ace/theme-tomorrow_night.js @@ -0,0 +1,115 @@ +define("ace/theme/tomorrow_night",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-tomorrow-night"; +exports.cssText = ".ace-tomorrow-night .ace_gutter {\ +background: #25282c;\ +color: #C5C8C6\ +}\ +.ace-tomorrow-night .ace_print-margin {\ +width: 1px;\ +background: #25282c\ +}\ +.ace-tomorrow-night {\ +background-color: #1D1F21;\ +color: #C5C8C6\ +}\ +.ace-tomorrow-night .ace_cursor {\ +color: #AEAFAD\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_selection {\ +background: #373B41\ +}\ +.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #1D1F21;\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #4B4E55\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_active-line {\ +background: #282A2E\ +}\ +.ace-tomorrow-night .ace_gutter-active-line {\ +background-color: #282A2E\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_selected-word {\ +border: 1px solid #373B41\ +}\ +.ace-tomorrow-night .ace_invisible {\ +color: #4B4E55\ +}\ +.ace-tomorrow-night .ace_keyword,\ +.ace-tomorrow-night .ace_meta,\ +.ace-tomorrow-night .ace_storage,\ +.ace-tomorrow-night .ace_storage.ace_type,\ +.ace-tomorrow-night .ace_support.ace_type {\ +color: #B294BB\ +}\ +.ace-tomorrow-night .ace_keyword.ace_operator {\ +color: #8ABEB7\ +}\ +.ace-tomorrow-night .ace_constant.ace_character,\ +.ace-tomorrow-night .ace_constant.ace_language,\ +.ace-tomorrow-night .ace_constant.ace_numeric,\ +.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow-night .ace_support.ace_constant,\ +.ace-tomorrow-night .ace_variable.ace_parameter {\ +color: #DE935F\ +}\ +.ace-tomorrow-night .ace_constant.ace_other {\ +color: #CED1CF\ +}\ +.ace-tomorrow-night .ace_invalid {\ +color: #CED2CF;\ +background-color: #DF5F5F\ +}\ +.ace-tomorrow-night .ace_invalid.ace_deprecated {\ +color: #CED2CF;\ +background-color: #B798BF\ +}\ +.ace-tomorrow-night .ace_fold {\ +background-color: #81A2BE;\ +border-color: #C5C8C6\ +}\ +.ace-tomorrow-night .ace_entity.ace_name.ace_function,\ +.ace-tomorrow-night .ace_support.ace_function,\ +.ace-tomorrow-night .ace_variable {\ +color: #81A2BE\ +}\ +.ace-tomorrow-night .ace_support.ace_class,\ +.ace-tomorrow-night .ace_support.ace_type {\ +color: #F0C674\ +}\ +.ace-tomorrow-night .ace_heading,\ +.ace-tomorrow-night .ace_markup.ace_heading,\ +.ace-tomorrow-night .ace_string {\ +color: #B5BD68\ +}\ +.ace-tomorrow-night .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow-night .ace_meta.ace_tag,\ +.ace-tomorrow-night .ace_string.ace_regexp,\ +.ace-tomorrow-night .ace_variable {\ +color: #CC6666\ +}\ +.ace-tomorrow-night .ace_comment {\ +color: #969896\ +}\ +.ace-tomorrow-night .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/tomorrow_night"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-tomorrow_night_blue.js b/app/Resources/ui/js/ace/theme-tomorrow_night_blue.js new file mode 100644 index 00000000..7bf7fc64 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-tomorrow_night_blue.js @@ -0,0 +1,113 @@ +define("ace/theme/tomorrow_night_blue",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-blue"; +exports.cssText = ".ace-tomorrow-night-blue .ace_gutter {\ +background: #00204b;\ +color: #7388b5\ +}\ +.ace-tomorrow-night-blue .ace_print-margin {\ +width: 1px;\ +background: #00204b\ +}\ +.ace-tomorrow-night-blue {\ +background-color: #002451;\ +color: #FFFFFF\ +}\ +.ace-tomorrow-night-blue .ace_constant.ace_other,\ +.ace-tomorrow-night-blue .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {\ +background: #003F8E\ +}\ +.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #002451;\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_step {\ +background: rgb(127, 111, 19)\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404F7D\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {\ +background: #00346E\ +}\ +.ace-tomorrow-night-blue .ace_gutter-active-line {\ +background-color: #022040\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {\ +border: 1px solid #003F8E\ +}\ +.ace-tomorrow-night-blue .ace_invisible {\ +color: #404F7D\ +}\ +.ace-tomorrow-night-blue .ace_keyword,\ +.ace-tomorrow-night-blue .ace_meta,\ +.ace-tomorrow-night-blue .ace_storage,\ +.ace-tomorrow-night-blue .ace_storage.ace_type,\ +.ace-tomorrow-night-blue .ace_support.ace_type {\ +color: #EBBBFF\ +}\ +.ace-tomorrow-night-blue .ace_keyword.ace_operator {\ +color: #99FFFF\ +}\ +.ace-tomorrow-night-blue .ace_constant.ace_character,\ +.ace-tomorrow-night-blue .ace_constant.ace_language,\ +.ace-tomorrow-night-blue .ace_constant.ace_numeric,\ +.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow-night-blue .ace_support.ace_constant,\ +.ace-tomorrow-night-blue .ace_variable.ace_parameter {\ +color: #FFC58F\ +}\ +.ace-tomorrow-night-blue .ace_invalid {\ +color: #FFFFFF;\ +background-color: #F99DA5\ +}\ +.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {\ +color: #FFFFFF;\ +background-color: #EBBBFF\ +}\ +.ace-tomorrow-night-blue .ace_fold {\ +background-color: #BBDAFF;\ +border-color: #FFFFFF\ +}\ +.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,\ +.ace-tomorrow-night-blue .ace_support.ace_function,\ +.ace-tomorrow-night-blue .ace_variable {\ +color: #BBDAFF\ +}\ +.ace-tomorrow-night-blue .ace_support.ace_class,\ +.ace-tomorrow-night-blue .ace_support.ace_type {\ +color: #FFEEAD\ +}\ +.ace-tomorrow-night-blue .ace_heading,\ +.ace-tomorrow-night-blue .ace_markup.ace_heading,\ +.ace-tomorrow-night-blue .ace_string {\ +color: #D1F1A9\ +}\ +.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow-night-blue .ace_meta.ace_tag,\ +.ace-tomorrow-night-blue .ace_string.ace_regexp,\ +.ace-tomorrow-night-blue .ace_variable {\ +color: #FF9DA4\ +}\ +.ace-tomorrow-night-blue .ace_comment {\ +color: #7285B7\ +}\ +.ace-tomorrow-night-blue .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/tomorrow_night_blue"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-tomorrow_night_bright.js b/app/Resources/ui/js/ace/theme-tomorrow_night_bright.js new file mode 100644 index 00000000..3bf12ddd --- /dev/null +++ b/app/Resources/ui/js/ace/theme-tomorrow_night_bright.js @@ -0,0 +1,128 @@ +define("ace/theme/tomorrow_night_bright",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-bright"; +exports.cssText = ".ace-tomorrow-night-bright .ace_gutter {\ +background: #1a1a1a;\ +color: #DEDEDE\ +}\ +.ace-tomorrow-night-bright .ace_print-margin {\ +width: 1px;\ +background: #1a1a1a\ +}\ +.ace-tomorrow-night-bright {\ +background-color: #000000;\ +color: #DEDEDE\ +}\ +.ace-tomorrow-night-bright .ace_cursor {\ +color: #9F9F9F\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {\ +background: #424242\ +}\ +.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #000000;\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #888888\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {\ +border: 1px solid rgb(110, 119, 0);\ +border-bottom: 0;\ +box-shadow: inset 0 -1px rgb(110, 119, 0);\ +margin: -1px 0 0 -1px;\ +background: rgba(255, 235, 0, 0.1)\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {\ +background: #2A2A2A\ +}\ +.ace-tomorrow-night-bright .ace_gutter-active-line {\ +background-color: #2A2A2A\ +}\ +.ace-tomorrow-night-bright .ace_stack {\ +background-color: rgb(66, 90, 44)\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {\ +border: 1px solid #888888\ +}\ +.ace-tomorrow-night-bright .ace_invisible {\ +color: #343434\ +}\ +.ace-tomorrow-night-bright .ace_keyword,\ +.ace-tomorrow-night-bright .ace_meta,\ +.ace-tomorrow-night-bright .ace_storage,\ +.ace-tomorrow-night-bright .ace_storage.ace_type,\ +.ace-tomorrow-night-bright .ace_support.ace_type {\ +color: #C397D8\ +}\ +.ace-tomorrow-night-bright .ace_keyword.ace_operator {\ +color: #70C0B1\ +}\ +.ace-tomorrow-night-bright .ace_constant.ace_character,\ +.ace-tomorrow-night-bright .ace_constant.ace_language,\ +.ace-tomorrow-night-bright .ace_constant.ace_numeric,\ +.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow-night-bright .ace_support.ace_constant,\ +.ace-tomorrow-night-bright .ace_variable.ace_parameter {\ +color: #E78C45\ +}\ +.ace-tomorrow-night-bright .ace_constant.ace_other {\ +color: #EEEEEE\ +}\ +.ace-tomorrow-night-bright .ace_invalid {\ +color: #CED2CF;\ +background-color: #DF5F5F\ +}\ +.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {\ +color: #CED2CF;\ +background-color: #B798BF\ +}\ +.ace-tomorrow-night-bright .ace_fold {\ +background-color: #7AA6DA;\ +border-color: #DEDEDE\ +}\ +.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,\ +.ace-tomorrow-night-bright .ace_support.ace_function,\ +.ace-tomorrow-night-bright .ace_variable {\ +color: #7AA6DA\ +}\ +.ace-tomorrow-night-bright .ace_support.ace_class,\ +.ace-tomorrow-night-bright .ace_support.ace_type {\ +color: #E7C547\ +}\ +.ace-tomorrow-night-bright .ace_heading,\ +.ace-tomorrow-night-bright .ace_markup.ace_heading,\ +.ace-tomorrow-night-bright .ace_string {\ +color: #B9CA4A\ +}\ +.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow-night-bright .ace_meta.ace_tag,\ +.ace-tomorrow-night-bright .ace_string.ace_regexp,\ +.ace-tomorrow-night-bright .ace_variable {\ +color: #D54E53\ +}\ +.ace-tomorrow-night-bright .ace_comment {\ +color: #969896\ +}\ +.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {\ +color: #C2C280\ +}\ +.ace-tomorrow-night-bright .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/tomorrow_night_bright"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-tomorrow_night_eighties.js b/app/Resources/ui/js/ace/theme-tomorrow_night_eighties.js new file mode 100644 index 00000000..e5c48fca --- /dev/null +++ b/app/Resources/ui/js/ace/theme-tomorrow_night_eighties.js @@ -0,0 +1,115 @@ +define("ace/theme/tomorrow_night_eighties",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-eighties"; +exports.cssText = ".ace-tomorrow-night-eighties .ace_gutter {\ +background: #272727;\ +color: #CCC\ +}\ +.ace-tomorrow-night-eighties .ace_print-margin {\ +width: 1px;\ +background: #272727\ +}\ +.ace-tomorrow-night-eighties {\ +background-color: #2D2D2D;\ +color: #CCCCCC\ +}\ +.ace-tomorrow-night-eighties .ace_constant.ace_other,\ +.ace-tomorrow-night-eighties .ace_cursor {\ +color: #CCCCCC\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {\ +background: #515151\ +}\ +.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #2D2D2D;\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #6A6A6A\ +}\ +.ace-tomorrow-night-bright .ace_stack {\ +background: rgb(66, 90, 44)\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {\ +background: #393939\ +}\ +.ace-tomorrow-night-eighties .ace_gutter-active-line {\ +background-color: #393939\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected-word {\ +border: 1px solid #515151\ +}\ +.ace-tomorrow-night-eighties .ace_invisible {\ +color: #6A6A6A\ +}\ +.ace-tomorrow-night-eighties .ace_keyword,\ +.ace-tomorrow-night-eighties .ace_meta,\ +.ace-tomorrow-night-eighties .ace_storage,\ +.ace-tomorrow-night-eighties .ace_storage.ace_type,\ +.ace-tomorrow-night-eighties .ace_support.ace_type {\ +color: #CC99CC\ +}\ +.ace-tomorrow-night-eighties .ace_keyword.ace_operator {\ +color: #66CCCC\ +}\ +.ace-tomorrow-night-eighties .ace_constant.ace_character,\ +.ace-tomorrow-night-eighties .ace_constant.ace_language,\ +.ace-tomorrow-night-eighties .ace_constant.ace_numeric,\ +.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow-night-eighties .ace_support.ace_constant,\ +.ace-tomorrow-night-eighties .ace_variable.ace_parameter {\ +color: #F99157\ +}\ +.ace-tomorrow-night-eighties .ace_invalid {\ +color: #CDCDCD;\ +background-color: #F2777A\ +}\ +.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {\ +color: #CDCDCD;\ +background-color: #CC99CC\ +}\ +.ace-tomorrow-night-eighties .ace_fold {\ +background-color: #6699CC;\ +border-color: #CCCCCC\ +}\ +.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,\ +.ace-tomorrow-night-eighties .ace_support.ace_function,\ +.ace-tomorrow-night-eighties .ace_variable {\ +color: #6699CC\ +}\ +.ace-tomorrow-night-eighties .ace_support.ace_class,\ +.ace-tomorrow-night-eighties .ace_support.ace_type {\ +color: #FFCC66\ +}\ +.ace-tomorrow-night-eighties .ace_heading,\ +.ace-tomorrow-night-eighties .ace_markup.ace_heading,\ +.ace-tomorrow-night-eighties .ace_string {\ +color: #99CC99\ +}\ +.ace-tomorrow-night-eighties .ace_comment {\ +color: #999999\ +}\ +.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow-night-eighties .ace_meta.ace_tag,\ +.ace-tomorrow-night-eighties .ace_variable {\ +color: #F2777A\ +}\ +.ace-tomorrow-night-eighties .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/tomorrow_night_eighties"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-twilight.js b/app/Resources/ui/js/ace/theme-twilight.js new file mode 100644 index 00000000..03e9d07d --- /dev/null +++ b/app/Resources/ui/js/ace/theme-twilight.js @@ -0,0 +1,116 @@ +define("ace/theme/twilight",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-twilight"; +exports.cssText = ".ace-twilight .ace_gutter {\ +background: #232323;\ +color: #E2E2E2\ +}\ +.ace-twilight .ace_print-margin {\ +width: 1px;\ +background: #232323\ +}\ +.ace-twilight {\ +background-color: #141414;\ +color: #F8F8F8\ +}\ +.ace-twilight .ace_cursor {\ +color: #A7A7A7\ +}\ +.ace-twilight .ace_marker-layer .ace_selection {\ +background: rgba(221, 240, 255, 0.20)\ +}\ +.ace-twilight.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #141414;\ +}\ +.ace-twilight .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-twilight .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 255, 255, 0.25)\ +}\ +.ace-twilight .ace_marker-layer .ace_active-line {\ +background: rgba(255, 255, 255, 0.031)\ +}\ +.ace-twilight .ace_gutter-active-line {\ +background-color: rgba(255, 255, 255, 0.031)\ +}\ +.ace-twilight .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(221, 240, 255, 0.20)\ +}\ +.ace-twilight .ace_invisible {\ +color: rgba(255, 255, 255, 0.25)\ +}\ +.ace-twilight .ace_keyword,\ +.ace-twilight .ace_meta {\ +color: #CDA869\ +}\ +.ace-twilight .ace_constant,\ +.ace-twilight .ace_constant.ace_character,\ +.ace-twilight .ace_constant.ace_character.ace_escape,\ +.ace-twilight .ace_constant.ace_other,\ +.ace-twilight .ace_heading,\ +.ace-twilight .ace_markup.ace_heading,\ +.ace-twilight .ace_support.ace_constant {\ +color: #CF6A4C\ +}\ +.ace-twilight .ace_invalid.ace_illegal {\ +color: #F8F8F8;\ +background-color: rgba(86, 45, 86, 0.75)\ +}\ +.ace-twilight .ace_invalid.ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #D2A8A1\ +}\ +.ace-twilight .ace_support {\ +color: #9B859D\ +}\ +.ace-twilight .ace_fold {\ +background-color: #AC885B;\ +border-color: #F8F8F8\ +}\ +.ace-twilight .ace_support.ace_function {\ +color: #DAD085\ +}\ +.ace-twilight .ace_list,\ +.ace-twilight .ace_markup.ace_list,\ +.ace-twilight .ace_storage {\ +color: #F9EE98\ +}\ +.ace-twilight .ace_entity.ace_name.ace_function,\ +.ace-twilight .ace_meta.ace_tag {\ +color: #AC885B\ +}\ +.ace-twilight .ace_string {\ +color: #8F9D6A\ +}\ +.ace-twilight .ace_string.ace_regexp {\ +color: #E9C062\ +}\ +.ace-twilight .ace_comment {\ +font-style: italic;\ +color: #5F5A60\ +}\ +.ace-twilight .ace_variable {\ +color: #7587A6\ +}\ +.ace-twilight .ace_xml-pe {\ +color: #494949\ +}\ +.ace-twilight .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/twilight"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-vibrant_ink.js b/app/Resources/ui/js/ace/theme-vibrant_ink.js new file mode 100644 index 00000000..26f7de90 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-vibrant_ink.js @@ -0,0 +1,101 @@ +define("ace/theme/vibrant_ink",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-vibrant-ink"; +exports.cssText = ".ace-vibrant-ink .ace_gutter {\ +background: #1a1a1a;\ +color: #BEBEBE\ +}\ +.ace-vibrant-ink .ace_print-margin {\ +width: 1px;\ +background: #1a1a1a\ +}\ +.ace-vibrant-ink {\ +background-color: #0F0F0F;\ +color: #FFFFFF\ +}\ +.ace-vibrant-ink .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_selection {\ +background: #6699CC\ +}\ +.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #0F0F0F;\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404040\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_active-line {\ +background: #333333\ +}\ +.ace-vibrant-ink .ace_gutter-active-line {\ +background-color: #333333\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_selected-word {\ +border: 1px solid #6699CC\ +}\ +.ace-vibrant-ink .ace_invisible {\ +color: #404040\ +}\ +.ace-vibrant-ink .ace_keyword,\ +.ace-vibrant-ink .ace_meta {\ +color: #FF6600\ +}\ +.ace-vibrant-ink .ace_constant,\ +.ace-vibrant-ink .ace_constant.ace_character,\ +.ace-vibrant-ink .ace_constant.ace_character.ace_escape,\ +.ace-vibrant-ink .ace_constant.ace_other {\ +color: #339999\ +}\ +.ace-vibrant-ink .ace_constant.ace_numeric {\ +color: #99CC99\ +}\ +.ace-vibrant-ink .ace_invalid,\ +.ace-vibrant-ink .ace_invalid.ace_deprecated {\ +color: #CCFF33;\ +background-color: #000000\ +}\ +.ace-vibrant-ink .ace_fold {\ +background-color: #FFCC00;\ +border-color: #FFFFFF\ +}\ +.ace-vibrant-ink .ace_entity.ace_name.ace_function,\ +.ace-vibrant-ink .ace_support.ace_function,\ +.ace-vibrant-ink .ace_variable {\ +color: #FFCC00\ +}\ +.ace-vibrant-ink .ace_variable.ace_parameter {\ +font-style: italic\ +}\ +.ace-vibrant-ink .ace_string {\ +color: #66FF00\ +}\ +.ace-vibrant-ink .ace_string.ace_regexp {\ +color: #44B4CC\ +}\ +.ace-vibrant-ink .ace_comment {\ +color: #9933CC\ +}\ +.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {\ +font-style: italic;\ +color: #99CC99\ +}\ +.ace-vibrant-ink .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/vibrant_ink"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-xcode.js b/app/Resources/ui/js/ace/theme-xcode.js new file mode 100644 index 00000000..daded3a1 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-xcode.js @@ -0,0 +1,95 @@ +define("ace/theme/xcode",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-xcode"; +exports.cssText = "\ +.ace-xcode .ace_gutter {\ +background: #e8e8e8;\ +color: #333\ +}\ +.ace-xcode .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-xcode {\ +background-color: #FFFFFF;\ +color: #000000\ +}\ +.ace-xcode .ace_cursor {\ +color: #000000\ +}\ +.ace-xcode .ace_marker-layer .ace_selection {\ +background: #B5D5FF\ +}\ +.ace-xcode.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #FFFFFF;\ +}\ +.ace-xcode .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174)\ +}\ +.ace-xcode .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #BFBFBF\ +}\ +.ace-xcode .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.071)\ +}\ +.ace-xcode .ace_gutter-active-line {\ +background-color: rgba(0, 0, 0, 0.071)\ +}\ +.ace-xcode .ace_marker-layer .ace_selected-word {\ +border: 1px solid #B5D5FF\ +}\ +.ace-xcode .ace_constant.ace_language,\ +.ace-xcode .ace_keyword,\ +.ace-xcode .ace_meta,\ +.ace-xcode .ace_variable.ace_language {\ +color: #C800A4\ +}\ +.ace-xcode .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-xcode .ace_constant.ace_character,\ +.ace-xcode .ace_constant.ace_other {\ +color: #275A5E\ +}\ +.ace-xcode .ace_constant.ace_numeric {\ +color: #3A00DC\ +}\ +.ace-xcode .ace_entity.ace_other.ace_attribute-name,\ +.ace-xcode .ace_support.ace_constant,\ +.ace-xcode .ace_support.ace_function {\ +color: #450084\ +}\ +.ace-xcode .ace_fold {\ +background-color: #C800A4;\ +border-color: #000000\ +}\ +.ace-xcode .ace_entity.ace_name.ace_tag,\ +.ace-xcode .ace_support.ace_class,\ +.ace-xcode .ace_support.ace_type {\ +color: #790EAD\ +}\ +.ace-xcode .ace_storage {\ +color: #C900A4\ +}\ +.ace-xcode .ace_string {\ +color: #DF0002\ +}\ +.ace-xcode .ace_comment {\ +color: #008E00\ +}\ +.ace-xcode .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); +}); (function() { + window.require(["ace/theme/xcode"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/app/Resources/ui/js/ace/worker-base.js b/app/Resources/ui/js/ace/worker-base.js new file mode 100644 index 00000000..800d6a60 --- /dev/null +++ b/app/Resources/ui/js/ace/worker-base.js @@ -0,0 +1,1459 @@ +"no use strict"; +!(function(window) { +if (typeof window.window != "undefined" && window.document) + return; +if (window.require && window.define) + return; + +if (!window.console) { + window.console = function() { + var msgs = Array.prototype.slice.call(arguments, 0); + postMessage({type: "log", data: msgs}); + }; + window.console.error = + window.console.warn = + window.console.log = + window.console.trace = window.console; +} +window.window = window; +window.ace = window; + +window.onerror = function(message, file, line, col, err) { + postMessage({type: "error", data: { + message: message, + data: err && err.data, + file: file, + line: line, + col: col, + stack: err && err.stack + }}); +}; + +window.normalizeModule = function(parentId, moduleName) { + // normalize plugin requires + if (moduleName.indexOf("!") !== -1) { + var chunks = moduleName.split("!"); + return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]); + } + // normalize relative requires + if (moduleName.charAt(0) == ".") { + var base = parentId.split("/").slice(0, -1).join("/"); + moduleName = (base ? base + "/" : "") + moduleName; + + while (moduleName.indexOf(".") !== -1 && previous != moduleName) { + var previous = moduleName; + moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); + } + } + + return moduleName; +}; + +window.require = function require(parentId, id) { + if (!id) { + id = parentId; + parentId = null; + } + if (!id.charAt) + throw new Error("worker.js require() accepts only (parentId, id) as arguments"); + + id = window.normalizeModule(parentId, id); + + var module = window.require.modules[id]; + if (module) { + if (!module.initialized) { + module.initialized = true; + module.exports = module.factory().exports; + } + return module.exports; + } + + if (!window.require.tlns) + return console.log("unable to load " + id); + + var path = resolveModuleId(id, window.require.tlns); + if (path.slice(-3) != ".js") path += ".js"; + + window.require.id = id; + window.require.modules[id] = {}; // prevent infinite loop on broken modules + importScripts(path); + return window.require(parentId, id); +}; +function resolveModuleId(id, paths) { + var testPath = id, tail = ""; + while (testPath) { + var alias = paths[testPath]; + if (typeof alias == "string") { + return alias + tail; + } else if (alias) { + return alias.location.replace(/\/*$/, "/") + (tail || alias.main || alias.name); + } else if (alias === false) { + return ""; + } + var i = testPath.lastIndexOf("/"); + if (i === -1) break; + tail = testPath.substr(i) + tail; + testPath = testPath.slice(0, i); + } + return id; +} +window.require.modules = {}; +window.require.tlns = {}; + +window.define = function(id, deps, factory) { + if (arguments.length == 2) { + factory = deps; + if (typeof id != "string") { + deps = id; + id = window.require.id; + } + } else if (arguments.length == 1) { + factory = id; + deps = []; + id = window.require.id; + } + + if (typeof factory != "function") { + window.require.modules[id] = { + exports: factory, + initialized: true + }; + return; + } + + if (!deps.length) + // If there is no dependencies, we inject "require", "exports" and + // "module" as dependencies, to provide CommonJS compatibility. + deps = ["require", "exports", "module"]; + + var req = function(childId) { + return window.require(id, childId); + }; + + window.require.modules[id] = { + exports: {}, + factory: function() { + var module = this; + var returnExports = factory.apply(this, deps.slice(0, factory.length).map(function(dep) { + switch (dep) { + // Because "require", "exports" and "module" aren't actual + // dependencies, we must handle them seperately. + case "require": return req; + case "exports": return module.exports; + case "module": return module; + // But for all other dependencies, we can just go ahead and + // require them. + default: return req(dep); + } + })); + if (returnExports) + module.exports = returnExports; + return module; + } + }; +}; +window.define.amd = {}; +window.require.tlns = {}; +window.initBaseUrls = function initBaseUrls(topLevelNamespaces) { + for (var i in topLevelNamespaces) + this.require.tlns[i] = topLevelNamespaces[i]; +}; + +window.initSender = function initSender() { + + var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter; + var oop = window.require("ace/lib/oop"); + + var Sender = function() {}; + + (function() { + + oop.implement(this, EventEmitter); + + this.callback = function(data, callbackId) { + postMessage({ + type: "call", + id: callbackId, + data: data + }); + }; + + this.emit = function(name, data) { + postMessage({ + type: "event", + name: name, + data: data + }); + }; + + }).call(Sender.prototype); + + return new Sender(); +}; + +var main = window.main = null; +var sender = window.sender = null; + +window.onmessage = function(e) { + var msg = e.data; + if (msg.event && sender) { + sender._signal(msg.event, msg.data); + } + else if (msg.command) { + if (main[msg.command]) + main[msg.command].apply(main, msg.args); + else if (window[msg.command]) + window[msg.command].apply(window, msg.args); + else + throw new Error("Unknown command:" + msg.command); + } + else if (msg.init) { + window.initBaseUrls(msg.tlns); + sender = window.sender = window.initSender(); + var clazz = this.require(msg.module)[msg.classname]; + main = window.main = new clazz(sender); + } +}; +})(this); + +define("ace/lib/oop",[], function(require, exports, module) { +"use strict"; + +exports.inherits = function(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); +}; + +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } + return obj; +}; + +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); + +define("ace/apply_delta",[], function(require, exports, module) { +"use strict"; + +function throwDeltaError(delta, errorText){ + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} + +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} + +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} + +exports.applyDelta = function(docLines, delta, doNotValidate) { + + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } else { + docLines.splice( + row, endRow - row + 1, + line.substring(0, startColumn) + docLines[endRow].substring(endColumn) + ); + } + break; + } +}; +}); + +define("ace/lib/event_emitter",[], function(require, exports, module) { +"use strict"; + +var EventEmitter = {}; +var stopPropagation = function() { this.propagationStopped = true; }; +var preventDefault = function() { this.defaultPrevented = true; }; + +EventEmitter._emit = +EventEmitter._dispatchEvent = function(eventName, e) { + this._eventRegistry || (this._eventRegistry = {}); + this._defaultHandlers || (this._defaultHandlers = {}); + + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + + if (typeof e != "object" || !e) + e = {}; + + if (!e.type) + e.type = eventName; + if (!e.stopPropagation) + e.stopPropagation = stopPropagation; + if (!e.preventDefault) + e.preventDefault = preventDefault; + + listeners = listeners.slice(); + for (var i=0; i [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + }; + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + }; + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + }; + this.intersects = function(range) { + var cmp = this.compareRange(range); + return (cmp == -1 || cmp == 0 || cmp == 1); + }; + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + }; + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + }; + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + }; + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + }; + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + } + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + }; + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) + var end = {row: lastRow + 1, column: 0}; + else if (this.end.row < firstRow) + var end = {row: firstRow, column: 0}; + + if (this.start.row > lastRow) + var start = {row: lastRow + 1, column: 0}; + else if (this.start.row < firstRow) + var start = {row: firstRow, column: 0}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row === this.end.row && this.start.column === this.end.column); + }; + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0); + else + return new Range(this.start.row, 0, this.end.row, 0); + }; + this.toScreenRange = function(session) { + var screenPosStart = session.documentToScreenPosition(this.start); + var screenPosEnd = session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + this.moveBy = function(row, column) { + this.start.row += row; + this.start.column += column; + this.end.row += row; + this.end.column += column; + }; + +}).call(Range.prototype); +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; +Range.comparePoints = comparePoints; + +Range.comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; + + +exports.Range = Range; +}); + +define("ace/anchor",[], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var Anchor = exports.Anchor = function(doc, row, column) { + this.$onChange = this.onChange.bind(this); + this.attach(doc); + + if (typeof column == "undefined") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.getPosition = function() { + return this.$clipPositionToDocument(this.row, this.column); + }; + this.getDocument = function() { + return this.document; + }; + this.$insertRight = false; + this.onChange = function(delta) { + if (delta.start.row == delta.end.row && delta.start.row != this.row) + return; + + if (delta.start.row > this.row) + return; + + var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); + this.setPosition(point.row, point.column, true); + }; + + function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); + } + + function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + + return { + row: deltaStart.row, + column: deltaStart.column + }; + } + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); + }; + this.detach = function() { + this.document.off("change", this.$onChange); + }; + this.attach = function(doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); + +define("ace/document",[], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } else if (Array.isArray(textOrLines)) { + this.insertMergedLines({row: 0, column: 0}, textOrLines); + } else { + this.insert({row: 0, column:0}, textOrLines); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.initialize = function(text) { + this.refresh(text); + }; + this.setValue = function(text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({row: 0, column: 0}, text); + }; + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + if ("aaa".split(/a/).length === 0) { + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + }; + } else { + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); + }; + } + + + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; + } + }; + + this.$autoNewLine = ""; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + this._signal("changeNewLineMode"); + }; + this.getNewLineMode = function() { + return this.$newLineMode; + }; + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + this.getLength = function() { + return this.$lines.length; + }; + this.getTextRange = function(range) { + return this.getLinesForRange(range).join(this.getNewLineCharacter()); + }; + this.getLinesForRange = function(range) { + var lines; + if (range.start.row === range.end.row) { + lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; + } else { + lines = this.getLines(range.start.row, range.end.row); + lines[0] = (lines[0] || "").substring(range.start.column); + var l = lines.length - 1; + if (range.end.row - range.start.row == l) + lines[l] = lines[l].substring(0, range.end.column); + } + return lines; + }; + this.insertLines = function(row, lines) { + console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); + return this.insertFullLines(row, lines); + }; + this.removeLines = function(firstRow, lastRow) { + console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); + return this.removeFullLines(firstRow, lastRow); + }; + this.insertNewLine = function(position) { + console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."); + return this.insertMergedLines(position, ["", ""]); + }; + this.insert = function(position, text) { + if (this.getLength() <= 1) + this.$detectNewLine(text); + + return this.insertMergedLines(position, this.$split(text)); + }; + this.insertInLine = function(position, text) { + var start = this.clippedPos(position.row, position.column); + var end = this.pos(position.row, position.column + text.length); + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: [text] + }, true); + + return this.clonePos(end); + }; + + this.clippedPos = function(row, column) { + var length = this.getLength(); + if (row === undefined) { + row = length; + } else if (row < 0) { + row = 0; + } else if (row >= length) { + row = length - 1; + column = undefined; + } + var line = this.getLine(row); + if (column == undefined) + column = line.length; + column = Math.min(Math.max(column, 0), line.length); + return {row: row, column: column}; + }; + + this.clonePos = function(pos) { + return {row: pos.row, column: pos.column}; + }; + + this.pos = function(row, column) { + return {row: row, column: column}; + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length - 1).length; + } else { + position.row = Math.max(0, position.row); + position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); + } + return position; + }; + + this.refresh = function(text, row){ + var row = row || 0 + var lines = this.$split(text); + if (lines.length > 0xFFFF) { + var end = this.refresh(row, lines.slice(0xFFFF)); + lines = lines.slice(0, 0xFFFF); + } + + var args = [row, 0]; + args.push.apply(args, lines); + this.$lines.splice.apply(this.$lines, args); + var range = new Range(row, 0, row + lines.length, 0); + var delta = { + action: "insertLines", + context: 'refresh', + range: range, + lines: lines + }; + this._emit("change", { data: delta }); + return {row:0, column:0}; + } + this.insertFullLines = function(row, lines) { + row = Math.min(Math.max(row, 0), this.getLength()); + var column = 0; + if (row < this.getLength()) { + lines = lines.concat([""]); + column = 0; + } else { + lines = [""].concat(lines); + row--; + column = this.$lines[row].length; + } + this.insertMergedLines({row: row, column: column}, lines); + }; + this.insertMergedLines = function(position, lines) { + var start = this.clippedPos(position.row, position.column); + var end = { + row: start.row + lines.length - 1, + column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length + }; + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: lines + }); + + return this.clonePos(end); + }; + this.remove = function(range) { + var start = this.clippedPos(range.start.row, range.start.column); + var end = this.clippedPos(range.end.row, range.end.column); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }); + return this.clonePos(start); + }; + this.removeInLine = function(row, startColumn, endColumn) { + var start = this.clippedPos(row, startColumn); + var end = this.clippedPos(row, endColumn); + + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }, true); + + return this.clonePos(start); + }; + this.removeFullLines = function(firstRow, lastRow) { + firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); + var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); + var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); + var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var range = new Range(startRow, startCol, endRow, endCol); + var deletedLines = this.$lines.slice(firstRow, lastRow + 1); + + this.applyDelta({ + start: range.start, + end: range.end, + action: "remove", + lines: this.getLinesForRange(range) + }); + return deletedLines; + }; + this.removeNewLine = function(row) { + if (row < this.getLength() - 1 && row >= 0) { + this.applyDelta({ + start: this.pos(row, this.getLine(row).length), + end: this.pos(row + 1, 0), + action: "remove", + lines: ["", ""] + }); + } + }; + this.replace = function(range, text) { + if (!(range instanceof Range)) + range = Range.fromPoints(range.start, range.end); + if (text.length === 0 && range.isEmpty()) + return range.start; + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + var end; + if (text) { + end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + this.revertDelta(deltas[i]); + } + }; + this.applyDelta = function(delta, doNotValidate) { + var isInsert = delta.action == "insert"; + if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] + : !Range.comparePoints(delta.start, delta.end)) { + return; + } + + if (isInsert && delta.lines.length > 20000) { + this.$splitAndapplyLargeDelta(delta, 20000); + } + else { + applyDelta(this.$lines, delta, doNotValidate); + this._signal("change", delta); + } + }; + + this.$safeApplyDelta = function(delta) { + var docLength = this.$lines.length; + if ( + delta.action == "remove" && delta.start.row < docLength && delta.end.row < docLength + || delta.action == "insert" && delta.start.row <= docLength + ) { + this.applyDelta(delta); + } + }; + + this.$splitAndapplyLargeDelta = function(delta, MAX) { + var lines = delta.lines; + var l = lines.length - MAX + 1; + var row = delta.start.row; + var column = delta.start.column; + for (var from = 0, to = 0; from < l; from = to) { + to += MAX - 1; + var chunk = lines.slice(from, to); + chunk.push(""); + this.applyDelta({ + start: this.pos(row + from, column), + end: this.pos(row + to, column = 0), + action: delta.action, + lines: chunk + }, true); + } + delta.lines = lines.slice(from); + delta.start.row = row + from; + delta.start.column = column; + this.applyDelta(delta, true); + }; + this.revertDelta = function(delta) { + this.$safeApplyDelta({ + start: this.clonePos(delta.start), + end: this.clonePos(delta.end), + action: (delta.action == "insert" ? "remove" : "insert"), + lines: delta.lines.slice() + }); + }; + this.indexToPosition = function(index, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + for (var i = startRow || 0, l = lines.length; i < l; i++) { + index -= lines[i].length + newlineLength; + if (index < 0) + return {row: i, column: index + lines[i].length + newlineLength}; + } + return {row: l-1, column: index + lines[l-1].length + newlineLength}; + }; + this.positionToIndex = function(pos, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + var index = 0; + var row = Math.min(pos.row, lines.length); + for (var i = startRow || 0; i < row; ++i) + index += lines[i].length + newlineLength; + + return index + pos.column; + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); + +define("ace/lib/lang",[], function(require, exports, module) { +"use strict"; + +exports.last = function(a) { + return a[a.length - 1]; +}; + +exports.stringReverse = function(string) { + return string.split("").reverse().join(""); +}; + +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + + if (count >>= 1) + string += string; + } + return result; +}; + +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; + +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; + +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; + +exports.copyObject = function(obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; + +exports.copyArray = function(array){ + var copy = []; + for (var i=0, l=array.length; i= doc.$lines.length) { + err = new Error("Invalid delta"); + err.data = { + path: _self.$path, + linesLength: doc.$lines.length, + start: d.start, + end: d.end + }; + throw err; + } + + doc.applyDelta(d, true); + } + } + if (_self.$timeout) + return deferredUpdate.schedule(_self.$timeout); + _self.onUpdate(); + }); +}; + +(function() { + + this.$timeout = 500; + + this.setTimeout = function(timeout) { + this.$timeout = timeout; + }; + + this.setValue = function(value) { + this.doc.setValue(value); + this.deferredUpdate.schedule(this.$timeout); + }; + + this.getValue = function(callbackId) { + this.sender.callback(this.doc.getValue(), callbackId); + }; + + this.onUpdate = function() { + }; + + this.isPending = function() { + return this.deferredUpdate.isPending(); + }; + +}).call(Mirror.prototype); + +}); diff --git a/app/Resources/ui/js/editor.js b/app/Resources/ui/js/editor.js index 7041e12b..2ab8730d 100644 --- a/app/Resources/ui/js/editor.js +++ b/app/Resources/ui/js/editor.js @@ -77,9 +77,12 @@ var UndoMgr = function() { this.reset(); }; ace.require("ace/ext/language_tools"); +// ace.require("ace/ext/error_marker"); +// ace.require("ace/ext/keybinding_menu"); + var Editor = function(elt){ - var dom = $(elt) - var ed = ace.edit(dom.attr('id')) + var dom = document.querySelector(elt) + var ed = ace.edit(dom.getAttribute('id')) var undo = new UndoMgr() var sess = null var _menu_cmds = { // commands whose keyboard shortcuts are caught by ace rather than NSView @@ -101,6 +104,7 @@ var Editor = function(elt){ ed.commands.addCommands(PLOTDEVICE_KEYBINDINGS) ed.setOptions({ enableBasicAutocompletion: true, + // enableLiveAutocompletion: true, enableSnippets: true }); ed.renderer.updateCharacterSize() @@ -113,7 +117,7 @@ var Editor = function(elt){ sess.setMode("ace/mode/plotdevice"); sess.setTabSize(4); sess.setUseSoftTabs(true); - sess.setUndoManager(undo); +// sess.setUndoManager(undo); // it would be nice if this didn't *select* the undo segment, but did *scroll* // the viewport to the cursor position. ace.js's default behavior is all or none @@ -130,19 +134,19 @@ var Editor = function(elt){ // listen for commands that have key equivalents in the main menu and notify the // objc side of things when one of them is entered var cmd = e.command.name - _.each(_menu_cmds, function(cmds, menu){ - if (_.contains(cmds, cmd)) app.flash_(menu) - }) + for (const [cmds, menu] of Object.entries(_menu_cmds)){ + if (cmds.includes(cmd)) app.flash_(menu) + } }, _scroll_h:function(x){ var now = Date.now() if (_htimer) clearTimeout(_htimer) else{ _hmin = now + 500 - dom.addClass('scrolling-h') + dom.classList.add('scrolling-h') } _htimer = setTimeout(function(){ - dom.removeClass('scrolling-h'); + dom.classList.remove('scrolling-h') _htimer=null }, Math.max(_hmin-now, 180)) }, @@ -151,10 +155,10 @@ var Editor = function(elt){ if (_vtimer) clearTimeout(_vtimer) else{ _vmin = now + 500 - dom.addClass('scrolling-v') + dom.classList.add('scrolling-v') } _vtimer = setTimeout(function(){ - dom.removeClass('scrolling-v'); + dom.classList.remove('scrolling-v') _vtimer=null }, Math.max(_vmin-now, 180)) }, @@ -186,7 +190,8 @@ var Editor = function(elt){ } }, font:function(family, px){ - dom.css({fontFamily:family, fontSize:px}) + dom.style.fontFamily = family + dom.style.fontSize = px }, theme:function(thm){ if (thm===undefined){ @@ -207,9 +212,10 @@ var Editor = function(elt){ var sel = ed.getSelection() var rng = ed.getSelectionRange() var tok = sess.getTokens(rng.start.row) - console.log('tokens',_.map(tok, function(t){return t.type})) + console.log('tokens', tok.map(t => t.type)) var at = sess.getTokenAt(rng.start.row,rng.start.column) - _.each(tok, function(t, i){ + + tok.forEach((t, i) => { if (t===at) console.log('FOUND', t,'at',i) }) var word_rng = sess.getAWordRange(rng.start.row,rng.start.column) @@ -249,9 +255,9 @@ var Editor = function(elt){ if (err==null){ sess.clearAnnotations() }else{ - var anns = _.map(lines, function(line, i){ + var anns = lines.map((line, i) => { var ann = {row:line, col:0, type:"warning"} - if (i==0) _.extend(ann, {type:"error", text:err}) + if (i==0) Object.assign(ann, {type:"error", text:err}) return ann }) sess.setAnnotations(anns) @@ -260,5 +266,6 @@ var Editor = function(elt){ } } - return (dom.length==0) ? {} : that.init() + + return dom ? that.init() : {} } diff --git a/app/Resources/ui/js/jquery-2.1.0.js b/app/Resources/ui/js/jquery-2.1.0.js deleted file mode 100644 index 2adda35a..00000000 --- a/app/Resources/ui/js/jquery-2.1.0.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v2.1.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m=a.document,n="2.1.0",o=function(a,b){return new o.fn.init(a,b)},p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};o.fn=o.prototype={jquery:n,constructor:o,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=o.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return o.each(this,a,b)},map:function(a){return this.pushStack(o.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},o.extend=o.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||o.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(o.isPlainObject(d)||(e=o.isArray(d)))?(e?(e=!1,f=c&&o.isArray(c)?c:[]):f=c&&o.isPlainObject(c)?c:{},g[b]=o.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},o.extend({expando:"jQuery"+(n+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===o.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isPlainObject:function(a){if("object"!==o.type(a)||a.nodeType||o.isWindow(a))return!1;try{if(a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(b){return!1}return!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=o.trim(a),a&&(1===a.indexOf("use strict")?(b=m.createElement("script"),b.text=a,m.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":k.call(a)},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?o.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),o.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||o.guid++,f):void 0},now:Date.now,support:l}),o.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=o.type(a);return"function"===c||o.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);o.find=t,o.expr=t.selectors,o.expr[":"]=o.expr.pseudos,o.unique=t.uniqueSort,o.text=t.getText,o.isXMLDoc=t.isXML,o.contains=t.contains;var u=o.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(o.isFunction(b))return o.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return o.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return o.filter(b,a,c);b=o.filter(b,a)}return o.grep(a,function(a){return g.call(b,a)>=0!==c})}o.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?o.find.matchesSelector(d,a)?[d]:[]:o.find.matches(a,o.grep(b,function(a){return 1===a.nodeType}))},o.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(o(a).filter(function(){for(b=0;c>b;b++)if(o.contains(e[b],this))return!0}));for(b=0;c>b;b++)o.find(a,e[b],d);return d=this.pushStack(c>1?o.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?o(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=o.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof o?b[0]:b,o.merge(this,o.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:m,!0)),v.test(c[1])&&o.isPlainObject(b))for(c in b)o.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=m.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=m,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):o.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(o):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),o.makeArray(a,this))};A.prototype=o.fn,y=o(m);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};o.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&o(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),o.fn.extend({has:function(a){var b=o(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(o.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?o(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&o.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?o.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(o(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(o.unique(o.merge(this.get(),o(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}o.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return o.dir(a,"parentNode")},parentsUntil:function(a,b,c){return o.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return o.dir(a,"nextSibling")},prevAll:function(a){return o.dir(a,"previousSibling")},nextUntil:function(a,b,c){return o.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return o.dir(a,"previousSibling",c)},siblings:function(a){return o.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return o.sibling(a.firstChild)},contents:function(a){return a.contentDocument||o.merge([],a.childNodes)}},function(a,b){o.fn[a]=function(c,d){var e=o.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=o.filter(d,e)),this.length>1&&(C[a]||o.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return o.each(a.match(E)||[],function(a,c){b[c]=!0}),b}o.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):o.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){o.each(b,function(b,c){var d=o.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&o.each(arguments,function(a,b){var c;while((c=o.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?o.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},o.extend({Deferred:function(a){var b=[["resolve","done",o.Callbacks("once memory"),"resolved"],["reject","fail",o.Callbacks("once memory"),"rejected"],["notify","progress",o.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return o.Deferred(function(c){o.each(b,function(b,f){var g=o.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&o.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?o.extend(a,d):d}},e={};return d.pipe=d.then,o.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&o.isFunction(a.promise)?e:0,g=1===f?a:o.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&o.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;o.fn.ready=function(a){return o.ready.promise().done(a),this},o.extend({isReady:!1,readyWait:1,holdReady:function(a){a?o.readyWait++:o.ready(!0)},ready:function(a){(a===!0?--o.readyWait:o.isReady)||(o.isReady=!0,a!==!0&&--o.readyWait>0||(H.resolveWith(m,[o]),o.fn.trigger&&o(m).trigger("ready").off("ready")))}});function I(){m.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),o.ready()}o.ready.promise=function(b){return H||(H=o.Deferred(),"complete"===m.readyState?setTimeout(o.ready):(m.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},o.ready.promise();var J=o.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===o.type(c)){e=!0;for(h in c)o.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,o.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(o(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};o.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=o.expando+Math.random()}K.uid=1,K.accepts=o.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,o.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(o.isEmptyObject(f))o.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,o.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{o.isArray(b)?d=b.concat(b.map(o.camelCase)):(e=o.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!o.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?o.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}o.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),o.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length; -while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=o.camelCase(d.slice(5)),P(f,d,e[d]));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=o.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),o.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||o.isArray(c)?d=L.access(a,b,o.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=o.queue(a,b),d=c.length,e=c.shift(),f=o._queueHooks(a,b),g=function(){o.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:o.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),o.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";l.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return m.activeElement}catch(a){}}o.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=o.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof o!==U&&o.event.triggered!==b.type?o.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],n=q=h[1],p=(h[2]||"").split(".").sort(),n&&(l=o.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=o.event.special[n]||{},k=o.extend({type:n,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&o.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(n,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),o.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],n=q=h[1],p=(h[2]||"").split(".").sort(),n){l=o.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||o.removeEvent(a,n,r.handle),delete i[n])}else for(n in i)o.event.remove(a,n+b[j],c,d,!0);o.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,p=[d||m],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||m,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+o.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[o.expando]?b:new o.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:o.makeArray(c,[b]),n=o.event.special[q]||{},e||!n.trigger||n.trigger.apply(d,c)!==!1)){if(!e&&!n.noBubble&&!o.isWindow(d)){for(i=n.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||m)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:n.bindType||q,l=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),l&&l.apply(g,c),l=k&&g[k],l&&l.apply&&o.acceptData(g)&&(b.result=l.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||n._default&&n._default.apply(p.pop(),c)!==!1||!o.acceptData(d)||k&&o.isFunction(d[q])&&!o.isWindow(d)&&(h=d[k],h&&(d[k]=null),o.event.triggered=q,d[q](),o.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=o.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=o.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=o.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((o.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?o(e,this).index(i)>=0:o.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return o.nodeName(a,"table")&&o.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)o.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=o.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&o.nodeName(a,b)?o.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}o.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=o.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||o.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,n=a.length;n>m;m++)if(e=a[m],e||0===e)if("object"===o.type(e))o.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;o.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===o.inArray(e,d))&&(i=o.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f,g,h=o.event.special,i=0;void 0!==(c=a[i]);i++){if(o.acceptData(c)&&(f=c[L.expando],f&&(b=L.cache[f]))){if(d=Object.keys(b.events||{}),d.length)for(g=0;void 0!==(e=d[g]);g++)h[e]?o.event.remove(c,e):o.removeEvent(c,e,b.handle);L.cache[f]&&delete L.cache[f]}delete M.cache[c[M.expando]]}}}),o.fn.extend({text:function(a){return J(this,function(a){return void 0===a?o.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?o.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||o.cleanData(ob(c)),c.parentNode&&(b&&o.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(o.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return o.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(o.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,o.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,n=k-1,p=a[0],q=o.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(c=o.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=o.map(ob(c,"script"),kb),g=f.length;k>j;j++)h=c,j!==n&&(h=o.clone(h,!0,!0),g&&o.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,o.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&o.contains(i,h)&&(h.src?o._evalUrl&&o._evalUrl(h.src):o.globalEval(h.textContent.replace(hb,"")))}return this}}),o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){o.fn[a]=function(a){for(var c,d=[],e=o(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),o(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d=o(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:o.css(d[0],"display");return d.detach(),e}function tb(a){var b=m,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||o("