symdesign
3/4/2015 - 12:49 AM

functions.php

functions.php

<?php

/**
 * WordPress Theme Features is a set of features defined by theme authors that
 * allows a theme to register support of a certain feature
 *
 * @link http://codex.wordpress.org/Theme_Features
 */

global $wp_version;

if ( version_compare( $wp_version, '3.4', '>=' ) ) {
	// add_theme_support( 'custom-header' );
} else {
	// add_custom_image_header( $wp_head_callback, $admin_head_callback, $admin_preview_callback );
}

if ( ! function_exists( '_wp_render_title_tag' ) ) {
    // To add backwards compatibility of title-tag for older versions
	function theme_slug_render_title() {
        echo "<title>".wp_title( '' )."</title>";
	}
	add_action( 'wp_head', 'theme_slug_render_title' );
}

add_theme_support( 'title-tag' );
add_theme_support( 'automatic-feed-links' );
add_theme_support( 'html5', array( 'comment-list', 'comment-form', 'search-form', 'gallery', 'caption' ) );
<?php

/**
 * This file has to be included to the header to make theme customizations
 * by the customer visable
 */

$color_scheme = get_theme_mod( 'color_scheme' );

?>
 
<style type="text/css">

    <?php if ( $color_scheme == 'dark' ) : ?>

    body {
        color: #fff;
        background: #000;
    }

    <?php elseif ( $color_scheme == 'light' ) : ?>

    body {
        color: #000;
        background: #fff;
    }

    <?php endif; ?>

</style>
<?php

/**
 * The WordPress Theme Customaization API enables personalisation by the customer.
 * 
 * @link http://codex.wordpress.org/Theme_Customization_API
 * @link http://www.smashingmagazine.com/2013/03/05/the-wordpress-theme-customizer-a-developers-guide/
 */

function my_customize_register( $wp_customize ) {

    $wp_customize->add_setting( 'color_scheme', array() );
    $wp_customize->add_control( 'color_scheme', array(
        'section'    => 'color_scheme',
        'settings'   => 'color_scheme',
        'type'       => 'radio',
        'choices'    => array(
            'light'  => 'hell',
            'dark'   => 'dunkel',
        ),
    ));
    $wp_customize->add_section( 'color_scheme' , array(
        'title' => __( 'Farbschema', 'gfs' ),
    ));

}
add_action( 'customize_register', 'my_customize_register' );
<?php

/**
 * Change the permalink structure from the functions.php side.
 * Settings still visible in the backend but cannot be changed.
 */

function reset_permalinks() {
    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%postname%/' );
}

add_action( 'init', 'reset_permalinks' );
<?php

function register_my_menu() {
    /**
    * register_nav_menus(
    *    array(
    *    'header-menu' => __( 'Header Menu' ),
    *    'extra-menu' => __( 'Extra Menu' )
    *    )
    * );
    */
    register_nav_menu( 'header-menu', __( 'Header Men&uuml;', 'gfs' ) );
}
add_action( 'init', 'register_my_menu' );
<?php

function remove_admin_bar_items() {
    global $wp_admin_bar;

    $wp_admin_bar->remove_menu( 'appearance' );
    $wp_admin_bar->remove_menu( 'comments' );
    $wp_admin_bar->remove_node( 'new-post' );
    $wp_admin_bar->remove_node( 'new-link' );
    // $wp_admin_bar->remove_node( 'new-media' );
    // $wp_admin_bar->remove_menu( 'my-account' );

    if( !current_user_can( 'manage-network' ) ) {
        $wp_admin_bar->remove_menu( 'my-sites' );
        $wp_admin_bar->remove_menu( 'updates' );
    }
}
function remove_menu_items() {
    // remove_menu_page( 'upload.php' );
    // remove_menu_page( 'themes.php' );
    // remove_menu_page( 'users.php' );
    // remove_menu_page( 'tools.php' );
    // remove_menu_page( 'options-general.php' );
    remove_menu_page( 'edit.php' );
    remove_menu_page( 'edit-comments.php' );
};

function beautify_taxonomy() {
    echo '<script>if(document.getElementsByClassName("tagadd").length>0)document.getElementsByClassName("tagadd")[0].value="+";</script>';
}

add_action( 'wp_before_admin_bar_render', 'remove_admin_bar_items' );
add_action( 'admin_menu','remove_menu_items' );
add_action( 'admin_footer', 'beautify_taxonomy' );

// add_filter('show_admin_bar', '__return_false');
<?php

function my_enqueue_scripts() {

	/**
	* wp_enqueue_script( $handle, $src, $dependencies, $version, $in_footer );
	*/

	wp_enqueue_script( 'jquery' );
	wp_enqueue_script( 'black_and_white', get_template_directory_uri().'/js/jquery.black-and-white.min.js', array(), null, true );
	wp_enqueue_script( 'hoverdir', get_template_directory_uri().'/js/jquery.hoverdir.min.js', array(), null, true );
	wp_enqueue_script( 'modernizr', get_template_directory_uri().'/js/modernizr.custom.97074.js', array(), null, true );
	wp_enqueue_script( 'lightbox', get_template_directory_uri().'/js/lightbox.min.js', array(), null, true );
	wp_enqueue_script( 'bootstrap', get_template_directory_uri().'/js/bootstrap.min.js', array(), null, true );

	if ( preg_match( '/(?i)msie [1-8]/', $_SERVER['HTTP_USER_AGENT'] ) ) {
		wp_enqueue_script( 'html5', get_template_directory_uri().'/js/html5.js', array(), '1.0', true );
	}
}
add_action( 'wp_enqueue_scripts', 'my_enqueue_scripts' );
<?php

/**
 * Switch Default line break Behaviour in TinyMCE
 * Add page styles to the visual editor and some extra buttons
 *
 * @link http://codex.wordpress.org/Function_Reference/add_editor_style
 * @link http://codex.wordpress.org/Plugin_API/Filter_Reference/tiny_mce_before_init
 * @link http://www.tinymce.com/wiki.php/Configuration:forced_root_block
 */

 function syntax_css() {
     echo '<link rel="stylesheet" href="'.get_template_directory_uri().'/inc/editor-syntax.min.css">';
 }

 function syntax_js() {
     echo '<script src="'.get_template_directory_uri().'/inc/editor-syntax.min.js"></script>';
 }

function add_editor_styles( $content ) {
     add_editor_style( 'style-editor.css' );

     // This is for front-end tinymce customization
     if ( ! is_admin() ) {
         global $editor_styles;
         $editor_styles = (array) $editor_styles;
         $stylesheet    = (array) $stylesheet;

         $stylesheet[] = 'style-editor.css';

         $editor_styles = array_merge( $editor_styles, $stylesheet );
     }
     return $content;
 }

function remove_version_from_assets() {
    function remove_cssjs_ver( $src ) {
        if( strpos( $src, '?ver=' ) )
            $src = remove_query_arg( 'ver', $src );
        return $src;
    }
    add_filter( 'style_loader_src', 'remove_cssjs_ver', 999 );
    add_filter( 'script_loader_src', 'remove_cssjs_ver', 999 );
}


function switch_tinymce_p_br( $settings ) {
    $settings['forced_root_block'] = true; // false would switch default behaviour to use "<br>" on Enter instead of "<p>"
    return $settings;
 }

 function add_newlines_to_post_content( $content ) {
     return nl2br( $content );
 }

 // http://tinymce.moxiecode.com/wiki.php/Configuration
 function cbnet_tinymce_config( $init ) {

     // Don't remove line breaks
     $init['wpautop'] = false;
     $init['indent'] = true;
     $init['tadv_noautop'] = true;

     // Pass $init back to WordPress
     return $init;
}
add_filter('tiny_mce_before_init', 'cbnet_tinymce_config');

add_action( 'admin_init', 'add_editor_styles' );
add_action( 'wp_head', 'remove_version_from_assets', 1 );

// add_filter( 'the_content', 'add_newlines_to_post_content' );
// add_filter( 'tiny_mce_before_init', 'switch_tinymce_p_br' );

// remove_filter( 'the_content', 'wpautop' ); // Changes double line-breaks in the text into HTML paragraphs (<p>...</p>)
// remove_filter( 'the_excerpt', 'wpautop' );

add_action( 'admin_head', 'syntax_css' );
add_action( 'admin_footer', 'syntax_js' );
function heshPlugin() {
        var e = null,
            t = 0,
            r = 0,
            n = document.getElementById("content"),
            i = null !== document.getElementById("post_ID") ? document.getElementById("post_ID").value : 0,
            o = document.getElementById("content-html"),
            a = document.getElementById("content-tmce"),
            l = -1 !== document.cookie.indexOf("hesh_plugin_theme=mbo") ? "mbo" : "default",
            s = -1 !== document.cookie.indexOf("editor%3Dtinymce") ? !0 : !1,
            u = null !== document.getElementById("content-tmce") ? !0 : !1,
            c = document.getElementById("ed_toolbar"),
            f = document.getElementById("wp-content-editor-container"),
            d = "heshFullscreen",
            h = document.getElementById("publish"),
            p = {
                mode: "text/html",
                tabMode: "indent",
                theme: l,
                lineNumbers: !0,
                matchBrackets: !0,
                indentUnit: 4,
                indentWithTabs: !0,
                enterMode: "keep",
                lineWrapping: !0,
                autofocus: !0,
                styleActiveLine: !0,
                electricChars: !1,
                extraKeys: {
                    F11: function() {
                        C()
                    },
                    Esc: function() {
                        C()
                    },
                    "Ctrl-S": function() {
                        h.click()
                    },
                    "Cmd-S": function() {
                        h.click()
                    }
                }
            },
            m = function(e) {
                var t = "; " + document.cookie,
                    r = t.split("; " + e + "=");
                return 2 == r.length ? r.pop().split(";").shift() : void 0
            },
            g = m("hesh_plugin_font_size") || "12",
            v = function(r) {
                y(), e = CodeMirror.fromTextArea(r, p), e.on("change", function() {
                    e.save()
                }), e.on("cursorActivity", function() {
                    var t = e.getCursor();
                    document.cookie = "hesh_plugin_pos=" + i + "," + t.line + "," + t.ch
                });
                var n = (m("hesh_plugin_pos") || "0,0,0").split(",");
                i === n[0] && e.setCursor(parseFloat(n[1]), parseFloat(n[2])), k(), A(), t = 1
            },
            y = function() {
                if (!r) {
                    var e = {
                        more: ["<!--more-->", ""],
                        comment: ["<!-- ", " -->"],
                        code: ["<code>", "</code>"],
                        li: ["<li>", "</li>"],
                        ol: ["<ol>", "</ol>"],
                        ul: ["<ul>", "</ul>"],
                        img: ['<img src="$" alt="', '">', "Enter the URL of the image"],
                        ins: ["<ins>", "</ins>"],
                        del: ["<del>", "</del>"],
                        link: ['<a href="$">', "</a>", "Enter the destination URL"],
                        blockquote: ["\r<blockquote>", "</blockquote>\r"],
                        h3: ["<h3>", "</h3>"],
                        h2: ["<h2>", "</h2>"],
                        h1: ["<h1>", "</h1>"],
                        i: ["<em>", "</em>"],
                        b: ["<strong>", "</strong>"]
                    };
                    for (var t in e) {
                        var n = e[t],
                            i = n[2] ? 'data-prompt="' + n[2] + '"' : "";
                        c.insertAdjacentHTML("afterbegin", '<input type="button" id="cm_content_' + t + "\" data-start='" + n[0] + "' data-end='" + n[1] + "' " + i + ' class="ed_button button cm_ed_button" value="' + t + '">'), document.getElementById("cm_content_" + t).onclick = b
                    }
                    S(), T(), L(), r = 1
                }
            },
            b = function() {
                var t = e.getCursor("start"),
                    r = this.getAttribute("data-start"),
                    n = this.getAttribute("data-end"),
                    i = this.getAttribute("data-prompt") || null,
                    o = e.getSelection();
                "cm_content_link" === this.id && wpLink ? (wpLink.open(), document.getElementById("wp-link-submit").onclick = function() {
                    var n = wpLink.getAttrs();
                    r = '<a href="' + n.href + '" title="' + n.title + '" target="' + n.target + '">', e.replaceSelection(r + o + "</a>"), wpLink.close(), e.setCursor(t.line, t.ch + r.length), e.focus()
                }) : (i && (r = r.replace("$", prompt(i, ""))), e.replaceSelection(r + o + n), e.setCursor(t.line, t.ch + r.length), e.focus())
            },
            w = function() {
                t && (e.toTextArea(), o.onclick = x, switchEditors.switchto(this), t = 0)
            },
            x = function() {
                t || (switchEditors.switchto(this), v(n), a.onclick = w)
            },
            k = function() {
                var e = document.querySelector(".CodeMirror"),
                    t = document.createElement("div"),
                    r = document.getElementById("wp-content-wrap"),
                    n = e.getBoundingClientRect().top,
                    i = function(t) {
                        t = t || window.event;
                        var r = (t.pageY || t.clientY + document.body.scrollTop + document.documentElement.scrollTop) - n;
                        e.style.height = (r > 10 ? r : 10) + "px", window.getSelection().removeAllRanges()
                    };
                t.className = "content-resize-handle", r.appendChild(t), t.onmousedown = function() {
                    document.onmousemove = i
                }, document.onmouseup = function() {
                    document.onmousemove = null
                }
            },
            C = function() {
                f.className = -1 === f.className.indexOf(d) ? f.className + " " + d : f.className.replace(d, "");
                var t = document.getElementById("cm_content_fullscreen");
                t.value = "fullscreen" === t.value ? "exit fullscreen" : "fullscreen", e.focus()
            },
            L = function() {
                c.insertAdjacentHTML("afterbegin", '<input type="button" id="cm_content_fullscreen" class="ed_button button" title="Toggle fullscreen mode" value="fullscreen">'), document.getElementById("cm_content_fullscreen").onclick = C
            },
            S = function() {
                var t = function() {
                    return "mbo" === l ? "light" : "dark"
                };
                c.insertAdjacentHTML("afterbegin", '<input type="button" id="cm_select_theme" class="ed_button button" title="Change editor colour scheme" value="' + t() + '">'), document.getElementById("cm_select_theme").onclick = function() {
                    l = "mbo" === l ? "default" : "mbo", e.setOption("theme", l), document.cookie = "hesh_plugin_theme=" + l, this.value = t()
                }
            },
            M = function() {
                var e = document.getElementById("hesh-style"),
                    t = ".CodeMirror {font-size: " + g + "px !important;}";
                e ? e.innerHTML = t : document.getElementsByTagName("head")[0].insertAdjacentHTML("beforeend", '<style id="hesh-style">' + t + "</style>")
            },
            T = function() {
                c.insertAdjacentHTML("afterbegin", '<select id="cm_font_size" class="button"><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="16">16</option><option value="18">18</option><option value="20">20</option><option value="22">22</option></select>');
                var t = document.getElementById("cm_font_size");
                M(), t.value = g, t.onchange = function() {
                    g = this.value, M(), e.toTextArea(), v(n), e.focus(), document.cookie = "hesh_plugin_font_size=" + g
                }
            },
            A = function() {
                window.send_to_editor_wp || (window.send_to_editor_wp = send_to_editor, send_to_editor = function(r) {
                    t && "content" === wpActiveEditor ? (e.replaceSelection(r), e.save()) : window.send_to_editor_wp(r)
                })
            };
        s && u ? o.onclick = x : (v(n), u && (a.onclick = w))
    }! function(e) {
        if ("object" == typeof exports && "object" == typeof module) module.exports = e();
        else {
            if ("function" == typeof define && define.amd) return define([], e);
            this.CodeMirror = e()
        }
    }(function() {
        "use strict";

        function e(r, n) {
            if (!(this instanceof e)) return new e(r, n);
            this.options = n = n || {}, no(ga, n, !1), p(n);
            var i = n.value;
            "string" == typeof i && (i = new Ba(i, n.mode)), this.doc = i;
            var o = this.display = new t(r, i);
            o.wrapper.CodeMirror = this, c(this), s(this), n.lineWrapping && (this.display.wrapper.className += " CodeMirror-wrap"), n.autofocus && !$o && hr(this), this.state = {
                keyMaps: [],
                overlays: [],
                modeGen: 0,
                overwrite: !1,
                focused: !1,
                suppressEdits: !1,
                pasteIncoming: !1,
                cutIncoming: !1,
                draggingText: !1,
                highlight: new Xi
            }, Wo && setTimeout(io(dr, this, !0), 20), gr(this);
            var a = this;
            Xt(this, function() {
                a.curOp.forceUpdate = !0, vi(a, i), n.autofocus && !$o || fo() == o.input ? setTimeout(io(_r, a), 20) : Fr(a);
                for (var e in va) va.hasOwnProperty(e) && va[e](a, n[e], ya);
                for (var t = 0; t < ka.length; ++t) ka[t](a)
            })
        }

        function t(e, t) {
            var r = this,
                n = r.input = lo("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none");
            Fo ? n.style.width = "1000px" : n.setAttribute("wrap", "off"), Ko && (n.style.border = "1px solid black"), n.setAttribute("autocorrect", "off"), n.setAttribute("autocapitalize", "off"), n.setAttribute("spellcheck", "false"), r.inputDiv = lo("div", [n], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"), r.scrollbarH = lo("div", [lo("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"), r.scrollbarV = lo("div", [lo("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"), r.scrollbarFiller = lo("div", null, "CodeMirror-scrollbar-filler"), r.gutterFiller = lo("div", null, "CodeMirror-gutter-filler"), r.lineDiv = lo("div", null, "CodeMirror-code"), r.selectionDiv = lo("div", null, null, "position: relative; z-index: 1"), r.cursorDiv = lo("div", null, "CodeMirror-cursors"), r.measure = lo("div", null, "CodeMirror-measure"), r.lineMeasure = lo("div", null, "CodeMirror-measure"), r.lineSpace = lo("div", [r.measure, r.lineMeasure, r.selectionDiv, r.cursorDiv, r.lineDiv], null, "position: relative; outline: none"), r.mover = lo("div", [lo("div", [r.lineSpace], "CodeMirror-lines")], null, "position: relative"), r.sizer = lo("div", [r.mover], "CodeMirror-sizer"), r.heightForcer = lo("div", null, null, "position: absolute; height: " + Za + "px; width: 1px;"), r.gutters = lo("div", null, "CodeMirror-gutters"), r.lineGutter = null, r.scroller = lo("div", [r.sizer, r.heightForcer, r.gutters], "CodeMirror-scroll"), r.scroller.setAttribute("tabIndex", "-1"), r.wrapper = lo("div", [r.inputDiv, r.scrollbarH, r.scrollbarV, r.scrollbarFiller, r.gutterFiller, r.scroller], "CodeMirror"), Eo && (r.gutters.style.zIndex = -1, r.scroller.style.paddingRight = 0), Ko && (n.style.width = "0px"), Fo || (r.scroller.draggable = !0), Go && (r.inputDiv.style.height = "1px", r.inputDiv.style.position = "absolute"), Eo && (r.scrollbarH.style.minHeight = r.scrollbarV.style.minWidth = "18px"), e.appendChild ? e.appendChild(r.wrapper) : e(r.wrapper), r.viewFrom = r.viewTo = t.first, r.view = [], r.externalMeasured = null, r.viewOffset = 0, r.lastSizeC = 0, r.updateLineNumbers = null, r.lineNumWidth = r.lineNumInnerWidth = r.lineNumChars = null, r.prevInput = "", r.alignWidgets = !1, r.pollingFast = !1, r.poll = new Xi, r.cachedCharWidth = r.cachedTextHeight = r.cachedPaddingH = null, r.inaccurateSelection = !1, r.maxLine = null, r.maxLineLength = 0, r.maxLineChanged = !1, r.wheelDX = r.wheelDY = r.wheelStartX = r.wheelStartY = null, r.shift = !1
        }

        function r(t) {
            t.doc.mode = e.getMode(t.options, t.doc.modeOption), n(t)
        }

        function n(e) {
            e.doc.iter(function(e) {
                e.stateAfter && (e.stateAfter = null), e.styles && (e.styles = null)
            }), e.doc.frontier = e.doc.first, yt(e, 100), e.state.modeGen++, e.curOp && rr(e)
        }

        function i(e) {
            e.options.lineWrapping ? (mo(e.display.wrapper, "CodeMirror-wrap"), e.display.sizer.style.minWidth = "") : (po(e.display.wrapper, "CodeMirror-wrap"), h(e)), a(e), rr(e), It(e), setTimeout(function() {
                g(e)
            }, 100)
        }

        function o(e) {
            var t = Ut(e.display),
                r = e.options.lineWrapping,
                n = r && Math.max(5, e.display.scroller.clientWidth / Kt(e.display) - 3);
            return function(i) {
                if (Gn(e.doc, i)) return 0;
                var o = 0;
                if (i.widgets)
                    for (var a = 0; a < i.widgets.length; a++) i.widgets[a].height && (o += i.widgets[a].height);
                return r ? o + (Math.ceil(i.text.length / n) || 1) * t : o + t
            }
        }

        function a(e) {
            var t = e.doc,
                r = o(e);
            t.iter(function(e) {
                var t = r(e);
                t != e.height && xi(e, t)
            })
        }

        function l(e) {
            var t = Ta[e.options.keyMap],
                r = t.style;
            e.display.wrapper.className = e.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") + (r ? " cm-keymap-" + r : "")
        }

        function s(e) {
            e.display.wrapper.className = e.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + e.options.theme.replace(/(^|\s)\s*/g, " cm-s-"), It(e)
        }

        function u(e) {
            c(e), rr(e), setTimeout(function() {
                y(e)
            }, 20)
        }

        function c(e) {
            var t = e.display.gutters,
                r = e.options.gutters;
            so(t);
            for (var n = 0; n < r.length; ++n) {
                var i = r[n],
                    o = t.appendChild(lo("div", null, "CodeMirror-gutter " + i));
                "CodeMirror-linenumbers" == i && (e.display.lineGutter = o, o.style.width = (e.display.lineNumWidth || 1) + "px")
            }
            t.style.display = n ? "" : "none", f(e)
        }

        function f(e) {
            var t = e.display.gutters.offsetWidth;
            e.display.sizer.style.marginLeft = t + "px", e.display.scrollbarH.style.left = e.options.fixedGutter ? t + "px" : 0
        }

        function d(e) {
            if (0 == e.height) return 0;
            for (var t = e.text.length, r, n = e; r = Pn(n);) {
                var i = r.find(0, !0);
                n = i.from.line, t += i.from.ch - i.to.ch
            }
            for (n = e; r = _n(n);) {
                var i = r.find(0, !0);
                t -= n.text.length - i.from.ch, n = i.to.line, t += n.text.length - i.to.ch
            }
            return t
        }

        function h(e) {
            var t = e.display,
                r = e.doc;
            t.maxLine = yi(r, r.first), t.maxLineLength = d(t.maxLine), t.maxLineChanged = !0, r.iter(function(e) {
                var r = d(e);
                r > t.maxLineLength && (t.maxLineLength = r, t.maxLine = e)
            })
        }

        function p(e) {
            var t = eo(e.gutters, "CodeMirror-linenumbers"); - 1 == t && e.lineNumbers ? e.gutters = e.gutters.concat(["CodeMirror-linenumbers"]) : t > -1 && !e.lineNumbers && (e.gutters = e.gutters.slice(0), e.gutters.splice(t, 1))
        }

        function m(e) {
            var t = e.display.scroller;
            return {
                clientHeight: t.clientHeight,
                barHeight: e.display.scrollbarV.clientHeight,
                scrollWidth: t.scrollWidth,
                clientWidth: t.clientWidth,
                barWidth: e.display.scrollbarH.clientWidth,
                docHeight: Math.round(e.doc.height + Ct(e.display))
            }
        }

        function g(e, t) {
            t || (t = m(e));
            var r = e.display,
                n = t.docHeight + Za,
                i = t.scrollWidth > t.clientWidth,
                o = n > t.clientHeight;
            if (o ? (r.scrollbarV.style.display = "block", r.scrollbarV.style.bottom = i ? vo(r.measure) + "px" : "0", r.scrollbarV.firstChild.style.height = Math.max(0, n - t.clientHeight + (t.barHeight || r.scrollbarV.clientHeight)) + "px") : (r.scrollbarV.style.display = "", r.scrollbarV.firstChild.style.height = "0"), i ? (r.scrollbarH.style.display = "block", r.scrollbarH.style.right = o ? vo(r.measure) + "px" : "0", r.scrollbarH.firstChild.style.width = t.scrollWidth - t.clientWidth + (t.barWidth || r.scrollbarH.clientWidth) + "px") : (r.scrollbarH.style.display = "", r.scrollbarH.firstChild.style.width = "0"), i && o ? (r.scrollbarFiller.style.display = "block", r.scrollbarFiller.style.height = r.scrollbarFiller.style.width = vo(r.measure) + "px") : r.scrollbarFiller.style.display = "", i && e.options.coverGutterNextToScrollbar && e.options.fixedGutter ? (r.gutterFiller.style.display = "block", r.gutterFiller.style.height = vo(r.measure) + "px", r.gutterFiller.style.width = r.gutters.offsetWidth + "px") : r.gutterFiller.style.display = "", !e.state.checkedOverlayScrollbar && t.clientHeight > 0) {
                if (0 === vo(r.measure)) {
                    var a = Yo && !qo ? "12px" : "18px";
                    r.scrollbarV.style.minWidth = r.scrollbarH.style.minHeight = a;
                    var l = function(t) {
                        ji(t) != r.scrollbarV && ji(t) != r.scrollbarH && Zt(e, br)(t)
                    };
                    Ua(r.scrollbarV, "mousedown", l), Ua(r.scrollbarH, "mousedown", l)
                }
                e.state.checkedOverlayScrollbar = !0
            }
        }

        function v(e, t, r) {
            var n = r && null != r.top ? r.top : e.scroller.scrollTop;
            n = Math.floor(n - kt(e));
            var i = r && null != r.bottom ? r.bottom : n + e.wrapper.clientHeight,
                o = Ci(t, n),
                a = Ci(t, i);
            if (r && r.ensure) {
                var l = r.ensure.from.line,
                    s = r.ensure.to.line;
                if (o > l) return {
                    from: l,
                    to: Ci(t, Li(yi(t, l)) + e.wrapper.clientHeight)
                };
                if (Math.min(s, t.lastLine()) >= a) return {
                    from: Ci(t, Li(yi(t, s)) - e.wrapper.clientHeight),
                    to: s
                }
            }
            return {
                from: o,
                to: a
            }
        }

        function y(e) {
            var t = e.display,
                r = t.view;
            if (t.alignWidgets || t.gutters.firstChild && e.options.fixedGutter) {
                for (var n = x(t) - t.scroller.scrollLeft + e.doc.scrollLeft, i = t.gutters.offsetWidth, o = n + "px", a = 0; a < r.length; a++)
                    if (!r[a].hidden) {
                        e.options.fixedGutter && r[a].gutter && (r[a].gutter.style.left = o);
                        var l = r[a].alignable;
                        if (l)
                            for (var s = 0; s < l.length; s++) l[s].style.left = o
                    }
                e.options.fixedGutter && (t.gutters.style.left = n + i + "px")
            }
        }

        function b(e) {
            if (!e.options.lineNumbers) return !1;
            var t = e.doc,
                r = w(e.options, t.first + t.size - 1),
                n = e.display;
            if (r.length != n.lineNumChars) {
                var i = n.measure.appendChild(lo("div", [lo("div", r)], "CodeMirror-linenumber CodeMirror-gutter-elt")),
                    o = i.firstChild.offsetWidth,
                    a = i.offsetWidth - o;
                return n.lineGutter.style.width = "", n.lineNumInnerWidth = Math.max(o, n.lineGutter.offsetWidth - a), n.lineNumWidth = n.lineNumInnerWidth + a, n.lineNumChars = n.lineNumInnerWidth ? r.length : -1, n.lineGutter.style.width = n.lineNumWidth + "px", f(e), !0
            }
            return !1
        }

        function w(e, t) {
            return String(e.lineNumberFormatter(t + e.firstLineNumber))
        }

        function x(e) {
            return e.scroller.getBoundingClientRect().left - e.sizer.getBoundingClientRect().left
        }

        function k(e, t, r) {
            for (var n = e.display.viewFrom, i = e.display.viewTo, o, a = v(e.display, e.doc, t), l = !0;; l = !1) {
                var s = e.display.scroller.clientWidth;
                if (!C(e, a, r)) break;
                o = !0, e.display.maxLineChanged && !e.options.lineWrapping && L(e);
                var u = m(e);
                if (pt(e), S(e, u), g(e, u), Fo && e.options.lineWrapping && M(e, u), l && e.options.lineWrapping && s != e.display.scroller.clientWidth) r = !0;
                else if (r = !1, t && null != t.top && (t = {
                        top: Math.min(u.docHeight - Za - u.clientHeight, t.top)
                    }), a = v(e.display, e.doc, t), a.from >= e.display.viewFrom && a.to <= e.display.viewTo) break
            }
            return e.display.updateLineNumbers = null, o && (Gi(e, "update", e), (e.display.viewFrom != n || e.display.viewTo != i) && Gi(e, "viewportChange", e, e.display.viewFrom, e.display.viewTo)), o
        }

        function C(e, t, r) {
            var n = e.display,
                i = e.doc;
            if (!n.wrapper.offsetWidth) return void ir(e);
            if (!(!r && t.from >= n.viewFrom && t.to <= n.viewTo && 0 == sr(e))) {
                b(e) && ir(e);
                var o = N(e),
                    a = i.first + i.size,
                    l = Math.max(t.from - e.options.viewportMargin, i.first),
                    s = Math.min(a, t.to + e.options.viewportMargin);
                n.viewFrom < l && l - n.viewFrom < 20 && (l = Math.max(i.first, n.viewFrom)), n.viewTo > s && n.viewTo - s < 20 && (s = Math.min(a, n.viewTo)), ta && (l = jn(e.doc, l), s = Vn(e.doc, s));
                var u = l != n.viewFrom || s != n.viewTo || n.lastSizeC != n.wrapper.clientHeight;
                lr(e, l, s), n.viewOffset = Li(yi(e.doc, n.viewFrom)), e.display.mover.style.top = n.viewOffset + "px";
                var c = sr(e);
                if (u || 0 != c || r) {
                    var f = fo();
                    return c > 4 && (n.lineDiv.style.display = "none"), H(e, n.updateLineNumbers, o), c > 4 && (n.lineDiv.style.display = ""), f && fo() != f && f.offsetHeight && f.focus(), so(n.cursorDiv), so(n.selectionDiv), u && (n.lastSizeC = n.wrapper.clientHeight, yt(e, 400)), T(e), !0
                }
            }
        }

        function L(e) {
            var t = e.display,
                r = At(e, t.maxLine, t.maxLine.text.length).left;
            t.maxLineChanged = !1;
            var n = Math.max(0, r + 3),
                i = Math.max(0, t.sizer.offsetLeft + n + Za - t.scroller.clientWidth);
            t.sizer.style.minWidth = n + "px", i < e.doc.scrollLeft && Ar(e, Math.min(t.scroller.scrollLeft, i), !0)
        }

        function S(e, t) {
            e.display.sizer.style.minHeight = e.display.heightForcer.style.top = t.docHeight + "px", e.display.gutters.style.height = Math.max(t.docHeight, t.clientHeight - Za) + "px"
        }

        function M(e, t) {
            e.display.sizer.offsetWidth + e.display.gutters.offsetWidth < e.display.scroller.clientWidth - 1 && (e.display.sizer.style.minHeight = e.display.heightForcer.style.top = "0px", e.display.gutters.style.height = t.docHeight + "px")
        }

        function T(e) {
            for (var t = e.display, r = t.lineDiv.offsetTop, n = 0; n < t.view.length; n++) {
                var i = t.view[n],
                    o;
                if (!i.hidden) {
                    if (Eo) {
                        var a = i.node.offsetTop + i.node.offsetHeight;
                        o = a - r, r = a
                    } else {
                        var l = i.node.getBoundingClientRect();
                        o = l.bottom - l.top
                    }
                    var s = i.line.height - o;
                    if (2 > o && (o = Ut(t)), (s > .001 || -.001 > s) && (xi(i.line, o), A(i.line), i.rest))
                        for (var u = 0; u < i.rest.length; u++) A(i.rest[u])
                }
            }
        }

        function A(e) {
            if (e.widgets)
                for (var t = 0; t < e.widgets.length; ++t) e.widgets[t].height = e.widgets[t].node.offsetHeight
        }

        function N(e) {
            for (var t = e.display, r = {}, n = {}, i = t.gutters.firstChild, o = 0; i; i = i.nextSibling, ++o) r[e.options.gutters[o]] = i.offsetLeft, n[e.options.gutters[o]] = i.offsetWidth;
            return {
                fixedPos: x(t),
                gutterTotalWidth: t.gutters.offsetWidth,
                gutterLeft: r,
                gutterWidth: n,
                wrapperWidth: t.wrapper.clientWidth
            }
        }

        function H(e, t, r) {
            function n(t) {
                var r = t.nextSibling;
                return Fo && Yo && e.display.currentWheelTarget == t ? t.style.display = "none" : t.parentNode.removeChild(t), r
            }
            for (var i = e.display, o = e.options.lineNumbers, a = i.lineDiv, l = a.firstChild, s = i.view, u = i.viewFrom, c = 0; c < s.length; c++) {
                var f = s[c];
                if (f.hidden);
                else if (f.node) {
                    for (; l != f.node;) l = n(l);
                    var d = o && null != t && u >= t && f.lineNumber;
                    f.changes && (eo(f.changes, "gutter") > -1 && (d = !1), O(e, f, u, r)), d && (so(f.lineNumber), f.lineNumber.appendChild(document.createTextNode(w(e.options, u)))), l = f.node.nextSibling
                } else {
                    var h = F(e, f, u, r);
                    a.insertBefore(h, l)
                }
                u += f.size
            }
            for (; l;) l = n(l)
        }

        function O(e, t, r, n) {
            for (var i = 0; i < t.changes.length; i++) {
                var o = t.changes[i];
                "text" == o ? I(e, t) : "gutter" == o ? P(e, t, r, n) : "class" == o ? D(t) : "widget" == o && _(t, n)
            }
            t.changes = null
        }

        function z(e) {
            return e.node == e.text && (e.node = lo("div", null, null, "position: relative"), e.text.parentNode && e.text.parentNode.replaceChild(e.node, e.text), e.node.appendChild(e.text), Eo && (e.node.style.zIndex = 2)), e.node
        }

        function W(e) {
            var t = e.bgClass ? e.bgClass + " " + (e.line.bgClass || "") : e.line.bgClass;
            if (t && (t += " CodeMirror-linebackground"), e.background) t ? e.background.className = t : (e.background.parentNode.removeChild(e.background), e.background = null);
            else if (t) {
                var r = z(e);
                e.background = r.insertBefore(lo("div", null, t), r.firstChild)
            }
        }

        function E(e, t) {
            var r = e.display.externalMeasured;
            return r && r.line == t.line ? (e.display.externalMeasured = null, t.measure = r.measure, r.built) : oi(e, t)
        }

        function I(e, t) {
            var r = t.text.className,
                n = E(e, t);
            t.text == t.node && (t.node = n.pre), t.text.parentNode.replaceChild(n.pre, t.text), t.text = n.pre, n.bgClass != t.bgClass || n.textClass != t.textClass ? (t.bgClass = n.bgClass, t.textClass = n.textClass, D(t)) : r && (t.text.className = r)
        }

        function D(e) {
            W(e), e.line.wrapClass ? z(e).className = e.line.wrapClass : e.node != e.text && (e.node.className = "");
            var t = e.textClass ? e.textClass + " " + (e.line.textClass || "") : e.line.textClass;
            e.text.className = t || ""
        }

        function P(e, t, r, n) {
            t.gutter && (t.node.removeChild(t.gutter), t.gutter = null);
            var i = t.line.gutterMarkers;
            if (e.options.lineNumbers || i) {
                var o = z(t),
                    a = t.gutter = o.insertBefore(lo("div", null, "CodeMirror-gutter-wrapper", "position: absolute; left: " + (e.options.fixedGutter ? n.fixedPos : -n.gutterTotalWidth) + "px"), t.text);
                if (!e.options.lineNumbers || i && i["CodeMirror-linenumbers"] || (t.lineNumber = a.appendChild(lo("div", w(e.options, r), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + n.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + e.display.lineNumInnerWidth + "px"))), i)
                    for (var l = 0; l < e.options.gutters.length; ++l) {
                        var s = e.options.gutters[l],
                            u = i.hasOwnProperty(s) && i[s];
                        u && a.appendChild(lo("div", [u], "CodeMirror-gutter-elt", "left: " + n.gutterLeft[s] + "px; width: " + n.gutterWidth[s] + "px"))
                    }
            }
        }

        function _(e, t) {
            e.alignable && (e.alignable = null);
            for (var r = e.node.firstChild, n; r; r = n) {
                var n = r.nextSibling;
                "CodeMirror-linewidget" == r.className && e.node.removeChild(r)
            }
            B(e, t)
        }

        function F(e, t, r, n) {
            var i = E(e, t);
            return t.text = t.node = i.pre, i.bgClass && (t.bgClass = i.bgClass), i.textClass && (t.textClass = i.textClass), D(t), P(e, t, r, n), B(t, n), t.node
        }

        function B(e, t) {
            if (R(e.line, e, t, !0), e.rest)
                for (var r = 0; r < e.rest.length; r++) R(e.rest[r], e, t, !1)
        }

        function R(e, t, r, n) {
            if (e.widgets)
                for (var i = z(t), o = 0, a = e.widgets; o < a.length; ++o) {
                    var l = a[o],
                        s = lo("div", [l.node], "CodeMirror-linewidget");
                    l.handleMouseEvents || (s.ignoreEvents = !0), j(l, s, t, r), n && l.above ? i.insertBefore(s, t.gutter || t.text) : i.appendChild(s), Gi(l, "redraw")
                }
        }

        function j(e, t, r, n) {
            if (e.noHScroll) {
                (r.alignable || (r.alignable = [])).push(t);
                var i = n.wrapperWidth;
                t.style.left = n.fixedPos + "px", e.coverGutter || (i -= n.gutterTotalWidth, t.style.paddingLeft = n.gutterTotalWidth + "px"), t.style.width = i + "px"
            }
            e.coverGutter && (t.style.zIndex = 5, t.style.position = "relative", e.noHScroll || (t.style.marginLeft = -n.gutterTotalWidth + "px"))
        }

        function V(e) {
            return ra(e.line, e.ch)
        }

        function G(e, t) {
            return na(e, t) < 0 ? t : e
        }

        function q(e, t) {
            return na(e, t) < 0 ? e : t
        }

        function U(e, t) {
            this.ranges = e, this.primIndex = t
        }

        function K(e, t) {
            this.anchor = e, this.head = t
        }

        function $(e, t) {
            var r = e[t];
            e.sort(function(e, t) {
                return na(e.from(), t.from())
            }), t = eo(e, r);
            for (var n = 1; n < e.length; n++) {
                var i = e[n],
                    o = e[n - 1];
                if (na(o.to(), i.from()) >= 0) {
                    var a = q(o.from(), i.from()),
                        l = G(o.to(), i.to()),
                        s = o.empty() ? i.from() == i.head : o.from() == o.head;
                    t >= n && --t, e.splice(--n, 2, new K(s ? l : a, s ? a : l))
                }
            }
            return new U(e, t)
        }

        function Y(e, t) {
            return new U([new K(e, t || e)], 0)
        }

        function X(e, t) {
            return Math.max(e.first, Math.min(t, e.first + e.size - 1))
        }

        function Z(e, t) {
            if (t.line < e.first) return ra(e.first, 0);
            var r = e.first + e.size - 1;
            return t.line > r ? ra(r, yi(e, r).text.length) : Q(t, yi(e, t.line).text.length)
        }

        function Q(e, t) {
            var r = e.ch;
            return null == r || r > t ? ra(e.line, t) : 0 > r ? ra(e.line, 0) : e
        }

        function J(e, t) {
            return t >= e.first && t < e.first + e.size
        }

        function et(e, t) {
            for (var r = [], n = 0; n < t.length; n++) r[n] = Z(e, t[n]);
            return r
        }

        function tt(e, t, r, n) {
            if (e.cm && e.cm.display.shift || e.extend) {
                var i = t.anchor;
                if (n) {
                    var o = na(r, i) < 0;
                    o != na(n, i) < 0 ? (i = r, r = n) : o != na(r, n) < 0 && (r = n)
                }
                return new K(i, r)
            }
            return new K(n || r, r)
        }

        function rt(e, t, r, n) {
            st(e, new U([tt(e, e.sel.primary(), t, r)], 0), n)
        }

        function nt(e, t, r) {
            for (var n = [], i = 0; i < e.sel.ranges.length; i++) n[i] = tt(e, e.sel.ranges[i], t[i], null);
            var o = $(n, e.sel.primIndex);
            st(e, o, r)
        }

        function it(e, t, r, n) {
            var i = e.sel.ranges.slice(0);
            i[t] = r, st(e, $(i, e.sel.primIndex), n)
        }

        function ot(e, t, r, n) {
            st(e, Y(t, r), n)
        }

        function at(e, t) {
            var r = {
                ranges: t.ranges,
                update: function(t) {
                    this.ranges = [];
                    for (var r = 0; r < t.length; r++) this.ranges[r] = new K(Z(e, t[r].anchor), Z(e, t[r].head))
                }
            };
            return $a(e, "beforeSelectionChange", e, r), e.cm && $a(e.cm, "beforeSelectionChange", e.cm, r), r.ranges != t.ranges ? $(r.ranges, r.ranges.length - 1) : t
        }

        function lt(e, t, r) {
            var n = e.history.done,
                i = Ji(n);
            i && i.ranges ? (n[n.length - 1] = t, ut(e, t, r)) : st(e, t, r)
        }

        function st(e, t, r) {
            ut(e, t, r), zi(e, e.sel, e.cm ? e.cm.curOp.id : 0 / 0, r)
        }

        function ut(e, t, r) {
            ($i(e, "beforeSelectionChange") || e.cm && $i(e.cm, "beforeSelectionChange")) && (t = at(e, t));
            var n = na(t.primary().head, e.sel.primary().head) < 0 ? -1 : 1;
            ct(e, dt(e, t, n, !0)), r && r.scroll === !1 || !e.cm || an(e.cm)
        }

        function ct(e, t) {
            t.equals(e.sel) || (e.sel = t, e.cm && (e.cm.curOp.updateInput = e.cm.curOp.selectionChanged = !0, Ki(e.cm)), Gi(e, "cursorActivity", e))
        }

        function ft(e) {
            ct(e, dt(e, e.sel, null, !1), Ja)
        }

        function dt(e, t, r, n) {
            for (var i, o = 0; o < t.ranges.length; o++) {
                var a = t.ranges[o],
                    l = ht(e, a.anchor, r, n),
                    s = ht(e, a.head, r, n);
                (i || l != a.anchor || s != a.head) && (i || (i = t.ranges.slice(0, o)), i[o] = new K(l, s))
            }
            return i ? $(i, t.primIndex) : t
        }

        function ht(e, t, r, n) {
            var i = !1,
                o = t,
                a = r || 1;
            e.cantEdit = !1;
            e: for (;;) {
                var l = yi(e, o.line);
                if (l.markedSpans)
                    for (var s = 0; s < l.markedSpans.length; ++s) {
                        var u = l.markedSpans[s],
                            c = u.marker;
                        if ((null == u.from || (c.inclusiveLeft ? u.from <= o.ch : u.from < o.ch)) && (null == u.to || (c.inclusiveRight ? u.to >= o.ch : u.to > o.ch))) {
                            if (n && ($a(c, "beforeCursorEnter"), c.explicitlyCleared)) {
                                if (l.markedSpans) {
                                    --s;
                                    continue
                                }
                                break
                            }
                            if (!c.atomic) continue;
                            var f = c.find(0 > a ? -1 : 1);
                            if (0 == na(f, o) && (f.ch += a, f.ch < 0 ? f = f.line > e.first ? Z(e, ra(f.line - 1)) : null : f.ch > l.text.length && (f = f.line < e.first + e.size - 1 ? ra(f.line + 1, 0) : null), !f)) {
                                if (i) return n ? (e.cantEdit = !0, ra(e.first, 0)) : ht(e, t, r, !0);
                                i = !0, f = t, a = -a
                            }
                            o = f;
                            continue e
                        }
                    }
                return o
            }
        }

        function pt(e) {
            for (var t = e.display, r = e.doc, n = document.createDocumentFragment(), i = document.createDocumentFragment(), o = 0; o < r.sel.ranges.length; o++) {
                var a = r.sel.ranges[o],
                    l = a.empty();
                (l || e.options.showCursorWhenSelecting) && mt(e, a, n), l || gt(e, a, i)
            }
            if (e.options.moveInputWithCursor) {
                var s = Rt(e, r.sel.primary().head, "div"),
                    u = t.wrapper.getBoundingClientRect(),
                    c = t.lineDiv.getBoundingClientRect(),
                    f = Math.max(0, Math.min(t.wrapper.clientHeight - 10, s.top + c.top - u.top)),
                    d = Math.max(0, Math.min(t.wrapper.clientWidth - 10, s.left + c.left - u.left));
                t.inputDiv.style.top = f + "px", t.inputDiv.style.left = d + "px"
            }
            uo(t.cursorDiv, n), uo(t.selectionDiv, i)
        }

        function mt(e, t, r) {
            var n = Rt(e, t.head, "div"),
                i = r.appendChild(lo("div", " ", "CodeMirror-cursor"));
            if (i.style.left = n.left + "px", i.style.top = n.top + "px", i.style.height = Math.max(0, n.bottom - n.top) * e.options.cursorHeight + "px", n.other) {
                var o = r.appendChild(lo("div", " ", "CodeMirror-cursor CodeMirror-secondarycursor"));
                o.style.display = "", o.style.left = n.other.left + "px", o.style.top = n.other.top + "px", o.style.height = .85 * (n.other.bottom - n.other.top) + "px"
            }
        }

        function gt(e, t, r) {
            function n(e, t, r, n) {
                0 > t && (t = 0), t = Math.round(t), n = Math.round(n), l.appendChild(lo("div", null, "CodeMirror-selected", "position: absolute; left: " + e + "px; top: " + t + "px; width: " + (null == r ? c - e : r) + "px; height: " + (n - t) + "px"))
            }

            function i(t, r, i) {
                function o(r, n) {
                    return Bt(e, ra(t, r), "div", l, n)
                }
                var l = yi(a, t),
                    s = l.text.length,
                    f, d;
                return wo(Si(l), r || 0, null == i ? s : i, function(e, t, a) {
                    var l = o(e, "left"),
                        h, p, m;
                    if (e == t) h = l, p = m = l.left;
                    else {
                        if (h = o(t - 1, "right"), "rtl" == a) {
                            var g = l;
                            l = h, h = g
                        }
                        p = l.left, m = h.right
                    }
                    null == r && 0 == e && (p = u), h.top - l.top > 3 && (n(p, l.top, null, l.bottom), p = u, l.bottom < h.top && n(p, l.bottom, null, h.top)), null == i && t == s && (m = c), (!f || l.top < f.top || l.top == f.top && l.left < f.left) && (f = l), (!d || h.bottom > d.bottom || h.bottom == d.bottom && h.right > d.right) && (d = h), u + 1 > p && (p = u), n(p, h.top, m - p, h.bottom)
                }), {
                    start: f,
                    end: d
                }
            }
            var o = e.display,
                a = e.doc,
                l = document.createDocumentFragment(),
                s = Lt(e.display),
                u = s.left,
                c = o.lineSpace.offsetWidth - s.right,
                f = t.from(),
                d = t.to();
            if (f.line == d.line) i(f.line, f.ch, d.ch);
            else {
                var h = yi(a, f.line),
                    p = yi(a, d.line),
                    m = Bn(h) == Bn(p),
                    g = i(f.line, f.ch, m ? h.text.length + 1 : null).end,
                    v = i(d.line, m ? 0 : null, d.ch).start;
                m && (g.top < v.top - 2 ? (n(g.right, g.top, null, g.bottom), n(u, v.top, v.left, v.bottom)) : n(g.right, g.top, v.left - g.right, g.bottom)), g.bottom < v.top && n(u, g.bottom, null, v.top)
            }
            r.appendChild(l)
        }

        function vt(e) {
            if (e.state.focused) {
                var t = e.display;
                clearInterval(t.blinker);
                var r = !0;
                t.cursorDiv.style.visibility = "", e.options.cursorBlinkRate > 0 && (t.blinker = setInterval(function() {
                    t.cursorDiv.style.visibility = (r = !r) ? "" : "hidden"
                }, e.options.cursorBlinkRate))
            }
        }

        function yt(e, t) {
            e.doc.mode.startState && e.doc.frontier < e.display.viewTo && e.state.highlight.set(t, io(bt, e))
        }

        function bt(e) {
            var t = e.doc;
            if (t.frontier < t.first && (t.frontier = t.first), !(t.frontier >= e.display.viewTo)) {
                var r = +new Date + e.options.workTime,
                    n = La(t.mode, xt(e, t.frontier));
                Xt(e, function() {
                    t.iter(t.frontier, Math.min(t.first + t.size, e.display.viewTo + 500), function(i) {
                        if (t.frontier >= e.display.viewFrom) {
                            var o = i.styles,
                                a = ti(e, i, n, !0);
                            i.styles = a.styles, a.classes ? i.styleClasses = a.classes : i.styleClasses && (i.styleClasses = null);
                            for (var l = !o || o.length != i.styles.length, s = 0; !l && s < o.length; ++s) l = o[s] != i.styles[s];
                            l && nr(e, t.frontier, "text"), i.stateAfter = La(t.mode, n)
                        } else ni(e, i.text, n), i.stateAfter = t.frontier % 5 == 0 ? La(t.mode, n) : null;
                        return ++t.frontier, +new Date > r ? (yt(e, e.options.workDelay), !0) : void 0
                    })
                })
            }
        }

        function wt(e, t, r) {
            for (var n, i, o = e.doc, a = r ? -1 : t - (e.doc.mode.innerMode ? 1e3 : 100), l = t; l > a; --l) {
                if (l <= o.first) return o.first;
                var s = yi(o, l - 1);
                if (s.stateAfter && (!r || l <= o.frontier)) return l;
                var u = rl(s.text, null, e.options.tabSize);
                (null == i || n > u) && (i = l - 1, n = u)
            }
            return i
        }

        function xt(e, t, r) {
            var n = e.doc,
                i = e.display;
            if (!n.mode.startState) return !0;
            var o = wt(e, t, r),
                a = o > n.first && yi(n, o - 1).stateAfter;
            return a = a ? La(n.mode, a) : Sa(n.mode), n.iter(o, t, function(r) {
                ni(e, r.text, a);
                var l = o == t - 1 || o % 5 == 0 || o >= i.viewFrom && o < i.viewTo;
                r.stateAfter = l ? La(n.mode, a) : null, ++o
            }), r && (n.frontier = o), a
        }

        function kt(e) {
            return e.lineSpace.offsetTop
        }

        function Ct(e) {
            return e.mover.offsetHeight - e.lineSpace.offsetHeight
        }

        function Lt(e) {
            if (e.cachedPaddingH) return e.cachedPaddingH;
            var t = uo(e.measure, lo("pre", "x")),
                r = window.getComputedStyle ? window.getComputedStyle(t) : t.currentStyle,
                n = {
                    left: parseInt(r.paddingLeft),
                    right: parseInt(r.paddingRight)
                };
            return isNaN(n.left) || isNaN(n.right) || (e.cachedPaddingH = n), n
        }

        function St(e, t, r) {
            var n = e.options.lineWrapping,
                i = n && e.display.scroller.clientWidth;
            if (!t.measure.heights || n && t.measure.width != i) {
                var o = t.measure.heights = [];
                if (n) {
                    t.measure.width = i;
                    for (var a = t.text.firstChild.getClientRects(), l = 0; l < a.length - 1; l++) {
                        var s = a[l],
                            u = a[l + 1];
                        Math.abs(s.bottom - u.bottom) > 2 && o.push((s.bottom + u.top) / 2 - r.top)
                    }
                }
                o.push(r.bottom - r.top)
            }
        }

        function Mt(e, t, r) {
            if (e.line == t) return {
                map: e.measure.map,
                cache: e.measure.cache
            };
            for (var n = 0; n < e.rest.length; n++)
                if (e.rest[n] == t) return {
                    map: e.measure.maps[n],
                    cache: e.measure.caches[n]
                };
            for (var n = 0; n < e.rest.length; n++)
                if (ki(e.rest[n]) > r) return {
                    map: e.measure.maps[n],
                    cache: e.measure.caches[n],
                    before: !0
                }
        }

        function Tt(e, t) {
            t = Bn(t);
            var r = ki(t),
                n = e.display.externalMeasured = new er(e.doc, t, r);
            n.lineN = r;
            var i = n.built = oi(e, n);
            return n.text = i.pre, uo(e.display.lineMeasure, i.pre), n
        }

        function At(e, t, r, n) {
            return Ot(e, Ht(e, t), r, n)
        }

        function Nt(e, t) {
            if (t >= e.display.viewFrom && t < e.display.viewTo) return e.display.view[or(e, t)];
            var r = e.display.externalMeasured;
            return r && t >= r.lineN && t < r.lineN + r.size ? r : void 0
        }

        function Ht(e, t) {
            var r = ki(t),
                n = Nt(e, r);
            n && !n.text ? n = null : n && n.changes && O(e, n, r, N(e)), n || (n = Tt(e, t));
            var i = Mt(n, t, r);
            return {
                line: t,
                view: n,
                rect: null,
                map: i.map,
                cache: i.cache,
                before: i.before,
                hasHeights: !1
            }
        }

        function Ot(e, t, r, n) {
            t.before && (r = -1);
            var i = r + (n || ""),
                o;
            return t.cache.hasOwnProperty(i) ? o = t.cache[i] : (t.rect || (t.rect = t.view.text.getBoundingClientRect()), t.hasHeights || (St(e, t.view, t.rect), t.hasHeights = !0), o = zt(e, t, r, n), o.bogus || (t.cache[i] = o)), {
                left: o.left,
                right: o.right,
                top: o.top,
                bottom: o.bottom
            }
        }

        function zt(e, t, r, n) {
            for (var i = t.map, o, a, l, s, u = 0; u < i.length; u += 3) {
                var c = i[u],
                    f = i[u + 1];
                if (c > r ? (a = 0, l = 1, s = "left") : f > r ? (a = r - c, l = a + 1) : (u == i.length - 3 || r == f && i[u + 3] > r) && (l = f - c, a = l - 1, r >= f && (s = "right")), null != a) {
                    if (o = i[u + 2], c == f && n == (o.insertLeft ? "left" : "right") && (s = n), "left" == n && 0 == a)
                        for (; u && i[u - 2] == i[u - 3] && i[u - 1].insertLeft;) o = i[(u -= 3) + 2], s = "left";
                    if ("right" == n && a == f - c)
                        for (; u < i.length - 3 && i[u + 3] == i[u + 4] && !i[u + 5].insertLeft;) o = i[(u += 3) + 2], s = "right";
                    break
                }
            }
            var d;
            if (3 == o.nodeType) {
                for (; a && ao(t.line.text.charAt(c + a));) --a;
                for (; f > c + l && ao(t.line.text.charAt(c + l));) ++l;
                if (Io && 0 == a && l == f - c) d = o.parentNode.getBoundingClientRect();
                else if (_o && e.options.lineWrapping) {
                    var h = sl(o, a, l).getClientRects();
                    d = h.length ? h["right" == n ? h.length - 1 : 0] : ia
                } else d = sl(o, a, l).getBoundingClientRect()
            } else {
                a > 0 && (s = n = "right");
                var h;
                d = e.options.lineWrapping && (h = o.getClientRects()).length > 1 ? h["right" == n ? h.length - 1 : 0] : o.getBoundingClientRect()
            }
            if (Io && !a && (!d || !d.left && !d.right)) {
                var p = o.parentNode.getClientRects()[0];
                d = p ? {
                    left: p.left,
                    right: p.left + Kt(e.display),
                    top: p.top,
                    bottom: p.bottom
                } : ia
            }
            for (var m, g = (d.bottom + d.top) / 2 - t.rect.top, v = t.view.measure.heights, u = 0; u < v.length - 1 && !(g < v[u]); u++);
            m = u ? v[u - 1] : 0, g = v[u];
            var y = {
                left: ("right" == s ? d.right : d.left) - t.rect.left,
                right: ("left" == s ? d.left : d.right) - t.rect.left,
                top: m,
                bottom: g
            };
            return d.left || d.right || (y.bogus = !0), y
        }

        function Wt(e) {
            if (e.measure && (e.measure.cache = {}, e.measure.heights = null, e.rest))
                for (var t = 0; t < e.rest.length; t++) e.measure.caches[t] = {}
        }

        function Et(e) {
            e.display.externalMeasure = null, so(e.display.lineMeasure);
            for (var t = 0; t < e.display.view.length; t++) Wt(e.display.view[t])
        }

        function It(e) {
            Et(e), e.display.cachedCharWidth = e.display.cachedTextHeight = e.display.cachedPaddingH = null, e.options.lineWrapping || (e.display.maxLineChanged = !0), e.display.lineNumChars = null
        }

        function Dt() {
            return window.pageXOffset || (document.documentElement || document.body).scrollLeft
        }

        function Pt() {
            return window.pageYOffset || (document.documentElement || document.body).scrollTop
        }

        function _t(e, t, r, n) {
            if (t.widgets)
                for (var i = 0; i < t.widgets.length; ++i)
                    if (t.widgets[i].above) {
                        var o = Kn(t.widgets[i]);
                        r.top += o, r.bottom += o
                    }
            if ("line" == n) return r;
            n || (n = "local");
            var a = Li(t);
            if ("local" == n ? a += kt(e.display) : a -= e.display.viewOffset, "page" == n || "window" == n) {
                var l = e.display.lineSpace.getBoundingClientRect();
                a += l.top + ("window" == n ? 0 : Pt());
                var s = l.left + ("window" == n ? 0 : Dt());
                r.left += s, r.right += s
            }
            return r.top += a, r.bottom += a, r
        }

        function Ft(e, t, r) {
            if ("div" == r) return t;
            var n = t.left,
                i = t.top;
            if ("page" == r) n -= Dt(), i -= Pt();
            else if ("local" == r || !r) {
                var o = e.display.sizer.getBoundingClientRect();
                n += o.left, i += o.top
            }
            var a = e.display.lineSpace.getBoundingClientRect();
            return {
                left: n - a.left,
                top: i - a.top
            }
        }

        function Bt(e, t, r, n, i) {
            return n || (n = yi(e.doc, t.line)), _t(e, n, At(e, n, t.ch, i), r)
        }

        function Rt(e, t, r, n, i) {
            function o(t, o) {
                var a = Ot(e, i, t, o ? "right" : "left");
                return o ? a.left = a.right : a.right = a.left, _t(e, n, a, r)
            }

            function a(e, t) {
                var r = l[t],
                    n = r.level % 2;
                return e == xo(r) && t && r.level < l[t - 1].level ? (r = l[--t], e = ko(r) - (r.level % 2 ? 0 : 1), n = !0) : e == ko(r) && t < l.length - 1 && r.level < l[t + 1].level && (r = l[++t], e = xo(r) - r.level % 2, n = !1), n && e == r.to && e > r.from ? o(e - 1) : o(e, n)
            }
            n = n || yi(e.doc, t.line), i || (i = Ht(e, n));
            var l = Si(n),
                s = t.ch;
            if (!l) return o(s);
            var u = Ao(l, s),
                c = a(s, u);
            return null != vl && (c.other = a(s, vl)), c
        }

        function jt(e, t) {
            var r = 0,
                t = Z(e.doc, t);
            e.options.lineWrapping || (r = Kt(e.display) * t.ch);
            var n = yi(e.doc, t.line),
                i = Li(n) + kt(e.display);
            return {
                left: r,
                right: r,
                top: i,
                bottom: i + n.height
            }
        }

        function Vt(e, t, r, n) {
            var i = ra(e, t);
            return i.xRel = n, r && (i.outside = !0), i
        }

        function Gt(e, t, r) {
            var n = e.doc;
            if (r += e.display.viewOffset, 0 > r) return Vt(n.first, 0, !0, -1);
            var i = Ci(n, r),
                o = n.first + n.size - 1;
            if (i > o) return Vt(n.first + n.size - 1, yi(n, o).text.length, !0, 1);
            0 > t && (t = 0);
            for (var a = yi(n, i);;) {
                var l = qt(e, a, i, t, r),
                    s = _n(a),
                    u = s && s.find(0, !0);
                if (!s || !(l.ch > u.from.ch || l.ch == u.from.ch && l.xRel > 0)) return l;
                i = ki(a = u.to.line)
            }
        }

        function qt(e, t, r, n, i) {
            function o(n) {
                var i = Rt(e, ra(r, n), "line", t, u);
                return l = !0, a > i.bottom ? i.left - s : a < i.top ? i.left + s : (l = !1, i.left)
            }
            var a = i - Li(t),
                l = !1,
                s = 2 * e.display.wrapper.clientWidth,
                u = Ht(e, t),
                c = Si(t),
                f = t.text.length,
                d = Co(t),
                h = Lo(t),
                p = o(d),
                m = l,
                g = o(h),
                v = l;
            if (n > g) return Vt(r, h, v, 1);
            for (;;) {
                if (c ? h == d || h == Ho(t, d, 1) : 1 >= h - d) {
                    for (var y = p > n || g - n >= n - p ? d : h, b = n - (y == d ? p : g); ao(t.text.charAt(y));) ++y;
                    var w = Vt(r, y, y == d ? m : v, -1 > b ? -1 : b > 1 ? 1 : 0);
                    return w
                }
                var x = Math.ceil(f / 2),
                    k = d + x;
                if (c) {
                    k = d;
                    for (var C = 0; x > C; ++C) k = Ho(t, k, 1)
                }
                var L = o(k);
                L > n ? (h = k, g = L, (v = l) && (g += 1e3), f = x) : (d = k, p = L, m = l, f -= x)
            }
        }

        function Ut(e) {
            if (null != e.cachedTextHeight) return e.cachedTextHeight;
            if (null == oa) {
                oa = lo("pre");
                for (var t = 0; 49 > t; ++t) oa.appendChild(document.createTextNode("x")), oa.appendChild(lo("br"));
                oa.appendChild(document.createTextNode("x"))
            }
            uo(e.measure, oa);
            var r = oa.offsetHeight / 50;
            return r > 3 && (e.cachedTextHeight = r), so(e.measure), r || 1
        }

        function Kt(e) {
            if (null != e.cachedCharWidth) return e.cachedCharWidth;
            var t = lo("span", "xxxxxxxxxx"),
                r = lo("pre", [t]);
            uo(e.measure, r);
            var n = t.getBoundingClientRect(),
                i = (n.right - n.left) / 10;
            return i > 2 && (e.cachedCharWidth = i), i || 10
        }

        function $t(e) {
            e.curOp = {
                viewChanged: !1,
                startHeight: e.doc.height,
                forceUpdate: !1,
                updateInput: null,
                typing: !1,
                changeObjs: null,
                cursorActivityHandlers: null,
                selectionChanged: !1,
                updateMaxLine: !1,
                scrollLeft: null,
                scrollTop: null,
                scrollToPos: null,
                id: ++aa
            }, Xa++ || (Ya = [])
        }

        function Yt(e) {
            var t = e.curOp,
                r = e.doc,
                n = e.display;
            if (e.curOp = null, t.updateMaxLine && h(e), t.viewChanged || t.forceUpdate || null != t.scrollTop || t.scrollToPos && (t.scrollToPos.from.line < n.viewFrom || t.scrollToPos.to.line >= n.viewTo) || n.maxLineChanged && e.options.lineWrapping) {
                var i = k(e, {
                    top: t.scrollTop,
                    ensure: t.scrollToPos
                }, t.forceUpdate);
                e.display.scroller.offsetHeight && (e.doc.scrollTop = e.display.scroller.scrollTop)
            }
            if (!i && t.selectionChanged && pt(e), i || t.startHeight == e.doc.height || g(e), null != t.scrollTop && n.scroller.scrollTop != t.scrollTop) {
                var o = Math.max(0, Math.min(n.scroller.scrollHeight - n.scroller.clientHeight, t.scrollTop));
                n.scroller.scrollTop = n.scrollbarV.scrollTop = r.scrollTop = o
            }
            if (null != t.scrollLeft && n.scroller.scrollLeft != t.scrollLeft) {
                var a = Math.max(0, Math.min(n.scroller.scrollWidth - n.scroller.clientWidth, t.scrollLeft));
                n.scroller.scrollLeft = n.scrollbarH.scrollLeft = r.scrollLeft = a, y(e)
            }
            if (t.scrollToPos) {
                var l = tn(e, Z(e.doc, t.scrollToPos.from), Z(e.doc, t.scrollToPos.to), t.scrollToPos.margin);
                t.scrollToPos.isCursor && e.state.focused && en(e, l)
            }
            t.selectionChanged && vt(e), e.state.focused && t.updateInput && dr(e, t.typing);
            var s = t.maybeHiddenMarkers,
                u = t.maybeUnhiddenMarkers;
            if (s)
                for (var c = 0; c < s.length; ++c) s[c].lines.length || $a(s[c], "hide");
            if (u)
                for (var c = 0; c < u.length; ++c) u[c].lines.length && $a(u[c], "unhide");
            var f;
            if (--Xa || (f = Ya, Ya = null), t.changeObjs && $a(e, "changes", e, t.changeObjs), f)
                for (var c = 0; c < f.length; ++c) f[c]();
            if (t.cursorActivityHandlers)
                for (var c = 0; c < t.cursorActivityHandlers.length; c++) t.cursorActivityHandlers[c](e)
        }

        function Xt(e, t) {
            if (e.curOp) return t();
            $t(e);
            try {
                return t()
            } finally {
                Yt(e)
            }
        }

        function Zt(e, t) {
            return function() {
                if (e.curOp) return t.apply(e, arguments);
                $t(e);
                try {
                    return t.apply(e, arguments)
                } finally {
                    Yt(e)
                }
            }
        }

        function Qt(e) {
            return function() {
                if (this.curOp) return e.apply(this, arguments);
                $t(this);
                try {
                    return e.apply(this, arguments)
                } finally {
                    Yt(this)
                }
            }
        }

        function Jt(e) {
            return function() {
                var t = this.cm;
                if (!t || t.curOp) return e.apply(this, arguments);
                $t(t);
                try {
                    return e.apply(this, arguments)
                } finally {
                    Yt(t)
                }
            }
        }

        function er(e, t, r) {
            this.line = t, this.rest = Rn(t), this.size = this.rest ? ki(Ji(this.rest)) - r + 1 : 1, this.node = this.text = null, this.hidden = Gn(e, t)
        }

        function tr(e, t, r) {
            for (var n = [], i, o = t; r > o; o = i) {
                var a = new er(e.doc, yi(e.doc, o), o);
                i = o + a.size, n.push(a)
            }
            return n
        }

        function rr(e, t, r, n) {
            null == t && (t = e.doc.first), null == r && (r = e.doc.first + e.doc.size), n || (n = 0);
            var i = e.display;
            if (n && r < i.viewTo && (null == i.updateLineNumbers || i.updateLineNumbers > t) && (i.updateLineNumbers = t), e.curOp.viewChanged = !0, t >= i.viewTo) ta && jn(e.doc, t) < i.viewTo && ir(e);
            else if (r <= i.viewFrom) ta && Vn(e.doc, r + n) > i.viewFrom ? ir(e) : (i.viewFrom += n, i.viewTo += n);
            else if (t <= i.viewFrom && r >= i.viewTo) ir(e);
            else if (t <= i.viewFrom) {
                var o = ar(e, r, r + n, 1);
                o ? (i.view = i.view.slice(o.index), i.viewFrom = o.lineN, i.viewTo += n) : ir(e)
            } else if (r >= i.viewTo) {
                var o = ar(e, t, t, -1);
                o ? (i.view = i.view.slice(0, o.index), i.viewTo = o.lineN) : ir(e)
            } else {
                var a = ar(e, t, t, -1),
                    l = ar(e, r, r + n, 1);
                a && l ? (i.view = i.view.slice(0, a.index).concat(tr(e, a.lineN, l.lineN)).concat(i.view.slice(l.index)), i.viewTo += n) : ir(e)
            }
            var s = i.externalMeasured;
            s && (r < s.lineN ? s.lineN += n : t < s.lineN + s.size && (i.externalMeasured = null))
        }

        function nr(e, t, r) {
            e.curOp.viewChanged = !0;
            var n = e.display,
                i = e.display.externalMeasured;
            if (i && t >= i.lineN && t < i.lineN + i.size && (n.externalMeasured = null), !(t < n.viewFrom || t >= n.viewTo)) {
                var o = n.view[or(e, t)];
                if (null != o.node) {
                    var a = o.changes || (o.changes = []); - 1 == eo(a, r) && a.push(r)
                }
            }
        }

        function ir(e) {
            e.display.viewFrom = e.display.viewTo = e.doc.first, e.display.view = [], e.display.viewOffset = 0
        }

        function or(e, t) {
            if (t >= e.display.viewTo) return null;
            if (t -= e.display.viewFrom, 0 > t) return null;
            for (var r = e.display.view, n = 0; n < r.length; n++)
                if (t -= r[n].size, 0 > t) return n
        }

        function ar(e, t, r, n) {
            var i = or(e, t),
                o, a = e.display.view;
            if (!ta) return {
                index: i,
                lineN: r
            };
            for (var l = 0, s = e.display.viewFrom; i > l; l++) s += a[l].size;
            if (s != t) {
                if (n > 0) {
                    if (i == a.length - 1) return null;
                    o = s + a[i].size - t, i++
                } else o = s - t;
                t += o, r += o
            }
            for (; jn(e.doc, r) != r;) {
                if (i == (0 > n ? 0 : a.length - 1)) return null;
                r += n * a[i - (0 > n ? 1 : 0)].size, i += n
            }
            return {
                index: i,
                lineN: r
            }
        }

        function lr(e, t, r) {
            var n = e.display,
                i = n.view;
            0 == i.length || t >= n.viewTo || r <= n.viewFrom ? (n.view = tr(e, t, r), n.viewFrom = t) : (n.viewFrom > t ? n.view = tr(e, t, n.viewFrom).concat(n.view) : n.viewFrom < t && (n.view = n.view.slice(or(e, t))), n.viewFrom = t, n.viewTo < r ? n.view = n.view.concat(tr(e, n.viewTo, r)) : n.viewTo > r && (n.view = n.view.slice(0, or(e, r)))), n.viewTo = r
        }

        function sr(e) {
            for (var t = e.display.view, r = 0, n = 0; n < t.length; n++) {
                var i = t[n];
                i.hidden || i.node && !i.changes || ++r
            }
            return r
        }

        function ur(e) {
            e.display.pollingFast || e.display.poll.set(e.options.pollInterval, function() {
                fr(e), e.state.focused && ur(e)
            })
        }

        function cr(e) {
            function t() {
                var n = fr(e);
                n || r ? (e.display.pollingFast = !1, ur(e)) : (r = !0, e.display.poll.set(60, t))
            }
            var r = !1;
            e.display.pollingFast = !0, e.display.poll.set(20, t)
        }

        function fr(e) {
            var t = e.display.input,
                r = e.display.prevInput,
                n = e.doc;
            if (!e.state.focused || pl(t) && !r || mr(e) || e.options.disableInput) return !1;
            e.state.pasteIncoming && e.state.fakedLastChar && (t.value = t.value.substring(0, t.value.length - 1), e.state.fakedLastChar = !1);
            var i = t.value;
            if (i == r && !e.somethingSelected()) return !1;
            if (_o && !Io && e.display.inputHasSelection === i) return dr(e), !1;
            var o = !e.curOp;
            o && $t(e), e.display.shift = !1;
            for (var a = 0, l = Math.min(r.length, i.length); l > a && r.charCodeAt(a) == i.charCodeAt(a);) ++a;
            for (var s = i.slice(a), u = hl(s), c = e.state.pasteIncoming && u.length > 1 && n.sel.ranges.length == u.length, f = n.sel.ranges.length - 1; f >= 0; f--) {
                var d = n.sel.ranges[f],
                    h = d.from(),
                    p = d.to();
                a < r.length ? h = ra(h.line, h.ch - (r.length - a)) : e.state.overwrite && d.empty() && !e.state.pasteIncoming && (p = ra(p.line, Math.min(yi(n, p.line).text.length, p.ch + Ji(u).length)));
                var m = e.curOp.updateInput,
                    g = {
                        from: h,
                        to: p,
                        text: c ? [u[f]] : u,
                        origin: e.state.pasteIncoming ? "paste" : e.state.cutIncoming ? "cut" : "+input"
                    };
                if (Kr(e.doc, g), Gi(e, "inputRead", e, g), s && !e.state.pasteIncoming && e.options.electricChars && e.options.smartIndent && d.head.ch < 100 && (!f || n.sel.ranges[f - 1].head.line != d.head.line)) {
                    var v = e.getModeAt(d.head);
                    if (v.electricChars) {
                        for (var y = 0; y < v.electricChars.length; y++)
                            if (s.indexOf(v.electricChars.charAt(y)) > -1) {
                                sn(e, d.head.line, "smart");
                                break
                            }
                    } else if (v.electricInput) {
                        var b = ma(g);
                        v.electricInput.test(yi(n, b.line).text.slice(0, b.ch)) && sn(e, d.head.line, "smart")
                    }
                }
            }
            return an(e), e.curOp.updateInput = m, e.curOp.typing = !0, i.length > 1e3 || i.indexOf("\n") > -1 ? t.value = e.display.prevInput = "" : e.display.prevInput = i, o && Yt(e), e.state.pasteIncoming = e.state.cutIncoming = !1, !0
        }

        function dr(e, t) {
            var r, n, i = e.doc;
            if (e.somethingSelected()) {
                e.display.prevInput = "";
                var o = i.sel.primary();
                r = ml && (o.to().line - o.from().line > 100 || (n = e.getSelection()).length > 1e3);
                var a = r ? "-" : n || e.getSelection();
                e.display.input.value = a, e.state.focused && il(e.display.input), _o && !Io && (e.display.inputHasSelection = a)
            } else t || (e.display.prevInput = e.display.input.value = "", _o && !Io && (e.display.inputHasSelection = null));
            e.display.inaccurateSelection = r
        }

        function hr(e) {
            "nocursor" == e.options.readOnly || $o && fo() == e.display.input || e.display.input.focus()
        }

        function pr(e) {
            e.state.focused || (hr(e), _r(e))
        }

        function mr(e) {
            return e.options.readOnly || e.doc.cantEdit
        }

        function gr(e) {
            function t() {
                e.state.focused && setTimeout(io(hr, e), 0)
            }

            function r() {
                null == l && (l = setTimeout(function() {
                    l = null, a.cachedCharWidth = a.cachedTextHeight = a.cachedPaddingH = cl = null, e.setSize()
                }, 100))
            }

            function n() {
                co(document.body, a.wrapper) ? setTimeout(n, 5e3) : Ka(window, "resize", r)
            }

            function i(t) {
                Ui(e, t) || qa(t)
            }

            function o(t) {
                if (e.somethingSelected()) a.inaccurateSelection && (a.prevInput = "", a.inaccurateSelection = !1, a.input.value = e.getSelection(), il(a.input));
                else {
                    for (var r = "", n = [], i = 0; i < e.doc.sel.ranges.length; i++) {
                        var o = e.doc.sel.ranges[i].head.line,
                            l = {
                                anchor: ra(o, 0),
                                head: ra(o + 1, 0)
                            };
                        n.push(l), r += e.getRange(l.anchor, l.head)
                    }
                    "cut" == t.type ? e.setSelections(n, null, Ja) : (a.prevInput = "", a.input.value = r, il(a.input))
                }
                "cut" == t.type && (e.state.cutIncoming = !0)
            }
            var a = e.display;
            Ua(a.scroller, "mousedown", Zt(e, br)), Wo ? Ua(a.scroller, "dblclick", Zt(e, function(t) {
                if (!Ui(e, t)) {
                    var r = yr(e, t);
                    if (r && !Lr(e, t) && !vr(e.display, t)) {
                        Va(t);
                        var n = hn(e.doc, r);
                        rt(e.doc, n.anchor, n.head)
                    }
                }
            })) : Ua(a.scroller, "dblclick", function(t) {
                Ui(e, t) || Va(t)
            }), Ua(a.lineSpace, "selectstart", function(e) {
                vr(a, e) || Va(e)
            }), Jo || Ua(a.scroller, "contextmenu", function(t) {
                Br(e, t)
            }), Ua(a.scroller, "scroll", function() {
                a.scroller.clientHeight && (Tr(e, a.scroller.scrollTop), Ar(e, a.scroller.scrollLeft, !0), $a(e, "scroll", e))
            }), Ua(a.scrollbarV, "scroll", function() {
                a.scroller.clientHeight && Tr(e, a.scrollbarV.scrollTop)
            }), Ua(a.scrollbarH, "scroll", function() {
                a.scroller.clientHeight && Ar(e, a.scrollbarH.scrollLeft)
            }), Ua(a.scroller, "mousewheel", function(t) {
                Nr(e, t)
            }), Ua(a.scroller, "DOMMouseScroll", function(t) {
                Nr(e, t)
            }), Ua(a.scrollbarH, "mousedown", t), Ua(a.scrollbarV, "mousedown", t), Ua(a.wrapper, "scroll", function() {
                a.wrapper.scrollTop = a.wrapper.scrollLeft = 0
            });
            var l;
            Ua(window, "resize", r), setTimeout(n, 5e3), Ua(a.input, "keyup", Zt(e, Dr)), Ua(a.input, "input", function() {
                _o && !Io && e.display.inputHasSelection && (e.display.inputHasSelection = null), cr(e)
            }), Ua(a.input, "keydown", Zt(e, Er)), Ua(a.input, "keypress", Zt(e, Pr)), Ua(a.input, "focus", io(_r, e)), Ua(a.input, "blur", io(Fr, e)), e.options.dragDrop && (Ua(a.scroller, "dragstart", function(t) {
                Mr(e, t)
            }), Ua(a.scroller, "dragenter", i), Ua(a.scroller, "dragover", i), Ua(a.scroller, "drop", Zt(e, Sr))), Ua(a.scroller, "paste", function(t) {
                vr(a, t) || (e.state.pasteIncoming = !0, hr(e), cr(e))
            }), Ua(a.input, "paste", function() {
                if (Fo && !e.state.fakedLastChar && !(new Date - e.state.lastMiddleDown < 200)) {
                    var t = a.input.selectionStart,
                        r = a.input.selectionEnd;
                    a.input.value += "$", a.input.selectionStart = t, a.input.selectionEnd = r, e.state.fakedLastChar = !0
                }
                e.state.pasteIncoming = !0, cr(e)
            }), Ua(a.input, "cut", o), Ua(a.input, "copy", o), Go && Ua(a.sizer, "mouseup", function() {
                fo() == a.input && a.input.blur(), hr(e)
            })
        }

        function vr(e, t) {
            for (var r = ji(t); r != e.wrapper; r = r.parentNode)
                if (!r || r.ignoreEvents || r.parentNode == e.sizer && r != e.mover) return !0
        }

        function yr(e, t, r, n) {
            var i = e.display;
            if (!r) {
                var o = ji(t);
                if (o == i.scrollbarH || o == i.scrollbarV || o == i.scrollbarFiller || o == i.gutterFiller) return null
            }
            var a, l, s = i.lineSpace.getBoundingClientRect();
            try {
                a = t.clientX - s.left, l = t.clientY - s.top
            } catch (t) {
                return null
            }
            var u = Gt(e, a, l),
                c;
            if (n && 1 == u.xRel && (c = yi(e.doc, u.line).text).length == u.ch) {
                var f = rl(c, c.length, e.options.tabSize) - c.length;
                u = ra(u.line, Math.max(0, Math.round((a - Lt(e.display).left) / Kt(e.display)) - f))
            }
            return u
        }

        function br(e) {
            if (!Ui(this, e)) {
                var t = this,
                    r = t.display;
                if (r.shift = e.shiftKey, vr(r, e)) return void(Fo || (r.scroller.draggable = !1, setTimeout(function() {
                    r.scroller.draggable = !0
                }, 100)));
                if (!Lr(t, e)) {
                    var n = yr(t, e);
                    switch (window.focus(), Vi(e)) {
                        case 1:
                            n ? wr(t, e, n) : ji(e) == r.scroller && Va(e);
                            break;
                        case 2:
                            Fo && (t.state.lastMiddleDown = +new Date), n && rt(t.doc, n), setTimeout(io(hr, t), 20), Va(e);
                            break;
                        case 3:
                            Jo && Br(t, e)
                    }
                }
            }
        }

        function wr(e, t, r) {
            setTimeout(io(pr, e), 0);
            var n = +new Date,
                i;
            sa && sa.time > n - 400 && 0 == na(sa.pos, r) ? i = "triple" : la && la.time > n - 400 && 0 == na(la.pos, r) ? (i = "double", sa = {
                time: n,
                pos: r
            }) : (i = "single", la = {
                time: n,
                pos: r
            });
            var o = e.doc.sel,
                a = Yo ? t.metaKey : t.ctrlKey;
            e.options.dragDrop && ul && !a && !mr(e) && "single" == i && o.contains(r) > -1 && o.somethingSelected() ? xr(e, t, r) : kr(e, t, r, i, a)
        }

        function xr(e, t, r) {
            var n = e.display,
                i = Zt(e, function(o) {
                    Fo && (n.scroller.draggable = !1), e.state.draggingText = !1, Ka(document, "mouseup", i), Ka(n.scroller, "drop", i), Math.abs(t.clientX - o.clientX) + Math.abs(t.clientY - o.clientY) < 10 && (Va(o), rt(e.doc, r), hr(e), Wo && !Io && setTimeout(function() {
                        document.body.focus(), hr(e)
                    }, 20))
                });
            Fo && (n.scroller.draggable = !0), e.state.draggingText = i, n.scroller.dragDrop && n.scroller.dragDrop(), Ua(document, "mouseup", i), Ua(n.scroller, "drop", i)
        }

        function kr(e, t, r, n, i) {
            function o(t) {
                if (0 != na(m, t))
                    if (m = t, "rect" == n) {
                        for (var i = [], o = e.options.tabSize, a = rl(yi(u, r.line).text, r.ch, o), l = rl(yi(u, t.line).text, t.ch, o), s = Math.min(a, l), h = Math.max(a, l), p = Math.min(r.line, t.line), g = Math.min(e.lastLine(), Math.max(r.line, t.line)); g >= p; p++) {
                            var v = yi(u, p).text,
                                y = Zi(v, s, o);
                            s == h ? i.push(new K(ra(p, y), ra(p, y))) : v.length > y && i.push(new K(ra(p, y), ra(p, Zi(v, h, o))))
                        }
                        i.length || i.push(new K(r, r)), st(u, $(d.ranges.slice(0, f).concat(i), f), el)
                    } else {
                        var b = c,
                            w = b.anchor,
                            x = t;
                        if ("single" != n) {
                            if ("double" == n) var k = hn(u, t);
                            else var k = new K(ra(t.line, 0), Z(u, ra(t.line + 1, 0)));
                            na(k.anchor, w) > 0 ? (x = k.head, w = q(b.from(), k.anchor)) : (x = k.anchor, w = G(b.to(), k.head))
                        }
                        var i = d.ranges.slice(0);
                        i[f] = new K(Z(u, w), x), st(u, $(i, f), el)
                    }
            }

            function a(t) {
                var r = ++y,
                    i = yr(e, t, !0, "rect" == n);
                if (i)
                    if (0 != na(i, m)) {
                        pr(e), o(i);
                        var l = v(s, u);
                        (i.line >= l.to || i.line < l.from) && setTimeout(Zt(e, function() {
                            y == r && a(t)
                        }), 150)
                    } else {
                        var c = t.clientY < g.top ? -20 : t.clientY > g.bottom ? 20 : 0;
                        c && setTimeout(Zt(e, function() {
                            y == r && (s.scroller.scrollTop += c, a(t))
                        }), 50)
                    }
            }

            function l(t) {
                y = 1 / 0, Va(t), hr(e), Ka(document, "mousemove", b), Ka(document, "mouseup", w), u.history.lastSelOrigin = null
            }
            var s = e.display,
                u = e.doc;
            Va(t);
            var c, f, d = u.sel;
            if (i && !t.shiftKey ? (f = u.sel.contains(r), c = f > -1 ? u.sel.ranges[f] : new K(r, r)) : c = u.sel.primary(), t.altKey) n = "rect", i || (c = new K(r, r)), r = yr(e, t, !0, !0), f = -1;
            else if ("double" == n) {
                var h = hn(u, r);
                c = e.display.shift || u.extend ? tt(u, c, h.anchor, h.head) : h
            } else if ("triple" == n) {
                var p = new K(ra(r.line, 0), Z(u, ra(r.line + 1, 0)));
                c = e.display.shift || u.extend ? tt(u, c, p.anchor, p.head) : p
            } else c = tt(u, c, r);
            i ? f > -1 ? it(u, f, c, el) : (f = u.sel.ranges.length, st(u, $(u.sel.ranges.concat([c]), f), {
                scroll: !1,
                origin: "*mouse"
            })) : (f = 0, st(u, new U([c], 0), el), d = u.sel);
            var m = r,
                g = s.wrapper.getBoundingClientRect(),
                y = 0,
                b = Zt(e, function(e) {
                    (_o && !Do ? e.buttons : Vi(e)) ? a(e): l(e)
                }),
                w = Zt(e, l);
            Ua(document, "mousemove", b), Ua(document, "mouseup", w)
        }

        function Cr(e, t, r, n, i) {
            try {
                var o = t.clientX,
                    a = t.clientY
            } catch (t) {
                return !1
            }
            if (o >= Math.floor(e.display.gutters.getBoundingClientRect().right)) return !1;
            n && Va(t);
            var l = e.display,
                s = l.lineDiv.getBoundingClientRect();
            if (a > s.bottom || !$i(e, r)) return Ri(t);
            a -= s.top - l.viewOffset;
            for (var u = 0; u < e.options.gutters.length; ++u) {
                var c = l.gutters.childNodes[u];
                if (c && c.getBoundingClientRect().right >= o) {
                    var f = Ci(e.doc, a),
                        d = e.options.gutters[u];
                    return i(e, r, e, f, d, t), Ri(t)
                }
            }
        }

        function Lr(e, t) {
            return Cr(e, t, "gutterClick", !0, Gi)
        }

        function Sr(e) {
            var t = this;
            if (!Ui(t, e) && !vr(t.display, e)) {
                Va(e), _o && (ua = +new Date);
                var r = yr(t, e, !0),
                    n = e.dataTransfer.files;
                if (r && !mr(t))
                    if (n && n.length && window.FileReader && window.File)
                        for (var i = n.length, o = Array(i), a = 0, l = function(e, n) {
                                var l = new FileReader;
                                l.onload = Zt(t, function() {
                                    if (o[n] = l.result, ++a == i) {
                                        r = Z(t.doc, r);
                                        var e = {
                                            from: r,
                                            to: r,
                                            text: hl(o.join("\n")),
                                            origin: "paste"
                                        };
                                        Kr(t.doc, e), lt(t.doc, Y(r, ma(e)))
                                    }
                                }), l.readAsText(e)
                            }, s = 0; i > s; ++s) l(n[s], s);
                    else {
                        if (t.state.draggingText && t.doc.sel.contains(r) > -1) return t.state.draggingText(e), void setTimeout(io(hr, t), 20);
                        try {
                            var o = e.dataTransfer.getData("Text");
                            if (o) {
                                var u = t.state.draggingText && t.listSelections();
                                if (ut(t.doc, Y(r, r)), u)
                                    for (var s = 0; s < u.length; ++s) Jr(t.doc, "", u[s].anchor, u[s].head, "drag");
                                t.replaceSelection(o, "around", "paste"), hr(t)
                            }
                        } catch (e) {}
                    }
            }
        }

        function Mr(e, t) {
            if (_o && (!e.state.draggingText || +new Date - ua < 100)) return void qa(t);
            if (!Ui(e, t) && !vr(e.display, t) && (t.dataTransfer.setData("Text", e.getSelection()), t.dataTransfer.setDragImage && !Vo)) {
                var r = lo("img", null, null, "position: fixed; left: 0; top: 0;");
                r.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", jo && (r.width = r.height = 1, e.display.wrapper.appendChild(r), r._top = r.offsetTop), t.dataTransfer.setDragImage(r, 0, 0), jo && r.parentNode.removeChild(r)
            }
        }

        function Tr(e, t) {
            Math.abs(e.doc.scrollTop - t) < 2 || (e.doc.scrollTop = t, zo || k(e, {
                top: t
            }), e.display.scroller.scrollTop != t && (e.display.scroller.scrollTop = t), e.display.scrollbarV.scrollTop != t && (e.display.scrollbarV.scrollTop = t), zo && k(e), yt(e, 100))
        }

        function Ar(e, t, r) {
            (r ? t == e.doc.scrollLeft : Math.abs(e.doc.scrollLeft - t) < 2) || (t = Math.min(t, e.display.scroller.scrollWidth - e.display.scroller.clientWidth), e.doc.scrollLeft = t, y(e), e.display.scroller.scrollLeft != t && (e.display.scroller.scrollLeft = t), e.display.scrollbarH.scrollLeft != t && (e.display.scrollbarH.scrollLeft = t))
        }

        function Nr(e, t) {
            var r = t.wheelDeltaX,
                n = t.wheelDeltaY;
            null == r && t.detail && t.axis == t.HORIZONTAL_AXIS && (r = t.detail), null == n && t.detail && t.axis == t.VERTICAL_AXIS ? n = t.detail : null == n && (n = t.wheelDelta);
            var i = e.display,
                o = i.scroller;
            if (r && o.scrollWidth > o.clientWidth || n && o.scrollHeight > o.clientHeight) {
                if (n && Yo && Fo) e: for (var a = t.target, l = i.view; a != o; a = a.parentNode)
                    for (var s = 0; s < l.length; s++)
                        if (l[s].node == a) {
                            e.display.currentWheelTarget = a;
                            break e
                        }
                if (r && !zo && !jo && null != fa) return n && Tr(e, Math.max(0, Math.min(o.scrollTop + n * fa, o.scrollHeight - o.clientHeight))), Ar(e, Math.max(0, Math.min(o.scrollLeft + r * fa, o.scrollWidth - o.clientWidth))), Va(t), void(i.wheelStartX = null);
                if (n && null != fa) {
                    var u = n * fa,
                        c = e.doc.scrollTop,
                        f = c + i.wrapper.clientHeight;
                    0 > u ? c = Math.max(0, c + u - 50) : f = Math.min(e.doc.height, f + u + 50), k(e, {
                        top: c,
                        bottom: f
                    })
                }
                20 > ca && (null == i.wheelStartX ? (i.wheelStartX = o.scrollLeft, i.wheelStartY = o.scrollTop, i.wheelDX = r, i.wheelDY = n, setTimeout(function() {
                    if (null != i.wheelStartX) {
                        var e = o.scrollLeft - i.wheelStartX,
                            t = o.scrollTop - i.wheelStartY,
                            r = t && i.wheelDY && t / i.wheelDY || e && i.wheelDX && e / i.wheelDX;
                        i.wheelStartX = i.wheelStartY = null, r && (fa = (fa * ca + r) / (ca + 1), ++ca)
                    }
                }, 200)) : (i.wheelDX += r, i.wheelDY += n))
            }
        }

        function Hr(e, t, r) {
            if ("string" == typeof t && (t = Ma[t], !t)) return !1;
            e.display.pollingFast && fr(e) && (e.display.pollingFast = !1);
            var n = e.display.shift,
                i = !1;
            try {
                mr(e) && (e.state.suppressEdits = !0), r && (e.display.shift = !1), i = t(e) != Qa
            } finally {
                e.display.shift = n, e.state.suppressEdits = !1
            }
            return i
        }

        function Or(e) {
            var t = e.state.keyMaps.slice(0);
            return e.options.extraKeys && t.push(e.options.extraKeys), t.push(e.options.keyMap), t
        }

        function zr(e, t) {
            var r = mn(e.options.keyMap),
                n = r.auto;
            clearTimeout(da), n && !Na(t) && (da = setTimeout(function() {
                mn(e.options.keyMap) == r && (e.options.keyMap = n.call ? n.call(null, e) : n, l(e))
            }, 50));
            var i = Ha(t, !0),
                o = !1;
            if (!i) return !1;
            var a = Or(e);
            return o = t.shiftKey ? Aa("Shift-" + i, a, function(t) {
                return Hr(e, t, !0)
            }) || Aa(i, a, function(t) {
                return ("string" == typeof t ? /^go[A-Z]/.test(t) : t.motion) ? Hr(e, t) : void 0
            }) : Aa(i, a, function(t) {
                return Hr(e, t)
            }), o && (Va(t), vt(e), Gi(e, "keyHandled", e, i, t)), o
        }

        function Wr(e, t, r) {
            var n = Aa("'" + r + "'", Or(e), function(t) {
                return Hr(e, t, !0)
            });
            return n && (Va(t), vt(e), Gi(e, "keyHandled", e, "'" + r + "'", t)), n
        }

        function Er(e) {
            var t = this;
            if (pr(t), !Ui(t, e)) {
                Wo && 27 == e.keyCode && (e.returnValue = !1);
                var r = e.keyCode;
                t.display.shift = 16 == r || e.shiftKey;
                var n = zr(t, e);
                jo && (ha = n ? r : null, !n && 88 == r && !ml && (Yo ? e.metaKey : e.ctrlKey) && t.replaceSelection("", null, "cut")), 18 != r || /\bCodeMirror-crosshair\b/.test(t.display.lineDiv.className) || Ir(t)
            }
        }

        function Ir(e) {
            function t(e) {
                18 != e.keyCode && e.altKey || (po(r, "CodeMirror-crosshair"), Ka(document, "keyup", t), Ka(document, "mouseover", t))
            }
            var r = e.display.lineDiv;
            mo(r, "CodeMirror-crosshair"), Ua(document, "keyup", t), Ua(document, "mouseover", t)
        }

        function Dr(e) {
            Ui(this, e) || 16 == e.keyCode && (this.doc.sel.shift = !1)
        }

        function Pr(e) {
            var t = this;
            if (!Ui(t, e)) {
                var r = e.keyCode,
                    n = e.charCode;
                if (jo && r == ha) return ha = null, void Va(e);
                if (!(jo && (!e.which || e.which < 10) || Go) || !zr(t, e)) {
                    var i = String.fromCharCode(null == n ? r : n);
                    Wr(t, e, i) || (_o && !Io && (t.display.inputHasSelection = null), cr(t))
                }
            }
        }

        function _r(e) {
            "nocursor" != e.options.readOnly && (e.state.focused || ($a(e, "focus", e), e.state.focused = !0, mo(e.display.wrapper, "CodeMirror-focused"), e.curOp || e.display.selForContextMenu != e.doc.sel || (dr(e), Fo && setTimeout(io(dr, e, !0), 0))), ur(e), vt(e))
        }

        function Fr(e) {
            e.state.focused && ($a(e, "blur", e), e.state.focused = !1, po(e.display.wrapper, "CodeMirror-focused")), clearInterval(e.display.blinker), setTimeout(function() {
                e.state.focused || (e.display.shift = !1)
            }, 150)
        }

        function Br(e, t) {
            function r() {
                if (null != i.input.selectionStart) {
                    var t = e.somethingSelected(),
                        r = i.input.value = "​" + (t ? i.input.value : "");
                    i.prevInput = t ? "" : "​", i.input.selectionStart = 1, i.input.selectionEnd = r.length
                }
            }

            function n() {
                if (i.inputDiv.style.position = "relative", i.input.style.cssText = s, Io && (i.scrollbarV.scrollTop = i.scroller.scrollTop = a), ur(e), null != i.input.selectionStart) {
                    (!_o || Io) && r(), clearTimeout(pa);
                    var t = 0,
                        n = function() {
                            i.selForContextMenu == e.doc.sel && 0 == i.input.selectionStart ? Zt(e, Ma.selectAll)(e) : t++ < 10 ? pa = setTimeout(n, 500) : dr(e)
                        };
                    pa = setTimeout(n, 200)
                }
            }
            if (!Ui(e, t, "contextmenu")) {
                var i = e.display;
                if (!vr(i, t) && !Rr(e, t)) {
                    var o = yr(e, t),
                        a = i.scroller.scrollTop;
                    if (o && !jo) {
                        var l = e.options.resetSelectionOnContextMenu;
                        l && -1 == e.doc.sel.contains(o) && Zt(e, st)(e.doc, Y(o), Ja);
                        var s = i.input.style.cssText;
                        if (i.inputDiv.style.position = "absolute", i.input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (t.clientY - 5) + "px; left: " + (t.clientX - 5) + "px; z-index: 1000; background: " + (_o ? "rgba(255, 255, 255, .05)" : "transparent") + "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);", hr(e), dr(e), e.somethingSelected() || (i.input.value = i.prevInput = " "), i.selForContextMenu = e.doc.sel, _o && !Io && r(), Jo) {
                            qa(t);
                            var u = function() {
                                Ka(window, "mouseup", u), setTimeout(n, 20)
                            };
                            Ua(window, "mouseup", u)
                        } else setTimeout(n, 50)
                    }
                }
            }
        }

        function Rr(e, t) {
            return $i(e, "gutterContextMenu") ? Cr(e, t, "gutterContextMenu", !1, $a) : !1
        }

        function jr(e, t) {
            if (na(e, t.from) < 0) return e;
            if (na(e, t.to) <= 0) return ma(t);
            var r = e.line + t.text.length - (t.to.line - t.from.line) - 1,
                n = e.ch;
            return e.line == t.to.line && (n += ma(t).ch - t.to.ch), ra(r, n)
        }

        function Vr(e, t) {
            for (var r = [], n = 0; n < e.sel.ranges.length; n++) {
                var i = e.sel.ranges[n];
                r.push(new K(jr(i.anchor, t), jr(i.head, t)))
            }
            return $(r, e.sel.primIndex)
        }

        function Gr(e, t, r) {
            return e.line == t.line ? ra(r.line, e.ch - t.ch + r.ch) : ra(r.line + (e.line - t.line), e.ch)
        }

        function qr(e, t, r) {
            for (var n = [], i = ra(e.first, 0), o = i, a = 0; a < t.length; a++) {
                var l = t[a],
                    s = Gr(l.from, i, o),
                    u = Gr(ma(l), i, o);
                if (i = l.to, o = u, "around" == r) {
                    var c = e.sel.ranges[a],
                        f = na(c.head, c.anchor) < 0;
                    n[a] = new K(f ? u : s, f ? s : u)
                } else n[a] = new K(s, s)
            }
            return new U(n, e.sel.primIndex)
        }

        function Ur(e, t, r) {
            var n = {
                canceled: !1,
                from: t.from,
                to: t.to,
                text: t.text,
                origin: t.origin,
                cancel: function() {
                    this.canceled = !0
                }
            };
            return r && (n.update = function(t, r, n, i) {
                t && (this.from = Z(e, t)), r && (this.to = Z(e, r)), n && (this.text = n), void 0 !== i && (this.origin = i)
            }), $a(e, "beforeChange", e, n), e.cm && $a(e.cm, "beforeChange", e.cm, n), n.canceled ? null : {
                from: n.from,
                to: n.to,
                text: n.text,
                origin: n.origin
            }
        }

        function Kr(e, t, r) {
            if (e.cm) {
                if (!e.cm.curOp) return Zt(e.cm, Kr)(e, t, r);
                if (e.cm.state.suppressEdits) return
            }
            if (!($i(e, "beforeChange") || e.cm && $i(e.cm, "beforeChange")) || (t = Ur(e, t, !0))) {
                var n = ea && !r && Hn(e, t.from, t.to);
                if (n)
                    for (var i = n.length - 1; i >= 0; --i) $r(e, {
                        from: n[i].from,
                        to: n[i].to,
                        text: i ? [""] : t.text
                    });
                else $r(e, t)
            }
        }

        function $r(e, t) {
            if (1 != t.text.length || "" != t.text[0] || 0 != na(t.from, t.to)) {
                var r = Vr(e, t);
                Hi(e, t, r, e.cm ? e.cm.curOp.id : 0 / 0), Zr(e, t, r, Tn(e, t));
                var n = [];
                gi(e, function(e, r) {
                    r || -1 != eo(n, e.history) || (Bi(e.history, t), n.push(e.history)), Zr(e, t, null, Tn(e, t))
                })
            }
        }

        function Yr(e, t, r) {
            if (!e.cm || !e.cm.state.suppressEdits) {
                for (var n = e.history, i, o = e.sel, a = "undo" == t ? n.done : n.undone, l = "undo" == t ? n.undone : n.done, s = 0; s < a.length && (i = a[s], r ? !i.ranges || i.equals(e.sel) : i.ranges); s++);
                if (s != a.length) {
                    for (n.lastOrigin = n.lastSelOrigin = null; i = a.pop(), i.ranges;) {
                        if (Wi(i, l), r && !i.equals(e.sel)) return void st(e, i, {
                            clearRedo: !1
                        });
                        o = i
                    }
                    var u = [];
                    Wi(o, l), l.push({
                        changes: u,
                        generation: n.generation
                    }), n.generation = i.generation || ++n.maxGeneration;
                    for (var c = $i(e, "beforeChange") || e.cm && $i(e.cm, "beforeChange"), s = i.changes.length - 1; s >= 0; --s) {
                        var f = i.changes[s];
                        if (f.origin = t, c && !Ur(e, f, !1)) return void(a.length = 0);
                        u.push(Ti(e, f));
                        var d = s ? Vr(e, f, null) : Ji(a);
                        Zr(e, f, d, Nn(e, f)), e.cm && an(e.cm);
                        var h = [];
                        gi(e, function(e, t) {
                            t || -1 != eo(h, e.history) || (Bi(e.history, f), h.push(e.history)), Zr(e, f, null, Nn(e, f))
                        })
                    }
                }
            }
        }

        function Xr(e, t) {
            e.first += t, e.sel = new U(to(e.sel.ranges, function(e) {
                return new K(ra(e.anchor.line + t, e.anchor.ch), ra(e.head.line + t, e.head.ch))
            }), e.sel.primIndex), e.cm && rr(e.cm, e.first, e.first - t, t)
        }

        function Zr(e, t, r, n) {
            if (e.cm && !e.cm.curOp) return Zt(e.cm, Zr)(e, t, r, n);
            if (t.to.line < e.first) return void Xr(e, t.text.length - 1 - (t.to.line - t.from.line));
            if (!(t.from.line > e.lastLine())) {
                if (t.from.line < e.first) {
                    var i = t.text.length - 1 - (e.first - t.from.line);
                    Xr(e, i), t = {
                        from: ra(e.first, 0),
                        to: ra(t.to.line + i, t.to.ch),
                        text: [Ji(t.text)],
                        origin: t.origin
                    }
                }
                var o = e.lastLine();
                t.to.line > o && (t = {
                    from: t.from,
                    to: ra(o, yi(e, o).text.length),
                    text: [t.text[0]],
                    origin: t.origin
                }), t.removed = bi(e, t.from, t.to), r || (r = Vr(e, t, null)), e.cm ? Qr(e.cm, t, n) : hi(e, t, n), ut(e, r, Ja)
            }
        }

        function Qr(e, t, r) {
            var n = e.doc,
                i = e.display,
                a = t.from,
                l = t.to,
                s = !1,
                u = a.line;
            e.options.lineWrapping || (u = ki(Bn(yi(n, a.line))), n.iter(u, l.line + 1, function(e) {
                return e == i.maxLine ? (s = !0, !0) : void 0
            })), n.sel.contains(t.from, t.to) > -1 && Ki(e), hi(n, t, r, o(e)), e.options.lineWrapping || (n.iter(u, a.line + t.text.length, function(e) {
                var t = d(e);
                t > i.maxLineLength && (i.maxLine = e, i.maxLineLength = t, i.maxLineChanged = !0, s = !1)
            }), s && (e.curOp.updateMaxLine = !0)), n.frontier = Math.min(n.frontier, a.line), yt(e, 400);
            var c = t.text.length - (l.line - a.line) - 1;
            a.line != l.line || 1 != t.text.length || di(e.doc, t) ? rr(e, a.line, l.line + 1, c) : nr(e, a.line, "text");
            var f = $i(e, "changes"),
                h = $i(e, "change");
            if (h || f) {
                var p = {
                    from: a,
                    to: l,
                    text: t.text,
                    removed: t.removed,
                    origin: t.origin
                };
                h && Gi(e, "change", e, p), f && (e.curOp.changeObjs || (e.curOp.changeObjs = [])).push(p)
            }
        }

        function Jr(e, t, r, n, i) {
            if (n || (n = r), na(n, r) < 0) {
                var o = n;
                n = r, r = o
            }
            "string" == typeof t && (t = hl(t)), Kr(e, {
                from: r,
                to: n,
                text: t,
                origin: i
            })
        }

        function en(e, t) {
            var r = e.display,
                n = r.sizer.getBoundingClientRect(),
                i = null;
            if (t.top + n.top < 0 ? i = !0 : t.bottom + n.top > (window.innerHeight || document.documentElement.clientHeight) && (i = !1), null != i && !Uo) {
                var o = lo("div", "​", null, "position: absolute; top: " + (t.top - r.viewOffset - kt(e.display)) + "px; height: " + (t.bottom - t.top + Za) + "px; left: " + t.left + "px; width: 2px;");
                e.display.lineSpace.appendChild(o), o.scrollIntoView(i), e.display.lineSpace.removeChild(o)
            }
        }

        function tn(e, t, r, n) {
            for (null == n && (n = 0);;) {
                var i = !1,
                    o = Rt(e, t),
                    a = r && r != t ? Rt(e, r) : o,
                    l = nn(e, Math.min(o.left, a.left), Math.min(o.top, a.top) - n, Math.max(o.left, a.left), Math.max(o.bottom, a.bottom) + n),
                    s = e.doc.scrollTop,
                    u = e.doc.scrollLeft;
                if (null != l.scrollTop && (Tr(e, l.scrollTop), Math.abs(e.doc.scrollTop - s) > 1 && (i = !0)), null != l.scrollLeft && (Ar(e, l.scrollLeft), Math.abs(e.doc.scrollLeft - u) > 1 && (i = !0)), !i) return o
            }
        }

        function rn(e, t, r, n, i) {
            var o = nn(e, t, r, n, i);
            null != o.scrollTop && Tr(e, o.scrollTop), null != o.scrollLeft && Ar(e, o.scrollLeft)
        }

        function nn(e, t, r, n, i) {
            var o = e.display,
                a = Ut(e.display);
            0 > r && (r = 0);
            var l = e.curOp && null != e.curOp.scrollTop ? e.curOp.scrollTop : o.scroller.scrollTop,
                s = o.scroller.clientHeight - Za,
                u = {},
                c = e.doc.height + Ct(o),
                f = a > r,
                d = i > c - a;
            if (l > r) u.scrollTop = f ? 0 : r;
            else if (i > l + s) {
                var h = Math.min(r, (d ? c : i) - s);
                h != l && (u.scrollTop = h)
            }
            var p = e.curOp && null != e.curOp.scrollLeft ? e.curOp.scrollLeft : o.scroller.scrollLeft,
                m = o.scroller.clientWidth - Za;
            t += o.gutters.offsetWidth, n += o.gutters.offsetWidth;
            var g = o.gutters.offsetWidth,
                v = g + 10 > t;
            return p + g > t || v ? (v && (t = 0), u.scrollLeft = Math.max(0, t - 10 - g)) : n > m + p - 3 && (u.scrollLeft = n + 10 - m), u
        }

        function on(e, t, r) {
            (null != t || null != r) && ln(e), null != t && (e.curOp.scrollLeft = (null == e.curOp.scrollLeft ? e.doc.scrollLeft : e.curOp.scrollLeft) + t), null != r && (e.curOp.scrollTop = (null == e.curOp.scrollTop ? e.doc.scrollTop : e.curOp.scrollTop) + r)
        }

        function an(e) {
            ln(e);
            var t = e.getCursor(),
                r = t,
                n = t;
            e.options.lineWrapping || (r = t.ch ? ra(t.line, t.ch - 1) : t, n = ra(t.line, t.ch + 1)), e.curOp.scrollToPos = {
                from: r,
                to: n,
                margin: e.options.cursorScrollMargin,
                isCursor: !0
            }
        }

        function ln(e) {
            var t = e.curOp.scrollToPos;
            if (t) {
                e.curOp.scrollToPos = null;
                var r = jt(e, t.from),
                    n = jt(e, t.to),
                    i = nn(e, Math.min(r.left, n.left), Math.min(r.top, n.top) - t.margin, Math.max(r.right, n.right), Math.max(r.bottom, n.bottom) + t.margin);
                e.scrollTo(i.scrollLeft, i.scrollTop)
            }
        }

        function sn(e, t, r, n) {
            var i = e.doc,
                o;
            null == r && (r = "add"), "smart" == r && (e.doc.mode.indent ? o = xt(e, t) : r = "prev");
            var a = e.options.tabSize,
                l = yi(i, t),
                s = rl(l.text, null, a);
            l.stateAfter && (l.stateAfter = null);
            var u = l.text.match(/^\s*/)[0],
                c;
            if (n || /\S/.test(l.text)) {
                if ("smart" == r && (c = e.doc.mode.indent(o, l.text.slice(u.length), l.text), c == Qa)) {
                    if (!n) return;
                    r = "prev"
                }
            } else c = 0, r = "not";
            "prev" == r ? c = t > i.first ? rl(yi(i, t - 1).text, null, a) : 0 : "add" == r ? c = s + e.options.indentUnit : "subtract" == r ? c = s - e.options.indentUnit : "number" == typeof r && (c = s + r), c = Math.max(0, c);
            var f = "",
                d = 0;
            if (e.options.indentWithTabs)
                for (var h = Math.floor(c / a); h; --h) d += a, f += "	";
            if (c > d && (f += Qi(c - d)), f != u) Jr(e.doc, f, ra(t, 0), ra(t, u.length), "+input");
            else
                for (var h = 0; h < i.sel.ranges.length; h++) {
                    var p = i.sel.ranges[h];
                    if (p.head.line == t && p.head.ch < u.length) {
                        var d = ra(t, u.length);
                        it(i, h, new K(d, d));
                        break
                    }
                }
            l.stateAfter = null
        }

        function un(e, t, r, n) {
            var i = t,
                o = t,
                a = e.doc;
            return "number" == typeof t ? o = yi(a, X(a, t)) : i = ki(t), null == i ? null : (n(o, i) && nr(e, i, r), o)
        }

        function cn(e, t) {
            for (var r = e.doc.sel.ranges, n = [], i = 0; i < r.length; i++) {
                for (var o = t(r[i]); n.length && na(o.from, Ji(n).to) <= 0;) {
                    var a = n.pop();
                    if (na(a.from, o.from) < 0) {
                        o.from = a.from;
                        break
                    }
                }
                n.push(o)
            }
            Xt(e, function() {
                for (var t = n.length - 1; t >= 0; t--) Jr(e.doc, "", n[t].from, n[t].to, "+delete");
                an(e)
            })
        }

        function fn(e, t, r, n, i) {
            function o() {
                var t = l + r;
                return t < e.first || t >= e.first + e.size ? f = !1 : (l = t, c = yi(e, t))
            }

            function a(e) {
                var t = (i ? Ho : Oo)(c, s, r, !0);
                if (null == t) {
                    if (e || !o()) return f = !1;
                    s = i ? (0 > r ? Lo : Co)(c) : 0 > r ? c.text.length : 0
                } else s = t;
                return !0
            }
            var l = t.line,
                s = t.ch,
                u = r,
                c = yi(e, l),
                f = !0;
            if ("char" == n) a();
            else if ("column" == n) a(!0);
            else if ("word" == n || "group" == n)
                for (var d = null, h = "group" == n, p = !0; !(0 > r) || a(!p); p = !1) {
                    var m = c.text.charAt(s) || "\n",
                        g = al(m) ? "w" : h && "\n" == m ? "n" : !h || /\s/.test(m) ? null : "p";
                    if (!h || p || g || (g = "s"), d && d != g) {
                        0 > r && (r = 1, a());
                        break
                    }
                    if (g && (d = g), r > 0 && !a(!p)) break
                }
            var v = ht(e, ra(l, s), u, !0);
            return f || (v.hitSide = !0), v
        }

        function dn(e, t, r, n) {
            var i = e.doc,
                o = t.left,
                a;
            if ("page" == n) {
                var l = Math.min(e.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
                a = t.top + r * (l - (0 > r ? 1.5 : .5) * Ut(e.display))
            } else "line" == n && (a = r > 0 ? t.bottom + 3 : t.top - 3);
            for (;;) {
                var s = Gt(e, o, a);
                if (!s.outside) break;
                if (0 > r ? 0 >= a : a >= i.height) {
                    s.hitSide = !0;
                    break
                }
                a += 5 * r
            }
            return s
        }

        function hn(e, t) {
            var r = yi(e, t.line).text,
                n = t.ch,
                i = t.ch;
            if (r) {
                (t.xRel < 0 || i == r.length) && n ? --n : ++i;
                for (var o = r.charAt(n), a = al(o) ? al : /\s/.test(o) ? function(e) {
                        return /\s/.test(e)
                    } : function(e) {
                        return !/\s/.test(e) && !al(e)
                    }; n > 0 && a(r.charAt(n - 1));) --n;
                for (; i < r.length && a(r.charAt(i));) ++i
            }
            return new K(ra(t.line, n), ra(t.line, i))
        }

        function pn(t, r, n, i) {
            e.defaults[t] = r, n && (va[t] = i ? function(e, t, r) {
                r != ya && n(e, t, r)
            } : n)
        }

        function mn(e) {
            return "string" == typeof e ? Ta[e] : e
        }

        function gn(e, t, r, n, i) {
            if (n && n.shared) return vn(e, t, r, n, i);
            if (e.cm && !e.cm.curOp) return Zt(e.cm, gn)(e, t, r, n, i);
            var o = new za(e, i),
                a = na(t, r);
            if (n && no(n, o, !1), a > 0 || 0 == a && o.clearWhenEmpty !== !1) return o;
            if (o.replacedWith && (o.collapsed = !0, o.widgetNode = lo("span", [o.replacedWith], "CodeMirror-widget"), n.handleMouseEvents || (o.widgetNode.ignoreEvents = !0), n.insertLeft && (o.widgetNode.insertLeft = !0)), o.collapsed) {
                if (Fn(e, t.line, t, r, o) || t.line != r.line && Fn(e, r.line, t, r, o)) throw new Error("Inserting collapsed marker partially overlapping an existing one");
                ta = !0
            }
            o.addToHistory && Hi(e, {
                from: t,
                to: r,
                origin: "markText"
            }, e.sel, 0 / 0);
            var l = t.line,
                s = e.cm,
                u;
            if (e.iter(l, r.line + 1, function(e) {
                    s && o.collapsed && !s.options.lineWrapping && Bn(e) == s.display.maxLine && (u = !0), o.collapsed && l != t.line && xi(e, 0), Ln(e, new xn(o, l == t.line ? t.ch : null, l == r.line ? r.ch : null)), ++l
                }), o.collapsed && e.iter(t.line, r.line + 1, function(t) {
                    Gn(e, t) && xi(t, 0)
                }), o.clearOnEnter && Ua(o, "beforeCursorEnter", function() {
                    o.clear()
                }), o.readOnly && (ea = !0, (e.history.done.length || e.history.undone.length) && e.clearHistory()), o.collapsed && (o.id = ++Wa, o.atomic = !0), s) {
                if (u && (s.curOp.updateMaxLine = !0), o.collapsed) rr(s, t.line, r.line + 1);
                else if (o.className || o.title || o.startStyle || o.endStyle)
                    for (var c = t.line; c <= r.line; c++) nr(s, c, "text");
                o.atomic && ft(s.doc), Gi(s, "markerAdded", s, o)
            }
            return o
        }

        function vn(e, t, r, n, i) {
            n = no(n), n.shared = !1;
            var o = [gn(e, t, r, n, i)],
                a = o[0],
                l = n.widgetNode;
            return gi(e, function(e) {
                l && (n.widgetNode = l.cloneNode(!0)), o.push(gn(e, Z(e, t), Z(e, r), n, i));
                for (var s = 0; s < e.linked.length; ++s)
                    if (e.linked[s].isParent) return;
                a = Ji(o)
            }), new Ea(o, a)
        }

        function yn(e) {
            return e.findMarks(ra(e.first, 0), e.clipPos(ra(e.lastLine())), function(e) {
                return e.parent
            })
        }

        function bn(e, t) {
            for (var r = 0; r < t.length; r++) {
                var n = t[r],
                    i = n.find(),
                    o = e.clipPos(i.from),
                    a = e.clipPos(i.to);
                if (na(o, a)) {
                    var l = gn(e, o, a, n.primary, n.primary.type);
                    n.markers.push(l), l.parent = n
                }
            }
        }

        function wn(e) {
            for (var t = 0; t < e.length; t++) {
                var r = e[t],
                    n = [r.primary.doc];
                gi(r.primary.doc, function(e) {
                    n.push(e)
                });
                for (var i = 0; i < r.markers.length; i++) {
                    var o = r.markers[i]; - 1 == eo(n, o.doc) && (o.parent = null, r.markers.splice(i--, 1))
                }
            }
        }

        function xn(e, t, r) {
            this.marker = e, this.from = t, this.to = r
        }

        function kn(e, t) {
            if (e)
                for (var r = 0; r < e.length; ++r) {
                    var n = e[r];
                    if (n.marker == t) return n
                }
        }

        function Cn(e, t) {
            for (var r, n = 0; n < e.length; ++n) e[n] != t && (r || (r = [])).push(e[n]);
            return r
        }

        function Ln(e, t) {
            e.markedSpans = e.markedSpans ? e.markedSpans.concat([t]) : [t], t.marker.attachLine(e)
        }

        function Sn(e, t, r) {
            if (e)
                for (var n = 0, i; n < e.length; ++n) {
                    var o = e[n],
                        a = o.marker,
                        l = null == o.from || (a.inclusiveLeft ? o.from <= t : o.from < t);
                    if (l || o.from == t && "bookmark" == a.type && (!r || !o.marker.insertLeft)) {
                        var s = null == o.to || (a.inclusiveRight ? o.to >= t : o.to > t);
                        (i || (i = [])).push(new xn(a, o.from, s ? null : o.to))
                    }
                }
            return i
        }

        function Mn(e, t, r) {
            if (e)
                for (var n = 0, i; n < e.length; ++n) {
                    var o = e[n],
                        a = o.marker,
                        l = null == o.to || (a.inclusiveRight ? o.to >= t : o.to > t);
                    if (l || o.from == t && "bookmark" == a.type && (!r || o.marker.insertLeft)) {
                        var s = null == o.from || (a.inclusiveLeft ? o.from <= t : o.from < t);
                        (i || (i = [])).push(new xn(a, s ? null : o.from - t, null == o.to ? null : o.to - t))
                    }
                }
            return i
        }

        function Tn(e, t) {
            var r = J(e, t.from.line) && yi(e, t.from.line).markedSpans,
                n = J(e, t.to.line) && yi(e, t.to.line).markedSpans;
            if (!r && !n) return null;
            var i = t.from.ch,
                o = t.to.ch,
                a = 0 == na(t.from, t.to),
                l = Sn(r, i, a),
                s = Mn(n, o, a),
                u = 1 == t.text.length,
                c = Ji(t.text).length + (u ? i : 0);
            if (l)
                for (var f = 0; f < l.length; ++f) {
                    var d = l[f];
                    if (null == d.to) {
                        var h = kn(s, d.marker);
                        h ? u && (d.to = null == h.to ? null : h.to + c) : d.to = i
                    }
                }
            if (s)
                for (var f = 0; f < s.length; ++f) {
                    var d = s[f];
                    if (null != d.to && (d.to += c), null == d.from) {
                        var h = kn(l, d.marker);
                        h || (d.from = c, u && (l || (l = [])).push(d))
                    } else d.from += c, u && (l || (l = [])).push(d)
                }
            l && (l = An(l)), s && s != l && (s = An(s));
            var p = [l];
            if (!u) {
                var m = t.text.length - 2,
                    g;
                if (m > 0 && l)
                    for (var f = 0; f < l.length; ++f) null == l[f].to && (g || (g = [])).push(new xn(l[f].marker, null, null));
                for (var f = 0; m > f; ++f) p.push(g);
                p.push(s)
            }
            return p
        }

        function An(e) {
            for (var t = 0; t < e.length; ++t) {
                var r = e[t];
                null != r.from && r.from == r.to && r.marker.clearWhenEmpty !== !1 && e.splice(t--, 1)
            }
            return e.length ? e : null
        }

        function Nn(e, t) {
            var r = Di(e, t),
                n = Tn(e, t);
            if (!r) return n;
            if (!n) return r;
            for (var i = 0; i < r.length; ++i) {
                var o = r[i],
                    a = n[i];
                if (o && a) e: for (var l = 0; l < a.length; ++l) {
                    for (var s = a[l], u = 0; u < o.length; ++u)
                        if (o[u].marker == s.marker) continue e;
                    o.push(s)
                } else a && (r[i] = a)
            }
            return r
        }

        function Hn(e, t, r) {
            var n = null;
            if (e.iter(t.line, r.line + 1, function(e) {
                    if (e.markedSpans)
                        for (var t = 0; t < e.markedSpans.length; ++t) {
                            var r = e.markedSpans[t].marker;
                            !r.readOnly || n && -1 != eo(n, r) || (n || (n = [])).push(r)
                        }
                }), !n) return null;
            for (var i = [{
                    from: t,
                    to: r
                }], o = 0; o < n.length; ++o)
                for (var a = n[o], l = a.find(0), s = 0; s < i.length; ++s) {
                    var u = i[s];
                    if (!(na(u.to, l.from) < 0 || na(u.from, l.to) > 0)) {
                        var c = [s, 1],
                            f = na(u.from, l.from),
                            d = na(u.to, l.to);
                        (0 > f || !a.inclusiveLeft && !f) && c.push({
                            from: u.from,
                            to: l.from
                        }), (d > 0 || !a.inclusiveRight && !d) && c.push({
                            from: l.to,
                            to: u.to
                        }), i.splice.apply(i, c), s += c.length - 1
                    }
                }
            return i
        }

        function On(e) {
            var t = e.markedSpans;
            if (t) {
                for (var r = 0; r < t.length; ++r) t[r].marker.detachLine(e);
                e.markedSpans = null
            }
        }

        function zn(e, t) {
            if (t) {
                for (var r = 0; r < t.length; ++r) t[r].marker.attachLine(e);
                e.markedSpans = t
            }
        }

        function Wn(e) {
            return e.inclusiveLeft ? -1 : 0
        }

        function En(e) {
            return e.inclusiveRight ? 1 : 0
        }

        function In(e, t) {
            var r = e.lines.length - t.lines.length;
            if (0 != r) return r;
            var n = e.find(),
                i = t.find(),
                o = na(n.from, i.from) || Wn(e) - Wn(t);
            if (o) return -o;
            var a = na(n.to, i.to) || En(e) - En(t);
            return a ? a : t.id - e.id
        }

        function Dn(e, t) {
            var r = ta && e.markedSpans,
                n;
            if (r)
                for (var i, o = 0; o < r.length; ++o) i = r[o], i.marker.collapsed && null == (t ? i.from : i.to) && (!n || In(n, i.marker) < 0) && (n = i.marker);
            return n
        }

        function Pn(e) {
            return Dn(e, !0)
        }

        function _n(e) {
            return Dn(e, !1)
        }

        function Fn(e, t, r, n, i) {
            var o = yi(e, t),
                a = ta && o.markedSpans;
            if (a)
                for (var l = 0; l < a.length; ++l) {
                    var s = a[l];
                    if (s.marker.collapsed) {
                        var u = s.marker.find(0),
                            c = na(u.from, r) || Wn(s.marker) - Wn(i),
                            f = na(u.to, n) || En(s.marker) - En(i);
                        if (!(c >= 0 && 0 >= f || 0 >= c && f >= 0) && (0 >= c && (na(u.to, r) || En(s.marker) - Wn(i)) > 0 || c >= 0 && (na(u.from, n) || Wn(s.marker) - En(i)) < 0)) return !0
                    }
                }
        }

        function Bn(e) {
            for (var t; t = Pn(e);) e = t.find(-1, !0).line;
            return e
        }

        function Rn(e) {
            for (var t, r; t = _n(e);) e = t.find(1, !0).line, (r || (r = [])).push(e);
            return r
        }

        function jn(e, t) {
            var r = yi(e, t),
                n = Bn(r);
            return r == n ? t : ki(n)
        }

        function Vn(e, t) {
            if (t > e.lastLine()) return t;
            var r = yi(e, t),
                n;
            if (!Gn(e, r)) return t;
            for (; n = _n(r);) r = n.find(1, !0).line;
            return ki(r) + 1
        }

        function Gn(e, t) {
            var r = ta && t.markedSpans;
            if (r)
                for (var n, i = 0; i < r.length; ++i)
                    if (n = r[i], n.marker.collapsed) {
                        if (null == n.from) return !0;
                        if (!n.marker.widgetNode && 0 == n.from && n.marker.inclusiveLeft && qn(e, t, n)) return !0
                    }
        }

        function qn(e, t, r) {
            if (null == r.to) {
                var n = r.marker.find(1, !0);
                return qn(e, n.line, kn(n.line.markedSpans, r.marker))
            }
            if (r.marker.inclusiveRight && r.to == t.text.length) return !0;
            for (var i, o = 0; o < t.markedSpans.length; ++o)
                if (i = t.markedSpans[o], i.marker.collapsed && !i.marker.widgetNode && i.from == r.to && (null == i.to || i.to != r.from) && (i.marker.inclusiveLeft || r.marker.inclusiveRight) && qn(e, t, i)) return !0
        }

        function Un(e, t, r) {
            Li(t) < (e.curOp && e.curOp.scrollTop || e.doc.scrollTop) && on(e, null, r)
        }

        function Kn(e) {
            return null != e.height ? e.height : (co(document.body, e.node) || uo(e.cm.display.measure, lo("div", [e.node], null, "position: relative")), e.height = e.node.offsetHeight)
        }

        function $n(e, t, r, n) {
            var i = new Ia(e, r, n);
            return i.noHScroll && (e.display.alignWidgets = !0), un(e, t, "widget", function(t) {
                var r = t.widgets || (t.widgets = []);
                if (null == i.insertAt ? r.push(i) : r.splice(Math.min(r.length - 1, Math.max(0, i.insertAt)), 0, i), i.line = t, !Gn(e.doc, t)) {
                    var n = Li(t) < e.doc.scrollTop;
                    xi(t, t.height + Kn(i)), n && on(e, null, i.height), e.curOp.forceUpdate = !0
                }
                return !0
            }), i
        }

        function Yn(e, t, r, n) {
            e.text = t, e.stateAfter && (e.stateAfter = null), e.styles && (e.styles = null), null != e.order && (e.order = null), On(e), zn(e, r);
            var i = n ? n(e) : 1;
            i != e.height && xi(e, i)
        }

        function Xn(e) {
            e.parent = null, On(e)
        }

        function Zn(e, t) {
            if (e)
                for (;;) {
                    var r = e.match(/(?:^|\s+)line-(background-)?(\S+)/);
                    if (!r) break;
                    e = e.slice(0, r.index) + e.slice(r.index + r[0].length);
                    var n = r[1] ? "bgClass" : "textClass";
                    null == t[n] ? t[n] = r[2] : new RegExp("(?:^|s)" + r[2] + "(?:$|s)").test(t[n]) || (t[n] += " " + r[2])
                }
            return e
        }

        function Qn(t, r) {
            if (t.blankLine) return t.blankLine(r);
            if (t.innerMode) {
                var n = e.innerMode(t, r);
                return n.mode.blankLine ? n.mode.blankLine(n.state) : void 0
            }
        }

        function Jn(e, t, r) {
            var n = e.token(t, r);
            if (t.pos <= t.start) throw new Error("Mode " + e.name + " failed to advance stream.");
            return n
        }

        function ei(t, r, n, i, o, a, l) {
            var s = n.flattenSpans;
            null == s && (s = t.options.flattenSpans);
            var u = 0,
                c = null,
                f = new Oa(r, t.options.tabSize),
                d;
            for ("" == r && Zn(Qn(n, i), a); !f.eol();) {
                if (f.pos > t.options.maxHighlightLength ? (s = !1, l && ni(t, r, i, f.pos), f.pos = r.length, d = null) : d = Zn(Jn(n, f, i), a), t.options.addModeClass) {
                    var h = e.innerMode(n, i).mode.name;
                    h && (d = "m-" + (d ? h + " " + d : h))
                }
                s && c == d || (u < f.start && o(f.start, c), u = f.start, c = d), f.start = f.pos
            }
            for (; u < f.pos;) {
                var p = Math.min(f.pos, u + 5e4);
                o(p, c), u = p
            }
        }

        function ti(e, t, r, n) {
            var i = [e.state.modeGen],
                o = {};
            ei(e, t.text, e.doc.mode, r, function(e, t) {
                i.push(e, t)
            }, o, n);
            for (var a = 0; a < e.state.overlays.length; ++a) {
                var l = e.state.overlays[a],
                    s = 1,
                    u = 0;
                ei(e, t.text, l.mode, !0, function(e, t) {
                    for (var r = s; e > u;) {
                        var n = i[s];
                        n > e && i.splice(s, 1, e, i[s + 1], n), s += 2, u = Math.min(e, n)
                    }
                    if (t)
                        if (l.opaque) i.splice(r, s - r, e, "cm-overlay " + t), s = r + 2;
                        else
                            for (; s > r; r += 2) {
                                var o = i[r + 1];
                                i[r + 1] = (o ? o + " " : "") + "cm-overlay " + t
                            }
                }, o)
            }
            return {
                styles: i,
                classes: o.bgClass || o.textClass ? o : null
            }
        }

        function ri(e, t) {
            if (!t.styles || t.styles[0] != e.state.modeGen) {
                var r = ti(e, t, t.stateAfter = xt(e, ki(t)));
                t.styles = r.styles, r.classes ? t.styleClasses = r.classes : t.styleClasses && (t.styleClasses = null)
            }
            return t.styles
        }

        function ni(e, t, r, n) {
            var i = e.doc.mode,
                o = new Oa(t, e.options.tabSize);
            for (o.start = o.pos = n || 0, "" == t && Qn(i, r); !o.eol() && o.pos <= e.options.maxHighlightLength;) Jn(i, o, r), o.start = o.pos
        }

        function ii(e, t) {
            if (!e || /^\s*$/.test(e)) return null;
            var r = t.addModeClass ? _a : Pa;
            return r[e] || (r[e] = e.replace(/\S+/g, "cm-$&"))
        }

        function oi(e, t) {
            var r = lo("span", null, null, Fo ? "padding-right: .1px" : null),
                n = {
                    pre: lo("pre", [r]),
                    content: r,
                    col: 0,
                    pos: 0,
                    cm: e
                };
            t.measure = {};
            for (var i = 0; i <= (t.rest ? t.rest.length : 0); i++) {
                var o = i ? t.rest[i - 1] : t.line,
                    a;
                n.pos = 0, n.addToken = li, (_o || Fo) && e.getOption("lineWrapping") && (n.addToken = si(n.addToken)), bo(e.display.measure) && (a = Si(o)) && (n.addToken = ui(n.addToken, a)), n.map = [], fi(o, n, ri(e, o)), o.styleClasses && (o.styleClasses.bgClass && (n.bgClass = go(o.styleClasses.bgClass, n.bgClass || "")), o.styleClasses.textClass && (n.textClass = go(o.styleClasses.textClass, n.textClass || ""))), 0 == n.map.length && n.map.push(0, 0, n.content.appendChild(yo(e.display.measure))), 0 == i ? (t.measure.map = n.map, t.measure.cache = {}) : ((t.measure.maps || (t.measure.maps = [])).push(n.map), (t.measure.caches || (t.measure.caches = [])).push({}))
            }
            return $a(e, "renderLine", e, t.line, n.pre), n
        }

        function ai(e) {
            var t = lo("span", "•", "cm-invalidchar");
            return t.title = "\\u" + e.charCodeAt(0).toString(16), t
        }

        function li(e, t, r, n, i, o) {
            if (t) {
                var a = e.cm.options.specialChars,
                    l = !1;
                if (a.test(t))
                    for (var s = document.createDocumentFragment(), u = 0;;) {
                        a.lastIndex = u;
                        var c = a.exec(t),
                            f = c ? c.index - u : t.length - u;
                        if (f) {
                            var d = document.createTextNode(t.slice(u, u + f));
                            s.appendChild(Io ? lo("span", [d]) : d), e.map.push(e.pos, e.pos + f, d), e.col += f, e.pos += f
                        }
                        if (!c) break;
                        if (u += f + 1, "	" == c[0]) {
                            var h = e.cm.options.tabSize,
                                p = h - e.col % h,
                                d = s.appendChild(lo("span", Qi(p), "cm-tab"));
                            e.col += p
                        } else {
                            var d = e.cm.options.specialCharPlaceholder(c[0]);
                            s.appendChild(Io ? lo("span", [d]) : d), e.col += 1
                        }
                        e.map.push(e.pos, e.pos + 1, d), e.pos++
                    } else {
                        e.col += t.length;
                        var s = document.createTextNode(t);
                        e.map.push(e.pos, e.pos + t.length, s), Io && (l = !0), e.pos += t.length
                    }
                if (r || n || i || l) {
                    var m = r || "";
                    n && (m += n), i && (m += i);
                    var g = lo("span", [s], m);
                    return o && (g.title = o), e.content.appendChild(g)
                }
                e.content.appendChild(s)
            }
        }

        function si(e) {
            function t(e) {
                for (var t = " ", r = 0; r < e.length - 2; ++r) t += r % 2 ? " " : " ";
                return t += " "
            }
            return function(r, n, i, o, a, l) {
                e(r, n.replace(/ {3,}/g, t), i, o, a, l)
            }
        }

        function ui(e, t) {
            return function(r, n, i, o, a, l) {
                i = i ? i + " cm-force-border" : "cm-force-border";
                for (var s = r.pos, u = s + n.length;;) {
                    for (var c = 0; c < t.length; c++) {
                        var f = t[c];
                        if (f.to > s && f.from <= s) break
                    }
                    if (f.to >= u) return e(r, n, i, o, a, l);
                    e(r, n.slice(0, f.to - s), i, o, null, l), o = null, n = n.slice(f.to - s), s = f.to
                }
            }
        }

        function ci(e, t, r, n) {
            var i = !n && r.widgetNode;
            i && (e.map.push(e.pos, e.pos + t, i), e.content.appendChild(i)), e.pos += t
        }

        function fi(e, t, r) {
            var n = e.markedSpans,
                i = e.text,
                o = 0;
            if (n)
                for (var a = i.length, l = 0, s = 1, u = "", c, f = 0, d, h, p, m, g;;) {
                    if (f == l) {
                        d = h = p = m = "", g = null, f = 1 / 0;
                        for (var v = [], y = 0; y < n.length; ++y) {
                            var b = n[y],
                                w = b.marker;
                            b.from <= l && (null == b.to || b.to > l) ? (null != b.to && f > b.to && (f = b.to, h = ""), w.className && (d += " " + w.className), w.startStyle && b.from == l && (p += " " + w.startStyle), w.endStyle && b.to == f && (h += " " + w.endStyle), w.title && !m && (m = w.title), w.collapsed && (!g || In(g.marker, w) < 0) && (g = b)) : b.from > l && f > b.from && (f = b.from), "bookmark" == w.type && b.from == l && w.widgetNode && v.push(w)
                        }
                        if (g && (g.from || 0) == l && (ci(t, (null == g.to ? a + 1 : g.to) - l, g.marker, null == g.from), null == g.to)) return;
                        if (!g && v.length)
                            for (var y = 0; y < v.length; ++y) ci(t, 0, v[y])
                    }
                    if (l >= a) break;
                    for (var x = Math.min(a, f);;) {
                        if (u) {
                            var k = l + u.length;
                            if (!g) {
                                var C = k > x ? u.slice(0, x - l) : u;
                                t.addToken(t, C, c ? c + d : d, p, l + C.length == f ? h : "", m)
                            }
                            if (k >= x) {
                                u = u.slice(x - l), l = x;
                                break
                            }
                            l = k, p = ""
                        }
                        u = i.slice(o, o = r[s++]), c = ii(r[s++], t.cm.options)
                    }
                } else
                    for (var s = 1; s < r.length; s += 2) t.addToken(t, i.slice(o, o = r[s]), ii(r[s + 1], t.cm.options))
        }

        function di(e, t) {
            return 0 == t.from.ch && 0 == t.to.ch && "" == Ji(t.text) && (!e.cm || e.cm.options.wholeLineUpdateBefore)
        }

        function hi(e, t, r, n) {
            function i(e) {
                return r ? r[e] : null
            }

            function o(e, r, i) {
                Yn(e, r, i, n), Gi(e, "change", e, t)
            }
            var a = t.from,
                l = t.to,
                s = t.text,
                u = yi(e, a.line),
                c = yi(e, l.line),
                f = Ji(s),
                d = i(s.length - 1),
                h = l.line - a.line;
            if (di(e, t)) {
                for (var p = 0, m = []; p < s.length - 1; ++p) m.push(new Da(s[p], i(p), n));
                o(c, c.text, d), h && e.remove(a.line, h), m.length && e.insert(a.line, m)
            } else if (u == c)
                if (1 == s.length) o(u, u.text.slice(0, a.ch) + f + u.text.slice(l.ch), d);
                else {
                    for (var m = [], p = 1; p < s.length - 1; ++p) m.push(new Da(s[p], i(p), n));
                    m.push(new Da(f + u.text.slice(l.ch), d, n)), o(u, u.text.slice(0, a.ch) + s[0], i(0)), e.insert(a.line + 1, m)
                } else if (1 == s.length) o(u, u.text.slice(0, a.ch) + s[0] + c.text.slice(l.ch), i(0)), e.remove(a.line + 1, h);
            else {
                o(u, u.text.slice(0, a.ch) + s[0], i(0)), o(c, f + c.text.slice(l.ch), d);
                for (var p = 1, m = []; p < s.length - 1; ++p) m.push(new Da(s[p], i(p), n));
                h > 1 && e.remove(a.line + 1, h - 1), e.insert(a.line + 1, m)
            }
            Gi(e, "change", e, t)
        }

        function pi(e) {
            this.lines = e, this.parent = null;
            for (var t = 0, r = 0; t < e.length; ++t) e[t].parent = this, r += e[t].height;
            this.height = r
        }

        function mi(e) {
            this.children = e;
            for (var t = 0, r = 0, n = 0; n < e.length; ++n) {
                var i = e[n];
                t += i.chunkSize(), r += i.height, i.parent = this
            }
            this.size = t, this.height = r, this.parent = null
        }

        function gi(e, t, r) {
            function n(e, i, o) {
                if (e.linked)
                    for (var a = 0; a < e.linked.length; ++a) {
                        var l = e.linked[a];
                        if (l.doc != i) {
                            var s = o && l.sharedHist;
                            (!r || s) && (t(l.doc, s), n(l.doc, e, s))
                        }
                    }
            }
            n(e, null, !0)
        }

        function vi(e, t) {
            if (t.cm) throw new Error("This document is already in use.");
            e.doc = t, t.cm = e, a(e), r(e), e.options.lineWrapping || h(e), e.options.mode = t.modeOption, rr(e)
        }

        function yi(e, t) {
            if (t -= e.first, 0 > t || t >= e.size) throw new Error("There is no line " + (t + e.first) + " in the document.");
            for (var r = e; !r.lines;)
                for (var n = 0;; ++n) {
                    var i = r.children[n],
                        o = i.chunkSize();
                    if (o > t) {
                        r = i;
                        break
                    }
                    t -= o
                }
            return r.lines[t]
        }

        function bi(e, t, r) {
            var n = [],
                i = t.line;
            return e.iter(t.line, r.line + 1, function(e) {
                var o = e.text;
                i == r.line && (o = o.slice(0, r.ch)), i == t.line && (o = o.slice(t.ch)), n.push(o), ++i
            }), n
        }

        function wi(e, t, r) {
            var n = [];
            return e.iter(t, r, function(e) {
                n.push(e.text)
            }), n
        }

        function xi(e, t) {
            var r = t - e.height;
            if (r)
                for (var n = e; n; n = n.parent) n.height += r
        }

        function ki(e) {
            if (null == e.parent) return null;
            for (var t = e.parent, r = eo(t.lines, e), n = t.parent; n; t = n, n = n.parent)
                for (var i = 0; n.children[i] != t; ++i) r += n.children[i].chunkSize();
            return r + t.first
        }

        function Ci(e, t) {
            var r = e.first;
            e: do {
                for (var n = 0; n < e.children.length; ++n) {
                    var i = e.children[n],
                        o = i.height;
                    if (o > t) {
                        e = i;
                        continue e
                    }
                    t -= o, r += i.chunkSize()
                }
                return r
            } while (!e.lines);
            for (var n = 0; n < e.lines.length; ++n) {
                var a = e.lines[n],
                    l = a.height;
                if (l > t) break;
                t -= l
            }
            return r + n
        }

        function Li(e) {
            e = Bn(e);
            for (var t = 0, r = e.parent, n = 0; n < r.lines.length; ++n) {
                var i = r.lines[n];
                if (i == e) break;
                t += i.height
            }
            for (var o = r.parent; o; r = o, o = r.parent)
                for (var n = 0; n < o.children.length; ++n) {
                    var a = o.children[n];
                    if (a == r) break;
                    t += a.height
                }
            return t
        }

        function Si(e) {
            var t = e.order;
            return null == t && (t = e.order = yl(e.text)), t
        }

        function Mi(e) {
            this.done = [], this.undone = [], this.undoDepth = 1 / 0, this.lastModTime = this.lastSelTime = 0, this.lastOp = null, this.lastOrigin = this.lastSelOrigin = null, this.generation = this.maxGeneration = e || 1
        }

        function Ti(e, t) {
            var r = {
                from: V(t.from),
                to: ma(t),
                text: bi(e, t.from, t.to)
            };
            return Ei(e, r, t.from.line, t.to.line + 1), gi(e, function(e) {
                Ei(e, r, t.from.line, t.to.line + 1)
            }, !0), r
        }

        function Ai(e) {
            for (; e.length;) {
                var t = Ji(e);
                if (!t.ranges) break;
                e.pop()
            }
        }

        function Ni(e, t) {
            return t ? (Ai(e.done), Ji(e.done)) : e.done.length && !Ji(e.done).ranges ? Ji(e.done) : e.done.length > 1 && !e.done[e.done.length - 2].ranges ? (e.done.pop(), Ji(e.done)) : void 0
        }

        function Hi(e, t, r, n) {
            var i = e.history;
            i.undone.length = 0;
            var o = +new Date,
                a;
            if ((i.lastOp == n || i.lastOrigin == t.origin && t.origin && ("+" == t.origin.charAt(0) && e.cm && i.lastModTime > o - e.cm.options.historyEventDelay || "*" == t.origin.charAt(0))) && (a = Ni(i, i.lastOp == n))) {
                var l = Ji(a.changes);
                0 == na(t.from, t.to) && 0 == na(t.from, l.to) ? l.to = ma(t) : a.changes.push(Ti(e, t))
            } else {
                var s = Ji(i.done);
                for (s && s.ranges || Wi(e.sel, i.done), a = {
                        changes: [Ti(e, t)],
                        generation: i.generation
                    }, i.done.push(a); i.done.length > i.undoDepth;) i.done.shift(), i.done[0].ranges || i.done.shift()
            }
            i.done.push(r), i.generation = ++i.maxGeneration, i.lastModTime = i.lastSelTime = o, i.lastOp = n, i.lastOrigin = i.lastSelOrigin = t.origin, l || $a(e, "historyAdded")
        }

        function Oi(e, t, r, n) {
            var i = t.charAt(0);
            return "*" == i || "+" == i && r.ranges.length == n.ranges.length && r.somethingSelected() == n.somethingSelected() && new Date - e.history.lastSelTime <= (e.cm ? e.cm.options.historyEventDelay : 500)
        }

        function zi(e, t, r, n) {
            var i = e.history,
                o = n && n.origin;
            r == i.lastOp || o && i.lastSelOrigin == o && (i.lastModTime == i.lastSelTime && i.lastOrigin == o || Oi(e, o, Ji(i.done), t)) ? i.done[i.done.length - 1] = t : Wi(t, i.done), i.lastSelTime = +new Date, i.lastSelOrigin = o, i.lastOp = r, n && n.clearRedo !== !1 && Ai(i.undone)
        }

        function Wi(e, t) {
            var r = Ji(t);
            r && r.ranges && r.equals(e) || t.push(e)
        }

        function Ei(e, t, r, n) {
            var i = t["spans_" + e.id],
                o = 0;
            e.iter(Math.max(e.first, r), Math.min(e.first + e.size, n), function(r) {
                r.markedSpans && ((i || (i = t["spans_" + e.id] = {}))[o] = r.markedSpans), ++o
            })
        }

        function Ii(e) {
            if (!e) return null;
            for (var t = 0, r; t < e.length; ++t) e[t].marker.explicitlyCleared ? r || (r = e.slice(0, t)) : r && r.push(e[t]);
            return r ? r.length ? r : null : e
        }

        function Di(e, t) {
            var r = t["spans_" + e.id];
            if (!r) return null;
            for (var n = 0, i = []; n < t.text.length; ++n) i.push(Ii(r[n]));
            return i
        }

        function Pi(e, t, r) {
            for (var n = 0, i = []; n < e.length; ++n) {
                var o = e[n];
                if (o.ranges) i.push(r ? U.prototype.deepCopy.call(o) : o);
                else {
                    var a = o.changes,
                        l = [];
                    i.push({
                        changes: l
                    });
                    for (var s = 0; s < a.length; ++s) {
                        var u = a[s],
                            c;
                        if (l.push({
                                from: u.from,
                                to: u.to,
                                text: u.text
                            }), t)
                            for (var f in u)(c = f.match(/^spans_(\d+)$/)) && eo(t, Number(c[1])) > -1 && (Ji(l)[f] = u[f], delete u[f])
                    }
                }
            }
            return i
        }

        function _i(e, t, r, n) {
            r < e.line ? e.line += n : t < e.line && (e.line = t, e.ch = 0)
        }

        function Fi(e, t, r, n) {
            for (var i = 0; i < e.length; ++i) {
                var o = e[i],
                    a = !0;
                if (o.ranges) {
                    o.copied || (o = e[i] = o.deepCopy(), o.copied = !0);
                    for (var l = 0; l < o.ranges.length; l++) _i(o.ranges[l].anchor, t, r, n), _i(o.ranges[l].head, t, r, n)
                } else {
                    for (var l = 0; l < o.changes.length; ++l) {
                        var s = o.changes[l];
                        if (r < s.from.line) s.from = ra(s.from.line + n, s.from.ch), s.to = ra(s.to.line + n, s.to.ch);
                        else if (t <= s.to.line) {
                            a = !1;
                            break
                        }
                    }
                    a || (e.splice(0, i + 1), i = 0)
                }
            }
        }

        function Bi(e, t) {
            var r = t.from.line,
                n = t.to.line,
                i = t.text.length - (n - r) - 1;
            Fi(e.done, r, n, i), Fi(e.undone, r, n, i)
        }

        function Ri(e) {
            return null != e.defaultPrevented ? e.defaultPrevented : 0 == e.returnValue
        }

        function ji(e) {
            return e.target || e.srcElement
        }

        function Vi(e) {
            var t = e.which;
            return null == t && (1 & e.button ? t = 1 : 2 & e.button ? t = 3 : 4 & e.button && (t = 2)), Yo && e.ctrlKey && 1 == t && (t = 3), t
        }

        function Gi(e, t) {
            function r(e) {
                return function() {
                    e.apply(null, i)
                }
            }
            var n = e._handlers && e._handlers[t];
            if (n) {
                var i = Array.prototype.slice.call(arguments, 2);
                Ya || (++Xa, Ya = [], setTimeout(qi, 0));
                for (var o = 0; o < n.length; ++o) Ya.push(r(n[o]))
            }
        }

        function qi() {
            --Xa;
            var e = Ya;
            Ya = null;
            for (var t = 0; t < e.length; ++t) e[t]()
        }

        function Ui(e, t, r) {
            return $a(e, r || t.type, e, t), Ri(t) || t.codemirrorIgnore
        }

        function Ki(e) {
            var t = e._handlers && e._handlers.cursorActivity;
            if (t)
                for (var r = e.curOp.cursorActivityHandlers || (e.curOp.cursorActivityHandlers = []), n = 0; n < t.length; ++n) - 1 == eo(r, t[n]) && r.push(t[n])
        }

        function $i(e, t) {
            var r = e._handlers && e._handlers[t];
            return r && r.length > 0
        }

        function Yi(e) {
            e.prototype.on = function(e, t) {
                Ua(this, e, t)
            }, e.prototype.off = function(e, t) {
                Ka(this, e, t)
            }
        }

        function Xi() {
            this.id = null
        }

        function Zi(e, t, r) {
            for (var n = 0, i = 0;;) {
                var o = e.indexOf("	", n); - 1 == o && (o = e.length);
                var a = o - n;
                if (o == e.length || i + a >= t) return n + Math.min(a, t - i);
                if (i += o - n, i += r - i % r, n = o + 1, i >= t) return n
            }
        }

        function Qi(e) {
            for (; nl.length <= e;) nl.push(Ji(nl) + " ");
            return nl[e]
        }

        function Ji(e) {
            return e[e.length - 1]
        }

        function eo(e, t) {
            for (var r = 0; r < e.length; ++r)
                if (e[r] == t) return r;
            return -1
        }

        function to(e, t) {
            for (var r = [], n = 0; n < e.length; n++) r[n] = t(e[n], n);
            return r
        }

        function ro(e, t) {
            var r;
            if (Object.create) r = Object.create(e);
            else {
                var n = function() {};
                n.prototype = e, r = new n
            }
            return t && no(t, r), r
        }

        function no(e, t, r) {
            t || (t = {});
            for (var n in e) !e.hasOwnProperty(n) || r === !1 && t.hasOwnProperty(n) || (t[n] = e[n]);
            return t
        }

        function io(e) {
            var t = Array.prototype.slice.call(arguments, 1);
            return function() {
                return e.apply(null, t)
            }
        }

        function oo(e) {
            for (var t in e)
                if (e.hasOwnProperty(t) && e[t]) return !1;
            return !0
        }

        function ao(e) {
            return e.charCodeAt(0) >= 768 && ll.test(e)
        }

        function lo(e, t, r, n) {
            var i = document.createElement(e);
            if (r && (i.className = r), n && (i.style.cssText = n), "string" == typeof t) i.appendChild(document.createTextNode(t));
            else if (t)
                for (var o = 0; o < t.length; ++o) i.appendChild(t[o]);
            return i
        }

        function so(e) {
            for (var t = e.childNodes.length; t > 0; --t) e.removeChild(e.firstChild);
            return e
        }

        function uo(e, t) {
            return so(e).appendChild(t)
        }

        function co(e, t) {
            if (e.contains) return e.contains(t);
            for (; t = t.parentNode;)
                if (t == e) return !0
        }

        function fo() {
            return document.activeElement
        }

        function ho(e) {
            return new RegExp("\\b" + e + "\\b\\s*")
        }

        function po(e, t) {
            var r = ho(t);
            r.test(e.className) && (e.className = e.className.replace(r, ""))
        }

        function mo(e, t) {
            ho(t).test(e.className) || (e.className += " " + t)
        }

        function go(e, t) {
            for (var r = e.split(" "), n = 0; n < r.length; n++) r[n] && !ho(r[n]).test(t) && (t += " " + r[n]);
            return t
        }

        function vo(e) {
            if (null != cl) return cl;
            var t = lo("div", null, null, "width: 50px; height: 50px; overflow-x: scroll");
            return uo(e, t), t.offsetWidth && (cl = t.offsetHeight - t.clientHeight), cl || 0
        }

        function yo(e) {
            if (null == fl) {
                var t = lo("span", "​");
                uo(e, lo("span", [t, document.createTextNode("x")])), 0 != e.firstChild.offsetHeight && (fl = t.offsetWidth <= 1 && t.offsetHeight > 2 && !Eo)
            }
            return fl ? lo("span", "​") : lo("span", " ", null, "display: inline-block; width: 1px; margin-right: -1px")
        }

        function bo(e) {
            if (null != dl) return dl;
            var t = uo(e, document.createTextNode("AخA")),
                r = sl(t, 0, 1).getBoundingClientRect();
            if (r.left == r.right) return !1;
            var n = sl(t, 1, 2).getBoundingClientRect();
            return dl = n.right - r.right < 3
        }

        function wo(e, t, r, n) {
            if (!e) return n(t, r, "ltr");
            for (var i = !1, o = 0; o < e.length; ++o) {
                var a = e[o];
                (a.from < r && a.to > t || t == r && a.to == t) && (n(Math.max(a.from, t), Math.min(a.to, r), 1 == a.level ? "rtl" : "ltr"), i = !0)
            }
            i || n(t, r, "ltr")
        }

        function xo(e) {
            return e.level % 2 ? e.to : e.from
        }

        function ko(e) {
            return e.level % 2 ? e.from : e.to
        }

        function Co(e) {
            var t = Si(e);
            return t ? xo(t[0]) : 0
        }

        function Lo(e) {
            var t = Si(e);
            return t ? ko(Ji(t)) : e.text.length
        }

        function So(e, t) {
            var r = yi(e.doc, t),
                n = Bn(r);
            n != r && (t = ki(n));
            var i = Si(n),
                o = i ? i[0].level % 2 ? Lo(n) : Co(n) : 0;
            return ra(t, o)
        }

        function Mo(e, t) {
            for (var r, n = yi(e.doc, t); r = _n(n);) n = r.find(1, !0).line, t = null;
            var i = Si(n),
                o = i ? i[0].level % 2 ? Co(n) : Lo(n) : n.text.length;
            return ra(null == t ? ki(n) : t, o)
        }

        function To(e, t, r) {
            var n = e[0].level;
            return t == n ? !0 : r == n ? !1 : r > t
        }

        function Ao(e, t) {
            vl = null;
            for (var r = 0, n; r < e.length; ++r) {
                var i = e[r];
                if (i.from < t && i.to > t) return r;
                if (i.from == t || i.to == t) {
                    if (null != n) return To(e, i.level, e[n].level) ? (i.from != i.to && (vl = n), r) : (i.from != i.to && (vl = r), n);
                    n = r
                }
            }
            return n
        }

        function No(e, t, r, n) {
            if (!n) return t + r;
            do t += r; while (t > 0 && ao(e.text.charAt(t)));
            return t
        }

        function Ho(e, t, r, n) {
            var i = Si(e);
            if (!i) return Oo(e, t, r, n);
            for (var o = Ao(i, t), a = i[o], l = No(e, t, a.level % 2 ? -r : r, n);;) {
                if (l > a.from && l < a.to) return l;
                if (l == a.from || l == a.to) return Ao(i, l) == o ? l : (a = i[o += r], r > 0 == a.level % 2 ? a.to : a.from);
                if (a = i[o += r], !a) return null;
                l = r > 0 == a.level % 2 ? No(e, a.to, -1, n) : No(e, a.from, 1, n)
            }
        }

        function Oo(e, t, r, n) {
            var i = t + r;
            if (n)
                for (; i > 0 && ao(e.text.charAt(i));) i += r;
            return 0 > i || i > e.text.length ? null : i
        }
        var zo = /gecko\/\d/i.test(navigator.userAgent),
            Wo = /MSIE \d/.test(navigator.userAgent),
            Eo = Wo && (null == document.documentMode || document.documentMode < 8),
            Io = Wo && (null == document.documentMode || document.documentMode < 9),
            Do = Wo && (null == document.documentMode || document.documentMode < 10),
            Po = /Trident\/([7-9]|\d{2,})\./.test(navigator.userAgent),
            _o = Wo || Po,
            Fo = /WebKit\//.test(navigator.userAgent),
            Bo = Fo && /Qt\/\d+\.\d+/.test(navigator.userAgent),
            Ro = /Chrome\//.test(navigator.userAgent),
            jo = /Opera\//.test(navigator.userAgent),
            Vo = /Apple Computer/.test(navigator.vendor),
            Go = /KHTML\//.test(navigator.userAgent),
            qo = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),
            Uo = /PhantomJS/.test(navigator.userAgent),
            Ko = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent),
            $o = Ko || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),
            Yo = Ko || /Mac/.test(navigator.platform),
            Xo = /win/i.test(navigator.platform),
            Zo = jo && navigator.userAgent.match(/Version\/(\d*\.\d*)/);
        Zo && (Zo = Number(Zo[1])), Zo && Zo >= 15 && (jo = !1, Fo = !0);
        var Qo = Yo && (Bo || jo && (null == Zo || 12.11 > Zo)),
            Jo = zo || _o && !Io,
            ea = !1,
            ta = !1,
            ra = e.Pos = function(e, t) {
                return this instanceof ra ? (this.line = e, void(this.ch = t)) : new ra(e, t)
            },
            na = e.cmpPos = function(e, t) {
                return e.line - t.line || e.ch - t.ch
            };
        U.prototype = {
            primary: function() {
                return this.ranges[this.primIndex]
            },
            equals: function(e) {
                if (e == this) return !0;
                if (e.primIndex != this.primIndex || e.ranges.length != this.ranges.length) return !1;
                for (var t = 0; t < this.ranges.length; t++) {
                    var r = this.ranges[t],
                        n = e.ranges[t];
                    if (0 != na(r.anchor, n.anchor) || 0 != na(r.head, n.head)) return !1
                }
                return !0
            },
            deepCopy: function() {
                for (var e = [], t = 0; t < this.ranges.length; t++) e[t] = new K(V(this.ranges[t].anchor), V(this.ranges[t].head));
                return new U(e, this.primIndex)
            },
            somethingSelected: function() {
                for (var e = 0; e < this.ranges.length; e++)
                    if (!this.ranges[e].empty()) return !0;
                return !1
            },
            contains: function(e, t) {
                t || (t = e);
                for (var r = 0; r < this.ranges.length; r++) {
                    var n = this.ranges[r];
                    if (na(t, n.from()) >= 0 && na(e, n.to()) <= 0) return r
                }
                return -1
            }
        }, K.prototype = {
            from: function() {
                return q(this.anchor, this.head)
            },
            to: function() {
                return G(this.anchor, this.head)
            },
            empty: function() {
                return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch
            }
        };
        var ia = {
                left: 0,
                right: 0,
                top: 0,
                bottom: 0
            },
            oa, aa = 0,
            la, sa, ua = 0,
            ca = 0,
            fa = null;
        _o ? fa = -.53 : zo ? fa = 15 : Ro ? fa = -.7 : Vo && (fa = -1 / 3);
        var da, ha = null,
            pa, ma = e.changeEnd = function(e) {
                return e.text ? ra(e.from.line + e.text.length - 1, Ji(e.text).length + (1 == e.text.length ? e.from.ch : 0)) : e.to
            };
        e.prototype = {
            constructor: e,
            focus: function() {
                window.focus(), hr(this), cr(this)
            },
            setOption: function(e, t) {
                var r = this.options,
                    n = r[e];
                (r[e] != t || "mode" == e) && (r[e] = t, va.hasOwnProperty(e) && Zt(this, va[e])(this, t, n))
            },
            getOption: function(e) {
                return this.options[e]
            },
            getDoc: function() {
                return this.doc
            },
            addKeyMap: function(e, t) {
                this.state.keyMaps[t ? "push" : "unshift"](e)
            },
            removeKeyMap: function(e) {
                for (var t = this.state.keyMaps, r = 0; r < t.length; ++r)
                    if (t[r] == e || "string" != typeof t[r] && t[r].name == e) return t.splice(r, 1), !0
            },
            addOverlay: Qt(function(t, r) {
                var n = t.token ? t : e.getMode(this.options, t);
                if (n.startState) throw new Error("Overlays may not be stateful.");
                this.state.overlays.push({
                    mode: n,
                    modeSpec: t,
                    opaque: r && r.opaque
                }), this.state.modeGen++, rr(this)
            }),
            removeOverlay: Qt(function(e) {
                for (var t = this.state.overlays, r = 0; r < t.length; ++r) {
                    var n = t[r].modeSpec;
                    if (n == e || "string" == typeof e && n.name == e) return t.splice(r, 1), this.state.modeGen++, void rr(this)
                }
            }),
            indentLine: Qt(function(e, t, r) {
                "string" != typeof t && "number" != typeof t && (t = null == t ? this.options.smartIndent ? "smart" : "prev" : t ? "add" : "subtract"), J(this.doc, e) && sn(this, e, t, r)
            }),
            indentSelection: Qt(function(e) {
                for (var t = this.doc.sel.ranges, r = -1, n = 0; n < t.length; n++) {
                    var i = t[n];
                    if (i.empty()) i.head.line > r && (sn(this, i.head.line, e, !0), r = i.head.line, n == this.doc.sel.primIndex && an(this));
                    else {
                        var o = Math.max(r, i.from().line),
                            a = i.to();
                        r = Math.min(this.lastLine(), a.line - (a.ch ? 0 : 1)) + 1;
                        for (var l = o; r > l; ++l) sn(this, l, e)
                    }
                }
            }),
            getTokenAt: function(e, t) {
                var r = this.doc;
                e = Z(r, e);
                for (var n = xt(this, e.line, t), i = this.doc.mode, o = yi(r, e.line), a = new Oa(o.text, this.options.tabSize); a.pos < e.ch && !a.eol();) {
                    a.start = a.pos;
                    var l = Jn(i, a, n)
                }
                return {
                    start: a.start,
                    end: a.pos,
                    string: a.current(),
                    type: l || null,
                    state: n
                }
            },
            getTokenTypeAt: function(e) {
                e = Z(this.doc, e);
                var t = ri(this, yi(this.doc, e.line)),
                    r = 0,
                    n = (t.length - 1) / 2,
                    i = e.ch,
                    o;
                if (0 == i) o = t[2];
                else
                    for (;;) {
                        var a = r + n >> 1;
                        if ((a ? t[2 * a - 1] : 0) >= i) n = a;
                        else {
                            if (!(t[2 * a + 1] < i)) {
                                o = t[2 * a + 2];
                                break
                            }
                            r = a + 1
                        }
                    }
                var l = o ? o.indexOf("cm-overlay ") : -1;
                return 0 > l ? o : 0 == l ? null : o.slice(0, l - 1)
            },
            getModeAt: function(t) {
                var r = this.doc.mode;
                return r.innerMode ? e.innerMode(r, this.getTokenAt(t).state).mode : r
            },
            getHelper: function(e, t) {
                return this.getHelpers(e, t)[0]
            },
            getHelpers: function(e, t) {
                var r = [];
                if (!Ca.hasOwnProperty(t)) return Ca;
                var n = Ca[t],
                    i = this.getModeAt(e);
                if ("string" == typeof i[t]) n[i[t]] && r.push(n[i[t]]);
                else if (i[t])
                    for (var o = 0; o < i[t].length; o++) {
                        var a = n[i[t][o]];
                        a && r.push(a)
                    } else i.helperType && n[i.helperType] ? r.push(n[i.helperType]) : n[i.name] && r.push(n[i.name]);
                for (var o = 0; o < n._global.length; o++) {
                    var l = n._global[o];
                    l.pred(i, this) && -1 == eo(r, l.val) && r.push(l.val)
                }
                return r
            },
            getStateAfter: function(e, t) {
                var r = this.doc;
                return e = X(r, null == e ? r.first + r.size - 1 : e), xt(this, e + 1, t)
            },
            cursorCoords: function(e, t) {
                var r, n = this.doc.sel.primary();
                return r = null == e ? n.head : "object" == typeof e ? Z(this.doc, e) : e ? n.from() : n.to(), Rt(this, r, t || "page")
            },
            charCoords: function(e, t) {
                return Bt(this, Z(this.doc, e), t || "page")
            },
            coordsChar: function(e, t) {
                return e = Ft(this, e, t || "page"), Gt(this, e.left, e.top)
            },
            lineAtHeight: function(e, t) {
                return e = Ft(this, {
                    top: e,
                    left: 0
                }, t || "page").top, Ci(this.doc, e + this.display.viewOffset)
            },
            heightAtLine: function(e, t) {
                var r = !1,
                    n = this.doc.first + this.doc.size - 1;
                e < this.doc.first ? e = this.doc.first : e > n && (e = n, r = !0);
                var i = yi(this.doc, e);
                return _t(this, i, {
                    top: 0,
                    left: 0
                }, t || "page").top + (r ? this.doc.height - Li(i) : 0)
            },
            defaultTextHeight: function() {
                return Ut(this.display)
            },
            defaultCharWidth: function() {
                return Kt(this.display)
            },
            setGutterMarker: Qt(function(e, t, r) {
                return un(this, e, "gutter", function(e) {
                    var n = e.gutterMarkers || (e.gutterMarkers = {});
                    return n[t] = r, !r && oo(n) && (e.gutterMarkers = null), !0
                })
            }),
            clearGutter: Qt(function(e) {
                var t = this,
                    r = t.doc,
                    n = r.first;
                r.iter(function(r) {
                    r.gutterMarkers && r.gutterMarkers[e] && (r.gutterMarkers[e] = null, nr(t, n, "gutter"), oo(r.gutterMarkers) && (r.gutterMarkers = null)), ++n
                })
            }),
            addLineClass: Qt(function(e, t, r) {
                return un(this, e, "class", function(e) {
                    var n = "text" == t ? "textClass" : "background" == t ? "bgClass" : "wrapClass";
                    if (e[n]) {
                        if (new RegExp("(?:^|\\s)" + r + "(?:$|\\s)").test(e[n])) return !1;
                        e[n] += " " + r
                    } else e[n] = r;
                    return !0
                })
            }),
            removeLineClass: Qt(function(e, t, r) {
                return un(this, e, "class", function(e) {
                    var n = "text" == t ? "textClass" : "background" == t ? "bgClass" : "wrapClass",
                        i = e[n];
                    if (!i) return !1;
                    if (null == r) e[n] = null;
                    else {
                        var o = i.match(new RegExp("(?:^|\\s+)" + r + "(?:$|\\s+)"));
                        if (!o) return !1;
                        var a = o.index + o[0].length;
                        e[n] = i.slice(0, o.index) + (o.index && a != i.length ? " " : "") + i.slice(a) || null
                    }
                    return !0
                })
            }),
            addLineWidget: Qt(function(e, t, r) {
                return $n(this, e, t, r)
            }),
            removeLineWidget: function(e) {
                e.clear()
            },
            lineInfo: function(e) {
                if ("number" == typeof e) {
                    if (!J(this.doc, e)) return null;
                    var t = e;
                    if (e = yi(this.doc, e), !e) return null
                } else {
                    var t = ki(e);
                    if (null == t) return null
                }
                return {
                    line: t,
                    handle: e,
                    text: e.text,
                    gutterMarkers: e.gutterMarkers,
                    textClass: e.textClass,
                    bgClass: e.bgClass,
                    wrapClass: e.wrapClass,
                    widgets: e.widgets
                }
            },
            getViewport: function() {
                return {
                    from: this.display.viewFrom,
                    to: this.display.viewTo
                }
            },
            addWidget: function(e, t, r, n, i) {
                var o = this.display;
                e = Rt(this, Z(this.doc, e));
                var a = e.bottom,
                    l = e.left;
                if (t.style.position = "absolute", o.sizer.appendChild(t), "over" == n) a = e.top;
                else if ("above" == n || "near" == n) {
                    var s = Math.max(o.wrapper.clientHeight, this.doc.height),
                        u = Math.max(o.sizer.clientWidth, o.lineSpace.clientWidth);
                    ("above" == n || e.bottom + t.offsetHeight > s) && e.top > t.offsetHeight ? a = e.top - t.offsetHeight : e.bottom + t.offsetHeight <= s && (a = e.bottom), l + t.offsetWidth > u && (l = u - t.offsetWidth)
                }
                t.style.top = a + "px", t.style.left = t.style.right = "", "right" == i ? (l = o.sizer.clientWidth - t.offsetWidth, t.style.right = "0px") : ("left" == i ? l = 0 : "middle" == i && (l = (o.sizer.clientWidth - t.offsetWidth) / 2), t.style.left = l + "px"), r && rn(this, l, a, l + t.offsetWidth, a + t.offsetHeight)
            },
            triggerOnKeyDown: Qt(Er),
            triggerOnKeyPress: Qt(Pr),
            triggerOnKeyUp: Qt(Dr),
            execCommand: function(e) {
                return Ma.hasOwnProperty(e) ? Ma[e](this) : void 0
            },
            findPosH: function(e, t, r, n) {
                var i = 1;
                0 > t && (i = -1, t = -t);
                for (var o = 0, a = Z(this.doc, e); t > o && (a = fn(this.doc, a, i, r, n), !a.hitSide); ++o);
                return a
            },
            moveH: Qt(function(e, t) {
                var r = this;
                r.extendSelectionsBy(function(n) {
                    return r.display.shift || r.doc.extend || n.empty() ? fn(r.doc, n.head, e, t, r.options.rtlMoveVisually) : 0 > e ? n.from() : n.to()
                }, tl)
            }),
            deleteH: Qt(function(e, t) {
                var r = this.doc.sel,
                    n = this.doc;
                r.somethingSelected() ? n.replaceSelection("", null, "+delete") : cn(this, function(r) {
                    var i = fn(n, r.head, e, t, !1);
                    return 0 > e ? {
                        from: i,
                        to: r.head
                    } : {
                        from: r.head,
                        to: i
                    }
                })
            }),
            findPosV: function(e, t, r, n) {
                var i = 1,
                    o = n;
                0 > t && (i = -1, t = -t);
                for (var a = 0, l = Z(this.doc, e); t > a; ++a) {
                    var s = Rt(this, l, "div");
                    if (null == o ? o = s.left : s.left = o, l = dn(this, s, i, r), l.hitSide) break
                }
                return l
            },
            moveV: Qt(function(e, t) {
                var r = this,
                    n = this.doc,
                    i = [],
                    o = !r.display.shift && !n.extend && n.sel.somethingSelected();
                if (n.extendSelectionsBy(function(a) {
                        if (o) return 0 > e ? a.from() : a.to();
                        var l = Rt(r, a.head, "div");
                        null != a.goalColumn && (l.left = a.goalColumn), i.push(l.left);
                        var s = dn(r, l, e, t);
                        return "page" == t && a == n.sel.primary() && on(r, null, Bt(r, s, "div").top - l.top), s
                    }, tl), i.length)
                    for (var a = 0; a < n.sel.ranges.length; a++) n.sel.ranges[a].goalColumn = i[a]
            }),
            toggleOverwrite: function(e) {
                (null == e || e != this.state.overwrite) && ((this.state.overwrite = !this.state.overwrite) ? mo(this.display.cursorDiv, "CodeMirror-overwrite") : po(this.display.cursorDiv, "CodeMirror-overwrite"), $a(this, "overwriteToggle", this, this.state.overwrite))
            },
            hasFocus: function() {
                return fo() == this.display.input
            },
            scrollTo: Qt(function(e, t) {
                (null != e || null != t) && ln(this), null != e && (this.curOp.scrollLeft = e), null != t && (this.curOp.scrollTop = t)
            }),
            getScrollInfo: function() {
                var e = this.display.scroller,
                    t = Za;
                return {
                    left: e.scrollLeft,
                    top: e.scrollTop,
                    height: e.scrollHeight - t,
                    width: e.scrollWidth - t,
                    clientHeight: e.clientHeight - t,
                    clientWidth: e.clientWidth - t
                }
            },
            scrollIntoView: Qt(function(e, t) {
                if (null == e ? (e = {
                        from: this.doc.sel.primary().head,
                        to: null
                    }, null == t && (t = this.options.cursorScrollMargin)) : "number" == typeof e ? e = {
                        from: ra(e, 0),
                        to: null
                    } : null == e.from && (e = {
                        from: e,
                        to: null
                    }), e.to || (e.to = e.from), e.margin = t || 0, null != e.from.line) ln(this), this.curOp.scrollToPos = e;
                else {
                    var r = nn(this, Math.min(e.from.left, e.to.left), Math.min(e.from.top, e.to.top) - e.margin, Math.max(e.from.right, e.to.right), Math.max(e.from.bottom, e.to.bottom) + e.margin);
                    this.scrollTo(r.scrollLeft, r.scrollTop)
                }
            }),
            setSize: Qt(function(e, t) {
                function r(e) {
                    return "number" == typeof e || /^\d+$/.test(String(e)) ? e + "px" : e
                }
                null != e && (this.display.wrapper.style.width = r(e)), null != t && (this.display.wrapper.style.height = r(t)), this.options.lineWrapping && Et(this), this.curOp.forceUpdate = !0, $a(this, "refresh", this)
            }),
            operation: function(e) {
                return Xt(this, e)
            },
            refresh: Qt(function() {
                var e = this.display.cachedTextHeight;
                rr(this), this.curOp.forceUpdate = !0, It(this), this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop), f(this), (null == e || Math.abs(e - Ut(this.display)) > .5) && a(this), $a(this, "refresh", this)
            }),
            swapDoc: Qt(function(e) {
                var t = this.doc;
                return t.cm = null, vi(this, e), It(this), dr(this), this.scrollTo(e.scrollLeft, e.scrollTop), Gi(this, "swapDoc", this, t), t
            }),
            getInputField: function() {
                return this.display.input
            },
            getWrapperElement: function() {
                return this.display.wrapper
            },
            getScrollerElement: function() {
                return this.display.scroller
            },
            getGutterElement: function() {
                return this.display.gutters
            }
        }, Yi(e);
        var ga = e.defaults = {},
            va = e.optionHandlers = {},
            ya = e.Init = {
                toString: function() {
                    return "CodeMirror.Init"
                }
            };
        pn("value", "", function(e, t) {
            e.setValue(t)
        }, !0), pn("mode", null, function(e, t) {
            e.doc.modeOption = t, r(e)
        }, !0), pn("indentUnit", 2, r, !0), pn("indentWithTabs", !1), pn("smartIndent", !0), pn("tabSize", 4, function(e) {
            n(e), It(e), rr(e)
        }, !0), pn("specialChars", /[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\ufeff]/g, function(e, t) {
            e.options.specialChars = new RegExp(t.source + (t.test("	") ? "" : "|	"), "g"), e.refresh()
        }, !0), pn("specialCharPlaceholder", ai, function(e) {
            e.refresh()
        }, !0), pn("electricChars", !0), pn("rtlMoveVisually", !Xo), pn("wholeLineUpdateBefore", !0), pn("theme", "default", function(e) {
            s(e), u(e)
        }, !0), pn("keyMap", "default", l), pn("extraKeys", null), pn("lineWrapping", !1, i, !0), pn("gutters", [], function(e) {
            p(e.options), u(e)
        }, !0), pn("fixedGutter", !0, function(e, t) {
            e.display.gutters.style.left = t ? x(e.display) + "px" : "0", e.refresh()
        }, !0), pn("coverGutterNextToScrollbar", !1, g, !0), pn("lineNumbers", !1, function(e) {
            p(e.options), u(e)
        }, !0), pn("firstLineNumber", 1, u, !0), pn("lineNumberFormatter", function(e) {
            return e
        }, u, !0), pn("showCursorWhenSelecting", !1, pt, !0), pn("resetSelectionOnContextMenu", !0), pn("readOnly", !1, function(e, t) {
            "nocursor" == t ? (Fr(e), e.display.input.blur(), e.display.disabled = !0) : (e.display.disabled = !1, t || dr(e))
        }), pn("disableInput", !1, function(e, t) {
            t || dr(e)
        }, !0), pn("dragDrop", !0), pn("cursorBlinkRate", 530), pn("cursorScrollMargin", 0), pn("cursorHeight", 1), pn("workTime", 100), pn("workDelay", 100), pn("flattenSpans", !0, n, !0), pn("addModeClass", !1, n, !0), pn("pollInterval", 100), pn("undoDepth", 200, function(e, t) {
            e.doc.history.undoDepth = t
        }), pn("historyEventDelay", 1250), pn("viewportMargin", 10, function(e) {
            e.refresh()
        }, !0), pn("maxHighlightLength", 1e4, n, !0), pn("moveInputWithCursor", !0, function(e, t) {
            t || (e.display.inputDiv.style.top = e.display.inputDiv.style.left = 0)
        }), pn("tabindex", null, function(e, t) {
            e.display.input.tabIndex = t || ""
        }), pn("autofocus", null);
        var ba = e.modes = {},
            wa = e.mimeModes = {};
        e.defineMode = function(t, r) {
            if (e.defaults.mode || "null" == t || (e.defaults.mode = t), arguments.length > 2) {
                r.dependencies = [];
                for (var n = 2; n < arguments.length; ++n) r.dependencies.push(arguments[n])
            }
            ba[t] = r
        }, e.defineMIME = function(e, t) {
            wa[e] = t
        }, e.resolveMode = function(t) {
            if ("string" == typeof t && wa.hasOwnProperty(t)) t = wa[t];
            else if (t && "string" == typeof t.name && wa.hasOwnProperty(t.name)) {
                var r = wa[t.name];
                "string" == typeof r && (r = {
                    name: r
                }), t = ro(r, t), t.name = r.name
            } else if ("string" == typeof t && /^[\w\-]+\/[\w\-]+\+xml$/.test(t)) return e.resolveMode("application/xml");
            return "string" == typeof t ? {
                name: t
            } : t || {
                name: "null"
            }
        }, e.getMode = function(t, r) {
            var r = e.resolveMode(r),
                n = ba[r.name];
            if (!n) return e.getMode(t, "text/plain");
            var i = n(t, r);
            if (xa.hasOwnProperty(r.name)) {
                var o = xa[r.name];
                for (var a in o) o.hasOwnProperty(a) && (i.hasOwnProperty(a) && (i["_" + a] = i[a]), i[a] = o[a])
            }
            if (i.name = r.name, r.helperType && (i.helperType = r.helperType), r.modeProps)
                for (var a in r.modeProps) i[a] = r.modeProps[a];
            return i
        }, e.defineMode("null", function() {
            return {
                token: function(e) {
                    e.skipToEnd()
                }
            }
        }), e.defineMIME("text/plain", "null");
        var xa = e.modeExtensions = {};
        e.extendMode = function(e, t) {
            var r = xa.hasOwnProperty(e) ? xa[e] : xa[e] = {};
            no(t, r)
        }, e.defineExtension = function(t, r) {
            e.prototype[t] = r
        }, e.defineDocExtension = function(e, t) {
            Ba.prototype[e] = t
        }, e.defineOption = pn;
        var ka = [];
        e.defineInitHook = function(e) {
            ka.push(e)
        };
        var Ca = e.helpers = {};
        e.registerHelper = function(t, r, n) {
            Ca.hasOwnProperty(t) || (Ca[t] = e[t] = {
                _global: []
            }), Ca[t][r] = n
        }, e.registerGlobalHelper = function(t, r, n, i) {
            e.registerHelper(t, r, i), Ca[t]._global.push({
                pred: n,
                val: i
            })
        };
        var La = e.copyState = function(e, t) {
                if (t === !0) return t;
                if (e.copyState) return e.copyState(t);
                var r = {};
                for (var n in t) {
                    var i = t[n];
                    i instanceof Array && (i = i.concat([])), r[n] = i
                }
                return r
            },
            Sa = e.startState = function(e, t, r) {
                return e.startState ? e.startState(t, r) : !0
            };
        e.innerMode = function(e, t) {
            for (; e.innerMode;) {
                var r = e.innerMode(t);
                if (!r || r.mode == e) break;
                t = r.state, e = r.mode
            }
            return r || {
                mode: e,
                state: t
            }
        };
        var Ma = e.commands = {
                selectAll: function(e) {
                    e.setSelection(ra(e.firstLine(), 0), ra(e.lastLine()), Ja)
                },
                singleSelection: function(e) {
                    e.setSelection(e.getCursor("anchor"), e.getCursor("head"), Ja)
                },
                killLine: function(e) {
                    cn(e, function(t) {
                        if (t.empty()) {
                            var r = yi(e.doc, t.head.line).text.length;
                            return t.head.ch == r && t.head.line < e.lastLine() ? {
                                from: t.head,
                                to: ra(t.head.line + 1, 0)
                            } : {
                                from: t.head,
                                to: ra(t.head.line, r)
                            }
                        }
                        return {
                            from: t.from(),
                            to: t.to()
                        }
                    })
                },
                deleteLine: function(e) {
                    cn(e, function(t) {
                        return {
                            from: ra(t.from().line, 0),
                            to: Z(e.doc, ra(t.to().line + 1, 0))
                        }
                    })
                },
                delLineLeft: function(e) {
                    cn(e, function(e) {
                        return {
                            from: ra(e.from().line, 0),
                            to: e.from()
                        }
                    })
                },
                undo: function(e) {
                    e.undo()
                },
                redo: function(e) {
                    e.redo()
                },
                undoSelection: function(e) {
                    e.undoSelection()
                },
                redoSelection: function(e) {
                    e.redoSelection()
                },
                goDocStart: function(e) {
                    e.extendSelection(ra(e.firstLine(), 0))
                },
                goDocEnd: function(e) {
                    e.extendSelection(ra(e.lastLine()))
                },
                goLineStart: function(e) {
                    e.extendSelectionsBy(function(t) {
                        return So(e, t.head.line)
                    }, tl)
                },
                goLineStartSmart: function(e) {
                    e.extendSelectionsBy(function(t) {
                        var r = So(e, t.head.line),
                            n = e.getLineHandle(r.line),
                            i = Si(n);
                        if (!i || 0 == i[0].level) {
                            var o = Math.max(0, n.text.search(/\S/)),
                                a = t.head.line == r.line && t.head.ch <= o && t.head.ch;
                            return ra(r.line, a ? 0 : o)
                        }
                        return r
                    }, tl)
                },
                goLineEnd: function(e) {
                    e.extendSelectionsBy(function(t) {
                        return Mo(e, t.head.line)
                    }, tl)
                },
                goLineRight: function(e) {
                    e.extendSelectionsBy(function(t) {
                        var r = e.charCoords(t.head, "div").top + 5;
                        return e.coordsChar({
                            left: e.display.lineDiv.offsetWidth + 100,
                            top: r
                        }, "div")
                    }, tl)
                },
                goLineLeft: function(e) {
                    e.extendSelectionsBy(function(t) {
                        var r = e.charCoords(t.head, "div").top + 5;
                        return e.coordsChar({
                            left: 0,
                            top: r
                        }, "div")
                    }, tl)
                },
                goLineUp: function(e) {
                    e.moveV(-1, "line")
                },
                goLineDown: function(e) {
                    e.moveV(1, "line")
                },
                goPageUp: function(e) {
                    e.moveV(-1, "page")
                },
                goPageDown: function(e) {
                    e.moveV(1, "page")
                },
                goCharLeft: function(e) {
                    e.moveH(-1, "char")
                },
                goCharRight: function(e) {
                    e.moveH(1, "char")
                },
                goColumnLeft: function(e) {
                    e.moveH(-1, "column")
                },
                goColumnRight: function(e) {
                    e.moveH(1, "column")
                },
                goWordLeft: function(e) {
                    e.moveH(-1, "word")
                },
                goGroupRight: function(e) {
                    e.moveH(1, "group")
                },
                goGroupLeft: function(e) {
                    e.moveH(-1, "group")
                },
                goWordRight: function(e) {
                    e.moveH(1, "word")
                },
                delCharBefore: function(e) {
                    e.deleteH(-1, "char")
                },
                delCharAfter: function(e) {
                    e.deleteH(1, "char")
                },
                delWordBefore: function(e) {
                    e.deleteH(-1, "word")
                },
                delWordAfter: function(e) {
                    e.deleteH(1, "word")
                },
                delGroupBefore: function(e) {
                    e.deleteH(-1, "group")
                },
                delGroupAfter: function(e) {
                    e.deleteH(1, "group")
                },
                indentAuto: function(e) {
                    e.indentSelection("smart")
                },
                indentMore: function(e) {
                    e.indentSelection("add")
                },
                indentLess: function(e) {
                    e.indentSelection("subtract")
                },
                insertTab: function(e) {
                    e.replaceSelection("	")
                },
                insertSoftTab: function(e) {
                    for (var t = [], r = e.listSelections(), n = e.options.tabSize, i = 0; i < r.length; i++) {
                        var o = r[i].from(),
                            a = rl(e.getLine(o.line), o.ch, n);
                        t.push(new Array(n - a % n + 1).join(" "))
                    }
                    e.replaceSelections(t)
                },
                defaultTab: function(e) {
                    e.somethingSelected() ? e.indentSelection("add") : e.execCommand("insertTab")
                },
                transposeChars: function(e) {
                    Xt(e, function() {
                        for (var t = e.listSelections(), r = 0; r < t.length; r++) {
                            var n = t[r].head,
                                i = yi(e.doc, n.line).text;
                            n.ch > 0 && n.ch < i.length - 1 && e.replaceRange(i.charAt(n.ch) + i.charAt(n.ch - 1), ra(n.line, n.ch - 1), ra(n.line, n.ch + 1))
                        }
                    })
                },
                newlineAndIndent: function(e) {
                    Xt(e, function() {
                        for (var t = e.listSelections().length, r = 0; t > r; r++) {
                            var n = e.listSelections()[r];
                            e.replaceRange("\n", n.anchor, n.head, "+input"), e.indentLine(n.from().line + 1, null, !0), an(e)
                        }
                    })
                },
                toggleOverwrite: function(e) {
                    e.toggleOverwrite()
                }
            },
            Ta = e.keyMap = {};
        Ta.basic = {
            Left: "goCharLeft",
            Right: "goCharRight",
            Up: "goLineUp",
            Down: "goLineDown",
            End: "goLineEnd",
            Home: "goLineStartSmart",
            PageUp: "goPageUp",
            PageDown: "goPageDown",
            Delete: "delCharAfter",
            Backspace: "delCharBefore",
            "Shift-Backspace": "delCharBefore",
            Tab: "defaultTab",
            "Shift-Tab": "indentAuto",
            Enter: "newlineAndIndent",
            Insert: "toggleOverwrite",
            Esc: "singleSelection"
        }, Ta.pcDefault = {
            "Ctrl-A": "selectAll",
            "Ctrl-D": "deleteLine",
            "Ctrl-Z": "undo",
            "Shift-Ctrl-Z": "redo",
            "Ctrl-Y": "redo",
            "Ctrl-Home": "goDocStart",
            "Ctrl-Up": "goDocStart",
            "Ctrl-End": "goDocEnd",
            "Ctrl-Down": "goDocEnd",
            "Ctrl-Left": "goGroupLeft",
            "Ctrl-Right": "goGroupRight",
            "Alt-Left": "goLineStart",
            "Alt-Right": "goLineEnd",
            "Ctrl-Backspace": "delGroupBefore",
            "Ctrl-Delete": "delGroupAfter",
            "Ctrl-S": "save",
            "Ctrl-F": "find",
            "Ctrl-G": "findNext",
            "Shift-Ctrl-G": "findPrev",
            "Shift-Ctrl-F": "replace",
            "Shift-Ctrl-R": "replaceAll",
            "Ctrl-[": "indentLess",
            "Ctrl-]": "indentMore",
            "Ctrl-U": "undoSelection",
            "Shift-Ctrl-U": "redoSelection",
            "Alt-U": "redoSelection",
            fallthrough: "basic"
        }, Ta.macDefault = {
            "Cmd-A": "selectAll",
            "Cmd-D": "deleteLine",
            "Cmd-Z": "undo",
            "Shift-Cmd-Z": "redo",
            "Cmd-Y": "redo",
            "Cmd-Up": "goDocStart",
            "Cmd-End": "goDocEnd",
            "Cmd-Down": "goDocEnd",
            "Alt-Left": "goGroupLeft",
            "Alt-Right": "goGroupRight",
            "Cmd-Left": "goLineStart",
            "Cmd-Right": "goLineEnd",
            "Alt-Backspace": "delGroupBefore",
            "Ctrl-Alt-Backspace": "delGroupAfter",
            "Alt-Delete": "delGroupAfter",
            "Cmd-S": "save",
            "Cmd-F": "find",
            "Cmd-G": "findNext",
            "Shift-Cmd-G": "findPrev",
            "Cmd-Alt-F": "replace",
            "Shift-Cmd-Alt-F": "replaceAll",
            "Cmd-[": "indentLess",
            "Cmd-]": "indentMore",
            "Cmd-Backspace": "delLineLeft",
            "Cmd-U": "undoSelection",
            "Shift-Cmd-U": "redoSelection",
            fallthrough: ["basic", "emacsy"]
        }, Ta.emacsy = {
            "Ctrl-F": "goCharRight",
            "Ctrl-B": "goCharLeft",
            "Ctrl-P": "goLineUp",
            "Ctrl-N": "goLineDown",
            "Alt-F": "goWordRight",
            "Alt-B": "goWordLeft",
            "Ctrl-A": "goLineStart",
            "Ctrl-E": "goLineEnd",
            "Ctrl-V": "goPageDown",
            "Shift-Ctrl-V": "goPageUp",
            "Ctrl-D": "delCharAfter",
            "Ctrl-H": "delCharBefore",
            "Alt-D": "delWordAfter",
            "Alt-Backspace": "delWordBefore",
            "Ctrl-K": "killLine",
            "Ctrl-T": "transposeChars"
        }, Ta["default"] = Yo ? Ta.macDefault : Ta.pcDefault;
        var Aa = e.lookupKey = function(e, t, r) {
                function n(t) {
                    t = mn(t);
                    var i = t[e];
                    if (i === !1) return "stop";
                    if (null != i && r(i)) return !0;
                    if (t.nofallthrough) return "stop";
                    var o = t.fallthrough;
                    if (null == o) return !1;
                    if ("[object Array]" != Object.prototype.toString.call(o)) return n(o);
                    for (var a = 0; a < o.length; ++a) {
                        var l = n(o[a]);
                        if (l) return l
                    }
                    return !1
                }
                for (var i = 0; i < t.length; ++i) {
                    var o = n(t[i]);
                    if (o) return "stop" != o
                }
            },
            Na = e.isModifierKey = function(e) {
                var t = gl[e.keyCode];
                return "Ctrl" == t || "Alt" == t || "Shift" == t || "Mod" == t
            },
            Ha = e.keyName = function(e, t) {
                if (jo && 34 == e.keyCode && e["char"]) return !1;
                var r = gl[e.keyCode];
                return null == r || e.altGraphKey ? !1 : (e.altKey && (r = "Alt-" + r), (Qo ? e.metaKey : e.ctrlKey) && (r = "Ctrl-" + r), (Qo ? e.ctrlKey : e.metaKey) && (r = "Cmd-" + r), !t && e.shiftKey && (r = "Shift-" + r), r)
            };
        e.fromTextArea = function(t, r) {
            function n() {
                t.value = u.getValue()
            }
            if (r || (r = {}), r.value = t.value, !r.tabindex && t.tabindex && (r.tabindex = t.tabindex), !r.placeholder && t.placeholder && (r.placeholder = t.placeholder), null == r.autofocus) {
                var i = fo();
                r.autofocus = i == t || null != t.getAttribute("autofocus") && i == document.body
            }
            if (t.form && (Ua(t.form, "submit", n), !r.leaveSubmitMethodAlone)) {
                var o = t.form,
                    a = o.submit;
                try {
                    var l = o.submit = function() {
                        n(), o.submit = a, o.submit(), o.submit = l
                    }
                } catch (s) {}
            }
            t.style.display = "none";
            var u = e(function(e) {
                t.parentNode.insertBefore(e, t.nextSibling)
            }, r);
            return u.save = n, u.getTextArea = function() {
                return t
            }, u.toTextArea = function() {
                n(), t.parentNode.removeChild(u.getWrapperElement()), t.style.display = "", t.form && (Ka(t.form, "submit", n), "function" == typeof t.form.submit && (t.form.submit = a))
            }, u
        };
        var Oa = e.StringStream = function(e, t) {
            this.pos = this.start = 0, this.string = e, this.tabSize = t || 8, this.lastColumnPos = this.lastColumnValue = 0, this.lineStart = 0
        };
        Oa.prototype = {
            eol: function() {
                return this.pos >= this.string.length
            },
            sol: function() {
                return this.pos == this.lineStart
            },
            peek: function() {
                return this.string.charAt(this.pos) || void 0
            },
            next: function() {
                return this.pos < this.string.length ? this.string.charAt(this.pos++) : void 0
            },
            eat: function(e) {
                var t = this.string.charAt(this.pos);
                if ("string" == typeof e) var r = t == e;
                else var r = t && (e.test ? e.test(t) : e(t));
                return r ? (++this.pos, t) : void 0
            },
            eatWhile: function(e) {
                for (var t = this.pos; this.eat(e););
                return this.pos > t
            },
            eatSpace: function() {
                for (var e = this.pos;
                    /[\s\u00a0]/.test(this.string.charAt(this.pos));) ++this.pos;
                return this.pos > e
            },
            skipToEnd: function() {
                this.pos = this.string.length
            },
            skipTo: function(e) {
                var t = this.string.indexOf(e, this.pos);
                return t > -1 ? (this.pos = t, !0) : void 0
            },
            backUp: function(e) {
                this.pos -= e
            },
            column: function() {
                return this.lastColumnPos < this.start && (this.lastColumnValue = rl(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue), this.lastColumnPos = this.start), this.lastColumnValue - (this.lineStart ? rl(this.string, this.lineStart, this.tabSize) : 0)
            },
            indentation: function() {
                return rl(this.string, null, this.tabSize) - (this.lineStart ? rl(this.string, this.lineStart, this.tabSize) : 0)
            },
            match: function(e, t, r) {
                if ("string" != typeof e) {
                    var n = this.string.slice(this.pos).match(e);
                    return n && n.index > 0 ? null : (n && t !== !1 && (this.pos += n[0].length), n)
                }
                var i = function(e) {
                        return r ? e.toLowerCase() : e
                    },
                    o = this.string.substr(this.pos, e.length);
                return i(o) == i(e) ? (t !== !1 && (this.pos += e.length), !0) : void 0
            },
            current: function() {
                return this.string.slice(this.start, this.pos)
            },
            hideFirstChars: function(e, t) {
                this.lineStart += e;
                try {
                    return t()
                } finally {
                    this.lineStart -= e
                }
            }
        };
        var za = e.TextMarker = function(e, t) {
            this.lines = [], this.type = t, this.doc = e
        };
        Yi(za), za.prototype.clear = function() {
            if (!this.explicitlyCleared) {
                var e = this.doc.cm,
                    t = e && !e.curOp;
                if (t && $t(e), $i(this, "clear")) {
                    var r = this.find();
                    r && Gi(this, "clear", r.from, r.to)
                }
                for (var n = null, i = null, o = 0; o < this.lines.length; ++o) {
                    var a = this.lines[o],
                        l = kn(a.markedSpans, this);
                    e && !this.collapsed ? nr(e, ki(a), "text") : e && (null != l.to && (i = ki(a)), null != l.from && (n = ki(a))), a.markedSpans = Cn(a.markedSpans, l), null == l.from && this.collapsed && !Gn(this.doc, a) && e && xi(a, Ut(e.display))
                }
                if (e && this.collapsed && !e.options.lineWrapping)
                    for (var o = 0; o < this.lines.length; ++o) {
                        var s = Bn(this.lines[o]),
                            u = d(s);
                        u > e.display.maxLineLength && (e.display.maxLine = s, e.display.maxLineLength = u, e.display.maxLineChanged = !0)
                    }
                null != n && e && this.collapsed && rr(e, n, i + 1), this.lines.length = 0, this.explicitlyCleared = !0, this.atomic && this.doc.cantEdit && (this.doc.cantEdit = !1, e && ft(e.doc)), e && Gi(e, "markerCleared", e, this), t && Yt(e), this.parent && this.parent.clear()
            }
        }, za.prototype.find = function(e, t) {
            null == e && "bookmark" == this.type && (e = 1);
            for (var r, n, i = 0; i < this.lines.length; ++i) {
                var o = this.lines[i],
                    a = kn(o.markedSpans, this);
                if (null != a.from && (r = ra(t ? o : ki(o), a.from), -1 == e)) return r;
                if (null != a.to && (n = ra(t ? o : ki(o), a.to), 1 == e)) return n
            }
            return r && {
                from: r,
                to: n
            }
        }, za.prototype.changed = function() {
            var e = this.find(-1, !0),
                t = this,
                r = this.doc.cm;
            e && r && Xt(r, function() {
                var n = e.line,
                    i = ki(e.line),
                    o = Nt(r, i);
                if (o && (Wt(o), r.curOp.selectionChanged = r.curOp.forceUpdate = !0), r.curOp.updateMaxLine = !0, !Gn(t.doc, n) && null != t.height) {
                    var a = t.height;
                    t.height = null;
                    var l = Kn(t) - a;
                    l && xi(n, n.height + l)
                }
            })
        }, za.prototype.attachLine = function(e) {
            if (!this.lines.length && this.doc.cm) {
                var t = this.doc.cm.curOp;
                t.maybeHiddenMarkers && -1 != eo(t.maybeHiddenMarkers, this) || (t.maybeUnhiddenMarkers || (t.maybeUnhiddenMarkers = [])).push(this)
            }
            this.lines.push(e)
        }, za.prototype.detachLine = function(e) {
            if (this.lines.splice(eo(this.lines, e), 1), !this.lines.length && this.doc.cm) {
                var t = this.doc.cm.curOp;
                (t.maybeHiddenMarkers || (t.maybeHiddenMarkers = [])).push(this)
            }
        };
        var Wa = 0,
            Ea = e.SharedTextMarker = function(e, t) {
                this.markers = e, this.primary = t;
                for (var r = 0; r < e.length; ++r) e[r].parent = this
            };
        Yi(Ea), Ea.prototype.clear = function() {
            if (!this.explicitlyCleared) {
                this.explicitlyCleared = !0;
                for (var e = 0; e < this.markers.length; ++e) this.markers[e].clear();
                Gi(this, "clear")
            }
        }, Ea.prototype.find = function(e, t) {
            return this.primary.find(e, t)
        };
        var Ia = e.LineWidget = function(e, t, r) {
            if (r)
                for (var n in r) r.hasOwnProperty(n) && (this[n] = r[n]);
            this.cm = e, this.node = t
        };
        Yi(Ia), Ia.prototype.clear = function() {
            var e = this.cm,
                t = this.line.widgets,
                r = this.line,
                n = ki(r);
            if (null != n && t) {
                for (var i = 0; i < t.length; ++i) t[i] == this && t.splice(i--, 1);
                t.length || (r.widgets = null);
                var o = Kn(this);
                Xt(e, function() {
                    Un(e, r, -o), nr(e, n, "widget"), xi(r, Math.max(0, r.height - o))
                })
            }
        }, Ia.prototype.changed = function() {
            var e = this.height,
                t = this.cm,
                r = this.line;
            this.height = null;
            var n = Kn(this) - e;
            n && Xt(t, function() {
                t.curOp.forceUpdate = !0, Un(t, r, n), xi(r, r.height + n)
            })
        };
        var Da = e.Line = function(e, t, r) {
            this.text = e, zn(this, t), this.height = r ? r(this) : 1
        };
        Yi(Da), Da.prototype.lineNo = function() {
            return ki(this)
        };
        var Pa = {},
            _a = {};
        pi.prototype = {
            chunkSize: function() {
                return this.lines.length
            },
            removeInner: function(e, t) {
                for (var r = e, n = e + t; n > r; ++r) {
                    var i = this.lines[r];
                    this.height -= i.height, Xn(i), Gi(i, "delete")
                }
                this.lines.splice(e, t)
            },
            collapse: function(e) {
                e.push.apply(e, this.lines)
            },
            insertInner: function(e, t, r) {
                this.height += r, this.lines = this.lines.slice(0, e).concat(t).concat(this.lines.slice(e));
                for (var n = 0; n < t.length; ++n) t[n].parent = this
            },
            iterN: function(e, t, r) {
                for (var n = e + t; n > e; ++e)
                    if (r(this.lines[e])) return !0
            }
        }, mi.prototype = {
            chunkSize: function() {
                return this.size
            },
            removeInner: function(e, t) {
                this.size -= t;
                for (var r = 0; r < this.children.length; ++r) {
                    var n = this.children[r],
                        i = n.chunkSize();
                    if (i > e) {
                        var o = Math.min(t, i - e),
                            a = n.height;
                        if (n.removeInner(e, o), this.height -= a - n.height, i == o && (this.children.splice(r--, 1), n.parent = null), 0 == (t -= o)) break;
                        e = 0
                    } else e -= i
                }
                if (this.size - t < 25 && (this.children.length > 1 || !(this.children[0] instanceof pi))) {
                    var l = [];
                    this.collapse(l), this.children = [new pi(l)], this.children[0].parent = this
                }
            },
            collapse: function(e) {
                for (var t = 0; t < this.children.length; ++t) this.children[t].collapse(e)
            },
            insertInner: function(e, t, r) {
                this.size += t.length, this.height += r;
                for (var n = 0; n < this.children.length; ++n) {
                    var i = this.children[n],
                        o = i.chunkSize();
                    if (o >= e) {
                        if (i.insertInner(e, t, r), i.lines && i.lines.length > 50) {
                            for (; i.lines.length > 50;) {
                                var a = i.lines.splice(i.lines.length - 25, 25),
                                    l = new pi(a);
                                i.height -= l.height, this.children.splice(n + 1, 0, l), l.parent = this
                            }
                            this.maybeSpill()
                        }
                        break
                    }
                    e -= o
                }
            },
            maybeSpill: function() {
                if (!(this.children.length <= 10)) {
                    var e = this;
                    do {
                        var t = e.children.splice(e.children.length - 5, 5),
                            r = new mi(t);
                        if (e.parent) {
                            e.size -= r.size, e.height -= r.height;
                            var n = eo(e.parent.children, e);
                            e.parent.children.splice(n + 1, 0, r)
                        } else {
                            var i = new mi(e.children);
                            i.parent = e, e.children = [i, r], e = i
                        }
                        r.parent = e.parent
                    } while (e.children.length > 10);
                    e.parent.maybeSpill()
                }
            },
            iterN: function(e, t, r) {
                for (var n = 0; n < this.children.length; ++n) {
                    var i = this.children[n],
                        o = i.chunkSize();
                    if (o > e) {
                        var a = Math.min(t, o - e);
                        if (i.iterN(e, a, r)) return !0;
                        if (0 == (t -= a)) break;
                        e = 0
                    } else e -= o
                }
            }
        };
        var Fa = 0,
            Ba = e.Doc = function(e, t, r) {
                if (!(this instanceof Ba)) return new Ba(e, t, r);
                null == r && (r = 0), mi.call(this, [new pi([new Da("", null)])]), this.first = r, this.scrollTop = this.scrollLeft = 0, this.cantEdit = !1, this.cleanGeneration = 1, this.frontier = r;
                var n = ra(r, 0);
                this.sel = Y(n), this.history = new Mi(null), this.id = ++Fa, this.modeOption = t, "string" == typeof e && (e = hl(e)), hi(this, {
                    from: n,
                    to: n,
                    text: e
                }), st(this, Y(n), Ja)
            };
        Ba.prototype = ro(mi.prototype, {
            constructor: Ba,
            iter: function(e, t, r) {
                r ? this.iterN(e - this.first, t - e, r) : this.iterN(this.first, this.first + this.size, e)
            },
            insert: function(e, t) {
                for (var r = 0, n = 0; n < t.length; ++n) r += t[n].height;
                this.insertInner(e - this.first, t, r)
            },
            remove: function(e, t) {
                this.removeInner(e - this.first, t)
            },
            getValue: function(e) {
                var t = wi(this, this.first, this.first + this.size);
                return e === !1 ? t : t.join(e || "\n")
            },
            setValue: Jt(function(e) {
                var t = ra(this.first, 0),
                    r = this.first + this.size - 1;
                Kr(this, {
                    from: t,
                    to: ra(r, yi(this, r).text.length),
                    text: hl(e),
                    origin: "setValue"
                }, !0), st(this, Y(t))
            }),
            replaceRange: function(e, t, r, n) {
                t = Z(this, t), r = r ? Z(this, r) : t, Jr(this, e, t, r, n)
            },
            getRange: function(e, t, r) {
                var n = bi(this, Z(this, e), Z(this, t));
                return r === !1 ? n : n.join(r || "\n")
            },
            getLine: function(e) {
                var t = this.getLineHandle(e);
                return t && t.text
            },
            getLineHandle: function(e) {
                return J(this, e) ? yi(this, e) : void 0
            },
            getLineNumber: function(e) {
                return ki(e)
            },
            getLineHandleVisualStart: function(e) {
                return "number" == typeof e && (e = yi(this, e)), Bn(e)
            },
            lineCount: function() {
                return this.size
            },
            firstLine: function() {
                return this.first
            },
            lastLine: function() {
                return this.first + this.size - 1
            },
            clipPos: function(e) {
                return Z(this, e)
            },
            getCursor: function(e) {
                var t = this.sel.primary(),
                    r;
                return r = null == e || "head" == e ? t.head : "anchor" == e ? t.anchor : "end" == e || "to" == e || e === !1 ? t.to() : t.from()
            },
            listSelections: function() {
                return this.sel.ranges
            },
            somethingSelected: function() {
                return this.sel.somethingSelected()
            },
            setCursor: Jt(function(e, t, r) {
                ot(this, Z(this, "number" == typeof e ? ra(e, t || 0) : e), null, r)
            }),
            setSelection: Jt(function(e, t, r) {
                ot(this, Z(this, e), Z(this, t || e), r)
            }),
            extendSelection: Jt(function(e, t, r) {
                rt(this, Z(this, e), t && Z(this, t), r)
            }),
            extendSelections: Jt(function(e, t) {
                nt(this, et(this, e, t))
            }),
            extendSelectionsBy: Jt(function(e, t) {
                nt(this, to(this.sel.ranges, e), t)
            }),
            setSelections: Jt(function(e, t, r) {
                if (e.length) {
                    for (var n = 0, i = []; n < e.length; n++) i[n] = new K(Z(this, e[n].anchor), Z(this, e[n].head));
                    null == t && (t = Math.min(e.length - 1, this.sel.primIndex)), st(this, $(i, t), r)
                }
            }),
            addSelection: Jt(function(e, t, r) {
                var n = this.sel.ranges.slice(0);
                n.push(new K(Z(this, e), Z(this, t || e))), st(this, $(n, n.length - 1), r)
            }),
            getSelection: function(e) {
                for (var t = this.sel.ranges, r, n = 0; n < t.length; n++) {
                    var i = bi(this, t[n].from(), t[n].to());
                    r = r ? r.concat(i) : i
                }
                return e === !1 ? r : r.join(e || "\n")
            },
            getSelections: function(e) {
                for (var t = [], r = this.sel.ranges, n = 0; n < r.length; n++) {
                    var i = bi(this, r[n].from(), r[n].to());
                    e !== !1 && (i = i.join(e || "\n")), t[n] = i
                }
                return t
            },
            replaceSelection: function(e, t, r) {
                for (var n = [], i = 0; i < this.sel.ranges.length; i++) n[i] = e;
                this.replaceSelections(n, t, r || "+input")
            },
            replaceSelections: Jt(function(e, t, r) {
                for (var n = [], i = this.sel, o = 0; o < i.ranges.length; o++) {
                    var a = i.ranges[o];
                    n[o] = {
                        from: a.from(),
                        to: a.to(),
                        text: hl(e[o]),
                        origin: r
                    }
                }
                for (var l = t && "end" != t && qr(this, n, t), o = n.length - 1; o >= 0; o--) Kr(this, n[o]);
                l ? lt(this, l) : this.cm && an(this.cm)
            }),
            undo: Jt(function() {
                Yr(this, "undo")
            }),
            redo: Jt(function() {
                Yr(this, "redo")
            }),
            undoSelection: Jt(function() {
                Yr(this, "undo", !0)
            }),
            redoSelection: Jt(function() {
                Yr(this, "redo", !0)
            }),
            setExtending: function(e) {
                this.extend = e
            },
            getExtending: function() {
                return this.extend
            },
            historySize: function() {
                for (var e = this.history, t = 0, r = 0, n = 0; n < e.done.length; n++) e.done[n].ranges || ++t;
                for (var n = 0; n < e.undone.length; n++) e.undone[n].ranges || ++r;
                return {
                    undo: t,
                    redo: r
                }
            },
            clearHistory: function() {
                this.history = new Mi(this.history.maxGeneration)
            },
            markClean: function() {
                this.cleanGeneration = this.changeGeneration(!0)
            },
            changeGeneration: function(e) {
                return e && (this.history.lastOp = this.history.lastOrigin = null), this.history.generation
            },
            isClean: function(e) {
                return this.history.generation == (e || this.cleanGeneration)
            },
            getHistory: function() {
                return {
                    done: Pi(this.history.done),
                    undone: Pi(this.history.undone)
                }
            },
            setHistory: function(e) {
                var t = this.history = new Mi(this.history.maxGeneration);
                t.done = Pi(e.done.slice(0), null, !0), t.undone = Pi(e.undone.slice(0), null, !0)
            },
            markText: function(e, t, r) {
                return gn(this, Z(this, e), Z(this, t), r, "range")
            },
            setBookmark: function(e, t) {
                var r = {
                    replacedWith: t && (null == t.nodeType ? t.widget : t),
                    insertLeft: t && t.insertLeft,
                    clearWhenEmpty: !1,
                    shared: t && t.shared
                };
                return e = Z(this, e), gn(this, e, e, r, "bookmark")
            },
            findMarksAt: function(e) {
                e = Z(this, e);
                var t = [],
                    r = yi(this, e.line).markedSpans;
                if (r)
                    for (var n = 0; n < r.length; ++n) {
                        var i = r[n];
                        (null == i.from || i.from <= e.ch) && (null == i.to || i.to >= e.ch) && t.push(i.marker.parent || i.marker)
                    }
                return t
            },
            findMarks: function(e, t, r) {
                e = Z(this, e), t = Z(this, t);
                var n = [],
                    i = e.line;
                return this.iter(e.line, t.line + 1, function(o) {
                    var a = o.markedSpans;
                    if (a)
                        for (var l = 0; l < a.length; l++) {
                            var s = a[l];
                            i == e.line && e.ch > s.to || null == s.from && i != e.line || i == t.line && s.from > t.ch || r && !r(s.marker) || n.push(s.marker.parent || s.marker)
                        }++i
                }), n
            },
            getAllMarks: function() {
                var e = [];
                return this.iter(function(t) {
                    var r = t.markedSpans;
                    if (r)
                        for (var n = 0; n < r.length; ++n) null != r[n].from && e.push(r[n].marker)
                }), e
            },
            posFromIndex: function(e) {
                var t, r = this.first;
                return this.iter(function(n) {
                    var i = n.text.length + 1;
                    return i > e ? (t = e, !0) : (e -= i, void++r)
                }), Z(this, ra(r, t))
            },
            indexFromPos: function(e) {
                e = Z(this, e);
                var t = e.ch;
                return e.line < this.first || e.ch < 0 ? 0 : (this.iter(this.first, e.line, function(e) {
                    t += e.text.length + 1
                }), t)
            },
            copy: function(e) {
                var t = new Ba(wi(this, this.first, this.first + this.size), this.modeOption, this.first);
                return t.scrollTop = this.scrollTop, t.scrollLeft = this.scrollLeft, t.sel = this.sel, t.extend = !1, e && (t.history.undoDepth = this.history.undoDepth, t.setHistory(this.getHistory())), t
            },
            linkedDoc: function(e) {
                e || (e = {});
                var t = this.first,
                    r = this.first + this.size;
                null != e.from && e.from > t && (t = e.from), null != e.to && e.to < r && (r = e.to);
                var n = new Ba(wi(this, t, r), e.mode || this.modeOption, t);
                return e.sharedHist && (n.history = this.history), (this.linked || (this.linked = [])).push({
                    doc: n,
                    sharedHist: e.sharedHist
                }), n.linked = [{
                    doc: this,
                    isParent: !0,
                    sharedHist: e.sharedHist
                }], bn(n, yn(this)), n
            },
            unlinkDoc: function(t) {
                if (t instanceof e && (t = t.doc), this.linked)
                    for (var r = 0; r < this.linked.length; ++r) {
                        var n = this.linked[r];
                        if (n.doc == t) {
                            this.linked.splice(r, 1), t.unlinkDoc(this), wn(yn(this));
                            break
                        }
                    }
                if (t.history == this.history) {
                    var i = [t.id];
                    gi(t, function(e) {
                        i.push(e.id)
                    }, !0), t.history = new Mi(null), t.history.done = Pi(this.history.done, i), t.history.undone = Pi(this.history.undone, i)
                }
            },
            iterLinkedDocs: function(e) {
                gi(this, e)
            },
            getMode: function() {
                return this.mode
            },
            getEditor: function() {
                return this.cm
            }
        }), Ba.prototype.eachLine = Ba.prototype.iter;
        var Ra = "iter insert remove copy getEditor".split(" ");
        for (var ja in Ba.prototype) Ba.prototype.hasOwnProperty(ja) && eo(Ra, ja) < 0 && (e.prototype[ja] = function(e) {
            return function() {
                return e.apply(this.doc, arguments)
            }
        }(Ba.prototype[ja]));
        Yi(Ba);
        var Va = e.e_preventDefault = function(e) {
                e.preventDefault ? e.preventDefault() : e.returnValue = !1
            },
            Ga = e.e_stopPropagation = function(e) {
                e.stopPropagation ? e.stopPropagation() : e.cancelBubble = !0
            },
            qa = e.e_stop = function(e) {
                Va(e), Ga(e)
            },
            Ua = e.on = function(e, t, r) {
                if (e.addEventListener) e.addEventListener(t, r, !1);
                else if (e.attachEvent) e.attachEvent("on" + t, r);
                else {
                    var n = e._handlers || (e._handlers = {}),
                        i = n[t] || (n[t] = []);
                    i.push(r)
                }
            },
            Ka = e.off = function(e, t, r) {
                if (e.removeEventListener) e.removeEventListener(t, r, !1);
                else if (e.detachEvent) e.detachEvent("on" + t, r);
                else {
                    var n = e._handlers && e._handlers[t];
                    if (!n) return;
                    for (var i = 0; i < n.length; ++i)
                        if (n[i] == r) {
                            n.splice(i, 1);
                            break
                        }
                }
            },
            $a = e.signal = function(e, t) {
                var r = e._handlers && e._handlers[t];
                if (r)
                    for (var n = Array.prototype.slice.call(arguments, 2), i = 0; i < r.length; ++i) r[i].apply(null, n)
            },
            Ya, Xa = 0,
            Za = 30,
            Qa = e.Pass = {
                toString: function() {
                    return "CodeMirror.Pass"
                }
            },
            Ja = {
                scroll: !1
            },
            el = {
                origin: "*mouse"
            },
            tl = {
                origin: "+move"
            };
        Xi.prototype.set = function(e, t) {
            clearTimeout(this.id), this.id = setTimeout(t, e)
        };
        var rl = e.countColumn = function(e, t, r, n, i) {
                null == t && (t = e.search(/[^\s\u00a0]/), -1 == t && (t = e.length));
                for (var o = n || 0, a = i || 0;;) {
                    var l = e.indexOf("	", o);
                    if (0 > l || l >= t) return a + (t - o);
                    a += l - o, a += r - a % r, o = l + 1
                }
            },
            nl = [""],
            il = function(e) {
                e.select()
            };
        Ko ? il = function(e) {
            e.selectionStart = 0, e.selectionEnd = e.value.length
        } : _o && (il = function(e) {
            try {
                e.select()
            } catch (t) {}
        }), [].indexOf && (eo = function(e, t) {
            return e.indexOf(t)
        }), [].map && (to = function(e, t) {
            return e.map(t)
        });
        var ol = /[\u00df\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,
            al = e.isWordChar = function(e) {
                return /\w/.test(e) || e > "€" && (e.toUpperCase() != e.toLowerCase() || ol.test(e))
            },
            ll = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/,
            sl;
        sl = document.createRange ? function(e, t, r) {
            var n = document.createRange();
            return n.setEnd(e, r), n.setStart(e, t), n
        } : function(e, t, r) {
            var n = document.body.createTextRange();
            return n.moveToElementText(e.parentNode), n.collapse(!0), n.moveEnd("character", r), n.moveStart("character", t), n
        }, Wo && (fo = function() {
            try {
                return document.activeElement
            } catch (e) {
                return document.body
            }
        });
        var ul = function() {
                if (Io) return !1;
                var e = lo("div");
                return "draggable" in e || "dragDrop" in e
            }(),
            cl, fl, dl, hl = e.splitLines = 3 != "\n\nb".split(/\n/).length ? function(e) {
                for (var t = 0, r = [], n = e.length; n >= t;) {
                    var i = e.indexOf("\n", t); - 1 == i && (i = e.length);
                    var o = e.slice(t, "\r" == e.charAt(i - 1) ? i - 1 : i),
                        a = o.indexOf("\r"); - 1 != a ? (r.push(o.slice(0, a)), t += a + 1) : (r.push(o), t = i + 1)
                }
                return r
            } : function(e) {
                return e.split(/\r\n?|\n/)
            },
            pl = window.getSelection ? function(e) {
                try {
                    return e.selectionStart != e.selectionEnd
                } catch (t) {
                    return !1
                }
            } : function(e) {
                try {
                    var t = e.ownerDocument.selection.createRange()
                } catch (r) {}
                return t && t.parentElement() == e ? 0 != t.compareEndPoints("StartToEnd", t) : !1
            },
            ml = function() {
                var e = lo("div");
                return "oncopy" in e ? !0 : (e.setAttribute("oncopy", "return;"), "function" == typeof e.oncopy)
            }(),
            gl = {
                3: "Enter",
                8: "Backspace",
                9: "Tab",
                13: "Enter",
                16: "Shift",
                17: "Ctrl",
                18: "Alt",
                19: "Pause",
                20: "CapsLock",
                27: "Esc",
                32: "Space",
                33: "PageUp",
                34: "PageDown",
                35: "End",
                36: "Home",
                37: "Left",
                38: "Up",
                39: "Right",
                40: "Down",
                44: "PrintScrn",
                45: "Insert",
                46: "Delete",
                59: ";",
                61: "=",
                91: "Mod",
                92: "Mod",
                93: "Mod",
                107: "=",
                109: "-",
                127: "Delete",
                173: "-",
                186: ";",
                187: "=",
                188: ",",
                189: "-",
                190: ".",
                191: "/",
                192: "`",
                219: "[",
                220: "\\",
                221: "]",
                222: "'",
                63232: "Up",
                63233: "Down",
                63234: "Left",
                63235: "Right",
                63272: "Delete",
                63273: "Home",
                63275: "End",
                63276: "PageUp",
                63277: "PageDown",
                63302: "Insert"
            };
        e.keyNames = gl,
            function() {
                for (var e = 0; 10 > e; e++) gl[e + 48] = gl[e + 96] = String(e);
                for (var e = 65; 90 >= e; e++) gl[e] = String.fromCharCode(e);
                for (var e = 1; 12 >= e; e++) gl[e + 111] = gl[e + 63235] = "F" + e
            }();
        var vl, yl = function() {
            function e(e) {
                return 247 >= e ? r.charAt(e) : e >= 1424 && 1524 >= e ? "R" : e >= 1536 && 1773 >= e ? n.charAt(e - 1536) : e >= 1774 && 2220 >= e ? "r" : e >= 8192 && 8203 >= e ? "w" : 8204 == e ? "b" : "L"
            }

            function t(e, t, r) {
                this.level = e, this.from = t, this.to = r
            }
            var r = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",
                n = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm",
                i = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,
                o = /[stwN]/,
                a = /[LRr]/,
                l = /[Lb1n]/,
                s = /[1n]/,
                u = "L";
            return function(r) {
                if (!i.test(r)) return !1;
                for (var n = r.length, c = [], f = 0, d; n > f; ++f) c.push(d = e(r.charCodeAt(f)));
                for (var f = 0, h = u; n > f; ++f) {
                    var d = c[f];
                    "m" == d ? c[f] = h : h = d
                }
                for (var f = 0, p = u; n > f; ++f) {
                    var d = c[f];
                    "1" == d && "r" == p ? c[f] = "n" : a.test(d) && (p = d, "r" == d && (c[f] = "R"))
                }
                for (var f = 1, h = c[0]; n - 1 > f; ++f) {
                    var d = c[f];
                    "+" == d && "1" == h && "1" == c[f + 1] ? c[f] = "1" : "," != d || h != c[f + 1] || "1" != h && "n" != h || (c[f] = h), h = d
                }
                for (var f = 0; n > f; ++f) {
                    var d = c[f];
                    if ("," == d) c[f] = "N";
                    else if ("%" == d) {
                        for (var m = f + 1; n > m && "%" == c[m]; ++m);
                        for (var g = f && "!" == c[f - 1] || n > m && "1" == c[m] ? "1" : "N", v = f; m > v; ++v) c[v] = g;
                        f = m - 1
                    }
                }
                for (var f = 0, p = u; n > f; ++f) {
                    var d = c[f];
                    "L" == p && "1" == d ? c[f] = "L" : a.test(d) && (p = d)
                }
                for (var f = 0; n > f; ++f)
                    if (o.test(c[f])) {
                        for (var m = f + 1; n > m && o.test(c[m]); ++m);
                        for (var y = "L" == (f ? c[f - 1] : u), b = "L" == (n > m ? c[m] : u), g = y || b ? "L" : "R", v = f; m > v; ++v) c[v] = g;
                        f = m - 1
                    }
                for (var w = [], x, f = 0; n > f;)
                    if (l.test(c[f])) {
                        var k = f;
                        for (++f; n > f && l.test(c[f]); ++f);
                        w.push(new t(0, k, f))
                    } else {
                        var C = f,
                            L = w.length;
                        for (++f; n > f && "L" != c[f]; ++f);
                        for (var v = C; f > v;)
                            if (s.test(c[v])) {
                                v > C && w.splice(L, 0, new t(1, C, v));
                                var S = v;
                                for (++v; f > v && s.test(c[v]); ++v);
                                w.splice(L, 0, new t(2, S, v)), C = v
                            } else ++v;
                        f > C && w.splice(L, 0, new t(1, C, f))
                    }
                return 1 == w[0].level && (x = r.match(/^\s+/)) && (w[0].from = x[0].length, w.unshift(new t(0, 0, x[0].length))), 1 == Ji(w).level && (x = r.match(/\s+$/)) && (Ji(w).to -= x[0].length, w.push(new t(0, n - x[0].length, n))), w[0].level != Ji(w).level && w.push(new t(w[0].level, n, n)), w
            }
        }();
        return e.version = "4.1.0", e
    }),
    function(e) {
        "object" == typeof exports && "object" == typeof module ? e(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], e) : e(CodeMirror)
    }(function(e) {
        "use strict";

        function t(e) {
            for (var t = {}, r = 0; r < e.length; ++r) t[e[r]] = !0;
            return t
        }

        function r(e, t) {
            for (var r = !1, n; null != (n = e.next());) {
                if (r && "/" == n) {
                    t.tokenize = null;
                    break
                }
                r = "*" == n
            }
            return ["comment", "comment"]
        }

        function n(e, t) {
            return e.skipTo("-->") ? (e.match("-->"), t.tokenize = null) : e.skipToEnd(), ["comment", "comment"]
        }
        e.defineMode("css", function(t, r) {
            function n(e, t) {
                return C = t, e
            }

            function i(e, t) {
                var r = e.next();
                if (p[r]) {
                    var i = p[r](e, t);
                    if (i !== !1) return i
                }
                return "@" == r ? (e.eatWhile(/[\w\\\-]/), n("def", e.current())) : "=" == r || ("~" == r || "|" == r) && e.eat("=") ? n(null, "compare") : '"' == r || "'" == r ? (t.tokenize = o(r), t.tokenize(e, t)) : "#" == r ? (e.eatWhile(/[\w\\\-]/), n("atom", "hash")) : "!" == r ? (e.match(/^\s*\w*/), n("keyword", "important")) : /\d/.test(r) || "." == r && e.eat(/\d/) ? (e.eatWhile(/[\w.%]/), n("number", "unit")) : "-" !== r ? /[,+>*\/]/.test(r) ? n(null, "select-op") : "." == r && e.match(/^-?[_a-z][_a-z0-9-]*/i) ? n("qualifier", "qualifier") : /[:;{}\[\]\(\)]/.test(r) ? n(null, r) : "u" == r && e.match("rl(") ? (e.backUp(1), t.tokenize = a, n("property", "word")) : /[\w\\\-]/.test(r) ? (e.eatWhile(/[\w\\\-]/), n("property", "word")) : n(null, null) : /[\d.]/.test(e.peek()) ? (e.eatWhile(/[\w.%]/), n("number", "unit")) : e.match(/^[^-]+-/) ? n("meta", "meta") : void 0
            }

            function o(e) {
                return function(t, r) {
                    for (var i = !1, o; null != (o = t.next());) {
                        if (o == e && !i) {
                            ")" == e && t.backUp(1);
                            break
                        }
                        i = !i && "\\" == o
                    }
                    return (o == e || !i && ")" != e) && (r.tokenize = null), n("string", "string")
                }
            }

            function a(e, t) {
                return e.next(), t.tokenize = e.match(/\s*[\"\')]/, !1) ? null : o(")"), n(null, "(")
            }

            function l(e, t, r) {
                this.type = e, this.indent = t, this.prev = r
            }

            function s(e, t, r) {
                return e.context = new l(r, t.indentation() + h, e.context), r
            }

            function u(e) {
                return e.context = e.context.prev, e.context.type
            }

            function c(e, t, r) {
                return S[r.context.type](e, t, r)
            }

            function f(e, t, r, n) {
                for (var i = n || 1; i > 0; i--) r.context = r.context.prev;
                return c(e, t, r)
            }

            function d(e) {
                var t = e.current().toLowerCase();
                L = w.hasOwnProperty(t) ? "atom" : b.hasOwnProperty(t) ? "keyword" : "variable"
            }
            r.propertyKeywords || (r = e.resolveMode("text/css"));
            var h = t.indentUnit,
                p = r.tokenHooks,
                m = r.mediaTypes || {},
                g = r.mediaFeatures || {},
                v = r.propertyKeywords || {},
                y = r.nonStandardPropertyKeywords || {},
                b = r.colorKeywords || {},
                w = r.valueKeywords || {},
                x = r.fontProperties || {},
                k = r.allowNested,
                C, L, S = {};
            return S.top = function(e, t, r) {
                if ("{" == e) return s(r, t, "block");
                if ("}" == e && r.context.prev) return u(r);
                if ("@media" == e) return s(r, t, "media");
                if ("@font-face" == e) return "font_face_before";
                if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(e)) return "keyframes";
                if (e && "@" == e.charAt(0)) return s(r, t, "at");
                if ("hash" == e) L = "builtin";
                else if ("word" == e) L = "tag";
                else {
                    if ("variable-definition" == e) return "maybeprop";
                    if ("interpolation" == e) return s(r, t, "interpolation");
                    if (":" == e) return "pseudo";
                    if (k && "(" == e) return s(r, t, "params")
                }
                return r.context.type
            }, S.block = function(e, t, r) {
                if ("word" == e) {
                    var n = t.current().toLowerCase();
                    return v.hasOwnProperty(n) ? (L = "property", "maybeprop") : y.hasOwnProperty(n) ? (L = "string-2", "maybeprop") : k ? (L = t.match(/^\s*:/, !1) ? "property" : "tag", "block") : (L += " error", "maybeprop")
                }
                return "meta" == e ? "block" : k || "hash" != e && "qualifier" != e ? S.top(e, t, r) : (L = "error", "block")
            }, S.maybeprop = function(e, t, r) {
                return ":" == e ? s(r, t, "prop") : c(e, t, r)
            }, S.prop = function(e, t, r) {
                if (";" == e) return u(r);
                if ("{" == e && k) return s(r, t, "propBlock");
                if ("}" == e || "{" == e) return f(e, t, r);
                if ("(" == e) return s(r, t, "parens");
                if ("hash" != e || /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(t.current())) {
                    if ("word" == e) d(t);
                    else if ("interpolation" == e) return s(r, t, "interpolation")
                } else L += " error";
                return "prop"
            }, S.propBlock = function(e, t, r) {
                return "}" == e ? u(r) : "word" == e ? (L = "property", "maybeprop") : r.context.type
            }, S.parens = function(e, t, r) {
                return "{" == e || "}" == e ? f(e, t, r) : ")" == e ? u(r) : "parens"
            }, S.pseudo = function(e, t, r) {
                return "word" == e ? (L = "variable-3", r.context.type) : c(e, t, r)
            }, S.media = function(e, t, r) {
                if ("(" == e) return s(r, t, "media_parens");
                if ("}" == e) return f(e, t, r);
                if ("{" == e) return u(r) && s(r, t, k ? "block" : "top");
                if ("word" == e) {
                    var n = t.current().toLowerCase();
                    L = "only" == n || "not" == n || "and" == n ? "keyword" : m.hasOwnProperty(n) ? "attribute" : g.hasOwnProperty(n) ? "property" : "error"
                }
                return r.context.type
            }, S.media_parens = function(e, t, r) {
                return ")" == e ? u(r) : "{" == e || "}" == e ? f(e, t, r, 2) : S.media(e, t, r)
            }, S.font_face_before = function(e, t, r) {
                return "{" == e ? s(r, t, "font_face") : c(e, t, r)
            }, S.font_face = function(e, t, r) {
                return "}" == e ? u(r) : "word" == e ? (L = x.hasOwnProperty(t.current().toLowerCase()) ? "property" : "error", "maybeprop") : "font_face"
            }, S.keyframes = function(e, t, r) {
                return "word" == e ? (L = "variable", "keyframes") : "{" == e ? s(r, t, "top") : c(e, t, r)
            }, S.at = function(e, t, r) {
                return ";" == e ? u(r) : "{" == e || "}" == e ? f(e, t, r) : ("word" == e ? L = "tag" : "hash" == e && (L = "builtin"), "at")
            }, S.interpolation = function(e, t, r) {
                return "}" == e ? u(r) : "{" == e || ";" == e ? f(e, t, r) : ("variable" != e && (L = "error"), "interpolation")
            }, S.params = function(e, t, r) {
                return ")" == e ? u(r) : "{" == e || "}" == e ? f(e, t, r) : ("word" == e && d(t), "params")
            }, {
                startState: function(e) {
                    return {
                        tokenize: null,
                        state: "top",
                        context: new l("top", e || 0, null)
                    }
                },
                token: function(e, t) {
                    if (!t.tokenize && e.eatSpace()) return null;
                    var r = (t.tokenize || i)(e, t);
                    return r && "object" == typeof r && (C = r[1], r = r[0]), L = r, t.state = S[t.state](C, e, t), L
                },
                indent: function(e, t) {
                    var r = e.context,
                        n = t && t.charAt(0),
                        i = r.indent;
                    return "prop" == r.type && "}" == n && (r = r.prev), !r.prev || ("}" != n || "block" != r.type && "top" != r.type && "interpolation" != r.type && "font_face" != r.type) && (")" != n || "parens" != r.type && "params" != r.type && "media_parens" != r.type) && ("{" != n || "at" != r.type && "media" != r.type) || (i = r.indent - h, r = r.prev), i
                },
                electricChars: "}",
                blockCommentStart: "/*",
                blockCommentEnd: "*/",
                fold: "brace"
            }
        });
        var i = ["all", "aural", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "embossed"],
            o = t(i),
            a = ["width", "min-width", "max-width", "height", "min-height", "max-height", "device-width", "min-device-width", "max-device-width", "device-height", "min-device-height", "max-device-height", "aspect-ratio", "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio", "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", "max-color", "color-index", "min-color-index", "max-color-index", "monochrome", "min-monochrome", "max-monochrome", "resolution", "min-resolution", "max-resolution", "scan", "grid"],
            l = t(a),
            s = ["align-content", "align-items", "align-self", "alignment-adjust", "alignment-baseline", "anchor-point", "animation", "animation-delay", "animation-direction", "animation-duration", "animation-fill-mode", "animation-iteration-count", "animation-name", "animation-play-state", "animation-timing-function", "appearance", "azimuth", "backface-visibility", "background", "background-attachment", "background-clip", "background-color", "background-image", "background-origin", "background-position", "background-repeat", "background-size", "baseline-shift", "binding", "bleed", "bookmark-label", "bookmark-level", "bookmark-state", "bookmark-target", "border", "border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", "border-collapse", "border-color", "border-image", "border-image-outset", "border-image-repeat", "border-image-slice", "border-image-source", "border-image-width", "border-left", "border-left-color", "border-left-style", "border-left-width", "border-radius", "border-right", "border-right-color", "border-right-style", "border-right-width", "border-spacing", "border-style", "border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width", "border-width", "bottom", "box-decoration-break", "box-shadow", "box-sizing", "break-after", "break-before", "break-inside", "caption-side", "clear", "clip", "color", "color-profile", "column-count", "column-fill", "column-gap", "column-rule", "column-rule-color", "column-rule-style", "column-rule-width", "column-span", "column-width", "columns", "content", "counter-increment", "counter-reset", "crop", "cue", "cue-after", "cue-before", "cursor", "direction", "display", "dominant-baseline", "drop-initial-after-adjust", "drop-initial-after-align", "drop-initial-before-adjust", "drop-initial-before-align", "drop-initial-size", "drop-initial-value", "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis", "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap", "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings", "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-synthesis", "font-variant", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", "font-weight", "grid", "grid-area", "grid-auto-columns", "grid-auto-flow", "grid-auto-position", "grid-auto-rows", "grid-column", "grid-column-end", "grid-column-start", "grid-row", "grid-row-end", "grid-row-start", "grid-template", "grid-template-areas", "grid-template-columns", "grid-template-rows", "hanging-punctuation", "height", "hyphens", "icon", "image-orientation", "image-rendering", "image-resolution", "inline-box-align", "justify-content", "left", "letter-spacing", "line-break", "line-height", "line-stacking", "line-stacking-ruby", "line-stacking-shift", "line-stacking-strategy", "list-style", "list-style-image", "list-style-position", "list-style-type", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "marker-offset", "marks", "marquee-direction", "marquee-loop", "marquee-play-count", "marquee-speed", "marquee-style", "max-height", "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index", "nav-left", "nav-right", "nav-up", "opacity", "order", "orphans", "outline", "outline-color", "outline-offset", "outline-style", "outline-width", "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y", "padding", "padding-bottom", "padding-left", "padding-right", "padding-top", "page", "page-break-after", "page-break-before", "page-break-inside", "page-policy", "pause", "pause-after", "pause-before", "perspective", "perspective-origin", "pitch", "pitch-range", "play-during", "position", "presentation-level", "punctuation-trim", "quotes", "region-break-after", "region-break-before", "region-break-inside", "region-fragment", "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness", "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang", "ruby-position", "ruby-span", "shape-inside", "shape-outside", "size", "speak", "speak-as", "speak-header", "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set", "tab-size", "table-layout", "target", "target-name", "target-new", "target-position", "text-align", "text-align-last", "text-decoration", "text-decoration-color", "text-decoration-line", "text-decoration-skip", "text-decoration-style", "text-emphasis", "text-emphasis-color", "text-emphasis-position", "text-emphasis-style", "text-height", "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow", "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position", "text-wrap", "top", "transform", "transform-origin", "transform-style", "transition", "transition-delay", "transition-duration", "transition-property", "transition-timing-function", "unicode-bidi", "vertical-align", "visibility", "voice-balance", "voice-duration", "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress", "voice-volume", "volume", "white-space", "widows", "width", "word-break", "word-spacing", "word-wrap", "z-index", "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color", "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events", "color-interpolation", "color-interpolation-filters", "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering", "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering", "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal", "glyph-orientation-vertical", "text-anchor", "writing-mode"],
            u = t(s),
            c = ["scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color", "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color", "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "zoom"],
            c = t(c),
            f = ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "red", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen"],
            d = t(f),
            h = ["above", "absolute", "activeborder", "activecaption", "afar", "after-white-space", "ahead", "alias", "all", "all-scroll", "alternate", "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", "arabic-indic", "armenian", "asterisks", "auto", "avoid", "avoid-column", "avoid-page", "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary", "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", "both", "bottom", "break", "break-all", "break-word", "button", "button-bevel", "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian", "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", "cell", "center", "checkbox", "circle", "cjk-earthly-branch", "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", "col-resize", "collapse", "column", "compact", "condensed", "contain", "content", "content-box", "context-menu", "continuous", "copy", "cover", "crop", "cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal", "decimal-leading-zero", "default", "default-button", "destination-atop", "destination-in", "destination-out", "destination-over", "devanagari", "disc", "discard", "document", "dot-dash", "dot-dot-dash", "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", "ethiopic-halehame-gez", "ethiopic-halehame-om-et", "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", "ew-resize", "expanded", "extra-condensed", "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "footnotes", "forwards", "from", "geometricPrecision", "georgian", "graytext", "groove", "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew", "help", "hidden", "hide", "higher", "highlight", "highlighttext", "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore", "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-table", "inset", "inside", "intrinsic", "invert", "italic", "justify", "kannada", "katakana", "katakana-iroha", "keep-all", "khmer", "landscape", "lao", "large", "larger", "left", "level", "lighter", "line-through", "linear", "lines", "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", "lower-roman", "lowercase", "ltr", "malayalam", "match", "media-controls-background", "media-current-time-display", "media-fullscreen-button", "media-mute-button", "media-play-button", "media-return-to-realtime-button", "media-rewind-button", "media-seek-back-button", "media-seek-forward-button", "media-slider", "media-sliderthumb", "media-time-remaining-display", "media-volume-slider", "media-volume-slider-container", "media-volume-sliderthumb", "medium", "menu", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", "mix", "mongolian", "monospace", "move", "multiple", "myanmar", "n-resize", "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", "ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote", "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", "outside", "outside-shape", "overlay", "overline", "padding", "padding-box", "painted", "page", "paused", "persian", "plus-darker", "plus-lighter", "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button", "radio", "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region", "relative", "repeat", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba", "ridge", "right", "round", "row-resize", "rtl", "run-in", "running", "s-resize", "sans-serif", "scroll", "scrollbar", "se-resize", "searchfield", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", "single", "skip-white-space", "slide", "slider-horizontal", "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", "small", "small-caps", "small-caption", "smaller", "solid", "somali", "source-atop", "source-in", "source-out", "source-over", "space", "square", "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", "subpixel-antialiased", "super", "sw-resize", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", "window", "windowframe", "windowtext", "x-large", "x-small", "xor", "xx-large", "xx-small"],
            p = t(h),
            m = ["font-family", "src", "unicode-range", "font-variant", "font-feature-settings", "font-stretch", "font-weight", "font-style"],
            g = t(m),
            v = i.concat(a).concat(s).concat(c).concat(f).concat(h);
        e.registerHelper("hintWords", "css", v), e.defineMIME("text/css", {
            mediaTypes: o,
            mediaFeatures: l,
            propertyKeywords: u,
            nonStandardPropertyKeywords: c,
            colorKeywords: d,
            valueKeywords: p,
            fontProperties: g,
            tokenHooks: {
                "<": function(e, t) {
                    return e.match("!--") ? (t.tokenize = n, n(e, t)) : !1
                },
                "/": function(e, t) {
                    return e.eat("*") ? (t.tokenize = r, r(e, t)) : !1
                }
            },
            name: "css"
        }), e.defineMIME("text/x-scss", {
            mediaTypes: o,
            mediaFeatures: l,
            propertyKeywords: u,
            nonStandardPropertyKeywords: c,
            colorKeywords: d,
            valueKeywords: p,
            fontProperties: g,
            allowNested: !0,
            tokenHooks: {
                "/": function(e, t) {
                    return e.eat("/") ? (e.skipToEnd(), ["comment", "comment"]) : e.eat("*") ? (t.tokenize = r, r(e, t)) : ["operator", "operator"]
                },
                ":": function(e) {
                    return e.match(/\s*{/) ? [null, "{"] : !1
                },
                $: function(e) {
                    return e.match(/^[\w-]+/), e.match(/^\s*:/, !1) ? ["variable-2", "variable-definition"] : ["variable-2", "variable"]
                },
                "#": function(e) {
                    return e.eat("{") ? [null, "interpolation"] : !1
                }
            },
            name: "css",
            helperType: "scss"
        }), e.defineMIME("text/x-less", {
            mediaTypes: o,
            mediaFeatures: l,
            propertyKeywords: u,
            nonStandardPropertyKeywords: c,
            colorKeywords: d,
            valueKeywords: p,
            fontProperties: g,
            allowNested: !0,
            tokenHooks: {
                "/": function(e, t) {
                    return e.eat("/") ? (e.skipToEnd(), ["comment", "comment"]) : e.eat("*") ? (t.tokenize = r, r(e, t)) : ["operator", "operator"]
                },
                "@": function(e) {
                    return e.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/, !1) ? !1 : (e.eatWhile(/[\w\\\-]/), e.match(/^\s*:/, !1) ? ["variable-2", "variable-definition"] : ["variable-2", "variable"])
                },
                "&": function() {
                    return ["atom", "atom"]
                }
            },
            name: "css",
            helperType: "less"
        })
    }),
    function(e) {
        "object" == typeof exports && "object" == typeof module ? e(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript"), require("../css/css")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript", "../css/css"], e) : e(CodeMirror)
    }(function(e) {
        "use strict";
        e.defineMode("htmlmixed", function(t, r) {
            function n(e, t) {
                var r = t.htmlState.tagName,
                    n = l.token(e, t.htmlState);
                if ("script" == r && /\btag\b/.test(n) && ">" == e.current()) {
                    var i = e.string.slice(Math.max(0, e.pos - 100), e.pos).match(/\btype\s*=\s*("[^"]+"|'[^']+'|\S+)[^<]*$/i);
                    i = i ? i[1] : "", i && /[\"\']/.test(i.charAt(0)) && (i = i.slice(1, i.length - 1));
                    for (var c = 0; c < u.length; ++c) {
                        var f = u[c];
                        if ("string" == typeof f.matches ? i == f.matches : f.matches.test(i)) {
                            f.mode && (t.token = o, t.localMode = f.mode, t.localState = f.mode.startState && f.mode.startState(l.indent(t.htmlState, "")));
                            break
                        }
                    }
                } else "style" == r && /\btag\b/.test(n) && ">" == e.current() && (t.token = a, t.localMode = s, t.localState = s.startState(l.indent(t.htmlState, "")));
                return n
            }

            function i(e, t, r) {
                var n = e.current(),
                    i = n.search(t),
                    o;
                return i > -1 ? e.backUp(n.length - i) : (o = n.match(/<\/?$/)) && (e.backUp(n.length), e.match(t, !1) || e.match(n)), r
            }

            function o(e, t) {
                return e.match(/^<\/\s*script\s*>/i, !1) ? (t.token = n, t.localState = t.localMode = null, n(e, t)) : i(e, /<\/\s*script\s*>/, t.localMode.token(e, t.localState))
            }

            function a(e, t) {
                return e.match(/^<\/\s*style\s*>/i, !1) ? (t.token = n, t.localState = t.localMode = null, n(e, t)) : i(e, /<\/\s*style\s*>/, s.token(e, t.localState))
            }
            var l = e.getMode(t, {
                    name: "xml",
                    htmlMode: !0,
                    multilineTagIndentFactor: r.multilineTagIndentFactor,
                    multilineTagIndentPastTag: r.multilineTagIndentPastTag
                }),
                s = e.getMode(t, "css"),
                u = [],
                c = r && r.scriptTypes;
            if (u.push({
                    matches: /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i,
                    mode: e.getMode(t, "javascript")
                }), c)
                for (var f = 0; f < c.length; ++f) {
                    var d = c[f];
                    u.push({
                        matches: d.matches,
                        mode: d.mode && e.getMode(t, d.mode)
                    })
                }
            return u.push({
                matches: /./,
                mode: e.getMode(t, "text/plain")
            }), {
                startState: function() {
                    var e = l.startState();
                    return {
                        token: n,
                        localMode: null,
                        localState: null,
                        htmlState: e
                    }
                },
                copyState: function(t) {
                    if (t.localState) var r = e.copyState(t.localMode, t.localState);
                    return {
                        token: t.token,
                        localMode: t.localMode,
                        localState: r,
                        htmlState: e.copyState(l, t.htmlState)
                    }
                },
                token: function(e, t) {
                    return t.token(e, t)
                },
                indent: function(t, r) {
                    return !t.localMode || /^\s*<\//.test(r) ? l.indent(t.htmlState, r) : t.localMode.indent ? t.localMode.indent(t.localState, r) : e.Pass
                },
                innerMode: function(e) {
                    return {
                        state: e.localState || e.htmlState,
                        mode: e.localMode || l
                    }
                }
            }
        }, "xml", "javascript", "css"), e.defineMIME("text/html", "htmlmixed")
    }),
    function(e) {
        "object" == typeof exports && "object" == typeof module ? e(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], e) : e(CodeMirror)
    }(function(e) {
        "use strict";
        e.defineMode("javascript", function(t, r) {
            function n(e) {
                for (var t = !1, r, n = !1; null != (r = e.next());) {
                    if (!t) {
                        if ("/" == r && !n) return;
                        "[" == r ? n = !0 : n && "]" == r && (n = !1)
                    }
                    t = !t && "\\" == r
                }
            }

            function i(e, t, r) {
                return xt = e, kt = r, t
            }

            function o(e, t) {
                var r = e.next();
                if ('"' == r || "'" == r) return t.tokenize = a(r), t.tokenize(e, t);
                if ("." == r && e.match(/^\d+(?:[eE][+\-]?\d+)?/)) return i("number", "number");
                if ("." == r && e.match("..")) return i("spread", "meta");
                if (/[\[\]{}\(\),;\:\.]/.test(r)) return i(r);
                if ("=" == r && e.eat(">")) return i("=>", "operator");
                if ("0" == r && e.eat(/x/i)) return e.eatWhile(/[\da-f]/i), i("number", "number");
                if (/\d/.test(r)) return e.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/), i("number", "number");
                if ("/" == r) return e.eat("*") ? (t.tokenize = l, l(e, t)) : e.eat("/") ? (e.skipToEnd(), i("comment", "comment")) : "operator" == t.lastType || "keyword c" == t.lastType || "sof" == t.lastType || /^[\[{}\(,;:]$/.test(t.lastType) ? (n(e), e.eatWhile(/[gimy]/), i("regexp", "string-2")) : (e.eatWhile(bt), i("operator", "operator", e.current()));
                if ("`" == r) return t.tokenize = s, s(e, t);
                if ("#" == r) return e.skipToEnd(), i("error", "error");
                if (bt.test(r)) return e.eatWhile(bt), i("operator", "operator", e.current());
                e.eatWhile(/[\w\$_]/);
                var o = e.current(),
                    u = yt.propertyIsEnumerable(o) && yt[o];
                return u && "." != t.lastType ? i(u.type, u.style, o) : i("variable", "variable", o)
            }

            function a(e) {
                return function(t, r) {
                    var n = !1,
                        a;
                    if (mt && "@" == t.peek() && t.match(wt)) return r.tokenize = o, i("jsonld-keyword", "meta");
                    for (; null != (a = t.next()) && (a != e || n);) n = !n && "\\" == a;
                    return n || (r.tokenize = o), i("string", "string")
                }
            }

            function l(e, t) {
                for (var r = !1, n; n = e.next();) {
                    if ("/" == n && r) {
                        t.tokenize = o;
                        break
                    }
                    r = "*" == n
                }
                return i("comment", "comment")
            }

            function s(e, t) {
                for (var r = !1, n; null != (n = e.next());) {
                    if (!r && ("`" == n || "$" == n && e.eat("{"))) {
                        t.tokenize = o;
                        break
                    }
                    r = !r && "\\" == n
                }
                return i("quasi", "string-2", e.current())
            }

            function u(e, t) {
                t.fatArrowAt && (t.fatArrowAt = null);
                var r = e.string.indexOf("=>", e.start);
                if (!(0 > r)) {
                    for (var n = 0, i = !1, o = r - 1; o >= 0; --o) {
                        var a = e.string.charAt(o),
                            l = Ct.indexOf(a);
                        if (l >= 0 && 3 > l) {
                            if (!n) {
                                ++o;
                                break
                            }
                            if (0 == --n) break
                        } else if (l >= 3 && 6 > l) ++n;
                        else if (/[$\w]/.test(a)) i = !0;
                        else if (i && !n) {
                            ++o;
                            break
                        }
                    }
                    i && !n && (t.fatArrowAt = o)
                }
            }

            function c(e, t, r, n, i, o) {
                this.indented = e, this.column = t, this.type = r, this.prev = i, this.info = o, null != n && (this.align = n)
            }

            function f(e, t) {
                for (var r = e.localVars; r; r = r.next)
                    if (r.name == t) return !0;
                for (var n = e.context; n; n = n.prev)
                    for (var r = n.vars; r; r = r.next)
                        if (r.name == t) return !0
            }

            function d(e, t, r, n, i) {
                var o = e.cc;
                for (St.state = e, St.stream = i, St.marked = null, St.cc = o, e.lexical.hasOwnProperty("align") || (e.lexical.align = !0);;) {
                    var a = o.length ? o.pop() : gt ? k : x;
                    if (a(r, n)) {
                        for (; o.length && o[o.length - 1].lex;) o.pop()();
                        return St.marked ? St.marked : "variable" == r && f(e, n) ? "variable-2" : t
                    }
                }
            }

            function h() {
                for (var e = arguments.length - 1; e >= 0; e--) St.cc.push(arguments[e])
            }

            function p() {
                return h.apply(null, arguments), !0
            }

            function m(e) {
                function t(t) {
                    for (var r = t; r; r = r.next)
                        if (r.name == e) return !0;
                    return !1
                }
                var n = St.state;
                if (n.context) {
                    if (St.marked = "def", t(n.localVars)) return;
                    n.localVars = {
                        name: e,
                        next: n.localVars
                    }
                } else {
                    if (t(n.globalVars)) return;
                    r.globalVars && (n.globalVars = {
                        name: e,
                        next: n.globalVars
                    })
                }
            }

            function g() {
                St.state.context = {
                    prev: St.state.context,
                    vars: St.state.localVars
                }, St.state.localVars = Mt
            }

            function v() {
                St.state.localVars = St.state.context.vars, St.state.context = St.state.context.prev
            }

            function y(e, t) {
                var r = function() {
                    var r = St.state,
                        n = r.indented;
                    "stat" == r.lexical.type && (n = r.lexical.indented), r.lexical = new c(n, St.stream.column(), e, null, r.lexical, t)
                };
                return r.lex = !0, r
            }

            function b() {
                var e = St.state;
                e.lexical.prev && (")" == e.lexical.type && (e.indented = e.lexical.indented), e.lexical = e.lexical.prev)
            }

            function w(e) {
                function t(r) {
                    return r == e ? p() : ";" == e ? h() : p(t)
                }
                return t
            }

            function x(e, t) {
                return "var" == e ? p(y("vardef", t.length), V, w(";"), b) : "keyword a" == e ? p(y("form"), k, x, b) : "keyword b" == e ? p(y("form"), x, b) : "{" == e ? p(y("}"), B, b) : ";" == e ? p() : "if" == e ? ("else" == St.state.lexical.info && St.state.cc[St.state.cc.length - 1] == b && St.state.cc.pop()(), p(y("form"), k, x, b, $)) : "function" == e ? p(et) : "for" == e ? p(y("form"), Y, x, b) : "variable" == e ? p(y("stat"), W) : "switch" == e ? p(y("form"), k, y("}", "switch"), w("{"), B, b, b) : "case" == e ? p(k, w(":")) : "default" == e ? p(w(":")) : "catch" == e ? p(y("form"), g, w("("), tt, w(")"), x, b, v) : "module" == e ? p(y("form"), g, ot, v, b) : "class" == e ? p(y("form"), rt, it, b) : "export" == e ? p(y("form"), at, b) : "import" == e ? p(y("form"), lt, b) : h(y("stat"), k, w(";"), b)
            }

            function k(e) {
                return L(e, !1)
            }

            function C(e) {
                return L(e, !0)
            }

            function L(e, t) {
                if (St.state.fatArrowAt == St.stream.start) {
                    var r = t ? z : O;
                    if ("(" == e) return p(g, y(")"), _(G, ")"), b, w("=>"), r, v);
                    if ("variable" == e) return h(g, G, w("=>"), r, v)
                }
                var n = t ? A : T;
                return Lt.hasOwnProperty(e) ? p(n) : "function" == e ? p(et, n) : "keyword c" == e ? p(t ? M : S) : "(" == e ? p(y(")"), S, dt, w(")"), b, n) : "operator" == e || "spread" == e ? p(t ? C : k) : "[" == e ? p(y("]"), ct, b, n) : "{" == e ? F(I, "}", null, n) : "quasi" == e ? h(N, n) : p()
            }

            function S(e) {
                return e.match(/[;\}\)\],]/) ? h() : h(k)
            }

            function M(e) {
                return e.match(/[;\}\)\],]/) ? h() : h(C)
            }

            function T(e, t) {
                return "," == e ? p(k) : A(e, t, !1)
            }

            function A(e, t, r) {
                var n = 0 == r ? T : A,
                    i = 0 == r ? k : C;
                return "=>" == t ? p(g, r ? z : O, v) : "operator" == e ? /\+\+|--/.test(t) ? p(n) : "?" == t ? p(k, w(":"), i) : p(i) : "quasi" == e ? h(N, n) : ";" != e ? "(" == e ? F(C, ")", "call", n) : "." == e ? p(E, n) : "[" == e ? p(y("]"), S, w("]"), b, n) : void 0 : void 0
            }

            function N(e, t) {
                return "quasi" != e ? h() : "${" != t.slice(t.length - 2) ? p(N) : p(k, H)
            }

            function H(e) {
                return "}" == e ? (St.marked = "string-2", St.state.tokenize = s, p(N)) : void 0
            }

            function O(e) {
                return u(St.stream, St.state), h("{" == e ? x : k)
            }

            function z(e) {
                return u(St.stream, St.state), h("{" == e ? x : C)
            }

            function W(e) {
                return ":" == e ? p(b, x) : h(T, w(";"), b)
            }

            function E(e) {
                return "variable" == e ? (St.marked = "property", p()) : void 0
            }

            function I(e, t) {
                if ("variable" == e) {
                    if (St.marked = "property", "get" == t || "set" == t) return p(D)
                } else if ("number" == e || "string" == e) St.marked = mt ? "property" : e + " property";
                else if ("[" == e) return p(k, w("]"), P);
                return Lt.hasOwnProperty(e) ? p(P) : void 0
            }

            function D(e) {
                return "variable" != e ? h(P) : (St.marked = "property", p(et))
            }

            function P(e) {
                return ":" == e ? p(C) : "(" == e ? h(et) : void 0
            }

            function _(e, t) {
                function r(n) {
                    if ("," == n) {
                        var i = St.state.lexical;
                        return "call" == i.info && (i.pos = (i.pos || 0) + 1), p(e, r)
                    }
                    return n == t ? p() : p(w(t))
                }
                return function(n) {
                    return n == t ? p() : h(e, r)
                }
            }

            function F(e, t, r) {
                for (var n = 3; n < arguments.length; n++) St.cc.push(arguments[n]);
                return p(y(t, r), _(e, t), b)
            }

            function B(e) {
                return "}" == e ? p() : h(x, B)
            }

            function R(e) {
                return vt && ":" == e ? p(j) : void 0
            }

            function j(e) {
                return "variable" == e ? (St.marked = "variable-3", p()) : void 0
            }

            function V() {
                return h(G, R, U, K)
            }

            function G(e, t) {
                return "variable" == e ? (m(t), p()) : "[" == e ? F(G, "]") : "{" == e ? F(q, "}") : void 0
            }

            function q(e, t) {
                return "variable" != e || St.stream.match(/^\s*:/, !1) ? ("variable" == e && (St.marked = "property"), p(w(":"), G, U)) : (m(t), p(U))
            }

            function U(e, t) {
                return "=" == t ? p(C) : void 0
            }

            function K(e) {
                return "," == e ? p(V) : void 0
            }

            function $(e, t) {
                return "keyword b" == e && "else" == t ? p(y("form", "else"), x, b) : void 0
            }

            function Y(e) {
                return "(" == e ? p(y(")"), X, w(")"), b) : void 0
            }

            function X(e) {
                return "var" == e ? p(V, w(";"), Q) : ";" == e ? p(Q) : "variable" == e ? p(Z) : h(k, w(";"), Q)
            }

            function Z(e, t) {
                return "in" == t || "of" == t ? (St.marked = "keyword", p(k)) : p(T, Q)
            }

            function Q(e, t) {
                return ";" == e ? p(J) : "in" == t || "of" == t ? (St.marked = "keyword", p(k)) : h(k, w(";"), J)
            }

            function J(e) {
                ")" != e && p(k)
            }

            function et(e, t) {
                return "*" == t ? (St.marked = "keyword", p(et)) : "variable" == e ? (m(t), p(et)) : "(" == e ? p(g, y(")"), _(tt, ")"), b, x, v) : void 0
            }

            function tt(e) {
                return "spread" == e ? p(tt) : h(G, R)
            }

            function rt(e, t) {
                return "variable" == e ? (m(t), p(nt)) : void 0
            }

            function nt(e, t) {
                return "extends" == t ? p(k) : void 0
            }

            function it(e) {
                return "{" == e ? F(I, "}") : void 0
            }

            function ot(e, t) {
                return "string" == e ? p(x) : "variable" == e ? (m(t), p(ut)) : void 0
            }

            function at(e, t) {
                return "*" == t ? (St.marked = "keyword", p(ut, w(";"))) : "default" == t ? (St.marked = "keyword", p(k, w(";"))) : h(x)
            }

            function lt(e) {
                return "string" == e ? p() : h(st, ut)
            }

            function st(e, t) {
                return "{" == e ? F(st, "}") : ("variable" == e && m(t), p())
            }

            function ut(e, t) {
                return "from" == t ? (St.marked = "keyword", p(k)) : void 0
            }

            function ct(e) {
                return "]" == e ? p() : h(C, ft)
            }

            function ft(e) {
                return "for" == e ? h(dt, w("]")) : "," == e ? p(_(C, "]")) : h(_(C, "]"))
            }

            function dt(e) {
                return "for" == e ? p(Y, dt) : "if" == e ? p(k, dt) : void 0
            }
            var ht = t.indentUnit,
                pt = r.statementIndent,
                mt = r.jsonld,
                gt = r.json || mt,
                vt = r.typescript,
                yt = function() {
                    function e(e) {
                        return {
                            type: e,
                            style: "keyword"
                        }
                    }
                    var t = e("keyword a"),
                        r = e("keyword b"),
                        n = e("keyword c"),
                        i = e("operator"),
                        o = {
                            type: "atom",
                            style: "atom"
                        },
                        a = {
                            "if": e("if"),
                            "while": t,
                            "with": t,
                            "else": r,
                            "do": r,
                            "try": r,
                            "finally": r,
                            "return": n,
                            "break": n,
                            "continue": n,
                            "new": n,
                            "delete": n,
                            "throw": n,
                            "debugger": n,
                            "var": e("var"),
                            "const": e("var"),
                            let: e("var"),
                            "function": e("function"),
                            "catch": e("catch"),
                            "for": e("for"),
                            "switch": e("switch"),
                            "case": e("case"),
                            "default": e("default"),
                            "in": i,
                            "typeof": i,
                            "instanceof": i,
                            "true": o,
                            "false": o,
                            "null": o,
                            undefined: o,
                            NaN: o,
                            Infinity: o,
                            "this": e("this"),
                            module: e("module"),
                            "class": e("class"),
                            "super": e("atom"),
                            "yield": n,
                            "export": e("export"),
                            "import": e("import"),
                            "extends": n
                        };
                    if (vt) {
                        var l = {
                                type: "variable",
                                style: "variable-3"
                            },
                            s = {
                                "interface": e("interface"),
                                "extends": e("extends"),
                                constructor: e("constructor"),
                                "public": e("public"),
                                "private": e("private"),
                                "protected": e("protected"),
                                "static": e("static"),
                                string: l,
                                number: l,
                                bool: l,
                                any: l
                            };
                        for (var u in s) a[u] = s[u]
                    }
                    return a
                }(),
                bt = /[+\-*&%=<>!?|~^]/,
                wt = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/,
                xt, kt, Ct = "([{}])",
                Lt = {
                    atom: !0,
                    number: !0,
                    variable: !0,
                    string: !0,
                    regexp: !0,
                    "this": !0,
                    "jsonld-keyword": !0
                },
                St = {
                    state: null,
                    column: null,
                    marked: null,
                    cc: null
                },
                Mt = {
                    name: "this",
                    next: {
                        name: "arguments"
                    }
                };
            return b.lex = !0, {
                startState: function(e) {
                    var t = {
                        tokenize: o,
                        lastType: "sof",
                        cc: [],
                        lexical: new c((e || 0) - ht, 0, "block", !1),
                        localVars: r.localVars,
                        context: r.localVars && {
                            vars: r.localVars
                        },
                        indented: 0
                    };
                    return r.globalVars && "object" == typeof r.globalVars && (t.globalVars = r.globalVars), t
                },
                token: function(e, t) {
                    if (e.sol() && (t.lexical.hasOwnProperty("align") || (t.lexical.align = !1), t.indented = e.indentation(), u(e, t)), t.tokenize != l && e.eatSpace()) return null;
                    var r = t.tokenize(e, t);
                    return "comment" == xt ? r : (t.lastType = "operator" != xt || "++" != kt && "--" != kt ? xt : "incdec", d(t, r, xt, kt, e))
                },
                indent: function(t, n) {
                    if (t.tokenize == l) return e.Pass;
                    if (t.tokenize != o) return 0;
                    var i = n && n.charAt(0),
                        a = t.lexical;
                    if (!/^\s*else\b/.test(n))
                        for (var s = t.cc.length - 1; s >= 0; --s) {
                            var u = t.cc[s];
                            if (u == b) a = a.prev;
                            else if (u != $) break
                        }
                    "stat" == a.type && "}" == i && (a = a.prev), pt && ")" == a.type && "stat" == a.prev.type && (a = a.prev);
                    var c = a.type,
                        f = i == c;
                    return "vardef" == c ? a.indented + ("operator" == t.lastType || "," == t.lastType ? a.info + 1 : 0) : "form" == c && "{" == i ? a.indented : "form" == c ? a.indented + ht : "stat" == c ? a.indented + ("operator" == t.lastType || "," == t.lastType ? pt || ht : 0) : "switch" != a.info || f || 0 == r.doubleIndentSwitch ? a.align ? a.column + (f ? 0 : 1) : a.indented + (f ? 0 : ht) : a.indented + (/^(?:case|default)\b/.test(n) ? ht : 2 * ht)
                },
                electricChars: ":{}",
                blockCommentStart: gt ? null : "/*",
                blockCommentEnd: gt ? null : "*/",
                lineComment: gt ? null : "//",
                fold: "brace",
                helperType: gt ? "json" : "javascript",
                jsonldMode: mt,
                jsonMode: gt
            }
        }), e.defineMIME("text/javascript", "javascript"), e.defineMIME("text/ecmascript", "javascript"), e.defineMIME("application/javascript", "javascript"), e.defineMIME("application/ecmascript", "javascript"), e.defineMIME("application/json", {
            name: "javascript",
            json: !0
        }), e.defineMIME("application/x-json", {
            name: "javascript",
            json: !0
        }), e.defineMIME("application/ld+json", {
            name: "javascript",
            jsonld: !0
        }), e.defineMIME("text/typescript", {
            name: "javascript",
            typescript: !0
        }), e.defineMIME("application/typescript", {
            name: "javascript",
            typescript: !0
        })
    }),
    function(e) {
        "object" == typeof exports && "object" == typeof module ? e(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], e) : e(CodeMirror)
    }(function(e) {
        "use strict";
        e.defineMode("xml", function(t, r) {
            function n(e, t) {
                function r(r) {
                    return t.tokenize = r, r(e, t)
                }
                var n = e.next();
                if ("<" == n) return e.eat("!") ? e.eat("[") ? e.match("CDATA[") ? r(a("atom", "]]>")) : null : e.match("--") ? r(a("comment", "-->")) : e.match("DOCTYPE", !0, !0) ? (e.eatWhile(/[\w\._\-]/), r(l(1))) : null : e.eat("?") ? (e.eatWhile(/[\w\._\-]/), t.tokenize = a("meta", "?>"), "meta") : (S = e.eat("/") ? "closeTag" : "openTag", t.tokenize = i, "tag bracket");
                if ("&" == n) {
                    var o;
                    return o = e.eat("#") ? e.eat("x") ? e.eatWhile(/[a-fA-F\d]/) && e.eat(";") : e.eatWhile(/[\d]/) && e.eat(";") : e.eatWhile(/[\w\.\-:]/) && e.eat(";"), o ? "atom" : "error"
                }
                return e.eatWhile(/[^&<]/), null
            }

            function i(e, t) {
                var r = e.next();
                if (">" == r || "/" == r && e.eat(">")) return t.tokenize = n, S = ">" == r ? "endTag" : "selfcloseTag", "tag bracket";
                if ("=" == r) return S = "equals", null;
                if ("<" == r) {
                    t.tokenize = n, t.state = f, t.tagName = t.tagStart = null;
                    var i = t.tokenize(e, t);
                    return i ? i + " error" : "error"
                }
                return /[\'\"]/.test(r) ? (t.tokenize = o(r), t.stringStartCol = e.column(), t.tokenize(e, t)) : (e.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/), "word")
            }

            function o(e) {
                var t = function(t, r) {
                    for (; !t.eol();)
                        if (t.next() == e) {
                            r.tokenize = i;
                            break
                        }
                    return "string"
                };
                return t.isInAttribute = !0, t
            }

            function a(e, t) {
                return function(r, i) {
                    for (; !r.eol();) {
                        if (r.match(t)) {
                            i.tokenize = n;
                            break
                        }
                        r.next()
                    }
                    return e
                }
            }

            function l(e) {
                return function(t, r) {
                    for (var i; null != (i = t.next());) {
                        if ("<" == i) return r.tokenize = l(e + 1), r.tokenize(t, r);
                        if (">" == i) {
                            if (1 == e) {
                                r.tokenize = n;
                                break
                            }
                            return r.tokenize = l(e - 1), r.tokenize(t, r)
                        }
                    }
                    return "meta"
                }
            }

            function s(e, t, r) {
                this.prev = e.context, this.tagName = t, this.indent = e.indented, this.startOfLine = r, (C.doNotIndent.hasOwnProperty(t) || e.context && e.context.noIndent) && (this.noIndent = !0)
            }

            function u(e) {
                e.context && (e.context = e.context.prev)
            }

            function c(e, t) {
                for (var r;;) {
                    if (!e.context) return;
                    if (r = e.context.tagName, !C.contextGrabbers.hasOwnProperty(r) || !C.contextGrabbers[r].hasOwnProperty(t)) return;
                    u(e)
                }
            }

            function f(e, t, r) {
                return "openTag" == e ? (r.tagStart = t.column(), d) : "closeTag" == e ? h : f
            }

            function d(e, t, r) {
                return "word" == e ? (r.tagName = t.current(), M = "tag", g) : (M = "error", d)
            }

            function h(e, t, r) {
                if ("word" == e) {
                    var n = t.current();
                    return r.context && r.context.tagName != n && C.implicitlyClosed.hasOwnProperty(r.context.tagName) && u(r), r.context && r.context.tagName == n ? (M = "tag", p) : (M = "tag error", m)
                }
                return M = "error", m
            }

            function p(e, t, r) {
                return "endTag" != e ? (M = "error", p) : (u(r), f)
            }

            function m(e, t, r) {
                return M = "error", p(e, t, r)
            }

            function g(e, t, r) {
                if ("word" == e) return M = "attribute", v;
                if ("endTag" == e || "selfcloseTag" == e) {
                    var n = r.tagName,
                        i = r.tagStart;
                    return r.tagName = r.tagStart = null, "selfcloseTag" == e || C.autoSelfClosers.hasOwnProperty(n) ? c(r, n) : (c(r, n), r.context = new s(r, n, i == r.indented)), f
                }
                return M = "error", g
            }

            function v(e, t, r) {
                return "equals" == e ? y : (C.allowMissing || (M = "error"), g(e, t, r))
            }

            function y(e, t, r) {
                return "string" == e ? b : "word" == e && C.allowUnquoted ? (M = "string", g) : (M = "error", g(e, t, r))
            }

            function b(e, t, r) {
                return "string" == e ? b : g(e, t, r)
            }
            var w = t.indentUnit,
                x = r.multilineTagIndentFactor || 1,
                k = r.multilineTagIndentPastTag;
            null == k && (k = !0);
            var C = r.htmlMode ? {
                    autoSelfClosers: {
                        area: !0,
                        base: !0,
                        br: !0,
                        col: !0,
                        command: !0,
                        embed: !0,
                        frame: !0,
                        hr: !0,
                        img: !0,
                        input: !0,
                        keygen: !0,
                        link: !0,
                        meta: !0,
                        param: !0,
                        source: !0,
                        track: !0,
                        wbr: !0
                    },
                    implicitlyClosed: {
                        dd: !0,
                        li: !0,
                        optgroup: !0,
                        option: !0,
                        p: !0,
                        rp: !0,
                        rt: !0,
                        tbody: !0,
                        td: !0,
                        tfoot: !0,
                        th: !0,
                        tr: !0
                    },
                    contextGrabbers: {
                        dd: {
                            dd: !0,
                            dt: !0
                        },
                        dt: {
                            dd: !0,
                            dt: !0
                        },
                        li: {
                            li: !0
                        },
                        option: {
                            option: !0,
                            optgroup: !0
                        },
                        optgroup: {
                            optgroup: !0
                        },
                        p: {
                            address: !0,
                            article: !0,
                            aside: !0,
                            blockquote: !0,
                            dir: !0,
                            div: !0,
                            dl: !0,
                            fieldset: !0,
                            footer: !0,
                            form: !0,
                            h1: !0,
                            h2: !0,
                            h3: !0,
                            h4: !0,
                            h5: !0,
                            h6: !0,
                            header: !0,
                            hgroup: !0,
                            hr: !0,
                            menu: !0,
                            nav: !0,
                            ol: !0,
                            p: !0,
                            pre: !0,
                            section: !0,
                            table: !0,
                            ul: !0
                        },
                        rp: {
                            rp: !0,
                            rt: !0
                        },
                        rt: {
                            rp: !0,
                            rt: !0
                        },
                        tbody: {
                            tbody: !0,
                            tfoot: !0
                        },
                        td: {
                            td: !0,
                            th: !0
                        },
                        tfoot: {
                            tbody: !0
                        },
                        th: {
                            td: !0,
                            th: !0
                        },
                        thead: {
                            tbody: !0,
                            tfoot: !0
                        },
                        tr: {
                            tr: !0
                        }
                    },
                    doNotIndent: {
                        pre: !0
                    },
                    allowUnquoted: !0,
                    allowMissing: !0,
                    caseFold: !0
                } : {
                    autoSelfClosers: {},
                    implicitlyClosed: {},
                    contextGrabbers: {},
                    doNotIndent: {},
                    allowUnquoted: !1,
                    allowMissing: !1,
                    caseFold: !1
                },
                L = r.alignCDATA,
                S, M;
            return {
                startState: function() {
                    return {
                        tokenize: n,
                        state: f,
                        indented: 0,
                        tagName: null,
                        tagStart: null,
                        context: null
                    }
                },
                token: function(e, t) {
                    if (!t.tagName && e.sol() && (t.indented = e.indentation()), e.eatSpace()) return null;
                    S = null;
                    var r = t.tokenize(e, t);
                    return (r || S) && "comment" != r && (M = null, t.state = t.state(S || r, e, t), M && (r = "error" == M ? r + " error" : M)), r
                },
                indent: function(t, r, o) {
                    var a = t.context;
                    if (t.tokenize.isInAttribute) return t.tagStart == t.indented ? t.stringStartCol + 1 : t.indented + w;
                    if (a && a.noIndent) return e.Pass;
                    if (t.tokenize != i && t.tokenize != n) return o ? o.match(/^(\s*)/)[0].length : 0;
                    if (t.tagName) return k ? t.tagStart + t.tagName.length + 2 : t.tagStart + w * x;
                    if (L && /<!\[CDATA\[/.test(r)) return 0;
                    var l = r && /^<(\/)?([\w_:\.-]*)/.exec(r);
                    if (l && l[1])
                        for (; a;) {
                            if (a.tagName == l[2]) {
                                a = a.prev;
                                break
                            }
                            if (!C.implicitlyClosed.hasOwnProperty(a.tagName)) break;
                            a = a.prev
                        } else if (l)
                            for (; a;) {
                                var s = C.contextGrabbers[a.tagName];
                                if (!s || !s.hasOwnProperty(l[2])) break;
                                a = a.prev
                            }
                        for (; a && !a.startOfLine;) a = a.prev;
                    return a ? a.indent + w : 0
                },
                electricInput: /<\/[\s\w:]+>$/,
                blockCommentStart: "<!--",
                blockCommentEnd: "-->",
                configuration: r.htmlMode ? "html" : "xml",
                helperType: r.htmlMode ? "html" : "xml"
            }
        }), e.defineMIME("text/xml", "xml"), e.defineMIME("application/xml", "xml"), e.mimeModes.hasOwnProperty("text/html") || e.defineMIME("text/html", {
            name: "xml",
            htmlMode: !0
        })
    }),
    function(e) {
        "object" == typeof exports && "object" == typeof module ? e(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], e) : e(CodeMirror)
    }(function(e) {
        "use strict";

        function t(e) {
            for (var t = 0; t < e.state.activeLines.length; t++) e.removeLineClass(e.state.activeLines[t], "wrap", o), e.removeLineClass(e.state.activeLines[t], "background", a)
        }

        function r(e, t) {
            if (e.length != t.length) return !1;
            for (var r = 0; r < e.length; r++)
                if (e[r] != t[r]) return !1;
            return !0
        }

        function n(e, n) {
            for (var i = [], l = 0; l < n.length; l++) {
                var s = e.getLineHandleVisualStart(n[l].head.line);
                i[i.length - 1] != s && i.push(s)
            }
            r(e.state.activeLines, i) || e.operation(function() {
                t(e);
                for (var r = 0; r < i.length; r++) e.addLineClass(i[r], "wrap", o), e.addLineClass(i[r], "background", a);
                e.state.activeLines = i
            })
        }

        function i(e, t) {
            n(e, t.ranges)
        }
        var o = "CodeMirror-activeline",
            a = "CodeMirror-activeline-background";
        e.defineOption("styleActiveLine", !1, function(r, o, a) {
            var l = a && a != e.Init;
            o && !l ? (r.state.activeLines = [], n(r, r.listSelections()), r.on("beforeSelectionChange", i)) : !o && l && (r.off("beforeSelectionChange", i), t(r), delete r.state.activeLines)
        })
    }),
    function(e) {
        "object" == typeof exports && "object" == typeof module ? e(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], e) : e(CodeMirror)
    }(function(e) {
        function t(e, t, n, i) {
            var o = e.getLineHandle(t.line),
                s = t.ch - 1,
                u = s >= 0 && l[o.text.charAt(s)] || l[o.text.charAt(++s)];
            if (!u) return null;
            var c = ">" == u.charAt(1) ? 1 : -1;
            if (n && c > 0 != (s == t.ch)) return null;
            var f = e.getTokenTypeAt(a(t.line, s + 1)),
                d = r(e, a(t.line, s + (c > 0 ? 1 : 0)), c, f || null, i);
            return null == d ? null : {
                from: a(t.line, s),
                to: d && d.pos,
                match: d && d.ch == u.charAt(0),
                forward: c > 0
            }
        }

        function r(e, t, r, n, i) {
            for (var o = i && i.maxScanLineLength || 1e4, s = i && i.maxScanLines || 1e3, u = [], c = i && i.bracketRegex ? i.bracketRegex : /[(){}[\]]/, f = r > 0 ? Math.min(t.line + s, e.lastLine() + 1) : Math.max(e.firstLine() - 1, t.line - s), d = t.line; d != f; d += r) {
                var h = e.getLine(d);
                if (h) {
                    var p = r > 0 ? 0 : h.length - 1,
                        m = r > 0 ? h.length : -1;
                    if (!(h.length > o))
                        for (d == t.line && (p = t.ch - (0 > r ? 1 : 0)); p != m; p += r) {
                            var g = h.charAt(p);
                            if (c.test(g) && (void 0 === n || e.getTokenTypeAt(a(d, p + 1)) == n)) {
                                var v = l[g];
                                if (">" == v.charAt(1) == r > 0) u.push(g);
                                else {
                                    if (!u.length) return {
                                        pos: a(d, p),
                                        ch: g
                                    };
                                    u.pop()
                                }
                            }
                        }
                }
            }
            return d - r == (r > 0 ? e.lastLine() : e.firstLine()) ? !1 : null
        }

        function n(e, r, n) {
            for (var i = e.state.matchBrackets.maxHighlightLineLength || 1e3, l = [], s = e.listSelections(), u = 0; u < s.length; u++) {
                var c = s[u].empty() && t(e, s[u].head, !1, n);
                if (c && e.getLine(c.from.line).length <= i) {
                    var f = c.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
                    l.push(e.markText(c.from, a(c.from.line, c.from.ch + 1), {
                        className: f
                    })), c.to && e.getLine(c.to.line).length <= i && l.push(e.markText(c.to, a(c.to.line, c.to.ch + 1), {
                        className: f
                    }))
                }
            }
            if (l.length) {
                o && e.state.focused && e.display.input.focus();
                var d = function() {
                    e.operation(function() {
                        for (var e = 0; e < l.length; e++) l[e].clear()
                    })
                };
                if (!r) return d;
                setTimeout(d, 800)
            }
        }

        function i(e) {
            e.operation(function() {
                s && (s(), s = null), s = n(e, !1, e.state.matchBrackets)
            })
        }
        var o = /MSIE \d/.test(navigator.userAgent) && (null == document.documentMode || document.documentMode < 8),
            a = e.Pos,
            l = {
                "(": ")>",
                ")": "(<",
                "[": "]>",
                "]": "[<",
                "{": "}>",
                "}": "{<"
            },
            s = null;
        e.defineOption("matchBrackets", !1, function(t, r, n) {
            n && n != e.Init && t.off("cursorActivity", i), r && (t.state.matchBrackets = "object" == typeof r ? r : {}, t.on("cursorActivity", i))
        }), e.defineExtension("matchBrackets", function() {
            n(this, !0)
        }), e.defineExtension("findMatchingBracket", function(e, r, n) {
            return t(this, e, r, n)
        }), e.defineExtension("scanForBracket", function(e, t, n, i) {
            return r(this, e, t, n, i)
        })
    }), window.onload = heshPlugin;
<?php

/**
 * Include functions.php components from inc directory.
 * If this directory name changes also edit it in header.php, inc/editor.php
 */

include_once('inc/white-label.php');

include_once('inc/editor.php');

include_once('inc/enqueue-scripts.php');
include_once('inc/enqueue-styles.php');

include_once('inc/menu-backend.php');
include_once('inc/menu-frontend.php');

include_once('inc/theme-customizer-setup.php');
include_once('inc/theme-features.php');

include_once('inc/acf-repeater/acf-repeater.php');

//include_once('inc/permalink_structure.php');
<?php

/**
 * These functions remove WordPress branding and unwanted third party ads
 * plus add some own branding.
 */

function remove_login_logo() {
	echo '<style type="text/css">h1 a{background-image:none!important}</style>';
}

function remove_admin_bar_logo() {
	global $wp_admin_bar;
	$wp_admin_bar->remove_menu( 'wp-logo' );
}

function remove_dashboard_widgets() {
	remove_meta_box( 'dashboard_recent_comments', 'dashboard', 'normal' );
	remove_meta_box( 'dashboard_incoming_links', 'dashboard', 'normal' );
	remove_meta_box( 'dashboard_recent_drafts', 'dashboard', 'normal' );
	remove_meta_box( 'dashboard_right_now', 'dashboard', 'normal' );
	remove_meta_box( 'dashboard_plugins', 'dashboard', 'normal' );
	remove_meta_box( 'dashboard_quick_press', 'dashboard', 'normal' );
	remove_meta_box( 'dashboard_primary', 'dashboard', 'normal' );
	remove_meta_box( 'dashboard_secondary', 'dashboard', 'normal' );
}

function add_dashboard_widgets() {
	wp_add_dashboard_widget( 'wp_dashboard_widget', 'Theme Details', 'theme_info' );
}

function theme_info() {
	echo "<ul>
	<li><strong>Autor:</strong> Friedrich Schulthei&szlig;</li>
	<li><strong>Kontakt:</strong> <a href='mailto:mail@friedrich-schultheiss.de'>mail@friedrich-schultheiss.de</a></li>
	</ul>";
}

function remove_help() {
	echo '<style>#contextual-help-link-wrap{display:none!important}</style>';
}

function remove_acf() {
	echo '<script>document.getElementById("toplevel_page_edit-post_type-acf").style.display="none";</script>';
}

function remove_ads() {
	echo '<style>#i18n_promo_box,.wp-pointer[style],.yoast_help,.wpseo_content_cell#sidebar-container{display:none!important}</style>';
}

function remove_menu_labels() {
	global $menu;
	global $submenu;
	/* #.# Code to detect menu / submenu array structure
	*
	echo '<pre>';
	print_r($submenu);
	echo '</pre>';
	wp_die('');
	*
	*/
	unset( $submenu['wpseo_dashboard'][10] );
	unset( $submenu['wpseo_dashboard'][7] );
	unset( $submenu['wpseo_dashboard'][8] );
}

function change_meta_box_titles() {
	global $wp_meta_boxes;
	/* #.# Code to detect metabox array structure
	*
	echo '<pre>';
	print_r($wp_meta_boxes);
	echo '</pre>';
	wp_die('');
	*
	*/
	$wp_meta_boxes['page']['normal']['high']['wpseo_meta']['title'] = __( 'Suchmaschinen-Optimierung', 'gfs' );
}

function change_menu_labels() {
	global $menu;
	global $submenu;
	/* #.# Code to detect menu / submenu array structure
	*
	echo '<pre>';
	print_r($submenu);
	echo '</pre>';
	wp_die('');
	*
	*/
	$submenu['wpseo_dashboard'][0][0]  = __( 'Allgemein', 'gfs' );
	$submenu['wpseo_dashboard'][0][3]  = __( 'Allgemein', 'gfs' );

	$submenu['wpseo_dashboard'][1][0]  = __( 'Titel und Meta', 'gfs' );
	$submenu['wpseo_dashboard'][1][3]  = __( 'Titel und Meta', 'gfs' );

	$submenu['wpseo_dashboard'][2][0]  = __( 'Social', 'gfs' );
	$submenu['wpseo_dashboard'][2][3]  = __( 'Social', 'gfs' );

	$submenu['wpseo_dashboard'][3][0]  = __( 'XML-Sitemaps', 'gfs' );
	$submenu['wpseo_dashboard'][3][3]  = __( 'XML-Sitemaps', 'gfs' );

	$submenu['wpseo_dashboard'][4][0]  = __( 'Permalinks', 'gfs' );
	$submenu['wpseo_dashboard'][4][3]  = __( 'Permalinks', 'gfs' );

	$submenu['wpseo_dashboard'][5][0]  = __( 'Interne Links', 'gfs' );
	$submenu['wpseo_dashboard'][5][3]  = __( 'Interne Links', 'gfs' );

	$submenu['wpseo_dashboard'][6][0]  = __( 'RSS', 'gfs' );
	$submenu['wpseo_dashboard'][6][3]  = __( 'RSS', 'gfs' );

//	$submenu['wpseo_dashboard'][7][0]  = __( 'Import und Export', 'gfs' );
//	$submenu['wpseo_dashboard'][7][3]  = __( 'Import und Export', 'gfs' );

//	$submenu['wpseo_dashboard'][8][0]  = __( 'Massenbearbeitung', 'gfs' );
//	$submenu['wpseo_dashboard'][8][3]  = __( 'Massenbearbeitung', 'gfs' );

	$submenu['wpseo_dashboard'][9][0]  = __( 'Editor', 'gfs' );
	$submenu['wpseo_dashboard'][9][3]  = __( 'Editor', 'gfs' );
}

function remove_yoast_ob_start() {
	ob_start( 'remove_yoast' );
}

function remove_yoast_ob_end_flush() {
	ob_end_flush();
}

function remove_yoast($output) {
	if ( defined('WPSEO_VERSION') ) {
	    $output = str_ireplace( '<!-- This site is optimized with the Yoast WordPress SEO plugin v' . WPSEO_VERSION . ' - https://yoast.com/wordpress/plugins/seo/ -->', '', $output );
	    $output = str_ireplace( '<!-- / Yoast WordPress SEO plugin. -->', '', $output );
	}
	return $output;
}

function remove_post_columns( $columns ) {
	unset( $columns['author'] );
	unset( $columns['tags'] );
	unset( $columns['categories'] );
	unset( $columns['tags'] );
	unset( $columns['comments'] );
	return $columns;
}

function remove_page_columns( $columns ) {
	unset( $columns['author'] );
	unset( $columns['comments'] );
	unset( $columns['date'] );
	return $columns;
}

add_filter( 'manage_edit-post_columns', 'remove_post_columns', 10, 1 );
add_filter( 'manage_edit-page_columns', 'remove_page_columns', 10, 1 );

add_action( 'get_header', 'remove_yoast_ob_start' );
add_action( 'wp_head', 'remove_yoast_ob_end_flush', 100 );

add_action( 'add_meta_boxes', 'change_meta_box_titles', 999 );
add_action( 'admin_init', 'change_menu_labels', 999 );
add_action( 'admin_init', 'remove_menu_labels' );


add_action( 'wp_before_admin_bar_render', 'remove_admin_bar_logo' );
add_action( 'login_head', 'remove_login_logo' );
add_action( 'admin_init', 'remove_dashboard_widgets' );
add_action( 'wp_dashboard_setup', 'add_dashboard_widgets' );
add_action( 'admin_head', 'remove_help' );
add_action( 'admin_head', 'remove_ads' );
add_action( 'admin_footer', 'remove_acf');

add_filter( 'admin_footer_text', '__return_false' );
add_filter( 'update_footer', '__return_false', 11 );

remove_action( 'welcome_panel', 'wp_welcome_panel' );
<?php

function my_enqueue_styles() {
	wp_enqueue_style( 'my-style', get_stylesheet_uri() );
}

add_action( 'wp_enqueue_scripts', 'my_enqueue_styles' );
.CodeMirror {
    font-family: monospace;
    height: 300px
}
.CodeMirror-scroll {
    overflow: auto
}
.CodeMirror-lines {
    padding: 4px 0
}
.CodeMirror pre {
    padding: 0 4px
}
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
    background-color: #fff
}
.CodeMirror-gutters {
    border-right: 1px solid #ddd;
    background-color: #f7f7f7;
    white-space: nowrap
}
.CodeMirror-linenumber {
    padding: 0 3px 0 5px;
    min-width: 20px;
    text-align: right;
    color: #999;
    -moz-box-sizing: content-box;
    box-sizing: content-box
}
.CodeMirror div.CodeMirror-cursor {
    border-left: 1px solid #000
}
.CodeMirror div.CodeMirror-secondarycursor {
    border-left: 1px solid silver
}
.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
    width: auto;
    border: 0;
    background: #7e7
}
.cm-tab {
    display: inline-block
}
.CodeMirror-ruler {
    border-left: 1px solid #ccc;
    position: absolute
}
.cm-s-default .cm-keyword {
    color: #708
}
.cm-s-default .cm-atom {
    color: #219
}
.cm-s-default .cm-number {
    color: #164
}
.cm-s-default .cm-def {
    color: #00f
}
.cm-s-default .cm-variable-2 {
    color: #05a
}
.cm-s-default .cm-variable-3 {
    color: #085
}
.cm-s-default .cm-comment {
    color: #a50
}
.cm-s-default .cm-string {
    color: #a11
}
.cm-s-default .cm-string-2 {
    color: #f50
}
.cm-s-default .cm-meta {
    color: #555
}
.cm-s-default .cm-qualifier {
    color: #555
}
.cm-s-default .cm-builtin {
    color: #30a
}
.cm-s-default .cm-bracket {
    color: #997
}
.cm-s-default .cm-tag {
    color: #170
}
.cm-s-default .cm-attribute {
    color: #00c
}
.cm-s-default .cm-header {
    color: #00f
}
.cm-s-default .cm-quote {
    color: #090
}
.cm-s-default .cm-hr {
    color: #999
}
.cm-s-default .cm-link {
    color: #00c
}
.cm-negative {
    color: #d44
}
.cm-positive {
    color: #292
}
.cm-header, .cm-strong {
    font-weight: 700
}
.cm-em {
    font-style: italic
}
.cm-link {
    text-decoration: underline
}
.cm-s-default .cm-error {
    color: red
}
.cm-invalidchar {
    color: red
}
div.CodeMirror span.CodeMirror-matchingbracket {
    color: #0f0
}
div.CodeMirror span.CodeMirror-nonmatchingbracket {
    color: #f22
}
.CodeMirror-activeline-background {
    background: #e8f2ff
}
.CodeMirror {
    line-height: 1;
    position: relative;
    overflow: hidden;
    background: #fff;
    color: #000
}
.CodeMirror-scroll {
    margin-bottom: -30px;
    margin-right: -30px;
    padding-bottom: 30px;
    height: 100%;
    outline: 0;
    position: relative;
    -moz-box-sizing: content-box;
    box-sizing: content-box
}
.CodeMirror-sizer {
    position: relative;
    border-right: 30px solid transparent;
    -moz-box-sizing: content-box;
    box-sizing: content-box
}
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
    position: absolute;
    z-index: 6;
    display: none
}
.CodeMirror-vscrollbar {
    right: 0;
    top: 0;
    overflow-x: hidden;
    overflow-y: scroll
}
.CodeMirror-hscrollbar {
    bottom: 0;
    left: 0;
    overflow-y: hidden;
    overflow-x: scroll
}
.CodeMirror-scrollbar-filler {
    right: 0;
    bottom: 0
}
.CodeMirror-gutter-filler {
    left: 0;
    bottom: 0
}
.CodeMirror-gutters {
    position: absolute;
    left: 0;
    top: 0;
    padding-bottom: 30px;
    z-index: 3
}
.CodeMirror-gutter {
    white-space: normal;
    height: 100%;
    -moz-box-sizing: content-box;
    box-sizing: content-box;
    padding-bottom: 30px;
    margin-bottom: -32px;
    display: inline-block;
    *zoom: 1;
    *display: inline
}
.CodeMirror-gutter-elt {
    position: absolute;
    cursor: default;
    z-index: 4
}
.CodeMirror-lines {
    cursor: text
}
.CodeMirror pre {
    -moz-border-radius: 0;
    -webkit-border-radius: 0;
    border-radius: 0;
    border-width: 0;
    background: 0 0;
    font-family: inherit;
    font-size: inherit;
    margin: 0;
    white-space: pre;
    word-wrap: normal;
    line-height: inherit;
    color: inherit;
    z-index: 2;
    position: relative;
    overflow: visible
}
.CodeMirror-wrap pre {
    word-wrap: break-word;
    white-space: pre-wrap;
    word-break: normal
}
.CodeMirror-linebackground {
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    z-index: 0
}
.CodeMirror-linewidget {
    position: relative;
    z-index: 2;
    overflow: auto
}
.CodeMirror-wrap .CodeMirror-scroll {
    overflow-x: hidden
}
.CodeMirror-measure {
    position: absolute;
    width: 100%;
    height: 0;
    overflow: hidden;
    visibility: hidden
}
.CodeMirror-measure pre {
    position: static
}
.CodeMirror div.CodeMirror-cursor {
    position: absolute;
    border-right: none;
    width: 0
}
div.CodeMirror-cursors {
    visibility: hidden;
    position: relative;
    z-index: 1
}
.CodeMirror-focused div.CodeMirror-cursors {
    visibility: visible
}
.CodeMirror-selected {
    background: #d9d9d9
}
.CodeMirror-focused .CodeMirror-selected {
    background: #d7d4f0
}
.CodeMirror-crosshair {
    cursor: crosshair
}
.cm-searching {
    background: #ffa;
    background: rgba(255, 255, 0, .4)
}
.CodeMirror span {
    *vertical-align: text-bottom
}
.cm-force-border {
    padding-right: .1px
}
@media print {
    .CodeMirror div.CodeMirror-cursors {
        visibility: hidden
    }
}
.cm-s-mbo.CodeMirror {
    background: #2c2c2c;
    color: #ffffe9
}
.cm-s-mbo div.CodeMirror-selected {
    background: #716C62!important
}
.cm-s-mbo .CodeMirror-gutters {
    background: #4e4e4e;
    border-right: 0
}
.cm-s-mbo .CodeMirror-linenumber {
    color: #dadada
}
.cm-s-mbo .CodeMirror-cursor {
    border-left: 1px solid #ffffec!important
}
.cm-s-mbo span.cm-comment {
    color: #95958a
}
.cm-s-mbo span.cm-atom {
    color: #00a8c6
}
.cm-s-mbo span.cm-number {
    color: #00a8c6
}
.cm-s-mbo span.cm-property, .cm-s-mbo span.cm-attribute {
    color: #9ddfe9
}
.cm-s-mbo span.cm-keyword {
    color: #ffb928
}
.cm-s-mbo span.cm-string {
    color: #ffcf6c
}
.cm-s-mbo span.cm-variable {
    color: #ffffec
}
.cm-s-mbo span.cm-variable-2 {
    color: #00a8c6
}
.cm-s-mbo span.cm-def {
    color: #ffffec
}
.cm-s-mbo span.cm-bracket {
    color: #fffffc;
    font-weight: 700
}
.cm-s-mbo span.cm-tag {
    color: #9ddfe9
}
.cm-s-mbo span.cm-link {
    color: #f54b07
}
.cm-s-mbo span.cm-error {
    background: #636363;
    color: #ffffec
}
.cm-s-mbo .CodeMirror-activeline-background {
    background: #494b41!important
}
.cm-s-mbo .CodeMirror-matchingbracket {
    text-decoration: underline;
    color: #f5e107!important
}
.cm-s-mbo .CodeMirror-matchingtag {
    background: #4e4e4e
}
.cm-s-mbo span.cm-searching {
    background-color: none;
    background: 0 0;
    box-shadow: 0 0 0 1px #ffffec
}
.CodeMirror {
    font-family: Menlo Regular, Consolas, Monaco, monospace;
    line-height: 150%;
    font-size: 12px;
    height: 500px
}
.wp-fullscreen-both, #wp-fullscreen-modes, .heshFullscreen #content_wp_fullscreen, #qt_content_strong, #qt_content_em, #qt_content_link, #qt_content_block, #qt_content_del, #qt_content_ins, #qt_content_img, #qt_content_ul, #qt_content_ol, #qt_content_li, #qt_content_code, #qt_content_more, #qt_content_close, #qt_content_fullscreen, #wp-content-editor-container .wp-editor-area {
    display: none!important
}
.quicktags-toolbar input#cm_content_fullscreen, #ed_toolbar input.cm_ed_button {
    display: inline-block!important
}
.CodeMirror-matchingbracket {
    background-color: #fff490;
    color: inherit!important;
    box-shadow: 0 0 5px #fff490
}
.cm-s-mbo .CodeMirror-matchingbracket {
    color: #000!important;
    text-decoration: none
}
.content-resize-handle {
    width: 14px;
    height: 24px;
    cursor: ns-resize;
    right: 1px;
    position: absolute
}
#content-resize-handle {
    display: table-cell!important
}
.tmce-active .content-resize-handle {
    display: none
}
.has-dfw .quicktags-toolbar {
    padding-right: 3px!important
}
.has-dfw .quicktags-toolbar .button:not(:first-child) {
    margin-right: 3px
}
#cm_content_fullscreen, #cm_select_theme, #cm_font_size {
    float: right
}
@-moz-document url-prefix() {
    #cm_font_size {
        margin-top: 4px
    }
}
@media screen and (-webkit-min-device-pixel-ratio: 0) {
    #cm_font_size {
        height: inherit;
        font-size: 10px
    }
}
.heshFullscreen {
    z-index: 99999;
    position: fixed!important;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    height: 100%;
    background: #fff;
    padding: 2% 2% 0
}
.heshFullscreen .CodeMirror {
    border: 1px solid #ccc;
    border-radius: 0 0 4px 4px;
    height: 85%!important
}
.heshFullscreen #ed_toolbar {
    border: 1px solid #ccc;
    border-bottom: 0;
    border-radius: 4px 4px 0 0
}
@media only screen and (max-height: 550px), only screen and (max-device-height: 550px) {
    .heshFullscreen .CodeMirror {
        height: 75%!important
    }
}
.wp-editor-expand .html-active #post-status-info {
    position: static!important
}
.wp-editor-expand .html-active #ed_toolbar {
    z-index: 2
}
.wp-editor-expand .html-active .CodeMirror {
    position: relative;
    z-index: 1;
    margin-top: 35px
}
.wp-editor-expand .html-active textarea.wp-editor-area {
    height: 800px!important
}
.wp-editor-expand .html-active .heshFullscreen .quicktags-toolbar {
    top: 0!important;
    position: static!important;
    width: auto!important
}
.wp-editor-expand .html-active .heshFullscreen .CodeMirror {
    margin-top: 0
}
#qt_content_dfw {
    display: none !important
}