All Downloads are FREE. Search and download functionalities are using the official Maven repository.

web-interface.assets.57e33c6c-13.11b9f72925818240e61d.js.map Maven / Gradle / Ivy

There is a newer version: 6.0.1
Show newest version
{"version":3,"sources":["webpack:///./node_modules/ace-builds/src-noconflict/snippets/asl.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-ambiance.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/scss.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-batchfile.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-soy_template.js","webpack:///./node_modules/ace-builds/src-noconflict/worker-lua.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-d.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/less.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-text.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-velocity.js","webpack:///./node_modules/react-ace/lib/diff.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-dracula.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/vhdl.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-jssm.js","webpack:///./node_modules/ace-builds/src-noconflict/keybinding-sublime.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/julia.js","webpack:///./node_modules/ace-builds/src-noconflict/worker-xquery.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/puppet.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-tomorrow.js?ee20","webpack:///./node_modules/ace-builds/src-noconflict/mode-nunjucks.js","webpack:///./node_modules/ace-builds/src-noconflict/keybinding-vscode.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/makefile.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/space.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-nix.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-mysql.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-pgsql.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/eiffel.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/logiql.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-gitignore.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-red.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-diff.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/dockerfile.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/io.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-tcl.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-mushcode.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-cobol.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/sass.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-html_elixir.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-sqlserver.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-mel.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-css.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/ocaml.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-swift.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/csharp.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/glsl.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/nsis.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-fsl.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-tomorrow_night_bright.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/zeek.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-cirru.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/plain_text.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/forth.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/curly.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-pascal.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/c_cpp.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-html.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/redshift.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-dockerfile.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/jack.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-smarty.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-csharp.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-vbscript.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-sqlserver.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-pig.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/mushcode.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-beautify.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-nim.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-coldfusion.js","webpack:///./node_modules/ace-builds/src-noconflict/worker-xml.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/gobstones.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-fortran.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-crystal.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-searchbox.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/luapage.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/coffee.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-ocaml.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/aql.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/apex.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-ejs.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-logiql.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-static_highlight.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/mixal.js","webpack:///./node_modules/ace-builds/src-noconflict/worker-coffee.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-dawn.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-clojure.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-clouds_midnight.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-emmet.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/objectivec.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/soy_template.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-sh.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-coffee.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/cobol.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-matlab.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/pgsql.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/php.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/php_laravel_blade.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/rhtml.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/ini.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-groovy.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/elm.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-apache_conf.js","webpack:///./node_modules/ace-builds/src-noconflict/ace.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-gob.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-haml.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-textile.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/sparql.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/haml.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-toml.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-gruvbox.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/erlang.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/verilog.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/batchfile.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/css.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-sparql.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/clojure.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-scheme.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-rdoc.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-katzenmilch.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/stylus.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-ftl.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/cirru.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/json5.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/csound_orchestra.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-logtalk.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-tsx.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/prolog.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-lsl.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/powershell.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-django.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/vbscript.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-tomorrow_night_eighties.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/textile.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-mediawiki.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/assembly_x86.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/lsl.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/snippets.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-redshift.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-razor.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-linking.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-nginx.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-nsis.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-aql.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/nginx.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-dart.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-sjs.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-praat.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/mel.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-golang.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/actionscript.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-graphqlschema.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-nord_dark.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-themelist.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-livescript.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/json.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-php_laravel_blade.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-qml.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-haskell_cabal.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/tsx.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/smarty.js","webpack:///./node_modules/react-ace/lib/index.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/prisma.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-prolog.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/java.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-error_marker.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/html_ruby.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/toml.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-puppet.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-xml.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/gherkin.js","webpack:///./node_modules/ace-builds/src-noconflict/worker-json.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/rdoc.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-json.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-python.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/jsx.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/yaml.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/wollok.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-plain_text.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/golang.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/fortran.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-tomorrow_night_blue.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/jade.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-rst.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/praat.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-prisma.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/abc.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/mediawiki.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-elastic_tabstops_lite.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/tcl.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-snippets.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-typescript.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-jack.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/lua.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-eclipse.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/properties.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/sh.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-php.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-edifact.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-language_tools.js?b70a","webpack:///./node_modules/ace-builds/src-noconflict/snippets/markdown.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-dreamweaver.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/lisp.js","webpack:///./node_modules/ace-builds/src-noconflict/worker-php.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-modelist.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-slim.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/html.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/vala.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/haskell.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-csound_score.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-statusbar.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/tex.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/razor.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-ada.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-visualforce.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/jsoniq.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-assembly_x86.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/typescript.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-lua.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-vala.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/perl.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/asciidoc.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/liquid.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-twilight.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-powershell.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-abc.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/twig.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-terraform.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-verilog.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/nim.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/ftl.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/graphqlschema.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/svg.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-jade.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-asl.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-ruby.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-split.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-protobuf.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/nix.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-actionscript.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/autohotkey.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-mask.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/fsharp.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/rust.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-lucene.js?e76c","webpack:///./node_modules/ace-builds/src-noconflict/snippets/csound_document.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-makefile.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-csound_document.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/c9search.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-scad.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-jsx.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/rst.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-kr_theme.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-apex.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-maze.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-handlebars.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/abap.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-vibrant_ink.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/logtalk.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/red.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/haskell_cabal.js","webpack:///./node_modules/lodash.get/index.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-curly.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-iplastic.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/turtle.js","webpack:///./node_modules/ace-builds/src-noconflict/worker-javascript.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/groovy.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-code_lens.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-rust.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-yaml.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-elm.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/velocity.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/csound_score.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-cobalt.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/xquery.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/xml.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-ini.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-forth.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/csp.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/coldfusion.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-sql.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-space.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-zeek.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/elixir.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-crimson_editor.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/qml.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-solarized_dark.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-perl.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-stylus.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-java.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-terminal.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/r.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-julia.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-sass.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/terraform.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/haxe.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-clouds.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/python.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-textmate.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-erlang.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-hjson.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/html_elixir.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-monokai.js?42ea","webpack:///./node_modules/ace-builds/src-noconflict/ext-settings_menu.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/visualforce.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/perl6.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-glsl.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-drools.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-merbivore.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/ejs.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-vhdl.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-keybinding_menu.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-io.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/scheme.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/lucene.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-perl6.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-eiffel.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-kuroir.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/protobuf.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-latex.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-gherkin.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/mysql.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/fsl.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/nunjucks.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/livescript.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-kotlin.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-abap.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/applescript.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-merbivore_soft.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/swift.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/sqlserver.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/handlebars.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/kotlin.js","webpack:///./node_modules/ace-builds/src-noconflict/keybinding-emacs.js","webpack:///./node_modules/react-ace/lib/editorOptions.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/pascal.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/sjs.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-solarized_light.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/hjson.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-alda.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-spellcheck.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/ada.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/drools.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/d.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/edifact.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-csp.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-github.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-options.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-whitespace.js","webpack:///./node_modules/ace-builds/src-noconflict/worker-html.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-tomorrow_night.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/javascript.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/latex.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-c_cpp.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-gcode.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/matlab.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-r.js","webpack:///./node_modules/ace-builds/src-noconflict/worker-css.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-rhtml.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-mono_industrial.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-xquery.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/dart.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-javascript.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-gobstones.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-properties.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-objectivec.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-elixir.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-pastel_on_dark.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/crystal.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/sql.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-c9search.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-liquid.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-haskell.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-luapage.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-mixal.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-textarea.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/scala.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-split.js?4aea","webpack:///./node_modules/ace-builds/src-noconflict/snippets/apache_conf.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-tex.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/django.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-less.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/text.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/dot.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/pig.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-lisp.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-scala.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-asciidoc.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-dot.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-jsp.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/scad.js","webpack:///./node_modules/ace-builds/src-noconflict/keybinding-vim.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-turtle.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-haxe.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-svg.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-twig.js","webpack:///./node_modules/ace-builds/webpack-resolver.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/slim.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/maze.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-idle_fingers.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-autohotkey.js","webpack:///./node_modules/diff-match-patch/index.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/diff.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/gitignore.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/alda.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-rtl.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-wollok.js","webpack:///./node_modules/ace-builds/src-noconflict/ext-prompt.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-markdown.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-fsharp.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-chaos.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-csound_orchestra.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-xcode.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/gcode.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/jsp.js","webpack:///./node_modules/ace-builds/src-noconflict/theme-chrome.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/ruby.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-applescript.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/jssm.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-jsoniq.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-html_ruby.js","webpack:///./node_modules/react-ace/lib/split.js","webpack:///./node_modules/ace-builds/src-noconflict/snippets/mask.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-json5.js","webpack:///./node_modules/react-ace/lib/ace.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-scss.js"],"names":["module","exports","extendStatics","__extends","this","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__","constructor","prototype","create","defineProperty","value","PropTypes","React","split_1","DiffMatchPatch","DiffComponent","_super","props","_this","call","state","onChange","bind","diff","componentDidUpdate","setState","dmp","lhString","rhString","length","diff_main","diff_cleanupSemantic","diffedLines","generateDiffedLines","setCodeMarkers","C","left","right","cursor","forEach","chunk","chunkType","text","lines","split","firstChar","lastChar","linesToHighlight","push","startLine","endLine","Error","codeEditorSettings","newMarkerSet","i","markerObj","startRow","endRow","type","className","render","markers","createElement","default","name","focus","orientation","splits","mode","theme","height","width","fontSize","showGutter","onPaste","onLoad","onScroll","minLines","maxLines","readOnly","highlightActiveLine","showPrintMargin","tabSize","cursorStart","editorProps","style","scrollMargin","setOptions","wrapEnabled","enableBasicAutocompletion","enableLiveAutocompletion","propTypes","number","object","bool","string","func","array","defaultProps","Component","global","window","define","deps","payload","arguments","modules","payloads","original","apply","console","error","trace","ns","root","_require","parentId","callback","lookup","undefined","toString","params","l","dep","require","packagedModule","normalizeModule","moduleName","indexOf","chunks","charAt","slice","join","previous","replace","mod","id","uri","packaged","ace","Element","remove","enumerable","writable","configurable","parentNode","removeChild","OS","LINUX","MAC","WINDOWS","getOS","isMac","isLinux","_navigator","navigator","os","exec","platform","toLowerCase","ua","userAgent","appName","isWin","isIE","parseFloat","match","isOldIE","isGecko","isMozilla","isOpera","opera","isWebKit","isChrome","isEdge","isAIR","isAndroid","isChromeOS","isIOS","test","MSStream","isMobile","useragent","buildDom","arr","parent","refs","txt","document","createTextNode","appendChild","isArray","els","ch","el","options","childIndex","keys","n","val","setAttribute","getDocumentHead","doc","head","getElementsByTagName","documentElement","tag","createElementNS","removeChildren","element","innerHTML","textContent","ownerDocument","createFragment","createDocumentFragment","hasCssClass","addCssClass","removeCssClass","classes","index","splice","toggleCssClass","add","setCssClass","node","include","hasCssString","sheets","querySelectorAll","importCssString","cssText","target","container","getRootNode","insertBefore","firstChild","importCssStylsheet","rel","href","scrollbarWidth","inner","minWidth","display","outer","position","overflow","body","noScrollbar","offsetWidth","withScrollbar","clientWidth","computedStyle","getComputedStyle","setStyle","styles","property","HAS_CSS_ANIMATION","HAS_CSS_TRANSFORMS","HI_DPI","devicePixelRatio","div","transform","animationName","translate","tx","ty","Math","round","top","inherits","ctor","superCtor","super_","mixin","obj","key","implement","proto","oop","Keys","ret","MODIFIER_KEYS","16","17","18","224","91","92","93","KEY_MODS","FUNCTION_KEYS","8","9","13","19","27","32","33","34","35","36","37","38","39","40","44","45","46","96","97","98","99","100","101","102","103","104","105","112","113","114","115","116","117","118","119","120","121","122","123","144","145","PRINTABLE_KEYS","48","49","50","51","52","53","54","55","56","57","59","61","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","107","109","110","186","187","188","189","190","191","192","219","220","221","222","111","106","parseInt","enter","escape","esc","del","mods","pow","filter","x","keyCodeToString","keyCode","keyString","String","fromCharCode","activeListenerOptions","pressedKeys","ts","getListenerOptions","createComment","addEventListener","passive","e","detectListenerOptionsSupport","EventListener","elem","destroy","removeListener","addListener","destroyer","$toDestroy","removeEventListener","stopEvent","stopPropagation","preventDefault","getButton","ctrlKey","altKey","shiftKey","button","capture","eventHandler","releaseCaptureHandler","onMouseUp","addMouseWheelListener","wheelDeltaX","wheelX","wheelY","wheelDeltaY","wheelDelta","deltaMode","DOM_DELTA_PIXEL","deltaX","deltaY","DOM_DELTA_LINE","DOM_DELTA_PAGE","axis","HORIZONTAL_AXIS","detail","addMultiMouseDownListener","elements","timeouts","callbackName","startX","startY","timer","clicks","eventNames","2","3","4","onMousedown","isNewClick","abs","clientX","clientY","clearTimeout","setTimeout","_clicks","getModifierHash","metaKey","normalizeCommandKeys","hashId","getModifierState","altGr","location","keyLocation","timeStamp","defaultPrevented","resetPressedKeys","getModifierString","addCommandKeyListener","isOldGecko","lastKeyDownKeyCode","lastDefaultPrevented","result","postMessage","postMessageId","nextTick","win","messageName","listener","data","$idleBlocked","onIdle","cb","timeout","handler","$idleBlockId","blockIdle","delay","nextFrame","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","Range","startColumn","endColumn","start","row","column","end","isEqual","range","contains","compare","compareRange","cmp","comparePoint","containsRange","intersects","isEnd","isStart","setStart","setEnd","inside","insideStart","insideEnd","isMultiLine","compareStart","compareEnd","compareInside","clipRows","firstRow","lastRow","fromPoints","extend","isEmpty","clone","collapseRows","max","toScreenRange","session","screenPosStart","documentToScreenPosition","screenPosEnd","moveBy","comparePoints","p1","p2","last","a","stringReverse","reverse","stringRepeat","count","trimBeginRegexp","trimEndRegexp","stringTrimLeft","stringTrimRight","copyObject","copy","copyArray","deepCopy","arrayToMap","map","createMap","arrayRemove","escapeRegExp","str","escapeHTML","getMatchOffsets","regExp","matches","offset","deferredCall","fcn","deferred","cancel","schedule","isPending","delayedCall","defaultTimeout","_self","$cancelT","lineMode","pasteCancelled","Date","now","event","dom","lang","clipboard","BROKEN_SETDATA","USE_IE_MIME_TYPE","HAS_FOCUS_ARGS","MAX_LINE_LENGTH","KEYS","MODS","valueResetRegex","TextInput","host","opacity","copied","pasted","inComposition","sendingText","tempStyle","commandMode","ignoreFocusEvents","lastValue","lastSelectionStart","lastSelectionEnd","lastRestoreEnd","isFocused","activeElement","onBlur","hasFocus","onFocus","resetSelection","$focusScroll","preventScroll","isTransformed","getBoundingClientRect","ancestors","t","parentElement","nodeType","removeAttribute","blur","on","curOp","commandName","command","isUserAction","docChanged","selectionChanged","onCompositionEnd","newValue","selectionEnd","selection","setSelectionRange","afterContextMenu","selectionStart","line","getRange","getLine","prevLine","nextLine","inputHandler","setInputHandler","getInputHandler","sendText","fromInput","extendLeft","extendRight","inserted","restoreStart","restoreEnd","endIndex","shouldReset","onTextInput","onInput","onCompositionUpdate","inputType","execCommand","handleClipboardData","forceIEMime","clipboardData","mime","setData","getData","doCopy","isCut","getCopyText","onCut","onCopy","select","onCommandKey","isAllSelected","selectAll","$readOnly","cancelComposition","useTextareaForIME","markerRange","context","compositionStartOffset","off","closeTimeout","syncComposition","onContextMenuClose","renderer","$isMousePressed","$keepTextAreaAtCursor","$moveTextAreaToCursor","onCompositionStart","_signal","getSelectionRange","msGetInputContext","getInputContext","getElement","setCommandMode","setReadOnly","setCopyWithEmptySelection","onContextMenu","_emit","domEvent","moveToMouse","bringToFront","characterWidth","rect","borderTopWidth","borderLeftWidth","maxTop","bottom","clientHeight","move","min","textInput","scroller","typingResetTimeout","typing","detectArrowKeys","$mouseHandler","isMousePressed","modifier","up","home","option","down","shift","commands","findKeyCommand","addIosSelectionHandler","$setUserAgentForTests","_isMobile","_isIOS","DefaultHandlers","mouseHandler","$clickSelection","editor","setDefaultHandler","onMouseDown","onDoubleClick","onTripleClick","onQuadClick","onMouseWheel","selectByLines","extendSelectionBy","selectByWords","calcRangeOrientation","anchor","ev","inSelection","pos","getDocumentPosition","mousedownEvent","moveToPosition","time","$focusTimeout","inMultiSelectMode","captureMouse","startSelect","waitForClickSelection","screenToTextCoordinates","y","getShiftKey","selectToPosition","setCapture","orientedRange","setSelectionAnchor","scrollCursorIntoView","unitName","cmpStart","cmpEnd","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","unsetStyle","releaseCapture","focusWait","ax","ay","bx","by","distance","sqrt","getBracketRange","getWordRange","getLineRange","getAccelKey","$lastScroll","vx","vy","allowed","prevScroll","dt","direction","canScroll","isScrollableBy","speed","scrollBy","stop","Tooltip","isOpen","$element","$parentNode","$init","setText","setHtml","html","setPosition","setClassName","show","hide","getHeight","offsetHeight","getWidth","GutterTooltip","windowWidth","innerWidth","windowHeight","innerHeight","GutterHandler","tooltipTimeout","mouseEvent","tooltipAnnotation","gutter","$gutterLayer","tooltip","hideTooltip","moveTooltip","getRegion","selectTo","srcElement","$tooltipFollowsMouse","annotation","$annotations","getLength","screenRow","pixelToScreenCoordinates","$pos","documentToScreenRow","showTooltip","$gutter","MouseEvent","$inSelection","propagationStopped","selectionRange","DragdropHandler","blankImage","src","dragSelectionMarker","timerId","dragCursor","dragOperation","isInternal","autoScrollStartTime","cursorMovedTime","cursorPointOnCaretMoved","mouseTarget","counter","onDragInterval","prevCursor","vMovement","hMovement","moveCursorToPosition","calcDistance","lineHeight","layerConfig","editorRect","offsets","nearestXOffset","nearestYOffset","scrollCursor","vScroll","hScroll","autoScroll","addDragMarker","toOrientedRange","addMarker","getSelectionStyle","clearSelection","$cursorLayer","setBlinking","clearInterval","setInterval","onMouseMove","clearDragMarker","removeMarker","fromOrientedRange","$resetCursorStyle","onDragStart","cancelDrag","draggable","self","dataTransfer","effectAllowed","getReadOnly","scrollTop","setDragImage","clearData","getTextRange","onDragEnd","dropEffect","setCursorStyle","onDragEnter","canAccept","getDropEffect","onDragOver","onMouseMoveTimer","onDragLeave","onDrop","moveText","dropData","insert","types","some","copyAllowed","copyModifierState","dragWait","getDragDelay","startDrag","dragWaitEnd","dragReadyEnd","cursorStyle","onMouseDrag","dragDrop","$dragEnabled","eventTarget","unselectable","addTouchListeners","touchStartT","lastT","longTouchTimer","animationTimer","pressed","contextMenu","animationSteps","clickCount","vX","vY","createContextMenu","handleClick","selected","hasUndo","action","getAttribute","getUndoManager","replaceChild","class","readText","then","writeText","ontouchstart","ontouchend","onclick","showContextMenu","pagePos","textToScreenCoordinates","leftOffset","pageX","scrollLeft","pageY","hideContextMenu","handleLongTap","selectWord","touches","h","w","touchObj","setRange","switchToSelectionMode","cursorPos","getPixelPosition","anchorPos","offsetTop","offsetLeft","weightedDistance","diff1","diff2","oldScrollTop","getScrollTop","get","url","xhr","XMLHttpRequest","open","onreadystatechange","readyState","responseText","send","loadScript","path","s","onload","_","isAbort","qualifyURL","EventEmitter","_dispatchEvent","eventName","_eventRegistry","_defaultHandlers","listeners","defaultHandler","once","newCallback","Promise","resolve","handlers","_disabled_","old","disabled","removeDefaultHandler","pop","capturing","removeAllListeners","optionsProvider","optList","setOption","getOptions","optionNames","$options","hidden","getOption","opt","warn","forwardTo","handlesSet","set","message","reportError","msg","AppConfig","$defaultOptions","defineOptions","initialValue","resetOptions","setDefaultValue","opts","setDefaultValues","optionHash","net","workerPath","modePath","themePath","basePath","suffix","$moduleUrls","loadWorkerFromBlob","sharedPopups","all","$modes","moduleUrl","component","parts","sep","base","re","RegExp","setModuleUrl","subst","$loading","loadModule","moduleType","afterLoad","reportErrorIfPathIsNotConfigured","init","scriptOptions","scriptUrl","currentScript","_currentScript","scripts","script","attributes","j","attr","m","m1","toUpperCase","version","DefaultGutterHandler","config","MouseHandler","focusEditor","getMouseEventTarget","onMouseEvent","scrollBarV","scrollBarH","Boolean","gutterEl","$dragDelay","character","mousemove","$scrollSpeed","mouseMoveHandler","which","releaseMouse","$mouseMoved","onCaptureEnd","onOperationEnd","onCaptureInterval","$onCaptureMouseMove","endOperation","startOperation","cancelContextMenu","scrollSpeed","dragDelay","dragEnabled","focusTimeout","tooltipFollowsMouse","FoldHandler","fold","getFoldAt","removeFold","expandFold","getUseWrapMode","foldWidgets","onFoldWidgetClick","getParentFoldRangeData","firstRange","addFold","keyUtil","KeyBinding","$editor","$data","$handlers","kb","removeKeyboardHandler","$defaultHandler","addKeyboardHandler","setKeyboardHandler","handleKeyboard","attach","detach","getKeyboardHandler","getStatusText","$callKeyboardHandlers","toExecute","success","args","passEvent","dir","hiLevel","lastArabic","hasUBAT_B","hasUBAT_S","impTab_LTR","impTab_RTL","ET","BN","UnicodeTBL00","UnicodeTBL20","_invertLevel","lev","levels","_array","lo","hi","tmp","len","_getCharClass","chars","ix","wType","nType","cType","c","rtlCandidate","_getCharacterType","uc","charCodeAt","L","R","EN","ON_R","AN","R_H","B","RLE","DOT","doBidiReorder","textCharTypes","isRtl","logicalFromVisual","bidiLevels","charTypes","impTab","prevState","newClass","newLevel","newState","condPos","_computeLevels","hasBidiCharacters","getVisualFromLogicalIdx","logIdx","rowMap","bidiUtil","bidiRE","BidiHandler","bidiMap","currentRow","charWidths","EOL","showInvisibles","isRtlDir","$isRtl","wrapIndent","EOF","contentWidth","fontMetrics","rtlLineOffset","wrapOffset","isMoveLeftOperation","seenBidi","getValue","isBidiRow","docRow","splitIndex","updateRowLine","updateBidiMap","delta","getDocumentRow","rowCache","$screenRowCache","$getRowCacheIndex","$docRowCache","getSplitIndex","currentIndex","prevIndex","endOfLine","$useWrapMode","$wrapData","indent","substring","size","isFullWidth","getScreenTabSize","$main","substr","markAsDirty","updateCharacterWidths","$characterSize","bidiCharWidth","$measureCharWidth","setShowInvisibles","setEolChar","eolChar","setContentWidth","isRtlLine","setRtlDirection","getCursorPosition","getSelectionAnchor","$bidiHandler","removeInLine","getPosLeft","col","leftBoundary","logicalIdx","getOverwrite","visualIdx","getSelections","startCol","endCol","level","selections","selColMin","selColMax","isSelected","isSelectedPrev","visIdx","offsetToCol","posX","charWidth","Selection","getDocument","lead","createAnchor","$silent","$cursorChanged","$isEmpty","$keepDesiredColumnOnChange","$desiredColumn","$anchorChanged","getCursor","getPosition","getAnchor","getSelectionLead","isBackwards","$setSelection","Number","MAX_VALUE","anchorRow","anchorColumn","cursorRow","cursorColumn","wasEmpty","wasMultiselect","$moveSelection","mover","moveCursorTo","moveTo","selectUp","moveCursorUp","selectDown","moveCursorDown","selectRight","moveCursorRight","selectLeft","moveCursorLeft","selectLineStart","moveCursorLineStart","selectLineEnd","moveCursorLineEnd","selectFileEnd","moveCursorFileEnd","selectFileStart","moveCursorFileStart","selectWordRight","moveCursorWordRight","selectWordLeft","moveCursorWordLeft","selectAWord","getAWordRange","excludeLastChar","rowEnd","rowStart","foldLine","getFoldLine","selectLine","moveCursorBy","wouldMoveIntoSoftTab","isTabStop","getTabSize","getNavigateWithinSoftTabs","firstColumnPosition","screenToDocumentPosition","leadingSpace","getDisplayLine","$useEmacsStyleLineStart","lineEnd","getDocumentLastRowColumnPosition","textEnd","search","moveCursorLongWordRight","rightOfCursor","nonTokenRe","lastIndex","tokenRe","moveCursorLongWordLeft","getFoldStringAt","leftOfCursor","$shortWordEndIndex","whitespaceRe","moveCursorShortWordRight","moveCursorShortWordLeft","$selectLongWords","rows","offsetX","screenPos","lineWidgets","widget","rowsAbove","rowCount","docPos","keepDesiredColumn","moveCursorToScreen","desiredColumn","r","getRangeOfMovements","toJSON","rangeCount","ranges","r1","fromJSON","rangeList","toSingleRange","addRange","MAX_TOKEN_COUNT","Tokenizer","rules","states","regExps","matchMappings","ruleRegExps","matchTotal","mapping","defaultToken","flag","splitterRurles","rule","caseInsensitive","regex","adjustedregex","matchcount","token","groupCount","tokenArray","onMatch","$arrayTokens","$applyToken","digit","removeCapturingGroups","splitRegex","createSplitterRegexp","$setMaxTokenCount","values","tokens","stack","inChClass","lastCapture","parenOpen","parenClose","square","getLineTokens","startState","currentState","matchAttempts","skipped","next","consumeLineEnd","merge","unshift","TextHighlightRules","$rules","addRules","prefix","nextState","getRules","embedRules","HighlightRules","escapeRules","append","$embeds","getEmbeds","pushState","popState","normalizeRules","processState","processed","toInsert","stateName","includeName","concat","noEscape","keywordMap","createKeywordMapper","ignoreCase","splitChar","keywords","$keywordList","list","word","getKeywords","$keywords","Behaviour","$behaviours","addBehaviours","behaviours","inherit","getBehaviours","TokenIterator","initialRow","initialColumn","$session","$row","$rowTokens","getTokens","getTokenAt","$tokenIndex","stepBackward","stepForward","getCurrentToken","getCurrentTokenRow","getCurrentTokenColumn","rowTokens","tokenIndex","getCurrentTokenPosition","getCurrentTokenRange","SAFE_INSERT_IN_TOKENS","SAFE_INSERT_BEFORE_TOKENS","contextCache","defaultQuotes","initContext","multiSelect","autoInsertedBrackets","autoInsertedRow","autoInsertedLineEnd","maybeInsertedBrackets","maybeInsertedRow","maybeInsertedLineStart","maybeInsertedLineEnd","getWrapped","opening","closing","rowDiff","CstyleBehaviour","getWrapBehavioursEnabled","isSaneInsertion","braces","recordAutoInsert","recordMaybeInsert","$findOpeningBracket","isAutoInsertedClosing","popAutoInsertedClosing","isMaybeInsertedClosing","clearMaybeInsertedClosing","openBracePos","findMatchingBracket","next_indent","$getIndent","getTabString","quotes","$mode","$quotes","lineCommentStart","quote","leftChar","rightChar","rightToken","pair","stringBefore","stringAfter","wordRe","isWordBefore","isWordAfter","charBefore","iterator","$matchTokenType","iterator2","bracket","wordChars","code","unicode","Mode","$defaultBehaviour","getTokenizer","$tokenizer","$highlightRules","$highlightRuleConfig","blockComment","toggleCommentLines","ignoreBlankLines","shouldRemove","minIndent","Infinity","insertAtTabStop","regexpStart","getUseSoftTabs","uncomment","shouldInsertSpace","commentWithSpace","comment","insertInLine","testRemove","before","after","spaces","lineCommentEnd","regexpEnd","iter","fun","minEmptyLength","floor","toggleBlockComment","colDiff","initialRange","startRange","endRange","getNextLineIndent","tab","checkOutdent","input","autoOutdent","createWorker","createModeDelegates","$id","delegations","scope","functionName","$delegator","method","language","transformAction","param","$behaviour","completionKeywords","ruleItr","aLength","$createKeywordList","getCompletions","score","meta","applyDelta","docLines","doNotValidate","Anchor","$onChange","$pointsInOrder","point1","point2","equalPointsInOrder","bColIsAfter","$clipPositionToDocument","$insertRight","point","moveIfEqual","deltaIsInsert","deltaRowShift","deltaColShift","deltaStart","deltaEnd","$getTransformedPoint","noClip","Document","textOrLines","$lines","insertMergedLines","setValue","getAllLines","getNewLineCharacter","$split","$detectNewLine","$autoNewLine","$newLineMode","setNewLineMode","newLineMode","getNewLineMode","isNewLine","getLines","getLinesForRange","insertLines","insertFullLines","removeLines","removeFullLines","insertNewLine","clippedPos","clonePos","$clipPosition","deleteFirstNewLine","deleteLastNewLine","deletedLines","removeNewLine","applyDeltas","deltas","revertDeltas","revertDelta","isInsert","$splitAndapplyLargeDelta","$safeApplyDelta","docLength","MAX","from","to","indexToPosition","newlineLength","positionToIndex","BackgroundTokenizer","tokenizer","running","currentLine","$worker","workerStart","processedLines","$tokenizeRow","fireUpdateEvent","setTokenizer","setDocument","first","scheduleStart","$updateOnChange","getState","SearchHighlight","clazz","setRegexp","MAX_RANGES","cache","update","markerLayer","drawSingleLineMarker","FoldLine","foldData","folds","setFoldLine","shiftRow","sameRow","sort","containsRow","walk","lastEnd","isNewRow","placeholder","getNextFoldTo","kind","addRemoveChars","log","foldBefore","newFoldLine","foldLineNext","idxToPosition","idx","lastFoldEndColumn","RangeList","$bias","pointIndex","excludeEdges","startIndex","addList","removed","substractPoint","containsPoint","rangeAtPoint","clipped","removeAll","lineDif","Fold","subFolds","consumePoint","restorePoint","subFold","collapseChildren","addSubFold","afterStart","firstConsumed","consumedFolds","k","restoreRange","Folding","side","getFoldsInRange","foldLines","$foldData","foundFolds","getFoldsInRangeList","getAllFolds","trim","lastFold","startFoldLine","getNextFoldLine","getFoldedRowCount","$addFoldLine","added","$clipRangeToDocument","startFold","endFold","removeFolds","$updateWrapData","$updateRowLengthCache","$modified","addFolds","$updating","cloneFolds","foldAll","expandFolds","unfold","expandInner","isRowFolded","startFoldRow","getRowFoldEnd","getRowFoldStart","getFoldDisplayLine","textLine","lastColumn","$cloneFoldData","fd","toggleFold","tryToUnfold","bracketPos","getCommentFoldRange","depth","getFoldWidget","getFoldWidgetRange","foldToLevel","foldAllComments","$foldStyles","$foldStyle","setFoldStyle","$foldMode","$setFolding","foldMode","$updateFoldWidgets","$tokenizerUpdateFoldWidgets","updateFoldWidgets","tokenizerUpdateFoldWidgets","ignoreCurrent","fw","children","siblings","$toggleFoldWidget","toggleFoldWidget","toggleParent","BracketMatch","chr","charBeforeCursor","$findClosingBracket","getMatchingBracketRanges","$brackets","typeRe","openBracket","valueIndex","closingBracket","valueLength","TextMode","EditSession","$breakpoints","$decorations","$frontMarkers","$backMarkers","$markerId","$undoSelect","$uid","onChangeFold","setMode","bgTokenizer","resetCaches","$resetRowCache","cacheArray","low","mid","$rowLengthCache","removedFolds","$updateInternalDataOnChange","$fromUndo","$undoManager","mergeUndoDeltas","$informUndoManager","setUndoManager","reset","getSelection","undoManager","addSession","$syncInformUndoManager","markUndoGroup","$defaultUndoManager","undo","redo","hasRedo","addSelection","startNewGroup","setUseSoftTabs","$useSoftTabs","$indentWithTabs","setTabSize","$tabSize","setNavigateWithinSoftTabs","navigateWithinSoftTabs","$navigateWithinSoftTabs","$overwrite","setOverwrite","overwrite","toggleOverwrite","addGutterDecoration","removeGutterDecoration","getBreakpoints","setBreakpoints","clearBreakpoints","setBreakpoint","clearBreakpoint","inFront","marker","addDynamicMarker","markerId","getMarkers","highlight","$searchHighlight","highlightLines","setAnnotations","annotations","getAnnotations","clearAnnotations","inToken","wordRange","setUseWorker","useWorker","getUseWorker","$useWorker","onReloadTokenizer","$modeId","$onChangeMode","$isPlaceholder","oldMode","$stopWorker","$startWorker","attachToSession","wrapMethod","$wrapMethod","foldingRules","terminate","getMode","$scrollTop","setScrollTop","isNaN","$scrollLeft","setScrollLeft","getScrollLeft","getScreenWidth","$computeWidth","getLineWidgetMaxWidth","screenWidth","lineWidgetsWidth","lineWidgetWidth","force","$wrapLimit","longestScreenLine","foldIndex","foldStart","$getStringScreenWidth","undoChanges","dontSelect","selectionBefore","$getUndoSelection","redoChanges","selectionAfter","setUndoSelect","enable","isUndo","fromRange","toPosition","toRange","collDiff","oldStart","newStart","indentRows","indentString","outdentRows","rowRange","deleteRange","$moveLines","$clipRowToDocument","moveLinesUp","moveLinesDown","duplicateLines","$clipColumnToRow","$wrapLimitRange","setUseWrapMode","useWrapMode","setWrapLimitRange","adjustWrapLimit","desiredLimit","$printMargin","limits","wrapLimit","$constrainWrapLimit","getWrapLimit","setWrapLimit","limit","getWrapLimitRange","foldLineBefore","wrapData","walkTokens","$getDisplayTokens","PLACEHOLDER_START","PLACEHOLDER_BODY","$computeWrapSplits","displayLength","lastSplit","lastDocSplit","isCode","$wrapAsCode","indentedSoftWrap","$indentedSoftWrap","maxIndent","addSplit","indentation","getWrapIndent","minSplit","maxScreenColumn","screenColumn","getRowLength","getRowLineCount","getRowWrapIndent","getScreenLastRowColumn","documentToScreenColumn","getDocumentLastRowColumn","docColumn","getRowSplitData","screenToDocumentRow","screenToDocumentColumn","rowLength","doCache","maxRow","foldStartRow","wrapRow","screenRowOffset","getScreenLength","screenRows","$getWidgetScreenLength","$setFontMetrics","fm","$enableVarChar","getCharacterWidth","wrap","$wrap","firstLineNumber","useSoftTabs","foldStyle","Search","find","$matchIterator","sr","sc","er","ec","skipCurrent","findAll","needle","$assembleRegExp","$isMultiLine","prevRange","replacement","preserveCase","$disableFakeMultiline","wholeWord","wordBoundary","addWordBoundary","caseSensitive","$assembleMultilineRegExp","backwards","forEachInLine","HashHandler","commandKeyBinding","addCommands","$singleCommand","MultiHashHandler","bindKey","isDefault","addCommand","removeCommand","_buildKeyHash","keepCommand","ckb","keyId","cmdGroup","keyPart","chain","binding","parseKeys","_addCommandToBinding","removeCommands","bindKeys","keyList","$keyChain","CommandManager","byName","$checkCommandState","isAvailable","returnValue","toggleRecording","$inReplay","recording","macro","$addCommandToMacro","oldMacro","replay","trimMacro","mac","showSettingsMenu","showErrorMarker","scrollIntoView","description","centerSelection","gotoLine","prompt","$type","multiSelectAction","getAllRanges","findNext","findPrevious","aceCommandGroup","navigateFileStart","navigateUp","times","navigateFileEnd","navigateDown","navigateWordLeft","navigateLineStart","navigateLeft","navigateWordRight","navigateLineEnd","navigateRight","selectPageDown","scrollPageDown","gotoPageDown","selectPageUp","scrollPageUp","gotoPageUp","jumpToMatching","$copyWithEmptySelection","$handlePaste","duplicateSelection","sortLines","modifyNumber","copyLinesUp","copyLinesDown","removeToLineStart","removeToLineEnd","removeWordLeft","removeWordRight","blockOutdent","blockIndent","splitLine","transposeLetters","transposeSelections","autoIndent","firstLineEndCol","selectedCount","insertLine","curLine","newRanges","exitMultiSelectMode","defaultCommands","Editor","getContainerElement","getTextAreaContainer","textarea","keyBinding","$search","$historyTracker","$initOperationListeners","_$emitInputEvent","setSession","$opResetTimer","$lastSel","prevOp","commandEvent","previousCommand","scrollSelectionIntoView","animateScrolling","sel","$mergeableCommands","$mergeUndoDeltas","prev","mergeableCommands","shouldMerge","mergeNextCommand","sequenceStartTime","keyboardHandler","$keybindingId","oldSession","$onDocumentChange","$onTokenizerUpdate","$onChangeTabSize","$onChangeWrapLimit","$onChangeWrapMode","$onChangeFold","$onChangeFrontMarker","$onChangeBackMarker","$onChangeBreakpoint","$onChangeAnnotation","$onCursorChange","$onScrollTopChange","$onScrollLeftChange","$onSelectionChange","onDocumentChange","onChangeMode","onTokenizerUpdate","onChangeTabSize","onChangeWrapLimit","onChangeWrapMode","onChangeFrontMarker","onChangeBackMarker","onChangeBreakpoint","onChangeAnnotation","onCursorChange","onScrollTopChange","onScrollLeftChange","onSelectionChange","updateFull","oldEditor","getSession","resize","onResize","setTheme","getTheme","getFontSize","setFontSize","$highlightBrackets","$highlightPending","$bracketHighlight","markerIds","getMatching","markerType","$highlightTags","$highlightTagPending","$tagHighlight","currentTag","prevToken","stepCount","tmpToken","sbm","$isFocused","showCursor","visualizeFocus","hideCursor","visualizeBlur","$cursorChange","updateCursor","$updateHighlightActiveLine","updateLines","scrollToY","scrollToX","$highlightActiveLine","$selectionStyle","$selectionColorConflict","$maxLines","$minLines","$highlightLineMarker","$selectionMarker","$highlightSelectedWord","$getSelectionHighLightRegexp","wordWithBoundary","updateFrontMarkers","updateBackMarkers","updateBreakpoints","updateText","getSelectedText","nl","copyLine","inVirtualSelectionMode","isFullLine","getBehavioursEnabled","lineState","shouldOutdent","$enableAutoIndent","lineIndent","selectedRange","currIndent","prevLineState","composition","applyComposition","forEachSelection","setScrollSpeed","getScrollSpeed","setDragDelay","setSelectionStyle","setHighlightActiveLine","shouldHighlight","getHighlightActiveLine","setHighlightGutterLine","getHighlightGutterLine","setHighlightSelectedWord","getHighlightSelectedWord","setAnimatedScroll","shouldAnimate","getAnimatedScroll","getShowInvisibles","setDisplayIndentGuides","getDisplayIndentGuides","setShowPrintMargin","getShowPrintMargin","setPrintMarginColumn","getPrintMarginColumn","setBehavioursEnabled","enabled","setWrapBehavioursEnabled","setShowFoldWidgets","getShowFoldWidgets","setFadeFoldWidgets","fade","getFadeFoldWidgets","new_range","swap","originalRange","$getSelectedRows","getNumberAt","_numberRx","amount","charRange","isFinite","nr","fp","decimals","nnr","toFixed","replaceRange","toggleWord","$toggleWordPairs","currWordStart","wordParts","curLength","itLength","that","item","reg","wordPairs","negate","firstCondition","res","endPoint","moved","totalDiff","rangeIndex","subRows","compositionState","showComposition","setCompositionText","hideComposition","getFirstVisibleRow","getLastVisibleRow","isRowVisible","isRowFullyVisible","getFirstFullyVisibleRow","getLastFullyVisibleRow","$getVisibleRowCount","getScrollBottomRow","getScrollTopRow","$moveByPage","scrollToRow","scrollToLine","center","animate","alignCursor","getCursorPositionScreen","expand","matchType","bracketType","found","brackets","lineNumber","navigateTo","replaced","$tryReplace","replaceAll","getLastSearchOptions","newRange","revealRange","setAutoScrollEditorIntoView","shouldScroll","$scrollAnchor","scrollAnchor","onChangeSelection","onBeforeRender","onAfterRender","searchBox","$pixelPos","$cursorStyle","cursorLayer","setSmoothBlinking","isBlinking","selectionStyle","highlightSelectedWord","copyWithEmptySelection","behavioursEnabled","wrapBehavioursEnabled","enableAutoIndent","autoScrollEditorIntoView","showLineNumbers","setShowLineNumbers","$loop","CHANGE_GUTTER","$relativeLineNumbers","relativeNumberRenderer","relativeLineNumbers","$showLineNumbers","$updatePlaceholder","$composition","placeholderNode","$placeholder","content","hScrollBarAlwaysVisible","vScrollBarAlwaysVisible","highlightGutterLine","animatedScroll","printMarginColumn","printMargin","fadeFoldWidgets","showFoldWidgets","displayIndentGuides","fontFamily","scrollPastEnd","fixedWidthGutter","hasCssTransforms","maxPixelHeight","getText","lastLineNumber","$renderer","UndoManager","$maxRev","allowMerge","$lastDelta","$keepRedoStack","$redoStack","lastDeltas","$undoStack","$rev","rev","markIgnored","ignore","getRevision","getDeltas","getChangedRanges","getChangedLines","deltaSet","swapped","swapGroups","rearrangeUndoStack","$redoStackBaseRev","undoSelectionRange","$syncRev","redoStack","deltaSets","moveDeltasByOne","rebaseRedoStack","redoSelectionRange","nextDelta","mark","canUndo","canRedo","bookmark","isAtBookmark","isClean","markClean","$prettyPrint","stringifyDelta","stringifyRange","d1","d2","i1","i2","ds1","ds2","xform","c1","splitDelta","shiftPos","rowsBefore","otherLines","cloneDelta","xformed","Lines","canvasHeight","cells","cellCache","$offsetCoefficient","moveContainer","firstRowScreen","pageChanged","oldConfig","newConfig","computeLineTop","screenTop","screenPage","computeLineHeight","$cacheCell","cell","fragment","insertAdjacentElement","createCell","initElement","Gutter","parentEl","$showFoldWidgets","gutterWidth","$updateAnnotations","onCreateCell","textNode","foldWidget","rowInfo","annoText","gutterOffset","oldLastRow","$updateCursorRow","$renderCell","$updateGutterWidth","gutterRenderer","$firstLineNumber","lastLineText","$fixedWidth","padding","$padding","$computePadding","ceil","$highlightGutterLine","$cursorRow","updateLineHighlight","$cursorCell","scrollLines","$renderLines","childNodes","breakpoints","decorations","foldHeight","getShowLineNumbers","paddingLeft","borderRightWidth","paddingRight","Marker","setPadding","setMarkers","elt","css","$getTop","drawFullLineMarker","drawScreenLineMarker","drawTextMarker","drawMultiLineMarker","childElementCount","lastChild","stringBuilder","extraStyle","curr","lineRange","range1","drawBidiSingleLineMarker","radiusClass","extraLength","Text","$updateEolChar","EOF_CHAR","EOL_CHAR_LF","EOL_CHAR_CRLF","EOL_CHAR","TAB_CHAR","SPACE_CHAR","margin","getLineHeight","$fontMetrics","measure","$pollSizeChanges","checkForSizeChanges","$pollSizeChangesTimer","$computeTabString","showSpaces","showTabs","showEOL","$tabStrings","tabStr","span","$indentGuideRe","spaceClass","spaceContent","tabClass","tabContent","lineElements","lineElementsIdx","heightChanged","lineElement","$renderLine","$renderLinesFragment","lineEl","$useLineGroups","$textToken","$renderToken","valueFragment","simpleSpace","controlCharacter","cjkSpace","cjk","cloneNode","com","renderIndentGuide","cols","$createLineElement","$renderWrappedLine","splitChars","$renderOverflowMessage","$renderSimpleLine","overflowEl","$getFoldLineTokens","lastLineEl","invisibleEl","renderTokens","addTokens","Cursor","isVisible","blinkInterval","smoothBlinking","cursors","addCursor","$updateCursors","$updateOpacity","$startCssAnimation","animationDuration","$stopCssAnimation","blinking","restartTimer","setBlinkInterval","removeCursor","intervalId","timeoutId","blink","onScreen","isCursorInView","pixelPos","maxHeight","$selectionMarkers","cursorIndex","drawCursor","$setOverwrite","MAX_SCROLL_H","ScrollBar","classSuffix","setVisible","skipEvent","coeff","VScrollBar","scrollHeight","$scrollbarWidth","$minWidth","setHeight","setInnerHeight","setScrollHeight","HScrollBar","setWidth","setInnerWidth","setScrollWidth","ScrollBarV","ScrollBarH","RenderLoop","onRender","pending","changes","$recursionLimit","_flush","change","clear","CHAR_COUNT","USE_OBSERVER","ResizeObserver","FontMetrics","$setMeasureNodeStyles","$measureNode","$addObserver","isRoot","visibility","whiteSpace","font","$measureSizes","fontWeight","boldSize","charSizes","allowBoldFonts","$observer","observe","setPolling","disconnect","$getZoom","getZoom","zoom","$initTransformMeasureNodes","transformCoordinates","clientPos","elPos","mul","solve","l1","l2","det","sub","m2","ut","u","f","GutterLayer","MarkerLayer","TextLayer","CursorLayer","editorCss","HIDE_TEXTAREA","VirtualRenderer","onGutterResize","$markerBack","textLayer","$textLayer","canvas","$markerFront","$horizScroll","$vScroll","scrollBar","$scrollAnimation","updateCharacterSize","$size","scrollerHeight","scrollerWidth","$dirty","minHeight","v","$renderChanges","defaultView","CHANGE_FULL","CHANGE_CURSOR","CHANGE_MARKER","CHANGE_SCROLL","CHANGE_LINES","CHANGE_TEXT","CHANGE_SIZE","CHANGE_MARKER_BACK","CHANGE_MARKER_FRONT","CHANGE_H_SCROLL","$allowBoldFonts","$updatePrintMargin","onChangeNewLineMode","$changedLines","updateFontSize","$changes","$updateSizeAsync","resizing","scrollWidth","$updateCachedSize","$extraHeight","oldSize","$showGutter","$computeLayerConfig","availableWidth","$showPrintMargin","$printMarginColumn","$animatedScroll","getShowGutter","setShowGutter","$printMarginEl","containerEl","posTop","posLeft","setScrollMargin","sm","setMargin","getHScrollBarAlwaysVisible","$hScrollBarAlwaysVisible","setHScrollBarAlwaysVisible","alwaysVisible","getVScrollBarAlwaysVisible","$vScrollBarAlwaysVisible","setVScrollBarAlwaysVisible","$updateScrollBarV","$scrollPastEnd","$updateScrollBarH","$frozen","freeze","unfreeze","st","$updateLines","$autosize","desiredHeight","$maxPixelHeight","$gutterWidth","hideScrollbars","longestLine","$getLongestLine","horizScroll","hScrollChanged","vScrollBefore","vScrollChanged","firstRowHeight","lineCount","charCount","$viewMargin","topMargin","bottomMargin","alignment","STEPS","$calcSteps","fromValue","toValue","x_min","steps","initialScroll","oldSteps","$timer","scrollTo","canvasPos","$hasCssTransforms","$blockCursor","$useTextareaForIME","addToken","removeExtraToken","newToken","$themeId","cssClass","$theme","isDark","setMouseCursor","attachToShadowRoot","workerUrl","Worker","blob","Blob","blobBuilder","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","getBlob","$workerBlob","blobURL","URL","webkitURL","createObjectURL","WorkerClient","worker","$createWorkerFromOldConfig","$sendDeltaQueue","changeListener","onMessage","callbackId","callbacks","onmessage","topLevelNamespaces","classname","importScripts","nameToUrl","toUrl","normalizePath","$normalizePath","tlns","err","deltaQueue","$doc","cmd","emit","ex","attachToDocument","q","UIWorkerClient","main","emitSync","sender","messageBuffer","workerClient","processNext","setEmitSync","Main","PlaceHolder","others","mainClass","othersClass","$onUpdate","onUpdate","$others","undoStack","$undostack","$undoStackDepth","setup","other","showOtherMarkers","othersActive","hideOtherMarkers","updateAnchors","lengthDiff","inMainRange","distanceFromStart","newPos","otherPos","updateMarkers","updateMarker","undosRequired","isSamePoint","alt","ctrl","accel","selectionMode","isMultiSelect","mouseX","mouseY","screenAnchor","screenCursor","$enableJumpToDef","$blockSelectEnabled","addSelectionMarker","oldRange","removeSelectionMarker","tmpSel","rectSel","blockSelect","newCursor","removeSelectionMarkers","rectangularRangeBlock","updateSelectionMarkers","onSelectionInterval","selectMoreLines","selectMore","joinSelections","splitIntoLines","alignCursors","multiSelectCommands","getSelectionMarkers","$blockChangeEvents","$onAddRange","$onRemoveRange","mergeOverlappingRanges","lastRange","$initRangeList","toggleBlockSelection","includeEmptyLines","xBackwards","startOffsetX","endOffsetX","docEnd","yBackwards","MultiSelect","$multiselectOnSessionChange","$onMultiSelect","$onSingleSelect","onSessionChange","$checkMultiselectChange","altCursor","altDown","addAltCursorListeners","selectionMarkerCount","markerList","$onMultiSelectExec","inVirtualMode","keepOrder","$byLines","cmdResult","anim","buf","additive","skip","screenLead","toRemove","words","stopAtFirst","sameRowRanges","maxCol","minSpace","spaceOffsets","spaceOffset","fr","lr","guessRange","$reAlignText","forceLeft","startW","textW","endW","isLeftAligned","isRightAligned","alignLeft","enableMultiselect","enableBlockSelect","FoldMode","foldingStartMarker","foldingStopMarker","indentationBlock","startLevel","openingBracketBlock","closingBracketBlock","LineWidgets","widgetManager","updateOnChange","renderWidgets","measureWidgets","_changedWidgets","$onChangeEditor","updateOnFold","_inDocument","removeLineWidget","$updateRows","noWidgets","$oldWidget","$registerLineWidget","addLineWidget","zIndex","coverGutter","pixelHeight","$fold","onWidgetChanged","w1","getWidgetsAtRow","changedWidgets","fixedWidth","coverLine","fullWidth","oldWidget","gutterAnno","comparator","binarySearch","matched","findAnnotations","arrow","onmousedown","Renderer","edit","_id","getElementById","env","tagName","oldNode","createEditSession","ace_1","diff_1","Split","BELOW","BESIDE","$container","$splits","$editorCSS","$editors","$orientation","setSplits","$cEditor","$createEditor","$fontSize","getSplits","getEditor","getCurrentEditor","keybinding","$cloneSession","getOrientation","setOrientation","editorWidth","editorHeight","HASH_UNDEFINED","funcTag","genTag","reIsDeepProp","reIsPlainProp","reLeadingDot","rePropName","reEscapeChar","reIsHostCtor","freeGlobal","freeSelf","Function","uid","arrayProto","funcProto","objectProto","coreJsData","maskSrcKey","IE_PROTO","funcToString","objectToString","reIsNative","Symbol","Map","getNative","nativeCreate","symbolProto","symbolToString","Hash","entries","entry","ListCache","MapCache","assocIndexOf","baseGet","isSymbol","isKey","stringToPath","toKey","baseIsNative","isObject","isFunction","isHostObject","toSource","getMapData","__data__","has","memoize","baseToString","resolver","TypeError","memoized","Cache","isObjectLike","defaultValue","editorOptions","editorEvents","getAceInstance","acequire","debounce","fn","diff_match_patch","Diff_Timeout","Diff_EditCost","Match_Threshold","Match_Distance","Patch_DeleteThreshold","Patch_Margin","Match_MaxBits","DIFF_DELETE","Diff","text1","text2","opt_checklines","opt_deadline","getTime","deadline","checklines","commonlength","diff_commonPrefix","commonprefix","diff_commonSuffix","commonsuffix","diffs","diff_compute_","diff_cleanupMerge","longtext","shorttext","hm","diff_halfMatch_","text1_a","text1_b","text2_a","text2_b","mid_common","diffs_a","diffs_b","diff_lineMode_","diff_bisect_","diff_linesToChars_","chars1","chars2","linearray","lineArray","diff_charsToLines_","pointer","count_delete","count_insert","text_delete","text_insert","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","front","k1start","k1end","k2start","k2end","k1","k1_offset","y1","x1","k2_offset","x2","diff_bisectSplit_","k2","y2","text1a","text2a","text1b","text2b","diffsb","lineHash","diff_linesToCharsMunge_","lineStart","lineArrayLength","pointermin","pointermax","pointermid","pointerstart","pointerend","diff_commonOverlap_","text_length","best","pattern","diff_halfMatchI_","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","seed","best_common","prefixLength","suffixLength","hm1","hm2","equalities","equalitiesLength","lastequality","length_insertions1","length_deletions1","length_insertions2","length_deletions2","diff_cleanupSemanticLossless","deletion","insertion","overlap_length1","overlap_length2","diff_cleanupSemanticScore_","one","two","char1","char2","nonAlphaNumeric1","nonAlphaNumericRegex_","nonAlphaNumeric2","whitespace1","whitespaceRegex_","whitespace2","lineBreak1","linebreakRegex_","lineBreak2","blankLine1","blanklineEndRegex_","blankLine2","blanklineStartRegex_","equality1","equality2","commonOffset","commonString","bestEquality1","bestEdit","bestEquality2","bestScore","diff_cleanupEfficiency","pre_ins","pre_del","post_ins","post_del","diff_xIndex","loc","last_chars1","last_chars2","diff_prettyHtml","pattern_amp","pattern_lt","pattern_gt","pattern_para","op","diff_text1","diff_text2","diff_levenshtein","levenshtein","insertions","deletions","diff_toDelta","encodeURI","diff_fromDelta","diffsLength","decodeURI","match_main","match_bitap_","match_alphabet_","match_bitapScore_","accuracy","proximity","score_threshold","best_loc","lastIndexOf","bin_min","bin_mid","matchmask","last_rd","bin_max","finish","rd","charMatch","patch_addContext_","patch","start2","length1","start1","length2","patch_make","opt_b","opt_c","patches","patch_obj","patchDiffLength","char_count1","char_count2","prepatch_text","postpatch_text","diff_type","diff_text","patch_deepCopy","patchesCopy","patchCopy","patch_apply","nullPadding","patch_addPadding","patch_splitMax","results","start_loc","expected_loc","end_loc","index2","index1","paddingLength","patch_size","bigpatch","precontext","empty","postcontext","patch_toText","patch_fromText","textline","textPointer","patchHeader","sign","__assign","assign","editorOptions_1","ace_builds_1","ext_split_1","SplitComponent","isInShadow","componentDidMount","_a","onBeforeLoad","_b","refEditor","splitEditor","availableOptions","debounceChangePeriod","defaultValueForEditor","valueForEditor","newAnnotations","newMarkers","handleMarkers","handleOptions","sp","prevProps","oldProps","nextProps","nextValue","silent","oldAnnotations","oldMarkers","appliedClassesArray_1","oldClass","componentWillUnmount","value_1","value_2","value_3","currentMarkers","updateRef","divStyle","ref","arrayOf","oneOfType","ReactAce","onValidate","navigateToFileEnd","updatePlaceholder","handleScrollMargins","margins","showPlaceholder","enableSnippets"],"mappings":"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0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU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,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,GAAG,EAAE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3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,4CCC3CM,OAAOU,eAAehB,QAAS,aAAc,CAAEiB,OAAO,IACtD,IAAIy5F,EAAQ,EAAQ,YAChBC,EAAS,EAAQ,YACrB36F,QAAQ8B,KAAO64F,EAAOr2F,QACtB,IAAIlD,EAAU,EAAQ,YACtBpB,QAAQmD,MAAQ/B,EAAQkD,QACxBtE,QAAQsE,QAAUo2F,EAAMp2F,S,+BCPxBvE,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,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IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,6CCA3C,YACAM,OAAOU,eAAehB,QAAS,aAAc,CAAEiB,OAAO,IAWtDjB,QAAQw/F,cAVY,CAChB,WACA,WACA,WACA,sBACA,UACA,4BACA,2BACA,kBAgBJx/F,QAAQy/F,aAbW,CACf,WACA,UACA,UACA,SACA,SACA,UACA,oBACA,iBACA,WACA,gBACA,aAwBJz/F,QAAQ0/F,eArBa,WACjB,IAAIx2F,EAkBJ,MAjBsB,oBAAXtC,QAGPD,EAAOC,OAAS,GAChBsC,EAAM,EAAQ,mBAGPvC,EAAOC,QAETA,OAAOsC,KAEZA,EAAMtC,OAAOsC,KACTy2F,SAAW/4F,OAAOsC,IAAIf,SAAWvB,OAAOsC,IAAIy2F,SAGhDz2F,EAAM,EAAQ,YAEXA,GAeXlJ,QAAQ4/F,SAZO,SAAUC,EAAItgF,GACzB,IAAI7C,EAAQ,KAEZ,OAAO,WACH,IAAIwO,EAAU/qB,KACVwnC,EAAO3gC,UACXqW,aAAaX,GACbA,EAAQY,YAAW,WACfuiF,EAAGz4F,MAAM8jB,EAASyc,KACnBpoB,O,yDC1DXxf,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCC3CkJ,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,gCAAiC,EAAQ,aACjEz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,yBAA0B,EAAQ,aAC1Dz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,cAAe,EAAQ,aAC/Cz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,2BAA4B,EAAQ,aAC5Dz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,2BAA4B,EAAQ,aAC5Dz5B,IAAI+6B,OAAOtB,aAAa,4BAA6B,EAAQ,aAC7Dz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,aAAc,EAAQ,aAC9Cz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,yBAA0B,EAAQ,aAC1Dz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,yBAA0B,EAAQ,aAC1Dz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,cAAe,EAAQ,aAC/Cz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,6BAA8B,EAAQ,aAC9Dz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,aAAc,EAAQ,aAC9Cz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,cAAe,EAAQ,aAC/Cz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,eAAgB,EAAQ,aAChDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aAEjDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,4BAA6B,EAAQ,aAC7Dz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,2BAA4B,EAAQ,aAC5Dz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,gBAAiB,EAAQ,aACjDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,yBAA0B,EAAQ,aAC1Dz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,2BAA4B,EAAQ,aAC5Dz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,4BAA6B,EAAQ,aAC7Dz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,2BAA4B,EAAQ,aAC5Dz5B,IAAI+6B,OAAOtB,aAAa,2BAA4B,EAAQ,aAC5Dz5B,IAAI+6B,OAAOtB,aAAa,4BAA6B,EAAQ,aAC7Dz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,2BAA4B,EAAQ,aAC5Dz5B,IAAI+6B,OAAOtB,aAAa,gCAAiC,EAAQ,aACjEz5B,IAAI+6B,OAAOtB,aAAa,kCAAmC,EAAQ,aACnEz5B,IAAI+6B,OAAOtB,aAAa,oCAAqC,EAAQ,aACrEz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,yBAA0B,EAAQ,aAC1Dz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,6BAA8B,EAAQ,aAC9Dz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,yBAA0B,EAAQ,aAC1Dz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,4BAA6B,EAAQ,aAC7Dz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,2BAA4B,EAAQ,aAC5Dz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,2BAA4B,EAAQ,aAC5Dz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,4BAA6B,EAAQ,aAC7Dz5B,IAAI+6B,OAAOtB,aAAa,0BAA2B,EAAQ,aAC3Dz5B,IAAI+6B,OAAOtB,aAAa,yBAA0B,EAAQ,aAC1Dz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,0BAA2B,EAAQ,aAC3Dz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,+BAAgC,EAAQ,aAChEz5B,IAAI+6B,OAAOtB,aAAa,gCAAiC,EAAQ,aACjEz5B,IAAI+6B,OAAOtB,aAAa,4BAA6B,EAAQ,aAC7Dz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,0BAA2B,EAAQ,aAC3Dz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,yBAA0B,EAAQ,aAC1Dz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,yBAA0B,EAAQ,aAC1Dz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,6BAA8B,EAAQ,aAC9Dz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,0BAA2B,EAAQ,aAC3Dz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,6BAA8B,EAAQ,aAC9Dz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,2BAA4B,EAAQ,aAC5Dz5B,IAAI+6B,OAAOtB,aAAa,yBAA0B,EAAQ,aAC1Dz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,0BAA2B,EAAQ,aAC3Dz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,0BAA2B,EAAQ,aAC3Dz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,yBAA0B,EAAQ,aAC1Dz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,0BAA2B,EAAQ,aAC3Dz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,iCAAkC,EAAQ,aAClEz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,0BAA2B,EAAQ,aAC3Dz5B,IAAI+6B,OAAOtB,aAAa,0BAA2B,EAAQ,aAC3Dz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,0BAA2B,EAAQ,aAC3Dz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,iBAAkB,EAAQ,aAClDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,kBAAmB,EAAQ,aACnDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,4BAA6B,EAAQ,aAC7Dz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,yBAA0B,EAAQ,aAC1Dz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,qBAAsB,EAAQ,aACtDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,yBAA0B,EAAQ,aAC1Dz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,0BAA2B,EAAQ,aAC3Dz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,wBAAyB,EAAQ,aACzDz5B,IAAI+6B,OAAOtB,aAAa,uBAAwB,EAAQ,aACxDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,2BAA4B,EAAQ,aAC5Dz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,mBAAoB,EAAQ,aACpDz5B,IAAI+6B,OAAOtB,aAAa,sBAAuB,EAAQ,aACvDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,aACrDz5B,IAAI+6B,OAAOtB,aAAa,oBAAqB,EAAQ,c,+BC/ZrD5iC,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,6BC4B3C,SAAS8/F,IAMP3/F,KAAK4/F,aAAe,EAEpB5/F,KAAK6/F,cAAgB,EAErB7/F,KAAK8/F,gBAAkB,GAIvB9/F,KAAK+/F,eAAiB,IAKtB//F,KAAKggG,sBAAwB,GAE7BhgG,KAAKigG,aAAe,EAGpBjgG,KAAKkgG,cAAgB,GAYvB,IAAIC,GAAe,EAKnBR,EAAiBS,KAgBjBT,EAAiBh/F,UAAUuB,UAAY,SAASm+F,EAAOC,EAAOC,EAC1DC,QAEyB,IAAhBA,IAEPA,EADExgG,KAAK4/F,cAAgB,EACR7uD,OAAOC,WAEP,IAAKnsB,MAAM47E,UAAgC,IAApBzgG,KAAK4/F,cAG/C,IAAIc,EAAWF,EAGf,GAAa,MAATH,GAA0B,MAATC,EACnB,MAAM,IAAI/8F,MAAM,2BAIlB,GAAI88F,GAASC,EACX,OAAID,EACK,CAAC,CAvCG,EAuCUA,IAEhB,QAGoB,IAAlBE,IACTA,GAAiB,GAEnB,IAAII,EAAaJ,EAGbK,EAAe5gG,KAAK6gG,kBAAkBR,EAAOC,GAC7CQ,EAAeT,EAAM9yD,UAAU,EAAGqzD,GACtCP,EAAQA,EAAM9yD,UAAUqzD,GACxBN,EAAQA,EAAM/yD,UAAUqzD,GAGxBA,EAAe5gG,KAAK+gG,kBAAkBV,EAAOC,GAC7C,IAAIU,EAAeX,EAAM9yD,UAAU8yD,EAAMp+F,OAAS2+F,GAClDP,EAAQA,EAAM9yD,UAAU,EAAG8yD,EAAMp+F,OAAS2+F,GAC1CN,EAAQA,EAAM/yD,UAAU,EAAG+yD,EAAMr+F,OAAS2+F,GAG1C,IAAIK,EAAQjhG,KAAKkhG,cAAcb,EAAOC,EAAOK,EAAYD,GAUzD,OAPII,GACFG,EAAM9nD,QAAQ,CAlED,EAkEc2nD,IAEzBE,GACFC,EAAM79F,KAAK,CArEE,EAqEW49F,IAE1BhhG,KAAKmhG,kBAAkBF,GAChBA,GAgBTtB,EAAiBh/F,UAAUugG,cAAgB,SAASb,EAAOC,EAAOK,EAC9DD,GACF,IAAIO,EAEJ,IAAKZ,EAEH,MAAO,CAAC,CA/FM,EA+FQC,IAGxB,IAAKA,EAEH,MAAO,CAAC,CAACH,EAAaE,IAGxB,IAAIe,EAAWf,EAAMp+F,OAASq+F,EAAMr+F,OAASo+F,EAAQC,EACjDe,EAAYhB,EAAMp+F,OAASq+F,EAAMr+F,OAASq+F,EAAQD,EAClD38F,EAAI09F,EAASh5F,QAAQi5F,GACzB,IAAU,GAAN39F,EASF,OAPAu9F,EAAQ,CAAC,CA5GK,EA4GSG,EAAS7zD,UAAU,EAAG7pC,IACpC,CA5GI,EA4GS29F,GACb,CA9GK,EA8GSD,EAAS7zD,UAAU7pC,EAAI29F,EAAUp/F,UAEpDo+F,EAAMp+F,OAASq+F,EAAMr+F,SACvBg/F,EAAM,GAAG,GAAKA,EAAM,GAAG,GAAKd,GAEvBc,EAGT,GAAwB,GAApBI,EAAUp/F,OAGZ,MAAO,CAAC,CAACk+F,EAAaE,GAAQ,CAzHhB,EAyH8BC,IAI9C,IAAIgB,EAAKthG,KAAKuhG,gBAAgBlB,EAAOC,GACrC,GAAIgB,EAAI,CAEN,IAAIE,EAAUF,EAAG,GACbG,EAAUH,EAAG,GACbI,EAAUJ,EAAG,GACbK,EAAUL,EAAG,GACbM,EAAaN,EAAG,GAEhBO,EAAU7hG,KAAKkC,UAAUs/F,EAASE,EAASf,EAAYD,GACvDoB,EAAU9hG,KAAKkC,UAAUu/F,EAASE,EAAShB,EAAYD,GAE3D,OAAOmB,EAAQrnD,OAAO,CAAC,CAxIV,EAwIuBonD,IAAcE,GAGpD,OAAInB,GAAcN,EAAMp+F,OAAS,KAAOq+F,EAAMr+F,OAAS,IAC9CjC,KAAK+hG,eAAe1B,EAAOC,EAAOI,GAGpC1gG,KAAKgiG,aAAa3B,EAAOC,EAAOI,IAczCf,EAAiBh/F,UAAUohG,eAAiB,SAAS1B,EAAOC,EAAOI,GAGjEL,GADI59E,EAAIziB,KAAKiiG,mBAAmB5B,EAAOC,IAC7B4B,OACV5B,EAAQ79E,EAAE0/E,OACV,IAAIC,EAAY3/E,EAAE4/E,UAEdpB,EAAQjhG,KAAKkC,UAAUm+F,EAAOC,GAAO,EAAOI,GAGhD1gG,KAAKsiG,mBAAmBrB,EAAOmB,GAE/BpiG,KAAKmC,qBAAqB8+F,GAI1BA,EAAM79F,KAAK,CA7KI,EA6KS,KAMxB,IALA,IAAIm/F,EAAU,EACVC,EAAe,EACfC,EAAe,EACfC,EAAc,GACdC,EAAc,GACXJ,EAAUtB,EAAMh/F,QAAQ,CAC7B,OAAQg/F,EAAMsB,GAAS,IACrB,KAtLY,EAuLVE,IACAE,GAAe1B,EAAMsB,GAAS,GAC9B,MACF,KAAKpC,EACHqC,IACAE,GAAezB,EAAMsB,GAAS,GAC9B,MACF,KA7LW,EA+LT,GAAIC,GAAgB,GAAKC,GAAgB,EAAG,CAE1CxB,EAAMjzF,OAAOu0F,EAAUC,EAAeC,EACzBD,EAAeC,GAC5BF,EAAUA,EAAUC,EAAeC,EAEnC,IADA,IAAIhgF,EACK8gB,GADL9gB,EAAIziB,KAAKkC,UAAUwgG,EAAaC,GAAa,EAAOjC,IACzCz+F,OAAS,EAAGshC,GAAK,EAAGA,IACjC09D,EAAMjzF,OAAOu0F,EAAS,EAAG9/E,EAAE8gB,IAE7Bg/D,GAAoB9/E,EAAExgB,OAExBwgG,EAAe,EACfD,EAAe,EACfE,EAAc,GACdC,EAAc,GAGlBJ,IAIF,OAFAtB,EAAMvhE,MAECuhE,GAcTtB,EAAiBh/F,UAAUqhG,aAAe,SAAS3B,EAAOC,EAAOI,GAW/D,IATA,IAAIkC,EAAevC,EAAMp+F,OACrB4gG,EAAevC,EAAMr+F,OACrB6gG,EAAQhyF,KAAK8pE,MAAMgoB,EAAeC,GAAgB,GAClDE,EAAWD,EACXE,EAAW,EAAIF,EACfG,EAAK,IAAI3iG,MAAM0iG,GACfE,EAAK,IAAI5iG,MAAM0iG,GAGVjqF,EAAI,EAAGA,EAAIiqF,EAAUjqF,IAC5BkqF,EAAGlqF,IAAM,EACTmqF,EAAGnqF,IAAM,EAEXkqF,EAAGF,EAAW,GAAK,EACnBG,EAAGH,EAAW,GAAK,EAWnB,IAVA,IAAIr2D,EAAQk2D,EAAeC,EAGvBM,EAASz2D,EAAQ,GAAK,EAGtB02D,EAAU,EACVC,EAAQ,EACRC,EAAU,EACVC,EAAQ,EACHtjG,EAAI,EAAGA,EAAI6iG,MAEd,IAAKj+E,MAAQ47E,UAAYC,GAFJzgG,IAAK,CAO9B,IAAK,IAAIujG,GAAMvjG,EAAImjG,EAASI,GAAMvjG,EAAIojG,EAAOG,GAAM,EAAG,CASpD,IARA,IAAIC,EAAYV,EAAWS,EAOvBE,GAJFC,EADEH,IAAOvjG,GAAMujG,GAAMvjG,GAAKgjG,EAAGQ,EAAY,GAAKR,EAAGQ,EAAY,GACxDR,EAAGQ,EAAY,GAEfR,EAAGQ,EAAY,GAAK,GAEbD,EACPG,EAAKf,GAAgBc,EAAKb,GAC1BxC,EAAM/3F,OAAOq7F,IAAOrD,EAAMh4F,OAAOo7F,IACtCC,IACAD,IAGF,GADAT,EAAGQ,GAAaE,EACZA,EAAKf,EAEPS,GAAS,OACJ,GAAIK,EAAKb,EAEdO,GAAW,OACN,GAAID,EAAO,CAEhB,IADIS,EAAYb,EAAWr2D,EAAQ82D,IAClB,GAAKI,EAAYZ,IAA8B,GAAlBE,EAAGU,GAG/C,GAAID,IADAE,EAAKjB,EAAeM,EAAGU,IAGzB,OAAO5jG,KAAK8jG,kBAAkBzD,EAAOC,EAAOqD,EAAID,EAAIhD,IAO5D,IAAK,IAAIqD,GAAM9jG,EAAIqjG,EAASS,GAAM9jG,EAAIsjG,EAAOQ,GAAM,EAAG,CASpD,IARA,IACIF,EADAD,EAAYb,EAAWgB,EAOvBC,GAJFH,EADEE,IAAO9jG,GAAM8jG,GAAM9jG,GAAKijG,EAAGU,EAAY,GAAKV,EAAGU,EAAY,GACxDV,EAAGU,EAAY,GAEfV,EAAGU,EAAY,GAAK,GAEbG,EACPF,EAAKjB,GAAgBoB,EAAKnB,GAC1BxC,EAAM/3F,OAAOs6F,EAAeiB,EAAK,IACjCvD,EAAMh4F,OAAOu6F,EAAemB,EAAK,IACtCH,IACAG,IAGF,GADAd,EAAGU,GAAaC,EACZA,EAAKjB,EAEPW,GAAS,OACJ,GAAIS,EAAKnB,EAEdS,GAAW,OACN,IAAKH,EAAO,CAEjB,IADIM,EAAYV,EAAWr2D,EAAQq3D,IAClB,GAAKN,EAAYT,IAA8B,GAAlBC,EAAGQ,GAAkB,CACjE,IAAIE,EACAD,EAAKX,GADLY,EAAKV,EAAGQ,IACaA,EAGzB,GAAIE,IADJE,EAAKjB,EAAeiB,GAGlB,OAAO7jG,KAAK8jG,kBAAkBzD,EAAOC,EAAOqD,EAAID,EAAIhD,MAQ9D,MAAO,CAAC,CAACP,EAAaE,GAAQ,CA/Ud,EA+U4BC,KAe9CX,EAAiBh/F,UAAUmjG,kBAAoB,SAASzD,EAAOC,EAAOvnF,EAAGgX,EACrE2wE,GACF,IAAIuD,EAAS5D,EAAM9yD,UAAU,EAAGx0B,GAC5BmrF,EAAS5D,EAAM/yD,UAAU,EAAGxd,GAC5Bo0E,EAAS9D,EAAM9yD,UAAUx0B,GACzBqrF,EAAS9D,EAAM/yD,UAAUxd,GAGzBkxE,EAAQjhG,KAAKkC,UAAU+hG,EAAQC,GAAQ,EAAOxD,GAC9C2D,EAASrkG,KAAKkC,UAAUiiG,EAAQC,GAAQ,EAAO1D,GAEnD,OAAOO,EAAMzmD,OAAO6pD,IAetB1E,EAAiBh/F,UAAUshG,mBAAqB,SAAS5B,EAAOC,GAC9D,IAAI+B,EAAY,GACZiC,EAAW,GAcf,SAASC,EAAwBzhG,GAS/B,IARA,IAAIgmC,EAAQ,GAIR07D,EAAY,EACZvwD,GAAW,EAEXwwD,EAAkBpC,EAAUpgG,OACzBgyC,EAAUnxC,EAAKb,OAAS,GAAG,EAEhB,IADhBgyC,EAAUnxC,EAAKsF,QAAQ,KAAMo8F,MAE3BvwD,EAAUnxC,EAAKb,OAAS,GAE1B,IAAIqmB,EAAOxlB,EAAKyqC,UAAUi3D,EAAWvwD,EAAU,GAC/CuwD,EAAYvwD,EAAU,GAElBqwD,EAAS9jG,eAAiB8jG,EAAS9jG,eAAe8nB,QAC9B3gB,IAAnB28F,EAASh8E,IACZwgB,GAAS3vB,OAAOC,aAAakrF,EAASh8E,KAEtCwgB,GAAS3vB,OAAOC,aAAaqrF,GAC7BH,EAASh8E,GAAQm8E,EACjBpC,EAAUoC,KAAqBn8E,GAGnC,OAAOwgB,EAKT,OAzCAu5D,EAAU,GAAK,GAyCR,CAACH,OAFKqC,EAAwBlE,GAEb8B,OADXoC,EAAwBjE,GACG+B,UAAWA,IAWrD1C,EAAiBh/F,UAAU2hG,mBAAqB,SAASrB,EAAOoB,GAC9D,IAAK,IAAItpF,EAAI,EAAGA,EAAIkoF,EAAMh/F,OAAQ8W,IAAK,CAGrC,IAFA,IAAI+vB,EAAQm4D,EAAMloF,GAAG,GACjBjW,EAAO,GACFitB,EAAI,EAAGA,EAAI+Y,EAAM7mC,OAAQ8tB,IAChCjtB,EAAKitB,GAAKsyE,EAAUv5D,EAAMS,WAAWxZ,IAEvCkxE,EAAMloF,GAAG,GAAKjW,EAAK0F,KAAK,MAY5Bm3F,EAAiBh/F,UAAUkgG,kBAAoB,SAASR,EAAOC,GAE7D,IAAKD,IAAUC,GAASD,EAAM/3F,OAAO,IAAMg4F,EAAMh4F,OAAO,GACtD,OAAO,EAQT,IAJA,IAAIo8F,EAAa,EACbC,EAAa7zF,KAAKic,IAAIszE,EAAMp+F,OAAQq+F,EAAMr+F,QAC1C2iG,EAAaD,EACbE,EAAe,EACZH,EAAaE,GACdvE,EAAM9yD,UAAUs3D,EAAcD,IAC9BtE,EAAM/yD,UAAUs3D,EAAcD,GAEhCC,EADAH,EAAaE,EAGbD,EAAaC,EAEfA,EAAa9zF,KAAKkxC,OAAO2iD,EAAaD,GAAc,EAAIA,GAE1D,OAAOE,GAUTjF,EAAiBh/F,UAAUogG,kBAAoB,SAASV,EAAOC,GAE7D,IAAKD,IAAUC,GACXD,EAAM/3F,OAAO+3F,EAAMp+F,OAAS,IAAMq+F,EAAMh4F,OAAOg4F,EAAMr+F,OAAS,GAChE,OAAO,EAQT,IAJA,IAAIyiG,EAAa,EACbC,EAAa7zF,KAAKic,IAAIszE,EAAMp+F,OAAQq+F,EAAMr+F,QAC1C2iG,EAAaD,EACbG,EAAa,EACVJ,EAAaE,GACdvE,EAAM9yD,UAAU8yD,EAAMp+F,OAAS2iG,EAAYvE,EAAMp+F,OAAS6iG,IAC1DxE,EAAM/yD,UAAU+yD,EAAMr+F,OAAS2iG,EAAYtE,EAAMr+F,OAAS6iG,GAE5DA,EADAJ,EAAaE,EAGbD,EAAaC,EAEfA,EAAa9zF,KAAKkxC,OAAO2iD,EAAaD,GAAc,EAAIA,GAE1D,OAAOE,GAYTjF,EAAiBh/F,UAAUokG,oBAAsB,SAAS1E,EAAOC,GAE/D,IAAIsC,EAAevC,EAAMp+F,OACrB4gG,EAAevC,EAAMr+F,OAEzB,GAAoB,GAAhB2gG,GAAqC,GAAhBC,EACvB,OAAO,EAGLD,EAAeC,EACjBxC,EAAQA,EAAM9yD,UAAUq1D,EAAeC,GAC9BD,EAAeC,IACxBvC,EAAQA,EAAM/yD,UAAU,EAAGq1D,IAE7B,IAAIoC,EAAcl0F,KAAKic,IAAI61E,EAAcC,GAEzC,GAAIxC,GAASC,EACX,OAAO0E,EAQT,IAFA,IAAIC,EAAO,EACPhjG,EAAS,IACA,CACX,IAAIijG,EAAU7E,EAAM9yD,UAAUy3D,EAAc/iG,GACxCgvE,EAAQqvB,EAAMl4F,QAAQ88F,GAC1B,IAAc,GAAVj0B,EACF,OAAOg0B,EAEThjG,GAAUgvE,EACG,GAATA,GAAcovB,EAAM9yD,UAAUy3D,EAAc/iG,IAC5Cq+F,EAAM/yD,UAAU,EAAGtrC,KACrBgjG,EAAOhjG,EACPA,OAiBN09F,EAAiBh/F,UAAU4gG,gBAAkB,SAASlB,EAAOC,GAC3D,GAAItgG,KAAK4/F,cAAgB,EAEvB,OAAO,KAET,IAAIwB,EAAWf,EAAMp+F,OAASq+F,EAAMr+F,OAASo+F,EAAQC,EACjDe,EAAYhB,EAAMp+F,OAASq+F,EAAMr+F,OAASq+F,EAAQD,EACtD,GAAIe,EAASn/F,OAAS,GAAwB,EAAnBo/F,EAAUp/F,OAAam/F,EAASn/F,OACzD,OAAO,KAET,IAAIH,EAAM9B,KAcV,SAASmlG,EAAiB/D,EAAUC,EAAW39F,GAM7C,IAJA,IAGI0hG,EAAiBC,EAAiBC,EAAkBC,EAHpDC,EAAOpE,EAAS7zD,UAAU7pC,EAAGA,EAAIoN,KAAKkxC,MAAMo/C,EAASn/F,OAAS,IAC9DshC,GAAK,EACLkiE,EAAc,IAE8B,IAAxCliE,EAAI89D,EAAUj5F,QAAQo9F,EAAMjiE,EAAI,KAAW,CACjD,IAAImiE,EAAe5jG,EAAI++F,kBAAkBO,EAAS7zD,UAAU7pC,GACnB29F,EAAU9zD,UAAUhK,IACzDoiE,EAAe7jG,EAAIi/F,kBAAkBK,EAAS7zD,UAAU,EAAG7pC,GACtB29F,EAAU9zD,UAAU,EAAGhK,IAC5DkiE,EAAYxjG,OAAS0jG,EAAeD,IACtCD,EAAcpE,EAAU9zD,UAAUhK,EAAIoiE,EAAcpiE,GAChD89D,EAAU9zD,UAAUhK,EAAGA,EAAImiE,GAC/BN,EAAkBhE,EAAS7zD,UAAU,EAAG7pC,EAAIiiG,GAC5CN,EAAkBjE,EAAS7zD,UAAU7pC,EAAIgiG,GACzCJ,EAAmBjE,EAAU9zD,UAAU,EAAGhK,EAAIoiE,GAC9CJ,EAAmBlE,EAAU9zD,UAAUhK,EAAImiE,IAG/C,OAAyB,EAArBD,EAAYxjG,QAAcm/F,EAASn/F,OAC9B,CAACmjG,EAAiBC,EACjBC,EAAkBC,EAAkBE,GAErC,KAKX,IAKInE,EAaAE,EAASC,EAASC,EAASC,EAlB3BiE,EAAMT,EAAiB/D,EAAUC,EACVvwF,KAAK8pE,KAAKwmB,EAASn/F,OAAS,IAEnD4jG,EAAMV,EAAiB/D,EAAUC,EACVvwF,KAAK8pE,KAAKwmB,EAASn/F,OAAS,IAEvD,OAAK2jG,GAAQC,GAQXvE,EANUuE,EAEAD,GAILA,EAAI,GAAG3jG,OAAS4jG,EAAI,GAAG5jG,OAAS2jG,EAHhCC,EAFAD,EAUHvF,EAAMp+F,OAASq+F,EAAMr+F,QACvBu/F,EAAUF,EAAG,GACbG,EAAUH,EAAG,GACbI,EAAUJ,EAAG,GACbK,EAAUL,EAAG,KAEbI,EAAUJ,EAAG,GACbK,EAAUL,EAAG,GACbE,EAAUF,EAAG,GACbG,EAAUH,EAAG,IAGR,CAACE,EAASC,EAASC,EAASC,EADlBL,EAAG,KAvBX,MAgCX3B,EAAiBh/F,UAAUwB,qBAAuB,SAAS8+F,GAczD,IAbA,IAAIzd,GAAU,EACVsiB,EAAa,GACbC,EAAmB,EAEnBC,EAAe,KAEfzD,EAAU,EAEV0D,EAAqB,EACrBC,EAAoB,EAEpBC,EAAqB,EACrBC,EAAoB,EACjB7D,EAAUtB,EAAMh/F,QAnqBR,GAoqBTg/F,EAAMsB,GAAS,IACjBuD,EAAWC,KAAsBxD,EACjC0D,EAAqBE,EACrBD,EAAoBE,EACpBD,EAAqB,EACrBC,EAAoB,EACpBJ,EAAe/E,EAAMsB,GAAS,KA3qBlB,GA6qBRtB,EAAMsB,GAAS,GACjB4D,GAAsBlF,EAAMsB,GAAS,GAAGtgG,OAExCmkG,GAAqBnF,EAAMsB,GAAS,GAAGtgG,OAIrC+jG,GAAiBA,EAAa/jG,QAC9B6O,KAAKgR,IAAImkF,EAAoBC,IAC5BF,EAAa/jG,QAAU6O,KAAKgR,IAAIqkF,EACAC,KAEnCnF,EAAMjzF,OAAO83F,EAAWC,EAAmB,GAAI,EAClC,CAAC5F,EAAa6F,IAE3B/E,EAAM6E,EAAWC,EAAmB,GAAK,GAAG,GA5rBlC,EA8rBVA,IAGAxD,IADAwD,EAC6B,EAAID,EAAWC,EAAmB,IAAM,EACrEE,EAAqB,EACrBC,EAAoB,EACpBC,EAAqB,EACrBC,EAAoB,EACpBJ,EAAe,KACfxiB,GAAU,IAGd+e,IAgBF,IAZI/e,GACFxjF,KAAKmhG,kBAAkBF,GAEzBjhG,KAAKqmG,6BAA6BpF,GAQlCsB,EAAU,EACHA,EAAUtB,EAAMh/F,QAAQ,CAC7B,GAAIg/F,EAAMsB,EAAU,GAAG,IAAMpC,GA3tBf,GA4tBVc,EAAMsB,GAAS,GAAmB,CACpC,IAAI+D,EAAWrF,EAAMsB,EAAU,GAAG,GAC9BgE,EAAYtF,EAAMsB,GAAS,GAC3BiE,EAAkBxmG,KAAK+kG,oBAAoBuB,EAAUC,GACrDE,EAAkBzmG,KAAK+kG,oBAAoBwB,EAAWD,GACtDE,GAAmBC,GACjBD,GAAmBF,EAASrkG,OAAS,GACrCukG,GAAmBD,EAAUtkG,OAAS,KAExCg/F,EAAMjzF,OAAOu0F,EAAS,EAClB,CAruBG,EAquBUgE,EAAUh5D,UAAU,EAAGi5D,KACxCvF,EAAMsB,EAAU,GAAG,GACf+D,EAAS/4D,UAAU,EAAG+4D,EAASrkG,OAASukG,GAC5CvF,EAAMsB,EAAU,GAAG,GAAKgE,EAAUh5D,UAAUi5D,GAC5CjE,MAGEkE,GAAmBH,EAASrkG,OAAS,GACrCwkG,GAAmBF,EAAUtkG,OAAS,KAGxCg/F,EAAMjzF,OAAOu0F,EAAS,EAClB,CAjvBG,EAivBU+D,EAAS/4D,UAAU,EAAGk5D,KACvCxF,EAAMsB,EAAU,GAAG,GAnvBX,EAovBRtB,EAAMsB,EAAU,GAAG,GACfgE,EAAUh5D,UAAU,EAAGg5D,EAAUtkG,OAASwkG,GAC9CxF,EAAMsB,EAAU,GAAG,GAAKpC,EACxBc,EAAMsB,EAAU,GAAG,GACf+D,EAAS/4D,UAAUk5D,GACvBlE,KAGJA,IAEFA,MAWJ5C,EAAiBh/F,UAAU0lG,6BAA+B,SAASpF,GAWjE,SAASyF,EAA2BC,EAAKC,GACvC,IAAKD,IAAQC,EAEX,OAAO,EAQT,IAAIC,EAAQF,EAAIr+F,OAAOq+F,EAAI1kG,OAAS,GAChC6kG,EAAQF,EAAIt+F,OAAO,GACnBy+F,EAAmBF,EAAMn8F,MAAMi1F,EAAiBqH,uBAChDC,EAAmBH,EAAMp8F,MAAMi1F,EAAiBqH,uBAChDE,EAAcH,GACdF,EAAMn8F,MAAMi1F,EAAiBwH,kBAC7BC,EAAcH,GACdH,EAAMp8F,MAAMi1F,EAAiBwH,kBAC7BE,EAAaH,GACbL,EAAMn8F,MAAMi1F,EAAiB2H,iBAC7BC,EAAaH,GACbN,EAAMp8F,MAAMi1F,EAAiB2H,iBAC7BE,EAAaH,GACbV,EAAIj8F,MAAMi1F,EAAiB8H,oBAC3BC,EAAaH,GACbX,EAAIl8F,MAAMi1F,EAAiBgI,sBAE/B,OAAIH,GAAcE,EAET,EACEL,GAAcE,EAEhB,EACER,IAAqBG,GAAeE,EAEtC,EACEF,GAAeE,EAEjB,EACEL,GAAoBE,EAEtB,EAEF,EAKT,IAFA,IAAI1E,EAAU,EAEPA,EAAUtB,EAAMh/F,OAAS,GAAG,CACjC,GAr0Ba,GAq0BTg/F,EAAMsB,EAAU,GAAG,IAr0BV,GAs0BTtB,EAAMsB,EAAU,GAAG,GAAkB,CAEvC,IAAIqF,EAAY3G,EAAMsB,EAAU,GAAG,GAC/BvI,EAAOiH,EAAMsB,GAAS,GACtBsF,EAAY5G,EAAMsB,EAAU,GAAG,GAG/BuF,EAAe9nG,KAAK+gG,kBAAkB6G,EAAW5N,GACrD,GAAI8N,EAAc,CAChB,IAAIC,EAAe/N,EAAKzsD,UAAUysD,EAAK/3F,OAAS6lG,GAChDF,EAAYA,EAAUr6D,UAAU,EAAGq6D,EAAU3lG,OAAS6lG,GACtD9N,EAAO+N,EAAe/N,EAAKzsD,UAAU,EAAGysD,EAAK/3F,OAAS6lG,GACtDD,EAAYE,EAAeF,EAS7B,IALA,IAAIG,EAAgBJ,EAChBK,EAAWjO,EACXkO,EAAgBL,EAChBM,EAAYzB,EAA2BkB,EAAW5N,GAClD0M,EAA2B1M,EAAM6N,GAC9B7N,EAAK1xF,OAAO,KAAOu/F,EAAUv/F,OAAO,IAAI,CAC7Cs/F,GAAa5N,EAAK1xF,OAAO,GACzB0xF,EAAOA,EAAKzsD,UAAU,GAAKs6D,EAAUv/F,OAAO,GAC5Cu/F,EAAYA,EAAUt6D,UAAU,GAChC,IAAIqW,EAAQ8iD,EAA2BkB,EAAW5N,GAC9C0M,EAA2B1M,EAAM6N,GAEjCjkD,GAASukD,IACXA,EAAYvkD,EACZokD,EAAgBJ,EAChBK,EAAWjO,EACXkO,EAAgBL,GAIhB5G,EAAMsB,EAAU,GAAG,IAAMyF,IAEvBA,EACF/G,EAAMsB,EAAU,GAAG,GAAKyF,GAExB/G,EAAMjzF,OAAOu0F,EAAU,EAAG,GAC1BA,KAEFtB,EAAMsB,GAAS,GAAK0F,EAChBC,EACFjH,EAAMsB,EAAU,GAAG,GAAK2F,GAExBjH,EAAMjzF,OAAOu0F,EAAU,EAAG,GAC1BA,MAINA,MAKJ5C,EAAiBqH,sBAAwB,eACzCrH,EAAiBwH,iBAAmB,KACpCxH,EAAiB2H,gBAAkB,SACnC3H,EAAiB8H,mBAAqB,WACtC9H,EAAiBgI,qBAAuB,cAMxChI,EAAiBh/F,UAAUynG,uBAAyB,SAASnH,GAgB3D,IAfA,IAAIzd,GAAU,EACVsiB,EAAa,GACbC,EAAmB,EAEnBC,EAAe,KAEfzD,EAAU,EAEV8F,GAAU,EAEVC,GAAU,EAEVC,GAAW,EAEXC,GAAW,EACRjG,EAAUtB,EAAMh/F,QA15BR,GA25BTg/F,EAAMsB,GAAS,IACbtB,EAAMsB,GAAS,GAAGtgG,OAASjC,KAAK6/F,gBAC/B0I,GAAYC,IAEf1C,EAAWC,KAAsBxD,EACjC8F,EAAUE,EACVD,EAAUE,EACVxC,EAAe/E,EAAMsB,GAAS,KAG9BwD,EAAmB,EACnBC,EAAe,MAEjBuC,EAAWC,GAAW,IAElBvH,EAAMsB,GAAS,IAAMpC,EACvBqI,GAAW,EAEXD,GAAW,EAUTvC,IAAkBqC,GAAWC,GAAWC,GAAYC,GACjCxC,EAAa/jG,OAASjC,KAAK6/F,cAAgB,GAC3CwI,EAAUC,EAAUC,EAAWC,GAAa,KAEjEvH,EAAMjzF,OAAO83F,EAAWC,EAAmB,GAAI,EAClC,CAAC5F,EAAa6F,IAE3B/E,EAAM6E,EAAWC,EAAmB,GAAK,GAAG,GA/7BlC,EAg8BVA,IACAC,EAAe,KACXqC,GAAWC,GAEbC,EAAWC,GAAW,EACtBzC,EAAmB,IAGnBxD,IADAwD,EAC6B,EACzBD,EAAWC,EAAmB,IAAM,EACxCwC,EAAWC,GAAW,GAExBhlB,GAAU,IAGd+e,IAGE/e,GACFxjF,KAAKmhG,kBAAkBF,IAU3BtB,EAAiBh/F,UAAUwgG,kBAAoB,SAASF,GACtDA,EAAM79F,KAAK,CA79BI,EA69BS,KAOxB,IANA,IAKIw9F,EALA2B,EAAU,EACVC,EAAe,EACfC,EAAe,EACfC,EAAc,GACdC,EAAc,GAEXJ,EAAUtB,EAAMh/F,QACrB,OAAQg/F,EAAMsB,GAAS,IACrB,KAv+BY,EAw+BVE,IACAE,GAAe1B,EAAMsB,GAAS,GAC9BA,IACA,MACF,KAAKpC,EACHqC,IACAE,GAAezB,EAAMsB,GAAS,GAC9BA,IACA,MACF,KAh/BW,EAk/BLC,EAAeC,EAAe,GACX,IAAjBD,GAAuC,IAAjBC,IAGH,KADrB7B,EAAe5gG,KAAK6gG,kBAAkB8B,EAAaD,MAE5CH,EAAUC,EAAeC,EAAgB,GAv/B3C,GAw/BCxB,EAAMsB,EAAUC,EAAeC,EAAe,GAAG,GAEnDxB,EAAMsB,EAAUC,EAAeC,EAAe,GAAG,IAC7CE,EAAYp1D,UAAU,EAAGqzD,IAE7BK,EAAMjzF,OAAO,EAAG,EAAG,CA7/BlB,EA8/BmB20F,EAAYp1D,UAAU,EAAGqzD,KAC7C2B,KAEFI,EAAcA,EAAYp1D,UAAUqzD,GACpC8B,EAAcA,EAAYn1D,UAAUqzD,IAIjB,KADrBA,EAAe5gG,KAAK+gG,kBAAkB4B,EAAaD,MAEjDzB,EAAMsB,GAAS,GAAKI,EAAYp1D,UAAUo1D,EAAY1gG,OAClD2+F,GAAgBK,EAAMsB,GAAS,GACnCI,EAAcA,EAAYp1D,UAAU,EAAGo1D,EAAY1gG,OAC/C2+F,GACJ8B,EAAcA,EAAYn1D,UAAU,EAAGm1D,EAAYzgG,OAC/C2+F,KAIa,IAAjB4B,EACFvB,EAAMjzF,OAAOu0F,EAAUE,EACnBD,EAAeC,EAAc,CAnhC3B,EAmhCyCE,IACrB,IAAjBF,EACTxB,EAAMjzF,OAAOu0F,EAAUC,EACnBA,EAAeC,EAAc,CAACtC,EAAauC,IAE/CzB,EAAMjzF,OAAOu0F,EAAUC,EAAeC,EAClCD,EAAeC,EAAc,CAACtC,EAAauC,GAC3C,CA1hCE,EA0hCYC,IAEpBJ,EAAUA,EAAUC,EAAeC,GACxBD,EAAe,EAAI,IAAMC,EAAe,EAAI,GAAK,GACvC,IAAZF,GA7hCF,GA6hCmBtB,EAAMsB,EAAU,GAAG,IAE7CtB,EAAMsB,EAAU,GAAG,IAAMtB,EAAMsB,GAAS,GACxCtB,EAAMjzF,OAAOu0F,EAAS,IAEtBA,IAEFE,EAAe,EACfD,EAAe,EACfE,EAAc,GACdC,EAAc,GAIe,KAA/B1B,EAAMA,EAAMh/F,OAAS,GAAG,IAC1Bg/F,EAAMvhE,MAMR,IAAI8jD,GAAU,EAGd,IAFA+e,EAAU,EAEHA,EAAUtB,EAAMh/F,OAAS,GArjCjB,GAsjCTg/F,EAAMsB,EAAU,GAAG,IAtjCV,GAujCTtB,EAAMsB,EAAU,GAAG,KAEjBtB,EAAMsB,GAAS,GAAGh1D,UAAU0zD,EAAMsB,GAAS,GAAGtgG,OAC9Cg/F,EAAMsB,EAAU,GAAG,GAAGtgG,SAAWg/F,EAAMsB,EAAU,GAAG,IAEtDtB,EAAMsB,GAAS,GAAKtB,EAAMsB,EAAU,GAAG,GACnCtB,EAAMsB,GAAS,GAAGh1D,UAAU,EAAG0zD,EAAMsB,GAAS,GAAGtgG,OACrBg/F,EAAMsB,EAAU,GAAG,GAAGtgG,QACtDg/F,EAAMsB,EAAU,GAAG,GAAKtB,EAAMsB,EAAU,GAAG,GAAKtB,EAAMsB,EAAU,GAAG,GACnEtB,EAAMjzF,OAAOu0F,EAAU,EAAG,GAC1B/e,GAAU,GACDyd,EAAMsB,GAAS,GAAGh1D,UAAU,EAAG0zD,EAAMsB,EAAU,GAAG,GAAGtgG,SAC5Dg/F,EAAMsB,EAAU,GAAG,KAErBtB,EAAMsB,EAAU,GAAG,IAAMtB,EAAMsB,EAAU,GAAG,GAC5CtB,EAAMsB,GAAS,GACXtB,EAAMsB,GAAS,GAAGh1D,UAAU0zD,EAAMsB,EAAU,GAAG,GAAGtgG,QAClDg/F,EAAMsB,EAAU,GAAG,GACvBtB,EAAMjzF,OAAOu0F,EAAU,EAAG,GAC1B/e,GAAU,IAGd+e,IAGE/e,GACFxjF,KAAKmhG,kBAAkBF,IAa3BtB,EAAiBh/F,UAAU8nG,YAAc,SAASxH,EAAOyH,GACvD,IAII3vF,EAJAmpF,EAAS,EACTC,EAAS,EACTwG,EAAc,EACdC,EAAc,EAElB,IAAK7vF,EAAI,EAAGA,EAAIkoF,EAAMh/F,SArmCN,IAsmCVg/F,EAAMloF,GAAG,KACXmpF,GAAUjB,EAAMloF,GAAG,GAAG9W,QAEpBg/F,EAAMloF,GAAG,KAAOonF,IAClBgC,GAAUlB,EAAMloF,GAAG,GAAG9W,UAEpBigG,EAASwG,IAPe3vF,IAU5B4vF,EAAczG,EACd0G,EAAczG,EAGhB,OAAIlB,EAAMh/F,QAAU8W,GAAKkoF,EAAMloF,GAAG,KAAOonF,EAChCyI,EAGFA,GAAeF,EAAMC,IAS9BhJ,EAAiBh/F,UAAUkoG,gBAAkB,SAAS5H,GAMpD,IALA,IAAIpuE,EAAO,GACPi2E,EAAc,KACdC,EAAa,KACbC,EAAa,KACbC,EAAe,MACVlwF,EAAI,EAAGA,EAAIkoF,EAAMh/F,OAAQ8W,IAAK,CACrC,IAAImwF,EAAKjI,EAAMloF,GAAG,GAEdjW,EADOm+F,EAAMloF,GAAG,GACJrQ,QAAQogG,EAAa,SAASpgG,QAAQqgG,EAAY,QAC7DrgG,QAAQsgG,EAAY,QAAQtgG,QAAQugG,EAAc,cACvD,OAAQC,GACN,KA5oCY,EA6oCVr2E,EAAK9Z,GAAK,oCAAsCjW,EAAO,SACvD,MACF,KAAKq9F,EACHttE,EAAK9Z,GAAK,oCAAsCjW,EAAO,SACvD,MACF,KAjpCW,EAkpCT+vB,EAAK9Z,GAAK,SAAWjW,EAAO,WAIlC,OAAO+vB,EAAKrqB,KAAK,KASnBm3F,EAAiBh/F,UAAUwoG,WAAa,SAASlI,GAE/C,IADA,IAAIn+F,EAAO,GACFiW,EAAI,EAAGA,EAAIkoF,EAAMh/F,OAAQ8W,IAlqClB,IAmqCVkoF,EAAMloF,GAAG,KACXjW,EAAKiW,GAAKkoF,EAAMloF,GAAG,IAGvB,OAAOjW,EAAK0F,KAAK,KASnBm3F,EAAiBh/F,UAAUyoG,WAAa,SAASnI,GAE/C,IADA,IAAIn+F,EAAO,GACFiW,EAAI,EAAGA,EAAIkoF,EAAMh/F,OAAQ8W,IAC5BkoF,EAAMloF,GAAG,KAAOonF,IAClBr9F,EAAKiW,GAAKkoF,EAAMloF,GAAG,IAGvB,OAAOjW,EAAK0F,KAAK,KAUnBm3F,EAAiBh/F,UAAU0oG,iBAAmB,SAASpI,GAIrD,IAHA,IAAIqI,EAAc,EACdC,EAAa,EACbC,EAAY,EACPzwF,EAAI,EAAGA,EAAIkoF,EAAMh/F,OAAQ8W,IAAK,CACrC,IAAImwF,EAAKjI,EAAMloF,GAAG,GACd6F,EAAOqiF,EAAMloF,GAAG,GACpB,OAAQmwF,GACN,KAzsCY,EA0sCVK,GAAc3qF,EAAK3c,OACnB,MACF,KAAKk+F,EACHqJ,GAAa5qF,EAAK3c,OAClB,MACF,KA9sCW,EAgtCTqnG,GAAex4F,KAAKgR,IAAIynF,EAAYC,GACpCD,EAAa,EACbC,EAAY,GAKlB,OADAF,GAAex4F,KAAKgR,IAAIynF,EAAYC,IAatC7J,EAAiBh/F,UAAU8oG,aAAe,SAASxI,GAEjD,IADA,IAAIn+F,EAAO,GACFiW,EAAI,EAAGA,EAAIkoF,EAAMh/F,OAAQ8W,IAChC,OAAQkoF,EAAMloF,GAAG,IACf,KAxuCY,EAyuCVjW,EAAKiW,GAAK,IAAM2wF,UAAUzI,EAAMloF,GAAG,IACnC,MACF,KAAKonF,EACHr9F,EAAKiW,GAAK,IAAMkoF,EAAMloF,GAAG,GAAG9W,OAC5B,MACF,KA7uCW,EA8uCTa,EAAKiW,GAAK,IAAMkoF,EAAMloF,GAAG,GAAG9W,OAIlC,OAAOa,EAAK0F,KAAK,MAAME,QAAQ,OAAQ,MAYzCi3F,EAAiBh/F,UAAUgpG,eAAiB,SAAStJ,EAAO3zD,GAK1D,IAJA,IAAIu0D,EAAQ,GACR2I,EAAc,EACdrH,EAAU,EACVnqD,EAAS1L,EAAM1pC,MAAM,OAChB+V,EAAI,EAAGA,EAAIq/B,EAAOn2C,OAAQ8W,IAAK,CAGtC,IAAIsqC,EAAQjL,EAAOr/B,GAAGw0B,UAAU,GAChC,OAAQ6K,EAAOr/B,GAAGzQ,OAAO,IACvB,IAAK,IACH,IACE24F,EAAM2I,KAAiB,CA3wCf,EA2wC6BC,UAAUxmD,IAC/C,MAAOwsC,GAEP,MAAM,IAAItsF,MAAM,qCAAuC8/C,GAEzD,MACF,IAAK,IAEL,IAAK,IACH,IAAI32C,EAAI6L,SAAS8qC,EAAO,IACxB,GAAImT,MAAM9pD,IAAMA,EAAI,EAClB,MAAM,IAAInJ,MAAM,qCAAuC8/C,GAEzD,IAAIvgD,EAAOu9F,EAAM9yD,UAAUg1D,EAASA,GAAW71F,GACpB,KAAvB0rC,EAAOr/B,GAAGzQ,OAAO,GACnB24F,EAAM2I,KAAiB,CAzxChB,EAyxC6B9mG,GAEpCm+F,EAAM2I,KAAiB,CAACzJ,EAAar9F,GAEvC,MACF,QAGE,GAAIs1C,EAAOr/B,GACT,MAAM,IAAIxV,MAAM,6CACA60C,EAAOr/B,KAI/B,GAAIwpF,GAAWlC,EAAMp+F,OACnB,MAAM,IAAIsB,MAAM,iBAAmBg/F,EAC/B,wCAA0ClC,EAAMp+F,OAAS,MAE/D,OAAOg/F,GAcTtB,EAAiBh/F,UAAUmpG,WAAa,SAAShnG,EAAMoiG,EAASwD,GAE9D,GAAY,MAAR5lG,GAA2B,MAAXoiG,GAA0B,MAAPwD,EACrC,MAAM,IAAInlG,MAAM,4BAIlB,OADAmlG,EAAM53F,KAAKgR,IAAI,EAAGhR,KAAKic,IAAI27E,EAAK5lG,EAAKb,SACjCa,GAAQoiG,EAEH,EACGpiG,EAAKb,OAGNa,EAAKyqC,UAAUm7D,EAAKA,EAAMxD,EAAQjjG,SAAWijG,EAE/CwD,EAGA1oG,KAAK+pG,aAAajnG,EAAMoiG,EAASwD,IANhC,GAoBZ/I,EAAiBh/F,UAAUopG,aAAe,SAASjnG,EAAMoiG,EAASwD,GAChE,GAAIxD,EAAQjjG,OAASjC,KAAKkgG,cACxB,MAAM,IAAI38F,MAAM,sCAIlB,IAAI86B,EAAIr+B,KAAKgqG,gBAAgB9E,GAEzBpjG,EAAM9B,KAUV,SAASiqG,EAAkBrwF,EAAGb,GAC5B,IAAImxF,EAAWtwF,EAAIsrF,EAAQjjG,OACvBkoG,EAAYr5F,KAAKiM,IAAI2rF,EAAM3vF,GAC/B,OAAKjX,EAAIi+F,eAIFmK,EAAYC,EAAYroG,EAAIi+F,eAF1BoK,EAAY,EAAMD,EAM7B,IAAIE,EAAkBpqG,KAAK8/F,gBAEvBuK,EAAWvnG,EAAKsF,QAAQ88F,EAASwD,IACpB,GAAb2B,IACFD,EAAkBt5F,KAAKic,IAAIk9E,EAAkB,EAAGI,GAAWD,IAG1C,IADjBC,EAAWvnG,EAAKwnG,YAAYpF,EAASwD,EAAMxD,EAAQjjG,WAEjDmoG,EACIt5F,KAAKic,IAAIk9E,EAAkB,EAAGI,GAAWD,KAKjD,IAGIG,EAASC,EAHTC,EAAY,GAAMvF,EAAQjjG,OAAS,EACvCooG,GAAY,EAKZ,IAFA,IACIK,EADAC,EAAUzF,EAAQjjG,OAASa,EAAKb,OAE3BhC,EAAI,EAAGA,EAAIilG,EAAQjjG,OAAQhC,IAAK,CAMvC,IAFAsqG,EAAU,EACVC,EAAUG,EACHJ,EAAUC,GACXP,EAAkBhqG,EAAGyoG,EAAM8B,IAAYJ,EACzCG,EAAUC,EAEVG,EAAUH,EAEZA,EAAU15F,KAAKkxC,OAAO2oD,EAAUJ,GAAW,EAAIA,GAGjDI,EAAUH,EACV,IAAI1qF,EAAQhP,KAAKgR,IAAI,EAAG4mF,EAAM8B,EAAU,GACpCI,EAAS95F,KAAKic,IAAI27E,EAAM8B,EAAS1nG,EAAKb,QAAUijG,EAAQjjG,OAExD4oG,EAAKvqG,MAAMsqG,EAAS,GACxBC,EAAGD,EAAS,IAAM,GAAK3qG,GAAK,EAC5B,IAAK,IAAIsjC,EAAIqnE,EAAQrnE,GAAKzjB,EAAOyjB,IAAK,CAGpC,IAAIunE,EAAYzsE,EAAEv7B,EAAKwF,OAAOi7B,EAAI,IAQlC,GANEsnE,EAAGtnE,GADK,IAANtjC,GACQ4qG,EAAGtnE,EAAI,IAAM,EAAK,GAAKunE,GAEtBD,EAAGtnE,EAAI,IAAM,EAAK,GAAKunE,GACvBJ,EAAQnnE,EAAI,GAAKmnE,EAAQnnE,KAAO,EAAK,EACxCmnE,EAAQnnE,EAAI,GAElBsnE,EAAGtnE,GAAKknE,EAAW,CACrB,IAAI7mD,EAAQqmD,EAAkBhqG,EAAGsjC,EAAI,GAGrC,GAAIqgB,GAASwmD,EAAiB,CAI5B,GAFAA,EAAkBxmD,KAClBymD,EAAW9mE,EAAI,GACAmlE,GAKb,MAHA5oF,EAAQhP,KAAKgR,IAAI,EAAG,EAAI4mF,EAAM2B,KAStC,GAAIJ,EAAkBhqG,EAAI,EAAGyoG,GAAO0B,EAClC,MAEFM,EAAUG,EAEZ,OAAOR,GAUT1K,EAAiBh/F,UAAUqpG,gBAAkB,SAAS9E,GAEpD,IADA,IAAI7mE,EAAI,GACC36B,EAAI,EAAGA,EAAIwhG,EAAQjjG,OAAQyB,IAClC26B,EAAE6mE,EAAQ58F,OAAO5E,IAAM,EAEzB,IAASA,EAAI,EAAGA,EAAIwhG,EAAQjjG,OAAQyB,IAClC26B,EAAE6mE,EAAQ58F,OAAO5E,KAAO,GAAMwhG,EAAQjjG,OAASyB,EAAI,EAErD,OAAO26B,GAcTshE,EAAiBh/F,UAAUoqG,kBAAoB,SAASC,EAAOloG,GAC7D,GAAmB,GAAfA,EAAKb,OAAT,CAQA,IALA,IAAIijG,EAAUpiG,EAAKyqC,UAAUy9D,EAAMC,OAAQD,EAAMC,OAASD,EAAME,SAC5DzwB,EAAU,EAIP33E,EAAKsF,QAAQ88F,IAAYpiG,EAAKwnG,YAAYpF,IAC1CA,EAAQjjG,OAASjC,KAAKkgG,cAAgBlgG,KAAKigG,aAC3CjgG,KAAKigG,cACVxlB,GAAWz6E,KAAKigG,aAChBiF,EAAUpiG,EAAKyqC,UAAUy9D,EAAMC,OAASxwB,EACfuwB,EAAMC,OAASD,EAAME,QAAUzwB,GAG1DA,GAAWz6E,KAAKigG,aAGhB,IAAI1mD,EAASz2C,EAAKyqC,UAAUy9D,EAAMC,OAASxwB,EAASuwB,EAAMC,QACtD1xD,GACFyxD,EAAM/J,MAAM9nD,QAAQ,CAx/CP,EAw/CoBI,IAGnC,IAAI5X,EAAS7+B,EAAKyqC,UAAUy9D,EAAMC,OAASD,EAAME,QACrBF,EAAMC,OAASD,EAAME,QAAUzwB,GACvD94C,GACFqpE,EAAM/J,MAAM79F,KAAK,CA9/CJ,EA8/CiBu+B,IAIhCqpE,EAAMG,QAAU5xD,EAAOt3C,OACvB+oG,EAAMC,QAAU1xD,EAAOt3C,OAEvB+oG,EAAME,SAAW3xD,EAAOt3C,OAAS0/B,EAAO1/B,OACxC+oG,EAAMI,SAAW7xD,EAAOt3C,OAAS0/B,EAAO1/B,SA0B1C09F,EAAiBh/F,UAAU0qG,WAAa,SAAS5oF,EAAG6oF,EAAOC,GACzD,IAAIlL,EAAOY,EACX,GAAgB,iBAALx+E,GAAiC,iBAAT6oF,QACf,IAATC,EAGTlL,EAA6B,GAC7BY,EAAQjhG,KAAKkC,UAAUm+F,EAA4B,GAAS,IAClDp+F,OAAS,IACjBjC,KAAKmC,qBAAqB8+F,GAC1BjhG,KAAKooG,uBAAuBnH,SAEzB,GAAIx+E,GAAiB,iBAALA,QAAiC,IAAT6oF,QAC3B,IAATC,EAGTtK,EAAsD,EACtDZ,EAAQrgG,KAAKmpG,WAAWlI,QACnB,GAAgB,iBAALx+E,GAAiB6oF,GAAyB,iBAATA,QAC/B,IAATC,EAETlL,EAA6B,EAC7BY,EAAsD,MACjD,IAAgB,iBAALx+E,GAAiC,iBAAT6oF,IACtCC,GAAyB,iBAATA,EAMlB,MAAM,IAAIhoG,MAAM,sCAHhB88F,EAA6B,EAC7BY,EAAsD,EAKxD,GAAqB,IAAjBA,EAAMh/F,OACR,MAAO,GAYT,IAVA,IAAIupG,EAAU,GACVR,EAAQ,IAAIrL,EAAiB8L,UAC7BC,EAAkB,EAClBC,EAAc,EACdC,EAAc,EAIdC,EAAgBxL,EAChByL,EAAiBzL,EACZtnF,EAAI,EAAGA,EAAIkoF,EAAMh/F,OAAQ8W,IAAK,CACrC,IAAIgzF,EAAY9K,EAAMloF,GAAG,GACrBizF,EAAY/K,EAAMloF,GAAG,GAQzB,OANK2yF,GAllDQ,IAklDWK,IAEtBf,EAAMG,OAASQ,EACfX,EAAMC,OAASW,GAGTG,GACN,KA1lDY,EA2lDVf,EAAM/J,MAAMyK,KAAqBzK,EAAMloF,GACvCiyF,EAAMI,SAAWY,EAAU/pG,OAC3B6pG,EAAiBA,EAAev+D,UAAU,EAAGq+D,GAAeI,EAC3CF,EAAev+D,UAAUq+D,GAC1C,MACF,KAAKzL,EACH6K,EAAME,SAAWc,EAAU/pG,OAC3B+oG,EAAM/J,MAAMyK,KAAqBzK,EAAMloF,GACvC+yF,EAAiBA,EAAev+D,UAAU,EAAGq+D,GAC5BE,EAAev+D,UAAUq+D,EACrBI,EAAU/pG,QAC/B,MACF,KAtmDW,EAumDL+pG,EAAU/pG,QAAU,EAAIjC,KAAKigG,cAC7ByL,GAAmBzK,EAAMh/F,QAAU8W,EAAI,GAEzCiyF,EAAM/J,MAAMyK,KAAqBzK,EAAMloF,GACvCiyF,EAAME,SAAWc,EAAU/pG,OAC3B+oG,EAAMI,SAAWY,EAAU/pG,QAClB+pG,EAAU/pG,QAAU,EAAIjC,KAAKigG,cAElCyL,IACF1rG,KAAK+qG,kBAAkBC,EAAOa,GAC9BL,EAAQpoG,KAAK4nG,GACbA,EAAQ,IAAIrL,EAAiB8L,UAC7BC,EAAkB,EAKlBG,EAAgBC,EAChBH,EAAcC,GA1nDR,IAioDVG,IACFJ,GAAeK,EAAU/pG,QAEvB8pG,IAAc5L,IAChByL,GAAeI,EAAU/pG,QAS7B,OALIypG,IACF1rG,KAAK+qG,kBAAkBC,EAAOa,GAC9BL,EAAQpoG,KAAK4nG,IAGRQ,GAST7L,EAAiBh/F,UAAUsrG,eAAiB,SAAST,GAGnD,IADA,IAAIU,EAAc,GACTnzF,EAAI,EAAGA,EAAIyyF,EAAQvpG,OAAQ8W,IAAK,CACvC,IAAIiyF,EAAQQ,EAAQzyF,GAChBozF,EAAY,IAAIxM,EAAiB8L,UACrCU,EAAUlL,MAAQ,GAClB,IAAK,IAAIlxE,EAAI,EAAGA,EAAIi7E,EAAM/J,MAAMh/F,OAAQ8tB,IACtCo8E,EAAUlL,MAAMlxE,GAAKi7E,EAAM/J,MAAMlxE,GAAGxnB,QAEtC4jG,EAAUhB,OAASH,EAAMG,OACzBgB,EAAUlB,OAASD,EAAMC,OACzBkB,EAAUjB,QAAUF,EAAME,QAC1BiB,EAAUf,QAAUJ,EAAMI,QAC1Bc,EAAYnzF,GAAKozF,EAEnB,OAAOD,GAYTvM,EAAiBh/F,UAAUyrG,YAAc,SAASZ,EAAS1oG,GACzD,GAAsB,GAAlB0oG,EAAQvpG,OACV,MAAO,CAACa,EAAM,IAIhB0oG,EAAUxrG,KAAKisG,eAAeT,GAE9B,IAAIa,EAAcrsG,KAAKssG,iBAAiBd,GACxC1oG,EAAOupG,EAAcvpG,EAAOupG,EAE5BrsG,KAAKusG,eAAef,GAOpB,IAFA,IAAI9+D,EAAQ,EACR8/D,EAAU,GACLzzF,EAAI,EAAGA,EAAIyyF,EAAQvpG,OAAQ8W,IAAK,CACvC,IAEI0zF,EA4BEnM,EA9BFoM,EAAelB,EAAQzyF,GAAGkyF,OAASv+D,EACnC2zD,EAAQrgG,KAAKmpG,WAAWqC,EAAQzyF,GAAGkoF,OAEnC0L,GAAW,EAkBf,GAjBItM,EAAMp+F,OAASjC,KAAKkgG,eAKJ,IAFlBuM,EAAYzsG,KAAK8pG,WAAWhnG,EAAMu9F,EAAM9yD,UAAU,EAAGvtC,KAAKkgG,eAC9BwM,OAKV,IAHhBC,EAAU3sG,KAAK8pG,WAAWhnG,EACtBu9F,EAAM9yD,UAAU8yD,EAAMp+F,OAASjC,KAAKkgG,eACpCwM,EAAerM,EAAMp+F,OAASjC,KAAKkgG,iBAClBuM,GAAaE,KAEhCF,GAAa,GAIjBA,EAAYzsG,KAAK8pG,WAAWhnG,EAAMu9F,EAAOqM,IAEzB,GAAdD,EAEFD,EAAQzzF,IAAK,EAEb2zB,GAAS8+D,EAAQzyF,GAAGqyF,QAAUI,EAAQzyF,GAAGmyF,aAWzC,GARAsB,EAAQzzF,IAAK,EACb2zB,EAAQ+/D,EAAYC,EAOhBrM,IAJFC,GADc,GAAZqM,EACM7pG,EAAKyqC,UAAUk/D,EAAWA,EAAYpM,EAAMp+F,QAE5Ca,EAAKyqC,UAAUk/D,EAAWE,EAAU3sG,KAAKkgG,gBAIjDp9F,EAAOA,EAAKyqC,UAAU,EAAGk/D,GAClBzsG,KAAKopG,WAAWoC,EAAQzyF,GAAGkoF,OAC3Bn+F,EAAKyqC,UAAUk/D,EAAYpM,EAAMp+F,YACnC,CAGL,IAAIg/F,EAAQjhG,KAAKkC,UAAUm+F,EAAOC,GAAO,GACzC,GAAID,EAAMp+F,OAASjC,KAAKkgG,eACpBlgG,KAAKqpG,iBAAiBpI,GAASZ,EAAMp+F,OACrCjC,KAAKggG,sBAEPwM,EAAQzzF,IAAK,MACR,CACL/Y,KAAKqmG,6BAA6BpF,GAGlC,IAFA,IACI2L,EADAC,EAAS,EAEJ98E,EAAI,EAAGA,EAAIy7E,EAAQzyF,GAAGkoF,MAAMh/F,OAAQ8tB,IAAK,CAChD,IAAIpnB,EAAM6iG,EAAQzyF,GAAGkoF,MAAMlxE,GA5vDtB,IA6vDDpnB,EAAI,KACNikG,EAAS5sG,KAAKyoG,YAAYxH,EAAO4L,IA/vD7B,IAiwDFlkG,EAAI,GACN7F,EAAOA,EAAKyqC,UAAU,EAAGk/D,EAAYG,GAAUjkG,EAAI,GAC5C7F,EAAKyqC,UAAUk/D,EAAYG,GACzBjkG,EAAI,KAAOw3F,IACpBr9F,EAAOA,EAAKyqC,UAAU,EAAGk/D,EAAYG,GAC9B9pG,EAAKyqC,UAAUk/D,EAAYzsG,KAAKyoG,YAAYxH,EACxC4L,EAASlkG,EAAI,GAAG1G,UAEzB0G,EAAI,KAAOw3F,IACb0M,GAAUlkG,EAAI,GAAG1G,WAS7B,MAAO,CADPa,EAAOA,EAAKyqC,UAAU8+D,EAAYpqG,OAAQa,EAAKb,OAASoqG,EAAYpqG,QACtDuqG,IAUhB7M,EAAiBh/F,UAAU2rG,iBAAmB,SAASd,GAGrD,IAFA,IAAIsB,EAAgB9sG,KAAKigG,aACrBoM,EAAc,GACTtzF,EAAI,EAAGA,GAAK+zF,EAAe/zF,IAClCszF,GAAelzF,OAAOC,aAAaL,GAIrC,IAASA,EAAI,EAAGA,EAAIyyF,EAAQvpG,OAAQ8W,IAClCyyF,EAAQzyF,GAAGoyF,QAAU2B,EACrBtB,EAAQzyF,GAAGkyF,QAAU6B,EAIvB,IAAI9B,EAAQQ,EAAQ,GAChBvK,EAAQ+J,EAAM/J,MAClB,GAAoB,GAAhBA,EAAMh/F,QA5yDK,GA4yDUg/F,EAAM,GAAG,GAEhCA,EAAM9nD,QAAQ,CA9yDD,EA8yDckzD,IAC3BrB,EAAMG,QAAU2B,EAChB9B,EAAMC,QAAU6B,EAChB9B,EAAME,SAAW4B,EACjB9B,EAAMI,SAAW0B,OACZ,GAAIA,EAAgB7L,EAAM,GAAG,GAAGh/F,OAAQ,CAE7C,IAAI66E,EAAcgwB,EAAgB7L,EAAM,GAAG,GAAGh/F,OAC9Cg/F,EAAM,GAAG,GAAKoL,EAAY9+D,UAAU0zD,EAAM,GAAG,GAAGh/F,QAAUg/F,EAAM,GAAG,GACnE+J,EAAMG,QAAUruB,EAChBkuB,EAAMC,QAAUnuB,EAChBkuB,EAAME,SAAWpuB,EACjBkuB,EAAMI,SAAWtuB,EAMnB,GAAoB,IADpBmkB,GADA+J,EAAQQ,EAAQA,EAAQvpG,OAAS,IACnBg/F,OACJh/F,QAh0DK,GAg0DUg/F,EAAMA,EAAMh/F,OAAS,GAAG,GAE/Cg/F,EAAM79F,KAAK,CAl0DE,EAk0DWipG,IACxBrB,EAAME,SAAW4B,EACjB9B,EAAMI,SAAW0B,OACZ,GAAIA,EAAgB7L,EAAMA,EAAMh/F,OAAS,GAAG,GAAGA,OAAQ,CAExD66E,EAAcgwB,EAAgB7L,EAAMA,EAAMh/F,OAAS,GAAG,GAAGA,OAC7Dg/F,EAAMA,EAAMh/F,OAAS,GAAG,IAAMoqG,EAAY9+D,UAAU,EAAGuvC,GACvDkuB,EAAME,SAAWpuB,EACjBkuB,EAAMI,SAAWtuB,EAGnB,OAAOuvB,GAUT1M,EAAiBh/F,UAAU4rG,eAAiB,SAASf,GAEnD,IADA,IAAIuB,EAAa/sG,KAAKkgG,cACbnnF,EAAI,EAAGA,EAAIyyF,EAAQvpG,OAAQ8W,IAClC,KAAIyyF,EAAQzyF,GAAGmyF,SAAW6B,GAA1B,CAGA,IAAIC,EAAWxB,EAAQzyF,GAEvByyF,EAAQx9F,OAAO+K,IAAK,GAIpB,IAHA,IAAIoyF,EAAS6B,EAAS7B,OAClBF,EAAS+B,EAAS/B,OAClBgC,EAAa,GACgB,IAA1BD,EAAS/L,MAAMh/F,QAAc,CAElC,IAAI+oG,EAAQ,IAAIrL,EAAiB8L,UAC7ByB,GAAQ,EAOZ,IANAlC,EAAMG,OAASA,EAAS8B,EAAWhrG,OACnC+oG,EAAMC,OAASA,EAASgC,EAAWhrG,OAChB,KAAfgrG,IACFjC,EAAME,QAAUF,EAAMI,QAAU6B,EAAWhrG,OAC3C+oG,EAAM/J,MAAM79F,KAAK,CA32DR,EA22DqB6pG,KAEC,IAA1BD,EAAS/L,MAAMh/F,QACf+oG,EAAME,QAAU6B,EAAa/sG,KAAKigG,cAAc,CACrD,IAAI8L,EAAYiB,EAAS/L,MAAM,GAAG,GAC9B+K,EAAYgB,EAAS/L,MAAM,GAAG,GAj3DxB,IAk3DN8K,GAEFf,EAAMI,SAAWY,EAAU/pG,OAC3BgpG,GAAUe,EAAU/pG,OACpB+oG,EAAM/J,MAAM79F,KAAK4pG,EAAS/L,MAAMrzE,SAChCs/E,GAAQ,GACCnB,IAAc5L,GAAqC,GAAtB6K,EAAM/J,MAAMh/F,QAv3D3C,GAw3DE+oG,EAAM/J,MAAM,GAAG,IACf+K,EAAU/pG,OAAS,EAAI8qG,GAEhC/B,EAAME,SAAWc,EAAU/pG,OAC3BkpG,GAAUa,EAAU/pG,OACpBirG,GAAQ,EACRlC,EAAM/J,MAAM79F,KAAK,CAAC2oG,EAAWC,IAC7BgB,EAAS/L,MAAMrzE,UAGfo+E,EAAYA,EAAUz+D,UAAU,EAC5Bw/D,EAAa/B,EAAME,QAAUlrG,KAAKigG,cACtC+K,EAAME,SAAWc,EAAU/pG,OAC3BkpG,GAAUa,EAAU/pG,OAr4Db,IAs4DH8pG,GACFf,EAAMI,SAAWY,EAAU/pG,OAC3BgpG,GAAUe,EAAU/pG,QAEpBirG,GAAQ,EAEVlC,EAAM/J,MAAM79F,KAAK,CAAC2oG,EAAWC,IACzBA,GAAagB,EAAS/L,MAAM,GAAG,GACjC+L,EAAS/L,MAAMrzE,QAEfo/E,EAAS/L,MAAM,GAAG,GACd+L,EAAS/L,MAAM,GAAG,GAAG1zD,UAAUy+D,EAAU/pG,SAMnDgrG,GADAA,EAAajtG,KAAKopG,WAAW4B,EAAM/J,QAEpB1zD,UAAU0/D,EAAWhrG,OAASjC,KAAKigG,cAElD,IAAIkN,EAAcntG,KAAKmpG,WAAW6D,EAAS/L,OACpB1zD,UAAU,EAAGvtC,KAAKigG,cACrB,KAAhBkN,IACFnC,EAAME,SAAWiC,EAAYlrG,OAC7B+oG,EAAMI,SAAW+B,EAAYlrG,OACF,IAAvB+oG,EAAM/J,MAAMh/F,QA/5DP,IAg6DL+oG,EAAM/J,MAAM+J,EAAM/J,MAAMh/F,OAAS,GAAG,GACtC+oG,EAAM/J,MAAM+J,EAAM/J,MAAMh/F,OAAS,GAAG,IAAMkrG,EAE1CnC,EAAM/J,MAAM79F,KAAK,CAn6DV,EAm6DuB+pG,KAG7BD,GACH1B,EAAQx9F,SAAS+K,EAAG,EAAGiyF,MAY/BrL,EAAiBh/F,UAAUysG,aAAe,SAAS5B,GAEjD,IADA,IAAI1oG,EAAO,GACFiW,EAAI,EAAGA,EAAIyyF,EAAQvpG,OAAQ8W,IAClCjW,EAAKiW,GAAKyyF,EAAQzyF,GAEpB,OAAOjW,EAAK0F,KAAK,KAUnBm3F,EAAiBh/F,UAAU0sG,eAAiB,SAASC,GACnD,IAAI9B,EAAU,GACd,IAAK8B,EACH,OAAO9B,EAKT,IAHA,IAAI1oG,EAAOwqG,EAAStqG,MAAM,MACtBuqG,EAAc,EACdC,EAAc,uCACXD,EAAczqG,EAAKb,QAAQ,CAChC,IAAIwhC,EAAI3gC,EAAKyqG,GAAa7iG,MAAM8iG,GAChC,IAAK/pE,EACH,MAAM,IAAIlgC,MAAM,yBAA2BT,EAAKyqG,IAElD,IAAIvC,EAAQ,IAAIrL,EAAiB8L,UAyBjC,IAxBAD,EAAQpoG,KAAK4nG,GACbA,EAAMG,OAAS5yF,SAASkrB,EAAE,GAAI,IACjB,KAATA,EAAE,IACJunE,EAAMG,SACNH,EAAME,QAAU,GACC,KAARznE,EAAE,GACXunE,EAAME,QAAU,GAEhBF,EAAMG,SACNH,EAAME,QAAU3yF,SAASkrB,EAAE,GAAI,KAGjCunE,EAAMC,OAAS1yF,SAASkrB,EAAE,GAAI,IACjB,KAATA,EAAE,IACJunE,EAAMC,SACND,EAAMI,QAAU,GACC,KAAR3nE,EAAE,GACXunE,EAAMI,QAAU,GAEhBJ,EAAMC,SACND,EAAMI,QAAU7yF,SAASkrB,EAAE,GAAI,KAEjC8pE,IAEOA,EAAczqG,EAAKb,QAAQ,CAChC,IAAIwrG,EAAO3qG,EAAKyqG,GAAajlG,OAAO,GACpC,IACE,IAAIggB,EAAOuhF,UAAU/mG,EAAKyqG,GAAahgE,UAAU,IACjD,MAAOsiD,GAEP,MAAM,IAAItsF,MAAM,qCAAuC+kB,GAEzD,GAAY,KAARmlF,EAEFzC,EAAM/J,MAAM79F,KAAK,CAAC+8F,EAAa73E,SAC1B,GAAY,KAARmlF,EAETzC,EAAM/J,MAAM79F,KAAK,CAt/DP,EAs/DqBklB,SAC1B,GAAY,KAARmlF,EAETzC,EAAM/J,MAAM79F,KAAK,CAx/DR,EAw/DqBklB,QACzB,IAAY,KAARmlF,EAET,MACK,GAAa,KAATA,EAIT,MAAM,IAAIlqG,MAAM,uBAAyBkqG,EAAO,SAAWnlF,GAE7DilF,KAGJ,OAAO/B,GAQT7L,EAAiB8L,UAAY,WAE3BzrG,KAAKihG,MAAQ,GAEbjhG,KAAKmrG,OAAS,KAEdnrG,KAAKirG,OAAS,KAEdjrG,KAAKkrG,QAAU,EAEflrG,KAAKorG,QAAU,GAUjBzL,EAAiB8L,UAAU9qG,UAAUiH,SAAW,WAmB9C,IAlBA,IAgBIshG,EADApmG,EAAO,CAAC,QAdS,IAAjB9C,KAAKkrG,QACGlrG,KAAKmrG,OAAS,KACC,GAAhBnrG,KAAKkrG,QACJlrG,KAAKmrG,OAAS,EAEbnrG,KAAKmrG,OAAS,EAAK,IAAMnrG,KAAKkrG,SASZ,MAPV,IAAjBlrG,KAAKorG,QACGprG,KAAKirG,OAAS,KACC,GAAhBjrG,KAAKorG,QACJprG,KAAKirG,OAAS,EAEbjrG,KAAKirG,OAAS,EAAK,IAAMjrG,KAAKorG,SAEK,SAGvCryF,EAAI,EAAGA,EAAI/Y,KAAKihG,MAAMh/F,OAAQ8W,IAAK,CAC1C,OAAQ/Y,KAAKihG,MAAMloF,GAAG,IACpB,KAvjEY,EAwjEVmwF,EAAK,IACL,MACF,KAAK/I,EACH+I,EAAK,IACL,MACF,KA5jEW,EA6jETA,EAAK,IAGTpmG,EAAKiW,EAAI,GAAKmwF,EAAKQ,UAAU1pG,KAAKihG,MAAMloF,GAAG,IAAM,KAEnD,OAAOjW,EAAK0F,KAAK,IAAIE,QAAQ,OAAQ,MAKvC9I,EAAOC,QAAU8/F,EACjB//F,EAAOC,QAA0B,iBAAI8/F,EACrC//F,EAAOC,QAAqB,YAAIsgG,EAChCvgG,EAAOC,QAAqB,YA3kEV,EA4kElBD,EAAOC,QAAoB,WA3kEV,G,+BClEjBD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,iCCA3CD,EAAOC,QAAU,IAA0B,uC,4CCC3C,IACQC,EADJC,EAAaC,MAAQA,KAAKD,YACtBD,EAAgB,SAAUG,EAAGC,GAI7B,OAHAJ,EAAgBK,OAAOC,gBAClB,CAAEC,UAAW,cAAgBC,OAAS,SAAUL,EAAGC,GAAKD,EAAEI,UAAYH,IACvE,SAAUD,EAAGC,GAAK,IAAK,IAAIK,KAAKL,EAAOA,EAAEM,eAAeD,KAAIN,EAAEM,GAAKL,EAAEK,MACpDN,EAAGC,IAErB,SAAUD,EAAGC,GAEhB,SAASO,IAAOT,KAAKU,YAAcT,EADnCH,EAAcG,EAAGC,GAEjBD,EAAEU,UAAkB,OAANT,EAAaC,OAAOS,OAAOV,IAAMO,EAAGE,UAAYT,EAAES,UAAW,IAAIF,KAGnFitG,EAAY1tG,MAAQA,KAAK0tG,UAAa,WAStC,OARAA,EAAWvtG,OAAOwtG,QAAU,SAASxmF,GACjC,IAAK,IAAIkX,EAAG36B,EAAI,EAAGgJ,EAAI7F,UAAU5E,OAAQyB,EAAIgJ,EAAGhJ,IAE5C,IAAK,IAAInD,KADT89B,EAAIx3B,UAAUnD,GACOvD,OAAOQ,UAAUH,eAAee,KAAK88B,EAAG99B,KACzD4mB,EAAE5mB,GAAK89B,EAAE99B,IAEjB,OAAO4mB,IAEKlgB,MAAMjH,KAAM6G,YAEhC1G,OAAOU,eAAehB,QAAS,aAAc,CAAEiB,OAAO,IACtD,IAAI8sG,EAAkB,EAAQ,YAC1B7kG,EAAM6kG,EAAgBrO,iBACtBsO,EAAe,EAAQ,YACvBC,EAAc,EAAQ,YACtB/sG,EAAY,EAAQ,YACpBC,EAAQ,EAAQ,YAChBkf,EAAU,EAAQ,YAClBwd,EAAM,EAAQ,YACdqwE,EAAgC,SAAU3sG,GAE1C,SAAS2sG,EAAe1sG,GACpB,IAAIC,EAAQF,EAAOG,KAAKvB,KAAMqB,IAAUrB,KAKxC,OAJA4tG,EAAgBtO,aAAa38F,SAAQ,SAAUugD,GAC3C5hD,EAAM4hD,GAAU5hD,EAAM4hD,GAAQxhD,KAAKJ,MAEvCA,EAAMm+F,SAAWmO,EAAgBnO,SAC1Bn+F,EAsXX,OA7XAvB,EAAUguG,EAAgB3sG,GAS1B2sG,EAAeptG,UAAUqtG,WAAa,SAAU5/F,GAE5C,IADA,IAAIvC,EAASuC,GAAQA,EAAK/E,WACnBwC,GAAQ,CACX,GAA0B,wBAAtBA,EAAOjE,WACP,OAAO,EAEXiE,EAASA,EAAOxC,WAEpB,OAAO,GAEX0kG,EAAeptG,UAAUstG,kBAAoB,WACzC,IAAI3sG,EAAQtB,KACRkuG,EAAKluG,KAAKqB,MAAO0C,EAAYmqG,EAAGnqG,UAAWoqG,EAAeD,EAAGC,aAAc3pG,EAAO0pG,EAAG1pG,KAAMH,EAAQ6pG,EAAG7pG,MAAOI,EAAQypG,EAAGzpG,MAAOG,EAAWspG,EAAGtpG,SAAU9D,EAAQotG,EAAGptG,MAAOs+F,EAAe8O,EAAG9O,aAAc75F,EAAc2oG,EAAG3oG,YAAaV,EAAaqpG,EAAGrpG,WAAYe,EAAcsoG,EAAGtoG,YAAaP,EAAkB6oG,EAAG7oG,gBAAiB+oG,EAAKF,EAAGxoG,aAAcA,OAAsB,IAAP0oG,EAAgB,CAAC,EAAG,EAAG,EAAG,GAAKA,EAAIvoC,EAAkBqoC,EAAGroC,gBAAiB9gE,EAASmpG,EAAGnpG,OAAQ8oB,EAAWqgF,EAAGrgF,SAAUmnC,EAAck5C,EAAGl5C,YAAa/wD,EAAUiqG,EAAGjqG,QAASM,EAAS2pG,EAAG3pG,OACriBvE,KAAKsuB,OAASvlB,EAAIixF,KAAKh6F,KAAKquG,WACxBruG,KAAKguG,WAAWhuG,KAAKquG,YACrBruG,KAAKsuB,OAAOjD,SAASmiE,qBAEzBxtF,KAAKsuB,OAAO25C,SAAS,aAAexjE,GAChC0pG,GACAA,EAAaplG,GAEjB,IAAIvD,EAAcrF,OAAOsM,KAAKzM,KAAKqB,MAAMmE,aACrCxC,EAAQ,IAAI8qG,EAAYrT,MAAMz6F,KAAKsuB,OAAO1f,UAAW,aAAenK,EAAOF,GAC/EvE,KAAKsuB,OAAO6rE,IAAIn3F,MAAQA,EACxBhD,KAAKsuG,YAActrG,EAAMs4F,UAAU,GACnCt7F,KAAKgD,MAAQA,EAEbhD,KAAKsuB,OAAOu+C,oBAAmB,GAC/B7sE,KAAKsuB,OAAOjD,SAASo+D,eAAc,GAEnC,IAAI8kB,EAAmBvuG,KAAKsuG,YAAYpuE,SACpClgC,KAAKqB,MAAMmtG,uBACXxuG,KAAKyB,SAAWzB,KAAKy/F,SAASz/F,KAAKyB,SAAUzB,KAAKqB,MAAMmtG,uBAE5DxrG,EAAML,SAAQ,SAAU2rB,EAAQvgB,GAC5B,IAAK,IAAIrK,EAAI,EAAGA,EAAI8B,EAAYvD,OAAQyB,IACpC4qB,EAAO9oB,EAAY9B,IAAMpC,EAAMD,MAAMmE,YAAYA,EAAY9B,IAEjE,IAAI+qG,EAAwB/wE,EAAI0hE,EAAcrxF,GAC1C2gG,EAAiBhxE,EAAI58B,EAAOiN,EAAO,IACvCugB,EAAOtM,QAAQuwC,eAAe,IAAIxpD,EAAI8rE,aACtCvmD,EAAO25C,SAAS,aAAexjE,GAC/B6pB,EAAOjD,SAASy+D,gBAAgBpkF,EAAa,GAAIA,EAAa,GAAIA,EAAa,GAAIA,EAAa,IAChG4oB,EAAOw5C,aAAarW,QAAQ,YAAcjtD,GAC1C8pB,EAAO85C,YAAYxjE,GACnB0pB,EAAOjD,SAASo+D,cAAc5kF,GAC9BypB,EAAOw5C,aAAa3O,eAAevzD,GACnC0oB,EAAOu+C,mBAAmBxnE,GAC1BipB,EAAO9G,GAAG,QAASlmB,EAAMslB,SACzB0H,EAAO9G,GAAG,OAAQlmB,EAAMolB,QACxB4H,EAAO9G,GAAG,QAASlmB,EAAMkoB,SACzB8E,EAAO9G,GAAG,OAAQlmB,EAAMgpB,QACxBgE,EAAO9G,GAAG,QAASlmB,EAAMwD,SACzBwpB,EAAO9G,GAAG,SAAUlmB,EAAMG,UAC1B6sB,EACKw5C,aACA5/C,UAAUV,GAAG,kBAAmBlmB,EAAMqmE,mBAC3Cr5C,EAAOw5C,aAAa5/C,UAAUV,GAAG,eAAgBlmB,EAAMkmE,gBACvDl5C,EAAOtM,QAAQwF,GAAG,kBAAmBlmB,EAAM0D,UAC3CspB,EAAOi3B,cAAmC59C,IAA1B8mG,EACVC,EACAD,EAAuBlpG,GAC7B,IAAIopG,EAAiBjxE,EAAIs3B,EAAajnD,EAAO,IACzC6gG,EAAalxE,EAAIz5B,EAAS8J,EAAO,IACrCugB,EAAOw5C,aAAa/S,eAAe45C,GAC/BC,GAAcA,EAAW3sG,OAAS,GAClCX,EAAMutG,cAAcD,EAAYtgF,GAEpC,IAAS5qB,EAAI,EAAGA,EAAIkqG,EAAgBvO,cAAcp9F,OAAQyB,IAAK,CAC3D,IAAIgqB,EAASkgF,EAAgBvO,cAAc37F,GACvC6qG,EAAiB/tG,eAAektB,GAChCY,EAAOyR,UAAUrS,EAAQpsB,EAAMD,MAAMqsB,IAEhCpsB,EAAMD,MAAMqsB,IACjBxmB,QAAQo5B,KAAK,2BAA6B5S,EAAS,+GAG3DpsB,EAAMwtG,cAAcxtG,EAAMD,MAAOitB,GAC7BhuB,MAAM6L,QAAQ0hB,IACdA,EAASlrB,SAAQ,SAAUglB,GACK,iBAAjBA,EAAQ1d,KACfqkB,EAAOT,SAASgxC,QAAQl3C,EAAQk3C,QAASl3C,EAAQ1d,MAGjDqkB,EAAOT,SAASkxC,WAAWp3C,MAInCk+C,GACAv3C,EAAOyY,mBAAmB,gBAAkB8+B,MAGhD9hE,IACA/D,KAAKquG,UAAUtqG,WAAa,IAAMA,GAElCM,GACArE,KAAKsuG,YAAYjqG,QAErB,IAAI0qG,EAAK/uG,KAAKsuB,OAAO6rE,IAAIn3F,MACzB+rG,EAAGpT,eAA0C,UAA3B37F,KAAKqB,MAAMiD,YAA0ByqG,EAAGrU,MAAQqU,EAAGpU,QACrEoU,EAAGhnC,QAAO,GACNhjE,GACAA,EAAOgqG,IAGfhB,EAAeptG,UAAUiB,mBAAqB,SAAUotG,GACpD,IAAI1tG,EAAQtB,KACRivG,EAAWD,EACXE,EAAYlvG,KAAKqB,MACjB2B,EAAQhD,KAAKsuB,OAAO6rE,IAAIn3F,MA4D5B,GA3DIksG,EAAU3qG,SAAW0qG,EAAS1qG,QAC9BvB,EAAMi4F,UAAUiU,EAAU3qG,QAE1B2qG,EAAU5qG,cAAgB2qG,EAAS3qG,aACnCtB,EAAM24F,eAAyC,UAA1BuT,EAAU5qG,YAA0BtB,EAAM03F,MAAQ13F,EAAM23F,QAEjF33F,EAAML,SAAQ,SAAU2rB,EAAQvgB,GACxBmhG,EAAU1qG,OAASyqG,EAASzqG,MAC5B8pB,EAAOw5C,aAAarW,QAAQ,YAAcy9C,EAAU1qG,MAEpD0qG,EAAUrpC,kBAAoBopC,EAASppC,kBACnCqpC,EAAUrpC,gBACVv3C,EAAOyY,mBAAmB,gBAAkBmoE,EAAUrpC,iBAGtDv3C,EAAOyY,mBAAmB,OAG9BmoE,EAAUtqG,WAAaqqG,EAASrqG,UAChC0pB,EAAO85C,YAAY8mC,EAAUtqG,UAE7BsqG,EAAUtpG,cAAgBqpG,EAASrpG,aACnC0oB,EAAOw5C,aAAa3O,eAAe+1C,EAAUtpG,aAE7CspG,EAAU7pG,kBAAoB4pG,EAAS5pG,iBACvCipB,EAAOu+C,mBAAmBqiC,EAAU7pG,iBAEpC6pG,EAAUrqG,aAAeoqG,EAASpqG,YAClCypB,EAAOjD,SAASo+D,cAAcylB,EAAUrqG,YAE5C,IAAK,IAAInB,EAAI,EAAGA,EAAIkqG,EAAgBvO,cAAcp9F,OAAQyB,IAAK,CAC3D,IAAIgqB,EAASkgF,EAAgBvO,cAAc37F,GACvCwrG,EAAUxhF,KAAYuhF,EAASvhF,IAC/BY,EAAOyR,UAAUrS,EAAQwhF,EAAUxhF,IAGtCxN,EAAQgvF,EAAUvpG,WAAYspG,EAAStpG,aACxCrE,EAAMwtG,cAAcI,EAAW5gF,GAEnC,IAAI6gF,EAAYzxE,EAAIwxE,EAAUpuG,MAAOiN,EAAO,IAC5C,GAAIugB,EAAO8d,aAAe+iE,EAAW,CAEjC7tG,EAAM8tG,QAAS,EACf,IAAIhgF,EAAMd,EAAOtM,QAAQkG,UAAU6tB,SACnCznB,EAAOi3B,SAAS4pD,EAAWD,EAAU3pG,aACrC+oB,EAAOtM,QAAQkG,UAAUiuB,SAAS/mB,GAClC9tB,EAAM8tG,QAAS,EAEnB,IAAIT,EAAiBjxE,EAAIwxE,EAAUl6C,YAAajnD,EAAO,IACnDshG,EAAiB3xE,EAAIuxE,EAASj6C,YAAajnD,EAAO,IACjDmS,EAAQyuF,EAAgBU,IACzB/gF,EAAOw5C,aAAa/S,eAAe45C,GAEvC,IAAIC,EAAalxE,EAAIwxE,EAAUjrG,QAAS8J,EAAO,IAC3CuhG,EAAa5xE,EAAIuxE,EAAShrG,QAAS8J,EAAO,KACzCmS,EAAQ0uF,EAAYU,IAAehvG,MAAM6L,QAAQyiG,IAClDttG,EAAMutG,cAAcD,EAAYtgF,MAGpC4gF,EAAUnrG,YAAckrG,EAASlrG,UAAW,CAC5C,IACIwrG,EADiBvvG,KAAKquG,UAAUtqG,UACO6oD,OAAO5pD,MAAM,KAClCisG,EAASlrG,UAAU6oD,OAAO5pD,MAAM,KACtCL,SAAQ,SAAU6sG,GAC9B,IAAIzhG,EAAQwhG,EAAsBnnG,QAAQonG,GAC1CD,EAAsBvhG,OAAOD,EAAO,MAExC/N,KAAKquG,UAAUtqG,UACX,IAAMmrG,EAAUnrG,UAAY,IAAMwrG,EAAsB/mG,KAAK,KAEjE0mG,EAAUzqG,QAAUwqG,EAASxqG,OAC7BzB,EAAMilE,SAAS,aAAeinC,EAAUzqG,OAExCyqG,EAAU7qG,QAAU4qG,EAAS5qG,OAC7BrE,KAAKsuG,YAAYjqG,QAEjB6qG,EAAUxqG,SAAW1E,KAAKqB,MAAMqD,QAChCwqG,EAAUvqG,QAAU3E,KAAKqB,MAAMsD,OAC/B3E,KAAKsuB,OAAOy5C,UAGpBgmC,EAAeptG,UAAU8uG,qBAAuB,WAC5CzvG,KAAKsuB,OAAOtU,UACZha,KAAKsuB,OAAS,MAElBy/E,EAAeptG,UAAUc,SAAW,SAAUsjB,GAC1C,GAAI/kB,KAAKqB,MAAMI,WAAazB,KAAKovG,OAAQ,CACrC,IAAIM,EAAU,GACd1vG,KAAKsuB,OAAO6rE,IAAIn3F,MAAML,SAAQ,SAAU2rB,GACpCohF,EAAQtsG,KAAKkrB,EAAO8d,eAExBpsC,KAAKqB,MAAMI,SAASiuG,EAAS3qF,KAGrCgpF,EAAeptG,UAAUgnE,kBAAoB,SAAU5iD,GACnD,GAAI/kB,KAAKqB,MAAMsmE,kBAAmB,CAC9B,IAAIgoC,EAAU,GACd3vG,KAAKsuB,OAAO6rE,IAAIn3F,MAAML,SAAQ,SAAU2rB,GACpCqhF,EAAQvsG,KAAKkrB,EAAOmkC,mBAExBzyD,KAAKqB,MAAMsmE,kBAAkBgoC,EAAS5qF,KAG9CgpF,EAAeptG,UAAU6mE,eAAiB,SAAUziD,GAChD,GAAI/kB,KAAKqB,MAAMmmE,eAAgB,CAC3B,IAAIooC,EAAU,GACd5vG,KAAKsuB,OAAO6rE,IAAIn3F,MAAML,SAAQ,SAAU2rB,GACpCshF,EAAQxsG,KAAKkrB,EAAOmkC,mBAExBzyD,KAAKqB,MAAMmmE,eAAeooC,EAAS7qF,KAG3CgpF,EAAeptG,UAAUimB,QAAU,SAAU7B,GACrC/kB,KAAKqB,MAAMulB,SACX5mB,KAAKqB,MAAMulB,QAAQ7B,IAG3BgpF,EAAeptG,UAAU6oB,QAAU,SAAUzE,GACrC/kB,KAAKqB,MAAMmoB,SACXxpB,KAAKqB,MAAMmoB,QAAQzE,IAG3BgpF,EAAeptG,UAAU+lB,OAAS,SAAU3B,GACpC/kB,KAAKqB,MAAMqlB,QACX1mB,KAAKqB,MAAMqlB,OAAO3B,IAG1BgpF,EAAeptG,UAAU2pB,OAAS,SAAUxnB,GACpC9C,KAAKqB,MAAMipB,QACXtqB,KAAKqB,MAAMipB,OAAOxnB,IAG1BirG,EAAeptG,UAAUmE,QAAU,SAAUhC,GACrC9C,KAAKqB,MAAMyD,SACX9E,KAAKqB,MAAMyD,QAAQhC,IAG3BirG,EAAeptG,UAAUqE,SAAW,WAC5BhF,KAAKqB,MAAM2D,UACXhF,KAAKqB,MAAM2D,SAAShF,KAAKsuB,SAGjCy/E,EAAeptG,UAAUmuG,cAAgB,SAAUztG,EAAOitB,GAEtD,IADA,IAAI3oB,EAAaxF,OAAOsM,KAAKpL,EAAMsE,YAC1BoqB,EAAI,EAAGA,EAAIpqB,EAAW1D,OAAQ8tB,IACnCzB,EAAOyR,UAAUp6B,EAAWoqB,GAAI1uB,EAAMsE,WAAWA,EAAWoqB,MAGpEg+E,EAAeptG,UAAUkuG,cAAgB,SAAU5qG,EAASqqB,GAExD,IAAIuhF,EAAiBvhF,EAAOw5C,aAAanT,YAAW,GACpD,IAAK,IAAIjxD,KAAKmsG,EACNA,EAAervG,eAAekD,IAC9B4qB,EAAOw5C,aAAalwC,aAAai4E,EAAensG,GAAGkF,IAK3D,IAAK,IAAIlF,KADTmsG,EAAiBvhF,EAAOw5C,aAAanT,YAAW,GAExCk7C,EAAervG,eAAekD,IAC9B4qB,EAAOw5C,aAAalwC,aAAai4E,EAAensG,GAAGkF,IAI3D3E,EAAQtB,SAAQ,SAAUurG,GACtB,IAAItqG,EAAWsqG,EAAGtqG,SAAUurC,EAAW++D,EAAG/+D,SAAUtrC,EAASqqG,EAAGrqG,OAAQurC,EAAS8+D,EAAG9+D,OAAQrrC,EAAYmqG,EAAGnqG,UAAWD,EAAOoqG,EAAGpqG,KAAMsqG,EAAKF,EAAG35C,QAASA,OAAiB,IAAP65C,GAAwBA,EACrLjuF,EAAQ,IAAI0tF,EAAaluF,MAAM/b,EAAUurC,EAAUtrC,EAAQurC,GAC/D9gB,EACKw5C,aACA3wC,UAAUhX,EAAOpc,EAAWD,EAAMywD,OAG/Cw5C,EAAeptG,UAAUmvG,UAAY,SAAU/gC,GAC3C/uE,KAAKquG,UAAYt/B,GAErBg/B,EAAeptG,UAAUqD,OAAS,WAC9B,IAAIkqG,EAAKluG,KAAKqB,MAAO+C,EAAO8pG,EAAG9pG,KAAMO,EAAQupG,EAAGvpG,MAAOD,EAASwpG,EAAGxpG,OAAQe,EAAQyoG,EAAGzoG,MAClFsqG,EAAWrC,EAAS,CAAE/oG,MAAOA,EAAOD,OAAQA,GAAUe,GAC1D,OAAOzE,EAAMkD,cAAc,MAAO,CAAE8rG,IAAKhwG,KAAK8vG,UAAWlnG,GAAIxE,EAAMqB,MAAOsqG,KAE9EhC,EAAehoG,UAAY,CACvBhC,UAAWhD,EAAUoF,OACrBqoG,qBAAsBztG,EAAUiF,OAChCo5F,aAAcr+F,EAAUkvG,QAAQlvG,EAAUoF,QAC1C9B,MAAOtD,EAAUmF,KACjBtB,SAAU7D,EAAUmvG,UAAU,CAACnvG,EAAUiF,OAAQjF,EAAUoF,SAC3DzB,OAAQ3D,EAAUoF,OAClB3B,KAAMzD,EAAUoF,OAChB/B,KAAMrD,EAAUoF,OAChBugB,OAAQ3lB,EAAUqF,KAClB3E,SAAUV,EAAUqF,KACpBkkB,OAAQvpB,EAAUqF,KAClBwgB,QAAS7lB,EAAUqF,KACnBojB,QAASzoB,EAAUqF,KACnBrB,OAAQhE,EAAUqF,KAClBtB,QAAS/D,EAAUqF,KACnBpB,SAAUjE,EAAUqF,KACpB9B,YAAavD,EAAUoF,OACvBtB,WAAY9D,EAAUmF,KACtB3B,OAAQxD,EAAUiF,OAClBvB,MAAO1D,EAAUoF,OACjBrF,MAAOC,EAAUkvG,QAAQlvG,EAAUoF,QACnCxB,MAAO5D,EAAUoF,OACjBwhE,kBAAmB5mE,EAAUqF,KAC7BohE,eAAgBzmE,EAAUqF,KAC1B+nG,aAAcptG,EAAUqF,KACxBnB,SAAUlE,EAAUiF,OACpBd,SAAUnE,EAAUiF,OACpBb,SAAUpE,EAAUmF,KACpBd,oBAAqBrE,EAAUmF,KAC/BZ,QAASvE,EAAUiF,OACnBX,gBAAiBtE,EAAUmF,KAC3BX,YAAaxE,EAAUiF,OACvBR,YAAazE,EAAUkF,OACvBN,WAAY5E,EAAUkF,OACtBR,MAAO1E,EAAUkF,OACjBP,aAAc3E,EAAUsF,MACxB2uD,YAAaj0D,EAAUsF,MACvBpC,QAASlD,EAAUsF,MACnBw/D,gBAAiB9kE,EAAUoF,OAC3BP,YAAa7E,EAAUmF,KACvBL,0BAA2B9E,EAAUmvG,UAAU,CAC3CnvG,EAAUmF,KACVnF,EAAUsF,QAEdP,yBAA0B/E,EAAUmvG,UAAU,CAC1CnvG,EAAUmF,KACVnF,EAAUsF,QAEdwnB,SAAU9sB,EAAUsF,OAExB0nG,EAAeznG,aAAe,CAC1BlC,KAAM,aACNC,OAAO,EACPC,YAAa,SACbC,OAAQ,EACRC,KAAM,GACNC,MAAO,GACPC,OAAQ,QACRC,MAAO,QACP7D,MAAO,GACP8D,SAAU,GACVC,YAAY,EACZpD,SAAU,KACVqD,QAAS,KACTC,OAAQ,KACRC,SAAU,KACVC,SAAU,KACVC,SAAU,KACVC,UAAU,EACVC,qBAAqB,EACrBC,iBAAiB,EACjBC,QAAS,EACTC,YAAa,EACbC,YAAa,GACbC,MAAO,GACPC,aAAc,CAAC,EAAG,EAAG,EAAG,GACxBC,WAAY,GACZC,aAAa,EACbC,2BAA2B,EAC3BC,0BAA0B,GAEvBioG,EA9XwB,CA+XjC/sG,EAAMuF,WACR1G,QAAQsE,QAAU4pG,G,iCClalBnuG,EAAOC,QAAU,IAA0B,uC,+BCA3CD,EAAOC,QAAU,IAA0B,uC,8CCC3C,IACQC,EADJC,EAAaC,MAAQA,KAAKD,YACtBD,EAAgB,SAAUG,EAAGC,GAI7B,OAHAJ,EAAgBK,OAAOC,gBAClB,CAAEC,UAAW,cAAgBC,OAAS,SAAUL,EAAGC,GAAKD,EAAEI,UAAYH,IACvE,SAAUD,EAAGC,GAAK,IAAK,IAAIK,KAAKL,EAAOA,EAAEM,eAAeD,KAAIN,EAAEM,GAAKL,EAAEK,MACpDN,EAAGC,IAErB,SAAUD,EAAGC,GAEhB,SAASO,IAAOT,KAAKU,YAAcT,EADnCH,EAAcG,EAAGC,GAEjBD,EAAEU,UAAkB,OAANT,EAAaC,OAAOS,OAAOV,IAAMO,EAAGE,UAAYT,EAAES,UAAW,IAAIF,KAGnFitG,EAAY1tG,MAAQA,KAAK0tG,UAAa,WAStC,OARAA,EAAWvtG,OAAOwtG,QAAU,SAASxmF,GACjC,IAAK,IAAIkX,EAAG36B,EAAI,EAAGgJ,EAAI7F,UAAU5E,OAAQyB,EAAIgJ,EAAGhJ,IAE5C,IAAK,IAAInD,KADT89B,EAAIx3B,UAAUnD,GACOvD,OAAOQ,UAAUH,eAAee,KAAK88B,EAAG99B,KACzD4mB,EAAE5mB,GAAK89B,EAAE99B,IAEjB,OAAO4mB,IAEKlgB,MAAMjH,KAAM6G,YAEhC1G,OAAOU,eAAehB,QAAS,aAAc,CAAEiB,OAAO,IACtD,IAAI+sG,EAAe,EAAQ,YACvB9sG,EAAY,EAAQ,YACpBC,EAAQ,EAAQ,YAChBkf,EAAU,EAAQ,YAClB0tF,EAAkB,EAAQ,YAC1B7kG,EAAM6kG,EAAgBrO,iBACtB4Q,EAA0B,SAAU/uG,GAEpC,SAAS+uG,EAAS9uG,GACd,IAAIC,EAAQF,EAAOG,KAAKvB,KAAMqB,IAAUrB,KAKxC,OAJA4tG,EAAgBtO,aAAa38F,SAAQ,SAAUugD,GAC3C5hD,EAAM4hD,GAAU5hD,EAAM4hD,GAAQxhD,KAAKJ,MAEvCA,EAAMm+F,SAAWmO,EAAgBnO,SAC1Bn+F,EA6YX,OApZAvB,EAAUowG,EAAU/uG,GASpB+uG,EAASxvG,UAAUqtG,WAAa,SAAU5/F,GAEtC,IADA,IAAIvC,EAASuC,GAAQA,EAAK/E,WACnBwC,GAAQ,CACX,GAA0B,wBAAtBA,EAAOjE,WACP,OAAO,EAEXiE,EAASA,EAAOxC,WAEpB,OAAO,GAEX8mG,EAASxvG,UAAUstG,kBAAoB,WACnC,IAAI3sG,EAAQtB,KACRkuG,EAAKluG,KAAKqB,MAAO0C,EAAYmqG,EAAGnqG,UAAWoqG,EAAeD,EAAGC,aAAciC,EAAalC,EAAGkC,WAAY5rG,EAAO0pG,EAAG1pG,KAAMH,EAAQ6pG,EAAG7pG,MAAOI,EAAQypG,EAAGzpG,MAAOG,EAAWspG,EAAGtpG,SAAU9D,EAAQotG,EAAGptG,MAAOs+F,EAAe8O,EAAG9O,aAAcv6F,EAAaqpG,EAAGrpG,WAAYe,EAAcsoG,EAAGtoG,YAAaP,EAAkB6oG,EAAG7oG,gBAAiB+oG,EAAKF,EAAGxoG,aAAcA,OAAsB,IAAP0oG,EAAgB,CAAC,EAAG,EAAG,EAAG,GAAKA,EAAIvoC,EAAkBqoC,EAAGroC,gBAAiB9gE,EAASmpG,EAAGnpG,OAAQ8oB,EAAWqgF,EAAGrgF,SAAUmnC,EAAck5C,EAAGl5C,YAAa/wD,EAAUiqG,EAAGjqG,QAAS+lD,EAAckkD,EAAGlkD,YACxiBhqD,KAAKsuB,OAASvlB,EAAIixF,KAAKh6F,KAAKquG,WACxBF,GACAA,EAAaplG,GAGjB,IADA,IAAIvD,EAAcrF,OAAOsM,KAAKzM,KAAKqB,MAAMmE,aAChC9B,EAAI,EAAGA,EAAI8B,EAAYvD,OAAQyB,IACpC1D,KAAKsuB,OAAO9oB,EAAY9B,IAAM1D,KAAKqB,MAAMmE,YAAYA,EAAY9B,IAEjE1D,KAAKqB,MAAMmtG,uBACXxuG,KAAKyB,SAAWzB,KAAKy/F,SAASz/F,KAAKyB,SAAUzB,KAAKqB,MAAMmtG,uBAE5DxuG,KAAKsuB,OAAOjD,SAASy+D,gBAAgBpkF,EAAa,GAAIA,EAAa,GAAIA,EAAa,GAAIA,EAAa,IACjG1F,KAAKguG,WAAWhuG,KAAKquG,YACrBruG,KAAKsuB,OAAOjD,SAASmiE,qBAEzBxtF,KAAKsuB,OAAOw5C,aAAarW,QAAQ,YAAcjtD,GAC/CxE,KAAKsuB,OAAO25C,SAAS,aAAexjE,GACpCzE,KAAKsuB,OAAO85C,YAAgC,iBAAbxjE,EAAwBA,EAAW,KAAOA,GACzE5E,KAAKsuB,OACAw5C,aACAviB,SAAU65C,IAAet+F,GAAS,KACnCd,KAAKqB,MAAMgvG,mBACXrwG,KAAKsuB,OAAOuzC,kBAEhB7hE,KAAKsuB,OAAOjD,SAASo+D,cAAc5kF,GACnC7E,KAAKsuB,OAAOw5C,aAAa3O,eAAevzD,GACxC5F,KAAKsuB,OAAOu+C,mBAAmBxnE,GAC/BrF,KAAKsuB,OAAO9G,GAAG,QAASxnB,KAAK4mB,SAC7B5mB,KAAKsuB,OAAO9G,GAAG,OAAQxnB,KAAK0mB,QAC5B1mB,KAAKsuB,OAAO9G,GAAG,OAAQxnB,KAAKsqB,QAC5BtqB,KAAKsuB,OAAO9G,GAAG,QAASxnB,KAAK8E,SAC7B9E,KAAKsuB,OAAO9G,GAAG,SAAUxnB,KAAKyB,UAC9BzB,KAAKsuB,OAAO9G,GAAG,QAASxnB,KAAKwpB,SACzBwgC,GACAhqD,KAAKswG,oBAETtwG,KAAKsuB,OACAw5C,aACA5/C,UAAUV,GAAG,kBAAmBxnB,KAAK2nE,mBAC1C3nE,KAAKsuB,OAAOw5C,aAAa5/C,UAAUV,GAAG,eAAgBxnB,KAAKwnE,gBACvD4oC,GAEApwG,KAAKsuB,OAAOw5C,aAAatgD,GAAG,oBAAoB,WAE5C,IAAIwtC,EAAc1zD,EAAMgtB,OAAOw5C,aAAa7S,iBAC5C3zD,EAAMD,MAAM+uG,WAAWp7C,MAG/Bh1D,KAAKsuB,OAAOtM,QAAQwF,GAAG,kBAAmBxnB,KAAKgF,UAC/ChF,KAAKsuB,OAAOw5C,aAAa/S,eAAeC,GAAe,IACnD/wD,GAAWA,EAAQhC,OAAS,GAC5BjC,KAAK6uG,cAAc5qG,GAGvB,IAAIsqG,EAAmBvuG,KAAKsuB,OAAO4R,SACnC0tE,EAAgBvO,cAAc18F,SAAQ,SAAU+qB,GACxC6gF,EAAiB/tG,eAAektB,GAEhCpsB,EAAMgtB,OAAOyR,UAAUrS,EAAQpsB,EAAMD,MAAMqsB,IAEtCpsB,EAAMD,MAAMqsB,IACjBxmB,QAAQo5B,KAAK,2BAA6B5S,EAAS,kHAG3D1tB,KAAK8uG,cAAc9uG,KAAKqB,OACpBf,MAAM6L,QAAQ0hB,IACdA,EAASlrB,SAAQ,SAAUglB,GACK,iBAAjBA,EAAQ1d,KACf3I,EAAMgtB,OAAOT,SAASgxC,QAAQl3C,EAAQk3C,QAASl3C,EAAQ1d,MAGvD3I,EAAMgtB,OAAOT,SAASkxC,WAAWp3C,MAIzCk+C,GACA7lE,KAAKsuB,OAAOyY,mBAAmB,gBAAkB8+B,GAEjD9hE,IACA/D,KAAKquG,UAAUtqG,WAAa,IAAMA,GAElCgB,GACAA,EAAO/E,KAAKsuB,QAEhBtuB,KAAKsuB,OAAOy5C,SACR1jE,GACArE,KAAKsuB,OAAOjqB,SAGpB8rG,EAASxvG,UAAUiB,mBAAqB,SAAUotG,GAG9C,IAFA,IAAIC,EAAWD,EACXE,EAAYlvG,KAAKqB,MACZqC,EAAI,EAAGA,EAAIkqG,EAAgBvO,cAAcp9F,OAAQyB,IAAK,CAC3D,IAAIgqB,EAASkgF,EAAgBvO,cAAc37F,GACvCwrG,EAAUxhF,KAAYuhF,EAASvhF,IAE/B1tB,KAAKsuB,OAAOyR,UAAUrS,EAAQwhF,EAAUxhF,IAGhD,GAAIwhF,EAAUnrG,YAAckrG,EAASlrG,UAAW,CAC5C,IACIwrG,EADiBvvG,KAAKquG,UAAUtqG,UACO6oD,OAAO5pD,MAAM,KAClCisG,EAASlrG,UAAU6oD,OAAO5pD,MAAM,KACtCL,SAAQ,SAAU6sG,GAC9B,IAAIzhG,EAAQwhG,EAAsBnnG,QAAQonG,GAC1CD,EAAsBvhG,OAAOD,EAAO,MAExC/N,KAAKquG,UAAUtqG,UACX,IAAMmrG,EAAUnrG,UAAY,IAAMwrG,EAAsB/mG,KAAK,KAGrE,GAAIxI,KAAKsuB,QACc,MAAnB4gF,EAAUpuG,OACVd,KAAKsuB,OAAO8d,aAAe8iE,EAAUpuG,MAAO,CAE5Cd,KAAKovG,QAAS,EACd,IAAIhgF,EAAMpvB,KAAKsuB,OAAOtM,QAAQkG,UAAU6tB,SACxC/1C,KAAKsuB,OAAOi3B,SAAS2pD,EAAUpuG,MAAOouG,EAAU3pG,aAChDvF,KAAKsuB,OAAOtM,QAAQkG,UAAUiuB,SAAS/mB,GACvCpvB,KAAKovG,QAAS,EAEdF,EAAUllD,cAAgBilD,EAASjlD,aACnChqD,KAAKswG,oBAELpB,EAAU1qG,OAASyqG,EAASzqG,MAC5BxE,KAAKsuB,OAAOw5C,aAAarW,QAAQ,YAAcy9C,EAAU1qG,MAEzD0qG,EAAUzqG,QAAUwqG,EAASxqG,OAC7BzE,KAAKsuB,OAAO25C,SAAS,aAAeinC,EAAUzqG,OAE9CyqG,EAAUrpC,kBAAoBopC,EAASppC,kBACnCqpC,EAAUrpC,gBACV7lE,KAAKsuB,OAAOyY,mBAAmB,gBAAkBmoE,EAAUrpC,iBAG3D7lE,KAAKsuB,OAAOyY,mBAAmB,OAGnCmoE,EAAUtqG,WAAaqqG,EAASrqG,UAChC5E,KAAKsuB,OAAO85C,YAA0C,iBAAvB8mC,EAAUtqG,SACnCsqG,EAAUtqG,SAAW,KACrBsqG,EAAUtqG,UAEhBsqG,EAAUtpG,cAAgBqpG,EAASrpG,aACnC5F,KAAKsuB,OAAOw5C,aAAa3O,eAAe+1C,EAAUtpG,aAElDspG,EAAU7pG,kBAAoB4pG,EAAS5pG,iBACvCrF,KAAKsuB,OAAOu+C,mBAAmBqiC,EAAU7pG,iBAEzC6pG,EAAUrqG,aAAeoqG,EAASpqG,YAClC7E,KAAKsuB,OAAOjD,SAASo+D,cAAcylB,EAAUrqG,YAE5Cqb,EAAQgvF,EAAUvpG,WAAYspG,EAAStpG,aACxC3F,KAAK8uG,cAAcI,GAElBhvF,EAAQgvF,EAAUl6C,YAAai6C,EAASj6C,cACzCh1D,KAAKsuB,OAAOw5C,aAAa/S,eAAem6C,EAAUl6C,aAAe,KAEhE90C,EAAQgvF,EAAUjrG,QAASgrG,EAAShrG,UACrC3D,MAAM6L,QAAQ+iG,EAAUjrG,UACxBjE,KAAK6uG,cAAcK,EAAUjrG,SAG5Bic,EAAQgvF,EAAUxpG,aAAcupG,EAASvpG,eAC1C1F,KAAKuwG,oBAAoBrB,EAAUxpG,cAEnCspG,EAAUtqG,SAAW1E,KAAKqB,MAAMqD,QAChCsqG,EAAUrqG,QAAU3E,KAAKqB,MAAMsD,OAC/B3E,KAAKsuB,OAAOy5C,SAEZ/nE,KAAKqB,MAAMgD,QAAU2qG,EAAU3qG,OAC/BrE,KAAKsuB,OAAOjqB,SAGpB8rG,EAASxvG,UAAU4vG,oBAAsB,SAAUC,QAC/B,IAAZA,IAAsBA,EAAU,CAAC,EAAG,EAAG,EAAG,IAC9CxwG,KAAKsuB,OAAOjD,SAASy+D,gBAAgB0mB,EAAQ,GAAIA,EAAQ,GAAIA,EAAQ,GAAIA,EAAQ,KAErFL,EAASxvG,UAAU8uG,qBAAuB,WACtCzvG,KAAKsuB,OAAOtU,UACZha,KAAKsuB,OAAS,MAElB6hF,EAASxvG,UAAUc,SAAW,SAAUsjB,GACpC,GAAI/kB,KAAKqB,MAAMI,WAAazB,KAAKovG,OAAQ,CACrC,IAAItuG,EAAQd,KAAKsuB,OAAO8d,WACxBpsC,KAAKqB,MAAMI,SAASX,EAAOikB,KAGnCorF,EAASxvG,UAAUgnE,kBAAoB,SAAU5iD,GAC7C,GAAI/kB,KAAKqB,MAAMsmE,kBAAmB,CAC9B,IAAI7mE,EAAQd,KAAKsuB,OAAOmkC,eACxBzyD,KAAKqB,MAAMsmE,kBAAkB7mE,EAAOikB,KAG5CorF,EAASxvG,UAAU6mE,eAAiB,SAAUziD,GAC1C,GAAI/kB,KAAKqB,MAAMmmE,eAAgB,CAC3B,IAAI1mE,EAAQd,KAAKsuB,OAAOmkC,eACxBzyD,KAAKqB,MAAMmmE,eAAe1mE,EAAOikB,KAGzCorF,EAASxvG,UAAU6oB,QAAU,SAAUzE,GAC/B/kB,KAAKqB,MAAMmoB,SACXxpB,KAAKqB,MAAMmoB,QAAQzE,GAEnB/kB,KAAKqB,MAAM2oD,aACXhqD,KAAKswG,qBAGbH,EAASxvG,UAAUimB,QAAU,SAAU7B,GAC/B/kB,KAAKqB,MAAMulB,SACX5mB,KAAKqB,MAAMulB,QAAQ7B,EAAO/kB,KAAKsuB,SAGvC6hF,EAASxvG,UAAU+lB,OAAS,SAAU3B,GAC9B/kB,KAAKqB,MAAMqlB,QACX1mB,KAAKqB,MAAMqlB,OAAO3B,EAAO/kB,KAAKsuB,SAGtC6hF,EAASxvG,UAAU2pB,OAAS,SAAU4jF,GAClC,IAAIprG,EAAOorG,EAAGprG,KACV9C,KAAKqB,MAAMipB,QACXtqB,KAAKqB,MAAMipB,OAAOxnB,IAG1BqtG,EAASxvG,UAAUmE,QAAU,SAAUopG,GACnC,IAAIprG,EAAOorG,EAAGprG,KACV9C,KAAKqB,MAAMyD,SACX9E,KAAKqB,MAAMyD,QAAQhC,IAG3BqtG,EAASxvG,UAAUqE,SAAW,WACtBhF,KAAKqB,MAAM2D,UACXhF,KAAKqB,MAAM2D,SAAShF,KAAKsuB,SAGjC6hF,EAASxvG,UAAUmuG,cAAgB,SAAUztG,GAEzC,IADA,IAAIsE,EAAaxF,OAAOsM,KAAKpL,EAAMsE,YAC1BoqB,EAAI,EAAGA,EAAIpqB,EAAW1D,OAAQ8tB,IAEnC/vB,KAAKsuB,OAAOyR,UAAUp6B,EAAWoqB,GAAI1uB,EAAMsE,WAAWA,EAAWoqB,MAGzEogF,EAASxvG,UAAUkuG,cAAgB,SAAU5qG,GACzC,IAAI3C,EAAQtB,KAER6vG,EAAiB7vG,KAAKsuB,OAAOw5C,aAAanT,YAAW,GACzD,IAAK,IAAIjxD,KAAKmsG,EACNA,EAAervG,eAAekD,IAC9B1D,KAAKsuB,OAAOw5C,aAAalwC,aAAai4E,EAAensG,GAAGkF,IAKhE,IAAK,IAAIlF,KADTmsG,EAAiB7vG,KAAKsuB,OAAOw5C,aAAanT,YAAW,GAE7Ck7C,EAAervG,eAAekD,IACF,oBAA5BmsG,EAAensG,GAAGolD,OACU,sBAA5B+mD,EAAensG,GAAGolD,OAClB9oD,KAAKsuB,OAAOw5C,aAAalwC,aAAai4E,EAAensG,GAAGkF,IAIhE3E,EAAQtB,SAAQ,SAAUurG,GACtB,IAAItqG,EAAWsqG,EAAGtqG,SAAUurC,EAAW++D,EAAG/+D,SAAUtrC,EAASqqG,EAAGrqG,OAAQurC,EAAS8+D,EAAG9+D,OAAQrrC,EAAYmqG,EAAGnqG,UAAWD,EAAOoqG,EAAGpqG,KAAMsqG,EAAKF,EAAG35C,QAASA,OAAiB,IAAP65C,GAAwBA,EACrLjuF,EAAQ,IAAI0tF,EAAaluF,MAAM/b,EAAUurC,EAAUtrC,EAAQurC,GAC/D9tC,EAAMgtB,OAAOw5C,aAAa3wC,UAAUhX,EAAOpc,EAAWD,EAAMywD,OAGpE47C,EAASxvG,UAAU2vG,kBAAoB,WAEnC,IAAIhiF,EAAStuB,KAAKsuB,OACd07B,EAAchqD,KAAKqB,MAAM2oD,YACzBymD,GAAmBniF,EAAOtM,QAAQoqB,WAAWnqC,OAC7CmM,EAAOkgB,EAAOjD,SAASooD,iBACtBg9B,GAAmBriG,GACpBkgB,EAAOjD,SAAS4B,SAAS3jB,YAAYglB,EAAOjD,SAASooD,iBACrDnlD,EAAOjD,SAASooD,gBAAkB,MAE7Bg9B,IAAoBriG,IACzBA,EAAOkgB,EAAOjD,SAASooD,gBAAkBznE,SAAS9H,cAAc,QAC3DqJ,YAAcy8C,GAAe,GAClC57C,EAAKrK,UAAY,8BACjBqK,EAAK3I,MAAMg1E,QAAU,QACrBrsE,EAAK3I,MAAM+J,SAAW,WACtBpB,EAAK3I,MAAMmzF,OAAS,IACpBtqE,EAAOjD,SAAS4B,SAAS/gB,YAAYkC,IAEhCqiG,GAAmBriG,IACxBA,EAAKb,YAAcy8C,IAG3BmmD,EAASxvG,UAAUmvG,UAAY,SAAU/gC,GACrC/uE,KAAKquG,UAAYt/B,GAErBohC,EAASxvG,UAAUqD,OAAS,WACxB,IAAIkqG,EAAKluG,KAAKqB,MAAO+C,EAAO8pG,EAAG9pG,KAAMO,EAAQupG,EAAGvpG,MAAOD,EAASwpG,EAAGxpG,OAAQe,EAAQyoG,EAAGzoG,MAClFsqG,EAAWrC,EAAS,CAAE/oG,MAAOA,EAAOD,OAAQA,GAAUe,GAC1D,OAAOzE,EAAMkD,cAAc,MAAO,CAAE8rG,IAAKhwG,KAAK8vG,UAAWlnG,GAAIxE,EAAMqB,MAAOsqG,KAE9EI,EAASpqG,UAAY,CACjBvB,KAAMzD,EAAUoF,OAChB9B,MAAOtD,EAAUmF,KACjBzB,MAAO1D,EAAUoF,OACjB/B,KAAMrD,EAAUoF,OAChBpC,UAAWhD,EAAUoF,OACrBzB,OAAQ3D,EAAUoF,OAClBxB,MAAO5D,EAAUoF,OACjBvB,SAAU7D,EAAUmvG,UAAU,CAACnvG,EAAUiF,OAAQjF,EAAUoF,SAC3DtB,WAAY9D,EAAUmF,KACtBzE,SAAUV,EAAUqF,KACpBkkB,OAAQvpB,EAAUqF,KAClBtB,QAAS/D,EAAUqF,KACnBwgB,QAAS7lB,EAAUqF,KACnBojB,QAASzoB,EAAUqF,KACnBsgB,OAAQ3lB,EAAUqF,KAClBpB,SAAUjE,EAAUqF,KACpBtF,MAAOC,EAAUoF,OACjBi5F,aAAcr+F,EAAUoF,OACxBpB,OAAQhE,EAAUqF,KAClBuhE,kBAAmB5mE,EAAUqF,KAC7BohE,eAAgBzmE,EAAUqF,KAC1B+nG,aAAcptG,EAAUqF,KACxBgqG,WAAYrvG,EAAUqF,KACtBnB,SAAUlE,EAAUiF,OACpBd,SAAUnE,EAAUiF,OACpBb,SAAUpE,EAAUmF,KACpBd,oBAAqBrE,EAAUmF,KAC/BZ,QAASvE,EAAUiF,OACnBX,gBAAiBtE,EAAUmF,KAC3BX,YAAaxE,EAAUiF,OACvBwoG,qBAAsBztG,EAAUiF,OAChCR,YAAazE,EAAUkF,OACvBN,WAAY5E,EAAUkF,OACtBR,MAAO1E,EAAUkF,OACjBP,aAAc3E,EAAUsF,MACxB2uD,YAAaj0D,EAAUsF,MACvBpC,QAASlD,EAAUsF,MACnBw/D,gBAAiB9kE,EAAUoF,OAC3BP,YAAa7E,EAAUmF,KACvBwqG,eAAgB3vG,EAAUmF,KAC1BL,0BAA2B9E,EAAUmvG,UAAU,CAC3CnvG,EAAUmF,KACVnF,EAAUsF,QAEdP,yBAA0B/E,EAAUmvG,UAAU,CAC1CnvG,EAAUmF,KACVnF,EAAUsF,QAEdgqG,kBAAmBtvG,EAAUmF,KAC7B2nB,SAAU9sB,EAAUsF,MACpB2jD,YAAajpD,EAAUoF,QAE3BgqG,EAAS7pG,aAAe,CACpBlC,KAAM,aACNC,OAAO,EACPG,KAAM,GACNC,MAAO,GACPC,OAAQ,QACRC,MAAO,QACPC,SAAU,GACV8rG,gBAAgB,EAChB7rG,YAAY,EACZpD,SAAU,KACVqD,QAAS,KACTC,OAAQ,KACRC,SAAU,KACVC,SAAU,KACVC,SAAU,KACVC,UAAU,EACVC,qBAAqB,EACrBC,iBAAiB,EACjBC,QAAS,EACTC,YAAa,EACbC,YAAa,GACbC,MAAO,GACPC,aAAc,CAAC,EAAG,EAAG,EAAG,GACxBC,WAAY,GACZC,aAAa,EACbC,2BAA2B,EAC3BC,0BAA0B,EAC1BkkD,YAAa,KACbqmD,mBAAmB,GAEhBF,EArZkB,CAsZ3BnvG,EAAMuF,WACR1G,QAAQsE,QAAUgsG,G,+BCvblBvwG,EAAOC,QAAU,IAA0B","file":"57e33c6c-13.11b9f72925818240e61d.js","sourcesContent":["module.exports = __webpack_public_path__ + \"b808fb222140a85b23ebbe0fffa906d9.js\";","module.exports = __webpack_public_path__ + \"7508d134804c21d34e50379103e765c0.js\";","module.exports = __webpack_public_path__ + \"fd5bc50b18c9f46380cbe5ec1ac2127b.js\";","module.exports = __webpack_public_path__ + \"3c71a5c0e85afc5486ee9ac29099843d.js\";","module.exports = __webpack_public_path__ + \"47f0fbf038314894ac52f2d67466b5e9.js\";","module.exports = __webpack_public_path__ + \"8235ebecd3b3d28b5475f1f89136a91a.js\";","module.exports = __webpack_public_path__ + \"2f7c864f08b00c01f04ac22375f7ddd9.js\";","module.exports = __webpack_public_path__ + \"cbdbd623038183a8c068dd24ecd90682.js\";","module.exports = __webpack_public_path__ + \"25718a469574ade47e23567d8c543169.js\";","module.exports = __webpack_public_path__ + \"b20056c149af6b50c851ecfff90e0ccb.js\";","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar PropTypes = require(\"prop-types\");\nvar React = require(\"react\");\nvar split_1 = require(\"./split\");\nvar DiffMatchPatch = require(\"diff-match-patch\");\nvar DiffComponent = /** @class */ (function (_super) {\n    __extends(DiffComponent, _super);\n    function DiffComponent(props) {\n        var _this = _super.call(this, props) || this;\n        _this.state = {\n            value: _this.props.value\n        };\n        _this.onChange = _this.onChange.bind(_this);\n        _this.diff = _this.diff.bind(_this);\n        return _this;\n    }\n    DiffComponent.prototype.componentDidUpdate = function () {\n        var value = this.props.value;\n        if (value !== this.state.value) {\n            this.setState({ value: value });\n        }\n    };\n    DiffComponent.prototype.onChange = function (value) {\n        this.setState({\n            value: value\n        });\n        if (this.props.onChange) {\n            this.props.onChange(value);\n        }\n    };\n    DiffComponent.prototype.diff = function () {\n        var dmp = new DiffMatchPatch();\n        var lhString = this.state.value[0];\n        var rhString = this.state.value[1];\n        if (lhString.length === 0 && rhString.length === 0) {\n            return [];\n        }\n        var diff = dmp.diff_main(lhString, rhString);\n        dmp.diff_cleanupSemantic(diff);\n        var diffedLines = this.generateDiffedLines(diff);\n        var codeEditorSettings = this.setCodeMarkers(diffedLines);\n        return codeEditorSettings;\n    };\n    DiffComponent.prototype.generateDiffedLines = function (diff) {\n        var C = {\n            DIFF_EQUAL: 0,\n            DIFF_DELETE: -1,\n            DIFF_INSERT: 1\n        };\n        var diffedLines = {\n            left: [],\n            right: []\n        };\n        var cursor = {\n            left: 1,\n            right: 1\n        };\n        diff.forEach(function (chunk) {\n            var chunkType = chunk[0];\n            var text = chunk[1];\n            var lines = text.split(\"\\n\").length - 1;\n            // diff-match-patch sometimes returns empty strings at random\n            if (text.length === 0) {\n                return;\n            }\n            var firstChar = text[0];\n            var lastChar = text[text.length - 1];\n            var linesToHighlight = 0;\n            switch (chunkType) {\n                case C.DIFF_EQUAL:\n                    cursor.left += lines;\n                    cursor.right += lines;\n                    break;\n                case C.DIFF_DELETE:\n                    // If the deletion starts with a newline, push the cursor down to that line\n                    if (firstChar === \"\\n\") {\n                        cursor.left++;\n                        lines--;\n                    }\n                    linesToHighlight = lines;\n                    // If the deletion does not include a newline, highlight the same line on the right\n                    if (linesToHighlight === 0) {\n                        diffedLines.right.push({\n                            startLine: cursor.right,\n                            endLine: cursor.right\n                        });\n                    }\n                    // If the last character is a newline, we don't want to highlight that line\n                    if (lastChar === \"\\n\") {\n                        linesToHighlight -= 1;\n                    }\n                    diffedLines.left.push({\n                        startLine: cursor.left,\n                        endLine: cursor.left + linesToHighlight\n                    });\n                    cursor.left += lines;\n                    break;\n                case C.DIFF_INSERT:\n                    // If the insertion starts with a newline, push the cursor down to that line\n                    if (firstChar === \"\\n\") {\n                        cursor.right++;\n                        lines--;\n                    }\n                    linesToHighlight = lines;\n                    // If the insertion does not include a newline, highlight the same line on the left\n                    if (linesToHighlight === 0) {\n                        diffedLines.left.push({\n                            startLine: cursor.left,\n                            endLine: cursor.left\n                        });\n                    }\n                    // If the last character is a newline, we don't want to highlight that line\n                    if (lastChar === \"\\n\") {\n                        linesToHighlight -= 1;\n                    }\n                    diffedLines.right.push({\n                        startLine: cursor.right,\n                        endLine: cursor.right + linesToHighlight\n                    });\n                    cursor.right += lines;\n                    break;\n                default:\n                    throw new Error(\"Diff type was not defined.\");\n            }\n        });\n        return diffedLines;\n    };\n    // Receives a collection of line numbers and iterates through them to highlight appropriately\n    // Returns an object that tells the render() method how to display the code editors\n    DiffComponent.prototype.setCodeMarkers = function (diffedLines) {\n        if (diffedLines === void 0) { diffedLines = { left: [], right: [] }; }\n        var codeEditorSettings = [];\n        var newMarkerSet = {\n            left: [],\n            right: []\n        };\n        for (var i = 0; i < diffedLines.left.length; i++) {\n            var markerObj = {\n                startRow: diffedLines.left[i].startLine - 1,\n                endRow: diffedLines.left[i].endLine,\n                type: \"text\",\n                className: \"codeMarker\"\n            };\n            newMarkerSet.left.push(markerObj);\n        }\n        for (var i = 0; i < diffedLines.right.length; i++) {\n            var markerObj = {\n                startRow: diffedLines.right[i].startLine - 1,\n                endRow: diffedLines.right[i].endLine,\n                type: \"text\",\n                className: \"codeMarker\"\n            };\n            newMarkerSet.right.push(markerObj);\n        }\n        codeEditorSettings[0] = newMarkerSet.left;\n        codeEditorSettings[1] = newMarkerSet.right;\n        return codeEditorSettings;\n    };\n    DiffComponent.prototype.render = function () {\n        var markers = this.diff();\n        return (React.createElement(split_1.default, { name: this.props.name, className: this.props.className, focus: this.props.focus, orientation: this.props.orientation, splits: this.props.splits, mode: this.props.mode, theme: this.props.theme, height: this.props.height, width: this.props.width, fontSize: this.props.fontSize, showGutter: this.props.showGutter, onChange: this.onChange, onPaste: this.props.onPaste, onLoad: this.props.onLoad, onScroll: this.props.onScroll, minLines: this.props.minLines, maxLines: this.props.maxLines, readOnly: this.props.readOnly, highlightActiveLine: this.props.highlightActiveLine, showPrintMargin: this.props.showPrintMargin, tabSize: this.props.tabSize, cursorStart: this.props.cursorStart, editorProps: this.props.editorProps, style: this.props.style, scrollMargin: this.props.scrollMargin, setOptions: this.props.setOptions, wrapEnabled: this.props.wrapEnabled, enableBasicAutocompletion: this.props.enableBasicAutocompletion, enableLiveAutocompletion: this.props.enableLiveAutocompletion, value: this.state.value, markers: markers }));\n    };\n    DiffComponent.propTypes = {\n        cursorStart: PropTypes.number,\n        editorProps: PropTypes.object,\n        enableBasicAutocompletion: PropTypes.bool,\n        enableLiveAutocompletion: PropTypes.bool,\n        focus: PropTypes.bool,\n        fontSize: PropTypes.number,\n        height: PropTypes.string,\n        highlightActiveLine: PropTypes.bool,\n        maxLines: PropTypes.number,\n        minLines: PropTypes.number,\n        mode: PropTypes.string,\n        name: PropTypes.string,\n        className: PropTypes.string,\n        onLoad: PropTypes.func,\n        onPaste: PropTypes.func,\n        onScroll: PropTypes.func,\n        onChange: PropTypes.func,\n        orientation: PropTypes.string,\n        readOnly: PropTypes.bool,\n        scrollMargin: PropTypes.array,\n        setOptions: PropTypes.object,\n        showGutter: PropTypes.bool,\n        showPrintMargin: PropTypes.bool,\n        splits: PropTypes.number,\n        style: PropTypes.object,\n        tabSize: PropTypes.number,\n        theme: PropTypes.string,\n        value: PropTypes.array,\n        width: PropTypes.string,\n        wrapEnabled: PropTypes.bool\n    };\n    DiffComponent.defaultProps = {\n        cursorStart: 1,\n        editorProps: {},\n        enableBasicAutocompletion: false,\n        enableLiveAutocompletion: false,\n        focus: false,\n        fontSize: 12,\n        height: \"500px\",\n        highlightActiveLine: true,\n        maxLines: null,\n        minLines: null,\n        mode: \"\",\n        name: \"ace-editor\",\n        onLoad: null,\n        onScroll: null,\n        onPaste: null,\n        onChange: null,\n        orientation: \"beside\",\n        readOnly: false,\n        scrollMargin: [0, 0, 0, 0],\n        setOptions: {},\n        showGutter: true,\n        showPrintMargin: true,\n        splits: 2,\n        style: {},\n        tabSize: 4,\n        theme: \"github\",\n        value: [\"\", \"\"],\n        width: \"500px\",\n        wrapEnabled: true\n    };\n    return DiffComponent;\n}(React.Component));\nexports.default = DiffComponent;\n//# sourceMappingURL=diff.js.map","module.exports = __webpack_public_path__ + \"7e5c69c01b5cb218a1f3d21d4e96f6f0.js\";","module.exports = __webpack_public_path__ + \"962969a46fefcace3305abd4d6e14a2e.js\";","module.exports = __webpack_public_path__ + \"4eed3725a00fc2bab78accdb014b7826.js\";","module.exports = __webpack_public_path__ + \"19e684db1b08c82963634abc8b2c989f.js\";","module.exports = __webpack_public_path__ + \"88e2feda80ac8cfb28f1dc0ec833b40d.js\";","module.exports = __webpack_public_path__ + \"63b15fb6fc8f897b22a4bf72b7e8452a.js\";","module.exports = __webpack_public_path__ + \"805cb6232d7a9fa46025d48a43622ecf.js\";","module.exports = __webpack_public_path__ + \"0858b0836367ea324bc9c5f6749db9a1.js\";","module.exports = __webpack_public_path__ + \"57f9654d8ecdebfb02c636e1889af2e4.js\";","module.exports = __webpack_public_path__ + \"1850762f1bfaf1a1044765b02b243ed4.js\";","module.exports = __webpack_public_path__ + \"740f4264cd757fcf28331fd30daf295e.js\";","module.exports = __webpack_public_path__ + \"3b544bb2c5a4e7b225a4b50235a0fd6d.js\";","module.exports = __webpack_public_path__ + \"95eab4af456c8e8b2f30d3a733ea0825.js\";","module.exports = __webpack_public_path__ + \"12b520593765ef7e714d7fb3764633ed.js\";","module.exports = __webpack_public_path__ + \"6bb61adbbc13088ee1c32d88b5c7e754.js\";","module.exports = __webpack_public_path__ + \"7e4099fc2d04c7c1cf96892b962ba4ec.js\";","module.exports = __webpack_public_path__ + \"ecdb4966f685f3e44b1f28fae46827a3.js\";","module.exports = __webpack_public_path__ + \"8707a7b49421dbbb842506674ff87fa3.js\";","module.exports = __webpack_public_path__ + \"64c45b6610e353ba59a58afc6dd090ca.js\";","module.exports = __webpack_public_path__ + \"440f4d477b586c7a6ba4c1c966ca79fc.js\";","module.exports = __webpack_public_path__ + \"06d958315fc6cdbb28576b03e43203aa.js\";","module.exports = __webpack_public_path__ + \"3f55ba1c6515db2f98bb996c1a5bc9e3.js\";","module.exports = __webpack_public_path__ + \"5d46734b57c7408a41473abcd515b64c.js\";","module.exports = __webpack_public_path__ + \"cf90a39d245bf7e6c1b41c7a9a28f0a1.js\";","module.exports = __webpack_public_path__ + \"5e37c1ef17a219449c8c6aa37a87a941.js\";","module.exports = __webpack_public_path__ + \"170487867de05784a96608617bdd544d.js\";","module.exports = __webpack_public_path__ + \"da1c1b1569c4d5872c9a18c29f0b5c90.js\";","module.exports = __webpack_public_path__ + \"b5039d230111eb20d09d845f3bd9e240.js\";","module.exports = __webpack_public_path__ + \"365b89ceec577ebec0a39c938c2363f0.js\";","module.exports = __webpack_public_path__ + \"7c9c55eb1a1e5c1dfd63631511d9a1f0.js\";","module.exports = __webpack_public_path__ + \"92f4aab5c66f6269c7054c8fbcb3de13.js\";","module.exports = __webpack_public_path__ + \"88bbfb9fdb8730ffc23f546b42d8d620.js\";","module.exports = __webpack_public_path__ + \"5e55b301888460bd06c8e26d1011e01a.js\";","module.exports = __webpack_public_path__ + \"d78d3b050ea95b068380d975fd413fd7.js\";","module.exports = __webpack_public_path__ + \"130340e2c62b9e858f186dab5f491e55.js\";","module.exports = __webpack_public_path__ + \"444ababf8edc26948943fbb45bd06a19.js\";","module.exports = __webpack_public_path__ + \"a7ee57271362584c03afcd3587284a2b.js\";","module.exports = __webpack_public_path__ + \"b20cd9acf45420fcacfd923754185663.js\";","module.exports = __webpack_public_path__ + \"506d44d8712a22011ce2bec8adbb19b2.js\";","module.exports = __webpack_public_path__ + \"cbdc4ca43a8c940a6c3f59a8b6f17df5.js\";","module.exports = __webpack_public_path__ + \"4bf3bc1fbdd26ac698fef1bdf26e3ff4.js\";","module.exports = __webpack_public_path__ + \"58598705e7012f4ca1eb1dd21d3c59a5.js\";","module.exports = __webpack_public_path__ + \"d1efdca26800423a363b769b1834cfcf.js\";","module.exports = __webpack_public_path__ + \"6fd6a6ddbcbbebe735c9d21e594203ec.js\";","module.exports = __webpack_public_path__ + \"c728b4ef87cfd5f561d1601f0867c39d.js\";","module.exports = __webpack_public_path__ + \"83387cb17a7680f59240e7b399e3ac2b.js\";","module.exports = __webpack_public_path__ + \"b25188cf2652d63136d5e54c38abf84e.js\";","module.exports = __webpack_public_path__ + \"e0adad8a8579bf99f3e22f7c214a5c64.js\";","module.exports = __webpack_public_path__ + \"e6fae0b04a3000a57f22bb25325c8afe.js\";","module.exports = __webpack_public_path__ + \"3e277a4ce5486a806a00497aea8ecdd3.js\";","module.exports = __webpack_public_path__ + \"f80efec9a63094f19edae0480a0f2cd8.js\";","module.exports = __webpack_public_path__ + \"0731d7568a06d2e28351781370bc52bb.js\";","module.exports = __webpack_public_path__ + \"4d143a2d103a9e376a9e3b55e680eef7.js\";","module.exports = __webpack_public_path__ + \"37ee3b5201ae2e2dc5dc8b1b20ad900e.js\";","module.exports = __webpack_public_path__ + \"a46e90b37415c639a6633f73e1cb1831.js\";","module.exports = __webpack_public_path__ + \"80a171b7595d1161735e23dec8efddd6.js\";","module.exports = __webpack_public_path__ + \"ecd02712f5a40fcdaa3bfa8190470024.js\";","module.exports = __webpack_public_path__ + \"11dc77ef2ea3a04834945a52f7de2072.js\";","module.exports = __webpack_public_path__ + \"dfb7dd1fab06b2403f76c23f80b15738.js\";","module.exports = __webpack_public_path__ + \"7f407a1006eb830d6f0aaad96c133d26.js\";","module.exports = __webpack_public_path__ + \"4b61fe945e9e73aba22717e5d6f080df.js\";","module.exports = __webpack_public_path__ + \"6b5b48da5c5105b48553ea966aeb42f2.js\";","module.exports = __webpack_public_path__ + \"d5f79987405c2169278f8de37bcc9d05.js\";","module.exports = __webpack_public_path__ + \"54b3396acd2c700969248de4b20cbf7c.js\";","module.exports = __webpack_public_path__ + \"f0548260c0ac6b0e7cdb8909df1a5333.js\";","module.exports = __webpack_public_path__ + \"efc14cdf19554635e477781704353ec2.js\";","module.exports = __webpack_public_path__ + \"77aaca51c1c32acaf32656d45f4dc017.js\";","module.exports = __webpack_public_path__ + \"f582d9feb91d31036d3dae4cdaea865f.js\";","module.exports = __webpack_public_path__ + \"c45445ab45defa960329c6f8e6224e57.js\";","module.exports = __webpack_public_path__ + \"0a9cd3d62e7f1cd404606c50d9da86fb.js\";","module.exports = __webpack_public_path__ + \"582e24f5ba929e358fadfc7be4c18025.js\";","module.exports = __webpack_public_path__ + \"b7b7be8216519adf62d75f123f9c6423.js\";","module.exports = __webpack_public_path__ + \"70444b162e14964ab08d5956e765b3d9.js\";","module.exports = __webpack_public_path__ + \"b2ff96fbe6501ff45c37491b94c96c5f.js\";","module.exports = __webpack_public_path__ + \"76cb9827afdb9572851dc1d8d03e5750.js\";","module.exports = __webpack_public_path__ + \"cc01c76461e0bea970f368ed0a6df7d2.js\";","module.exports = __webpack_public_path__ + \"2fc0239242a898632ca8aa451cb930c2.js\";","module.exports = __webpack_public_path__ + \"ddbc961769cd2ff4d4a7a136168ebf4c.js\";","module.exports = __webpack_public_path__ + \"aaddd877950d1e3bf1b3ef0fc0ff596e.js\";","module.exports = __webpack_public_path__ + \"c7ca9dccbac3af7ebc82b271dd2aa570.js\";","module.exports = __webpack_public_path__ + \"1c57b3481f295105588972ffa1305521.js\";","module.exports = __webpack_public_path__ + \"09563004132aabcfcc186943555a92a1.js\";","module.exports = __webpack_public_path__ + \"5fedbf948ed123687f77167fac1faf8b.js\";","module.exports = __webpack_public_path__ + \"26fb247a2e0630e1f435cb4d91ec51fd.js\";","module.exports = __webpack_public_path__ + \"25eda4bb98e40a82cfd5b4bf9fbc06ec.js\";","module.exports = __webpack_public_path__ + \"37172facd8a534a38f378ca2a9c7c11b.js\";","module.exports = __webpack_public_path__ + \"755114145e5b97e5571a160a39e716db.js\";","module.exports = __webpack_public_path__ + \"41d8a58fd52b6a06e8d3fb06cdabf67a.js\";","module.exports = __webpack_public_path__ + \"4ef80ee74467e0297eec3cc03092da01.js\";","module.exports = __webpack_public_path__ + \"b460e24d77f9c0d8b21e65d899840adb.js\";","/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\n/**\n * Define a module along with a payload\n * @param module a name for the payload\n * @param payload a function to call with (require, exports, module) params\n */\n\n(function() {\n\nvar ACE_NAMESPACE = \"ace\";\n\nvar global = (function() { return this; })();\nif (!global && typeof window != \"undefined\") global = window; // strict mode\n\n\nif (!ACE_NAMESPACE && typeof requirejs !== \"undefined\")\n    return;\n\n\nvar define = function(module, deps, payload) {\n    if (typeof module !== \"string\") {\n        if (define.original)\n            define.original.apply(this, arguments);\n        else {\n            console.error(\"dropping module because define wasn\\'t a string.\");\n            console.trace();\n        }\n        return;\n    }\n    if (arguments.length == 2)\n        payload = deps;\n    if (!define.modules[module]) {\n        define.payloads[module] = payload;\n        define.modules[module] = null;\n    }\n};\n\ndefine.modules = {};\ndefine.payloads = {};\n\n/**\n * Get at functionality define()ed using the function above\n */\nvar _require = function(parentId, module, callback) {\n    if (typeof module === \"string\") {\n        var payload = lookup(parentId, module);\n        if (payload != undefined) {\n            callback && callback();\n            return payload;\n        }\n    } else if (Object.prototype.toString.call(module) === \"[object Array]\") {\n        var params = [];\n        for (var i = 0, l = module.length; i < l; ++i) {\n            var dep = lookup(parentId, module[i]);\n            if (dep == undefined && require.original)\n                return;\n            params.push(dep);\n        }\n        return callback && callback.apply(null, params) || true;\n    }\n};\n\nvar require = function(module, callback) {\n    var packagedModule = _require(\"\", module, callback);\n    if (packagedModule == undefined && require.original)\n        return require.original.apply(this, arguments);\n    return packagedModule;\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = base + \"/\" + moduleName;\n\n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    return moduleName;\n};\n\n/**\n * Internal function to lookup moduleNames and resolve them by calling the\n * definition function if needed.\n */\nvar lookup = function(parentId, moduleName) {\n    moduleName = normalizeModule(parentId, moduleName);\n\n    var module = define.modules[moduleName];\n    if (!module) {\n        module = define.payloads[moduleName];\n        if (typeof module === 'function') {\n            var exports = {};\n            var mod = {\n                id: moduleName,\n                uri: '',\n                exports: exports,\n                packaged: true\n            };\n\n            var req = function(module, callback) {\n                return _require(moduleName, module, callback);\n            };\n\n            var returnValue = module(req, exports, mod);\n            exports = returnValue || mod.exports;\n            define.modules[moduleName] = exports;\n            delete define.payloads[moduleName];\n        }\n        module = define.modules[moduleName] = exports || module;\n    }\n    return module;\n};\n\nfunction exportAce(ns) {\n    var root = global;\n    if (ns) {\n        if (!global[ns])\n            global[ns] = {};\n        root = global[ns];\n    }\n\n    if (!root.define || !root.define.packaged) {\n        define.original = root.define;\n        root.define = define;\n        root.define.packaged = true;\n    }\n\n    if (!root.require || !root.require.packaged) {\n        require.original = root.require;\n        root.require = require;\n        root.require.packaged = true;\n    }\n}\n\nexportAce(ACE_NAMESPACE);\n\n})();\n\nace.define(\"ace/lib/fixoldbrowsers\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nif (typeof Element != \"undefined\" && !Element.prototype.remove) {\n    Object.defineProperty(Element.prototype, \"remove\", {\n        enumerable: false,\n        writable: true,\n        configurable: true,\n        value: function() { this.parentNode && this.parentNode.removeChild(this); }\n    });\n}\n\n\n});\n\nace.define(\"ace/lib/useragent\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nexports.OS = {\n    LINUX: \"LINUX\",\n    MAC: \"MAC\",\n    WINDOWS: \"WINDOWS\"\n};\nexports.getOS = function() {\n    if (exports.isMac) {\n        return exports.OS.MAC;\n    } else if (exports.isLinux) {\n        return exports.OS.LINUX;\n    } else {\n        return exports.OS.WINDOWS;\n    }\n};\nvar _navigator = typeof navigator == \"object\" ? navigator : {};\n\nvar os = (/mac|win|linux/i.exec(_navigator.platform) || [\"other\"])[0].toLowerCase();\nvar ua = _navigator.userAgent || \"\";\nvar appName = _navigator.appName || \"\";\nexports.isWin = (os == \"win\");\nexports.isMac = (os == \"mac\");\nexports.isLinux = (os == \"linux\");\nexports.isIE = \n    (appName == \"Microsoft Internet Explorer\" || appName.indexOf(\"MSAppHost\") >= 0)\n    ? parseFloat((ua.match(/(?:MSIE |Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1])\n    : parseFloat((ua.match(/(?:Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1]); // for ie\n    \nexports.isOldIE = exports.isIE && exports.isIE < 9;\nexports.isGecko = exports.isMozilla = ua.match(/ Gecko\\/\\d+/);\nexports.isOpera = typeof opera == \"object\" && Object.prototype.toString.call(window.opera) == \"[object Opera]\";\nexports.isWebKit = parseFloat(ua.split(\"WebKit/\")[1]) || undefined;\n\nexports.isChrome = parseFloat(ua.split(\" Chrome/\")[1]) || undefined;\n\nexports.isEdge = parseFloat(ua.split(\" Edge/\")[1]) || undefined;\n\nexports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\nexports.isAndroid = ua.indexOf(\"Android\") >= 0;\n\nexports.isChromeOS = ua.indexOf(\" CrOS \") >= 0;\n\nexports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream;\n\nif (exports.isIOS) exports.isMac = true;\n\nexports.isMobile = exports.isIOS || exports.isAndroid;\n\n});\n\nace.define(\"ace/lib/dom\",[\"require\",\"exports\",\"module\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar useragent = require(\"./useragent\"); \nvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nexports.buildDom = function buildDom(arr, parent, refs) {\n    if (typeof arr == \"string\" && arr) {\n        var txt = document.createTextNode(arr);\n        if (parent)\n            parent.appendChild(txt);\n        return txt;\n    }\n    \n    if (!Array.isArray(arr)) {\n        if (arr && arr.appendChild && parent)\n            parent.appendChild(arr);\n        return arr;\n    }\n    if (typeof arr[0] != \"string\" || !arr[0]) {\n        var els = [];\n        for (var i = 0; i < arr.length; i++) {\n            var ch = buildDom(arr[i], parent, refs);\n            ch && els.push(ch);\n        }\n        return els;\n    }\n    \n    var el = document.createElement(arr[0]);\n    var options = arr[1];\n    var childIndex = 1;\n    if (options && typeof options == \"object\" && !Array.isArray(options))\n        childIndex = 2;\n    for (var i = childIndex; i < arr.length; i++)\n        buildDom(arr[i], el, refs);\n    if (childIndex == 2) {\n        Object.keys(options).forEach(function(n) {\n            var val = options[n];\n            if (n === \"class\") {\n                el.className = Array.isArray(val) ? val.join(\" \") : val;\n            } else if (typeof val == \"function\" || n == \"value\" || n[0] == \"$\") {\n                el[n] = val;\n            } else if (n === \"ref\") {\n                if (refs) refs[val] = el;\n            } else if (val != null) {\n                el.setAttribute(n, val);\n            }\n        });\n    }\n    if (parent)\n        parent.appendChild(el);\n    return el;\n};\n\nexports.getDocumentHead = function(doc) {\n    if (!doc)\n        doc = document;\n    return doc.head || doc.getElementsByTagName(\"head\")[0] || doc.documentElement;\n};\n\nexports.createElement = function(tag, ns) {\n    return document.createElementNS ?\n           document.createElementNS(ns || XHTML_NS, tag) :\n           document.createElement(tag);\n};\n\nexports.removeChildren = function(element) {\n    element.innerHTML = \"\";\n};\n\nexports.createTextNode = function(textContent, element) {\n    var doc = element ? element.ownerDocument : document;\n    return doc.createTextNode(textContent);\n};\n\nexports.createFragment = function(element) {\n    var doc = element ? element.ownerDocument : document;\n    return doc.createDocumentFragment();\n};\n\nexports.hasCssClass = function(el, name) {\n    var classes = (el.className + \"\").split(/\\s+/g);\n    return classes.indexOf(name) !== -1;\n};\nexports.addCssClass = function(el, name) {\n    if (!exports.hasCssClass(el, name)) {\n        el.className += \" \" + name;\n    }\n};\nexports.removeCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g);\n    while (true) {\n        var index = classes.indexOf(name);\n        if (index == -1) {\n            break;\n        }\n        classes.splice(index, 1);\n    }\n    el.className = classes.join(\" \");\n};\n\nexports.toggleCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g), add = true;\n    while (true) {\n        var index = classes.indexOf(name);\n        if (index == -1) {\n            break;\n        }\n        add = false;\n        classes.splice(index, 1);\n    }\n    if (add)\n        classes.push(name);\n\n    el.className = classes.join(\" \");\n    return add;\n};\nexports.setCssClass = function(node, className, include) {\n    if (include) {\n        exports.addCssClass(node, className);\n    } else {\n        exports.removeCssClass(node, className);\n    }\n};\n\nexports.hasCssString = function(id, doc) {\n    var index = 0, sheets;\n    doc = doc || document;\n    if ((sheets = doc.querySelectorAll(\"style\"))) {\n        while (index < sheets.length)\n            if (sheets[index++].id === id)\n                return true;\n    }\n};\n\nexports.importCssString = function importCssString(cssText, id, target) {\n    var container = target;\n    if (!target || !target.getRootNode) {\n        container = document;\n    } else {\n        container = target.getRootNode();\n        if (!container || container == target)\n            container = document;\n    }\n    \n    var doc = container.ownerDocument || container;\n    if (id && exports.hasCssString(id, container))\n        return null;\n    \n    if (id)\n        cssText += \"\\n/*# sourceURL=ace/css/\" + id + \" */\";\n    \n    var style = exports.createElement(\"style\");\n    style.appendChild(doc.createTextNode(cssText));\n    if (id)\n        style.id = id;\n\n    if (container == doc)\n        container = exports.getDocumentHead(doc);\n    container.insertBefore(style, container.firstChild);\n};\n\nexports.importCssStylsheet = function(uri, doc) {\n    exports.buildDom([\"link\", {rel: \"stylesheet\", href: uri}], exports.getDocumentHead(doc));\n};\nexports.scrollbarWidth = function(document) {\n    var inner = exports.createElement(\"ace_inner\");\n    inner.style.width = \"100%\";\n    inner.style.minWidth = \"0px\";\n    inner.style.height = \"200px\";\n    inner.style.display = \"block\";\n\n    var outer = exports.createElement(\"ace_outer\");\n    var style = outer.style;\n\n    style.position = \"absolute\";\n    style.left = \"-10000px\";\n    style.overflow = \"hidden\";\n    style.width = \"200px\";\n    style.minWidth = \"0px\";\n    style.height = \"150px\";\n    style.display = \"block\";\n\n    outer.appendChild(inner);\n\n    var body = document.documentElement;\n    body.appendChild(outer);\n\n    var noScrollbar = inner.offsetWidth;\n\n    style.overflow = \"scroll\";\n    var withScrollbar = inner.offsetWidth;\n\n    if (noScrollbar == withScrollbar) {\n        withScrollbar = outer.clientWidth;\n    }\n\n    body.removeChild(outer);\n\n    return noScrollbar-withScrollbar;\n};\n\nif (typeof document == \"undefined\") {\n    exports.importCssString = function() {};\n}\n\nexports.computedStyle = function(element, style) {\n    return window.getComputedStyle(element, \"\") || {};\n};\n\nexports.setStyle = function(styles, property, value) {\n    if (styles[property] !== value) {\n        styles[property] = value;\n    }\n};\n\nexports.HAS_CSS_ANIMATION = false;\nexports.HAS_CSS_TRANSFORMS = false;\nexports.HI_DPI = useragent.isWin\n    ? typeof window !== \"undefined\" && window.devicePixelRatio >= 1.5\n    : true;\n\nif (typeof document !== \"undefined\") {\n    var div = document.createElement(\"div\");\n    if (exports.HI_DPI && div.style.transform  !== undefined)\n        exports.HAS_CSS_TRANSFORMS = true;\n    if (!useragent.isEdge && typeof div.style.animationName !== \"undefined\")\n        exports.HAS_CSS_ANIMATION = true;\n    div = null;\n}\n\nif (exports.HAS_CSS_TRANSFORMS) {\n    exports.translate = function(element, tx, ty) {\n        element.style.transform = \"translate(\" + Math.round(tx) + \"px, \" + Math.round(ty) +\"px)\";\n    };\n} else {\n    exports.translate = function(element, tx, ty) {\n        element.style.top = Math.round(ty) + \"px\";\n        element.style.left = Math.round(tx) + \"px\";\n    };\n}\n\n});\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, superCtor) {\n    ctor.super_ = superCtor;\n    ctor.prototype = Object.create(superCtor.prototype, {\n        constructor: {\n            value: ctor,\n            enumerable: false,\n            writable: true,\n            configurable: true\n        }\n    });\n};\n\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/keys\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./oop\");\nvar Keys = (function() {\n    var ret = {\n        MODIFIER_KEYS: {\n            16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta',\n            91: 'MetaLeft', 92: 'MetaRight', 93: 'ContextMenu'\n        },\n\n        KEY_MODS: {\n            \"ctrl\": 1, \"alt\": 2, \"option\" : 2, \"shift\": 4,\n            \"super\": 8, \"meta\": 8, \"command\": 8, \"cmd\": 8, \n            \"control\": 1\n        },\n\n        FUNCTION_KEYS : {\n            8  : \"Backspace\",\n            9  : \"Tab\",\n            13 : \"Return\",\n            19 : \"Pause\",\n            27 : \"Esc\",\n            32 : \"Space\",\n            33 : \"PageUp\",\n            34 : \"PageDown\",\n            35 : \"End\",\n            36 : \"Home\",\n            37 : \"Left\",\n            38 : \"Up\",\n            39 : \"Right\",\n            40 : \"Down\",\n            44 : \"Print\",\n            45 : \"Insert\",\n            46 : \"Delete\",\n            96 : \"Numpad0\",\n            97 : \"Numpad1\",\n            98 : \"Numpad2\",\n            99 : \"Numpad3\",\n            100: \"Numpad4\",\n            101: \"Numpad5\",\n            102: \"Numpad6\",\n            103: \"Numpad7\",\n            104: \"Numpad8\",\n            105: \"Numpad9\",\n            '-13': \"NumpadEnter\",\n            112: \"F1\",\n            113: \"F2\",\n            114: \"F3\",\n            115: \"F4\",\n            116: \"F5\",\n            117: \"F6\",\n            118: \"F7\",\n            119: \"F8\",\n            120: \"F9\",\n            121: \"F10\",\n            122: \"F11\",\n            123: \"F12\",\n            144: \"Numlock\",\n            145: \"Scrolllock\"\n        },\n\n        PRINTABLE_KEYS: {\n           32: ' ',  48: '0',  49: '1',  50: '2',  51: '3',  52: '4', 53:  '5',\n           54: '6',  55: '7',  56: '8',  57: '9',  59: ';',  61: '=', 65:  'a',\n           66: 'b',  67: 'c',  68: 'd',  69: 'e',  70: 'f',  71: 'g', 72:  'h',\n           73: 'i',  74: 'j',  75: 'k',  76: 'l',  77: 'm',  78: 'n', 79:  'o',\n           80: 'p',  81: 'q',  82: 'r',  83: 's',  84: 't',  85: 'u', 86:  'v',\n           87: 'w',  88: 'x',  89: 'y',  90: 'z', 107: '+', 109: '-', 110: '.',\n          186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`',\n          219: '[', 220: '\\\\',221: ']', 222: \"'\", 111: '/', 106: '*'\n        }\n    };\n    var name, i;\n    for (i in ret.FUNCTION_KEYS) {\n        name = ret.FUNCTION_KEYS[i].toLowerCase();\n        ret[name] = parseInt(i, 10);\n    }\n    for (i in ret.PRINTABLE_KEYS) {\n        name = ret.PRINTABLE_KEYS[i].toLowerCase();\n        ret[name] = parseInt(i, 10);\n    }\n    oop.mixin(ret, ret.MODIFIER_KEYS);\n    oop.mixin(ret, ret.PRINTABLE_KEYS);\n    oop.mixin(ret, ret.FUNCTION_KEYS);\n    ret.enter = ret[\"return\"];\n    ret.escape = ret.esc;\n    ret.del = ret[\"delete\"];\n    ret[173] = '-';\n    \n    (function() {\n        var mods = [\"cmd\", \"ctrl\", \"alt\", \"shift\"];\n        for (var i = Math.pow(2, mods.length); i--;) {            \n            ret.KEY_MODS[i] = mods.filter(function(x) {\n                return i & ret.KEY_MODS[x];\n            }).join(\"-\") + \"-\";\n        }\n    })();\n\n    ret.KEY_MODS[0] = \"\";\n    ret.KEY_MODS[-1] = \"input-\";\n\n    return ret;\n})();\noop.mixin(exports, Keys);\n\nexports.keyCodeToString = function(keyCode) {\n    var keyString = Keys[keyCode];\n    if (typeof keyString != \"string\")\n        keyString = String.fromCharCode(keyCode);\n    return keyString.toLowerCase();\n};\n\n});\n\nace.define(\"ace/lib/event\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar keys = require(\"./keys\");\nvar useragent = require(\"./useragent\");\n\nvar pressedKeys = null;\nvar ts = 0;\n\nvar activeListenerOptions;\nfunction detectListenerOptionsSupport() {\n    activeListenerOptions = false;\n    try {\n        document.createComment(\"\").addEventListener(\"test\", function() {}, { \n            get passive() { \n                activeListenerOptions = {passive: false};\n            }\n        });\n    } catch(e) {}\n}\n\nfunction getListenerOptions() {\n    if (activeListenerOptions == undefined)\n        detectListenerOptionsSupport();\n    return activeListenerOptions;\n}\n\nfunction EventListener(elem, type, callback) {\n    this.elem = elem;\n    this.type = type;\n    this.callback = callback;\n}\nEventListener.prototype.destroy = function() {\n    removeListener(this.elem, this.type, this.callback);\n    this.elem = this.type = this.callback = undefined;\n};\n\nvar addListener = exports.addListener = function(elem, type, callback, destroyer) {\n    elem.addEventListener(type, callback, getListenerOptions());\n    if (destroyer)\n        destroyer.$toDestroy.push(new EventListener(elem, type, callback));\n};\n\nvar removeListener = exports.removeListener = function(elem, type, callback) {\n    elem.removeEventListener(type, callback, getListenerOptions());\n};\nexports.stopEvent = function(e) {\n    exports.stopPropagation(e);\n    exports.preventDefault(e);\n    return false;\n};\n\nexports.stopPropagation = function(e) {\n    if (e.stopPropagation)\n        e.stopPropagation();\n};\n\nexports.preventDefault = function(e) {\n    if (e.preventDefault)\n        e.preventDefault();\n};\nexports.getButton = function(e) {\n    if (e.type == \"dblclick\")\n        return 0;\n    if (e.type == \"contextmenu\" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))\n        return 2;\n    return e.button;\n};\n\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\n    var ownerDocument = el && el.ownerDocument || document;\n    function onMouseUp(e) {\n        eventHandler && eventHandler(e);\n        releaseCaptureHandler && releaseCaptureHandler(e);\n\n        removeListener(ownerDocument, \"mousemove\", eventHandler);\n        removeListener(ownerDocument, \"mouseup\", onMouseUp);\n        removeListener(ownerDocument, \"dragstart\", onMouseUp);\n    }\n\n    addListener(ownerDocument, \"mousemove\", eventHandler);\n    addListener(ownerDocument, \"mouseup\", onMouseUp);\n    addListener(ownerDocument, \"dragstart\", onMouseUp);\n    \n    return onMouseUp;\n};\n\nexports.addMouseWheelListener = function(el, callback, destroyer) {\n    if (\"onmousewheel\" in el) {\n        addListener(el, \"mousewheel\", function(e) {\n            var factor = 8;\n            if (e.wheelDeltaX !== undefined) {\n                e.wheelX = -e.wheelDeltaX / factor;\n                e.wheelY = -e.wheelDeltaY / factor;\n            } else {\n                e.wheelX = 0;\n                e.wheelY = -e.wheelDelta / factor;\n            }\n            callback(e);\n        }, destroyer);\n    } else if (\"onwheel\" in el) {\n        addListener(el, \"wheel\",  function(e) {\n            var factor = 0.35;\n            switch (e.deltaMode) {\n                case e.DOM_DELTA_PIXEL:\n                    e.wheelX = e.deltaX * factor || 0;\n                    e.wheelY = e.deltaY * factor || 0;\n                    break;\n                case e.DOM_DELTA_LINE:\n                case e.DOM_DELTA_PAGE:\n                    e.wheelX = (e.deltaX || 0) * 5;\n                    e.wheelY = (e.deltaY || 0) * 5;\n                    break;\n            }\n            \n            callback(e);\n        }, destroyer);\n    } else {\n        addListener(el, \"DOMMouseScroll\", function(e) {\n            if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\n                e.wheelX = (e.detail || 0) * 5;\n                e.wheelY = 0;\n            } else {\n                e.wheelX = 0;\n                e.wheelY = (e.detail || 0) * 5;\n            }\n            callback(e);\n        }, destroyer);\n    }\n};\n\nexports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName, destroyer) {\n    var clicks = 0;\n    var startX, startY, timer; \n    var eventNames = {\n        2: \"dblclick\",\n        3: \"tripleclick\",\n        4: \"quadclick\"\n    };\n\n    function onMousedown(e) {\n        if (exports.getButton(e) !== 0) {\n            clicks = 0;\n        } else if (e.detail > 1) {\n            clicks++;\n            if (clicks > 4)\n                clicks = 1;\n        } else {\n            clicks = 1;\n        }\n        if (useragent.isIE) {\n            var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n            if (!timer || isNewClick)\n                clicks = 1;\n            if (timer)\n                clearTimeout(timer);\n            timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600);\n\n            if (clicks == 1) {\n                startX = e.clientX;\n                startY = e.clientY;\n            }\n        }\n        \n        e._clicks = clicks;\n\n        eventHandler[callbackName](\"mousedown\", e);\n\n        if (clicks > 4)\n            clicks = 0;\n        else if (clicks > 1)\n            return eventHandler[callbackName](eventNames[clicks], e);\n    }\n    if (!Array.isArray(elements))\n        elements = [elements];\n    elements.forEach(function(el) {\n        addListener(el, \"mousedown\", onMousedown, destroyer);\n    });\n};\n\nvar getModifierHash = function(e) {\n    return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\n};\n\nexports.getModifierString = function(e) {\n    return keys.KEY_MODS[getModifierHash(e)];\n};\n\nfunction normalizeCommandKeys(callback, e, keyCode) {\n    var hashId = getModifierHash(e);\n\n    if (!useragent.isMac && pressedKeys) {\n        if (e.getModifierState && (e.getModifierState(\"OS\") || e.getModifierState(\"Win\")))\n            hashId |= 8;\n        if (pressedKeys.altGr) {\n            if ((3 & hashId) != 3)\n                pressedKeys.altGr = 0;\n            else\n                return;\n        }\n        if (keyCode === 18 || keyCode === 17) {\n            var location = \"location\" in e ? e.location : e.keyLocation;\n            if (keyCode === 17 && location === 1) {\n                if (pressedKeys[keyCode] == 1)\n                    ts = e.timeStamp;\n            } else if (keyCode === 18 && hashId === 3 && location === 2) {\n                var dt = e.timeStamp - ts;\n                if (dt < 50)\n                    pressedKeys.altGr = true;\n            }\n        }\n    }\n    \n    if (keyCode in keys.MODIFIER_KEYS) {\n        keyCode = -1;\n    }\n    \n    if (!hashId && keyCode === 13) {\n        var location = \"location\" in e ? e.location : e.keyLocation;\n        if (location === 3) {\n            callback(e, hashId, -keyCode);\n            if (e.defaultPrevented)\n                return;\n        }\n    }\n    \n    if (useragent.isChromeOS && hashId & 8) {\n        callback(e, hashId, keyCode);\n        if (e.defaultPrevented)\n            return;\n        else\n            hashId &= ~8;\n    }\n    if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\n        return false;\n    }\n    \n    return callback(e, hashId, keyCode);\n}\n\n\nexports.addCommandKeyListener = function(el, callback, destroyer) {\n    if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n        var lastKeyDownKeyCode = null;\n        addListener(el, \"keydown\", function(e) {\n            lastKeyDownKeyCode = e.keyCode;\n        }, destroyer);\n        addListener(el, \"keypress\", function(e) {\n            return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n        }, destroyer);\n    } else {\n        var lastDefaultPrevented = null;\n\n        addListener(el, \"keydown\", function(e) {\n            pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1;\n            var result = normalizeCommandKeys(callback, e, e.keyCode);\n            lastDefaultPrevented = e.defaultPrevented;\n            return result;\n        }, destroyer);\n\n        addListener(el, \"keypress\", function(e) {\n            if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {\n                exports.stopEvent(e);\n                lastDefaultPrevented = null;\n            }\n        }, destroyer);\n\n        addListener(el, \"keyup\", function(e) {\n            pressedKeys[e.keyCode] = null;\n        }, destroyer);\n\n        if (!pressedKeys) {\n            resetPressedKeys();\n            addListener(window, \"focus\", resetPressedKeys);\n        }\n    }\n};\nfunction resetPressedKeys() {\n    pressedKeys = Object.create(null);\n}\n\nif (typeof window == \"object\" && window.postMessage && !useragent.isOldIE) {\n    var postMessageId = 1;\n    exports.nextTick = function(callback, win) {\n        win = win || window;\n        var messageName = \"zero-timeout-message-\" + (postMessageId++);\n        \n        var listener = function(e) {\n            if (e.data == messageName) {\n                exports.stopPropagation(e);\n                removeListener(win, \"message\", listener);\n                callback();\n            }\n        };\n        \n        addListener(win, \"message\", listener);\n        win.postMessage(messageName, \"*\");\n    };\n}\n\nexports.$idleBlocked = false;\nexports.onIdle = function(cb, timeout) {\n    return setTimeout(function handler() {\n        if (!exports.$idleBlocked) {\n            cb();\n        } else {\n            setTimeout(handler, 100);\n        }\n    }, timeout);\n};\n\nexports.$idleBlockId = null;\nexports.blockIdle = function(delay) {\n    if (exports.$idleBlockId)\n        clearTimeout(exports.$idleBlockId);\n        \n    exports.$idleBlocked = true;\n    exports.$idleBlockId = setTimeout(function() {\n        exports.$idleBlocked = false;\n    }, delay || 100);\n};\n\nexports.nextFrame = typeof window == \"object\" && (window.requestAnimationFrame\n    || window.mozRequestAnimationFrame\n    || window.webkitRequestAnimationFrame\n    || window.msRequestAnimationFrame\n    || window.oRequestAnimationFrame);\n\nif (exports.nextFrame)\n    exports.nextFrame = exports.nextFrame.bind(window);\nelse\n    exports.nextFrame = function(callback) {\n        setTimeout(callback, 17);\n    };\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            }\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0);\n        else\n            return new Range(this.start.row, 0, this.end.row, 0);\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n    return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i Date.now() - 50)\n            return true;\n        return $cancelT = false;\n    },\n    cancel: function() {\n        $cancelT = Date.now();\n    }\n};\n\n});\n\nace.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) {\n\"use strict\";\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar clipboard = require(\"../clipboard\");\nvar BROKEN_SETDATA = useragent.isChrome < 18;\nvar USE_IE_MIME_TYPE =  useragent.isIE;\nvar HAS_FOCUS_ARGS = useragent.isChrome > 63;\nvar MAX_LINE_LENGTH = 400;\n\nvar KEYS = require(\"../lib/keys\");\nvar MODS = KEYS.KEY_MODS;\nvar isIOS = useragent.isIOS;\nvar valueResetRegex = isIOS ? /\\s/ : /\\n/;\nvar isMobile = useragent.isMobile;\n\nvar TextInput = function(parentNode, host) {\n    var text = dom.createElement(\"textarea\");\n    text.className = \"ace_text-input\";\n\n    text.setAttribute(\"wrap\", \"off\");\n    text.setAttribute(\"autocorrect\", \"off\");\n    text.setAttribute(\"autocapitalize\", \"off\");\n    text.setAttribute(\"spellcheck\", false);\n\n    text.style.opacity = \"0\";\n    parentNode.insertBefore(text, parentNode.firstChild);\n\n    var copied = false;\n    var pasted = false;\n    var inComposition = false;\n    var sendingText = false;\n    var tempStyle = '';\n    \n    if (!isMobile)\n        text.style.fontSize = \"1px\";\n\n    var commandMode = false;\n    var ignoreFocusEvents = false;\n    \n    var lastValue = \"\";\n    var lastSelectionStart = 0;\n    var lastSelectionEnd = 0;\n    var lastRestoreEnd = 0;\n    try { var isFocused = document.activeElement === text; } catch(e) {}\n    \n    event.addListener(text, \"blur\", function(e) {\n        if (ignoreFocusEvents) return;\n        host.onBlur(e);\n        isFocused = false;\n    }, host);\n    event.addListener(text, \"focus\", function(e) {\n        if (ignoreFocusEvents) return;\n        isFocused = true;\n        if (useragent.isEdge) {\n            try {\n                if (!document.hasFocus())\n                    return;\n            } catch(e) {}\n        }\n        host.onFocus(e);\n        if (useragent.isEdge)\n            setTimeout(resetSelection);\n        else\n            resetSelection();\n    }, host);\n    this.$focusScroll = false;\n    this.focus = function() {\n        if (tempStyle || HAS_FOCUS_ARGS || this.$focusScroll == \"browser\")\n            return text.focus({ preventScroll: true });\n\n        var top = text.style.top;\n        text.style.position = \"fixed\";\n        text.style.top = \"0px\";\n        try {\n            var isTransformed = text.getBoundingClientRect().top != 0;\n        } catch(e) {\n            return;\n        }\n        var ancestors = [];\n        if (isTransformed) {\n            var t = text.parentElement;\n            while (t && t.nodeType == 1) {\n                ancestors.push(t);\n                t.setAttribute(\"ace_nocontext\", true);\n                if (!t.parentElement && t.getRootNode)\n                    t = t.getRootNode().host;\n                else\n                    t = t.parentElement;\n            }\n        }\n        text.focus({ preventScroll: true });\n        if (isTransformed) {\n            ancestors.forEach(function(p) {\n                p.removeAttribute(\"ace_nocontext\");\n            });\n        }\n        setTimeout(function() {\n            text.style.position = \"\";\n            if (text.style.top == \"0px\")\n                text.style.top = top;\n        }, 0);\n    };\n    this.blur = function() {\n        text.blur();\n    };\n    this.isFocused = function() {\n        return isFocused;\n    };\n    \n    host.on(\"beforeEndOperation\", function() {\n        var curOp = host.curOp;\n        var commandName = curOp && curOp.command && curOp.command.name;\n        if (commandName == \"insertstring\")\n            return;\n        var isUserAction = commandName && (curOp.docChanged || curOp.selectionChanged);\n        if (inComposition && isUserAction) {\n            lastValue = text.value = \"\";\n            onCompositionEnd();\n        }\n        resetSelection();\n    });\n    \n    var resetSelection = isIOS\n    ? function(value) {\n        if (!isFocused || (copied && !value) || sendingText) return;\n        if (!value) \n            value = \"\";\n        var newValue = \"\\n ab\" + value + \"cde fg\\n\";\n        if (newValue != text.value)\n            text.value = lastValue = newValue;\n        \n        var selectionStart = 4;\n        var selectionEnd = 4 + (value.length || (host.selection.isEmpty() ? 0 : 1));\n\n        if (lastSelectionStart != selectionStart || lastSelectionEnd != selectionEnd) {\n            text.setSelectionRange(selectionStart, selectionEnd);\n        }\n        lastSelectionStart = selectionStart;\n        lastSelectionEnd = selectionEnd;\n    }\n    : function() {\n        if (inComposition || sendingText)\n            return;\n        if (!isFocused && !afterContextMenu)\n            return;\n        inComposition = true;\n        \n        var selectionStart = 0;\n        var selectionEnd = 0;\n        var line = \"\";\n\n        if (host.session) {\n            var selection = host.selection;\n            var range = selection.getRange();\n            var row = selection.cursor.row;\n            selectionStart = range.start.column;\n            selectionEnd = range.end.column;\n            line = host.session.getLine(row);\n\n            if (range.start.row != row) {\n                var prevLine = host.session.getLine(row - 1);\n                selectionStart = range.start.row < row - 1 ? 0 : selectionStart;\n                selectionEnd += prevLine.length + 1;\n                line = prevLine + \"\\n\" + line;\n            }\n            else if (range.end.row != row) {\n                var nextLine = host.session.getLine(row + 1);\n                selectionEnd = range.end.row > row  + 1 ? nextLine.length : selectionEnd;\n                selectionEnd += line.length + 1;\n                line = line + \"\\n\" + nextLine;\n            }\n            else if (isMobile && row > 0) {\n                line = \"\\n\" + line;\n                selectionEnd += 1;\n                selectionStart += 1;\n            }\n\n            if (line.length > MAX_LINE_LENGTH) {\n                if (selectionStart < MAX_LINE_LENGTH && selectionEnd < MAX_LINE_LENGTH) {\n                    line = line.slice(0, MAX_LINE_LENGTH);\n                } else {\n                    line = \"\\n\";\n                    if (selectionStart == selectionEnd) {\n                        selectionStart = selectionEnd = 0;\n                    }\n                    else {\n                        selectionStart = 0;\n                        selectionEnd = 1;\n                    }\n                }\n            }\n        }\n\n        var newValue = line + \"\\n\\n\";\n        if (newValue != lastValue) {\n            text.value = lastValue = newValue;\n            lastSelectionStart = lastSelectionEnd = newValue.length;\n        }\n        if (afterContextMenu) {\n            lastSelectionStart = text.selectionStart;\n            lastSelectionEnd = text.selectionEnd;\n        }\n        if (\n            lastSelectionEnd != selectionEnd \n            || lastSelectionStart != selectionStart \n            || text.selectionEnd != lastSelectionEnd // on ie edge selectionEnd changes silently after the initialization\n        ) {\n            try {\n                text.setSelectionRange(selectionStart, selectionEnd);\n                lastSelectionStart = selectionStart;\n                lastSelectionEnd = selectionEnd;\n            } catch(e){}\n        }\n        inComposition = false;\n    };\n    this.resetSelection = resetSelection;\n\n    if (isFocused)\n        host.onFocus();\n\n\n    var isAllSelected = function(text) {\n        return text.selectionStart === 0 && text.selectionEnd >= lastValue.length\n            && text.value === lastValue && lastValue\n            && text.selectionEnd !== lastSelectionEnd;\n    };\n\n    var onSelect = function(e) {\n        if (inComposition)\n            return;\n        if (copied) {\n            copied = false;\n        } else if (isAllSelected(text)) {\n            host.selectAll();\n            resetSelection();\n        } else if (isMobile && text.selectionStart != lastSelectionStart) {\n            resetSelection();\n        }\n    };\n\n    var inputHandler = null;\n    this.setInputHandler = function(cb) {inputHandler = cb;};\n    this.getInputHandler = function() {return inputHandler;};\n    var afterContextMenu = false;\n    \n    var sendText = function(value, fromInput) {\n        if (afterContextMenu)\n            afterContextMenu = false;\n        if (pasted) {\n            resetSelection();\n            if (value)\n                host.onPaste(value);\n            pasted = false;\n            return \"\";\n        } else {\n            var selectionStart = text.selectionStart;\n            var selectionEnd = text.selectionEnd;\n        \n            var extendLeft = lastSelectionStart;\n            var extendRight = lastValue.length - lastSelectionEnd;\n            \n            var inserted = value;\n            var restoreStart = value.length - selectionStart;\n            var restoreEnd = value.length - selectionEnd;\n        \n            var i = 0;\n            while (extendLeft > 0 && lastValue[i] == value[i]) {\n                i++;\n                extendLeft--;\n            }\n            inserted = inserted.slice(i);\n            i = 1;\n            while (extendRight > 0 && lastValue.length - i > lastSelectionStart - 1  && lastValue[lastValue.length - i] == value[value.length - i]) {\n                i++;\n                extendRight--;\n            }\n            restoreStart -= i-1;\n            restoreEnd -= i-1;\n            var endIndex = inserted.length - i + 1;\n            if (endIndex < 0) {\n                extendLeft = -endIndex;\n                endIndex = 0;\n            } \n            inserted = inserted.slice(0, endIndex);\n            if (!fromInput && !inserted && !restoreStart && !extendLeft && !extendRight && !restoreEnd)\n                return \"\";\n            sendingText = true;\n            var shouldReset = false;\n            if (useragent.isAndroid && inserted == \". \") {\n                inserted = \"  \";\n                shouldReset = true;\n            }\n            \n            if (inserted && !extendLeft && !extendRight && !restoreStart && !restoreEnd || commandMode) {\n                host.onTextInput(inserted);\n            } else {\n                host.onTextInput(inserted, {\n                    extendLeft: extendLeft,\n                    extendRight: extendRight,\n                    restoreStart: restoreStart,\n                    restoreEnd: restoreEnd\n                });\n            }\n            sendingText = false;\n            \n            lastValue = value;\n            lastSelectionStart = selectionStart;\n            lastSelectionEnd = selectionEnd;\n            lastRestoreEnd = restoreEnd;\n            return shouldReset ? \"\\n\" : inserted;\n        }\n    };\n    var onInput = function(e) {\n        if (inComposition)\n            return onCompositionUpdate();\n        if (e && e.inputType) {\n            if (e.inputType == \"historyUndo\") return host.execCommand(\"undo\");\n            if (e.inputType == \"historyRedo\") return host.execCommand(\"redo\");\n        }\n        var data = text.value;\n        var inserted = sendText(data, true);\n        if (\n            data.length > MAX_LINE_LENGTH + 100 \n            || valueResetRegex.test(inserted)\n            || isMobile && lastSelectionStart < 1 && lastSelectionStart == lastSelectionEnd\n        ) {\n            resetSelection();\n        }\n    };\n    \n    var handleClipboardData = function(e, data, forceIEMime) {\n        var clipboardData = e.clipboardData || window.clipboardData;\n        if (!clipboardData || BROKEN_SETDATA)\n            return;\n        var mime = USE_IE_MIME_TYPE || forceIEMime ? \"Text\" : \"text/plain\";\n        try {\n            if (data) {\n                return clipboardData.setData(mime, data) !== false;\n            } else {\n                return clipboardData.getData(mime);\n            }\n        } catch(e) {\n            if (!forceIEMime)\n                return handleClipboardData(e, data, true);\n        }\n    };\n\n    var doCopy = function(e, isCut) {\n        var data = host.getCopyText();\n        if (!data)\n            return event.preventDefault(e);\n\n        if (handleClipboardData(e, data)) {\n            if (isIOS) {\n                resetSelection(data);\n                copied = data;\n                setTimeout(function () {\n                    copied = false;\n                }, 10);\n            }\n            isCut ? host.onCut() : host.onCopy();\n            event.preventDefault(e);\n        } else {\n            copied = true;\n            text.value = data;\n            text.select();\n            setTimeout(function(){\n                copied = false;\n                resetSelection();\n                isCut ? host.onCut() : host.onCopy();\n            });\n        }\n    };\n    \n    var onCut = function(e) {\n        doCopy(e, true);\n    };\n    \n    var onCopy = function(e) {\n        doCopy(e, false);\n    };\n    \n    var onPaste = function(e) {\n        var data = handleClipboardData(e);\n        if (clipboard.pasteCancelled())\n            return;\n        if (typeof data == \"string\") {\n            if (data)\n                host.onPaste(data, e);\n            if (useragent.isIE)\n                setTimeout(resetSelection);\n            event.preventDefault(e);\n        }\n        else {\n            text.value = \"\";\n            pasted = true;\n        }\n    };\n\n    event.addCommandKeyListener(text, host.onCommandKey.bind(host), host);\n\n    event.addListener(text, \"select\", onSelect, host);\n    event.addListener(text, \"input\", onInput, host);\n\n    event.addListener(text, \"cut\", onCut, host);\n    event.addListener(text, \"copy\", onCopy, host);\n    event.addListener(text, \"paste\", onPaste, host);\n    if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)) {\n        event.addListener(parentNode, \"keydown\", function(e) {\n            if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)\n                return;\n\n            switch (e.keyCode) {\n                case 67:\n                    onCopy(e);\n                    break;\n                case 86:\n                    onPaste(e);\n                    break;\n                case 88:\n                    onCut(e);\n                    break;\n            }\n        }, host);\n    }\n    var onCompositionStart = function(e) {\n        if (inComposition || !host.onCompositionStart || host.$readOnly) \n            return;\n        \n        inComposition = {};\n\n        if (commandMode)\n            return;\n        \n        if (e.data)\n            inComposition.useTextareaForIME = false;\n        \n        setTimeout(onCompositionUpdate, 0);\n        host._signal(\"compositionStart\");\n        host.on(\"mousedown\", cancelComposition);\n        \n        var range = host.getSelectionRange();\n        range.end.row = range.start.row;\n        range.end.column = range.start.column;\n        inComposition.markerRange = range;\n        inComposition.selectionStart = lastSelectionStart;\n        host.onCompositionStart(inComposition);\n        \n        if (inComposition.useTextareaForIME) {\n            lastValue = text.value = \"\";\n            lastSelectionStart = 0;\n            lastSelectionEnd = 0;\n        }\n        else {\n            if (text.msGetInputContext)\n                inComposition.context = text.msGetInputContext();\n            if (text.getInputContext)\n                inComposition.context = text.getInputContext();\n        }\n    };\n\n    var onCompositionUpdate = function() {\n        if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n            return;\n        if (commandMode)\n            return cancelComposition();\n        \n        if (inComposition.useTextareaForIME) {\n            host.onCompositionUpdate(text.value);\n        }\n        else {\n            var data = text.value;\n            sendText(data);\n            if (inComposition.markerRange) {\n                if (inComposition.context) {\n                    inComposition.markerRange.start.column = inComposition.selectionStart\n                        = inComposition.context.compositionStartOffset;\n                }\n                inComposition.markerRange.end.column = inComposition.markerRange.start.column\n                    + lastSelectionEnd - inComposition.selectionStart + lastRestoreEnd;\n            }\n        }\n    };\n\n    var onCompositionEnd = function(e) {\n        if (!host.onCompositionEnd || host.$readOnly) return;\n        inComposition = false;\n        host.onCompositionEnd();\n        host.off(\"mousedown\", cancelComposition);\n        if (e) onInput();\n    };\n    \n\n    function cancelComposition() {\n        ignoreFocusEvents = true;\n        text.blur();\n        text.focus();\n        ignoreFocusEvents = false;\n    }\n\n    var syncComposition = lang.delayedCall(onCompositionUpdate, 50).schedule.bind(null, null);\n    \n    function onKeyup(e) {\n        if (e.keyCode == 27 && text.value.length < text.selectionStart) {\n            if (!inComposition)\n                lastValue = text.value;\n            lastSelectionStart = lastSelectionEnd = -1;\n            resetSelection();\n        }\n        syncComposition();\n    }\n\n    event.addListener(text, \"compositionstart\", onCompositionStart, host);\n    event.addListener(text, \"compositionupdate\", onCompositionUpdate, host);\n    event.addListener(text, \"keyup\", onKeyup, host);\n    event.addListener(text, \"keydown\", syncComposition, host);\n    event.addListener(text, \"compositionend\", onCompositionEnd, host);\n\n    this.getElement = function() {\n        return text;\n    };\n    this.setCommandMode = function(value) {\n       commandMode = value;\n       text.readOnly = false;\n    };\n    \n    this.setReadOnly = function(readOnly) {\n        if (!commandMode)\n            text.readOnly = readOnly;\n    };\n\n    this.setCopyWithEmptySelection = function(value) {\n    };\n\n    this.onContextMenu = function(e) {\n        afterContextMenu = true;\n        resetSelection();\n        host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n        this.moveToMouse(e, true);\n    };\n    \n    this.moveToMouse = function(e, bringToFront) {\n        if (!tempStyle)\n            tempStyle = text.style.cssText;\n        text.style.cssText = (bringToFront ? \"z-index:100000;\" : \"\")\n            + (useragent.isIE ? \"opacity:0.1;\" : \"\")\n            + \"text-indent: -\" + (lastSelectionStart + lastSelectionEnd) * host.renderer.characterWidth * 0.5 + \"px;\";\n\n        var rect = host.container.getBoundingClientRect();\n        var style = dom.computedStyle(host.container);\n        var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n        var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\n        var maxTop = rect.bottom - top - text.clientHeight -2;\n        var move = function(e) {\n            dom.translate(text, e.clientX - left - 2, Math.min(e.clientY - top - 2, maxTop));\n        }; \n        move(e);\n\n        if (e.type != \"mousedown\")\n            return;\n\n        host.renderer.$isMousePressed = true;\n\n        clearTimeout(closeTimeout);\n        if (useragent.isWin)\n            event.capture(host.container, move, onContextMenuClose);\n    };\n\n    this.onContextMenuClose = onContextMenuClose;\n    var closeTimeout;\n    function onContextMenuClose() {\n        clearTimeout(closeTimeout);\n        closeTimeout = setTimeout(function () {\n            if (tempStyle) {\n                text.style.cssText = tempStyle;\n                tempStyle = '';\n            }\n            host.renderer.$isMousePressed = false;\n            if (host.renderer.$keepTextAreaAtCursor)\n                host.renderer.$moveTextAreaToCursor();\n        }, 0);\n    }\n\n    var onContextMenu = function(e) {\n        host.textInput.onContextMenu(e);\n        onContextMenuClose();\n    };\n    event.addListener(text, \"mouseup\", onContextMenu, host);\n    event.addListener(text, \"mousedown\", function(e) {\n        e.preventDefault();\n        onContextMenuClose();\n    }, host);\n    event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu, host);\n    event.addListener(text, \"contextmenu\", onContextMenu, host);\n    \n    if (isIOS)\n        addIosSelectionHandler(parentNode, host, text);\n\n    function addIosSelectionHandler(parentNode, host, text) {\n        var typingResetTimeout = null;\n        var typing = false;\n \n        text.addEventListener(\"keydown\", function (e) {\n            if (typingResetTimeout) clearTimeout(typingResetTimeout);\n            typing = true;\n        }, true);\n\n        text.addEventListener(\"keyup\", function (e) {\n            typingResetTimeout = setTimeout(function () {\n                typing = false;\n            }, 100);\n        }, true);\n        var detectArrowKeys = function(e) {\n            if (document.activeElement !== text) return;\n            if (typing || inComposition || host.$mouseHandler.isMousePressed) return;\n\n            if (copied) {\n                return;\n            }\n            var selectionStart = text.selectionStart;\n            var selectionEnd = text.selectionEnd;\n            \n            var key = null;\n            var modifier = 0;\n            if (selectionStart == 0) {\n                key = KEYS.up;\n            } else if (selectionStart == 1) {\n                key = KEYS.home;\n            } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd] == \"\\n\") {\n                key = KEYS.end;\n            } else if (selectionStart < lastSelectionStart && lastValue[selectionStart - 1] == \" \") {\n                key = KEYS.left;\n                modifier = MODS.option;\n            } else if (\n                selectionStart < lastSelectionStart\n                || (\n                    selectionStart == lastSelectionStart \n                    && lastSelectionEnd != lastSelectionStart\n                    && selectionStart == selectionEnd\n                )\n            ) {\n                key = KEYS.left;\n            } else if (selectionEnd > lastSelectionEnd && lastValue.slice(0, selectionEnd).split(\"\\n\").length > 2) {\n                key = KEYS.down;\n            } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd - 1] == \" \") {\n                key = KEYS.right;\n                modifier = MODS.option;\n            } else if (\n                selectionEnd > lastSelectionEnd\n                || (\n                    selectionEnd == lastSelectionEnd \n                    && lastSelectionEnd != lastSelectionStart\n                    && selectionStart == selectionEnd\n                )\n            ) {\n                key = KEYS.right;\n            }\n            \n            if (selectionStart !== selectionEnd)\n                modifier |= MODS.shift;\n\n            if (key) {\n                var result = host.onCommandKey({}, modifier, key);\n                if (!result && host.commands) {\n                    key = KEYS.keyCodeToString(key);\n                    var command = host.commands.findKeyCommand(modifier, key);\n                    if (command)\n                        host.execCommand(command);\n                }\n                lastSelectionStart = selectionStart;\n                lastSelectionEnd = selectionEnd;\n                resetSelection(\"\");\n            }\n        };\n        document.addEventListener(\"selectionchange\", detectArrowKeys);\n        host.on(\"destroy\", function() {\n            document.removeEventListener(\"selectionchange\", detectArrowKeys);\n        });\n    }\n};\n\nexports.TextInput = TextInput;\nexports.$setUserAgentForTests = function(_isMobile, _isIOS) {\n    isMobile = _isMobile;\n    isIOS = _isIOS;\n};\n});\n\nace.define(\"ace/mouse/default_handlers\",[\"require\",\"exports\",\"module\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar useragent = require(\"../lib/useragent\");\n\nvar DRAG_OFFSET = 0; // pixels\nvar SCROLL_COOLDOWN_T = 550; // milliseconds\n\nfunction DefaultHandlers(mouseHandler) {\n    mouseHandler.$clickSelection = null;\n\n    var editor = mouseHandler.editor;\n    editor.setDefaultHandler(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n    editor.setDefaultHandler(\"dblclick\", this.onDoubleClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"tripleclick\", this.onTripleClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"quadclick\", this.onQuadClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"mousewheel\", this.onMouseWheel.bind(mouseHandler));\n\n    var exports = [\"select\", \"startSelect\", \"selectEnd\", \"selectAllEnd\", \"selectByWordsEnd\",\n        \"selectByLinesEnd\", \"dragWait\", \"dragWaitEnd\", \"focusWait\"];\n\n    exports.forEach(function(x) {\n        mouseHandler[x] = this[x];\n    }, this);\n\n    mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, \"getLineRange\");\n    mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, \"getWordRange\");\n}\n\n(function() {\n\n    this.onMouseDown = function(ev) {\n        var inSelection = ev.inSelection();\n        var pos = ev.getDocumentPosition();\n        this.mousedownEvent = ev;\n        var editor = this.editor;\n\n        var button = ev.getButton();\n        if (button !== 0) {\n            var selectionRange = editor.getSelectionRange();\n            var selectionEmpty = selectionRange.isEmpty();\n            if (selectionEmpty || button == 1)\n                editor.selection.moveToPosition(pos);\n            if (button == 2) {\n                editor.textInput.onContextMenu(ev.domEvent);\n                if (!useragent.isMozilla)\n                    ev.preventDefault();\n            }\n            return;\n        }\n\n        this.mousedownEvent.time = Date.now();\n        if (inSelection && !editor.isFocused()) {\n            editor.focus();\n            if (this.$focusTimeout && !this.$clickSelection && !editor.inMultiSelectMode) {\n                this.setState(\"focusWait\");\n                this.captureMouse(ev);\n                return;\n            }\n        }\n\n        this.captureMouse(ev);\n        this.startSelect(pos, ev.domEvent._clicks > 1);\n        return ev.preventDefault();\n    };\n\n    this.startSelect = function(pos, waitForClickSelection) {\n        pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n        var editor = this.editor;\n        if (!this.mousedownEvent) return;\n        if (this.mousedownEvent.getShiftKey())\n            editor.selection.selectToPosition(pos);\n        else if (!waitForClickSelection)\n            editor.selection.moveToPosition(pos);\n        if (!waitForClickSelection)\n            this.select();\n        if (editor.renderer.scroller.setCapture) {\n            editor.renderer.scroller.setCapture();\n        }\n        editor.setStyle(\"ace_selecting\");\n        this.setState(\"select\");\n    };\n\n    this.select = function() {\n        var anchor, editor = this.editor;\n        var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n        if (this.$clickSelection) {\n            var cmp = this.$clickSelection.comparePoint(cursor);\n\n            if (cmp == -1) {\n                anchor = this.$clickSelection.end;\n            } else if (cmp == 1) {\n                anchor = this.$clickSelection.start;\n            } else {\n                var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n                cursor = orientedRange.cursor;\n                anchor = orientedRange.anchor;\n            }\n            editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n        }\n        editor.selection.selectToPosition(cursor);\n        editor.renderer.scrollCursorIntoView();\n    };\n\n    this.extendSelectionBy = function(unitName) {\n        var anchor, editor = this.editor;\n        var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n        var range = editor.selection[unitName](cursor.row, cursor.column);\n        if (this.$clickSelection) {\n            var cmpStart = this.$clickSelection.comparePoint(range.start);\n            var cmpEnd = this.$clickSelection.comparePoint(range.end);\n\n            if (cmpStart == -1 && cmpEnd <= 0) {\n                anchor = this.$clickSelection.end;\n                if (range.end.row != cursor.row || range.end.column != cursor.column)\n                    cursor = range.start;\n            } else if (cmpEnd == 1 && cmpStart >= 0) {\n                anchor = this.$clickSelection.start;\n                if (range.start.row != cursor.row || range.start.column != cursor.column)\n                    cursor = range.end;\n            } else if (cmpStart == -1 && cmpEnd == 1) {\n                cursor = range.end;\n                anchor = range.start;\n            } else {\n                var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n                cursor = orientedRange.cursor;\n                anchor = orientedRange.anchor;\n            }\n            editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n        }\n        editor.selection.selectToPosition(cursor);\n        editor.renderer.scrollCursorIntoView();\n    };\n\n    this.selectEnd =\n    this.selectAllEnd =\n    this.selectByWordsEnd =\n    this.selectByLinesEnd = function() {\n        this.$clickSelection = null;\n        this.editor.unsetStyle(\"ace_selecting\");\n        if (this.editor.renderer.scroller.releaseCapture) {\n            this.editor.renderer.scroller.releaseCapture();\n        }\n    };\n\n    this.focusWait = function() {\n        var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n        var time = Date.now();\n\n        if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimeout)\n            this.startSelect(this.mousedownEvent.getDocumentPosition());\n    };\n\n    this.onDoubleClick = function(ev) {\n        var pos = ev.getDocumentPosition();\n        var editor = this.editor;\n        var session = editor.session;\n\n        var range = session.getBracketRange(pos);\n        if (range) {\n            if (range.isEmpty()) {\n                range.start.column--;\n                range.end.column++;\n            }\n            this.setState(\"select\");\n        } else {\n            range = editor.selection.getWordRange(pos.row, pos.column);\n            this.setState(\"selectByWords\");\n        }\n        this.$clickSelection = range;\n        this.select();\n    };\n\n    this.onTripleClick = function(ev) {\n        var pos = ev.getDocumentPosition();\n        var editor = this.editor;\n\n        this.setState(\"selectByLines\");\n        var range = editor.getSelectionRange();\n        if (range.isMultiLine() && range.contains(pos.row, pos.column)) {\n            this.$clickSelection = editor.selection.getLineRange(range.start.row);\n            this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end;\n        } else {\n            this.$clickSelection = editor.selection.getLineRange(pos.row);\n        }\n        this.select();\n    };\n\n    this.onQuadClick = function(ev) {\n        var editor = this.editor;\n\n        editor.selectAll();\n        this.$clickSelection = editor.getSelectionRange();\n        this.setState(\"selectAll\");\n    };\n\n    this.onMouseWheel = function(ev) {\n        if (ev.getAccelKey())\n            return;\n        if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {\n            ev.wheelX = ev.wheelY;\n            ev.wheelY = 0;\n        }\n        \n        var editor = this.editor;\n        \n        if (!this.$lastScroll)\n            this.$lastScroll = { t: 0, vx: 0, vy: 0, allowed: 0 };\n        \n        var prevScroll = this.$lastScroll;\n        var t = ev.domEvent.timeStamp;\n        var dt = t - prevScroll.t;\n        var vx = dt ? ev.wheelX / dt : prevScroll.vx;\n        var vy = dt ? ev.wheelY / dt : prevScroll.vy;\n        if (dt < SCROLL_COOLDOWN_T) {\n            vx = (vx + prevScroll.vx) / 2;\n            vy = (vy + prevScroll.vy) / 2;\n        }\n        \n        var direction = Math.abs(vx / vy);\n        \n        var canScroll = false;\n        if (direction >= 1 && editor.renderer.isScrollableBy(ev.wheelX * ev.speed, 0))\n            canScroll = true;\n        if (direction <= 1 && editor.renderer.isScrollableBy(0, ev.wheelY * ev.speed))\n            canScroll = true;\n            \n        if (canScroll) {\n            prevScroll.allowed = t;\n        } else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) {\n            var isSlower = Math.abs(vx) <= 1.5 * Math.abs(prevScroll.vx)\n                && Math.abs(vy) <= 1.5 * Math.abs(prevScroll.vy);\n            if (isSlower) {\n                canScroll = true;\n                prevScroll.allowed = t;\n            }\n            else {\n                prevScroll.allowed = 0;\n            }\n        }\n        \n        prevScroll.t = t;\n        prevScroll.vx = vx;\n        prevScroll.vy = vy;\n\n        if (canScroll) {\n            editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n            return ev.stop();\n        }\n    };\n\n}).call(DefaultHandlers.prototype);\n\nexports.DefaultHandlers = DefaultHandlers;\n\nfunction calcDistance(ax, ay, bx, by) {\n    return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nfunction calcRangeOrientation(range, cursor) {\n    if (range.start.row == range.end.row)\n        var cmp = 2 * cursor.column - range.start.column - range.end.column;\n    else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)\n        var cmp = cursor.column - 4;\n    else\n        var cmp = 2 * cursor.row - range.start.row - range.end.row;\n\n    if (cmp < 0)\n        return {cursor: range.start, anchor: range.end};\n    else\n        return {cursor: range.end, anchor: range.start};\n}\n\n});\n\nace.define(\"ace/tooltip\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nfunction Tooltip (parentNode) {\n    this.isOpen = false;\n    this.$element = null;\n    this.$parentNode = parentNode;\n}\n\n(function() {\n    this.$init = function() {\n        this.$element = dom.createElement(\"div\");\n        this.$element.className = \"ace_tooltip\";\n        this.$element.style.display = \"none\";\n        this.$parentNode.appendChild(this.$element);\n        return this.$element;\n    };\n    this.getElement = function() {\n        return this.$element || this.$init();\n    };\n    this.setText = function(text) {\n        this.getElement().textContent = text;\n    };\n    this.setHtml = function(html) {\n        this.getElement().innerHTML = html;\n    };\n    this.setPosition = function(x, y) {\n        this.getElement().style.left = x + \"px\";\n        this.getElement().style.top = y + \"px\";\n    };\n    this.setClassName = function(className) {\n        dom.addCssClass(this.getElement(), className);\n    };\n    this.show = function(text, x, y) {\n        if (text != null)\n            this.setText(text);\n        if (x != null && y != null)\n            this.setPosition(x, y);\n        if (!this.isOpen) {\n            this.getElement().style.display = \"block\";\n            this.isOpen = true;\n        }\n    };\n\n    this.hide = function() {\n        if (this.isOpen) {\n            this.getElement().style.display = \"none\";\n            this.isOpen = false;\n        }\n    };\n    this.getHeight = function() {\n        return this.getElement().offsetHeight;\n    };\n    this.getWidth = function() {\n        return this.getElement().offsetWidth;\n    };\n    \n    this.destroy = function() {\n        this.isOpen = false;\n        if (this.$element && this.$element.parentNode) {\n            this.$element.parentNode.removeChild(this.$element);\n        }\n    };\n\n}).call(Tooltip.prototype);\n\nexports.Tooltip = Tooltip;\n});\n\nace.define(\"ace/mouse/default_gutter_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/event\",\"ace/tooltip\"], function(require, exports, module) {\n\"use strict\";\nvar dom = require(\"../lib/dom\");\nvar oop = require(\"../lib/oop\");\nvar event = require(\"../lib/event\");\nvar Tooltip = require(\"../tooltip\").Tooltip;\n\nfunction GutterHandler(mouseHandler) {\n    var editor = mouseHandler.editor;\n    var gutter = editor.renderer.$gutterLayer;\n    var tooltip = new GutterTooltip(editor.container);\n\n    mouseHandler.editor.setDefaultHandler(\"guttermousedown\", function(e) {\n        if (!editor.isFocused() || e.getButton() != 0)\n            return;\n        var gutterRegion = gutter.getRegion(e);\n\n        if (gutterRegion == \"foldWidgets\")\n            return;\n\n        var row = e.getDocumentPosition().row;\n        var selection = editor.session.selection;\n\n        if (e.getShiftKey())\n            selection.selectTo(row, 0);\n        else {\n            if (e.domEvent.detail == 2) {\n                editor.selectAll();\n                return e.preventDefault();\n            }\n            mouseHandler.$clickSelection = editor.selection.getLineRange(row);\n        }\n        mouseHandler.setState(\"selectByLines\");\n        mouseHandler.captureMouse(e);\n        return e.preventDefault();\n    });\n\n\n    var tooltipTimeout, mouseEvent, tooltipAnnotation;\n\n    function showTooltip() {\n        var row = mouseEvent.getDocumentPosition().row;\n        var annotation = gutter.$annotations[row];\n        if (!annotation)\n            return hideTooltip();\n\n        var maxRow = editor.session.getLength();\n        if (row == maxRow) {\n            var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row;\n            var pos = mouseEvent.$pos;\n            if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))\n                return hideTooltip();\n        }\n\n        if (tooltipAnnotation == annotation)\n            return;\n        tooltipAnnotation = annotation.text.join(\"
\");\n\n tooltip.setHtml(tooltipAnnotation);\n tooltip.show();\n editor._signal(\"showGutterTooltip\", tooltip);\n editor.on(\"mousewheel\", hideTooltip);\n\n if (mouseHandler.$tooltipFollowsMouse) {\n moveTooltip(mouseEvent);\n } else {\n var gutterElement = mouseEvent.domEvent.target;\n var rect = gutterElement.getBoundingClientRect();\n var style = tooltip.getElement().style;\n style.left = rect.right + \"px\";\n style.top = rect.bottom + \"px\";\n }\n }\n\n function hideTooltip() {\n if (tooltipTimeout)\n tooltipTimeout = clearTimeout(tooltipTimeout);\n if (tooltipAnnotation) {\n tooltip.hide();\n tooltipAnnotation = null;\n editor._signal(\"hideGutterTooltip\", tooltip);\n editor.off(\"mousewheel\", hideTooltip);\n }\n }\n\n function moveTooltip(e) {\n tooltip.setPosition(e.x, e.y);\n }\n\n mouseHandler.editor.setDefaultHandler(\"guttermousemove\", function(e) {\n var target = e.domEvent.target || e.domEvent.srcElement;\n if (dom.hasCssClass(target, \"ace_fold-widget\"))\n return hideTooltip();\n\n if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)\n moveTooltip(e);\n\n mouseEvent = e;\n if (tooltipTimeout)\n return;\n tooltipTimeout = setTimeout(function() {\n tooltipTimeout = null;\n if (mouseEvent && !mouseHandler.isMousePressed)\n showTooltip();\n else\n hideTooltip();\n }, 50);\n });\n\n event.addListener(editor.renderer.$gutter, \"mouseout\", function(e) {\n mouseEvent = null;\n if (!tooltipAnnotation || tooltipTimeout)\n return;\n\n tooltipTimeout = setTimeout(function() {\n tooltipTimeout = null;\n hideTooltip();\n }, 50);\n }, editor);\n \n editor.on(\"changeSession\", hideTooltip);\n}\n\nfunction GutterTooltip(parentNode) {\n Tooltip.call(this, parentNode);\n}\n\noop.inherits(GutterTooltip, Tooltip);\n\n(function(){\n this.setPosition = function(x, y) {\n var windowWidth = window.innerWidth || document.documentElement.clientWidth;\n var windowHeight = window.innerHeight || document.documentElement.clientHeight;\n var width = this.getWidth();\n var height = this.getHeight();\n x += 15;\n y += 15;\n if (x + width > windowWidth) {\n x -= (x + width) - windowWidth;\n }\n if (y + height > windowHeight) {\n y -= 20 + height;\n }\n Tooltip.prototype.setPosition.call(this, x, y);\n };\n\n}).call(GutterTooltip.prototype);\n\n\n\nexports.GutterHandler = GutterHandler;\n\n});\n\nace.define(\"ace/mouse/mouse_event\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar MouseEvent = exports.MouseEvent = function(domEvent, editor) {\n this.domEvent = domEvent;\n this.editor = editor;\n \n this.x = this.clientX = domEvent.clientX;\n this.y = this.clientY = domEvent.clientY;\n\n this.$pos = null;\n this.$inSelection = null;\n \n this.propagationStopped = false;\n this.defaultPrevented = false;\n};\n\n(function() { \n \n this.stopPropagation = function() {\n event.stopPropagation(this.domEvent);\n this.propagationStopped = true;\n };\n \n this.preventDefault = function() {\n event.preventDefault(this.domEvent);\n this.defaultPrevented = true;\n };\n \n this.stop = function() {\n this.stopPropagation();\n this.preventDefault();\n };\n this.getDocumentPosition = function() {\n if (this.$pos)\n return this.$pos;\n \n this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY);\n return this.$pos;\n };\n this.inSelection = function() {\n if (this.$inSelection !== null)\n return this.$inSelection;\n \n var editor = this.editor;\n \n\n var selectionRange = editor.getSelectionRange();\n if (selectionRange.isEmpty())\n this.$inSelection = false;\n else {\n var pos = this.getDocumentPosition();\n this.$inSelection = selectionRange.contains(pos.row, pos.column);\n }\n\n return this.$inSelection;\n };\n this.getButton = function() {\n return event.getButton(this.domEvent);\n };\n this.getShiftKey = function() {\n return this.domEvent.shiftKey;\n };\n \n this.getAccelKey = useragent.isMac\n ? function() { return this.domEvent.metaKey; }\n : function() { return this.domEvent.ctrlKey; };\n \n}).call(MouseEvent.prototype);\n\n});\n\nace.define(\"ace/mouse/dragdrop_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\n\nvar AUTOSCROLL_DELAY = 200;\nvar SCROLL_CURSOR_DELAY = 200;\nvar SCROLL_CURSOR_HYSTERESIS = 5;\n\nfunction DragdropHandler(mouseHandler) {\n\n var editor = mouseHandler.editor;\n\n var blankImage = dom.createElement(\"img\");\n blankImage.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n if (useragent.isOpera)\n blankImage.style.cssText = \"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\";\n\n var exports = [\"dragWait\", \"dragWaitEnd\", \"startDrag\", \"dragReadyEnd\", \"onMouseDrag\"];\n\n exports.forEach(function(x) {\n mouseHandler[x] = this[x];\n }, this);\n editor.on(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n\n\n var mouseTarget = editor.container;\n var dragSelectionMarker, x, y;\n var timerId, range;\n var dragCursor, counter = 0;\n var dragOperation;\n var isInternal;\n var autoScrollStartTime;\n var cursorMovedTime;\n var cursorPointOnCaretMoved;\n\n this.onDragStart = function(e) {\n if (this.cancelDrag || !mouseTarget.draggable) {\n var self = this;\n setTimeout(function(){\n self.startSelect();\n self.captureMouse(e);\n }, 0);\n return e.preventDefault();\n }\n range = editor.getSelectionRange();\n\n var dataTransfer = e.dataTransfer;\n dataTransfer.effectAllowed = editor.getReadOnly() ? \"copy\" : \"copyMove\";\n if (useragent.isOpera) {\n editor.container.appendChild(blankImage);\n blankImage.scrollTop = 0;\n }\n dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);\n if (useragent.isOpera) {\n editor.container.removeChild(blankImage);\n }\n dataTransfer.clearData();\n dataTransfer.setData(\"Text\", editor.session.getTextRange());\n\n isInternal = true;\n this.setState(\"drag\");\n };\n\n this.onDragEnd = function(e) {\n mouseTarget.draggable = false;\n isInternal = false;\n this.setState(null);\n if (!editor.getReadOnly()) {\n var dropEffect = e.dataTransfer.dropEffect;\n if (!dragOperation && dropEffect == \"move\")\n editor.session.remove(editor.getSelectionRange());\n editor.$resetCursorStyle();\n }\n this.editor.unsetStyle(\"ace_dragging\");\n this.editor.renderer.setCursorStyle(\"\");\n };\n\n this.onDragEnter = function(e) {\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n return;\n x = e.clientX;\n y = e.clientY;\n if (!dragSelectionMarker)\n addDragMarker();\n counter++;\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n return event.preventDefault(e);\n };\n\n this.onDragOver = function(e) {\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n return;\n x = e.clientX;\n y = e.clientY;\n if (!dragSelectionMarker) {\n addDragMarker();\n counter++;\n }\n if (onMouseMoveTimer !== null)\n onMouseMoveTimer = null;\n\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n return event.preventDefault(e);\n };\n\n this.onDragLeave = function(e) {\n counter--;\n if (counter <= 0 && dragSelectionMarker) {\n clearDragMarker();\n dragOperation = null;\n return event.preventDefault(e);\n }\n };\n\n this.onDrop = function(e) {\n if (!dragCursor)\n return;\n var dataTransfer = e.dataTransfer;\n if (isInternal) {\n switch (dragOperation) {\n case \"move\":\n if (range.contains(dragCursor.row, dragCursor.column)) {\n range = {\n start: dragCursor,\n end: dragCursor\n };\n } else {\n range = editor.moveText(range, dragCursor);\n }\n break;\n case \"copy\":\n range = editor.moveText(range, dragCursor, true);\n break;\n }\n } else {\n var dropData = dataTransfer.getData('Text');\n range = {\n start: dragCursor,\n end: editor.session.insert(dragCursor, dropData)\n };\n editor.focus();\n dragOperation = null;\n }\n clearDragMarker();\n return event.preventDefault(e);\n };\n\n event.addListener(mouseTarget, \"dragstart\", this.onDragStart.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragend\", this.onDragEnd.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragenter\", this.onDragEnter.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragover\", this.onDragOver.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragleave\", this.onDragLeave.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"drop\", this.onDrop.bind(mouseHandler), editor);\n\n function scrollCursorIntoView(cursor, prevCursor) {\n var now = Date.now();\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\n var hMovement = !prevCursor || cursor.column != prevCursor.column;\n if (!cursorMovedTime || vMovement || hMovement) {\n editor.moveCursorToPosition(cursor);\n cursorMovedTime = now;\n cursorPointOnCaretMoved = {x: x, y: y};\n } else {\n var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\n if (distance > SCROLL_CURSOR_HYSTERESIS) {\n cursorMovedTime = null;\n } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\n editor.renderer.scrollCursorIntoView();\n cursorMovedTime = null;\n }\n }\n }\n\n function autoScroll(cursor, prevCursor) {\n var now = Date.now();\n var lineHeight = editor.renderer.layerConfig.lineHeight;\n var characterWidth = editor.renderer.layerConfig.characterWidth;\n var editorRect = editor.renderer.scroller.getBoundingClientRect();\n var offsets = {\n x: {\n left: x - editorRect.left,\n right: editorRect.right - x\n },\n y: {\n top: y - editorRect.top,\n bottom: editorRect.bottom - y\n }\n };\n var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\n var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\n var scrollCursor = {row: cursor.row, column: cursor.column};\n if (nearestXOffset / characterWidth <= 2) {\n scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\n }\n if (nearestYOffset / lineHeight <= 1) {\n scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\n }\n var vScroll = cursor.row != scrollCursor.row;\n var hScroll = cursor.column != scrollCursor.column;\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\n if (vScroll || (hScroll && !vMovement)) {\n if (!autoScrollStartTime)\n autoScrollStartTime = now;\n else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\n editor.renderer.scrollCursorIntoView(scrollCursor);\n } else {\n autoScrollStartTime = null;\n }\n }\n\n function onDragInterval() {\n var prevCursor = dragCursor;\n dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n scrollCursorIntoView(dragCursor, prevCursor);\n autoScroll(dragCursor, prevCursor);\n }\n\n function addDragMarker() {\n range = editor.selection.toOrientedRange();\n dragSelectionMarker = editor.session.addMarker(range, \"ace_selection\", editor.getSelectionStyle());\n editor.clearSelection();\n if (editor.isFocused())\n editor.renderer.$cursorLayer.setBlinking(false);\n clearInterval(timerId);\n onDragInterval();\n timerId = setInterval(onDragInterval, 20);\n counter = 0;\n event.addListener(document, \"mousemove\", onMouseMove);\n }\n\n function clearDragMarker() {\n clearInterval(timerId);\n editor.session.removeMarker(dragSelectionMarker);\n dragSelectionMarker = null;\n editor.selection.fromOrientedRange(range);\n if (editor.isFocused() && !isInternal)\n editor.$resetCursorStyle();\n range = null;\n dragCursor = null;\n counter = 0;\n autoScrollStartTime = null;\n cursorMovedTime = null;\n event.removeListener(document, \"mousemove\", onMouseMove);\n }\n var onMouseMoveTimer = null;\n function onMouseMove() {\n if (onMouseMoveTimer == null) {\n onMouseMoveTimer = setTimeout(function() {\n if (onMouseMoveTimer != null && dragSelectionMarker)\n clearDragMarker();\n }, 20);\n }\n }\n\n function canAccept(dataTransfer) {\n var types = dataTransfer.types;\n return !types || Array.prototype.some.call(types, function(type) {\n return type == 'text/plain' || type == 'Text';\n });\n }\n\n function getDropEffect(e) {\n var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];\n var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];\n\n var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;\n var effectAllowed = \"uninitialized\";\n try {\n effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();\n } catch (e) {}\n var dropEffect = \"none\";\n\n if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"copy\";\n else if (moveAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"move\";\n else if (copyAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"copy\";\n\n return dropEffect;\n }\n}\n\n(function() {\n\n this.dragWait = function() {\n var interval = Date.now() - this.mousedownEvent.time;\n if (interval > this.editor.getDragDelay())\n this.startDrag();\n };\n\n this.dragWaitEnd = function() {\n var target = this.editor.container;\n target.draggable = false;\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n this.selectEnd();\n };\n\n this.dragReadyEnd = function(e) {\n this.editor.$resetCursorStyle();\n this.editor.unsetStyle(\"ace_dragging\");\n this.editor.renderer.setCursorStyle(\"\");\n this.dragWaitEnd();\n };\n\n this.startDrag = function(){\n this.cancelDrag = false;\n var editor = this.editor;\n var target = editor.container;\n target.draggable = true;\n editor.renderer.$cursorLayer.setBlinking(false);\n editor.setStyle(\"ace_dragging\");\n var cursorStyle = useragent.isWin ? \"default\" : \"move\";\n editor.renderer.setCursorStyle(cursorStyle);\n this.setState(\"dragReady\");\n };\n\n this.onMouseDrag = function(e) {\n var target = this.editor.container;\n if (useragent.isIE && this.state == \"dragReady\") {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n if (distance > 3)\n target.dragDrop();\n }\n if (this.state === \"dragWait\") {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n if (distance > 0) {\n target.draggable = false;\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n }\n }\n };\n\n this.onMouseDown = function(e) {\n if (!this.$dragEnabled)\n return;\n this.mousedownEvent = e;\n var editor = this.editor;\n\n var inSelection = e.inSelection();\n var button = e.getButton();\n var clickCount = e.domEvent.detail || 1;\n if (clickCount === 1 && button === 0 && inSelection) {\n if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))\n return;\n this.mousedownEvent.time = Date.now();\n var eventTarget = e.domEvent.target || e.domEvent.srcElement;\n if (\"unselectable\" in eventTarget)\n eventTarget.unselectable = \"on\";\n if (editor.getDragDelay()) {\n if (useragent.isWebKit) {\n this.cancelDrag = true;\n var mouseTarget = editor.container;\n mouseTarget.draggable = true;\n }\n this.setState(\"dragWait\");\n } else {\n this.startDrag();\n }\n this.captureMouse(e, this.onMouseDrag.bind(this));\n e.defaultPrevented = true;\n }\n };\n\n}).call(DragdropHandler.prototype);\n\n\nfunction calcDistance(ax, ay, bx, by) {\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nexports.DragdropHandler = DragdropHandler;\n\n});\n\nace.define(\"ace/mouse/touch_handler\",[\"require\",\"exports\",\"module\",\"ace/mouse/mouse_event\",\"ace/lib/event\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar MouseEvent = require(\"./mouse_event\").MouseEvent;\nvar event = require(\"../lib/event\");\nvar dom = require(\"../lib/dom\");\n\nexports.addTouchListeners = function(el, editor) {\n var mode = \"scroll\";\n var startX;\n var startY;\n var touchStartT;\n var lastT;\n var longTouchTimer;\n var animationTimer;\n var animationSteps = 0;\n var pos;\n var clickCount = 0;\n var vX = 0;\n var vY = 0;\n var pressed;\n var contextMenu;\n \n function createContextMenu() {\n var clipboard = window.navigator && window.navigator.clipboard;\n var isOpen = false;\n var updateMenu = function() {\n var selected = editor.getCopyText();\n var hasUndo = editor.session.getUndoManager().hasUndo();\n contextMenu.replaceChild(\n dom.buildDom(isOpen ? [\"span\",\n !selected && [\"span\", { class: \"ace_mobile-button\", action: \"selectall\" }, \"Select All\"],\n selected && [\"span\", { class: \"ace_mobile-button\", action: \"copy\" }, \"Copy\"],\n selected && [\"span\", { class: \"ace_mobile-button\", action: \"cut\" }, \"Cut\"],\n clipboard && [\"span\", { class: \"ace_mobile-button\", action: \"paste\" }, \"Paste\"],\n hasUndo && [\"span\", { class: \"ace_mobile-button\", action: \"undo\" }, \"Undo\"],\n [\"span\", { class: \"ace_mobile-button\", action: \"find\" }, \"Find\"],\n [\"span\", { class: \"ace_mobile-button\", action: \"openCommandPallete\" }, \"Pallete\"]\n ] : [\"span\"]),\n contextMenu.firstChild\n );\n };\n var handleClick = function(e) {\n var action = e.target.getAttribute(\"action\");\n\n if (action == \"more\" || !isOpen) {\n isOpen = !isOpen;\n return updateMenu();\n }\n if (action == \"paste\") {\n clipboard.readText().then(function (text) {\n editor.execCommand(action, text);\n });\n }\n else if (action) {\n if (action == \"cut\" || action == \"copy\") {\n if (clipboard)\n clipboard.writeText(editor.getCopyText());\n else\n document.execCommand(\"copy\");\n }\n editor.execCommand(action);\n }\n contextMenu.firstChild.style.display = \"none\";\n isOpen = false;\n if (action != \"openCommandPallete\")\n editor.focus();\n };\n contextMenu = dom.buildDom([\"div\",\n {\n class: \"ace_mobile-menu\",\n ontouchstart: function(e) {\n mode = \"menu\";\n e.stopPropagation();\n e.preventDefault();\n editor.textInput.focus();\n },\n ontouchend: function(e) {\n e.stopPropagation();\n e.preventDefault();\n handleClick(e);\n },\n onclick: handleClick\n },\n [\"span\"],\n [\"span\", { class: \"ace_mobile-button\", action: \"more\" }, \"...\"]\n ], editor.container);\n }\n function showContextMenu() {\n if (!contextMenu) createContextMenu();\n var cursor = editor.selection.cursor;\n var pagePos = editor.renderer.textToScreenCoordinates(cursor.row, cursor.column);\n var leftOffset = editor.renderer.textToScreenCoordinates(0, 0).pageX;\n var scrollLeft = editor.renderer.scrollLeft;\n var rect = editor.container.getBoundingClientRect();\n contextMenu.style.top = pagePos.pageY - rect.top - 3 + \"px\";\n if (pagePos.pageX - rect.left < rect.width - 70) {\n contextMenu.style.left = \"\";\n contextMenu.style.right = \"10px\";\n } else {\n contextMenu.style.right = \"\";\n contextMenu.style.left = leftOffset + scrollLeft - rect.left + \"px\";\n }\n contextMenu.style.display = \"\";\n contextMenu.firstChild.style.display = \"none\";\n editor.on(\"input\", hideContextMenu);\n }\n function hideContextMenu(e) {\n if (contextMenu)\n contextMenu.style.display = \"none\";\n editor.off(\"input\", hideContextMenu);\n }\n\n function handleLongTap() {\n longTouchTimer = null;\n clearTimeout(longTouchTimer);\n var range = editor.selection.getRange();\n var inSelection = range.contains(pos.row, pos.column);\n if (range.isEmpty() || !inSelection) {\n editor.selection.moveToPosition(pos);\n editor.selection.selectWord();\n }\n mode = \"wait\";\n showContextMenu();\n }\n function switchToSelectionMode() {\n longTouchTimer = null;\n clearTimeout(longTouchTimer);\n editor.selection.moveToPosition(pos);\n var range = clickCount >= 2\n ? editor.selection.getLineRange(pos.row)\n : editor.session.getBracketRange(pos);\n if (range && !range.isEmpty()) {\n editor.selection.setRange(range);\n } else {\n editor.selection.selectWord();\n }\n mode = \"wait\";\n }\n event.addListener(el, \"contextmenu\", function(e) {\n if (!pressed) return;\n var textarea = editor.textInput.getElement();\n textarea.focus();\n }, editor);\n event.addListener(el, \"touchstart\", function (e) {\n var touches = e.touches;\n if (longTouchTimer || touches.length > 1) {\n clearTimeout(longTouchTimer);\n longTouchTimer = null;\n touchStartT = -1;\n mode = \"zoom\";\n return;\n }\n \n pressed = editor.$mouseHandler.isMousePressed = true;\n var h = editor.renderer.layerConfig.lineHeight;\n var w = editor.renderer.layerConfig.lineHeight;\n var t = e.timeStamp;\n lastT = t;\n var touchObj = touches[0];\n var x = touchObj.clientX;\n var y = touchObj.clientY;\n if (Math.abs(startX - x) + Math.abs(startY - y) > h)\n touchStartT = -1;\n \n startX = e.clientX = x;\n startY = e.clientY = y;\n vX = vY = 0;\n \n var ev = new MouseEvent(e, editor);\n pos = ev.getDocumentPosition();\n\n if (t - touchStartT < 500 && touches.length == 1 && !animationSteps) {\n clickCount++;\n e.preventDefault();\n e.button = 0;\n switchToSelectionMode();\n } else {\n clickCount = 0;\n var cursor = editor.selection.cursor;\n var anchor = editor.selection.isEmpty() ? cursor : editor.selection.anchor;\n \n var cursorPos = editor.renderer.$cursorLayer.getPixelPosition(cursor, true);\n var anchorPos = editor.renderer.$cursorLayer.getPixelPosition(anchor, true);\n var rect = editor.renderer.scroller.getBoundingClientRect();\n var offsetTop = editor.renderer.layerConfig.offset;\n var offsetLeft = editor.renderer.scrollLeft;\n var weightedDistance = function(x, y) {\n x = x / w;\n y = y / h - 0.75;\n return x * x + y * y;\n };\n \n if (e.clientX < rect.left) {\n mode = \"zoom\";\n return;\n }\n \n var diff1 = weightedDistance(\n e.clientX - rect.left - cursorPos.left + offsetLeft,\n e.clientY - rect.top - cursorPos.top + offsetTop\n );\n var diff2 = weightedDistance(\n e.clientX - rect.left - anchorPos.left + offsetLeft,\n e.clientY - rect.top - anchorPos.top + offsetTop\n );\n if (diff1 < 3.5 && diff2 < 3.5)\n mode = diff1 > diff2 ? \"cursor\" : \"anchor\";\n \n if (diff2 < 3.5)\n mode = \"anchor\";\n else if (diff1 < 3.5)\n mode = \"cursor\";\n else\n mode = \"scroll\";\n longTouchTimer = setTimeout(handleLongTap, 450);\n }\n touchStartT = t;\n }, editor);\n\n event.addListener(el, \"touchend\", function (e) {\n pressed = editor.$mouseHandler.isMousePressed = false;\n if (animationTimer) clearInterval(animationTimer);\n if (mode == \"zoom\") {\n mode = \"\";\n animationSteps = 0;\n } else if (longTouchTimer) {\n editor.selection.moveToPosition(pos);\n animationSteps = 0;\n showContextMenu();\n } else if (mode == \"scroll\") {\n animate();\n hideContextMenu();\n } else {\n showContextMenu();\n }\n clearTimeout(longTouchTimer);\n longTouchTimer = null;\n }, editor);\n event.addListener(el, \"touchmove\", function (e) {\n if (longTouchTimer) {\n clearTimeout(longTouchTimer);\n longTouchTimer = null;\n }\n var touches = e.touches;\n if (touches.length > 1 || mode == \"zoom\") return;\n\n var touchObj = touches[0];\n\n var wheelX = startX - touchObj.clientX;\n var wheelY = startY - touchObj.clientY;\n\n if (mode == \"wait\") {\n if (wheelX * wheelX + wheelY * wheelY > 4)\n mode = \"cursor\";\n else\n return e.preventDefault();\n }\n\n startX = touchObj.clientX;\n startY = touchObj.clientY;\n\n e.clientX = touchObj.clientX;\n e.clientY = touchObj.clientY;\n\n var t = e.timeStamp;\n var dt = t - lastT;\n lastT = t;\n if (mode == \"scroll\") {\n var mouseEvent = new MouseEvent(e, editor);\n mouseEvent.speed = 1;\n mouseEvent.wheelX = wheelX;\n mouseEvent.wheelY = wheelY;\n if (10 * Math.abs(wheelX) < Math.abs(wheelY)) wheelX = 0;\n if (10 * Math.abs(wheelY) < Math.abs(wheelX)) wheelY = 0;\n if (dt != 0) {\n vX = wheelX / dt;\n vY = wheelY / dt;\n }\n editor._emit(\"mousewheel\", mouseEvent);\n if (!mouseEvent.propagationStopped) {\n vX = vY = 0;\n }\n }\n else {\n var ev = new MouseEvent(e, editor);\n var pos = ev.getDocumentPosition();\n if (mode == \"cursor\")\n editor.selection.moveCursorToPosition(pos);\n else if (mode == \"anchor\")\n editor.selection.setSelectionAnchor(pos.row, pos.column);\n editor.renderer.scrollCursorIntoView(pos);\n e.preventDefault();\n }\n }, editor);\n\n function animate() {\n animationSteps += 60;\n animationTimer = setInterval(function() {\n if (animationSteps-- <= 0) {\n clearInterval(animationTimer);\n animationTimer = null;\n }\n if (Math.abs(vX) < 0.01) vX = 0;\n if (Math.abs(vY) < 0.01) vY = 0;\n if (animationSteps < 20) vX = 0.9 * vX;\n if (animationSteps < 20) vY = 0.9 * vY;\n var oldScrollTop = editor.session.getScrollTop();\n editor.renderer.scrollBy(10 * vX, 10 * vY);\n if (oldScrollTop == editor.session.getScrollTop())\n animationSteps = 0;\n }, 10);\n }\n};\n\n});\n\nace.define(\"ace/lib/net\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\nvar dom = require(\"./dom\");\n\nexports.get = function (url, callback) {\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n callback(xhr.responseText);\n }\n };\n xhr.send(null);\n};\n\nexports.loadScript = function(path, callback) {\n var head = dom.getDocumentHead();\n var s = document.createElement('script');\n\n s.src = path;\n head.appendChild(s);\n\n s.onload = s.onreadystatechange = function(_, isAbort) {\n if (isAbort || !s.readyState || s.readyState == \"loaded\" || s.readyState == \"complete\") {\n s = s.onload = s.onreadystatechange = null;\n if (!isAbort)\n callback();\n }\n };\n};\nexports.qualifyURL = function(url) {\n var a = document.createElement('a');\n a.href = url;\n return a.href;\n};\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n this._eventRegistry || (this._eventRegistry = {});\n this._defaultHandlers || (this._defaultHandlers = {});\n\n var listeners = this._eventRegistry[eventName] || [];\n var defaultHandler = this._defaultHandlers[eventName];\n if (!listeners.length && !defaultHandler)\n return;\n\n if (typeof e != \"object\" || !e)\n e = {};\n\n if (!e.type)\n e.type = eventName;\n if (!e.stopPropagation)\n e.stopPropagation = stopPropagation;\n if (!e.preventDefault)\n e.preventDefault = preventDefault;\n\n listeners = listeners.slice();\n for (var i=0; i 1)\n base = parts[parts.length - 2];\n var path = options[component + \"Path\"];\n if (path == null) {\n path = options.basePath;\n } else if (sep == \"/\") {\n component = sep = \"\";\n }\n if (path && path.slice(-1) != \"/\")\n path += \"/\";\n return path + component + sep + base + this.get(\"suffix\");\n};\n\nexports.setModuleUrl = function(name, subst) {\n return options.$moduleUrls[name] = subst;\n};\n\nexports.$loading = {};\nexports.loadModule = function(moduleName, onLoad) {\n var module, moduleType;\n if (Array.isArray(moduleName)) {\n moduleType = moduleName[0];\n moduleName = moduleName[1];\n }\n\n try {\n module = require(moduleName);\n } catch (e) {}\n if (module && !exports.$loading[moduleName])\n return onLoad && onLoad(module);\n\n if (!exports.$loading[moduleName])\n exports.$loading[moduleName] = [];\n\n exports.$loading[moduleName].push(onLoad);\n\n if (exports.$loading[moduleName].length > 1)\n return;\n\n var afterLoad = function() {\n require([moduleName], function(module) {\n exports._emit(\"load.module\", {name: moduleName, module: module});\n var listeners = exports.$loading[moduleName];\n exports.$loading[moduleName] = null;\n listeners.forEach(function(onLoad) {\n onLoad && onLoad(module);\n });\n });\n };\n\n if (!exports.get(\"packaged\"))\n return afterLoad();\n \n net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n reportErrorIfPathIsNotConfigured();\n};\n\nvar reportErrorIfPathIsNotConfigured = function() {\n if (\n !options.basePath && !options.workerPath \n && !options.modePath && !options.themePath\n && !Object.keys(options.$moduleUrls).length\n ) {\n console.error(\n \"Unable to infer path to ace from script src,\",\n \"use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes\",\n \"or with webpack use ace/webpack-resolver\"\n );\n reportErrorIfPathIsNotConfigured = function() {};\n }\n};\ninit(true);function init(packaged) {\n\n if (!global || !global.document)\n return;\n \n options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged);\n\n var scriptOptions = {};\n var scriptUrl = \"\";\n var currentScript = (document.currentScript || document._currentScript ); // native or polyfill\n var currentDocument = currentScript && currentScript.ownerDocument || document;\n \n var scripts = currentDocument.getElementsByTagName(\"script\");\n for (var i=0; i 0){\n\t\t\tif (action == 0x10){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = 1;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t} else {\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tcond = impTab[newState][6];\n\t\tif (cond){\n\t\t\tif(condPos == -1){\n\t\t\t\tcondPos = ix;\n\t\t\t}\n\t\t}else{\n\t\t\tif (condPos > -1){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = newLevel;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tif (charTypes[ix] == B){\n\t\t\tlevels[ix] = 0;\n\t\t}\n\t\thiLevel |= newLevel;\n\t}\n\tif (hasUBAT_S){\n\t\tfor(i = 0; i < len; i++){\n\t\t\tif(charTypes[i] == S){\n\t\t\t\tlevels[i] = dir;\n\t\t\t\tfor(var j = i - 1; j >= 0; j--){\n\t\t\t\t\tif(charTypes[j] == WS){\n\t\t\t\t\t\tlevels[j] = dir;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction _invertLevel(lev, levels, _array) {\n\tif (hiLevel < lev){\n\t\treturn;\n\t}\n\tif (lev == 1 && dir == RTL && !hasUBAT_B){\n\t\t_array.reverse();\n\t\treturn;\n\t}\n\tvar len = _array.length, start = 0, end, lo, hi, tmp;\n\twhile(start < len){\n\t\tif (levels[start] >= lev){\n\t\t\tend = start + 1;\n\t\twhile(end < len && levels[end] >= lev){\n\t\t\tend++;\n\t\t}\n\t\tfor(lo = start, hi = end - 1 ; lo < hi; lo++, hi--){\n\t\t\ttmp = _array[lo];\n\t\t\t_array[lo] = _array[hi];\n\t\t\t_array[hi] = tmp;\n\t\t}\n\t\tstart = end;\n\t}\n\tstart++;\n\t}\n}\n\nfunction _getCharClass(chars, types, classes, ix) {\t\t\t\n\tvar cType = types[ix], wType, nType, len, i;\n\tswitch(cType){\n\t\tcase L:\n\t\tcase R:\n\t\t\tlastArabic = false;\n\t\tcase ON:\n\t\tcase AN:\n\t\t\treturn cType;\n\t\tcase EN:\n\t\t\treturn lastArabic ? AN : EN;\n\t\tcase AL:\n\t\t\tlastArabic = true;\n\t\t\thasUBAT_AL = true;\n\t\t\treturn R;\n\t\tcase WS:\n\t\t\treturn ON;\n\t\tcase CS:\n\t\t\tif (ix < 1 || (ix + 1) >= types.length ||\n\t\t\t\t((wType = classes[ix - 1]) != EN && wType != AN) ||\n\t\t\t\t((nType = types[ix + 1]) != EN && nType != AN)){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\tif (lastArabic){nType = AN;}\n\t\t\treturn nType == wType ? nType : ON;\n\t\tcase ES:\n\t\t\twType = ix > 0 ? classes[ix - 1] : B;\n\t\t\tif (wType == EN && (ix + 1) < types.length && types[ix + 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase ET:\n\t\t\tif (ix > 0 && classes[ix - 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\tif (lastArabic){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\ti = ix + 1;\n\t\t\tlen = types.length;\n\t\t\twhile (i < len && types[i] == ET){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len && types[i] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase NSM:\n\t\t\tlen = types.length;\n\t\t\ti = ix + 1;\n\t\t\twhile (i < len && types[i] == NSM){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len){\n\t\t\t\tvar c = chars[ix], rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E;\n\t\t\t\t\n\t\t\t\twType = types[i];\n\t\t\t\tif (rtlCandidate && (wType == R || wType == AL)){\n\t\t\t\t\treturn R;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ix < 1 || (wType = types[ix - 1]) == B){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\treturn classes[ix - 1];\n\t\tcase B:\n\t\t\tlastArabic = false;\n\t\t\thasUBAT_B = true;\n\t\t\treturn dir;\n\t\tcase S:\n\t\t\thasUBAT_S = true;\n\t\t\treturn ON;\n\t\tcase LRE:\n\t\tcase RLE:\n\t\tcase LRO:\n\t\tcase RLO:\n\t\tcase PDF:\n\t\t\tlastArabic = false;\n\t\tcase BN:\n\t\t\treturn ON;\n\t}\n}\n\nfunction _getCharacterType( ch ) {\t\t\n\tvar uc = ch.charCodeAt(0), hi = uc >> 8;\n\t\n\tif (hi == 0) {\t\t\n\t\treturn ((uc > 0x00BF) ? L : UnicodeTBL00[uc]);\n\t} else if (hi == 5) {\n\t\treturn (/[\\u0591-\\u05f4]/.test(ch) ? R : L);\n\t} else if (hi == 6) {\n\t\tif (/[\\u0610-\\u061a\\u064b-\\u065f\\u06d6-\\u06e4\\u06e7-\\u06ed]/.test(ch))\n\t\t\treturn NSM;\n\t\telse if (/[\\u0660-\\u0669\\u066b-\\u066c]/.test(ch))\n\t\t\treturn AN;\n\t\telse if (uc == 0x066A)\n\t\t\treturn ET;\n\t\telse if (/[\\u06f0-\\u06f9]/.test(ch))\n\t\t\treturn EN;\t\t\t\n\t\telse\n\t\t\treturn AL;\n\t} else if (hi == 0x20 && uc <= 0x205F) {\n\t\treturn UnicodeTBL20[uc & 0xFF];\n\t} else if (hi == 0xFE) {\n\t\treturn (uc >= 0xFE70 ? AL : ON);\n\t}\t\t\n\treturn ON;\t\n}\n\nfunction _isArabicDiacritics( ch ) {\n\treturn (ch >= '\\u064b' && ch <= '\\u0655');\n}\nexports.L = L;\nexports.R = R;\nexports.EN = EN;\nexports.ON_R = 3;\nexports.AN = 4;\nexports.R_H = 5;\nexports.B = 6;\nexports.RLE = 7;\n\nexports.DOT = \"\\xB7\";\nexports.doBidiReorder = function(text, textCharTypes, isRtl) {\n\tif (text.length < 2)\n\t\treturn {};\n\t\t\n\tvar chars = text.split(\"\"), logicalFromVisual = new Array(chars.length),\n\t\tbidiLevels = new Array(chars.length), levels = []; \n\n\tdir = isRtl ? RTL : LTR;\n\n\t_computeLevels(chars, levels, chars.length, textCharTypes);\n\n\tfor (var i = 0; i < logicalFromVisual.length; logicalFromVisual[i] = i, i++);\n\n\t_invertLevel(2, levels, logicalFromVisual);\n\t_invertLevel(1, levels, logicalFromVisual);\n\n\tfor (var i = 0; i < logicalFromVisual.length - 1; i++) { //fix levels to reflect character width\n\t\tif (textCharTypes[i] === AN) {\n\t\t\tlevels[i] = exports.AN;\n\t\t} else if (levels[i] === R && ((textCharTypes[i] > AL && textCharTypes[i] < LRE) \n\t\t\t|| textCharTypes[i] === ON || textCharTypes[i] === BN)) {\n\t\t\tlevels[i] = exports.ON_R;\n\t\t} else if ((i > 0 && chars[i - 1] === '\\u0644') && /\\u0622|\\u0623|\\u0625|\\u0627/.test(chars[i])) {\n\t\t\tlevels[i - 1] = levels[i] = exports.R_H;\n\t\t\ti++;\n\t\t}\n\t}\n\tif (chars[chars.length - 1] === exports.DOT)\n\t\tlevels[chars.length - 1] = exports.B;\n\t\t\t\t\n\tif (chars[0] === '\\u202B')\n\t\tlevels[0] = exports.RLE;\n\t\t\t\t\n\tfor (var i = 0; i < logicalFromVisual.length; i++) {\n\t\tbidiLevels[i] = levels[logicalFromVisual[i]];\n\t}\n\n\treturn {'logicalFromVisual': logicalFromVisual, 'bidiLevels': bidiLevels};\n};\nexports.hasBidiCharacters = function(text, textCharTypes){\n\tvar ret = false;\n\tfor (var i = 0; i < text.length; i++){\n\t\ttextCharTypes[i] = _getCharacterType(text.charAt(i));\n\t\tif (!ret && (textCharTypes[i] == R || textCharTypes[i] == AL || textCharTypes[i] == AN))\n\t\t\tret = true;\n\t}\n\treturn ret;\n};\t\nexports.getVisualFromLogicalIdx = function(logIdx, rowMap) {\n\tfor (var i = 0; i < rowMap.logicalFromVisual.length; i++) {\n\t\tif (rowMap.logicalFromVisual[i] == logIdx)\n\t\t\treturn i;\n\t}\n\treturn 0;\n};\n\n});\n\nace.define(\"ace/bidihandler\",[\"require\",\"exports\",\"module\",\"ace/lib/bidiutil\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar bidiUtil = require(\"./lib/bidiutil\");\nvar lang = require(\"./lib/lang\");\nvar bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac\\u202B]/;\nvar BidiHandler = function(session) {\n this.session = session;\n this.bidiMap = {};\n this.currentRow = null;\n this.bidiUtil = bidiUtil;\n this.charWidths = [];\n this.EOL = \"\\xAC\";\n this.showInvisibles = true;\n this.isRtlDir = false;\n this.$isRtl = false;\n this.line = \"\";\n this.wrapIndent = 0;\n this.EOF = \"\\xB6\";\n this.RLE = \"\\u202B\";\n this.contentWidth = 0;\n this.fontMetrics = null;\n this.rtlLineOffset = 0;\n this.wrapOffset = 0;\n this.isMoveLeftOperation = false;\n this.seenBidi = bidiRE.test(session.getValue());\n};\n\n(function() {\n this.isBidiRow = function(screenRow, docRow, splitIndex) {\n if (!this.seenBidi)\n return false;\n if (screenRow !== this.currentRow) {\n this.currentRow = screenRow;\n this.updateRowLine(docRow, splitIndex);\n this.updateBidiMap();\n }\n return this.bidiMap.bidiLevels;\n };\n\n this.onChange = function(delta) {\n if (!this.seenBidi) {\n if (delta.action == \"insert\" && bidiRE.test(delta.lines.join(\"\\n\"))) {\n this.seenBidi = true;\n this.currentRow = null;\n }\n } \n else {\n this.currentRow = null;\n }\n };\n\n this.getDocumentRow = function() {\n var docRow = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var index = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n if (index >= 0)\n docRow = this.session.$docRowCache[index];\n }\n\n return docRow;\n };\n\n this.getSplitIndex = function() {\n var splitIndex = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var currentIndex, prevIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n while (this.currentRow - splitIndex > 0) {\n currentIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow - splitIndex - 1);\n if (currentIndex !== prevIndex)\n break;\n\n prevIndex = currentIndex;\n splitIndex++;\n }\n } else {\n splitIndex = this.currentRow;\n }\n\n return splitIndex;\n };\n\n this.updateRowLine = function(docRow, splitIndex) {\n if (docRow === undefined)\n docRow = this.getDocumentRow();\n \n var isLastRow = (docRow === this.session.getLength() - 1),\n endOfLine = isLastRow ? this.EOF : this.EOL;\n\n this.wrapIndent = 0;\n this.line = this.session.getLine(docRow);\n this.isRtlDir = this.$isRtl || this.line.charAt(0) === this.RLE;\n if (this.session.$useWrapMode) {\n var splits = this.session.$wrapData[docRow];\n if (splits) {\n if (splitIndex === undefined)\n splitIndex = this.getSplitIndex();\n\n if(splitIndex > 0 && splits.length) {\n this.wrapIndent = splits.indent;\n this.wrapOffset = this.wrapIndent * this.charWidths[bidiUtil.L];\n this.line = (splitIndex < splits.length) ?\n this.line.substring(splits[splitIndex - 1], splits[splitIndex]) :\n this.line.substring(splits[splits.length - 1]);\n } else {\n this.line = this.line.substring(0, splits[splitIndex]);\n }\n }\n if (splitIndex == splits.length)\n this.line += (this.showInvisibles) ? endOfLine : bidiUtil.DOT;\n } else {\n this.line += this.showInvisibles ? endOfLine : bidiUtil.DOT;\n }\n var session = this.session, shift = 0, size;\n this.line = this.line.replace(/\\t|[\\u1100-\\u2029, \\u202F-\\uFFE6]/g, function(ch, i){\n if (ch === '\\t' || session.isFullWidth(ch.charCodeAt(0))) {\n size = (ch === '\\t') ? session.getScreenTabSize(i + shift) : 2;\n shift += size - 1;\n return lang.stringRepeat(bidiUtil.DOT, size);\n }\n return ch;\n });\n\n if (this.isRtlDir) {\n this.fontMetrics.$main.textContent = (this.line.charAt(this.line.length - 1) == bidiUtil.DOT) ? this.line.substr(0, this.line.length - 1) : this.line;\n this.rtlLineOffset = this.contentWidth - this.fontMetrics.$main.getBoundingClientRect().width;\n }\n };\n \n this.updateBidiMap = function() {\n var textCharTypes = [];\n if (bidiUtil.hasBidiCharacters(this.line, textCharTypes) || this.isRtlDir) {\n this.bidiMap = bidiUtil.doBidiReorder(this.line, textCharTypes, this.isRtlDir);\n } else {\n this.bidiMap = {};\n }\n };\n this.markAsDirty = function() {\n this.currentRow = null;\n };\n this.updateCharacterWidths = function(fontMetrics) {\n if (this.characterWidth === fontMetrics.$characterSize.width)\n return;\n\n this.fontMetrics = fontMetrics;\n var characterWidth = this.characterWidth = fontMetrics.$characterSize.width;\n var bidiCharWidth = fontMetrics.$measureCharWidth(\"\\u05d4\");\n\n this.charWidths[bidiUtil.L] = this.charWidths[bidiUtil.EN] = this.charWidths[bidiUtil.ON_R] = characterWidth;\n this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] = bidiCharWidth;\n this.charWidths[bidiUtil.R_H] = bidiCharWidth * 0.45;\n this.charWidths[bidiUtil.B] = this.charWidths[bidiUtil.RLE] = 0;\n\n this.currentRow = null;\n };\n\n this.setShowInvisibles = function(showInvisibles) {\n this.showInvisibles = showInvisibles;\n this.currentRow = null;\n };\n\n this.setEolChar = function(eolChar) {\n this.EOL = eolChar; \n };\n\n this.setContentWidth = function(width) {\n this.contentWidth = width;\n };\n\n this.isRtlLine = function(row) {\n if (this.$isRtl) return true;\n if (row != undefined)\n return (this.session.getLine(row).charAt(0) == this.RLE);\n else\n return this.isRtlDir; \n };\n\n this.setRtlDirection = function(editor, isRtlDir) {\n var cursor = editor.getCursorPosition(); \n for (var row = editor.selection.getSelectionAnchor().row; row <= cursor.row; row++) {\n if (!isRtlDir && editor.session.getLine(row).charAt(0) === editor.session.$bidiHandler.RLE)\n editor.session.doc.removeInLine(row, 0, 1);\n else if (isRtlDir && editor.session.getLine(row).charAt(0) !== editor.session.$bidiHandler.RLE)\n editor.session.doc.insert({column: 0, row: row}, editor.session.$bidiHandler.RLE);\n }\n };\n this.getPosLeft = function(col) {\n col -= this.wrapIndent;\n var leftBoundary = (this.line.charAt(0) === this.RLE) ? 1 : 0;\n var logicalIdx = (col > leftBoundary) ? (this.session.getOverwrite() ? col : col - 1) : leftBoundary;\n var visualIdx = bidiUtil.getVisualFromLogicalIdx(logicalIdx, this.bidiMap),\n levels = this.bidiMap.bidiLevels, left = 0;\n\n if (!this.session.getOverwrite() && col <= leftBoundary && levels[visualIdx] % 2 !== 0)\n visualIdx++;\n \n for (var i = 0; i < visualIdx; i++) {\n left += this.charWidths[levels[i]];\n }\n\n if (!this.session.getOverwrite() && (col > leftBoundary) && (levels[visualIdx] % 2 === 0))\n left += this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent)\n left += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset;\n\n if (this.isRtlDir)\n left += this.rtlLineOffset;\n\n return left;\n };\n this.getSelections = function(startCol, endCol) {\n var map = this.bidiMap, levels = map.bidiLevels, level, selections = [], offset = 0,\n selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent,\n isSelected = false, isSelectedPrev = false, selectionStart = 0;\n \n if (this.wrapIndent)\n offset += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset;\n\n for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) {\n logIdx = map.logicalFromVisual[visIdx];\n level = levels[visIdx];\n isSelected = (logIdx >= selColMin) && (logIdx < selColMax);\n if (isSelected && !isSelectedPrev) {\n selectionStart = offset;\n } else if (!isSelected && isSelectedPrev) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n offset += this.charWidths[level];\n isSelectedPrev = isSelected;\n }\n\n if (isSelected && (visIdx === levels.length)) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n\n if(this.isRtlDir) {\n for (var i = 0; i < selections.length; i++) {\n selections[i].left += this.rtlLineOffset;\n }\n }\n return selections;\n };\n this.offsetToCol = function(posX) {\n if(this.isRtlDir)\n posX -= this.rtlLineOffset;\n\n var logicalIdx = 0, posX = Math.max(posX, 0),\n offset = 0, visualIdx = 0, levels = this.bidiMap.bidiLevels,\n charWidth = this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent)\n posX -= this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset;\n \n while(posX > offset + charWidth/2) {\n offset += charWidth;\n if(visualIdx === levels.length - 1) {\n charWidth = 0;\n break;\n }\n charWidth = this.charWidths[levels[++visualIdx]];\n }\n \n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && (levels[visualIdx] % 2 === 0)){\n if(posX < offset)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n\n } else if (visualIdx > 0 && (levels[visualIdx - 1] % 2 === 0) && (levels[visualIdx] % 2 !== 0)){\n logicalIdx = 1 + ((posX > offset) ? this.bidiMap.logicalFromVisual[visualIdx]\n : this.bidiMap.logicalFromVisual[visualIdx - 1]);\n\n } else if ((this.isRtlDir && visualIdx === levels.length - 1 && charWidth === 0 && (levels[visualIdx - 1] % 2 === 0))\n || (!this.isRtlDir && visualIdx === 0 && (levels[visualIdx] % 2 !== 0))){\n logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx];\n } else {\n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && charWidth !== 0)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n }\n\n if (logicalIdx === 0 && this.isRtlDir)\n logicalIdx++;\n\n return (logicalIdx + this.wrapIndent);\n };\n\n}).call(BidiHandler.prototype);\n\nexports.BidiHandler = BidiHandler;\n});\n\nace.define(\"ace/selection\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Selection = function(session) {\n this.session = session;\n this.doc = session.getDocument();\n\n this.clearSelection();\n this.cursor = this.lead = this.doc.createAnchor(0, 0);\n this.anchor = this.doc.createAnchor(0, 0);\n this.$silent = false;\n\n var self = this;\n this.cursor.on(\"change\", function(e) {\n self.$cursorChanged = true;\n if (!self.$silent)\n self._emit(\"changeCursor\");\n if (!self.$isEmpty && !self.$silent)\n self._emit(\"changeSelection\");\n if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n self.$desiredColumn = null;\n });\n\n this.anchor.on(\"change\", function() {\n self.$anchorChanged = true;\n if (!self.$isEmpty && !self.$silent)\n self._emit(\"changeSelection\");\n });\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.isEmpty = function() {\n return this.$isEmpty || (\n this.anchor.row == this.lead.row &&\n this.anchor.column == this.lead.column\n );\n };\n this.isMultiLine = function() {\n return !this.$isEmpty && this.anchor.row != this.cursor.row;\n };\n this.getCursor = function() {\n return this.lead.getPosition();\n };\n this.setSelectionAnchor = function(row, column) {\n this.$isEmpty = false;\n this.anchor.setPosition(row, column);\n };\n this.getAnchor = \n this.getSelectionAnchor = function() {\n if (this.$isEmpty)\n return this.getSelectionLead();\n \n return this.anchor.getPosition();\n };\n this.getSelectionLead = function() {\n return this.lead.getPosition();\n };\n this.isBackwards = function() {\n var anchor = this.anchor;\n var lead = this.lead;\n return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\n };\n this.getRange = function() {\n var anchor = this.anchor;\n var lead = this.lead;\n\n if (this.$isEmpty)\n return Range.fromPoints(lead, lead);\n\n return this.isBackwards()\n ? Range.fromPoints(lead, anchor)\n : Range.fromPoints(anchor, lead);\n };\n this.clearSelection = function() {\n if (!this.$isEmpty) {\n this.$isEmpty = true;\n this._emit(\"changeSelection\");\n }\n };\n this.selectAll = function() {\n this.$setSelection(0, 0, Number.MAX_VALUE, Number.MAX_VALUE);\n };\n this.setRange =\n this.setSelectionRange = function(range, reverse) {\n var start = reverse ? range.end : range.start;\n var end = reverse ? range.start : range.end;\n this.$setSelection(start.row, start.column, end.row, end.column);\n };\n\n this.$setSelection = function(anchorRow, anchorColumn, cursorRow, cursorColumn) {\n if (this.$silent)\n return;\n var wasEmpty = this.$isEmpty;\n var wasMultiselect = this.inMultiSelectMode;\n this.$silent = true;\n this.$cursorChanged = this.$anchorChanged = false;\n this.anchor.setPosition(anchorRow, anchorColumn);\n this.cursor.setPosition(cursorRow, cursorColumn);\n this.$isEmpty = !Range.comparePoints(this.anchor, this.cursor);\n this.$silent = false;\n if (this.$cursorChanged)\n this._emit(\"changeCursor\");\n if (this.$cursorChanged || this.$anchorChanged || wasEmpty != this.$isEmpty || wasMultiselect)\n this._emit(\"changeSelection\");\n };\n\n this.$moveSelection = function(mover) {\n var lead = this.lead;\n if (this.$isEmpty)\n this.setSelectionAnchor(lead.row, lead.column);\n\n mover.call(this);\n };\n this.selectTo = function(row, column) {\n this.$moveSelection(function() {\n this.moveCursorTo(row, column);\n });\n };\n this.selectToPosition = function(pos) {\n this.$moveSelection(function() {\n this.moveCursorToPosition(pos);\n });\n };\n this.moveTo = function(row, column) {\n this.clearSelection();\n this.moveCursorTo(row, column);\n };\n this.moveToPosition = function(pos) {\n this.clearSelection();\n this.moveCursorToPosition(pos);\n };\n this.selectUp = function() {\n this.$moveSelection(this.moveCursorUp);\n };\n this.selectDown = function() {\n this.$moveSelection(this.moveCursorDown);\n };\n this.selectRight = function() {\n this.$moveSelection(this.moveCursorRight);\n };\n this.selectLeft = function() {\n this.$moveSelection(this.moveCursorLeft);\n };\n this.selectLineStart = function() {\n this.$moveSelection(this.moveCursorLineStart);\n };\n this.selectLineEnd = function() {\n this.$moveSelection(this.moveCursorLineEnd);\n };\n this.selectFileEnd = function() {\n this.$moveSelection(this.moveCursorFileEnd);\n };\n this.selectFileStart = function() {\n this.$moveSelection(this.moveCursorFileStart);\n };\n this.selectWordRight = function() {\n this.$moveSelection(this.moveCursorWordRight);\n };\n this.selectWordLeft = function() {\n this.$moveSelection(this.moveCursorWordLeft);\n };\n this.getWordRange = function(row, column) {\n if (typeof column == \"undefined\") {\n var cursor = row || this.lead;\n row = cursor.row;\n column = cursor.column;\n }\n return this.session.getWordRange(row, column);\n };\n this.selectWord = function() {\n this.setSelectionRange(this.getWordRange());\n };\n this.selectAWord = function() {\n var cursor = this.getCursor();\n var range = this.session.getAWordRange(cursor.row, cursor.column);\n this.setSelectionRange(range);\n };\n\n this.getLineRange = function(row, excludeLastChar) {\n var rowStart = typeof row == \"number\" ? row : this.lead.row;\n var rowEnd;\n\n var foldLine = this.session.getFoldLine(rowStart);\n if (foldLine) {\n rowStart = foldLine.start.row;\n rowEnd = foldLine.end.row;\n } else {\n rowEnd = rowStart;\n }\n if (excludeLastChar === true)\n return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\n else\n return new Range(rowStart, 0, rowEnd + 1, 0);\n };\n this.selectLine = function() {\n this.setSelectionRange(this.getLineRange());\n };\n this.moveCursorUp = function() {\n this.moveCursorBy(-1, 0);\n };\n this.moveCursorDown = function() {\n this.moveCursorBy(1, 0);\n };\n this.wouldMoveIntoSoftTab = function(cursor, tabSize, direction) {\n var start = cursor.column;\n var end = cursor.column + tabSize;\n\n if (direction < 0) {\n start = cursor.column - tabSize;\n end = cursor.column;\n }\n return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(\" \").length-1 == tabSize;\n };\n this.moveCursorLeft = function() {\n var cursor = this.lead.getPosition(),\n fold;\n\n if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {\n this.moveCursorTo(fold.start.row, fold.start.column);\n } else if (cursor.column === 0) {\n if (cursor.row > 0) {\n this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length);\n }\n }\n else {\n var tabSize = this.session.getTabSize();\n if (this.wouldMoveIntoSoftTab(cursor, tabSize, -1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, -tabSize);\n } else {\n this.moveCursorBy(0, -1);\n }\n }\n };\n this.moveCursorRight = function() {\n var cursor = this.lead.getPosition(),\n fold;\n if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {\n this.moveCursorTo(fold.end.row, fold.end.column);\n }\n else if (this.lead.column == this.doc.getLine(this.lead.row).length) {\n if (this.lead.row < this.doc.getLength() - 1) {\n this.moveCursorTo(this.lead.row + 1, 0);\n }\n }\n else {\n var tabSize = this.session.getTabSize();\n var cursor = this.lead;\n if (this.wouldMoveIntoSoftTab(cursor, tabSize, 1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, tabSize);\n } else {\n this.moveCursorBy(0, 1);\n }\n }\n };\n this.moveCursorLineStart = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var screenRow = this.session.documentToScreenRow(row, column);\n var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0);\n var beforeCursor = this.session.getDisplayLine(\n row, null, firstColumnPosition.row,\n firstColumnPosition.column\n );\n\n var leadingSpace = beforeCursor.match(/^\\s*/);\n if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart)\n firstColumnPosition.column += leadingSpace[0].length;\n this.moveCursorToPosition(firstColumnPosition);\n };\n this.moveCursorLineEnd = function() {\n var lead = this.lead;\n var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column);\n if (this.lead.column == lineEnd.column) {\n var line = this.session.getLine(lineEnd.row);\n if (lineEnd.column == line.length) {\n var textEnd = line.search(/\\s+$/);\n if (textEnd > 0)\n lineEnd.column = textEnd;\n }\n }\n\n this.moveCursorTo(lineEnd.row, lineEnd.column);\n };\n this.moveCursorFileEnd = function() {\n var row = this.doc.getLength() - 1;\n var column = this.doc.getLine(row).length;\n this.moveCursorTo(row, column);\n };\n this.moveCursorFileStart = function() {\n this.moveCursorTo(0, 0);\n };\n this.moveCursorLongWordRight = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var line = this.doc.getLine(row);\n var rightOfCursor = line.substring(column);\n\n this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold) {\n this.moveCursorTo(fold.end.row, fold.end.column);\n return;\n }\n if (this.session.nonTokenRe.exec(rightOfCursor)) {\n column += this.session.nonTokenRe.lastIndex;\n this.session.nonTokenRe.lastIndex = 0;\n rightOfCursor = line.substring(column);\n }\n if (column >= line.length) {\n this.moveCursorTo(row, line.length);\n this.moveCursorRight();\n if (row < this.doc.getLength() - 1)\n this.moveCursorWordRight();\n return;\n }\n if (this.session.tokenRe.exec(rightOfCursor)) {\n column += this.session.tokenRe.lastIndex;\n this.session.tokenRe.lastIndex = 0;\n }\n\n this.moveCursorTo(row, column);\n };\n this.moveCursorLongWordLeft = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var fold;\n if (fold = this.session.getFoldAt(row, column, -1)) {\n this.moveCursorTo(fold.start.row, fold.start.column);\n return;\n }\n\n var str = this.session.getFoldStringAt(row, column, -1);\n if (str == null) {\n str = this.doc.getLine(row).substring(0, column);\n }\n\n var leftOfCursor = lang.stringReverse(str);\n this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n if (this.session.nonTokenRe.exec(leftOfCursor)) {\n column -= this.session.nonTokenRe.lastIndex;\n leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\n this.session.nonTokenRe.lastIndex = 0;\n }\n if (column <= 0) {\n this.moveCursorTo(row, 0);\n this.moveCursorLeft();\n if (row > 0)\n this.moveCursorWordLeft();\n return;\n }\n if (this.session.tokenRe.exec(leftOfCursor)) {\n column -= this.session.tokenRe.lastIndex;\n this.session.tokenRe.lastIndex = 0;\n }\n\n this.moveCursorTo(row, column);\n };\n\n this.$shortWordEndIndex = function(rightOfCursor) {\n var index = 0, ch;\n var whitespaceRe = /\\s/;\n var tokenRe = this.session.tokenRe;\n\n tokenRe.lastIndex = 0;\n if (this.session.tokenRe.exec(rightOfCursor)) {\n index = this.session.tokenRe.lastIndex;\n } else {\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n index ++;\n\n if (index < 1) {\n tokenRe.lastIndex = 0;\n while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n tokenRe.lastIndex = 0;\n index ++;\n if (whitespaceRe.test(ch)) {\n if (index > 2) {\n index--;\n break;\n } else {\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n index ++;\n if (index > 2)\n break;\n }\n }\n }\n }\n }\n tokenRe.lastIndex = 0;\n\n return index;\n };\n\n this.moveCursorShortWordRight = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var line = this.doc.getLine(row);\n var rightOfCursor = line.substring(column);\n\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold)\n return this.moveCursorTo(fold.end.row, fold.end.column);\n\n if (column == line.length) {\n var l = this.doc.getLength();\n do {\n row++;\n rightOfCursor = this.doc.getLine(row);\n } while (row < l && /^\\s*$/.test(rightOfCursor));\n\n if (!/^\\s+/.test(rightOfCursor))\n rightOfCursor = \"\";\n column = 0;\n }\n\n var index = this.$shortWordEndIndex(rightOfCursor);\n\n this.moveCursorTo(row, column + index);\n };\n\n this.moveCursorShortWordLeft = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n\n var fold;\n if (fold = this.session.getFoldAt(row, column, -1))\n return this.moveCursorTo(fold.start.row, fold.start.column);\n\n var line = this.session.getLine(row).substring(0, column);\n if (column === 0) {\n do {\n row--;\n line = this.doc.getLine(row);\n } while (row > 0 && /^\\s*$/.test(line));\n\n column = line.length;\n if (!/\\s+$/.test(line))\n line = \"\";\n }\n\n var leftOfCursor = lang.stringReverse(line);\n var index = this.$shortWordEndIndex(leftOfCursor);\n\n return this.moveCursorTo(row, column - index);\n };\n\n this.moveCursorWordRight = function() {\n if (this.session.$selectLongWords)\n this.moveCursorLongWordRight();\n else\n this.moveCursorShortWordRight();\n };\n\n this.moveCursorWordLeft = function() {\n if (this.session.$selectLongWords)\n this.moveCursorLongWordLeft();\n else\n this.moveCursorShortWordLeft();\n };\n this.moveCursorBy = function(rows, chars) {\n var screenPos = this.session.documentToScreenPosition(\n this.lead.row,\n this.lead.column\n );\n\n var offsetX;\n\n if (chars === 0) {\n if (rows !== 0) {\n if (this.session.$bidiHandler.isBidiRow(screenPos.row, this.lead.row)) {\n offsetX = this.session.$bidiHandler.getPosLeft(screenPos.column);\n screenPos.column = Math.round(offsetX / this.session.$bidiHandler.charWidths[0]);\n } else {\n offsetX = screenPos.column * this.session.$bidiHandler.charWidths[0];\n }\n }\n\n if (this.$desiredColumn)\n screenPos.column = this.$desiredColumn;\n else\n this.$desiredColumn = screenPos.column;\n }\n \n if (rows != 0 && this.session.lineWidgets && this.session.lineWidgets[this.lead.row]) {\n var widget = this.session.lineWidgets[this.lead.row];\n if (rows < 0)\n rows -= widget.rowsAbove || 0;\n else if (rows > 0)\n rows += widget.rowCount - (widget.rowsAbove || 0);\n }\n \n var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column, offsetX);\n \n if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {\n \n }\n this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);\n };\n this.moveCursorToPosition = function(position) {\n this.moveCursorTo(position.row, position.column);\n };\n this.moveCursorTo = function(row, column, keepDesiredColumn) {\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold) {\n row = fold.start.row;\n column = fold.start.column;\n }\n\n this.$keepDesiredColumnOnChange = true;\n var line = this.session.getLine(row);\n if (/[\\uDC00-\\uDFFF]/.test(line.charAt(column)) && line.charAt(column - 1)) {\n if (this.lead.row == row && this.lead.column == column + 1)\n column = column - 1;\n else\n column = column + 1;\n }\n this.lead.setPosition(row, column);\n this.$keepDesiredColumnOnChange = false;\n\n if (!keepDesiredColumn)\n this.$desiredColumn = null;\n };\n this.moveCursorToScreen = function(row, column, keepDesiredColumn) {\n var pos = this.session.screenToDocumentPosition(row, column);\n this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);\n };\n this.detach = function() {\n this.lead.detach();\n this.anchor.detach();\n this.session = this.doc = null;\n };\n\n this.fromOrientedRange = function(range) {\n this.setSelectionRange(range, range.cursor == range.start);\n this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\n };\n\n this.toOrientedRange = function(range) {\n var r = this.getRange();\n if (range) {\n range.start.column = r.start.column;\n range.start.row = r.start.row;\n range.end.column = r.end.column;\n range.end.row = r.end.row;\n } else {\n range = r;\n }\n\n range.cursor = this.isBackwards() ? range.start : range.end;\n range.desiredColumn = this.$desiredColumn;\n return range;\n };\n this.getRangeOfMovements = function(func) {\n var start = this.getCursor();\n try {\n func(this);\n var end = this.getCursor();\n return Range.fromPoints(start, end);\n } catch(e) {\n return Range.fromPoints(start, start);\n } finally {\n this.moveCursorToPosition(start);\n }\n };\n\n this.toJSON = function() {\n if (this.rangeCount) {\n var data = this.ranges.map(function(r) {\n var r1 = r.clone();\n r1.isBackwards = r.cursor == r.start;\n return r1;\n });\n } else {\n var data = this.getRange();\n data.isBackwards = this.isBackwards();\n }\n return data;\n };\n\n this.fromJSON = function(data) {\n if (data.start == undefined) {\n if (this.rangeList && data.length > 1) {\n this.toSingleRange(data[0]);\n for (var i = data.length; i--; ) {\n var r = Range.fromPoints(data[i].start, data[i].end);\n if (data[i].isBackwards)\n r.cursor = r.start;\n this.addRange(r, true);\n }\n return;\n } else {\n data = data[0];\n }\n }\n if (this.rangeList)\n this.toSingleRange(data);\n this.setSelectionRange(data, data.isBackwards);\n };\n\n this.isEqual = function(data) {\n if ((data.length || this.rangeCount) && data.length != this.rangeCount)\n return false;\n if (!data.length || !this.ranges)\n return this.getRange().isEqual(data);\n\n for (var i = this.ranges.length; i--; ) {\n if (!this.ranges[i].isEqual(data[i]))\n return false;\n }\n return true;\n };\n\n}).call(Selection.prototype);\n\nexports.Selection = Selection;\n});\n\nace.define(\"ace/tokenizer\",[\"require\",\"exports\",\"module\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar config = require(\"./config\");\nvar MAX_TOKEN_COUNT = 2000;\nvar Tokenizer = function(rules) {\n this.states = rules;\n\n this.regExps = {};\n this.matchMappings = {};\n for (var key in this.states) {\n var state = this.states[key];\n var ruleRegExps = [];\n var matchTotal = 0;\n var mapping = this.matchMappings[key] = {defaultToken: \"text\"};\n var flag = \"g\";\n\n var splitterRurles = [];\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n if (rule.defaultToken)\n mapping.defaultToken = rule.defaultToken;\n if (rule.caseInsensitive)\n flag = \"gi\";\n if (rule.regex == null)\n continue;\n\n if (rule.regex instanceof RegExp)\n rule.regex = rule.regex.toString().slice(1, -1);\n var adjustedregex = rule.regex;\n var matchcount = new RegExp(\"(?:(\" + adjustedregex + \")|(.))\").exec(\"a\").length - 2;\n if (Array.isArray(rule.token)) {\n if (rule.token.length == 1 || matchcount == 1) {\n rule.token = rule.token[0];\n } else if (matchcount - 1 != rule.token.length) {\n this.reportError(\"number of classes and regexp groups doesn't match\", { \n rule: rule,\n groupCount: matchcount - 1\n });\n rule.token = rule.token[0];\n } else {\n rule.tokenArray = rule.token;\n rule.token = null;\n rule.onMatch = this.$arrayTokens;\n }\n } else if (typeof rule.token == \"function\" && !rule.onMatch) {\n if (matchcount > 1)\n rule.onMatch = this.$applyToken;\n else\n rule.onMatch = rule.token;\n }\n\n if (matchcount > 1) {\n if (/\\\\\\d/.test(rule.regex)) {\n adjustedregex = rule.regex.replace(/\\\\([0-9]+)/g, function(match, digit) {\n return \"\\\\\" + (parseInt(digit, 10) + matchTotal + 1);\n });\n } else {\n matchcount = 1;\n adjustedregex = this.removeCapturingGroups(rule.regex);\n }\n if (!rule.splitRegex && typeof rule.token != \"string\")\n splitterRurles.push(rule); // flag will be known only at the very end\n }\n\n mapping[matchTotal] = i;\n matchTotal += matchcount;\n\n ruleRegExps.push(adjustedregex);\n if (!rule.onMatch)\n rule.onMatch = null;\n }\n \n if (!ruleRegExps.length) {\n mapping[0] = 0;\n ruleRegExps.push(\"$\");\n }\n \n splitterRurles.forEach(function(rule) {\n rule.splitRegex = this.createSplitterRegexp(rule.regex, flag);\n }, this);\n\n this.regExps[key] = new RegExp(\"(\" + ruleRegExps.join(\")|(\") + \")|($)\", flag);\n }\n};\n\n(function() {\n this.$setMaxTokenCount = function(m) {\n MAX_TOKEN_COUNT = m | 0;\n };\n \n this.$applyToken = function(str) {\n var values = this.splitRegex.exec(str).slice(1);\n var types = this.token.apply(this, values);\n if (typeof types === \"string\")\n return [{type: types, value: str}];\n\n var tokens = [];\n for (var i = 0, l = types.length; i < l; i++) {\n if (values[i])\n tokens[tokens.length] = {\n type: types[i],\n value: values[i]\n };\n }\n return tokens;\n };\n\n this.$arrayTokens = function(str) {\n if (!str)\n return [];\n var values = this.splitRegex.exec(str);\n if (!values)\n return \"text\";\n var tokens = [];\n var types = this.tokenArray;\n for (var i = 0, l = types.length; i < l; i++) {\n if (values[i + 1])\n tokens[tokens.length] = {\n type: types[i],\n value: values[i + 1]\n };\n }\n return tokens;\n };\n\n this.removeCapturingGroups = function(src) {\n var r = src.replace(\n /\\\\.|\\[(?:\\\\.|[^\\\\\\]])*|\\(\\?[:=!]|(\\()/g,\n function(x, y) {return y ? \"(?:\" : x;}\n );\n return r;\n };\n\n this.createSplitterRegexp = function(src, flag) {\n if (src.indexOf(\"(?=\") != -1) {\n var stack = 0;\n var inChClass = false;\n var lastCapture = {};\n src.replace(/(\\\\.)|(\\((?:\\?[=!])?)|(\\))|([\\[\\]])/g, function(\n m, esc, parenOpen, parenClose, square, index\n ) {\n if (inChClass) {\n inChClass = square != \"]\";\n } else if (square) {\n inChClass = true;\n } else if (parenClose) {\n if (stack == lastCapture.stack) {\n lastCapture.end = index+1;\n lastCapture.stack = -1;\n }\n stack--;\n } else if (parenOpen) {\n stack++;\n if (parenOpen.length != 1) {\n lastCapture.stack = stack;\n lastCapture.start = index;\n }\n }\n return m;\n });\n\n if (lastCapture.end != null && /^\\)*$/.test(src.substr(lastCapture.end)))\n src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end);\n }\n if (src.charAt(0) != \"^\") src = \"^\" + src;\n if (src.charAt(src.length - 1) != \"$\") src += \"$\";\n \n return new RegExp(src, (flag||\"\").replace(\"g\", \"\"));\n };\n this.getLineTokens = function(line, startState) {\n if (startState && typeof startState != \"string\") {\n var stack = startState.slice(0);\n startState = stack[0];\n if (startState === \"#tmp\") {\n stack.shift();\n startState = stack.shift();\n }\n } else\n var stack = [];\n\n var currentState = startState || \"start\";\n var state = this.states[currentState];\n if (!state) {\n currentState = \"start\";\n state = this.states[currentState];\n }\n var mapping = this.matchMappings[currentState];\n var re = this.regExps[currentState];\n re.lastIndex = 0;\n\n var match, tokens = [];\n var lastIndex = 0;\n var matchAttempts = 0;\n\n var token = {type: null, value: \"\"};\n\n while (match = re.exec(line)) {\n var type = mapping.defaultToken;\n var rule = null;\n var value = match[0];\n var index = re.lastIndex;\n\n if (index - value.length > lastIndex) {\n var skipped = line.substring(lastIndex, index - value.length);\n if (token.type == type) {\n token.value += skipped;\n } else {\n if (token.type)\n tokens.push(token);\n token = {type: type, value: skipped};\n }\n }\n\n for (var i = 0; i < match.length-2; i++) {\n if (match[i + 1] === undefined)\n continue;\n\n rule = state[mapping[i]];\n\n if (rule.onMatch)\n type = rule.onMatch(value, currentState, stack, line);\n else\n type = rule.token;\n\n if (rule.next) {\n if (typeof rule.next == \"string\") {\n currentState = rule.next;\n } else {\n currentState = rule.next(currentState, stack);\n }\n \n state = this.states[currentState];\n if (!state) {\n this.reportError(\"state doesn't exist\", currentState);\n currentState = \"start\";\n state = this.states[currentState];\n }\n mapping = this.matchMappings[currentState];\n lastIndex = index;\n re = this.regExps[currentState];\n re.lastIndex = index;\n }\n if (rule.consumeLineEnd)\n lastIndex = index;\n break;\n }\n\n if (value) {\n if (typeof type === \"string\") {\n if ((!rule || rule.merge !== false) && token.type === type) {\n token.value += value;\n } else {\n if (token.type)\n tokens.push(token);\n token = {type: type, value: value};\n }\n } else if (type) {\n if (token.type)\n tokens.push(token);\n token = {type: null, value: \"\"};\n for (var i = 0; i < type.length; i++)\n tokens.push(type[i]);\n }\n }\n\n if (lastIndex == line.length)\n break;\n\n lastIndex = index;\n\n if (matchAttempts++ > MAX_TOKEN_COUNT) {\n if (matchAttempts > 2 * line.length) {\n this.reportError(\"infinite loop with in ace tokenizer\", {\n startState: startState,\n line: line\n });\n }\n while (lastIndex < line.length) {\n if (token.type)\n tokens.push(token);\n token = {\n value: line.substring(lastIndex, lastIndex += 500),\n type: \"overflow\"\n };\n }\n currentState = \"start\";\n stack = [];\n break;\n }\n }\n\n if (token.type)\n tokens.push(token);\n \n if (stack.length > 1) {\n if (stack[0] !== currentState)\n stack.unshift(\"#tmp\", currentState);\n }\n return {\n tokens : tokens,\n state : stack.length ? stack : currentState\n };\n };\n \n this.reportError = config.reportError;\n \n}).call(Tokenizer.prototype);\n\nexports.Tokenizer = Tokenizer;\n});\n\nace.define(\"ace/mode/text_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"../lib/lang\");\n\nvar TextHighlightRules = function() {\n\n this.$rules = {\n \"start\" : [{\n token : \"empty_line\",\n regex : '^$'\n }, {\n defaultToken : \"text\"\n }]\n };\n};\n\n(function() {\n\n this.addRules = function(rules, prefix) {\n if (!prefix) {\n for (var key in rules)\n this.$rules[key] = rules[key];\n return;\n }\n for (var key in rules) {\n var state = rules[key];\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n if (rule.next || rule.onMatch) {\n if (typeof rule.next == \"string\") {\n if (rule.next.indexOf(prefix) !== 0)\n rule.next = prefix + rule.next;\n }\n if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n rule.nextState = prefix + rule.nextState;\n }\n }\n this.$rules[prefix + key] = state;\n }\n };\n\n this.getRules = function() {\n return this.$rules;\n };\n\n this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) {\n var embedRules = typeof HighlightRules == \"function\"\n ? new HighlightRules().getRules()\n : HighlightRules;\n if (states) {\n for (var i = 0; i < states.length; i++)\n states[i] = prefix + states[i];\n } else {\n states = [];\n for (var key in embedRules)\n states.push(prefix + key);\n }\n\n this.addRules(embedRules, prefix);\n\n if (escapeRules) {\n var addRules = Array.prototype[append ? \"push\" : \"unshift\"];\n for (var i = 0; i < states.length; i++)\n addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));\n }\n\n if (!this.$embeds)\n this.$embeds = [];\n this.$embeds.push(prefix);\n };\n\n this.getEmbeds = function() {\n return this.$embeds;\n };\n\n var pushState = function(currentState, stack) {\n if (currentState != \"start\" || stack.length)\n stack.unshift(this.nextState, currentState);\n return this.nextState;\n };\n var popState = function(currentState, stack) {\n stack.shift();\n return stack.shift() || \"start\";\n };\n\n this.normalizeRules = function() {\n var id = 0;\n var rules = this.$rules;\n function processState(key) {\n var state = rules[key];\n state.processed = true;\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n var toInsert = null;\n if (Array.isArray(rule)) {\n toInsert = rule;\n rule = {};\n }\n if (!rule.regex && rule.start) {\n rule.regex = rule.start;\n if (!rule.next)\n rule.next = [];\n rule.next.push({\n defaultToken: rule.token\n }, {\n token: rule.token + \".end\",\n regex: rule.end || rule.start,\n next: \"pop\"\n });\n rule.token = rule.token + \".start\";\n rule.push = true;\n }\n var next = rule.next || rule.push;\n if (next && Array.isArray(next)) {\n var stateName = rule.stateName;\n if (!stateName) {\n stateName = rule.token;\n if (typeof stateName != \"string\")\n stateName = stateName[0] || \"\";\n if (rules[stateName])\n stateName += id++;\n }\n rules[stateName] = next;\n rule.next = stateName;\n processState(stateName);\n } else if (next == \"pop\") {\n rule.next = popState;\n }\n\n if (rule.push) {\n rule.nextState = rule.next || rule.push;\n rule.next = pushState;\n delete rule.push;\n }\n\n if (rule.rules) {\n for (var r in rule.rules) {\n if (rules[r]) {\n if (rules[r].push)\n rules[r].push.apply(rules[r], rule.rules[r]);\n } else {\n rules[r] = rule.rules[r];\n }\n }\n }\n var includeName = typeof rule == \"string\" ? rule : rule.include;\n if (includeName) {\n if (Array.isArray(includeName))\n toInsert = includeName.map(function(x) { return rules[x]; });\n else\n toInsert = rules[includeName];\n }\n\n if (toInsert) {\n var args = [i, 1].concat(toInsert);\n if (rule.noEscape)\n args = args.filter(function(x) {return !x.next;});\n state.splice.apply(state, args);\n i--;\n }\n \n if (rule.keywordMap) {\n rule.token = this.createKeywordMapper(\n rule.keywordMap, rule.defaultToken || \"text\", rule.caseInsensitive\n );\n delete rule.defaultToken;\n }\n }\n }\n Object.keys(rules).forEach(processState, this);\n };\n\n this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {\n var keywords = Object.create(null);\n this.$keywordList = [];\n Object.keys(map).forEach(function(className) {\n var a = map[className];\n var list = a.split(splitChar || \"|\");\n for (var i = list.length; i--; ) {\n var word = list[i];\n this.$keywordList.push(word);\n if (ignoreCase)\n word = word.toLowerCase(); \n keywords[word] = className;\n }\n }, this);\n map = null;\n return ignoreCase\n ? function(value) {return keywords[value.toLowerCase()] || defaultToken; }\n : function(value) {return keywords[value] || defaultToken; };\n };\n\n this.getKeywords = function() {\n return this.$keywords;\n };\n\n}).call(TextHighlightRules.prototype);\n\nexports.TextHighlightRules = TextHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar Behaviour = function() {\n this.$behaviours = {};\n};\n\n(function () {\n\n this.add = function (name, action, callback) {\n switch (undefined) {\n case this.$behaviours:\n this.$behaviours = {};\n case this.$behaviours[name]:\n this.$behaviours[name] = {};\n }\n this.$behaviours[name][action] = callback;\n };\n \n this.addBehaviours = function (behaviours) {\n for (var key in behaviours) {\n for (var action in behaviours[key]) {\n this.add(key, action, behaviours[key][action]);\n }\n }\n };\n \n this.remove = function (name) {\n if (this.$behaviours && this.$behaviours[name]) {\n delete this.$behaviours[name];\n }\n };\n \n this.inherit = function (mode, filter) {\n if (typeof mode === \"function\") {\n var behaviours = new mode().getBehaviours(filter);\n } else {\n var behaviours = mode.getBehaviours(filter);\n }\n this.addBehaviours(behaviours);\n };\n \n this.getBehaviours = function (filter) {\n if (!filter) {\n return this.$behaviours;\n } else {\n var ret = {};\n for (var i = 0; i < filter.length; i++) {\n if (this.$behaviours[filter[i]]) {\n ret[filter[i]] = this.$behaviours[filter[i]];\n }\n }\n return ret;\n }\n };\n\n}).call(Behaviour.prototype);\n\nexports.Behaviour = Behaviour;\n});\n\nace.define(\"ace/token_iterator\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"./range\").Range;\nvar TokenIterator = function(session, initialRow, initialColumn) {\n this.$session = session;\n this.$row = initialRow;\n this.$rowTokens = session.getTokens(initialRow);\n\n var token = session.getTokenAt(initialRow, initialColumn);\n this.$tokenIndex = token ? token.index : -1;\n};\n\n(function() { \n this.stepBackward = function() {\n this.$tokenIndex -= 1;\n \n while (this.$tokenIndex < 0) {\n this.$row -= 1;\n if (this.$row < 0) {\n this.$row = 0;\n return null;\n }\n \n this.$rowTokens = this.$session.getTokens(this.$row);\n this.$tokenIndex = this.$rowTokens.length - 1;\n }\n \n return this.$rowTokens[this.$tokenIndex];\n }; \n this.stepForward = function() {\n this.$tokenIndex += 1;\n var rowCount;\n while (this.$tokenIndex >= this.$rowTokens.length) {\n this.$row += 1;\n if (!rowCount)\n rowCount = this.$session.getLength();\n if (this.$row >= rowCount) {\n this.$row = rowCount - 1;\n return null;\n }\n\n this.$rowTokens = this.$session.getTokens(this.$row);\n this.$tokenIndex = 0;\n }\n \n return this.$rowTokens[this.$tokenIndex];\n }; \n this.getCurrentToken = function () {\n return this.$rowTokens[this.$tokenIndex];\n }; \n this.getCurrentTokenRow = function () {\n return this.$row;\n }; \n this.getCurrentTokenColumn = function() {\n var rowTokens = this.$rowTokens;\n var tokenIndex = this.$tokenIndex;\n var column = rowTokens[tokenIndex].start;\n if (column !== undefined)\n return column;\n \n column = 0;\n while (tokenIndex > 0) {\n tokenIndex -= 1;\n column += rowTokens[tokenIndex].value.length;\n }\n \n return column; \n };\n this.getCurrentTokenPosition = function() {\n return {row: this.$row, column: this.getCurrentTokenColumn()};\n };\n this.getCurrentTokenRange = function() {\n var token = this.$rowTokens[this.$tokenIndex];\n var column = this.getCurrentTokenColumn();\n return new Range(this.$row, column, this.$row, column + token.value.length);\n };\n \n}).call(TokenIterator.prototype);\n\nexports.TokenIterator = TokenIterator;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n [\"text\", \"paren.rparen\", \"rparen\", \"paren\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n [\"text\", \"paren.rparen\", \"rparen\", \"paren\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar defaultQuotes = {'\"' : '\"', \"'\" : \"'\"};\n\nvar initContext = function(editor) {\n var id = -1;\n if (editor.multiSelect) {\n id = editor.selection.index;\n if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n contextCache = {rangeCount: editor.multiSelect.rangeCount};\n }\n if (contextCache[id])\n return context = contextCache[id];\n context = contextCache[id] = {\n autoInsertedBrackets: 0,\n autoInsertedRow: -1,\n autoInsertedLineEnd: \"\",\n maybeInsertedBrackets: 0,\n maybeInsertedRow: -1,\n maybeInsertedLineStart: \"\",\n maybeInsertedLineEnd: \"\"\n };\n};\n\nvar getWrapped = function(selection, selected, opening, closing) {\n var rowDiff = selection.end.row - selection.start.row;\n return {\n text: opening + selected + closing,\n selection: [\n 0,\n selection.start.column + 1,\n rowDiff,\n selection.end.column + (rowDiff ? 0 : 1)\n ]\n };\n};\n\nvar CstyleBehaviour = function(options) {\n this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (text == '{') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '{', '}');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options && options.braces) {\n CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n return {\n text: '{}',\n selection: [1, 1]\n };\n } else {\n CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n return {\n text: '{',\n selection: [1, 1]\n };\n }\n }\n } else if (text == '}') {\n initContext(editor);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == '}') {\n var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n } else if (text == \"\\n\" || text == \"\\r\\n\") {\n initContext(editor);\n var closing = \"\";\n if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n CstyleBehaviour.clearMaybeInsertedClosing();\n }\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar === '}') {\n var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n if (!openBracePos)\n return null;\n var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n } else if (closing) {\n var next_indent = this.$getIndent(line);\n } else {\n CstyleBehaviour.clearMaybeInsertedClosing();\n return;\n }\n var indent = next_indent + session.getTabString();\n\n return {\n text: '\\n' + indent + '\\n' + next_indent + closing,\n selection: [1, indent.length, 1, indent.length]\n };\n } else {\n CstyleBehaviour.clearMaybeInsertedClosing();\n }\n });\n\n this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '{') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.end.column, range.end.column + 1);\n if (rightChar == '}') {\n range.end.column++;\n return range;\n } else {\n context.maybeInsertedBrackets--;\n }\n }\n });\n\n this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n if (text == '(') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '(', ')');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n return {\n text: '()',\n selection: [1, 1]\n };\n }\n } else if (text == ')') {\n initContext(editor);\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == ')') {\n var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n }\n });\n\n this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '(') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == ')') {\n range.end.column++;\n return range;\n }\n }\n });\n\n this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n if (text == '[') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '[', ']');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n return {\n text: '[]',\n selection: [1, 1]\n };\n }\n } else if (text == ']') {\n initContext(editor);\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == ']') {\n var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n }\n });\n\n this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '[') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == ']') {\n range.end.column++;\n return range;\n }\n }\n });\n\n this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n var quotes = session.$mode.$quotes || defaultQuotes;\n if (text.length == 1 && quotes[text]) {\n if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1) \n return;\n initContext(editor);\n var quote = text;\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && (selected.length != 1 || !quotes[selected]) && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, quote, quote);\n } else if (!selected) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var leftChar = line.substring(cursor.column-1, cursor.column);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n \n var token = session.getTokenAt(cursor.row, cursor.column);\n var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n return null;\n \n var stringBefore = token && /string|escape/.test(token.type);\n var stringAfter = !rightToken || /string|escape/.test(rightToken.type);\n \n var pair;\n if (rightChar == quote) {\n pair = stringBefore !== stringAfter;\n if (pair && /string\\.end/.test(rightToken.type))\n pair = false;\n } else {\n if (stringBefore && !stringAfter)\n return null; // wrap string with different quote\n if (stringBefore && stringAfter)\n return null; // do not pair quotes inside strings\n var wordRe = session.$mode.tokenRe;\n wordRe.lastIndex = 0;\n var isWordBefore = wordRe.test(leftChar);\n wordRe.lastIndex = 0;\n var isWordAfter = wordRe.test(leftChar);\n if (isWordBefore || isWordAfter)\n return null; // before or after alphanumeric\n if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n return null; // there is rightChar and it isn't closing\n var charBefore = line[cursor.column - 2];\n if (leftChar == quote && (charBefore == quote || wordRe.test(charBefore)))\n return null;\n pair = true;\n }\n return {\n text: pair ? quote + quote : \"\",\n selection: [1,1]\n };\n }\n }\n });\n\n this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n var quotes = session.$mode.$quotes || defaultQuotes;\n\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && quotes.hasOwnProperty(selected)) {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == selected) {\n range.end.column++;\n return range;\n }\n }\n });\n\n};\n\n \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n var cursor = editor.getCursorPosition();\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n if (/[)}\\]]/.test(editor.session.getLine(cursor.row)[cursor.column]))\n return true;\n var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n return false;\n }\n iterator.stepForward();\n return iterator.getCurrentTokenRow() !== cursor.row ||\n this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n context.autoInsertedBrackets = 0;\n context.autoInsertedRow = cursor.row;\n context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (!this.isMaybeInsertedClosing(cursor, line))\n context.maybeInsertedBrackets = 0;\n context.maybeInsertedRow = cursor.row;\n context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n context.maybeInsertedLineEnd = line.substr(cursor.column);\n context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n return context.autoInsertedBrackets > 0 &&\n cursor.row === context.autoInsertedRow &&\n bracket === context.autoInsertedLineEnd[0] &&\n line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n return context.maybeInsertedBrackets > 0 &&\n cursor.row === context.maybeInsertedRow &&\n line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n if (context) {\n context.maybeInsertedBrackets = 0;\n context.maybeInsertedRow = -1;\n }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/unicode\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar 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];\n\nvar code = 0;\nvar str = [];\nfor (var i = 0; i < wordChars.length; i += 2) {\n str.push(code += wordChars[i]);\n if (wordChars[i + 1])\n str.push(45, code += wordChars[i + 1]);\n}\n\nexports.wordChars = String.fromCharCode.apply(null, str);\n\n});\n\nace.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) {\n\"use strict\";\nvar config = require(\"../config\");\n\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar unicode = require(\"../unicode\");\nvar lang = require(\"../lib/lang\");\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n this.HighlightRules = TextHighlightRules;\n};\n\n(function() {\n this.$defaultBehaviour = new CstyleBehaviour();\n\n this.tokenRe = new RegExp(\"^[\" + unicode.wordChars + \"\\\\$_]+\", \"g\");\n\n this.nonTokenRe = new RegExp(\"^(?:[^\" + unicode.wordChars + \"\\\\$_]|\\\\s])+\", \"g\");\n\n this.getTokenizer = function() {\n if (!this.$tokenizer) {\n this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig);\n this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());\n }\n return this.$tokenizer;\n };\n\n this.lineCommentStart = \"\";\n this.blockComment = \"\";\n\n this.toggleCommentLines = function(state, session, startRow, endRow) {\n var doc = session.doc;\n\n var ignoreBlankLines = true;\n var shouldRemove = true;\n var minIndent = Infinity;\n var tabSize = session.getTabSize();\n var insertAtTabStop = false;\n\n if (!this.lineCommentStart) {\n if (!this.blockComment)\n return false;\n var lineCommentStart = this.blockComment.start;\n var lineCommentEnd = this.blockComment.end;\n var regexpStart = new RegExp(\"^(\\\\s*)(?:\" + lang.escapeRegExp(lineCommentStart) + \")\");\n var regexpEnd = new RegExp(\"(?:\" + lang.escapeRegExp(lineCommentEnd) + \")\\\\s*$\");\n\n var comment = function(line, i) {\n if (testRemove(line, i))\n return;\n if (!ignoreBlankLines || /\\S/.test(line)) {\n doc.insertInLine({row: i, column: line.length}, lineCommentEnd);\n doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n }\n };\n\n var uncomment = function(line, i) {\n var m;\n if (m = line.match(regexpEnd))\n doc.removeInLine(i, line.length - m[0].length, line.length);\n if (m = line.match(regexpStart))\n doc.removeInLine(i, m[1].length, m[0].length);\n };\n\n var testRemove = function(line, row) {\n if (regexpStart.test(line))\n return true;\n var tokens = session.getTokens(row);\n for (var i = 0; i < tokens.length; i++) {\n if (tokens[i].type === \"comment\")\n return true;\n }\n };\n } else {\n if (Array.isArray(this.lineCommentStart)) {\n var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join(\"|\");\n var lineCommentStart = this.lineCommentStart[0];\n } else {\n var regexpStart = lang.escapeRegExp(this.lineCommentStart);\n var lineCommentStart = this.lineCommentStart;\n }\n regexpStart = new RegExp(\"^(\\\\s*)(?:\" + regexpStart + \") ?\");\n \n insertAtTabStop = session.getUseSoftTabs();\n\n var uncomment = function(line, i) {\n var m = line.match(regexpStart);\n if (!m) return;\n var start = m[1].length, end = m[0].length;\n if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == \" \")\n end--;\n doc.removeInLine(i, start, end);\n };\n var commentWithSpace = lineCommentStart + \" \";\n var comment = function(line, i) {\n if (!ignoreBlankLines || /\\S/.test(line)) {\n if (shouldInsertSpace(line, minIndent, minIndent))\n doc.insertInLine({row: i, column: minIndent}, commentWithSpace);\n else\n doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n }\n };\n var testRemove = function(line, i) {\n return regexpStart.test(line);\n };\n \n var shouldInsertSpace = function(line, before, after) {\n var spaces = 0;\n while (before-- && line.charAt(before) == \" \")\n spaces++;\n if (spaces % tabSize != 0)\n return false;\n var spaces = 0;\n while (line.charAt(after++) == \" \")\n spaces++;\n if (tabSize > 2)\n return spaces % tabSize != tabSize - 1;\n else\n return spaces % tabSize == 0;\n };\n }\n\n function iter(fun) {\n for (var i = startRow; i <= endRow; i++)\n fun(doc.getLine(i), i);\n }\n\n\n var minEmptyLength = Infinity;\n iter(function(line, i) {\n var indent = line.search(/\\S/);\n if (indent !== -1) {\n if (indent < minIndent)\n minIndent = indent;\n if (shouldRemove && !testRemove(line, i))\n shouldRemove = false;\n } else if (minEmptyLength > line.length) {\n minEmptyLength = line.length;\n }\n });\n\n if (minIndent == Infinity) {\n minIndent = minEmptyLength;\n ignoreBlankLines = false;\n shouldRemove = false;\n }\n\n if (insertAtTabStop && minIndent % tabSize != 0)\n minIndent = Math.floor(minIndent / tabSize) * tabSize;\n\n iter(shouldRemove ? uncomment : comment);\n };\n\n this.toggleBlockComment = function(state, session, range, cursor) {\n var comment = this.blockComment;\n if (!comment)\n return;\n if (!comment.start && comment[0])\n comment = comment[0];\n\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n var token = iterator.getCurrentToken();\n\n var sel = session.selection;\n var initialRange = session.selection.toOrientedRange();\n var startRow, colDiff;\n\n if (token && /comment/.test(token.type)) {\n var startRange, endRange;\n while (token && /comment/.test(token.type)) {\n var i = token.value.indexOf(comment.start);\n if (i != -1) {\n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn() + i;\n startRange = new Range(row, column, row, column + comment.start.length);\n break;\n }\n token = iterator.stepBackward();\n }\n\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n var token = iterator.getCurrentToken();\n while (token && /comment/.test(token.type)) {\n var i = token.value.indexOf(comment.end);\n if (i != -1) {\n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn() + i;\n endRange = new Range(row, column, row, column + comment.end.length);\n break;\n }\n token = iterator.stepForward();\n }\n if (endRange)\n session.remove(endRange);\n if (startRange) {\n session.remove(startRange);\n startRow = startRange.start.row;\n colDiff = -comment.start.length;\n }\n } else {\n colDiff = comment.start.length;\n startRow = range.start.row;\n session.insert(range.end, comment.end);\n session.insert(range.start, comment.start);\n }\n if (initialRange.start.row == startRow)\n initialRange.start.column += colDiff;\n if (initialRange.end.row == startRow)\n initialRange.end.column += colDiff;\n session.selection.fromOrientedRange(initialRange);\n };\n\n this.getNextLineIndent = function(state, line, tab) {\n return this.$getIndent(line);\n };\n\n this.checkOutdent = function(state, line, input) {\n return false;\n };\n\n this.autoOutdent = function(state, doc, row) {\n };\n\n this.$getIndent = function(line) {\n return line.match(/^\\s*/)[0];\n };\n\n this.createWorker = function(session) {\n return null;\n };\n\n this.createModeDelegates = function (mapping) {\n this.$embeds = [];\n this.$modes = {};\n for (var i in mapping) {\n if (mapping[i]) {\n var Mode = mapping[i];\n var id = Mode.prototype.$id;\n var mode = config.$modes[id];\n if (!mode)\n config.$modes[id] = mode = new Mode();\n if (!config.$modes[i])\n config.$modes[i] = mode;\n this.$embeds.push(i);\n this.$modes[i] = mode;\n }\n }\n\n var delegations = [\"toggleBlockComment\", \"toggleCommentLines\", \"getNextLineIndent\", \n \"checkOutdent\", \"autoOutdent\", \"transformAction\", \"getCompletions\"];\n\n for (var i = 0; i < delegations.length; i++) {\n (function(scope) {\n var functionName = delegations[i];\n var defaultHandler = scope[functionName];\n scope[delegations[i]] = function() {\n return this.$delegator(functionName, arguments, defaultHandler);\n };\n }(this));\n }\n };\n\n this.$delegator = function(method, args, defaultHandler) {\n var state = args[0] || \"start\";\n if (typeof state != \"string\") {\n if (Array.isArray(state[2])) {\n var language = state[2][state[2].length - 1];\n var mode = this.$modes[language];\n if (mode)\n return mode[method].apply(mode, [state[1]].concat([].slice.call(args, 1)));\n }\n state = state[0] || \"start\";\n }\n \n for (var i = 0; i < this.$embeds.length; i++) {\n if (!this.$modes[this.$embeds[i]]) continue;\n\n var split = state.split(this.$embeds[i]);\n if (!split[0] && split[1]) {\n args[0] = split[1];\n var mode = this.$modes[this.$embeds[i]];\n return mode[method].apply(mode, args);\n }\n }\n var ret = defaultHandler.apply(this, args);\n return defaultHandler ? ret : undefined;\n };\n\n this.transformAction = function(state, action, editor, session, param) {\n if (this.$behaviour) {\n var behaviours = this.$behaviour.getBehaviours();\n for (var key in behaviours) {\n if (behaviours[key][action]) {\n var ret = behaviours[key][action].apply(this, arguments);\n if (ret) {\n return ret;\n }\n }\n }\n }\n };\n \n this.getKeywords = function(append) {\n if (!this.completionKeywords) {\n var rules = this.$tokenizer.rules;\n var completionKeywords = [];\n for (var rule in rules) {\n var ruleItr = rules[rule];\n for (var r = 0, l = ruleItr.length; r < l; r++) {\n if (typeof ruleItr[r].token === \"string\") {\n if (/keyword|support|storage/.test(ruleItr[r].token))\n completionKeywords.push(ruleItr[r].regex);\n }\n else if (typeof ruleItr[r].token === \"object\") {\n for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { \n if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\n var rule = ruleItr[r].regex.match(/\\(.+?\\)/g)[a];\n completionKeywords.push(rule.substr(1, rule.length - 2));\n }\n }\n }\n }\n }\n this.completionKeywords = completionKeywords;\n }\n if (!append)\n return this.$keywordList;\n return completionKeywords.concat(this.$keywordList || []);\n };\n \n this.$createKeywordList = function() {\n if (!this.$highlightRules)\n this.getTokenizer();\n return this.$keywordList = this.$highlightRules.$keywordList || [];\n };\n\n this.getCompletions = function(state, session, pos, prefix) {\n var keywords = this.$keywordList || this.$createKeywordList();\n return keywords.map(function(word) {\n return {\n name: word,\n value: word,\n score: 0,\n meta: \"keyword\"\n };\n });\n };\n\n this.$id = \"ace/mode/text\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nfunction throwDeltaError(delta, errorText){\n console.log(\"Invalid Delta:\", delta);\n throw \"Invalid Delta: \" + errorText;\n}\n\nfunction positionInDocument(docLines, position) {\n return position.row >= 0 && position.row < docLines.length &&\n position.column >= 0 && position.column <= docLines[position.row].length;\n}\n\nfunction validateDelta(docLines, delta) {\n if (delta.action != \"insert\" && delta.action != \"remove\")\n throwDeltaError(delta, \"delta.action must be 'insert' or 'remove'\");\n if (!(delta.lines instanceof Array))\n throwDeltaError(delta, \"delta.lines must be an Array\");\n if (!delta.start || !delta.end)\n throwDeltaError(delta, \"delta.start/end must be an present\");\n var start = delta.start;\n if (!positionInDocument(docLines, delta.start))\n throwDeltaError(delta, \"delta.start must be contained in document\");\n var end = delta.end;\n if (delta.action == \"remove\" && !positionInDocument(docLines, end))\n throwDeltaError(delta, \"delta.end must contained in document for 'remove' actions\");\n var numRangeRows = end.row - start.row;\n var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));\n if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)\n throwDeltaError(delta, \"delta.range must match delta lines\");\n}\n\nexports.applyDelta = function(docLines, delta, doNotValidate) {\n \n var row = delta.start.row;\n var startColumn = delta.start.column;\n var line = docLines[row] || \"\";\n switch (delta.action) {\n case \"insert\":\n var lines = delta.lines;\n if (lines.length === 1) {\n docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);\n } else {\n var args = [row, 1].concat(delta.lines);\n docLines.splice.apply(docLines, args);\n docLines[row] = line.substring(0, startColumn) + docLines[row];\n docLines[row + delta.lines.length - 1] += line.substring(startColumn);\n }\n break;\n case \"remove\":\n var endColumn = delta.end.column;\n var endRow = delta.end.row;\n if (row === endRow) {\n docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);\n } else {\n docLines.splice(\n row, endRow - row + 1,\n line.substring(0, startColumn) + docLines[endRow].substring(endColumn)\n );\n }\n break;\n }\n};\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n this.$onChange = this.onChange.bind(this);\n this.attach(doc);\n \n if (typeof column == \"undefined\")\n this.setPosition(row.row, row.column);\n else\n this.setPosition(row, column);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.getPosition = function() {\n return this.$clipPositionToDocument(this.row, this.column);\n };\n this.getDocument = function() {\n return this.document;\n };\n this.$insertRight = false;\n this.onChange = function(delta) {\n if (delta.start.row == delta.end.row && delta.start.row != this.row)\n return;\n\n if (delta.start.row > this.row)\n return;\n \n var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);\n this.setPosition(point.row, point.column, true);\n };\n \n function $pointsInOrder(point1, point2, equalPointsInOrder) {\n var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;\n return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);\n }\n \n function $getTransformedPoint(delta, point, moveIfEqual) {\n var deltaIsInsert = delta.action == \"insert\";\n var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);\n var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);\n var deltaStart = delta.start;\n var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.\n if ($pointsInOrder(point, deltaStart, moveIfEqual)) {\n return {\n row: point.row,\n column: point.column\n };\n }\n if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {\n return {\n row: point.row + deltaRowShift,\n column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)\n };\n }\n \n return {\n row: deltaStart.row,\n column: deltaStart.column\n };\n }\n this.setPosition = function(row, column, noClip) {\n var pos;\n if (noClip) {\n pos = {\n row: row,\n column: column\n };\n } else {\n pos = this.$clipPositionToDocument(row, column);\n }\n\n if (this.row == pos.row && this.column == pos.column)\n return;\n\n var old = {\n row: this.row,\n column: this.column\n };\n\n this.row = pos.row;\n this.column = pos.column;\n this._signal(\"change\", {\n old: old,\n value: pos\n });\n };\n this.detach = function() {\n this.document.off(\"change\", this.$onChange);\n };\n this.attach = function(doc) {\n this.document = doc || this.document;\n this.document.on(\"change\", this.$onChange);\n };\n this.$clipPositionToDocument = function(row, column) {\n var pos = {};\n\n if (row >= this.document.getLength()) {\n pos.row = Math.max(0, this.document.getLength() - 1);\n pos.column = this.document.getLine(pos.row).length;\n }\n else if (row < 0) {\n pos.row = 0;\n pos.column = 0;\n }\n else {\n pos.row = row;\n pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n }\n\n if (column < 0)\n pos.column = 0;\n\n return pos;\n };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar applyDelta = require(\"./apply_delta\").applyDelta;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(textOrLines) {\n this.$lines = [\"\"];\n if (textOrLines.length === 0) {\n this.$lines = [\"\"];\n } else if (Array.isArray(textOrLines)) {\n this.insertMergedLines({row: 0, column: 0}, textOrLines);\n } else {\n this.insert({row: 0, column:0}, textOrLines);\n }\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setValue = function(text) {\n var len = this.getLength() - 1;\n this.remove(new Range(0, 0, len, this.getLine(len).length));\n this.insert({row: 0, column: 0}, text);\n };\n this.getValue = function() {\n return this.getAllLines().join(this.getNewLineCharacter());\n };\n this.createAnchor = function(row, column) {\n return new Anchor(this, row, column);\n };\n if (\"aaa\".split(/a/).length === 0) {\n this.$split = function(text) {\n return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n };\n } else {\n this.$split = function(text) {\n return text.split(/\\r\\n|\\r|\\n/);\n };\n }\n\n\n this.$detectNewLine = function(text) {\n var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n this.$autoNewLine = match ? match[1] : \"\\n\";\n this._signal(\"changeNewLineMode\");\n };\n this.getNewLineCharacter = function() {\n switch (this.$newLineMode) {\n case \"windows\":\n return \"\\r\\n\";\n case \"unix\":\n return \"\\n\";\n default:\n return this.$autoNewLine || \"\\n\";\n }\n };\n\n this.$autoNewLine = \"\";\n this.$newLineMode = \"auto\";\n this.setNewLineMode = function(newLineMode) {\n if (this.$newLineMode === newLineMode)\n return;\n\n this.$newLineMode = newLineMode;\n this._signal(\"changeNewLineMode\");\n };\n this.getNewLineMode = function() {\n return this.$newLineMode;\n };\n this.isNewLine = function(text) {\n return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n };\n this.getLine = function(row) {\n return this.$lines[row] || \"\";\n };\n this.getLines = function(firstRow, lastRow) {\n return this.$lines.slice(firstRow, lastRow + 1);\n };\n this.getAllLines = function() {\n return this.getLines(0, this.getLength());\n };\n this.getLength = function() {\n return this.$lines.length;\n };\n this.getTextRange = function(range) {\n return this.getLinesForRange(range).join(this.getNewLineCharacter());\n };\n this.getLinesForRange = function(range) {\n var lines;\n if (range.start.row === range.end.row) {\n lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];\n } else {\n lines = this.getLines(range.start.row, range.end.row);\n lines[0] = (lines[0] || \"\").substring(range.start.column);\n var l = lines.length - 1;\n if (range.end.row - range.start.row == l)\n lines[l] = lines[l].substring(0, range.end.column);\n }\n return lines;\n };\n this.insertLines = function(row, lines) {\n console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\");\n return this.insertFullLines(row, lines);\n };\n this.removeLines = function(firstRow, lastRow) {\n console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\");\n return this.removeFullLines(firstRow, lastRow);\n };\n this.insertNewLine = function(position) {\n console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\");\n return this.insertMergedLines(position, [\"\", \"\"]);\n };\n this.insert = function(position, text) {\n if (this.getLength() <= 1)\n this.$detectNewLine(text);\n \n return this.insertMergedLines(position, this.$split(text));\n };\n this.insertInLine = function(position, text) {\n var start = this.clippedPos(position.row, position.column);\n var end = this.pos(position.row, position.column + text.length);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: [text]\n }, true);\n \n return this.clonePos(end);\n };\n \n this.clippedPos = function(row, column) {\n var length = this.getLength();\n if (row === undefined) {\n row = length;\n } else if (row < 0) {\n row = 0;\n } else if (row >= length) {\n row = length - 1;\n column = undefined;\n }\n var line = this.getLine(row);\n if (column == undefined)\n column = line.length;\n column = Math.min(Math.max(column, 0), line.length);\n return {row: row, column: column};\n };\n \n this.clonePos = function(pos) {\n return {row: pos.row, column: pos.column};\n };\n \n this.pos = function(row, column) {\n return {row: row, column: column};\n };\n \n this.$clipPosition = function(position) {\n var length = this.getLength();\n if (position.row >= length) {\n position.row = Math.max(0, length - 1);\n position.column = this.getLine(length - 1).length;\n } else {\n position.row = Math.max(0, position.row);\n position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);\n }\n return position;\n };\n this.insertFullLines = function(row, lines) {\n row = Math.min(Math.max(row, 0), this.getLength());\n var column = 0;\n if (row < this.getLength()) {\n lines = lines.concat([\"\"]);\n column = 0;\n } else {\n lines = [\"\"].concat(lines);\n row--;\n column = this.$lines[row].length;\n }\n this.insertMergedLines({row: row, column: column}, lines);\n }; \n this.insertMergedLines = function(position, lines) {\n var start = this.clippedPos(position.row, position.column);\n var end = {\n row: start.row + lines.length - 1,\n column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length\n };\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: lines\n });\n \n return this.clonePos(end);\n };\n this.remove = function(range) {\n var start = this.clippedPos(range.start.row, range.start.column);\n var end = this.clippedPos(range.end.row, range.end.column);\n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n });\n return this.clonePos(start);\n };\n this.removeInLine = function(row, startColumn, endColumn) {\n var start = this.clippedPos(row, startColumn);\n var end = this.clippedPos(row, endColumn);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n }, true);\n \n return this.clonePos(start);\n };\n this.removeFullLines = function(firstRow, lastRow) {\n firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);\n lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);\n var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;\n var deleteLastNewLine = lastRow < this.getLength() - 1;\n var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow );\n var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 );\n var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow );\n var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); \n var range = new Range(startRow, startCol, endRow, endCol);\n var deletedLines = this.$lines.slice(firstRow, lastRow + 1);\n \n this.applyDelta({\n start: range.start,\n end: range.end,\n action: \"remove\",\n lines: this.getLinesForRange(range)\n });\n return deletedLines;\n };\n this.removeNewLine = function(row) {\n if (row < this.getLength() - 1 && row >= 0) {\n this.applyDelta({\n start: this.pos(row, this.getLine(row).length),\n end: this.pos(row + 1, 0),\n action: \"remove\",\n lines: [\"\", \"\"]\n });\n }\n };\n this.replace = function(range, text) {\n if (!(range instanceof Range))\n range = Range.fromPoints(range.start, range.end);\n if (text.length === 0 && range.isEmpty())\n return range.start;\n if (text == this.getTextRange(range))\n return range.end;\n\n this.remove(range);\n var end;\n if (text) {\n end = this.insert(range.start, text);\n }\n else {\n end = range.start;\n }\n \n return end;\n };\n this.applyDeltas = function(deltas) {\n for (var i=0; i=0; i--) {\n this.revertDelta(deltas[i]);\n }\n };\n this.applyDelta = function(delta, doNotValidate) {\n var isInsert = delta.action == \"insert\";\n if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]\n : !Range.comparePoints(delta.start, delta.end)) {\n return;\n }\n \n if (isInsert && delta.lines.length > 20000) {\n this.$splitAndapplyLargeDelta(delta, 20000);\n }\n else {\n applyDelta(this.$lines, delta, doNotValidate);\n this._signal(\"change\", delta);\n }\n };\n \n this.$safeApplyDelta = function(delta) {\n var docLength = this.$lines.length;\n if (\n delta.action == \"remove\" && delta.start.row < docLength && delta.end.row < docLength\n || delta.action == \"insert\" && delta.start.row <= docLength\n ) {\n this.applyDelta(delta);\n }\n };\n \n this.$splitAndapplyLargeDelta = function(delta, MAX) {\n var lines = delta.lines;\n var l = lines.length - MAX + 1;\n var row = delta.start.row; \n var column = delta.start.column;\n for (var from = 0, to = 0; from < l; from = to) {\n to += MAX - 1;\n var chunk = lines.slice(from, to);\n chunk.push(\"\");\n this.applyDelta({\n start: this.pos(row + from, column),\n end: this.pos(row + to, column = 0),\n action: delta.action,\n lines: chunk\n }, true);\n }\n delta.lines = lines.slice(from);\n delta.start.row = row + from;\n delta.start.column = column;\n this.applyDelta(delta, true);\n };\n this.revertDelta = function(delta) {\n this.$safeApplyDelta({\n start: this.clonePos(delta.start),\n end: this.clonePos(delta.end),\n action: (delta.action == \"insert\" ? \"remove\" : \"insert\"),\n lines: delta.lines.slice()\n });\n };\n this.indexToPosition = function(index, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n for (var i = startRow || 0, l = lines.length; i < l; i++) {\n index -= lines[i].length + newlineLength;\n if (index < 0)\n return {row: i, column: index + lines[i].length + newlineLength};\n }\n return {row: l-1, column: index + lines[l-1].length + newlineLength};\n };\n this.positionToIndex = function(pos, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n var index = 0;\n var row = Math.min(pos.row, lines.length);\n for (var i = startRow || 0; i < row; ++i)\n index += lines[i].length + newlineLength;\n\n return index + pos.column;\n };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/background_tokenizer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar BackgroundTokenizer = function(tokenizer, editor) {\n this.running = false;\n this.lines = [];\n this.states = [];\n this.currentLine = 0;\n this.tokenizer = tokenizer;\n\n var self = this;\n\n this.$worker = function() {\n if (!self.running) { return; }\n\n var workerStart = new Date();\n var currentLine = self.currentLine;\n var endLine = -1;\n var doc = self.doc;\n\n var startLine = currentLine;\n while (self.lines[currentLine])\n currentLine++;\n \n var len = doc.getLength();\n var processedLines = 0;\n self.running = false;\n while (currentLine < len) {\n self.$tokenizeRow(currentLine);\n endLine = currentLine;\n do {\n currentLine++;\n } while (self.lines[currentLine]);\n processedLines ++;\n if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) {\n self.running = setTimeout(self.$worker, 20);\n break;\n }\n }\n self.currentLine = currentLine;\n \n if (endLine == -1)\n endLine = currentLine;\n \n if (startLine <= endLine)\n self.fireUpdateEvent(startLine, endLine);\n };\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n this.setTokenizer = function(tokenizer) {\n this.tokenizer = tokenizer;\n this.lines = [];\n this.states = [];\n\n this.start(0);\n };\n this.setDocument = function(doc) {\n this.doc = doc;\n this.lines = [];\n this.states = [];\n\n this.stop();\n };\n this.fireUpdateEvent = function(firstRow, lastRow) {\n var data = {\n first: firstRow,\n last: lastRow\n };\n this._signal(\"update\", {data: data});\n };\n this.start = function(startRow) {\n this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength());\n this.lines.splice(this.currentLine, this.lines.length);\n this.states.splice(this.currentLine, this.states.length);\n\n this.stop();\n this.running = setTimeout(this.$worker, 700);\n };\n \n this.scheduleStart = function() {\n if (!this.running)\n this.running = setTimeout(this.$worker, 700);\n };\n\n this.$updateOnChange = function(delta) {\n var startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n this.lines[startRow] = null;\n } else if (delta.action == \"remove\") {\n this.lines.splice(startRow, len + 1, null);\n this.states.splice(startRow, len + 1, null);\n } else {\n var args = Array(len + 1);\n args.unshift(startRow, 1);\n this.lines.splice.apply(this.lines, args);\n this.states.splice.apply(this.states, args);\n }\n\n this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());\n\n this.stop();\n };\n this.stop = function() {\n if (this.running)\n clearTimeout(this.running);\n this.running = false;\n };\n this.getTokens = function(row) {\n return this.lines[row] || this.$tokenizeRow(row);\n };\n this.getState = function(row) {\n if (this.currentLine == row)\n this.$tokenizeRow(row);\n return this.states[row] || \"start\";\n };\n\n this.$tokenizeRow = function(row) {\n var line = this.doc.getLine(row);\n var state = this.states[row - 1];\n\n var data = this.tokenizer.getLineTokens(line, state, row);\n\n if (this.states[row] + \"\" !== data.state + \"\") {\n this.states[row] = data.state;\n this.lines[row + 1] = null;\n if (this.currentLine > row + 1)\n this.currentLine = row + 1;\n } else if (this.currentLine == row) {\n this.currentLine = row + 1;\n }\n\n return this.lines[row] = data.tokens;\n };\n\n}).call(BackgroundTokenizer.prototype);\n\nexports.BackgroundTokenizer = BackgroundTokenizer;\n});\n\nace.define(\"ace/search_highlight\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\n\nvar SearchHighlight = function(regExp, clazz, type) {\n this.setRegexp(regExp);\n this.clazz = clazz;\n this.type = type || \"text\";\n};\n\n(function() {\n this.MAX_RANGES = 500;\n \n this.setRegexp = function(regExp) {\n if (this.regExp+\"\" == regExp+\"\")\n return;\n this.regExp = regExp;\n this.cache = [];\n };\n\n this.update = function(html, markerLayer, session, config) {\n if (!this.regExp)\n return;\n var start = config.firstRow, end = config.lastRow;\n\n for (var i = start; i <= end; i++) {\n var ranges = this.cache[i];\n if (ranges == null) {\n ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);\n if (ranges.length > this.MAX_RANGES)\n ranges = ranges.slice(0, this.MAX_RANGES);\n ranges = ranges.map(function(match) {\n return new Range(i, match.offset, i, match.offset + match.length);\n });\n this.cache[i] = ranges.length ? ranges : \"\";\n }\n\n for (var j = ranges.length; j --; ) {\n markerLayer.drawSingleLineMarker(\n html, ranges[j].toScreenRange(session), this.clazz, config);\n }\n }\n };\n\n}).call(SearchHighlight.prototype);\n\nexports.SearchHighlight = SearchHighlight;\n});\n\nace.define(\"ace/edit_session/fold_line\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\nfunction FoldLine(foldData, folds) {\n this.foldData = foldData;\n if (Array.isArray(folds)) {\n this.folds = folds;\n } else {\n folds = this.folds = [ folds ];\n }\n\n var last = folds[folds.length - 1];\n this.range = new Range(folds[0].start.row, folds[0].start.column,\n last.end.row, last.end.column);\n this.start = this.range.start;\n this.end = this.range.end;\n\n this.folds.forEach(function(fold) {\n fold.setFoldLine(this);\n }, this);\n}\n\n(function() {\n this.shiftRow = function(shift) {\n this.start.row += shift;\n this.end.row += shift;\n this.folds.forEach(function(fold) {\n fold.start.row += shift;\n fold.end.row += shift;\n });\n };\n\n this.addFold = function(fold) {\n if (fold.sameRow) {\n if (fold.start.row < this.startRow || fold.endRow > this.endRow) {\n throw new Error(\"Can't add a fold to this FoldLine as it has no connection\");\n }\n this.folds.push(fold);\n this.folds.sort(function(a, b) {\n return -a.range.compareEnd(b.start.row, b.start.column);\n });\n if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {\n this.end.row = fold.end.row;\n this.end.column = fold.end.column;\n } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {\n this.start.row = fold.start.row;\n this.start.column = fold.start.column;\n }\n } else if (fold.start.row == this.end.row) {\n this.folds.push(fold);\n this.end.row = fold.end.row;\n this.end.column = fold.end.column;\n } else if (fold.end.row == this.start.row) {\n this.folds.unshift(fold);\n this.start.row = fold.start.row;\n this.start.column = fold.start.column;\n } else {\n throw new Error(\"Trying to add fold to FoldRow that doesn't have a matching row\");\n }\n fold.foldLine = this;\n };\n\n this.containsRow = function(row) {\n return row >= this.start.row && row <= this.end.row;\n };\n\n this.walk = function(callback, endRow, endColumn) {\n var lastEnd = 0,\n folds = this.folds,\n fold,\n cmp, stop, isNewRow = true;\n\n if (endRow == null) {\n endRow = this.end.row;\n endColumn = this.end.column;\n }\n\n for (var i = 0; i < folds.length; i++) {\n fold = folds[i];\n\n cmp = fold.range.compareStart(endRow, endColumn);\n if (cmp == -1) {\n callback(null, endRow, endColumn, lastEnd, isNewRow);\n return;\n }\n\n stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow);\n stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd);\n if (stop || cmp === 0) {\n return;\n }\n isNewRow = !fold.sameRow;\n lastEnd = fold.end.column;\n }\n callback(null, endRow, endColumn, lastEnd, isNewRow);\n };\n\n this.getNextFoldTo = function(row, column) {\n var fold, cmp;\n for (var i = 0; i < this.folds.length; i++) {\n fold = this.folds[i];\n cmp = fold.range.compareEnd(row, column);\n if (cmp == -1) {\n return {\n fold: fold,\n kind: \"after\"\n };\n } else if (cmp === 0) {\n return {\n fold: fold,\n kind: \"inside\"\n };\n }\n }\n return null;\n };\n\n this.addRemoveChars = function(row, column, len) {\n var ret = this.getNextFoldTo(row, column),\n fold, folds;\n if (ret) {\n fold = ret.fold;\n if (ret.kind == \"inside\"\n && fold.start.column != column\n && fold.start.row != row)\n {\n window.console && window.console.log(row, column, fold);\n } else if (fold.start.row == row) {\n folds = this.folds;\n var i = folds.indexOf(fold);\n if (i === 0) {\n this.start.column += len;\n }\n for (i; i < folds.length; i++) {\n fold = folds[i];\n fold.start.column += len;\n if (!fold.sameRow) {\n return;\n }\n fold.end.column += len;\n }\n this.end.column += len;\n }\n }\n };\n\n this.split = function(row, column) {\n var pos = this.getNextFoldTo(row, column);\n \n if (!pos || pos.kind == \"inside\")\n return null;\n \n var fold = pos.fold;\n var folds = this.folds;\n var foldData = this.foldData;\n \n var i = folds.indexOf(fold);\n var foldBefore = folds[i - 1];\n this.end.row = foldBefore.end.row;\n this.end.column = foldBefore.end.column;\n folds = folds.splice(i, folds.length - i);\n\n var newFoldLine = new FoldLine(foldData, folds);\n foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);\n return newFoldLine;\n };\n\n this.merge = function(foldLineNext) {\n var folds = foldLineNext.folds;\n for (var i = 0; i < folds.length; i++) {\n this.addFold(folds[i]);\n }\n var foldData = this.foldData;\n foldData.splice(foldData.indexOf(foldLineNext), 1);\n };\n\n this.toString = function() {\n var ret = [this.range.toString() + \": [\" ];\n\n this.folds.forEach(function(fold) {\n ret.push(\" \" + fold.toString());\n });\n ret.push(\"]\");\n return ret.join(\"\\n\");\n };\n\n this.idxToPosition = function(idx) {\n var lastFoldEndColumn = 0;\n\n for (var i = 0; i < this.folds.length; i++) {\n var fold = this.folds[i];\n\n idx -= fold.start.column - lastFoldEndColumn;\n if (idx < 0) {\n return {\n row: fold.start.row,\n column: fold.start.column + idx\n };\n }\n\n idx -= fold.placeholder.length;\n if (idx < 0) {\n return fold.start;\n }\n\n lastFoldEndColumn = fold.end.column;\n }\n\n return {\n row: this.end.row,\n column: this.end.column + idx\n };\n };\n}).call(FoldLine.prototype);\n\nexports.FoldLine = FoldLine;\n});\n\nace.define(\"ace/range_list\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar Range = require(\"./range\").Range;\nvar comparePoints = Range.comparePoints;\n\nvar RangeList = function() {\n this.ranges = [];\n this.$bias = 1;\n};\n\n(function() {\n this.comparePoints = comparePoints;\n\n this.pointIndex = function(pos, excludeEdges, startIndex) {\n var list = this.ranges;\n\n for (var i = startIndex || 0; i < list.length; i++) {\n var range = list[i];\n var cmpEnd = comparePoints(pos, range.end);\n if (cmpEnd > 0)\n continue;\n var cmpStart = comparePoints(pos, range.start);\n if (cmpEnd === 0)\n return excludeEdges && cmpStart !== 0 ? -i-2 : i;\n if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))\n return i;\n\n return -i-1;\n }\n return -i - 1;\n };\n\n this.add = function(range) {\n var excludeEdges = !range.isEmpty();\n var startIndex = this.pointIndex(range.start, excludeEdges);\n if (startIndex < 0)\n startIndex = -startIndex - 1;\n\n var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\n\n if (endIndex < 0)\n endIndex = -endIndex - 1;\n else\n endIndex++;\n return this.ranges.splice(startIndex, endIndex - startIndex, range);\n };\n\n this.addList = function(list) {\n var removed = [];\n for (var i = list.length; i--; ) {\n removed.push.apply(removed, this.add(list[i]));\n }\n return removed;\n };\n\n this.substractPoint = function(pos) {\n var i = this.pointIndex(pos);\n\n if (i >= 0)\n return this.ranges.splice(i, 1);\n };\n this.merge = function() {\n var removed = [];\n var list = this.ranges;\n \n list = list.sort(function(a, b) {\n return comparePoints(a.start, b.start);\n });\n \n var next = list[0], range;\n for (var i = 1; i < list.length; i++) {\n range = next;\n next = list[i];\n var cmp = comparePoints(range.end, next.start);\n if (cmp < 0)\n continue;\n\n if (cmp == 0 && !range.isEmpty() && !next.isEmpty())\n continue;\n\n if (comparePoints(range.end, next.end) < 0) {\n range.end.row = next.end.row;\n range.end.column = next.end.column;\n }\n\n list.splice(i, 1);\n removed.push(next);\n next = range;\n i--;\n }\n \n this.ranges = list;\n\n return removed;\n };\n\n this.contains = function(row, column) {\n return this.pointIndex({row: row, column: column}) >= 0;\n };\n\n this.containsPoint = function(pos) {\n return this.pointIndex(pos) >= 0;\n };\n\n this.rangeAtPoint = function(pos) {\n var i = this.pointIndex(pos);\n if (i >= 0)\n return this.ranges[i];\n };\n\n\n this.clipRows = function(startRow, endRow) {\n var list = this.ranges;\n if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow)\n return [];\n\n var startIndex = this.pointIndex({row: startRow, column: 0});\n if (startIndex < 0)\n startIndex = -startIndex - 1;\n var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex);\n if (endIndex < 0)\n endIndex = -endIndex - 1;\n\n var clipped = [];\n for (var i = startIndex; i < endIndex; i++) {\n clipped.push(list[i]);\n }\n return clipped;\n };\n\n this.removeAll = function() {\n return this.ranges.splice(0, this.ranges.length);\n };\n\n this.attach = function(session) {\n if (this.session)\n this.detach();\n\n this.session = session;\n this.onChange = this.$onChange.bind(this);\n\n this.session.on('change', this.onChange);\n };\n\n this.detach = function() {\n if (!this.session)\n return;\n this.session.removeListener('change', this.onChange);\n this.session = null;\n };\n\n this.$onChange = function(delta) {\n var start = delta.start;\n var end = delta.end;\n var startRow = start.row;\n var endRow = end.row;\n var ranges = this.ranges;\n for (var i = 0, n = ranges.length; i < n; i++) {\n var r = ranges[i];\n if (r.end.row >= startRow)\n break;\n }\n \n if (delta.action == \"insert\") {\n var lineDif = endRow - startRow;\n var colDiff = -start.column + end.column;\n for (; i < n; i++) {\n var r = ranges[i];\n if (r.start.row > startRow)\n break;\n \n if (r.start.row == startRow && r.start.column >= start.column) {\n if (r.start.column == start.column && this.$bias <= 0) {\n } else {\n r.start.column += colDiff;\n r.start.row += lineDif;\n }\n }\n if (r.end.row == startRow && r.end.column >= start.column) {\n if (r.end.column == start.column && this.$bias < 0) {\n continue;\n }\n if (r.end.column == start.column && colDiff > 0 && i < n - 1) {\n if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\n r.end.column -= colDiff;\n }\n r.end.column += colDiff;\n r.end.row += lineDif;\n }\n }\n } else {\n var lineDif = startRow - endRow;\n var colDiff = start.column - end.column;\n for (; i < n; i++) {\n var r = ranges[i];\n \n if (r.start.row > endRow)\n break;\n \n if (r.end.row < endRow\n && (\n startRow < r.end.row \n || startRow == r.end.row && start.column < r.end.column\n )\n ) {\n r.end.row = startRow;\n r.end.column = start.column;\n }\n else if (r.end.row == endRow) {\n if (r.end.column <= end.column) {\n if (lineDif || r.end.column > start.column) {\n r.end.column = start.column;\n r.end.row = start.row;\n }\n }\n else {\n r.end.column += colDiff;\n r.end.row += lineDif;\n }\n }\n else if (r.end.row > endRow) {\n r.end.row += lineDif;\n }\n \n if (r.start.row < endRow\n && (\n startRow < r.start.row \n || startRow == r.start.row && start.column < r.start.column\n )\n ) {\n r.start.row = startRow;\n r.start.column = start.column;\n }\n else if (r.start.row == endRow) {\n if (r.start.column <= end.column) {\n if (lineDif || r.start.column > start.column) {\n r.start.column = start.column;\n r.start.row = start.row;\n }\n }\n else {\n r.start.column += colDiff;\n r.start.row += lineDif;\n }\n }\n else if (r.start.row > endRow) {\n r.start.row += lineDif;\n }\n }\n }\n\n if (lineDif != 0 && i < n) {\n for (; i < n; i++) {\n var r = ranges[i];\n r.start.row += lineDif;\n r.end.row += lineDif;\n }\n }\n };\n\n}).call(RangeList.prototype);\n\nexports.RangeList = RangeList;\n});\n\nace.define(\"ace/edit_session/fold\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\nvar RangeList = require(\"../range_list\").RangeList;\nvar oop = require(\"../lib/oop\");\nvar Fold = exports.Fold = function(range, placeholder) {\n this.foldLine = null;\n this.placeholder = placeholder;\n this.range = range;\n this.start = range.start;\n this.end = range.end;\n\n this.sameRow = range.start.row == range.end.row;\n this.subFolds = this.ranges = [];\n};\n\noop.inherits(Fold, RangeList);\n\n(function() {\n\n this.toString = function() {\n return '\"' + this.placeholder + '\" ' + this.range.toString();\n };\n\n this.setFoldLine = function(foldLine) {\n this.foldLine = foldLine;\n this.subFolds.forEach(function(fold) {\n fold.setFoldLine(foldLine);\n });\n };\n\n this.clone = function() {\n var range = this.range.clone();\n var fold = new Fold(range, this.placeholder);\n this.subFolds.forEach(function(subFold) {\n fold.subFolds.push(subFold.clone());\n });\n fold.collapseChildren = this.collapseChildren;\n return fold;\n };\n\n this.addSubFold = function(fold) {\n if (this.range.isEqual(fold))\n return;\n consumeRange(fold, this.start);\n\n var row = fold.start.row, column = fold.start.column;\n for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\n cmp = this.subFolds[i].range.compare(row, column);\n if (cmp != 1)\n break;\n }\n var afterStart = this.subFolds[i];\n var firstConsumed = 0;\n\n if (cmp == 0) {\n if (afterStart.range.containsRange(fold))\n return afterStart.addSubFold(fold);\n else\n firstConsumed = 1;\n }\n var row = fold.range.end.row, column = fold.range.end.column;\n for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\n cmp = this.subFolds[j].range.compare(row, column);\n if (cmp != 1)\n break;\n }\n if (cmp == 0) j++;\n var consumedFolds = this.subFolds.splice(i, j - i, fold);\n var last = cmp == 0 ? consumedFolds.length - 1 : consumedFolds.length;\n for (var k = firstConsumed; k < last; k++) {\n fold.addSubFold(consumedFolds[k]);\n }\n fold.setFoldLine(this.foldLine);\n\n return fold;\n };\n \n this.restoreRange = function(range) {\n return restoreRange(range, this.start);\n };\n\n}).call(Fold.prototype);\n\nfunction consumePoint(point, anchor) {\n point.row -= anchor.row;\n if (point.row == 0)\n point.column -= anchor.column;\n}\nfunction consumeRange(range, anchor) {\n consumePoint(range.start, anchor);\n consumePoint(range.end, anchor);\n}\nfunction restorePoint(point, anchor) {\n if (point.row == 0)\n point.column += anchor.column;\n point.row += anchor.row;\n}\nfunction restoreRange(range, anchor) {\n restorePoint(range.start, anchor);\n restorePoint(range.end, anchor);\n}\n\n});\n\nace.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) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\nvar FoldLine = require(\"./fold_line\").FoldLine;\nvar Fold = require(\"./fold\").Fold;\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nfunction Folding() {\n this.getFoldAt = function(row, column, side) {\n var foldLine = this.getFoldLine(row);\n if (!foldLine)\n return null;\n\n var folds = foldLine.folds;\n for (var i = 0; i < folds.length; i++) {\n var range = folds[i].range;\n if (range.contains(row, column)) {\n if (side == 1 && range.isEnd(row, column) && !range.isEmpty()) {\n continue;\n } else if (side == -1 && range.isStart(row, column) && !range.isEmpty()) {\n continue;\n }\n return folds[i];\n }\n }\n };\n this.getFoldsInRange = function(range) {\n var start = range.start;\n var end = range.end;\n var foldLines = this.$foldData;\n var foundFolds = [];\n\n start.column += 1;\n end.column -= 1;\n\n for (var i = 0; i < foldLines.length; i++) {\n var cmp = foldLines[i].range.compareRange(range);\n if (cmp == 2) {\n continue;\n }\n else if (cmp == -2) {\n break;\n }\n\n var folds = foldLines[i].folds;\n for (var j = 0; j < folds.length; j++) {\n var fold = folds[j];\n cmp = fold.range.compareRange(range);\n if (cmp == -2) {\n break;\n } else if (cmp == 2) {\n continue;\n } else\n if (cmp == 42) {\n break;\n }\n foundFolds.push(fold);\n }\n }\n start.column -= 1;\n end.column += 1;\n\n return foundFolds;\n };\n\n this.getFoldsInRangeList = function(ranges) {\n if (Array.isArray(ranges)) {\n var folds = [];\n ranges.forEach(function(range) {\n folds = folds.concat(this.getFoldsInRange(range));\n }, this);\n } else {\n var folds = this.getFoldsInRange(ranges);\n }\n return folds;\n };\n this.getAllFolds = function() {\n var folds = [];\n var foldLines = this.$foldData;\n \n for (var i = 0; i < foldLines.length; i++)\n for (var j = 0; j < foldLines[i].folds.length; j++)\n folds.push(foldLines[i].folds[j]);\n\n return folds;\n };\n this.getFoldStringAt = function(row, column, trim, foldLine) {\n foldLine = foldLine || this.getFoldLine(row);\n if (!foldLine)\n return null;\n\n var lastFold = {\n end: { column: 0 }\n };\n var str, fold;\n for (var i = 0; i < foldLine.folds.length; i++) {\n fold = foldLine.folds[i];\n var cmp = fold.range.compareEnd(row, column);\n if (cmp == -1) {\n str = this\n .getLine(fold.start.row)\n .substring(lastFold.end.column, fold.start.column);\n break;\n }\n else if (cmp === 0) {\n return null;\n }\n lastFold = fold;\n }\n if (!str)\n str = this.getLine(fold.start.row).substring(lastFold.end.column);\n\n if (trim == -1)\n return str.substring(0, column - lastFold.end.column);\n else if (trim == 1)\n return str.substring(column - lastFold.end.column);\n else\n return str;\n };\n\n this.getFoldLine = function(docRow, startFoldLine) {\n var foldData = this.$foldData;\n var i = 0;\n if (startFoldLine)\n i = foldData.indexOf(startFoldLine);\n if (i == -1)\n i = 0;\n for (i; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\n return foldLine;\n } else if (foldLine.end.row > docRow) {\n return null;\n }\n }\n return null;\n };\n this.getNextFoldLine = function(docRow, startFoldLine) {\n var foldData = this.$foldData;\n var i = 0;\n if (startFoldLine)\n i = foldData.indexOf(startFoldLine);\n if (i == -1)\n i = 0;\n for (i; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (foldLine.end.row >= docRow) {\n return foldLine;\n }\n }\n return null;\n };\n\n this.getFoldedRowCount = function(first, last) {\n var foldData = this.$foldData, rowCount = last-first+1;\n for (var i = 0; i < foldData.length; i++) {\n var foldLine = foldData[i],\n end = foldLine.end.row,\n start = foldLine.start.row;\n if (end >= last) {\n if (start < last) {\n if (start >= first)\n rowCount -= last-start;\n else\n rowCount = 0; // in one fold\n }\n break;\n } else if (end >= first){\n if (start >= first) // fold inside range\n rowCount -= end-start;\n else\n rowCount -= end-first+1;\n }\n }\n return rowCount;\n };\n\n this.$addFoldLine = function(foldLine) {\n this.$foldData.push(foldLine);\n this.$foldData.sort(function(a, b) {\n return a.start.row - b.start.row;\n });\n return foldLine;\n };\n this.addFold = function(placeholder, range) {\n var foldData = this.$foldData;\n var added = false;\n var fold;\n \n if (placeholder instanceof Fold)\n fold = placeholder;\n else {\n fold = new Fold(range, placeholder);\n fold.collapseChildren = range.collapseChildren;\n }\n this.$clipRangeToDocument(fold.range);\n\n var startRow = fold.start.row;\n var startColumn = fold.start.column;\n var endRow = fold.end.row;\n var endColumn = fold.end.column;\n\n var startFold = this.getFoldAt(startRow, startColumn, 1);\n var endFold = this.getFoldAt(endRow, endColumn, -1);\n if (startFold && endFold == startFold)\n return startFold.addSubFold(fold);\n\n if (startFold && !startFold.range.isStart(startRow, startColumn))\n this.removeFold(startFold);\n \n if (endFold && !endFold.range.isEnd(endRow, endColumn))\n this.removeFold(endFold);\n var folds = this.getFoldsInRange(fold.range);\n if (folds.length > 0) {\n this.removeFolds(folds);\n if (!fold.collapseChildren) {\n folds.forEach(function(subFold) {\n fold.addSubFold(subFold);\n });\n }\n }\n\n for (var i = 0; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (endRow == foldLine.start.row) {\n foldLine.addFold(fold);\n added = true;\n break;\n } else if (startRow == foldLine.end.row) {\n foldLine.addFold(fold);\n added = true;\n if (!fold.sameRow) {\n var foldLineNext = foldData[i + 1];\n if (foldLineNext && foldLineNext.start.row == endRow) {\n foldLine.merge(foldLineNext);\n break;\n }\n }\n break;\n } else if (endRow <= foldLine.start.row) {\n break;\n }\n }\n\n if (!added)\n foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\n\n if (this.$useWrapMode)\n this.$updateWrapData(foldLine.start.row, foldLine.start.row);\n else\n this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\n this.$modified = true;\n this._signal(\"changeFold\", { data: fold, action: \"add\" });\n\n return fold;\n };\n\n this.addFolds = function(folds) {\n folds.forEach(function(fold) {\n this.addFold(fold);\n }, this);\n };\n\n this.removeFold = function(fold) {\n var foldLine = fold.foldLine;\n var startRow = foldLine.start.row;\n var endRow = foldLine.end.row;\n\n var foldLines = this.$foldData;\n var folds = foldLine.folds;\n if (folds.length == 1) {\n foldLines.splice(foldLines.indexOf(foldLine), 1);\n } else\n if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {\n folds.pop();\n foldLine.end.row = folds[folds.length - 1].end.row;\n foldLine.end.column = folds[folds.length - 1].end.column;\n } else\n if (foldLine.range.isStart(fold.start.row, fold.start.column)) {\n folds.shift();\n foldLine.start.row = folds[0].start.row;\n foldLine.start.column = folds[0].start.column;\n } else\n if (fold.sameRow) {\n folds.splice(folds.indexOf(fold), 1);\n } else\n {\n var newFoldLine = foldLine.split(fold.start.row, fold.start.column);\n folds = newFoldLine.folds;\n folds.shift();\n newFoldLine.start.row = folds[0].start.row;\n newFoldLine.start.column = folds[0].start.column;\n }\n\n if (!this.$updating) {\n if (this.$useWrapMode)\n this.$updateWrapData(startRow, endRow);\n else\n this.$updateRowLengthCache(startRow, endRow);\n }\n this.$modified = true;\n this._signal(\"changeFold\", { data: fold, action: \"remove\" });\n };\n\n this.removeFolds = function(folds) {\n var cloneFolds = [];\n for (var i = 0; i < folds.length; i++) {\n cloneFolds.push(folds[i]);\n }\n\n cloneFolds.forEach(function(fold) {\n this.removeFold(fold);\n }, this);\n this.$modified = true;\n };\n\n this.expandFold = function(fold) {\n this.removeFold(fold);\n fold.subFolds.forEach(function(subFold) {\n fold.restoreRange(subFold);\n this.addFold(subFold);\n }, this);\n if (fold.collapseChildren > 0) {\n this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1);\n }\n fold.subFolds = [];\n };\n\n this.expandFolds = function(folds) {\n folds.forEach(function(fold) {\n this.expandFold(fold);\n }, this);\n };\n\n this.unfold = function(location, expandInner) {\n var range, folds;\n if (location == null) {\n range = new Range(0, 0, this.getLength(), 0);\n if (expandInner == null) expandInner = true;\n } else if (typeof location == \"number\")\n range = new Range(location, 0, location, this.getLine(location).length);\n else if (\"row\" in location)\n range = Range.fromPoints(location, location);\n else\n range = location;\n \n folds = this.getFoldsInRangeList(range);\n if (expandInner != false) {\n this.removeFolds(folds);\n } else {\n this.expandFolds(folds);\n }\n if (folds.length)\n return folds;\n };\n this.isRowFolded = function(docRow, startFoldRow) {\n return !!this.getFoldLine(docRow, startFoldRow);\n };\n\n this.getRowFoldEnd = function(docRow, startFoldRow) {\n var foldLine = this.getFoldLine(docRow, startFoldRow);\n return foldLine ? foldLine.end.row : docRow;\n };\n\n this.getRowFoldStart = function(docRow, startFoldRow) {\n var foldLine = this.getFoldLine(docRow, startFoldRow);\n return foldLine ? foldLine.start.row : docRow;\n };\n\n this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\n if (startRow == null)\n startRow = foldLine.start.row;\n if (startColumn == null)\n startColumn = 0;\n if (endRow == null)\n endRow = foldLine.end.row;\n if (endColumn == null)\n endColumn = this.getLine(endRow).length;\n var doc = this.doc;\n var textLine = \"\";\n\n foldLine.walk(function(placeholder, row, column, lastColumn) {\n if (row < startRow)\n return;\n if (row == startRow) {\n if (column < startColumn)\n return;\n lastColumn = Math.max(startColumn, lastColumn);\n }\n\n if (placeholder != null) {\n textLine += placeholder;\n } else {\n textLine += doc.getLine(row).substring(lastColumn, column);\n }\n }, endRow, endColumn);\n return textLine;\n };\n\n this.getDisplayLine = function(row, endColumn, startRow, startColumn) {\n var foldLine = this.getFoldLine(row);\n\n if (!foldLine) {\n var line;\n line = this.doc.getLine(row);\n return line.substring(startColumn || 0, endColumn || line.length);\n } else {\n return this.getFoldDisplayLine(\n foldLine, row, endColumn, startRow, startColumn);\n }\n };\n\n this.$cloneFoldData = function() {\n var fd = [];\n fd = this.$foldData.map(function(foldLine) {\n var folds = foldLine.folds.map(function(fold) {\n return fold.clone();\n });\n return new FoldLine(fd, folds);\n });\n\n return fd;\n };\n\n this.toggleFold = function(tryToUnfold) {\n var selection = this.selection;\n var range = selection.getRange();\n var fold;\n var bracketPos;\n\n if (range.isEmpty()) {\n var cursor = range.start;\n fold = this.getFoldAt(cursor.row, cursor.column);\n\n if (fold) {\n this.expandFold(fold);\n return;\n } else if (bracketPos = this.findMatchingBracket(cursor)) {\n if (range.comparePoint(bracketPos) == 1) {\n range.end = bracketPos;\n } else {\n range.start = bracketPos;\n range.start.column++;\n range.end.column--;\n }\n } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {\n if (range.comparePoint(bracketPos) == 1)\n range.end = bracketPos;\n else\n range.start = bracketPos;\n\n range.start.column++;\n } else {\n range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\n }\n } else {\n var folds = this.getFoldsInRange(range);\n if (tryToUnfold && folds.length) {\n this.expandFolds(folds);\n return;\n } else if (folds.length == 1 ) {\n fold = folds[0];\n }\n }\n\n if (!fold)\n fold = this.getFoldAt(range.start.row, range.start.column);\n\n if (fold && fold.range.toString() == range.toString()) {\n this.expandFold(fold);\n return;\n }\n\n var placeholder = \"...\";\n if (!range.isMultiLine()) {\n placeholder = this.getTextRange(range);\n if (placeholder.length < 4)\n return;\n placeholder = placeholder.trim().substring(0, 2) + \"..\";\n }\n\n this.addFold(placeholder, range);\n };\n\n this.getCommentFoldRange = function(row, column, dir) {\n var iterator = new TokenIterator(this, row, column);\n var token = iterator.getCurrentToken();\n var type = token && token.type;\n if (token && /^comment|string/.test(type)) {\n type = type.match(/comment|string/)[0];\n if (type == \"comment\")\n type += \"|doc-start\";\n var re = new RegExp(type);\n var range = new Range();\n if (dir != 1) {\n do {\n token = iterator.stepBackward();\n } while (token && re.test(token.type));\n iterator.stepForward();\n }\n \n range.start.row = iterator.getCurrentTokenRow();\n range.start.column = iterator.getCurrentTokenColumn() + 2;\n\n iterator = new TokenIterator(this, row, column);\n \n if (dir != -1) {\n var lastRow = -1;\n do {\n token = iterator.stepForward();\n if (lastRow == -1) {\n var state = this.getState(iterator.$row);\n if (!re.test(state))\n lastRow = iterator.$row;\n } else if (iterator.$row > lastRow) {\n break;\n }\n } while (token && re.test(token.type));\n token = iterator.stepBackward();\n } else\n token = iterator.getCurrentToken();\n\n range.end.row = iterator.getCurrentTokenRow();\n range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2;\n return range;\n }\n };\n\n this.foldAll = function(startRow, endRow, depth, test) {\n if (depth == undefined)\n depth = 100000; // JSON.stringify doesn't hanle Infinity\n var foldWidgets = this.foldWidgets;\n if (!foldWidgets)\n return; // mode doesn't support folding\n endRow = endRow || this.getLength();\n startRow = startRow || 0;\n for (var row = startRow; row < endRow; row++) {\n if (foldWidgets[row] == null)\n foldWidgets[row] = this.getFoldWidget(row);\n if (foldWidgets[row] != \"start\")\n continue;\n \n if (test && !test(row)) continue;\n\n var range = this.getFoldWidgetRange(row);\n if (range && range.isMultiLine()\n && range.end.row <= endRow\n && range.start.row >= startRow\n ) {\n row = range.end.row;\n range.collapseChildren = depth;\n this.addFold(\"...\", range);\n }\n }\n };\n \n this.foldToLevel = function(level) {\n this.foldAll();\n while (level-- > 0)\n this.unfold(null, false);\n };\n \n this.foldAllComments = function() {\n var session = this;\n this.foldAll(null, null, null, function(row) {\n var tokens = session.getTokens(row);\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (token.type == \"text\" && /^\\s+$/.test(token.value))\n continue;\n if (/comment/.test(token.type))\n return true;\n return false;\n }\n });\n };\n this.$foldStyles = {\n \"manual\": 1,\n \"markbegin\": 1,\n \"markbeginend\": 1\n };\n this.$foldStyle = \"markbegin\";\n this.setFoldStyle = function(style) {\n if (!this.$foldStyles[style])\n throw new Error(\"invalid fold style: \" + style + \"[\" + Object.keys(this.$foldStyles).join(\", \") + \"]\");\n \n if (this.$foldStyle == style)\n return;\n\n this.$foldStyle = style;\n \n if (style == \"manual\")\n this.unfold();\n var mode = this.$foldMode;\n this.$setFolding(null);\n this.$setFolding(mode);\n };\n\n this.$setFolding = function(foldMode) {\n if (this.$foldMode == foldMode)\n return;\n \n this.$foldMode = foldMode;\n \n this.off('change', this.$updateFoldWidgets);\n this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n this._signal(\"changeAnnotation\");\n \n if (!foldMode || this.$foldStyle == \"manual\") {\n this.foldWidgets = null;\n return;\n }\n \n this.foldWidgets = [];\n this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);\n this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);\n \n this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);\n this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this);\n this.on('change', this.$updateFoldWidgets);\n this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n };\n\n this.getParentFoldRangeData = function (row, ignoreCurrent) {\n var fw = this.foldWidgets;\n if (!fw || (ignoreCurrent && fw[row]))\n return {};\n\n var i = row - 1, firstRange;\n while (i >= 0) {\n var c = fw[i];\n if (c == null)\n c = fw[i] = this.getFoldWidget(i);\n\n if (c == \"start\") {\n var range = this.getFoldWidgetRange(i);\n if (!firstRange)\n firstRange = range;\n if (range && range.end.row >= row)\n break;\n }\n i--;\n }\n\n return {\n range: i !== -1 && range,\n firstRange: firstRange\n };\n };\n\n this.onFoldWidgetClick = function(row, e) {\n e = e.domEvent;\n var options = {\n children: e.shiftKey,\n all: e.ctrlKey || e.metaKey,\n siblings: e.altKey\n };\n \n var range = this.$toggleFoldWidget(row, options);\n if (!range) {\n var el = (e.target || e.srcElement);\n if (el && /ace_fold-widget/.test(el.className))\n el.className += \" ace_invalid\";\n }\n };\n \n this.$toggleFoldWidget = function(row, options) {\n if (!this.getFoldWidget)\n return;\n var type = this.getFoldWidget(row);\n var line = this.getLine(row);\n\n var dir = type === \"end\" ? -1 : 1;\n var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir);\n\n if (fold) {\n if (options.children || options.all)\n this.removeFold(fold);\n else\n this.expandFold(fold);\n return fold;\n }\n\n var range = this.getFoldWidgetRange(row, true);\n if (range && !range.isMultiLine()) {\n fold = this.getFoldAt(range.start.row, range.start.column, 1);\n if (fold && range.isEqual(fold.range)) {\n this.removeFold(fold);\n return fold;\n }\n }\n \n if (options.siblings) {\n var data = this.getParentFoldRangeData(row);\n if (data.range) {\n var startRow = data.range.start.row + 1;\n var endRow = data.range.end.row;\n }\n this.foldAll(startRow, endRow, options.all ? 10000 : 0);\n } else if (options.children) {\n endRow = range ? range.end.row : this.getLength();\n this.foldAll(row + 1, endRow, options.all ? 10000 : 0);\n } else if (range) {\n if (options.all) \n range.collapseChildren = 10000;\n this.addFold(\"...\", range);\n }\n \n return range;\n };\n \n \n \n this.toggleFoldWidget = function(toggleParent) {\n var row = this.selection.getCursor().row;\n row = this.getRowFoldStart(row);\n var range = this.$toggleFoldWidget(row, {});\n \n if (range)\n return;\n var data = this.getParentFoldRangeData(row, true);\n range = data.range || data.firstRange;\n \n if (range) {\n row = range.start.row;\n var fold = this.getFoldAt(row, this.getLine(row).length, 1);\n\n if (fold) {\n this.removeFold(fold);\n } else {\n this.addFold(\"...\", range);\n }\n }\n };\n\n this.updateFoldWidgets = function(delta) {\n var firstRow = delta.start.row;\n var len = delta.end.row - firstRow;\n\n if (len === 0) {\n this.foldWidgets[firstRow] = null;\n } else if (delta.action == 'remove') {\n this.foldWidgets.splice(firstRow, len + 1, null);\n } else {\n var args = Array(len + 1);\n args.unshift(firstRow, 1);\n this.foldWidgets.splice.apply(this.foldWidgets, args);\n }\n };\n this.tokenizerUpdateFoldWidgets = function(e) {\n var rows = e.data;\n if (rows.first != rows.last) {\n if (this.foldWidgets.length > rows.first)\n this.foldWidgets.splice(rows.first, this.foldWidgets.length);\n }\n };\n}\n\nexports.Folding = Folding;\n\n});\n\nace.define(\"ace/edit_session/bracket_match\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\nvar Range = require(\"../range\").Range;\n\n\nfunction BracketMatch() {\n\n this.findMatchingBracket = function(position, chr) {\n if (position.column == 0) return null;\n\n var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);\n if (charBeforeCursor == \"\") return null;\n\n var match = charBeforeCursor.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match)\n return null;\n\n if (match[1])\n return this.$findClosingBracket(match[1], position);\n else\n return this.$findOpeningBracket(match[2], position);\n };\n \n this.getBracketRange = function(pos) {\n var line = this.getLine(pos.row);\n var before = true, range;\n\n var chr = line.charAt(pos.column - 1);\n var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match) {\n chr = line.charAt(pos.column);\n pos = {row: pos.row, column: pos.column + 1};\n match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n before = false;\n }\n if (!match)\n return null;\n\n if (match[1]) {\n var bracketPos = this.$findClosingBracket(match[1], pos);\n if (!bracketPos)\n return null;\n range = Range.fromPoints(pos, bracketPos);\n if (!before) {\n range.end.column++;\n range.start.column--;\n }\n range.cursor = range.end;\n } else {\n var bracketPos = this.$findOpeningBracket(match[2], pos);\n if (!bracketPos)\n return null;\n range = Range.fromPoints(bracketPos, pos);\n if (!before) {\n range.start.column++;\n range.end.column--;\n }\n range.cursor = range.start;\n }\n \n return range;\n };\n this.getMatchingBracketRanges = function(pos) {\n var line = this.getLine(pos.row);\n\n var chr = line.charAt(pos.column - 1);\n var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match) {\n chr = line.charAt(pos.column);\n pos = {row: pos.row, column: pos.column + 1};\n match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n }\n\n if (!match)\n return null;\n\n var startRange = new Range(pos.row, pos.column - 1, pos.row, pos.column);\n var bracketPos = match[1] ? this.$findClosingBracket(match[1], pos)\n : this.$findOpeningBracket(match[2], pos);\n if (!bracketPos)\n return [startRange];\n var endRange = new Range(bracketPos.row, bracketPos.column, bracketPos.row, bracketPos.column + 1);\n\n return [startRange, endRange];\n };\n\n this.$brackets = {\n \")\": \"(\",\n \"(\": \")\",\n \"]\": \"[\",\n \"[\": \"]\",\n \"{\": \"}\",\n \"}\": \"{\",\n \"<\": \">\",\n \">\": \"<\"\n };\n\n this.$findOpeningBracket = function(bracket, position, typeRe) {\n var openBracket = this.$brackets[bracket];\n var depth = 1;\n\n var iterator = new TokenIterator(this, position.row, position.column);\n var token = iterator.getCurrentToken();\n if (!token)\n token = iterator.stepForward();\n if (!token)\n return;\n \n if (!typeRe){\n typeRe = new RegExp(\n \"(\\\\.?\" +\n token.type.replace(\".\", \"\\\\.\").replace(\"rparen\", \".paren\")\n .replace(/\\b(?:end)\\b/, \"(?:start|begin|end)\")\n + \")+\"\n );\n }\n var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;\n var value = token.value;\n \n while (true) {\n \n while (valueIndex >= 0) {\n var chr = value.charAt(valueIndex);\n if (chr == openBracket) {\n depth -= 1;\n if (depth == 0) {\n return {row: iterator.getCurrentTokenRow(),\n column: valueIndex + iterator.getCurrentTokenColumn()};\n }\n }\n else if (chr == bracket) {\n depth += 1;\n }\n valueIndex -= 1;\n }\n do {\n token = iterator.stepBackward();\n } while (token && !typeRe.test(token.type));\n\n if (token == null)\n break;\n \n value = token.value;\n valueIndex = value.length - 1;\n }\n \n return null;\n };\n\n this.$findClosingBracket = function(bracket, position, typeRe) {\n var closingBracket = this.$brackets[bracket];\n var depth = 1;\n\n var iterator = new TokenIterator(this, position.row, position.column);\n var token = iterator.getCurrentToken();\n if (!token)\n token = iterator.stepForward();\n if (!token)\n return;\n\n if (!typeRe){\n typeRe = new RegExp(\n \"(\\\\.?\" +\n token.type.replace(\".\", \"\\\\.\").replace(\"lparen\", \".paren\")\n .replace(/\\b(?:start|begin)\\b/, \"(?:start|begin|end)\")\n + \")+\"\n );\n }\n var valueIndex = position.column - iterator.getCurrentTokenColumn();\n\n while (true) {\n\n var value = token.value;\n var valueLength = value.length;\n while (valueIndex < valueLength) {\n var chr = value.charAt(valueIndex);\n if (chr == closingBracket) {\n depth -= 1;\n if (depth == 0) {\n return {row: iterator.getCurrentTokenRow(),\n column: valueIndex + iterator.getCurrentTokenColumn()};\n }\n }\n else if (chr == bracket) {\n depth += 1;\n }\n valueIndex += 1;\n }\n do {\n token = iterator.stepForward();\n } while (token && !typeRe.test(token.type));\n\n if (token == null)\n break;\n\n valueIndex = 0;\n }\n \n return null;\n };\n}\nexports.BracketMatch = BracketMatch;\n\n});\n\nace.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) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar BidiHandler = require(\"./bidihandler\").BidiHandler;\nvar config = require(\"./config\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Selection = require(\"./selection\").Selection;\nvar TextMode = require(\"./mode/text\").Mode;\nvar Range = require(\"./range\").Range;\nvar Document = require(\"./document\").Document;\nvar BackgroundTokenizer = require(\"./background_tokenizer\").BackgroundTokenizer;\nvar SearchHighlight = require(\"./search_highlight\").SearchHighlight;\n\nvar EditSession = function(text, mode) {\n this.$breakpoints = [];\n this.$decorations = [];\n this.$frontMarkers = {};\n this.$backMarkers = {};\n this.$markerId = 1;\n this.$undoSelect = true;\n\n this.$foldData = [];\n this.id = \"session\" + (++EditSession.$uid);\n this.$foldData.toString = function() {\n return this.join(\"\\n\");\n };\n this.on(\"changeFold\", this.onChangeFold.bind(this));\n this.$onChange = this.onChange.bind(this);\n\n if (typeof text != \"object\" || !text.getLine)\n text = new Document(text);\n\n this.setDocument(text);\n this.selection = new Selection(this);\n this.$bidiHandler = new BidiHandler(this);\n\n config.resetOptions(this);\n this.setMode(mode);\n config._signal(\"session\", this);\n};\n\n\nEditSession.$uid = 0;\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setDocument = function(doc) {\n if (this.doc)\n this.doc.removeListener(\"change\", this.$onChange);\n\n this.doc = doc;\n doc.on(\"change\", this.$onChange);\n\n if (this.bgTokenizer)\n this.bgTokenizer.setDocument(this.getDocument());\n\n this.resetCaches();\n };\n this.getDocument = function() {\n return this.doc;\n };\n this.$resetRowCache = function(docRow) {\n if (!docRow) {\n this.$docRowCache = [];\n this.$screenRowCache = [];\n return;\n }\n var l = this.$docRowCache.length;\n var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\n if (l > i) {\n this.$docRowCache.splice(i, l);\n this.$screenRowCache.splice(i, l);\n }\n };\n\n this.$getRowCacheIndex = function(cacheArray, val) {\n var low = 0;\n var hi = cacheArray.length - 1;\n\n while (low <= hi) {\n var mid = (low + hi) >> 1;\n var c = cacheArray[mid];\n\n if (val > c)\n low = mid + 1;\n else if (val < c)\n hi = mid - 1;\n else\n return mid;\n }\n\n return low -1;\n };\n\n this.resetCaches = function() {\n this.$modified = true;\n this.$wrapData = [];\n this.$rowLengthCache = [];\n this.$resetRowCache(0);\n if (this.bgTokenizer)\n this.bgTokenizer.start(0);\n };\n\n this.onChangeFold = function(e) {\n var fold = e.data;\n this.$resetRowCache(fold.start.row);\n };\n\n this.onChange = function(delta) {\n this.$modified = true;\n this.$bidiHandler.onChange(delta);\n this.$resetRowCache(delta.start.row);\n\n var removedFolds = this.$updateInternalDataOnChange(delta);\n if (!this.$fromUndo && this.$undoManager) {\n if (removedFolds && removedFolds.length) {\n this.$undoManager.add({\n action: \"removeFolds\",\n folds: removedFolds\n }, this.mergeUndoDeltas);\n this.mergeUndoDeltas = true;\n }\n this.$undoManager.add(delta, this.mergeUndoDeltas);\n this.mergeUndoDeltas = true;\n \n this.$informUndoManager.schedule();\n }\n\n this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);\n this._signal(\"change\", delta);\n };\n this.setValue = function(text) {\n this.doc.setValue(text);\n this.selection.moveTo(0, 0);\n\n this.$resetRowCache(0);\n this.setUndoManager(this.$undoManager);\n this.getUndoManager().reset();\n };\n this.getValue =\n this.toString = function() {\n return this.doc.getValue();\n };\n this.getSelection = function() {\n return this.selection;\n };\n this.getState = function(row) {\n return this.bgTokenizer.getState(row);\n };\n this.getTokens = function(row) {\n return this.bgTokenizer.getTokens(row);\n };\n this.getTokenAt = function(row, column) {\n var tokens = this.bgTokenizer.getTokens(row);\n var token, c = 0;\n if (column == null) {\n var i = tokens.length - 1;\n c = this.getLine(row).length;\n } else {\n for (var i = 0; i < tokens.length; i++) {\n c += tokens[i].value.length;\n if (c >= column)\n break;\n }\n }\n token = tokens[i];\n if (!token)\n return null;\n token.index = i;\n token.start = c - token.value.length;\n return token;\n };\n this.setUndoManager = function(undoManager) {\n this.$undoManager = undoManager;\n \n if (this.$informUndoManager)\n this.$informUndoManager.cancel();\n \n if (undoManager) {\n var self = this;\n undoManager.addSession(this);\n this.$syncInformUndoManager = function() {\n self.$informUndoManager.cancel();\n self.mergeUndoDeltas = false;\n };\n this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n } else {\n this.$syncInformUndoManager = function() {};\n }\n };\n this.markUndoGroup = function() {\n if (this.$syncInformUndoManager)\n this.$syncInformUndoManager();\n };\n \n this.$defaultUndoManager = {\n undo: function() {},\n redo: function() {},\n hasUndo: function() {},\n hasRedo: function() {},\n reset: function() {},\n add: function() {},\n addSelection: function() {},\n startNewGroup: function() {},\n addSession: function() {}\n };\n this.getUndoManager = function() {\n return this.$undoManager || this.$defaultUndoManager;\n };\n this.getTabString = function() {\n if (this.getUseSoftTabs()) {\n return lang.stringRepeat(\" \", this.getTabSize());\n } else {\n return \"\\t\";\n }\n };\n this.setUseSoftTabs = function(val) {\n this.setOption(\"useSoftTabs\", val);\n };\n this.getUseSoftTabs = function() {\n return this.$useSoftTabs && !this.$mode.$indentWithTabs;\n };\n this.setTabSize = function(tabSize) {\n this.setOption(\"tabSize\", tabSize);\n };\n this.getTabSize = function() {\n return this.$tabSize;\n };\n this.isTabStop = function(position) {\n return this.$useSoftTabs && (position.column % this.$tabSize === 0);\n };\n this.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) {\n this.setOption(\"navigateWithinSoftTabs\", navigateWithinSoftTabs);\n };\n this.getNavigateWithinSoftTabs = function() {\n return this.$navigateWithinSoftTabs;\n };\n\n this.$overwrite = false;\n this.setOverwrite = function(overwrite) {\n this.setOption(\"overwrite\", overwrite);\n };\n this.getOverwrite = function() {\n return this.$overwrite;\n };\n this.toggleOverwrite = function() {\n this.setOverwrite(!this.$overwrite);\n };\n this.addGutterDecoration = function(row, className) {\n if (!this.$decorations[row])\n this.$decorations[row] = \"\";\n this.$decorations[row] += \" \" + className;\n this._signal(\"changeBreakpoint\", {});\n };\n this.removeGutterDecoration = function(row, className) {\n this.$decorations[row] = (this.$decorations[row] || \"\").replace(\" \" + className, \"\");\n this._signal(\"changeBreakpoint\", {});\n };\n this.getBreakpoints = function() {\n return this.$breakpoints;\n };\n this.setBreakpoints = function(rows) {\n this.$breakpoints = [];\n for (var i=0; i 0)\n inToken = !!line.charAt(column - 1).match(this.tokenRe);\n\n if (!inToken)\n inToken = !!line.charAt(column).match(this.tokenRe);\n\n if (inToken)\n var re = this.tokenRe;\n else if (/^\\s+$/.test(line.slice(column-1, column+1)))\n var re = /\\s/;\n else\n var re = this.nonTokenRe;\n\n var start = column;\n if (start > 0) {\n do {\n start--;\n }\n while (start >= 0 && line.charAt(start).match(re));\n start++;\n }\n\n var end = column;\n while (end < line.length && line.charAt(end).match(re)) {\n end++;\n }\n\n return new Range(row, start, row, end);\n };\n this.getAWordRange = function(row, column) {\n var wordRange = this.getWordRange(row, column);\n var line = this.getLine(wordRange.end.row);\n\n while (line.charAt(wordRange.end.column).match(/[ \\t]/)) {\n wordRange.end.column += 1;\n }\n return wordRange;\n };\n this.setNewLineMode = function(newLineMode) {\n this.doc.setNewLineMode(newLineMode);\n };\n this.getNewLineMode = function() {\n return this.doc.getNewLineMode();\n };\n this.setUseWorker = function(useWorker) { this.setOption(\"useWorker\", useWorker); };\n this.getUseWorker = function() { return this.$useWorker; };\n this.onReloadTokenizer = function(e) {\n var rows = e.data;\n this.bgTokenizer.start(rows.first);\n this._signal(\"tokenizerUpdate\", e);\n };\n\n this.$modes = config.$modes;\n this.$mode = null;\n this.$modeId = null;\n this.setMode = function(mode, cb) {\n if (mode && typeof mode === \"object\") {\n if (mode.getTokenizer)\n return this.$onChangeMode(mode);\n var options = mode;\n var path = options.path;\n } else {\n path = mode || \"ace/mode/text\";\n }\n if (!this.$modes[\"ace/mode/text\"])\n this.$modes[\"ace/mode/text\"] = new TextMode();\n\n if (this.$modes[path] && !options) {\n this.$onChangeMode(this.$modes[path]);\n cb && cb();\n return;\n }\n this.$modeId = path;\n config.loadModule([\"mode\", path], function(m) {\n if (this.$modeId !== path)\n return cb && cb();\n if (this.$modes[path] && !options) {\n this.$onChangeMode(this.$modes[path]);\n } else if (m && m.Mode) {\n m = new m.Mode(options);\n if (!options) {\n this.$modes[path] = m;\n m.$id = path;\n }\n this.$onChangeMode(m);\n }\n cb && cb();\n }.bind(this));\n if (!this.$mode)\n this.$onChangeMode(this.$modes[\"ace/mode/text\"], true);\n };\n\n this.$onChangeMode = function(mode, $isPlaceholder) {\n if (!$isPlaceholder)\n this.$modeId = mode.$id;\n if (this.$mode === mode) \n return;\n \n var oldMode = this.$mode;\n this.$mode = mode;\n\n this.$stopWorker();\n\n if (this.$useWorker)\n this.$startWorker();\n\n var tokenizer = mode.getTokenizer();\n\n if(tokenizer.on !== undefined) {\n var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n tokenizer.on(\"update\", onReloadTokenizer);\n }\n\n if (!this.bgTokenizer) {\n this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n var _self = this;\n this.bgTokenizer.on(\"update\", function(e) {\n _self._signal(\"tokenizerUpdate\", e);\n });\n } else {\n this.bgTokenizer.setTokenizer(tokenizer);\n }\n\n this.bgTokenizer.setDocument(this.getDocument());\n\n this.tokenRe = mode.tokenRe;\n this.nonTokenRe = mode.nonTokenRe;\n\n \n if (!$isPlaceholder) {\n if (mode.attachToSession)\n mode.attachToSession(this);\n this.$options.wrapMethod.set.call(this, this.$wrapMethod);\n this.$setFolding(mode.foldingRules);\n this.bgTokenizer.start(0);\n this._emit(\"changeMode\", {oldMode: oldMode, mode: mode});\n }\n };\n\n this.$stopWorker = function() {\n if (this.$worker) {\n this.$worker.terminate();\n this.$worker = null;\n }\n };\n\n this.$startWorker = function() {\n try {\n this.$worker = this.$mode.createWorker(this);\n } catch (e) {\n config.warn(\"Could not load worker\", e);\n this.$worker = null;\n }\n };\n this.getMode = function() {\n return this.$mode;\n };\n\n this.$scrollTop = 0;\n this.setScrollTop = function(scrollTop) {\n if (this.$scrollTop === scrollTop || isNaN(scrollTop))\n return;\n\n this.$scrollTop = scrollTop;\n this._signal(\"changeScrollTop\", scrollTop);\n };\n this.getScrollTop = function() {\n return this.$scrollTop;\n };\n\n this.$scrollLeft = 0;\n this.setScrollLeft = function(scrollLeft) {\n if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))\n return;\n\n this.$scrollLeft = scrollLeft;\n this._signal(\"changeScrollLeft\", scrollLeft);\n };\n this.getScrollLeft = function() {\n return this.$scrollLeft;\n };\n this.getScreenWidth = function() {\n this.$computeWidth();\n if (this.lineWidgets) \n return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);\n return this.screenWidth;\n };\n \n this.getLineWidgetMaxWidth = function() {\n if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;\n var width = 0;\n this.lineWidgets.forEach(function(w) {\n if (w && w.screenWidth > width)\n width = w.screenWidth;\n });\n return this.lineWidgetWidth = width;\n };\n\n this.$computeWidth = function(force) {\n if (this.$modified || force) {\n this.$modified = false;\n\n if (this.$useWrapMode)\n return this.screenWidth = this.$wrapLimit;\n\n var lines = this.doc.getAllLines();\n var cache = this.$rowLengthCache;\n var longestScreenLine = 0;\n var foldIndex = 0;\n var foldLine = this.$foldData[foldIndex];\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n var len = lines.length;\n\n for (var i = 0; i < len; i++) {\n if (i > foldStart) {\n i = foldLine.end.row + 1;\n if (i >= len)\n break;\n foldLine = this.$foldData[foldIndex++];\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n\n if (cache[i] == null)\n cache[i] = this.$getStringScreenWidth(lines[i])[0];\n\n if (cache[i] > longestScreenLine)\n longestScreenLine = cache[i];\n }\n this.screenWidth = longestScreenLine;\n }\n };\n this.getLine = function(row) {\n return this.doc.getLine(row);\n };\n this.getLines = function(firstRow, lastRow) {\n return this.doc.getLines(firstRow, lastRow);\n };\n this.getLength = function() {\n return this.doc.getLength();\n };\n this.getTextRange = function(range) {\n return this.doc.getTextRange(range || this.selection.getRange());\n };\n this.insert = function(position, text) {\n return this.doc.insert(position, text);\n };\n this.remove = function(range) {\n return this.doc.remove(range);\n };\n this.removeFullLines = function(firstRow, lastRow){\n return this.doc.removeFullLines(firstRow, lastRow);\n };\n this.undoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n for (var i = deltas.length - 1; i != -1; i--) {\n var delta = deltas[i];\n if (delta.action == \"insert\" || delta.action == \"remove\") {\n this.doc.revertDelta(delta);\n } else if (delta.folds) {\n this.addFolds(delta.folds);\n }\n }\n if (!dontSelect && this.$undoSelect) {\n if (deltas.selectionBefore)\n this.selection.fromJSON(deltas.selectionBefore);\n else\n this.selection.setRange(this.$getUndoSelection(deltas, true));\n }\n this.$fromUndo = false;\n };\n this.redoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n for (var i = 0; i < deltas.length; i++) {\n var delta = deltas[i];\n if (delta.action == \"insert\" || delta.action == \"remove\") {\n this.doc.$safeApplyDelta(delta);\n }\n }\n\n if (!dontSelect && this.$undoSelect) {\n if (deltas.selectionAfter)\n this.selection.fromJSON(deltas.selectionAfter);\n else\n this.selection.setRange(this.$getUndoSelection(deltas, false));\n }\n this.$fromUndo = false;\n };\n this.setUndoSelect = function(enable) {\n this.$undoSelect = enable;\n };\n\n this.$getUndoSelection = function(deltas, isUndo) {\n function isInsert(delta) {\n return isUndo ? delta.action !== \"insert\" : delta.action === \"insert\";\n }\n\n var range, point;\n\n for (var i = 0; i < deltas.length; i++) {\n var delta = deltas[i];\n if (!delta.start) continue; // skip folds\n if (!range) {\n if (isInsert(delta)) {\n range = Range.fromPoints(delta.start, delta.end);\n } else {\n range = Range.fromPoints(delta.start, delta.start);\n }\n continue;\n }\n \n if (isInsert(delta)) {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range.setStart(point);\n }\n point = delta.end;\n if (range.compare(point.row, point.column) == 1) {\n range.setEnd(point);\n }\n } else {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range = Range.fromPoints(delta.start, delta.start);\n }\n }\n }\n return range;\n };\n this.replace = function(range, text) {\n return this.doc.replace(range, text);\n };\n this.moveText = function(fromRange, toPosition, copy) {\n var text = this.getTextRange(fromRange);\n var folds = this.getFoldsInRange(fromRange);\n\n var toRange = Range.fromPoints(toPosition, toPosition);\n if (!copy) {\n this.remove(fromRange);\n var rowDiff = fromRange.start.row - fromRange.end.row;\n var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;\n if (collDiff) {\n if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)\n toRange.start.column += collDiff;\n if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)\n toRange.end.column += collDiff;\n }\n if (rowDiff && toRange.start.row >= fromRange.end.row) {\n toRange.start.row += rowDiff;\n toRange.end.row += rowDiff;\n }\n }\n\n toRange.end = this.insert(toRange.start, text);\n if (folds.length) {\n var oldStart = fromRange.start;\n var newStart = toRange.start;\n var rowDiff = newStart.row - oldStart.row;\n var collDiff = newStart.column - oldStart.column;\n this.addFolds(folds.map(function(x) {\n x = x.clone();\n if (x.start.row == oldStart.row)\n x.start.column += collDiff;\n if (x.end.row == oldStart.row)\n x.end.column += collDiff;\n x.start.row += rowDiff;\n x.end.row += rowDiff;\n return x;\n }));\n }\n\n return toRange;\n };\n this.indentRows = function(startRow, endRow, indentString) {\n indentString = indentString.replace(/\\t/g, this.getTabString());\n for (var row=startRow; row<=endRow; row++)\n this.doc.insertInLine({row: row, column: 0}, indentString);\n };\n this.outdentRows = function (range) {\n var rowRange = range.collapseRows();\n var deleteRange = new Range(0, 0, 0, 0);\n var size = this.getTabSize();\n\n for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {\n var line = this.getLine(i);\n\n deleteRange.start.row = i;\n deleteRange.end.row = i;\n for (var j = 0; j < size; ++j)\n if (line.charAt(j) != ' ')\n break;\n if (j < size && line.charAt(j) == '\\t') {\n deleteRange.start.column = j;\n deleteRange.end.column = j + 1;\n } else {\n deleteRange.start.column = 0;\n deleteRange.end.column = j;\n }\n this.remove(deleteRange);\n }\n };\n\n this.$moveLines = function(firstRow, lastRow, dir) {\n firstRow = this.getRowFoldStart(firstRow);\n lastRow = this.getRowFoldEnd(lastRow);\n if (dir < 0) {\n var row = this.getRowFoldStart(firstRow + dir);\n if (row < 0) return 0;\n var diff = row-firstRow;\n } else if (dir > 0) {\n var row = this.getRowFoldEnd(lastRow + dir);\n if (row > this.doc.getLength()-1) return 0;\n var diff = row-lastRow;\n } else {\n firstRow = this.$clipRowToDocument(firstRow);\n lastRow = this.$clipRowToDocument(lastRow);\n var diff = lastRow - firstRow + 1;\n }\n\n var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE);\n var folds = this.getFoldsInRange(range).map(function(x){\n x = x.clone();\n x.start.row += diff;\n x.end.row += diff;\n return x;\n });\n \n var lines = dir == 0\n ? this.doc.getLines(firstRow, lastRow)\n : this.doc.removeFullLines(firstRow, lastRow);\n this.doc.insertFullLines(firstRow+diff, lines);\n folds.length && this.addFolds(folds);\n return diff;\n };\n this.moveLinesUp = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, -1);\n };\n this.moveLinesDown = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, 1);\n };\n this.duplicateLines = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, 0);\n };\n\n\n this.$clipRowToDocument = function(row) {\n return Math.max(0, Math.min(row, this.doc.getLength()-1));\n };\n\n this.$clipColumnToRow = function(row, column) {\n if (column < 0)\n return 0;\n return Math.min(this.doc.getLine(row).length, column);\n };\n\n\n this.$clipPositionToDocument = function(row, column) {\n column = Math.max(0, column);\n\n if (row < 0) {\n row = 0;\n column = 0;\n } else {\n var len = this.doc.getLength();\n if (row >= len) {\n row = len - 1;\n column = this.doc.getLine(len-1).length;\n } else {\n column = Math.min(this.doc.getLine(row).length, column);\n }\n }\n\n return {\n row: row,\n column: column\n };\n };\n\n this.$clipRangeToDocument = function(range) {\n if (range.start.row < 0) {\n range.start.row = 0;\n range.start.column = 0;\n } else {\n range.start.column = this.$clipColumnToRow(\n range.start.row,\n range.start.column\n );\n }\n\n var len = this.doc.getLength() - 1;\n if (range.end.row > len) {\n range.end.row = len;\n range.end.column = this.doc.getLine(len).length;\n } else {\n range.end.column = this.$clipColumnToRow(\n range.end.row,\n range.end.column\n );\n }\n return range;\n };\n this.$wrapLimit = 80;\n this.$useWrapMode = false;\n this.$wrapLimitRange = {\n min : null,\n max : null\n };\n this.setUseWrapMode = function(useWrapMode) {\n if (useWrapMode != this.$useWrapMode) {\n this.$useWrapMode = useWrapMode;\n this.$modified = true;\n this.$resetRowCache(0);\n if (useWrapMode) {\n var len = this.getLength();\n this.$wrapData = Array(len);\n this.$updateWrapData(0, len - 1);\n }\n\n this._signal(\"changeWrapMode\");\n }\n };\n this.getUseWrapMode = function() {\n return this.$useWrapMode;\n };\n this.setWrapLimitRange = function(min, max) {\n if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {\n this.$wrapLimitRange = { min: min, max: max };\n this.$modified = true;\n this.$bidiHandler.markAsDirty();\n if (this.$useWrapMode)\n this._signal(\"changeWrapMode\");\n }\n };\n this.adjustWrapLimit = function(desiredLimit, $printMargin) {\n var limits = this.$wrapLimitRange;\n if (limits.max < 0)\n limits = {min: $printMargin, max: $printMargin};\n var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max);\n if (wrapLimit != this.$wrapLimit && wrapLimit > 1) {\n this.$wrapLimit = wrapLimit;\n this.$modified = true;\n if (this.$useWrapMode) {\n this.$updateWrapData(0, this.getLength() - 1);\n this.$resetRowCache(0);\n this._signal(\"changeWrapLimit\");\n }\n return true;\n }\n return false;\n };\n\n this.$constrainWrapLimit = function(wrapLimit, min, max) {\n if (min)\n wrapLimit = Math.max(min, wrapLimit);\n\n if (max)\n wrapLimit = Math.min(max, wrapLimit);\n\n return wrapLimit;\n };\n this.getWrapLimit = function() {\n return this.$wrapLimit;\n };\n this.setWrapLimit = function (limit) {\n this.setWrapLimitRange(limit, limit);\n };\n this.getWrapLimitRange = function() {\n return {\n min : this.$wrapLimitRange.min,\n max : this.$wrapLimitRange.max\n };\n };\n\n this.$updateInternalDataOnChange = function(delta) {\n var useWrapMode = this.$useWrapMode;\n var action = delta.action;\n var start = delta.start;\n var end = delta.end;\n var firstRow = start.row;\n var lastRow = end.row;\n var len = lastRow - firstRow;\n var removedFolds = null;\n \n this.$updating = true;\n if (len != 0) {\n if (action === \"remove\") {\n this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(firstRow, len);\n\n var foldLines = this.$foldData;\n removedFolds = this.getFoldsInRange(delta);\n this.removeFolds(removedFolds);\n\n var foldLine = this.getFoldLine(end.row);\n var idx = 0;\n if (foldLine) {\n foldLine.addRemoveChars(end.row, end.column, start.column - end.column);\n foldLine.shiftRow(-len);\n\n var foldLineBefore = this.getFoldLine(firstRow);\n if (foldLineBefore && foldLineBefore !== foldLine) {\n foldLineBefore.merge(foldLine);\n foldLine = foldLineBefore;\n }\n idx = foldLines.indexOf(foldLine) + 1;\n }\n\n for (idx; idx < foldLines.length; idx++) {\n var foldLine = foldLines[idx];\n if (foldLine.start.row >= end.row) {\n foldLine.shiftRow(-len);\n }\n }\n\n lastRow = firstRow;\n } else {\n var args = Array(len);\n args.unshift(firstRow, 0);\n var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache;\n arr.splice.apply(arr, args);\n var foldLines = this.$foldData;\n var foldLine = this.getFoldLine(firstRow);\n var idx = 0;\n if (foldLine) {\n var cmp = foldLine.range.compareInside(start.row, start.column);\n if (cmp == 0) {\n foldLine = foldLine.split(start.row, start.column);\n if (foldLine) {\n foldLine.shiftRow(len);\n foldLine.addRemoveChars(lastRow, 0, end.column - start.column);\n }\n } else\n if (cmp == -1) {\n foldLine.addRemoveChars(firstRow, 0, end.column - start.column);\n foldLine.shiftRow(len);\n }\n idx = foldLines.indexOf(foldLine) + 1;\n }\n\n for (idx; idx < foldLines.length; idx++) {\n var foldLine = foldLines[idx];\n if (foldLine.start.row >= firstRow) {\n foldLine.shiftRow(len);\n }\n }\n }\n } else {\n len = Math.abs(delta.start.column - delta.end.column);\n if (action === \"remove\") {\n removedFolds = this.getFoldsInRange(delta);\n this.removeFolds(removedFolds);\n\n len = -len;\n }\n var foldLine = this.getFoldLine(firstRow);\n if (foldLine) {\n foldLine.addRemoveChars(firstRow, start.column, len);\n }\n }\n\n if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {\n console.error(\"doc.getLength() and $wrapData.length have to be the same!\");\n }\n this.$updating = false;\n\n if (useWrapMode)\n this.$updateWrapData(firstRow, lastRow);\n else\n this.$updateRowLengthCache(firstRow, lastRow);\n\n return removedFolds;\n };\n\n this.$updateRowLengthCache = function(firstRow, lastRow, b) {\n this.$rowLengthCache[firstRow] = null;\n this.$rowLengthCache[lastRow] = null;\n };\n\n this.$updateWrapData = function(firstRow, lastRow) {\n var lines = this.doc.getAllLines();\n var tabSize = this.getTabSize();\n var wrapData = this.$wrapData;\n var wrapLimit = this.$wrapLimit;\n var tokens;\n var foldLine;\n\n var row = firstRow;\n lastRow = Math.min(lastRow, lines.length - 1);\n while (row <= lastRow) {\n foldLine = this.getFoldLine(row, foldLine);\n if (!foldLine) {\n tokens = this.$getDisplayTokens(lines[row]);\n wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n row ++;\n } else {\n tokens = [];\n foldLine.walk(function(placeholder, row, column, lastColumn) {\n var walkTokens;\n if (placeholder != null) {\n walkTokens = this.$getDisplayTokens(\n placeholder, tokens.length);\n walkTokens[0] = PLACEHOLDER_START;\n for (var i = 1; i < walkTokens.length; i++) {\n walkTokens[i] = PLACEHOLDER_BODY;\n }\n } else {\n walkTokens = this.$getDisplayTokens(\n lines[row].substring(lastColumn, column),\n tokens.length);\n }\n tokens = tokens.concat(walkTokens);\n }.bind(this),\n foldLine.end.row,\n lines[foldLine.end.row].length + 1\n );\n\n wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n row = foldLine.end.row + 1;\n }\n }\n };\n var CHAR = 1,\n CHAR_EXT = 2,\n PLACEHOLDER_START = 3,\n PLACEHOLDER_BODY = 4,\n PUNCTUATION = 9,\n SPACE = 10,\n TAB = 11,\n TAB_SPACE = 12;\n\n\n this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) {\n if (tokens.length == 0) {\n return [];\n }\n\n var splits = [];\n var displayLength = tokens.length;\n var lastSplit = 0, lastDocSplit = 0;\n\n var isCode = this.$wrapAsCode;\n\n var indentedSoftWrap = this.$indentedSoftWrap;\n var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8)\n || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2);\n\n function getWrapIndent() {\n var indentation = 0;\n if (maxIndent === 0)\n return indentation;\n if (indentedSoftWrap) {\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (token == SPACE)\n indentation += 1;\n else if (token == TAB)\n indentation += tabSize;\n else if (token == TAB_SPACE)\n continue;\n else\n break;\n }\n }\n if (isCode && indentedSoftWrap !== false)\n indentation += tabSize;\n return Math.min(indentation, maxIndent);\n }\n function addSplit(screenPos) {\n var len = screenPos - lastSplit;\n for (var i = lastSplit; i < screenPos; i++) {\n var ch = tokens[i];\n if (ch === 12 || ch === 2) len -= 1;\n }\n\n if (!splits.length) {\n indent = getWrapIndent();\n splits.indent = indent;\n }\n lastDocSplit += len;\n splits.push(lastDocSplit);\n lastSplit = screenPos;\n }\n var indent = 0;\n while (displayLength - lastSplit > wrapLimit - indent) {\n var split = lastSplit + wrapLimit - indent;\n if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {\n addSplit(split);\n continue;\n }\n if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) {\n for (split; split != lastSplit - 1; split--) {\n if (tokens[split] == PLACEHOLDER_START) {\n break;\n }\n }\n if (split > lastSplit) {\n addSplit(split);\n continue;\n }\n split = lastSplit + wrapLimit;\n for (split; split < tokens.length; split++) {\n if (tokens[split] != PLACEHOLDER_BODY) {\n break;\n }\n }\n if (split == tokens.length) {\n break; // Breaks the while-loop.\n }\n addSplit(split);\n continue;\n }\n var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1);\n while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n split --;\n }\n if (isCode) {\n while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n split --;\n }\n while (split > minSplit && tokens[split] == PUNCTUATION) {\n split --;\n }\n } else {\n while (split > minSplit && tokens[split] < SPACE) {\n split --;\n }\n }\n if (split > minSplit) {\n addSplit(++split);\n continue;\n }\n split = lastSplit + wrapLimit;\n if (tokens[split] == CHAR_EXT)\n split--;\n addSplit(split - indent);\n }\n return splits;\n };\n this.$getDisplayTokens = function(str, offset) {\n var arr = [];\n var tabSize;\n offset = offset || 0;\n\n for (var i = 0; i < str.length; i++) {\n var c = str.charCodeAt(i);\n if (c == 9) {\n tabSize = this.getScreenTabSize(arr.length + offset);\n arr.push(TAB);\n for (var n = 1; n < tabSize; n++) {\n arr.push(TAB_SPACE);\n }\n }\n else if (c == 32) {\n arr.push(SPACE);\n } else if((c > 39 && c < 48) || (c > 57 && c < 64)) {\n arr.push(PUNCTUATION);\n }\n else if (c >= 0x1100 && isFullWidth(c)) {\n arr.push(CHAR, CHAR_EXT);\n } else {\n arr.push(CHAR);\n }\n }\n return arr;\n };\n this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n if (maxScreenColumn == 0)\n return [0, 0];\n if (maxScreenColumn == null)\n maxScreenColumn = Infinity;\n screenColumn = screenColumn || 0;\n\n var c, column;\n for (column = 0; column < str.length; column++) {\n c = str.charCodeAt(column);\n if (c == 9) {\n screenColumn += this.getScreenTabSize(screenColumn);\n }\n else if (c >= 0x1100 && isFullWidth(c)) {\n screenColumn += 2;\n } else {\n screenColumn += 1;\n }\n if (screenColumn > maxScreenColumn) {\n break;\n }\n }\n\n return [screenColumn, column];\n };\n\n this.lineWidgets = null;\n this.getRowLength = function(row) {\n var h = 1;\n if (this.lineWidgets)\n h += this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n \n if (!this.$useWrapMode || !this.$wrapData[row])\n return h;\n else\n return this.$wrapData[row].length + h;\n };\n this.getRowLineCount = function(row) {\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1;\n } else {\n return this.$wrapData[row].length + 1;\n }\n };\n\n this.getRowWrapIndent = function(screenRow) {\n if (this.$useWrapMode) {\n var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n var splits = this.$wrapData[pos.row];\n return splits.length && splits[0] < pos.column ? splits.indent : 0;\n } else {\n return 0;\n }\n };\n this.getScreenLastRowColumn = function(screenRow) {\n var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n return this.documentToScreenColumn(pos.row, pos.column);\n };\n this.getDocumentLastRowColumn = function(docRow, docColumn) {\n var screenRow = this.documentToScreenRow(docRow, docColumn);\n return this.getScreenLastRowColumn(screenRow);\n };\n this.getDocumentLastRowColumnPosition = function(docRow, docColumn) {\n var screenRow = this.documentToScreenRow(docRow, docColumn);\n return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);\n };\n this.getRowSplitData = function(row) {\n if (!this.$useWrapMode) {\n return undefined;\n } else {\n return this.$wrapData[row];\n }\n };\n this.getScreenTabSize = function(screenColumn) {\n return this.$tabSize - (screenColumn % this.$tabSize | 0);\n };\n\n\n this.screenToDocumentRow = function(screenRow, screenColumn) {\n return this.screenToDocumentPosition(screenRow, screenColumn).row;\n };\n\n\n this.screenToDocumentColumn = function(screenRow, screenColumn) {\n return this.screenToDocumentPosition(screenRow, screenColumn).column;\n };\n this.screenToDocumentPosition = function(screenRow, screenColumn, offsetX) {\n if (screenRow < 0)\n return {row: 0, column: 0};\n\n var line;\n var docRow = 0;\n var docColumn = 0;\n var column;\n var row = 0;\n var rowLength = 0;\n\n var rowCache = this.$screenRowCache;\n var i = this.$getRowCacheIndex(rowCache, screenRow);\n var l = rowCache.length;\n if (l && i >= 0) {\n var row = rowCache[i];\n var docRow = this.$docRowCache[i];\n var doCache = screenRow > rowCache[l - 1];\n } else {\n var doCache = !l;\n }\n\n var maxRow = this.getLength() - 1;\n var foldLine = this.getNextFoldLine(docRow);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (row <= screenRow) {\n rowLength = this.getRowLength(docRow);\n if (row + rowLength > screenRow || docRow >= maxRow) {\n break;\n } else {\n row += rowLength;\n docRow++;\n if (docRow > foldStart) {\n docRow = foldLine.end.row+1;\n foldLine = this.getNextFoldLine(docRow, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n }\n\n if (doCache) {\n this.$docRowCache.push(docRow);\n this.$screenRowCache.push(row);\n }\n }\n\n if (foldLine && foldLine.start.row <= docRow) {\n line = this.getFoldDisplayLine(foldLine);\n docRow = foldLine.start.row;\n } else if (row + rowLength <= screenRow || docRow > maxRow) {\n return {\n row: maxRow,\n column: this.getLine(maxRow).length\n };\n } else {\n line = this.getLine(docRow);\n foldLine = null;\n }\n var wrapIndent = 0, splitIndex = Math.floor(screenRow - row);\n if (this.$useWrapMode) {\n var splits = this.$wrapData[docRow];\n if (splits) {\n column = splits[splitIndex];\n if(splitIndex > 0 && splits.length) {\n wrapIndent = splits.indent;\n docColumn = splits[splitIndex - 1] || splits[splits.length - 1];\n line = line.substring(docColumn);\n }\n }\n }\n\n if (offsetX !== undefined && this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex))\n screenColumn = this.$bidiHandler.offsetToCol(offsetX);\n\n docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1];\n if (this.$useWrapMode && docColumn >= column)\n docColumn = column - 1;\n\n if (foldLine)\n return foldLine.idxToPosition(docColumn);\n\n return {row: docRow, column: docColumn};\n };\n this.documentToScreenPosition = function(docRow, docColumn) {\n if (typeof docColumn === \"undefined\")\n var pos = this.$clipPositionToDocument(docRow.row, docRow.column);\n else\n pos = this.$clipPositionToDocument(docRow, docColumn);\n\n docRow = pos.row;\n docColumn = pos.column;\n\n var screenRow = 0;\n var foldStartRow = null;\n var fold = null;\n fold = this.getFoldAt(docRow, docColumn, 1);\n if (fold) {\n docRow = fold.start.row;\n docColumn = fold.start.column;\n }\n\n var rowEnd, row = 0;\n\n\n var rowCache = this.$docRowCache;\n var i = this.$getRowCacheIndex(rowCache, docRow);\n var l = rowCache.length;\n if (l && i >= 0) {\n var row = rowCache[i];\n var screenRow = this.$screenRowCache[i];\n var doCache = docRow > rowCache[l - 1];\n } else {\n var doCache = !l;\n }\n\n var foldLine = this.getNextFoldLine(row);\n var foldStart = foldLine ?foldLine.start.row :Infinity;\n\n while (row < docRow) {\n if (row >= foldStart) {\n rowEnd = foldLine.end.row + 1;\n if (rowEnd > docRow)\n break;\n foldLine = this.getNextFoldLine(rowEnd, foldLine);\n foldStart = foldLine ?foldLine.start.row :Infinity;\n }\n else {\n rowEnd = row + 1;\n }\n\n screenRow += this.getRowLength(row);\n row = rowEnd;\n\n if (doCache) {\n this.$docRowCache.push(row);\n this.$screenRowCache.push(screenRow);\n }\n }\n var textLine = \"\";\n if (foldLine && row >= foldStart) {\n textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);\n foldStartRow = foldLine.start.row;\n } else {\n textLine = this.getLine(docRow).substring(0, docColumn);\n foldStartRow = docRow;\n }\n var wrapIndent = 0;\n if (this.$useWrapMode) {\n var wrapRow = this.$wrapData[foldStartRow];\n if (wrapRow) {\n var screenRowOffset = 0;\n while (textLine.length >= wrapRow[screenRowOffset]) {\n screenRow ++;\n screenRowOffset++;\n }\n textLine = textLine.substring(\n wrapRow[screenRowOffset - 1] || 0, textLine.length\n );\n wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0;\n }\n }\n \n if (this.lineWidgets && this.lineWidgets[row] && this.lineWidgets[row].rowsAbove)\n screenRow += this.lineWidgets[row].rowsAbove;\n\n return {\n row: screenRow,\n column: wrapIndent + this.$getStringScreenWidth(textLine)[0]\n };\n };\n this.documentToScreenColumn = function(row, docColumn) {\n return this.documentToScreenPosition(row, docColumn).column;\n };\n this.documentToScreenRow = function(docRow, docColumn) {\n return this.documentToScreenPosition(docRow, docColumn).row;\n };\n this.getScreenLength = function() {\n var screenRows = 0;\n var fold = null;\n if (!this.$useWrapMode) {\n screenRows = this.getLength();\n var foldData = this.$foldData;\n for (var i = 0; i < foldData.length; i++) {\n fold = foldData[i];\n screenRows -= fold.end.row - fold.start.row;\n }\n } else {\n var lastRow = this.$wrapData.length;\n var row = 0, i = 0;\n var fold = this.$foldData[i++];\n var foldStart = fold ? fold.start.row :Infinity;\n\n while (row < lastRow) {\n var splits = this.$wrapData[row];\n screenRows += splits ? splits.length + 1 : 1;\n row ++;\n if (row > foldStart) {\n row = fold.end.row+1;\n fold = this.$foldData[i++];\n foldStart = fold ?fold.start.row :Infinity;\n }\n }\n }\n if (this.lineWidgets)\n screenRows += this.$getWidgetScreenLength();\n\n return screenRows;\n };\n this.$setFontMetrics = function(fm) {\n if (!this.$enableVarChar) return;\n this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n if (maxScreenColumn === 0)\n return [0, 0];\n if (!maxScreenColumn)\n maxScreenColumn = Infinity;\n screenColumn = screenColumn || 0;\n \n var c, column;\n for (column = 0; column < str.length; column++) {\n c = str.charAt(column);\n if (c === \"\\t\") {\n screenColumn += this.getScreenTabSize(screenColumn);\n } else {\n screenColumn += fm.getCharacterWidth(c);\n }\n if (screenColumn > maxScreenColumn) {\n break;\n }\n }\n \n return [screenColumn, column];\n };\n };\n \n this.destroy = function() {\n if (this.bgTokenizer) {\n this.bgTokenizer.setDocument(null);\n this.bgTokenizer = null;\n }\n this.$stopWorker();\n this.removeAllListeners();\n this.selection.detach();\n };\n\n this.isFullWidth = isFullWidth;\n function isFullWidth(c) {\n if (c < 0x1100)\n return false;\n return c >= 0x1100 && c <= 0x115F ||\n c >= 0x11A3 && c <= 0x11A7 ||\n c >= 0x11FA && c <= 0x11FF ||\n c >= 0x2329 && c <= 0x232A ||\n c >= 0x2E80 && c <= 0x2E99 ||\n c >= 0x2E9B && c <= 0x2EF3 ||\n c >= 0x2F00 && c <= 0x2FD5 ||\n c >= 0x2FF0 && c <= 0x2FFB ||\n c >= 0x3000 && c <= 0x303E ||\n c >= 0x3041 && c <= 0x3096 ||\n c >= 0x3099 && c <= 0x30FF ||\n c >= 0x3105 && c <= 0x312D ||\n c >= 0x3131 && c <= 0x318E ||\n c >= 0x3190 && c <= 0x31BA ||\n c >= 0x31C0 && c <= 0x31E3 ||\n c >= 0x31F0 && c <= 0x321E ||\n c >= 0x3220 && c <= 0x3247 ||\n c >= 0x3250 && c <= 0x32FE ||\n c >= 0x3300 && c <= 0x4DBF ||\n c >= 0x4E00 && c <= 0xA48C ||\n c >= 0xA490 && c <= 0xA4C6 ||\n c >= 0xA960 && c <= 0xA97C ||\n c >= 0xAC00 && c <= 0xD7A3 ||\n c >= 0xD7B0 && c <= 0xD7C6 ||\n c >= 0xD7CB && c <= 0xD7FB ||\n c >= 0xF900 && c <= 0xFAFF ||\n c >= 0xFE10 && c <= 0xFE19 ||\n c >= 0xFE30 && c <= 0xFE52 ||\n c >= 0xFE54 && c <= 0xFE66 ||\n c >= 0xFE68 && c <= 0xFE6B ||\n c >= 0xFF01 && c <= 0xFF60 ||\n c >= 0xFFE0 && c <= 0xFFE6;\n }\n\n}).call(EditSession.prototype);\n\nrequire(\"./edit_session/folding\").Folding.call(EditSession.prototype);\nrequire(\"./edit_session/bracket_match\").BracketMatch.call(EditSession.prototype);\n\n\nconfig.defineOptions(EditSession.prototype, \"session\", {\n wrap: {\n set: function(value) {\n if (!value || value == \"off\")\n value = false;\n else if (value == \"free\")\n value = true;\n else if (value == \"printMargin\")\n value = -1;\n else if (typeof value == \"string\")\n value = parseInt(value, 10) || false;\n\n if (this.$wrap == value)\n return;\n this.$wrap = value;\n if (!value) {\n this.setUseWrapMode(false);\n } else {\n var col = typeof value == \"number\" ? value : null;\n this.setWrapLimitRange(col, col);\n this.setUseWrapMode(true);\n }\n },\n get: function() {\n if (this.getUseWrapMode()) {\n if (this.$wrap == -1)\n return \"printMargin\";\n if (!this.getWrapLimitRange().min)\n return \"free\";\n return this.$wrap;\n }\n return \"off\";\n },\n handlesSet: true\n }, \n wrapMethod: {\n set: function(val) {\n val = val == \"auto\"\n ? this.$mode.type != \"text\"\n : val != \"text\";\n if (val != this.$wrapAsCode) {\n this.$wrapAsCode = val;\n if (this.$useWrapMode) {\n this.$useWrapMode = false;\n this.setUseWrapMode(true);\n }\n }\n },\n initialValue: \"auto\"\n },\n indentedSoftWrap: {\n set: function() {\n if (this.$useWrapMode) {\n this.$useWrapMode = false;\n this.setUseWrapMode(true);\n }\n },\n initialValue: true \n },\n firstLineNumber: {\n set: function() {this._signal(\"changeBreakpoint\");},\n initialValue: 1\n },\n useWorker: {\n set: function(useWorker) {\n this.$useWorker = useWorker;\n\n this.$stopWorker();\n if (useWorker)\n this.$startWorker();\n },\n initialValue: true\n },\n useSoftTabs: {initialValue: true},\n tabSize: {\n set: function(tabSize) {\n tabSize = parseInt(tabSize);\n if (tabSize > 0 && this.$tabSize !== tabSize) {\n this.$modified = true;\n this.$rowLengthCache = [];\n this.$tabSize = tabSize;\n this._signal(\"changeTabSize\");\n }\n },\n initialValue: 4,\n handlesSet: true\n },\n navigateWithinSoftTabs: {initialValue: false},\n foldStyle: {\n set: function(val) {this.setFoldStyle(val);},\n handlesSet: true\n },\n overwrite: {\n set: function(val) {this._signal(\"changeOverwrite\");},\n initialValue: false\n },\n newLineMode: {\n set: function(val) {this.doc.setNewLineMode(val);},\n get: function() {return this.doc.getNewLineMode();},\n handlesSet: true\n },\n mode: {\n set: function(val) { this.setMode(val); },\n get: function() { return this.$modeId; },\n handlesSet: true\n }\n});\n\nexports.EditSession = EditSession;\n});\n\nace.define(\"ace/search\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\n\nvar Search = function() {\n this.$options = {};\n};\n\n(function() {\n this.set = function(options) {\n oop.mixin(this.$options, options);\n return this;\n };\n this.getOptions = function() {\n return lang.copyObject(this.$options);\n };\n this.setOptions = function(options) {\n this.$options = options;\n };\n this.find = function(session) {\n var options = this.$options;\n var iterator = this.$matchIterator(session, options);\n if (!iterator)\n return false;\n\n var firstRange = null;\n iterator.forEach(function(sr, sc, er, ec) {\n firstRange = new Range(sr, sc, er, ec);\n if (sc == ec && options.start && options.start.start\n && options.skipCurrent != false && firstRange.isEqual(options.start)\n ) {\n firstRange = null;\n return false;\n }\n \n return true;\n });\n\n return firstRange;\n };\n this.findAll = function(session) {\n var options = this.$options;\n if (!options.needle)\n return [];\n this.$assembleRegExp(options);\n\n var range = options.range;\n var lines = range\n ? session.getLines(range.start.row, range.end.row)\n : session.doc.getAllLines();\n\n var ranges = [];\n var re = options.re;\n if (options.$isMultiLine) {\n var len = re.length;\n var maxRow = lines.length - len;\n var prevRange;\n outer: for (var row = re.offset || 0; row <= maxRow; row++) {\n for (var j = 0; j < len; j++)\n if (lines[row + j].search(re[j]) == -1)\n continue outer;\n \n var startLine = lines[row];\n var line = lines[row + len - 1];\n var startIndex = startLine.length - startLine.match(re[0])[0].length;\n var endIndex = line.match(re[len - 1])[0].length;\n \n if (prevRange && prevRange.end.row === row &&\n prevRange.end.column > startIndex\n ) {\n continue;\n }\n ranges.push(prevRange = new Range(\n row, startIndex, row + len - 1, endIndex\n ));\n if (len > 2)\n row = row + len - 2;\n }\n } else {\n for (var i = 0; i < lines.length; i++) {\n var matches = lang.getMatchOffsets(lines[i], re);\n for (var j = 0; j < matches.length; j++) {\n var match = matches[j];\n ranges.push(new Range(i, match.offset, i, match.offset + match.length));\n }\n }\n }\n\n if (range) {\n var startColumn = range.start.column;\n var endColumn = range.start.column;\n var i = 0, j = ranges.length - 1;\n while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row)\n i++;\n\n while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row)\n j--;\n \n ranges = ranges.slice(i, j + 1);\n for (i = 0, j = ranges.length; i < j; i++) {\n ranges[i].start.row += range.start.row;\n ranges[i].end.row += range.start.row;\n }\n }\n\n return ranges;\n };\n this.replace = function(input, replacement) {\n var options = this.$options;\n\n var re = this.$assembleRegExp(options);\n if (options.$isMultiLine)\n return replacement;\n\n if (!re)\n return;\n\n var match = re.exec(input);\n if (!match || match[0].length != input.length)\n return null;\n \n replacement = input.replace(re, replacement);\n if (options.preserveCase) {\n replacement = replacement.split(\"\");\n for (var i = Math.min(input.length, input.length); i--; ) {\n var ch = input[i];\n if (ch && ch.toLowerCase() != ch)\n replacement[i] = replacement[i].toUpperCase();\n else\n replacement[i] = replacement[i].toLowerCase();\n }\n replacement = replacement.join(\"\");\n }\n \n return replacement;\n };\n\n this.$assembleRegExp = function(options, $disableFakeMultiline) {\n if (options.needle instanceof RegExp)\n return options.re = options.needle;\n\n var needle = options.needle;\n\n if (!options.needle)\n return options.re = false;\n\n if (!options.regExp)\n needle = lang.escapeRegExp(needle);\n\n if (options.wholeWord)\n needle = addWordBoundary(needle, options);\n\n var modifier = options.caseSensitive ? \"gm\" : \"gmi\";\n\n options.$isMultiLine = !$disableFakeMultiline && /[\\n\\r]/.test(needle);\n if (options.$isMultiLine)\n return options.re = this.$assembleMultilineRegExp(needle, modifier);\n\n try {\n var re = new RegExp(needle, modifier);\n } catch(e) {\n re = false;\n }\n return options.re = re;\n };\n\n this.$assembleMultilineRegExp = function(needle, modifier) {\n var parts = needle.replace(/\\r\\n|\\r|\\n/g, \"$\\n^\").split(\"\\n\");\n var re = [];\n for (var i = 0; i < parts.length; i++) try {\n re.push(new RegExp(parts[i], modifier));\n } catch(e) {\n return false;\n }\n return re;\n };\n\n this.$matchIterator = function(session, options) {\n var re = this.$assembleRegExp(options);\n if (!re)\n return false;\n var backwards = options.backwards == true;\n var skipCurrent = options.skipCurrent != false;\n\n var range = options.range;\n var start = options.start;\n if (!start)\n start = range ? range[backwards ? \"end\" : \"start\"] : session.selection.getRange();\n \n if (start.start)\n start = start[skipCurrent != backwards ? \"end\" : \"start\"];\n\n var firstRow = range ? range.start.row : 0;\n var lastRow = range ? range.end.row : session.getLength() - 1;\n \n if (backwards) {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row--; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n };\n }\n else {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row = row + 1; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n };\n }\n \n if (options.$isMultiLine) {\n var len = re.length;\n var forEachInLine = function(row, offset, callback) {\n var startRow = backwards ? row - len + 1 : row;\n if (startRow < 0) return;\n var line = session.getLine(startRow);\n var startIndex = line.search(re[0]);\n if (!backwards && startIndex < offset || startIndex === -1) return;\n for (var i = 1; i < len; i++) {\n line = session.getLine(startRow + i);\n if (line.search(re[i]) == -1)\n return;\n }\n var endIndex = line.match(re[len - 1])[0].length;\n if (backwards && endIndex > offset) return;\n if (callback(startRow, startIndex, startRow + len - 1, endIndex))\n return true;\n };\n }\n else if (backwards) {\n var forEachInLine = function(row, endIndex, callback) {\n var line = session.getLine(row);\n var matches = [];\n var m, last = 0;\n re.lastIndex = 0;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (!length) {\n if (last >= line.length) break;\n re.lastIndex = last += 1;\n }\n if (m.index + length > endIndex)\n break;\n matches.push(m.index, length);\n }\n for (var i = matches.length - 1; i >= 0; i -= 2) {\n var column = matches[i - 1];\n var length = matches[i];\n if (callback(row, column, row, column + length))\n return true;\n }\n };\n }\n else {\n var forEachInLine = function(row, startIndex, callback) {\n var line = session.getLine(row);\n var last;\n var m;\n re.lastIndex = startIndex;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (callback(row, last, row,last + length))\n return true;\n if (!length) {\n re.lastIndex = last += 1;\n if (last >= line.length) return false;\n }\n }\n };\n }\n return {forEach: forEach};\n };\n\n}).call(Search.prototype);\n\nfunction addWordBoundary(needle, options) {\n function wordBoundary(c) {\n if (/\\w/.test(c) || options.regExp) return \"\\\\b\";\n return \"\";\n }\n return wordBoundary(needle[0]) + needle\n + wordBoundary(needle[needle.length - 1]);\n}\n\nexports.Search = Search;\n});\n\nace.define(\"ace/keyboard/hash_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar keyUtil = require(\"../lib/keys\");\nvar useragent = require(\"../lib/useragent\");\nvar KEY_MODS = keyUtil.KEY_MODS;\n\nfunction HashHandler(config, platform) {\n this.platform = platform || (useragent.isMac ? \"mac\" : \"win\");\n this.commands = {};\n this.commandKeyBinding = {};\n this.addCommands(config);\n this.$singleCommand = true;\n}\n\nfunction MultiHashHandler(config, platform) {\n HashHandler.call(this, config, platform);\n this.$singleCommand = false;\n}\n\nMultiHashHandler.prototype = HashHandler.prototype;\n\n(function() {\n \n\n this.addCommand = function(command) {\n if (this.commands[command.name])\n this.removeCommand(command);\n\n this.commands[command.name] = command;\n\n if (command.bindKey)\n this._buildKeyHash(command);\n };\n\n this.removeCommand = function(command, keepCommand) {\n var name = command && (typeof command === 'string' ? command : command.name);\n command = this.commands[name];\n if (!keepCommand)\n delete this.commands[name];\n var ckb = this.commandKeyBinding;\n for (var keyId in ckb) {\n var cmdGroup = ckb[keyId];\n if (cmdGroup == command) {\n delete ckb[keyId];\n } else if (Array.isArray(cmdGroup)) {\n var i = cmdGroup.indexOf(command);\n if (i != -1) {\n cmdGroup.splice(i, 1);\n if (cmdGroup.length == 1)\n ckb[keyId] = cmdGroup[0];\n }\n }\n }\n };\n\n this.bindKey = function(key, command, position) {\n if (typeof key == \"object\" && key) {\n if (position == undefined)\n position = key.position;\n key = key[this.platform];\n }\n if (!key)\n return;\n if (typeof command == \"function\")\n return this.addCommand({exec: command, bindKey: key, name: command.name || key});\n \n key.split(\"|\").forEach(function(keyPart) {\n var chain = \"\";\n if (keyPart.indexOf(\" \") != -1) {\n var parts = keyPart.split(/\\s+/);\n keyPart = parts.pop();\n parts.forEach(function(keyPart) {\n var binding = this.parseKeys(keyPart);\n var id = KEY_MODS[binding.hashId] + binding.key;\n chain += (chain ? \" \" : \"\") + id;\n this._addCommandToBinding(chain, \"chainKeys\");\n }, this);\n chain += \" \";\n }\n var binding = this.parseKeys(keyPart);\n var id = KEY_MODS[binding.hashId] + binding.key;\n this._addCommandToBinding(chain + id, command, position);\n }, this);\n };\n \n function getPosition(command) {\n return typeof command == \"object\" && command.bindKey\n && command.bindKey.position \n || (command.isDefault ? -100 : 0);\n }\n this._addCommandToBinding = function(keyId, command, position) {\n var ckb = this.commandKeyBinding, i;\n if (!command) {\n delete ckb[keyId];\n } else if (!ckb[keyId] || this.$singleCommand) {\n ckb[keyId] = command;\n } else {\n if (!Array.isArray(ckb[keyId])) {\n ckb[keyId] = [ckb[keyId]];\n } else if ((i = ckb[keyId].indexOf(command)) != -1) {\n ckb[keyId].splice(i, 1);\n }\n \n if (typeof position != \"number\") {\n position = getPosition(command);\n }\n\n var commands = ckb[keyId];\n for (i = 0; i < commands.length; i++) {\n var other = commands[i];\n var otherPos = getPosition(other);\n if (otherPos > position)\n break;\n }\n commands.splice(i, 0, command);\n }\n };\n\n this.addCommands = function(commands) {\n commands && Object.keys(commands).forEach(function(name) {\n var command = commands[name];\n if (!command)\n return;\n \n if (typeof command === \"string\")\n return this.bindKey(command, name);\n\n if (typeof command === \"function\")\n command = { exec: command };\n\n if (typeof command !== \"object\")\n return;\n\n if (!command.name)\n command.name = name;\n\n this.addCommand(command);\n }, this);\n };\n\n this.removeCommands = function(commands) {\n Object.keys(commands).forEach(function(name) {\n this.removeCommand(commands[name]);\n }, this);\n };\n\n this.bindKeys = function(keyList) {\n Object.keys(keyList).forEach(function(key) {\n this.bindKey(key, keyList[key]);\n }, this);\n };\n\n this._buildKeyHash = function(command) {\n this.bindKey(command.bindKey, command);\n };\n this.parseKeys = function(keys) {\n var parts = keys.toLowerCase().split(/[\\-\\+]([\\-\\+])?/).filter(function(x){return x;});\n var key = parts.pop();\n\n var keyCode = keyUtil[key];\n if (keyUtil.FUNCTION_KEYS[keyCode])\n key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();\n else if (!parts.length)\n return {key: key, hashId: -1};\n else if (parts.length == 1 && parts[0] == \"shift\")\n return {key: key.toUpperCase(), hashId: -1};\n\n var hashId = 0;\n for (var i = parts.length; i--;) {\n var modifier = keyUtil.KEY_MODS[parts[i]];\n if (modifier == null) {\n if (typeof console != \"undefined\")\n console.error(\"invalid modifier \" + parts[i] + \" in \" + keys);\n return false;\n }\n hashId |= modifier;\n }\n return {key: key, hashId: hashId};\n };\n\n this.findKeyCommand = function findKeyCommand(hashId, keyString) {\n var key = KEY_MODS[hashId] + keyString;\n return this.commandKeyBinding[key];\n };\n\n this.handleKeyboard = function(data, hashId, keyString, keyCode) {\n if (keyCode < 0) return;\n var key = KEY_MODS[hashId] + keyString;\n var command = this.commandKeyBinding[key];\n if (data.$keyChain) {\n data.$keyChain += \" \" + key;\n command = this.commandKeyBinding[data.$keyChain] || command;\n }\n \n if (command) {\n if (command == \"chainKeys\" || command[command.length - 1] == \"chainKeys\") {\n data.$keyChain = data.$keyChain || key;\n return {command: \"null\"};\n }\n }\n \n if (data.$keyChain) {\n if ((!hashId || hashId == 4) && keyString.length == 1)\n data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input\n else if (hashId == -1 || keyCode > 0)\n data.$keyChain = \"\"; // reset keyChain\n }\n return {command: command};\n };\n \n this.getStatusText = function(editor, data) {\n return data.$keyChain || \"\";\n };\n\n}).call(HashHandler.prototype);\n\nexports.HashHandler = HashHandler;\nexports.MultiHashHandler = MultiHashHandler;\n});\n\nace.define(\"ace/commands/command_manager\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/keyboard/hash_handler\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar MultiHashHandler = require(\"../keyboard/hash_handler\").MultiHashHandler;\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar CommandManager = function(platform, commands) {\n MultiHashHandler.call(this, commands, platform);\n this.byName = this.commands;\n this.setDefaultHandler(\"exec\", function(e) {\n return e.command.exec(e.editor, e.args || {});\n });\n};\n\noop.inherits(CommandManager, MultiHashHandler);\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.exec = function(command, editor, args) {\n if (Array.isArray(command)) {\n for (var i = command.length; i--; ) {\n if (this.exec(command[i], editor, args)) return true;\n }\n return false;\n }\n\n if (typeof command === \"string\")\n command = this.commands[command];\n\n if (!command)\n return false;\n\n if (editor && editor.$readOnly && !command.readOnly)\n return false;\n\n if (this.$checkCommandState != false && command.isAvailable && !command.isAvailable(editor))\n return false;\n\n var e = {editor: editor, command: command, args: args};\n e.returnValue = this._emit(\"exec\", e);\n this._signal(\"afterExec\", e);\n\n return e.returnValue === false ? false : true;\n };\n\n this.toggleRecording = function(editor) {\n if (this.$inReplay)\n return;\n\n editor && editor._emit(\"changeStatus\");\n if (this.recording) {\n this.macro.pop();\n this.off(\"exec\", this.$addCommandToMacro);\n\n if (!this.macro.length)\n this.macro = this.oldMacro;\n\n return this.recording = false;\n }\n if (!this.$addCommandToMacro) {\n this.$addCommandToMacro = function(e) {\n this.macro.push([e.command, e.args]);\n }.bind(this);\n }\n\n this.oldMacro = this.macro;\n this.macro = [];\n this.on(\"exec\", this.$addCommandToMacro);\n return this.recording = true;\n };\n\n this.replay = function(editor) {\n if (this.$inReplay || !this.macro)\n return;\n\n if (this.recording)\n return this.toggleRecording(editor);\n\n try {\n this.$inReplay = true;\n this.macro.forEach(function(x) {\n if (typeof x == \"string\")\n this.exec(x, editor);\n else\n this.exec(x[0], editor, x[1]);\n }, this);\n } finally {\n this.$inReplay = false;\n }\n };\n\n this.trimMacro = function(m) {\n return m.map(function(x){\n if (typeof x[0] != \"string\")\n x[0] = x[0].name;\n if (!x[1])\n x = x[0];\n return x;\n });\n };\n\n}).call(CommandManager.prototype);\n\nexports.CommandManager = CommandManager;\n\n});\n\nace.define(\"ace/commands/default_commands\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/config\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"../lib/lang\");\nvar config = require(\"../config\");\nvar Range = require(\"../range\").Range;\n\nfunction bindKey(win, mac) {\n return {win: win, mac: mac};\n}\nexports.commands = [{\n name: \"showSettingsMenu\",\n bindKey: bindKey(\"Ctrl-,\", \"Command-,\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/settings_menu\", function(module) {\n module.init(editor);\n editor.showSettingsMenu();\n });\n },\n readOnly: true\n}, {\n name: \"goToNextError\",\n bindKey: bindKey(\"Alt-E\", \"F4\"),\n exec: function(editor) {\n config.loadModule(\"./ext/error_marker\", function(module) {\n module.showErrorMarker(editor, 1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"goToPreviousError\",\n bindKey: bindKey(\"Alt-Shift-E\", \"Shift-F4\"),\n exec: function(editor) {\n config.loadModule(\"./ext/error_marker\", function(module) {\n module.showErrorMarker(editor, -1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selectall\",\n description: \"Select all\",\n bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n exec: function(editor) { editor.selectAll(); },\n readOnly: true\n}, {\n name: \"centerselection\",\n description: \"Center selection\",\n bindKey: bindKey(null, \"Ctrl-L\"),\n exec: function(editor) { editor.centerSelection(); },\n readOnly: true\n}, {\n name: \"gotoline\",\n description: \"Go to line...\",\n bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n exec: function(editor, line) {\n if (typeof line === \"number\" && !isNaN(line))\n editor.gotoLine(line);\n editor.prompt({ $type: \"gotoLine\" });\n },\n readOnly: true\n}, {\n name: \"fold\",\n bindKey: bindKey(\"Alt-L|Ctrl-F1\", \"Command-Alt-L|Command-F1\"),\n exec: function(editor) { editor.session.toggleFold(false); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"unfold\",\n bindKey: bindKey(\"Alt-Shift-L|Ctrl-Shift-F1\", \"Command-Alt-Shift-L|Command-Shift-F1\"),\n exec: function(editor) { editor.session.toggleFold(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleFoldWidget\",\n bindKey: bindKey(\"F2\", \"F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleParentFoldWidget\",\n bindKey: bindKey(\"Alt-F2\", \"Alt-F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldall\",\n description: \"Fold all\",\n bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n exec: function(editor) { editor.session.foldAll(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldAllComments\",\n description: \"Fold all comments\",\n bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n exec: function(editor) { editor.session.foldAllComments(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldOther\",\n description: \"Fold other\",\n bindKey: bindKey(\"Alt-0\", \"Command-Option-0\"),\n exec: function(editor) { \n editor.session.foldAll();\n editor.session.unfold(editor.selection.getAllRanges());\n },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"unfoldall\",\n description: \"Unfold all\",\n bindKey: bindKey(\"Alt-Shift-0\", \"Command-Option-Shift-0\"),\n exec: function(editor) { editor.session.unfold(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"findnext\",\n description: \"Find next\",\n bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n exec: function(editor) { editor.findNext(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"findprevious\",\n description: \"Find previous\",\n bindKey: bindKey(\"Ctrl-Shift-K\", \"Command-Shift-G\"),\n exec: function(editor) { editor.findPrevious(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"selectOrFindNext\",\n description: \"Select or find next\",\n bindKey: bindKey(\"Alt-K\", \"Ctrl-G\"),\n exec: function(editor) {\n if (editor.selection.isEmpty())\n editor.selection.selectWord();\n else\n editor.findNext(); \n },\n readOnly: true\n}, {\n name: \"selectOrFindPrevious\",\n description: \"Select or find previous\",\n bindKey: bindKey(\"Alt-Shift-K\", \"Ctrl-Shift-G\"),\n exec: function(editor) { \n if (editor.selection.isEmpty())\n editor.selection.selectWord();\n else\n editor.findPrevious();\n },\n readOnly: true\n}, {\n name: \"find\",\n description: \"Find\",\n bindKey: bindKey(\"Ctrl-F\", \"Command-F\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor);});\n },\n readOnly: true\n}, {\n name: \"overwrite\",\n description: \"Overwrite\",\n bindKey: \"Insert\",\n exec: function(editor) { editor.toggleOverwrite(); },\n readOnly: true\n}, {\n name: \"selecttostart\",\n description: \"Select to start\",\n bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-Shift-Home|Command-Shift-Up\"),\n exec: function(editor) { editor.getSelection().selectFileStart(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"gotostart\",\n description: \"Go to start\",\n bindKey: bindKey(\"Ctrl-Home\", \"Command-Home|Command-Up\"),\n exec: function(editor) { editor.navigateFileStart(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"selectup\",\n description: \"Select up\",\n bindKey: bindKey(\"Shift-Up\", \"Shift-Up|Ctrl-Shift-P\"),\n exec: function(editor) { editor.getSelection().selectUp(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golineup\",\n description: \"Go line up\",\n bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n exec: function(editor, args) { editor.navigateUp(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttoend\",\n description: \"Select to end\",\n bindKey: bindKey(\"Ctrl-Shift-End\", \"Command-Shift-End|Command-Shift-Down\"),\n exec: function(editor) { editor.getSelection().selectFileEnd(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"gotoend\",\n description: \"Go to end\",\n bindKey: bindKey(\"Ctrl-End\", \"Command-End|Command-Down\"),\n exec: function(editor) { editor.navigateFileEnd(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"selectdown\",\n description: \"Select down\",\n bindKey: bindKey(\"Shift-Down\", \"Shift-Down|Ctrl-Shift-N\"),\n exec: function(editor) { editor.getSelection().selectDown(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golinedown\",\n description: \"Go line down\",\n bindKey: bindKey(\"Down\", \"Down|Ctrl-N\"),\n exec: function(editor, args) { editor.navigateDown(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectwordleft\",\n description: \"Select word left\",\n bindKey: bindKey(\"Ctrl-Shift-Left\", \"Option-Shift-Left\"),\n exec: function(editor) { editor.getSelection().selectWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotowordleft\",\n description: \"Go to word left\",\n bindKey: bindKey(\"Ctrl-Left\", \"Option-Left\"),\n exec: function(editor) { editor.navigateWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttolinestart\",\n description: \"Select to line start\",\n bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left|Ctrl-Shift-A\"),\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolinestart\",\n description: \"Go to line start\",\n bindKey: bindKey(\"Alt-Left|Home\", \"Command-Left|Home|Ctrl-A\"),\n exec: function(editor) { editor.navigateLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectleft\",\n description: \"Select left\",\n bindKey: bindKey(\"Shift-Left\", \"Shift-Left|Ctrl-Shift-B\"),\n exec: function(editor) { editor.getSelection().selectLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoleft\",\n description: \"Go to left\",\n bindKey: bindKey(\"Left\", \"Left|Ctrl-B\"),\n exec: function(editor, args) { editor.navigateLeft(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectwordright\",\n description: \"Select word right\",\n bindKey: bindKey(\"Ctrl-Shift-Right\", \"Option-Shift-Right\"),\n exec: function(editor) { editor.getSelection().selectWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotowordright\",\n description: \"Go to word right\",\n bindKey: bindKey(\"Ctrl-Right\", \"Option-Right\"),\n exec: function(editor) { editor.navigateWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttolineend\",\n description: \"Select to line end\",\n bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right|Shift-End|Ctrl-Shift-E\"),\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolineend\",\n description: \"Go to line end\",\n bindKey: bindKey(\"Alt-Right|End\", \"Command-Right|End|Ctrl-E\"),\n exec: function(editor) { editor.navigateLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectright\",\n description: \"Select right\",\n bindKey: bindKey(\"Shift-Right\", \"Shift-Right\"),\n exec: function(editor) { editor.getSelection().selectRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoright\",\n description: \"Go to right\",\n bindKey: bindKey(\"Right\", \"Right|Ctrl-F\"),\n exec: function(editor, args) { editor.navigateRight(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectpagedown\",\n description: \"Select page down\",\n bindKey: \"Shift-PageDown\",\n exec: function(editor) { editor.selectPageDown(); },\n readOnly: true\n}, {\n name: \"pagedown\",\n description: \"Page down\",\n bindKey: bindKey(null, \"Option-PageDown\"),\n exec: function(editor) { editor.scrollPageDown(); },\n readOnly: true\n}, {\n name: \"gotopagedown\",\n description: \"Go to page down\",\n bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n exec: function(editor) { editor.gotoPageDown(); },\n readOnly: true\n}, {\n name: \"selectpageup\",\n description: \"Select page up\",\n bindKey: \"Shift-PageUp\",\n exec: function(editor) { editor.selectPageUp(); },\n readOnly: true\n}, {\n name: \"pageup\",\n description: \"Page up\",\n bindKey: bindKey(null, \"Option-PageUp\"),\n exec: function(editor) { editor.scrollPageUp(); },\n readOnly: true\n}, {\n name: \"gotopageup\",\n description: \"Go to page up\",\n bindKey: \"PageUp\",\n exec: function(editor) { editor.gotoPageUp(); },\n readOnly: true\n}, {\n name: \"scrollup\",\n description: \"Scroll up\",\n bindKey: bindKey(\"Ctrl-Up\", null),\n exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\n readOnly: true\n}, {\n name: \"scrolldown\",\n description: \"Scroll down\",\n bindKey: bindKey(\"Ctrl-Down\", null),\n exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\n readOnly: true\n}, {\n name: \"selectlinestart\",\n description: \"Select line start\",\n bindKey: \"Shift-Home\",\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectlineend\",\n description: \"Select line end\",\n bindKey: \"Shift-End\",\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"togglerecording\",\n description: \"Toggle recording\",\n bindKey: bindKey(\"Ctrl-Alt-E\", \"Command-Option-E\"),\n exec: function(editor) { editor.commands.toggleRecording(editor); },\n readOnly: true\n}, {\n name: \"replaymacro\",\n description: \"Replay macro\",\n bindKey: bindKey(\"Ctrl-Shift-E\", \"Command-Shift-E\"),\n exec: function(editor) { editor.commands.replay(editor); },\n readOnly: true\n}, {\n name: \"jumptomatching\",\n description: \"Jump to matching\",\n bindKey: bindKey(\"Ctrl-\\\\|Ctrl-P\", \"Command-\\\\\"),\n exec: function(editor) { editor.jumpToMatching(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selecttomatching\",\n description: \"Select to matching\",\n bindKey: bindKey(\"Ctrl-Shift-\\\\|Ctrl-Shift-P\", \"Command-Shift-\\\\\"),\n exec: function(editor) { editor.jumpToMatching(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"expandToMatching\",\n description: \"Expand to matching\",\n bindKey: bindKey(\"Ctrl-Shift-M\", \"Ctrl-Shift-M\"),\n exec: function(editor) { editor.jumpToMatching(true, true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"passKeysToBrowser\",\n description: \"Pass keys to browser\",\n bindKey: bindKey(null, null),\n exec: function() {},\n passEvent: true,\n readOnly: true\n}, {\n name: \"copy\",\n description: \"Copy\",\n exec: function(editor) {\n },\n readOnly: true\n},\n{\n name: \"cut\",\n description: \"Cut\",\n exec: function(editor) {\n var cutLine = editor.$copyWithEmptySelection && editor.selection.isEmpty();\n var range = cutLine ? editor.selection.getLineRange() : editor.selection.getRange();\n editor._emit(\"cut\", range);\n\n if (!range.isEmpty())\n editor.session.remove(range);\n editor.clearSelection();\n },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"paste\",\n description: \"Paste\",\n exec: function(editor, args) {\n editor.$handlePaste(args);\n },\n scrollIntoView: \"cursor\"\n}, {\n name: \"removeline\",\n description: \"Remove line\",\n bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n exec: function(editor) { editor.removeLines(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"duplicateSelection\",\n description: \"Duplicate selection\",\n bindKey: bindKey(\"Ctrl-Shift-D\", \"Command-Shift-D\"),\n exec: function(editor) { editor.duplicateSelection(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"sortlines\",\n description: \"Sort lines\",\n bindKey: bindKey(\"Ctrl-Alt-S\", \"Command-Alt-S\"),\n exec: function(editor) { editor.sortLines(); },\n scrollIntoView: \"selection\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"togglecomment\",\n description: \"Toggle comment\",\n bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n exec: function(editor) { editor.toggleCommentLines(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"toggleBlockComment\",\n description: \"Toggle block comment\",\n bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n exec: function(editor) { editor.toggleBlockComment(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"modifyNumberUp\",\n description: \"Modify number up\",\n bindKey: bindKey(\"Ctrl-Shift-Up\", \"Alt-Shift-Up\"),\n exec: function(editor) { editor.modifyNumber(1); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"modifyNumberDown\",\n description: \"Modify number down\",\n bindKey: bindKey(\"Ctrl-Shift-Down\", \"Alt-Shift-Down\"),\n exec: function(editor) { editor.modifyNumber(-1); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"replace\",\n description: \"Replace\",\n bindKey: bindKey(\"Ctrl-H\", \"Command-Option-F\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor, true);});\n }\n}, {\n name: \"undo\",\n description: \"Undo\",\n bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n exec: function(editor) { editor.undo(); }\n}, {\n name: \"redo\",\n description: \"Redo\",\n bindKey: bindKey(\"Ctrl-Shift-Z|Ctrl-Y\", \"Command-Shift-Z|Command-Y\"),\n exec: function(editor) { editor.redo(); }\n}, {\n name: \"copylinesup\",\n description: \"Copy lines up\",\n bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n exec: function(editor) { editor.copyLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesup\",\n description: \"Move lines up\",\n bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n exec: function(editor) { editor.moveLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"copylinesdown\",\n description: \"Copy lines down\",\n bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n exec: function(editor) { editor.copyLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesdown\",\n description: \"Move lines down\",\n bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n exec: function(editor) { editor.moveLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"del\",\n description: \"Delete\",\n bindKey: bindKey(\"Delete\", \"Delete|Ctrl-D|Shift-Delete\"),\n exec: function(editor) { editor.remove(\"right\"); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"backspace\",\n description: \"Backspace\",\n bindKey: bindKey(\n \"Shift-Backspace|Backspace\",\n \"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\"\n ),\n exec: function(editor) { editor.remove(\"left\"); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"cut_or_delete\",\n description: \"Cut or delete\",\n bindKey: bindKey(\"Shift-Delete\", null),\n exec: function(editor) { \n if (editor.selection.isEmpty()) {\n editor.remove(\"left\");\n } else {\n return false;\n }\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolinestart\",\n description: \"Remove to line start\",\n bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n exec: function(editor) { editor.removeToLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineend\",\n description: \"Remove to line end\",\n bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K|Command-Delete\"),\n exec: function(editor) { editor.removeToLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolinestarthard\",\n description: \"Remove to line start hard\",\n bindKey: bindKey(\"Ctrl-Shift-Backspace\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.start.column = 0;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineendhard\",\n description: \"Remove to line end hard\",\n bindKey: bindKey(\"Ctrl-Shift-Delete\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.end.column = Number.MAX_VALUE;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordleft\",\n description: \"Remove word left\",\n bindKey: bindKey(\"Ctrl-Backspace\", \"Alt-Backspace|Ctrl-Alt-Backspace\"),\n exec: function(editor) { editor.removeWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordright\",\n description: \"Remove word right\",\n bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n exec: function(editor) { editor.removeWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"outdent\",\n description: \"Outdent\",\n bindKey: bindKey(\"Shift-Tab\", \"Shift-Tab\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"indent\",\n description: \"Indent\",\n bindKey: bindKey(\"Tab\", \"Tab\"),\n exec: function(editor) { editor.indent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockoutdent\",\n description: \"Block outdent\",\n bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockindent\",\n description: \"Block indent\",\n bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n exec: function(editor) { editor.blockIndent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"insertstring\",\n description: \"Insert string\",\n exec: function(editor, str) { editor.insert(str); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"inserttext\",\n description: \"Insert text\",\n exec: function(editor, args) {\n editor.insert(lang.stringRepeat(args.text || \"\", args.times || 1));\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"splitline\",\n description: \"Split line\",\n bindKey: bindKey(null, \"Ctrl-O\"),\n exec: function(editor) { editor.splitLine(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"transposeletters\",\n description: \"Transpose letters\",\n bindKey: bindKey(\"Alt-Shift-X\", \"Ctrl-T\"),\n exec: function(editor) { editor.transposeLetters(); },\n multiSelectAction: function(editor) {editor.transposeSelections(1); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"touppercase\",\n description: \"To uppercase\",\n bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n exec: function(editor) { editor.toUpperCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"tolowercase\",\n description: \"To lowercase\",\n bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n exec: function(editor) { editor.toLowerCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"autoindent\",\n description: \"Auto Indent\",\n bindKey: bindKey(null, null),\n exec: function(editor) { editor.autoIndent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"animate\"\n}, {\n name: \"expandtoline\",\n description: \"Expand to line\",\n bindKey: bindKey(\"Ctrl-Shift-L\", \"Command-Shift-L\"),\n exec: function(editor) {\n var range = editor.selection.getRange();\n\n range.start.column = range.end.column = 0;\n range.end.row++;\n editor.selection.setRange(range, false);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"joinlines\",\n description: \"Join lines\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n var isBackwards = editor.selection.isBackwards();\n var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();\n var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();\n var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length;\n var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());\n var selectedCount = selectedText.replace(/\\n\\s*/, \" \").length;\n var insertLine = editor.session.doc.getLine(selectionStart.row);\n\n for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {\n var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));\n if (curLine.length !== 0) {\n curLine = \" \" + curLine;\n }\n insertLine += curLine;\n }\n\n if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {\n insertLine += editor.session.doc.getNewLineCharacter();\n }\n\n editor.clearSelection();\n editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);\n\n if (selectedCount > 0) {\n editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);\n editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);\n } else {\n firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;\n editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);\n }\n },\n multiSelectAction: \"forEach\",\n readOnly: true\n}, {\n name: \"invertSelection\",\n description: \"Invert selection\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n var endRow = editor.session.doc.getLength() - 1;\n var endCol = editor.session.doc.getLine(endRow).length;\n var ranges = editor.selection.rangeList.ranges;\n var newRanges = [];\n if (ranges.length < 1) {\n ranges = [editor.selection.getRange()];\n }\n\n for (var i = 0; i < ranges.length; i++) {\n if (i == (ranges.length - 1)) {\n if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {\n newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));\n }\n }\n\n if (i === 0) {\n if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {\n newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));\n }\n } else {\n newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));\n }\n }\n\n editor.exitMultiSelectMode();\n editor.clearSelection();\n\n for(var i = 0; i < newRanges.length; i++) {\n editor.selection.addRange(newRanges[i], false);\n }\n },\n readOnly: true,\n scrollIntoView: \"none\"\n}, {\n name: \"addLineAfter\",\n exec: function(editor) {\n editor.selection.clearSelection();\n editor.navigateLineEnd();\n editor.insert(\"\\n\");\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"addLineBefore\",\n exec: function(editor) {\n editor.selection.clearSelection();\n var cursor = editor.getCursorPosition();\n editor.selection.moveTo(cursor.row - 1, Number.MAX_VALUE);\n editor.insert(\"\\n\");\n if (cursor.row === 0) editor.navigateUp();\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"openCommandPallete\",\n description: \"Open command pallete\",\n bindKey: bindKey(\"F1\", \"F1\"),\n exec: function(editor) {\n editor.prompt({ $type: \"commands\" });\n },\n readOnly: true\n}, {\n name: \"modeSelect\",\n description: \"Change language mode...\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n editor.prompt({ $type: \"modes\" });\n },\n readOnly: true\n}];\n\nfor (var i = 1; i < 9; i++) {\n exports.commands.push({\n name: \"foldToLevel\" + i,\n description: \"Fold To Level \" + i,\n level: i,\n exec: function(editor) { editor.session.foldToLevel(this.level); },\n scrollIntoView: \"center\",\n readOnly: true\n });\n}\n\n});\n\nace.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) {\n\"use strict\";\n\nrequire(\"./lib/fixoldbrowsers\");\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar lang = require(\"./lib/lang\");\nvar useragent = require(\"./lib/useragent\");\nvar TextInput = require(\"./keyboard/textinput\").TextInput;\nvar MouseHandler = require(\"./mouse/mouse_handler\").MouseHandler;\nvar FoldHandler = require(\"./mouse/fold_handler\").FoldHandler;\nvar KeyBinding = require(\"./keyboard/keybinding\").KeyBinding;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar Search = require(\"./search\").Search;\nvar Range = require(\"./range\").Range;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar CommandManager = require(\"./commands/command_manager\").CommandManager;\nvar defaultCommands = require(\"./commands/default_commands\").commands;\nvar config = require(\"./config\");\nvar TokenIterator = require(\"./token_iterator\").TokenIterator;\n\nvar clipboard = require(\"./clipboard\");\nvar Editor = function(renderer, session, options) {\n this.$toDestroy = [];\n var container = renderer.getContainerElement();\n this.container = container;\n this.renderer = renderer;\n this.id = \"editor\" + (++Editor.$uid);\n\n this.commands = new CommandManager(useragent.isMac ? \"mac\" : \"win\", defaultCommands);\n if (typeof document == \"object\") {\n this.textInput = new TextInput(renderer.getTextAreaContainer(), this);\n this.renderer.textarea = this.textInput.getElement();\n this.$mouseHandler = new MouseHandler(this);\n new FoldHandler(this);\n }\n\n this.keyBinding = new KeyBinding(this);\n\n this.$search = new Search().set({\n wrap: true\n });\n\n this.$historyTracker = this.$historyTracker.bind(this);\n this.commands.on(\"exec\", this.$historyTracker);\n\n this.$initOperationListeners();\n \n this._$emitInputEvent = lang.delayedCall(function() {\n this._signal(\"input\", {});\n if (this.session && this.session.bgTokenizer)\n this.session.bgTokenizer.scheduleStart();\n }.bind(this));\n \n this.on(\"change\", function(_, _self) {\n _self._$emitInputEvent.schedule(31);\n });\n\n this.setSession(session || options && options.session || new EditSession(\"\"));\n config.resetOptions(this);\n if (options)\n this.setOptions(options);\n config._signal(\"editor\", this);\n};\n\nEditor.$uid = 0;\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.$initOperationListeners = function() {\n this.commands.on(\"exec\", this.startOperation.bind(this), true);\n this.commands.on(\"afterExec\", this.endOperation.bind(this), true);\n\n this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this, true));\n this.on(\"change\", function() {\n if (!this.curOp) {\n this.startOperation();\n this.curOp.selectionBefore = this.$lastSel;\n }\n this.curOp.docChanged = true;\n }.bind(this), true);\n \n this.on(\"changeSelection\", function() {\n if (!this.curOp) {\n this.startOperation();\n this.curOp.selectionBefore = this.$lastSel;\n }\n this.curOp.selectionChanged = true;\n }.bind(this), true);\n };\n\n this.curOp = null;\n this.prevOp = {};\n this.startOperation = function(commandEvent) {\n if (this.curOp) {\n if (!commandEvent || this.curOp.command)\n return;\n this.prevOp = this.curOp;\n }\n if (!commandEvent) {\n this.previousCommand = null;\n commandEvent = {};\n }\n\n this.$opResetTimer.schedule();\n this.curOp = this.session.curOp = {\n command: commandEvent.command || {},\n args: commandEvent.args,\n scrollTop: this.renderer.scrollTop\n };\n this.curOp.selectionBefore = this.selection.toJSON();\n };\n\n this.endOperation = function(e) {\n if (this.curOp && this.session) {\n if (e && e.returnValue === false || !this.session)\n return (this.curOp = null);\n if (e == true && this.curOp.command && this.curOp.command.name == \"mouse\")\n return;\n this._signal(\"beforeEndOperation\");\n if (!this.curOp) return;\n var command = this.curOp.command;\n var scrollIntoView = command && command.scrollIntoView;\n if (scrollIntoView) {\n switch (scrollIntoView) {\n case \"center-animate\":\n scrollIntoView = \"animate\";\n case \"center\":\n this.renderer.scrollCursorIntoView(null, 0.5);\n break;\n case \"animate\":\n case \"cursor\":\n this.renderer.scrollCursorIntoView();\n break;\n case \"selectionPart\":\n var range = this.selection.getRange();\n var config = this.renderer.layerConfig;\n if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) {\n this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead);\n }\n break;\n default:\n break;\n }\n if (scrollIntoView == \"animate\")\n this.renderer.animateScrolling(this.curOp.scrollTop);\n }\n var sel = this.selection.toJSON();\n this.curOp.selectionAfter = sel;\n this.$lastSel = this.selection.toJSON();\n this.session.getUndoManager().addSelection(sel);\n this.prevOp = this.curOp;\n this.curOp = null;\n }\n };\n this.$mergeableCommands = [\"backspace\", \"del\", \"insertstring\"];\n this.$historyTracker = function(e) {\n if (!this.$mergeUndoDeltas)\n return;\n\n var prev = this.prevOp;\n var mergeableCommands = this.$mergeableCommands;\n var shouldMerge = prev.command && (e.command.name == prev.command.name);\n if (e.command.name == \"insertstring\") {\n var text = e.args;\n if (this.mergeNextCommand === undefined)\n this.mergeNextCommand = true;\n\n shouldMerge = shouldMerge\n && this.mergeNextCommand // previous command allows to coalesce with\n && (!/\\s/.test(text) || /\\s/.test(prev.args)); // previous insertion was of same type\n\n this.mergeNextCommand = true;\n } else {\n shouldMerge = shouldMerge\n && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable\n }\n\n if (\n this.$mergeUndoDeltas != \"always\"\n && Date.now() - this.sequenceStartTime > 2000\n ) {\n shouldMerge = false; // the sequence is too long\n }\n\n if (shouldMerge)\n this.session.mergeUndoDeltas = true;\n else if (mergeableCommands.indexOf(e.command.name) !== -1)\n this.sequenceStartTime = Date.now();\n };\n this.setKeyboardHandler = function(keyboardHandler, cb) {\n if (keyboardHandler && typeof keyboardHandler === \"string\" && keyboardHandler != \"ace\") {\n this.$keybindingId = keyboardHandler;\n var _self = this;\n config.loadModule([\"keybinding\", keyboardHandler], function(module) {\n if (_self.$keybindingId == keyboardHandler)\n _self.keyBinding.setKeyboardHandler(module && module.handler);\n cb && cb();\n });\n } else {\n this.$keybindingId = null;\n this.keyBinding.setKeyboardHandler(keyboardHandler);\n cb && cb();\n }\n };\n this.getKeyboardHandler = function() {\n return this.keyBinding.getKeyboardHandler();\n };\n this.setSession = function(session) {\n if (this.session == session)\n return;\n if (this.curOp) this.endOperation();\n this.curOp = {};\n\n var oldSession = this.session;\n if (oldSession) {\n this.session.off(\"change\", this.$onDocumentChange);\n this.session.off(\"changeMode\", this.$onChangeMode);\n this.session.off(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n this.session.off(\"changeTabSize\", this.$onChangeTabSize);\n this.session.off(\"changeWrapLimit\", this.$onChangeWrapLimit);\n this.session.off(\"changeWrapMode\", this.$onChangeWrapMode);\n this.session.off(\"changeFold\", this.$onChangeFold);\n this.session.off(\"changeFrontMarker\", this.$onChangeFrontMarker);\n this.session.off(\"changeBackMarker\", this.$onChangeBackMarker);\n this.session.off(\"changeBreakpoint\", this.$onChangeBreakpoint);\n this.session.off(\"changeAnnotation\", this.$onChangeAnnotation);\n this.session.off(\"changeOverwrite\", this.$onCursorChange);\n this.session.off(\"changeScrollTop\", this.$onScrollTopChange);\n this.session.off(\"changeScrollLeft\", this.$onScrollLeftChange);\n\n var selection = this.session.getSelection();\n selection.off(\"changeCursor\", this.$onCursorChange);\n selection.off(\"changeSelection\", this.$onSelectionChange);\n }\n\n this.session = session;\n if (session) {\n this.$onDocumentChange = this.onDocumentChange.bind(this);\n session.on(\"change\", this.$onDocumentChange);\n this.renderer.setSession(session);\n \n this.$onChangeMode = this.onChangeMode.bind(this);\n session.on(\"changeMode\", this.$onChangeMode);\n \n this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n session.on(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n \n this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);\n session.on(\"changeTabSize\", this.$onChangeTabSize);\n \n this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n session.on(\"changeWrapLimit\", this.$onChangeWrapLimit);\n \n this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n session.on(\"changeWrapMode\", this.$onChangeWrapMode);\n \n this.$onChangeFold = this.onChangeFold.bind(this);\n session.on(\"changeFold\", this.$onChangeFold);\n \n this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n this.session.on(\"changeFrontMarker\", this.$onChangeFrontMarker);\n \n this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n this.session.on(\"changeBackMarker\", this.$onChangeBackMarker);\n \n this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n this.session.on(\"changeBreakpoint\", this.$onChangeBreakpoint);\n \n this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n this.session.on(\"changeAnnotation\", this.$onChangeAnnotation);\n \n this.$onCursorChange = this.onCursorChange.bind(this);\n this.session.on(\"changeOverwrite\", this.$onCursorChange);\n \n this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n this.session.on(\"changeScrollTop\", this.$onScrollTopChange);\n \n this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n this.session.on(\"changeScrollLeft\", this.$onScrollLeftChange);\n \n this.selection = session.getSelection();\n this.selection.on(\"changeCursor\", this.$onCursorChange);\n \n this.$onSelectionChange = this.onSelectionChange.bind(this);\n this.selection.on(\"changeSelection\", this.$onSelectionChange);\n \n this.onChangeMode();\n \n this.onCursorChange();\n \n this.onScrollTopChange();\n this.onScrollLeftChange();\n this.onSelectionChange();\n this.onChangeFrontMarker();\n this.onChangeBackMarker();\n this.onChangeBreakpoint();\n this.onChangeAnnotation();\n this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\n this.renderer.updateFull();\n } else {\n this.selection = null;\n this.renderer.setSession(session);\n }\n\n this._signal(\"changeSession\", {\n session: session,\n oldSession: oldSession\n });\n \n this.curOp = null;\n \n oldSession && oldSession._signal(\"changeEditor\", {oldEditor: this});\n session && session._signal(\"changeEditor\", {editor: this});\n \n if (session && session.bgTokenizer)\n session.bgTokenizer.scheduleStart();\n };\n this.getSession = function() {\n return this.session;\n };\n this.setValue = function(val, cursorPos) {\n this.session.doc.setValue(val);\n\n if (!cursorPos)\n this.selectAll();\n else if (cursorPos == 1)\n this.navigateFileEnd();\n else if (cursorPos == -1)\n this.navigateFileStart();\n\n return val;\n };\n this.getValue = function() {\n return this.session.getValue();\n };\n this.getSelection = function() {\n return this.selection;\n };\n this.resize = function(force) {\n this.renderer.onResize(force);\n };\n this.setTheme = function(theme, cb) {\n this.renderer.setTheme(theme, cb);\n };\n this.getTheme = function() {\n return this.renderer.getTheme();\n };\n this.setStyle = function(style) {\n this.renderer.setStyle(style);\n };\n this.unsetStyle = function(style) {\n this.renderer.unsetStyle(style);\n };\n this.getFontSize = function () {\n return this.getOption(\"fontSize\") ||\n dom.computedStyle(this.container).fontSize;\n };\n this.setFontSize = function(size) {\n this.setOption(\"fontSize\", size);\n };\n\n this.$highlightBrackets = function() {\n if (this.$highlightPending) {\n return;\n }\n var self = this;\n this.$highlightPending = true;\n setTimeout(function () {\n self.$highlightPending = false;\n var session = self.session;\n if (!session || !session.bgTokenizer) return;\n if (session.$bracketHighlight) {\n session.$bracketHighlight.markerIds.forEach(function(id) {\n session.removeMarker(id);\n });\n session.$bracketHighlight = null;\n }\n var ranges = session.getMatchingBracketRanges(self.getCursorPosition());\n if (!ranges && session.$mode.getMatching) \n ranges = session.$mode.getMatching(self.session);\n if (!ranges)\n return;\n\n var markerType = \"ace_bracket\";\n if (!Array.isArray(ranges)) {\n ranges = [ranges];\n } else if (ranges.length == 1) {\n markerType = \"ace_error_bracket\";\n }\n if (ranges.length == 2) {\n if (Range.comparePoints(ranges[0].end, ranges[1].start) == 0)\n ranges = [Range.fromPoints(ranges[0].start, ranges[1].end)];\n else if (Range.comparePoints(ranges[0].start, ranges[1].end) == 0)\n ranges = [Range.fromPoints(ranges[1].start, ranges[0].end)];\n }\n\n session.$bracketHighlight = {\n ranges: ranges,\n markerIds: ranges.map(function(range) {\n return session.addMarker(range, markerType, \"text\");\n })\n };\n }, 50);\n };\n this.$highlightTags = function() {\n if (this.$highlightTagPending)\n return;\n var self = this;\n this.$highlightTagPending = true;\n setTimeout(function() {\n self.$highlightTagPending = false;\n \n var session = self.session;\n if (!session || !session.bgTokenizer) return;\n \n var pos = self.getCursorPosition();\n var iterator = new TokenIterator(self.session, pos.row, pos.column);\n var token = iterator.getCurrentToken();\n \n if (!token || !/\\b(?:tag-open|tag-name)/.test(token.type)) {\n session.removeMarker(session.$tagHighlight);\n session.$tagHighlight = null;\n return;\n }\n \n if (token.type.indexOf(\"tag-open\") !== -1) {\n token = iterator.stepForward();\n if (!token)\n return;\n }\n \n var tag = token.value;\n var currentTag = token.value;\n var depth = 0;\n var prevToken = iterator.stepBackward();\n \n if (prevToken.value === '<'){\n do {\n prevToken = token;\n token = iterator.stepForward();\n\n if (token) {\n if (token.type.indexOf('tag-name') !== -1) {\n currentTag = token.value;\n if (tag === currentTag) {\n if (prevToken.value === '<') {\n depth++;\n } else if (prevToken.value === '') { // self closing tag\n depth--;\n }\n }\n \n } while (token && depth >= 0);\n } else {\n do {\n token = prevToken;\n prevToken = iterator.stepBackward();\n\n if (token) {\n if (token.type.indexOf('tag-name') !== -1) {\n if (tag === token.value) {\n if (prevToken.value === '<') {\n depth++;\n } else if (prevToken.value === '') { // self closing tag\n var stepCount = 0;\n var tmpToken = prevToken;\n while (tmpToken) {\n if (tmpToken.type.indexOf('tag-name') !== -1 && tmpToken.value === tag) {\n depth--;\n break;\n } else if (tmpToken.value === '<') {\n break;\n }\n tmpToken = iterator.stepBackward();\n stepCount++;\n }\n for (var i = 0; i < stepCount; i++) {\n iterator.stepForward();\n }\n }\n }\n } while (prevToken && depth <= 0);\n iterator.stepForward();\n }\n \n if (!token) {\n session.removeMarker(session.$tagHighlight);\n session.$tagHighlight = null;\n return;\n }\n \n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn();\n var range = new Range(row, column, row, column+token.value.length);\n var sbm = session.$backMarkers[session.$tagHighlight];\n if (session.$tagHighlight && sbm != undefined && range.compareRange(sbm.range) !== 0) {\n session.removeMarker(session.$tagHighlight);\n session.$tagHighlight = null;\n }\n \n if (!session.$tagHighlight)\n session.$tagHighlight = session.addMarker(range, \"ace_bracket\", \"text\");\n }, 50);\n };\n this.focus = function() {\n var _self = this;\n setTimeout(function() {\n if (!_self.isFocused())\n _self.textInput.focus();\n });\n this.textInput.focus();\n };\n this.isFocused = function() {\n return this.textInput.isFocused();\n };\n this.blur = function() {\n this.textInput.blur();\n };\n this.onFocus = function(e) {\n if (this.$isFocused)\n return;\n this.$isFocused = true;\n this.renderer.showCursor();\n this.renderer.visualizeFocus();\n this._emit(\"focus\", e);\n };\n this.onBlur = function(e) {\n if (!this.$isFocused)\n return;\n this.$isFocused = false;\n this.renderer.hideCursor();\n this.renderer.visualizeBlur();\n this._emit(\"blur\", e);\n };\n\n this.$cursorChange = function() {\n this.renderer.updateCursor();\n this.$highlightBrackets();\n this.$highlightTags();\n this.$updateHighlightActiveLine();\n };\n this.onDocumentChange = function(delta) {\n var wrap = this.session.$useWrapMode;\n var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity);\n this.renderer.updateLines(delta.start.row, lastRow, wrap);\n\n this._signal(\"change\", delta);\n this.$cursorChange();\n };\n\n this.onTokenizerUpdate = function(e) {\n var rows = e.data;\n this.renderer.updateLines(rows.first, rows.last);\n };\n\n\n this.onScrollTopChange = function() {\n this.renderer.scrollToY(this.session.getScrollTop());\n };\n\n this.onScrollLeftChange = function() {\n this.renderer.scrollToX(this.session.getScrollLeft());\n };\n this.onCursorChange = function() {\n this.$cursorChange();\n this._signal(\"changeSelection\");\n };\n\n this.$updateHighlightActiveLine = function() {\n var session = this.getSession();\n\n var highlight;\n if (this.$highlightActiveLine) {\n if (this.$selectionStyle != \"line\" || !this.selection.isMultiLine())\n highlight = this.getCursorPosition();\n if (this.renderer.theme && this.renderer.theme.$selectionColorConflict && !this.selection.isEmpty())\n highlight = false;\n if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1))\n highlight = false;\n }\n\n if (session.$highlightLineMarker && !highlight) {\n session.removeMarker(session.$highlightLineMarker.id);\n session.$highlightLineMarker = null;\n } else if (!session.$highlightLineMarker && highlight) {\n var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);\n range.id = session.addMarker(range, \"ace_active-line\", \"screenLine\");\n session.$highlightLineMarker = range;\n } else if (highlight) {\n session.$highlightLineMarker.start.row = highlight.row;\n session.$highlightLineMarker.end.row = highlight.row;\n session.$highlightLineMarker.start.column = highlight.column;\n session._signal(\"changeBackMarker\");\n }\n };\n\n this.onSelectionChange = function(e) {\n var session = this.session;\n\n if (session.$selectionMarker) {\n session.removeMarker(session.$selectionMarker);\n }\n session.$selectionMarker = null;\n\n if (!this.selection.isEmpty()) {\n var range = this.selection.getRange();\n var style = this.getSelectionStyle();\n session.$selectionMarker = session.addMarker(range, \"ace_selection\", style);\n } else {\n this.$updateHighlightActiveLine();\n }\n\n var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();\n this.session.highlight(re);\n\n this._signal(\"changeSelection\");\n };\n\n this.$getSelectionHighLightRegexp = function() {\n var session = this.session;\n\n var selection = this.getSelectionRange();\n if (selection.isEmpty() || selection.isMultiLine())\n return;\n\n var startColumn = selection.start.column;\n var endColumn = selection.end.column;\n var line = session.getLine(selection.start.row);\n \n var needle = line.substring(startColumn, endColumn);\n if (needle.length > 5000 || !/[\\w\\d]/.test(needle))\n return;\n\n var re = this.$search.$assembleRegExp({\n wholeWord: true,\n caseSensitive: true,\n needle: needle\n });\n \n var wordWithBoundary = line.substring(startColumn - 1, endColumn + 1);\n if (!re.test(wordWithBoundary))\n return;\n \n return re;\n };\n\n\n this.onChangeFrontMarker = function() {\n this.renderer.updateFrontMarkers();\n };\n\n this.onChangeBackMarker = function() {\n this.renderer.updateBackMarkers();\n };\n\n\n this.onChangeBreakpoint = function() {\n this.renderer.updateBreakpoints();\n };\n\n this.onChangeAnnotation = function() {\n this.renderer.setAnnotations(this.session.getAnnotations());\n };\n\n\n this.onChangeMode = function(e) {\n this.renderer.updateText();\n this._emit(\"changeMode\", e);\n };\n\n\n this.onChangeWrapLimit = function() {\n this.renderer.updateFull();\n };\n\n this.onChangeWrapMode = function() {\n this.renderer.onResize(true);\n };\n\n\n this.onChangeFold = function() {\n this.$updateHighlightActiveLine();\n this.renderer.updateFull();\n };\n this.getSelectedText = function() {\n return this.session.getTextRange(this.getSelectionRange());\n };\n this.getCopyText = function() {\n var text = this.getSelectedText();\n var nl = this.session.doc.getNewLineCharacter();\n var copyLine= false;\n if (!text && this.$copyWithEmptySelection) {\n copyLine = true;\n var ranges = this.selection.getAllRanges();\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (i && ranges[i - 1].start.row == range.start.row)\n continue;\n text += this.session.getLine(range.start.row) + nl;\n }\n }\n var e = {text: text};\n this._signal(\"copy\", e);\n clipboard.lineMode = copyLine ? e.text : \"\";\n return e.text;\n };\n this.onCopy = function() {\n this.commands.exec(\"copy\", this);\n };\n this.onCut = function() {\n this.commands.exec(\"cut\", this);\n };\n this.onPaste = function(text, event) {\n var e = {text: text, event: event};\n this.commands.exec(\"paste\", this, e);\n };\n \n this.$handlePaste = function(e) {\n if (typeof e == \"string\") \n e = {text: e};\n this._signal(\"paste\", e);\n var text = e.text;\n\n var lineMode = text == clipboard.lineMode;\n var session = this.session;\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\n if (lineMode)\n session.insert({ row: this.selection.lead.row, column: 0 }, text);\n else\n this.insert(text);\n } else if (lineMode) {\n this.selection.rangeList.ranges.forEach(function(range) {\n session.insert({ row: range.start.row, column: 0 }, text);\n });\n } else {\n var lines = text.split(/\\r\\n|\\r|\\n/);\n var ranges = this.selection.rangeList.ranges;\n \n var isFullLine = lines.length == 2 && (!lines[0] || !lines[1]);\n if (lines.length != ranges.length || isFullLine)\n return this.commands.exec(\"insertstring\", this, text);\n \n for (var i = ranges.length; i--;) {\n var range = ranges[i];\n if (!range.isEmpty())\n session.remove(range);\n \n session.insert(range.start, lines[i]);\n }\n }\n };\n\n this.execCommand = function(command, args) {\n return this.commands.exec(command, this, args);\n };\n this.insert = function(text, pasted) {\n var session = this.session;\n var mode = session.getMode();\n var cursor = this.getCursorPosition();\n\n if (this.getBehavioursEnabled() && !pasted) {\n var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);\n if (transform) {\n if (text !== transform.text) {\n if (!this.inVirtualSelectionMode) {\n this.session.mergeUndoDeltas = false;\n this.mergeNextCommand = false;\n }\n }\n text = transform.text;\n\n }\n }\n \n if (text == \"\\t\")\n text = this.session.getTabString();\n if (!this.selection.isEmpty()) {\n var range = this.getSelectionRange();\n cursor = this.session.remove(range);\n this.clearSelection();\n }\n else if (this.session.getOverwrite() && text.indexOf(\"\\n\") == -1) {\n var range = new Range.fromPoints(cursor, cursor);\n range.end.column += text.length;\n this.session.remove(range);\n }\n\n if (text == \"\\n\" || text == \"\\r\\n\") {\n var line = session.getLine(cursor.row);\n if (cursor.column > line.search(/\\S|$/)) {\n var d = line.substr(cursor.column).search(/\\S|$/);\n session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d);\n }\n }\n this.clearSelection();\n\n var start = cursor.column;\n var lineState = session.getState(cursor.row);\n var line = session.getLine(cursor.row);\n var shouldOutdent = mode.checkOutdent(lineState, line, text);\n session.insert(cursor, text);\n\n if (transform && transform.selection) {\n if (transform.selection.length == 2) { // Transform relative to the current column\n this.selection.setSelectionRange(\n new Range(cursor.row, start + transform.selection[0],\n cursor.row, start + transform.selection[1]));\n } else { // Transform relative to the current row.\n this.selection.setSelectionRange(\n new Range(cursor.row + transform.selection[0],\n transform.selection[1],\n cursor.row + transform.selection[2],\n transform.selection[3]));\n }\n }\n if (this.$enableAutoIndent) {\n if (session.getDocument().isNewLine(text)) {\n var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\n\n session.insert({row: cursor.row+1, column: 0}, lineIndent);\n }\n if (shouldOutdent)\n mode.autoOutdent(lineState, session, cursor.row);\n }\n };\n\n this.autoIndent = function () {\n var session = this.session;\n var mode = session.getMode();\n\n var startRow, endRow;\n if (this.selection.isEmpty()) {\n startRow = 0;\n endRow = session.doc.getLength() - 1;\n } else {\n var selectedRange = this.getSelectionRange();\n\n startRow = selectedRange.start.row;\n endRow = selectedRange.end.row;\n }\n\n var prevLineState = \"\";\n var prevLine = \"\";\n var lineIndent = \"\";\n var line, currIndent, range;\n var tab = session.getTabString();\n\n for (var row = startRow; row <= endRow; row++) {\n if (row > 0) {\n prevLineState = session.getState(row - 1);\n prevLine = session.getLine(row - 1);\n lineIndent = mode.getNextLineIndent(prevLineState, prevLine, tab);\n }\n\n line = session.getLine(row);\n currIndent = mode.$getIndent(line);\n if (lineIndent !== currIndent) {\n if (currIndent.length > 0) {\n range = new Range(row, 0, row, currIndent.length);\n session.remove(range);\n }\n if (lineIndent.length > 0) {\n session.insert({row: row, column: 0}, lineIndent);\n }\n }\n\n mode.autoOutdent(prevLineState, session, row);\n }\n };\n\n\n this.onTextInput = function(text, composition) {\n if (!composition)\n return this.keyBinding.onTextInput(text);\n \n this.startOperation({command: { name: \"insertstring\" }});\n var applyComposition = this.applyComposition.bind(this, text, composition);\n if (this.selection.rangeCount)\n this.forEachSelection(applyComposition);\n else\n applyComposition();\n this.endOperation();\n };\n \n this.applyComposition = function(text, composition) {\n if (composition.extendLeft || composition.extendRight) {\n var r = this.selection.getRange();\n r.start.column -= composition.extendLeft;\n r.end.column += composition.extendRight;\n if (r.start.column < 0) {\n r.start.row--;\n r.start.column += this.session.getLine(r.start.row).length + 1;\n }\n this.selection.setRange(r);\n if (!text && !r.isEmpty())\n this.remove();\n }\n if (text || !this.selection.isEmpty())\n this.insert(text, true);\n if (composition.restoreStart || composition.restoreEnd) {\n var r = this.selection.getRange();\n r.start.column -= composition.restoreStart;\n r.end.column -= composition.restoreEnd;\n this.selection.setRange(r);\n }\n };\n\n this.onCommandKey = function(e, hashId, keyCode) {\n return this.keyBinding.onCommandKey(e, hashId, keyCode);\n };\n this.setOverwrite = function(overwrite) {\n this.session.setOverwrite(overwrite);\n };\n this.getOverwrite = function() {\n return this.session.getOverwrite();\n };\n this.toggleOverwrite = function() {\n this.session.toggleOverwrite();\n };\n this.setScrollSpeed = function(speed) {\n this.setOption(\"scrollSpeed\", speed);\n };\n this.getScrollSpeed = function() {\n return this.getOption(\"scrollSpeed\");\n };\n this.setDragDelay = function(dragDelay) {\n this.setOption(\"dragDelay\", dragDelay);\n };\n this.getDragDelay = function() {\n return this.getOption(\"dragDelay\");\n };\n this.setSelectionStyle = function(val) {\n this.setOption(\"selectionStyle\", val);\n };\n this.getSelectionStyle = function() {\n return this.getOption(\"selectionStyle\");\n };\n this.setHighlightActiveLine = function(shouldHighlight) {\n this.setOption(\"highlightActiveLine\", shouldHighlight);\n };\n this.getHighlightActiveLine = function() {\n return this.getOption(\"highlightActiveLine\");\n };\n this.setHighlightGutterLine = function(shouldHighlight) {\n this.setOption(\"highlightGutterLine\", shouldHighlight);\n };\n\n this.getHighlightGutterLine = function() {\n return this.getOption(\"highlightGutterLine\");\n };\n this.setHighlightSelectedWord = function(shouldHighlight) {\n this.setOption(\"highlightSelectedWord\", shouldHighlight);\n };\n this.getHighlightSelectedWord = function() {\n return this.$highlightSelectedWord;\n };\n\n this.setAnimatedScroll = function(shouldAnimate){\n this.renderer.setAnimatedScroll(shouldAnimate);\n };\n\n this.getAnimatedScroll = function(){\n return this.renderer.getAnimatedScroll();\n };\n this.setShowInvisibles = function(showInvisibles) {\n this.renderer.setShowInvisibles(showInvisibles);\n };\n this.getShowInvisibles = function() {\n return this.renderer.getShowInvisibles();\n };\n\n this.setDisplayIndentGuides = function(display) {\n this.renderer.setDisplayIndentGuides(display);\n };\n\n this.getDisplayIndentGuides = function() {\n return this.renderer.getDisplayIndentGuides();\n };\n this.setShowPrintMargin = function(showPrintMargin) {\n this.renderer.setShowPrintMargin(showPrintMargin);\n };\n this.getShowPrintMargin = function() {\n return this.renderer.getShowPrintMargin();\n };\n this.setPrintMarginColumn = function(showPrintMargin) {\n this.renderer.setPrintMarginColumn(showPrintMargin);\n };\n this.getPrintMarginColumn = function() {\n return this.renderer.getPrintMarginColumn();\n };\n this.setReadOnly = function(readOnly) {\n this.setOption(\"readOnly\", readOnly);\n };\n this.getReadOnly = function() {\n return this.getOption(\"readOnly\");\n };\n this.setBehavioursEnabled = function (enabled) {\n this.setOption(\"behavioursEnabled\", enabled);\n };\n this.getBehavioursEnabled = function () {\n return this.getOption(\"behavioursEnabled\");\n };\n this.setWrapBehavioursEnabled = function (enabled) {\n this.setOption(\"wrapBehavioursEnabled\", enabled);\n };\n this.getWrapBehavioursEnabled = function () {\n return this.getOption(\"wrapBehavioursEnabled\");\n };\n this.setShowFoldWidgets = function(show) {\n this.setOption(\"showFoldWidgets\", show);\n\n };\n this.getShowFoldWidgets = function() {\n return this.getOption(\"showFoldWidgets\");\n };\n\n this.setFadeFoldWidgets = function(fade) {\n this.setOption(\"fadeFoldWidgets\", fade);\n };\n\n this.getFadeFoldWidgets = function() {\n return this.getOption(\"fadeFoldWidgets\");\n };\n this.remove = function(dir) {\n if (this.selection.isEmpty()){\n if (dir == \"left\")\n this.selection.selectLeft();\n else\n this.selection.selectRight();\n }\n\n var range = this.getSelectionRange();\n if (this.getBehavioursEnabled()) {\n var session = this.session;\n var state = session.getState(range.start.row);\n var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\n\n if (range.end.column === 0) {\n var text = session.getTextRange(range);\n if (text[text.length - 1] == \"\\n\") {\n var line = session.getLine(range.end.row);\n if (/^\\s+$/.test(line)) {\n range.end.column = line.length;\n }\n }\n }\n if (new_range)\n range = new_range;\n }\n\n this.session.remove(range);\n this.clearSelection();\n };\n this.removeWordRight = function() {\n if (this.selection.isEmpty())\n this.selection.selectWordRight();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeWordLeft = function() {\n if (this.selection.isEmpty())\n this.selection.selectWordLeft();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeToLineStart = function() {\n if (this.selection.isEmpty())\n this.selection.selectLineStart();\n if (this.selection.isEmpty())\n this.selection.selectLeft();\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeToLineEnd = function() {\n if (this.selection.isEmpty())\n this.selection.selectLineEnd();\n\n var range = this.getSelectionRange();\n if (range.start.column == range.end.column && range.start.row == range.end.row) {\n range.end.column = 0;\n range.end.row++;\n }\n\n this.session.remove(range);\n this.clearSelection();\n };\n this.splitLine = function() {\n if (!this.selection.isEmpty()) {\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n }\n\n var cursor = this.getCursorPosition();\n this.insert(\"\\n\");\n this.moveCursorToPosition(cursor);\n };\n this.transposeLetters = function() {\n if (!this.selection.isEmpty()) {\n return;\n }\n\n var cursor = this.getCursorPosition();\n var column = cursor.column;\n if (column === 0)\n return;\n\n var line = this.session.getLine(cursor.row);\n var swap, range;\n if (column < line.length) {\n swap = line.charAt(column) + line.charAt(column-1);\n range = new Range(cursor.row, column-1, cursor.row, column+1);\n }\n else {\n swap = line.charAt(column-1) + line.charAt(column-2);\n range = new Range(cursor.row, column-2, cursor.row, column);\n }\n this.session.replace(range, swap);\n this.session.selection.moveToPosition(range.end);\n };\n this.toLowerCase = function() {\n var originalRange = this.getSelectionRange();\n if (this.selection.isEmpty()) {\n this.selection.selectWord();\n }\n\n var range = this.getSelectionRange();\n var text = this.session.getTextRange(range);\n this.session.replace(range, text.toLowerCase());\n this.selection.setSelectionRange(originalRange);\n };\n this.toUpperCase = function() {\n var originalRange = this.getSelectionRange();\n if (this.selection.isEmpty()) {\n this.selection.selectWord();\n }\n\n var range = this.getSelectionRange();\n var text = this.session.getTextRange(range);\n this.session.replace(range, text.toUpperCase());\n this.selection.setSelectionRange(originalRange);\n };\n this.indent = function() {\n var session = this.session;\n var range = this.getSelectionRange();\n\n if (range.start.row < range.end.row) {\n var rows = this.$getSelectedRows();\n session.indentRows(rows.first, rows.last, \"\\t\");\n return;\n } else if (range.start.column < range.end.column) {\n var text = session.getTextRange(range);\n if (!/^\\s+$/.test(text)) {\n var rows = this.$getSelectedRows();\n session.indentRows(rows.first, rows.last, \"\\t\");\n return;\n }\n }\n \n var line = session.getLine(range.start.row);\n var position = range.start;\n var size = session.getTabSize();\n var column = session.documentToScreenColumn(position.row, position.column);\n\n if (this.session.getUseSoftTabs()) {\n var count = (size - column % size);\n var indentString = lang.stringRepeat(\" \", count);\n } else {\n var count = column % size;\n while (line[range.start.column - 1] == \" \" && count) {\n range.start.column--;\n count--;\n }\n this.selection.setSelectionRange(range);\n indentString = \"\\t\";\n }\n return this.insert(indentString);\n };\n this.blockIndent = function() {\n var rows = this.$getSelectedRows();\n this.session.indentRows(rows.first, rows.last, \"\\t\");\n };\n this.blockOutdent = function() {\n var selection = this.session.getSelection();\n this.session.outdentRows(selection.getRange());\n };\n this.sortLines = function() {\n var rows = this.$getSelectedRows();\n var session = this.session;\n\n var lines = [];\n for (var i = rows.first; i <= rows.last; i++)\n lines.push(session.getLine(i));\n\n lines.sort(function(a, b) {\n if (a.toLowerCase() < b.toLowerCase()) return -1;\n if (a.toLowerCase() > b.toLowerCase()) return 1;\n return 0;\n });\n\n var deleteRange = new Range(0, 0, 0, 0);\n for (var i = rows.first; i <= rows.last; i++) {\n var line = session.getLine(i);\n deleteRange.start.row = i;\n deleteRange.end.row = i;\n deleteRange.end.column = line.length;\n session.replace(deleteRange, lines[i-rows.first]);\n }\n };\n this.toggleCommentLines = function() {\n var state = this.session.getState(this.getCursorPosition().row);\n var rows = this.$getSelectedRows();\n this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);\n };\n\n this.toggleBlockComment = function() {\n var cursor = this.getCursorPosition();\n var state = this.session.getState(cursor.row);\n var range = this.getSelectionRange();\n this.session.getMode().toggleBlockComment(state, this.session, range, cursor);\n };\n this.getNumberAt = function(row, column) {\n var _numberRx = /[\\-]?[0-9]+(?:\\.[0-9]+)?/g;\n _numberRx.lastIndex = 0;\n\n var s = this.session.getLine(row);\n while (_numberRx.lastIndex < column) {\n var m = _numberRx.exec(s);\n if(m.index <= column && m.index+m[0].length >= column){\n var number = {\n value: m[0],\n start: m.index,\n end: m.index+m[0].length\n };\n return number;\n }\n }\n return null;\n };\n this.modifyNumber = function(amount) {\n var row = this.selection.getCursor().row;\n var column = this.selection.getCursor().column;\n var charRange = new Range(row, column-1, row, column);\n\n var c = this.session.getTextRange(charRange);\n if (!isNaN(parseFloat(c)) && isFinite(c)) {\n var nr = this.getNumberAt(row, column);\n if (nr) {\n var fp = nr.value.indexOf(\".\") >= 0 ? nr.start + nr.value.indexOf(\".\") + 1 : nr.end;\n var decimals = nr.start + nr.value.length - fp;\n\n var t = parseFloat(nr.value);\n t *= Math.pow(10, decimals);\n\n\n if(fp !== nr.end && column < fp){\n amount *= Math.pow(10, nr.end - column - 1);\n } else {\n amount *= Math.pow(10, nr.end - column);\n }\n\n t += amount;\n t /= Math.pow(10, decimals);\n var nnr = t.toFixed(decimals);\n var replaceRange = new Range(row, nr.start, row, nr.end);\n this.session.replace(replaceRange, nnr);\n this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));\n\n }\n } else {\n this.toggleWord();\n }\n };\n\n this.$toggleWordPairs = [\n [\"first\", \"last\"],\n [\"true\", \"false\"],\n [\"yes\", \"no\"],\n [\"width\", \"height\"],\n [\"top\", \"bottom\"],\n [\"right\", \"left\"],\n [\"on\", \"off\"],\n [\"x\", \"y\"],\n [\"get\", \"set\"],\n [\"max\", \"min\"],\n [\"horizontal\", \"vertical\"],\n [\"show\", \"hide\"],\n [\"add\", \"remove\"],\n [\"up\", \"down\"],\n [\"before\", \"after\"],\n [\"even\", \"odd\"],\n [\"in\", \"out\"],\n [\"inside\", \"outside\"],\n [\"next\", \"previous\"],\n [\"increase\", \"decrease\"],\n [\"attach\", \"detach\"],\n [\"&&\", \"||\"],\n [\"==\", \"!=\"]\n ];\n\n this.toggleWord = function () {\n var row = this.selection.getCursor().row;\n var column = this.selection.getCursor().column;\n this.selection.selectWord();\n var currentState = this.getSelectedText();\n var currWordStart = this.selection.getWordRange().start.column;\n var wordParts = currentState.replace(/([a-z]+|[A-Z]+)(?=[A-Z_]|$)/g, '$1 ').split(/\\s/);\n var delta = column - currWordStart - 1;\n if (delta < 0) delta = 0;\n var curLength = 0, itLength = 0;\n var that = this;\n if (currentState.match(/[A-Za-z0-9_]+/)) {\n wordParts.forEach(function (item, i) {\n itLength = curLength + item.length;\n if (delta >= curLength && delta <= itLength) {\n currentState = item;\n that.selection.clearSelection();\n that.moveCursorTo(row, curLength + currWordStart);\n that.selection.selectTo(row, itLength + currWordStart);\n }\n curLength = itLength;\n });\n }\n\n var wordPairs = this.$toggleWordPairs;\n var reg;\n for (var i = 0; i < wordPairs.length; i++) {\n var item = wordPairs[i];\n for (var j = 0; j <= 1; j++) {\n var negate = +!j;\n var firstCondition = currentState.match(new RegExp('^\\\\s?_?(' + lang.escapeRegExp(item[j]) + ')\\\\s?$', 'i'));\n if (firstCondition) {\n var secondCondition = currentState.match(new RegExp('([_]|^|\\\\s)(' + lang.escapeRegExp(firstCondition[1]) + ')($|\\\\s)', 'g'));\n if (secondCondition) {\n reg = currentState.replace(new RegExp(lang.escapeRegExp(item[j]), 'i'), function (result) {\n var res = item[negate];\n if (result.toUpperCase() == result) {\n res = res.toUpperCase();\n } else if (result.charAt(0).toUpperCase() == result.charAt(0)) {\n res = res.substr(0, 0) + item[negate].charAt(0).toUpperCase() + res.substr(1);\n }\n return res;\n });\n this.insert(reg);\n reg = \"\";\n }\n }\n }\n }\n };\n this.removeLines = function() {\n var rows = this.$getSelectedRows();\n this.session.removeFullLines(rows.first, rows.last);\n this.clearSelection();\n };\n\n this.duplicateSelection = function() {\n var sel = this.selection;\n var doc = this.session;\n var range = sel.getRange();\n var reverse = sel.isBackwards();\n if (range.isEmpty()) {\n var row = range.start.row;\n doc.duplicateLines(row, row);\n } else {\n var point = reverse ? range.start : range.end;\n var endPoint = doc.insert(point, doc.getTextRange(range), false);\n range.start = point;\n range.end = endPoint;\n\n sel.setSelectionRange(range, reverse);\n }\n };\n this.moveLinesDown = function() {\n this.$moveLines(1, false);\n };\n this.moveLinesUp = function() {\n this.$moveLines(-1, false);\n };\n this.moveText = function(range, toPosition, copy) {\n return this.session.moveText(range, toPosition, copy);\n };\n this.copyLinesUp = function() {\n this.$moveLines(-1, true);\n };\n this.copyLinesDown = function() {\n this.$moveLines(1, true);\n };\n this.$moveLines = function(dir, copy) {\n var rows, moved;\n var selection = this.selection;\n if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {\n var range = selection.toOrientedRange();\n rows = this.$getSelectedRows(range);\n moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir);\n if (copy && dir == -1) moved = 0;\n range.moveBy(moved, 0);\n selection.fromOrientedRange(range);\n } else {\n var ranges = selection.rangeList.ranges;\n selection.rangeList.detach(this.session);\n this.inVirtualSelectionMode = true;\n \n var diff = 0;\n var totalDiff = 0;\n var l = ranges.length;\n for (var i = 0; i < l; i++) {\n var rangeIndex = i;\n ranges[i].moveBy(diff, 0);\n rows = this.$getSelectedRows(ranges[i]);\n var first = rows.first;\n var last = rows.last;\n while (++i < l) {\n if (totalDiff) ranges[i].moveBy(totalDiff, 0);\n var subRows = this.$getSelectedRows(ranges[i]);\n if (copy && subRows.first != last)\n break;\n else if (!copy && subRows.first > last + 1)\n break;\n last = subRows.last;\n }\n i--;\n diff = this.session.$moveLines(first, last, copy ? 0 : dir);\n if (copy && dir == -1) rangeIndex = i + 1;\n while (rangeIndex <= i) {\n ranges[rangeIndex].moveBy(diff, 0);\n rangeIndex++;\n }\n if (!copy) diff = 0;\n totalDiff += diff;\n }\n \n selection.fromOrientedRange(selection.ranges[0]);\n selection.rangeList.attach(this.session);\n this.inVirtualSelectionMode = false;\n }\n };\n this.$getSelectedRows = function(range) {\n range = (range || this.getSelectionRange()).collapseRows();\n\n return {\n first: this.session.getRowFoldStart(range.start.row),\n last: this.session.getRowFoldEnd(range.end.row)\n };\n };\n\n this.onCompositionStart = function(compositionState) {\n this.renderer.showComposition(compositionState);\n };\n\n this.onCompositionUpdate = function(text) {\n this.renderer.setCompositionText(text);\n };\n\n this.onCompositionEnd = function() {\n this.renderer.hideComposition();\n };\n this.getFirstVisibleRow = function() {\n return this.renderer.getFirstVisibleRow();\n };\n this.getLastVisibleRow = function() {\n return this.renderer.getLastVisibleRow();\n };\n this.isRowVisible = function(row) {\n return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\n };\n this.isRowFullyVisible = function(row) {\n return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\n };\n this.$getVisibleRowCount = function() {\n return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\n };\n\n this.$moveByPage = function(dir, select) {\n var renderer = this.renderer;\n var config = this.renderer.layerConfig;\n var rows = dir * Math.floor(config.height / config.lineHeight);\n\n if (select === true) {\n this.selection.$moveSelection(function(){\n this.moveCursorBy(rows, 0);\n });\n } else if (select === false) {\n this.selection.moveCursorBy(rows, 0);\n this.selection.clearSelection();\n }\n\n var scrollTop = renderer.scrollTop;\n\n renderer.scrollBy(0, rows * config.lineHeight);\n if (select != null)\n renderer.scrollCursorIntoView(null, 0.5);\n\n renderer.animateScrolling(scrollTop);\n };\n this.selectPageDown = function() {\n this.$moveByPage(1, true);\n };\n this.selectPageUp = function() {\n this.$moveByPage(-1, true);\n };\n this.gotoPageDown = function() {\n this.$moveByPage(1, false);\n };\n this.gotoPageUp = function() {\n this.$moveByPage(-1, false);\n };\n this.scrollPageDown = function() {\n this.$moveByPage(1);\n };\n this.scrollPageUp = function() {\n this.$moveByPage(-1);\n };\n this.scrollToRow = function(row) {\n this.renderer.scrollToRow(row);\n };\n this.scrollToLine = function(line, center, animate, callback) {\n this.renderer.scrollToLine(line, center, animate, callback);\n };\n this.centerSelection = function() {\n var range = this.getSelectionRange();\n var pos = {\n row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\n column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\n };\n this.renderer.alignCursor(pos, 0.5);\n };\n this.getCursorPosition = function() {\n return this.selection.getCursor();\n };\n this.getCursorPositionScreen = function() {\n return this.session.documentToScreenPosition(this.getCursorPosition());\n };\n this.getSelectionRange = function() {\n return this.selection.getRange();\n };\n this.selectAll = function() {\n this.selection.selectAll();\n };\n this.clearSelection = function() {\n this.selection.clearSelection();\n };\n this.moveCursorTo = function(row, column) {\n this.selection.moveCursorTo(row, column);\n };\n this.moveCursorToPosition = function(pos) {\n this.selection.moveCursorToPosition(pos);\n };\n this.jumpToMatching = function(select, expand) {\n var cursor = this.getCursorPosition();\n var iterator = new TokenIterator(this.session, cursor.row, cursor.column);\n var prevToken = iterator.getCurrentToken();\n var token = prevToken || iterator.stepForward();\n\n if (!token) return;\n var matchType;\n var found = false;\n var depth = {};\n var i = cursor.column - token.start;\n var bracketType;\n var brackets = {\n \")\": \"(\",\n \"(\": \"(\",\n \"]\": \"[\",\n \"[\": \"[\",\n \"{\": \"{\",\n \"}\": \"{\"\n };\n \n do {\n if (token.value.match(/[{}()\\[\\]]/g)) {\n for (; i < token.value.length && !found; i++) {\n if (!brackets[token.value[i]]) {\n continue;\n }\n\n bracketType = brackets[token.value[i]] + '.' + token.type.replace(\"rparen\", \"lparen\");\n\n if (isNaN(depth[bracketType])) {\n depth[bracketType] = 0;\n }\n\n switch (token.value[i]) {\n case '(':\n case '[':\n case '{':\n depth[bracketType]++;\n break;\n case ')':\n case ']':\n case '}':\n depth[bracketType]--;\n\n if (depth[bracketType] === -1) {\n matchType = 'bracket';\n found = true;\n }\n break;\n }\n }\n }\n else if (token.type.indexOf('tag-name') !== -1) {\n if (isNaN(depth[token.value])) {\n depth[token.value] = 0;\n }\n \n if (prevToken.value === '<') {\n depth[token.value]++;\n }\n else if (prevToken.value === '= 0; --i) {\n if(this.$tryReplace(ranges[i], replacement)) {\n replaced++;\n }\n }\n\n this.selection.setSelectionRange(selection);\n\n return replaced;\n };\n\n this.$tryReplace = function(range, replacement) {\n var input = this.session.getTextRange(range);\n replacement = this.$search.replace(input, replacement);\n if (replacement !== null) {\n range.end = this.session.replace(range, replacement);\n return range;\n } else {\n return null;\n }\n };\n this.getLastSearchOptions = function() {\n return this.$search.getOptions();\n };\n this.find = function(needle, options, animate) {\n if (!options)\n options = {};\n\n if (typeof needle == \"string\" || needle instanceof RegExp)\n options.needle = needle;\n else if (typeof needle == \"object\")\n oop.mixin(options, needle);\n\n var range = this.selection.getRange();\n if (options.needle == null) {\n needle = this.session.getTextRange(range)\n || this.$search.$options.needle;\n if (!needle) {\n range = this.session.getWordRange(range.start.row, range.start.column);\n needle = this.session.getTextRange(range);\n }\n this.$search.set({needle: needle});\n }\n\n this.$search.set(options);\n if (!options.start)\n this.$search.set({start: range});\n\n var newRange = this.$search.find(this.session);\n if (options.preventScroll)\n return newRange;\n if (newRange) {\n this.revealRange(newRange, animate);\n return newRange;\n }\n if (options.backwards)\n range.start = range.end;\n else\n range.end = range.start;\n this.selection.setRange(range);\n };\n this.findNext = function(options, animate) {\n this.find({skipCurrent: true, backwards: false}, options, animate);\n };\n this.findPrevious = function(options, animate) {\n this.find(options, {skipCurrent: true, backwards: true}, animate);\n };\n\n this.revealRange = function(range, animate) {\n this.session.unfold(range);\n this.selection.setSelectionRange(range);\n\n var scrollTop = this.renderer.scrollTop;\n this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\n if (animate !== false)\n this.renderer.animateScrolling(scrollTop);\n };\n this.undo = function() {\n this.session.getUndoManager().undo(this.session);\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.redo = function() {\n this.session.getUndoManager().redo(this.session);\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.destroy = function() {\n if (this.$toDestroy) {\n this.$toDestroy.forEach(function(el) {\n el.destroy();\n });\n this.$toDestroy = null;\n }\n if (this.$mouseHandler)\n this.$mouseHandler.destroy();\n this.renderer.destroy();\n this._signal(\"destroy\", this);\n if (this.session)\n this.session.destroy();\n if (this._$emitInputEvent)\n this._$emitInputEvent.cancel();\n this.removeAllListeners();\n };\n this.setAutoScrollEditorIntoView = function(enable) {\n if (!enable)\n return;\n var rect;\n var self = this;\n var shouldScroll = false;\n if (!this.$scrollAnchor)\n this.$scrollAnchor = document.createElement(\"div\");\n var scrollAnchor = this.$scrollAnchor;\n scrollAnchor.style.cssText = \"position:absolute\";\n this.container.insertBefore(scrollAnchor, this.container.firstChild);\n var onChangeSelection = this.on(\"changeSelection\", function() {\n shouldScroll = true;\n });\n var onBeforeRender = this.renderer.on(\"beforeRender\", function() {\n if (shouldScroll)\n rect = self.renderer.container.getBoundingClientRect();\n });\n var onAfterRender = this.renderer.on(\"afterRender\", function() {\n if (shouldScroll && rect && (self.isFocused()\n || self.searchBox && self.searchBox.isFocused())\n ) {\n var renderer = self.renderer;\n var pos = renderer.$cursorLayer.$pixelPos;\n var config = renderer.layerConfig;\n var top = pos.top - config.offset;\n if (pos.top >= 0 && top + rect.top < 0) {\n shouldScroll = true;\n } else if (pos.top < config.height &&\n pos.top + rect.top + config.lineHeight > window.innerHeight) {\n shouldScroll = false;\n } else {\n shouldScroll = null;\n }\n if (shouldScroll != null) {\n scrollAnchor.style.top = top + \"px\";\n scrollAnchor.style.left = pos.left + \"px\";\n scrollAnchor.style.height = config.lineHeight + \"px\";\n scrollAnchor.scrollIntoView(shouldScroll);\n }\n shouldScroll = rect = null;\n }\n });\n this.setAutoScrollEditorIntoView = function(enable) {\n if (enable)\n return;\n delete this.setAutoScrollEditorIntoView;\n this.off(\"changeSelection\", onChangeSelection);\n this.renderer.off(\"afterRender\", onAfterRender);\n this.renderer.off(\"beforeRender\", onBeforeRender);\n };\n };\n\n\n this.$resetCursorStyle = function() {\n var style = this.$cursorStyle || \"ace\";\n var cursorLayer = this.renderer.$cursorLayer;\n if (!cursorLayer)\n return;\n cursorLayer.setSmoothBlinking(/smooth/.test(style));\n cursorLayer.isBlinking = !this.$readOnly && style != \"wide\";\n dom.setCssClass(cursorLayer.element, \"ace_slim-cursors\", /slim/.test(style));\n };\n this.prompt = function(message, options, callback) {\n var editor = this;\n config.loadModule(\"./ext/prompt\", function (module) {\n module.prompt(editor, message, options, callback);\n });\n };\n\n}).call(Editor.prototype);\n\n\n\nconfig.defineOptions(Editor.prototype, \"editor\", {\n selectionStyle: {\n set: function(style) {\n this.onSelectionChange();\n this._signal(\"changeSelectionStyle\", {data: style});\n },\n initialValue: \"line\"\n },\n highlightActiveLine: {\n set: function() {this.$updateHighlightActiveLine();},\n initialValue: true\n },\n highlightSelectedWord: {\n set: function(shouldHighlight) {this.$onSelectionChange();},\n initialValue: true\n },\n readOnly: {\n set: function(readOnly) {\n this.textInput.setReadOnly(readOnly);\n this.$resetCursorStyle(); \n },\n initialValue: false\n },\n copyWithEmptySelection: {\n set: function(value) {\n this.textInput.setCopyWithEmptySelection(value);\n },\n initialValue: false\n },\n cursorStyle: {\n set: function(val) { this.$resetCursorStyle(); },\n values: [\"ace\", \"slim\", \"smooth\", \"wide\"],\n initialValue: \"ace\"\n },\n mergeUndoDeltas: {\n values: [false, true, \"always\"],\n initialValue: true\n },\n behavioursEnabled: {initialValue: true},\n wrapBehavioursEnabled: {initialValue: true},\n enableAutoIndent: {initialValue: true},\n autoScrollEditorIntoView: {\n set: function(val) {this.setAutoScrollEditorIntoView(val);}\n },\n keyboardHandler: {\n set: function(val) { this.setKeyboardHandler(val); },\n get: function() { return this.$keybindingId; },\n handlesSet: true\n },\n value: {\n set: function(val) { this.session.setValue(val); },\n get: function() { return this.getValue(); },\n handlesSet: true,\n hidden: true\n },\n session: {\n set: function(val) { this.setSession(val); },\n get: function() { return this.session; },\n handlesSet: true,\n hidden: true\n },\n \n showLineNumbers: {\n set: function(show) {\n this.renderer.$gutterLayer.setShowLineNumbers(show);\n this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER);\n if (show && this.$relativeLineNumbers)\n relativeNumberRenderer.attach(this);\n else\n relativeNumberRenderer.detach(this);\n },\n initialValue: true\n },\n relativeLineNumbers: {\n set: function(value) {\n if (this.$showLineNumbers && value)\n relativeNumberRenderer.attach(this);\n else\n relativeNumberRenderer.detach(this);\n }\n },\n placeholder: {\n set: function(message) {\n if (!this.$updatePlaceholder) {\n this.$updatePlaceholder = function() {\n var value = this.session && (this.renderer.$composition || this.getValue());\n if (value && this.renderer.placeholderNode) {\n this.renderer.off(\"afterRender\", this.$updatePlaceholder);\n dom.removeCssClass(this.container, \"ace_hasPlaceholder\");\n this.renderer.placeholderNode.remove();\n this.renderer.placeholderNode = null;\n } else if (!value && !this.renderer.placeholderNode) {\n this.renderer.on(\"afterRender\", this.$updatePlaceholder);\n dom.addCssClass(this.container, \"ace_hasPlaceholder\");\n var el = dom.createElement(\"div\");\n el.className = \"ace_placeholder\";\n el.textContent = this.$placeholder || \"\";\n this.renderer.placeholderNode = el;\n this.renderer.content.appendChild(this.renderer.placeholderNode);\n } else if (!value && this.renderer.placeholderNode) {\n this.renderer.placeholderNode.textContent = this.$placeholder || \"\";\n }\n }.bind(this);\n this.on(\"input\", this.$updatePlaceholder);\n }\n this.$updatePlaceholder();\n }\n },\n\n hScrollBarAlwaysVisible: \"renderer\",\n vScrollBarAlwaysVisible: \"renderer\",\n highlightGutterLine: \"renderer\",\n animatedScroll: \"renderer\",\n showInvisibles: \"renderer\",\n showPrintMargin: \"renderer\",\n printMarginColumn: \"renderer\",\n printMargin: \"renderer\",\n fadeFoldWidgets: \"renderer\",\n showFoldWidgets: \"renderer\",\n displayIndentGuides: \"renderer\",\n showGutter: \"renderer\",\n fontSize: \"renderer\",\n fontFamily: \"renderer\",\n maxLines: \"renderer\",\n minLines: \"renderer\",\n scrollPastEnd: \"renderer\",\n fixedWidthGutter: \"renderer\",\n theme: \"renderer\",\n hasCssTransforms: \"renderer\",\n maxPixelHeight: \"renderer\",\n useTextareaForIME: \"renderer\",\n\n scrollSpeed: \"$mouseHandler\",\n dragDelay: \"$mouseHandler\",\n dragEnabled: \"$mouseHandler\",\n focusTimeout: \"$mouseHandler\",\n tooltipFollowsMouse: \"$mouseHandler\",\n\n firstLineNumber: \"session\",\n overwrite: \"session\",\n newLineMode: \"session\",\n useWorker: \"session\",\n useSoftTabs: \"session\",\n navigateWithinSoftTabs: \"session\",\n tabSize: \"session\",\n wrap: \"session\",\n indentedSoftWrap: \"session\",\n foldStyle: \"session\",\n mode: \"session\"\n});\n\n\nvar relativeNumberRenderer = {\n getText: function(session, row) {\n return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9 ? \"\\xb7\" : \"\"))) + \"\";\n },\n getWidth: function(session, lastLineNumber, config) {\n return Math.max(\n lastLineNumber.toString().length,\n (config.lastRow + 1).toString().length,\n 2\n ) * config.characterWidth;\n },\n update: function(e, editor) {\n editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER);\n },\n attach: function(editor) {\n editor.renderer.$gutterLayer.$renderer = this;\n editor.on(\"changeSelection\", this.update);\n this.update(null, editor);\n },\n detach: function(editor) {\n if (editor.renderer.$gutterLayer.$renderer == this)\n editor.renderer.$gutterLayer.$renderer = null;\n editor.off(\"changeSelection\", this.update);\n this.update(null, editor);\n }\n};\n\nexports.Editor = Editor;\n});\n\nace.define(\"ace/undomanager\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar UndoManager = function() {\n this.$maxRev = 0;\n this.$fromUndo = false;\n this.reset();\n};\n\n(function() {\n \n this.addSession = function(session) {\n this.$session = session;\n };\n this.add = function(delta, allowMerge, session) {\n if (this.$fromUndo) return;\n if (delta == this.$lastDelta) return;\n if (!this.$keepRedoStack) this.$redoStack.length = 0;\n if (allowMerge === false || !this.lastDeltas) {\n this.lastDeltas = [];\n this.$undoStack.push(this.lastDeltas);\n delta.id = this.$rev = ++this.$maxRev;\n }\n if (delta.action == \"remove\" || delta.action == \"insert\")\n this.$lastDelta = delta;\n this.lastDeltas.push(delta);\n };\n \n this.addSelection = function(selection, rev) {\n this.selections.push({\n value: selection,\n rev: rev || this.$rev\n });\n };\n \n this.startNewGroup = function() {\n this.lastDeltas = null;\n return this.$rev;\n };\n \n this.markIgnored = function(from, to) {\n if (to == null) to = this.$rev + 1;\n var stack = this.$undoStack;\n for (var i = stack.length; i--;) {\n var delta = stack[i][0];\n if (delta.id <= from)\n break;\n if (delta.id < to)\n delta.ignore = true;\n }\n this.lastDeltas = null;\n };\n \n this.getSelection = function(rev, after) {\n var stack = this.selections;\n for (var i = stack.length; i--;) {\n var selection = stack[i];\n if (selection.rev < rev) {\n if (after)\n selection = stack[i + 1];\n return selection;\n }\n }\n };\n \n this.getRevision = function() {\n return this.$rev;\n };\n \n this.getDeltas = function(from, to) {\n if (to == null) to = this.$rev + 1;\n var stack = this.$undoStack;\n var end = null, start = 0;\n for (var i = stack.length; i--;) {\n var delta = stack[i][0];\n if (delta.id < to && !end)\n end = i+1;\n if (delta.id <= from) {\n start = i + 1;\n break;\n }\n }\n return stack.slice(start, end);\n };\n \n this.getChangedRanges = function(from, to) {\n if (to == null) to = this.$rev + 1;\n \n };\n \n this.getChangedLines = function(from, to) {\n if (to == null) to = this.$rev + 1;\n \n };\n this.undo = function(session, dontSelect) {\n this.lastDeltas = null;\n var stack = this.$undoStack;\n \n if (!rearrangeUndoStack(stack, stack.length))\n return;\n \n if (!session)\n session = this.$session;\n \n if (this.$redoStackBaseRev !== this.$rev && this.$redoStack.length)\n this.$redoStack = [];\n \n this.$fromUndo = true;\n \n var deltaSet = stack.pop();\n var undoSelectionRange = null;\n if (deltaSet) {\n undoSelectionRange = session.undoChanges(deltaSet, dontSelect);\n this.$redoStack.push(deltaSet);\n this.$syncRev();\n }\n \n this.$fromUndo = false;\n\n return undoSelectionRange;\n };\n this.redo = function(session, dontSelect) {\n this.lastDeltas = null;\n \n if (!session)\n session = this.$session;\n \n this.$fromUndo = true;\n if (this.$redoStackBaseRev != this.$rev) {\n var diff = this.getDeltas(this.$redoStackBaseRev, this.$rev + 1);\n rebaseRedoStack(this.$redoStack, diff);\n this.$redoStackBaseRev = this.$rev;\n this.$redoStack.forEach(function(x) {\n x[0].id = ++this.$maxRev;\n }, this);\n }\n var deltaSet = this.$redoStack.pop();\n var redoSelectionRange = null;\n \n if (deltaSet) {\n redoSelectionRange = session.redoChanges(deltaSet, dontSelect);\n this.$undoStack.push(deltaSet);\n this.$syncRev();\n }\n this.$fromUndo = false;\n \n return redoSelectionRange;\n };\n \n this.$syncRev = function() {\n var stack = this.$undoStack;\n var nextDelta = stack[stack.length - 1];\n var id = nextDelta && nextDelta[0].id || 0;\n this.$redoStackBaseRev = id;\n this.$rev = id;\n };\n this.reset = function() {\n this.lastDeltas = null;\n this.$lastDelta = null;\n this.$undoStack = [];\n this.$redoStack = [];\n this.$rev = 0;\n this.mark = 0;\n this.$redoStackBaseRev = this.$rev;\n this.selections = [];\n };\n this.canUndo = function() {\n return this.$undoStack.length > 0;\n };\n this.canRedo = function() {\n return this.$redoStack.length > 0;\n };\n this.bookmark = function(rev) {\n if (rev == undefined)\n rev = this.$rev;\n this.mark = rev;\n };\n this.isAtBookmark = function() {\n return this.$rev === this.mark;\n };\n \n this.toJSON = function() {\n \n };\n \n this.fromJSON = function() {\n \n };\n \n this.hasUndo = this.canUndo;\n this.hasRedo = this.canRedo;\n this.isClean = this.isAtBookmark;\n this.markClean = this.bookmark;\n \n this.$prettyPrint = function(delta) {\n if (delta) return stringifyDelta(delta);\n return stringifyDelta(this.$undoStack) + \"\\n---\\n\" + stringifyDelta(this.$redoStack);\n };\n}).call(UndoManager.prototype);\n\nfunction rearrangeUndoStack(stack, pos) {\n for (var i = pos; i--; ) {\n var deltaSet = stack[i];\n if (deltaSet && !deltaSet[0].ignore) {\n while(i < pos - 1) {\n var swapped = swapGroups(stack[i], stack[i + 1]);\n stack[i] = swapped[0];\n stack[i + 1] = swapped[1];\n i++;\n }\n return true;\n }\n }\n}\n\nvar Range = require(\"./range\").Range;\nvar cmp = Range.comparePoints;\nvar comparePoints = Range.comparePoints;\n\nfunction $updateMarkers(delta) {\n var isInsert = delta.action == \"insert\";\n var start = delta.start;\n var end = delta.end;\n var rowShift = (end.row - start.row) * (isInsert ? 1 : -1);\n var colShift = (end.column - start.column) * (isInsert ? 1 : -1);\n if (isInsert) end = start;\n\n for (var i in this.marks) {\n var point = this.marks[i];\n var cmp = comparePoints(point, start);\n if (cmp < 0) {\n continue; // delta starts after the range\n }\n if (cmp === 0) {\n if (isInsert) {\n if (point.bias == 1) {\n cmp = 1;\n }\n else {\n point.bias == -1;\n continue;\n }\n }\n }\n var cmp2 = isInsert ? cmp : comparePoints(point, end);\n if (cmp2 > 0) {\n point.row += rowShift;\n point.column += point.row == end.row ? colShift : 0;\n continue;\n }\n if (!isInsert && cmp2 <= 0) {\n point.row = start.row;\n point.column = start.column;\n if (cmp2 === 0)\n point.bias = 1;\n }\n }\n}\n\n\n\nfunction clonePos(pos) {\n return {row: pos.row,column: pos.column};\n}\nfunction cloneDelta(d) {\n return {\n start: clonePos(d.start),\n end: clonePos(d.end),\n action: d.action,\n lines: d.lines.slice()\n };\n}\nfunction stringifyDelta(d) {\n d = d || this;\n if (Array.isArray(d)) {\n return d.map(stringifyDelta).join(\"\\n\");\n }\n var type = \"\";\n if (d.action) {\n type = d.action == \"insert\" ? \"+\" : \"-\";\n type += \"[\" + d.lines + \"]\";\n } else if (d.value) {\n if (Array.isArray(d.value)) {\n type = d.value.map(stringifyRange).join(\"\\n\");\n } else {\n type = stringifyRange(d.value);\n }\n }\n if (d.start) {\n type += stringifyRange(d);\n }\n if (d.id || d.rev) {\n type += \"\\t(\" + (d.id || d.rev) + \")\";\n }\n return type;\n}\nfunction stringifyRange(r) {\n return r.start.row + \":\" + r.start.column \n + \"=>\" + r.end.row + \":\" + r.end.column;\n}\n\nfunction swap(d1, d2) {\n var i1 = d1.action == \"insert\";\n var i2 = d2.action == \"insert\";\n \n if (i1 && i2) {\n if (cmp(d2.start, d1.end) >= 0) {\n shift(d2, d1, -1);\n } else if (cmp(d2.start, d1.start) <= 0) {\n shift(d1, d2, +1);\n } else {\n return null;\n }\n } else if (i1 && !i2) {\n if (cmp(d2.start, d1.end) >= 0) {\n shift(d2, d1, -1);\n } else if (cmp(d2.end, d1.start) <= 0) {\n shift(d1, d2, -1);\n } else {\n return null;\n }\n } else if (!i1 && i2) {\n if (cmp(d2.start, d1.start) >= 0) {\n shift(d2, d1, +1);\n } else if (cmp(d2.start, d1.start) <= 0) {\n shift(d1, d2, +1);\n } else {\n return null;\n }\n } else if (!i1 && !i2) {\n if (cmp(d2.start, d1.start) >= 0) {\n shift(d2, d1, +1);\n } else if (cmp(d2.end, d1.start) <= 0) {\n shift(d1, d2, -1);\n } else {\n return null;\n }\n }\n return [d2, d1];\n}\nfunction swapGroups(ds1, ds2) {\n for (var i = ds1.length; i--; ) {\n for (var j = 0; j < ds2.length; j++) {\n if (!swap(ds1[i], ds2[j])) {\n while (i < ds1.length) {\n while (j--) {\n swap(ds2[j], ds1[i]);\n }\n j = ds2.length;\n i++;\n } \n return [ds1, ds2];\n }\n }\n }\n ds1.selectionBefore = ds2.selectionBefore = \n ds1.selectionAfter = ds2.selectionAfter = null;\n return [ds2, ds1];\n}\nfunction xform(d1, c1) {\n var i1 = d1.action == \"insert\";\n var i2 = c1.action == \"insert\";\n \n if (i1 && i2) {\n if (cmp(d1.start, c1.start) < 0) {\n shift(c1, d1, 1);\n } else {\n shift(d1, c1, 1);\n }\n } else if (i1 && !i2) {\n if (cmp(d1.start, c1.end) >= 0) {\n shift(d1, c1, -1);\n } else if (cmp(d1.start, c1.start) <= 0) {\n shift(c1, d1, +1);\n } else {\n shift(d1, Range.fromPoints(c1.start, d1.start), -1);\n shift(c1, d1, +1);\n }\n } else if (!i1 && i2) {\n if (cmp(c1.start, d1.end) >= 0) {\n shift(c1, d1, -1);\n } else if (cmp(c1.start, d1.start) <= 0) {\n shift(d1, c1, +1);\n } else {\n shift(c1, Range.fromPoints(d1.start, c1.start), -1);\n shift(d1, c1, +1);\n }\n } else if (!i1 && !i2) {\n if (cmp(c1.start, d1.end) >= 0) {\n shift(c1, d1, -1);\n } else if (cmp(c1.end, d1.start) <= 0) {\n shift(d1, c1, -1);\n } else {\n var before, after;\n if (cmp(d1.start, c1.start) < 0) {\n before = d1;\n d1 = splitDelta(d1, c1.start);\n }\n if (cmp(d1.end, c1.end) > 0) {\n after = splitDelta(d1, c1.end);\n }\n\n shiftPos(c1.end, d1.start, d1.end, -1);\n if (after && !before) {\n d1.lines = after.lines;\n d1.start = after.start;\n d1.end = after.end;\n after = d1;\n }\n\n return [c1, before, after].filter(Boolean);\n }\n }\n return [c1, d1];\n}\n \nfunction shift(d1, d2, dir) {\n shiftPos(d1.start, d2.start, d2.end, dir);\n shiftPos(d1.end, d2.start, d2.end, dir);\n}\nfunction shiftPos(pos, start, end, dir) {\n if (pos.row == (dir == 1 ? start : end).row) {\n pos.column += dir * (end.column - start.column);\n }\n pos.row += dir * (end.row - start.row);\n}\nfunction splitDelta(c, pos) {\n var lines = c.lines;\n var end = c.end;\n c.end = clonePos(pos); \n var rowsBefore = c.end.row - c.start.row;\n var otherLines = lines.splice(rowsBefore, lines.length);\n \n var col = rowsBefore ? pos.column : pos.column - c.start.column;\n lines.push(otherLines[0].substring(0, col));\n otherLines[0] = otherLines[0].substr(col) ; \n var rest = {\n start: clonePos(pos),\n end: end,\n lines: otherLines,\n action: c.action\n };\n return rest;\n}\n\nfunction moveDeltasByOne(redoStack, d) {\n d = cloneDelta(d);\n for (var j = redoStack.length; j--;) {\n var deltaSet = redoStack[j];\n for (var i = 0; i < deltaSet.length; i++) {\n var x = deltaSet[i];\n var xformed = xform(x, d);\n d = xformed[0];\n if (xformed.length != 2) {\n if (xformed[2]) {\n deltaSet.splice(i + 1, 1, xformed[1], xformed[2]);\n i++;\n } else if (!xformed[1]) {\n deltaSet.splice(i, 1);\n i--;\n }\n }\n }\n if (!deltaSet.length) {\n redoStack.splice(j, 1); \n }\n }\n return redoStack;\n}\nfunction rebaseRedoStack(redoStack, deltaSets) {\n for (var i = 0; i < deltaSets.length; i++) {\n var deltas = deltaSets[i];\n for (var j = 0; j < deltas.length; j++) {\n moveDeltasByOne(redoStack, deltas[j]);\n }\n }\n}\n\nexports.UndoManager = UndoManager;\n\n});\n\nace.define(\"ace/layer/lines\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\n\nvar Lines = function(element, canvasHeight) {\n this.element = element;\n this.canvasHeight = canvasHeight || 500000;\n this.element.style.height = (this.canvasHeight * 2) + \"px\";\n \n this.cells = [];\n this.cellCache = [];\n this.$offsetCoefficient = 0;\n};\n\n(function() {\n \n this.moveContainer = function(config) {\n dom.translate(this.element, 0, -((config.firstRowScreen * config.lineHeight) % this.canvasHeight) - config.offset * this.$offsetCoefficient);\n }; \n \n this.pageChanged = function(oldConfig, newConfig) {\n return (\n Math.floor((oldConfig.firstRowScreen * oldConfig.lineHeight) / this.canvasHeight) !==\n Math.floor((newConfig.firstRowScreen * newConfig.lineHeight) / this.canvasHeight)\n );\n };\n \n this.computeLineTop = function(row, config, session) {\n var screenTop = config.firstRowScreen * config.lineHeight;\n var screenPage = Math.floor(screenTop / this.canvasHeight);\n var lineTop = session.documentToScreenRow(row, 0) * config.lineHeight;\n return lineTop - (screenPage * this.canvasHeight);\n };\n \n this.computeLineHeight = function(row, config, session) {\n return config.lineHeight * session.getRowLineCount(row);\n };\n \n this.getLength = function() {\n return this.cells.length;\n };\n \n this.get = function(index) {\n return this.cells[index];\n };\n \n this.shift = function() {\n this.$cacheCell(this.cells.shift());\n };\n \n this.pop = function() {\n this.$cacheCell(this.cells.pop());\n };\n \n this.push = function(cell) {\n if (Array.isArray(cell)) {\n this.cells.push.apply(this.cells, cell);\n var fragment = dom.createFragment(this.element);\n for (var i=0; i foldStart) {\n row = fold.end.row + 1;\n fold = session.getNextFoldLine(row, fold);\n foldStart = fold ? fold.start.row : Infinity;\n }\n if (row > lastRow) {\n while (this.$lines.getLength() > index + 1)\n this.$lines.pop();\n \n break;\n }\n\n cell = this.$lines.get(++index);\n if (cell) {\n cell.row = row;\n } else {\n cell = this.$lines.createCell(row, config, this.session, onCreateCell);\n this.$lines.push(cell);\n }\n\n this.$renderCell(cell, config, fold, row);\n row++;\n }\n \n this._signal(\"afterRender\");\n this.$updateGutterWidth(config);\n };\n\n this.$updateGutterWidth = function(config) {\n var session = this.session;\n \n var gutterRenderer = session.gutterRenderer || this.$renderer;\n \n var firstLineNumber = session.$firstLineNumber;\n var lastLineText = this.$lines.last() ? this.$lines.last().text : \"\";\n \n if (this.$fixedWidth || session.$useWrapMode)\n lastLineText = session.getLength() + firstLineNumber - 1;\n\n var gutterWidth = gutterRenderer \n ? gutterRenderer.getWidth(session, lastLineText, config)\n : lastLineText.toString().length * config.characterWidth;\n \n var padding = this.$padding || this.$computePadding();\n gutterWidth += padding.left + padding.right;\n if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\n this.gutterWidth = gutterWidth;\n this.element.parentNode.style.width = \n this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n this._signal(\"changeGutterWidth\", gutterWidth);\n }\n };\n \n this.$updateCursorRow = function() {\n if (!this.$highlightGutterLine)\n return;\n \n var position = this.session.selection.getCursor();\n if (this.$cursorRow === position.row)\n return;\n \n this.$cursorRow = position.row;\n };\n \n this.updateLineHighlight = function() {\n if (!this.$highlightGutterLine)\n return;\n var row = this.session.selection.cursor.row;\n this.$cursorRow = row;\n\n if (this.$cursorCell && this.$cursorCell.row == row)\n return;\n if (this.$cursorCell)\n this.$cursorCell.element.className = this.$cursorCell.element.className.replace(\"ace_gutter-active-line \", \"\");\n var cells = this.$lines.cells;\n this.$cursorCell = null;\n for (var i = 0; i < cells.length; i++) {\n var cell = cells[i];\n if (cell.row >= this.$cursorRow) {\n if (cell.row > this.$cursorRow) {\n var fold = this.session.getFoldLine(this.$cursorRow);\n if (i > 0 && fold && fold.start.row == cells[i - 1].row)\n cell = cells[i - 1];\n else\n break;\n }\n cell.element.className = \"ace_gutter-active-line \" + cell.element.className;\n this.$cursorCell = cell;\n break;\n }\n }\n };\n \n this.scrollLines = function(config) {\n var oldConfig = this.config;\n this.config = config;\n \n this.$updateCursorRow();\n if (this.$lines.pageChanged(oldConfig, config))\n return this.update(config);\n \n this.$lines.moveContainer(config);\n\n var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar\n this.session.getLength() - 1);\n var oldLastRow = this.oldLastRow;\n this.oldLastRow = lastRow;\n \n if (!oldConfig || oldLastRow < config.firstRow)\n return this.update(config);\n\n if (lastRow < oldConfig.firstRow)\n return this.update(config);\n\n if (oldConfig.firstRow < config.firstRow)\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n this.$lines.shift();\n\n if (oldLastRow > lastRow)\n for (var row=this.session.getFoldedRowCount(lastRow + 1, oldLastRow); row>0; row--)\n this.$lines.pop();\n\n if (config.firstRow < oldConfig.firstRow) {\n this.$lines.unshift(this.$renderLines(config, config.firstRow, oldConfig.firstRow - 1));\n }\n\n if (lastRow > oldLastRow) {\n this.$lines.push(this.$renderLines(config, oldLastRow + 1, lastRow));\n }\n \n this.updateLineHighlight();\n \n this._signal(\"afterRender\");\n this.$updateGutterWidth(config);\n };\n\n this.$renderLines = function(config, firstRow, lastRow) {\n var fragment = [];\n var row = firstRow;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n if (row > lastRow)\n break;\n\n var cell = this.$lines.createCell(row, config, this.session, onCreateCell);\n this.$renderCell(cell, config, foldLine, row);\n fragment.push(cell);\n\n row++;\n }\n return fragment;\n };\n \n this.$renderCell = function(cell, config, fold, row) {\n var element = cell.element;\n \n var session = this.session;\n \n var textNode = element.childNodes[0];\n var foldWidget = element.childNodes[1];\n\n var firstLineNumber = session.$firstLineNumber;\n \n var breakpoints = session.$breakpoints;\n var decorations = session.$decorations;\n var gutterRenderer = session.gutterRenderer || this.$renderer;\n var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\n var foldStart = fold ? fold.start.row : Number.MAX_VALUE;\n \n var className = \"ace_gutter-cell \";\n if (this.$highlightGutterLine) {\n if (row == this.$cursorRow || (fold && row < this.$cursorRow && row >= foldStart && this.$cursorRow <= fold.end.row)) {\n className += \"ace_gutter-active-line \";\n if (this.$cursorCell != cell) {\n if (this.$cursorCell)\n this.$cursorCell.element.className = this.$cursorCell.element.className.replace(\"ace_gutter-active-line \", \"\");\n this.$cursorCell = cell;\n }\n }\n }\n \n if (breakpoints[row])\n className += breakpoints[row];\n if (decorations[row])\n className += decorations[row];\n if (this.$annotations[row])\n className += this.$annotations[row].className;\n if (element.className != className)\n element.className = className;\n\n if (foldWidgets) {\n var c = foldWidgets[row];\n if (c == null)\n c = foldWidgets[row] = session.getFoldWidget(row);\n }\n\n if (c) {\n var className = \"ace_fold-widget ace_\" + c;\n if (c == \"start\" && row == foldStart && row < fold.end.row)\n className += \" ace_closed\";\n else\n className += \" ace_open\";\n if (foldWidget.className != className)\n foldWidget.className = className;\n\n var foldHeight = config.lineHeight + \"px\";\n dom.setStyle(foldWidget.style, \"height\", foldHeight);\n dom.setStyle(foldWidget.style, \"display\", \"inline-block\");\n } else {\n if (foldWidget) {\n dom.setStyle(foldWidget.style, \"display\", \"none\");\n }\n }\n \n var text = (gutterRenderer\n ? gutterRenderer.getText(session, row)\n : row + firstLineNumber).toString();\n \n if (text !== textNode.data) {\n textNode.data = text;\n }\n \n dom.setStyle(cell.element.style, \"height\", this.$lines.computeLineHeight(row, config, session) + \"px\");\n dom.setStyle(cell.element.style, \"top\", this.$lines.computeLineTop(row, config, session) + \"px\");\n \n cell.text = text;\n return cell;\n };\n\n this.$fixedWidth = false;\n \n this.$highlightGutterLine = true;\n this.$renderer = \"\";\n this.setHighlightGutterLine = function(highlightGutterLine) {\n this.$highlightGutterLine = highlightGutterLine;\n };\n \n this.$showLineNumbers = true;\n this.$renderer = \"\";\n this.setShowLineNumbers = function(show) {\n this.$renderer = !show && {\n getWidth: function() {return 0;},\n getText: function() {return \"\";}\n };\n };\n \n this.getShowLineNumbers = function() {\n return this.$showLineNumbers;\n };\n \n this.$showFoldWidgets = true;\n this.setShowFoldWidgets = function(show) {\n if (show)\n dom.addCssClass(this.element, \"ace_folding-enabled\");\n else\n dom.removeCssClass(this.element, \"ace_folding-enabled\");\n\n this.$showFoldWidgets = show;\n this.$padding = null;\n };\n \n this.getShowFoldWidgets = function() {\n return this.$showFoldWidgets;\n };\n\n this.$computePadding = function() {\n if (!this.element.firstChild)\n return {left: 0, right: 0};\n var style = dom.computedStyle(this.element.firstChild);\n this.$padding = {};\n this.$padding.left = (parseInt(style.borderLeftWidth) || 0)\n + (parseInt(style.paddingLeft) || 0) + 1;\n this.$padding.right = (parseInt(style.borderRightWidth) || 0)\n + (parseInt(style.paddingRight) || 0);\n return this.$padding;\n };\n\n this.getRegion = function(point) {\n var padding = this.$padding || this.$computePadding();\n var rect = this.element.getBoundingClientRect();\n if (point.x < padding.left + rect.left)\n return \"markers\";\n if (this.$showFoldWidgets && point.x > rect.right - padding.right)\n return \"foldWidgets\";\n };\n\n}).call(Gutter.prototype);\n\nfunction onCreateCell(element) {\n var textNode = document.createTextNode('');\n element.appendChild(textNode);\n \n var foldWidget = dom.createElement(\"span\");\n element.appendChild(foldWidget);\n \n return element;\n}\n\nexports.Gutter = Gutter;\n\n});\n\nace.define(\"ace/layer/marker\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\nvar dom = require(\"../lib/dom\");\n\nvar Marker = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_marker-layer\";\n parentEl.appendChild(this.element);\n};\n\n(function() {\n\n this.$padding = 0;\n\n this.setPadding = function(padding) {\n this.$padding = padding;\n };\n this.setSession = function(session) {\n this.session = session;\n };\n \n this.setMarkers = function(markers) {\n this.markers = markers;\n };\n \n this.elt = function(className, css) {\n var x = this.i != -1 && this.element.childNodes[this.i];\n if (!x) {\n x = document.createElement(\"div\");\n this.element.appendChild(x);\n this.i = -1;\n } else {\n this.i++;\n }\n x.style.cssText = css;\n x.className = className;\n };\n\n this.update = function(config) {\n if (!config) return;\n\n this.config = config;\n\n this.i = 0;\n var html;\n for (var key in this.markers) {\n var marker = this.markers[key];\n\n if (!marker.range) {\n marker.update(html, this, this.session, config);\n continue;\n }\n\n var range = marker.range.clipRows(config.firstRow, config.lastRow);\n if (range.isEmpty()) continue;\n\n range = range.toScreenRange(this.session);\n if (marker.renderer) {\n var top = this.$getTop(range.start.row, config);\n var left = this.$padding + range.start.column * config.characterWidth;\n marker.renderer(html, range, left, top, config);\n } else if (marker.type == \"fullLine\") {\n this.drawFullLineMarker(html, range, marker.clazz, config);\n } else if (marker.type == \"screenLine\") {\n this.drawScreenLineMarker(html, range, marker.clazz, config);\n } else if (range.isMultiLine()) {\n if (marker.type == \"text\")\n this.drawTextMarker(html, range, marker.clazz, config);\n else\n this.drawMultiLineMarker(html, range, marker.clazz, config);\n } else {\n this.drawSingleLineMarker(html, range, marker.clazz + \" ace_start\" + \" ace_br15\", config);\n }\n }\n if (this.i !=-1) {\n while (this.i < this.element.childElementCount)\n this.element.removeChild(this.element.lastChild);\n }\n };\n\n this.$getTop = function(row, layerConfig) {\n return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n };\n\n function getBorderClass(tl, tr, br, bl) {\n return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0);\n }\n this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {\n var session = this.session;\n var start = range.start.row;\n var end = range.end.row;\n var row = start;\n var prev = 0; \n var curr = 0;\n var next = session.getScreenLastRowColumn(row);\n var lineRange = new Range(row, range.start.column, row, curr);\n for (; row <= end; row++) {\n lineRange.start.row = lineRange.end.row = row;\n lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row);\n lineRange.end.column = next;\n prev = curr;\n curr = next;\n next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column;\n this.drawSingleLineMarker(stringBuilder, lineRange, \n clazz + (row == start ? \" ace_start\" : \"\") + \" ace_br\"\n + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end),\n layerConfig, row == end ? 0 : 1, extraStyle);\n }\n };\n this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var padding = this.$padding;\n var height = config.lineHeight;\n var top = this.$getTop(range.start.row, config);\n var left = padding + range.start.column * config.characterWidth;\n extraStyle = extraStyle || \"\";\n\n if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\n var range1 = range.clone();\n range1.end.row = range1.start.row;\n range1.end.column = this.session.getLine(range1.start.row).length;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br1 ace_start\", config, null, extraStyle);\n } else {\n this.elt(\n clazz + \" ace_br1 ace_start\",\n \"height:\"+ height+ \"px;\"+ \"right:0;\"+ \"top:\"+top+ \"px;left:\"+ left+ \"px;\" + (extraStyle || \"\")\n );\n }\n if (this.session.$bidiHandler.isBidiRow(range.end.row)) {\n var range1 = range.clone();\n range1.start.row = range1.end.row;\n range1.start.column = 0;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br12\", config, null, extraStyle);\n } else {\n top = this.$getTop(range.end.row, config);\n var width = range.end.column * config.characterWidth;\n\n this.elt(\n clazz + \" ace_br12\",\n \"height:\"+ height+ \"px;\"+\n \"width:\"+ width+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:\"+ padding+ \"px;\"+ (extraStyle || \"\")\n );\n }\n height = (range.end.row - range.start.row - 1) * config.lineHeight;\n if (height <= 0)\n return;\n top = this.$getTop(range.start.row + 1, config);\n \n var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8);\n\n this.elt(\n clazz + (radiusClass ? \" ace_br\" + radiusClass : \"\"),\n \"height:\"+ height+ \"px;\"+\n \"right:0;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:\"+ padding+ \"px;\"+ (extraStyle || \"\")\n );\n };\n this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n if (this.session.$bidiHandler.isBidiRow(range.start.row))\n return this.drawBidiSingleLineMarker(stringBuilder, range, clazz, config, extraLength, extraStyle);\n var height = config.lineHeight;\n var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;\n\n var top = this.$getTop(range.start.row, config);\n var left = this.$padding + range.start.column * config.characterWidth;\n\n this.elt(\n clazz,\n \"height:\"+ height+ \"px;\"+\n \"width:\"+ width+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:\"+ left+ \"px;\"+ (extraStyle || \"\")\n );\n };\n this.drawBidiSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n var height = config.lineHeight, top = this.$getTop(range.start.row, config), padding = this.$padding;\n var selections = this.session.$bidiHandler.getSelections(range.start.column, range.end.column);\n\n selections.forEach(function(selection) {\n this.elt(\n clazz,\n \"height:\" + height + \"px;\" +\n \"width:\" + selection.width + (extraLength || 0) + \"px;\" +\n \"top:\" + top + \"px;\" +\n \"left:\" + (padding + selection.left) + \"px;\" + (extraStyle || \"\")\n );\n }, this);\n };\n\n this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var top = this.$getTop(range.start.row, config);\n var height = config.lineHeight;\n if (range.start.row != range.end.row)\n height += this.$getTop(range.end.row, config) - top;\n\n this.elt(\n clazz,\n \"height:\"+ height+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:0;right:0;\"+ (extraStyle || \"\")\n );\n };\n \n this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var top = this.$getTop(range.start.row, config);\n var height = config.lineHeight;\n\n this.elt(\n clazz,\n \"height:\"+ height+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:0;right:0;\"+ (extraStyle || \"\")\n );\n };\n\n}).call(Marker.prototype);\n\nexports.Marker = Marker;\n\n});\n\nace.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) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar Lines = require(\"./lines\").Lines;\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar Text = function(parentEl) {\n this.dom = dom; \n this.element = this.dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_text-layer\";\n parentEl.appendChild(this.element);\n this.$updateEolChar = this.$updateEolChar.bind(this);\n this.$lines = new Lines(this.element);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.EOF_CHAR = \"\\xB6\";\n this.EOL_CHAR_LF = \"\\xAC\";\n this.EOL_CHAR_CRLF = \"\\xa4\";\n this.EOL_CHAR = this.EOL_CHAR_LF;\n this.TAB_CHAR = \"\\u2014\"; //\"\\u21E5\";\n this.SPACE_CHAR = \"\\xB7\";\n this.$padding = 0;\n this.MAX_LINE_LENGTH = 10000;\n\n this.$updateEolChar = function() {\n var doc = this.session.doc;\n var unixMode = doc.getNewLineCharacter() == \"\\n\" && doc.getNewLineMode() != \"windows\";\n var EOL_CHAR = unixMode ? this.EOL_CHAR_LF : this.EOL_CHAR_CRLF;\n if (this.EOL_CHAR != EOL_CHAR) {\n this.EOL_CHAR = EOL_CHAR;\n return true;\n }\n };\n\n this.setPadding = function(padding) {\n this.$padding = padding;\n this.element.style.margin = \"0 \" + padding + \"px\";\n };\n\n this.getLineHeight = function() {\n return this.$fontMetrics.$characterSize.height || 0;\n };\n\n this.getCharacterWidth = function() {\n return this.$fontMetrics.$characterSize.width || 0;\n };\n \n this.$setFontMetrics = function(measure) {\n this.$fontMetrics = measure;\n this.$fontMetrics.on(\"changeCharacterSize\", function(e) {\n this._signal(\"changeCharacterSize\", e);\n }.bind(this));\n this.$pollSizeChanges();\n };\n\n this.checkForSizeChanges = function() {\n this.$fontMetrics.checkForSizeChanges();\n };\n this.$pollSizeChanges = function() {\n return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();\n };\n this.setSession = function(session) {\n this.session = session;\n if (session)\n this.$computeTabString();\n };\n\n this.showInvisibles = false;\n this.showSpaces = false;\n this.showTabs = false;\n this.showEOL = false;\n this.setShowInvisibles = function(showInvisibles) {\n if (this.showInvisibles == showInvisibles)\n return false;\n\n this.showInvisibles = showInvisibles;\n if (typeof showInvisibles == \"string\") {\n this.showSpaces = /tab/i.test(showInvisibles);\n this.showTabs = /space/i.test(showInvisibles);\n this.showEOL = /eol/i.test(showInvisibles);\n } else {\n this.showSpaces = this.showTabs = this.showEOL = showInvisibles;\n }\n this.$computeTabString();\n return true;\n };\n\n this.displayIndentGuides = true;\n this.setDisplayIndentGuides = function(display) {\n if (this.displayIndentGuides == display)\n return false;\n\n this.displayIndentGuides = display;\n this.$computeTabString();\n return true;\n };\n\n this.$tabStrings = [];\n this.onChangeTabSize =\n this.$computeTabString = function() {\n var tabSize = this.session.getTabSize();\n this.tabSize = tabSize;\n var tabStr = this.$tabStrings = [0];\n for (var i = 1; i < tabSize + 1; i++) {\n if (this.showTabs) {\n var span = this.dom.createElement(\"span\");\n span.className = \"ace_invisible ace_invisible_tab\";\n span.textContent = lang.stringRepeat(this.TAB_CHAR, i);\n tabStr.push(span);\n } else {\n tabStr.push(this.dom.createTextNode(lang.stringRepeat(\" \", i), this.element));\n }\n }\n if (this.displayIndentGuides) {\n this.$indentGuideRe = /\\s\\S| \\t|\\t |\\s$/;\n var className = \"ace_indent-guide\";\n var spaceClass = this.showSpaces ? \" ace_invisible ace_invisible_space\" : \"\";\n var spaceContent = this.showSpaces\n ? lang.stringRepeat(this.SPACE_CHAR, this.tabSize)\n : lang.stringRepeat(\" \", this.tabSize);\n\n var tabClass = this.showTabs ? \" ace_invisible ace_invisible_tab\" : \"\";\n var tabContent = this.showTabs \n ? lang.stringRepeat(this.TAB_CHAR, this.tabSize)\n : spaceContent;\n\n var span = this.dom.createElement(\"span\");\n span.className = className + spaceClass;\n span.textContent = spaceContent;\n this.$tabStrings[\" \"] = span;\n \n var span = this.dom.createElement(\"span\");\n span.className = className + tabClass;\n span.textContent = tabContent;\n this.$tabStrings[\"\\t\"] = span;\n }\n };\n\n this.updateLines = function(config, firstRow, lastRow) {\n if (this.config.lastRow != config.lastRow ||\n this.config.firstRow != config.firstRow) {\n return this.update(config);\n }\n \n this.config = config;\n\n var first = Math.max(firstRow, config.firstRow);\n var last = Math.min(lastRow, config.lastRow);\n\n var lineElements = this.element.childNodes;\n var lineElementsIdx = 0;\n\n for (var row = config.firstRow; row < first; row++) {\n var foldLine = this.session.getFoldLine(row);\n if (foldLine) {\n if (foldLine.containsRow(first)) {\n first = foldLine.start.row;\n break;\n } else {\n row = foldLine.end.row;\n }\n }\n lineElementsIdx ++;\n }\n\n var heightChanged = false;\n var row = first;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row :Infinity;\n }\n if (row > last)\n break;\n\n var lineElement = lineElements[lineElementsIdx++];\n if (lineElement) {\n this.dom.removeChildren(lineElement);\n this.$renderLine(\n lineElement, row, row == foldStart ? foldLine : false\n );\n\n if (heightChanged)\n lineElement.style.top = this.$lines.computeLineTop(row, config, this.session) + \"px\";\n\n var height = (config.lineHeight * this.session.getRowLength(row)) + \"px\";\n if (lineElement.style.height != height) {\n heightChanged = true;\n lineElement.style.height = height;\n }\n }\n row++;\n }\n if (heightChanged) {\n while (lineElementsIdx < this.$lines.cells.length) {\n var cell = this.$lines.cells[lineElementsIdx++];\n cell.element.style.top = this.$lines.computeLineTop(cell.row, config, this.session) + \"px\";\n }\n }\n };\n\n this.scrollLines = function(config) {\n var oldConfig = this.config;\n this.config = config;\n\n if (this.$lines.pageChanged(oldConfig, config))\n return this.update(config);\n \n this.$lines.moveContainer(config);\n \n var lastRow = config.lastRow;\n var oldLastRow = oldConfig ? oldConfig.lastRow : -1;\n\n if (!oldConfig || oldLastRow < config.firstRow)\n return this.update(config);\n\n if (lastRow < oldConfig.firstRow)\n return this.update(config);\n\n if (!oldConfig || oldConfig.lastRow < config.firstRow)\n return this.update(config);\n\n if (config.lastRow < oldConfig.firstRow)\n return this.update(config);\n\n if (oldConfig.firstRow < config.firstRow)\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n this.$lines.shift();\n\n if (oldConfig.lastRow > config.lastRow)\n for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n this.$lines.pop();\n\n if (config.firstRow < oldConfig.firstRow) {\n this.$lines.unshift(this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1));\n }\n\n if (config.lastRow > oldConfig.lastRow) {\n this.$lines.push(this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow));\n }\n };\n\n this.$renderLinesFragment = function(config, firstRow, lastRow) {\n var fragment = [];\n var row = firstRow;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n if (row > lastRow)\n break;\n\n var line = this.$lines.createCell(row, config, this.session);\n \n var lineEl = line.element;\n this.dom.removeChildren(lineEl);\n dom.setStyle(lineEl.style, \"height\", this.$lines.computeLineHeight(row, config, this.session) + \"px\");\n dom.setStyle(lineEl.style, \"top\", this.$lines.computeLineTop(row, config, this.session) + \"px\");\n this.$renderLine(lineEl, row, row == foldStart ? foldLine : false);\n\n if (this.$useLineGroups()) {\n lineEl.className = \"ace_line_group\";\n } else {\n lineEl.className = \"ace_line\";\n }\n fragment.push(line);\n\n row++;\n }\n return fragment;\n };\n\n this.update = function(config) {\n this.$lines.moveContainer(config);\n \n this.config = config;\n\n var firstRow = config.firstRow;\n var lastRow = config.lastRow;\n\n var lines = this.$lines;\n while (lines.getLength())\n lines.pop();\n \n lines.push(this.$renderLinesFragment(config, firstRow, lastRow));\n };\n\n this.$textToken = {\n \"text\": true,\n \"rparen\": true,\n \"lparen\": true\n };\n\n this.$renderToken = function(parent, screenColumn, token, value) {\n var self = this;\n var re = /(\\t)|( +)|([\\x00-\\x1f\\x80-\\xa0\\xad\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\uFEFF\\uFFF9-\\uFFFC]+)|(\\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;\n \n var valueFragment = this.dom.createFragment(this.element);\n\n var m;\n var i = 0;\n while (m = re.exec(value)) {\n var tab = m[1];\n var simpleSpace = m[2];\n var controlCharacter = m[3];\n var cjkSpace = m[4];\n var cjk = m[5];\n \n if (!self.showSpaces && simpleSpace)\n continue;\n\n var before = i != m.index ? value.slice(i, m.index) : \"\";\n\n i = m.index + m[0].length;\n \n if (before) {\n valueFragment.appendChild(this.dom.createTextNode(before, this.element));\n }\n \n if (tab) {\n var tabSize = self.session.getScreenTabSize(screenColumn + m.index);\n valueFragment.appendChild(self.$tabStrings[tabSize].cloneNode(true));\n screenColumn += tabSize - 1;\n } else if (simpleSpace) {\n if (self.showSpaces) {\n var span = this.dom.createElement(\"span\");\n span.className = \"ace_invisible ace_invisible_space\";\n span.textContent = lang.stringRepeat(self.SPACE_CHAR, simpleSpace.length);\n valueFragment.appendChild(span);\n } else {\n valueFragment.appendChild(this.com.createTextNode(simpleSpace, this.element));\n }\n } else if (controlCharacter) {\n var span = this.dom.createElement(\"span\");\n span.className = \"ace_invisible ace_invisible_space ace_invalid\";\n span.textContent = lang.stringRepeat(self.SPACE_CHAR, controlCharacter.length);\n valueFragment.appendChild(span);\n } else if (cjkSpace) {\n screenColumn += 1;\n \n var span = this.dom.createElement(\"span\");\n span.style.width = (self.config.characterWidth * 2) + \"px\";\n span.className = self.showSpaces ? \"ace_cjk ace_invisible ace_invisible_space\" : \"ace_cjk\";\n span.textContent = self.showSpaces ? self.SPACE_CHAR : cjkSpace;\n valueFragment.appendChild(span);\n } else if (cjk) {\n screenColumn += 1;\n var span = this.dom.createElement(\"span\");\n span.style.width = (self.config.characterWidth * 2) + \"px\";\n span.className = \"ace_cjk\";\n span.textContent = cjk;\n valueFragment.appendChild(span);\n }\n }\n \n valueFragment.appendChild(this.dom.createTextNode(i ? value.slice(i) : value, this.element));\n\n if (!this.$textToken[token.type]) {\n var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n var span = this.dom.createElement(\"span\");\n if (token.type == \"fold\")\n span.style.width = (token.value.length * this.config.characterWidth) + \"px\";\n \n span.className = classes;\n span.appendChild(valueFragment);\n \n parent.appendChild(span);\n }\n else {\n parent.appendChild(valueFragment);\n }\n \n return screenColumn + value.length;\n };\n\n this.renderIndentGuide = function(parent, value, max) {\n var cols = value.search(this.$indentGuideRe);\n if (cols <= 0 || cols >= max)\n return value;\n if (value[0] == \" \") {\n cols -= cols % this.tabSize;\n var count = cols/this.tabSize;\n for (var i=0; i= splitChars) {\n screenColumn = this.$renderToken(\n lineEl, screenColumn,\n token, value.substring(0, splitChars - chars)\n );\n value = value.substring(splitChars - chars);\n chars = splitChars;\n\n lineEl = this.$createLineElement();\n parent.appendChild(lineEl);\n\n lineEl.appendChild(this.dom.createTextNode(lang.stringRepeat(\"\\xa0\", splits.indent), this.element));\n\n split ++;\n screenColumn = 0;\n splitChars = splits[split] || Number.MAX_VALUE;\n }\n if (value.length != 0) {\n chars += value.length;\n screenColumn = this.$renderToken(\n lineEl, screenColumn, token, value\n );\n }\n }\n }\n \n if (splits[splits.length - 1] > this.MAX_LINE_LENGTH)\n this.$renderOverflowMessage(lineEl, screenColumn, null, \"\", true);\n };\n\n this.$renderSimpleLine = function(parent, tokens) {\n var screenColumn = 0;\n var token = tokens[0];\n var value = token.value;\n if (this.displayIndentGuides)\n value = this.renderIndentGuide(parent, value);\n if (value)\n screenColumn = this.$renderToken(parent, screenColumn, token, value);\n for (var i = 1; i < tokens.length; i++) {\n token = tokens[i];\n value = token.value;\n if (screenColumn + value.length > this.MAX_LINE_LENGTH)\n return this.$renderOverflowMessage(parent, screenColumn, token, value);\n screenColumn = this.$renderToken(parent, screenColumn, token, value);\n }\n };\n \n this.$renderOverflowMessage = function(parent, screenColumn, token, value, hide) {\n token && this.$renderToken(parent, screenColumn, token,\n value.slice(0, this.MAX_LINE_LENGTH - screenColumn));\n \n var overflowEl = this.dom.createElement(\"span\");\n overflowEl.className = \"ace_inline_button ace_keyword ace_toggle_wrap\";\n overflowEl.textContent = hide ? \"\" : \"\";\n \n parent.appendChild(overflowEl); \n };\n this.$renderLine = function(parent, row, foldLine) {\n if (!foldLine && foldLine != false)\n foldLine = this.session.getFoldLine(row);\n\n if (foldLine)\n var tokens = this.$getFoldLineTokens(row, foldLine);\n else\n var tokens = this.session.getTokens(row);\n\n var lastLineEl = parent;\n if (tokens.length) {\n var splits = this.session.getRowSplitData(row);\n if (splits && splits.length) {\n this.$renderWrappedLine(parent, tokens, splits);\n var lastLineEl = parent.lastChild;\n } else {\n var lastLineEl = parent;\n if (this.$useLineGroups()) {\n lastLineEl = this.$createLineElement();\n parent.appendChild(lastLineEl);\n }\n this.$renderSimpleLine(lastLineEl, tokens);\n }\n } else if (this.$useLineGroups()) {\n lastLineEl = this.$createLineElement();\n parent.appendChild(lastLineEl);\n }\n\n if (this.showEOL && lastLineEl) {\n if (foldLine)\n row = foldLine.end.row;\n\n var invisibleEl = this.dom.createElement(\"span\");\n invisibleEl.className = \"ace_invisible ace_invisible_eol\";\n invisibleEl.textContent = row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR;\n \n lastLineEl.appendChild(invisibleEl);\n }\n };\n\n this.$getFoldLineTokens = function(row, foldLine) {\n var session = this.session;\n var renderTokens = [];\n\n function addTokens(tokens, from, to) {\n var idx = 0, col = 0;\n while ((col + tokens[idx].value.length) < from) {\n col += tokens[idx].value.length;\n idx++;\n\n if (idx == tokens.length)\n return;\n }\n if (col != from) {\n var value = tokens[idx].value.substring(from - col);\n if (value.length > (to - from))\n value = value.substring(0, to - from);\n\n renderTokens.push({\n type: tokens[idx].type,\n value: value\n });\n\n col = from + value.length;\n idx += 1;\n }\n\n while (col < to && idx < tokens.length) {\n var value = tokens[idx].value;\n if (value.length + col > to) {\n renderTokens.push({\n type: tokens[idx].type,\n value: value.substring(0, to - col)\n });\n } else\n renderTokens.push(tokens[idx]);\n col += value.length;\n idx += 1;\n }\n }\n\n var tokens = session.getTokens(row);\n foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\n if (placeholder != null) {\n renderTokens.push({\n type: \"fold\",\n value: placeholder\n });\n } else {\n if (isNewRow)\n tokens = session.getTokens(row);\n\n if (tokens.length)\n addTokens(tokens, lastColumn, column);\n }\n }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\n\n return renderTokens;\n };\n\n this.$useLineGroups = function() {\n return this.session.getUseWrapMode();\n };\n\n this.destroy = function() {};\n}).call(Text.prototype);\n\nexports.Text = Text;\n\n});\n\nace.define(\"ace/layer/cursor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\n\nvar Cursor = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_cursor-layer\";\n parentEl.appendChild(this.element);\n \n this.isVisible = false;\n this.isBlinking = true;\n this.blinkInterval = 1000;\n this.smoothBlinking = false;\n\n this.cursors = [];\n this.cursor = this.addCursor();\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.$updateCursors = this.$updateOpacity.bind(this);\n};\n\n(function() {\n \n this.$updateOpacity = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n dom.setStyle(cursors[i].style, \"opacity\", val ? \"\" : \"0\");\n };\n\n this.$startCssAnimation = function() {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.animationDuration = this.blinkInterval + \"ms\";\n\n setTimeout(function() {\n dom.addCssClass(this.element, \"ace_animate-blinking\");\n }.bind(this));\n };\n \n this.$stopCssAnimation = function() {\n dom.removeCssClass(this.element, \"ace_animate-blinking\");\n };\n\n this.$padding = 0;\n this.setPadding = function(padding) {\n this.$padding = padding;\n };\n\n this.setSession = function(session) {\n this.session = session;\n };\n\n this.setBlinking = function(blinking) {\n if (blinking != this.isBlinking) {\n this.isBlinking = blinking;\n this.restartTimer();\n }\n };\n\n this.setBlinkInterval = function(blinkInterval) {\n if (blinkInterval != this.blinkInterval) {\n this.blinkInterval = blinkInterval;\n this.restartTimer();\n }\n };\n\n this.setSmoothBlinking = function(smoothBlinking) {\n if (smoothBlinking != this.smoothBlinking) {\n this.smoothBlinking = smoothBlinking;\n dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n this.$updateCursors(true);\n this.restartTimer();\n }\n };\n\n this.addCursor = function() {\n var el = dom.createElement(\"div\");\n el.className = \"ace_cursor\";\n this.element.appendChild(el);\n this.cursors.push(el);\n return el;\n };\n\n this.removeCursor = function() {\n if (this.cursors.length > 1) {\n var el = this.cursors.pop();\n el.parentNode.removeChild(el);\n return el;\n }\n };\n\n this.hideCursor = function() {\n this.isVisible = false;\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.showCursor = function() {\n this.isVisible = true;\n dom.removeCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.restartTimer = function() {\n var update = this.$updateCursors;\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n this.$stopCssAnimation();\n\n if (this.smoothBlinking) {\n dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n }\n \n update(true);\n\n if (!this.isBlinking || !this.blinkInterval || !this.isVisible) {\n this.$stopCssAnimation();\n return;\n }\n\n if (this.smoothBlinking) {\n setTimeout(function(){\n dom.addCssClass(this.element, \"ace_smooth-blinking\");\n }.bind(this));\n }\n \n if (dom.HAS_CSS_ANIMATION) {\n this.$startCssAnimation();\n } else {\n var blink = function(){\n this.timeoutId = setTimeout(function() {\n update(false);\n }, 0.6 * this.blinkInterval);\n }.bind(this);\n \n this.intervalId = setInterval(function() {\n update(true);\n blink();\n }, this.blinkInterval);\n blink();\n }\n };\n\n this.getPixelPosition = function(position, onScreen) {\n if (!this.config || !this.session)\n return {left : 0, top : 0};\n\n if (!position)\n position = this.session.selection.getCursor();\n var pos = this.session.documentToScreenPosition(position);\n var cursorLeft = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, position.row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : pos.column * this.config.characterWidth);\n\n var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *\n this.config.lineHeight;\n\n return {left : cursorLeft, top : cursorTop};\n };\n\n this.isCursorInView = function(pixelPos, config) {\n return pixelPos.top >= 0 && pixelPos.top < config.maxHeight;\n };\n\n this.update = function(config) {\n this.config = config;\n\n var selections = this.session.$selectionMarkers;\n var i = 0, cursorIndex = 0;\n\n if (selections === undefined || selections.length === 0){\n selections = [{cursor: null}];\n }\n\n for (var i = 0, n = selections.length; i < n; i++) {\n var pixelPos = this.getPixelPosition(selections[i].cursor, true);\n if ((pixelPos.top > config.height + config.offset ||\n pixelPos.top < 0) && i > 1) {\n continue;\n }\n\n var element = this.cursors[cursorIndex++] || this.addCursor();\n var style = element.style;\n \n if (!this.drawCursor) {\n if (!this.isCursorInView(pixelPos, config)) {\n dom.setStyle(style, \"display\", \"none\");\n } else {\n dom.setStyle(style, \"display\", \"block\");\n dom.translate(element, pixelPos.left, pixelPos.top);\n dom.setStyle(style, \"width\", Math.round(config.characterWidth) + \"px\");\n dom.setStyle(style, \"height\", config.lineHeight + \"px\");\n }\n } else {\n this.drawCursor(element, pixelPos, config, selections[i], this.session);\n }\n }\n while (this.cursors.length > cursorIndex)\n this.removeCursor();\n\n var overwrite = this.session.getOverwrite();\n this.$setOverwrite(overwrite);\n this.$pixelPos = pixelPos;\n this.restartTimer();\n };\n \n this.drawCursor = null;\n\n this.$setOverwrite = function(overwrite) {\n if (overwrite != this.overwrite) {\n this.overwrite = overwrite;\n if (overwrite)\n dom.addCssClass(this.element, \"ace_overwrite-cursors\");\n else\n dom.removeCssClass(this.element, \"ace_overwrite-cursors\");\n }\n };\n\n this.destroy = function() {\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n };\n\n}).call(Cursor.prototype);\n\nexports.Cursor = Cursor;\n\n});\n\nace.define(\"ace/scrollbar\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar MAX_SCROLL_H = 0x8000;\nvar ScrollBar = function(parent) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_scrollbar ace_scrollbar\" + this.classSuffix;\n\n this.inner = dom.createElement(\"div\");\n this.inner.className = \"ace_scrollbar-inner\";\n this.inner.textContent = \"\\xa0\";\n this.element.appendChild(this.inner);\n\n parent.appendChild(this.element);\n\n this.setVisible(false);\n this.skipEvent = false;\n\n event.addListener(this.element, \"scroll\", this.onScroll.bind(this));\n event.addListener(this.element, \"mousedown\", event.preventDefault);\n};\n\n(function() {\n oop.implement(this, EventEmitter);\n\n this.setVisible = function(isVisible) {\n this.element.style.display = isVisible ? \"\" : \"none\";\n this.isVisible = isVisible;\n this.coeff = 1;\n };\n}).call(ScrollBar.prototype);\nvar VScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollTop = 0;\n this.scrollHeight = 0;\n renderer.$scrollbarWidth = \n this.width = dom.scrollbarWidth(parent.ownerDocument);\n this.inner.style.width =\n this.element.style.width = (this.width || 15) + 5 + \"px\";\n this.$minWidth = 0;\n};\n\noop.inherits(VScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-v';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollTop = this.element.scrollTop;\n if (this.coeff != 1) {\n var h = this.element.clientHeight / this.scrollHeight;\n this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h);\n }\n this._emit(\"scroll\", {data: this.scrollTop});\n }\n this.skipEvent = false;\n };\n this.getWidth = function() {\n return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0);\n };\n this.setHeight = function(height) {\n this.element.style.height = height + \"px\";\n };\n this.setInnerHeight = \n this.setScrollHeight = function(height) {\n this.scrollHeight = height;\n if (height > MAX_SCROLL_H) {\n this.coeff = MAX_SCROLL_H / height;\n height = MAX_SCROLL_H;\n } else if (this.coeff != 1) {\n this.coeff = 1;\n }\n this.inner.style.height = height + \"px\";\n };\n this.setScrollTop = function(scrollTop) {\n if (this.scrollTop != scrollTop) {\n this.skipEvent = true;\n this.scrollTop = scrollTop;\n this.element.scrollTop = scrollTop * this.coeff;\n }\n };\n\n}).call(VScrollBar.prototype);\nvar HScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollLeft = 0;\n this.height = renderer.$scrollbarWidth;\n this.inner.style.height =\n this.element.style.height = (this.height || 15) + 5 + \"px\";\n};\n\noop.inherits(HScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-h';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollLeft = this.element.scrollLeft;\n this._emit(\"scroll\", {data: this.scrollLeft});\n }\n this.skipEvent = false;\n };\n this.getHeight = function() {\n return this.isVisible ? this.height : 0;\n };\n this.setWidth = function(width) {\n this.element.style.width = width + \"px\";\n };\n this.setInnerWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollLeft = function(scrollLeft) {\n if (this.scrollLeft != scrollLeft) {\n this.skipEvent = true;\n this.scrollLeft = this.element.scrollLeft = scrollLeft;\n }\n };\n\n}).call(HScrollBar.prototype);\n\n\nexports.ScrollBar = VScrollBar; // backward compatibility\nexports.ScrollBarV = VScrollBar; // backward compatibility\nexports.ScrollBarH = HScrollBar; // backward compatibility\n\nexports.VScrollBar = VScrollBar;\nexports.HScrollBar = HScrollBar;\n});\n\nace.define(\"ace/renderloop\",[\"require\",\"exports\",\"module\",\"ace/lib/event\"], function(require, exports, module) {\n\"use strict\";\n\nvar event = require(\"./lib/event\");\n\n\nvar RenderLoop = function(onRender, win) {\n this.onRender = onRender;\n this.pending = false;\n this.changes = 0;\n this.$recursionLimit = 2;\n this.window = win || window;\n var _self = this;\n this._flush = function(ts) {\n _self.pending = false;\n var changes = _self.changes;\n\n if (changes) {\n event.blockIdle(100);\n _self.changes = 0;\n _self.onRender(changes);\n }\n \n if (_self.changes) {\n if (_self.$recursionLimit-- < 0) return;\n _self.schedule();\n } else {\n _self.$recursionLimit = 2;\n }\n };\n};\n\n(function() {\n\n this.schedule = function(change) {\n this.changes = this.changes | change;\n if (this.changes && !this.pending) {\n event.nextFrame(this._flush);\n this.pending = true;\n }\n };\n\n this.clear = function(change) {\n var changes = this.changes;\n this.changes = 0;\n return changes;\n };\n\n}).call(RenderLoop.prototype);\n\nexports.RenderLoop = RenderLoop;\n});\n\nace.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) {\n\nvar oop = require(\"../lib/oop\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar CHAR_COUNT = 256;\nvar USE_OBSERVER = typeof ResizeObserver == \"function\";\nvar L = 200;\n\nvar FontMetrics = exports.FontMetrics = function(parentEl) {\n this.el = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.el.style, true);\n \n this.$main = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$main.style);\n \n this.$measureNode = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$measureNode.style);\n \n \n this.el.appendChild(this.$main);\n this.el.appendChild(this.$measureNode);\n parentEl.appendChild(this.el);\n \n this.$measureNode.textContent = lang.stringRepeat(\"X\", CHAR_COUNT);\n \n this.$characterSize = {width: 0, height: 0};\n \n \n if (USE_OBSERVER)\n this.$addObserver();\n else\n this.checkForSizeChanges();\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n \n this.$characterSize = {width: 0, height: 0};\n \n this.$setMeasureNodeStyles = function(style, isRoot) {\n style.width = style.height = \"auto\";\n style.left = style.top = \"0px\";\n style.visibility = \"hidden\";\n style.position = \"absolute\";\n style.whiteSpace = \"pre\";\n\n if (useragent.isIE < 8) {\n style[\"font-family\"] = \"inherit\";\n } else {\n style.font = \"inherit\";\n }\n style.overflow = isRoot ? \"hidden\" : \"visible\";\n };\n\n this.checkForSizeChanges = function(size) {\n if (size === undefined)\n size = this.$measureSizes();\n if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\n this.$measureNode.style.fontWeight = \"bold\";\n var boldSize = this.$measureSizes();\n this.$measureNode.style.fontWeight = \"\";\n this.$characterSize = size;\n this.charSizes = Object.create(null);\n this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\n this._emit(\"changeCharacterSize\", {data: size});\n }\n };\n \n this.$addObserver = function() {\n var self = this;\n this.$observer = new window.ResizeObserver(function(e) {\n self.checkForSizeChanges();\n });\n this.$observer.observe(this.$measureNode);\n };\n\n this.$pollSizeChanges = function() {\n if (this.$pollSizeChangesTimer || this.$observer)\n return this.$pollSizeChangesTimer;\n var self = this;\n \n return this.$pollSizeChangesTimer = event.onIdle(function cb() {\n self.checkForSizeChanges();\n event.onIdle(cb, 500);\n }, 500);\n };\n \n this.setPolling = function(val) {\n if (val) {\n this.$pollSizeChanges();\n } else if (this.$pollSizeChangesTimer) {\n clearInterval(this.$pollSizeChangesTimer);\n this.$pollSizeChangesTimer = 0;\n }\n };\n\n this.$measureSizes = function(node) {\n var size = {\n height: (node || this.$measureNode).clientHeight,\n width: (node || this.$measureNode).clientWidth / CHAR_COUNT\n };\n if (size.width === 0 || size.height === 0)\n return null;\n return size;\n };\n\n this.$measureCharWidth = function(ch) {\n this.$main.textContent = lang.stringRepeat(ch, CHAR_COUNT);\n var rect = this.$main.getBoundingClientRect();\n return rect.width / CHAR_COUNT;\n };\n \n this.getCharacterWidth = function(ch) {\n var w = this.charSizes[ch];\n if (w === undefined) {\n w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width;\n }\n return w;\n };\n\n this.destroy = function() {\n clearInterval(this.$pollSizeChangesTimer);\n if (this.$observer)\n this.$observer.disconnect();\n if (this.el && this.el.parentNode)\n this.el.parentNode.removeChild(this.el);\n };\n\n \n this.$getZoom = function getZoom(element) {\n if (!element || !element.parentElement) return 1;\n return (window.getComputedStyle(element).zoom || 1) * getZoom(element.parentElement);\n };\n this.$initTransformMeasureNodes = function() {\n var t = function(t, l) {\n return [\"div\", {\n style: \"position: absolute;top:\" + t + \"px;left:\" + l + \"px;\"\n }];\n };\n this.els = dom.buildDom([t(0, 0), t(L, 0), t(0, L), t(L, L)], this.el);\n };\n this.transformCoordinates = function(clientPos, elPos) {\n if (clientPos) {\n var zoom = this.$getZoom(this.el);\n clientPos = mul(1 / zoom, clientPos);\n }\n function solve(l1, l2, r) {\n var det = l1[1] * l2[0] - l1[0] * l2[1];\n return [\n (-l2[1] * r[0] + l2[0] * r[1]) / det,\n (+l1[1] * r[0] - l1[0] * r[1]) / det\n ];\n }\n function sub(a, b) { return [a[0] - b[0], a[1] - b[1]]; }\n function add(a, b) { return [a[0] + b[0], a[1] + b[1]]; }\n function mul(a, b) { return [a * b[0], a * b[1]]; }\n\n if (!this.els)\n this.$initTransformMeasureNodes();\n \n function p(el) {\n var r = el.getBoundingClientRect();\n return [r.left, r.top];\n }\n\n var a = p(this.els[0]);\n var b = p(this.els[1]);\n var c = p(this.els[2]);\n var d = p(this.els[3]);\n\n var h = solve(sub(d, b), sub(d, c), sub(add(b, c), add(d, a)));\n\n var m1 = mul(1 + h[0], sub(b, a));\n var m2 = mul(1 + h[1], sub(c, a));\n \n if (elPos) {\n var x = elPos;\n var k = h[0] * x[0] / L + h[1] * x[1] / L + 1;\n var ut = add(mul(x[0], m1), mul(x[1], m2));\n return add(mul(1 / k / L, ut), a);\n }\n var u = sub(clientPos, a);\n var f = solve(sub(m1, mul(h[0], u)), sub(m2, mul(h[1], u)), u);\n return mul(L, f);\n };\n \n}).call(FontMetrics.prototype);\n\n});\n\nace.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) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar config = require(\"./config\");\nvar GutterLayer = require(\"./layer/gutter\").Gutter;\nvar MarkerLayer = require(\"./layer/marker\").Marker;\nvar TextLayer = require(\"./layer/text\").Text;\nvar CursorLayer = require(\"./layer/cursor\").Cursor;\nvar HScrollBar = require(\"./scrollbar\").HScrollBar;\nvar VScrollBar = require(\"./scrollbar\").VScrollBar;\nvar RenderLoop = require(\"./renderloop\").RenderLoop;\nvar FontMetrics = require(\"./layer/font_metrics\").FontMetrics;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar editorCss = \"\\\n.ace_br1 {border-top-left-radius : 3px;}\\\n.ace_br2 {border-top-right-radius : 3px;}\\\n.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\\\n.ace_br4 {border-bottom-right-radius: 3px;}\\\n.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\\\n.ace_br8 {border-bottom-left-radius : 3px;}\\\n.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_editor {\\\nposition: relative;\\\noverflow: hidden;\\\npadding: 0;\\\nfont: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\ndirection: ltr;\\\ntext-align: left;\\\n-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\\n}\\\n.ace_scroller {\\\nposition: absolute;\\\noverflow: hidden;\\\ntop: 0;\\\nbottom: 0;\\\nbackground-color: inherit;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\ncursor: text;\\\n}\\\n.ace_content {\\\nposition: absolute;\\\nbox-sizing: border-box;\\\nmin-width: 100%;\\\ncontain: style size layout;\\\nfont-variant-ligatures: no-common-ligatures;\\\n}\\\n.ace_dragging .ace_scroller:before{\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\nbottom: 0;\\\ncontent: '';\\\nbackground: rgba(250, 250, 250, 0.01);\\\nz-index: 1000;\\\n}\\\n.ace_dragging.ace_dark .ace_scroller:before{\\\nbackground: rgba(0, 0, 0, 0.01);\\\n}\\\n.ace_selecting, .ace_selecting * {\\\ncursor: text !important;\\\n}\\\n.ace_gutter {\\\nposition: absolute;\\\noverflow : hidden;\\\nwidth: auto;\\\ntop: 0;\\\nbottom: 0;\\\nleft: 0;\\\ncursor: default;\\\nz-index: 4;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\ncontain: style size layout;\\\n}\\\n.ace_gutter-active-line {\\\nposition: absolute;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_scroller.ace_scroll-left {\\\nbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\n}\\\n.ace_gutter-cell {\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\npadding-left: 19px;\\\npadding-right: 6px;\\\nbackground-repeat: no-repeat;\\\n}\\\n.ace_gutter-cell.ace_error {\\\nbackground-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==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_warning {\\\nbackground-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==\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_dark .ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_scrollbar {\\\ncontain: strict;\\\nposition: absolute;\\\nright: 0;\\\nbottom: 0;\\\nz-index: 6;\\\n}\\\n.ace_scrollbar-inner {\\\nposition: absolute;\\\ncursor: text;\\\nleft: 0;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-v{\\\noverflow-x: hidden;\\\noverflow-y: scroll;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-h {\\\noverflow-x: scroll;\\\noverflow-y: hidden;\\\nleft: 0;\\\n}\\\n.ace_print-margin {\\\nposition: absolute;\\\nheight: 100%;\\\n}\\\n.ace_text-input {\\\nposition: absolute;\\\nz-index: 0;\\\nwidth: 0.5em;\\\nheight: 1em;\\\nopacity: 0;\\\nbackground: transparent;\\\n-moz-appearance: none;\\\nappearance: none;\\\nborder: none;\\\nresize: none;\\\noutline: none;\\\noverflow: hidden;\\\nfont: inherit;\\\npadding: 0 1px;\\\nmargin: 0 -1px;\\\ncontain: strict;\\\n-ms-user-select: text;\\\n-moz-user-select: text;\\\n-webkit-user-select: text;\\\nuser-select: text;\\\nwhite-space: pre!important;\\\n}\\\n.ace_text-input.ace_composition {\\\nbackground: transparent;\\\ncolor: inherit;\\\nz-index: 1000;\\\nopacity: 1;\\\n}\\\n.ace_composition_placeholder { color: transparent }\\\n.ace_composition_marker { \\\nborder-bottom: 1px solid;\\\nposition: absolute;\\\nborder-radius: 0;\\\nmargin-top: 1px;\\\n}\\\n[ace_nocontext=true] {\\\ntransform: none!important;\\\nfilter: none!important;\\\nclip-path: none!important;\\\nmask : none!important;\\\ncontain: none!important;\\\nperspective: none!important;\\\nmix-blend-mode: initial!important;\\\nz-index: auto;\\\n}\\\n.ace_layer {\\\nz-index: 1;\\\nposition: absolute;\\\noverflow: hidden;\\\nword-wrap: normal;\\\nwhite-space: pre;\\\nheight: 100%;\\\nwidth: 100%;\\\nbox-sizing: border-box;\\\npointer-events: none;\\\n}\\\n.ace_gutter-layer {\\\nposition: relative;\\\nwidth: auto;\\\ntext-align: right;\\\npointer-events: auto;\\\nheight: 1000000px;\\\ncontain: style size layout;\\\n}\\\n.ace_text-layer {\\\nfont: inherit !important;\\\nposition: absolute;\\\nheight: 1000000px;\\\nwidth: 1000000px;\\\ncontain: style size layout;\\\n}\\\n.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {\\\ncontain: style size layout;\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_hidpi .ace_text-layer,\\\n.ace_hidpi .ace_gutter-layer,\\\n.ace_hidpi .ace_content,\\\n.ace_hidpi .ace_gutter {\\\ncontain: strict;\\\nwill-change: transform;\\\n}\\\n.ace_hidpi .ace_text-layer > .ace_line, \\\n.ace_hidpi .ace_text-layer > .ace_line_group {\\\ncontain: strict;\\\n}\\\n.ace_cjk {\\\ndisplay: inline-block;\\\ntext-align: center;\\\n}\\\n.ace_cursor-layer {\\\nz-index: 4;\\\n}\\\n.ace_cursor {\\\nz-index: 4;\\\nposition: absolute;\\\nbox-sizing: border-box;\\\nborder-left: 2px solid;\\\ntransform: translatez(0);\\\n}\\\n.ace_multiselect .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_slim-cursors .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_overwrite-cursors .ace_cursor {\\\nborder-left-width: 0;\\\nborder-bottom: 1px solid;\\\n}\\\n.ace_hidden-cursors .ace_cursor {\\\nopacity: 0.2;\\\n}\\\n.ace_hasPlaceholder .ace_hidden-cursors .ace_cursor {\\\nopacity: 0;\\\n}\\\n.ace_smooth-blinking .ace_cursor {\\\ntransition: opacity 0.18s;\\\n}\\\n.ace_animate-blinking .ace_cursor {\\\nanimation-duration: 1000ms;\\\nanimation-timing-function: step-end;\\\nanimation-name: blink-ace-animate;\\\nanimation-iteration-count: infinite;\\\n}\\\n.ace_animate-blinking.ace_smooth-blinking .ace_cursor {\\\nanimation-duration: 1000ms;\\\nanimation-timing-function: ease-in-out;\\\nanimation-name: blink-ace-animate-smooth;\\\n}\\\n@keyframes blink-ace-animate {\\\nfrom, to { opacity: 1; }\\\n60% { opacity: 0; }\\\n}\\\n@keyframes blink-ace-animate-smooth {\\\nfrom, to { opacity: 1; }\\\n45% { opacity: 1; }\\\n60% { opacity: 0; }\\\n85% { opacity: 0; }\\\n}\\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\nposition: absolute;\\\nz-index: 3;\\\n}\\\n.ace_marker-layer .ace_selection {\\\nposition: absolute;\\\nz-index: 5;\\\n}\\\n.ace_marker-layer .ace_bracket {\\\nposition: absolute;\\\nz-index: 6;\\\n}\\\n.ace_marker-layer .ace_error_bracket {\\\nposition: absolute;\\\nborder-bottom: 1px solid #DE5555;\\\nborder-radius: 0;\\\n}\\\n.ace_marker-layer .ace_active-line {\\\nposition: absolute;\\\nz-index: 2;\\\n}\\\n.ace_marker-layer .ace_selected-word {\\\nposition: absolute;\\\nz-index: 4;\\\nbox-sizing: border-box;\\\n}\\\n.ace_line .ace_fold {\\\nbox-sizing: border-box;\\\ndisplay: inline-block;\\\nheight: 11px;\\\nmargin-top: -2px;\\\nvertical-align: middle;\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\\\");\\\nbackground-repeat: no-repeat, repeat-x;\\\nbackground-position: center center, top left;\\\ncolor: transparent;\\\nborder: 1px solid black;\\\nborder-radius: 2px;\\\ncursor: pointer;\\\npointer-events: auto;\\\n}\\\n.ace_dark .ace_fold {\\\n}\\\n.ace_fold:hover{\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_tooltip {\\\nbackground-color: #FFF;\\\nbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\nborder: 1px solid gray;\\\nborder-radius: 1px;\\\nbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\ncolor: black;\\\nmax-width: 100%;\\\npadding: 3px 4px;\\\nposition: fixed;\\\nz-index: 999999;\\\nbox-sizing: border-box;\\\ncursor: default;\\\nwhite-space: pre;\\\nword-wrap: break-word;\\\nline-height: normal;\\\nfont-style: normal;\\\nfont-weight: normal;\\\nletter-spacing: normal;\\\npointer-events: none;\\\n}\\\n.ace_folding-enabled > .ace_gutter-cell {\\\npadding-right: 13px;\\\n}\\\n.ace_fold-widget {\\\nbox-sizing: border-box;\\\nmargin: 0 -12px 0 1px;\\\ndisplay: none;\\\nwidth: 11px;\\\nvertical-align: top;\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: center;\\\nborder-radius: 3px;\\\nborder: 1px solid transparent;\\\ncursor: pointer;\\\n}\\\n.ace_folding-enabled .ace_fold-widget {\\\ndisplay: inline-block; \\\n}\\\n.ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\\\");\\\n}\\\n.ace_fold-widget:hover {\\\nborder: 1px solid rgba(0, 0, 0, 0.3);\\\nbackground-color: rgba(255, 255, 255, 0.2);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\n}\\\n.ace_fold-widget:active {\\\nborder: 1px solid rgba(0, 0, 0, 0.4);\\\nbackground-color: rgba(0, 0, 0, 0.05);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\n}\\\n.ace_dark .ace_fold-widget {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget:hover {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\nbackground-color: rgba(255, 255, 255, 0.1);\\\n}\\\n.ace_dark .ace_fold-widget:active {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n}\\\n.ace_inline_button {\\\nborder: 1px solid lightgray;\\\ndisplay: inline-block;\\\nmargin: -1px 8px;\\\npadding: 0 5px;\\\npointer-events: auto;\\\ncursor: pointer;\\\n}\\\n.ace_inline_button:hover {\\\nborder-color: gray;\\\nbackground: rgba(200,200,200,0.2);\\\ndisplay: inline-block;\\\npointer-events: auto;\\\n}\\\n.ace_fold-widget.ace_invalid {\\\nbackground-color: #FFB4B4;\\\nborder-color: #DE5555;\\\n}\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\ntransition: opacity 0.4s ease 0.05s;\\\nopacity: 0;\\\n}\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\ntransition: opacity 0.05s ease 0.05s;\\\nopacity:1;\\\n}\\\n.ace_underline {\\\ntext-decoration: underline;\\\n}\\\n.ace_bold {\\\nfont-weight: bold;\\\n}\\\n.ace_nobold .ace_bold {\\\nfont-weight: normal;\\\n}\\\n.ace_italic {\\\nfont-style: italic;\\\n}\\\n.ace_error-marker {\\\nbackground-color: rgba(255, 0, 0,0.2);\\\nposition: absolute;\\\nz-index: 9;\\\n}\\\n.ace_highlight-marker {\\\nbackground-color: rgba(255, 255, 0,0.2);\\\nposition: absolute;\\\nz-index: 8;\\\n}\\\n.ace_mobile-menu {\\\nposition: absolute;\\\nline-height: 1.5;\\\nborder-radius: 4px;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\nbackground: white;\\\nbox-shadow: 1px 3px 2px grey;\\\nborder: 1px solid #dcdcdc;\\\ncolor: black;\\\n}\\\n.ace_dark > .ace_mobile-menu {\\\nbackground: #333;\\\ncolor: #ccc;\\\nbox-shadow: 1px 3px 2px grey;\\\nborder: 1px solid #444;\\\n}\\\n.ace_mobile-button {\\\npadding: 2px;\\\ncursor: pointer;\\\noverflow: hidden;\\\n}\\\n.ace_mobile-button:hover {\\\nbackground-color: #eee;\\\nopacity:1;\\\n}\\\n.ace_mobile-button:active {\\\nbackground-color: #ddd;\\\n}\\\n.ace_placeholder {\\\nfont-family: arial;\\\ntransform: scale(0.9);\\\ntransform-origin: left;\\\nwhite-space: pre;\\\nopacity: 0.7;\\\nmargin: 0 10px;\\\n}\";\n\nvar useragent = require(\"./lib/useragent\");\nvar HIDE_TEXTAREA = useragent.isIE;\n\ndom.importCssString(editorCss, \"ace_editor.css\");\n\nvar VirtualRenderer = function(container, theme) {\n var _self = this;\n\n this.container = container || dom.createElement(\"div\");\n\n dom.addCssClass(this.container, \"ace_editor\");\n if (dom.HI_DPI) dom.addCssClass(this.container, \"ace_hidpi\");\n\n this.setTheme(theme);\n\n this.$gutter = dom.createElement(\"div\");\n this.$gutter.className = \"ace_gutter\";\n this.container.appendChild(this.$gutter);\n this.$gutter.setAttribute(\"aria-hidden\", true);\n\n this.scroller = dom.createElement(\"div\");\n this.scroller.className = \"ace_scroller\";\n \n this.container.appendChild(this.scroller);\n\n this.content = dom.createElement(\"div\");\n this.content.className = \"ace_content\";\n this.scroller.appendChild(this.content);\n\n this.$gutterLayer = new GutterLayer(this.$gutter);\n this.$gutterLayer.on(\"changeGutterWidth\", this.onGutterResize.bind(this));\n\n this.$markerBack = new MarkerLayer(this.content);\n\n var textLayer = this.$textLayer = new TextLayer(this.content);\n this.canvas = textLayer.element;\n\n this.$markerFront = new MarkerLayer(this.content);\n\n this.$cursorLayer = new CursorLayer(this.content);\n this.$horizScroll = false;\n this.$vScroll = false;\n\n this.scrollBar = \n this.scrollBarV = new VScrollBar(this.container, this);\n this.scrollBarH = new HScrollBar(this.container, this);\n this.scrollBarV.on(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n });\n this.scrollBarH.on(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n });\n\n this.scrollTop = 0;\n this.scrollLeft = 0;\n\n this.cursorPos = {\n row : 0,\n column : 0\n };\n\n this.$fontMetrics = new FontMetrics(this.container);\n this.$textLayer.$setFontMetrics(this.$fontMetrics);\n this.$textLayer.on(\"changeCharacterSize\", function(e) {\n _self.updateCharacterSize();\n _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);\n _self._signal(\"changeCharacterSize\", e);\n });\n\n this.$size = {\n width: 0,\n height: 0,\n scrollerHeight: 0,\n scrollerWidth: 0,\n $dirty: true\n };\n\n this.layerConfig = {\n width : 1,\n padding : 0,\n firstRow : 0,\n firstRowScreen: 0,\n lastRow : 0,\n lineHeight : 0,\n characterWidth : 0,\n minHeight : 1,\n maxHeight : 1,\n offset : 0,\n height : 1,\n gutterOffset: 1\n };\n \n this.scrollMargin = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n v: 0,\n h: 0\n };\n \n this.margin = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n v: 0,\n h: 0\n };\n \n this.$keepTextAreaAtCursor = !useragent.isIOS;\n\n this.$loop = new RenderLoop(\n this.$renderChanges.bind(this),\n this.container.ownerDocument.defaultView\n );\n this.$loop.schedule(this.CHANGE_FULL);\n\n this.updateCharacterSize();\n this.setPadding(4);\n config.resetOptions(this);\n config._signal(\"renderer\", this);\n};\n\n(function() {\n\n this.CHANGE_CURSOR = 1;\n this.CHANGE_MARKER = 2;\n this.CHANGE_GUTTER = 4;\n this.CHANGE_SCROLL = 8;\n this.CHANGE_LINES = 16;\n this.CHANGE_TEXT = 32;\n this.CHANGE_SIZE = 64;\n this.CHANGE_MARKER_BACK = 128;\n this.CHANGE_MARKER_FRONT = 256;\n this.CHANGE_FULL = 512;\n this.CHANGE_H_SCROLL = 1024;\n\n oop.implement(this, EventEmitter);\n\n this.updateCharacterSize = function() {\n if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\n this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\n this.setStyle(\"ace_nobold\", !this.$allowBoldFonts);\n }\n\n this.layerConfig.characterWidth =\n this.characterWidth = this.$textLayer.getCharacterWidth();\n this.layerConfig.lineHeight =\n this.lineHeight = this.$textLayer.getLineHeight();\n this.$updatePrintMargin();\n dom.setStyle(this.scroller.style, \"line-height\", this.lineHeight + \"px\");\n };\n this.setSession = function(session) {\n if (this.session)\n this.session.doc.off(\"changeNewLineMode\", this.onChangeNewLineMode);\n \n this.session = session;\n if (session && this.scrollMargin.top && session.getScrollTop() <= 0)\n session.setScrollTop(-this.scrollMargin.top);\n\n this.$cursorLayer.setSession(session);\n this.$markerBack.setSession(session);\n this.$markerFront.setSession(session);\n this.$gutterLayer.setSession(session);\n this.$textLayer.setSession(session);\n if (!session)\n return;\n \n this.$loop.schedule(this.CHANGE_FULL);\n this.session.$setFontMetrics(this.$fontMetrics);\n this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null;\n \n this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this);\n this.onChangeNewLineMode();\n this.session.doc.on(\"changeNewLineMode\", this.onChangeNewLineMode);\n };\n this.updateLines = function(firstRow, lastRow, force) {\n if (lastRow === undefined)\n lastRow = Infinity;\n\n if (!this.$changedLines) {\n this.$changedLines = {\n firstRow: firstRow,\n lastRow: lastRow\n };\n }\n else {\n if (this.$changedLines.firstRow > firstRow)\n this.$changedLines.firstRow = firstRow;\n\n if (this.$changedLines.lastRow < lastRow)\n this.$changedLines.lastRow = lastRow;\n }\n if (this.$changedLines.lastRow < this.layerConfig.firstRow) {\n if (force)\n this.$changedLines.lastRow = this.layerConfig.lastRow;\n else\n return;\n }\n if (this.$changedLines.firstRow > this.layerConfig.lastRow)\n return;\n this.$loop.schedule(this.CHANGE_LINES);\n };\n\n this.onChangeNewLineMode = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n this.$textLayer.$updateEolChar();\n this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR);\n };\n \n this.onChangeTabSize = function() {\n this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);\n this.$textLayer.onChangeTabSize();\n };\n this.updateText = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n };\n this.updateFull = function(force) {\n if (force)\n this.$renderChanges(this.CHANGE_FULL, true);\n else\n this.$loop.schedule(this.CHANGE_FULL);\n };\n this.updateFontSize = function() {\n this.$textLayer.checkForSizeChanges();\n };\n\n this.$changes = 0;\n this.$updateSizeAsync = function() {\n if (this.$loop.pending)\n this.$size.$dirty = true;\n else\n this.onResize();\n };\n this.onResize = function(force, gutterWidth, width, height) {\n if (this.resizing > 2)\n return;\n else if (this.resizing > 0)\n this.resizing++;\n else\n this.resizing = force ? 1 : 0;\n var el = this.container;\n if (!height)\n height = el.clientHeight || el.scrollHeight;\n if (!width)\n width = el.clientWidth || el.scrollWidth;\n var changes = this.$updateCachedSize(force, gutterWidth, width, height);\n\n \n if (!this.$size.scrollerHeight || (!width && !height))\n return this.resizing = 0;\n\n if (force)\n this.$gutterLayer.$padding = null;\n\n if (force)\n this.$renderChanges(changes | this.$changes, true);\n else\n this.$loop.schedule(changes | this.$changes);\n\n if (this.resizing)\n this.resizing = 0;\n this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null;\n };\n \n this.$updateCachedSize = function(force, gutterWidth, width, height) {\n height -= (this.$extraHeight || 0);\n var changes = 0;\n var size = this.$size;\n var oldSize = {\n width: size.width,\n height: size.height,\n scrollerHeight: size.scrollerHeight,\n scrollerWidth: size.scrollerWidth\n };\n if (height && (force || size.height != height)) {\n size.height = height;\n changes |= this.CHANGE_SIZE;\n\n size.scrollerHeight = size.height;\n if (this.$horizScroll)\n size.scrollerHeight -= this.scrollBarH.getHeight();\n this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n changes = changes | this.CHANGE_SCROLL;\n }\n\n if (width && (force || size.width != width)) {\n changes |= this.CHANGE_SIZE;\n size.width = width;\n \n if (gutterWidth == null)\n gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n \n this.gutterWidth = gutterWidth;\n \n dom.setStyle(this.scrollBarH.element.style, \"left\", gutterWidth + \"px\");\n dom.setStyle(this.scroller.style, \"left\", gutterWidth + this.margin.left + \"px\");\n size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth() - this.margin.h);\n dom.setStyle(this.$gutter.style, \"left\", this.margin.left + \"px\");\n \n var right = this.scrollBarV.getWidth() + \"px\";\n dom.setStyle(this.scrollBarH.element.style, \"right\", right);\n dom.setStyle(this.scroller.style, \"right\", right);\n dom.setStyle(this.scroller.style, \"bottom\", this.scrollBarH.getHeight());\n\n if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) {\n changes |= this.CHANGE_FULL;\n }\n }\n \n size.$dirty = !width || !height;\n\n if (changes)\n this._signal(\"resize\", oldSize);\n\n return changes;\n };\n\n this.onGutterResize = function(width) {\n var gutterWidth = this.$showGutter ? width : 0;\n if (gutterWidth != this.gutterWidth)\n this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\n\n if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else if (this.$size.$dirty) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else {\n this.$computeLayerConfig();\n }\n };\n this.adjustWrapLimit = function() {\n var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n var limit = Math.floor(availableWidth / this.characterWidth);\n return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\n };\n this.setAnimatedScroll = function(shouldAnimate){\n this.setOption(\"animatedScroll\", shouldAnimate);\n };\n this.getAnimatedScroll = function() {\n return this.$animatedScroll;\n };\n this.setShowInvisibles = function(showInvisibles) {\n this.setOption(\"showInvisibles\", showInvisibles);\n this.session.$bidiHandler.setShowInvisibles(showInvisibles);\n };\n this.getShowInvisibles = function() {\n return this.getOption(\"showInvisibles\");\n };\n this.getDisplayIndentGuides = function() {\n return this.getOption(\"displayIndentGuides\");\n };\n\n this.setDisplayIndentGuides = function(display) {\n this.setOption(\"displayIndentGuides\", display);\n };\n this.setShowPrintMargin = function(showPrintMargin) {\n this.setOption(\"showPrintMargin\", showPrintMargin);\n };\n this.getShowPrintMargin = function() {\n return this.getOption(\"showPrintMargin\");\n };\n this.setPrintMarginColumn = function(showPrintMargin) {\n this.setOption(\"printMarginColumn\", showPrintMargin);\n };\n this.getPrintMarginColumn = function() {\n return this.getOption(\"printMarginColumn\");\n };\n this.getShowGutter = function(){\n return this.getOption(\"showGutter\");\n };\n this.setShowGutter = function(show){\n return this.setOption(\"showGutter\", show);\n };\n\n this.getFadeFoldWidgets = function(){\n return this.getOption(\"fadeFoldWidgets\");\n };\n\n this.setFadeFoldWidgets = function(show) {\n this.setOption(\"fadeFoldWidgets\", show);\n };\n\n this.setHighlightGutterLine = function(shouldHighlight) {\n this.setOption(\"highlightGutterLine\", shouldHighlight);\n };\n\n this.getHighlightGutterLine = function() {\n return this.getOption(\"highlightGutterLine\");\n };\n\n this.$updatePrintMargin = function() {\n if (!this.$showPrintMargin && !this.$printMarginEl)\n return;\n\n if (!this.$printMarginEl) {\n var containerEl = dom.createElement(\"div\");\n containerEl.className = \"ace_layer ace_print-margin-layer\";\n this.$printMarginEl = dom.createElement(\"div\");\n this.$printMarginEl.className = \"ace_print-margin\";\n containerEl.appendChild(this.$printMarginEl);\n this.content.insertBefore(containerEl, this.content.firstChild);\n }\n\n var style = this.$printMarginEl.style;\n style.left = Math.round(this.characterWidth * this.$printMarginColumn + this.$padding) + \"px\";\n style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n \n if (this.session && this.session.$wrap == -1)\n this.adjustWrapLimit();\n };\n this.getContainerElement = function() {\n return this.container;\n };\n this.getMouseEventTarget = function() {\n return this.scroller;\n };\n this.getTextAreaContainer = function() {\n return this.container;\n };\n this.$moveTextAreaToCursor = function() {\n if (this.$isMousePressed) return;\n var style = this.textarea.style;\n var composition = this.$composition;\n if (!this.$keepTextAreaAtCursor && !composition) {\n dom.translate(this.textarea, -100, 0);\n return;\n }\n var pixelPos = this.$cursorLayer.$pixelPos;\n if (!pixelPos)\n return;\n if (composition && composition.markerRange)\n pixelPos = this.$cursorLayer.getPixelPosition(composition.markerRange.start, true);\n \n var config = this.layerConfig;\n var posTop = pixelPos.top;\n var posLeft = pixelPos.left;\n posTop -= config.offset;\n\n var h = composition && composition.useTextareaForIME ? this.lineHeight : HIDE_TEXTAREA ? 0 : 1;\n if (posTop < 0 || posTop > config.height - h) {\n dom.translate(this.textarea, 0, 0);\n return;\n }\n\n var w = 1;\n var maxTop = this.$size.height - h;\n if (!composition) {\n posTop += this.lineHeight;\n }\n else {\n if (composition.useTextareaForIME) {\n var val = this.textarea.value;\n w = this.characterWidth * (this.session.$getStringScreenWidth(val)[0]);\n }\n else {\n posTop += this.lineHeight + 2;\n }\n }\n \n posLeft -= this.scrollLeft;\n if (posLeft > this.$size.scrollerWidth - w)\n posLeft = this.$size.scrollerWidth - w;\n\n posLeft += this.gutterWidth + this.margin.left;\n\n dom.setStyle(style, \"height\", h + \"px\");\n dom.setStyle(style, \"width\", w + \"px\");\n dom.translate(this.textarea, Math.min(posLeft, this.$size.scrollerWidth - w), Math.min(posTop, maxTop));\n };\n this.getFirstVisibleRow = function() {\n return this.layerConfig.firstRow;\n };\n this.getFirstFullyVisibleRow = function() {\n return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\n };\n this.getLastFullyVisibleRow = function() {\n var config = this.layerConfig;\n var lastRow = config.lastRow;\n var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight;\n if (top - this.session.getScrollTop() > config.height - config.lineHeight)\n return lastRow - 1;\n return lastRow;\n };\n this.getLastVisibleRow = function() {\n return this.layerConfig.lastRow;\n };\n\n this.$padding = null;\n this.setPadding = function(padding) {\n this.$padding = padding;\n this.$textLayer.setPadding(padding);\n this.$cursorLayer.setPadding(padding);\n this.$markerFront.setPadding(padding);\n this.$markerBack.setPadding(padding);\n this.$loop.schedule(this.CHANGE_FULL);\n this.$updatePrintMargin();\n };\n \n this.setScrollMargin = function(top, bottom, left, right) {\n var sm = this.scrollMargin;\n sm.top = top|0;\n sm.bottom = bottom|0;\n sm.right = right|0;\n sm.left = left|0;\n sm.v = sm.top + sm.bottom;\n sm.h = sm.left + sm.right;\n if (sm.top && this.scrollTop <= 0 && this.session)\n this.session.setScrollTop(-sm.top);\n this.updateFull();\n };\n \n this.setMargin = function(top, bottom, left, right) {\n var sm = this.margin;\n sm.top = top|0;\n sm.bottom = bottom|0;\n sm.right = right|0;\n sm.left = left|0;\n sm.v = sm.top + sm.bottom;\n sm.h = sm.left + sm.right;\n this.$updateCachedSize(true, this.gutterWidth, this.$size.width, this.$size.height);\n this.updateFull();\n };\n this.getHScrollBarAlwaysVisible = function() {\n return this.$hScrollBarAlwaysVisible;\n };\n this.setHScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"hScrollBarAlwaysVisible\", alwaysVisible);\n };\n this.getVScrollBarAlwaysVisible = function() {\n return this.$vScrollBarAlwaysVisible;\n };\n this.setVScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"vScrollBarAlwaysVisible\", alwaysVisible);\n };\n\n this.$updateScrollBarV = function() {\n var scrollHeight = this.layerConfig.maxHeight;\n var scrollerHeight = this.$size.scrollerHeight;\n if (!this.$maxLines && this.$scrollPastEnd) {\n scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd;\n if (this.scrollTop > scrollHeight - scrollerHeight) {\n scrollHeight = this.scrollTop + scrollerHeight;\n this.scrollBarV.scrollTop = null;\n }\n }\n this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v);\n this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);\n };\n this.$updateScrollBarH = function() {\n this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);\n this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);\n };\n \n this.$frozen = false;\n this.freeze = function() {\n this.$frozen = true;\n };\n \n this.unfreeze = function() {\n this.$frozen = false;\n };\n\n this.$renderChanges = function(changes, force) {\n if (this.$changes) {\n changes |= this.$changes;\n this.$changes = 0;\n }\n if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) {\n this.$changes |= changes;\n return; \n } \n if (this.$size.$dirty) {\n this.$changes |= changes;\n return this.onResize(true);\n }\n if (!this.lineHeight) {\n this.$textLayer.checkForSizeChanges();\n }\n \n this._signal(\"beforeRender\", changes);\n \n if (this.session && this.session.$bidiHandler)\n this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);\n\n var config = this.layerConfig;\n if (changes & this.CHANGE_FULL ||\n changes & this.CHANGE_SIZE ||\n changes & this.CHANGE_TEXT ||\n changes & this.CHANGE_LINES ||\n changes & this.CHANGE_SCROLL ||\n changes & this.CHANGE_H_SCROLL\n ) {\n changes |= this.$computeLayerConfig() | this.$loop.clear();\n if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {\n var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;\n if (st > 0) {\n this.scrollTop = st;\n changes = changes | this.CHANGE_SCROLL;\n changes |= this.$computeLayerConfig() | this.$loop.clear();\n }\n }\n config = this.layerConfig;\n this.$updateScrollBarV();\n if (changes & this.CHANGE_H_SCROLL)\n this.$updateScrollBarH();\n \n dom.translate(this.content, -this.scrollLeft, -config.offset);\n \n var width = config.width + 2 * this.$padding + \"px\";\n var height = config.minHeight + \"px\";\n \n dom.setStyle(this.content.style, \"width\", width);\n dom.setStyle(this.content.style, \"height\", height);\n }\n if (changes & this.CHANGE_H_SCROLL) {\n dom.translate(this.content, -this.scrollLeft, -config.offset);\n this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n }\n if (changes & this.CHANGE_FULL) {\n this.$changedLines = null;\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this._signal(\"afterRender\", changes);\n return;\n }\n if (changes & this.CHANGE_SCROLL) {\n this.$changedLines = null;\n if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n this.$textLayer.update(config);\n else\n this.$textLayer.scrollLines(config);\n\n if (this.$showGutter) {\n if (changes & this.CHANGE_GUTTER || changes & this.CHANGE_LINES)\n this.$gutterLayer.update(config);\n else\n this.$gutterLayer.scrollLines(config);\n }\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this._signal(\"afterRender\", changes);\n return;\n }\n\n if (changes & this.CHANGE_TEXT) {\n this.$changedLines = null;\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_LINES) {\n if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_CURSOR) {\n if (this.$highlightGutterLine)\n this.$gutterLayer.updateLineHighlight(config);\n }\n\n if (changes & this.CHANGE_CURSOR) {\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n this.$markerFront.update(config);\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n this.$markerBack.update(config);\n }\n\n this._signal(\"afterRender\", changes);\n };\n\n \n this.$autosize = function() {\n var height = this.session.getScreenLength() * this.lineHeight;\n var maxHeight = this.$maxLines * this.lineHeight;\n var desiredHeight = Math.min(maxHeight, \n Math.max((this.$minLines || 1) * this.lineHeight, height)\n ) + this.scrollMargin.v + (this.$extraHeight || 0);\n if (this.$horizScroll)\n desiredHeight += this.scrollBarH.getHeight();\n if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight)\n desiredHeight = this.$maxPixelHeight;\n \n var hideScrollbars = desiredHeight <= 2 * this.lineHeight;\n var vScroll = !hideScrollbars && height > maxHeight;\n \n if (desiredHeight != this.desiredHeight ||\n this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\n if (vScroll != this.$vScroll) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n \n var w = this.container.clientWidth;\n this.container.style.height = desiredHeight + \"px\";\n this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\n this.desiredHeight = desiredHeight;\n \n this._signal(\"autosize\");\n }\n };\n \n this.$computeLayerConfig = function() {\n var session = this.session;\n var size = this.$size;\n \n var hideScrollbars = size.height <= 2 * this.lineHeight;\n var screenLines = this.session.getScreenLength();\n var maxHeight = screenLines * this.lineHeight;\n\n var longestLine = this.$getLongestLine();\n \n var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||\n size.scrollerWidth - longestLine - 2 * this.$padding < 0);\n\n var hScrollChanged = this.$horizScroll !== horizScroll;\n if (hScrollChanged) {\n this.$horizScroll = horizScroll;\n this.scrollBarH.setVisible(horizScroll);\n }\n var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine\n if (this.$maxLines && this.lineHeight > 1)\n this.$autosize();\n\n var minHeight = size.scrollerHeight + this.lineHeight;\n \n var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd\n ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n : 0;\n maxHeight += scrollPastEnd;\n \n var sm = this.scrollMargin;\n this.session.setScrollTop(Math.max(-sm.top,\n Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom)));\n\n this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, \n longestLine + 2 * this.$padding - size.scrollerWidth + sm.right)));\n \n var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top);\n var vScrollChanged = vScrollBefore !== vScroll;\n if (vScrollChanged) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n\n var offset = this.scrollTop % this.lineHeight;\n var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n var lastRow = firstRow + lineCount;\n var firstRowScreen, firstRowHeight;\n var lineHeight = this.lineHeight;\n firstRow = session.screenToDocumentRow(firstRow, 0);\n var foldLine = session.getFoldLine(firstRow);\n if (foldLine) {\n firstRow = foldLine.start.row;\n }\n\n firstRowScreen = session.documentToScreenRow(firstRow, 0);\n firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n\n lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\n minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\n firstRowHeight;\n\n offset = this.scrollTop - firstRowScreen * lineHeight;\n\n var changes = 0;\n if (this.layerConfig.width != longestLine || hScrollChanged) \n changes = this.CHANGE_H_SCROLL;\n if (hScrollChanged || vScrollChanged) {\n changes |= this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);\n this._signal(\"scrollbarVisibilityChanged\");\n if (vScrollChanged)\n longestLine = this.$getLongestLine();\n }\n \n this.layerConfig = {\n width : longestLine,\n padding : this.$padding,\n firstRow : firstRow,\n firstRowScreen: firstRowScreen,\n lastRow : lastRow,\n lineHeight : lineHeight,\n characterWidth : this.characterWidth,\n minHeight : minHeight,\n maxHeight : maxHeight,\n offset : offset,\n gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0,\n height : this.$size.scrollerHeight\n };\n\n if (this.session.$bidiHandler)\n this.session.$bidiHandler.setContentWidth(longestLine - this.$padding);\n\n return changes;\n };\n\n this.$updateLines = function() {\n if (!this.$changedLines) return;\n var firstRow = this.$changedLines.firstRow;\n var lastRow = this.$changedLines.lastRow;\n this.$changedLines = null;\n\n var layerConfig = this.layerConfig;\n\n if (firstRow > layerConfig.lastRow + 1) { return; }\n if (lastRow < layerConfig.firstRow) { return; }\n if (lastRow === Infinity) {\n if (this.$showGutter)\n this.$gutterLayer.update(layerConfig);\n this.$textLayer.update(layerConfig);\n return;\n }\n this.$textLayer.updateLines(layerConfig, firstRow, lastRow);\n return true;\n };\n\n this.$getLongestLine = function() {\n var charCount = this.session.getScreenWidth();\n if (this.showInvisibles && !this.session.$useWrapMode)\n charCount += 1;\n \n if (this.$textLayer && charCount > this.$textLayer.MAX_LINE_LENGTH)\n charCount = this.$textLayer.MAX_LINE_LENGTH + 30;\n\n return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));\n };\n this.updateFrontMarkers = function() {\n this.$markerFront.setMarkers(this.session.getMarkers(true));\n this.$loop.schedule(this.CHANGE_MARKER_FRONT);\n };\n this.updateBackMarkers = function() {\n this.$markerBack.setMarkers(this.session.getMarkers());\n this.$loop.schedule(this.CHANGE_MARKER_BACK);\n };\n this.addGutterDecoration = function(row, className){\n this.$gutterLayer.addGutterDecoration(row, className);\n };\n this.removeGutterDecoration = function(row, className){\n this.$gutterLayer.removeGutterDecoration(row, className);\n };\n this.updateBreakpoints = function(rows) {\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.setAnnotations = function(annotations) {\n this.$gutterLayer.setAnnotations(annotations);\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.updateCursor = function() {\n this.$loop.schedule(this.CHANGE_CURSOR);\n };\n this.hideCursor = function() {\n this.$cursorLayer.hideCursor();\n };\n this.showCursor = function() {\n this.$cursorLayer.showCursor();\n };\n\n this.scrollSelectionIntoView = function(anchor, lead, offset) {\n this.scrollCursorIntoView(anchor, offset);\n this.scrollCursorIntoView(lead, offset);\n };\n this.scrollCursorIntoView = function(cursor, offset, $viewMargin) {\n if (this.$size.scrollerHeight === 0)\n return;\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n\n var left = pos.left;\n var top = pos.top;\n \n var topMargin = $viewMargin && $viewMargin.top || 0;\n var bottomMargin = $viewMargin && $viewMargin.bottom || 0;\n \n var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;\n \n if (scrollTop + topMargin > top) {\n if (offset && scrollTop + topMargin > top + this.lineHeight)\n top -= offset * this.$size.scrollerHeight;\n if (top === 0)\n top = -this.scrollMargin.top;\n this.session.setScrollTop(top);\n } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) {\n if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight)\n top += offset * this.$size.scrollerHeight;\n this.session.setScrollTop(top + this.lineHeight + bottomMargin - this.$size.scrollerHeight);\n }\n\n var scrollLeft = this.scrollLeft;\n\n if (scrollLeft > left) {\n if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n left = -this.scrollMargin.left;\n this.session.setScrollLeft(left);\n } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\n this.session.setScrollLeft(0);\n }\n };\n this.getScrollTop = function() {\n return this.session.getScrollTop();\n };\n this.getScrollLeft = function() {\n return this.session.getScrollLeft();\n };\n this.getScrollTopRow = function() {\n return this.scrollTop / this.lineHeight;\n };\n this.getScrollBottomRow = function() {\n return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\n };\n this.scrollToRow = function(row) {\n this.session.setScrollTop(row * this.lineHeight);\n };\n\n this.alignCursor = function(cursor, alignment) {\n if (typeof cursor == \"number\")\n cursor = {row: cursor, column: 0};\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n var h = this.$size.scrollerHeight - this.lineHeight;\n var offset = pos.top - h * (alignment || 0);\n\n this.session.setScrollTop(offset);\n return offset;\n };\n\n this.STEPS = 8;\n this.$calcSteps = function(fromValue, toValue){\n var i = 0;\n var l = this.STEPS;\n var steps = [];\n\n var func = function(t, x_min, dx) {\n return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n };\n\n for (i = 0; i < l; ++i)\n steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n\n return steps;\n };\n this.scrollToLine = function(line, center, animate, callback) {\n var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\n var offset = pos.top;\n if (center)\n offset -= this.$size.scrollerHeight / 2;\n\n var initialScroll = this.scrollTop;\n this.session.setScrollTop(offset);\n if (animate !== false)\n this.animateScrolling(initialScroll, callback);\n };\n\n this.animateScrolling = function(fromValue, callback) {\n var toValue = this.scrollTop;\n if (!this.$animatedScroll)\n return;\n var _self = this;\n \n if (fromValue == toValue)\n return;\n \n if (this.$scrollAnimation) {\n var oldSteps = this.$scrollAnimation.steps;\n if (oldSteps.length) {\n fromValue = oldSteps[0];\n if (fromValue == toValue)\n return;\n }\n }\n \n var steps = _self.$calcSteps(fromValue, toValue);\n this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\n\n clearInterval(this.$timer);\n\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n this.$timer = setInterval(function() {\n if (!_self.session) \n return clearInterval(_self.$timer);\n if (steps.length) {\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n } else if (toValue != null) {\n _self.session.$scrollTop = -1;\n _self.session.setScrollTop(toValue);\n toValue = null;\n } else {\n _self.$timer = clearInterval(_self.$timer);\n _self.$scrollAnimation = null;\n callback && callback();\n }\n }, 10);\n };\n this.scrollToY = function(scrollTop) {\n if (this.scrollTop !== scrollTop) {\n this.$loop.schedule(this.CHANGE_SCROLL);\n this.scrollTop = scrollTop;\n }\n };\n this.scrollToX = function(scrollLeft) {\n if (this.scrollLeft !== scrollLeft)\n this.scrollLeft = scrollLeft;\n this.$loop.schedule(this.CHANGE_H_SCROLL);\n };\n this.scrollTo = function(x, y) {\n this.session.setScrollTop(y);\n this.session.setScrollLeft(y);\n };\n this.scrollBy = function(deltaX, deltaY) {\n deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n };\n this.isScrollableBy = function(deltaX, deltaY) {\n if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\n return true;\n if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\n - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)\n return true;\n if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\n return true;\n if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\n - this.layerConfig.width < -1 + this.scrollMargin.right)\n return true;\n };\n\n this.pixelToScreenCoordinates = function(x, y) {\n var canvasPos;\n if (this.$hasCssTransforms) {\n canvasPos = {top:0, left: 0};\n var p = this.$fontMetrics.transformCoordinates([x, y]);\n x = p[1] - this.gutterWidth - this.margin.left;\n y = p[0];\n } else {\n canvasPos = this.scroller.getBoundingClientRect();\n }\n \n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n var offset = offsetX / this.characterWidth;\n var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset);\n\n return {row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX};\n };\n\n this.screenToTextCoordinates = function(x, y) {\n var canvasPos;\n if (this.$hasCssTransforms) {\n canvasPos = {top:0, left: 0};\n var p = this.$fontMetrics.transformCoordinates([x, y]);\n x = p[1] - this.gutterWidth - this.margin.left;\n y = p[0];\n } else {\n canvasPos = this.scroller.getBoundingClientRect();\n }\n\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n var offset = offsetX / this.characterWidth;\n var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset);\n\n var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n\n return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX);\n };\n this.textToScreenCoordinates = function(row, column) {\n var canvasPos = this.scroller.getBoundingClientRect();\n var pos = this.session.documentToScreenPosition(row, column);\n\n var x = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : Math.round(pos.column * this.characterWidth));\n \n var y = pos.row * this.lineHeight;\n\n return {\n pageX: canvasPos.left + x - this.scrollLeft,\n pageY: canvasPos.top + y - this.scrollTop\n };\n };\n this.visualizeFocus = function() {\n dom.addCssClass(this.container, \"ace_focus\");\n };\n this.visualizeBlur = function() {\n dom.removeCssClass(this.container, \"ace_focus\");\n };\n this.showComposition = function(composition) {\n this.$composition = composition;\n if (!composition.cssText) {\n composition.cssText = this.textarea.style.cssText;\n }\n if (composition.useTextareaForIME == undefined)\n composition.useTextareaForIME = this.$useTextareaForIME;\n \n if (this.$useTextareaForIME) {\n dom.addCssClass(this.textarea, \"ace_composition\");\n this.textarea.style.cssText = \"\";\n this.$moveTextAreaToCursor();\n this.$cursorLayer.element.style.display = \"none\";\n }\n else {\n composition.markerId = this.session.addMarker(composition.markerRange, \"ace_composition_marker\", \"text\");\n }\n };\n this.setCompositionText = function(text) {\n var cursor = this.session.selection.cursor;\n this.addToken(text, \"composition_placeholder\", cursor.row, cursor.column);\n this.$moveTextAreaToCursor();\n };\n this.hideComposition = function() {\n if (!this.$composition)\n return;\n \n if (this.$composition.markerId)\n this.session.removeMarker(this.$composition.markerId);\n\n dom.removeCssClass(this.textarea, \"ace_composition\");\n this.textarea.style.cssText = this.$composition.cssText;\n var cursor = this.session.selection.cursor;\n this.removeExtraToken(cursor.row, cursor.column);\n this.$composition = null;\n this.$cursorLayer.element.style.display = \"\";\n };\n \n this.addToken = function(text, type, row, column) {\n var session = this.session;\n session.bgTokenizer.lines[row] = null;\n var newToken = {type: type, value: text};\n var tokens = session.getTokens(row);\n if (column == null) {\n tokens.push(newToken);\n } else {\n var l = 0;\n for (var i =0; i < tokens.length; i++) {\n var token = tokens[i];\n l += token.value.length;\n if (column <= l) {\n var diff = token.value.length - (l - column);\n var before = token.value.slice(0, diff);\n var after = token.value.slice(diff);\n \n tokens.splice(i, 1, {type: token.type, value: before}, newToken, {type: token.type, value: after});\n break;\n }\n }\n }\n this.updateLines(row, row);\n };\n\n this.removeExtraToken = function(row, column) {\n this.updateLines(row, row);\n };\n this.setTheme = function(theme, cb) {\n var _self = this;\n this.$themeId = theme;\n _self._dispatchEvent('themeChange',{theme:theme});\n\n if (!theme || typeof theme == \"string\") {\n var moduleName = theme || this.$options.theme.initialValue;\n config.loadModule([\"theme\", moduleName], afterLoad);\n } else {\n afterLoad(theme);\n }\n\n function afterLoad(module) {\n if (_self.$themeId != theme)\n return cb && cb();\n if (!module || !module.cssClass)\n throw new Error(\"couldn't load module \" + theme + \" or it didn't call define\");\n if (module.$id)\n _self.$themeId = module.$id;\n dom.importCssString(\n module.cssText,\n module.cssClass,\n _self.container\n );\n\n if (_self.theme)\n dom.removeCssClass(_self.container, _self.theme.cssClass);\n\n var padding = \"padding\" in module ? module.padding \n : \"padding\" in (_self.theme || {}) ? 4 : _self.$padding;\n if (_self.$padding && padding != _self.$padding)\n _self.setPadding(padding);\n _self.$theme = module.cssClass;\n\n _self.theme = module;\n dom.addCssClass(_self.container, module.cssClass);\n dom.setCssClass(_self.container, \"ace_dark\", module.isDark);\n if (_self.$size) {\n _self.$size.width = 0;\n _self.$updateSizeAsync();\n }\n\n _self._dispatchEvent('themeLoaded', {theme:module});\n cb && cb();\n }\n };\n this.getTheme = function() {\n return this.$themeId;\n };\n this.setStyle = function(style, include) {\n dom.setCssClass(this.container, style, include !== false);\n };\n this.unsetStyle = function(style) {\n dom.removeCssClass(this.container, style);\n };\n \n this.setCursorStyle = function(style) {\n dom.setStyle(this.scroller.style, \"cursor\", style);\n };\n this.setMouseCursor = function(cursorStyle) {\n dom.setStyle(this.scroller.style, \"cursor\", cursorStyle);\n };\n \n this.attachToShadowRoot = function() {\n dom.importCssString(editorCss, \"ace_editor.css\", this.container);\n };\n this.destroy = function() {\n this.freeze();\n this.$fontMetrics.destroy();\n this.$cursorLayer.destroy();\n this.removeAllListeners();\n this.container.textContent = \"\";\n };\n\n}).call(VirtualRenderer.prototype);\n\n\nconfig.defineOptions(VirtualRenderer.prototype, \"renderer\", {\n animatedScroll: {initialValue: false},\n showInvisibles: {\n set: function(value) {\n if (this.$textLayer.setShowInvisibles(value))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: false\n },\n showPrintMargin: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: true\n },\n printMarginColumn: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: 80\n },\n printMargin: {\n set: function(val) {\n if (typeof val == \"number\")\n this.$printMarginColumn = val;\n this.$showPrintMargin = !!val;\n this.$updatePrintMargin();\n },\n get: function() {\n return this.$showPrintMargin && this.$printMarginColumn; \n }\n },\n showGutter: {\n set: function(show){\n this.$gutter.style.display = show ? \"block\" : \"none\";\n this.$loop.schedule(this.CHANGE_FULL);\n this.onGutterResize();\n },\n initialValue: true\n },\n fadeFoldWidgets: {\n set: function(show) {\n dom.setCssClass(this.$gutter, \"ace_fade-fold-widgets\", show);\n },\n initialValue: false\n },\n showFoldWidgets: {\n set: function(show) {\n this.$gutterLayer.setShowFoldWidgets(show);\n this.$loop.schedule(this.CHANGE_GUTTER);\n },\n initialValue: true\n },\n displayIndentGuides: {\n set: function(show) {\n if (this.$textLayer.setDisplayIndentGuides(show))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: true\n },\n highlightGutterLine: {\n set: function(shouldHighlight) {\n this.$gutterLayer.setHighlightGutterLine(shouldHighlight);\n this.$loop.schedule(this.CHANGE_GUTTER);\n },\n initialValue: true\n },\n hScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n vScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n fontSize: {\n set: function(size) {\n if (typeof size == \"number\")\n size = size + \"px\";\n this.container.style.fontSize = size;\n this.updateFontSize();\n },\n initialValue: 12\n },\n fontFamily: {\n set: function(name) {\n this.container.style.fontFamily = name;\n this.updateFontSize();\n }\n },\n maxLines: {\n set: function(val) {\n this.updateFull();\n }\n },\n minLines: {\n set: function(val) {\n if (!(this.$minLines < 0x1ffffffffffff))\n this.$minLines = 0;\n this.updateFull();\n }\n },\n maxPixelHeight: {\n set: function(val) {\n this.updateFull();\n },\n initialValue: 0\n },\n scrollPastEnd: {\n set: function(val) {\n val = +val || 0;\n if (this.$scrollPastEnd == val)\n return;\n this.$scrollPastEnd = val;\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: 0,\n handlesSet: true\n },\n fixedWidthGutter: {\n set: function(val) {\n this.$gutterLayer.$fixedWidth = !!val;\n this.$loop.schedule(this.CHANGE_GUTTER);\n }\n },\n theme: {\n set: function(val) { this.setTheme(val); },\n get: function() { return this.$themeId || this.theme; },\n initialValue: \"./theme/textmate\",\n handlesSet: true\n },\n hasCssTransforms: {\n },\n useTextareaForIME: {\n initialValue: !useragent.isMobile && !useragent.isIE\n }\n});\n\nexports.VirtualRenderer = VirtualRenderer;\n});\n\nace.define(\"ace/worker/worker_client\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/event_emitter\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar net = require(\"../lib/net\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\nvar config = require(\"../config\");\n\nfunction $workerBlob(workerUrl) {\n var script = \"importScripts('\" + net.qualifyURL(workerUrl) + \"');\";\n try {\n return new Blob([script], {\"type\": \"application/javascript\"});\n } catch (e) { // Backwards-compatibility\n var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n var blobBuilder = new BlobBuilder();\n blobBuilder.append(script);\n return blobBuilder.getBlob(\"application/javascript\");\n }\n}\n\nfunction createWorker(workerUrl) {\n if (typeof Worker == \"undefined\")\n return { postMessage: function() {}, terminate: function() {} };\n if (config.get(\"loadWorkerFromBlob\")) {\n var blob = $workerBlob(workerUrl);\n var URL = window.URL || window.webkitURL;\n var blobURL = URL.createObjectURL(blob);\n return new Worker(blobURL);\n }\n return new Worker(workerUrl);\n}\n\nvar WorkerClient = function(worker) {\n if (!worker.postMessage)\n worker = this.$createWorkerFromOldConfig.apply(this, arguments);\n\n this.$worker = worker;\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.onMessage = this.onMessage.bind(this);\n\n this.callbackId = 1;\n this.callbacks = {};\n\n this.$worker.onmessage = this.onMessage;\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.$createWorkerFromOldConfig = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) {\n if (require.nameToUrl && !require.toUrl)\n require.toUrl = require.nameToUrl;\n\n if (config.get(\"packaged\") || !require.toUrl) {\n workerUrl = workerUrl || config.moduleUrl(mod, \"worker\");\n } else {\n var normalizePath = this.$normalizePath;\n workerUrl = workerUrl || normalizePath(require.toUrl(\"ace/worker/worker.js\", null, \"_\"));\n\n var tlns = {};\n topLevelNamespaces.forEach(function(ns) {\n tlns[ns] = normalizePath(require.toUrl(ns, null, \"_\").replace(/(\\.js)?(\\?.*)?$/, \"\"));\n });\n }\n\n this.$worker = createWorker(workerUrl);\n if (importScripts) {\n this.send(\"importScripts\", importScripts);\n }\n this.$worker.postMessage({\n init : true,\n tlns : tlns,\n module : mod,\n classname : classname\n });\n return this.$worker;\n };\n\n this.onMessage = function(e) {\n var msg = e.data;\n switch (msg.type) {\n case \"event\":\n this._signal(msg.name, {data: msg.data});\n break;\n case \"call\":\n var callback = this.callbacks[msg.id];\n if (callback) {\n callback(msg.data);\n delete this.callbacks[msg.id];\n }\n break;\n case \"error\":\n this.reportError(msg.data);\n break;\n case \"log\":\n window.console && console.log && console.log.apply(console, msg.data);\n break;\n }\n };\n \n this.reportError = function(err) {\n window.console && console.error && console.error(err);\n };\n\n this.$normalizePath = function(path) {\n return net.qualifyURL(path);\n };\n\n this.terminate = function() {\n this._signal(\"terminate\", {});\n this.deltaQueue = null;\n this.$worker.terminate();\n this.$worker = null;\n if (this.$doc)\n this.$doc.off(\"change\", this.changeListener);\n this.$doc = null;\n };\n\n this.send = function(cmd, args) {\n this.$worker.postMessage({command: cmd, args: args});\n };\n\n this.call = function(cmd, args, callback) {\n if (callback) {\n var id = this.callbackId++;\n this.callbacks[id] = callback;\n args.push(id);\n }\n this.send(cmd, args);\n };\n\n this.emit = function(event, data) {\n try {\n if (data.data && data.data.err)\n data.data.err = {message: data.data.err.message, stack: data.data.err.stack, code: data.data.err.code};\n this.$worker.postMessage({event: event, data: {data: data.data}});\n }\n catch(ex) {\n console.error(ex.stack);\n }\n };\n\n this.attachToDocument = function(doc) {\n if (this.$doc)\n this.terminate();\n\n this.$doc = doc;\n this.call(\"setValue\", [doc.getValue()]);\n doc.on(\"change\", this.changeListener);\n };\n\n this.changeListener = function(delta) {\n if (!this.deltaQueue) {\n this.deltaQueue = [];\n setTimeout(this.$sendDeltaQueue, 0);\n }\n if (delta.action == \"insert\")\n this.deltaQueue.push(delta.start, delta.lines);\n else\n this.deltaQueue.push(delta.start, delta.end);\n };\n\n this.$sendDeltaQueue = function() {\n var q = this.deltaQueue;\n if (!q) return;\n this.deltaQueue = null;\n if (q.length > 50 && q.length > this.$doc.getLength() >> 1) {\n this.call(\"setValue\", [this.$doc.getValue()]);\n } else\n this.emit(\"change\", {data: q});\n };\n\n}).call(WorkerClient.prototype);\n\n\nvar UIWorkerClient = function(topLevelNamespaces, mod, classname) {\n var main = null;\n var emitSync = false;\n var sender = Object.create(EventEmitter);\n\n var messageBuffer = [];\n var workerClient = new WorkerClient({\n messageBuffer: messageBuffer,\n terminate: function() {},\n postMessage: function(e) {\n messageBuffer.push(e);\n if (!main) return;\n if (emitSync)\n setTimeout(processNext);\n else\n processNext();\n }\n });\n\n workerClient.setEmitSync = function(val) { emitSync = val; };\n\n var processNext = function() {\n var msg = messageBuffer.shift();\n if (msg.command)\n main[msg.command].apply(main, msg.args);\n else if (msg.event)\n sender._signal(msg.event, msg.data);\n };\n\n sender.postMessage = function(msg) {\n workerClient.onMessage({data: msg});\n };\n sender.callback = function(data, callbackId) {\n this.postMessage({type: \"call\", id: callbackId, data: data});\n };\n sender.emit = function(name, data) {\n this.postMessage({type: \"event\", name: name, data: data});\n };\n\n config.loadModule([\"worker\", mod], function(Main) {\n main = new Main[classname](sender);\n while (messageBuffer.length)\n processNext();\n });\n\n return workerClient;\n};\n\nexports.UIWorkerClient = UIWorkerClient;\nexports.WorkerClient = WorkerClient;\nexports.createWorker = createWorker;\n\n\n});\n\nace.define(\"ace/placeholder\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"./range\").Range;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar oop = require(\"./lib/oop\");\n\nvar PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {\n var _self = this;\n this.length = length;\n this.session = session;\n this.doc = session.getDocument();\n this.mainClass = mainClass;\n this.othersClass = othersClass;\n this.$onUpdate = this.onUpdate.bind(this);\n this.doc.on(\"change\", this.$onUpdate);\n this.$others = others;\n \n this.$onCursorChange = function() {\n setTimeout(function() {\n _self.onCursorChange();\n });\n };\n \n this.$pos = pos;\n var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};\n this.$undoStackDepth = undoStack.length;\n this.setup();\n\n session.selection.on(\"changeCursor\", this.$onCursorChange);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setup = function() {\n var _self = this;\n var doc = this.doc;\n var session = this.session;\n \n this.selectionBefore = session.selection.toJSON();\n if (session.selection.inMultiSelectMode)\n session.selection.toSingleRange();\n\n this.pos = doc.createAnchor(this.$pos.row, this.$pos.column);\n var pos = this.pos;\n pos.$insertRight = true;\n pos.detach();\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n this.others = [];\n this.$others.forEach(function(other) {\n var anchor = doc.createAnchor(other.row, other.column);\n anchor.$insertRight = true;\n anchor.detach();\n _self.others.push(anchor);\n });\n session.setUndoSelect(false);\n };\n this.showOtherMarkers = function() {\n if (this.othersActive) return;\n var session = this.session;\n var _self = this;\n this.othersActive = true;\n this.others.forEach(function(anchor) {\n anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);\n });\n };\n this.hideOtherMarkers = function() {\n if (!this.othersActive) return;\n this.othersActive = false;\n for (var i = 0; i < this.others.length; i++) {\n this.session.removeMarker(this.others[i].markerId);\n }\n };\n this.onUpdate = function(delta) {\n if (this.$updating)\n return this.updateAnchors(delta);\n \n var range = delta;\n if (range.start.row !== range.end.row) return;\n if (range.start.row !== this.pos.row) return;\n this.$updating = true;\n var lengthDiff = delta.action === \"insert\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1;\n var distanceFromStart = range.start.column - this.pos.column;\n \n this.updateAnchors(delta);\n \n if (inMainRange)\n this.length += lengthDiff;\n\n if (inMainRange && !this.session.$fromUndo) {\n if (delta.action === 'insert') {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n this.doc.insertMergedLines(newPos, delta.lines);\n }\n } else if (delta.action === 'remove') {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n }\n }\n }\n \n this.$updating = false;\n this.updateMarkers();\n };\n \n this.updateAnchors = function(delta) {\n this.pos.onChange(delta);\n for (var i = this.others.length; i--;)\n this.others[i].onChange(delta);\n this.updateMarkers();\n };\n \n this.updateMarkers = function() {\n if (this.$updating)\n return;\n var _self = this;\n var session = this.session;\n var updateMarker = function(pos, className) {\n session.removeMarker(pos.markerId);\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false);\n };\n updateMarker(this.pos, this.mainClass);\n for (var i = this.others.length; i--;)\n updateMarker(this.others[i], this.othersClass);\n };\n\n this.onCursorChange = function(event) {\n if (this.$updating || !this.session) return;\n var pos = this.session.selection.getCursor();\n if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {\n this.showOtherMarkers();\n this._emit(\"cursorEnter\", event);\n } else {\n this.hideOtherMarkers();\n this._emit(\"cursorLeave\", event);\n }\n }; \n this.detach = function() {\n this.session.removeMarker(this.pos && this.pos.markerId);\n this.hideOtherMarkers();\n this.doc.off(\"change\", this.$onUpdate);\n this.session.selection.off(\"changeCursor\", this.$onCursorChange);\n this.session.setUndoSelect(true);\n this.session = null;\n };\n this.cancel = function() {\n if (this.$undoStackDepth === -1)\n return;\n var undoManager = this.session.getUndoManager();\n var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;\n for (var i = 0; i < undosRequired; i++) {\n undoManager.undo(this.session, true);\n }\n if (this.selectionBefore)\n this.session.selection.fromJSON(this.selectionBefore);\n };\n}).call(PlaceHolder.prototype);\n\n\nexports.PlaceHolder = PlaceHolder;\n});\n\nace.define(\"ace/mouse/multi_select_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(require, exports, module) {\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\n\nfunction onMouseDown(e) {\n var ev = e.domEvent;\n var alt = ev.altKey;\n var shift = ev.shiftKey;\n var ctrl = ev.ctrlKey;\n var accel = e.getAccelKey();\n var button = e.getButton();\n \n if (ctrl && useragent.isMac)\n button = ev.button;\n\n if (e.editor.inMultiSelectMode && button == 2) {\n e.editor.textInput.onContextMenu(e.domEvent);\n return;\n }\n \n if (!ctrl && !alt && !accel) {\n if (button === 0 && e.editor.inMultiSelectMode)\n e.editor.exitMultiSelectMode();\n return;\n }\n \n if (button !== 0)\n return;\n\n var editor = e.editor;\n var selection = editor.selection;\n var isMultiSelect = editor.inMultiSelectMode;\n var pos = e.getDocumentPosition();\n var cursor = selection.getCursor();\n var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));\n\n var mouseX = e.x, mouseY = e.y;\n var onMouseSelection = function(e) {\n mouseX = e.clientX;\n mouseY = e.clientY;\n };\n \n var session = editor.session;\n var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var screenCursor = screenAnchor;\n \n var selectionMode;\n if (editor.$mouseHandler.$enableJumpToDef) {\n if (ctrl && alt || accel && alt)\n selectionMode = shift ? \"block\" : \"add\";\n else if (alt && editor.$blockSelectEnabled)\n selectionMode = \"block\";\n } else {\n if (accel && !alt) {\n selectionMode = \"add\";\n if (!isMultiSelect && shift)\n return;\n } else if (alt && editor.$blockSelectEnabled) {\n selectionMode = \"block\";\n }\n }\n \n if (selectionMode && useragent.isMac && ev.ctrlKey) {\n editor.$mouseHandler.cancelContextMenu();\n }\n\n if (selectionMode == \"add\") {\n if (!isMultiSelect && inSelection)\n return; // dragging\n\n if (!isMultiSelect) {\n var range = selection.toOrientedRange();\n editor.addSelectionMarker(range);\n }\n\n var oldRange = selection.rangeList.rangeAtPoint(pos);\n \n editor.inVirtualSelectionMode = true;\n \n if (shift) {\n oldRange = null;\n range = selection.ranges[0] || range;\n editor.removeSelectionMarker(range);\n }\n editor.once(\"mouseup\", function() {\n var tmpSel = selection.toOrientedRange();\n\n if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))\n selection.substractPoint(tmpSel.cursor);\n else {\n if (shift) {\n selection.substractPoint(range.cursor);\n } else if (range) {\n editor.removeSelectionMarker(range);\n selection.addRange(range);\n }\n selection.addRange(tmpSel);\n }\n editor.inVirtualSelectionMode = false;\n });\n\n } else if (selectionMode == \"block\") {\n e.stop();\n editor.inVirtualSelectionMode = true; \n var initialRange;\n var rectSel = [];\n var blockSelect = function() {\n var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX);\n\n if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))\n return;\n screenCursor = newCursor;\n \n editor.selection.moveToPosition(cursor);\n editor.renderer.scrollCursorIntoView();\n\n editor.removeSelectionMarkers(rectSel);\n rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\n if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())\n rectSel[0] = editor.$mouseHandler.$clickSelection.clone();\n rectSel.forEach(editor.addSelectionMarker, editor);\n editor.updateSelectionMarkers();\n };\n if (isMultiSelect && !accel) {\n selection.toSingleRange();\n } else if (!isMultiSelect && accel) {\n initialRange = selection.toOrientedRange();\n editor.addSelectionMarker(initialRange);\n }\n \n if (shift)\n screenAnchor = session.documentToScreenPosition(selection.lead); \n else\n selection.moveToPosition(pos);\n \n screenCursor = {row: -1, column: -1};\n\n var onMouseSelectionEnd = function(e) {\n blockSelect();\n clearInterval(timerId);\n editor.removeSelectionMarkers(rectSel);\n if (!rectSel.length)\n rectSel = [selection.toOrientedRange()];\n if (initialRange) {\n editor.removeSelectionMarker(initialRange);\n selection.toSingleRange(initialRange);\n }\n for (var i = 0; i < rectSel.length; i++)\n selection.addRange(rectSel[i]);\n editor.inVirtualSelectionMode = false;\n editor.$mouseHandler.$clickSelection = null;\n };\n\n var onSelectionInterval = blockSelect;\n\n event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\n var timerId = setInterval(function() {onSelectionInterval();}, 20);\n\n return e.preventDefault();\n }\n}\n\n\nexports.onMouseDown = onMouseDown;\n\n});\n\nace.define(\"ace/commands/multi_select_commands\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\"], function(require, exports, module) {\nexports.defaultCommands = [{\n name: \"addCursorAbove\",\n description: \"Add cursor above\",\n exec: function(editor) { editor.selectMoreLines(-1); },\n bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelow\",\n description: \"Add cursor below\",\n exec: function(editor) { editor.selectMoreLines(1); },\n bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorAboveSkipCurrent\",\n description: \"Add cursor above (skip current)\",\n exec: function(editor) { editor.selectMoreLines(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelowSkipCurrent\",\n description: \"Add cursor below (skip current)\",\n exec: function(editor) { editor.selectMoreLines(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreBefore\",\n description: \"Select more before\",\n exec: function(editor) { editor.selectMore(-1); },\n bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreAfter\",\n description: \"Select more after\",\n exec: function(editor) { editor.selectMore(1); },\n bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextBefore\",\n description: \"Select next before\",\n exec: function(editor) { editor.selectMore(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextAfter\",\n description: \"Select next after\",\n exec: function(editor) { editor.selectMore(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"toggleSplitSelectionIntoLines\",\n description: \"Split into lines\",\n exec: function(editor) {\n if (editor.multiSelect.rangeCount > 1)\n editor.multiSelect.joinSelections();\n else\n editor.multiSelect.splitIntoLines();\n },\n bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n readOnly: true\n}, {\n name: \"splitSelectionIntoLines\",\n description: \"Split into lines\",\n exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n readOnly: true\n}, {\n name: \"alignCursors\",\n description: \"Align cursors\",\n exec: function(editor) { editor.alignCursors(); },\n bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"},\n scrollIntoView: \"cursor\"\n}, {\n name: \"findAll\",\n description: \"Find all\",\n exec: function(editor) { editor.findAll(); },\n bindKey: {win: \"Ctrl-Alt-K\", mac: \"Ctrl-Alt-G\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}];\nexports.multiSelectCommands = [{\n name: \"singleSelection\",\n description: \"Single selection\",\n bindKey: \"esc\",\n exec: function(editor) { editor.exitMultiSelectMode(); },\n scrollIntoView: \"cursor\",\n readOnly: true,\n isAvailable: function(editor) {return editor && editor.inMultiSelectMode;}\n}];\n\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nexports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\n\n});\n\nace.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) {\n\nvar RangeList = require(\"./range_list\").RangeList;\nvar Range = require(\"./range\").Range;\nvar Selection = require(\"./selection\").Selection;\nvar onMouseDown = require(\"./mouse/multi_select_handler\").onMouseDown;\nvar event = require(\"./lib/event\");\nvar lang = require(\"./lib/lang\");\nvar commands = require(\"./commands/multi_select_commands\");\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\nvar Search = require(\"./search\").Search;\nvar search = new Search();\n\nfunction find(session, needle, dir) {\n search.$options.wrap = true;\n search.$options.needle = needle;\n search.$options.backwards = dir == -1;\n return search.find(session);\n}\nvar EditSession = require(\"./edit_session\").EditSession;\n(function() {\n this.getSelectionMarkers = function() {\n return this.$selectionMarkers;\n };\n}).call(EditSession.prototype);\n(function() {\n this.ranges = null;\n this.rangeList = null;\n this.addRange = function(range, $blockChangeEvents) {\n if (!range)\n return;\n\n if (!this.inMultiSelectMode && this.rangeCount === 0) {\n var oldRange = this.toOrientedRange();\n this.rangeList.add(oldRange);\n this.rangeList.add(range);\n if (this.rangeList.ranges.length != 2) {\n this.rangeList.removeAll();\n return $blockChangeEvents || this.fromOrientedRange(range);\n }\n this.rangeList.removeAll();\n this.rangeList.add(oldRange);\n this.$onAddRange(oldRange);\n }\n\n if (!range.cursor)\n range.cursor = range.end;\n\n var removed = this.rangeList.add(range);\n\n this.$onAddRange(range);\n\n if (removed.length)\n this.$onRemoveRange(removed);\n\n if (this.rangeCount > 1 && !this.inMultiSelectMode) {\n this._signal(\"multiSelect\");\n this.inMultiSelectMode = true;\n this.session.$undoSelect = false;\n this.rangeList.attach(this.session);\n }\n\n return $blockChangeEvents || this.fromOrientedRange(range);\n };\n this.toSingleRange = function(range) {\n range = range || this.ranges[0];\n var removed = this.rangeList.removeAll();\n if (removed.length)\n this.$onRemoveRange(removed);\n\n range && this.fromOrientedRange(range);\n };\n this.substractPoint = function(pos) {\n var removed = this.rangeList.substractPoint(pos);\n if (removed) {\n this.$onRemoveRange(removed);\n return removed[0];\n }\n };\n this.mergeOverlappingRanges = function() {\n var removed = this.rangeList.merge();\n if (removed.length)\n this.$onRemoveRange(removed);\n };\n\n this.$onAddRange = function(range) {\n this.rangeCount = this.rangeList.ranges.length;\n this.ranges.unshift(range);\n this._signal(\"addRange\", {range: range});\n };\n\n this.$onRemoveRange = function(removed) {\n this.rangeCount = this.rangeList.ranges.length;\n if (this.rangeCount == 1 && this.inMultiSelectMode) {\n var lastRange = this.rangeList.ranges.pop();\n removed.push(lastRange);\n this.rangeCount = 0;\n }\n\n for (var i = removed.length; i--; ) {\n var index = this.ranges.indexOf(removed[i]);\n this.ranges.splice(index, 1);\n }\n\n this._signal(\"removeRange\", {ranges: removed});\n\n if (this.rangeCount === 0 && this.inMultiSelectMode) {\n this.inMultiSelectMode = false;\n this._signal(\"singleSelect\");\n this.session.$undoSelect = true;\n this.rangeList.detach(this.session);\n }\n\n lastRange = lastRange || this.ranges[0];\n if (lastRange && !lastRange.isEqual(this.getRange()))\n this.fromOrientedRange(lastRange);\n };\n this.$initRangeList = function() {\n if (this.rangeList)\n return;\n\n this.rangeList = new RangeList();\n this.ranges = [];\n this.rangeCount = 0;\n };\n this.getAllRanges = function() {\n return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\n };\n this.splitIntoLines = function () {\n var ranges = this.ranges.length ? this.ranges : [this.getRange()];\n var newRanges = [];\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n var row = range.start.row;\n var endRow = range.end.row;\n if (row === endRow) {\n newRanges.push(range.clone());\n } else {\n newRanges.push(new Range(row, range.start.column, row, this.session.getLine(row).length));\n while (++row < endRow)\n newRanges.push(this.getLineRange(row, true));\n newRanges.push(new Range(endRow, 0, endRow, range.end.column));\n }\n if (i == 0 && !this.isBackwards())\n newRanges = newRanges.reverse();\n }\n this.toSingleRange();\n for (var i = newRanges.length; i--;)\n this.addRange(newRanges[i]);\n };\n \n this.joinSelections = function () {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n };\n this.toggleBlockSelection = function () {\n if (this.rangeCount > 1) {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n } else {\n var cursor = this.session.documentToScreenPosition(this.cursor);\n var anchor = this.session.documentToScreenPosition(this.anchor);\n\n var rectSel = this.rectangularRangeBlock(cursor, anchor);\n rectSel.forEach(this.addRange, this);\n }\n };\n this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\n var rectSel = [];\n\n var xBackwards = screenCursor.column < screenAnchor.column;\n if (xBackwards) {\n var startColumn = screenCursor.column;\n var endColumn = screenAnchor.column;\n var startOffsetX = screenCursor.offsetX;\n var endOffsetX = screenAnchor.offsetX;\n } else {\n var startColumn = screenAnchor.column;\n var endColumn = screenCursor.column;\n var startOffsetX = screenAnchor.offsetX;\n var endOffsetX = screenCursor.offsetX;\n }\n\n var yBackwards = screenCursor.row < screenAnchor.row;\n if (yBackwards) {\n var startRow = screenCursor.row;\n var endRow = screenAnchor.row;\n } else {\n var startRow = screenAnchor.row;\n var endRow = screenCursor.row;\n }\n\n if (startColumn < 0)\n startColumn = 0;\n if (startRow < 0)\n startRow = 0;\n\n if (startRow == endRow)\n includeEmptyLines = true;\n\n var docEnd;\n for (var row = startRow; row <= endRow; row++) {\n var range = Range.fromPoints(\n this.session.screenToDocumentPosition(row, startColumn, startOffsetX),\n this.session.screenToDocumentPosition(row, endColumn, endOffsetX)\n );\n if (range.isEmpty()) {\n if (docEnd && isSamePoint(range.end, docEnd))\n break;\n docEnd = range.end;\n }\n range.cursor = xBackwards ? range.start : range.end;\n rectSel.push(range);\n }\n\n if (yBackwards)\n rectSel.reverse();\n\n if (!includeEmptyLines) {\n var end = rectSel.length - 1;\n while (rectSel[end].isEmpty() && end > 0)\n end--;\n if (end > 0) {\n var start = 0;\n while (rectSel[start].isEmpty())\n start++;\n }\n for (var i = end; i >= start; i--) {\n if (rectSel[i].isEmpty())\n rectSel.splice(i, 1);\n }\n }\n\n return rectSel;\n };\n}).call(Selection.prototype);\nvar Editor = require(\"./editor\").Editor;\n(function() {\n this.updateSelectionMarkers = function() {\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n this.addSelectionMarker = function(orientedRange) {\n if (!orientedRange.cursor)\n orientedRange.cursor = orientedRange.end;\n\n var style = this.getSelectionStyle();\n orientedRange.marker = this.session.addMarker(orientedRange, \"ace_selection\", style);\n\n this.session.$selectionMarkers.push(orientedRange);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n return orientedRange;\n };\n this.removeSelectionMarker = function(range) {\n if (!range.marker)\n return;\n this.session.removeMarker(range.marker);\n var index = this.session.$selectionMarkers.indexOf(range);\n if (index != -1)\n this.session.$selectionMarkers.splice(index, 1);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n };\n\n this.removeSelectionMarkers = function(ranges) {\n var markerList = this.session.$selectionMarkers;\n for (var i = ranges.length; i--; ) {\n var range = ranges[i];\n if (!range.marker)\n continue;\n this.session.removeMarker(range.marker);\n var index = markerList.indexOf(range);\n if (index != -1)\n markerList.splice(index, 1);\n }\n this.session.selectionMarkerCount = markerList.length;\n };\n\n this.$onAddRange = function(e) {\n this.addSelectionMarker(e.range);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onRemoveRange = function(e) {\n this.removeSelectionMarkers(e.ranges);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onMultiSelect = function(e) {\n if (this.inMultiSelectMode)\n return;\n this.inMultiSelectMode = true;\n\n this.setStyle(\"ace_multiselect\");\n this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\n this.commands.setDefaultHandler(\"exec\", this.$onMultiSelectExec);\n\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onSingleSelect = function(e) {\n if (this.session.multiSelect.inVirtualMode)\n return;\n this.inMultiSelectMode = false;\n\n this.unsetStyle(\"ace_multiselect\");\n this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\n\n this.commands.removeDefaultHandler(\"exec\", this.$onMultiSelectExec);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n this._emit(\"changeSelection\");\n };\n\n this.$onMultiSelectExec = function(e) {\n var command = e.command;\n var editor = e.editor;\n if (!editor.multiSelect)\n return;\n if (!command.multiSelectAction) {\n var result = command.exec(editor, e.args || {});\n editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\n editor.multiSelect.mergeOverlappingRanges();\n } else if (command.multiSelectAction == \"forEach\") {\n result = editor.forEachSelection(command, e.args);\n } else if (command.multiSelectAction == \"forEachLine\") {\n result = editor.forEachSelection(command, e.args, true);\n } else if (command.multiSelectAction == \"single\") {\n editor.exitMultiSelectMode();\n result = command.exec(editor, e.args || {});\n } else {\n result = command.multiSelectAction(editor, e.args || {});\n }\n return result;\n }; \n this.forEachSelection = function(cmd, args, options) {\n if (this.inVirtualSelectionMode)\n return;\n var keepOrder = options && options.keepOrder;\n var $byLines = options == true || options && options.$byLines;\n var session = this.session;\n var selection = this.selection;\n var rangeList = selection.rangeList;\n var ranges = (keepOrder ? selection : rangeList).ranges;\n var result;\n \n if (!ranges.length)\n return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n \n var reg = selection._eventRegistry;\n selection._eventRegistry = {};\n\n var tmpSel = new Selection(session);\n this.inVirtualSelectionMode = true;\n for (var i = ranges.length; i--;) {\n if ($byLines) {\n while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)\n i--;\n }\n tmpSel.fromOrientedRange(ranges[i]);\n tmpSel.index = i;\n this.selection = session.selection = tmpSel;\n var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n if (!result && cmdResult !== undefined)\n result = cmdResult;\n tmpSel.toOrientedRange(ranges[i]);\n }\n tmpSel.detach();\n\n this.selection = session.selection = selection;\n this.inVirtualSelectionMode = false;\n selection._eventRegistry = reg;\n selection.mergeOverlappingRanges();\n if (selection.ranges[0])\n selection.fromOrientedRange(selection.ranges[0]);\n \n var anim = this.renderer.$scrollAnimation;\n this.onCursorChange();\n this.onSelectionChange();\n if (anim && anim.from == anim.to)\n this.renderer.animateScrolling(anim.from);\n \n return result;\n };\n this.exitMultiSelectMode = function() {\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\n return;\n this.multiSelect.toSingleRange();\n };\n\n this.getSelectedText = function() {\n var text = \"\";\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var ranges = this.multiSelect.rangeList.ranges;\n var buf = [];\n for (var i = 0; i < ranges.length; i++) {\n buf.push(this.session.getTextRange(ranges[i]));\n }\n var nl = this.session.getDocument().getNewLineCharacter();\n text = buf.join(nl);\n if (text.length == (buf.length - 1) * nl.length)\n text = \"\";\n } else if (!this.selection.isEmpty()) {\n text = this.session.getTextRange(this.getSelectionRange());\n }\n return text;\n };\n \n this.$checkMultiselectChange = function(e, anchor) {\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var range = this.multiSelect.ranges[0];\n if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)\n return;\n var pos = anchor == this.multiSelect.anchor\n ? range.cursor == range.start ? range.end : range.start\n : range.cursor;\n if (pos.row != anchor.row \n || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)\n this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());\n else\n this.multiSelect.mergeOverlappingRanges();\n }\n };\n this.findAll = function(needle, options, additive) {\n options = options || {};\n options.needle = needle || options.needle;\n if (options.needle == undefined) {\n var range = this.selection.isEmpty()\n ? this.selection.getWordRange()\n : this.selection.getRange();\n options.needle = this.session.getTextRange(range);\n } \n this.$search.set(options);\n \n var ranges = this.$search.findAll(this.session);\n if (!ranges.length)\n return 0;\n\n var selection = this.multiSelect;\n\n if (!additive)\n selection.toSingleRange(ranges[0]);\n\n for (var i = ranges.length; i--; )\n selection.addRange(ranges[i], true);\n if (range && selection.rangeList.rangeAtPoint(range.start))\n selection.addRange(range, true);\n \n return ranges.length;\n };\n this.selectMoreLines = function(dir, skip) {\n var range = this.selection.toOrientedRange();\n var isBackwards = range.cursor == range.end;\n\n var screenLead = this.session.documentToScreenPosition(range.cursor);\n if (this.selection.$desiredColumn)\n screenLead.column = this.selection.$desiredColumn;\n\n var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\n\n if (!range.isEmpty()) {\n var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\n var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\n } else {\n var anchor = lead;\n }\n\n if (isBackwards) {\n var newRange = Range.fromPoints(lead, anchor);\n newRange.cursor = newRange.start;\n } else {\n var newRange = Range.fromPoints(anchor, lead);\n newRange.cursor = newRange.end;\n }\n\n newRange.desiredColumn = screenLead.column;\n if (!this.selection.inMultiSelectMode) {\n this.selection.addRange(range);\n } else {\n if (skip)\n var toRemove = range.cursor;\n }\n\n this.selection.addRange(newRange);\n if (toRemove)\n this.selection.substractPoint(toRemove);\n };\n this.transposeSelections = function(dir) {\n var session = this.session;\n var sel = session.multiSelect;\n var all = sel.ranges;\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n if (range.isEmpty()) {\n var tmp = session.getWordRange(range.start.row, range.start.column);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n range.end.row = tmp.end.row;\n range.end.column = tmp.end.column;\n }\n }\n sel.mergeOverlappingRanges();\n\n var words = [];\n for (var i = all.length; i--; ) {\n var range = all[i];\n words.unshift(session.getTextRange(range));\n }\n\n if (dir < 0)\n words.unshift(words.pop());\n else\n words.push(words.shift());\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n var tmp = range.clone();\n session.replace(range, words[i]);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n }\n sel.fromOrientedRange(sel.ranges[0]);\n };\n this.selectMore = function(dir, skip, stopAtFirst) {\n var session = this.session;\n var sel = session.multiSelect;\n\n var range = sel.toOrientedRange();\n if (range.isEmpty()) {\n range = session.getWordRange(range.start.row, range.start.column);\n range.cursor = dir == -1 ? range.start : range.end;\n this.multiSelect.addRange(range);\n if (stopAtFirst)\n return;\n }\n var needle = session.getTextRange(range);\n\n var newRange = find(session, needle, dir);\n if (newRange) {\n newRange.cursor = dir == -1 ? newRange.start : newRange.end;\n this.session.unfold(newRange);\n this.multiSelect.addRange(newRange);\n this.renderer.scrollCursorIntoView(null, 0.5);\n }\n if (skip)\n this.multiSelect.substractPoint(range.cursor);\n };\n this.alignCursors = function() {\n var session = this.session;\n var sel = session.multiSelect;\n var ranges = sel.ranges;\n var row = -1;\n var sameRowRanges = ranges.filter(function(r) {\n if (r.cursor.row == row)\n return true;\n row = r.cursor.row;\n });\n \n if (!ranges.length || sameRowRanges.length == ranges.length - 1) {\n var range = this.selection.getRange();\n var fr = range.start.row, lr = range.end.row;\n var guessRange = fr == lr;\n if (guessRange) {\n var max = this.session.getLength();\n var line;\n do {\n line = this.session.getLine(lr);\n } while (/[=:]/.test(line) && ++lr < max);\n do {\n line = this.session.getLine(fr);\n } while (/[=:]/.test(line) && --fr > 0);\n \n if (fr < 0) fr = 0;\n if (lr >= max) lr = max - 1;\n }\n var lines = this.session.removeFullLines(fr, lr);\n lines = this.$reAlignText(lines, guessRange);\n this.session.insert({row: fr, column: 0}, lines.join(\"\\n\") + \"\\n\");\n if (!guessRange) {\n range.start.column = 0;\n range.end.column = lines[lines.length - 1].length;\n }\n this.selection.setRange(range);\n } else {\n sameRowRanges.forEach(function(r) {\n sel.substractPoint(r.cursor);\n });\n\n var maxCol = 0;\n var minSpace = Infinity;\n var spaceOffsets = ranges.map(function(r) {\n var p = r.cursor;\n var line = session.getLine(p.row);\n var spaceOffset = line.substr(p.column).search(/\\S/g);\n if (spaceOffset == -1)\n spaceOffset = 0;\n\n if (p.column > maxCol)\n maxCol = p.column;\n if (spaceOffset < minSpace)\n minSpace = spaceOffset;\n return spaceOffset;\n });\n ranges.forEach(function(r, i) {\n var p = r.cursor;\n var l = maxCol - p.column;\n var d = spaceOffsets[i] - minSpace;\n if (l > d)\n session.insert(p, lang.stringRepeat(\" \", l - d));\n else\n session.remove(new Range(p.row, p.column, p.row, p.column - l + d));\n\n r.start.column = r.end.column = maxCol;\n r.start.row = r.end.row = p.row;\n r.cursor = r.end;\n });\n sel.fromOrientedRange(ranges[0]);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n }\n };\n\n this.$reAlignText = function(lines, forceLeft) {\n var isLeftAligned = true, isRightAligned = true;\n var startW, textW, endW;\n\n return lines.map(function(line) {\n var m = line.match(/(\\s*)(.*?)(\\s*)([=:].*)/);\n if (!m)\n return [line];\n\n if (startW == null) {\n startW = m[1].length;\n textW = m[2].length;\n endW = m[3].length;\n return m;\n }\n\n if (startW + textW + endW != m[1].length + m[2].length + m[3].length)\n isRightAligned = false;\n if (startW != m[1].length)\n isLeftAligned = false;\n\n if (startW > m[1].length)\n startW = m[1].length;\n if (textW < m[2].length)\n textW = m[2].length;\n if (endW > m[3].length)\n endW = m[3].length;\n\n return m;\n }).map(forceLeft ? alignLeft :\n isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);\n\n function spaces(n) {\n return lang.stringRepeat(\" \", n);\n }\n\n function alignLeft(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(textW - m[2].length + endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n function alignRight(m) {\n return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2]\n + spaces(endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n function unAlign(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n };\n}).call(Editor.prototype);\n\n\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\nexports.onSessionChange = function(e) {\n var session = e.session;\n if (session && !session.multiSelect) {\n session.$selectionMarkers = [];\n session.selection.$initRangeList();\n session.multiSelect = session.selection;\n }\n this.multiSelect = session && session.multiSelect;\n\n var oldSession = e.oldSession;\n if (oldSession) {\n oldSession.multiSelect.off(\"addRange\", this.$onAddRange);\n oldSession.multiSelect.off(\"removeRange\", this.$onRemoveRange);\n oldSession.multiSelect.off(\"multiSelect\", this.$onMultiSelect);\n oldSession.multiSelect.off(\"singleSelect\", this.$onSingleSelect);\n oldSession.multiSelect.lead.off(\"change\", this.$checkMultiselectChange);\n oldSession.multiSelect.anchor.off(\"change\", this.$checkMultiselectChange);\n }\n\n if (session) {\n session.multiSelect.on(\"addRange\", this.$onAddRange);\n session.multiSelect.on(\"removeRange\", this.$onRemoveRange);\n session.multiSelect.on(\"multiSelect\", this.$onMultiSelect);\n session.multiSelect.on(\"singleSelect\", this.$onSingleSelect);\n session.multiSelect.lead.on(\"change\", this.$checkMultiselectChange);\n session.multiSelect.anchor.on(\"change\", this.$checkMultiselectChange);\n }\n\n if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) {\n if (session.selection.inMultiSelectMode)\n this.$onMultiSelect();\n else\n this.$onSingleSelect();\n }\n};\nfunction MultiSelect(editor) {\n if (editor.$multiselectOnSessionChange)\n return;\n editor.$onAddRange = editor.$onAddRange.bind(editor);\n editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);\n editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);\n editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);\n editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);\n editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor);\n\n editor.$multiselectOnSessionChange(editor);\n editor.on(\"changeSession\", editor.$multiselectOnSessionChange);\n\n editor.on(\"mousedown\", onMouseDown);\n editor.commands.addCommands(commands.defaultCommands);\n\n addAltCursorListeners(editor);\n}\n\nfunction addAltCursorListeners(editor){\n if (!editor.textInput) return;\n var el = editor.textInput.getElement();\n var altCursor = false;\n event.addListener(el, \"keydown\", function(e) {\n var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey);\n if (editor.$blockSelectEnabled && altDown) {\n if (!altCursor) {\n editor.renderer.setMouseCursor(\"crosshair\");\n altCursor = true;\n }\n } else if (altCursor) {\n reset();\n }\n }, editor);\n\n event.addListener(el, \"keyup\", reset, editor);\n event.addListener(el, \"blur\", reset, editor);\n function reset(e) {\n if (altCursor) {\n editor.renderer.setMouseCursor(\"\");\n altCursor = false;\n }\n }\n}\n\nexports.MultiSelect = MultiSelect;\n\n\nrequire(\"./config\").defineOptions(Editor.prototype, \"editor\", {\n enableMultiselect: {\n set: function(val) {\n MultiSelect(this);\n if (val) {\n this.on(\"changeSession\", this.$multiselectOnSessionChange);\n this.on(\"mousedown\", onMouseDown);\n } else {\n this.off(\"changeSession\", this.$multiselectOnSessionChange);\n this.off(\"mousedown\", onMouseDown);\n }\n },\n value: true\n },\n enableBlockSelect: {\n set: function(val) {\n this.$blockSelectEnabled = val;\n },\n value: true\n }\n});\n\n\n\n});\n\nace.define(\"ace/mode/folding/fold_mode\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n this.foldingStartMarker = null;\n this.foldingStopMarker = null;\n this.getFoldWidget = function(session, foldStyle, row) {\n var line = session.getLine(row);\n if (this.foldingStartMarker.test(line))\n return \"start\";\n if (foldStyle == \"markbeginend\"\n && this.foldingStopMarker\n && this.foldingStopMarker.test(line))\n return \"end\";\n return \"\";\n };\n\n this.getFoldWidgetRange = function(session, foldStyle, row) {\n return null;\n };\n\n this.indentationBlock = function(session, row, column) {\n var re = /\\S/;\n var line = session.getLine(row);\n var startLevel = line.search(re);\n if (startLevel == -1)\n return;\n\n var startColumn = column || line.length;\n var maxRow = session.getLength();\n var startRow = row;\n var endRow = row;\n\n while (++row < maxRow) {\n var level = session.getLine(row).search(re);\n\n if (level == -1)\n continue;\n\n if (level <= startLevel) {\n var token = session.getTokenAt(row, 0);\n if (!token || token.type !== \"string\")\n break;\n }\n\n endRow = row;\n }\n\n if (endRow > startRow) {\n var endColumn = session.getLine(endRow).length;\n return new Range(startRow, startColumn, endRow, endColumn);\n }\n };\n\n this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n var start = {row: row, column: column + 1};\n var end = session.$findClosingBracket(bracket, start, typeRe);\n if (!end)\n return;\n\n var fw = session.foldWidgets[end.row];\n if (fw == null)\n fw = session.getFoldWidget(end.row);\n\n if (fw == \"start\" && end.row > start.row) {\n end.row --;\n end.column = session.getLine(end.row).length;\n }\n return Range.fromPoints(start, end);\n };\n\n this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\n var end = {row: row, column: column};\n var start = session.$findOpeningBracket(bracket, end);\n\n if (!start)\n return;\n\n start.column++;\n end.column--;\n\n return Range.fromPoints(start, end);\n };\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = \".ace-tm .ace_gutter {\\\nbackground: #f0f0f0;\\\ncolor: #333;\\\n}\\\n.ace-tm .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-tm .ace_fold {\\\nbackground-color: #6B72E6;\\\n}\\\n.ace-tm {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-tm .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-tm .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-tm .ace_storage,\\\n.ace-tm .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-tm .ace_constant {\\\ncolor: rgb(197, 6, 11);\\\n}\\\n.ace-tm .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-tm .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-tm .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_invalid {\\\nbackground-color: rgba(255, 0, 0, 0.1);\\\ncolor: red;\\\n}\\\n.ace-tm .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-tm .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_support.ace_type,\\\n.ace-tm .ace_support.ace_class {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-tm .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-tm .ace_string {\\\ncolor: rgb(3, 106, 7);\\\n}\\\n.ace-tm .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-tm .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-tm .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-tm .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-tm .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-tm .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-tm .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-tm .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-tm .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-tm .ace_meta.ace_tag {\\\ncolor:rgb(0, 22, 142);\\\n}\\\n.ace-tm .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-tm .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-tm.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\n}\\\n.ace-tm .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-tm .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-tm .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-tm .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-tm .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-tm .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-tm .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\nexports.$id = \"ace/theme/textmate\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n\nace.define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"./lib/dom\");\n\nfunction LineWidgets(session) {\n this.session = session;\n this.session.widgetManager = this;\n this.session.getRowLength = this.getRowLength;\n this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\n this.updateOnChange = this.updateOnChange.bind(this);\n this.renderWidgets = this.renderWidgets.bind(this);\n this.measureWidgets = this.measureWidgets.bind(this);\n this.session._changedWidgets = [];\n this.$onChangeEditor = this.$onChangeEditor.bind(this);\n \n this.session.on(\"change\", this.updateOnChange);\n this.session.on(\"changeFold\", this.updateOnFold);\n this.session.on(\"changeEditor\", this.$onChangeEditor);\n}\n\n(function() {\n this.getRowLength = function(row) {\n var h;\n if (this.lineWidgets)\n h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n else \n h = 0;\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1 + h;\n } else {\n return this.$wrapData[row].length + 1 + h;\n }\n };\n\n this.$getWidgetScreenLength = function() {\n var screenRows = 0;\n this.lineWidgets.forEach(function(w){\n if (w && w.rowCount && !w.hidden)\n screenRows += w.rowCount;\n });\n return screenRows;\n }; \n \n this.$onChangeEditor = function(e) {\n this.attach(e.editor);\n };\n \n this.attach = function(editor) {\n if (editor && editor.widgetManager && editor.widgetManager != this)\n editor.widgetManager.detach();\n\n if (this.editor == editor)\n return;\n\n this.detach();\n this.editor = editor;\n \n if (editor) {\n editor.widgetManager = this;\n editor.renderer.on(\"beforeRender\", this.measureWidgets);\n editor.renderer.on(\"afterRender\", this.renderWidgets);\n }\n };\n this.detach = function(e) {\n var editor = this.editor;\n if (!editor)\n return;\n \n this.editor = null;\n editor.widgetManager = null;\n \n editor.renderer.off(\"beforeRender\", this.measureWidgets);\n editor.renderer.off(\"afterRender\", this.renderWidgets);\n var lineWidgets = this.session.lineWidgets;\n lineWidgets && lineWidgets.forEach(function(w) {\n if (w && w.el && w.el.parentNode) {\n w._inDocument = false;\n w.el.parentNode.removeChild(w.el);\n }\n });\n };\n\n this.updateOnFold = function(e, session) {\n var lineWidgets = session.lineWidgets;\n if (!lineWidgets || !e.action)\n return;\n var fold = e.data;\n var start = fold.start.row;\n var end = fold.end.row;\n var hide = e.action == \"add\";\n for (var i = start + 1; i < end; i++) {\n if (lineWidgets[i])\n lineWidgets[i].hidden = hide;\n }\n if (lineWidgets[end]) {\n if (hide) {\n if (!lineWidgets[start])\n lineWidgets[start] = lineWidgets[end];\n else\n lineWidgets[end].hidden = hide;\n } else {\n if (lineWidgets[start] == lineWidgets[end])\n lineWidgets[start] = undefined;\n lineWidgets[end].hidden = hide;\n }\n }\n };\n \n this.updateOnChange = function(delta) {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n \n var startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n } else if (delta.action == \"remove\") {\n var removed = lineWidgets.splice(startRow + 1, len);\n if (!lineWidgets[startRow] && removed[removed.length - 1]) {\n lineWidgets[startRow] = removed.pop();\n }\n removed.forEach(function(w) {\n w && this.removeLineWidget(w);\n }, this);\n this.$updateRows();\n } else {\n var args = new Array(len);\n if (lineWidgets[startRow] && lineWidgets[startRow].column != null) {\n if (delta.start.column > lineWidgets[startRow].column)\n startRow++;\n }\n args.unshift(startRow, 0);\n lineWidgets.splice.apply(lineWidgets, args);\n this.$updateRows();\n }\n };\n \n this.$updateRows = function() {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n var noWidgets = true;\n lineWidgets.forEach(function(w, i) {\n if (w) {\n noWidgets = false;\n w.row = i;\n while (w.$oldWidget) {\n w.$oldWidget.row = i;\n w = w.$oldWidget;\n }\n }\n });\n if (noWidgets)\n this.session.lineWidgets = null;\n };\n\n this.$registerLineWidget = function(w) {\n if (!this.session.lineWidgets)\n this.session.lineWidgets = new Array(this.session.getLength());\n \n var old = this.session.lineWidgets[w.row];\n if (old) {\n w.$oldWidget = old;\n if (old.el && old.el.parentNode) {\n old.el.parentNode.removeChild(old.el);\n old._inDocument = false;\n }\n }\n \n this.session.lineWidgets[w.row] = w;\n return w;\n };\n \n this.addLineWidget = function(w) {\n this.$registerLineWidget(w);\n w.session = this.session;\n \n if (!this.editor) return w;\n \n var renderer = this.editor.renderer;\n if (w.html && !w.el) {\n w.el = dom.createElement(\"div\");\n w.el.innerHTML = w.html;\n }\n if (w.el) {\n dom.addCssClass(w.el, \"ace_lineWidgetContainer\");\n w.el.style.position = \"absolute\";\n w.el.style.zIndex = 5;\n renderer.container.appendChild(w.el);\n w._inDocument = true;\n \n if (!w.coverGutter) {\n w.el.style.zIndex = 3;\n }\n if (w.pixelHeight == null) {\n w.pixelHeight = w.el.offsetHeight;\n }\n }\n if (w.rowCount == null) {\n w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;\n }\n \n var fold = this.session.getFoldAt(w.row, 0);\n w.$fold = fold;\n if (fold) {\n var lineWidgets = this.session.lineWidgets;\n if (w.row == fold.end.row && !lineWidgets[fold.start.row])\n lineWidgets[fold.start.row] = w;\n else\n w.hidden = true;\n }\n \n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n \n this.$updateRows();\n this.renderWidgets(null, renderer);\n this.onWidgetChanged(w);\n return w;\n };\n \n this.removeLineWidget = function(w) {\n w._inDocument = false;\n w.session = null;\n if (w.el && w.el.parentNode)\n w.el.parentNode.removeChild(w.el);\n if (w.editor && w.editor.destroy) try {\n w.editor.destroy();\n } catch(e){}\n if (this.session.lineWidgets) {\n var w1 = this.session.lineWidgets[w.row];\n if (w1 == w) {\n this.session.lineWidgets[w.row] = w.$oldWidget;\n if (w.$oldWidget)\n this.onWidgetChanged(w.$oldWidget);\n } else {\n while (w1) {\n if (w1.$oldWidget == w) {\n w1.$oldWidget = w.$oldWidget;\n break;\n }\n w1 = w1.$oldWidget;\n }\n }\n }\n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n this.$updateRows();\n };\n \n this.getWidgetsAtRow = function(row) {\n var lineWidgets = this.session.lineWidgets;\n var w = lineWidgets && lineWidgets[row];\n var list = [];\n while (w) {\n list.push(w);\n w = w.$oldWidget;\n }\n return list;\n };\n \n this.onWidgetChanged = function(w) {\n this.session._changedWidgets.push(w);\n this.editor && this.editor.renderer.updateFull();\n };\n \n this.measureWidgets = function(e, renderer) {\n var changedWidgets = this.session._changedWidgets;\n var config = renderer.layerConfig;\n \n if (!changedWidgets || !changedWidgets.length) return;\n var min = Infinity;\n for (var i = 0; i < changedWidgets.length; i++) {\n var w = changedWidgets[i];\n if (!w || !w.el) continue;\n if (w.session != this.session) continue;\n if (!w._inDocument) {\n if (this.session.lineWidgets[w.row] != w)\n continue;\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n \n w.h = w.el.offsetHeight;\n \n if (!w.fixedWidth) {\n w.w = w.el.offsetWidth;\n w.screenWidth = Math.ceil(w.w / config.characterWidth);\n }\n \n var rowCount = w.h / config.lineHeight;\n if (w.coverLine) {\n rowCount -= this.session.getRowLineCount(w.row);\n if (rowCount < 0)\n rowCount = 0;\n }\n if (w.rowCount != rowCount) {\n w.rowCount = rowCount;\n if (w.row < min)\n min = w.row;\n }\n }\n if (min != Infinity) {\n this.session._emit(\"changeFold\", {data:{start:{row: min}}});\n this.session.lineWidgetWidth = null;\n }\n this.session._changedWidgets = [];\n };\n \n this.renderWidgets = function(e, renderer) {\n var config = renderer.layerConfig;\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets)\n return;\n var first = Math.min(this.firstRow, config.firstRow);\n var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length);\n \n while (first > 0 && !lineWidgets[first])\n first--;\n \n this.firstRow = config.firstRow;\n this.lastRow = config.lastRow;\n\n renderer.$cursorLayer.config = config;\n for (var i = first; i <= last; i++) {\n var w = lineWidgets[i];\n if (!w || !w.el) continue;\n if (w.hidden) {\n w.el.style.top = -100 - (w.pixelHeight || 0) + \"px\";\n continue;\n }\n if (!w._inDocument) {\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top;\n if (!w.coverLine)\n top += config.lineHeight * this.session.getRowLineCount(w.row);\n w.el.style.top = top - config.offset + \"px\";\n \n var left = w.coverGutter ? 0 : renderer.gutterWidth;\n if (!w.fixedWidth)\n left -= renderer.scrollLeft;\n w.el.style.left = left + \"px\";\n \n if (w.fullWidth && w.screenWidth) {\n w.el.style.minWidth = config.width + 2 * config.padding + \"px\";\n }\n \n if (w.fixedWidth) {\n w.el.style.right = renderer.scrollBar.getWidth() + \"px\";\n } else {\n w.el.style.right = \"\";\n }\n }\n };\n \n}).call(LineWidgets.prototype);\n\n\nexports.LineWidgets = LineWidgets;\n\n});\n\nace.define(\"ace/ext/error_marker\",[\"require\",\"exports\",\"module\",\"ace/line_widgets\",\"ace/lib/dom\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar LineWidgets = require(\"../line_widgets\").LineWidgets;\nvar dom = require(\"../lib/dom\");\nvar Range = require(\"../range\").Range;\n\nfunction binarySearch(array, needle, comparator) {\n var first = 0;\n var last = array.length - 1;\n\n while (first <= last) {\n var mid = (first + last) >> 1;\n var c = comparator(needle, array[mid]);\n if (c > 0)\n first = mid + 1;\n else if (c < 0)\n last = mid - 1;\n else\n return mid;\n }\n return -(first + 1);\n}\n\nfunction findAnnotations(session, row, dir) {\n var annotations = session.getAnnotations().sort(Range.comparePoints);\n if (!annotations.length)\n return;\n \n var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints);\n if (i < 0)\n i = -i - 1;\n \n if (i >= annotations.length)\n i = dir > 0 ? 0 : annotations.length - 1;\n else if (i === 0 && dir < 0)\n i = annotations.length - 1;\n \n var annotation = annotations[i];\n if (!annotation || !dir)\n return;\n\n if (annotation.row === row) {\n do {\n annotation = annotations[i += dir];\n } while (annotation && annotation.row === row);\n if (!annotation)\n return annotations.slice();\n }\n \n \n var matched = [];\n row = annotation.row;\n do {\n matched[dir < 0 ? \"unshift\" : \"push\"](annotation);\n annotation = annotations[i += dir];\n } while (annotation && annotation.row == row);\n return matched.length && matched;\n}\n\nexports.showErrorMarker = function(editor, dir) {\n var session = editor.session;\n if (!session.widgetManager) {\n session.widgetManager = new LineWidgets(session);\n session.widgetManager.attach(editor);\n }\n \n var pos = editor.getCursorPosition();\n var row = pos.row;\n var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) {\n return w.type == \"errorMarker\";\n })[0];\n if (oldWidget) {\n oldWidget.destroy();\n } else {\n row -= dir;\n }\n var annotations = findAnnotations(session, row, dir);\n var gutterAnno;\n if (annotations) {\n var annotation = annotations[0];\n pos.column = (annotation.pos && typeof annotation.column != \"number\"\n ? annotation.pos.sc\n : annotation.column) || 0;\n pos.row = annotation.row;\n gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row];\n } else if (oldWidget) {\n return;\n } else {\n gutterAnno = {\n text: [\"Looks good!\"],\n className: \"ace_ok\"\n };\n }\n editor.session.unfold(pos.row);\n editor.selection.moveToPosition(pos);\n \n var w = {\n row: pos.row, \n fixedWidth: true,\n coverGutter: true,\n el: dom.createElement(\"div\"),\n type: \"errorMarker\"\n };\n var el = w.el.appendChild(dom.createElement(\"div\"));\n var arrow = w.el.appendChild(dom.createElement(\"div\"));\n arrow.className = \"error_widget_arrow \" + gutterAnno.className;\n \n var left = editor.renderer.$cursorLayer\n .getPixelPosition(pos).left;\n arrow.style.left = left + editor.renderer.gutterWidth - 5 + \"px\";\n \n w.el.className = \"error_widget_wrapper\";\n el.className = \"error_widget \" + gutterAnno.className;\n el.innerHTML = gutterAnno.text.join(\"
\");\n \n el.appendChild(dom.createElement(\"div\"));\n \n var kb = function(_, hashId, keyString) {\n if (hashId === 0 && (keyString === \"esc\" || keyString === \"return\")) {\n w.destroy();\n return {command: \"null\"};\n }\n };\n \n w.destroy = function() {\n if (editor.$mouseHandler.isMousePressed)\n return;\n editor.keyBinding.removeKeyboardHandler(kb);\n session.widgetManager.removeLineWidget(w);\n editor.off(\"changeSelection\", w.destroy);\n editor.off(\"changeSession\", w.destroy);\n editor.off(\"mouseup\", w.destroy);\n editor.off(\"change\", w.destroy);\n };\n \n editor.keyBinding.addKeyboardHandler(kb);\n editor.on(\"changeSelection\", w.destroy);\n editor.on(\"changeSession\", w.destroy);\n editor.on(\"mouseup\", w.destroy);\n editor.on(\"change\", w.destroy);\n \n editor.session.widgetManager.addLineWidget(w);\n \n w.el.onmousedown = editor.focus.bind(editor);\n \n editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight});\n};\n\n\ndom.importCssString(\"\\\n .error_widget_wrapper {\\\n background: inherit;\\\n color: inherit;\\\n border:none\\\n }\\\n .error_widget {\\\n border-top: solid 2px;\\\n border-bottom: solid 2px;\\\n margin: 5px 0;\\\n padding: 10px 40px;\\\n white-space: pre-wrap;\\\n }\\\n .error_widget.ace_error, .error_widget_arrow.ace_error{\\\n border-color: #ff5a5a\\\n }\\\n .error_widget.ace_warning, .error_widget_arrow.ace_warning{\\\n border-color: #F1D817\\\n }\\\n .error_widget.ace_info, .error_widget_arrow.ace_info{\\\n border-color: #5a5a5a\\\n }\\\n .error_widget.ace_ok, .error_widget_arrow.ace_ok{\\\n border-color: #5aaa5a\\\n }\\\n .error_widget_arrow {\\\n position: absolute;\\\n border: solid 5px;\\\n border-top-color: transparent!important;\\\n border-right-color: transparent!important;\\\n border-left-color: transparent!important;\\\n top: -5px;\\\n }\\\n\", \"\");\n\n});\n\nace.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) {\n\"use strict\";\n\nrequire(\"./lib/fixoldbrowsers\");\n\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\n\nvar Range = require(\"./range\").Range;\nvar Editor = require(\"./editor\").Editor;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar UndoManager = require(\"./undomanager\").UndoManager;\nvar Renderer = require(\"./virtual_renderer\").VirtualRenderer;\nrequire(\"./worker/worker_client\");\nrequire(\"./keyboard/hash_handler\");\nrequire(\"./placeholder\");\nrequire(\"./multi_select\");\nrequire(\"./mode/folding/fold_mode\");\nrequire(\"./theme/textmate\");\nrequire(\"./ext/error_marker\");\n\nexports.config = require(\"./config\");\nexports.require = require;\n\nif (typeof define === \"function\")\n exports.define = define;\nexports.edit = function(el, options) {\n if (typeof el == \"string\") {\n var _id = el;\n el = document.getElementById(_id);\n if (!el)\n throw new Error(\"ace.edit can't find div #\" + _id);\n }\n\n if (el && el.env && el.env.editor instanceof Editor)\n return el.env.editor;\n\n var value = \"\";\n if (el && /input|textarea/i.test(el.tagName)) {\n var oldNode = el;\n value = oldNode.value;\n el = dom.createElement(\"pre\");\n oldNode.parentNode.replaceChild(el, oldNode);\n } else if (el) {\n value = el.textContent;\n el.innerHTML = \"\";\n }\n\n var doc = exports.createEditSession(value);\n\n var editor = new Editor(new Renderer(el), doc, options);\n\n var env = {\n document: doc,\n editor: editor,\n onResize: editor.resize.bind(editor, null)\n };\n if (oldNode) env.textarea = oldNode;\n event.addListener(window, \"resize\", env.onResize);\n editor.on(\"destroy\", function() {\n event.removeListener(window, \"resize\", env.onResize);\n env.editor.container.env = null; // prevent memory leak on old ie\n });\n editor.container.env = editor.env = env;\n return editor;\n};\nexports.createEditSession = function(text, mode) {\n var doc = new EditSession(text, mode);\n doc.setUndoManager(new UndoManager());\n return doc;\n};\nexports.Range = Range;\nexports.Editor = Editor;\nexports.EditSession = EditSession;\nexports.UndoManager = UndoManager;\nexports.VirtualRenderer = Renderer;\nexports.version = exports.config.version;\n}); (function() {\n ace.require([\"ace/ace\"], function(a) {\n if (a) {\n a.config.init(true);\n a.define = ace.define;\n }\n if (!window.ace)\n window.ace = a;\n for (var key in a) if (a.hasOwnProperty(key))\n window.ace[key] = a[key];\n window.ace[\"default\"] = window.ace;\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = window.ace;\n }\n });\n })();\n ","module.exports = __webpack_public_path__ + \"d228be11b45e9a0bbd44acf24b9a2b41.js\";","module.exports = __webpack_public_path__ + \"1b64f97eed4a3837a93f8bdd363295fb.js\";","module.exports = __webpack_public_path__ + \"7493f0c3c9bf268d6ad785019d993dd7.js\";","module.exports = __webpack_public_path__ + \"1034e3807d1bcf55cb564491950237ab.js\";","module.exports = __webpack_public_path__ + \"ccde58de5468dd353dbee74d631ebdf0.js\";","module.exports = __webpack_public_path__ + \"e6cf8898b285b71e2abe832717ac7060.js\";","module.exports = __webpack_public_path__ + \"600ab46b2572f32c5a4abf0f960e3c61.js\";","module.exports = __webpack_public_path__ + \"d83f2acd25388452582e5a4c727255b0.js\";","module.exports = __webpack_public_path__ + \"f326f2f263b1498fedbe1d07d7254d10.js\";","module.exports = __webpack_public_path__ + \"48e9351c5623d4da657ce7d5d0267ea6.js\";","module.exports = __webpack_public_path__ + \"1fee62e3e043728a265935971fa26200.js\";","module.exports = __webpack_public_path__ + \"adc5e81257ed3f8d70d03cf79150eec1.js\";","module.exports = __webpack_public_path__ + \"222d52530e9db0a0ec565c6306c5db35.js\";","module.exports = __webpack_public_path__ + \"23da8ba64540ff4aa68a34d3445db680.js\";","module.exports = __webpack_public_path__ + \"a2a705f6bc3a6827d6c94c5978aec36d.js\";","module.exports = __webpack_public_path__ + \"20fa0fd52cafcf5176d15a23e497a835.js\";","module.exports = __webpack_public_path__ + \"5f3ce6efab3c679ec1ad25ab0b3f6b2f.js\";","module.exports = __webpack_public_path__ + \"28474eb7ee45a125e49cc5cbe69e336f.js\";","module.exports = __webpack_public_path__ + \"23bb1a9f279e7a732bfd405350aab114.js\";","module.exports = __webpack_public_path__ + \"8d9bb1799d9b98db107e84f10132e17f.js\";","module.exports = __webpack_public_path__ + \"b3bb2c8deddd8c2afcf73f6f5d711596.js\";","module.exports = __webpack_public_path__ + \"4c2816c26725f7aae5b490142e31112f.js\";","module.exports = __webpack_public_path__ + \"7bd84be066027e61c84c9c2aa9543c2a.js\";","module.exports = __webpack_public_path__ + \"0a1d9862d917663419ac2dd2e8193267.js\";","module.exports = __webpack_public_path__ + \"244b1a234ec1728d0268214de601449d.js\";","module.exports = __webpack_public_path__ + \"3c5b59a666c5d39d9ba9cc054d36a410.js\";","module.exports = __webpack_public_path__ + \"dc1eb6c1c92d7067c72b82b2833a7d2c.js\";","module.exports = __webpack_public_path__ + \"7080d2a1db1608264a6d9d9fbaf2cce8.js\";","module.exports = __webpack_public_path__ + \"39b630eb9c2c0319472cbf8f72e79691.js\";","module.exports = __webpack_public_path__ + \"621b99ed1a029c36b4e91ec35f36c344.js\";","module.exports = __webpack_public_path__ + \"b98206b2175363f1150c074608603942.js\";","module.exports = __webpack_public_path__ + \"e874d975c9128dc6eb9a513d088bed9f.js\";","module.exports = __webpack_public_path__ + \"6a7bf4fb4484f6f48d8e4337f126a61d.js\";","module.exports = __webpack_public_path__ + \"e4968d8264b40c14f123f28419eb456d.js\";","module.exports = __webpack_public_path__ + \"5bad2df0e3bfd8fdc1a332fb6276cb39.js\";","module.exports = __webpack_public_path__ + \"ee694c1bcbdc9439e50f816c39fd1023.js\";","module.exports = __webpack_public_path__ + \"9b8e2282f60f104ff3ace5b905af4d62.js\";","module.exports = __webpack_public_path__ + \"b0071564b0854c39e3de8b99d66e4dfd.js\";","module.exports = __webpack_public_path__ + \"72fa12126ab1140dbf95fc16549569e6.js\";","module.exports = __webpack_public_path__ + \"eba5ee3fb1f3e92af88c69e50b2a8fd1.js\";","module.exports = __webpack_public_path__ + \"9696a4229fb787eeb25b26f1274b75ee.js\";","module.exports = __webpack_public_path__ + \"ad03544c5a63e9c58d4d280bc5851cec.js\";","module.exports = __webpack_public_path__ + \"3df92508d7112d83474f31fe9590e289.js\";","module.exports = __webpack_public_path__ + \"866bf6ca5057dcb24503761af061d486.js\";","module.exports = __webpack_public_path__ + \"211511e7b374f57ad31acaf49dbdccb1.js\";","module.exports = __webpack_public_path__ + \"4700af84801dbda8a3880e3469c21130.js\";","module.exports = __webpack_public_path__ + \"44701e25bb6f2ab9ff18343f2357d1b0.js\";","module.exports = __webpack_public_path__ + \"0872e65446d05c1c443180c6280b015f.js\";","module.exports = __webpack_public_path__ + \"7ef987bad3b8fbb56f596649fbedee0b.js\";","module.exports = __webpack_public_path__ + \"5f312f155667dc5295b1fbfa8a978964.js\";","module.exports = __webpack_public_path__ + \"d30fa4070abd6929228505790744e180.js\";","module.exports = __webpack_public_path__ + \"6d38cef4a006e6cfe54a6117aba7b600.js\";","module.exports = __webpack_public_path__ + \"4d57d8d576cd63242136f3c8271592f4.js\";","module.exports = __webpack_public_path__ + \"114c58e47951fe3f6d25f683e0cd54e7.js\";","module.exports = __webpack_public_path__ + \"d1a58542777d072396d7cee5487304f9.js\";","module.exports = __webpack_public_path__ + \"9807cf1e443a7440371904b6525f37eb.js\";","module.exports = __webpack_public_path__ + \"a1c8660c5bcc6b6a43a7fb3c351174d9.js\";","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ace_1 = require(\"./ace\");\nvar diff_1 = require(\"./diff\");\nexports.diff = diff_1.default;\nvar split_1 = require(\"./split\");\nexports.split = split_1.default;\nexports.default = ace_1.default;\n//# sourceMappingURL=index.js.map","module.exports = __webpack_public_path__ + \"894edcaf39c3c95818e3949d737ed459.js\";","module.exports = __webpack_public_path__ + \"5c96efcfd419a70a93c96557979bc66d.js\";","module.exports = __webpack_public_path__ + \"1e4131e1241a5b81d54c7d9cb66b0e87.js\";","module.exports = __webpack_public_path__ + \"c530988d2b1966fd10a4d99fa3877e1b.js\";","module.exports = __webpack_public_path__ + \"cd9a17f94a922c7c88000b1b3cdd67df.js\";","module.exports = __webpack_public_path__ + \"b1170472ae4b50e3b0070eb991e502fe.js\";","module.exports = __webpack_public_path__ + \"010d0560a00a032c33da819e3c86596a.js\";","module.exports = __webpack_public_path__ + \"4639c30a609d986a255ccc684404527e.js\";","module.exports = __webpack_public_path__ + \"cb652f200fc3dd740b2e7f678a9272ea.js\";","module.exports = __webpack_public_path__ + \"f7186078e00d958aa2b316483dfc7e1c.js\";","module.exports = __webpack_public_path__ + \"d5a6140d581e5c4eb200259ce372f40b.js\";","module.exports = __webpack_public_path__ + \"25c99a71d30112583893bc5277402c46.js\";","module.exports = __webpack_public_path__ + \"3dcc18a5dee46b57ad7f85c0bee86802.js\";","module.exports = __webpack_public_path__ + \"ffd3b83e8b5878f4785591ff54b1dfff.js\";","module.exports = __webpack_public_path__ + \"59cc05504a1c823b6d4796bf6b430822.js\";","module.exports = __webpack_public_path__ + \"9671c350e11f1569edb5066cbfeb3334.js\";","module.exports = __webpack_public_path__ + \"baa5bf4cfefed057a4657a1b02cfa114.js\";","module.exports = __webpack_public_path__ + \"28785bea435918d49b290d27bf660baa.js\";","module.exports = __webpack_public_path__ + \"70286c33cab463fd576766adecd2d5d9.js\";","module.exports = __webpack_public_path__ + \"95e69fbb6dbd2e50782c54240da95fa1.js\";","module.exports = __webpack_public_path__ + \"3b190e5159c72fb7e27271956772bcba.js\";","module.exports = __webpack_public_path__ + \"2b2fe1a34cdf81c656a47e493ca9d658.js\";","module.exports = __webpack_public_path__ + \"13eda3507db9cbfb400f46b9b3ff6553.js\";","module.exports = __webpack_public_path__ + \"b1ac30076824f72cdff7ea29ae0b6801.js\";","module.exports = __webpack_public_path__ + \"1441681e52f3ae9ab33afbc5517359a0.js\";","module.exports = __webpack_public_path__ + \"15f3800d33b854ba476c9daf1b9e0326.js\";","module.exports = __webpack_public_path__ + \"75d2dae20d7bac5ecfa9dafc48ec04eb.js\";","module.exports = __webpack_public_path__ + \"40dc555a17f1c85020333a41f01dd9ba.js\";","module.exports = __webpack_public_path__ + \"b6df2278bd475169749bab512944b7ec.js\";","module.exports = __webpack_public_path__ + \"07101530302fe1d03dcd731992f7a899.js\";","module.exports = __webpack_public_path__ + \"3e3e2243675fa4fb4b320dc57daf2d4f.js\";","module.exports = __webpack_public_path__ + \"af959c2a870f08dd8abccae97c9b9bae.js\";","module.exports = __webpack_public_path__ + \"12f4a310110e02f9031132de6d8548bf.js\";","module.exports = __webpack_public_path__ + \"51f903c5ce5284a63196247cffb5ca40.js\";","module.exports = __webpack_public_path__ + \"da55f4fe3daed3f79fc4565668ecf7dd.js\";","module.exports = __webpack_public_path__ + \"4ccf23f751ac7990c38c272fa5b3c515.js\";","module.exports = __webpack_public_path__ + \"f4c53706e1721b08e8b2f650c8bd35c4.js\";","module.exports = __webpack_public_path__ + \"1e55fabb1403649e428fbba4b51ab90d.js\";","module.exports = __webpack_public_path__ + \"f980fd09c34c277299e2d3f83aebdba5.js\";","module.exports = __webpack_public_path__ + \"376ee0869ec49e5524dd216db8f7020e.js\";","module.exports = __webpack_public_path__ + \"4d8cb7033879cb7fcc7a43798e2bde22.js\";","module.exports = __webpack_public_path__ + \"ab4b314445b23359319c14cce9a0e321.js\";","module.exports = __webpack_public_path__ + \"44c949690b47955390a085175b1647a6.js\";","module.exports = __webpack_public_path__ + \"d2fe7592ff2fdda099b2b6355abe8c06.js\";","module.exports = __webpack_public_path__ + \"f5f38911951801dbd201b30dbc1c4a70.js\";","module.exports = __webpack_public_path__ + \"60340be8eea1d704a17f399b3c3f9577.js\";","module.exports = __webpack_public_path__ + \"87932c8321c9985ed3b6979e86d2a50e.js\";","module.exports = __webpack_public_path__ + \"6144815fed7dc327eb6a82bcdbfad74b.js\";","module.exports = __webpack_public_path__ + \"6292be0125d3720498496eaa7f541618.js\";","module.exports = __webpack_public_path__ + \"fdf4d851b44839d8fdfa77b3419bce19.js\";","module.exports = __webpack_public_path__ + \"870184211838006214be1c23c98672fc.js\";","module.exports = __webpack_public_path__ + \"760eb6458a048f3cba7bc3ae52ef2ba4.js\";","module.exports = __webpack_public_path__ + \"75bffda9455d77087f34708ac4e85371.js\";","module.exports = __webpack_public_path__ + \"707fa1de4d2096da1951c4bc9d21cb6d.js\";","module.exports = __webpack_public_path__ + \"4a1dab236c2844d28f73c5c128afe299.js\";","module.exports = __webpack_public_path__ + \"e6ad50b520736b595970c9e07029c3f1.js\";","module.exports = __webpack_public_path__ + \"3646668820dc96864fbed7746f805947.js\";","module.exports = __webpack_public_path__ + \"fd5e2efd3b2d047abe8473f99c650a35.js\";","module.exports = __webpack_public_path__ + \"5fb6059ab5d7abab7a74eb73028a3aeb.js\";","module.exports = __webpack_public_path__ + \"eaa55a522fb2cb2f0287711f42344984.js\";","module.exports = __webpack_public_path__ + \"104959bdb953a3792a203e98d2bf530f.js\";","module.exports = __webpack_public_path__ + \"59bde89bce5c1126ba5ee99c55ec48c8.js\";","module.exports = __webpack_public_path__ + \"1324f89bd8db0bae85b79b7f90f6c119.js\";","module.exports = __webpack_public_path__ + \"03748243ac7148ca150ba06c2919ff81.js\";","module.exports = __webpack_public_path__ + \"d7d616d4aa8fd3f51d681242853dcde9.js\";","module.exports = __webpack_public_path__ + \"5e3f006db26e9b277b1bdbc130611a14.js\";","module.exports = __webpack_public_path__ + \"6903d8ef977a1424c4e2eb22b96feb77.js\";","module.exports = __webpack_public_path__ + \"cf188b3f83735389d47bb12fc9f7069a.js\";","module.exports = __webpack_public_path__ + \"03aae8272914723a7bf85b984385032c.js\";","module.exports = __webpack_public_path__ + \"4736a562251eeaea46dd06892b489f35.js\";","module.exports = __webpack_public_path__ + \"db8ca5cfb6fe4aaef215f116f6991784.js\";","module.exports = __webpack_public_path__ + \"263f7107e9357b1c91997e1a21b59ff5.js\";","module.exports = __webpack_public_path__ + \"f0878cc386a608146dbc8fb3b6745c42.js\";","module.exports = __webpack_public_path__ + \"d2a00e1726c71ca10fbaf4b9c4374458.js\";","ace.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) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Editor = require(\"./editor\").Editor;\nvar Renderer = require(\"./virtual_renderer\").VirtualRenderer;\nvar EditSession = require(\"./edit_session\").EditSession;\n\n\nvar Split = function(container, theme, splits) {\n this.BELOW = 1;\n this.BESIDE = 0;\n\n this.$container = container;\n this.$theme = theme;\n this.$splits = 0;\n this.$editorCSS = \"\";\n this.$editors = [];\n this.$orientation = this.BESIDE;\n\n this.setSplits(splits || 1);\n this.$cEditor = this.$editors[0];\n\n\n this.on(\"focus\", function(editor) {\n this.$cEditor = editor;\n }.bind(this));\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.$createEditor = function() {\n var el = document.createElement(\"div\");\n el.className = this.$editorCSS;\n el.style.cssText = \"position: absolute; top:0px; bottom:0px\";\n this.$container.appendChild(el);\n var editor = new Editor(new Renderer(el, this.$theme));\n\n editor.on(\"focus\", function() {\n this._emit(\"focus\", editor);\n }.bind(this));\n\n this.$editors.push(editor);\n editor.setFontSize(this.$fontSize);\n return editor;\n };\n\n this.setSplits = function(splits) {\n var editor;\n if (splits < 1) {\n throw \"The number of splits have to be > 0!\";\n }\n\n if (splits == this.$splits) {\n return;\n } else if (splits > this.$splits) {\n while (this.$splits < this.$editors.length && this.$splits < splits) {\n editor = this.$editors[this.$splits];\n this.$container.appendChild(editor.container);\n editor.setFontSize(this.$fontSize);\n this.$splits ++;\n }\n while (this.$splits < splits) {\n this.$createEditor();\n this.$splits ++;\n }\n } else {\n while (this.$splits > splits) {\n editor = this.$editors[this.$splits - 1];\n this.$container.removeChild(editor.container);\n this.$splits --;\n }\n }\n this.resize();\n };\n this.getSplits = function() {\n return this.$splits;\n };\n this.getEditor = function(idx) {\n return this.$editors[idx];\n };\n this.getCurrentEditor = function() {\n return this.$cEditor;\n };\n this.focus = function() {\n this.$cEditor.focus();\n };\n this.blur = function() {\n this.$cEditor.blur();\n };\n this.setTheme = function(theme) {\n this.$editors.forEach(function(editor) {\n editor.setTheme(theme);\n });\n };\n this.setKeyboardHandler = function(keybinding) {\n this.$editors.forEach(function(editor) {\n editor.setKeyboardHandler(keybinding);\n });\n };\n this.forEach = function(callback, scope) {\n this.$editors.forEach(callback, scope);\n };\n\n\n this.$fontSize = \"\";\n this.setFontSize = function(size) {\n this.$fontSize = size;\n this.forEach(function(editor) {\n editor.setFontSize(size);\n });\n };\n\n this.$cloneSession = function(session) {\n var s = new EditSession(session.getDocument(), session.getMode());\n\n var undoManager = session.getUndoManager();\n s.setUndoManager(undoManager);\n s.setTabSize(session.getTabSize());\n s.setUseSoftTabs(session.getUseSoftTabs());\n s.setOverwrite(session.getOverwrite());\n s.setBreakpoints(session.getBreakpoints());\n s.setUseWrapMode(session.getUseWrapMode());\n s.setUseWorker(session.getUseWorker());\n s.setWrapLimitRange(session.$wrapLimitRange.min,\n session.$wrapLimitRange.max);\n s.$foldData = session.$cloneFoldData();\n\n return s;\n };\n this.setSession = function(session, idx) {\n var editor;\n if (idx == null) {\n editor = this.$cEditor;\n } else {\n editor = this.$editors[idx];\n }\n var isUsed = this.$editors.some(function(editor) {\n return editor.session === session;\n });\n\n if (isUsed) {\n session = this.$cloneSession(session);\n }\n editor.setSession(session);\n return session;\n };\n this.getOrientation = function() {\n return this.$orientation;\n };\n this.setOrientation = function(orientation) {\n if (this.$orientation == orientation) {\n return;\n }\n this.$orientation = orientation;\n this.resize();\n };\n this.resize = function() {\n var width = this.$container.clientWidth;\n var height = this.$container.clientHeight;\n var editor;\n\n if (this.$orientation == this.BESIDE) {\n var editorWidth = width / this.$splits;\n for (var i = 0; i < this.$splits; i++) {\n editor = this.$editors[i];\n editor.container.style.width = editorWidth + \"px\";\n editor.container.style.top = \"0px\";\n editor.container.style.left = i * editorWidth + \"px\";\n editor.container.style.height = height + \"px\";\n editor.resize();\n }\n } else {\n var editorHeight = height / this.$splits;\n for (var i = 0; i < this.$splits; i++) {\n editor = this.$editors[i];\n editor.container.style.width = width + \"px\";\n editor.container.style.top = i * editorHeight + \"px\";\n editor.container.style.left = \"0px\";\n editor.container.style.height = editorHeight + \"px\";\n editor.resize();\n }\n }\n };\n\n}).call(Split.prototype);\n\nexports.Split = Split;\n});\n\nace.define(\"ace/ext/split\",[\"require\",\"exports\",\"module\",\"ace/split\"], function(require, exports, module) {\n\"use strict\";\nmodule.exports = require(\"../split\");\n\n}); (function() {\n ace.require([\"ace/ext/split\"], function(m) {\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = m;\n }\n });\n })();\n ","module.exports = __webpack_public_path__ + \"fc784296b938a0c4988271d20ce946a8.js\";","module.exports = __webpack_public_path__ + \"ba6b8b3e06cd9d0aee9c69278ee84647.js\";","module.exports = __webpack_public_path__ + \"1fe2d583da5f073431d81a6ea13ffc0c.js\";","module.exports = __webpack_public_path__ + \"e7e1a807af3160b342e0a3550cf8f7c5.js\";","module.exports = __webpack_public_path__ + \"5a67fdd5293af0a35defd2574c05cd04.js\";","module.exports = __webpack_public_path__ + \"1533058f0ce13acdaa8d5bdc7d147bef.js\";","module.exports = __webpack_public_path__ + \"24a3ff38afde257888d755ece9bfd704.js\";","module.exports = __webpack_public_path__ + \"5da9145440d57c9b84d469253e84898d.js\";","module.exports = __webpack_public_path__ + \"03487ba89c7b63069d63c1b3802a472c.js\";","module.exports = __webpack_public_path__ + \"c32ec7d45ccd947b98fe458a8ca1405b.js\";","module.exports = __webpack_public_path__ + \"25f492a94b705a466446909aeaa337b0.js\";","module.exports = __webpack_public_path__ + \"bb5bab7a675544fe31ddb7f4a77dffb9.js\";","module.exports = __webpack_public_path__ + \"89d3c35a5ef97a600927b477a9ba06b4.js\";","module.exports = __webpack_public_path__ + \"a98ead014d010899b35ee25c7c225542.js\";","module.exports = __webpack_public_path__ + \"a934b622dd8bdcdcdc1dde985a07ac14.js\";","module.exports = __webpack_public_path__ + \"7b239aaf669748b6ce7bb6ecf372e783.js\";","module.exports = __webpack_public_path__ + \"aaf5c3a4f1a188fd051577cea7b87209.js\";","module.exports = __webpack_public_path__ + \"3f758ea78954547fed0a8d999691dd7c.js\";","module.exports = __webpack_public_path__ + \"a4306aa43824ec1a4ee422b59a851e6f.js\";","module.exports = __webpack_public_path__ + \"b02d982ccb1011197a5a24800b178a0a.js\";","module.exports = __webpack_public_path__ + \"8d3efd157f0bf2a3a0d6dd932878880b.js\";","module.exports = __webpack_public_path__ + \"5d3314103b00c8ea165c6f9f6757f794.js\";","module.exports = __webpack_public_path__ + \"a533e643002830be2da76c9527265860.js\";","module.exports = __webpack_public_path__ + \"3567d1ea443427e944a6f189a0898819.js\";","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n symbolTag = '[object Symbol]';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n reLeadingDot = /^\\./,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n splice = arrayProto.splice;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value) {\n return isArray(value) ? value : stringToPath(value);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoize(function(string) {\n string = toString(string);\n\n var result = [];\n if (reLeadingDot.test(string)) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result);\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Assign cache to `_.memoize`.\nmemoize.Cache = MapCache;\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","module.exports = __webpack_public_path__ + \"875e553a27bee88a73df34a90b3058e4.js\";","module.exports = __webpack_public_path__ + \"9cf89836df93b01b418c4e55a5cbc0f8.js\";","module.exports = __webpack_public_path__ + \"9b1fd9cf4206cc32e84150c49707d811.js\";","module.exports = __webpack_public_path__ + \"c56345ae11027262df8c5983822c7355.js\";","module.exports = __webpack_public_path__ + \"2dd82c65030101b60dffccedd8741c6e.js\";","module.exports = __webpack_public_path__ + \"ef726a596b666599e6ab8a3c6fe87da6.js\";","module.exports = __webpack_public_path__ + \"7e4e2772f701dd58ffb554bcfce0195b.js\";","module.exports = __webpack_public_path__ + \"2d2a42eeeeec801ab35f2fff7d900e43.js\";","module.exports = __webpack_public_path__ + \"7c27341a2599ffb713c8fb7beced7601.js\";","module.exports = __webpack_public_path__ + \"e97cfa120fde26da0359ca29afaf3171.js\";","module.exports = __webpack_public_path__ + \"64d6924350bd7706850cdc0dcc76ccf6.js\";","module.exports = __webpack_public_path__ + \"38fba56fde71a835512d2b6072832858.js\";","module.exports = __webpack_public_path__ + \"dbc87324ecf271d088a2ab0823de9c5d.js\";","module.exports = __webpack_public_path__ + \"8ed58ed9c7e1cb1ae1f2830d29011ffb.js\";","module.exports = __webpack_public_path__ + \"dcb197c0214e800da9d9436dfc9437d6.js\";","module.exports = __webpack_public_path__ + \"e8fa659263d5ca9e0d1be69c048133a8.js\";","module.exports = __webpack_public_path__ + \"b1f3f77a9279cdb38846ebe13c3438bc.js\";","module.exports = __webpack_public_path__ + \"6c67587c2093ac3a19da9f2196e040b7.js\";","module.exports = __webpack_public_path__ + \"44f69b70923b6104f066464bf87ec997.js\";","module.exports = __webpack_public_path__ + \"595aef8d8b0a2017e2fc27db5703e0d1.js\";","module.exports = __webpack_public_path__ + \"4ceabd28d8dc751f41002ebf2b6fed88.js\";","module.exports = __webpack_public_path__ + \"aa5623ec68d23fedb9c9c115c7d99063.js\";","module.exports = __webpack_public_path__ + \"83b8277db0b3c46f118c37b93cacbd62.js\";","module.exports = __webpack_public_path__ + \"10132993df2cf9c9423b53a8a44379ab.js\";","module.exports = __webpack_public_path__ + \"01df918a3b14ccabba84acb00178c57c.js\";","module.exports = __webpack_public_path__ + \"c0736a7477d7aac4c669bb94ccae25d9.js\";","module.exports = __webpack_public_path__ + \"cb4175466ea600940f2927fa03a217e8.js\";","module.exports = __webpack_public_path__ + \"dbe575aa738ad773a96526b46498df06.js\";","module.exports = __webpack_public_path__ + \"2b150c2332452066eaed1f53e1572720.js\";","module.exports = __webpack_public_path__ + \"5fc5c77d4df4f5d77f8530f6b23ecd1e.js\";","module.exports = __webpack_public_path__ + \"82fed7ec74be91e0db61c500d9c6d7ee.js\";","module.exports = __webpack_public_path__ + \"e6fb5287a46e030336c006e3f50ade3a.js\";","module.exports = __webpack_public_path__ + \"1b15b9f88acaf59b96e59c6b5f32da12.js\";","module.exports = __webpack_public_path__ + \"c80e89199aef31e48addb2b35ea96365.js\";","module.exports = __webpack_public_path__ + \"5c85862f6de1eae7f4e50cbfe7c80b9f.js\";","module.exports = __webpack_public_path__ + \"d79b3962938d65fb85c6f844e86d92d9.js\";","module.exports = __webpack_public_path__ + \"2ade5c4002b4710f2a1f6a5cd36c08c9.js\";","module.exports = __webpack_public_path__ + \"ecd37b343c4dcc8dac849b1c680dcbef.js\";","module.exports = __webpack_public_path__ + \"179a93d3148b7edb72581279c3787d0c.js\";","module.exports = __webpack_public_path__ + \"57f4109bd1f06be4dc2bcb8ff7eaf1e5.js\";","module.exports = __webpack_public_path__ + \"d21451f11085978633c326c46bab30db.js\";","module.exports = __webpack_public_path__ + \"bec560527365ce4294ec5a9b6cd1f2c6.js\";","module.exports = __webpack_public_path__ + \"b33ef9b4202539d3690251cb8213a034.js\";","module.exports = __webpack_public_path__ + \"71ef0f55140f0dd02fce0f6d892e8861.js\";","module.exports = __webpack_public_path__ + \"641021f265c44248f23e7e04936868dc.js\";","module.exports = __webpack_public_path__ + \"4c4e2829082a68aace54050cc1c5749c.js\";","module.exports = __webpack_public_path__ + \"101432b7228de09425cb10683cd7a721.js\";","module.exports = __webpack_public_path__ + \"6c0a75dc5671c3f237a79f6e45b9891c.js\";","module.exports = __webpack_public_path__ + \"18e63e724098792b95b076412a860636.js\";","module.exports = __webpack_public_path__ + \"0bc8540c08925f6cdf6d7c3ce8fbcea0.js\";","module.exports = __webpack_public_path__ + \"abb40a9a6ef0b2fe14c66dcadc9857a2.js\";","module.exports = __webpack_public_path__ + \"03980cb12dacd26148c22bb61fce440f.js\";","module.exports = __webpack_public_path__ + \"de0fd4fd7c2d7a4887cbc99eed91f797.js\";","module.exports = __webpack_public_path__ + \"3c2dea390c14a45539fdcf72c009d47a.js\";","module.exports = __webpack_public_path__ + \"30e80558090a09477e4466af8af4c40e.js\";","module.exports = __webpack_public_path__ + \"0170112234bab2a295eb3a18f218e724.js\";","module.exports = __webpack_public_path__ + \"e4917fa7632b01d28e99304d32d989f7.js\";","module.exports = __webpack_public_path__ + \"d04707d65591e86810ebc56d48b10810.js\";","module.exports = __webpack_public_path__ + \"5ebdef8c548fca6c51280e915d6f4c3f.js\";","module.exports = __webpack_public_path__ + \"cf3f6b1c74c72cb5d02870022dbc9f94.js\";","module.exports = __webpack_public_path__ + \"8cb83aa3fea85e950c29450b8237fb72.js\";","module.exports = __webpack_public_path__ + \"6faa9e5f2a0122d2333fa450337a09b0.js\";","module.exports = __webpack_public_path__ + \"58aab872dbdb5e1607076e1935130e03.js\";","module.exports = __webpack_public_path__ + \"2ddd0346681f9f12fd3a191245aa41df.js\";","module.exports = __webpack_public_path__ + \"5ada4185d70a1852b578b2063de58e37.js\";","module.exports = __webpack_public_path__ + \"725da29f1643c2263a437c08a1454aea.js\";","module.exports = __webpack_public_path__ + \"f693e8290e3a15a35d2b28f78c3d3533.js\";","module.exports = __webpack_public_path__ + \"53e3600928916423671f3388e2d67844.js\";","module.exports = __webpack_public_path__ + \"87d6bf8becf2d5ebe2f71fda95a313ea.js\";","module.exports = __webpack_public_path__ + \"e61779df91186b23e7adf2d1968b2708.js\";","module.exports = __webpack_public_path__ + \"64a5f4d62507d032038dcd76d15188e1.js\";","module.exports = __webpack_public_path__ + \"8e45b09d2016829aba6f70f59f6e428e.js\";","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar editorOptions = [\n \"minLines\",\n \"maxLines\",\n \"readOnly\",\n \"highlightActiveLine\",\n \"tabSize\",\n \"enableBasicAutocompletion\",\n \"enableLiveAutocompletion\",\n \"enableSnippets\"\n];\nexports.editorOptions = editorOptions;\nvar editorEvents = [\n \"onChange\",\n \"onFocus\",\n \"onInput\",\n \"onBlur\",\n \"onCopy\",\n \"onPaste\",\n \"onSelectionChange\",\n \"onCursorChange\",\n \"onScroll\",\n \"handleOptions\",\n \"updateRef\"\n];\nexports.editorEvents = editorEvents;\nvar getAceInstance = function () {\n var ace;\n if (typeof window === \"undefined\") {\n // ace-builds just needs some window object to attach ace to.\n // During SSR even just an empty object will work.\n global.window = {};\n ace = require(\"ace-builds\");\n // And it can be discarded immediately afterward to avoid confusing\n // other libraries that might detect SSR the same way we did.\n delete global.window;\n }\n else if (window.ace) {\n // Fallback for ace.require when vanilla ACE is hosted over a CDN\n ace = window.ace;\n ace.acequire = window.ace.require || window.ace.acequire;\n }\n else {\n ace = require(\"ace-builds\");\n }\n return ace;\n};\nexports.getAceInstance = getAceInstance;\nvar debounce = function (fn, delay) {\n var timer = null;\n // tslint:disable-next-line\n return function () {\n var context = this;\n var args = arguments;\n clearTimeout(timer);\n timer = setTimeout(function () {\n fn.apply(context, args);\n }, delay);\n };\n};\nexports.debounce = debounce;\n//# sourceMappingURL=editorOptions.js.map","module.exports = __webpack_public_path__ + \"5352ecd8e5f1a2637b48e18cc406edb1.js\";","module.exports = __webpack_public_path__ + \"4e389cce6fb8f78845fab249bce43c0b.js\";","module.exports = __webpack_public_path__ + \"e920af9f7a50e1c8fe0b0b3cd19937bf.js\";","module.exports = __webpack_public_path__ + \"5b6a626249d0bc43e412fffa6a9ee177.js\";","module.exports = __webpack_public_path__ + \"cd358d9acaaa7049d85b15ac766fc314.js\";","module.exports = __webpack_public_path__ + \"8bf75743fb14fea7cf02a5da1bda79d4.js\";","module.exports = __webpack_public_path__ + \"2f055ac4066041b9008dd6aebf9df34b.js\";","module.exports = __webpack_public_path__ + \"f79630d85284a7f6dadc25c1d256af0a.js\";","module.exports = __webpack_public_path__ + \"70074e0c785c9a808dea76c7c7d17af3.js\";","module.exports = __webpack_public_path__ + \"663234c150f2097f3812c6065491497c.js\";","module.exports = __webpack_public_path__ + \"44ac2a2398075299754707d4bac7c276.js\";","module.exports = __webpack_public_path__ + \"2eb6240af39282952504b5e016895183.js\";","module.exports = __webpack_public_path__ + \"69e9b4cb1e86677ea0abea312069496e.js\";","module.exports = __webpack_public_path__ + \"40e6f6cb52a24a747b1046614db3b164.js\";","module.exports = __webpack_public_path__ + \"964646d64dd3196a9c27fe302511414a.js\";","module.exports = __webpack_public_path__ + \"18e852d001368f75e7f75aaaee6dfe71.js\";","module.exports = __webpack_public_path__ + \"656f53e1b4c6e37a31799737faf6d639.js\";","module.exports = __webpack_public_path__ + \"aa0eee504d52a12d3a30bbd523afcc34.js\";","module.exports = __webpack_public_path__ + \"3c7262d7b1ffe2850fad47c66d798b0d.js\";","module.exports = __webpack_public_path__ + \"367ad31e6d99d0021d05133b85bb9faf.js\";","module.exports = __webpack_public_path__ + \"27730a0bdc6f430cc85049a46a73a029.js\";","module.exports = __webpack_public_path__ + \"c631c95d9019218dfd22d028f215e1d1.js\";","module.exports = __webpack_public_path__ + \"ed4792eae087d02a3b34f0bcb7d6c1d2.js\";","module.exports = __webpack_public_path__ + \"ec32839f8f3353e66b85450525fa3114.js\";","module.exports = __webpack_public_path__ + \"cf816f70242478c5fd7060c4a028ae50.js\";","module.exports = __webpack_public_path__ + \"16563bfaf4741097d38cc6ce3ccc1a2d.js\";","module.exports = __webpack_public_path__ + \"0ec4bf56a876c2bf34ea174c584ce628.js\";","module.exports = __webpack_public_path__ + \"4b425eb8188febc5a89674b89a72d296.js\";","module.exports = __webpack_public_path__ + \"34791bf31a4236531bc887b48f872c1c.js\";","module.exports = __webpack_public_path__ + \"b6a6a4adaab4f09a7835ff64a5096198.js\";","module.exports = __webpack_public_path__ + \"f27ea796db6b7ed61b49a1e65a7d6aeb.js\";","module.exports = __webpack_public_path__ + \"291611f874a2bc54dbc291b52d74c512.js\";","module.exports = __webpack_public_path__ + \"e8a90b8da6f1cc34bb3ae09d2dae077d.js\";","module.exports = __webpack_public_path__ + \"5a496ae20cc576bef1d35972548207cf.js\";","module.exports = __webpack_public_path__ + \"b402b938ca2da72e0984a1360eda5897.js\";","module.exports = __webpack_public_path__ + \"5e6c2744429a8fac6e536b179c1f31d0.js\";","module.exports = __webpack_public_path__ + \"2ff54aa3c655216f360438bc7f5b181a.js\";","module.exports = __webpack_public_path__ + \"1e26167b5f75d5b94add34f1f4d8b044.js\";","module.exports = __webpack_public_path__ + \"85a977f41a907dba8c672f9bf4943da0.js\";","module.exports = __webpack_public_path__ + \"a164d0e40c4dfa485dcf8e6d5258d767.js\";","module.exports = __webpack_public_path__ + \"9dd9cc0ee0c8abcbe4e7c47679b278f1.js\";","module.exports = __webpack_public_path__ + \"2272c6632c52c3e402ab27b8045ab8f1.js\";","module.exports = __webpack_public_path__ + \"55892adefebc0d53993fb108151ed150.js\";","module.exports = __webpack_public_path__ + \"a4bedde07e392f8ebf64341b61f75df2.js\";","module.exports = __webpack_public_path__ + \"c40023acde0f3d5f4806f5fccbb4284b.js\";","module.exports = __webpack_public_path__ + \"909adc4a16e0f97d869e3dd16d561430.js\";","module.exports = __webpack_public_path__ + \"f90003058d7087f15baa27b80bf08c1d.js\";","module.exports = __webpack_public_path__ + \"191feb6103c36b202bc01ba262916cdf.js\";","module.exports = __webpack_public_path__ + \"c51840077c684be0e7e13339f85cd4a9.js\";","module.exports = __webpack_public_path__ + \"3b6e7dc98c47eeafd851ca5072db4be6.js\";","module.exports = __webpack_public_path__ + \"47541c23870e955fff15de4be490ba74.js\";","module.exports = __webpack_public_path__ + \"cda6c5c52fa5d595982da0fac9da25a5.js\";","module.exports = __webpack_public_path__ + \"4860a6a7c59b9ed5c779f7201dc1f591.js\";","module.exports = __webpack_public_path__ + \"716879b6ef8945d579595d88534ae402.js\";","module.exports = __webpack_public_path__ + \"18c1c3975e34bff803c5f6e212df4281.js\";","module.exports = __webpack_public_path__ + \"5861dfe4f2c7823623e82d0619c5bf06.js\";","module.exports = __webpack_public_path__ + \"c39df88966f20b18513bc231ba539721.js\";","module.exports = __webpack_public_path__ + \"c1bc72d79cc6161590fc01c6b139fccd.js\";","module.exports = __webpack_public_path__ + \"df37029cdf8359ecac0aebdf4f257d03.js\";","module.exports = __webpack_public_path__ + \"c0780e66c6b1ade0fa22283ce1f9c402.js\";","module.exports = __webpack_public_path__ + \"8361542d34c46713c9aff6c4ce65a9a3.js\";","\nace.config.setModuleUrl('ace/ext/beautify', require('file-loader?esModule=false!./src-noconflict/ext-beautify.js'))\nace.config.setModuleUrl('ace/ext/code_lens', require('file-loader?esModule=false!./src-noconflict/ext-code_lens.js'))\nace.config.setModuleUrl('ace/ext/elastic_tabstops_lite', require('file-loader?esModule=false!./src-noconflict/ext-elastic_tabstops_lite.js'))\nace.config.setModuleUrl('ace/ext/emmet', require('file-loader?esModule=false!./src-noconflict/ext-emmet.js'))\nace.config.setModuleUrl('ace/ext/error_marker', require('file-loader?esModule=false!./src-noconflict/ext-error_marker.js'))\nace.config.setModuleUrl('ace/ext/keyboard_menu', require('file-loader?esModule=false!./src-noconflict/ext-keybinding_menu.js'))\nace.config.setModuleUrl('ace/ext/language_tools', require('file-loader?esModule=false!./src-noconflict/ext-language_tools.js'))\nace.config.setModuleUrl('ace/ext/linking', require('file-loader?esModule=false!./src-noconflict/ext-linking.js'))\nace.config.setModuleUrl('ace/ext/modelist', require('file-loader?esModule=false!./src-noconflict/ext-modelist.js'))\nace.config.setModuleUrl('ace/ext/options', require('file-loader?esModule=false!./src-noconflict/ext-options.js'))\nace.config.setModuleUrl('ace/ext/prompt', require('file-loader?esModule=false!./src-noconflict/ext-prompt.js'))\nace.config.setModuleUrl('ace/ext/rtl', require('file-loader?esModule=false!./src-noconflict/ext-rtl.js'))\nace.config.setModuleUrl('ace/ext/searchbox', require('file-loader?esModule=false!./src-noconflict/ext-searchbox.js'))\nace.config.setModuleUrl('ace/ext/settings_menu', require('file-loader?esModule=false!./src-noconflict/ext-settings_menu.js'))\nace.config.setModuleUrl('ace/ext/spellcheck', require('file-loader?esModule=false!./src-noconflict/ext-spellcheck.js'))\nace.config.setModuleUrl('ace/ext/split', require('file-loader?esModule=false!./src-noconflict/ext-split.js'))\nace.config.setModuleUrl('ace/ext/static_highlight', require('file-loader?esModule=false!./src-noconflict/ext-static_highlight.js'))\nace.config.setModuleUrl('ace/ext/statusbar', require('file-loader?esModule=false!./src-noconflict/ext-statusbar.js'))\nace.config.setModuleUrl('ace/ext/textarea', require('file-loader?esModule=false!./src-noconflict/ext-textarea.js'))\nace.config.setModuleUrl('ace/ext/themelist', require('file-loader?esModule=false!./src-noconflict/ext-themelist.js'))\nace.config.setModuleUrl('ace/ext/whitespace', require('file-loader?esModule=false!./src-noconflict/ext-whitespace.js'))\nace.config.setModuleUrl('ace/keyboard/emacs', require('file-loader?esModule=false!./src-noconflict/keybinding-emacs.js'))\nace.config.setModuleUrl('ace/keyboard/sublime', require('file-loader?esModule=false!./src-noconflict/keybinding-sublime.js'))\nace.config.setModuleUrl('ace/keyboard/vim', require('file-loader?esModule=false!./src-noconflict/keybinding-vim.js'))\nace.config.setModuleUrl('ace/keyboard/vscode', require('file-loader?esModule=false!./src-noconflict/keybinding-vscode.js'))\nace.config.setModuleUrl('ace/mode/abap', require('file-loader?esModule=false!./src-noconflict/mode-abap.js'))\nace.config.setModuleUrl('ace/mode/abc', require('file-loader?esModule=false!./src-noconflict/mode-abc.js'))\nace.config.setModuleUrl('ace/mode/actionscript', require('file-loader?esModule=false!./src-noconflict/mode-actionscript.js'))\nace.config.setModuleUrl('ace/mode/ada', require('file-loader?esModule=false!./src-noconflict/mode-ada.js'))\nace.config.setModuleUrl('ace/mode/alda', require('file-loader?esModule=false!./src-noconflict/mode-alda.js'))\nace.config.setModuleUrl('ace/mode/apache_conf', require('file-loader?esModule=false!./src-noconflict/mode-apache_conf.js'))\nace.config.setModuleUrl('ace/mode/apex', require('file-loader?esModule=false!./src-noconflict/mode-apex.js'))\nace.config.setModuleUrl('ace/mode/applescript', require('file-loader?esModule=false!./src-noconflict/mode-applescript.js'))\nace.config.setModuleUrl('ace/mode/aql', require('file-loader?esModule=false!./src-noconflict/mode-aql.js'))\nace.config.setModuleUrl('ace/mode/asciidoc', require('file-loader?esModule=false!./src-noconflict/mode-asciidoc.js'))\nace.config.setModuleUrl('ace/mode/asl', require('file-loader?esModule=false!./src-noconflict/mode-asl.js'))\nace.config.setModuleUrl('ace/mode/assembly_x86', require('file-loader?esModule=false!./src-noconflict/mode-assembly_x86.js'))\nace.config.setModuleUrl('ace/mode/autohotkey', require('file-loader?esModule=false!./src-noconflict/mode-autohotkey.js'))\nace.config.setModuleUrl('ace/mode/batchfile', require('file-loader?esModule=false!./src-noconflict/mode-batchfile.js'))\nace.config.setModuleUrl('ace/mode/c9search', require('file-loader?esModule=false!./src-noconflict/mode-c9search.js'))\nace.config.setModuleUrl('ace/mode/cirru', require('file-loader?esModule=false!./src-noconflict/mode-cirru.js'))\nace.config.setModuleUrl('ace/mode/clojure', require('file-loader?esModule=false!./src-noconflict/mode-clojure.js'))\nace.config.setModuleUrl('ace/mode/cobol', require('file-loader?esModule=false!./src-noconflict/mode-cobol.js'))\nace.config.setModuleUrl('ace/mode/coffee', require('file-loader?esModule=false!./src-noconflict/mode-coffee.js'))\nace.config.setModuleUrl('ace/mode/coldfusion', require('file-loader?esModule=false!./src-noconflict/mode-coldfusion.js'))\nace.config.setModuleUrl('ace/mode/crystal', require('file-loader?esModule=false!./src-noconflict/mode-crystal.js'))\nace.config.setModuleUrl('ace/mode/csharp', require('file-loader?esModule=false!./src-noconflict/mode-csharp.js'))\nace.config.setModuleUrl('ace/mode/csound_document', require('file-loader?esModule=false!./src-noconflict/mode-csound_document.js'))\nace.config.setModuleUrl('ace/mode/csound_orchestra', require('file-loader?esModule=false!./src-noconflict/mode-csound_orchestra.js'))\nace.config.setModuleUrl('ace/mode/csound_score', require('file-loader?esModule=false!./src-noconflict/mode-csound_score.js'))\nace.config.setModuleUrl('ace/mode/csp', require('file-loader?esModule=false!./src-noconflict/mode-csp.js'))\nace.config.setModuleUrl('ace/mode/css', require('file-loader?esModule=false!./src-noconflict/mode-css.js'))\nace.config.setModuleUrl('ace/mode/curly', require('file-loader?esModule=false!./src-noconflict/mode-curly.js'))\nace.config.setModuleUrl('ace/mode/c_cpp', require('file-loader?esModule=false!./src-noconflict/mode-c_cpp.js'))\nace.config.setModuleUrl('ace/mode/d', require('file-loader?esModule=false!./src-noconflict/mode-d.js'))\nace.config.setModuleUrl('ace/mode/dart', require('file-loader?esModule=false!./src-noconflict/mode-dart.js'))\nace.config.setModuleUrl('ace/mode/diff', require('file-loader?esModule=false!./src-noconflict/mode-diff.js'))\nace.config.setModuleUrl('ace/mode/django', require('file-loader?esModule=false!./src-noconflict/mode-django.js'))\nace.config.setModuleUrl('ace/mode/dockerfile', require('file-loader?esModule=false!./src-noconflict/mode-dockerfile.js'))\nace.config.setModuleUrl('ace/mode/dot', require('file-loader?esModule=false!./src-noconflict/mode-dot.js'))\nace.config.setModuleUrl('ace/mode/drools', require('file-loader?esModule=false!./src-noconflict/mode-drools.js'))\nace.config.setModuleUrl('ace/mode/edifact', require('file-loader?esModule=false!./src-noconflict/mode-edifact.js'))\nace.config.setModuleUrl('ace/mode/eiffel', require('file-loader?esModule=false!./src-noconflict/mode-eiffel.js'))\nace.config.setModuleUrl('ace/mode/ejs', require('file-loader?esModule=false!./src-noconflict/mode-ejs.js'))\nace.config.setModuleUrl('ace/mode/elixir', require('file-loader?esModule=false!./src-noconflict/mode-elixir.js'))\nace.config.setModuleUrl('ace/mode/elm', require('file-loader?esModule=false!./src-noconflict/mode-elm.js'))\nace.config.setModuleUrl('ace/mode/erlang', require('file-loader?esModule=false!./src-noconflict/mode-erlang.js'))\nace.config.setModuleUrl('ace/mode/forth', require('file-loader?esModule=false!./src-noconflict/mode-forth.js'))\nace.config.setModuleUrl('ace/mode/fortran', require('file-loader?esModule=false!./src-noconflict/mode-fortran.js'))\nace.config.setModuleUrl('ace/mode/fsharp', require('file-loader?esModule=false!./src-noconflict/mode-fsharp.js'))\nace.config.setModuleUrl('ace/mode/fsl', require('file-loader?esModule=false!./src-noconflict/mode-fsl.js'))\nace.config.setModuleUrl('ace/mode/ftl', require('file-loader?esModule=false!./src-noconflict/mode-ftl.js'))\nace.config.setModuleUrl('ace/mode/gcode', require('file-loader?esModule=false!./src-noconflict/mode-gcode.js'))\nace.config.setModuleUrl('ace/mode/gherkin', require('file-loader?esModule=false!./src-noconflict/mode-gherkin.js'))\nace.config.setModuleUrl('ace/mode/gitignore', require('file-loader?esModule=false!./src-noconflict/mode-gitignore.js'))\nace.config.setModuleUrl('ace/mode/glsl', require('file-loader?esModule=false!./src-noconflict/mode-glsl.js'))\nace.config.setModuleUrl('ace/mode/gobstones', require('file-loader?esModule=false!./src-noconflict/mode-gobstones.js'))\nace.config.setModuleUrl('ace/mode/golang', require('file-loader?esModule=false!./src-noconflict/mode-golang.js'))\nace.config.setModuleUrl('ace/mode/graphqlschema', require('file-loader?esModule=false!./src-noconflict/mode-graphqlschema.js'))\nace.config.setModuleUrl('ace/mode/groovy', require('file-loader?esModule=false!./src-noconflict/mode-groovy.js'))\nace.config.setModuleUrl('ace/mode/haml', require('file-loader?esModule=false!./src-noconflict/mode-haml.js'))\nace.config.setModuleUrl('ace/mode/handlebars', require('file-loader?esModule=false!./src-noconflict/mode-handlebars.js'))\nace.config.setModuleUrl('ace/mode/haskell', require('file-loader?esModule=false!./src-noconflict/mode-haskell.js'))\nace.config.setModuleUrl('ace/mode/haskell_cabal', require('file-loader?esModule=false!./src-noconflict/mode-haskell_cabal.js'))\nace.config.setModuleUrl('ace/mode/haxe', require('file-loader?esModule=false!./src-noconflict/mode-haxe.js'))\nace.config.setModuleUrl('ace/mode/hjson', require('file-loader?esModule=false!./src-noconflict/mode-hjson.js'))\nace.config.setModuleUrl('ace/mode/html', require('file-loader?esModule=false!./src-noconflict/mode-html.js'))\nace.config.setModuleUrl('ace/mode/html_elixir', require('file-loader?esModule=false!./src-noconflict/mode-html_elixir.js'))\nace.config.setModuleUrl('ace/mode/html_ruby', require('file-loader?esModule=false!./src-noconflict/mode-html_ruby.js'))\nace.config.setModuleUrl('ace/mode/ini', require('file-loader?esModule=false!./src-noconflict/mode-ini.js'))\nace.config.setModuleUrl('ace/mode/io', require('file-loader?esModule=false!./src-noconflict/mode-io.js'))\nace.config.setModuleUrl('ace/mode/jack', require('file-loader?esModule=false!./src-noconflict/mode-jack.js'))\nace.config.setModuleUrl('ace/mode/jade', require('file-loader?esModule=false!./src-noconflict/mode-jade.js'))\nace.config.setModuleUrl('ace/mode/java', require('file-loader?esModule=false!./src-noconflict/mode-java.js'))\nace.config.setModuleUrl('ace/mode/javascript', require('file-loader?esModule=false!./src-noconflict/mode-javascript.js'))\nace.config.setModuleUrl('ace/mode/json', require('file-loader?esModule=false!./src-noconflict/mode-json.js'))\nace.config.setModuleUrl('ace/mode/json5', require('file-loader?esModule=false!./src-noconflict/mode-json5.js'))\nace.config.setModuleUrl('ace/mode/jsoniq', require('file-loader?esModule=false!./src-noconflict/mode-jsoniq.js'))\nace.config.setModuleUrl('ace/mode/jsp', require('file-loader?esModule=false!./src-noconflict/mode-jsp.js'))\nace.config.setModuleUrl('ace/mode/jssm', require('file-loader?esModule=false!./src-noconflict/mode-jssm.js'))\nace.config.setModuleUrl('ace/mode/jsx', require('file-loader?esModule=false!./src-noconflict/mode-jsx.js'))\nace.config.setModuleUrl('ace/mode/julia', require('file-loader?esModule=false!./src-noconflict/mode-julia.js'))\nace.config.setModuleUrl('ace/mode/kotlin', require('file-loader?esModule=false!./src-noconflict/mode-kotlin.js'))\nace.config.setModuleUrl('ace/mode/latex', require('file-loader?esModule=false!./src-noconflict/mode-latex.js'))\nace.config.setModuleUrl('ace/mode/less', require('file-loader?esModule=false!./src-noconflict/mode-less.js'))\nace.config.setModuleUrl('ace/mode/liquid', require('file-loader?esModule=false!./src-noconflict/mode-liquid.js'))\nace.config.setModuleUrl('ace/mode/lisp', require('file-loader?esModule=false!./src-noconflict/mode-lisp.js'))\nace.config.setModuleUrl('ace/mode/livescript', require('file-loader?esModule=false!./src-noconflict/mode-livescript.js'))\nace.config.setModuleUrl('ace/mode/logiql', require('file-loader?esModule=false!./src-noconflict/mode-logiql.js'))\nace.config.setModuleUrl('ace/mode/logtalk', require('file-loader?esModule=false!./src-noconflict/mode-logtalk.js'))\nace.config.setModuleUrl('ace/mode/lsl', require('file-loader?esModule=false!./src-noconflict/mode-lsl.js'))\nace.config.setModuleUrl('ace/mode/lua', require('file-loader?esModule=false!./src-noconflict/mode-lua.js'))\nace.config.setModuleUrl('ace/mode/luapage', require('file-loader?esModule=false!./src-noconflict/mode-luapage.js'))\nace.config.setModuleUrl('ace/mode/lucene', require('file-loader?esModule=false!./src-noconflict/mode-lucene.js'))\nace.config.setModuleUrl('ace/mode/makefile', require('file-loader?esModule=false!./src-noconflict/mode-makefile.js'))\nace.config.setModuleUrl('ace/mode/markdown', require('file-loader?esModule=false!./src-noconflict/mode-markdown.js'))\nace.config.setModuleUrl('ace/mode/mask', require('file-loader?esModule=false!./src-noconflict/mode-mask.js'))\nace.config.setModuleUrl('ace/mode/matlab', require('file-loader?esModule=false!./src-noconflict/mode-matlab.js'))\nace.config.setModuleUrl('ace/mode/maze', require('file-loader?esModule=false!./src-noconflict/mode-maze.js'))\nace.config.setModuleUrl('ace/mode/mediawiki', require('file-loader?esModule=false!./src-noconflict/mode-mediawiki.js'))\nace.config.setModuleUrl('ace/mode/mel', require('file-loader?esModule=false!./src-noconflict/mode-mel.js'))\nace.config.setModuleUrl('ace/mode/mixal', require('file-loader?esModule=false!./src-noconflict/mode-mixal.js'))\nace.config.setModuleUrl('ace/mode/mushcode', require('file-loader?esModule=false!./src-noconflict/mode-mushcode.js'))\nace.config.setModuleUrl('ace/mode/mysql', require('file-loader?esModule=false!./src-noconflict/mode-mysql.js'))\nace.config.setModuleUrl('ace/mode/nginx', require('file-loader?esModule=false!./src-noconflict/mode-nginx.js'))\nace.config.setModuleUrl('ace/mode/nim', require('file-loader?esModule=false!./src-noconflict/mode-nim.js'))\nace.config.setModuleUrl('ace/mode/nix', require('file-loader?esModule=false!./src-noconflict/mode-nix.js'))\nace.config.setModuleUrl('ace/mode/nsis', require('file-loader?esModule=false!./src-noconflict/mode-nsis.js'))\nace.config.setModuleUrl('ace/mode/nunjucks', require('file-loader?esModule=false!./src-noconflict/mode-nunjucks.js'))\nace.config.setModuleUrl('ace/mode/objectivec', require('file-loader?esModule=false!./src-noconflict/mode-objectivec.js'))\nace.config.setModuleUrl('ace/mode/ocaml', require('file-loader?esModule=false!./src-noconflict/mode-ocaml.js'))\nace.config.setModuleUrl('ace/mode/pascal', require('file-loader?esModule=false!./src-noconflict/mode-pascal.js'))\nace.config.setModuleUrl('ace/mode/perl', require('file-loader?esModule=false!./src-noconflict/mode-perl.js'))\nace.config.setModuleUrl('ace/mode/perl6', require('file-loader?esModule=false!./src-noconflict/mode-perl6.js'))\nace.config.setModuleUrl('ace/mode/pgsql', require('file-loader?esModule=false!./src-noconflict/mode-pgsql.js'))\nace.config.setModuleUrl('ace/mode/php', require('file-loader?esModule=false!./src-noconflict/mode-php.js'))\nace.config.setModuleUrl('ace/mode/php_laravel_blade', require('file-loader?esModule=false!./src-noconflict/mode-php_laravel_blade.js'))\nace.config.setModuleUrl('ace/mode/pig', require('file-loader?esModule=false!./src-noconflict/mode-pig.js'))\nace.config.setModuleUrl('ace/mode/plain_text', require('file-loader?esModule=false!./src-noconflict/mode-plain_text.js'))\nace.config.setModuleUrl('ace/mode/powershell', require('file-loader?esModule=false!./src-noconflict/mode-powershell.js'))\nace.config.setModuleUrl('ace/mode/praat', require('file-loader?esModule=false!./src-noconflict/mode-praat.js'))\nace.config.setModuleUrl('ace/mode/prisma', require('file-loader?esModule=false!./src-noconflict/mode-prisma.js'))\nace.config.setModuleUrl('ace/mode/prolog', require('file-loader?esModule=false!./src-noconflict/mode-prolog.js'))\nace.config.setModuleUrl('ace/mode/properties', require('file-loader?esModule=false!./src-noconflict/mode-properties.js'))\nace.config.setModuleUrl('ace/mode/protobuf', require('file-loader?esModule=false!./src-noconflict/mode-protobuf.js'))\nace.config.setModuleUrl('ace/mode/puppet', require('file-loader?esModule=false!./src-noconflict/mode-puppet.js'))\nace.config.setModuleUrl('ace/mode/python', require('file-loader?esModule=false!./src-noconflict/mode-python.js'))\nace.config.setModuleUrl('ace/mode/qml', require('file-loader?esModule=false!./src-noconflict/mode-qml.js'))\nace.config.setModuleUrl('ace/mode/r', require('file-loader?esModule=false!./src-noconflict/mode-r.js'))\nace.config.setModuleUrl('ace/mode/razor', require('file-loader?esModule=false!./src-noconflict/mode-razor.js'))\nace.config.setModuleUrl('ace/mode/rdoc', require('file-loader?esModule=false!./src-noconflict/mode-rdoc.js'))\nace.config.setModuleUrl('ace/mode/red', require('file-loader?esModule=false!./src-noconflict/mode-red.js'))\nace.config.setModuleUrl('ace/mode/redshift', require('file-loader?esModule=false!./src-noconflict/mode-redshift.js'))\nace.config.setModuleUrl('ace/mode/rhtml', require('file-loader?esModule=false!./src-noconflict/mode-rhtml.js'))\nace.config.setModuleUrl('ace/mode/rst', require('file-loader?esModule=false!./src-noconflict/mode-rst.js'))\nace.config.setModuleUrl('ace/mode/ruby', require('file-loader?esModule=false!./src-noconflict/mode-ruby.js'))\nace.config.setModuleUrl('ace/mode/rust', require('file-loader?esModule=false!./src-noconflict/mode-rust.js'))\nace.config.setModuleUrl('ace/mode/sass', require('file-loader?esModule=false!./src-noconflict/mode-sass.js'))\nace.config.setModuleUrl('ace/mode/scad', require('file-loader?esModule=false!./src-noconflict/mode-scad.js'))\nace.config.setModuleUrl('ace/mode/scala', require('file-loader?esModule=false!./src-noconflict/mode-scala.js'))\nace.config.setModuleUrl('ace/mode/scheme', require('file-loader?esModule=false!./src-noconflict/mode-scheme.js'))\nace.config.setModuleUrl('ace/mode/scss', require('file-loader?esModule=false!./src-noconflict/mode-scss.js'))\nace.config.setModuleUrl('ace/mode/sh', require('file-loader?esModule=false!./src-noconflict/mode-sh.js'))\nace.config.setModuleUrl('ace/mode/sjs', require('file-loader?esModule=false!./src-noconflict/mode-sjs.js'))\nace.config.setModuleUrl('ace/mode/slim', require('file-loader?esModule=false!./src-noconflict/mode-slim.js'))\nace.config.setModuleUrl('ace/mode/smarty', require('file-loader?esModule=false!./src-noconflict/mode-smarty.js'))\nace.config.setModuleUrl('ace/mode/snippets', require('file-loader?esModule=false!./src-noconflict/mode-snippets.js'))\nace.config.setModuleUrl('ace/mode/soy_template', require('file-loader?esModule=false!./src-noconflict/mode-soy_template.js'))\nace.config.setModuleUrl('ace/mode/space', require('file-loader?esModule=false!./src-noconflict/mode-space.js'))\nace.config.setModuleUrl('ace/mode/sparql', require('file-loader?esModule=false!./src-noconflict/mode-sparql.js'))\nace.config.setModuleUrl('ace/mode/sql', require('file-loader?esModule=false!./src-noconflict/mode-sql.js'))\nace.config.setModuleUrl('ace/mode/sqlserver', require('file-loader?esModule=false!./src-noconflict/mode-sqlserver.js'))\nace.config.setModuleUrl('ace/mode/stylus', require('file-loader?esModule=false!./src-noconflict/mode-stylus.js'))\nace.config.setModuleUrl('ace/mode/svg', require('file-loader?esModule=false!./src-noconflict/mode-svg.js'))\nace.config.setModuleUrl('ace/mode/swift', require('file-loader?esModule=false!./src-noconflict/mode-swift.js'))\nace.config.setModuleUrl('ace/mode/tcl', require('file-loader?esModule=false!./src-noconflict/mode-tcl.js'))\nace.config.setModuleUrl('ace/mode/terraform', require('file-loader?esModule=false!./src-noconflict/mode-terraform.js'))\nace.config.setModuleUrl('ace/mode/tex', require('file-loader?esModule=false!./src-noconflict/mode-tex.js'))\nace.config.setModuleUrl('ace/mode/text', require('file-loader?esModule=false!./src-noconflict/mode-text.js'))\nace.config.setModuleUrl('ace/mode/textile', require('file-loader?esModule=false!./src-noconflict/mode-textile.js'))\nace.config.setModuleUrl('ace/mode/toml', require('file-loader?esModule=false!./src-noconflict/mode-toml.js'))\nace.config.setModuleUrl('ace/mode/tsx', require('file-loader?esModule=false!./src-noconflict/mode-tsx.js'))\nace.config.setModuleUrl('ace/mode/turtle', require('file-loader?esModule=false!./src-noconflict/mode-turtle.js'))\nace.config.setModuleUrl('ace/mode/twig', require('file-loader?esModule=false!./src-noconflict/mode-twig.js'))\nace.config.setModuleUrl('ace/mode/typescript', require('file-loader?esModule=false!./src-noconflict/mode-typescript.js'))\nace.config.setModuleUrl('ace/mode/vala', require('file-loader?esModule=false!./src-noconflict/mode-vala.js'))\nace.config.setModuleUrl('ace/mode/vbscript', require('file-loader?esModule=false!./src-noconflict/mode-vbscript.js'))\nace.config.setModuleUrl('ace/mode/velocity', require('file-loader?esModule=false!./src-noconflict/mode-velocity.js'))\nace.config.setModuleUrl('ace/mode/verilog', require('file-loader?esModule=false!./src-noconflict/mode-verilog.js'))\nace.config.setModuleUrl('ace/mode/vhdl', require('file-loader?esModule=false!./src-noconflict/mode-vhdl.js'))\nace.config.setModuleUrl('ace/mode/visualforce', require('file-loader?esModule=false!./src-noconflict/mode-visualforce.js'))\nace.config.setModuleUrl('ace/mode/wollok', require('file-loader?esModule=false!./src-noconflict/mode-wollok.js'))\nace.config.setModuleUrl('ace/mode/xml', require('file-loader?esModule=false!./src-noconflict/mode-xml.js'))\nace.config.setModuleUrl('ace/mode/xquery', require('file-loader?esModule=false!./src-noconflict/mode-xquery.js'))\nace.config.setModuleUrl('ace/mode/yaml', require('file-loader?esModule=false!./src-noconflict/mode-yaml.js'))\nace.config.setModuleUrl('ace/mode/zeek', require('file-loader?esModule=false!./src-noconflict/mode-zeek.js'))\n\nace.config.setModuleUrl('ace/theme/ambiance', require('file-loader?esModule=false!./src-noconflict/theme-ambiance.js'))\nace.config.setModuleUrl('ace/theme/chaos', require('file-loader?esModule=false!./src-noconflict/theme-chaos.js'))\nace.config.setModuleUrl('ace/theme/chrome', require('file-loader?esModule=false!./src-noconflict/theme-chrome.js'))\nace.config.setModuleUrl('ace/theme/clouds', require('file-loader?esModule=false!./src-noconflict/theme-clouds.js'))\nace.config.setModuleUrl('ace/theme/clouds_midnight', require('file-loader?esModule=false!./src-noconflict/theme-clouds_midnight.js'))\nace.config.setModuleUrl('ace/theme/cobalt', require('file-loader?esModule=false!./src-noconflict/theme-cobalt.js'))\nace.config.setModuleUrl('ace/theme/crimson_editor', require('file-loader?esModule=false!./src-noconflict/theme-crimson_editor.js'))\nace.config.setModuleUrl('ace/theme/dawn', require('file-loader?esModule=false!./src-noconflict/theme-dawn.js'))\nace.config.setModuleUrl('ace/theme/dracula', require('file-loader?esModule=false!./src-noconflict/theme-dracula.js'))\nace.config.setModuleUrl('ace/theme/dreamweaver', require('file-loader?esModule=false!./src-noconflict/theme-dreamweaver.js'))\nace.config.setModuleUrl('ace/theme/eclipse', require('file-loader?esModule=false!./src-noconflict/theme-eclipse.js'))\nace.config.setModuleUrl('ace/theme/github', require('file-loader?esModule=false!./src-noconflict/theme-github.js'))\nace.config.setModuleUrl('ace/theme/gob', require('file-loader?esModule=false!./src-noconflict/theme-gob.js'))\nace.config.setModuleUrl('ace/theme/gruvbox', require('file-loader?esModule=false!./src-noconflict/theme-gruvbox.js'))\nace.config.setModuleUrl('ace/theme/idle_fingers', require('file-loader?esModule=false!./src-noconflict/theme-idle_fingers.js'))\nace.config.setModuleUrl('ace/theme/iplastic', require('file-loader?esModule=false!./src-noconflict/theme-iplastic.js'))\nace.config.setModuleUrl('ace/theme/katzenmilch', require('file-loader?esModule=false!./src-noconflict/theme-katzenmilch.js'))\nace.config.setModuleUrl('ace/theme/kr_theme', require('file-loader?esModule=false!./src-noconflict/theme-kr_theme.js'))\nace.config.setModuleUrl('ace/theme/kuroir', require('file-loader?esModule=false!./src-noconflict/theme-kuroir.js'))\nace.config.setModuleUrl('ace/theme/merbivore', require('file-loader?esModule=false!./src-noconflict/theme-merbivore.js'))\nace.config.setModuleUrl('ace/theme/merbivore_soft', require('file-loader?esModule=false!./src-noconflict/theme-merbivore_soft.js'))\nace.config.setModuleUrl('ace/theme/monokai', require('file-loader?esModule=false!./src-noconflict/theme-monokai.js'))\nace.config.setModuleUrl('ace/theme/mono_industrial', require('file-loader?esModule=false!./src-noconflict/theme-mono_industrial.js'))\nace.config.setModuleUrl('ace/theme/nord_dark', require('file-loader?esModule=false!./src-noconflict/theme-nord_dark.js'))\nace.config.setModuleUrl('ace/theme/pastel_on_dark', require('file-loader?esModule=false!./src-noconflict/theme-pastel_on_dark.js'))\nace.config.setModuleUrl('ace/theme/solarized_dark', require('file-loader?esModule=false!./src-noconflict/theme-solarized_dark.js'))\nace.config.setModuleUrl('ace/theme/solarized_light', require('file-loader?esModule=false!./src-noconflict/theme-solarized_light.js'))\nace.config.setModuleUrl('ace/theme/sqlserver', require('file-loader?esModule=false!./src-noconflict/theme-sqlserver.js'))\nace.config.setModuleUrl('ace/theme/terminal', require('file-loader?esModule=false!./src-noconflict/theme-terminal.js'))\nace.config.setModuleUrl('ace/theme/textmate', require('file-loader?esModule=false!./src-noconflict/theme-textmate.js'))\nace.config.setModuleUrl('ace/theme/tomorrow', require('file-loader?esModule=false!./src-noconflict/theme-tomorrow.js'))\nace.config.setModuleUrl('ace/theme/tomorrow_night', require('file-loader?esModule=false!./src-noconflict/theme-tomorrow_night.js'))\nace.config.setModuleUrl('ace/theme/tomorrow_night_blue', require('file-loader?esModule=false!./src-noconflict/theme-tomorrow_night_blue.js'))\nace.config.setModuleUrl('ace/theme/tomorrow_night_bright', require('file-loader?esModule=false!./src-noconflict/theme-tomorrow_night_bright.js'))\nace.config.setModuleUrl('ace/theme/tomorrow_night_eighties', require('file-loader?esModule=false!./src-noconflict/theme-tomorrow_night_eighties.js'))\nace.config.setModuleUrl('ace/theme/twilight', require('file-loader?esModule=false!./src-noconflict/theme-twilight.js'))\nace.config.setModuleUrl('ace/theme/vibrant_ink', require('file-loader?esModule=false!./src-noconflict/theme-vibrant_ink.js'))\nace.config.setModuleUrl('ace/theme/xcode', require('file-loader?esModule=false!./src-noconflict/theme-xcode.js'))\nace.config.setModuleUrl('ace/mode/coffee_worker', require('file-loader?esModule=false!./src-noconflict/worker-coffee.js'))\nace.config.setModuleUrl('ace/mode/css_worker', require('file-loader?esModule=false!./src-noconflict/worker-css.js'))\nace.config.setModuleUrl('ace/mode/html_worker', require('file-loader?esModule=false!./src-noconflict/worker-html.js'))\nace.config.setModuleUrl('ace/mode/javascript_worker', require('file-loader?esModule=false!./src-noconflict/worker-javascript.js'))\nace.config.setModuleUrl('ace/mode/json_worker', require('file-loader?esModule=false!./src-noconflict/worker-json.js'))\nace.config.setModuleUrl('ace/mode/lua_worker', require('file-loader?esModule=false!./src-noconflict/worker-lua.js'))\nace.config.setModuleUrl('ace/mode/php_worker', require('file-loader?esModule=false!./src-noconflict/worker-php.js'))\nace.config.setModuleUrl('ace/mode/xml_worker', require('file-loader?esModule=false!./src-noconflict/worker-xml.js'))\nace.config.setModuleUrl('ace/mode/xquery_worker', require('file-loader?esModule=false!./src-noconflict/worker-xquery.js'))\nace.config.setModuleUrl('ace/snippets/abap', require('file-loader?esModule=false!./src-noconflict/snippets/abap.js'))\nace.config.setModuleUrl('ace/snippets/abc', require('file-loader?esModule=false!./src-noconflict/snippets/abc.js'))\nace.config.setModuleUrl('ace/snippets/actionscript', require('file-loader?esModule=false!./src-noconflict/snippets/actionscript.js'))\nace.config.setModuleUrl('ace/snippets/ada', require('file-loader?esModule=false!./src-noconflict/snippets/ada.js'))\nace.config.setModuleUrl('ace/snippets/alda', require('file-loader?esModule=false!./src-noconflict/snippets/alda.js'))\nace.config.setModuleUrl('ace/snippets/apache_conf', require('file-loader?esModule=false!./src-noconflict/snippets/apache_conf.js'))\nace.config.setModuleUrl('ace/snippets/apex', require('file-loader?esModule=false!./src-noconflict/snippets/apex.js'))\nace.config.setModuleUrl('ace/snippets/applescript', require('file-loader?esModule=false!./src-noconflict/snippets/applescript.js'))\nace.config.setModuleUrl('ace/snippets/aql', require('file-loader?esModule=false!./src-noconflict/snippets/aql.js'))\nace.config.setModuleUrl('ace/snippets/asciidoc', require('file-loader?esModule=false!./src-noconflict/snippets/asciidoc.js'))\nace.config.setModuleUrl('ace/snippets/asl', require('file-loader?esModule=false!./src-noconflict/snippets/asl.js'))\nace.config.setModuleUrl('ace/snippets/assembly_x86', require('file-loader?esModule=false!./src-noconflict/snippets/assembly_x86.js'))\nace.config.setModuleUrl('ace/snippets/autohotkey', require('file-loader?esModule=false!./src-noconflict/snippets/autohotkey.js'))\nace.config.setModuleUrl('ace/snippets/batchfile', require('file-loader?esModule=false!./src-noconflict/snippets/batchfile.js'))\nace.config.setModuleUrl('ace/snippets/c9search', require('file-loader?esModule=false!./src-noconflict/snippets/c9search.js'))\nace.config.setModuleUrl('ace/snippets/cirru', require('file-loader?esModule=false!./src-noconflict/snippets/cirru.js'))\nace.config.setModuleUrl('ace/snippets/clojure', require('file-loader?esModule=false!./src-noconflict/snippets/clojure.js'))\nace.config.setModuleUrl('ace/snippets/cobol', require('file-loader?esModule=false!./src-noconflict/snippets/cobol.js'))\nace.config.setModuleUrl('ace/snippets/coffee', require('file-loader?esModule=false!./src-noconflict/snippets/coffee.js'))\nace.config.setModuleUrl('ace/snippets/coldfusion', require('file-loader?esModule=false!./src-noconflict/snippets/coldfusion.js'))\nace.config.setModuleUrl('ace/snippets/crystal', require('file-loader?esModule=false!./src-noconflict/snippets/crystal.js'))\nace.config.setModuleUrl('ace/snippets/csharp', require('file-loader?esModule=false!./src-noconflict/snippets/csharp.js'))\nace.config.setModuleUrl('ace/snippets/csound_document', require('file-loader?esModule=false!./src-noconflict/snippets/csound_document.js'))\nace.config.setModuleUrl('ace/snippets/csound_orchestra', require('file-loader?esModule=false!./src-noconflict/snippets/csound_orchestra.js'))\nace.config.setModuleUrl('ace/snippets/csound_score', require('file-loader?esModule=false!./src-noconflict/snippets/csound_score.js'))\nace.config.setModuleUrl('ace/snippets/csp', require('file-loader?esModule=false!./src-noconflict/snippets/csp.js'))\nace.config.setModuleUrl('ace/snippets/css', require('file-loader?esModule=false!./src-noconflict/snippets/css.js'))\nace.config.setModuleUrl('ace/snippets/curly', require('file-loader?esModule=false!./src-noconflict/snippets/curly.js'))\nace.config.setModuleUrl('ace/snippets/c_cpp', require('file-loader?esModule=false!./src-noconflict/snippets/c_cpp.js'))\nace.config.setModuleUrl('ace/snippets/d', require('file-loader?esModule=false!./src-noconflict/snippets/d.js'))\nace.config.setModuleUrl('ace/snippets/dart', require('file-loader?esModule=false!./src-noconflict/snippets/dart.js'))\nace.config.setModuleUrl('ace/snippets/diff', require('file-loader?esModule=false!./src-noconflict/snippets/diff.js'))\nace.config.setModuleUrl('ace/snippets/django', require('file-loader?esModule=false!./src-noconflict/snippets/django.js'))\nace.config.setModuleUrl('ace/snippets/dockerfile', require('file-loader?esModule=false!./src-noconflict/snippets/dockerfile.js'))\nace.config.setModuleUrl('ace/snippets/dot', require('file-loader?esModule=false!./src-noconflict/snippets/dot.js'))\nace.config.setModuleUrl('ace/snippets/drools', require('file-loader?esModule=false!./src-noconflict/snippets/drools.js'))\nace.config.setModuleUrl('ace/snippets/edifact', require('file-loader?esModule=false!./src-noconflict/snippets/edifact.js'))\nace.config.setModuleUrl('ace/snippets/eiffel', require('file-loader?esModule=false!./src-noconflict/snippets/eiffel.js'))\nace.config.setModuleUrl('ace/snippets/ejs', require('file-loader?esModule=false!./src-noconflict/snippets/ejs.js'))\nace.config.setModuleUrl('ace/snippets/elixir', require('file-loader?esModule=false!./src-noconflict/snippets/elixir.js'))\nace.config.setModuleUrl('ace/snippets/elm', require('file-loader?esModule=false!./src-noconflict/snippets/elm.js'))\nace.config.setModuleUrl('ace/snippets/erlang', require('file-loader?esModule=false!./src-noconflict/snippets/erlang.js'))\nace.config.setModuleUrl('ace/snippets/forth', require('file-loader?esModule=false!./src-noconflict/snippets/forth.js'))\nace.config.setModuleUrl('ace/snippets/fortran', require('file-loader?esModule=false!./src-noconflict/snippets/fortran.js'))\nace.config.setModuleUrl('ace/snippets/fsharp', require('file-loader?esModule=false!./src-noconflict/snippets/fsharp.js'))\nace.config.setModuleUrl('ace/snippets/fsl', require('file-loader?esModule=false!./src-noconflict/snippets/fsl.js'))\nace.config.setModuleUrl('ace/snippets/ftl', require('file-loader?esModule=false!./src-noconflict/snippets/ftl.js'))\nace.config.setModuleUrl('ace/snippets/gcode', require('file-loader?esModule=false!./src-noconflict/snippets/gcode.js'))\nace.config.setModuleUrl('ace/snippets/gherkin', require('file-loader?esModule=false!./src-noconflict/snippets/gherkin.js'))\nace.config.setModuleUrl('ace/snippets/gitignore', require('file-loader?esModule=false!./src-noconflict/snippets/gitignore.js'))\nace.config.setModuleUrl('ace/snippets/glsl', require('file-loader?esModule=false!./src-noconflict/snippets/glsl.js'))\nace.config.setModuleUrl('ace/snippets/gobstones', require('file-loader?esModule=false!./src-noconflict/snippets/gobstones.js'))\nace.config.setModuleUrl('ace/snippets/golang', require('file-loader?esModule=false!./src-noconflict/snippets/golang.js'))\nace.config.setModuleUrl('ace/snippets/graphqlschema', require('file-loader?esModule=false!./src-noconflict/snippets/graphqlschema.js'))\nace.config.setModuleUrl('ace/snippets/groovy', require('file-loader?esModule=false!./src-noconflict/snippets/groovy.js'))\nace.config.setModuleUrl('ace/snippets/haml', require('file-loader?esModule=false!./src-noconflict/snippets/haml.js'))\nace.config.setModuleUrl('ace/snippets/handlebars', require('file-loader?esModule=false!./src-noconflict/snippets/handlebars.js'))\nace.config.setModuleUrl('ace/snippets/haskell', require('file-loader?esModule=false!./src-noconflict/snippets/haskell.js'))\nace.config.setModuleUrl('ace/snippets/haskell_cabal', require('file-loader?esModule=false!./src-noconflict/snippets/haskell_cabal.js'))\nace.config.setModuleUrl('ace/snippets/haxe', require('file-loader?esModule=false!./src-noconflict/snippets/haxe.js'))\nace.config.setModuleUrl('ace/snippets/hjson', require('file-loader?esModule=false!./src-noconflict/snippets/hjson.js'))\nace.config.setModuleUrl('ace/snippets/html', require('file-loader?esModule=false!./src-noconflict/snippets/html.js'))\nace.config.setModuleUrl('ace/snippets/html_elixir', require('file-loader?esModule=false!./src-noconflict/snippets/html_elixir.js'))\nace.config.setModuleUrl('ace/snippets/html_ruby', require('file-loader?esModule=false!./src-noconflict/snippets/html_ruby.js'))\nace.config.setModuleUrl('ace/snippets/ini', require('file-loader?esModule=false!./src-noconflict/snippets/ini.js'))\nace.config.setModuleUrl('ace/snippets/io', require('file-loader?esModule=false!./src-noconflict/snippets/io.js'))\nace.config.setModuleUrl('ace/snippets/jack', require('file-loader?esModule=false!./src-noconflict/snippets/jack.js'))\nace.config.setModuleUrl('ace/snippets/jade', require('file-loader?esModule=false!./src-noconflict/snippets/jade.js'))\nace.config.setModuleUrl('ace/snippets/java', require('file-loader?esModule=false!./src-noconflict/snippets/java.js'))\nace.config.setModuleUrl('ace/snippets/javascript', require('file-loader?esModule=false!./src-noconflict/snippets/javascript.js'))\nace.config.setModuleUrl('ace/snippets/json', require('file-loader?esModule=false!./src-noconflict/snippets/json.js'))\nace.config.setModuleUrl('ace/snippets/json5', require('file-loader?esModule=false!./src-noconflict/snippets/json5.js'))\nace.config.setModuleUrl('ace/snippets/jsoniq', require('file-loader?esModule=false!./src-noconflict/snippets/jsoniq.js'))\nace.config.setModuleUrl('ace/snippets/jsp', require('file-loader?esModule=false!./src-noconflict/snippets/jsp.js'))\nace.config.setModuleUrl('ace/snippets/jssm', require('file-loader?esModule=false!./src-noconflict/snippets/jssm.js'))\nace.config.setModuleUrl('ace/snippets/jsx', require('file-loader?esModule=false!./src-noconflict/snippets/jsx.js'))\nace.config.setModuleUrl('ace/snippets/julia', require('file-loader?esModule=false!./src-noconflict/snippets/julia.js'))\nace.config.setModuleUrl('ace/snippets/kotlin', require('file-loader?esModule=false!./src-noconflict/snippets/kotlin.js'))\nace.config.setModuleUrl('ace/snippets/latex', require('file-loader?esModule=false!./src-noconflict/snippets/latex.js'))\nace.config.setModuleUrl('ace/snippets/less', require('file-loader?esModule=false!./src-noconflict/snippets/less.js'))\nace.config.setModuleUrl('ace/snippets/liquid', require('file-loader?esModule=false!./src-noconflict/snippets/liquid.js'))\nace.config.setModuleUrl('ace/snippets/lisp', require('file-loader?esModule=false!./src-noconflict/snippets/lisp.js'))\nace.config.setModuleUrl('ace/snippets/livescript', require('file-loader?esModule=false!./src-noconflict/snippets/livescript.js'))\nace.config.setModuleUrl('ace/snippets/logiql', require('file-loader?esModule=false!./src-noconflict/snippets/logiql.js'))\nace.config.setModuleUrl('ace/snippets/logtalk', require('file-loader?esModule=false!./src-noconflict/snippets/logtalk.js'))\nace.config.setModuleUrl('ace/snippets/lsl', require('file-loader?esModule=false!./src-noconflict/snippets/lsl.js'))\nace.config.setModuleUrl('ace/snippets/lua', require('file-loader?esModule=false!./src-noconflict/snippets/lua.js'))\nace.config.setModuleUrl('ace/snippets/luapage', require('file-loader?esModule=false!./src-noconflict/snippets/luapage.js'))\nace.config.setModuleUrl('ace/snippets/lucene', require('file-loader?esModule=false!./src-noconflict/snippets/lucene.js'))\nace.config.setModuleUrl('ace/snippets/makefile', require('file-loader?esModule=false!./src-noconflict/snippets/makefile.js'))\nace.config.setModuleUrl('ace/snippets/markdown', require('file-loader?esModule=false!./src-noconflict/snippets/markdown.js'))\nace.config.setModuleUrl('ace/snippets/mask', require('file-loader?esModule=false!./src-noconflict/snippets/mask.js'))\nace.config.setModuleUrl('ace/snippets/matlab', require('file-loader?esModule=false!./src-noconflict/snippets/matlab.js'))\nace.config.setModuleUrl('ace/snippets/maze', require('file-loader?esModule=false!./src-noconflict/snippets/maze.js'))\nace.config.setModuleUrl('ace/snippets/mediawiki', require('file-loader?esModule=false!./src-noconflict/snippets/mediawiki.js'))\nace.config.setModuleUrl('ace/snippets/mel', require('file-loader?esModule=false!./src-noconflict/snippets/mel.js'))\nace.config.setModuleUrl('ace/snippets/mixal', require('file-loader?esModule=false!./src-noconflict/snippets/mixal.js'))\nace.config.setModuleUrl('ace/snippets/mushcode', require('file-loader?esModule=false!./src-noconflict/snippets/mushcode.js'))\nace.config.setModuleUrl('ace/snippets/mysql', require('file-loader?esModule=false!./src-noconflict/snippets/mysql.js'))\nace.config.setModuleUrl('ace/snippets/nginx', require('file-loader?esModule=false!./src-noconflict/snippets/nginx.js'))\nace.config.setModuleUrl('ace/snippets/nim', require('file-loader?esModule=false!./src-noconflict/snippets/nim.js'))\nace.config.setModuleUrl('ace/snippets/nix', require('file-loader?esModule=false!./src-noconflict/snippets/nix.js'))\nace.config.setModuleUrl('ace/snippets/nsis', require('file-loader?esModule=false!./src-noconflict/snippets/nsis.js'))\nace.config.setModuleUrl('ace/snippets/nunjucks', require('file-loader?esModule=false!./src-noconflict/snippets/nunjucks.js'))\nace.config.setModuleUrl('ace/snippets/objectivec', require('file-loader?esModule=false!./src-noconflict/snippets/objectivec.js'))\nace.config.setModuleUrl('ace/snippets/ocaml', require('file-loader?esModule=false!./src-noconflict/snippets/ocaml.js'))\nace.config.setModuleUrl('ace/snippets/pascal', require('file-loader?esModule=false!./src-noconflict/snippets/pascal.js'))\nace.config.setModuleUrl('ace/snippets/perl', require('file-loader?esModule=false!./src-noconflict/snippets/perl.js'))\nace.config.setModuleUrl('ace/snippets/perl6', require('file-loader?esModule=false!./src-noconflict/snippets/perl6.js'))\nace.config.setModuleUrl('ace/snippets/pgsql', require('file-loader?esModule=false!./src-noconflict/snippets/pgsql.js'))\nace.config.setModuleUrl('ace/snippets/php', require('file-loader?esModule=false!./src-noconflict/snippets/php.js'))\nace.config.setModuleUrl('ace/snippets/php_laravel_blade', require('file-loader?esModule=false!./src-noconflict/snippets/php_laravel_blade.js'))\nace.config.setModuleUrl('ace/snippets/pig', require('file-loader?esModule=false!./src-noconflict/snippets/pig.js'))\nace.config.setModuleUrl('ace/snippets/plain_text', require('file-loader?esModule=false!./src-noconflict/snippets/plain_text.js'))\nace.config.setModuleUrl('ace/snippets/powershell', require('file-loader?esModule=false!./src-noconflict/snippets/powershell.js'))\nace.config.setModuleUrl('ace/snippets/praat', require('file-loader?esModule=false!./src-noconflict/snippets/praat.js'))\nace.config.setModuleUrl('ace/snippets/prisma', require('file-loader?esModule=false!./src-noconflict/snippets/prisma.js'))\nace.config.setModuleUrl('ace/snippets/prolog', require('file-loader?esModule=false!./src-noconflict/snippets/prolog.js'))\nace.config.setModuleUrl('ace/snippets/properties', require('file-loader?esModule=false!./src-noconflict/snippets/properties.js'))\nace.config.setModuleUrl('ace/snippets/protobuf', require('file-loader?esModule=false!./src-noconflict/snippets/protobuf.js'))\nace.config.setModuleUrl('ace/snippets/puppet', require('file-loader?esModule=false!./src-noconflict/snippets/puppet.js'))\nace.config.setModuleUrl('ace/snippets/python', require('file-loader?esModule=false!./src-noconflict/snippets/python.js'))\nace.config.setModuleUrl('ace/snippets/qml', require('file-loader?esModule=false!./src-noconflict/snippets/qml.js'))\nace.config.setModuleUrl('ace/snippets/r', require('file-loader?esModule=false!./src-noconflict/snippets/r.js'))\nace.config.setModuleUrl('ace/snippets/razor', require('file-loader?esModule=false!./src-noconflict/snippets/razor.js'))\nace.config.setModuleUrl('ace/snippets/rdoc', require('file-loader?esModule=false!./src-noconflict/snippets/rdoc.js'))\nace.config.setModuleUrl('ace/snippets/red', require('file-loader?esModule=false!./src-noconflict/snippets/red.js'))\nace.config.setModuleUrl('ace/snippets/redshift', require('file-loader?esModule=false!./src-noconflict/snippets/redshift.js'))\nace.config.setModuleUrl('ace/snippets/rhtml', require('file-loader?esModule=false!./src-noconflict/snippets/rhtml.js'))\nace.config.setModuleUrl('ace/snippets/rst', require('file-loader?esModule=false!./src-noconflict/snippets/rst.js'))\nace.config.setModuleUrl('ace/snippets/ruby', require('file-loader?esModule=false!./src-noconflict/snippets/ruby.js'))\nace.config.setModuleUrl('ace/snippets/rust', require('file-loader?esModule=false!./src-noconflict/snippets/rust.js'))\nace.config.setModuleUrl('ace/snippets/sass', require('file-loader?esModule=false!./src-noconflict/snippets/sass.js'))\nace.config.setModuleUrl('ace/snippets/scad', require('file-loader?esModule=false!./src-noconflict/snippets/scad.js'))\nace.config.setModuleUrl('ace/snippets/scala', require('file-loader?esModule=false!./src-noconflict/snippets/scala.js'))\nace.config.setModuleUrl('ace/snippets/scheme', require('file-loader?esModule=false!./src-noconflict/snippets/scheme.js'))\nace.config.setModuleUrl('ace/snippets/scss', require('file-loader?esModule=false!./src-noconflict/snippets/scss.js'))\nace.config.setModuleUrl('ace/snippets/sh', require('file-loader?esModule=false!./src-noconflict/snippets/sh.js'))\nace.config.setModuleUrl('ace/snippets/sjs', require('file-loader?esModule=false!./src-noconflict/snippets/sjs.js'))\nace.config.setModuleUrl('ace/snippets/slim', require('file-loader?esModule=false!./src-noconflict/snippets/slim.js'))\nace.config.setModuleUrl('ace/snippets/smarty', require('file-loader?esModule=false!./src-noconflict/snippets/smarty.js'))\nace.config.setModuleUrl('ace/snippets/snippets', require('file-loader?esModule=false!./src-noconflict/snippets/snippets.js'))\nace.config.setModuleUrl('ace/snippets/soy_template', require('file-loader?esModule=false!./src-noconflict/snippets/soy_template.js'))\nace.config.setModuleUrl('ace/snippets/space', require('file-loader?esModule=false!./src-noconflict/snippets/space.js'))\nace.config.setModuleUrl('ace/snippets/sparql', require('file-loader?esModule=false!./src-noconflict/snippets/sparql.js'))\nace.config.setModuleUrl('ace/snippets/sql', require('file-loader?esModule=false!./src-noconflict/snippets/sql.js'))\nace.config.setModuleUrl('ace/snippets/sqlserver', require('file-loader?esModule=false!./src-noconflict/snippets/sqlserver.js'))\nace.config.setModuleUrl('ace/snippets/stylus', require('file-loader?esModule=false!./src-noconflict/snippets/stylus.js'))\nace.config.setModuleUrl('ace/snippets/svg', require('file-loader?esModule=false!./src-noconflict/snippets/svg.js'))\nace.config.setModuleUrl('ace/snippets/swift', require('file-loader?esModule=false!./src-noconflict/snippets/swift.js'))\nace.config.setModuleUrl('ace/snippets/tcl', require('file-loader?esModule=false!./src-noconflict/snippets/tcl.js'))\nace.config.setModuleUrl('ace/snippets/terraform', require('file-loader?esModule=false!./src-noconflict/snippets/terraform.js'))\nace.config.setModuleUrl('ace/snippets/tex', require('file-loader?esModule=false!./src-noconflict/snippets/tex.js'))\nace.config.setModuleUrl('ace/snippets/text', require('file-loader?esModule=false!./src-noconflict/snippets/text.js'))\nace.config.setModuleUrl('ace/snippets/textile', require('file-loader?esModule=false!./src-noconflict/snippets/textile.js'))\nace.config.setModuleUrl('ace/snippets/toml', require('file-loader?esModule=false!./src-noconflict/snippets/toml.js'))\nace.config.setModuleUrl('ace/snippets/tsx', require('file-loader?esModule=false!./src-noconflict/snippets/tsx.js'))\nace.config.setModuleUrl('ace/snippets/turtle', require('file-loader?esModule=false!./src-noconflict/snippets/turtle.js'))\nace.config.setModuleUrl('ace/snippets/twig', require('file-loader?esModule=false!./src-noconflict/snippets/twig.js'))\nace.config.setModuleUrl('ace/snippets/typescript', require('file-loader?esModule=false!./src-noconflict/snippets/typescript.js'))\nace.config.setModuleUrl('ace/snippets/vala', require('file-loader?esModule=false!./src-noconflict/snippets/vala.js'))\nace.config.setModuleUrl('ace/snippets/vbscript', require('file-loader?esModule=false!./src-noconflict/snippets/vbscript.js'))\nace.config.setModuleUrl('ace/snippets/velocity', require('file-loader?esModule=false!./src-noconflict/snippets/velocity.js'))\nace.config.setModuleUrl('ace/snippets/verilog', require('file-loader?esModule=false!./src-noconflict/snippets/verilog.js'))\nace.config.setModuleUrl('ace/snippets/vhdl', require('file-loader?esModule=false!./src-noconflict/snippets/vhdl.js'))\nace.config.setModuleUrl('ace/snippets/visualforce', require('file-loader?esModule=false!./src-noconflict/snippets/visualforce.js'))\nace.config.setModuleUrl('ace/snippets/wollok', require('file-loader?esModule=false!./src-noconflict/snippets/wollok.js'))\nace.config.setModuleUrl('ace/snippets/xml', require('file-loader?esModule=false!./src-noconflict/snippets/xml.js'))\nace.config.setModuleUrl('ace/snippets/xquery', require('file-loader?esModule=false!./src-noconflict/snippets/xquery.js'))\nace.config.setModuleUrl('ace/snippets/yaml', require('file-loader?esModule=false!./src-noconflict/snippets/yaml.js'))\nace.config.setModuleUrl('ace/snippets/zeek', require('file-loader?esModule=false!./src-noconflict/snippets/zeek.js'))","module.exports = __webpack_public_path__ + \"17dc98279d24649d3ca77cbce8c44e83.js\";","module.exports = __webpack_public_path__ + \"f5bea0e1099339b99b21ee2d3c0fc489.js\";","module.exports = __webpack_public_path__ + \"26aa6a394ec36fa291bb1b6c75faca71.js\";","module.exports = __webpack_public_path__ + \"e4565878df49fd4ce3edd3f1022c1695.js\";","/**\n * Diff Match and Patch\n * Copyright 2018 The diff-match-patch Authors.\n * https://github.com/google/diff-match-patch\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Computes the difference between two texts to create a patch.\n * Applies the patch onto another text, allowing for errors.\n * @author [email protected] (Neil Fraser)\n */\n\n/**\n * Class containing the diff, match and patch methods.\n * @constructor\n */\nfunction diff_match_patch() {\n\n // Defaults.\n // Redefine these in your program to override the defaults.\n\n // Number of seconds to map a diff before giving up (0 for infinity).\n this.Diff_Timeout = 1.0;\n // Cost of an empty edit operation in terms of edit characters.\n this.Diff_EditCost = 4;\n // At what point is no match declared (0.0 = perfection, 1.0 = very loose).\n this.Match_Threshold = 0.5;\n // How far to search for a match (0 = exact location, 1000+ = broad match).\n // A match this many characters away from the expected location will add\n // 1.0 to the score (0.0 is a perfect match).\n this.Match_Distance = 1000;\n // When deleting a large block of text (over ~64 characters), how close do\n // the contents have to be to match the expected contents. (0.0 = perfection,\n // 1.0 = very loose). Note that Match_Threshold controls how closely the\n // end points of a delete need to match.\n this.Patch_DeleteThreshold = 0.5;\n // Chunk size for context length.\n this.Patch_Margin = 4;\n\n // The number of bits in an int.\n this.Match_MaxBits = 32;\n}\n\n\n// DIFF FUNCTIONS\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/** @typedef {{0: number, 1: string}} */\ndiff_match_patch.Diff;\n\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} opt_checklines Optional speedup flag. If present and false,\n * then don't run a line-level diff first to identify the changed areas.\n * Defaults to true, which does a faster, slightly less optimal diff.\n * @param {number} opt_deadline Optional time when the diff should be complete\n * by. Used internally for recursive calls. Users should set DiffTimeout\n * instead.\n * @return {!Array.} Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_main = function(text1, text2, opt_checklines,\n opt_deadline) {\n // Set a deadline by which time the diff must be complete.\n if (typeof opt_deadline == 'undefined') {\n if (this.Diff_Timeout <= 0) {\n opt_deadline = Number.MAX_VALUE;\n } else {\n opt_deadline = (new Date).getTime() + this.Diff_Timeout * 1000;\n }\n }\n var deadline = opt_deadline;\n\n // Check for null inputs.\n if (text1 == null || text2 == null) {\n throw new Error('Null input. (diff_main)');\n }\n\n // Check for equality (speedup).\n if (text1 == text2) {\n if (text1) {\n return [[DIFF_EQUAL, text1]];\n }\n return [];\n }\n\n if (typeof opt_checklines == 'undefined') {\n opt_checklines = true;\n }\n var checklines = opt_checklines;\n\n // Trim off common prefix (speedup).\n var commonlength = this.diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = this.diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = this.diff_compute_(text1, text2, checklines, deadline);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift([DIFF_EQUAL, commonprefix]);\n }\n if (commonsuffix) {\n diffs.push([DIFF_EQUAL, commonsuffix]);\n }\n this.diff_cleanupMerge(diffs);\n return diffs;\n};\n\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag. If false, then don't run a\n * line-level diff first to identify the changed areas.\n * If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_compute_ = function(text1, text2, checklines,\n deadline) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [[DIFF_INSERT, text2]];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [[DIFF_DELETE, text1]];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i != -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [[DIFF_INSERT, longtext.substring(0, i)],\n [DIFF_EQUAL, shorttext],\n [DIFF_INSERT, longtext.substring(i + shorttext.length)]];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length == 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n }\n\n // Check to see if the problem can be split in two.\n var hm = this.diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline);\n var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline);\n // Merge the results.\n return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b);\n }\n\n if (checklines && text1.length > 100 && text2.length > 100) {\n return this.diff_lineMode_(text1, text2, deadline);\n }\n\n return this.diff_bisect_(text1, text2, deadline);\n};\n\n\n/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_lineMode_ = function(text1, text2, deadline) {\n // Scan the text on a line-by-line basis first.\n var a = this.diff_linesToChars_(text1, text2);\n text1 = a.chars1;\n text2 = a.chars2;\n var linearray = a.lineArray;\n\n var diffs = this.diff_main(text1, text2, false, deadline);\n\n // Convert the diff back to original text.\n this.diff_charsToLines_(diffs, linearray);\n // Eliminate freak matches (e.g. blank lines)\n this.diff_cleanupSemantic(diffs);\n\n // Rediff any replacement blocks, this time character-by-character.\n // Add a dummy entry at the end.\n diffs.push([DIFF_EQUAL, '']);\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete >= 1 && count_insert >= 1) {\n // Delete the offending records and add the merged ones.\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert);\n pointer = pointer - count_delete - count_insert;\n var a = this.diff_main(text_delete, text_insert, false, deadline);\n for (var j = a.length - 1; j >= 0; j--) {\n diffs.splice(pointer, 0, a[j]);\n }\n pointer = pointer + a.length;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n pointer++;\n }\n diffs.pop(); // Remove the dummy entry at the end.\n\n return diffs;\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisect_ = function(text1, text2, deadline) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = (delta % 2 != 0);\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Bail out if deadline is reached.\n if ((new Date()).getTime() > deadline) {\n break;\n }\n\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (x1 < text1_length && y1 < text2_length &&\n text1.charAt(x1) == text2.charAt(y1)) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (x2 < text1_length && y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ==\n text2.charAt(text2_length - y2 - 1)) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisectSplit_ = function(text1, text2, x, y,\n deadline) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = this.diff_main(text1a, text2a, false, deadline);\n var diffsb = this.diff_main(text1b, text2b, false, deadline);\n\n return diffs.concat(diffsb);\n};\n\n\n/**\n * Split two texts into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.}}\n * An object containing the encoded text1, the encoded text2 and\n * the array of unique strings.\n * The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\ndiff_match_patch.prototype.diff_linesToChars_ = function(text1, text2) {\n var lineArray = []; // e.g. lineArray[4] == 'Hello\\n'\n var lineHash = {}; // e.g. lineHash['Hello\\n'] == 4\n\n // '\\x00' is a valid character, but various debuggers don't like it.\n // So we'll insert a junk entry to avoid generating a null character.\n lineArray[0] = '';\n\n /**\n * Split a text into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * Modifies linearray and linehash through being a closure.\n * @param {string} text String to encode.\n * @return {string} Encoded string.\n * @private\n */\n function diff_linesToCharsMunge_(text) {\n var chars = '';\n // Walk the text, pulling out a substring for each line.\n // text.split('\\n') would would temporarily double our memory footprint.\n // Modifying text would create many large strings to garbage collect.\n var lineStart = 0;\n var lineEnd = -1;\n // Keeping our own length variable is faster than looking it up.\n var lineArrayLength = lineArray.length;\n while (lineEnd < text.length - 1) {\n lineEnd = text.indexOf('\\n', lineStart);\n if (lineEnd == -1) {\n lineEnd = text.length - 1;\n }\n var line = text.substring(lineStart, lineEnd + 1);\n lineStart = lineEnd + 1;\n\n if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :\n (lineHash[line] !== undefined)) {\n chars += String.fromCharCode(lineHash[line]);\n } else {\n chars += String.fromCharCode(lineArrayLength);\n lineHash[line] = lineArrayLength;\n lineArray[lineArrayLength++] = line;\n }\n }\n return chars;\n }\n\n var chars1 = diff_linesToCharsMunge_(text1);\n var chars2 = diff_linesToCharsMunge_(text2);\n return {chars1: chars1, chars2: chars2, lineArray: lineArray};\n};\n\n\n/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.} diffs Array of diff tuples.\n * @param {!Array.} lineArray Array of unique strings.\n * @private\n */\ndiff_match_patch.prototype.diff_charsToLines_ = function(diffs, lineArray) {\n for (var x = 0; x < diffs.length; x++) {\n var chars = diffs[x][1];\n var text = [];\n for (var y = 0; y < chars.length; y++) {\n text[y] = lineArray[chars.charCodeAt(y)];\n }\n diffs[x][1] = text.join('');\n }\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\ndiff_match_patch.prototype.diff_commonPrefix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\ndiff_match_patch.prototype.diff_commonSuffix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 ||\n text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\ndiff_match_patch.prototype.diff_commonOverlap_ = function(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n // Eliminate the null case.\n if (text1_length == 0 || text2_length == 0) {\n return 0;\n }\n // Truncate the longer string.\n if (text1_length > text2_length) {\n text1 = text1.substring(text1_length - text2_length);\n } else if (text1_length < text2_length) {\n text2 = text2.substring(0, text1_length);\n }\n var text_length = Math.min(text1_length, text2_length);\n // Quick check for the worst case.\n if (text1 == text2) {\n return text_length;\n }\n\n // Start by looking for a single character match\n // and increase length until no match is found.\n // Performance analysis: http://neil.fraser.name/news/2010/11/04/\n var best = 0;\n var length = 1;\n while (true) {\n var pattern = text1.substring(text_length - length);\n var found = text2.indexOf(pattern);\n if (found == -1) {\n return best;\n }\n length += found;\n if (found == 0 || text1.substring(text_length - length) ==\n text2.substring(0, length)) {\n best = length;\n length++;\n }\n }\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n * @private\n */\ndiff_match_patch.prototype.diff_halfMatch_ = function(text1, text2) {\n if (this.Diff_Timeout <= 0) {\n // Don't risk returning a non-optimal diff if we have unlimited time.\n return null;\n }\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = '';\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n var prefixLength = dmp.diff_commonPrefix(longtext.substring(i),\n shorttext.substring(j));\n var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i),\n shorttext.substring(0, j));\n if (best_common.length < suffixLength + prefixLength) {\n best_common = shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [best_longtext_a, best_longtext_b,\n best_shorttext_a, best_shorttext_b, best_common];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 4));\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 2));\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemantic = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastequality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Number of characters that changed prior to the equality.\n var length_insertions1 = 0;\n var length_deletions1 = 0;\n // Number of characters that changed after the equality.\n var length_insertions2 = 0;\n var length_deletions2 = 0;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n equalities[equalitiesLength++] = pointer;\n length_insertions1 = length_insertions2;\n length_deletions1 = length_deletions2;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastequality = diffs[pointer][1];\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_INSERT) {\n length_insertions2 += diffs[pointer][1].length;\n } else {\n length_deletions2 += diffs[pointer][1].length;\n }\n // Eliminate an equality that is smaller or equal to the edits on both\n // sides of it.\n if (lastequality && (lastequality.length <=\n Math.max(length_insertions1, length_deletions1)) &&\n (lastequality.length <= Math.max(length_insertions2,\n length_deletions2))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n [DIFF_DELETE, lastequality]);\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n // Throw away the equality we just deleted.\n equalitiesLength--;\n // Throw away the previous equality (it needs to be reevaluated).\n equalitiesLength--;\n pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n length_insertions1 = 0; // Reset the counters.\n length_deletions1 = 0;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastequality = null;\n changes = true;\n }\n }\n pointer++;\n }\n\n // Normalize the diff.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n this.diff_cleanupSemanticLossless(diffs);\n\n // Find any overlaps between deletions and insertions.\n // e.g: abcxxxxxxdef\n // -> abcxxxdef\n // e.g: xxxabcdefxxx\n // -> defxxxabc\n // Only extract an overlap if it is as big as the edit ahead or behind it.\n pointer = 1;\n while (pointer < diffs.length) {\n if (diffs[pointer - 1][0] == DIFF_DELETE &&\n diffs[pointer][0] == DIFF_INSERT) {\n var deletion = diffs[pointer - 1][1];\n var insertion = diffs[pointer][1];\n var overlap_length1 = this.diff_commonOverlap_(deletion, insertion);\n var overlap_length2 = this.diff_commonOverlap_(insertion, deletion);\n if (overlap_length1 >= overlap_length2) {\n if (overlap_length1 >= deletion.length / 2 ||\n overlap_length1 >= insertion.length / 2) {\n // Overlap found. Insert an equality and trim the surrounding edits.\n diffs.splice(pointer, 0,\n [DIFF_EQUAL, insertion.substring(0, overlap_length1)]);\n diffs[pointer - 1][1] =\n deletion.substring(0, deletion.length - overlap_length1);\n diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n pointer++;\n }\n } else {\n if (overlap_length2 >= deletion.length / 2 ||\n overlap_length2 >= insertion.length / 2) {\n // Reverse overlap found.\n // Insert an equality and swap and trim the surrounding edits.\n diffs.splice(pointer, 0,\n [DIFF_EQUAL, deletion.substring(0, overlap_length2)]);\n diffs[pointer - 1][0] = DIFF_INSERT;\n diffs[pointer - 1][1] =\n insertion.substring(0, insertion.length - overlap_length2);\n diffs[pointer + 1][0] = DIFF_DELETE;\n diffs[pointer + 1][1] =\n deletion.substring(overlap_length2);\n pointer++;\n }\n }\n pointer++;\n }\n pointer++;\n }\n};\n\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The cat came. -> The cat came.\n * @param {!Array.} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemanticLossless = function(diffs) {\n /**\n * Given two strings, compute a score representing whether the internal\n * boundary falls on logical boundaries.\n * Scores range from 6 (best) to 0 (worst).\n * Closure, but does not reference any external variables.\n * @param {string} one First string.\n * @param {string} two Second string.\n * @return {number} The score.\n * @private\n */\n function diff_cleanupSemanticScore_(one, two) {\n if (!one || !two) {\n // Edges are the best.\n return 6;\n }\n\n // Each port of this function behaves slightly differently due to\n // subtle differences in each language's definition of things like\n // 'whitespace'. Since this function's purpose is largely cosmetic,\n // the choice has been made to use each language's native features\n // rather than force total conformity.\n var char1 = one.charAt(one.length - 1);\n var char2 = two.charAt(0);\n var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_);\n var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_);\n var whitespace1 = nonAlphaNumeric1 &&\n char1.match(diff_match_patch.whitespaceRegex_);\n var whitespace2 = nonAlphaNumeric2 &&\n char2.match(diff_match_patch.whitespaceRegex_);\n var lineBreak1 = whitespace1 &&\n char1.match(diff_match_patch.linebreakRegex_);\n var lineBreak2 = whitespace2 &&\n char2.match(diff_match_patch.linebreakRegex_);\n var blankLine1 = lineBreak1 &&\n one.match(diff_match_patch.blanklineEndRegex_);\n var blankLine2 = lineBreak2 &&\n two.match(diff_match_patch.blanklineStartRegex_);\n\n if (blankLine1 || blankLine2) {\n // Five points for blank lines.\n return 5;\n } else if (lineBreak1 || lineBreak2) {\n // Four points for line breaks.\n return 4;\n } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n // Three points for end of sentences.\n return 3;\n } else if (whitespace1 || whitespace2) {\n // Two points for whitespace.\n return 2;\n } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n // One point for non-alphanumeric.\n return 1;\n }\n return 0;\n }\n\n var pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n var equality1 = diffs[pointer - 1][1];\n var edit = diffs[pointer][1];\n var equality2 = diffs[pointer + 1][1];\n\n // First, shift the edit as far left as possible.\n var commonOffset = this.diff_commonSuffix(equality1, edit);\n if (commonOffset) {\n var commonString = edit.substring(edit.length - commonOffset);\n equality1 = equality1.substring(0, equality1.length - commonOffset);\n edit = commonString + edit.substring(0, edit.length - commonOffset);\n equality2 = commonString + equality2;\n }\n\n // Second, step character by character right, looking for the best fit.\n var bestEquality1 = equality1;\n var bestEdit = edit;\n var bestEquality2 = equality2;\n var bestScore = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n while (edit.charAt(0) === equality2.charAt(0)) {\n equality1 += edit.charAt(0);\n edit = edit.substring(1) + equality2.charAt(0);\n equality2 = equality2.substring(1);\n var score = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n // The >= encourages trailing rather than leading whitespace on edits.\n if (score >= bestScore) {\n bestScore = score;\n bestEquality1 = equality1;\n bestEdit = edit;\n bestEquality2 = equality2;\n }\n }\n\n if (diffs[pointer - 1][1] != bestEquality1) {\n // We have an improvement, save it back to the diff.\n if (bestEquality1) {\n diffs[pointer - 1][1] = bestEquality1;\n } else {\n diffs.splice(pointer - 1, 1);\n pointer--;\n }\n diffs[pointer][1] = bestEdit;\n if (bestEquality2) {\n diffs[pointer + 1][1] = bestEquality2;\n } else {\n diffs.splice(pointer + 1, 1);\n pointer--;\n }\n }\n }\n pointer++;\n }\n};\n\n// Define some regex patterns for matching boundaries.\ndiff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\ndiff_match_patch.whitespaceRegex_ = /\\s/;\ndiff_match_patch.linebreakRegex_ = /[\\r\\n]/;\ndiff_match_patch.blanklineEndRegex_ = /\\n\\r?\\n$/;\ndiff_match_patch.blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupEfficiency = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastequality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Is there an insertion operation before the last equality.\n var pre_ins = false;\n // Is there a deletion operation before the last equality.\n var pre_del = false;\n // Is there an insertion operation after the last equality.\n var post_ins = false;\n // Is there a deletion operation after the last equality.\n var post_del = false;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n if (diffs[pointer][1].length < this.Diff_EditCost &&\n (post_ins || post_del)) {\n // Candidate found.\n equalities[equalitiesLength++] = pointer;\n pre_ins = post_ins;\n pre_del = post_del;\n lastequality = diffs[pointer][1];\n } else {\n // Not a candidate, and can never become one.\n equalitiesLength = 0;\n lastequality = null;\n }\n post_ins = post_del = false;\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_DELETE) {\n post_del = true;\n } else {\n post_ins = true;\n }\n /*\n * Five types to be split:\n * ABXYCD\n * AXCD\n * ABXC\n * AXCD\n * ABXC\n */\n if (lastequality && ((pre_ins && pre_del && post_ins && post_del) ||\n ((lastequality.length < this.Diff_EditCost / 2) &&\n (pre_ins + pre_del + post_ins + post_del) == 3))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n [DIFF_DELETE, lastequality]);\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n equalitiesLength--; // Throw away the equality we just deleted;\n lastequality = null;\n if (pre_ins && pre_del) {\n // No changes made which could affect previous entry, keep going.\n post_ins = post_del = true;\n equalitiesLength = 0;\n } else {\n equalitiesLength--; // Throw away the previous equality.\n pointer = equalitiesLength > 0 ?\n equalities[equalitiesLength - 1] : -1;\n post_ins = post_del = false;\n }\n changes = true;\n }\n }\n pointer++;\n }\n\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupMerge = function(diffs) {\n diffs.push([DIFF_EQUAL, '']); // Add a dummy entry at the end.\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n var commonlength;\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete + count_insert > 1) {\n if (count_delete !== 0 && count_insert !== 0) {\n // Factor out any common prefixies.\n commonlength = this.diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if ((pointer - count_delete - count_insert) > 0 &&\n diffs[pointer - count_delete - count_insert - 1][0] ==\n DIFF_EQUAL) {\n diffs[pointer - count_delete - count_insert - 1][1] +=\n text_insert.substring(0, commonlength);\n } else {\n diffs.splice(0, 0, [DIFF_EQUAL,\n text_insert.substring(0, commonlength)]);\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixies.\n commonlength = this.diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] = text_insert.substring(text_insert.length -\n commonlength) + diffs[pointer][1];\n text_insert = text_insert.substring(0, text_insert.length -\n commonlength);\n text_delete = text_delete.substring(0, text_delete.length -\n commonlength);\n }\n }\n // Delete the offending records and add the merged ones.\n if (count_delete === 0) {\n diffs.splice(pointer - count_insert,\n count_delete + count_insert, [DIFF_INSERT, text_insert]);\n } else if (count_insert === 0) {\n diffs.splice(pointer - count_delete,\n count_delete + count_insert, [DIFF_DELETE, text_delete]);\n } else {\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert, [DIFF_DELETE, text_delete],\n [DIFF_INSERT, text_insert]);\n }\n pointer = pointer - count_delete - count_insert +\n (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1;\n } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === '') {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: ABAC -> ABAC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n if (diffs[pointer][1].substring(diffs[pointer][1].length -\n diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] = diffs[pointer - 1][1] +\n diffs[pointer][1].substring(0, diffs[pointer][1].length -\n diffs[pointer - 1][1].length);\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * loc is a location in text1, compute and return the equivalent location in\n * text2.\n * e.g. 'The cat' vs 'The big cat', 1->1, 5->8\n * @param {!Array.} diffs Array of diff tuples.\n * @param {number} loc Location within text1.\n * @return {number} Location within text2.\n */\ndiff_match_patch.prototype.diff_xIndex = function(diffs, loc) {\n var chars1 = 0;\n var chars2 = 0;\n var last_chars1 = 0;\n var last_chars2 = 0;\n var x;\n for (x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) { // Equality or deletion.\n chars1 += diffs[x][1].length;\n }\n if (diffs[x][0] !== DIFF_DELETE) { // Equality or insertion.\n chars2 += diffs[x][1].length;\n }\n if (chars1 > loc) { // Overshot the location.\n break;\n }\n last_chars1 = chars1;\n last_chars2 = chars2;\n }\n // Was the location was deleted?\n if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {\n return last_chars2;\n }\n // Add the remaining character length.\n return last_chars2 + (loc - last_chars1);\n};\n\n\n/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.} diffs Array of diff tuples.\n * @return {string} HTML representation.\n */\ndiff_match_patch.prototype.diff_prettyHtml = function(diffs) {\n var html = [];\n var pattern_amp = /&/g;\n var pattern_lt = //g;\n var pattern_para = /\\n/g;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0]; // Operation (insert, delete, equal)\n var data = diffs[x][1]; // Text of change.\n var text = data.replace(pattern_amp, '&').replace(pattern_lt, '<')\n .replace(pattern_gt, '>').replace(pattern_para, '¶
');\n switch (op) {\n case DIFF_INSERT:\n html[x] = '' + text + '';\n break;\n case DIFF_DELETE:\n html[x] = '' + text + '';\n break;\n case DIFF_EQUAL:\n html[x] = '' + text + '';\n break;\n }\n }\n return html.join('');\n};\n\n\n/**\n * Compute and return the source text (all equalities and deletions).\n * @param {!Array.} diffs Array of diff tuples.\n * @return {string} Source text.\n */\ndiff_match_patch.prototype.diff_text1 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute and return the destination text (all equalities and insertions).\n * @param {!Array.} diffs Array of diff tuples.\n * @return {string} Destination text.\n */\ndiff_match_patch.prototype.diff_text2 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_DELETE) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute the Levenshtein distance; the number of inserted, deleted or\n * substituted characters.\n * @param {!Array.} diffs Array of diff tuples.\n * @return {number} Number of changes.\n */\ndiff_match_patch.prototype.diff_levenshtein = function(diffs) {\n var levenshtein = 0;\n var insertions = 0;\n var deletions = 0;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0];\n var data = diffs[x][1];\n switch (op) {\n case DIFF_INSERT:\n insertions += data.length;\n break;\n case DIFF_DELETE:\n deletions += data.length;\n break;\n case DIFF_EQUAL:\n // A deletion and an insertion is one substitution.\n levenshtein += Math.max(insertions, deletions);\n insertions = 0;\n deletions = 0;\n break;\n }\n }\n levenshtein += Math.max(insertions, deletions);\n return levenshtein;\n};\n\n\n/**\n * Crush the diff into an encoded string which describes the operations\n * required to transform text1 into text2.\n * E.g. =3\\t-2\\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'.\n * Operations are tab-separated. Inserted text is escaped using %xx notation.\n * @param {!Array.} diffs Array of diff tuples.\n * @return {string} Delta text.\n */\ndiff_match_patch.prototype.diff_toDelta = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n switch (diffs[x][0]) {\n case DIFF_INSERT:\n text[x] = '+' + encodeURI(diffs[x][1]);\n break;\n case DIFF_DELETE:\n text[x] = '-' + diffs[x][1].length;\n break;\n case DIFF_EQUAL:\n text[x] = '=' + diffs[x][1].length;\n break;\n }\n }\n return text.join('\\t').replace(/%20/g, ' ');\n};\n\n\n/**\n * Given the original text1, and an encoded string which describes the\n * operations required to transform text1 into text2, compute the full diff.\n * @param {string} text1 Source string for the diff.\n * @param {string} delta Delta text.\n * @return {!Array.} Array of diff tuples.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.diff_fromDelta = function(text1, delta) {\n var diffs = [];\n var diffsLength = 0; // Keeping our own length var is faster in JS.\n var pointer = 0; // Cursor in text1\n var tokens = delta.split(/\\t/g);\n for (var x = 0; x < tokens.length; x++) {\n // Each token begins with a one character parameter which specifies the\n // operation of this token (delete, insert, equality).\n var param = tokens[x].substring(1);\n switch (tokens[x].charAt(0)) {\n case '+':\n try {\n diffs[diffsLength++] = [DIFF_INSERT, decodeURI(param)];\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in diff_fromDelta: ' + param);\n }\n break;\n case '-':\n // Fall through.\n case '=':\n var n = parseInt(param, 10);\n if (isNaN(n) || n < 0) {\n throw new Error('Invalid number in diff_fromDelta: ' + param);\n }\n var text = text1.substring(pointer, pointer += n);\n if (tokens[x].charAt(0) == '=') {\n diffs[diffsLength++] = [DIFF_EQUAL, text];\n } else {\n diffs[diffsLength++] = [DIFF_DELETE, text];\n }\n break;\n default:\n // Blank tokens are ok (from a trailing \\t).\n // Anything else is an error.\n if (tokens[x]) {\n throw new Error('Invalid diff operation in diff_fromDelta: ' +\n tokens[x]);\n }\n }\n }\n if (pointer != text1.length) {\n throw new Error('Delta length (' + pointer +\n ') does not equal source text length (' + text1.length + ').');\n }\n return diffs;\n};\n\n\n// MATCH FUNCTIONS\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc'.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n */\ndiff_match_patch.prototype.match_main = function(text, pattern, loc) {\n // Check for null inputs.\n if (text == null || pattern == null || loc == null) {\n throw new Error('Null input. (match_main)');\n }\n\n loc = Math.max(0, Math.min(loc, text.length));\n if (text == pattern) {\n // Shortcut (potentially not guaranteed by the algorithm)\n return 0;\n } else if (!text.length) {\n // Nothing to match.\n return -1;\n } else if (text.substring(loc, loc + pattern.length) == pattern) {\n // Perfect match at the perfect spot! (Includes case of null pattern)\n return loc;\n } else {\n // Do a fuzzy compare.\n return this.match_bitap_(text, pattern, loc);\n }\n};\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc' using the\n * Bitap algorithm.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n * @private\n */\ndiff_match_patch.prototype.match_bitap_ = function(text, pattern, loc) {\n if (pattern.length > this.Match_MaxBits) {\n throw new Error('Pattern too long for this browser.');\n }\n\n // Initialise the alphabet.\n var s = this.match_alphabet_(pattern);\n\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Compute and return the score for a match with e errors and x location.\n * Accesses loc and pattern through being a closure.\n * @param {number} e Number of errors in match.\n * @param {number} x Location of match.\n * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n * @private\n */\n function match_bitapScore_(e, x) {\n var accuracy = e / pattern.length;\n var proximity = Math.abs(loc - x);\n if (!dmp.Match_Distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy;\n }\n return accuracy + (proximity / dmp.Match_Distance);\n }\n\n // Highest score beyond which we give up.\n var score_threshold = this.Match_Threshold;\n // Is there a nearby exact match? (speedup)\n var best_loc = text.indexOf(pattern, loc);\n if (best_loc != -1) {\n score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);\n // What about in the other direction? (speedup)\n best_loc = text.lastIndexOf(pattern, loc + pattern.length);\n if (best_loc != -1) {\n score_threshold =\n Math.min(match_bitapScore_(0, best_loc), score_threshold);\n }\n }\n\n // Initialise the bit arrays.\n var matchmask = 1 << (pattern.length - 1);\n best_loc = -1;\n\n var bin_min, bin_mid;\n var bin_max = pattern.length + text.length;\n var last_rd;\n for (var d = 0; d < pattern.length; d++) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from 'loc' we can stray at this\n // error level.\n bin_min = 0;\n bin_mid = bin_max;\n while (bin_min < bin_mid) {\n if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {\n bin_min = bin_mid;\n } else {\n bin_max = bin_mid;\n }\n bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);\n }\n // Use the result from this iteration as the maximum for the next.\n bin_max = bin_mid;\n var start = Math.max(1, loc - bin_mid + 1);\n var finish = Math.min(loc + bin_mid, text.length) + pattern.length;\n\n var rd = Array(finish + 2);\n rd[finish + 1] = (1 << d) - 1;\n for (var j = finish; j >= start; j--) {\n // The alphabet (s) is a sparse hash, so the following line generates\n // warnings.\n var charMatch = s[text.charAt(j - 1)];\n if (d === 0) { // First pass: exact match.\n rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;\n } else { // Subsequent passes: fuzzy match.\n rd[j] = (((rd[j + 1] << 1) | 1) & charMatch) |\n (((last_rd[j + 1] | last_rd[j]) << 1) | 1) |\n last_rd[j + 1];\n }\n if (rd[j] & matchmask) {\n var score = match_bitapScore_(d, j - 1);\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (score <= score_threshold) {\n // Told you so.\n score_threshold = score;\n best_loc = j - 1;\n if (best_loc > loc) {\n // When passing loc, don't exceed our current distance from loc.\n start = Math.max(1, 2 * loc - best_loc);\n } else {\n // Already passed loc, downhill from here on in.\n break;\n }\n }\n }\n }\n // No hope for a (better) match at greater error levels.\n if (match_bitapScore_(d + 1, loc) > score_threshold) {\n break;\n }\n last_rd = rd;\n }\n return best_loc;\n};\n\n\n/**\n * Initialise the alphabet for the Bitap algorithm.\n * @param {string} pattern The text to encode.\n * @return {!Object} Hash of character locations.\n * @private\n */\ndiff_match_patch.prototype.match_alphabet_ = function(pattern) {\n var s = {};\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] = 0;\n }\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1);\n }\n return s;\n};\n\n\n// PATCH FUNCTIONS\n\n\n/**\n * Increase the context until it is unique,\n * but don't let the pattern expand beyond Match_MaxBits.\n * @param {!diff_match_patch.patch_obj} patch The patch to grow.\n * @param {string} text Source text.\n * @private\n */\ndiff_match_patch.prototype.patch_addContext_ = function(patch, text) {\n if (text.length == 0) {\n return;\n }\n var pattern = text.substring(patch.start2, patch.start2 + patch.length1);\n var padding = 0;\n\n // Look for the first and last matches of pattern in text. If two different\n // matches are found, increase the pattern length.\n while (text.indexOf(pattern) != text.lastIndexOf(pattern) &&\n pattern.length < this.Match_MaxBits - this.Patch_Margin -\n this.Patch_Margin) {\n padding += this.Patch_Margin;\n pattern = text.substring(patch.start2 - padding,\n patch.start2 + patch.length1 + padding);\n }\n // Add one chunk for good luck.\n padding += this.Patch_Margin;\n\n // Add the prefix.\n var prefix = text.substring(patch.start2 - padding, patch.start2);\n if (prefix) {\n patch.diffs.unshift([DIFF_EQUAL, prefix]);\n }\n // Add the suffix.\n var suffix = text.substring(patch.start2 + patch.length1,\n patch.start2 + patch.length1 + padding);\n if (suffix) {\n patch.diffs.push([DIFF_EQUAL, suffix]);\n }\n\n // Roll back the start points.\n patch.start1 -= prefix.length;\n patch.start2 -= prefix.length;\n // Extend the lengths.\n patch.length1 += prefix.length + suffix.length;\n patch.length2 += prefix.length + suffix.length;\n};\n\n\n/**\n * Compute a list of patches to turn text1 into text2.\n * Use diffs if provided, otherwise compute it ourselves.\n * There are four ways to call this function, depending on what data is\n * available to the caller:\n * Method 1:\n * a = text1, b = text2\n * Method 2:\n * a = diffs\n * Method 3 (optimal):\n * a = text1, b = diffs\n * Method 4 (deprecated, use method 3):\n * a = text1, b = text2, c = diffs\n *\n * @param {string|!Array.} a text1 (methods 1,3,4) or\n * Array of diff tuples for text1 to text2 (method 2).\n * @param {string|!Array.} opt_b text2 (methods 1,4) or\n * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2).\n * @param {string|!Array.} opt_c Array of diff tuples\n * for text1 to text2 (method 4) or undefined (methods 1,2,3).\n * @return {!Array.} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_make = function(a, opt_b, opt_c) {\n var text1, diffs;\n if (typeof a == 'string' && typeof opt_b == 'string' &&\n typeof opt_c == 'undefined') {\n // Method 1: text1, text2\n // Compute diffs from text1 and text2.\n text1 = /** @type {string} */(a);\n diffs = this.diff_main(text1, /** @type {string} */(opt_b), true);\n if (diffs.length > 2) {\n this.diff_cleanupSemantic(diffs);\n this.diff_cleanupEfficiency(diffs);\n }\n } else if (a && typeof a == 'object' && typeof opt_b == 'undefined' &&\n typeof opt_c == 'undefined') {\n // Method 2: diffs\n // Compute text1 from diffs.\n diffs = /** @type {!Array.} */(a);\n text1 = this.diff_text1(diffs);\n } else if (typeof a == 'string' && opt_b && typeof opt_b == 'object' &&\n typeof opt_c == 'undefined') {\n // Method 3: text1, diffs\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.} */(opt_b);\n } else if (typeof a == 'string' && typeof opt_b == 'string' &&\n opt_c && typeof opt_c == 'object') {\n // Method 4: text1, text2, diffs\n // text2 is not used.\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.} */(opt_c);\n } else {\n throw new Error('Unknown call format to patch_make.');\n }\n\n if (diffs.length === 0) {\n return []; // Get rid of the null case.\n }\n var patches = [];\n var patch = new diff_match_patch.patch_obj();\n var patchDiffLength = 0; // Keeping our own length var is faster in JS.\n var char_count1 = 0; // Number of characters into the text1 string.\n var char_count2 = 0; // Number of characters into the text2 string.\n // Start with text1 (prepatch_text) and apply the diffs until we arrive at\n // text2 (postpatch_text). We recreate the patches one by one to determine\n // context info.\n var prepatch_text = text1;\n var postpatch_text = text1;\n for (var x = 0; x < diffs.length; x++) {\n var diff_type = diffs[x][0];\n var diff_text = diffs[x][1];\n\n if (!patchDiffLength && diff_type !== DIFF_EQUAL) {\n // A new patch starts here.\n patch.start1 = char_count1;\n patch.start2 = char_count2;\n }\n\n switch (diff_type) {\n case DIFF_INSERT:\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length2 += diff_text.length;\n postpatch_text = postpatch_text.substring(0, char_count2) + diff_text +\n postpatch_text.substring(char_count2);\n break;\n case DIFF_DELETE:\n patch.length1 += diff_text.length;\n patch.diffs[patchDiffLength++] = diffs[x];\n postpatch_text = postpatch_text.substring(0, char_count2) +\n postpatch_text.substring(char_count2 +\n diff_text.length);\n break;\n case DIFF_EQUAL:\n if (diff_text.length <= 2 * this.Patch_Margin &&\n patchDiffLength && diffs.length != x + 1) {\n // Small equality inside a patch.\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length1 += diff_text.length;\n patch.length2 += diff_text.length;\n } else if (diff_text.length >= 2 * this.Patch_Margin) {\n // Time for a new patch.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n patch = new diff_match_patch.patch_obj();\n patchDiffLength = 0;\n // Unlike Unidiff, our patch lists have a rolling context.\n // http://code.google.com/p/google-diff-match-patch/wiki/Unidiff\n // Update prepatch text & pos to reflect the application of the\n // just completed patch.\n prepatch_text = postpatch_text;\n char_count1 = char_count2;\n }\n }\n break;\n }\n\n // Update the current character count.\n if (diff_type !== DIFF_INSERT) {\n char_count1 += diff_text.length;\n }\n if (diff_type !== DIFF_DELETE) {\n char_count2 += diff_text.length;\n }\n }\n // Pick up the leftover patch if not empty.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n }\n\n return patches;\n};\n\n\n/**\n * Given an array of patches, return another array that is identical.\n * @param {!Array.} patches Array of Patch objects.\n * @return {!Array.} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_deepCopy = function(patches) {\n // Making deep copies is hard in JavaScript.\n var patchesCopy = [];\n for (var x = 0; x < patches.length; x++) {\n var patch = patches[x];\n var patchCopy = new diff_match_patch.patch_obj();\n patchCopy.diffs = [];\n for (var y = 0; y < patch.diffs.length; y++) {\n patchCopy.diffs[y] = patch.diffs[y].slice();\n }\n patchCopy.start1 = patch.start1;\n patchCopy.start2 = patch.start2;\n patchCopy.length1 = patch.length1;\n patchCopy.length2 = patch.length2;\n patchesCopy[x] = patchCopy;\n }\n return patchesCopy;\n};\n\n\n/**\n * Merge a set of patches onto the text. Return a patched text, as well\n * as a list of true/false values indicating which patches were applied.\n * @param {!Array.} patches Array of Patch objects.\n * @param {string} text Old text.\n * @return {!Array.>} Two element Array, containing the\n * new text and an array of boolean values.\n */\ndiff_match_patch.prototype.patch_apply = function(patches, text) {\n if (patches.length == 0) {\n return [text, []];\n }\n\n // Deep copy the patches so that no changes are made to originals.\n patches = this.patch_deepCopy(patches);\n\n var nullPadding = this.patch_addPadding(patches);\n text = nullPadding + text + nullPadding;\n\n this.patch_splitMax(patches);\n // delta keeps track of the offset between the expected and actual location\n // of the previous patch. If there are patches expected at positions 10 and\n // 20, but the first patch was found at 12, delta is 2 and the second patch\n // has an effective expected position of 22.\n var delta = 0;\n var results = [];\n for (var x = 0; x < patches.length; x++) {\n var expected_loc = patches[x].start2 + delta;\n var text1 = this.diff_text1(patches[x].diffs);\n var start_loc;\n var end_loc = -1;\n if (text1.length > this.Match_MaxBits) {\n // patch_splitMax will only provide an oversized pattern in the case of\n // a monster delete.\n start_loc = this.match_main(text, text1.substring(0, this.Match_MaxBits),\n expected_loc);\n if (start_loc != -1) {\n end_loc = this.match_main(text,\n text1.substring(text1.length - this.Match_MaxBits),\n expected_loc + text1.length - this.Match_MaxBits);\n if (end_loc == -1 || start_loc >= end_loc) {\n // Can't find valid trailing context. Drop this patch.\n start_loc = -1;\n }\n }\n } else {\n start_loc = this.match_main(text, text1, expected_loc);\n }\n if (start_loc == -1) {\n // No match found. :(\n results[x] = false;\n // Subtract the delta for this failed patch from subsequent patches.\n delta -= patches[x].length2 - patches[x].length1;\n } else {\n // Found a match. :)\n results[x] = true;\n delta = start_loc - expected_loc;\n var text2;\n if (end_loc == -1) {\n text2 = text.substring(start_loc, start_loc + text1.length);\n } else {\n text2 = text.substring(start_loc, end_loc + this.Match_MaxBits);\n }\n if (text1 == text2) {\n // Perfect match, just shove the replacement text in.\n text = text.substring(0, start_loc) +\n this.diff_text2(patches[x].diffs) +\n text.substring(start_loc + text1.length);\n } else {\n // Imperfect match. Run a diff to get a framework of equivalent\n // indices.\n var diffs = this.diff_main(text1, text2, false);\n if (text1.length > this.Match_MaxBits &&\n this.diff_levenshtein(diffs) / text1.length >\n this.Patch_DeleteThreshold) {\n // The end points match, but the content is unacceptably bad.\n results[x] = false;\n } else {\n this.diff_cleanupSemanticLossless(diffs);\n var index1 = 0;\n var index2;\n for (var y = 0; y < patches[x].diffs.length; y++) {\n var mod = patches[x].diffs[y];\n if (mod[0] !== DIFF_EQUAL) {\n index2 = this.diff_xIndex(diffs, index1);\n }\n if (mod[0] === DIFF_INSERT) { // Insertion\n text = text.substring(0, start_loc + index2) + mod[1] +\n text.substring(start_loc + index2);\n } else if (mod[0] === DIFF_DELETE) { // Deletion\n text = text.substring(0, start_loc + index2) +\n text.substring(start_loc + this.diff_xIndex(diffs,\n index1 + mod[1].length));\n }\n if (mod[0] !== DIFF_DELETE) {\n index1 += mod[1].length;\n }\n }\n }\n }\n }\n }\n // Strip the padding off.\n text = text.substring(nullPadding.length, text.length - nullPadding.length);\n return [text, results];\n};\n\n\n/**\n * Add some padding on text start and end so that edges can match something.\n * Intended to be called only from within patch_apply.\n * @param {!Array.} patches Array of Patch objects.\n * @return {string} The padding string added to each side.\n */\ndiff_match_patch.prototype.patch_addPadding = function(patches) {\n var paddingLength = this.Patch_Margin;\n var nullPadding = '';\n for (var x = 1; x <= paddingLength; x++) {\n nullPadding += String.fromCharCode(x);\n }\n\n // Bump all the patches forward.\n for (var x = 0; x < patches.length; x++) {\n patches[x].start1 += paddingLength;\n patches[x].start2 += paddingLength;\n }\n\n // Add some padding on start of first diff.\n var patch = patches[0];\n var diffs = patch.diffs;\n if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.unshift([DIFF_EQUAL, nullPadding]);\n patch.start1 -= paddingLength; // Should be 0.\n patch.start2 -= paddingLength; // Should be 0.\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[0][1].length) {\n // Grow first equality.\n var extraLength = paddingLength - diffs[0][1].length;\n diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];\n patch.start1 -= extraLength;\n patch.start2 -= extraLength;\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n // Add some padding on end of last diff.\n patch = patches[patches.length - 1];\n diffs = patch.diffs;\n if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.push([DIFF_EQUAL, nullPadding]);\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[diffs.length - 1][1].length) {\n // Grow last equality.\n var extraLength = paddingLength - diffs[diffs.length - 1][1].length;\n diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n return nullPadding;\n};\n\n\n/**\n * Look through the patches and break up any which are longer than the maximum\n * limit of the match algorithm.\n * Intended to be called only from within patch_apply.\n * @param {!Array.} patches Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_splitMax = function(patches) {\n var patch_size = this.Match_MaxBits;\n for (var x = 0; x < patches.length; x++) {\n if (patches[x].length1 <= patch_size) {\n continue;\n }\n var bigpatch = patches[x];\n // Remove the big old patch.\n patches.splice(x--, 1);\n var start1 = bigpatch.start1;\n var start2 = bigpatch.start2;\n var precontext = '';\n while (bigpatch.diffs.length !== 0) {\n // Create one of several smaller patches.\n var patch = new diff_match_patch.patch_obj();\n var empty = true;\n patch.start1 = start1 - precontext.length;\n patch.start2 = start2 - precontext.length;\n if (precontext !== '') {\n patch.length1 = patch.length2 = precontext.length;\n patch.diffs.push([DIFF_EQUAL, precontext]);\n }\n while (bigpatch.diffs.length !== 0 &&\n patch.length1 < patch_size - this.Patch_Margin) {\n var diff_type = bigpatch.diffs[0][0];\n var diff_text = bigpatch.diffs[0][1];\n if (diff_type === DIFF_INSERT) {\n // Insertions are harmless.\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n patch.diffs.push(bigpatch.diffs.shift());\n empty = false;\n } else if (diff_type === DIFF_DELETE && patch.diffs.length == 1 &&\n patch.diffs[0][0] == DIFF_EQUAL &&\n diff_text.length > 2 * patch_size) {\n // This is a large deletion. Let it pass in one chunk.\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n empty = false;\n patch.diffs.push([diff_type, diff_text]);\n bigpatch.diffs.shift();\n } else {\n // Deletion or equality. Only take as much as we can stomach.\n diff_text = diff_text.substring(0,\n patch_size - patch.length1 - this.Patch_Margin);\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n if (diff_type === DIFF_EQUAL) {\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n } else {\n empty = false;\n }\n patch.diffs.push([diff_type, diff_text]);\n if (diff_text == bigpatch.diffs[0][1]) {\n bigpatch.diffs.shift();\n } else {\n bigpatch.diffs[0][1] =\n bigpatch.diffs[0][1].substring(diff_text.length);\n }\n }\n }\n // Compute the head context for the next patch.\n precontext = this.diff_text2(patch.diffs);\n precontext =\n precontext.substring(precontext.length - this.Patch_Margin);\n // Append the end context for this patch.\n var postcontext = this.diff_text1(bigpatch.diffs)\n .substring(0, this.Patch_Margin);\n if (postcontext !== '') {\n patch.length1 += postcontext.length;\n patch.length2 += postcontext.length;\n if (patch.diffs.length !== 0 &&\n patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {\n patch.diffs[patch.diffs.length - 1][1] += postcontext;\n } else {\n patch.diffs.push([DIFF_EQUAL, postcontext]);\n }\n }\n if (!empty) {\n patches.splice(++x, 0, patch);\n }\n }\n }\n};\n\n\n/**\n * Take a list of patches and return a textual representation.\n * @param {!Array.} patches Array of Patch objects.\n * @return {string} Text representation of patches.\n */\ndiff_match_patch.prototype.patch_toText = function(patches) {\n var text = [];\n for (var x = 0; x < patches.length; x++) {\n text[x] = patches[x];\n }\n return text.join('');\n};\n\n\n/**\n * Parse a textual representation of patches and return a list of Patch objects.\n * @param {string} textline Text representation of patches.\n * @return {!Array.} Array of Patch objects.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.patch_fromText = function(textline) {\n var patches = [];\n if (!textline) {\n return patches;\n }\n var text = textline.split('\\n');\n var textPointer = 0;\n var patchHeader = /^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;\n while (textPointer < text.length) {\n var m = text[textPointer].match(patchHeader);\n if (!m) {\n throw new Error('Invalid patch string: ' + text[textPointer]);\n }\n var patch = new diff_match_patch.patch_obj();\n patches.push(patch);\n patch.start1 = parseInt(m[1], 10);\n if (m[2] === '') {\n patch.start1--;\n patch.length1 = 1;\n } else if (m[2] == '0') {\n patch.length1 = 0;\n } else {\n patch.start1--;\n patch.length1 = parseInt(m[2], 10);\n }\n\n patch.start2 = parseInt(m[3], 10);\n if (m[4] === '') {\n patch.start2--;\n patch.length2 = 1;\n } else if (m[4] == '0') {\n patch.length2 = 0;\n } else {\n patch.start2--;\n patch.length2 = parseInt(m[4], 10);\n }\n textPointer++;\n\n while (textPointer < text.length) {\n var sign = text[textPointer].charAt(0);\n try {\n var line = decodeURI(text[textPointer].substring(1));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in patch_fromText: ' + line);\n }\n if (sign == '-') {\n // Deletion.\n patch.diffs.push([DIFF_DELETE, line]);\n } else if (sign == '+') {\n // Insertion.\n patch.diffs.push([DIFF_INSERT, line]);\n } else if (sign == ' ') {\n // Minor equality.\n patch.diffs.push([DIFF_EQUAL, line]);\n } else if (sign == '@') {\n // Start of next patch.\n break;\n } else if (sign === '') {\n // Blank line? Whatever.\n } else {\n // WTF?\n throw new Error('Invalid patch mode \"' + sign + '\" in: ' + line);\n }\n textPointer++;\n }\n }\n return patches;\n};\n\n\n/**\n * Class representing one patch operation.\n * @constructor\n */\ndiff_match_patch.patch_obj = function() {\n /** @type {!Array.} */\n this.diffs = [];\n /** @type {?number} */\n this.start1 = null;\n /** @type {?number} */\n this.start2 = null;\n /** @type {number} */\n this.length1 = 0;\n /** @type {number} */\n this.length2 = 0;\n};\n\n\n/**\n * Emmulate GNU diff's format.\n * Header: @@ -382,8 +481,9 @@\n * Indicies are printed as 1-based, not 0-based.\n * @return {string} The GNU diff string.\n */\ndiff_match_patch.patch_obj.prototype.toString = function() {\n var coords1, coords2;\n if (this.length1 === 0) {\n coords1 = this.start1 + ',0';\n } else if (this.length1 == 1) {\n coords1 = this.start1 + 1;\n } else {\n coords1 = (this.start1 + 1) + ',' + this.length1;\n }\n if (this.length2 === 0) {\n coords2 = this.start2 + ',0';\n } else if (this.length2 == 1) {\n coords2 = this.start2 + 1;\n } else {\n coords2 = (this.start2 + 1) + ',' + this.length2;\n }\n var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\\n'];\n var op;\n // Escape the body of the patch with %xx notation.\n for (var x = 0; x < this.diffs.length; x++) {\n switch (this.diffs[x][0]) {\n case DIFF_INSERT:\n op = '+';\n break;\n case DIFF_DELETE:\n op = '-';\n break;\n case DIFF_EQUAL:\n op = ' ';\n break;\n }\n text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\\n';\n }\n return text.join('').replace(/%20/g, ' ');\n};\n\n\n// The following export code was added by @ForbesLindesay\nmodule.exports = diff_match_patch;\nmodule.exports['diff_match_patch'] = diff_match_patch;\nmodule.exports['DIFF_DELETE'] = DIFF_DELETE;\nmodule.exports['DIFF_INSERT'] = DIFF_INSERT;\nmodule.exports['DIFF_EQUAL'] = DIFF_EQUAL;","module.exports = __webpack_public_path__ + \"50c073327491a2ed3bfa2ebb466c4204.js\";","module.exports = __webpack_public_path__ + \"d43ad5f9bad9a042b49b2592c7639c28.js\";","module.exports = __webpack_public_path__ + \"d542dda7308361c34af2afb9b70d755a.js\";","module.exports = __webpack_public_path__ + \"74fa46809aba9625071aa51bc0a71561.js\";","module.exports = __webpack_public_path__ + \"c797511423f91a877e7fdffa74d015cb.js\";","module.exports = __webpack_public_path__ + \"42efc1d5450a9a3f9d83ed2d30b678da.js\";","module.exports = __webpack_public_path__ + \"dbd05051a3ecf6b10e2f7b8904153f2d.js\";","module.exports = __webpack_public_path__ + \"df5710d97a899b672060afaa8c4891c2.js\";","module.exports = __webpack_public_path__ + \"525f94195669090c2c9ddc149e6f0599.js\";","module.exports = __webpack_public_path__ + \"68161fc575c65183ae1646c6d01e44db.js\";","module.exports = __webpack_public_path__ + \"aab0e77c1d1dba595ee4e19112eec921.js\";","module.exports = __webpack_public_path__ + \"029ed9161a8d24a9c2ba97124020989d.js\";","module.exports = __webpack_public_path__ + \"02d5c4961ca855a88b1cd3e1b7fa7aa2.js\";","module.exports = __webpack_public_path__ + \"685f9dc3231d6a52855919bbcc8d8e8e.js\";","module.exports = __webpack_public_path__ + \"460c67d8fe31ef229704bd5ab6d1dd26.js\";","module.exports = __webpack_public_path__ + \"985d6749688c18f94994794f88492444.js\";","module.exports = __webpack_public_path__ + \"b881dca9d9a80f61d87374b4bd5a2dd5.js\";","module.exports = __webpack_public_path__ + \"7ef082035f74b3d7324f95a7498ea656.js\";","module.exports = __webpack_public_path__ + \"5c53d90bf4029cfd1b6a0945d1cae142.js\";","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar editorOptions_1 = require(\"./editorOptions\");\nvar ace = editorOptions_1.getAceInstance();\nvar ace_builds_1 = require(\"ace-builds\");\nvar ext_split_1 = require(\"ace-builds/src-noconflict/ext-split\");\nvar PropTypes = require(\"prop-types\");\nvar React = require(\"react\");\nvar isEqual = require(\"lodash.isequal\");\nvar get = require(\"lodash.get\");\nvar SplitComponent = /** @class */ (function (_super) {\n __extends(SplitComponent, _super);\n function SplitComponent(props) {\n var _this = _super.call(this, props) || this;\n editorOptions_1.editorEvents.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n _this.debounce = editorOptions_1.debounce;\n return _this;\n }\n SplitComponent.prototype.isInShadow = function (node) {\n var parent = node && node.parentNode;\n while (parent) {\n if (parent.toString() === \"[object ShadowRoot]\") {\n return true;\n }\n parent = parent.parentNode;\n }\n return false;\n };\n SplitComponent.prototype.componentDidMount = function () {\n var _this = this;\n var _a = this.props, className = _a.className, onBeforeLoad = _a.onBeforeLoad, mode = _a.mode, focus = _a.focus, theme = _a.theme, fontSize = _a.fontSize, value = _a.value, defaultValue = _a.defaultValue, cursorStart = _a.cursorStart, showGutter = _a.showGutter, wrapEnabled = _a.wrapEnabled, showPrintMargin = _a.showPrintMargin, _b = _a.scrollMargin, scrollMargin = _b === void 0 ? [0, 0, 0, 0] : _b, keyboardHandler = _a.keyboardHandler, onLoad = _a.onLoad, commands = _a.commands, annotations = _a.annotations, markers = _a.markers, splits = _a.splits;\n this.editor = ace.edit(this.refEditor);\n if (this.isInShadow(this.refEditor)) {\n this.editor.renderer.attachToShadowRoot();\n }\n this.editor.setTheme(\"ace/theme/\" + theme);\n if (onBeforeLoad) {\n onBeforeLoad(ace);\n }\n var editorProps = Object.keys(this.props.editorProps);\n var split = new ext_split_1.Split(this.editor.container, \"ace/theme/\" + theme, splits);\n this.editor.env.split = split;\n this.splitEditor = split.getEditor(0);\n this.split = split;\n // in a split scenario we don't want a print margin for the entire application\n this.editor.setShowPrintMargin(false);\n this.editor.renderer.setShowGutter(false);\n // get a list of possible options to avoid 'misspelled option errors'\n var availableOptions = this.splitEditor.$options;\n if (this.props.debounceChangePeriod) {\n this.onChange = this.debounce(this.onChange, this.props.debounceChangePeriod);\n }\n split.forEach(function (editor, index) {\n for (var i = 0; i < editorProps.length; i++) {\n editor[editorProps[i]] = _this.props.editorProps[editorProps[i]];\n }\n var defaultValueForEditor = get(defaultValue, index);\n var valueForEditor = get(value, index, \"\");\n editor.session.setUndoManager(new ace.UndoManager());\n editor.setTheme(\"ace/theme/\" + theme);\n editor.renderer.setScrollMargin(scrollMargin[0], scrollMargin[1], scrollMargin[2], scrollMargin[3]);\n editor.getSession().setMode(\"ace/mode/\" + mode);\n editor.setFontSize(fontSize);\n editor.renderer.setShowGutter(showGutter);\n editor.getSession().setUseWrapMode(wrapEnabled);\n editor.setShowPrintMargin(showPrintMargin);\n editor.on(\"focus\", _this.onFocus);\n editor.on(\"blur\", _this.onBlur);\n editor.on(\"input\", _this.onInput);\n editor.on(\"copy\", _this.onCopy);\n editor.on(\"paste\", _this.onPaste);\n editor.on(\"change\", _this.onChange);\n editor\n .getSession()\n .selection.on(\"changeSelection\", _this.onSelectionChange);\n editor.getSession().selection.on(\"changeCursor\", _this.onCursorChange);\n editor.session.on(\"changeScrollTop\", _this.onScroll);\n editor.setValue(defaultValueForEditor === undefined\n ? valueForEditor\n : defaultValueForEditor, cursorStart);\n var newAnnotations = get(annotations, index, []);\n var newMarkers = get(markers, index, []);\n editor.getSession().setAnnotations(newAnnotations);\n if (newMarkers && newMarkers.length > 0) {\n _this.handleMarkers(newMarkers, editor);\n }\n for (var i = 0; i < editorOptions_1.editorOptions.length; i++) {\n var option = editorOptions_1.editorOptions[i];\n if (availableOptions.hasOwnProperty(option)) {\n editor.setOption(option, _this.props[option]);\n }\n else if (_this.props[option]) {\n console.warn(\"ReaceAce: editor option \" + option + \" was activated but not found. Did you need to import a related tool or did you possibly mispell the option?\");\n }\n }\n _this.handleOptions(_this.props, editor);\n if (Array.isArray(commands)) {\n commands.forEach(function (command) {\n if (typeof command.exec === \"string\") {\n editor.commands.bindKey(command.bindKey, command.exec);\n }\n else {\n editor.commands.addCommand(command);\n }\n });\n }\n if (keyboardHandler) {\n editor.setKeyboardHandler(\"ace/keyboard/\" + keyboardHandler);\n }\n });\n if (className) {\n this.refEditor.className += \" \" + className;\n }\n if (focus) {\n this.splitEditor.focus();\n }\n var sp = this.editor.env.split;\n sp.setOrientation(this.props.orientation === \"below\" ? sp.BELOW : sp.BESIDE);\n sp.resize(true);\n if (onLoad) {\n onLoad(sp);\n }\n };\n SplitComponent.prototype.componentDidUpdate = function (prevProps) {\n var _this = this;\n var oldProps = prevProps;\n var nextProps = this.props;\n var split = this.editor.env.split;\n if (nextProps.splits !== oldProps.splits) {\n split.setSplits(nextProps.splits);\n }\n if (nextProps.orientation !== oldProps.orientation) {\n split.setOrientation(nextProps.orientation === \"below\" ? split.BELOW : split.BESIDE);\n }\n split.forEach(function (editor, index) {\n if (nextProps.mode !== oldProps.mode) {\n editor.getSession().setMode(\"ace/mode/\" + nextProps.mode);\n }\n if (nextProps.keyboardHandler !== oldProps.keyboardHandler) {\n if (nextProps.keyboardHandler) {\n editor.setKeyboardHandler(\"ace/keyboard/\" + nextProps.keyboardHandler);\n }\n else {\n editor.setKeyboardHandler(null);\n }\n }\n if (nextProps.fontSize !== oldProps.fontSize) {\n editor.setFontSize(nextProps.fontSize);\n }\n if (nextProps.wrapEnabled !== oldProps.wrapEnabled) {\n editor.getSession().setUseWrapMode(nextProps.wrapEnabled);\n }\n if (nextProps.showPrintMargin !== oldProps.showPrintMargin) {\n editor.setShowPrintMargin(nextProps.showPrintMargin);\n }\n if (nextProps.showGutter !== oldProps.showGutter) {\n editor.renderer.setShowGutter(nextProps.showGutter);\n }\n for (var i = 0; i < editorOptions_1.editorOptions.length; i++) {\n var option = editorOptions_1.editorOptions[i];\n if (nextProps[option] !== oldProps[option]) {\n editor.setOption(option, nextProps[option]);\n }\n }\n if (!isEqual(nextProps.setOptions, oldProps.setOptions)) {\n _this.handleOptions(nextProps, editor);\n }\n var nextValue = get(nextProps.value, index, \"\");\n if (editor.getValue() !== nextValue) {\n // editor.setValue is a synchronous function call, change event is emitted before setValue return.\n _this.silent = true;\n var pos = editor.session.selection.toJSON();\n editor.setValue(nextValue, nextProps.cursorStart);\n editor.session.selection.fromJSON(pos);\n _this.silent = false;\n }\n var newAnnotations = get(nextProps.annotations, index, []);\n var oldAnnotations = get(oldProps.annotations, index, []);\n if (!isEqual(newAnnotations, oldAnnotations)) {\n editor.getSession().setAnnotations(newAnnotations);\n }\n var newMarkers = get(nextProps.markers, index, []);\n var oldMarkers = get(oldProps.markers, index, []);\n if (!isEqual(newMarkers, oldMarkers) && Array.isArray(newMarkers)) {\n _this.handleMarkers(newMarkers, editor);\n }\n });\n if (nextProps.className !== oldProps.className) {\n var appliedClasses = this.refEditor.className;\n var appliedClassesArray_1 = appliedClasses.trim().split(\" \");\n var oldClassesArray = oldProps.className.trim().split(\" \");\n oldClassesArray.forEach(function (oldClass) {\n var index = appliedClassesArray_1.indexOf(oldClass);\n appliedClassesArray_1.splice(index, 1);\n });\n this.refEditor.className =\n \" \" + nextProps.className + \" \" + appliedClassesArray_1.join(\" \");\n }\n if (nextProps.theme !== oldProps.theme) {\n split.setTheme(\"ace/theme/\" + nextProps.theme);\n }\n if (nextProps.focus && !oldProps.focus) {\n this.splitEditor.focus();\n }\n if (nextProps.height !== this.props.height ||\n nextProps.width !== this.props.width) {\n this.editor.resize();\n }\n };\n SplitComponent.prototype.componentWillUnmount = function () {\n this.editor.destroy();\n this.editor = null;\n };\n SplitComponent.prototype.onChange = function (event) {\n if (this.props.onChange && !this.silent) {\n var value_1 = [];\n this.editor.env.split.forEach(function (editor) {\n value_1.push(editor.getValue());\n });\n this.props.onChange(value_1, event);\n }\n };\n SplitComponent.prototype.onSelectionChange = function (event) {\n if (this.props.onSelectionChange) {\n var value_2 = [];\n this.editor.env.split.forEach(function (editor) {\n value_2.push(editor.getSelection());\n });\n this.props.onSelectionChange(value_2, event);\n }\n };\n SplitComponent.prototype.onCursorChange = function (event) {\n if (this.props.onCursorChange) {\n var value_3 = [];\n this.editor.env.split.forEach(function (editor) {\n value_3.push(editor.getSelection());\n });\n this.props.onCursorChange(value_3, event);\n }\n };\n SplitComponent.prototype.onFocus = function (event) {\n if (this.props.onFocus) {\n this.props.onFocus(event);\n }\n };\n SplitComponent.prototype.onInput = function (event) {\n if (this.props.onInput) {\n this.props.onInput(event);\n }\n };\n SplitComponent.prototype.onBlur = function (event) {\n if (this.props.onBlur) {\n this.props.onBlur(event);\n }\n };\n SplitComponent.prototype.onCopy = function (text) {\n if (this.props.onCopy) {\n this.props.onCopy(text);\n }\n };\n SplitComponent.prototype.onPaste = function (text) {\n if (this.props.onPaste) {\n this.props.onPaste(text);\n }\n };\n SplitComponent.prototype.onScroll = function () {\n if (this.props.onScroll) {\n this.props.onScroll(this.editor);\n }\n };\n SplitComponent.prototype.handleOptions = function (props, editor) {\n var setOptions = Object.keys(props.setOptions);\n for (var y = 0; y < setOptions.length; y++) {\n editor.setOption(setOptions[y], props.setOptions[setOptions[y]]);\n }\n };\n SplitComponent.prototype.handleMarkers = function (markers, editor) {\n // remove foreground markers\n var currentMarkers = editor.getSession().getMarkers(true);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i)) {\n editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // remove background markers\n currentMarkers = editor.getSession().getMarkers(false);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i)) {\n editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // add new markers\n markers.forEach(function (_a) {\n var startRow = _a.startRow, startCol = _a.startCol, endRow = _a.endRow, endCol = _a.endCol, className = _a.className, type = _a.type, _b = _a.inFront, inFront = _b === void 0 ? false : _b;\n var range = new ace_builds_1.Range(startRow, startCol, endRow, endCol);\n editor\n .getSession()\n .addMarker(range, className, type, inFront);\n });\n };\n SplitComponent.prototype.updateRef = function (item) {\n this.refEditor = item;\n };\n SplitComponent.prototype.render = function () {\n var _a = this.props, name = _a.name, width = _a.width, height = _a.height, style = _a.style;\n var divStyle = __assign({ width: width, height: height }, style);\n return React.createElement(\"div\", { ref: this.updateRef, id: name, style: divStyle });\n };\n SplitComponent.propTypes = {\n className: PropTypes.string,\n debounceChangePeriod: PropTypes.number,\n defaultValue: PropTypes.arrayOf(PropTypes.string),\n focus: PropTypes.bool,\n fontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n height: PropTypes.string,\n mode: PropTypes.string,\n name: PropTypes.string,\n onBlur: PropTypes.func,\n onChange: PropTypes.func,\n onCopy: PropTypes.func,\n onFocus: PropTypes.func,\n onInput: PropTypes.func,\n onLoad: PropTypes.func,\n onPaste: PropTypes.func,\n onScroll: PropTypes.func,\n orientation: PropTypes.string,\n showGutter: PropTypes.bool,\n splits: PropTypes.number,\n theme: PropTypes.string,\n value: PropTypes.arrayOf(PropTypes.string),\n width: PropTypes.string,\n onSelectionChange: PropTypes.func,\n onCursorChange: PropTypes.func,\n onBeforeLoad: PropTypes.func,\n minLines: PropTypes.number,\n maxLines: PropTypes.number,\n readOnly: PropTypes.bool,\n highlightActiveLine: PropTypes.bool,\n tabSize: PropTypes.number,\n showPrintMargin: PropTypes.bool,\n cursorStart: PropTypes.number,\n editorProps: PropTypes.object,\n setOptions: PropTypes.object,\n style: PropTypes.object,\n scrollMargin: PropTypes.array,\n annotations: PropTypes.array,\n markers: PropTypes.array,\n keyboardHandler: PropTypes.string,\n wrapEnabled: PropTypes.bool,\n enableBasicAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n enableLiveAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n commands: PropTypes.array\n };\n SplitComponent.defaultProps = {\n name: \"ace-editor\",\n focus: false,\n orientation: \"beside\",\n splits: 2,\n mode: \"\",\n theme: \"\",\n height: \"500px\",\n width: \"500px\",\n value: [],\n fontSize: 12,\n showGutter: true,\n onChange: null,\n onPaste: null,\n onLoad: null,\n onScroll: null,\n minLines: null,\n maxLines: null,\n readOnly: false,\n highlightActiveLine: true,\n showPrintMargin: true,\n tabSize: 4,\n cursorStart: 1,\n editorProps: {},\n style: {},\n scrollMargin: [0, 0, 0, 0],\n setOptions: {},\n wrapEnabled: false,\n enableBasicAutocompletion: false,\n enableLiveAutocompletion: false\n };\n return SplitComponent;\n}(React.Component));\nexports.default = SplitComponent;\n//# sourceMappingURL=split.js.map","module.exports = __webpack_public_path__ + \"e2b38a8393be2cf23f3894ace3efb1c3.js\";","module.exports = __webpack_public_path__ + \"7f12d133c88ce53d0837a6c4c0287a37.js\";","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ace_builds_1 = require(\"ace-builds\");\nvar PropTypes = require(\"prop-types\");\nvar React = require(\"react\");\nvar isEqual = require(\"lodash.isequal\");\nvar editorOptions_1 = require(\"./editorOptions\");\nvar ace = editorOptions_1.getAceInstance();\nvar ReactAce = /** @class */ (function (_super) {\n __extends(ReactAce, _super);\n function ReactAce(props) {\n var _this = _super.call(this, props) || this;\n editorOptions_1.editorEvents.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n _this.debounce = editorOptions_1.debounce;\n return _this;\n }\n ReactAce.prototype.isInShadow = function (node) {\n var parent = node && node.parentNode;\n while (parent) {\n if (parent.toString() === \"[object ShadowRoot]\") {\n return true;\n }\n parent = parent.parentNode;\n }\n return false;\n };\n ReactAce.prototype.componentDidMount = function () {\n var _this = this;\n var _a = this.props, className = _a.className, onBeforeLoad = _a.onBeforeLoad, onValidate = _a.onValidate, mode = _a.mode, focus = _a.focus, theme = _a.theme, fontSize = _a.fontSize, value = _a.value, defaultValue = _a.defaultValue, showGutter = _a.showGutter, wrapEnabled = _a.wrapEnabled, showPrintMargin = _a.showPrintMargin, _b = _a.scrollMargin, scrollMargin = _b === void 0 ? [0, 0, 0, 0] : _b, keyboardHandler = _a.keyboardHandler, onLoad = _a.onLoad, commands = _a.commands, annotations = _a.annotations, markers = _a.markers, placeholder = _a.placeholder;\n this.editor = ace.edit(this.refEditor);\n if (onBeforeLoad) {\n onBeforeLoad(ace);\n }\n var editorProps = Object.keys(this.props.editorProps);\n for (var i = 0; i < editorProps.length; i++) {\n this.editor[editorProps[i]] = this.props.editorProps[editorProps[i]];\n }\n if (this.props.debounceChangePeriod) {\n this.onChange = this.debounce(this.onChange, this.props.debounceChangePeriod);\n }\n this.editor.renderer.setScrollMargin(scrollMargin[0], scrollMargin[1], scrollMargin[2], scrollMargin[3]);\n if (this.isInShadow(this.refEditor)) {\n this.editor.renderer.attachToShadowRoot();\n }\n this.editor.getSession().setMode(\"ace/mode/\" + mode);\n this.editor.setTheme(\"ace/theme/\" + theme);\n this.editor.setFontSize(typeof fontSize === \"number\" ? fontSize + \"px\" : fontSize);\n this.editor\n .getSession()\n .setValue(!defaultValue ? value || \"\" : defaultValue);\n if (this.props.navigateToFileEnd) {\n this.editor.navigateFileEnd();\n }\n this.editor.renderer.setShowGutter(showGutter);\n this.editor.getSession().setUseWrapMode(wrapEnabled);\n this.editor.setShowPrintMargin(showPrintMargin);\n this.editor.on(\"focus\", this.onFocus);\n this.editor.on(\"blur\", this.onBlur);\n this.editor.on(\"copy\", this.onCopy);\n this.editor.on(\"paste\", this.onPaste);\n this.editor.on(\"change\", this.onChange);\n this.editor.on(\"input\", this.onInput);\n if (placeholder) {\n this.updatePlaceholder();\n }\n this.editor\n .getSession()\n .selection.on(\"changeSelection\", this.onSelectionChange);\n this.editor.getSession().selection.on(\"changeCursor\", this.onCursorChange);\n if (onValidate) {\n // @ts-ignore types don't include\n this.editor.getSession().on(\"changeAnnotation\", function () {\n // tslint:disable-next-line:no-shadowed-variable\n var annotations = _this.editor.getSession().getAnnotations();\n _this.props.onValidate(annotations);\n });\n }\n this.editor.session.on(\"changeScrollTop\", this.onScroll);\n this.editor.getSession().setAnnotations(annotations || []);\n if (markers && markers.length > 0) {\n this.handleMarkers(markers);\n }\n // get a list of possible options to avoid 'misspelled option errors'\n var availableOptions = this.editor.$options;\n editorOptions_1.editorOptions.forEach(function (option) {\n if (availableOptions.hasOwnProperty(option)) {\n // @ts-ignore\n _this.editor.setOption(option, _this.props[option]);\n }\n else if (_this.props[option]) {\n console.warn(\"ReactAce: editor option \" + option + \" was activated but not found. Did you need to import a related tool or did you possibly mispell the option?\");\n }\n });\n this.handleOptions(this.props);\n if (Array.isArray(commands)) {\n commands.forEach(function (command) {\n if (typeof command.exec === \"string\") {\n _this.editor.commands.bindKey(command.bindKey, command.exec);\n }\n else {\n _this.editor.commands.addCommand(command);\n }\n });\n }\n if (keyboardHandler) {\n this.editor.setKeyboardHandler(\"ace/keyboard/\" + keyboardHandler);\n }\n if (className) {\n this.refEditor.className += \" \" + className;\n }\n if (onLoad) {\n onLoad(this.editor);\n }\n this.editor.resize();\n if (focus) {\n this.editor.focus();\n }\n };\n ReactAce.prototype.componentDidUpdate = function (prevProps) {\n var oldProps = prevProps;\n var nextProps = this.props;\n for (var i = 0; i < editorOptions_1.editorOptions.length; i++) {\n var option = editorOptions_1.editorOptions[i];\n if (nextProps[option] !== oldProps[option]) {\n // @ts-ignore\n this.editor.setOption(option, nextProps[option]);\n }\n }\n if (nextProps.className !== oldProps.className) {\n var appliedClasses = this.refEditor.className;\n var appliedClassesArray_1 = appliedClasses.trim().split(\" \");\n var oldClassesArray = oldProps.className.trim().split(\" \");\n oldClassesArray.forEach(function (oldClass) {\n var index = appliedClassesArray_1.indexOf(oldClass);\n appliedClassesArray_1.splice(index, 1);\n });\n this.refEditor.className =\n \" \" + nextProps.className + \" \" + appliedClassesArray_1.join(\" \");\n }\n // First process editor value, as it may create a new session (see issue #300)\n if (this.editor &&\n nextProps.value != null &&\n this.editor.getValue() !== nextProps.value) {\n // editor.setValue is a synchronous function call, change event is emitted before setValue return.\n this.silent = true;\n var pos = this.editor.session.selection.toJSON();\n this.editor.setValue(nextProps.value, nextProps.cursorStart);\n this.editor.session.selection.fromJSON(pos);\n this.silent = false;\n }\n if (nextProps.placeholder !== oldProps.placeholder) {\n this.updatePlaceholder();\n }\n if (nextProps.mode !== oldProps.mode) {\n this.editor.getSession().setMode(\"ace/mode/\" + nextProps.mode);\n }\n if (nextProps.theme !== oldProps.theme) {\n this.editor.setTheme(\"ace/theme/\" + nextProps.theme);\n }\n if (nextProps.keyboardHandler !== oldProps.keyboardHandler) {\n if (nextProps.keyboardHandler) {\n this.editor.setKeyboardHandler(\"ace/keyboard/\" + nextProps.keyboardHandler);\n }\n else {\n this.editor.setKeyboardHandler(null);\n }\n }\n if (nextProps.fontSize !== oldProps.fontSize) {\n this.editor.setFontSize(typeof nextProps.fontSize === \"number\"\n ? nextProps.fontSize + \"px\"\n : nextProps.fontSize);\n }\n if (nextProps.wrapEnabled !== oldProps.wrapEnabled) {\n this.editor.getSession().setUseWrapMode(nextProps.wrapEnabled);\n }\n if (nextProps.showPrintMargin !== oldProps.showPrintMargin) {\n this.editor.setShowPrintMargin(nextProps.showPrintMargin);\n }\n if (nextProps.showGutter !== oldProps.showGutter) {\n this.editor.renderer.setShowGutter(nextProps.showGutter);\n }\n if (!isEqual(nextProps.setOptions, oldProps.setOptions)) {\n this.handleOptions(nextProps);\n }\n if (!isEqual(nextProps.annotations, oldProps.annotations)) {\n this.editor.getSession().setAnnotations(nextProps.annotations || []);\n }\n if (!isEqual(nextProps.markers, oldProps.markers) &&\n Array.isArray(nextProps.markers)) {\n this.handleMarkers(nextProps.markers);\n }\n // this doesn't look like it works at all....\n if (!isEqual(nextProps.scrollMargin, oldProps.scrollMargin)) {\n this.handleScrollMargins(nextProps.scrollMargin);\n }\n if (prevProps.height !== this.props.height ||\n prevProps.width !== this.props.width) {\n this.editor.resize();\n }\n if (this.props.focus && !prevProps.focus) {\n this.editor.focus();\n }\n };\n ReactAce.prototype.handleScrollMargins = function (margins) {\n if (margins === void 0) { margins = [0, 0, 0, 0]; }\n this.editor.renderer.setScrollMargin(margins[0], margins[1], margins[2], margins[3]);\n };\n ReactAce.prototype.componentWillUnmount = function () {\n this.editor.destroy();\n this.editor = null;\n };\n ReactAce.prototype.onChange = function (event) {\n if (this.props.onChange && !this.silent) {\n var value = this.editor.getValue();\n this.props.onChange(value, event);\n }\n };\n ReactAce.prototype.onSelectionChange = function (event) {\n if (this.props.onSelectionChange) {\n var value = this.editor.getSelection();\n this.props.onSelectionChange(value, event);\n }\n };\n ReactAce.prototype.onCursorChange = function (event) {\n if (this.props.onCursorChange) {\n var value = this.editor.getSelection();\n this.props.onCursorChange(value, event);\n }\n };\n ReactAce.prototype.onInput = function (event) {\n if (this.props.onInput) {\n this.props.onInput(event);\n }\n if (this.props.placeholder) {\n this.updatePlaceholder();\n }\n };\n ReactAce.prototype.onFocus = function (event) {\n if (this.props.onFocus) {\n this.props.onFocus(event, this.editor);\n }\n };\n ReactAce.prototype.onBlur = function (event) {\n if (this.props.onBlur) {\n this.props.onBlur(event, this.editor);\n }\n };\n ReactAce.prototype.onCopy = function (_a) {\n var text = _a.text;\n if (this.props.onCopy) {\n this.props.onCopy(text);\n }\n };\n ReactAce.prototype.onPaste = function (_a) {\n var text = _a.text;\n if (this.props.onPaste) {\n this.props.onPaste(text);\n }\n };\n ReactAce.prototype.onScroll = function () {\n if (this.props.onScroll) {\n this.props.onScroll(this.editor);\n }\n };\n ReactAce.prototype.handleOptions = function (props) {\n var setOptions = Object.keys(props.setOptions);\n for (var y = 0; y < setOptions.length; y++) {\n // @ts-ignore\n this.editor.setOption(setOptions[y], props.setOptions[setOptions[y]]);\n }\n };\n ReactAce.prototype.handleMarkers = function (markers) {\n var _this = this;\n // remove foreground markers\n var currentMarkers = this.editor.getSession().getMarkers(true);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i)) {\n this.editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // remove background markers except active line marker and selected word marker\n currentMarkers = this.editor.getSession().getMarkers(false);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i) &&\n currentMarkers[i].clazz !== \"ace_active-line\" &&\n currentMarkers[i].clazz !== \"ace_selected-word\") {\n this.editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // add new markers\n markers.forEach(function (_a) {\n var startRow = _a.startRow, startCol = _a.startCol, endRow = _a.endRow, endCol = _a.endCol, className = _a.className, type = _a.type, _b = _a.inFront, inFront = _b === void 0 ? false : _b;\n var range = new ace_builds_1.Range(startRow, startCol, endRow, endCol);\n _this.editor.getSession().addMarker(range, className, type, inFront);\n });\n };\n ReactAce.prototype.updatePlaceholder = function () {\n // Adapted from https://stackoverflow.com/questions/26695708/how-can-i-add-placeholder-text-when-the-editor-is-empty\n var editor = this.editor;\n var placeholder = this.props.placeholder;\n var showPlaceholder = !editor.session.getValue().length;\n var node = editor.renderer.placeholderNode;\n if (!showPlaceholder && node) {\n editor.renderer.scroller.removeChild(editor.renderer.placeholderNode);\n editor.renderer.placeholderNode = null;\n }\n else if (showPlaceholder && !node) {\n node = editor.renderer.placeholderNode = document.createElement(\"div\");\n node.textContent = placeholder || \"\";\n node.className = \"ace_comment ace_placeholder\";\n node.style.padding = \"0 9px\";\n node.style.position = \"absolute\";\n node.style.zIndex = \"3\";\n editor.renderer.scroller.appendChild(node);\n }\n else if (showPlaceholder && node) {\n node.textContent = placeholder;\n }\n };\n ReactAce.prototype.updateRef = function (item) {\n this.refEditor = item;\n };\n ReactAce.prototype.render = function () {\n var _a = this.props, name = _a.name, width = _a.width, height = _a.height, style = _a.style;\n var divStyle = __assign({ width: width, height: height }, style);\n return React.createElement(\"div\", { ref: this.updateRef, id: name, style: divStyle });\n };\n ReactAce.propTypes = {\n mode: PropTypes.string,\n focus: PropTypes.bool,\n theme: PropTypes.string,\n name: PropTypes.string,\n className: PropTypes.string,\n height: PropTypes.string,\n width: PropTypes.string,\n fontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n showGutter: PropTypes.bool,\n onChange: PropTypes.func,\n onCopy: PropTypes.func,\n onPaste: PropTypes.func,\n onFocus: PropTypes.func,\n onInput: PropTypes.func,\n onBlur: PropTypes.func,\n onScroll: PropTypes.func,\n value: PropTypes.string,\n defaultValue: PropTypes.string,\n onLoad: PropTypes.func,\n onSelectionChange: PropTypes.func,\n onCursorChange: PropTypes.func,\n onBeforeLoad: PropTypes.func,\n onValidate: PropTypes.func,\n minLines: PropTypes.number,\n maxLines: PropTypes.number,\n readOnly: PropTypes.bool,\n highlightActiveLine: PropTypes.bool,\n tabSize: PropTypes.number,\n showPrintMargin: PropTypes.bool,\n cursorStart: PropTypes.number,\n debounceChangePeriod: PropTypes.number,\n editorProps: PropTypes.object,\n setOptions: PropTypes.object,\n style: PropTypes.object,\n scrollMargin: PropTypes.array,\n annotations: PropTypes.array,\n markers: PropTypes.array,\n keyboardHandler: PropTypes.string,\n wrapEnabled: PropTypes.bool,\n enableSnippets: PropTypes.bool,\n enableBasicAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n enableLiveAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n navigateToFileEnd: PropTypes.bool,\n commands: PropTypes.array,\n placeholder: PropTypes.string\n };\n ReactAce.defaultProps = {\n name: \"ace-editor\",\n focus: false,\n mode: \"\",\n theme: \"\",\n height: \"500px\",\n width: \"500px\",\n fontSize: 12,\n enableSnippets: false,\n showGutter: true,\n onChange: null,\n onPaste: null,\n onLoad: null,\n onScroll: null,\n minLines: null,\n maxLines: null,\n readOnly: false,\n highlightActiveLine: true,\n showPrintMargin: true,\n tabSize: 4,\n cursorStart: 1,\n editorProps: {},\n style: {},\n scrollMargin: [0, 0, 0, 0],\n setOptions: {},\n wrapEnabled: false,\n enableBasicAutocompletion: false,\n enableLiveAutocompletion: false,\n placeholder: null,\n navigateToFileEnd: true\n };\n return ReactAce;\n}(React.Component));\nexports.default = ReactAce;\n//# sourceMappingURL=ace.js.map","module.exports = __webpack_public_path__ + \"7c1cd1223bd45600763f8c152ad167d5.js\";"],"sourceRoot":""}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy