Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Created January 15, 2016 14:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timelyportfolio/ba9bc52ca84479529861 to your computer and use it in GitHub Desktop.
Save timelyportfolio/ba9bc52ca84479529861 to your computer and use it in GitHub Desktop.
start of codemirror htmlwidget

Built with blockbuilder.org

a start to a CodeMirror htmlwidget for R codemirrorR

I'd like to spend enough time with this to fully support all of the features of CodeMirror, but can't motivate myself to take it any further. Please let me know if you would like me to keep going.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="pandoc" />
<meta name="author" content="Kenton Russell" />
<meta name="date" content="2016-01-15" />
<title>Intro to codemirrorR</title>
<script src="data:application/x-javascript,%28function%28%29%20%7B%0A%20%20%2F%2F%20If%20window%2EHTMLWidgets%20is%20already%20defined%2C%20then%20use%20it%3B%20otherwise%20create%20a%0A%20%20%2F%2F%20new%20object%2E%20This%20allows%20preceding%20code%20to%20set%20options%20that%20affect%20the%0A%20%20%2F%2F%20initialization%20process%20%28though%20none%20currently%20exist%29%2E%0A%20%20window%2EHTMLWidgets%20%3D%20window%2EHTMLWidgets%20%7C%7C%20%7B%7D%3B%0A%0A%20%20%2F%2F%20See%20if%20we%27re%20running%20in%20a%20viewer%20pane%2E%20If%20not%2C%20we%27re%20in%20a%20web%20browser%2E%0A%20%20var%20viewerMode%20%3D%20window%2EHTMLWidgets%2EviewerMode%20%3D%0A%20%20%20%20%20%20%2F%5Cbviewer%5Fpane%3D1%5Cb%2F%2Etest%28window%2Elocation%29%3B%0A%0A%20%20%2F%2F%20See%20if%20we%27re%20running%20in%20Shiny%20mode%2E%20If%20not%2C%20it%27s%20a%20static%20document%2E%0A%20%20%2F%2F%20Note%20that%20static%20widgets%20can%20appear%20in%20both%20Shiny%20and%20static%20modes%2C%20but%0A%20%20%2F%2F%20obviously%2C%20Shiny%20widgets%20can%20only%20appear%20in%20Shiny%20apps%2Fdocuments%2E%0A%20%20var%20shinyMode%20%3D%20window%2EHTMLWidgets%2EshinyMode%20%3D%0A%20%20%20%20%20%20typeof%28window%2EShiny%29%20%21%3D%3D%20%22undefined%22%20%26%26%20%21%21window%2EShiny%2EoutputBindings%3B%0A%0A%20%20%2F%2F%20We%20can%27t%20count%20on%20jQuery%20being%20available%2C%20so%20we%20implement%20our%20own%0A%20%20%2F%2F%20version%20if%20necessary%2E%0A%20%20function%20querySelectorAll%28scope%2C%20selector%29%20%7B%0A%20%20%20%20if%20%28typeof%28jQuery%29%20%21%3D%3D%20%22undefined%22%20%26%26%20scope%20instanceof%20jQuery%29%20%7B%0A%20%20%20%20%20%20return%20scope%2Efind%28selector%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28scope%2EquerySelectorAll%29%20%7B%0A%20%20%20%20%20%20return%20scope%2EquerySelectorAll%28selector%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20asArray%28value%29%20%7B%0A%20%20%20%20if%20%28value%20%3D%3D%3D%20null%29%0A%20%20%20%20%20%20return%20%5B%5D%3B%0A%20%20%20%20if%20%28%24%2EisArray%28value%29%29%0A%20%20%20%20%20%20return%20value%3B%0A%20%20%20%20return%20%5Bvalue%5D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Implement%20jQuery%27s%20extend%0A%20%20function%20extend%28target%20%2F%2A%2C%20%2E%2E%2E%20%2A%2F%29%20%7B%0A%20%20%20%20if%20%28arguments%2Elength%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20return%20target%3B%0A%20%20%20%20%7D%0A%20%20%20%20for%20%28var%20i%20%3D%201%3B%20i%20%3C%20arguments%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20source%20%3D%20arguments%5Bi%5D%3B%0A%20%20%20%20%20%20for%20%28var%20prop%20in%20source%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28source%2EhasOwnProperty%28prop%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20target%5Bprop%5D%20%3D%20source%5Bprop%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20target%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20IE8%20doesn%27t%20support%20Array%2EforEach%2E%0A%20%20function%20forEach%28values%2C%20callback%2C%20thisArg%29%20%7B%0A%20%20%20%20if%20%28values%2EforEach%29%20%7B%0A%20%20%20%20%20%20values%2EforEach%28callback%2C%20thisArg%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20values%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20callback%2Ecall%28thisArg%2C%20values%5Bi%5D%2C%20i%2C%20values%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Replaces%20the%20specified%20method%20with%20the%20return%20value%20of%20funcSource%2E%0A%20%20%2F%2F%0A%20%20%2F%2F%20Note%20that%20funcSource%20should%20not%20BE%20the%20new%20method%2C%20it%20should%20be%20a%20function%0A%20%20%2F%2F%20that%20RETURNS%20the%20new%20method%2E%20funcSource%20receives%20a%20single%20argument%20that%20is%0A%20%20%2F%2F%20the%20overridden%20method%2C%20it%20can%20be%20called%20from%20the%20new%20method%2E%20The%20overridden%0A%20%20%2F%2F%20method%20can%20be%20called%20like%20a%20regular%20function%2C%20it%20has%20the%20target%20permanently%0A%20%20%2F%2F%20bound%20to%20it%20so%20%22this%22%20will%20work%20correctly%2E%0A%20%20function%20overrideMethod%28target%2C%20methodName%2C%20funcSource%29%20%7B%0A%20%20%20%20var%20superFunc%20%3D%20target%5BmethodName%5D%20%7C%7C%20function%28%29%20%7B%7D%3B%0A%20%20%20%20var%20superFuncBound%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20return%20superFunc%2Eapply%28target%2C%20arguments%29%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20target%5BmethodName%5D%20%3D%20funcSource%28superFuncBound%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Implement%20a%20vague%20facsimilie%20of%20jQuery%27s%20data%20method%0A%20%20function%20elementData%28el%2C%20name%2C%20value%29%20%7B%0A%20%20%20%20if%20%28arguments%2Elength%20%3D%3D%202%29%20%7B%0A%20%20%20%20%20%20return%20el%5B%22htmlwidget%5Fdata%5F%22%20%2B%20name%5D%3B%0A%20%20%20%20%7D%20else%20if%20%28arguments%2Elength%20%3D%3D%203%29%20%7B%0A%20%20%20%20%20%20el%5B%22htmlwidget%5Fdata%5F%22%20%2B%20name%5D%20%3D%20value%3B%0A%20%20%20%20%20%20return%20el%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20throw%20new%20Error%28%22Wrong%20number%20of%20arguments%20for%20elementData%3A%20%22%20%2B%0A%20%20%20%20%20%20%20%20arguments%2Elength%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20http%3A%2F%2Fstackoverflow%2Ecom%2Fquestions%2F3446170%2Fescape%2Dstring%2Dfor%2Duse%2Din%2Djavascript%2Dregex%0A%20%20function%20escapeRegExp%28str%29%20%7B%0A%20%20%20%20return%20str%2Ereplace%28%2F%5B%5C%2D%5C%5B%5C%5D%5C%2F%5C%7B%5C%7D%5C%28%5C%29%5C%2A%5C%2B%5C%3F%5C%2E%5C%5C%5C%5E%5C%24%5C%7C%5D%2Fg%2C%20%22%5C%5C%24%26%22%29%3B%0A%20%20%7D%0A%0A%20%20function%20hasClass%28el%2C%20className%29%20%7B%0A%20%20%20%20var%20re%20%3D%20new%20RegExp%28%22%5C%5Cb%22%20%2B%20escapeRegExp%28className%29%20%2B%20%22%5C%5Cb%22%29%3B%0A%20%20%20%20return%20re%2Etest%28el%2EclassName%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20elements%20%2D%20array%20%28or%20array%2Dlike%20object%29%20of%20HTML%20elements%0A%20%20%2F%2F%20className%20%2D%20class%20name%20to%20test%20for%0A%20%20%2F%2F%20include%20%2D%20if%20true%2C%20only%20return%20elements%20with%20given%20className%3B%0A%20%20%2F%2F%20%20%20if%20false%2C%20only%20return%20elements%20%2Awithout%2A%20given%20className%0A%20%20function%20filterByClass%28elements%2C%20className%2C%20include%29%20%7B%0A%20%20%20%20var%20results%20%3D%20%5B%5D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20elements%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20if%20%28hasClass%28elements%5Bi%5D%2C%20className%29%20%3D%3D%20include%29%0A%20%20%20%20%20%20%20%20results%2Epush%28elements%5Bi%5D%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20results%3B%0A%20%20%7D%0A%0A%20%20function%20on%28obj%2C%20eventName%2C%20func%29%20%7B%0A%20%20%20%20if%20%28obj%2EaddEventListener%29%20%7B%0A%20%20%20%20%20%20obj%2EaddEventListener%28eventName%2C%20func%2C%20false%29%3B%0A%20%20%20%20%7D%20else%20if%20%28obj%2EattachEvent%29%20%7B%0A%20%20%20%20%20%20obj%2EattachEvent%28eventName%2C%20func%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20off%28obj%2C%20eventName%2C%20func%29%20%7B%0A%20%20%20%20if%20%28obj%2EremoveEventListener%29%0A%20%20%20%20%20%20obj%2EremoveEventListener%28eventName%2C%20func%2C%20false%29%3B%0A%20%20%20%20else%20if%20%28obj%2EdetachEvent%29%20%7B%0A%20%20%20%20%20%20obj%2EdetachEvent%28eventName%2C%20func%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Translate%20array%20of%20values%20to%20top%2Fright%2Fbottom%2Fleft%2C%20as%20usual%20with%0A%20%20%2F%2F%20the%20%22padding%22%20CSS%20property%0A%20%20%2F%2F%20https%3A%2F%2Fdeveloper%2Emozilla%2Eorg%2Fen%2DUS%2Fdocs%2FWeb%2FCSS%2Fpadding%0A%20%20function%20unpackPadding%28value%29%20%7B%0A%20%20%20%20if%20%28typeof%28value%29%20%3D%3D%3D%20%22number%22%29%0A%20%20%20%20%20%20value%20%3D%20%5Bvalue%5D%3B%0A%20%20%20%20if%20%28value%2Elength%20%3D%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20return%20%7Btop%3A%20value%5B0%5D%2C%20right%3A%20value%5B0%5D%2C%20bottom%3A%20value%5B0%5D%2C%20left%3A%20value%5B0%5D%7D%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28value%2Elength%20%3D%3D%3D%202%29%20%7B%0A%20%20%20%20%20%20return%20%7Btop%3A%20value%5B0%5D%2C%20right%3A%20value%5B1%5D%2C%20bottom%3A%20value%5B0%5D%2C%20left%3A%20value%5B1%5D%7D%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28value%2Elength%20%3D%3D%3D%203%29%20%7B%0A%20%20%20%20%20%20return%20%7Btop%3A%20value%5B0%5D%2C%20right%3A%20value%5B1%5D%2C%20bottom%3A%20value%5B2%5D%2C%20left%3A%20value%5B1%5D%7D%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28value%2Elength%20%3D%3D%3D%204%29%20%7B%0A%20%20%20%20%20%20return%20%7Btop%3A%20value%5B0%5D%2C%20right%3A%20value%5B1%5D%2C%20bottom%3A%20value%5B2%5D%2C%20left%3A%20value%5B3%5D%7D%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Convert%20an%20unpacked%20padding%20object%20to%20a%20CSS%20value%0A%20%20function%20paddingToCss%28paddingObj%29%20%7B%0A%20%20%20%20return%20paddingObj%2Etop%20%2B%20%22px%20%22%20%2B%20paddingObj%2Eright%20%2B%20%22px%20%22%20%2B%20paddingObj%2Ebottom%20%2B%20%22px%20%22%20%2B%20paddingObj%2Eleft%20%2B%20%22px%22%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Makes%20a%20number%20suitable%20for%20CSS%0A%20%20function%20px%28x%29%20%7B%0A%20%20%20%20if%20%28typeof%28x%29%20%3D%3D%3D%20%22number%22%29%0A%20%20%20%20%20%20return%20x%20%2B%20%22px%22%3B%0A%20%20%20%20else%0A%20%20%20%20%20%20return%20x%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Retrieves%20runtime%20widget%20sizing%20information%20for%20an%20element%2E%0A%20%20%2F%2F%20The%20return%20value%20is%20either%20null%2C%20or%20an%20object%20with%20fill%2C%20padding%2C%0A%20%20%2F%2F%20defaultWidth%2C%20defaultHeight%20fields%2E%0A%20%20function%20sizingPolicy%28el%29%20%7B%0A%20%20%20%20var%20sizingEl%20%3D%20document%2EquerySelector%28%22script%5Bdata%2Dfor%3D%27%22%20%2B%20el%2Eid%20%2B%20%22%27%5D%5Btype%3D%27application%2Fhtmlwidget%2Dsizing%27%5D%22%29%3B%0A%20%20%20%20if%20%28%21sizingEl%29%0A%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20var%20sp%20%3D%20JSON%2Eparse%28sizingEl%2EtextContent%20%7C%7C%20sizingEl%2Etext%20%7C%7C%20%22%7B%7D%22%29%3B%0A%20%20%20%20if%20%28viewerMode%29%20%7B%0A%20%20%20%20%20%20return%20sp%2Eviewer%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20sp%2Ebrowser%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20%40param%20tasks%20Array%20of%20strings%20%28or%20falsy%20value%2C%20in%20which%20case%20no%2Dop%29%2E%0A%20%20%2F%2F%20%20%20Each%20element%20must%20be%20a%20valid%20JavaScript%20expression%20that%20yields%20a%0A%20%20%2F%2F%20%20%20function%2E%0A%20%20%2F%2F%20%40param%20target%20The%20object%20that%20will%20be%20%22this%22%20for%20each%20function%0A%20%20%2F%2F%20%20%20execution%2E%0A%20%20%2F%2F%20%40param%20args%20Array%20of%20arguments%20to%20be%20passed%20to%20the%20functions%2E%20%28The%0A%20%20%2F%2F%20%20%20same%20arguments%20will%20be%20passed%20to%20all%20functions%2E%29%0A%20%20function%20evalAndRun%28tasks%2C%20target%2C%20args%29%20%7B%0A%20%20%20%20if%20%28tasks%29%20%7B%0A%20%20%20%20%20%20forEach%28tasks%2C%20function%28task%29%20%7B%0A%20%20%20%20%20%20%20%20var%20taskFunc%20%3D%20eval%28%22%28%22%20%2B%20task%20%2B%20%22%29%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28typeof%28taskFunc%29%20%21%3D%3D%20%22function%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20throw%20new%20Error%28%22Task%20must%20be%20a%20function%21%20Source%3A%5Cn%22%20%2B%20task%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20taskFunc%2Eapply%28target%2C%20args%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20initSizing%28el%29%20%7B%0A%20%20%20%20var%20sizing%20%3D%20sizingPolicy%28el%29%3B%0A%20%20%20%20if%20%28%21sizing%29%0A%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20var%20cel%20%3D%20document%2EgetElementById%28%22htmlwidget%5Fcontainer%22%29%3B%0A%20%20%20%20if%20%28%21cel%29%0A%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20if%20%28typeof%28sizing%2Epadding%29%20%21%3D%3D%20%22undefined%22%29%20%7B%0A%20%20%20%20%20%20document%2Ebody%2Estyle%2Emargin%20%3D%20%220%22%3B%0A%20%20%20%20%20%20document%2Ebody%2Estyle%2Epadding%20%3D%20paddingToCss%28unpackPadding%28sizing%2Epadding%29%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28sizing%2Efill%29%20%7B%0A%20%20%20%20%20%20document%2Ebody%2Estyle%2Eoverflow%20%3D%20%22hidden%22%3B%0A%20%20%20%20%20%20document%2Ebody%2Estyle%2Ewidth%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20document%2Ebody%2Estyle%2Eheight%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20document%2EdocumentElement%2Estyle%2Ewidth%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20document%2EdocumentElement%2Estyle%2Eheight%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20if%20%28cel%29%20%7B%0A%20%20%20%20%20%20%20%20cel%2Estyle%2Eposition%20%3D%20%22absolute%22%3B%0A%20%20%20%20%20%20%20%20var%20pad%20%3D%20unpackPadding%28sizing%2Epadding%29%3B%0A%20%20%20%20%20%20%20%20cel%2Estyle%2Etop%20%3D%20pad%2Etop%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%20%20cel%2Estyle%2Eright%20%3D%20pad%2Eright%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%20%20cel%2Estyle%2Ebottom%20%3D%20pad%2Ebottom%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%20%20cel%2Estyle%2Eleft%20%3D%20pad%2Eleft%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%20%20el%2Estyle%2Ewidth%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20%20%20el%2Estyle%2Eheight%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20getWidth%3A%20function%28%29%20%7B%20return%20cel%2EoffsetWidth%3B%20%7D%2C%0A%20%20%20%20%20%20%20%20getHeight%3A%20function%28%29%20%7B%20return%20cel%2EoffsetHeight%3B%20%7D%0A%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20el%2Estyle%2Ewidth%20%3D%20px%28sizing%2Ewidth%29%3B%0A%20%20%20%20%20%20el%2Estyle%2Eheight%20%3D%20px%28sizing%2Eheight%29%3B%0A%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20getWidth%3A%20function%28%29%20%7B%20return%20el%2EoffsetWidth%3B%20%7D%2C%0A%20%20%20%20%20%20%20%20getHeight%3A%20function%28%29%20%7B%20return%20el%2EoffsetHeight%3B%20%7D%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Default%20implementations%20for%20methods%0A%20%20var%20defaults%20%3D%20%7B%0A%20%20%20%20find%3A%20function%28scope%29%20%7B%0A%20%20%20%20%20%20return%20querySelectorAll%28scope%2C%20%22%2E%22%20%2B%20this%2Ename%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20renderError%3A%20function%28el%2C%20err%29%20%7B%0A%20%20%20%20%20%20var%20%24el%20%3D%20%24%28el%29%3B%0A%0A%20%20%20%20%20%20this%2EclearError%28el%29%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Add%20all%20these%20error%20classes%2C%20as%20Shiny%20does%0A%20%20%20%20%20%20var%20errClass%20%3D%20%22shiny%2Doutput%2Derror%22%3B%0A%20%20%20%20%20%20if%20%28err%2Etype%20%21%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20use%20the%20classes%20of%20the%20error%20condition%20as%20CSS%20class%20names%0A%20%20%20%20%20%20%20%20errClass%20%3D%20errClass%20%2B%20%22%20%22%20%2B%20%24%2Emap%28asArray%28err%2Etype%29%2C%20function%28type%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20errClass%20%2B%20%22%2D%22%20%2B%20type%3B%0A%20%20%20%20%20%20%20%20%7D%29%2Ejoin%28%22%20%22%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20errClass%20%3D%20errClass%20%2B%20%22%20htmlwidgets%2Derror%22%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Is%20el%20inline%20or%20block%3F%20If%20inline%20or%20inline%2Dblock%2C%20just%20display%3Anone%20it%0A%20%20%20%20%20%20%2F%2F%20and%20add%20an%20inline%20error%2E%0A%20%20%20%20%20%20var%20display%20%3D%20%24el%2Ecss%28%22display%22%29%3B%0A%20%20%20%20%20%20%24el%2Edata%28%22restore%2Ddisplay%2Dmode%22%2C%20display%29%3B%0A%0A%20%20%20%20%20%20if%20%28display%20%3D%3D%3D%20%22inline%22%20%7C%7C%20display%20%3D%3D%3D%20%22inline%2Dblock%22%29%20%7B%0A%20%20%20%20%20%20%20%20%24el%2Ehide%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28err%2Emessage%20%21%3D%3D%20%22%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20errorSpan%20%3D%20%24%28%22%3Cspan%3E%22%29%2EaddClass%28errClass%29%3B%0A%20%20%20%20%20%20%20%20%20%20errorSpan%2Etext%28err%2Emessage%29%3B%0A%20%20%20%20%20%20%20%20%20%20%24el%2Eafter%28errorSpan%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20if%20%28display%20%3D%3D%3D%20%22block%22%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20If%20block%2C%20add%20an%20error%20just%20after%20the%20el%2C%20set%20visibility%3Anone%20on%20the%0A%20%20%20%20%20%20%20%20%2F%2F%20el%2C%20and%20position%20the%20error%20to%20be%20on%20top%20of%20the%20el%2E%0A%20%20%20%20%20%20%20%20%2F%2F%20Mark%20it%20with%20a%20unique%20ID%20and%20CSS%20class%20so%20we%20can%20remove%20it%20later%2E%0A%20%20%20%20%20%20%20%20%24el%2Ecss%28%22visibility%22%2C%20%22hidden%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28err%2Emessage%20%21%3D%3D%20%22%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20errorDiv%20%3D%20%24%28%22%3Cdiv%3E%22%29%2EaddClass%28errClass%29%2Ecss%28%22position%22%2C%20%22absolute%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22top%22%2C%20el%2EoffsetTop%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22left%22%2C%20el%2EoffsetLeft%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20setting%20width%20can%20push%20out%20the%20page%20size%2C%20forcing%20otherwise%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20unnecessary%20scrollbars%20to%20appear%20and%20making%20it%20impossible%20for%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20the%20element%20to%20shrink%3B%20so%20use%20max%2Dwidth%20instead%0A%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22maxWidth%22%2C%20el%2EoffsetWidth%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22height%22%2C%20el%2EoffsetHeight%29%3B%0A%20%20%20%20%20%20%20%20%20%20errorDiv%2Etext%28err%2Emessage%29%3B%0A%20%20%20%20%20%20%20%20%20%20%24el%2Eafter%28errorDiv%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Really%20dumb%20way%20to%20keep%20the%20size%2Fposition%20of%20the%20error%20in%20sync%20with%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20the%20parent%20element%20as%20the%20window%20is%20resized%20or%20whatever%2E%0A%20%20%20%20%20%20%20%20%20%20var%20intId%20%3D%20setInterval%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21errorDiv%5B0%5D%2EparentElement%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20clearInterval%28intId%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20errorDiv%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22top%22%2C%20el%2EoffsetTop%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22left%22%2C%20el%2EoffsetLeft%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22maxWidth%22%2C%20el%2EoffsetWidth%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22height%22%2C%20el%2EoffsetHeight%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%20500%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%20%20%20%20clearError%3A%20function%28el%29%20%7B%0A%20%20%20%20%20%20var%20%24el%20%3D%20%24%28el%29%3B%0A%20%20%20%20%20%20var%20display%20%3D%20%24el%2Edata%28%22restore%2Ddisplay%2Dmode%22%29%3B%0A%20%20%20%20%20%20%24el%2Edata%28%22restore%2Ddisplay%2Dmode%22%2C%20null%29%3B%0A%0A%20%20%20%20%20%20if%20%28display%20%3D%3D%3D%20%22inline%22%20%7C%7C%20display%20%3D%3D%3D%20%22inline%2Dblock%22%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28display%29%0A%20%20%20%20%20%20%20%20%20%20%24el%2Ecss%28%22display%22%2C%20display%29%3B%0A%20%20%20%20%20%20%20%20%24%28el%2EnextSibling%29%2Efilter%28%22%2Ehtmlwidgets%2Derror%22%29%2Eremove%28%29%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28display%20%3D%3D%3D%20%22block%22%29%7B%0A%20%20%20%20%20%20%20%20%24el%2Ecss%28%22visibility%22%2C%20%22inherit%22%29%3B%0A%20%20%20%20%20%20%20%20%24%28el%2EnextSibling%29%2Efilter%28%22%2Ehtmlwidgets%2Derror%22%29%2Eremove%28%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%20%20%20%20sizing%3A%20%7B%7D%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Called%20by%20widget%20bindings%20to%20register%20a%20new%20type%20of%20widget%2E%20The%20definition%0A%20%20%2F%2F%20object%20can%20contain%20the%20following%20properties%3A%0A%20%20%2F%2F%20%2D%20name%20%28required%29%20%2D%20A%20string%20indicating%20the%20binding%20name%2C%20which%20will%20be%0A%20%20%2F%2F%20%20%20used%20by%20default%20as%20the%20CSS%20classname%20to%20look%20for%2E%0A%20%20%2F%2F%20%2D%20initialize%20%28optional%29%20%2D%20A%20function%28el%29%20that%20will%20be%20called%20once%20per%0A%20%20%2F%2F%20%20%20widget%20element%3B%20if%20a%20value%20is%20returned%2C%20it%20will%20be%20passed%20as%20the%20third%0A%20%20%2F%2F%20%20%20value%20to%20renderValue%2E%0A%20%20%2F%2F%20%2D%20renderValue%20%28required%29%20%2D%20A%20function%28el%2C%20data%2C%20initValue%29%20that%20will%20be%0A%20%20%2F%2F%20%20%20called%20with%20data%2E%20Static%20contexts%20will%20cause%20this%20to%20be%20called%20once%20per%0A%20%20%2F%2F%20%20%20element%3B%20Shiny%20apps%20will%20cause%20this%20to%20be%20called%20multiple%20times%20per%0A%20%20%2F%2F%20%20%20element%2C%20as%20the%20data%20changes%2E%0A%20%20window%2EHTMLWidgets%2Ewidget%20%3D%20function%28definition%29%20%7B%0A%20%20%20%20if%20%28%21definition%2Ename%29%20%7B%0A%20%20%20%20%20%20throw%20new%20Error%28%22Widget%20must%20have%20a%20name%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28%21definition%2Etype%29%20%7B%0A%20%20%20%20%20%20throw%20new%20Error%28%22Widget%20must%20have%20a%20type%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F%2F%20Currently%20we%20only%20support%20output%20widgets%0A%20%20%20%20if%20%28definition%2Etype%20%21%3D%3D%20%22output%22%29%20%7B%0A%20%20%20%20%20%20throw%20new%20Error%28%22Unrecognized%20widget%20type%20%27%22%20%2B%20definition%2Etype%20%2B%20%22%27%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F%2F%20TODO%3A%20Verify%20that%20%2Ename%20is%20a%20valid%20CSS%20classname%0A%0A%20%20%20%20%2F%2F%20Support%20new%2Dstyle%20instance%2Dbound%20definitions%2E%20Old%2Dstyle%20class%2Dbound%0A%20%20%20%20%2F%2F%20definitions%20have%20one%20widget%20%22object%22%20per%20widget%20per%20type%2Fclass%20of%0A%20%20%20%20%2F%2F%20widget%3B%20the%20renderValue%20and%20resize%20methods%20on%20such%20widget%20objects%0A%20%20%20%20%2F%2F%20take%20el%20and%20instance%20arguments%2C%20because%20the%20widget%20object%20can%27t%0A%20%20%20%20%2F%2F%20store%20them%2E%20New%2Dstyle%20instance%2Dbound%20definitions%20have%20one%20widget%0A%20%20%20%20%2F%2F%20object%20per%20widget%20instance%3B%20the%20definition%20that%27s%20passed%20in%20doesn%27t%0A%20%20%20%20%2F%2F%20provide%20renderValue%20or%20resize%20methods%20at%20all%2C%20just%20the%20single%20method%0A%20%20%20%20%2F%2F%20%20%20factory%28el%2C%20width%2C%20height%29%0A%20%20%20%20%2F%2F%20which%20returns%20an%20object%20that%20has%20renderValue%28x%29%20and%20resize%28w%2C%20h%29%2E%0A%20%20%20%20%2F%2F%20This%20enables%20a%20far%20more%20natural%20programming%20style%20for%20the%20widget%0A%20%20%20%20%2F%2F%20author%2C%20who%20can%20store%20per%2Dinstance%20state%20using%20either%20OO%2Dstyle%0A%20%20%20%20%2F%2F%20instance%20fields%20or%20functional%2Dstyle%20closure%20variables%20%28I%20guess%20this%0A%20%20%20%20%2F%2F%20is%20in%20contrast%20to%20what%20can%20only%20be%20called%20C%2Dstyle%20pseudo%2DOO%20which%20is%0A%20%20%20%20%2F%2F%20what%20we%20required%20before%29%2E%0A%20%20%20%20if%20%28definition%2Efactory%29%20%7B%0A%20%20%20%20%20%20definition%20%3D%20createLegacyDefinitionAdapter%28definition%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28%21definition%2ErenderValue%29%20%7B%0A%20%20%20%20%20%20throw%20new%20Error%28%22Widget%20must%20have%20a%20renderValue%20function%22%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20For%20static%20rendering%20%28non%2DShiny%29%2C%20use%20a%20simple%20widget%20registration%0A%20%20%20%20%2F%2F%20scheme%2E%20We%20also%20use%20this%20scheme%20for%20Shiny%20apps%2Fdocuments%20that%20also%0A%20%20%20%20%2F%2F%20contain%20static%20widgets%2E%0A%20%20%20%20window%2EHTMLWidgets%2Ewidgets%20%3D%20window%2EHTMLWidgets%2Ewidgets%20%7C%7C%20%5B%5D%3B%0A%20%20%20%20%2F%2F%20Merge%20defaults%20into%20the%20definition%3B%20don%27t%20mutate%20the%20original%20definition%2E%0A%20%20%20%20var%20staticBinding%20%3D%20extend%28%7B%7D%2C%20defaults%2C%20definition%29%3B%0A%20%20%20%20overrideMethod%28staticBinding%2C%20%22find%22%2C%20function%28superfunc%29%20%7B%0A%20%20%20%20%20%20return%20function%28scope%29%20%7B%0A%20%20%20%20%20%20%20%20var%20results%20%3D%20superfunc%28scope%29%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20Filter%20out%20Shiny%20outputs%2C%20we%20only%20want%20the%20static%20kind%0A%20%20%20%20%20%20%20%20return%20filterByClass%28results%2C%20%22html%2Dwidget%2Doutput%22%2C%20false%29%3B%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20window%2EHTMLWidgets%2Ewidgets%2Epush%28staticBinding%29%3B%0A%0A%20%20%20%20if%20%28shinyMode%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Shiny%20is%20running%2E%20Register%20the%20definition%20as%20an%20output%20binding%2E%0A%0A%20%20%20%20%20%20%2F%2F%20Merge%20defaults%20into%20the%20definition%3B%20don%27t%20mutate%20the%20original%20definition%2E%0A%20%20%20%20%20%20%2F%2F%20The%20base%20object%20is%20a%20Shiny%20output%20binding%20if%20we%27re%20running%20in%20Shiny%20mode%2C%0A%20%20%20%20%20%20%2F%2F%20or%20an%20empty%20object%20if%20we%27re%20not%2E%0A%20%20%20%20%20%20var%20shinyBinding%20%3D%20extend%28new%20Shiny%2EOutputBinding%28%29%2C%20defaults%2C%20definition%29%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Wrap%20renderValue%20to%20handle%20initialization%2C%20which%20unfortunately%20isn%27t%0A%20%20%20%20%20%20%2F%2F%20supported%20natively%20by%20Shiny%20at%20the%20time%20of%20this%20writing%2E%0A%0A%20%20%20%20%20%20%2F%2F%20NB%3A%20shinyBinding%2Einitialize%20may%20be%20undefined%2C%20as%20it%27s%20optional%2E%0A%0A%20%20%20%20%20%20%2F%2F%20Rename%20initialize%20to%20make%20sure%20it%20isn%27t%20called%20by%20a%20future%20version%0A%20%20%20%20%20%20%2F%2F%20of%20Shiny%20that%20does%20support%20initialize%20directly%2E%0A%20%20%20%20%20%20shinyBinding%2E%5Fhtmlwidgets%5Finitialize%20%3D%20shinyBinding%2Einitialize%3B%0A%20%20%20%20%20%20delete%20shinyBinding%2Einitialize%3B%0A%0A%20%20%20%20%20%20overrideMethod%28shinyBinding%2C%20%22find%22%2C%20function%28superfunc%29%20%7B%0A%20%20%20%20%20%20%20%20return%20function%28scope%29%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20var%20results%20%3D%20superfunc%28scope%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Only%20return%20elements%20that%20are%20Shiny%20outputs%2C%20not%20static%20ones%0A%20%20%20%20%20%20%20%20%20%20var%20dynamicResults%20%3D%20results%2Efilter%28%22%2Ehtml%2Dwidget%2Doutput%22%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20It%27s%20possible%20that%20whatever%20caused%20Shiny%20to%20think%20there%20might%20be%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20new%20dynamic%20outputs%2C%20also%20caused%20there%20to%20be%20new%20static%20outputs%2E%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Since%20there%20might%20be%20lots%20of%20different%20htmlwidgets%20bindings%2C%20we%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20schedule%20execution%20for%20later%2D%2Dno%20need%20to%20staticRender%20multiple%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20times%2E%0A%20%20%20%20%20%20%20%20%20%20if%20%28results%2Elength%20%21%3D%3D%20dynamicResults%2Elength%29%0A%20%20%20%20%20%20%20%20%20%20%20%20scheduleStaticRender%28%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20return%20dynamicResults%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20overrideMethod%28shinyBinding%2C%20%22renderValue%22%2C%20function%28superfunc%29%20%7B%0A%20%20%20%20%20%20%20%20return%20function%28el%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Resolve%20strings%20marked%20as%20javascript%20literals%20to%20objects%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21%28data%2Eevals%20instanceof%20Array%29%29%20data%2Eevals%20%3D%20%5Bdata%2Eevals%5D%3B%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20data%2Eevals%20%26%26%20i%20%3C%20data%2Eevals%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20window%2EHTMLWidgets%2EevaluateStringMember%28data%2Ex%2C%20data%2Eevals%5Bi%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21this%2ErenderOnNullValue%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28data%2Ex%20%3D%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20el%2Estyle%2Evisibility%20%3D%20%22hidden%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20el%2Estyle%2Evisibility%20%3D%20%22inherit%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21elementData%28el%2C%20%22initialized%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20initSizing%28el%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20elementData%28el%2C%20%22initialized%22%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28this%2E%5Fhtmlwidgets%5Finitialize%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20result%20%3D%20this%2E%5Fhtmlwidgets%5Finitialize%28el%2C%20el%2EoffsetWidth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20el%2EoffsetHeight%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20elementData%28el%2C%20%22init%5Fresult%22%2C%20result%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20Shiny%2ErenderDependencies%28data%2Edeps%29%3B%0A%20%20%20%20%20%20%20%20%20%20superfunc%28el%2C%20data%2Ex%2C%20elementData%28el%2C%20%22init%5Fresult%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20evalAndRun%28data%2EjsHooks%2Erender%2C%20elementData%28el%2C%20%22init%5Fresult%22%29%2C%20%5Bel%2C%20data%2Ex%5D%29%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20overrideMethod%28shinyBinding%2C%20%22resize%22%2C%20function%28superfunc%29%20%7B%0A%20%20%20%20%20%20%20%20return%20function%28el%2C%20width%2C%20height%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Shiny%20can%20call%20resize%20before%20initialize%2FrenderValue%20have%20been%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20called%2C%20which%20doesn%27t%20make%20sense%20for%20widgets%2E%0A%20%20%20%20%20%20%20%20%20%20if%20%28elementData%28el%2C%20%22initialized%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20superfunc%28el%2C%20width%2C%20height%2C%20elementData%28el%2C%20%22init%5Fresult%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20Shiny%2EoutputBindings%2Eregister%28shinyBinding%2C%20shinyBinding%2Ename%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20var%20scheduleStaticRenderTimerId%20%3D%20null%3B%0A%20%20function%20scheduleStaticRender%28%29%20%7B%0A%20%20%20%20if%20%28%21scheduleStaticRenderTimerId%29%20%7B%0A%20%20%20%20%20%20scheduleStaticRenderTimerId%20%3D%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20scheduleStaticRenderTimerId%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20window%2EHTMLWidgets%2EstaticRender%28%29%3B%0A%20%20%20%20%20%20%7D%2C%201%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Render%20static%20widgets%20after%20the%20document%20finishes%20loading%0A%20%20%2F%2F%20Statically%20render%20all%20elements%20that%20are%20of%20this%20widget%27s%20class%0A%20%20window%2EHTMLWidgets%2EstaticRender%20%3D%20function%28%29%20%7B%0A%20%20%20%20var%20bindings%20%3D%20window%2EHTMLWidgets%2Ewidgets%20%7C%7C%20%5B%5D%3B%0A%20%20%20%20forEach%28bindings%2C%20function%28binding%29%20%7B%0A%20%20%20%20%20%20var%20matches%20%3D%20binding%2Efind%28document%2EdocumentElement%29%3B%0A%20%20%20%20%20%20forEach%28matches%2C%20function%28el%29%20%7B%0A%20%20%20%20%20%20%20%20var%20sizeObj%20%3D%20initSizing%28el%2C%20binding%29%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28hasClass%28el%2C%20%22html%2Dwidget%2Dstatic%2Dbound%22%29%29%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20el%2EclassName%20%3D%20el%2EclassName%20%2B%20%22%20html%2Dwidget%2Dstatic%2Dbound%22%3B%0A%0A%20%20%20%20%20%20%20%20var%20initResult%3B%0A%20%20%20%20%20%20%20%20if%20%28binding%2Einitialize%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20initResult%20%3D%20binding%2Einitialize%28el%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20sizeObj%20%3F%20sizeObj%2EgetWidth%28%29%20%3A%20el%2EoffsetWidth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20sizeObj%20%3F%20sizeObj%2EgetHeight%28%29%20%3A%20el%2EoffsetHeight%0A%20%20%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20elementData%28el%2C%20%22init%5Fresult%22%2C%20initResult%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28binding%2Eresize%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20lastSize%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20var%20resizeHandler%20%3D%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20size%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20w%3A%20sizeObj%20%3F%20sizeObj%2EgetWidth%28%29%20%3A%20el%2EoffsetWidth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20h%3A%20sizeObj%20%3F%20sizeObj%2EgetHeight%28%29%20%3A%20el%2EoffsetHeight%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28size%2Ew%20%3D%3D%3D%200%20%26%26%20size%2Eh%20%3D%3D%3D%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28size%2Ew%20%3D%3D%3D%20lastSize%2Ew%20%26%26%20size%2Eh%20%3D%3D%3D%20lastSize%2Eh%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20lastSize%20%3D%20size%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20binding%2Eresize%28el%2C%20size%2Ew%2C%20size%2Eh%2C%20initResult%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20on%28window%2C%20%22resize%22%2C%20resizeHandler%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20This%20is%20needed%20for%20cases%20where%20we%27re%20running%20in%20a%20Shiny%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20app%2C%20but%20the%20widget%20itself%20is%20not%20a%20Shiny%20output%2C%20but%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20rather%20a%20simple%20static%20widget%2E%20One%20example%20of%20this%20is%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20an%20rmarkdown%20document%20that%20has%20runtime%3Ashiny%20and%20widget%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20that%20isn%27t%20in%20a%20render%20function%2E%20Shiny%20only%20knows%20to%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20call%20resize%20handlers%20for%20Shiny%20outputs%2C%20not%20for%20static%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20widgets%2C%20so%20we%20do%20it%20ourselves%2E%0A%20%20%20%20%20%20%20%20%20%20if%20%28window%2EjQuery%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20window%2EjQuery%28document%29%2Eon%28%22shown%22%2C%20resizeHandler%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20window%2EjQuery%28document%29%2Eon%28%22hidden%22%2C%20resizeHandler%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20This%20is%20needed%20for%20the%20specific%20case%20of%20ioslides%2C%20which%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20flips%20slides%20between%20display%3Anone%20and%20display%3Ablock%2E%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Ideally%20we%20would%20not%20have%20to%20have%20ioslide%2Dspecific%20code%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20here%2C%20but%20rather%20have%20ioslides%20raise%20a%20generic%20event%2C%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20but%20the%20rmarkdown%20package%20just%20went%20to%20CRAN%20so%20the%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20window%20to%20getting%20that%20fixed%20may%20be%20long%2E%0A%20%20%20%20%20%20%20%20%20%20if%20%28window%2EaddEventListener%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20It%27s%20OK%20to%20limit%20this%20to%20window%2EaddEventListener%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20browsers%20because%20ioslides%20itself%20only%20supports%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20such%20browsers%2E%0A%20%20%20%20%20%20%20%20%20%20%20%20on%28document%2C%20%22slideenter%22%2C%20resizeHandler%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20on%28document%2C%20%22slideleave%22%2C%20resizeHandler%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20var%20scriptData%20%3D%20document%2EquerySelector%28%22script%5Bdata%2Dfor%3D%27%22%20%2B%20el%2Eid%20%2B%20%22%27%5D%5Btype%3D%27application%2Fjson%27%5D%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28scriptData%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20data%20%3D%20JSON%2Eparse%28scriptData%2EtextContent%20%7C%7C%20scriptData%2Etext%29%3B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Resolve%20strings%20marked%20as%20javascript%20literals%20to%20objects%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21%28data%2Eevals%20instanceof%20Array%29%29%20data%2Eevals%20%3D%20%5Bdata%2Eevals%5D%3B%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20k%20%3D%200%3B%20data%2Eevals%20%26%26%20k%20%3C%20data%2Eevals%2Elength%3B%20k%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20window%2EHTMLWidgets%2EevaluateStringMember%28data%2Ex%2C%20data%2Eevals%5Bk%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20binding%2ErenderValue%28el%2C%20data%2Ex%2C%20initResult%29%3B%0A%20%20%20%20%20%20%20%20%20%20evalAndRun%28data%2EjsHooks%2Erender%2C%20initResult%2C%20%5Bel%2C%20data%2Ex%5D%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20invokePostRenderHandlers%28%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Wait%20until%20after%20the%20document%20has%20loaded%20to%20render%20the%20widgets%2E%0A%20%20if%20%28document%2EaddEventListener%29%20%7B%0A%20%20%20%20document%2EaddEventListener%28%22DOMContentLoaded%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20document%2EremoveEventListener%28%22DOMContentLoaded%22%2C%20arguments%2Ecallee%2C%20false%29%3B%0A%20%20%20%20%20%20window%2EHTMLWidgets%2EstaticRender%28%29%3B%0A%20%20%20%20%7D%2C%20false%29%3B%0A%20%20%7D%20else%20if%20%28document%2EattachEvent%29%20%7B%0A%20%20%20%20document%2EattachEvent%28%22onreadystatechange%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28document%2EreadyState%20%3D%3D%3D%20%22complete%22%29%20%7B%0A%20%20%20%20%20%20%20%20document%2EdetachEvent%28%22onreadystatechange%22%2C%20arguments%2Ecallee%29%3B%0A%20%20%20%20%20%20%20%20window%2EHTMLWidgets%2EstaticRender%28%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%0A%0A%0A%20%20window%2EHTMLWidgets%2EgetAttachmentUrl%20%3D%20function%28depname%2C%20key%29%20%7B%0A%20%20%20%20%2F%2F%20If%20no%20key%2C%20default%20to%20the%20first%20item%0A%20%20%20%20if%20%28typeof%28key%29%20%3D%3D%3D%20%22undefined%22%29%0A%20%20%20%20%20%20key%20%3D%201%3B%0A%0A%20%20%20%20var%20link%20%3D%20document%2EgetElementById%28depname%20%2B%20%22%2D%22%20%2B%20key%20%2B%20%22%2Dattachment%22%29%3B%0A%20%20%20%20if%20%28%21link%29%20%7B%0A%20%20%20%20%20%20throw%20new%20Error%28%22Attachment%20%22%20%2B%20depname%20%2B%20%22%2F%22%20%2B%20key%20%2B%20%22%20not%20found%20in%20document%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20link%2EgetAttribute%28%22href%22%29%3B%0A%20%20%7D%3B%0A%0A%20%20window%2EHTMLWidgets%2EdataframeToD3%20%3D%20function%28df%29%20%7B%0A%20%20%20%20var%20names%20%3D%20%5B%5D%3B%0A%20%20%20%20var%20length%3B%0A%20%20%20%20for%20%28var%20name%20in%20df%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28df%2EhasOwnProperty%28name%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20names%2Epush%28name%29%3B%0A%20%20%20%20%20%20%20%20if%20%28typeof%28df%5Bname%5D%29%20%21%3D%3D%20%22object%22%20%7C%7C%20typeof%28df%5Bname%5D%2Elength%29%20%3D%3D%3D%20%22undefined%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%20new%20Error%28%22All%20fields%20must%20be%20arrays%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28typeof%28length%29%20%21%3D%3D%20%22undefined%22%20%26%26%20length%20%21%3D%3D%20df%5Bname%5D%2Elength%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%20new%20Error%28%22All%20fields%20must%20be%20arrays%20of%20the%20same%20length%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20length%20%3D%20df%5Bname%5D%2Elength%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20results%20%3D%20%5B%5D%3B%0A%20%20%20%20var%20item%3B%0A%20%20%20%20for%20%28var%20row%20%3D%200%3B%20row%20%3C%20length%3B%20row%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20item%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20col%20%3D%200%3B%20col%20%3C%20names%2Elength%3B%20col%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20item%5Bnames%5Bcol%5D%5D%20%3D%20df%5Bnames%5Bcol%5D%5D%5Brow%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20results%2Epush%28item%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20results%3B%0A%20%20%7D%3B%0A%0A%20%20window%2EHTMLWidgets%2EtransposeArray2D%20%3D%20function%28array%29%20%7B%0A%20%20%20%20%20%20if%20%28array%2Elength%20%3D%3D%3D%200%29%20return%20array%3B%0A%20%20%20%20%20%20var%20newArray%20%3D%20array%5B0%5D%2Emap%28function%28col%2C%20i%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20array%2Emap%28function%28row%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20row%5Bi%5D%0A%20%20%20%20%20%20%20%20%20%20%7D%29%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20return%20newArray%3B%0A%20%20%7D%3B%0A%20%20%2F%2F%20Split%20value%20at%20splitChar%2C%20but%20allow%20splitChar%20to%20be%20escaped%0A%20%20%2F%2F%20using%20escapeChar%2E%20Any%20other%20characters%20escaped%20by%20escapeChar%0A%20%20%2F%2F%20will%20be%20included%20as%20usual%20%28including%20escapeChar%20itself%29%2E%0A%20%20function%20splitWithEscape%28value%2C%20splitChar%2C%20escapeChar%29%20%7B%0A%20%20%20%20var%20results%20%3D%20%5B%5D%3B%0A%20%20%20%20var%20escapeMode%20%3D%20false%3B%0A%20%20%20%20var%20currentResult%20%3D%20%22%22%3B%0A%20%20%20%20for%20%28var%20pos%20%3D%200%3B%20pos%20%3C%20value%2Elength%3B%20pos%2B%2B%29%20%7B%0A%20%20%20%20%20%20if%20%28%21escapeMode%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28value%5Bpos%5D%20%3D%3D%3D%20splitChar%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20results%2Epush%28currentResult%29%3B%0A%20%20%20%20%20%20%20%20%20%20currentResult%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28value%5Bpos%5D%20%3D%3D%3D%20escapeChar%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20escapeMode%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20currentResult%20%2B%3D%20value%5Bpos%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20currentResult%20%2B%3D%20value%5Bpos%5D%3B%0A%20%20%20%20%20%20%20%20escapeMode%20%3D%20false%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28currentResult%20%21%3D%3D%20%22%22%29%20%7B%0A%20%20%20%20%20%20results%2Epush%28currentResult%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20results%3B%0A%20%20%7D%0A%20%20%2F%2F%20Function%20authored%20by%20Yihui%2FJJ%20Allaire%0A%20%20window%2EHTMLWidgets%2EevaluateStringMember%20%3D%20function%28o%2C%20member%29%20%7B%0A%20%20%20%20var%20parts%20%3D%20splitWithEscape%28member%2C%20%27%2E%27%2C%20%27%5C%5C%27%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%2C%20l%20%3D%20parts%2Elength%3B%20i%20%3C%20l%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20part%20%3D%20parts%5Bi%5D%3B%0A%20%20%20%20%20%20%2F%2F%20part%20may%20be%20a%20character%20or%20%27numeric%27%20member%20name%0A%20%20%20%20%20%20if%20%28o%20%21%3D%3D%20null%20%26%26%20typeof%20o%20%3D%3D%3D%20%22object%22%20%26%26%20part%20in%20o%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28i%20%3D%3D%20%28l%20%2D%201%29%29%20%7B%20%2F%2F%20if%20we%20are%20at%20the%20end%20of%20the%20line%20then%20evalulate%0A%20%20%20%20%20%20%20%20%20%20if%20%28typeof%20o%5Bpart%5D%20%3D%3D%3D%20%22string%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20o%5Bpart%5D%20%3D%20eval%28%22%28%22%20%2B%20o%5Bpart%5D%20%2B%20%22%29%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%20%2F%2F%20otherwise%20continue%20to%20next%20embedded%20object%0A%20%20%20%20%20%20%20%20%20%20o%20%3D%20o%5Bpart%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Retrieve%20the%20HTMLWidget%20instance%20%28i%2Ee%2E%20the%20return%20value%20of%20an%0A%20%20%2F%2F%20HTMLWidget%20binding%27s%20initialize%28%29%20or%20factory%28%29%20function%29%0A%20%20%2F%2F%20associated%20with%20an%20element%2C%20or%20null%20if%20none%2E%0A%20%20window%2EHTMLWidgets%2EgetInstance%20%3D%20function%28el%29%20%7B%0A%20%20%20%20return%20elementData%28el%2C%20%22init%5Fresult%22%29%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Finds%20the%20first%20element%20in%20the%20scope%20that%20matches%20the%20selector%2C%0A%20%20%2F%2F%20and%20returns%20the%20HTMLWidget%20instance%20%28i%2Ee%2E%20the%20return%20value%20of%0A%20%20%2F%2F%20an%20HTMLWidget%20binding%27s%20initialize%28%29%20or%20factory%28%29%20function%29%0A%20%20%2F%2F%20associated%20with%20that%20element%2C%20if%20any%2E%20If%20no%20element%20matches%20the%0A%20%20%2F%2F%20selector%2C%20or%20the%20first%20matching%20element%20has%20no%20HTMLWidget%0A%20%20%2F%2F%20instance%20associated%20with%20it%2C%20then%20null%20is%20returned%2E%0A%20%20%2F%2F%0A%20%20%2F%2F%20The%20scope%20argument%20is%20optional%2C%20and%20defaults%20to%20window%2Edocument%2E%0A%20%20window%2EHTMLWidgets%2Efind%20%3D%20function%28scope%2C%20selector%29%20%7B%0A%20%20%20%20if%20%28arguments%2Elength%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20selector%20%3D%20scope%3B%0A%20%20%20%20%20%20scope%20%3D%20document%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20el%20%3D%20scope%2EquerySelector%28selector%29%3B%0A%20%20%20%20if%20%28el%20%3D%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20window%2EHTMLWidgets%2EgetInstance%28el%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Finds%20all%20elements%20in%20the%20scope%20that%20match%20the%20selector%2C%20and%0A%20%20%2F%2F%20returns%20the%20HTMLWidget%20instances%20%28i%2Ee%2E%20the%20return%20values%20of%0A%20%20%2F%2F%20an%20HTMLWidget%20binding%27s%20initialize%28%29%20or%20factory%28%29%20function%29%0A%20%20%2F%2F%20associated%20with%20the%20elements%2C%20in%20an%20array%2E%20If%20elements%20that%0A%20%20%2F%2F%20match%20the%20selector%20don%27t%20have%20an%20associated%20HTMLWidget%0A%20%20%2F%2F%20instance%2C%20the%20returned%20array%20will%20contain%20nulls%2E%0A%20%20%2F%2F%0A%20%20%2F%2F%20The%20scope%20argument%20is%20optional%2C%20and%20defaults%20to%20window%2Edocument%2E%0A%20%20window%2EHTMLWidgets%2EfindAll%20%3D%20function%28scope%2C%20selector%29%20%7B%0A%20%20%20%20if%20%28arguments%2Elength%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20selector%20%3D%20scope%3B%0A%20%20%20%20%20%20scope%20%3D%20document%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20nodes%20%3D%20scope%2EquerySelectorAll%28selector%29%3B%0A%20%20%20%20var%20results%20%3D%20%5B%5D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20nodes%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20results%2Epush%28window%2EHTMLWidgets%2EgetInstance%28nodes%5Bi%5D%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20results%3B%0A%20%20%7D%3B%0A%0A%20%20var%20postRenderHandlers%20%3D%20%5B%5D%3B%0A%20%20function%20invokePostRenderHandlers%28%29%20%7B%0A%20%20%20%20while%20%28postRenderHandlers%2Elength%29%20%7B%0A%20%20%20%20%20%20var%20handler%20%3D%20postRenderHandlers%2Eshift%28%29%3B%0A%20%20%20%20%20%20if%20%28handler%29%20%7B%0A%20%20%20%20%20%20%20%20handler%28%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Register%20the%20given%20callback%20function%20to%20be%20invoked%20after%20the%0A%20%20%2F%2F%20next%20time%20static%20widgets%20are%20rendered%2E%0A%20%20window%2EHTMLWidgets%2EaddPostRenderHandler%20%3D%20function%28callback%29%20%7B%0A%20%20%20%20postRenderHandlers%2Epush%28callback%29%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Takes%20a%20new%2Dstyle%20instance%2Dbound%20definition%2C%20and%20returns%20an%0A%20%20%2F%2F%20old%2Dstyle%20class%2Dbound%20definition%2E%20This%20saves%20us%20from%20having%0A%20%20%2F%2F%20to%20rewrite%20all%20the%20logic%20in%20this%20file%20to%20accomodate%20both%0A%20%20%2F%2F%20types%20of%20definitions%2E%0A%20%20function%20createLegacyDefinitionAdapter%28defn%29%20%7B%0A%20%20%20%20var%20result%20%3D%20%7B%0A%20%20%20%20%20%20name%3A%20defn%2Ename%2C%0A%20%20%20%20%20%20type%3A%20defn%2Etype%2C%0A%20%20%20%20%20%20initialize%3A%20function%28el%2C%20width%2C%20height%29%20%7B%0A%20%20%20%20%20%20%20%20return%20defn%2Efactory%28el%2C%20width%2C%20height%29%3B%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20renderValue%3A%20function%28el%2C%20x%2C%20instance%29%20%7B%0A%20%20%20%20%20%20%20%20return%20instance%2ErenderValue%28x%29%3B%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20resize%3A%20function%28el%2C%20width%2C%20height%2C%20instance%29%20%7B%0A%20%20%20%20%20%20%20%20return%20instance%2Eresize%28width%2C%20height%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20if%20%28defn%2Efind%29%0A%20%20%20%20%20%20result%2Efind%20%3D%20defn%2Efind%3B%0A%20%20%20%20if%20%28defn%2ErenderError%29%0A%20%20%20%20%20%20result%2ErenderError%20%3D%20defn%2ErenderError%3B%0A%20%20%20%20if%20%28defn%2EclearError%29%0A%20%20%20%20%20%20result%2EclearError%20%3D%20defn%2EclearError%3B%0A%0A%20%20%20%20return%20result%3B%0A%20%20%7D%0A%7D%29%28%29%3B%0A%0A"></script>
<link href="data:text/css,%2F%2A%20BASICS%20%2A%2F%0A%0A%2ECodeMirror%20%7B%0A%20%20%2F%2A%20Set%20height%2C%20width%2C%20borders%2C%20and%20global%20font%20properties%20here%20%2A%2F%0A%20%20font%2Dfamily%3A%20monospace%3B%0A%20%20%2F%2Aheight%3A%20300px%3B%2A%2F%0A%20%20color%3A%20black%3B%0A%7D%0A%0A%2F%2A%20PADDING%20%2A%2F%0A%0A%2ECodeMirror%2Dlines%20%7B%0A%20%20padding%3A%204px%200%3B%20%2F%2A%20Vertical%20padding%20around%20content%20%2A%2F%0A%7D%0A%2ECodeMirror%20pre%20%7B%0A%20%20padding%3A%200%204px%3B%20%2F%2A%20Horizontal%20padding%20of%20content%20%2A%2F%0A%7D%0A%0A%2ECodeMirror%2Dscrollbar%2Dfiller%2C%20%2ECodeMirror%2Dgutter%2Dfiller%20%7B%0A%20%20background%2Dcolor%3A%20white%3B%20%2F%2A%20The%20little%20square%20between%20H%20and%20V%20scrollbars%20%2A%2F%0A%7D%0A%0A%2F%2A%20GUTTER%20%2A%2F%0A%0A%2ECodeMirror%2Dgutters%20%7B%0A%20%20border%2Dright%3A%201px%20solid%20%23ddd%3B%0A%20%20background%2Dcolor%3A%20%23f7f7f7%3B%0A%20%20white%2Dspace%3A%20nowrap%3B%0A%7D%0A%2ECodeMirror%2Dlinenumbers%20%7B%7D%0A%2ECodeMirror%2Dlinenumber%20%7B%0A%20%20padding%3A%200%203px%200%205px%3B%0A%20%20min%2Dwidth%3A%2020px%3B%0A%20%20text%2Dalign%3A%20right%3B%0A%20%20color%3A%20%23999%3B%0A%20%20white%2Dspace%3A%20nowrap%3B%0A%7D%0A%0A%2ECodeMirror%2Dguttermarker%20%7B%20color%3A%20black%3B%20%7D%0A%2ECodeMirror%2Dguttermarker%2Dsubtle%20%7B%20color%3A%20%23999%3B%20%7D%0A%0A%2F%2A%20CURSOR%20%2A%2F%0A%0A%2ECodeMirror%2Dcursor%20%7B%0A%20%20border%2Dleft%3A%201px%20solid%20black%3B%0A%20%20border%2Dright%3A%20none%3B%0A%20%20width%3A%200%3B%0A%7D%0A%2F%2A%20Shown%20when%20moving%20in%20bi%2Ddirectional%20text%20%2A%2F%0A%2ECodeMirror%20div%2ECodeMirror%2Dsecondarycursor%20%7B%0A%20%20border%2Dleft%3A%201px%20solid%20silver%3B%0A%7D%0A%2Ecm%2Dfat%2Dcursor%20%2ECodeMirror%2Dcursor%20%7B%0A%20%20width%3A%20auto%3B%0A%20%20border%3A%200%3B%0A%20%20background%3A%20%237e7%3B%0A%7D%0A%2Ecm%2Dfat%2Dcursor%20div%2ECodeMirror%2Dcursors%20%7B%0A%20%20z%2Dindex%3A%201%3B%0A%7D%0A%0A%2Ecm%2Danimate%2Dfat%2Dcursor%20%7B%0A%20%20width%3A%20auto%3B%0A%20%20border%3A%200%3B%0A%20%20%2Dwebkit%2Danimation%3A%20blink%201%2E06s%20steps%281%29%20infinite%3B%0A%20%20%2Dmoz%2Danimation%3A%20blink%201%2E06s%20steps%281%29%20infinite%3B%0A%20%20animation%3A%20blink%201%2E06s%20steps%281%29%20infinite%3B%0A%20%20background%2Dcolor%3A%20%237e7%3B%0A%7D%0A%40%2Dmoz%2Dkeyframes%20blink%20%7B%0A%20%200%25%20%7B%7D%0A%20%2050%25%20%7B%20background%2Dcolor%3A%20transparent%3B%20%7D%0A%20%20100%25%20%7B%7D%0A%7D%0A%40%2Dwebkit%2Dkeyframes%20blink%20%7B%0A%20%200%25%20%7B%7D%0A%20%2050%25%20%7B%20background%2Dcolor%3A%20transparent%3B%20%7D%0A%20%20100%25%20%7B%7D%0A%7D%0A%40keyframes%20blink%20%7B%0A%20%200%25%20%7B%7D%0A%20%2050%25%20%7B%20background%2Dcolor%3A%20transparent%3B%20%7D%0A%20%20100%25%20%7B%7D%0A%7D%0A%0A%2F%2A%20Can%20style%20cursor%20different%20in%20overwrite%20%28non%2Dinsert%29%20mode%20%2A%2F%0A%2ECodeMirror%2Doverwrite%20%2ECodeMirror%2Dcursor%20%7B%7D%0A%0A%2Ecm%2Dtab%20%7B%20display%3A%20inline%2Dblock%3B%20text%2Ddecoration%3A%20inherit%3B%20%7D%0A%0A%2ECodeMirror%2Druler%20%7B%0A%20%20border%2Dleft%3A%201px%20solid%20%23ccc%3B%0A%20%20position%3A%20absolute%3B%0A%7D%0A%0A%2F%2A%20DEFAULT%20THEME%20%2A%2F%0A%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dheader%20%7Bcolor%3A%20blue%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dquote%20%7Bcolor%3A%20%23090%3B%7D%0A%2Ecm%2Dnegative%20%7Bcolor%3A%20%23d44%3B%7D%0A%2Ecm%2Dpositive%20%7Bcolor%3A%20%23292%3B%7D%0A%2Ecm%2Dheader%2C%20%2Ecm%2Dstrong%20%7Bfont%2Dweight%3A%20bold%3B%7D%0A%2Ecm%2Dem%20%7Bfont%2Dstyle%3A%20italic%3B%7D%0A%2Ecm%2Dlink%20%7Btext%2Ddecoration%3A%20underline%3B%7D%0A%2Ecm%2Dstrikethrough%20%7Btext%2Ddecoration%3A%20line%2Dthrough%3B%7D%0A%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dkeyword%20%7Bcolor%3A%20%23708%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Datom%20%7Bcolor%3A%20%23219%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dnumber%20%7Bcolor%3A%20%23164%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Ddef%20%7Bcolor%3A%20%2300f%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dvariable%2C%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dpunctuation%2C%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dproperty%2C%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Doperator%20%7B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dvariable%2D2%20%7Bcolor%3A%20%2305a%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dvariable%2D3%20%7Bcolor%3A%20%23085%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dcomment%20%7Bcolor%3A%20%23a50%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dstring%20%7Bcolor%3A%20%23a11%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dstring%2D2%20%7Bcolor%3A%20%23f50%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dmeta%20%7Bcolor%3A%20%23555%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dqualifier%20%7Bcolor%3A%20%23555%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dbuiltin%20%7Bcolor%3A%20%2330a%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dbracket%20%7Bcolor%3A%20%23997%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dtag%20%7Bcolor%3A%20%23170%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dattribute%20%7Bcolor%3A%20%2300c%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dhr%20%7Bcolor%3A%20%23999%3B%7D%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Dlink%20%7Bcolor%3A%20%2300c%3B%7D%0A%0A%2Ecm%2Ds%2Ddefault%20%2Ecm%2Derror%20%7Bcolor%3A%20%23f00%3B%7D%0A%2Ecm%2Dinvalidchar%20%7Bcolor%3A%20%23f00%3B%7D%0A%0A%2ECodeMirror%2Dcomposing%20%7B%20border%2Dbottom%3A%202px%20solid%3B%20%7D%0A%0A%2F%2A%20Default%20styles%20for%20common%20addons%20%2A%2F%0A%0Adiv%2ECodeMirror%20span%2ECodeMirror%2Dmatchingbracket%20%7Bcolor%3A%20%230f0%3B%7D%0Adiv%2ECodeMirror%20span%2ECodeMirror%2Dnonmatchingbracket%20%7Bcolor%3A%20%23f22%3B%7D%0A%2ECodeMirror%2Dmatchingtag%20%7B%20background%3A%20rgba%28255%2C%20150%2C%200%2C%20%2E3%29%3B%20%7D%0A%2ECodeMirror%2Dactiveline%2Dbackground%20%7Bbackground%3A%20%23e8f2ff%3B%7D%0A%0A%2F%2A%20STOP%20%2A%2F%0A%0A%2F%2A%20The%20rest%20of%20this%20file%20contains%20styles%20related%20to%20the%20mechanics%20of%0A%20%20%20the%20editor%2E%20You%20probably%20shouldn%27t%20touch%20them%2E%20%2A%2F%0A%0A%2ECodeMirror%20%7B%0A%20%20position%3A%20relative%3B%0A%20%20overflow%3A%20hidden%3B%0A%20%20background%3A%20white%3B%0A%7D%0A%0A%2ECodeMirror%2Dscroll%20%7B%0A%20%20overflow%3A%20scroll%20%21important%3B%20%2F%2A%20Things%20will%20break%20if%20this%20is%20overridden%20%2A%2F%0A%20%20%2F%2A%2030px%20is%20the%20magic%20margin%20used%20to%20hide%20the%20element%27s%20real%20scrollbars%20%2A%2F%0A%20%20%2F%2A%20See%20overflow%3A%20hidden%20in%20%2ECodeMirror%20%2A%2F%0A%20%20margin%2Dbottom%3A%20%2D30px%3B%20margin%2Dright%3A%20%2D30px%3B%0A%20%20padding%2Dbottom%3A%2030px%3B%0A%20%20height%3A%20100%25%3B%0A%20%20outline%3A%20none%3B%20%2F%2A%20Prevent%20dragging%20from%20highlighting%20the%20element%20%2A%2F%0A%20%20position%3A%20relative%3B%0A%7D%0A%2ECodeMirror%2Dsizer%20%7B%0A%20%20position%3A%20relative%3B%0A%20%20border%2Dright%3A%2030px%20solid%20transparent%3B%0A%7D%0A%0A%2F%2A%20The%20fake%2C%20visible%20scrollbars%2E%20Used%20to%20force%20redraw%20during%20scrolling%0A%20%20%20before%20actual%20scrolling%20happens%2C%20thus%20preventing%20shaking%20and%0A%20%20%20flickering%20artifacts%2E%20%2A%2F%0A%2ECodeMirror%2Dvscrollbar%2C%20%2ECodeMirror%2Dhscrollbar%2C%20%2ECodeMirror%2Dscrollbar%2Dfiller%2C%20%2ECodeMirror%2Dgutter%2Dfiller%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20z%2Dindex%3A%206%3B%0A%20%20display%3A%20none%3B%0A%7D%0A%2ECodeMirror%2Dvscrollbar%20%7B%0A%20%20right%3A%200%3B%20top%3A%200%3B%0A%20%20overflow%2Dx%3A%20hidden%3B%0A%20%20overflow%2Dy%3A%20scroll%3B%0A%7D%0A%2ECodeMirror%2Dhscrollbar%20%7B%0A%20%20bottom%3A%200%3B%20left%3A%200%3B%0A%20%20overflow%2Dy%3A%20hidden%3B%0A%20%20overflow%2Dx%3A%20scroll%3B%0A%7D%0A%2ECodeMirror%2Dscrollbar%2Dfiller%20%7B%0A%20%20right%3A%200%3B%20bottom%3A%200%3B%0A%7D%0A%2ECodeMirror%2Dgutter%2Dfiller%20%7B%0A%20%20left%3A%200%3B%20bottom%3A%200%3B%0A%7D%0A%0A%2ECodeMirror%2Dgutters%20%7B%0A%20%20position%3A%20absolute%3B%20left%3A%200%3B%20top%3A%200%3B%0A%20%20z%2Dindex%3A%203%3B%0A%7D%0A%2ECodeMirror%2Dgutter%20%7B%0A%20%20white%2Dspace%3A%20normal%3B%0A%20%20height%3A%20100%25%3B%0A%20%20display%3A%20inline%2Dblock%3B%0A%20%20margin%2Dbottom%3A%20%2D30px%3B%0A%20%20%2F%2A%20Hack%20to%20make%20IE7%20behave%20%2A%2F%0A%20%20%2Azoom%3A1%3B%0A%20%20%2Adisplay%3Ainline%3B%0A%7D%0A%2ECodeMirror%2Dgutter%2Dwrapper%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20z%2Dindex%3A%204%3B%0A%20%20background%3A%20none%20%21important%3B%0A%20%20border%3A%20none%20%21important%3B%0A%7D%0A%2ECodeMirror%2Dgutter%2Dbackground%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20top%3A%200%3B%20bottom%3A%200%3B%0A%20%20z%2Dindex%3A%204%3B%0A%7D%0A%2ECodeMirror%2Dgutter%2Delt%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20cursor%3A%20default%3B%0A%20%20z%2Dindex%3A%204%3B%0A%7D%0A%2ECodeMirror%2Dgutter%2Dwrapper%20%7B%0A%20%20%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%20%20%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%20%20user%2Dselect%3A%20none%3B%0A%7D%0A%0A%2ECodeMirror%2Dlines%20%7B%0A%20%20cursor%3A%20text%3B%0A%20%20min%2Dheight%3A%201px%3B%20%2F%2A%20prevents%20collapsing%20before%20first%20draw%20%2A%2F%0A%7D%0A%2ECodeMirror%20pre%20%7B%0A%20%20%2F%2A%20Reset%20some%20styles%20that%20the%20rest%20of%20the%20page%20might%20have%20set%20%2A%2F%0A%20%20%2Dmoz%2Dborder%2Dradius%3A%200%3B%20%2Dwebkit%2Dborder%2Dradius%3A%200%3B%20border%2Dradius%3A%200%3B%0A%20%20border%2Dwidth%3A%200%3B%0A%20%20background%3A%20transparent%3B%0A%20%20font%2Dfamily%3A%20inherit%3B%0A%20%20font%2Dsize%3A%20inherit%3B%0A%20%20margin%3A%200%3B%0A%20%20white%2Dspace%3A%20pre%3B%0A%20%20word%2Dwrap%3A%20normal%3B%0A%20%20line%2Dheight%3A%20inherit%3B%0A%20%20color%3A%20inherit%3B%0A%20%20z%2Dindex%3A%202%3B%0A%20%20position%3A%20relative%3B%0A%20%20overflow%3A%20visible%3B%0A%20%20%2Dwebkit%2Dtap%2Dhighlight%2Dcolor%3A%20transparent%3B%0A%7D%0A%2ECodeMirror%2Dwrap%20pre%20%7B%0A%20%20word%2Dwrap%3A%20break%2Dword%3B%0A%20%20white%2Dspace%3A%20pre%2Dwrap%3B%0A%20%20word%2Dbreak%3A%20normal%3B%0A%7D%0A%0A%2ECodeMirror%2Dlinebackground%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20left%3A%200%3B%20right%3A%200%3B%20top%3A%200%3B%20bottom%3A%200%3B%0A%20%20z%2Dindex%3A%200%3B%0A%7D%0A%0A%2ECodeMirror%2Dlinewidget%20%7B%0A%20%20position%3A%20relative%3B%0A%20%20z%2Dindex%3A%202%3B%0A%20%20overflow%3A%20auto%3B%0A%7D%0A%0A%2ECodeMirror%2Dwidget%20%7B%7D%0A%0A%2ECodeMirror%2Dcode%20%7B%0A%20%20outline%3A%20none%3B%0A%7D%0A%0A%2F%2A%20Force%20content%2Dbox%20sizing%20for%20the%20elements%20where%20we%20expect%20it%20%2A%2F%0A%2ECodeMirror%2Dscroll%2C%0A%2ECodeMirror%2Dsizer%2C%0A%2ECodeMirror%2Dgutter%2C%0A%2ECodeMirror%2Dgutters%2C%0A%2ECodeMirror%2Dlinenumber%20%7B%0A%20%20%2Dmoz%2Dbox%2Dsizing%3A%20content%2Dbox%3B%0A%20%20box%2Dsizing%3A%20content%2Dbox%3B%0A%7D%0A%0A%2ECodeMirror%2Dmeasure%20%7B%0A%20%20position%3A%20absolute%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%200%3B%0A%20%20overflow%3A%20hidden%3B%0A%20%20visibility%3A%20hidden%3B%0A%7D%0A%0A%2ECodeMirror%2Dcursor%20%7B%20position%3A%20absolute%3B%20%7D%0A%2ECodeMirror%2Dmeasure%20pre%20%7B%20position%3A%20static%3B%20%7D%0A%0Adiv%2ECodeMirror%2Dcursors%20%7B%0A%20%20visibility%3A%20hidden%3B%0A%20%20position%3A%20relative%3B%0A%20%20z%2Dindex%3A%203%3B%0A%7D%0Adiv%2ECodeMirror%2Ddragcursors%20%7B%0A%20%20visibility%3A%20visible%3B%0A%7D%0A%0A%2ECodeMirror%2Dfocused%20div%2ECodeMirror%2Dcursors%20%7B%0A%20%20visibility%3A%20visible%3B%0A%7D%0A%0A%2ECodeMirror%2Dselected%20%7B%20background%3A%20%23d9d9d9%3B%20%7D%0A%2ECodeMirror%2Dfocused%20%2ECodeMirror%2Dselected%20%7B%20background%3A%20%23d7d4f0%3B%20%7D%0A%2ECodeMirror%2Dcrosshair%20%7B%20cursor%3A%20crosshair%3B%20%7D%0A%2ECodeMirror%2Dline%3A%3Aselection%2C%20%2ECodeMirror%2Dline%20%3E%20span%3A%3Aselection%2C%20%2ECodeMirror%2Dline%20%3E%20span%20%3E%20span%3A%3Aselection%20%7B%20background%3A%20%23d7d4f0%3B%20%7D%0A%2ECodeMirror%2Dline%3A%3A%2Dmoz%2Dselection%2C%20%2ECodeMirror%2Dline%20%3E%20span%3A%3A%2Dmoz%2Dselection%2C%20%2ECodeMirror%2Dline%20%3E%20span%20%3E%20span%3A%3A%2Dmoz%2Dselection%20%7B%20background%3A%20%23d7d4f0%3B%20%7D%0A%0A%2Ecm%2Dsearching%20%7B%0A%20%20background%3A%20%23ffa%3B%0A%20%20background%3A%20rgba%28255%2C%20255%2C%200%2C%20%2E4%29%3B%0A%7D%0A%0A%2F%2A%20IE7%20hack%20to%20prevent%20it%20from%20returning%20funny%20offsetTops%20on%20the%20spans%20%2A%2F%0A%2ECodeMirror%20span%20%7B%20%2Avertical%2Dalign%3A%20text%2Dbottom%3B%20%7D%0A%0A%2F%2A%20Used%20to%20force%20a%20border%20model%20for%20a%20node%20%2A%2F%0A%2Ecm%2Dforce%2Dborder%20%7B%20padding%2Dright%3A%20%2E1px%3B%20%7D%0A%0A%40media%20print%20%7B%0A%20%20%2F%2A%20Hide%20the%20cursor%20when%20printing%20%2A%2F%0A%20%20%2ECodeMirror%20div%2ECodeMirror%2Dcursors%20%7B%0A%20%20%20%20visibility%3A%20hidden%3B%0A%20%20%7D%0A%7D%0A%0A%2F%2A%20See%20issue%20%232901%20%2A%2F%0A%2Ecm%2Dtab%2Dwrap%2Dhack%3Aafter%20%7B%20content%3A%20%27%27%3B%20%7D%0A%0A%2F%2A%20Help%20users%20use%20markselection%20to%20safely%20style%20text%20background%20%2A%2F%0Aspan%2ECodeMirror%2Dselectedtext%20%7B%20background%3A%20none%3B%20%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript,%2F%2F%20CodeMirror%2C%20copyright%20%28c%29%20by%20Marijn%20Haverbeke%20and%20others%0A%2F%2F%20Distributed%20under%20an%20MIT%20license%3A%20http%3A%2F%2Fcodemirror%2Enet%2FLICENSE%0A%0A%2F%2F%20This%20is%20CodeMirror%20%28http%3A%2F%2Fcodemirror%2Enet%29%2C%20a%20code%20editor%0A%2F%2F%20implemented%20in%20JavaScript%20on%20top%20of%20the%20browser%27s%20DOM%2E%0A%2F%2F%0A%2F%2F%20You%20can%20find%20some%20technical%20background%20for%20some%20of%20the%20code%20below%0A%2F%2F%20at%20http%3A%2F%2Fmarijnhaverbeke%2Enl%2Fblog%2F%23cm%2Dinternals%20%2E%0A%0A%28function%28mod%29%20%7B%0A%20%20if%20%28typeof%20exports%20%3D%3D%20%22object%22%20%26%26%20typeof%20module%20%3D%3D%20%22object%22%29%20%2F%2F%20CommonJS%0A%20%20%20%20module%2Eexports%20%3D%20mod%28%29%3B%0A%20%20else%20if%20%28typeof%20define%20%3D%3D%20%22function%22%20%26%26%20define%2Eamd%29%20%2F%2F%20AMD%0A%20%20%20%20return%20define%28%5B%5D%2C%20mod%29%3B%0A%20%20else%20%2F%2F%20Plain%20browser%20env%0A%20%20%20%20%28this%20%7C%7C%20window%29%2ECodeMirror%20%3D%20mod%28%29%3B%0A%7D%29%28function%28%29%20%7B%0A%20%20%22use%20strict%22%3B%0A%0A%20%20%2F%2F%20BROWSER%20SNIFFING%0A%0A%20%20%2F%2F%20Kludges%20for%20bugs%20and%20behavior%20differences%20that%20can%27t%20be%20feature%0A%20%20%2F%2F%20detected%20are%20enabled%20based%20on%20userAgent%20etc%20sniffing%2E%0A%20%20var%20userAgent%20%3D%20navigator%2EuserAgent%3B%0A%20%20var%20platform%20%3D%20navigator%2Eplatform%3B%0A%0A%20%20var%20gecko%20%3D%20%2Fgecko%5C%2F%5Cd%2Fi%2Etest%28userAgent%29%3B%0A%20%20var%20ie%5Fupto10%20%3D%20%2FMSIE%20%5Cd%2F%2Etest%28userAgent%29%3B%0A%20%20var%20ie%5F11up%20%3D%20%2FTrident%5C%2F%28%3F%3A%5B7%2D9%5D%7C%5Cd%7B2%2C%7D%29%5C%2E%2E%2Arv%3A%28%5Cd%2B%29%2F%2Eexec%28userAgent%29%3B%0A%20%20var%20ie%20%3D%20ie%5Fupto10%20%7C%7C%20ie%5F11up%3B%0A%20%20var%20ie%5Fversion%20%3D%20ie%20%26%26%20%28ie%5Fupto10%20%3F%20document%2EdocumentMode%20%7C%7C%206%20%3A%20ie%5F11up%5B1%5D%29%3B%0A%20%20var%20webkit%20%3D%20%2FWebKit%5C%2F%2F%2Etest%28userAgent%29%3B%0A%20%20var%20qtwebkit%20%3D%20webkit%20%26%26%20%2FQt%5C%2F%5Cd%2B%5C%2E%5Cd%2B%2F%2Etest%28userAgent%29%3B%0A%20%20var%20chrome%20%3D%20%2FChrome%5C%2F%2F%2Etest%28userAgent%29%3B%0A%20%20var%20presto%20%3D%20%2FOpera%5C%2F%2F%2Etest%28userAgent%29%3B%0A%20%20var%20safari%20%3D%20%2FApple%20Computer%2F%2Etest%28navigator%2Evendor%29%3B%0A%20%20var%20mac%5FgeMountainLion%20%3D%20%2FMac%20OS%20X%201%5Cd%5CD%28%5B8%2D9%5D%7C%5Cd%5Cd%29%5CD%2F%2Etest%28userAgent%29%3B%0A%20%20var%20phantom%20%3D%20%2FPhantomJS%2F%2Etest%28userAgent%29%3B%0A%0A%20%20var%20ios%20%3D%20%2FAppleWebKit%2F%2Etest%28userAgent%29%20%26%26%20%2FMobile%5C%2F%5Cw%2B%2F%2Etest%28userAgent%29%3B%0A%20%20%2F%2F%20This%20is%20woefully%20incomplete%2E%20Suggestions%20for%20alternative%20methods%20welcome%2E%0A%20%20var%20mobile%20%3D%20ios%20%7C%7C%20%2FAndroid%7CwebOS%7CBlackBerry%7COpera%20Mini%7COpera%20Mobi%7CIEMobile%2Fi%2Etest%28userAgent%29%3B%0A%20%20var%20mac%20%3D%20ios%20%7C%7C%20%2FMac%2F%2Etest%28platform%29%3B%0A%20%20var%20windows%20%3D%20%2Fwin%2Fi%2Etest%28platform%29%3B%0A%0A%20%20var%20presto%5Fversion%20%3D%20presto%20%26%26%20userAgent%2Ematch%28%2FVersion%5C%2F%28%5Cd%2A%5C%2E%5Cd%2A%29%2F%29%3B%0A%20%20if%20%28presto%5Fversion%29%20presto%5Fversion%20%3D%20Number%28presto%5Fversion%5B1%5D%29%3B%0A%20%20if%20%28presto%5Fversion%20%26%26%20presto%5Fversion%20%3E%3D%2015%29%20%7B%20presto%20%3D%20false%3B%20webkit%20%3D%20true%3B%20%7D%0A%20%20%2F%2F%20Some%20browsers%20use%20the%20wrong%20event%20properties%20to%20signal%20cmd%2Fctrl%20on%20OS%20X%0A%20%20var%20flipCtrlCmd%20%3D%20mac%20%26%26%20%28qtwebkit%20%7C%7C%20presto%20%26%26%20%28presto%5Fversion%20%3D%3D%20null%20%7C%7C%20presto%5Fversion%20%3C%2012%2E11%29%29%3B%0A%20%20var%20captureRightClick%20%3D%20gecko%20%7C%7C%20%28ie%20%26%26%20ie%5Fversion%20%3E%3D%209%29%3B%0A%0A%20%20%2F%2F%20Optimize%20some%20code%20when%20these%20features%20are%20not%20used%2E%0A%20%20var%20sawReadOnlySpans%20%3D%20false%2C%20sawCollapsedSpans%20%3D%20false%3B%0A%0A%20%20%2F%2F%20EDITOR%20CONSTRUCTOR%0A%0A%20%20%2F%2F%20A%20CodeMirror%20instance%20represents%20an%20editor%2E%20This%20is%20the%20object%0A%20%20%2F%2F%20that%20user%20code%20is%20usually%20dealing%20with%2E%0A%0A%20%20function%20CodeMirror%28place%2C%20options%29%20%7B%0A%20%20%20%20if%20%28%21%28this%20instanceof%20CodeMirror%29%29%20return%20new%20CodeMirror%28place%2C%20options%29%3B%0A%0A%20%20%20%20this%2Eoptions%20%3D%20options%20%3D%20options%20%3F%20copyObj%28options%29%20%3A%20%7B%7D%3B%0A%20%20%20%20%2F%2F%20Determine%20effective%20options%20based%20on%20given%20values%20and%20defaults%2E%0A%20%20%20%20copyObj%28defaults%2C%20options%2C%20false%29%3B%0A%20%20%20%20setGuttersForLineNumbers%28options%29%3B%0A%0A%20%20%20%20var%20doc%20%3D%20options%2Evalue%3B%0A%20%20%20%20if%20%28typeof%20doc%20%3D%3D%20%22string%22%29%20doc%20%3D%20new%20Doc%28doc%2C%20options%2Emode%2C%20null%2C%20options%2ElineSeparator%29%3B%0A%20%20%20%20this%2Edoc%20%3D%20doc%3B%0A%0A%20%20%20%20var%20input%20%3D%20new%20CodeMirror%2EinputStyles%5Boptions%2EinputStyle%5D%28this%29%3B%0A%20%20%20%20var%20display%20%3D%20this%2Edisplay%20%3D%20new%20Display%28place%2C%20doc%2C%20input%29%3B%0A%20%20%20%20display%2Ewrapper%2ECodeMirror%20%3D%20this%3B%0A%20%20%20%20updateGutters%28this%29%3B%0A%20%20%20%20themeChanged%28this%29%3B%0A%20%20%20%20if%20%28options%2ElineWrapping%29%0A%20%20%20%20%20%20this%2Edisplay%2Ewrapper%2EclassName%20%2B%3D%20%22%20CodeMirror%2Dwrap%22%3B%0A%20%20%20%20if%20%28options%2Eautofocus%20%26%26%20%21mobile%29%20display%2Einput%2Efocus%28%29%3B%0A%20%20%20%20initScrollbars%28this%29%3B%0A%0A%20%20%20%20this%2Estate%20%3D%20%7B%0A%20%20%20%20%20%20keyMaps%3A%20%5B%5D%2C%20%20%2F%2F%20stores%20maps%20added%20by%20addKeyMap%0A%20%20%20%20%20%20overlays%3A%20%5B%5D%2C%20%2F%2F%20highlighting%20overlays%2C%20as%20added%20by%20addOverlay%0A%20%20%20%20%20%20modeGen%3A%200%2C%20%20%20%2F%2F%20bumped%20when%20mode%2Foverlay%20changes%2C%20used%20to%20invalidate%20highlighting%20info%0A%20%20%20%20%20%20overwrite%3A%20false%2C%0A%20%20%20%20%20%20delayingBlurEvent%3A%20false%2C%0A%20%20%20%20%20%20focused%3A%20false%2C%0A%20%20%20%20%20%20suppressEdits%3A%20false%2C%20%2F%2F%20used%20to%20disable%20editing%20during%20key%20handlers%20when%20in%20readOnly%20mode%0A%20%20%20%20%20%20pasteIncoming%3A%20false%2C%20cutIncoming%3A%20false%2C%20%2F%2F%20help%20recognize%20paste%2Fcut%20edits%20in%20input%2Epoll%0A%20%20%20%20%20%20selectingText%3A%20false%2C%0A%20%20%20%20%20%20draggingText%3A%20false%2C%0A%20%20%20%20%20%20highlight%3A%20new%20Delayed%28%29%2C%20%2F%2F%20stores%20highlight%20worker%20timeout%0A%20%20%20%20%20%20keySeq%3A%20null%2C%20%20%2F%2F%20Unfinished%20key%20sequence%0A%20%20%20%20%20%20specialChars%3A%20null%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20var%20cm%20%3D%20this%3B%0A%0A%20%20%20%20%2F%2F%20Override%20magic%20textarea%20content%20restore%20that%20IE%20sometimes%20does%0A%20%20%20%20%2F%2F%20on%20our%20hidden%20textarea%20on%20reload%0A%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%2011%29%20setTimeout%28function%28%29%20%7B%20cm%2Edisplay%2Einput%2Ereset%28true%29%3B%20%7D%2C%2020%29%3B%0A%0A%20%20%20%20registerEventHandlers%28this%29%3B%0A%20%20%20%20ensureGlobalHandlers%28%29%3B%0A%0A%20%20%20%20startOperation%28this%29%3B%0A%20%20%20%20this%2EcurOp%2EforceUpdate%20%3D%20true%3B%0A%20%20%20%20attachDoc%28this%2C%20doc%29%3B%0A%0A%20%20%20%20if%20%28%28options%2Eautofocus%20%26%26%20%21mobile%29%20%7C%7C%20cm%2EhasFocus%28%29%29%0A%20%20%20%20%20%20setTimeout%28bind%28onFocus%2C%20this%29%2C%2020%29%3B%0A%20%20%20%20else%0A%20%20%20%20%20%20onBlur%28this%29%3B%0A%0A%20%20%20%20for%20%28var%20opt%20in%20optionHandlers%29%20if%20%28optionHandlers%2EhasOwnProperty%28opt%29%29%0A%20%20%20%20%20%20optionHandlers%5Bopt%5D%28this%2C%20options%5Bopt%5D%2C%20Init%29%3B%0A%20%20%20%20maybeUpdateLineNumberWidth%28this%29%3B%0A%20%20%20%20if%20%28options%2EfinishInit%29%20options%2EfinishInit%28this%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20initHooks%2Elength%3B%20%2B%2Bi%29%20initHooks%5Bi%5D%28this%29%3B%0A%20%20%20%20endOperation%28this%29%3B%0A%20%20%20%20%2F%2F%20Suppress%20optimizelegibility%20in%20Webkit%2C%20since%20it%20breaks%20text%0A%20%20%20%20%2F%2F%20measuring%20on%20line%20wrapping%20boundaries%2E%0A%20%20%20%20if%20%28webkit%20%26%26%20options%2ElineWrapping%20%26%26%0A%20%20%20%20%20%20%20%20getComputedStyle%28display%2ElineDiv%29%2EtextRendering%20%3D%3D%20%22optimizelegibility%22%29%0A%20%20%20%20%20%20display%2ElineDiv%2Estyle%2EtextRendering%20%3D%20%22auto%22%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20DISPLAY%20CONSTRUCTOR%0A%0A%20%20%2F%2F%20The%20display%20handles%20the%20DOM%20integration%2C%20both%20for%20input%20reading%0A%20%20%2F%2F%20and%20content%20drawing%2E%20It%20holds%20references%20to%20DOM%20nodes%20and%0A%20%20%2F%2F%20display%2Drelated%20state%2E%0A%0A%20%20function%20Display%28place%2C%20doc%2C%20input%29%20%7B%0A%20%20%20%20var%20d%20%3D%20this%3B%0A%20%20%20%20this%2Einput%20%3D%20input%3B%0A%0A%20%20%20%20%2F%2F%20Covers%20bottom%2Dright%20square%20when%20both%20scrollbars%20are%20present%2E%0A%20%20%20%20d%2EscrollbarFiller%20%3D%20elt%28%22div%22%2C%20null%2C%20%22CodeMirror%2Dscrollbar%2Dfiller%22%29%3B%0A%20%20%20%20d%2EscrollbarFiller%2EsetAttribute%28%22cm%2Dnot%2Dcontent%22%2C%20%22true%22%29%3B%0A%20%20%20%20%2F%2F%20Covers%20bottom%20of%20gutter%20when%20coverGutterNextToScrollbar%20is%20on%0A%20%20%20%20%2F%2F%20and%20h%20scrollbar%20is%20present%2E%0A%20%20%20%20d%2EgutterFiller%20%3D%20elt%28%22div%22%2C%20null%2C%20%22CodeMirror%2Dgutter%2Dfiller%22%29%3B%0A%20%20%20%20d%2EgutterFiller%2EsetAttribute%28%22cm%2Dnot%2Dcontent%22%2C%20%22true%22%29%3B%0A%20%20%20%20%2F%2F%20Will%20contain%20the%20actual%20code%2C%20positioned%20to%20cover%20the%20viewport%2E%0A%20%20%20%20d%2ElineDiv%20%3D%20elt%28%22div%22%2C%20null%2C%20%22CodeMirror%2Dcode%22%29%3B%0A%20%20%20%20%2F%2F%20Elements%20are%20added%20to%20these%20to%20represent%20selection%20and%20cursors%2E%0A%20%20%20%20d%2EselectionDiv%20%3D%20elt%28%22div%22%2C%20null%2C%20null%2C%20%22position%3A%20relative%3B%20z%2Dindex%3A%201%22%29%3B%0A%20%20%20%20d%2EcursorDiv%20%3D%20elt%28%22div%22%2C%20null%2C%20%22CodeMirror%2Dcursors%22%29%3B%0A%20%20%20%20%2F%2F%20A%20visibility%3A%20hidden%20element%20used%20to%20find%20the%20size%20of%20things%2E%0A%20%20%20%20d%2Emeasure%20%3D%20elt%28%22div%22%2C%20null%2C%20%22CodeMirror%2Dmeasure%22%29%3B%0A%20%20%20%20%2F%2F%20When%20lines%20outside%20of%20the%20viewport%20are%20measured%2C%20they%20are%20drawn%20in%20this%2E%0A%20%20%20%20d%2ElineMeasure%20%3D%20elt%28%22div%22%2C%20null%2C%20%22CodeMirror%2Dmeasure%22%29%3B%0A%20%20%20%20%2F%2F%20Wraps%20everything%20that%20needs%20to%20exist%20inside%20the%20vertically%2Dpadded%20coordinate%20system%0A%20%20%20%20d%2ElineSpace%20%3D%20elt%28%22div%22%2C%20%5Bd%2Emeasure%2C%20d%2ElineMeasure%2C%20d%2EselectionDiv%2C%20d%2EcursorDiv%2C%20d%2ElineDiv%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20null%2C%20%22position%3A%20relative%3B%20outline%3A%20none%22%29%3B%0A%20%20%20%20%2F%2F%20Moved%20around%20its%20parent%20to%20cover%20visible%20view%2E%0A%20%20%20%20d%2Emover%20%3D%20elt%28%22div%22%2C%20%5Belt%28%22div%22%2C%20%5Bd%2ElineSpace%5D%2C%20%22CodeMirror%2Dlines%22%29%5D%2C%20null%2C%20%22position%3A%20relative%22%29%3B%0A%20%20%20%20%2F%2F%20Set%20to%20the%20height%20of%20the%20document%2C%20allowing%20scrolling%2E%0A%20%20%20%20d%2Esizer%20%3D%20elt%28%22div%22%2C%20%5Bd%2Emover%5D%2C%20%22CodeMirror%2Dsizer%22%29%3B%0A%20%20%20%20d%2EsizerWidth%20%3D%20null%3B%0A%20%20%20%20%2F%2F%20Behavior%20of%20elts%20with%20overflow%3A%20auto%20and%20padding%20is%0A%20%20%20%20%2F%2F%20inconsistent%20across%20browsers%2E%20This%20is%20used%20to%20ensure%20the%0A%20%20%20%20%2F%2F%20scrollable%20area%20is%20big%20enough%2E%0A%20%20%20%20d%2EheightForcer%20%3D%20elt%28%22div%22%2C%20null%2C%20null%2C%20%22position%3A%20absolute%3B%20height%3A%20%22%20%2B%20scrollerGap%20%2B%20%22px%3B%20width%3A%201px%3B%22%29%3B%0A%20%20%20%20%2F%2F%20Will%20contain%20the%20gutters%2C%20if%20any%2E%0A%20%20%20%20d%2Egutters%20%3D%20elt%28%22div%22%2C%20null%2C%20%22CodeMirror%2Dgutters%22%29%3B%0A%20%20%20%20d%2ElineGutter%20%3D%20null%3B%0A%20%20%20%20%2F%2F%20Actual%20scrollable%20element%2E%0A%20%20%20%20d%2Escroller%20%3D%20elt%28%22div%22%2C%20%5Bd%2Esizer%2C%20d%2EheightForcer%2C%20d%2Egutters%5D%2C%20%22CodeMirror%2Dscroll%22%29%3B%0A%20%20%20%20d%2Escroller%2EsetAttribute%28%22tabIndex%22%2C%20%22%2D1%22%29%3B%0A%20%20%20%20%2F%2F%20The%20element%20in%20which%20the%20editor%20lives%2E%0A%20%20%20%20d%2Ewrapper%20%3D%20elt%28%22div%22%2C%20%5Bd%2EscrollbarFiller%2C%20d%2EgutterFiller%2C%20d%2Escroller%5D%2C%20%22CodeMirror%22%29%3B%0A%0A%20%20%20%20%2F%2F%20Work%20around%20IE7%20z%2Dindex%20bug%20%28not%20perfect%2C%20hence%20IE7%20not%20really%20being%20supported%29%0A%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%208%29%20%7B%20d%2Egutters%2Estyle%2EzIndex%20%3D%20%2D1%3B%20d%2Escroller%2Estyle%2EpaddingRight%20%3D%200%3B%20%7D%0A%20%20%20%20if%20%28%21webkit%20%26%26%20%21%28gecko%20%26%26%20mobile%29%29%20d%2Escroller%2Edraggable%20%3D%20true%3B%0A%0A%20%20%20%20if%20%28place%29%20%7B%0A%20%20%20%20%20%20if%20%28place%2EappendChild%29%20place%2EappendChild%28d%2Ewrapper%29%3B%0A%20%20%20%20%20%20else%20place%28d%2Ewrapper%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Current%20rendered%20range%20%28may%20be%20bigger%20than%20the%20view%20window%29%2E%0A%20%20%20%20d%2EviewFrom%20%3D%20d%2EviewTo%20%3D%20doc%2Efirst%3B%0A%20%20%20%20d%2EreportedViewFrom%20%3D%20d%2EreportedViewTo%20%3D%20doc%2Efirst%3B%0A%20%20%20%20%2F%2F%20Information%20about%20the%20rendered%20lines%2E%0A%20%20%20%20d%2Eview%20%3D%20%5B%5D%3B%0A%20%20%20%20d%2ErenderedView%20%3D%20null%3B%0A%20%20%20%20%2F%2F%20Holds%20info%20about%20a%20single%20rendered%20line%20when%20it%20was%20rendered%0A%20%20%20%20%2F%2F%20for%20measurement%2C%20while%20not%20in%20view%2E%0A%20%20%20%20d%2EexternalMeasured%20%3D%20null%3B%0A%20%20%20%20%2F%2F%20Empty%20space%20%28in%20pixels%29%20above%20the%20view%0A%20%20%20%20d%2EviewOffset%20%3D%200%3B%0A%20%20%20%20d%2ElastWrapHeight%20%3D%20d%2ElastWrapWidth%20%3D%200%3B%0A%20%20%20%20d%2EupdateLineNumbers%20%3D%20null%3B%0A%0A%20%20%20%20d%2EnativeBarWidth%20%3D%20d%2EbarHeight%20%3D%20d%2EbarWidth%20%3D%200%3B%0A%20%20%20%20d%2EscrollbarsClipped%20%3D%20false%3B%0A%0A%20%20%20%20%2F%2F%20Used%20to%20only%20resize%20the%20line%20number%20gutter%20when%20necessary%20%28when%0A%20%20%20%20%2F%2F%20the%20amount%20of%20lines%20crosses%20a%20boundary%20that%20makes%20its%20width%20change%29%0A%20%20%20%20d%2ElineNumWidth%20%3D%20d%2ElineNumInnerWidth%20%3D%20d%2ElineNumChars%20%3D%20null%3B%0A%20%20%20%20%2F%2F%20Set%20to%20true%20when%20a%20non%2Dhorizontal%2Dscrolling%20line%20widget%20is%0A%20%20%20%20%2F%2F%20added%2E%20As%20an%20optimization%2C%20line%20widget%20aligning%20is%20skipped%20when%0A%20%20%20%20%2F%2F%20this%20is%20false%2E%0A%20%20%20%20d%2EalignWidgets%20%3D%20false%3B%0A%0A%20%20%20%20d%2EcachedCharWidth%20%3D%20d%2EcachedTextHeight%20%3D%20d%2EcachedPaddingH%20%3D%20null%3B%0A%0A%20%20%20%20%2F%2F%20Tracks%20the%20maximum%20line%20length%20so%20that%20the%20horizontal%20scrollbar%0A%20%20%20%20%2F%2F%20can%20be%20kept%20static%20when%20scrolling%2E%0A%20%20%20%20d%2EmaxLine%20%3D%20null%3B%0A%20%20%20%20d%2EmaxLineLength%20%3D%200%3B%0A%20%20%20%20d%2EmaxLineChanged%20%3D%20false%3B%0A%0A%20%20%20%20%2F%2F%20Used%20for%20measuring%20wheel%20scrolling%20granularity%0A%20%20%20%20d%2EwheelDX%20%3D%20d%2EwheelDY%20%3D%20d%2EwheelStartX%20%3D%20d%2EwheelStartY%20%3D%20null%3B%0A%0A%20%20%20%20%2F%2F%20True%20when%20shift%20is%20held%20down%2E%0A%20%20%20%20d%2Eshift%20%3D%20false%3B%0A%0A%20%20%20%20%2F%2F%20Used%20to%20track%20whether%20anything%20happened%20since%20the%20context%20menu%0A%20%20%20%20%2F%2F%20was%20opened%2E%0A%20%20%20%20d%2EselForContextMenu%20%3D%20null%3B%0A%0A%20%20%20%20d%2EactiveTouch%20%3D%20null%3B%0A%0A%20%20%20%20input%2Einit%28d%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20STATE%20UPDATES%0A%0A%20%20%2F%2F%20Used%20to%20get%20the%20editor%20into%20a%20consistent%20state%20again%20when%20options%20change%2E%0A%0A%20%20function%20loadMode%28cm%29%20%7B%0A%20%20%20%20cm%2Edoc%2Emode%20%3D%20CodeMirror%2EgetMode%28cm%2Eoptions%2C%20cm%2Edoc%2EmodeOption%29%3B%0A%20%20%20%20resetModeState%28cm%29%3B%0A%20%20%7D%0A%0A%20%20function%20resetModeState%28cm%29%20%7B%0A%20%20%20%20cm%2Edoc%2Eiter%28function%28line%29%20%7B%0A%20%20%20%20%20%20if%20%28line%2EstateAfter%29%20line%2EstateAfter%20%3D%20null%3B%0A%20%20%20%20%20%20if%20%28line%2Estyles%29%20line%2Estyles%20%3D%20null%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20cm%2Edoc%2Efrontier%20%3D%20cm%2Edoc%2Efirst%3B%0A%20%20%20%20startWorker%28cm%2C%20100%29%3B%0A%20%20%20%20cm%2Estate%2EmodeGen%2B%2B%3B%0A%20%20%20%20if%20%28cm%2EcurOp%29%20regChange%28cm%29%3B%0A%20%20%7D%0A%0A%20%20function%20wrappingChanged%28cm%29%20%7B%0A%20%20%20%20if%20%28cm%2Eoptions%2ElineWrapping%29%20%7B%0A%20%20%20%20%20%20addClass%28cm%2Edisplay%2Ewrapper%2C%20%22CodeMirror%2Dwrap%22%29%3B%0A%20%20%20%20%20%20cm%2Edisplay%2Esizer%2Estyle%2EminWidth%20%3D%20%22%22%3B%0A%20%20%20%20%20%20cm%2Edisplay%2EsizerWidth%20%3D%20null%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20rmClass%28cm%2Edisplay%2Ewrapper%2C%20%22CodeMirror%2Dwrap%22%29%3B%0A%20%20%20%20%20%20findMaxLine%28cm%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20estimateLineHeights%28cm%29%3B%0A%20%20%20%20regChange%28cm%29%3B%0A%20%20%20%20clearCaches%28cm%29%3B%0A%20%20%20%20setTimeout%28function%28%29%7BupdateScrollbars%28cm%29%3B%7D%2C%20100%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Returns%20a%20function%20that%20estimates%20the%20height%20of%20a%20line%2C%20to%20use%20as%0A%20%20%2F%2F%20first%20approximation%20until%20the%20line%20becomes%20visible%20%28and%20is%20thus%0A%20%20%2F%2F%20properly%20measurable%29%2E%0A%20%20function%20estimateHeight%28cm%29%20%7B%0A%20%20%20%20var%20th%20%3D%20textHeight%28cm%2Edisplay%29%2C%20wrapping%20%3D%20cm%2Eoptions%2ElineWrapping%3B%0A%20%20%20%20var%20perLine%20%3D%20wrapping%20%26%26%20Math%2Emax%285%2C%20cm%2Edisplay%2Escroller%2EclientWidth%20%2F%20charWidth%28cm%2Edisplay%29%20%2D%203%29%3B%0A%20%20%20%20return%20function%28line%29%20%7B%0A%20%20%20%20%20%20if%20%28lineIsHidden%28cm%2Edoc%2C%20line%29%29%20return%200%3B%0A%0A%20%20%20%20%20%20var%20widgetsHeight%20%3D%200%3B%0A%20%20%20%20%20%20if%20%28line%2Ewidgets%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20line%2Ewidgets%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28line%2Ewidgets%5Bi%5D%2Eheight%29%20widgetsHeight%20%2B%3D%20line%2Ewidgets%5Bi%5D%2Eheight%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28wrapping%29%0A%20%20%20%20%20%20%20%20return%20widgetsHeight%20%2B%20%28Math%2Eceil%28line%2Etext%2Elength%20%2F%20perLine%29%20%7C%7C%201%29%20%2A%20th%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20return%20widgetsHeight%20%2B%20th%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20function%20estimateLineHeights%28cm%29%20%7B%0A%20%20%20%20var%20doc%20%3D%20cm%2Edoc%2C%20est%20%3D%20estimateHeight%28cm%29%3B%0A%20%20%20%20doc%2Eiter%28function%28line%29%20%7B%0A%20%20%20%20%20%20var%20estHeight%20%3D%20est%28line%29%3B%0A%20%20%20%20%20%20if%20%28estHeight%20%21%3D%20line%2Eheight%29%20updateLineHeight%28line%2C%20estHeight%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%0A%0A%20%20function%20themeChanged%28cm%29%20%7B%0A%20%20%20%20cm%2Edisplay%2Ewrapper%2EclassName%20%3D%20cm%2Edisplay%2Ewrapper%2EclassName%2Ereplace%28%2F%5Cs%2Acm%2Ds%2D%5CS%2B%2Fg%2C%20%22%22%29%20%2B%0A%20%20%20%20%20%20cm%2Eoptions%2Etheme%2Ereplace%28%2F%28%5E%7C%5Cs%29%5Cs%2A%2Fg%2C%20%22%20cm%2Ds%2D%22%29%3B%0A%20%20%20%20clearCaches%28cm%29%3B%0A%20%20%7D%0A%0A%20%20function%20guttersChanged%28cm%29%20%7B%0A%20%20%20%20updateGutters%28cm%29%3B%0A%20%20%20%20regChange%28cm%29%3B%0A%20%20%20%20setTimeout%28function%28%29%7BalignHorizontally%28cm%29%3B%7D%2C%2020%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Rebuild%20the%20gutter%20elements%2C%20ensure%20the%20margin%20to%20the%20left%20of%20the%0A%20%20%2F%2F%20code%20matches%20their%20width%2E%0A%20%20function%20updateGutters%28cm%29%20%7B%0A%20%20%20%20var%20gutters%20%3D%20cm%2Edisplay%2Egutters%2C%20specs%20%3D%20cm%2Eoptions%2Egutters%3B%0A%20%20%20%20removeChildren%28gutters%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20specs%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20gutterClass%20%3D%20specs%5Bi%5D%3B%0A%20%20%20%20%20%20var%20gElt%20%3D%20gutters%2EappendChild%28elt%28%22div%22%2C%20null%2C%20%22CodeMirror%2Dgutter%20%22%20%2B%20gutterClass%29%29%3B%0A%20%20%20%20%20%20if%20%28gutterClass%20%3D%3D%20%22CodeMirror%2Dlinenumbers%22%29%20%7B%0A%20%20%20%20%20%20%20%20cm%2Edisplay%2ElineGutter%20%3D%20gElt%3B%0A%20%20%20%20%20%20%20%20gElt%2Estyle%2Ewidth%20%3D%20%28cm%2Edisplay%2ElineNumWidth%20%7C%7C%201%29%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20gutters%2Estyle%2Edisplay%20%3D%20i%20%3F%20%22%22%20%3A%20%22none%22%3B%0A%20%20%20%20updateGutterSpace%28cm%29%3B%0A%20%20%7D%0A%0A%20%20function%20updateGutterSpace%28cm%29%20%7B%0A%20%20%20%20var%20width%20%3D%20cm%2Edisplay%2Egutters%2EoffsetWidth%3B%0A%20%20%20%20cm%2Edisplay%2Esizer%2Estyle%2EmarginLeft%20%3D%20width%20%2B%20%22px%22%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Compute%20the%20character%20length%20of%20a%20line%2C%20taking%20into%20account%0A%20%20%2F%2F%20collapsed%20ranges%20%28see%20markText%29%20that%20might%20hide%20parts%2C%20and%20join%0A%20%20%2F%2F%20other%20lines%20onto%20it%2E%0A%20%20function%20lineLength%28line%29%20%7B%0A%20%20%20%20if%20%28line%2Eheight%20%3D%3D%200%29%20return%200%3B%0A%20%20%20%20var%20len%20%3D%20line%2Etext%2Elength%2C%20merged%2C%20cur%20%3D%20line%3B%0A%20%20%20%20while%20%28merged%20%3D%20collapsedSpanAtStart%28cur%29%29%20%7B%0A%20%20%20%20%20%20var%20found%20%3D%20merged%2Efind%280%2C%20true%29%3B%0A%20%20%20%20%20%20cur%20%3D%20found%2Efrom%2Eline%3B%0A%20%20%20%20%20%20len%20%2B%3D%20found%2Efrom%2Ech%20%2D%20found%2Eto%2Ech%3B%0A%20%20%20%20%7D%0A%20%20%20%20cur%20%3D%20line%3B%0A%20%20%20%20while%20%28merged%20%3D%20collapsedSpanAtEnd%28cur%29%29%20%7B%0A%20%20%20%20%20%20var%20found%20%3D%20merged%2Efind%280%2C%20true%29%3B%0A%20%20%20%20%20%20len%20%2D%3D%20cur%2Etext%2Elength%20%2D%20found%2Efrom%2Ech%3B%0A%20%20%20%20%20%20cur%20%3D%20found%2Eto%2Eline%3B%0A%20%20%20%20%20%20len%20%2B%3D%20cur%2Etext%2Elength%20%2D%20found%2Eto%2Ech%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20len%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Find%20the%20longest%20line%20in%20the%20document%2E%0A%20%20function%20findMaxLine%28cm%29%20%7B%0A%20%20%20%20var%20d%20%3D%20cm%2Edisplay%2C%20doc%20%3D%20cm%2Edoc%3B%0A%20%20%20%20d%2EmaxLine%20%3D%20getLine%28doc%2C%20doc%2Efirst%29%3B%0A%20%20%20%20d%2EmaxLineLength%20%3D%20lineLength%28d%2EmaxLine%29%3B%0A%20%20%20%20d%2EmaxLineChanged%20%3D%20true%3B%0A%20%20%20%20doc%2Eiter%28function%28line%29%20%7B%0A%20%20%20%20%20%20var%20len%20%3D%20lineLength%28line%29%3B%0A%20%20%20%20%20%20if%20%28len%20%3E%20d%2EmaxLineLength%29%20%7B%0A%20%20%20%20%20%20%20%20d%2EmaxLineLength%20%3D%20len%3B%0A%20%20%20%20%20%20%20%20d%2EmaxLine%20%3D%20line%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Make%20sure%20the%20gutters%20options%20contains%20the%20element%0A%20%20%2F%2F%20%22CodeMirror%2Dlinenumbers%22%20when%20the%20lineNumbers%20option%20is%20true%2E%0A%20%20function%20setGuttersForLineNumbers%28options%29%20%7B%0A%20%20%20%20var%20found%20%3D%20indexOf%28options%2Egutters%2C%20%22CodeMirror%2Dlinenumbers%22%29%3B%0A%20%20%20%20if%20%28found%20%3D%3D%20%2D1%20%26%26%20options%2ElineNumbers%29%20%7B%0A%20%20%20%20%20%20options%2Egutters%20%3D%20options%2Egutters%2Econcat%28%5B%22CodeMirror%2Dlinenumbers%22%5D%29%3B%0A%20%20%20%20%7D%20else%20if%20%28found%20%3E%20%2D1%20%26%26%20%21options%2ElineNumbers%29%20%7B%0A%20%20%20%20%20%20options%2Egutters%20%3D%20options%2Egutters%2Eslice%280%29%3B%0A%20%20%20%20%20%20options%2Egutters%2Esplice%28found%2C%201%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20SCROLLBARS%0A%0A%20%20%2F%2F%20Prepare%20DOM%20reads%20needed%20to%20update%20the%20scrollbars%2E%20Done%20in%20one%0A%20%20%2F%2F%20shot%20to%20minimize%20update%2Fmeasure%20roundtrips%2E%0A%20%20function%20measureForScrollbars%28cm%29%20%7B%0A%20%20%20%20var%20d%20%3D%20cm%2Edisplay%2C%20gutterW%20%3D%20d%2Egutters%2EoffsetWidth%3B%0A%20%20%20%20var%20docH%20%3D%20Math%2Eround%28cm%2Edoc%2Eheight%20%2B%20paddingVert%28cm%2Edisplay%29%29%3B%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20clientHeight%3A%20d%2Escroller%2EclientHeight%2C%0A%20%20%20%20%20%20viewHeight%3A%20d%2Ewrapper%2EclientHeight%2C%0A%20%20%20%20%20%20scrollWidth%3A%20d%2Escroller%2EscrollWidth%2C%20clientWidth%3A%20d%2Escroller%2EclientWidth%2C%0A%20%20%20%20%20%20viewWidth%3A%20d%2Ewrapper%2EclientWidth%2C%0A%20%20%20%20%20%20barLeft%3A%20cm%2Eoptions%2EfixedGutter%20%3F%20gutterW%20%3A%200%2C%0A%20%20%20%20%20%20docHeight%3A%20docH%2C%0A%20%20%20%20%20%20scrollHeight%3A%20docH%20%2B%20scrollGap%28cm%29%20%2B%20d%2EbarHeight%2C%0A%20%20%20%20%20%20nativeBarWidth%3A%20d%2EnativeBarWidth%2C%0A%20%20%20%20%20%20gutterWidth%3A%20gutterW%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20function%20NativeScrollbars%28place%2C%20scroll%2C%20cm%29%20%7B%0A%20%20%20%20this%2Ecm%20%3D%20cm%3B%0A%20%20%20%20var%20vert%20%3D%20this%2Evert%20%3D%20elt%28%22div%22%2C%20%5Belt%28%22div%22%2C%20null%2C%20null%2C%20%22min%2Dwidth%3A%201px%22%29%5D%2C%20%22CodeMirror%2Dvscrollbar%22%29%3B%0A%20%20%20%20var%20horiz%20%3D%20this%2Ehoriz%20%3D%20elt%28%22div%22%2C%20%5Belt%28%22div%22%2C%20null%2C%20null%2C%20%22height%3A%20100%25%3B%20min%2Dheight%3A%201px%22%29%5D%2C%20%22CodeMirror%2Dhscrollbar%22%29%3B%0A%20%20%20%20place%28vert%29%3B%20place%28horiz%29%3B%0A%0A%20%20%20%20on%28vert%2C%20%22scroll%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28vert%2EclientHeight%29%20scroll%28vert%2EscrollTop%2C%20%22vertical%22%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20on%28horiz%2C%20%22scroll%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28horiz%2EclientWidth%29%20scroll%28horiz%2EscrollLeft%2C%20%22horizontal%22%29%3B%0A%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20this%2EcheckedZeroWidth%20%3D%20false%3B%0A%20%20%20%20%2F%2F%20Need%20to%20set%20a%20minimum%20width%20to%20see%20the%20scrollbar%20on%20IE7%20%28but%20must%20not%20set%20it%20on%20IE8%29%2E%0A%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%208%29%20this%2Ehoriz%2Estyle%2EminHeight%20%3D%20this%2Evert%2Estyle%2EminWidth%20%3D%20%2218px%22%3B%0A%20%20%7D%0A%0A%20%20NativeScrollbars%2Eprototype%20%3D%20copyObj%28%7B%0A%20%20%20%20update%3A%20function%28measure%29%20%7B%0A%20%20%20%20%20%20var%20needsH%20%3D%20measure%2EscrollWidth%20%3E%20measure%2EclientWidth%20%2B%201%3B%0A%20%20%20%20%20%20var%20needsV%20%3D%20measure%2EscrollHeight%20%3E%20measure%2EclientHeight%20%2B%201%3B%0A%20%20%20%20%20%20var%20sWidth%20%3D%20measure%2EnativeBarWidth%3B%0A%0A%20%20%20%20%20%20if%20%28needsV%29%20%7B%0A%20%20%20%20%20%20%20%20this%2Evert%2Estyle%2Edisplay%20%3D%20%22block%22%3B%0A%20%20%20%20%20%20%20%20this%2Evert%2Estyle%2Ebottom%20%3D%20needsH%20%3F%20sWidth%20%2B%20%22px%22%20%3A%20%220%22%3B%0A%20%20%20%20%20%20%20%20var%20totalHeight%20%3D%20measure%2EviewHeight%20%2D%20%28needsH%20%3F%20sWidth%20%3A%200%29%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20A%20bug%20in%20IE8%20can%20cause%20this%20value%20to%20be%20negative%2C%20so%20guard%20it%2E%0A%20%20%20%20%20%20%20%20this%2Evert%2EfirstChild%2Estyle%2Eheight%20%3D%0A%20%20%20%20%20%20%20%20%20%20Math%2Emax%280%2C%20measure%2EscrollHeight%20%2D%20measure%2EclientHeight%20%2B%20totalHeight%29%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20this%2Evert%2Estyle%2Edisplay%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20this%2Evert%2EfirstChild%2Estyle%2Eheight%20%3D%20%220%22%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28needsH%29%20%7B%0A%20%20%20%20%20%20%20%20this%2Ehoriz%2Estyle%2Edisplay%20%3D%20%22block%22%3B%0A%20%20%20%20%20%20%20%20this%2Ehoriz%2Estyle%2Eright%20%3D%20needsV%20%3F%20sWidth%20%2B%20%22px%22%20%3A%20%220%22%3B%0A%20%20%20%20%20%20%20%20this%2Ehoriz%2Estyle%2Eleft%20%3D%20measure%2EbarLeft%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%20%20var%20totalWidth%20%3D%20measure%2EviewWidth%20%2D%20measure%2EbarLeft%20%2D%20%28needsV%20%3F%20sWidth%20%3A%200%29%3B%0A%20%20%20%20%20%20%20%20this%2Ehoriz%2EfirstChild%2Estyle%2Ewidth%20%3D%0A%20%20%20%20%20%20%20%20%20%20%28measure%2EscrollWidth%20%2D%20measure%2EclientWidth%20%2B%20totalWidth%29%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20this%2Ehoriz%2Estyle%2Edisplay%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20this%2Ehoriz%2EfirstChild%2Estyle%2Ewidth%20%3D%20%220%22%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28%21this%2EcheckedZeroWidth%20%26%26%20measure%2EclientHeight%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28sWidth%20%3D%3D%200%29%20this%2EzeroWidthHack%28%29%3B%0A%20%20%20%20%20%20%20%20this%2EcheckedZeroWidth%20%3D%20true%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20return%20%7Bright%3A%20needsV%20%3F%20sWidth%20%3A%200%2C%20bottom%3A%20needsH%20%3F%20sWidth%20%3A%200%7D%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20setScrollLeft%3A%20function%28pos%29%20%7B%0A%20%20%20%20%20%20if%20%28this%2Ehoriz%2EscrollLeft%20%21%3D%20pos%29%20this%2Ehoriz%2EscrollLeft%20%3D%20pos%3B%0A%20%20%20%20%20%20if%20%28this%2EdisableHoriz%29%20this%2EenableZeroWidthBar%28this%2Ehoriz%2C%20this%2EdisableHoriz%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20setScrollTop%3A%20function%28pos%29%20%7B%0A%20%20%20%20%20%20if%20%28this%2Evert%2EscrollTop%20%21%3D%20pos%29%20this%2Evert%2EscrollTop%20%3D%20pos%3B%0A%20%20%20%20%20%20if%20%28this%2EdisableVert%29%20this%2EenableZeroWidthBar%28this%2Evert%2C%20this%2EdisableVert%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20zeroWidthHack%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20w%20%3D%20mac%20%26%26%20%21mac%5FgeMountainLion%20%3F%20%2212px%22%20%3A%20%2218px%22%3B%0A%20%20%20%20%20%20this%2Ehoriz%2Estyle%2Eheight%20%3D%20this%2Evert%2Estyle%2Ewidth%20%3D%20w%3B%0A%20%20%20%20%20%20this%2Ehoriz%2Estyle%2EpointerEvents%20%3D%20this%2Evert%2Estyle%2EpointerEvents%20%3D%20%22none%22%3B%0A%20%20%20%20%20%20this%2EdisableHoriz%20%3D%20new%20Delayed%3B%0A%20%20%20%20%20%20this%2EdisableVert%20%3D%20new%20Delayed%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20enableZeroWidthBar%3A%20function%28bar%2C%20delay%29%20%7B%0A%20%20%20%20%20%20bar%2Estyle%2EpointerEvents%20%3D%20%22auto%22%3B%0A%20%20%20%20%20%20function%20maybeDisable%28%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20To%20find%20out%20whether%20the%20scrollbar%20is%20still%20visible%2C%20we%0A%20%20%20%20%20%20%20%20%2F%2F%20check%20whether%20the%20element%20under%20the%20pixel%20in%20the%20bottom%0A%20%20%20%20%20%20%20%20%2F%2F%20left%20corner%20of%20the%20scrollbar%20box%20is%20the%20scrollbar%20box%0A%20%20%20%20%20%20%20%20%2F%2F%20itself%20%28when%20the%20bar%20is%20still%20visible%29%20or%20its%20filler%20child%0A%20%20%20%20%20%20%20%20%2F%2F%20%28when%20the%20bar%20is%20hidden%29%2E%20If%20it%20is%20still%20visible%2C%20we%20keep%0A%20%20%20%20%20%20%20%20%2F%2F%20it%20enabled%2C%20if%20it%27s%20hidden%2C%20we%20disable%20pointer%20events%2E%0A%20%20%20%20%20%20%20%20var%20box%20%3D%20bar%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20%20%20%20%20var%20elt%20%3D%20document%2EelementFromPoint%28box%2Eleft%20%2B%201%2C%20box%2Ebottom%20%2D%201%29%3B%0A%20%20%20%20%20%20%20%20if%20%28elt%20%21%3D%20bar%29%20bar%2Estyle%2EpointerEvents%20%3D%20%22none%22%3B%0A%20%20%20%20%20%20%20%20else%20delay%2Eset%281000%2C%20maybeDisable%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20delay%2Eset%281000%2C%20maybeDisable%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20clear%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20parent%20%3D%20this%2Ehoriz%2EparentNode%3B%0A%20%20%20%20%20%20parent%2EremoveChild%28this%2Ehoriz%29%3B%0A%20%20%20%20%20%20parent%2EremoveChild%28this%2Evert%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%20NativeScrollbars%2Eprototype%29%3B%0A%0A%20%20function%20NullScrollbars%28%29%20%7B%7D%0A%0A%20%20NullScrollbars%2Eprototype%20%3D%20copyObj%28%7B%0A%20%20%20%20update%3A%20function%28%29%20%7B%20return%20%7Bbottom%3A%200%2C%20right%3A%200%7D%3B%20%7D%2C%0A%20%20%20%20setScrollLeft%3A%20function%28%29%20%7B%7D%2C%0A%20%20%20%20setScrollTop%3A%20function%28%29%20%7B%7D%2C%0A%20%20%20%20clear%3A%20function%28%29%20%7B%7D%0A%20%20%7D%2C%20NullScrollbars%2Eprototype%29%3B%0A%0A%20%20CodeMirror%2EscrollbarModel%20%3D%20%7B%22native%22%3A%20NativeScrollbars%2C%20%22null%22%3A%20NullScrollbars%7D%3B%0A%0A%20%20function%20initScrollbars%28cm%29%20%7B%0A%20%20%20%20if%20%28cm%2Edisplay%2Escrollbars%29%20%7B%0A%20%20%20%20%20%20cm%2Edisplay%2Escrollbars%2Eclear%28%29%3B%0A%20%20%20%20%20%20if%20%28cm%2Edisplay%2Escrollbars%2EaddClass%29%0A%20%20%20%20%20%20%20%20rmClass%28cm%2Edisplay%2Ewrapper%2C%20cm%2Edisplay%2Escrollbars%2EaddClass%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20cm%2Edisplay%2Escrollbars%20%3D%20new%20CodeMirror%2EscrollbarModel%5Bcm%2Eoptions%2EscrollbarStyle%5D%28function%28node%29%20%7B%0A%20%20%20%20%20%20cm%2Edisplay%2Ewrapper%2EinsertBefore%28node%2C%20cm%2Edisplay%2EscrollbarFiller%29%3B%0A%20%20%20%20%20%20%2F%2F%20Prevent%20clicks%20in%20the%20scrollbars%20from%20killing%20focus%0A%20%20%20%20%20%20on%28node%2C%20%22mousedown%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28cm%2Estate%2Efocused%29%20setTimeout%28function%28%29%20%7B%20cm%2Edisplay%2Einput%2Efocus%28%29%3B%20%7D%2C%200%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20node%2EsetAttribute%28%22cm%2Dnot%2Dcontent%22%2C%20%22true%22%29%3B%0A%20%20%20%20%7D%2C%20function%28pos%2C%20axis%29%20%7B%0A%20%20%20%20%20%20if%20%28axis%20%3D%3D%20%22horizontal%22%29%20setScrollLeft%28cm%2C%20pos%29%3B%0A%20%20%20%20%20%20else%20setScrollTop%28cm%2C%20pos%29%3B%0A%20%20%20%20%7D%2C%20cm%29%3B%0A%20%20%20%20if%20%28cm%2Edisplay%2Escrollbars%2EaddClass%29%0A%20%20%20%20%20%20addClass%28cm%2Edisplay%2Ewrapper%2C%20cm%2Edisplay%2Escrollbars%2EaddClass%29%3B%0A%20%20%7D%0A%0A%20%20function%20updateScrollbars%28cm%2C%20measure%29%20%7B%0A%20%20%20%20if%20%28%21measure%29%20measure%20%3D%20measureForScrollbars%28cm%29%3B%0A%20%20%20%20var%20startWidth%20%3D%20cm%2Edisplay%2EbarWidth%2C%20startHeight%20%3D%20cm%2Edisplay%2EbarHeight%3B%0A%20%20%20%20updateScrollbarsInner%28cm%2C%20measure%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%204%20%26%26%20startWidth%20%21%3D%20cm%2Edisplay%2EbarWidth%20%7C%7C%20startHeight%20%21%3D%20cm%2Edisplay%2EbarHeight%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20if%20%28startWidth%20%21%3D%20cm%2Edisplay%2EbarWidth%20%26%26%20cm%2Eoptions%2ElineWrapping%29%0A%20%20%20%20%20%20%20%20updateHeightsInViewport%28cm%29%3B%0A%20%20%20%20%20%20updateScrollbarsInner%28cm%2C%20measureForScrollbars%28cm%29%29%3B%0A%20%20%20%20%20%20startWidth%20%3D%20cm%2Edisplay%2EbarWidth%3B%20startHeight%20%3D%20cm%2Edisplay%2EbarHeight%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Re%2Dsynchronize%20the%20fake%20scrollbars%20with%20the%20actual%20size%20of%20the%0A%20%20%2F%2F%20content%2E%0A%20%20function%20updateScrollbarsInner%28cm%2C%20measure%29%20%7B%0A%20%20%20%20var%20d%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20var%20sizes%20%3D%20d%2Escrollbars%2Eupdate%28measure%29%3B%0A%0A%20%20%20%20d%2Esizer%2Estyle%2EpaddingRight%20%3D%20%28d%2EbarWidth%20%3D%20sizes%2Eright%29%20%2B%20%22px%22%3B%0A%20%20%20%20d%2Esizer%2Estyle%2EpaddingBottom%20%3D%20%28d%2EbarHeight%20%3D%20sizes%2Ebottom%29%20%2B%20%22px%22%3B%0A%0A%20%20%20%20if%20%28sizes%2Eright%20%26%26%20sizes%2Ebottom%29%20%7B%0A%20%20%20%20%20%20d%2EscrollbarFiller%2Estyle%2Edisplay%20%3D%20%22block%22%3B%0A%20%20%20%20%20%20d%2EscrollbarFiller%2Estyle%2Eheight%20%3D%20sizes%2Ebottom%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20d%2EscrollbarFiller%2Estyle%2Ewidth%20%3D%20sizes%2Eright%20%2B%20%22px%22%3B%0A%20%20%20%20%7D%20else%20d%2EscrollbarFiller%2Estyle%2Edisplay%20%3D%20%22%22%3B%0A%20%20%20%20if%20%28sizes%2Ebottom%20%26%26%20cm%2Eoptions%2EcoverGutterNextToScrollbar%20%26%26%20cm%2Eoptions%2EfixedGutter%29%20%7B%0A%20%20%20%20%20%20d%2EgutterFiller%2Estyle%2Edisplay%20%3D%20%22block%22%3B%0A%20%20%20%20%20%20d%2EgutterFiller%2Estyle%2Eheight%20%3D%20sizes%2Ebottom%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20d%2EgutterFiller%2Estyle%2Ewidth%20%3D%20measure%2EgutterWidth%20%2B%20%22px%22%3B%0A%20%20%20%20%7D%20else%20d%2EgutterFiller%2Estyle%2Edisplay%20%3D%20%22%22%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Compute%20the%20lines%20that%20are%20visible%20in%20a%20given%20viewport%20%28defaults%0A%20%20%2F%2F%20the%20the%20current%20scroll%20position%29%2E%20viewport%20may%20contain%20top%2C%0A%20%20%2F%2F%20height%2C%20and%20ensure%20%28see%20op%2EscrollToPos%29%20properties%2E%0A%20%20function%20visibleLines%28display%2C%20doc%2C%20viewport%29%20%7B%0A%20%20%20%20var%20top%20%3D%20viewport%20%26%26%20viewport%2Etop%20%21%3D%20null%20%3F%20Math%2Emax%280%2C%20viewport%2Etop%29%20%3A%20display%2Escroller%2EscrollTop%3B%0A%20%20%20%20top%20%3D%20Math%2Efloor%28top%20%2D%20paddingTop%28display%29%29%3B%0A%20%20%20%20var%20bottom%20%3D%20viewport%20%26%26%20viewport%2Ebottom%20%21%3D%20null%20%3F%20viewport%2Ebottom%20%3A%20top%20%2B%20display%2Ewrapper%2EclientHeight%3B%0A%0A%20%20%20%20var%20from%20%3D%20lineAtHeight%28doc%2C%20top%29%2C%20to%20%3D%20lineAtHeight%28doc%2C%20bottom%29%3B%0A%20%20%20%20%2F%2F%20Ensure%20is%20a%20%7Bfrom%3A%20%7Bline%2C%20ch%7D%2C%20to%3A%20%7Bline%2C%20ch%7D%7D%20object%2C%20and%0A%20%20%20%20%2F%2F%20forces%20those%20lines%20into%20the%20viewport%20%28if%20possible%29%2E%0A%20%20%20%20if%20%28viewport%20%26%26%20viewport%2Eensure%29%20%7B%0A%20%20%20%20%20%20var%20ensureFrom%20%3D%20viewport%2Eensure%2Efrom%2Eline%2C%20ensureTo%20%3D%20viewport%2Eensure%2Eto%2Eline%3B%0A%20%20%20%20%20%20if%20%28ensureFrom%20%3C%20from%29%20%7B%0A%20%20%20%20%20%20%20%20from%20%3D%20ensureFrom%3B%0A%20%20%20%20%20%20%20%20to%20%3D%20lineAtHeight%28doc%2C%20heightAtLine%28getLine%28doc%2C%20ensureFrom%29%29%20%2B%20display%2Ewrapper%2EclientHeight%29%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28Math%2Emin%28ensureTo%2C%20doc%2ElastLine%28%29%29%20%3E%3D%20to%29%20%7B%0A%20%20%20%20%20%20%20%20from%20%3D%20lineAtHeight%28doc%2C%20heightAtLine%28getLine%28doc%2C%20ensureTo%29%29%20%2D%20display%2Ewrapper%2EclientHeight%29%3B%0A%20%20%20%20%20%20%20%20to%20%3D%20ensureTo%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20%7Bfrom%3A%20from%2C%20to%3A%20Math%2Emax%28to%2C%20from%20%2B%201%29%7D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20LINE%20NUMBERS%0A%0A%20%20%2F%2F%20Re%2Dalign%20line%20numbers%20and%20gutter%20marks%20to%20compensate%20for%0A%20%20%2F%2F%20horizontal%20scrolling%2E%0A%20%20function%20alignHorizontally%28cm%29%20%7B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%2C%20view%20%3D%20display%2Eview%3B%0A%20%20%20%20if%20%28%21display%2EalignWidgets%20%26%26%20%28%21display%2Egutters%2EfirstChild%20%7C%7C%20%21cm%2Eoptions%2EfixedGutter%29%29%20return%3B%0A%20%20%20%20var%20comp%20%3D%20compensateForHScroll%28display%29%20%2D%20display%2Escroller%2EscrollLeft%20%2B%20cm%2Edoc%2EscrollLeft%3B%0A%20%20%20%20var%20gutterW%20%3D%20display%2Egutters%2EoffsetWidth%2C%20left%20%3D%20comp%20%2B%20%22px%22%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20view%2Elength%3B%20i%2B%2B%29%20if%20%28%21view%5Bi%5D%2Ehidden%29%20%7B%0A%20%20%20%20%20%20if%20%28cm%2Eoptions%2EfixedGutter%20%26%26%20view%5Bi%5D%2Egutter%29%0A%20%20%20%20%20%20%20%20view%5Bi%5D%2Egutter%2Estyle%2Eleft%20%3D%20left%3B%0A%20%20%20%20%20%20var%20align%20%3D%20view%5Bi%5D%2Ealignable%3B%0A%20%20%20%20%20%20if%20%28align%29%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20align%2Elength%3B%20j%2B%2B%29%0A%20%20%20%20%20%20%20%20align%5Bj%5D%2Estyle%2Eleft%20%3D%20left%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28cm%2Eoptions%2EfixedGutter%29%0A%20%20%20%20%20%20display%2Egutters%2Estyle%2Eleft%20%3D%20%28comp%20%2B%20gutterW%29%20%2B%20%22px%22%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Used%20to%20ensure%20that%20the%20line%20number%20gutter%20is%20still%20the%20right%0A%20%20%2F%2F%20size%20for%20the%20current%20document%20size%2E%20Returns%20true%20when%20an%20update%0A%20%20%2F%2F%20is%20needed%2E%0A%20%20function%20maybeUpdateLineNumberWidth%28cm%29%20%7B%0A%20%20%20%20if%20%28%21cm%2Eoptions%2ElineNumbers%29%20return%20false%3B%0A%20%20%20%20var%20doc%20%3D%20cm%2Edoc%2C%20last%20%3D%20lineNumberFor%28cm%2Eoptions%2C%20doc%2Efirst%20%2B%20doc%2Esize%20%2D%201%29%2C%20display%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20if%20%28last%2Elength%20%21%3D%20display%2ElineNumChars%29%20%7B%0A%20%20%20%20%20%20var%20test%20%3D%20display%2Emeasure%2EappendChild%28elt%28%22div%22%2C%20%5Belt%28%22div%22%2C%20last%29%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22CodeMirror%2Dlinenumber%20CodeMirror%2Dgutter%2Delt%22%29%29%3B%0A%20%20%20%20%20%20var%20innerW%20%3D%20test%2EfirstChild%2EoffsetWidth%2C%20padding%20%3D%20test%2EoffsetWidth%20%2D%20innerW%3B%0A%20%20%20%20%20%20display%2ElineGutter%2Estyle%2Ewidth%20%3D%20%22%22%3B%0A%20%20%20%20%20%20display%2ElineNumInnerWidth%20%3D%20Math%2Emax%28innerW%2C%20display%2ElineGutter%2EoffsetWidth%20%2D%20padding%29%20%2B%201%3B%0A%20%20%20%20%20%20display%2ElineNumWidth%20%3D%20display%2ElineNumInnerWidth%20%2B%20padding%3B%0A%20%20%20%20%20%20display%2ElineNumChars%20%3D%20display%2ElineNumInnerWidth%20%3F%20last%2Elength%20%3A%20%2D1%3B%0A%20%20%20%20%20%20display%2ElineGutter%2Estyle%2Ewidth%20%3D%20display%2ElineNumWidth%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20updateGutterSpace%28cm%29%3B%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20false%3B%0A%20%20%7D%0A%0A%20%20function%20lineNumberFor%28options%2C%20i%29%20%7B%0A%20%20%20%20return%20String%28options%2ElineNumberFormatter%28i%20%2B%20options%2EfirstLineNumber%29%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Computes%20display%2Escroller%2EscrollLeft%20%2B%20display%2Egutters%2EoffsetWidth%2C%0A%20%20%2F%2F%20but%20using%20getBoundingClientRect%20to%20get%20a%20sub%2Dpixel%2Daccurate%0A%20%20%2F%2F%20result%2E%0A%20%20function%20compensateForHScroll%28display%29%20%7B%0A%20%20%20%20return%20display%2Escroller%2EgetBoundingClientRect%28%29%2Eleft%20%2D%20display%2Esizer%2EgetBoundingClientRect%28%29%2Eleft%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20DISPLAY%20DRAWING%0A%0A%20%20function%20DisplayUpdate%28cm%2C%20viewport%2C%20force%29%20%7B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%3B%0A%0A%20%20%20%20this%2Eviewport%20%3D%20viewport%3B%0A%20%20%20%20%2F%2F%20Store%20some%20values%20that%20we%27ll%20need%20later%20%28but%20don%27t%20want%20to%20force%20a%20relayout%20for%29%0A%20%20%20%20this%2Evisible%20%3D%20visibleLines%28display%2C%20cm%2Edoc%2C%20viewport%29%3B%0A%20%20%20%20this%2EeditorIsHidden%20%3D%20%21display%2Ewrapper%2EoffsetWidth%3B%0A%20%20%20%20this%2EwrapperHeight%20%3D%20display%2Ewrapper%2EclientHeight%3B%0A%20%20%20%20this%2EwrapperWidth%20%3D%20display%2Ewrapper%2EclientWidth%3B%0A%20%20%20%20this%2EoldDisplayWidth%20%3D%20displayWidth%28cm%29%3B%0A%20%20%20%20this%2Eforce%20%3D%20force%3B%0A%20%20%20%20this%2Edims%20%3D%20getDimensions%28cm%29%3B%0A%20%20%20%20this%2Eevents%20%3D%20%5B%5D%3B%0A%20%20%7D%0A%0A%20%20DisplayUpdate%2Eprototype%2Esignal%20%3D%20function%28emitter%2C%20type%29%20%7B%0A%20%20%20%20if%20%28hasHandler%28emitter%2C%20type%29%29%0A%20%20%20%20%20%20this%2Eevents%2Epush%28arguments%29%3B%0A%20%20%7D%3B%0A%20%20DisplayUpdate%2Eprototype%2Efinish%20%3D%20function%28%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Eevents%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20signal%2Eapply%28null%2C%20this%2Eevents%5Bi%5D%29%3B%0A%20%20%7D%3B%0A%0A%20%20function%20maybeClipScrollbars%28cm%29%20%7B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20if%20%28%21display%2EscrollbarsClipped%20%26%26%20display%2Escroller%2EoffsetWidth%29%20%7B%0A%20%20%20%20%20%20display%2EnativeBarWidth%20%3D%20display%2Escroller%2EoffsetWidth%20%2D%20display%2Escroller%2EclientWidth%3B%0A%20%20%20%20%20%20display%2EheightForcer%2Estyle%2Eheight%20%3D%20scrollGap%28cm%29%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20display%2Esizer%2Estyle%2EmarginBottom%20%3D%20%2Ddisplay%2EnativeBarWidth%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20display%2Esizer%2Estyle%2EborderRightWidth%20%3D%20scrollGap%28cm%29%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20display%2EscrollbarsClipped%20%3D%20true%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Does%20the%20actual%20updating%20of%20the%20line%20display%2E%20Bails%20out%0A%20%20%2F%2F%20%28returning%20false%29%20when%20there%20is%20nothing%20to%20be%20done%20and%20forced%20is%0A%20%20%2F%2F%20false%2E%0A%20%20function%20updateDisplayIfNeeded%28cm%2C%20update%29%20%7B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%2C%20doc%20%3D%20cm%2Edoc%3B%0A%0A%20%20%20%20if%20%28update%2EeditorIsHidden%29%20%7B%0A%20%20%20%20%20%20resetView%28cm%29%3B%0A%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Bail%20out%20if%20the%20visible%20area%20is%20already%20rendered%20and%20nothing%20changed%2E%0A%20%20%20%20if%20%28%21update%2Eforce%20%26%26%0A%20%20%20%20%20%20%20%20update%2Evisible%2Efrom%20%3E%3D%20display%2EviewFrom%20%26%26%20update%2Evisible%2Eto%20%3C%3D%20display%2EviewTo%20%26%26%0A%20%20%20%20%20%20%20%20%28display%2EupdateLineNumbers%20%3D%3D%20null%20%7C%7C%20display%2EupdateLineNumbers%20%3E%3D%20display%2EviewTo%29%20%26%26%0A%20%20%20%20%20%20%20%20display%2ErenderedView%20%3D%3D%20display%2Eview%20%26%26%20countDirtyView%28cm%29%20%3D%3D%200%29%0A%20%20%20%20%20%20return%20false%3B%0A%0A%20%20%20%20if%20%28maybeUpdateLineNumberWidth%28cm%29%29%20%7B%0A%20%20%20%20%20%20resetView%28cm%29%3B%0A%20%20%20%20%20%20update%2Edims%20%3D%20getDimensions%28cm%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Compute%20a%20suitable%20new%20viewport%20%28from%20%26%20to%29%0A%20%20%20%20var%20end%20%3D%20doc%2Efirst%20%2B%20doc%2Esize%3B%0A%20%20%20%20var%20from%20%3D%20Math%2Emax%28update%2Evisible%2Efrom%20%2D%20cm%2Eoptions%2EviewportMargin%2C%20doc%2Efirst%29%3B%0A%20%20%20%20var%20to%20%3D%20Math%2Emin%28end%2C%20update%2Evisible%2Eto%20%2B%20cm%2Eoptions%2EviewportMargin%29%3B%0A%20%20%20%20if%20%28display%2EviewFrom%20%3C%20from%20%26%26%20from%20%2D%20display%2EviewFrom%20%3C%2020%29%20from%20%3D%20Math%2Emax%28doc%2Efirst%2C%20display%2EviewFrom%29%3B%0A%20%20%20%20if%20%28display%2EviewTo%20%3E%20to%20%26%26%20display%2EviewTo%20%2D%20to%20%3C%2020%29%20to%20%3D%20Math%2Emin%28end%2C%20display%2EviewTo%29%3B%0A%20%20%20%20if%20%28sawCollapsedSpans%29%20%7B%0A%20%20%20%20%20%20from%20%3D%20visualLineNo%28cm%2Edoc%2C%20from%29%3B%0A%20%20%20%20%20%20to%20%3D%20visualLineEndNo%28cm%2Edoc%2C%20to%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20different%20%3D%20from%20%21%3D%20display%2EviewFrom%20%7C%7C%20to%20%21%3D%20display%2EviewTo%20%7C%7C%0A%20%20%20%20%20%20display%2ElastWrapHeight%20%21%3D%20update%2EwrapperHeight%20%7C%7C%20display%2ElastWrapWidth%20%21%3D%20update%2EwrapperWidth%3B%0A%20%20%20%20adjustView%28cm%2C%20from%2C%20to%29%3B%0A%0A%20%20%20%20display%2EviewOffset%20%3D%20heightAtLine%28getLine%28cm%2Edoc%2C%20display%2EviewFrom%29%29%3B%0A%20%20%20%20%2F%2F%20Position%20the%20mover%20div%20to%20align%20with%20the%20current%20scroll%20position%0A%20%20%20%20cm%2Edisplay%2Emover%2Estyle%2Etop%20%3D%20display%2EviewOffset%20%2B%20%22px%22%3B%0A%0A%20%20%20%20var%20toUpdate%20%3D%20countDirtyView%28cm%29%3B%0A%20%20%20%20if%20%28%21different%20%26%26%20toUpdate%20%3D%3D%200%20%26%26%20%21update%2Eforce%20%26%26%20display%2ErenderedView%20%3D%3D%20display%2Eview%20%26%26%0A%20%20%20%20%20%20%20%20%28display%2EupdateLineNumbers%20%3D%3D%20null%20%7C%7C%20display%2EupdateLineNumbers%20%3E%3D%20display%2EviewTo%29%29%0A%20%20%20%20%20%20return%20false%3B%0A%0A%20%20%20%20%2F%2F%20For%20big%20changes%2C%20we%20hide%20the%20enclosing%20element%20during%20the%0A%20%20%20%20%2F%2F%20update%2C%20since%20that%20speeds%20up%20the%20operations%20on%20most%20browsers%2E%0A%20%20%20%20var%20focused%20%3D%20activeElt%28%29%3B%0A%20%20%20%20if%20%28toUpdate%20%3E%204%29%20display%2ElineDiv%2Estyle%2Edisplay%20%3D%20%22none%22%3B%0A%20%20%20%20patchDisplay%28cm%2C%20display%2EupdateLineNumbers%2C%20update%2Edims%29%3B%0A%20%20%20%20if%20%28toUpdate%20%3E%204%29%20display%2ElineDiv%2Estyle%2Edisplay%20%3D%20%22%22%3B%0A%20%20%20%20display%2ErenderedView%20%3D%20display%2Eview%3B%0A%20%20%20%20%2F%2F%20There%20might%20have%20been%20a%20widget%20with%20a%20focused%20element%20that%20got%0A%20%20%20%20%2F%2F%20hidden%20or%20updated%2C%20if%20so%20re%2Dfocus%20it%2E%0A%20%20%20%20if%20%28focused%20%26%26%20activeElt%28%29%20%21%3D%20focused%20%26%26%20focused%2EoffsetHeight%29%20focused%2Efocus%28%29%3B%0A%0A%20%20%20%20%2F%2F%20Prevent%20selection%20and%20cursors%20from%20interfering%20with%20the%20scroll%0A%20%20%20%20%2F%2F%20width%20and%20height%2E%0A%20%20%20%20removeChildren%28display%2EcursorDiv%29%3B%0A%20%20%20%20removeChildren%28display%2EselectionDiv%29%3B%0A%20%20%20%20display%2Egutters%2Estyle%2Eheight%20%3D%20display%2Esizer%2Estyle%2EminHeight%20%3D%200%3B%0A%0A%20%20%20%20if%20%28different%29%20%7B%0A%20%20%20%20%20%20display%2ElastWrapHeight%20%3D%20update%2EwrapperHeight%3B%0A%20%20%20%20%20%20display%2ElastWrapWidth%20%3D%20update%2EwrapperWidth%3B%0A%20%20%20%20%20%20startWorker%28cm%2C%20400%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20display%2EupdateLineNumbers%20%3D%20null%3B%0A%0A%20%20%20%20return%20true%3B%0A%20%20%7D%0A%0A%20%20function%20postUpdateDisplay%28cm%2C%20update%29%20%7B%0A%20%20%20%20var%20viewport%20%3D%20update%2Eviewport%3B%0A%20%20%20%20for%20%28var%20first%20%3D%20true%3B%3B%20first%20%3D%20false%29%20%7B%0A%20%20%20%20%20%20if%20%28%21first%20%7C%7C%20%21cm%2Eoptions%2ElineWrapping%20%7C%7C%20update%2EoldDisplayWidth%20%3D%3D%20displayWidth%28cm%29%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Clip%20forced%20viewport%20to%20actual%20scrollable%20area%2E%0A%20%20%20%20%20%20%20%20if%20%28viewport%20%26%26%20viewport%2Etop%20%21%3D%20null%29%0A%20%20%20%20%20%20%20%20%20%20viewport%20%3D%20%7Btop%3A%20Math%2Emin%28cm%2Edoc%2Eheight%20%2B%20paddingVert%28cm%2Edisplay%29%20%2D%20displayHeight%28cm%29%2C%20viewport%2Etop%29%7D%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20Updated%20line%20heights%20might%20result%20in%20the%20drawn%20area%20not%0A%20%20%20%20%20%20%20%20%2F%2F%20actually%20covering%20the%20viewport%2E%20Keep%20looping%20until%20it%20does%2E%0A%20%20%20%20%20%20%20%20update%2Evisible%20%3D%20visibleLines%28cm%2Edisplay%2C%20cm%2Edoc%2C%20viewport%29%3B%0A%20%20%20%20%20%20%20%20if%20%28update%2Evisible%2Efrom%20%3E%3D%20cm%2Edisplay%2EviewFrom%20%26%26%20update%2Evisible%2Eto%20%3C%3D%20cm%2Edisplay%2EviewTo%29%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28%21updateDisplayIfNeeded%28cm%2C%20update%29%29%20break%3B%0A%20%20%20%20%20%20updateHeightsInViewport%28cm%29%3B%0A%20%20%20%20%20%20var%20barMeasure%20%3D%20measureForScrollbars%28cm%29%3B%0A%20%20%20%20%20%20updateSelection%28cm%29%3B%0A%20%20%20%20%20%20setDocumentHeight%28cm%2C%20barMeasure%29%3B%0A%20%20%20%20%20%20updateScrollbars%28cm%2C%20barMeasure%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20update%2Esignal%28cm%2C%20%22update%22%2C%20cm%29%3B%0A%20%20%20%20if%20%28cm%2Edisplay%2EviewFrom%20%21%3D%20cm%2Edisplay%2EreportedViewFrom%20%7C%7C%20cm%2Edisplay%2EviewTo%20%21%3D%20cm%2Edisplay%2EreportedViewTo%29%20%7B%0A%20%20%20%20%20%20update%2Esignal%28cm%2C%20%22viewportChange%22%2C%20cm%2C%20cm%2Edisplay%2EviewFrom%2C%20cm%2Edisplay%2EviewTo%29%3B%0A%20%20%20%20%20%20cm%2Edisplay%2EreportedViewFrom%20%3D%20cm%2Edisplay%2EviewFrom%3B%20cm%2Edisplay%2EreportedViewTo%20%3D%20cm%2Edisplay%2EviewTo%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20updateDisplaySimple%28cm%2C%20viewport%29%20%7B%0A%20%20%20%20var%20update%20%3D%20new%20DisplayUpdate%28cm%2C%20viewport%29%3B%0A%20%20%20%20if%20%28updateDisplayIfNeeded%28cm%2C%20update%29%29%20%7B%0A%20%20%20%20%20%20updateHeightsInViewport%28cm%29%3B%0A%20%20%20%20%20%20postUpdateDisplay%28cm%2C%20update%29%3B%0A%20%20%20%20%20%20var%20barMeasure%20%3D%20measureForScrollbars%28cm%29%3B%0A%20%20%20%20%20%20updateSelection%28cm%29%3B%0A%20%20%20%20%20%20setDocumentHeight%28cm%2C%20barMeasure%29%3B%0A%20%20%20%20%20%20updateScrollbars%28cm%2C%20barMeasure%29%3B%0A%20%20%20%20%20%20update%2Efinish%28%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20setDocumentHeight%28cm%2C%20measure%29%20%7B%0A%20%20%20%20cm%2Edisplay%2Esizer%2Estyle%2EminHeight%20%3D%20measure%2EdocHeight%20%2B%20%22px%22%3B%0A%20%20%20%20var%20total%20%3D%20measure%2EdocHeight%20%2B%20cm%2Edisplay%2EbarHeight%3B%0A%20%20%20%20cm%2Edisplay%2EheightForcer%2Estyle%2Etop%20%3D%20total%20%2B%20%22px%22%3B%0A%20%20%20%20cm%2Edisplay%2Egutters%2Estyle%2Eheight%20%3D%20Math%2Emax%28total%20%2B%20scrollGap%28cm%29%2C%20measure%2EclientHeight%29%20%2B%20%22px%22%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Read%20the%20actual%20heights%20of%20the%20rendered%20lines%2C%20and%20update%20their%0A%20%20%2F%2F%20stored%20heights%20to%20match%2E%0A%20%20function%20updateHeightsInViewport%28cm%29%20%7B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20var%20prevBottom%20%3D%20display%2ElineDiv%2EoffsetTop%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20display%2Eview%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20cur%20%3D%20display%2Eview%5Bi%5D%2C%20height%3B%0A%20%20%20%20%20%20if%20%28cur%2Ehidden%29%20continue%3B%0A%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%208%29%20%7B%0A%20%20%20%20%20%20%20%20var%20bot%20%3D%20cur%2Enode%2EoffsetTop%20%2B%20cur%2Enode%2EoffsetHeight%3B%0A%20%20%20%20%20%20%20%20height%20%3D%20bot%20%2D%20prevBottom%3B%0A%20%20%20%20%20%20%20%20prevBottom%20%3D%20bot%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20var%20box%20%3D%20cur%2Enode%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20%20%20%20%20height%20%3D%20box%2Ebottom%20%2D%20box%2Etop%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20diff%20%3D%20cur%2Eline%2Eheight%20%2D%20height%3B%0A%20%20%20%20%20%20if%20%28height%20%3C%202%29%20height%20%3D%20textHeight%28display%29%3B%0A%20%20%20%20%20%20if%20%28diff%20%3E%20%2E001%20%7C%7C%20diff%20%3C%20%2D%2E001%29%20%7B%0A%20%20%20%20%20%20%20%20updateLineHeight%28cur%2Eline%2C%20height%29%3B%0A%20%20%20%20%20%20%20%20updateWidgetHeight%28cur%2Eline%29%3B%0A%20%20%20%20%20%20%20%20if%20%28cur%2Erest%29%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20cur%2Erest%2Elength%3B%20j%2B%2B%29%0A%20%20%20%20%20%20%20%20%20%20updateWidgetHeight%28cur%2Erest%5Bj%5D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Read%20and%20store%20the%20height%20of%20line%20widgets%20associated%20with%20the%0A%20%20%2F%2F%20given%20line%2E%0A%20%20function%20updateWidgetHeight%28line%29%20%7B%0A%20%20%20%20if%20%28line%2Ewidgets%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20line%2Ewidgets%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20line%2Ewidgets%5Bi%5D%2Eheight%20%3D%20line%2Ewidgets%5Bi%5D%2Enode%2EparentNode%2EoffsetHeight%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Do%20a%20bulk%2Dread%20of%20the%20DOM%20positions%20and%20sizes%20needed%20to%20draw%20the%0A%20%20%2F%2F%20view%2C%20so%20that%20we%20don%27t%20interleave%20reading%20and%20writing%20to%20the%20DOM%2E%0A%20%20function%20getDimensions%28cm%29%20%7B%0A%20%20%20%20var%20d%20%3D%20cm%2Edisplay%2C%20left%20%3D%20%7B%7D%2C%20width%20%3D%20%7B%7D%3B%0A%20%20%20%20var%20gutterLeft%20%3D%20d%2Egutters%2EclientLeft%3B%0A%20%20%20%20for%20%28var%20n%20%3D%20d%2Egutters%2EfirstChild%2C%20i%20%3D%200%3B%20n%3B%20n%20%3D%20n%2EnextSibling%2C%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20left%5Bcm%2Eoptions%2Egutters%5Bi%5D%5D%20%3D%20n%2EoffsetLeft%20%2B%20n%2EclientLeft%20%2B%20gutterLeft%3B%0A%20%20%20%20%20%20width%5Bcm%2Eoptions%2Egutters%5Bi%5D%5D%20%3D%20n%2EclientWidth%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20%7BfixedPos%3A%20compensateForHScroll%28d%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20gutterTotalWidth%3A%20d%2Egutters%2EoffsetWidth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20gutterLeft%3A%20left%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20gutterWidth%3A%20width%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20wrapperWidth%3A%20d%2Ewrapper%2EclientWidth%7D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Sync%20the%20actual%20display%20DOM%20structure%20with%20display%2Eview%2C%20removing%0A%20%20%2F%2F%20nodes%20for%20lines%20that%20are%20no%20longer%20in%20view%2C%20and%20creating%20the%20ones%0A%20%20%2F%2F%20that%20are%20not%20there%20yet%2C%20and%20updating%20the%20ones%20that%20are%20out%20of%0A%20%20%2F%2F%20date%2E%0A%20%20function%20patchDisplay%28cm%2C%20updateNumbersFrom%2C%20dims%29%20%7B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%2C%20lineNumbers%20%3D%20cm%2Eoptions%2ElineNumbers%3B%0A%20%20%20%20var%20container%20%3D%20display%2ElineDiv%2C%20cur%20%3D%20container%2EfirstChild%3B%0A%0A%20%20%20%20function%20rm%28node%29%20%7B%0A%20%20%20%20%20%20var%20next%20%3D%20node%2EnextSibling%3B%0A%20%20%20%20%20%20%2F%2F%20Works%20around%20a%20throw%2Dscroll%20bug%20in%20OS%20X%20Webkit%0A%20%20%20%20%20%20if%20%28webkit%20%26%26%20mac%20%26%26%20cm%2Edisplay%2EcurrentWheelTarget%20%3D%3D%20node%29%0A%20%20%20%20%20%20%20%20node%2Estyle%2Edisplay%20%3D%20%22none%22%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20node%2EparentNode%2EremoveChild%28node%29%3B%0A%20%20%20%20%20%20return%20next%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20view%20%3D%20display%2Eview%2C%20lineN%20%3D%20display%2EviewFrom%3B%0A%20%20%20%20%2F%2F%20Loop%20over%20the%20elements%20in%20the%20view%2C%20syncing%20cur%20%28the%20DOM%20nodes%0A%20%20%20%20%2F%2F%20in%20display%2ElineDiv%29%20with%20the%20view%20as%20we%20go%2E%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20view%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20lineView%20%3D%20view%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28lineView%2Ehidden%29%20%7B%0A%20%20%20%20%20%20%7D%20else%20if%20%28%21lineView%2Enode%20%7C%7C%20lineView%2Enode%2EparentNode%20%21%3D%20container%29%20%7B%20%2F%2F%20Not%20drawn%20yet%0A%20%20%20%20%20%20%20%20var%20node%20%3D%20buildLineElement%28cm%2C%20lineView%2C%20lineN%2C%20dims%29%3B%0A%20%20%20%20%20%20%20%20container%2EinsertBefore%28node%2C%20cur%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%20%2F%2F%20Already%20drawn%0A%20%20%20%20%20%20%20%20while%20%28cur%20%21%3D%20lineView%2Enode%29%20cur%20%3D%20rm%28cur%29%3B%0A%20%20%20%20%20%20%20%20var%20updateNumber%20%3D%20lineNumbers%20%26%26%20updateNumbersFrom%20%21%3D%20null%20%26%26%0A%20%20%20%20%20%20%20%20%20%20updateNumbersFrom%20%3C%3D%20lineN%20%26%26%20lineView%2ElineNumber%3B%0A%20%20%20%20%20%20%20%20if%20%28lineView%2Echanges%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28indexOf%28lineView%2Echanges%2C%20%22gutter%22%29%20%3E%20%2D1%29%20updateNumber%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20updateLineForChanges%28cm%2C%20lineView%2C%20lineN%2C%20dims%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28updateNumber%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20removeChildren%28lineView%2ElineNumber%29%3B%0A%20%20%20%20%20%20%20%20%20%20lineView%2ElineNumber%2EappendChild%28document%2EcreateTextNode%28lineNumberFor%28cm%2Eoptions%2C%20lineN%29%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20cur%20%3D%20lineView%2Enode%2EnextSibling%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20lineN%20%2B%3D%20lineView%2Esize%3B%0A%20%20%20%20%7D%0A%20%20%20%20while%20%28cur%29%20cur%20%3D%20rm%28cur%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20When%20an%20aspect%20of%20a%20line%20changes%2C%20a%20string%20is%20added%20to%0A%20%20%2F%2F%20lineView%2Echanges%2E%20This%20updates%20the%20relevant%20part%20of%20the%20line%27s%0A%20%20%2F%2F%20DOM%20structure%2E%0A%20%20function%20updateLineForChanges%28cm%2C%20lineView%2C%20lineN%2C%20dims%29%20%7B%0A%20%20%20%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20lineView%2Echanges%2Elength%3B%20j%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20type%20%3D%20lineView%2Echanges%5Bj%5D%3B%0A%20%20%20%20%20%20if%20%28type%20%3D%3D%20%22text%22%29%20updateLineText%28cm%2C%20lineView%29%3B%0A%20%20%20%20%20%20else%20if%20%28type%20%3D%3D%20%22gutter%22%29%20updateLineGutter%28cm%2C%20lineView%2C%20lineN%2C%20dims%29%3B%0A%20%20%20%20%20%20else%20if%20%28type%20%3D%3D%20%22class%22%29%20updateLineClasses%28lineView%29%3B%0A%20%20%20%20%20%20else%20if%20%28type%20%3D%3D%20%22widget%22%29%20updateLineWidgets%28cm%2C%20lineView%2C%20dims%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20lineView%2Echanges%20%3D%20null%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Lines%20with%20gutter%20elements%2C%20widgets%20or%20a%20background%20class%20need%20to%0A%20%20%2F%2F%20be%20wrapped%2C%20and%20have%20the%20extra%20elements%20added%20to%20the%20wrapper%20div%0A%20%20function%20ensureLineWrapped%28lineView%29%20%7B%0A%20%20%20%20if%20%28lineView%2Enode%20%3D%3D%20lineView%2Etext%29%20%7B%0A%20%20%20%20%20%20lineView%2Enode%20%3D%20elt%28%22div%22%2C%20null%2C%20null%2C%20%22position%3A%20relative%22%29%3B%0A%20%20%20%20%20%20if%20%28lineView%2Etext%2EparentNode%29%0A%20%20%20%20%20%20%20%20lineView%2Etext%2EparentNode%2EreplaceChild%28lineView%2Enode%2C%20lineView%2Etext%29%3B%0A%20%20%20%20%20%20lineView%2Enode%2EappendChild%28lineView%2Etext%29%3B%0A%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%208%29%20lineView%2Enode%2Estyle%2EzIndex%20%3D%202%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20lineView%2Enode%3B%0A%20%20%7D%0A%0A%20%20function%20updateLineBackground%28lineView%29%20%7B%0A%20%20%20%20var%20cls%20%3D%20lineView%2EbgClass%20%3F%20lineView%2EbgClass%20%2B%20%22%20%22%20%2B%20%28lineView%2Eline%2EbgClass%20%7C%7C%20%22%22%29%20%3A%20lineView%2Eline%2EbgClass%3B%0A%20%20%20%20if%20%28cls%29%20cls%20%2B%3D%20%22%20CodeMirror%2Dlinebackground%22%3B%0A%20%20%20%20if%20%28lineView%2Ebackground%29%20%7B%0A%20%20%20%20%20%20if%20%28cls%29%20lineView%2Ebackground%2EclassName%20%3D%20cls%3B%0A%20%20%20%20%20%20else%20%7B%20lineView%2Ebackground%2EparentNode%2EremoveChild%28lineView%2Ebackground%29%3B%20lineView%2Ebackground%20%3D%20null%3B%20%7D%0A%20%20%20%20%7D%20else%20if%20%28cls%29%20%7B%0A%20%20%20%20%20%20var%20wrap%20%3D%20ensureLineWrapped%28lineView%29%3B%0A%20%20%20%20%20%20lineView%2Ebackground%20%3D%20wrap%2EinsertBefore%28elt%28%22div%22%2C%20null%2C%20cls%29%2C%20wrap%2EfirstChild%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Wrapper%20around%20buildLineContent%20which%20will%20reuse%20the%20structure%0A%20%20%2F%2F%20in%20display%2EexternalMeasured%20when%20possible%2E%0A%20%20function%20getLineContent%28cm%2C%20lineView%29%20%7B%0A%20%20%20%20var%20ext%20%3D%20cm%2Edisplay%2EexternalMeasured%3B%0A%20%20%20%20if%20%28ext%20%26%26%20ext%2Eline%20%3D%3D%20lineView%2Eline%29%20%7B%0A%20%20%20%20%20%20cm%2Edisplay%2EexternalMeasured%20%3D%20null%3B%0A%20%20%20%20%20%20lineView%2Emeasure%20%3D%20ext%2Emeasure%3B%0A%20%20%20%20%20%20return%20ext%2Ebuilt%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20buildLineContent%28cm%2C%20lineView%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Redraw%20the%20line%27s%20text%2E%20Interacts%20with%20the%20background%20and%20text%0A%20%20%2F%2F%20classes%20because%20the%20mode%20may%20output%20tokens%20that%20influence%20these%0A%20%20%2F%2F%20classes%2E%0A%20%20function%20updateLineText%28cm%2C%20lineView%29%20%7B%0A%20%20%20%20var%20cls%20%3D%20lineView%2Etext%2EclassName%3B%0A%20%20%20%20var%20built%20%3D%20getLineContent%28cm%2C%20lineView%29%3B%0A%20%20%20%20if%20%28lineView%2Etext%20%3D%3D%20lineView%2Enode%29%20lineView%2Enode%20%3D%20built%2Epre%3B%0A%20%20%20%20lineView%2Etext%2EparentNode%2EreplaceChild%28built%2Epre%2C%20lineView%2Etext%29%3B%0A%20%20%20%20lineView%2Etext%20%3D%20built%2Epre%3B%0A%20%20%20%20if%20%28built%2EbgClass%20%21%3D%20lineView%2EbgClass%20%7C%7C%20built%2EtextClass%20%21%3D%20lineView%2EtextClass%29%20%7B%0A%20%20%20%20%20%20lineView%2EbgClass%20%3D%20built%2EbgClass%3B%0A%20%20%20%20%20%20lineView%2EtextClass%20%3D%20built%2EtextClass%3B%0A%20%20%20%20%20%20updateLineClasses%28lineView%29%3B%0A%20%20%20%20%7D%20else%20if%20%28cls%29%20%7B%0A%20%20%20%20%20%20lineView%2Etext%2EclassName%20%3D%20cls%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20updateLineClasses%28lineView%29%20%7B%0A%20%20%20%20updateLineBackground%28lineView%29%3B%0A%20%20%20%20if%20%28lineView%2Eline%2EwrapClass%29%0A%20%20%20%20%20%20ensureLineWrapped%28lineView%29%2EclassName%20%3D%20lineView%2Eline%2EwrapClass%3B%0A%20%20%20%20else%20if%20%28lineView%2Enode%20%21%3D%20lineView%2Etext%29%0A%20%20%20%20%20%20lineView%2Enode%2EclassName%20%3D%20%22%22%3B%0A%20%20%20%20var%20textClass%20%3D%20lineView%2EtextClass%20%3F%20lineView%2EtextClass%20%2B%20%22%20%22%20%2B%20%28lineView%2Eline%2EtextClass%20%7C%7C%20%22%22%29%20%3A%20lineView%2Eline%2EtextClass%3B%0A%20%20%20%20lineView%2Etext%2EclassName%20%3D%20textClass%20%7C%7C%20%22%22%3B%0A%20%20%7D%0A%0A%20%20function%20updateLineGutter%28cm%2C%20lineView%2C%20lineN%2C%20dims%29%20%7B%0A%20%20%20%20if%20%28lineView%2Egutter%29%20%7B%0A%20%20%20%20%20%20lineView%2Enode%2EremoveChild%28lineView%2Egutter%29%3B%0A%20%20%20%20%20%20lineView%2Egutter%20%3D%20null%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28lineView%2EgutterBackground%29%20%7B%0A%20%20%20%20%20%20lineView%2Enode%2EremoveChild%28lineView%2EgutterBackground%29%3B%0A%20%20%20%20%20%20lineView%2EgutterBackground%20%3D%20null%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28lineView%2Eline%2EgutterClass%29%20%7B%0A%20%20%20%20%20%20var%20wrap%20%3D%20ensureLineWrapped%28lineView%29%3B%0A%20%20%20%20%20%20lineView%2EgutterBackground%20%3D%20elt%28%22div%22%2C%20null%2C%20%22CodeMirror%2Dgutter%2Dbackground%20%22%20%2B%20lineView%2Eline%2EgutterClass%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22left%3A%20%22%20%2B%20%28cm%2Eoptions%2EfixedGutter%20%3F%20dims%2EfixedPos%20%3A%20%2Ddims%2EgutterTotalWidth%29%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22px%3B%20width%3A%20%22%20%2B%20dims%2EgutterTotalWidth%20%2B%20%22px%22%29%3B%0A%20%20%20%20%20%20wrap%2EinsertBefore%28lineView%2EgutterBackground%2C%20lineView%2Etext%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20markers%20%3D%20lineView%2Eline%2EgutterMarkers%3B%0A%20%20%20%20if%20%28cm%2Eoptions%2ElineNumbers%20%7C%7C%20markers%29%20%7B%0A%20%20%20%20%20%20var%20wrap%20%3D%20ensureLineWrapped%28lineView%29%3B%0A%20%20%20%20%20%20var%20gutterWrap%20%3D%20lineView%2Egutter%20%3D%20elt%28%22div%22%2C%20null%2C%20%22CodeMirror%2Dgutter%2Dwrapper%22%2C%20%22left%3A%20%22%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28cm%2Eoptions%2EfixedGutter%20%3F%20dims%2EfixedPos%20%3A%20%2Ddims%2EgutterTotalWidth%29%20%2B%20%22px%22%29%3B%0A%20%20%20%20%20%20cm%2Edisplay%2Einput%2EsetUneditable%28gutterWrap%29%3B%0A%20%20%20%20%20%20wrap%2EinsertBefore%28gutterWrap%2C%20lineView%2Etext%29%3B%0A%20%20%20%20%20%20if%20%28lineView%2Eline%2EgutterClass%29%0A%20%20%20%20%20%20%20%20gutterWrap%2EclassName%20%2B%3D%20%22%20%22%20%2B%20lineView%2Eline%2EgutterClass%3B%0A%20%20%20%20%20%20if%20%28cm%2Eoptions%2ElineNumbers%20%26%26%20%28%21markers%20%7C%7C%20%21markers%5B%22CodeMirror%2Dlinenumbers%22%5D%29%29%0A%20%20%20%20%20%20%20%20lineView%2ElineNumber%20%3D%20gutterWrap%2EappendChild%28%0A%20%20%20%20%20%20%20%20%20%20elt%28%22div%22%2C%20lineNumberFor%28cm%2Eoptions%2C%20lineN%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22CodeMirror%2Dlinenumber%20CodeMirror%2Dgutter%2Delt%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22left%3A%20%22%20%2B%20dims%2EgutterLeft%5B%22CodeMirror%2Dlinenumbers%22%5D%20%2B%20%22px%3B%20width%3A%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2B%20cm%2Edisplay%2ElineNumInnerWidth%20%2B%20%22px%22%29%29%3B%0A%20%20%20%20%20%20if%20%28markers%29%20for%20%28var%20k%20%3D%200%3B%20k%20%3C%20cm%2Eoptions%2Egutters%2Elength%3B%20%2B%2Bk%29%20%7B%0A%20%20%20%20%20%20%20%20var%20id%20%3D%20cm%2Eoptions%2Egutters%5Bk%5D%2C%20found%20%3D%20markers%2EhasOwnProperty%28id%29%20%26%26%20markers%5Bid%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28found%29%0A%20%20%20%20%20%20%20%20%20%20gutterWrap%2EappendChild%28elt%28%22div%22%2C%20%5Bfound%5D%2C%20%22CodeMirror%2Dgutter%2Delt%22%2C%20%22left%3A%20%22%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dims%2EgutterLeft%5Bid%5D%20%2B%20%22px%3B%20width%3A%20%22%20%2B%20dims%2EgutterWidth%5Bid%5D%20%2B%20%22px%22%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20updateLineWidgets%28cm%2C%20lineView%2C%20dims%29%20%7B%0A%20%20%20%20if%20%28lineView%2Ealignable%29%20lineView%2Ealignable%20%3D%20null%3B%0A%20%20%20%20for%20%28var%20node%20%3D%20lineView%2Enode%2EfirstChild%2C%20next%3B%20node%3B%20node%20%3D%20next%29%20%7B%0A%20%20%20%20%20%20var%20next%20%3D%20node%2EnextSibling%3B%0A%20%20%20%20%20%20if%20%28node%2EclassName%20%3D%3D%20%22CodeMirror%2Dlinewidget%22%29%0A%20%20%20%20%20%20%20%20lineView%2Enode%2EremoveChild%28node%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20insertLineWidgets%28cm%2C%20lineView%2C%20dims%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Build%20a%20line%27s%20DOM%20representation%20from%20scratch%0A%20%20function%20buildLineElement%28cm%2C%20lineView%2C%20lineN%2C%20dims%29%20%7B%0A%20%20%20%20var%20built%20%3D%20getLineContent%28cm%2C%20lineView%29%3B%0A%20%20%20%20lineView%2Etext%20%3D%20lineView%2Enode%20%3D%20built%2Epre%3B%0A%20%20%20%20if%20%28built%2EbgClass%29%20lineView%2EbgClass%20%3D%20built%2EbgClass%3B%0A%20%20%20%20if%20%28built%2EtextClass%29%20lineView%2EtextClass%20%3D%20built%2EtextClass%3B%0A%0A%20%20%20%20updateLineClasses%28lineView%29%3B%0A%20%20%20%20updateLineGutter%28cm%2C%20lineView%2C%20lineN%2C%20dims%29%3B%0A%20%20%20%20insertLineWidgets%28cm%2C%20lineView%2C%20dims%29%3B%0A%20%20%20%20return%20lineView%2Enode%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20A%20lineView%20may%20contain%20multiple%20logical%20lines%20%28when%20merged%20by%0A%20%20%2F%2F%20collapsed%20spans%29%2E%20The%20widgets%20for%20all%20of%20them%20need%20to%20be%20drawn%2E%0A%20%20function%20insertLineWidgets%28cm%2C%20lineView%2C%20dims%29%20%7B%0A%20%20%20%20insertLineWidgetsFor%28cm%2C%20lineView%2Eline%2C%20lineView%2C%20dims%2C%20true%29%3B%0A%20%20%20%20if%20%28lineView%2Erest%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20lineView%2Erest%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20insertLineWidgetsFor%28cm%2C%20lineView%2Erest%5Bi%5D%2C%20lineView%2C%20dims%2C%20false%29%3B%0A%20%20%7D%0A%0A%20%20function%20insertLineWidgetsFor%28cm%2C%20line%2C%20lineView%2C%20dims%2C%20allowAbove%29%20%7B%0A%20%20%20%20if%20%28%21line%2Ewidgets%29%20return%3B%0A%20%20%20%20var%20wrap%20%3D%20ensureLineWrapped%28lineView%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%2C%20ws%20%3D%20line%2Ewidgets%3B%20i%20%3C%20ws%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20widget%20%3D%20ws%5Bi%5D%2C%20node%20%3D%20elt%28%22div%22%2C%20%5Bwidget%2Enode%5D%2C%20%22CodeMirror%2Dlinewidget%22%29%3B%0A%20%20%20%20%20%20if%20%28%21widget%2EhandleMouseEvents%29%20node%2EsetAttribute%28%22cm%2Dignore%2Devents%22%2C%20%22true%22%29%3B%0A%20%20%20%20%20%20positionLineWidget%28widget%2C%20node%2C%20lineView%2C%20dims%29%3B%0A%20%20%20%20%20%20cm%2Edisplay%2Einput%2EsetUneditable%28node%29%3B%0A%20%20%20%20%20%20if%20%28allowAbove%20%26%26%20widget%2Eabove%29%0A%20%20%20%20%20%20%20%20wrap%2EinsertBefore%28node%2C%20lineView%2Egutter%20%7C%7C%20lineView%2Etext%29%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20wrap%2EappendChild%28node%29%3B%0A%20%20%20%20%20%20signalLater%28widget%2C%20%22redraw%22%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20positionLineWidget%28widget%2C%20node%2C%20lineView%2C%20dims%29%20%7B%0A%20%20%20%20if%20%28widget%2EnoHScroll%29%20%7B%0A%20%20%20%20%20%20%28lineView%2Ealignable%20%7C%7C%20%28lineView%2Ealignable%20%3D%20%5B%5D%29%29%2Epush%28node%29%3B%0A%20%20%20%20%20%20var%20width%20%3D%20dims%2EwrapperWidth%3B%0A%20%20%20%20%20%20node%2Estyle%2Eleft%20%3D%20dims%2EfixedPos%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20if%20%28%21widget%2EcoverGutter%29%20%7B%0A%20%20%20%20%20%20%20%20width%20%2D%3D%20dims%2EgutterTotalWidth%3B%0A%20%20%20%20%20%20%20%20node%2Estyle%2EpaddingLeft%20%3D%20dims%2EgutterTotalWidth%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20node%2Estyle%2Ewidth%20%3D%20width%20%2B%20%22px%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28widget%2EcoverGutter%29%20%7B%0A%20%20%20%20%20%20node%2Estyle%2EzIndex%20%3D%205%3B%0A%20%20%20%20%20%20node%2Estyle%2Eposition%20%3D%20%22relative%22%3B%0A%20%20%20%20%20%20if%20%28%21widget%2EnoHScroll%29%20node%2Estyle%2EmarginLeft%20%3D%20%2Ddims%2EgutterTotalWidth%20%2B%20%22px%22%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20POSITION%20OBJECT%0A%0A%20%20%2F%2F%20A%20Pos%20instance%20represents%20a%20position%20within%20the%20text%2E%0A%20%20var%20Pos%20%3D%20CodeMirror%2EPos%20%3D%20function%28line%2C%20ch%29%20%7B%0A%20%20%20%20if%20%28%21%28this%20instanceof%20Pos%29%29%20return%20new%20Pos%28line%2C%20ch%29%3B%0A%20%20%20%20this%2Eline%20%3D%20line%3B%20this%2Ech%20%3D%20ch%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Compare%20two%20positions%2C%20return%200%20if%20they%20are%20the%20same%2C%20a%20negative%0A%20%20%2F%2F%20number%20when%20a%20is%20less%2C%20and%20a%20positive%20number%20otherwise%2E%0A%20%20var%20cmp%20%3D%20CodeMirror%2EcmpPos%20%3D%20function%28a%2C%20b%29%20%7B%20return%20a%2Eline%20%2D%20b%2Eline%20%7C%7C%20a%2Ech%20%2D%20b%2Ech%3B%20%7D%3B%0A%0A%20%20function%20copyPos%28x%29%20%7Breturn%20Pos%28x%2Eline%2C%20x%2Ech%29%3B%7D%0A%20%20function%20maxPos%28a%2C%20b%29%20%7B%20return%20cmp%28a%2C%20b%29%20%3C%200%20%3F%20b%20%3A%20a%3B%20%7D%0A%20%20function%20minPos%28a%2C%20b%29%20%7B%20return%20cmp%28a%2C%20b%29%20%3C%200%20%3F%20a%20%3A%20b%3B%20%7D%0A%0A%20%20%2F%2F%20INPUT%20HANDLING%0A%0A%20%20function%20ensureFocus%28cm%29%20%7B%0A%20%20%20%20if%20%28%21cm%2Estate%2Efocused%29%20%7B%20cm%2Edisplay%2Einput%2Efocus%28%29%3B%20onFocus%28cm%29%3B%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20This%20will%20be%20set%20to%20an%20array%20of%20strings%20when%20copying%2C%20so%20that%2C%0A%20%20%2F%2F%20when%20pasting%2C%20we%20know%20what%20kind%20of%20selections%20the%20copied%20text%0A%20%20%2F%2F%20was%20made%20out%20of%2E%0A%20%20var%20lastCopied%20%3D%20null%3B%0A%0A%20%20function%20applyTextInput%28cm%2C%20inserted%2C%20deleted%2C%20sel%2C%20origin%29%20%7B%0A%20%20%20%20var%20doc%20%3D%20cm%2Edoc%3B%0A%20%20%20%20cm%2Edisplay%2Eshift%20%3D%20false%3B%0A%20%20%20%20if%20%28%21sel%29%20sel%20%3D%20doc%2Esel%3B%0A%0A%20%20%20%20var%20paste%20%3D%20cm%2Estate%2EpasteIncoming%20%7C%7C%20origin%20%3D%3D%20%22paste%22%3B%0A%20%20%20%20var%20textLines%20%3D%20doc%2EsplitLines%28inserted%29%2C%20multiPaste%20%3D%20null%3B%0A%20%20%20%20%2F%2F%20When%20pasing%20N%20lines%20into%20N%20selections%2C%20insert%20one%20line%20per%20selection%0A%20%20%20%20if%20%28paste%20%26%26%20sel%2Eranges%2Elength%20%3E%201%29%20%7B%0A%20%20%20%20%20%20if%20%28lastCopied%20%26%26%20lastCopied%2Ejoin%28%22%5Cn%22%29%20%3D%3D%20inserted%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28sel%2Eranges%2Elength%20%25%20lastCopied%2Elength%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20multiPaste%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20lastCopied%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20%20%20%20%20multiPaste%2Epush%28doc%2EsplitLines%28lastCopied%5Bi%5D%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20if%20%28textLines%2Elength%20%3D%3D%20sel%2Eranges%2Elength%29%20%7B%0A%20%20%20%20%20%20%20%20multiPaste%20%3D%20map%28textLines%2C%20function%28l%29%20%7B%20return%20%5Bl%5D%3B%20%7D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Normal%20behavior%20is%20to%20insert%20the%20new%20text%20into%20every%20selection%0A%20%20%20%20for%20%28var%20i%20%3D%20sel%2Eranges%2Elength%20%2D%201%3B%20i%20%3E%3D%200%3B%20i%2D%2D%29%20%7B%0A%20%20%20%20%20%20var%20range%20%3D%20sel%2Eranges%5Bi%5D%3B%0A%20%20%20%20%20%20var%20from%20%3D%20range%2Efrom%28%29%2C%20to%20%3D%20range%2Eto%28%29%3B%0A%20%20%20%20%20%20if%20%28range%2Eempty%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28deleted%20%26%26%20deleted%20%3E%200%29%20%2F%2F%20Handle%20deletion%0A%20%20%20%20%20%20%20%20%20%20from%20%3D%20Pos%28from%2Eline%2C%20from%2Ech%20%2D%20deleted%29%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28cm%2Estate%2Eoverwrite%20%26%26%20%21paste%29%20%2F%2F%20Handle%20overwrite%0A%20%20%20%20%20%20%20%20%20%20to%20%3D%20Pos%28to%2Eline%2C%20Math%2Emin%28getLine%28doc%2C%20to%2Eline%29%2Etext%2Elength%2C%20to%2Ech%20%2B%20lst%28textLines%29%2Elength%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20updateInput%20%3D%20cm%2EcurOp%2EupdateInput%3B%0A%20%20%20%20%20%20var%20changeEvent%20%3D%20%7Bfrom%3A%20from%2C%20to%3A%20to%2C%20text%3A%20multiPaste%20%3F%20multiPaste%5Bi%20%25%20multiPaste%2Elength%5D%20%3A%20textLines%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20origin%3A%20origin%20%7C%7C%20%28paste%20%3F%20%22paste%22%20%3A%20cm%2Estate%2EcutIncoming%20%3F%20%22cut%22%20%3A%20%22%2Binput%22%29%7D%3B%0A%20%20%20%20%20%20makeChange%28cm%2Edoc%2C%20changeEvent%29%3B%0A%20%20%20%20%20%20signalLater%28cm%2C%20%22inputRead%22%2C%20cm%2C%20changeEvent%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28inserted%20%26%26%20%21paste%29%0A%20%20%20%20%20%20triggerElectric%28cm%2C%20inserted%29%3B%0A%0A%20%20%20%20ensureCursorVisible%28cm%29%3B%0A%20%20%20%20cm%2EcurOp%2EupdateInput%20%3D%20updateInput%3B%0A%20%20%20%20cm%2EcurOp%2Etyping%20%3D%20true%3B%0A%20%20%20%20cm%2Estate%2EpasteIncoming%20%3D%20cm%2Estate%2EcutIncoming%20%3D%20false%3B%0A%20%20%7D%0A%0A%20%20function%20handlePaste%28e%2C%20cm%29%20%7B%0A%20%20%20%20var%20pasted%20%3D%20e%2EclipboardData%20%26%26%20e%2EclipboardData%2EgetData%28%22text%2Fplain%22%29%3B%0A%20%20%20%20if%20%28pasted%29%20%7B%0A%20%20%20%20%20%20e%2EpreventDefault%28%29%3B%0A%20%20%20%20%20%20if%20%28%21cm%2EisReadOnly%28%29%20%26%26%20%21cm%2Eoptions%2EdisableInput%29%0A%20%20%20%20%20%20%20%20runInOp%28cm%2C%20function%28%29%20%7B%20applyTextInput%28cm%2C%20pasted%2C%200%2C%20null%2C%20%22paste%22%29%3B%20%7D%29%3B%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20triggerElectric%28cm%2C%20inserted%29%20%7B%0A%20%20%20%20%2F%2F%20When%20an%20%27electric%27%20character%20is%20inserted%2C%20immediately%20trigger%20a%20reindent%0A%20%20%20%20if%20%28%21cm%2Eoptions%2EelectricChars%20%7C%7C%20%21cm%2Eoptions%2EsmartIndent%29%20return%3B%0A%20%20%20%20var%20sel%20%3D%20cm%2Edoc%2Esel%3B%0A%0A%20%20%20%20for%20%28var%20i%20%3D%20sel%2Eranges%2Elength%20%2D%201%3B%20i%20%3E%3D%200%3B%20i%2D%2D%29%20%7B%0A%20%20%20%20%20%20var%20range%20%3D%20sel%2Eranges%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28range%2Ehead%2Ech%20%3E%20100%20%7C%7C%20%28i%20%26%26%20sel%2Eranges%5Bi%20%2D%201%5D%2Ehead%2Eline%20%3D%3D%20range%2Ehead%2Eline%29%29%20continue%3B%0A%20%20%20%20%20%20var%20mode%20%3D%20cm%2EgetModeAt%28range%2Ehead%29%3B%0A%20%20%20%20%20%20var%20indented%20%3D%20false%3B%0A%20%20%20%20%20%20if%20%28mode%2EelectricChars%29%20%7B%0A%20%20%20%20%20%20%20%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20mode%2EelectricChars%2Elength%3B%20j%2B%2B%29%0A%20%20%20%20%20%20%20%20%20%20if%20%28inserted%2EindexOf%28mode%2EelectricChars%2EcharAt%28j%29%29%20%3E%20%2D1%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20indented%20%3D%20indentLine%28cm%2C%20range%2Ehead%2Eline%2C%20%22smart%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20if%20%28mode%2EelectricInput%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28mode%2EelectricInput%2Etest%28getLine%28cm%2Edoc%2C%20range%2Ehead%2Eline%29%2Etext%2Eslice%280%2C%20range%2Ehead%2Ech%29%29%29%0A%20%20%20%20%20%20%20%20%20%20indented%20%3D%20indentLine%28cm%2C%20range%2Ehead%2Eline%2C%20%22smart%22%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28indented%29%20signalLater%28cm%2C%20%22electricInput%22%2C%20cm%2C%20range%2Ehead%2Eline%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20copyableRanges%28cm%29%20%7B%0A%20%20%20%20var%20text%20%3D%20%5B%5D%2C%20ranges%20%3D%20%5B%5D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20cm%2Edoc%2Esel%2Eranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20line%20%3D%20cm%2Edoc%2Esel%2Eranges%5Bi%5D%2Ehead%2Eline%3B%0A%20%20%20%20%20%20var%20lineRange%20%3D%20%7Banchor%3A%20Pos%28line%2C%200%29%2C%20head%3A%20Pos%28line%20%2B%201%2C%200%29%7D%3B%0A%20%20%20%20%20%20ranges%2Epush%28lineRange%29%3B%0A%20%20%20%20%20%20text%2Epush%28cm%2EgetRange%28lineRange%2Eanchor%2C%20lineRange%2Ehead%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20%7Btext%3A%20text%2C%20ranges%3A%20ranges%7D%3B%0A%20%20%7D%0A%0A%20%20function%20disableBrowserMagic%28field%29%20%7B%0A%20%20%20%20field%2EsetAttribute%28%22autocorrect%22%2C%20%22off%22%29%3B%0A%20%20%20%20field%2EsetAttribute%28%22autocapitalize%22%2C%20%22off%22%29%3B%0A%20%20%20%20field%2EsetAttribute%28%22spellcheck%22%2C%20%22false%22%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20TEXTAREA%20INPUT%20STYLE%0A%0A%20%20function%20TextareaInput%28cm%29%20%7B%0A%20%20%20%20this%2Ecm%20%3D%20cm%3B%0A%20%20%20%20%2F%2F%20See%20input%2Epoll%20and%20input%2Ereset%0A%20%20%20%20this%2EprevInput%20%3D%20%22%22%3B%0A%0A%20%20%20%20%2F%2F%20Flag%20that%20indicates%20whether%20we%20expect%20input%20to%20appear%20real%20soon%0A%20%20%20%20%2F%2F%20now%20%28after%20some%20event%20like%20%27keypress%27%20or%20%27input%27%29%20and%20are%0A%20%20%20%20%2F%2F%20polling%20intensively%2E%0A%20%20%20%20this%2EpollingFast%20%3D%20false%3B%0A%20%20%20%20%2F%2F%20Self%2Dresetting%20timeout%20for%20the%20poller%0A%20%20%20%20this%2Epolling%20%3D%20new%20Delayed%28%29%3B%0A%20%20%20%20%2F%2F%20Tracks%20when%20input%2Ereset%20has%20punted%20to%20just%20putting%20a%20short%0A%20%20%20%20%2F%2F%20string%20into%20the%20textarea%20instead%20of%20the%20full%20selection%2E%0A%20%20%20%20this%2EinaccurateSelection%20%3D%20false%3B%0A%20%20%20%20%2F%2F%20Used%20to%20work%20around%20IE%20issue%20with%20selection%20being%20forgotten%20when%20focus%20moves%20away%20from%20textarea%0A%20%20%20%20this%2EhasSelection%20%3D%20false%3B%0A%20%20%20%20this%2Ecomposing%20%3D%20null%3B%0A%20%20%7D%3B%0A%0A%20%20function%20hiddenTextarea%28%29%20%7B%0A%20%20%20%20var%20te%20%3D%20elt%28%22textarea%22%2C%20null%2C%20null%2C%20%22position%3A%20absolute%3B%20padding%3A%200%3B%20width%3A%201px%3B%20height%3A%201em%3B%20outline%3A%20none%22%29%3B%0A%20%20%20%20var%20div%20%3D%20elt%28%22div%22%2C%20%5Bte%5D%2C%20null%2C%20%22overflow%3A%20hidden%3B%20position%3A%20relative%3B%20width%3A%203px%3B%20height%3A%200px%3B%22%29%3B%0A%20%20%20%20%2F%2F%20The%20textarea%20is%20kept%20positioned%20near%20the%20cursor%20to%20prevent%20the%0A%20%20%20%20%2F%2F%20fact%20that%20it%27ll%20be%20scrolled%20into%20view%20on%20input%20from%20scrolling%0A%20%20%20%20%2F%2F%20our%20fake%20cursor%20out%20of%20view%2E%20On%20webkit%2C%20when%20wrap%3Doff%2C%20paste%20is%0A%20%20%20%20%2F%2F%20very%20slow%2E%20So%20make%20the%20area%20wide%20instead%2E%0A%20%20%20%20if%20%28webkit%29%20te%2Estyle%2Ewidth%20%3D%20%221000px%22%3B%0A%20%20%20%20else%20te%2EsetAttribute%28%22wrap%22%2C%20%22off%22%29%3B%0A%20%20%20%20%2F%2F%20If%20border%3A%200%3B%20%2D%2D%20iOS%20fails%20to%20open%20keyboard%20%28issue%20%231287%29%0A%20%20%20%20if%20%28ios%29%20te%2Estyle%2Eborder%20%3D%20%221px%20solid%20black%22%3B%0A%20%20%20%20disableBrowserMagic%28te%29%3B%0A%20%20%20%20return%20div%3B%0A%20%20%7D%0A%0A%20%20TextareaInput%2Eprototype%20%3D%20copyObj%28%7B%0A%20%20%20%20init%3A%20function%28display%29%20%7B%0A%20%20%20%20%20%20var%20input%20%3D%20this%2C%20cm%20%3D%20this%2Ecm%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Wraps%20and%20hides%20input%20textarea%0A%20%20%20%20%20%20var%20div%20%3D%20this%2Ewrapper%20%3D%20hiddenTextarea%28%29%3B%0A%20%20%20%20%20%20%2F%2F%20The%20semihidden%20textarea%20that%20is%20focused%20when%20the%20editor%20is%0A%20%20%20%20%20%20%2F%2F%20focused%2C%20and%20receives%20input%2E%0A%20%20%20%20%20%20var%20te%20%3D%20this%2Etextarea%20%3D%20div%2EfirstChild%3B%0A%20%20%20%20%20%20display%2Ewrapper%2EinsertBefore%28div%2C%20display%2Ewrapper%2EfirstChild%29%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Needed%20to%20hide%20big%20blue%20blinking%20cursor%20on%20Mobile%20Safari%20%28doesn%27t%20seem%20to%20work%20in%20iOS%208%20anymore%29%0A%20%20%20%20%20%20if%20%28ios%29%20te%2Estyle%2Ewidth%20%3D%20%220px%22%3B%0A%0A%20%20%20%20%20%20on%28te%2C%20%22input%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3E%3D%209%20%26%26%20input%2EhasSelection%29%20input%2EhasSelection%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20input%2Epoll%28%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20on%28te%2C%20%22paste%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28signalDOMEvent%28cm%2C%20e%29%20%7C%7C%20handlePaste%28e%2C%20cm%29%29%20return%0A%0A%20%20%20%20%20%20%20%20cm%2Estate%2EpasteIncoming%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20input%2EfastPoll%28%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20function%20prepareCopyCut%28e%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28signalDOMEvent%28cm%2C%20e%29%29%20return%0A%20%20%20%20%20%20%20%20if%20%28cm%2EsomethingSelected%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20lastCopied%20%3D%20cm%2EgetSelections%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28input%2EinaccurateSelection%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20input%2EprevInput%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20input%2EinaccurateSelection%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20te%2Evalue%20%3D%20lastCopied%2Ejoin%28%22%5Cn%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20selectInput%28te%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28%21cm%2Eoptions%2ElineWiseCopyCut%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20ranges%20%3D%20copyableRanges%28cm%29%3B%0A%20%20%20%20%20%20%20%20%20%20lastCopied%20%3D%20ranges%2Etext%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28e%2Etype%20%3D%3D%20%22cut%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20cm%2EsetSelections%28ranges%2Eranges%2C%20null%2C%20sel%5FdontScroll%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20input%2EprevInput%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20te%2Evalue%20%3D%20ranges%2Etext%2Ejoin%28%22%5Cn%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20selectInput%28te%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28e%2Etype%20%3D%3D%20%22cut%22%29%20cm%2Estate%2EcutIncoming%20%3D%20true%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20on%28te%2C%20%22cut%22%2C%20prepareCopyCut%29%3B%0A%20%20%20%20%20%20on%28te%2C%20%22copy%22%2C%20prepareCopyCut%29%3B%0A%0A%20%20%20%20%20%20on%28display%2Escroller%2C%20%22paste%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28eventInWidget%28display%2C%20e%29%20%7C%7C%20signalDOMEvent%28cm%2C%20e%29%29%20return%3B%0A%20%20%20%20%20%20%20%20cm%2Estate%2EpasteIncoming%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20input%2Efocus%28%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Prevent%20normal%20selection%20in%20the%20editor%20%28we%20handle%20our%20own%29%0A%20%20%20%20%20%20on%28display%2ElineSpace%2C%20%22selectstart%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21eventInWidget%28display%2C%20e%29%29%20e%5FpreventDefault%28e%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20on%28te%2C%20%22compositionstart%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20var%20start%20%3D%20cm%2EgetCursor%28%22from%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28input%2Ecomposing%29%20input%2Ecomposing%2Erange%2Eclear%28%29%0A%20%20%20%20%20%20%20%20input%2Ecomposing%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20start%3A%20start%2C%0A%20%20%20%20%20%20%20%20%20%20range%3A%20cm%2EmarkText%28start%2C%20cm%2EgetCursor%28%22to%22%29%2C%20%7BclassName%3A%20%22CodeMirror%2Dcomposing%22%7D%29%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20on%28te%2C%20%22compositionend%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28input%2Ecomposing%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20input%2Epoll%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20input%2Ecomposing%2Erange%2Eclear%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20input%2Ecomposing%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20prepareSelection%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Redraw%20the%20selection%20and%2For%20cursor%0A%20%20%20%20%20%20var%20cm%20%3D%20this%2Ecm%2C%20display%20%3D%20cm%2Edisplay%2C%20doc%20%3D%20cm%2Edoc%3B%0A%20%20%20%20%20%20var%20result%20%3D%20prepareSelection%28cm%29%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Move%20the%20hidden%20textarea%20near%20the%20cursor%20to%20prevent%20scrolling%20artifacts%0A%20%20%20%20%20%20if%20%28cm%2Eoptions%2EmoveInputWithCursor%29%20%7B%0A%20%20%20%20%20%20%20%20var%20headPos%20%3D%20cursorCoords%28cm%2C%20doc%2Esel%2Eprimary%28%29%2Ehead%2C%20%22div%22%29%3B%0A%20%20%20%20%20%20%20%20var%20wrapOff%20%3D%20display%2Ewrapper%2EgetBoundingClientRect%28%29%2C%20lineOff%20%3D%20display%2ElineDiv%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20%20%20%20%20result%2EteTop%20%3D%20Math%2Emax%280%2C%20Math%2Emin%28display%2Ewrapper%2EclientHeight%20%2D%2010%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20headPos%2Etop%20%2B%20lineOff%2Etop%20%2D%20wrapOff%2Etop%29%29%3B%0A%20%20%20%20%20%20%20%20result%2EteLeft%20%3D%20Math%2Emax%280%2C%20Math%2Emin%28display%2Ewrapper%2EclientWidth%20%2D%2010%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20headPos%2Eleft%20%2B%20lineOff%2Eleft%20%2D%20wrapOff%2Eleft%29%29%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20return%20result%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20showSelection%3A%20function%28drawn%29%20%7B%0A%20%20%20%20%20%20var%20cm%20%3D%20this%2Ecm%2C%20display%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20%20%20removeChildrenAndAdd%28display%2EcursorDiv%2C%20drawn%2Ecursors%29%3B%0A%20%20%20%20%20%20removeChildrenAndAdd%28display%2EselectionDiv%2C%20drawn%2Eselection%29%3B%0A%20%20%20%20%20%20if%20%28drawn%2EteTop%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20this%2Ewrapper%2Estyle%2Etop%20%3D%20drawn%2EteTop%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%20%20this%2Ewrapper%2Estyle%2Eleft%20%3D%20drawn%2EteLeft%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20%2F%2F%20Reset%20the%20input%20to%20correspond%20to%20the%20selection%20%28or%20to%20be%20empty%2C%0A%20%20%20%20%2F%2F%20when%20not%20typing%20and%20nothing%20is%20selected%29%0A%20%20%20%20reset%3A%20function%28typing%29%20%7B%0A%20%20%20%20%20%20if%20%28this%2EcontextMenuPending%29%20return%3B%0A%20%20%20%20%20%20var%20minimal%2C%20selected%2C%20cm%20%3D%20this%2Ecm%2C%20doc%20%3D%20cm%2Edoc%3B%0A%20%20%20%20%20%20if%20%28cm%2EsomethingSelected%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20this%2EprevInput%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20var%20range%20%3D%20doc%2Esel%2Eprimary%28%29%3B%0A%20%20%20%20%20%20%20%20minimal%20%3D%20hasCopyEvent%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%28range%2Eto%28%29%2Eline%20%2D%20range%2Efrom%28%29%2Eline%20%3E%20100%20%7C%7C%20%28selected%20%3D%20cm%2EgetSelection%28%29%29%2Elength%20%3E%201000%29%3B%0A%20%20%20%20%20%20%20%20var%20content%20%3D%20minimal%20%3F%20%22%2D%22%20%3A%20selected%20%7C%7C%20cm%2EgetSelection%28%29%3B%0A%20%20%20%20%20%20%20%20this%2Etextarea%2Evalue%20%3D%20content%3B%0A%20%20%20%20%20%20%20%20if%20%28cm%2Estate%2Efocused%29%20selectInput%28this%2Etextarea%29%3B%0A%20%20%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3E%3D%209%29%20this%2EhasSelection%20%3D%20content%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28%21typing%29%20%7B%0A%20%20%20%20%20%20%20%20this%2EprevInput%20%3D%20this%2Etextarea%2Evalue%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3E%3D%209%29%20this%2EhasSelection%20%3D%20null%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20this%2EinaccurateSelection%20%3D%20minimal%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20getField%3A%20function%28%29%20%7B%20return%20this%2Etextarea%3B%20%7D%2C%0A%0A%20%20%20%20supportsTouch%3A%20function%28%29%20%7B%20return%20false%3B%20%7D%2C%0A%0A%20%20%20%20focus%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28this%2Ecm%2Eoptions%2EreadOnly%20%21%3D%20%22nocursor%22%20%26%26%20%28%21mobile%20%7C%7C%20activeElt%28%29%20%21%3D%20this%2Etextarea%29%29%20%7B%0A%20%20%20%20%20%20%20%20try%20%7B%20this%2Etextarea%2Efocus%28%29%3B%20%7D%0A%20%20%20%20%20%20%20%20catch%20%28e%29%20%7B%7D%20%2F%2F%20IE8%20will%20throw%20if%20the%20textarea%20is%20display%3A%20none%20or%20not%20in%20DOM%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20blur%3A%20function%28%29%20%7B%20this%2Etextarea%2Eblur%28%29%3B%20%7D%2C%0A%0A%20%20%20%20resetPosition%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20this%2Ewrapper%2Estyle%2Etop%20%3D%20this%2Ewrapper%2Estyle%2Eleft%20%3D%200%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20receivedFocus%3A%20function%28%29%20%7B%20this%2EslowPoll%28%29%3B%20%7D%2C%0A%0A%20%20%20%20%2F%2F%20Poll%20for%20input%20changes%2C%20using%20the%20normal%20rate%20of%20polling%2E%20This%0A%20%20%20%20%2F%2F%20runs%20as%20long%20as%20the%20editor%20is%20focused%2E%0A%20%20%20%20slowPoll%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20input%20%3D%20this%3B%0A%20%20%20%20%20%20if%20%28input%2EpollingFast%29%20return%3B%0A%20%20%20%20%20%20input%2Epolling%2Eset%28this%2Ecm%2Eoptions%2EpollInterval%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20input%2Epoll%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28input%2Ecm%2Estate%2Efocused%29%20input%2EslowPoll%28%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20%2F%2F%20When%20an%20event%20has%20just%20come%20in%20that%20is%20likely%20to%20add%20or%20change%0A%20%20%20%20%2F%2F%20something%20in%20the%20input%20textarea%2C%20we%20poll%20faster%2C%20to%20ensure%20that%0A%20%20%20%20%2F%2F%20the%20change%20appears%20on%20the%20screen%20quickly%2E%0A%20%20%20%20fastPoll%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20missed%20%3D%20false%2C%20input%20%3D%20this%3B%0A%20%20%20%20%20%20input%2EpollingFast%20%3D%20true%3B%0A%20%20%20%20%20%20function%20p%28%29%20%7B%0A%20%20%20%20%20%20%20%20var%20changed%20%3D%20input%2Epoll%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21changed%20%26%26%20%21missed%29%20%7Bmissed%20%3D%20true%3B%20input%2Epolling%2Eset%2860%2C%20p%29%3B%7D%0A%20%20%20%20%20%20%20%20else%20%7Binput%2EpollingFast%20%3D%20false%3B%20input%2EslowPoll%28%29%3B%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20input%2Epolling%2Eset%2820%2C%20p%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20%2F%2F%20Read%20input%20from%20the%20textarea%2C%20and%20update%20the%20document%20to%20match%2E%0A%20%20%20%20%2F%2F%20When%20something%20is%20selected%2C%20it%20is%20present%20in%20the%20textarea%2C%20and%0A%20%20%20%20%2F%2F%20selected%20%28unless%20it%20is%20huge%2C%20in%20which%20case%20a%20placeholder%20is%0A%20%20%20%20%2F%2F%20used%29%2E%20When%20nothing%20is%20selected%2C%20the%20cursor%20sits%20after%20previously%0A%20%20%20%20%2F%2F%20seen%20text%20%28can%20be%20empty%29%2C%20which%20is%20stored%20in%20prevInput%20%28we%20must%0A%20%20%20%20%2F%2F%20not%20reset%20the%20textarea%20when%20typing%2C%20because%20that%20breaks%20IME%29%2E%0A%20%20%20%20poll%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20cm%20%3D%20this%2Ecm%2C%20input%20%3D%20this%2Etextarea%2C%20prevInput%20%3D%20this%2EprevInput%3B%0A%20%20%20%20%20%20%2F%2F%20Since%20this%20is%20called%20a%20%2Alot%2A%2C%20try%20to%20bail%20out%20as%20cheaply%20as%0A%20%20%20%20%20%20%2F%2F%20possible%20when%20it%20is%20clear%20that%20nothing%20happened%2E%20hasSelection%0A%20%20%20%20%20%20%2F%2F%20will%20be%20the%20case%20when%20there%20is%20a%20lot%20of%20text%20in%20the%20textarea%2C%0A%20%20%20%20%20%20%2F%2F%20in%20which%20case%20reading%20its%20value%20would%20be%20expensive%2E%0A%20%20%20%20%20%20if%20%28this%2EcontextMenuPending%20%7C%7C%20%21cm%2Estate%2Efocused%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%28hasSelection%28input%29%20%26%26%20%21prevInput%20%26%26%20%21this%2Ecomposing%29%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20cm%2EisReadOnly%28%29%20%7C%7C%20cm%2Eoptions%2EdisableInput%20%7C%7C%20cm%2Estate%2EkeySeq%29%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%0A%20%20%20%20%20%20var%20text%20%3D%20input%2Evalue%3B%0A%20%20%20%20%20%20%2F%2F%20If%20nothing%20changed%2C%20bail%2E%0A%20%20%20%20%20%20if%20%28text%20%3D%3D%20prevInput%20%26%26%20%21cm%2EsomethingSelected%28%29%29%20return%20false%3B%0A%20%20%20%20%20%20%2F%2F%20Work%20around%20nonsensical%20selection%20resetting%20in%20IE9%2F10%2C%20and%0A%20%20%20%20%20%20%2F%2F%20inexplicable%20appearance%20of%20private%20area%20unicode%20characters%20on%0A%20%20%20%20%20%20%2F%2F%20some%20key%20combos%20in%20Mac%20%28%232689%29%2E%0A%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3E%3D%209%20%26%26%20this%2EhasSelection%20%3D%3D%3D%20text%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20mac%20%26%26%20%2F%5B%5Cuf700%2D%5Cuf7ff%5D%2F%2Etest%28text%29%29%20%7B%0A%20%20%20%20%20%20%20%20cm%2Edisplay%2Einput%2Ereset%28%29%3B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28cm%2Edoc%2Esel%20%3D%3D%20cm%2Edisplay%2EselForContextMenu%29%20%7B%0A%20%20%20%20%20%20%20%20var%20first%20%3D%20text%2EcharCodeAt%280%29%3B%0A%20%20%20%20%20%20%20%20if%20%28first%20%3D%3D%200x200b%20%26%26%20%21prevInput%29%20prevInput%20%3D%20%22%5Cu200b%22%3B%0A%20%20%20%20%20%20%20%20if%20%28first%20%3D%3D%200x21da%29%20%7B%20this%2Ereset%28%29%3B%20return%20this%2Ecm%2EexecCommand%28%22undo%22%29%3B%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F%2F%20Find%20the%20part%20of%20the%20input%20that%20is%20actually%20new%0A%20%20%20%20%20%20var%20same%20%3D%200%2C%20l%20%3D%20Math%2Emin%28prevInput%2Elength%2C%20text%2Elength%29%3B%0A%20%20%20%20%20%20while%20%28same%20%3C%20l%20%26%26%20prevInput%2EcharCodeAt%28same%29%20%3D%3D%20text%2EcharCodeAt%28same%29%29%20%2B%2Bsame%3B%0A%0A%20%20%20%20%20%20var%20self%20%3D%20this%3B%0A%20%20%20%20%20%20runInOp%28cm%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20applyTextInput%28cm%2C%20text%2Eslice%28same%29%2C%20prevInput%2Elength%20%2D%20same%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20null%2C%20self%2Ecomposing%20%3F%20%22%2Acompose%22%20%3A%20null%29%3B%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20Don%27t%20leave%20long%20text%20in%20the%20textarea%2C%20since%20it%20makes%20further%20polling%20slow%0A%20%20%20%20%20%20%20%20if%20%28text%2Elength%20%3E%201000%20%7C%7C%20text%2EindexOf%28%22%5Cn%22%29%20%3E%20%2D1%29%20input%2Evalue%20%3D%20self%2EprevInput%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20else%20self%2EprevInput%20%3D%20text%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28self%2Ecomposing%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20self%2Ecomposing%2Erange%2Eclear%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20self%2Ecomposing%2Erange%20%3D%20cm%2EmarkText%28self%2Ecomposing%2Estart%2C%20cm%2EgetCursor%28%22to%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7BclassName%3A%20%22CodeMirror%2Dcomposing%22%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20ensurePolled%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28this%2EpollingFast%20%26%26%20this%2Epoll%28%29%29%20this%2EpollingFast%20%3D%20false%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20onKeyPress%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3E%3D%209%29%20this%2EhasSelection%20%3D%20null%3B%0A%20%20%20%20%20%20this%2EfastPoll%28%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20onContextMenu%3A%20function%28e%29%20%7B%0A%20%20%20%20%20%20var%20input%20%3D%20this%2C%20cm%20%3D%20input%2Ecm%2C%20display%20%3D%20cm%2Edisplay%2C%20te%20%3D%20input%2Etextarea%3B%0A%20%20%20%20%20%20var%20pos%20%3D%20posFromMouse%28cm%2C%20e%29%2C%20scrollPos%20%3D%20display%2Escroller%2EscrollTop%3B%0A%20%20%20%20%20%20if%20%28%21pos%20%7C%7C%20presto%29%20return%3B%20%2F%2F%20Opera%20is%20difficult%2E%0A%0A%20%20%20%20%20%20%2F%2F%20Reset%20the%20current%20text%20selection%20only%20if%20the%20click%20is%20done%20outside%20of%20the%20selection%0A%20%20%20%20%20%20%2F%2F%20and%20%27resetSelectionOnContextMenu%27%20option%20is%20true%2E%0A%20%20%20%20%20%20var%20reset%20%3D%20cm%2Eoptions%2EresetSelectionOnContextMenu%3B%0A%20%20%20%20%20%20if%20%28reset%20%26%26%20cm%2Edoc%2Esel%2Econtains%28pos%29%20%3D%3D%20%2D1%29%0A%20%20%20%20%20%20%20%20operation%28cm%2C%20setSelection%29%28cm%2Edoc%2C%20simpleSelection%28pos%29%2C%20sel%5FdontScroll%29%3B%0A%0A%20%20%20%20%20%20var%20oldCSS%20%3D%20te%2Estyle%2EcssText%3B%0A%20%20%20%20%20%20input%2Ewrapper%2Estyle%2Eposition%20%3D%20%22absolute%22%3B%0A%20%20%20%20%20%20te%2Estyle%2EcssText%20%3D%20%22position%3A%20fixed%3B%20width%3A%2030px%3B%20height%3A%2030px%3B%20top%3A%20%22%20%2B%20%28e%2EclientY%20%2D%205%29%20%2B%0A%20%20%20%20%20%20%20%20%22px%3B%20left%3A%20%22%20%2B%20%28e%2EclientX%20%2D%205%29%20%2B%20%22px%3B%20z%2Dindex%3A%201000%3B%20background%3A%20%22%20%2B%0A%20%20%20%20%20%20%20%20%28ie%20%3F%20%22rgba%28255%2C%20255%2C%20255%2C%20%2E05%29%22%20%3A%20%22transparent%22%29%20%2B%0A%20%20%20%20%20%20%20%20%22%3B%20outline%3A%20none%3B%20border%2Dwidth%3A%200%3B%20outline%3A%20none%3B%20overflow%3A%20hidden%3B%20opacity%3A%20%2E05%3B%20filter%3A%20alpha%28opacity%3D5%29%3B%22%3B%0A%20%20%20%20%20%20if%20%28webkit%29%20var%20oldScrollY%20%3D%20window%2EscrollY%3B%20%2F%2F%20Work%20around%20Chrome%20issue%20%28%232712%29%0A%20%20%20%20%20%20display%2Einput%2Efocus%28%29%3B%0A%20%20%20%20%20%20if%20%28webkit%29%20window%2EscrollTo%28null%2C%20oldScrollY%29%3B%0A%20%20%20%20%20%20display%2Einput%2Ereset%28%29%3B%0A%20%20%20%20%20%20%2F%2F%20Adds%20%22Select%20all%22%20to%20context%20menu%20in%20FF%0A%20%20%20%20%20%20if%20%28%21cm%2EsomethingSelected%28%29%29%20te%2Evalue%20%3D%20input%2EprevInput%20%3D%20%22%20%22%3B%0A%20%20%20%20%20%20input%2EcontextMenuPending%20%3D%20true%3B%0A%20%20%20%20%20%20display%2EselForContextMenu%20%3D%20cm%2Edoc%2Esel%3B%0A%20%20%20%20%20%20clearTimeout%28display%2EdetectingSelectAll%29%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Select%2Dall%20will%20be%20greyed%20out%20if%20there%27s%20nothing%20to%20select%2C%20so%0A%20%20%20%20%20%20%2F%2F%20this%20adds%20a%20zero%2Dwidth%20space%20so%20that%20we%20can%20later%20check%20whether%0A%20%20%20%20%20%20%2F%2F%20it%20got%20selected%2E%0A%20%20%20%20%20%20function%20prepareSelectAllHack%28%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28te%2EselectionStart%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20selected%20%3D%20cm%2EsomethingSelected%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20var%20extval%20%3D%20%22%5Cu200b%22%20%2B%20%28selected%20%3F%20te%2Evalue%20%3A%20%22%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20te%2Evalue%20%3D%20%22%5Cu21da%22%3B%20%2F%2F%20Used%20to%20catch%20context%2Dmenu%20undo%0A%20%20%20%20%20%20%20%20%20%20te%2Evalue%20%3D%20extval%3B%0A%20%20%20%20%20%20%20%20%20%20input%2EprevInput%20%3D%20selected%20%3F%20%22%22%20%3A%20%22%5Cu200b%22%3B%0A%20%20%20%20%20%20%20%20%20%20te%2EselectionStart%20%3D%201%3B%20te%2EselectionEnd%20%3D%20extval%2Elength%3B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Re%2Dset%20this%2C%20in%20case%20some%20other%20handler%20touched%20the%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20selection%20in%20the%20meantime%2E%0A%20%20%20%20%20%20%20%20%20%20display%2EselForContextMenu%20%3D%20cm%2Edoc%2Esel%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20function%20rehide%28%29%20%7B%0A%20%20%20%20%20%20%20%20input%2EcontextMenuPending%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20input%2Ewrapper%2Estyle%2Eposition%20%3D%20%22relative%22%3B%0A%20%20%20%20%20%20%20%20te%2Estyle%2EcssText%20%3D%20oldCSS%3B%0A%20%20%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%209%29%20display%2Escrollbars%2EsetScrollTop%28display%2Escroller%2EscrollTop%20%3D%20scrollPos%29%3B%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20Try%20to%20detect%20the%20user%20choosing%20select%2Dall%0A%20%20%20%20%20%20%20%20if%20%28te%2EselectionStart%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21ie%20%7C%7C%20%28ie%20%26%26%20ie%5Fversion%20%3C%209%29%29%20prepareSelectAllHack%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20var%20i%20%3D%200%2C%20poll%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28display%2EselForContextMenu%20%3D%3D%20cm%2Edoc%2Esel%20%26%26%20te%2EselectionStart%20%3D%3D%200%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20te%2EselectionEnd%20%3E%200%20%26%26%20input%2EprevInput%20%3D%3D%20%22%5Cu200b%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20operation%28cm%2C%20commands%2EselectAll%29%28cm%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28i%2B%2B%20%3C%2010%29%20display%2EdetectingSelectAll%20%3D%20setTimeout%28poll%2C%20500%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20display%2Einput%2Ereset%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20display%2EdetectingSelectAll%20%3D%20setTimeout%28poll%2C%20200%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3E%3D%209%29%20prepareSelectAllHack%28%29%3B%0A%20%20%20%20%20%20if%20%28captureRightClick%29%20%7B%0A%20%20%20%20%20%20%20%20e%5Fstop%28e%29%3B%0A%20%20%20%20%20%20%20%20var%20mouseup%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20off%28window%2C%20%22mouseup%22%2C%20mouseup%29%3B%0A%20%20%20%20%20%20%20%20%20%20setTimeout%28rehide%2C%2020%29%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20on%28window%2C%20%22mouseup%22%2C%20mouseup%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20setTimeout%28rehide%2C%2050%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20readOnlyChanged%3A%20function%28val%29%20%7B%0A%20%20%20%20%20%20if%20%28%21val%29%20this%2Ereset%28%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20setUneditable%3A%20nothing%2C%0A%0A%20%20%20%20needsContentAttribute%3A%20false%0A%20%20%7D%2C%20TextareaInput%2Eprototype%29%3B%0A%0A%20%20%2F%2F%20CONTENTEDITABLE%20INPUT%20STYLE%0A%0A%20%20function%20ContentEditableInput%28cm%29%20%7B%0A%20%20%20%20this%2Ecm%20%3D%20cm%3B%0A%20%20%20%20this%2ElastAnchorNode%20%3D%20this%2ElastAnchorOffset%20%3D%20this%2ElastFocusNode%20%3D%20this%2ElastFocusOffset%20%3D%20null%3B%0A%20%20%20%20this%2Epolling%20%3D%20new%20Delayed%28%29%3B%0A%20%20%20%20this%2EgracePeriod%20%3D%20false%3B%0A%20%20%7D%0A%0A%20%20ContentEditableInput%2Eprototype%20%3D%20copyObj%28%7B%0A%20%20%20%20init%3A%20function%28display%29%20%7B%0A%20%20%20%20%20%20var%20input%20%3D%20this%2C%20cm%20%3D%20input%2Ecm%3B%0A%20%20%20%20%20%20var%20div%20%3D%20input%2Ediv%20%3D%20display%2ElineDiv%3B%0A%20%20%20%20%20%20disableBrowserMagic%28div%29%3B%0A%0A%20%20%20%20%20%20on%28div%2C%20%22paste%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21signalDOMEvent%28cm%2C%20e%29%29%20handlePaste%28e%2C%20cm%29%3B%0A%20%20%20%20%20%20%7D%29%0A%0A%20%20%20%20%20%20on%28div%2C%20%22compositionstart%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20var%20data%20%3D%20e%2Edata%3B%0A%20%20%20%20%20%20%20%20input%2Ecomposing%20%3D%20%7Bsel%3A%20cm%2Edoc%2Esel%2C%20data%3A%20data%2C%20startData%3A%20data%7D%3B%0A%20%20%20%20%20%20%20%20if%20%28%21data%29%20return%3B%0A%20%20%20%20%20%20%20%20var%20prim%20%3D%20cm%2Edoc%2Esel%2Eprimary%28%29%3B%0A%20%20%20%20%20%20%20%20var%20line%20%3D%20cm%2EgetLine%28prim%2Ehead%2Eline%29%3B%0A%20%20%20%20%20%20%20%20var%20found%20%3D%20line%2EindexOf%28data%2C%20Math%2Emax%280%2C%20prim%2Ehead%2Ech%20%2D%20data%2Elength%29%29%3B%0A%20%20%20%20%20%20%20%20if%20%28found%20%3E%20%2D1%20%26%26%20found%20%3C%3D%20prim%2Ehead%2Ech%29%0A%20%20%20%20%20%20%20%20%20%20input%2Ecomposing%2Esel%20%3D%20simpleSelection%28Pos%28prim%2Ehead%2Eline%2C%20found%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Pos%28prim%2Ehead%2Eline%2C%20found%20%2B%20data%2Elength%29%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20on%28div%2C%20%22compositionupdate%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20input%2Ecomposing%2Edata%20%3D%20e%2Edata%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20on%28div%2C%20%22compositionend%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20var%20ours%20%3D%20input%2Ecomposing%3B%0A%20%20%20%20%20%20%20%20if%20%28%21ours%29%20return%3B%0A%20%20%20%20%20%20%20%20if%20%28e%2Edata%20%21%3D%20ours%2EstartData%20%26%26%20%21%2F%5Cu200b%2F%2Etest%28e%2Edata%29%29%0A%20%20%20%20%20%20%20%20%20%20ours%2Edata%20%3D%20e%2Edata%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20Need%20a%20small%20delay%20to%20prevent%20other%20code%20%28input%20event%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20selection%20polling%29%20from%20doing%20damage%20when%20fired%20right%20after%0A%20%20%20%20%20%20%20%20%2F%2F%20compositionend%2E%0A%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21ours%2Ehandled%29%0A%20%20%20%20%20%20%20%20%20%20%20%20input%2EapplyComposition%28ours%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28input%2Ecomposing%20%3D%3D%20ours%29%0A%20%20%20%20%20%20%20%20%20%20%20%20input%2Ecomposing%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20%7D%2C%2050%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20on%28div%2C%20%22touchstart%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20input%2EforceCompositionEnd%28%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20on%28div%2C%20%22input%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28input%2Ecomposing%29%20return%3B%0A%20%20%20%20%20%20%20%20if%20%28cm%2EisReadOnly%28%29%20%7C%7C%20%21input%2EpollContent%28%29%29%0A%20%20%20%20%20%20%20%20%20%20runInOp%28input%2Ecm%2C%20function%28%29%20%7BregChange%28cm%29%3B%7D%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20function%20onCopyCut%28e%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28signalDOMEvent%28cm%2C%20e%29%29%20return%0A%20%20%20%20%20%20%20%20if%20%28cm%2EsomethingSelected%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20lastCopied%20%3D%20cm%2EgetSelections%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28e%2Etype%20%3D%3D%20%22cut%22%29%20cm%2EreplaceSelection%28%22%22%2C%20null%2C%20%22cut%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28%21cm%2Eoptions%2ElineWiseCopyCut%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20ranges%20%3D%20copyableRanges%28cm%29%3B%0A%20%20%20%20%20%20%20%20%20%20lastCopied%20%3D%20ranges%2Etext%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28e%2Etype%20%3D%3D%20%22cut%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20cm%2Eoperation%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20cm%2EsetSelections%28ranges%2Eranges%2C%200%2C%20sel%5FdontScroll%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20cm%2EreplaceSelection%28%22%22%2C%20null%2C%20%22cut%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%2F%2F%20iOS%20exposes%20the%20clipboard%20API%2C%20but%20seems%20to%20discard%20content%20inserted%20into%20it%0A%20%20%20%20%20%20%20%20if%20%28e%2EclipboardData%20%26%26%20%21ios%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20e%2EpreventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20e%2EclipboardData%2EclearData%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20e%2EclipboardData%2EsetData%28%22text%2Fplain%22%2C%20lastCopied%2Ejoin%28%22%5Cn%22%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Old%2Dfashioned%20briefly%2Dfocus%2Da%2Dtextarea%20hack%0A%20%20%20%20%20%20%20%20%20%20var%20kludge%20%3D%20hiddenTextarea%28%29%2C%20te%20%3D%20kludge%2EfirstChild%3B%0A%20%20%20%20%20%20%20%20%20%20cm%2Edisplay%2ElineSpace%2EinsertBefore%28kludge%2C%20cm%2Edisplay%2ElineSpace%2EfirstChild%29%3B%0A%20%20%20%20%20%20%20%20%20%20te%2Evalue%20%3D%20lastCopied%2Ejoin%28%22%5Cn%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20var%20hadFocus%20%3D%20document%2EactiveElement%3B%0A%20%20%20%20%20%20%20%20%20%20selectInput%28te%29%3B%0A%20%20%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20cm%2Edisplay%2ElineSpace%2EremoveChild%28kludge%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20hadFocus%2Efocus%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%2050%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20on%28div%2C%20%22copy%22%2C%20onCopyCut%29%3B%0A%20%20%20%20%20%20on%28div%2C%20%22cut%22%2C%20onCopyCut%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20prepareSelection%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20result%20%3D%20prepareSelection%28this%2Ecm%2C%20false%29%3B%0A%20%20%20%20%20%20result%2Efocus%20%3D%20this%2Ecm%2Estate%2Efocused%3B%0A%20%20%20%20%20%20return%20result%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20showSelection%3A%20function%28info%29%20%7B%0A%20%20%20%20%20%20if%20%28%21info%20%7C%7C%20%21this%2Ecm%2Edisplay%2Eview%2Elength%29%20return%3B%0A%20%20%20%20%20%20if%20%28info%2Efocus%29%20this%2EshowPrimarySelection%28%29%3B%0A%20%20%20%20%20%20this%2EshowMultipleSelections%28info%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20showPrimarySelection%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20sel%20%3D%20window%2EgetSelection%28%29%2C%20prim%20%3D%20this%2Ecm%2Edoc%2Esel%2Eprimary%28%29%3B%0A%20%20%20%20%20%20var%20curAnchor%20%3D%20domToPos%28this%2Ecm%2C%20sel%2EanchorNode%2C%20sel%2EanchorOffset%29%3B%0A%20%20%20%20%20%20var%20curFocus%20%3D%20domToPos%28this%2Ecm%2C%20sel%2EfocusNode%2C%20sel%2EfocusOffset%29%3B%0A%20%20%20%20%20%20if%20%28curAnchor%20%26%26%20%21curAnchor%2Ebad%20%26%26%20curFocus%20%26%26%20%21curFocus%2Ebad%20%26%26%0A%20%20%20%20%20%20%20%20%20%20cmp%28minPos%28curAnchor%2C%20curFocus%29%2C%20prim%2Efrom%28%29%29%20%3D%3D%200%20%26%26%0A%20%20%20%20%20%20%20%20%20%20cmp%28maxPos%28curAnchor%2C%20curFocus%29%2C%20prim%2Eto%28%29%29%20%3D%3D%200%29%0A%20%20%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20%20%20var%20start%20%3D%20posToDOM%28this%2Ecm%2C%20prim%2Efrom%28%29%29%3B%0A%20%20%20%20%20%20var%20end%20%3D%20posToDOM%28this%2Ecm%2C%20prim%2Eto%28%29%29%3B%0A%20%20%20%20%20%20if%20%28%21start%20%26%26%20%21end%29%20return%3B%0A%0A%20%20%20%20%20%20var%20view%20%3D%20this%2Ecm%2Edisplay%2Eview%3B%0A%20%20%20%20%20%20var%20old%20%3D%20sel%2ErangeCount%20%26%26%20sel%2EgetRangeAt%280%29%3B%0A%20%20%20%20%20%20if%20%28%21start%29%20%7B%0A%20%20%20%20%20%20%20%20start%20%3D%20%7Bnode%3A%20view%5B0%5D%2Emeasure%2Emap%5B2%5D%2C%20offset%3A%200%7D%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28%21end%29%20%7B%20%2F%2F%20FIXME%20dangerously%20hacky%0A%20%20%20%20%20%20%20%20var%20measure%20%3D%20view%5Bview%2Elength%20%2D%201%5D%2Emeasure%3B%0A%20%20%20%20%20%20%20%20var%20map%20%3D%20measure%2Emaps%20%3F%20measure%2Emaps%5Bmeasure%2Emaps%2Elength%20%2D%201%5D%20%3A%20measure%2Emap%3B%0A%20%20%20%20%20%20%20%20end%20%3D%20%7Bnode%3A%20map%5Bmap%2Elength%20%2D%201%5D%2C%20offset%3A%20map%5Bmap%2Elength%20%2D%202%5D%20%2D%20map%5Bmap%2Elength%20%2D%203%5D%7D%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20try%20%7B%20var%20rng%20%3D%20range%28start%2Enode%2C%20start%2Eoffset%2C%20end%2Eoffset%2C%20end%2Enode%29%3B%20%7D%0A%20%20%20%20%20%20catch%28e%29%20%7B%7D%20%2F%2F%20Our%20model%20of%20the%20DOM%20might%20be%20outdated%2C%20in%20which%20case%20the%20range%20we%20try%20to%20set%20can%20be%20impossible%0A%20%20%20%20%20%20if%20%28rng%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21gecko%20%26%26%20this%2Ecm%2Estate%2Efocused%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20sel%2Ecollapse%28start%2Enode%2C%20start%2Eoffset%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21rng%2Ecollapsed%29%20sel%2EaddRange%28rng%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20sel%2EremoveAllRanges%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20sel%2EaddRange%28rng%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28old%20%26%26%20sel%2EanchorNode%20%3D%3D%20null%29%20sel%2EaddRange%28old%29%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28gecko%29%20this%2EstartGracePeriod%28%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20this%2ErememberSelection%28%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20startGracePeriod%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20input%20%3D%20this%3B%0A%20%20%20%20%20%20clearTimeout%28this%2EgracePeriod%29%3B%0A%20%20%20%20%20%20this%2EgracePeriod%20%3D%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20input%2EgracePeriod%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20if%20%28input%2EselectionChanged%28%29%29%0A%20%20%20%20%20%20%20%20%20%20input%2Ecm%2Eoperation%28function%28%29%20%7B%20input%2Ecm%2EcurOp%2EselectionChanged%20%3D%20true%3B%20%7D%29%3B%0A%20%20%20%20%20%20%7D%2C%2020%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20showMultipleSelections%3A%20function%28info%29%20%7B%0A%20%20%20%20%20%20removeChildrenAndAdd%28this%2Ecm%2Edisplay%2EcursorDiv%2C%20info%2Ecursors%29%3B%0A%20%20%20%20%20%20removeChildrenAndAdd%28this%2Ecm%2Edisplay%2EselectionDiv%2C%20info%2Eselection%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20rememberSelection%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20sel%20%3D%20window%2EgetSelection%28%29%3B%0A%20%20%20%20%20%20this%2ElastAnchorNode%20%3D%20sel%2EanchorNode%3B%20this%2ElastAnchorOffset%20%3D%20sel%2EanchorOffset%3B%0A%20%20%20%20%20%20this%2ElastFocusNode%20%3D%20sel%2EfocusNode%3B%20this%2ElastFocusOffset%20%3D%20sel%2EfocusOffset%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20selectionInEditor%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20sel%20%3D%20window%2EgetSelection%28%29%3B%0A%20%20%20%20%20%20if%20%28%21sel%2ErangeCount%29%20return%20false%3B%0A%20%20%20%20%20%20var%20node%20%3D%20sel%2EgetRangeAt%280%29%2EcommonAncestorContainer%3B%0A%20%20%20%20%20%20return%20contains%28this%2Ediv%2C%20node%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20focus%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28this%2Ecm%2Eoptions%2EreadOnly%20%21%3D%20%22nocursor%22%29%20this%2Ediv%2Efocus%28%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20blur%3A%20function%28%29%20%7B%20this%2Ediv%2Eblur%28%29%3B%20%7D%2C%0A%20%20%20%20getField%3A%20function%28%29%20%7B%20return%20this%2Ediv%3B%20%7D%2C%0A%0A%20%20%20%20supportsTouch%3A%20function%28%29%20%7B%20return%20true%3B%20%7D%2C%0A%0A%20%20%20%20receivedFocus%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20input%20%3D%20this%3B%0A%20%20%20%20%20%20if%20%28this%2EselectionInEditor%28%29%29%0A%20%20%20%20%20%20%20%20this%2EpollSelection%28%29%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20runInOp%28this%2Ecm%2C%20function%28%29%20%7B%20input%2Ecm%2EcurOp%2EselectionChanged%20%3D%20true%3B%20%7D%29%3B%0A%0A%20%20%20%20%20%20function%20poll%28%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28input%2Ecm%2Estate%2Efocused%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20input%2EpollSelection%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20input%2Epolling%2Eset%28input%2Ecm%2Eoptions%2EpollInterval%2C%20poll%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20this%2Epolling%2Eset%28this%2Ecm%2Eoptions%2EpollInterval%2C%20poll%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20selectionChanged%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20sel%20%3D%20window%2EgetSelection%28%29%3B%0A%20%20%20%20%20%20return%20sel%2EanchorNode%20%21%3D%20this%2ElastAnchorNode%20%7C%7C%20sel%2EanchorOffset%20%21%3D%20this%2ElastAnchorOffset%20%7C%7C%0A%20%20%20%20%20%20%20%20sel%2EfocusNode%20%21%3D%20this%2ElastFocusNode%20%7C%7C%20sel%2EfocusOffset%20%21%3D%20this%2ElastFocusOffset%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20pollSelection%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28%21this%2Ecomposing%20%26%26%20%21this%2EgracePeriod%20%26%26%20this%2EselectionChanged%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20var%20sel%20%3D%20window%2EgetSelection%28%29%2C%20cm%20%3D%20this%2Ecm%3B%0A%20%20%20%20%20%20%20%20this%2ErememberSelection%28%29%3B%0A%20%20%20%20%20%20%20%20var%20anchor%20%3D%20domToPos%28cm%2C%20sel%2EanchorNode%2C%20sel%2EanchorOffset%29%3B%0A%20%20%20%20%20%20%20%20var%20head%20%3D%20domToPos%28cm%2C%20sel%2EfocusNode%2C%20sel%2EfocusOffset%29%3B%0A%20%20%20%20%20%20%20%20if%20%28anchor%20%26%26%20head%29%20runInOp%28cm%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20setSelection%28cm%2Edoc%2C%20simpleSelection%28anchor%2C%20head%29%2C%20sel%5FdontScroll%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28anchor%2Ebad%20%7C%7C%20head%2Ebad%29%20cm%2EcurOp%2EselectionChanged%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20pollContent%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20cm%20%3D%20this%2Ecm%2C%20display%20%3D%20cm%2Edisplay%2C%20sel%20%3D%20cm%2Edoc%2Esel%2Eprimary%28%29%3B%0A%20%20%20%20%20%20var%20from%20%3D%20sel%2Efrom%28%29%2C%20to%20%3D%20sel%2Eto%28%29%3B%0A%20%20%20%20%20%20if%20%28from%2Eline%20%3C%20display%2EviewFrom%20%7C%7C%20to%2Eline%20%3E%20display%2EviewTo%20%2D%201%29%20return%20false%3B%0A%0A%20%20%20%20%20%20var%20fromIndex%3B%0A%20%20%20%20%20%20if%20%28from%2Eline%20%3D%3D%20display%2EviewFrom%20%7C%7C%20%28fromIndex%20%3D%20findViewIndex%28cm%2C%20from%2Eline%29%29%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20var%20fromLine%20%3D%20lineNo%28display%2Eview%5B0%5D%2Eline%29%3B%0A%20%20%20%20%20%20%20%20var%20fromNode%20%3D%20display%2Eview%5B0%5D%2Enode%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20var%20fromLine%20%3D%20lineNo%28display%2Eview%5BfromIndex%5D%2Eline%29%3B%0A%20%20%20%20%20%20%20%20var%20fromNode%20%3D%20display%2Eview%5BfromIndex%20%2D%201%5D%2Enode%2EnextSibling%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20toIndex%20%3D%20findViewIndex%28cm%2C%20to%2Eline%29%3B%0A%20%20%20%20%20%20if%20%28toIndex%20%3D%3D%20display%2Eview%2Elength%20%2D%201%29%20%7B%0A%20%20%20%20%20%20%20%20var%20toLine%20%3D%20display%2EviewTo%20%2D%201%3B%0A%20%20%20%20%20%20%20%20var%20toNode%20%3D%20display%2ElineDiv%2ElastChild%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20var%20toLine%20%3D%20lineNo%28display%2Eview%5BtoIndex%20%2B%201%5D%2Eline%29%20%2D%201%3B%0A%20%20%20%20%20%20%20%20var%20toNode%20%3D%20display%2Eview%5BtoIndex%20%2B%201%5D%2Enode%2EpreviousSibling%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20var%20newText%20%3D%20cm%2Edoc%2EsplitLines%28domTextBetween%28cm%2C%20fromNode%2C%20toNode%2C%20fromLine%2C%20toLine%29%29%3B%0A%20%20%20%20%20%20var%20oldText%20%3D%20getBetween%28cm%2Edoc%2C%20Pos%28fromLine%2C%200%29%2C%20Pos%28toLine%2C%20getLine%28cm%2Edoc%2C%20toLine%29%2Etext%2Elength%29%29%3B%0A%20%20%20%20%20%20while%20%28newText%2Elength%20%3E%201%20%26%26%20oldText%2Elength%20%3E%201%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28lst%28newText%29%20%3D%3D%20lst%28oldText%29%29%20%7B%20newText%2Epop%28%29%3B%20oldText%2Epop%28%29%3B%20toLine%2D%2D%3B%20%7D%0A%20%20%20%20%20%20%20%20else%20if%20%28newText%5B0%5D%20%3D%3D%20oldText%5B0%5D%29%20%7B%20newText%2Eshift%28%29%3B%20oldText%2Eshift%28%29%3B%20fromLine%2B%2B%3B%20%7D%0A%20%20%20%20%20%20%20%20else%20break%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20var%20cutFront%20%3D%200%2C%20cutEnd%20%3D%200%3B%0A%20%20%20%20%20%20var%20newTop%20%3D%20newText%5B0%5D%2C%20oldTop%20%3D%20oldText%5B0%5D%2C%20maxCutFront%20%3D%20Math%2Emin%28newTop%2Elength%2C%20oldTop%2Elength%29%3B%0A%20%20%20%20%20%20while%20%28cutFront%20%3C%20maxCutFront%20%26%26%20newTop%2EcharCodeAt%28cutFront%29%20%3D%3D%20oldTop%2EcharCodeAt%28cutFront%29%29%0A%20%20%20%20%20%20%20%20%2B%2BcutFront%3B%0A%20%20%20%20%20%20var%20newBot%20%3D%20lst%28newText%29%2C%20oldBot%20%3D%20lst%28oldText%29%3B%0A%20%20%20%20%20%20var%20maxCutEnd%20%3D%20Math%2Emin%28newBot%2Elength%20%2D%20%28newText%2Elength%20%3D%3D%201%20%3F%20cutFront%20%3A%200%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20oldBot%2Elength%20%2D%20%28oldText%2Elength%20%3D%3D%201%20%3F%20cutFront%20%3A%200%29%29%3B%0A%20%20%20%20%20%20while%20%28cutEnd%20%3C%20maxCutEnd%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20newBot%2EcharCodeAt%28newBot%2Elength%20%2D%20cutEnd%20%2D%201%29%20%3D%3D%20oldBot%2EcharCodeAt%28oldBot%2Elength%20%2D%20cutEnd%20%2D%201%29%29%0A%20%20%20%20%20%20%20%20%2B%2BcutEnd%3B%0A%0A%20%20%20%20%20%20newText%5BnewText%2Elength%20%2D%201%5D%20%3D%20newBot%2Eslice%280%2C%20newBot%2Elength%20%2D%20cutEnd%29%3B%0A%20%20%20%20%20%20newText%5B0%5D%20%3D%20newText%5B0%5D%2Eslice%28cutFront%29%3B%0A%0A%20%20%20%20%20%20var%20chFrom%20%3D%20Pos%28fromLine%2C%20cutFront%29%3B%0A%20%20%20%20%20%20var%20chTo%20%3D%20Pos%28toLine%2C%20oldText%2Elength%20%3F%20lst%28oldText%29%2Elength%20%2D%20cutEnd%20%3A%200%29%3B%0A%20%20%20%20%20%20if%20%28newText%2Elength%20%3E%201%20%7C%7C%20newText%5B0%5D%20%7C%7C%20cmp%28chFrom%2C%20chTo%29%29%20%7B%0A%20%20%20%20%20%20%20%20replaceRange%28cm%2Edoc%2C%20newText%2C%20chFrom%2C%20chTo%2C%20%22%2Binput%22%29%3B%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20ensurePolled%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20this%2EforceCompositionEnd%28%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20reset%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20this%2EforceCompositionEnd%28%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20forceCompositionEnd%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28%21this%2Ecomposing%20%7C%7C%20this%2Ecomposing%2Ehandled%29%20return%3B%0A%20%20%20%20%20%20this%2EapplyComposition%28this%2Ecomposing%29%3B%0A%20%20%20%20%20%20this%2Ecomposing%2Ehandled%20%3D%20true%3B%0A%20%20%20%20%20%20this%2Ediv%2Eblur%28%29%3B%0A%20%20%20%20%20%20this%2Ediv%2Efocus%28%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20applyComposition%3A%20function%28composing%29%20%7B%0A%20%20%20%20%20%20if%20%28this%2Ecm%2EisReadOnly%28%29%29%0A%20%20%20%20%20%20%20%20operation%28this%2Ecm%2C%20regChange%29%28this%2Ecm%29%0A%20%20%20%20%20%20else%20if%20%28composing%2Edata%20%26%26%20composing%2Edata%20%21%3D%20composing%2EstartData%29%0A%20%20%20%20%20%20%20%20operation%28this%2Ecm%2C%20applyTextInput%29%28this%2Ecm%2C%20composing%2Edata%2C%200%2C%20composing%2Esel%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20setUneditable%3A%20function%28node%29%20%7B%0A%20%20%20%20%20%20node%2EcontentEditable%20%3D%20%22false%22%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20onKeyPress%3A%20function%28e%29%20%7B%0A%20%20%20%20%20%20e%2EpreventDefault%28%29%3B%0A%20%20%20%20%20%20if%20%28%21this%2Ecm%2EisReadOnly%28%29%29%0A%20%20%20%20%20%20%20%20operation%28this%2Ecm%2C%20applyTextInput%29%28this%2Ecm%2C%20String%2EfromCharCode%28e%2EcharCode%20%3D%3D%20null%20%3F%20e%2EkeyCode%20%3A%20e%2EcharCode%29%2C%200%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20readOnlyChanged%3A%20function%28val%29%20%7B%0A%20%20%20%20%20%20this%2Ediv%2EcontentEditable%20%3D%20String%28val%20%21%3D%20%22nocursor%22%29%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20onContextMenu%3A%20nothing%2C%0A%20%20%20%20resetPosition%3A%20nothing%2C%0A%0A%20%20%20%20needsContentAttribute%3A%20true%0A%20%20%7D%2C%20ContentEditableInput%2Eprototype%29%3B%0A%0A%20%20function%20posToDOM%28cm%2C%20pos%29%20%7B%0A%20%20%20%20var%20view%20%3D%20findViewForLine%28cm%2C%20pos%2Eline%29%3B%0A%20%20%20%20if%20%28%21view%20%7C%7C%20view%2Ehidden%29%20return%20null%3B%0A%20%20%20%20var%20line%20%3D%20getLine%28cm%2Edoc%2C%20pos%2Eline%29%3B%0A%20%20%20%20var%20info%20%3D%20mapFromLineView%28view%2C%20line%2C%20pos%2Eline%29%3B%0A%0A%20%20%20%20var%20order%20%3D%20getOrder%28line%29%2C%20side%20%3D%20%22left%22%3B%0A%20%20%20%20if%20%28order%29%20%7B%0A%20%20%20%20%20%20var%20partPos%20%3D%20getBidiPartAt%28order%2C%20pos%2Ech%29%3B%0A%20%20%20%20%20%20side%20%3D%20partPos%20%25%202%20%3F%20%22right%22%20%3A%20%22left%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20result%20%3D%20nodeAndOffsetInLineMap%28info%2Emap%2C%20pos%2Ech%2C%20side%29%3B%0A%20%20%20%20result%2Eoffset%20%3D%20result%2Ecollapse%20%3D%3D%20%22right%22%20%3F%20result%2Eend%20%3A%20result%2Estart%3B%0A%20%20%20%20return%20result%3B%0A%20%20%7D%0A%0A%20%20function%20badPos%28pos%2C%20bad%29%20%7B%20if%20%28bad%29%20pos%2Ebad%20%3D%20true%3B%20return%20pos%3B%20%7D%0A%0A%20%20function%20domToPos%28cm%2C%20node%2C%20offset%29%20%7B%0A%20%20%20%20var%20lineNode%3B%0A%20%20%20%20if%20%28node%20%3D%3D%20cm%2Edisplay%2ElineDiv%29%20%7B%0A%20%20%20%20%20%20lineNode%20%3D%20cm%2Edisplay%2ElineDiv%2EchildNodes%5Boffset%5D%3B%0A%20%20%20%20%20%20if%20%28%21lineNode%29%20return%20badPos%28cm%2EclipPos%28Pos%28cm%2Edisplay%2EviewTo%20%2D%201%29%29%2C%20true%29%3B%0A%20%20%20%20%20%20node%20%3D%20null%3B%20offset%20%3D%200%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20for%20%28lineNode%20%3D%20node%3B%3B%20lineNode%20%3D%20lineNode%2EparentNode%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21lineNode%20%7C%7C%20lineNode%20%3D%3D%20cm%2Edisplay%2ElineDiv%29%20return%20null%3B%0A%20%20%20%20%20%20%20%20if%20%28lineNode%2EparentNode%20%26%26%20lineNode%2EparentNode%20%3D%3D%20cm%2Edisplay%2ElineDiv%29%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20cm%2Edisplay%2Eview%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20lineView%20%3D%20cm%2Edisplay%2Eview%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28lineView%2Enode%20%3D%3D%20lineNode%29%0A%20%20%20%20%20%20%20%20return%20locateNodeInLineView%28lineView%2C%20node%2C%20offset%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20locateNodeInLineView%28lineView%2C%20node%2C%20offset%29%20%7B%0A%20%20%20%20var%20wrapper%20%3D%20lineView%2Etext%2EfirstChild%2C%20bad%20%3D%20false%3B%0A%20%20%20%20if%20%28%21node%20%7C%7C%20%21contains%28wrapper%2C%20node%29%29%20return%20badPos%28Pos%28lineNo%28lineView%2Eline%29%2C%200%29%2C%20true%29%3B%0A%20%20%20%20if%20%28node%20%3D%3D%20wrapper%29%20%7B%0A%20%20%20%20%20%20bad%20%3D%20true%3B%0A%20%20%20%20%20%20node%20%3D%20wrapper%2EchildNodes%5Boffset%5D%3B%0A%20%20%20%20%20%20offset%20%3D%200%3B%0A%20%20%20%20%20%20if%20%28%21node%29%20%7B%0A%20%20%20%20%20%20%20%20var%20line%20%3D%20lineView%2Erest%20%3F%20lst%28lineView%2Erest%29%20%3A%20lineView%2Eline%3B%0A%20%20%20%20%20%20%20%20return%20badPos%28Pos%28lineNo%28line%29%2C%20line%2Etext%2Elength%29%2C%20bad%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20textNode%20%3D%20node%2EnodeType%20%3D%3D%203%20%3F%20node%20%3A%20null%2C%20topNode%20%3D%20node%3B%0A%20%20%20%20if%20%28%21textNode%20%26%26%20node%2EchildNodes%2Elength%20%3D%3D%201%20%26%26%20node%2EfirstChild%2EnodeType%20%3D%3D%203%29%20%7B%0A%20%20%20%20%20%20textNode%20%3D%20node%2EfirstChild%3B%0A%20%20%20%20%20%20if%20%28offset%29%20offset%20%3D%20textNode%2EnodeValue%2Elength%3B%0A%20%20%20%20%7D%0A%20%20%20%20while%20%28topNode%2EparentNode%20%21%3D%20wrapper%29%20topNode%20%3D%20topNode%2EparentNode%3B%0A%20%20%20%20var%20measure%20%3D%20lineView%2Emeasure%2C%20maps%20%3D%20measure%2Emaps%3B%0A%0A%20%20%20%20function%20find%28textNode%2C%20topNode%2C%20offset%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%20%2D1%3B%20i%20%3C%20%28maps%20%3F%20maps%2Elength%20%3A%200%29%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20map%20%3D%20i%20%3C%200%20%3F%20measure%2Emap%20%3A%20maps%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20map%2Elength%3B%20j%20%2B%3D%203%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20curNode%20%3D%20map%5Bj%20%2B%202%5D%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28curNode%20%3D%3D%20textNode%20%7C%7C%20curNode%20%3D%3D%20topNode%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20line%20%3D%20lineNo%28i%20%3C%200%20%3F%20lineView%2Eline%20%3A%20lineView%2Erest%5Bi%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20ch%20%3D%20map%5Bj%5D%20%2B%20offset%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28offset%20%3C%200%20%7C%7C%20curNode%20%21%3D%20textNode%29%20ch%20%3D%20map%5Bj%20%2B%20%28offset%20%3F%201%20%3A%200%29%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Pos%28line%2C%20ch%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20var%20found%20%3D%20find%28textNode%2C%20topNode%2C%20offset%29%3B%0A%20%20%20%20if%20%28found%29%20return%20badPos%28found%2C%20bad%29%3B%0A%0A%20%20%20%20%2F%2F%20FIXME%20this%20is%20all%20really%20shaky%2E%20might%20handle%20the%20few%20cases%20it%20needs%20to%20handle%2C%20but%20likely%20to%20cause%20problems%0A%20%20%20%20for%20%28var%20after%20%3D%20topNode%2EnextSibling%2C%20dist%20%3D%20textNode%20%3F%20textNode%2EnodeValue%2Elength%20%2D%20offset%20%3A%200%3B%20after%3B%20after%20%3D%20after%2EnextSibling%29%20%7B%0A%20%20%20%20%20%20found%20%3D%20find%28after%2C%20after%2EfirstChild%2C%200%29%3B%0A%20%20%20%20%20%20if%20%28found%29%0A%20%20%20%20%20%20%20%20return%20badPos%28Pos%28found%2Eline%2C%20found%2Ech%20%2D%20dist%29%2C%20bad%29%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20dist%20%2B%3D%20after%2EtextContent%2Elength%3B%0A%20%20%20%20%7D%0A%20%20%20%20for%20%28var%20before%20%3D%20topNode%2EpreviousSibling%2C%20dist%20%3D%20offset%3B%20before%3B%20before%20%3D%20before%2EpreviousSibling%29%20%7B%0A%20%20%20%20%20%20found%20%3D%20find%28before%2C%20before%2EfirstChild%2C%20%2D1%29%3B%0A%20%20%20%20%20%20if%20%28found%29%0A%20%20%20%20%20%20%20%20return%20badPos%28Pos%28found%2Eline%2C%20found%2Ech%20%2B%20dist%29%2C%20bad%29%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20dist%20%2B%3D%20after%2EtextContent%2Elength%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20domTextBetween%28cm%2C%20from%2C%20to%2C%20fromLine%2C%20toLine%29%20%7B%0A%20%20%20%20var%20text%20%3D%20%22%22%2C%20closing%20%3D%20false%2C%20lineSep%20%3D%20cm%2Edoc%2ElineSeparator%28%29%3B%0A%20%20%20%20function%20recognizeMarker%28id%29%20%7B%20return%20function%28marker%29%20%7B%20return%20marker%2Eid%20%3D%3D%20id%3B%20%7D%3B%20%7D%0A%20%20%20%20function%20walk%28node%29%20%7B%0A%20%20%20%20%20%20if%20%28node%2EnodeType%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20%20%20var%20cmText%20%3D%20node%2EgetAttribute%28%22cm%2Dtext%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28cmText%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28cmText%20%3D%3D%20%22%22%29%20cmText%20%3D%20node%2EtextContent%2Ereplace%28%2F%5Cu200b%2Fg%2C%20%22%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20text%20%2B%3D%20cmText%3B%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20var%20markerID%20%3D%20node%2EgetAttribute%28%22cm%2Dmarker%22%29%2C%20range%3B%0A%20%20%20%20%20%20%20%20if%20%28markerID%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20found%20%3D%20cm%2EfindMarks%28Pos%28fromLine%2C%200%29%2C%20Pos%28toLine%20%2B%201%2C%200%29%2C%20recognizeMarker%28%2BmarkerID%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28found%2Elength%20%26%26%20%28range%20%3D%20found%5B0%5D%2Efind%28%29%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20text%20%2B%3D%20getBetween%28cm%2Edoc%2C%20range%2Efrom%2C%20range%2Eto%29%2Ejoin%28lineSep%29%3B%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28node%2EgetAttribute%28%22contenteditable%22%29%20%3D%3D%20%22false%22%29%20return%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20node%2EchildNodes%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20%20%20walk%28node%2EchildNodes%5Bi%5D%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%2F%5E%28pre%7Cdiv%7Cp%29%24%2Fi%2Etest%28node%2EnodeName%29%29%0A%20%20%20%20%20%20%20%20%20%20closing%20%3D%20true%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28node%2EnodeType%20%3D%3D%203%29%20%7B%0A%20%20%20%20%20%20%20%20var%20val%20%3D%20node%2EnodeValue%3B%0A%20%20%20%20%20%20%20%20if%20%28%21val%29%20return%3B%0A%20%20%20%20%20%20%20%20if%20%28closing%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20text%20%2B%3D%20lineSep%3B%0A%20%20%20%20%20%20%20%20%20%20closing%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20text%20%2B%3D%20val%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20walk%28from%29%3B%0A%20%20%20%20%20%20if%20%28from%20%3D%3D%20to%29%20break%3B%0A%20%20%20%20%20%20from%20%3D%20from%2EnextSibling%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20text%3B%0A%20%20%7D%0A%0A%20%20CodeMirror%2EinputStyles%20%3D%20%7B%22textarea%22%3A%20TextareaInput%2C%20%22contenteditable%22%3A%20ContentEditableInput%7D%3B%0A%0A%20%20%2F%2F%20SELECTION%20%2F%20CURSOR%0A%0A%20%20%2F%2F%20Selection%20objects%20are%20immutable%2E%20A%20new%20one%20is%20created%20every%20time%0A%20%20%2F%2F%20the%20selection%20changes%2E%20A%20selection%20is%20one%20or%20more%20non%2Doverlapping%0A%20%20%2F%2F%20%28and%20non%2Dtouching%29%20ranges%2C%20sorted%2C%20and%20an%20integer%20that%20indicates%0A%20%20%2F%2F%20which%20one%20is%20the%20primary%20selection%20%28the%20one%20that%27s%20scrolled%20into%0A%20%20%2F%2F%20view%2C%20that%20getCursor%20returns%2C%20etc%29%2E%0A%20%20function%20Selection%28ranges%2C%20primIndex%29%20%7B%0A%20%20%20%20this%2Eranges%20%3D%20ranges%3B%0A%20%20%20%20this%2EprimIndex%20%3D%20primIndex%3B%0A%20%20%7D%0A%0A%20%20Selection%2Eprototype%20%3D%20%7B%0A%20%20%20%20primary%3A%20function%28%29%20%7B%20return%20this%2Eranges%5Bthis%2EprimIndex%5D%3B%20%7D%2C%0A%20%20%20%20equals%3A%20function%28other%29%20%7B%0A%20%20%20%20%20%20if%20%28other%20%3D%3D%20this%29%20return%20true%3B%0A%20%20%20%20%20%20if%20%28other%2EprimIndex%20%21%3D%20this%2EprimIndex%20%7C%7C%20other%2Eranges%2Elength%20%21%3D%20this%2Eranges%2Elength%29%20return%20false%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Eranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20here%20%3D%20this%2Eranges%5Bi%5D%2C%20there%20%3D%20other%2Eranges%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28cmp%28here%2Eanchor%2C%20there%2Eanchor%29%20%21%3D%200%20%7C%7C%20cmp%28here%2Ehead%2C%20there%2Ehead%29%20%21%3D%200%29%20return%20false%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20deepCopy%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20out%20%3D%20%5B%5D%2C%20i%20%3D%200%3B%20i%20%3C%20this%2Eranges%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20out%5Bi%5D%20%3D%20new%20Range%28copyPos%28this%2Eranges%5Bi%5D%2Eanchor%29%2C%20copyPos%28this%2Eranges%5Bi%5D%2Ehead%29%29%3B%0A%20%20%20%20%20%20return%20new%20Selection%28out%2C%20this%2EprimIndex%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20somethingSelected%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Eranges%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20if%20%28%21this%2Eranges%5Bi%5D%2Eempty%28%29%29%20return%20true%3B%0A%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20contains%3A%20function%28pos%2C%20end%29%20%7B%0A%20%20%20%20%20%20if%20%28%21end%29%20end%20%3D%20pos%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Eranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20range%20%3D%20this%2Eranges%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28cmp%28end%2C%20range%2Efrom%28%29%29%20%3E%3D%200%20%26%26%20cmp%28pos%2C%20range%2Eto%28%29%29%20%3C%3D%200%29%0A%20%20%20%20%20%20%20%20%20%20return%20i%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%2D1%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20function%20Range%28anchor%2C%20head%29%20%7B%0A%20%20%20%20this%2Eanchor%20%3D%20anchor%3B%20this%2Ehead%20%3D%20head%3B%0A%20%20%7D%0A%0A%20%20Range%2Eprototype%20%3D%20%7B%0A%20%20%20%20from%3A%20function%28%29%20%7B%20return%20minPos%28this%2Eanchor%2C%20this%2Ehead%29%3B%20%7D%2C%0A%20%20%20%20to%3A%20function%28%29%20%7B%20return%20maxPos%28this%2Eanchor%2C%20this%2Ehead%29%3B%20%7D%2C%0A%20%20%20%20empty%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20return%20this%2Ehead%2Eline%20%3D%3D%20this%2Eanchor%2Eline%20%26%26%20this%2Ehead%2Ech%20%3D%3D%20this%2Eanchor%2Ech%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Take%20an%20unsorted%2C%20potentially%20overlapping%20set%20of%20ranges%2C%20and%0A%20%20%2F%2F%20build%20a%20selection%20out%20of%20it%2E%20%27Consumes%27%20ranges%20array%20%28modifying%0A%20%20%2F%2F%20it%29%2E%0A%20%20function%20normalizeSelection%28ranges%2C%20primIndex%29%20%7B%0A%20%20%20%20var%20prim%20%3D%20ranges%5BprimIndex%5D%3B%0A%20%20%20%20ranges%2Esort%28function%28a%2C%20b%29%20%7B%20return%20cmp%28a%2Efrom%28%29%2C%20b%2Efrom%28%29%29%3B%20%7D%29%3B%0A%20%20%20%20primIndex%20%3D%20indexOf%28ranges%2C%20prim%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%201%3B%20i%20%3C%20ranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20cur%20%3D%20ranges%5Bi%5D%2C%20prev%20%3D%20ranges%5Bi%20%2D%201%5D%3B%0A%20%20%20%20%20%20if%20%28cmp%28prev%2Eto%28%29%2C%20cur%2Efrom%28%29%29%20%3E%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20var%20from%20%3D%20minPos%28prev%2Efrom%28%29%2C%20cur%2Efrom%28%29%29%2C%20to%20%3D%20maxPos%28prev%2Eto%28%29%2C%20cur%2Eto%28%29%29%3B%0A%20%20%20%20%20%20%20%20var%20inv%20%3D%20prev%2Eempty%28%29%20%3F%20cur%2Efrom%28%29%20%3D%3D%20cur%2Ehead%20%3A%20prev%2Efrom%28%29%20%3D%3D%20prev%2Ehead%3B%0A%20%20%20%20%20%20%20%20if%20%28i%20%3C%3D%20primIndex%29%20%2D%2DprimIndex%3B%0A%20%20%20%20%20%20%20%20ranges%2Esplice%28%2D%2Di%2C%202%2C%20new%20Range%28inv%20%3F%20to%20%3A%20from%2C%20inv%20%3F%20from%20%3A%20to%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20new%20Selection%28ranges%2C%20primIndex%29%3B%0A%20%20%7D%0A%0A%20%20function%20simpleSelection%28anchor%2C%20head%29%20%7B%0A%20%20%20%20return%20new%20Selection%28%5Bnew%20Range%28anchor%2C%20head%20%7C%7C%20anchor%29%5D%2C%200%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Most%20of%20the%20external%20API%20clips%20given%20positions%20to%20make%20sure%20they%0A%20%20%2F%2F%20actually%20exist%20within%20the%20document%2E%0A%20%20function%20clipLine%28doc%2C%20n%29%20%7Breturn%20Math%2Emax%28doc%2Efirst%2C%20Math%2Emin%28n%2C%20doc%2Efirst%20%2B%20doc%2Esize%20%2D%201%29%29%3B%7D%0A%20%20function%20clipPos%28doc%2C%20pos%29%20%7B%0A%20%20%20%20if%20%28pos%2Eline%20%3C%20doc%2Efirst%29%20return%20Pos%28doc%2Efirst%2C%200%29%3B%0A%20%20%20%20var%20last%20%3D%20doc%2Efirst%20%2B%20doc%2Esize%20%2D%201%3B%0A%20%20%20%20if%20%28pos%2Eline%20%3E%20last%29%20return%20Pos%28last%2C%20getLine%28doc%2C%20last%29%2Etext%2Elength%29%3B%0A%20%20%20%20return%20clipToLen%28pos%2C%20getLine%28doc%2C%20pos%2Eline%29%2Etext%2Elength%29%3B%0A%20%20%7D%0A%20%20function%20clipToLen%28pos%2C%20linelen%29%20%7B%0A%20%20%20%20var%20ch%20%3D%20pos%2Ech%3B%0A%20%20%20%20if%20%28ch%20%3D%3D%20null%20%7C%7C%20ch%20%3E%20linelen%29%20return%20Pos%28pos%2Eline%2C%20linelen%29%3B%0A%20%20%20%20else%20if%20%28ch%20%3C%200%29%20return%20Pos%28pos%2Eline%2C%200%29%3B%0A%20%20%20%20else%20return%20pos%3B%0A%20%20%7D%0A%20%20function%20isLine%28doc%2C%20l%29%20%7Breturn%20l%20%3E%3D%20doc%2Efirst%20%26%26%20l%20%3C%20doc%2Efirst%20%2B%20doc%2Esize%3B%7D%0A%20%20function%20clipPosArray%28doc%2C%20array%29%20%7B%0A%20%20%20%20for%20%28var%20out%20%3D%20%5B%5D%2C%20i%20%3D%200%3B%20i%20%3C%20array%2Elength%3B%20i%2B%2B%29%20out%5Bi%5D%20%3D%20clipPos%28doc%2C%20array%5Bi%5D%29%3B%0A%20%20%20%20return%20out%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20SELECTION%20UPDATES%0A%0A%20%20%2F%2F%20The%20%27scroll%27%20parameter%20given%20to%20many%20of%20these%20indicated%20whether%0A%20%20%2F%2F%20the%20new%20cursor%20position%20should%20be%20scrolled%20into%20view%20after%0A%20%20%2F%2F%20modifying%20the%20selection%2E%0A%0A%20%20%2F%2F%20If%20shift%20is%20held%20or%20the%20extend%20flag%20is%20set%2C%20extends%20a%20range%20to%0A%20%20%2F%2F%20include%20a%20given%20position%20%28and%20optionally%20a%20second%20position%29%2E%0A%20%20%2F%2F%20Otherwise%2C%20simply%20returns%20the%20range%20between%20the%20given%20positions%2E%0A%20%20%2F%2F%20Used%20for%20cursor%20motion%20and%20such%2E%0A%20%20function%20extendRange%28doc%2C%20range%2C%20head%2C%20other%29%20%7B%0A%20%20%20%20if%20%28doc%2Ecm%20%26%26%20doc%2Ecm%2Edisplay%2Eshift%20%7C%7C%20doc%2Eextend%29%20%7B%0A%20%20%20%20%20%20var%20anchor%20%3D%20range%2Eanchor%3B%0A%20%20%20%20%20%20if%20%28other%29%20%7B%0A%20%20%20%20%20%20%20%20var%20posBefore%20%3D%20cmp%28head%2C%20anchor%29%20%3C%200%3B%0A%20%20%20%20%20%20%20%20if%20%28posBefore%20%21%3D%20%28cmp%28other%2C%20anchor%29%20%3C%200%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20anchor%20%3D%20head%3B%0A%20%20%20%20%20%20%20%20%20%20head%20%3D%20other%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28posBefore%20%21%3D%20%28cmp%28head%2C%20other%29%20%3C%200%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20head%20%3D%20other%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20new%20Range%28anchor%2C%20head%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20new%20Range%28other%20%7C%7C%20head%2C%20head%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Extend%20the%20primary%20selection%20range%2C%20discard%20the%20rest%2E%0A%20%20function%20extendSelection%28doc%2C%20head%2C%20other%2C%20options%29%20%7B%0A%20%20%20%20setSelection%28doc%2C%20new%20Selection%28%5BextendRange%28doc%2C%20doc%2Esel%2Eprimary%28%29%2C%20head%2C%20other%29%5D%2C%200%29%2C%20options%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Extend%20all%20selections%20%28pos%20is%20an%20array%20of%20selections%20with%20length%0A%20%20%2F%2F%20equal%20the%20number%20of%20selections%29%0A%20%20function%20extendSelections%28doc%2C%20heads%2C%20options%29%20%7B%0A%20%20%20%20for%20%28var%20out%20%3D%20%5B%5D%2C%20i%20%3D%200%3B%20i%20%3C%20doc%2Esel%2Eranges%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20out%5Bi%5D%20%3D%20extendRange%28doc%2C%20doc%2Esel%2Eranges%5Bi%5D%2C%20heads%5Bi%5D%2C%20null%29%3B%0A%20%20%20%20var%20newSel%20%3D%20normalizeSelection%28out%2C%20doc%2Esel%2EprimIndex%29%3B%0A%20%20%20%20setSelection%28doc%2C%20newSel%2C%20options%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Updates%20a%20single%20range%20in%20the%20selection%2E%0A%20%20function%20replaceOneSelection%28doc%2C%20i%2C%20range%2C%20options%29%20%7B%0A%20%20%20%20var%20ranges%20%3D%20doc%2Esel%2Eranges%2Eslice%280%29%3B%0A%20%20%20%20ranges%5Bi%5D%20%3D%20range%3B%0A%20%20%20%20setSelection%28doc%2C%20normalizeSelection%28ranges%2C%20doc%2Esel%2EprimIndex%29%2C%20options%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Reset%20the%20selection%20to%20a%20single%20range%2E%0A%20%20function%20setSimpleSelection%28doc%2C%20anchor%2C%20head%2C%20options%29%20%7B%0A%20%20%20%20setSelection%28doc%2C%20simpleSelection%28anchor%2C%20head%29%2C%20options%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Give%20beforeSelectionChange%20handlers%20a%20change%20to%20influence%20a%0A%20%20%2F%2F%20selection%20update%2E%0A%20%20function%20filterSelectionChange%28doc%2C%20sel%2C%20options%29%20%7B%0A%20%20%20%20var%20obj%20%3D%20%7B%0A%20%20%20%20%20%20ranges%3A%20sel%2Eranges%2C%0A%20%20%20%20%20%20update%3A%20function%28ranges%29%20%7B%0A%20%20%20%20%20%20%20%20this%2Eranges%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ranges%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20%20%20this%2Eranges%5Bi%5D%20%3D%20new%20Range%28clipPos%28doc%2C%20ranges%5Bi%5D%2Eanchor%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20clipPos%28doc%2C%20ranges%5Bi%5D%2Ehead%29%29%3B%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20origin%3A%20options%20%26%26%20options%2Eorigin%0A%20%20%20%20%7D%3B%0A%20%20%20%20signal%28doc%2C%20%22beforeSelectionChange%22%2C%20doc%2C%20obj%29%3B%0A%20%20%20%20if%20%28doc%2Ecm%29%20signal%28doc%2Ecm%2C%20%22beforeSelectionChange%22%2C%20doc%2Ecm%2C%20obj%29%3B%0A%20%20%20%20if%20%28obj%2Eranges%20%21%3D%20sel%2Eranges%29%20return%20normalizeSelection%28obj%2Eranges%2C%20obj%2Eranges%2Elength%20%2D%201%29%3B%0A%20%20%20%20else%20return%20sel%3B%0A%20%20%7D%0A%0A%20%20function%20setSelectionReplaceHistory%28doc%2C%20sel%2C%20options%29%20%7B%0A%20%20%20%20var%20done%20%3D%20doc%2Ehistory%2Edone%2C%20last%20%3D%20lst%28done%29%3B%0A%20%20%20%20if%20%28last%20%26%26%20last%2Eranges%29%20%7B%0A%20%20%20%20%20%20done%5Bdone%2Elength%20%2D%201%5D%20%3D%20sel%3B%0A%20%20%20%20%20%20setSelectionNoUndo%28doc%2C%20sel%2C%20options%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20setSelection%28doc%2C%20sel%2C%20options%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Set%20a%20new%20selection%2E%0A%20%20function%20setSelection%28doc%2C%20sel%2C%20options%29%20%7B%0A%20%20%20%20setSelectionNoUndo%28doc%2C%20sel%2C%20options%29%3B%0A%20%20%20%20addSelectionToHistory%28doc%2C%20doc%2Esel%2C%20doc%2Ecm%20%3F%20doc%2Ecm%2EcurOp%2Eid%20%3A%20NaN%2C%20options%29%3B%0A%20%20%7D%0A%0A%20%20function%20setSelectionNoUndo%28doc%2C%20sel%2C%20options%29%20%7B%0A%20%20%20%20if%20%28hasHandler%28doc%2C%20%22beforeSelectionChange%22%29%20%7C%7C%20doc%2Ecm%20%26%26%20hasHandler%28doc%2Ecm%2C%20%22beforeSelectionChange%22%29%29%0A%20%20%20%20%20%20sel%20%3D%20filterSelectionChange%28doc%2C%20sel%2C%20options%29%3B%0A%0A%20%20%20%20var%20bias%20%3D%20options%20%26%26%20options%2Ebias%20%7C%7C%0A%20%20%20%20%20%20%28cmp%28sel%2Eprimary%28%29%2Ehead%2C%20doc%2Esel%2Eprimary%28%29%2Ehead%29%20%3C%200%20%3F%20%2D1%20%3A%201%29%3B%0A%20%20%20%20setSelectionInner%28doc%2C%20skipAtomicInSelection%28doc%2C%20sel%2C%20bias%2C%20true%29%29%3B%0A%0A%20%20%20%20if%20%28%21%28options%20%26%26%20options%2Escroll%20%3D%3D%3D%20false%29%20%26%26%20doc%2Ecm%29%0A%20%20%20%20%20%20ensureCursorVisible%28doc%2Ecm%29%3B%0A%20%20%7D%0A%0A%20%20function%20setSelectionInner%28doc%2C%20sel%29%20%7B%0A%20%20%20%20if%20%28sel%2Eequals%28doc%2Esel%29%29%20return%3B%0A%0A%20%20%20%20doc%2Esel%20%3D%20sel%3B%0A%0A%20%20%20%20if%20%28doc%2Ecm%29%20%7B%0A%20%20%20%20%20%20doc%2Ecm%2EcurOp%2EupdateInput%20%3D%20doc%2Ecm%2EcurOp%2EselectionChanged%20%3D%20true%3B%0A%20%20%20%20%20%20signalCursorActivity%28doc%2Ecm%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20signalLater%28doc%2C%20%22cursorActivity%22%2C%20doc%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Verify%20that%20the%20selection%20does%20not%20partially%20select%20any%20atomic%0A%20%20%2F%2F%20marked%20ranges%2E%0A%20%20function%20reCheckSelection%28doc%29%20%7B%0A%20%20%20%20setSelectionInner%28doc%2C%20skipAtomicInSelection%28doc%2C%20doc%2Esel%2C%20null%2C%20false%29%2C%20sel%5FdontScroll%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Return%20a%20selection%20that%20does%20not%20partially%20select%20any%20atomic%0A%20%20%2F%2F%20ranges%2E%0A%20%20function%20skipAtomicInSelection%28doc%2C%20sel%2C%20bias%2C%20mayClear%29%20%7B%0A%20%20%20%20var%20out%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20sel%2Eranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20range%20%3D%20sel%2Eranges%5Bi%5D%3B%0A%20%20%20%20%20%20var%20old%20%3D%20sel%2Eranges%2Elength%20%3D%3D%20doc%2Esel%2Eranges%2Elength%20%26%26%20doc%2Esel%2Eranges%5Bi%5D%3B%0A%20%20%20%20%20%20var%20newAnchor%20%3D%20skipAtomic%28doc%2C%20range%2Eanchor%2C%20old%20%26%26%20old%2Eanchor%2C%20bias%2C%20mayClear%29%3B%0A%20%20%20%20%20%20var%20newHead%20%3D%20skipAtomic%28doc%2C%20range%2Ehead%2C%20old%20%26%26%20old%2Ehead%2C%20bias%2C%20mayClear%29%3B%0A%20%20%20%20%20%20if%20%28out%20%7C%7C%20newAnchor%20%21%3D%20range%2Eanchor%20%7C%7C%20newHead%20%21%3D%20range%2Ehead%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21out%29%20out%20%3D%20sel%2Eranges%2Eslice%280%2C%20i%29%3B%0A%20%20%20%20%20%20%20%20out%5Bi%5D%20%3D%20new%20Range%28newAnchor%2C%20newHead%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20out%20%3F%20normalizeSelection%28out%2C%20sel%2EprimIndex%29%20%3A%20sel%3B%0A%20%20%7D%0A%0A%20%20function%20skipAtomicInner%28doc%2C%20pos%2C%20oldPos%2C%20dir%2C%20mayClear%29%20%7B%0A%20%20%20%20var%20line%20%3D%20getLine%28doc%2C%20pos%2Eline%29%3B%0A%20%20%20%20if%20%28line%2EmarkedSpans%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20line%2EmarkedSpans%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20sp%20%3D%20line%2EmarkedSpans%5Bi%5D%2C%20m%20%3D%20sp%2Emarker%3B%0A%20%20%20%20%20%20if%20%28%28sp%2Efrom%20%3D%3D%20null%20%7C%7C%20%28m%2EinclusiveLeft%20%3F%20sp%2Efrom%20%3C%3D%20pos%2Ech%20%3A%20sp%2Efrom%20%3C%20pos%2Ech%29%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%28sp%2Eto%20%3D%3D%20null%20%7C%7C%20%28m%2EinclusiveRight%20%3F%20sp%2Eto%20%3E%3D%20pos%2Ech%20%3A%20sp%2Eto%20%3E%20pos%2Ech%29%29%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28mayClear%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20signal%28m%2C%20%22beforeCursorEnter%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28m%2EexplicitlyCleared%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21line%2EmarkedSpans%29%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%7B%2D%2Di%3B%20continue%3B%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28%21m%2Eatomic%29%20continue%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28oldPos%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20near%20%3D%20m%2Efind%28dir%20%3C%200%20%3F%201%20%3A%20%2D1%29%2C%20diff%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28dir%20%3C%200%20%3F%20m%2EinclusiveRight%20%3A%20m%2EinclusiveLeft%29%20near%20%3D%20movePos%28doc%2C%20near%2C%20%2Ddir%2C%20line%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28near%20%26%26%20near%2Eline%20%3D%3D%20pos%2Eline%20%26%26%20%28diff%20%3D%20cmp%28near%2C%20oldPos%29%29%20%26%26%20%28dir%20%3C%200%20%3F%20diff%20%3C%200%20%3A%20diff%20%3E%200%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20skipAtomicInner%28doc%2C%20near%2C%20pos%2C%20dir%2C%20mayClear%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20var%20far%20%3D%20m%2Efind%28dir%20%3C%200%20%3F%20%2D1%20%3A%201%29%3B%0A%20%20%20%20%20%20%20%20if%20%28dir%20%3C%200%20%3F%20m%2EinclusiveLeft%20%3A%20m%2EinclusiveRight%29%20far%20%3D%20movePos%28doc%2C%20far%2C%20dir%2C%20line%29%3B%0A%20%20%20%20%20%20%20%20return%20far%20%3F%20skipAtomicInner%28doc%2C%20far%2C%20pos%2C%20dir%2C%20mayClear%29%20%3A%20null%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20pos%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Ensure%20a%20given%20position%20is%20not%20inside%20an%20atomic%20range%2E%0A%20%20function%20skipAtomic%28doc%2C%20pos%2C%20oldPos%2C%20bias%2C%20mayClear%29%20%7B%0A%20%20%20%20var%20dir%20%3D%20bias%20%7C%7C%201%3B%0A%20%20%20%20var%20found%20%3D%20skipAtomicInner%28doc%2C%20pos%2C%20oldPos%2C%20dir%2C%20mayClear%29%20%7C%7C%0A%20%20%20%20%20%20%20%20%28%21mayClear%20%26%26%20skipAtomicInner%28doc%2C%20pos%2C%20oldPos%2C%20dir%2C%20true%29%29%20%7C%7C%0A%20%20%20%20%20%20%20%20skipAtomicInner%28doc%2C%20pos%2C%20oldPos%2C%20%2Ddir%2C%20mayClear%29%20%7C%7C%0A%20%20%20%20%20%20%20%20%28%21mayClear%20%26%26%20skipAtomicInner%28doc%2C%20pos%2C%20oldPos%2C%20%2Ddir%2C%20true%29%29%3B%0A%20%20%20%20if%20%28%21found%29%20%7B%0A%20%20%20%20%20%20doc%2EcantEdit%20%3D%20true%3B%0A%20%20%20%20%20%20return%20Pos%28doc%2Efirst%2C%200%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20found%3B%0A%20%20%7D%0A%0A%20%20function%20movePos%28doc%2C%20pos%2C%20dir%2C%20line%29%20%7B%0A%20%20%20%20if%20%28dir%20%3C%200%20%26%26%20pos%2Ech%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20if%20%28pos%2Eline%20%3E%20doc%2Efirst%29%20return%20clipPos%28doc%2C%20Pos%28pos%2Eline%20%2D%201%29%29%3B%0A%20%20%20%20%20%20else%20return%20null%3B%0A%20%20%20%20%7D%20else%20if%20%28dir%20%3E%200%20%26%26%20pos%2Ech%20%3D%3D%20%28line%20%7C%7C%20getLine%28doc%2C%20pos%2Eline%29%29%2Etext%2Elength%29%20%7B%0A%20%20%20%20%20%20if%20%28pos%2Eline%20%3C%20doc%2Efirst%20%2B%20doc%2Esize%20%2D%201%29%20return%20Pos%28pos%2Eline%20%2B%201%2C%200%29%3B%0A%20%20%20%20%20%20else%20return%20null%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20new%20Pos%28pos%2Eline%2C%20pos%2Ech%20%2B%20dir%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20SELECTION%20DRAWING%0A%0A%20%20function%20updateSelection%28cm%29%20%7B%0A%20%20%20%20cm%2Edisplay%2Einput%2EshowSelection%28cm%2Edisplay%2Einput%2EprepareSelection%28%29%29%3B%0A%20%20%7D%0A%0A%20%20function%20prepareSelection%28cm%2C%20primary%29%20%7B%0A%20%20%20%20var%20doc%20%3D%20cm%2Edoc%2C%20result%20%3D%20%7B%7D%3B%0A%20%20%20%20var%20curFragment%20%3D%20result%2Ecursors%20%3D%20document%2EcreateDocumentFragment%28%29%3B%0A%20%20%20%20var%20selFragment%20%3D%20result%2Eselection%20%3D%20document%2EcreateDocumentFragment%28%29%3B%0A%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20doc%2Esel%2Eranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20if%20%28primary%20%3D%3D%3D%20false%20%26%26%20i%20%3D%3D%20doc%2Esel%2EprimIndex%29%20continue%3B%0A%20%20%20%20%20%20var%20range%20%3D%20doc%2Esel%2Eranges%5Bi%5D%3B%0A%20%20%20%20%20%20var%20collapsed%20%3D%20range%2Eempty%28%29%3B%0A%20%20%20%20%20%20if%20%28collapsed%20%7C%7C%20cm%2Eoptions%2EshowCursorWhenSelecting%29%0A%20%20%20%20%20%20%20%20drawSelectionCursor%28cm%2C%20range%2Ehead%2C%20curFragment%29%3B%0A%20%20%20%20%20%20if%20%28%21collapsed%29%0A%20%20%20%20%20%20%20%20drawSelectionRange%28cm%2C%20range%2C%20selFragment%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20result%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Draws%20a%20cursor%20for%20the%20given%20range%0A%20%20function%20drawSelectionCursor%28cm%2C%20head%2C%20output%29%20%7B%0A%20%20%20%20var%20pos%20%3D%20cursorCoords%28cm%2C%20head%2C%20%22div%22%2C%20null%2C%20null%2C%20%21cm%2Eoptions%2EsingleCursorHeightPerLine%29%3B%0A%0A%20%20%20%20var%20cursor%20%3D%20output%2EappendChild%28elt%28%22div%22%2C%20%22%5Cu00a0%22%2C%20%22CodeMirror%2Dcursor%22%29%29%3B%0A%20%20%20%20cursor%2Estyle%2Eleft%20%3D%20pos%2Eleft%20%2B%20%22px%22%3B%0A%20%20%20%20cursor%2Estyle%2Etop%20%3D%20pos%2Etop%20%2B%20%22px%22%3B%0A%20%20%20%20cursor%2Estyle%2Eheight%20%3D%20Math%2Emax%280%2C%20pos%2Ebottom%20%2D%20pos%2Etop%29%20%2A%20cm%2Eoptions%2EcursorHeight%20%2B%20%22px%22%3B%0A%0A%20%20%20%20if%20%28pos%2Eother%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Secondary%20cursor%2C%20shown%20when%20on%20a%20%27jump%27%20in%20bi%2Ddirectional%20text%0A%20%20%20%20%20%20var%20otherCursor%20%3D%20output%2EappendChild%28elt%28%22div%22%2C%20%22%5Cu00a0%22%2C%20%22CodeMirror%2Dcursor%20CodeMirror%2Dsecondarycursor%22%29%29%3B%0A%20%20%20%20%20%20otherCursor%2Estyle%2Edisplay%20%3D%20%22%22%3B%0A%20%20%20%20%20%20otherCursor%2Estyle%2Eleft%20%3D%20pos%2Eother%2Eleft%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20otherCursor%2Estyle%2Etop%20%3D%20pos%2Eother%2Etop%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20otherCursor%2Estyle%2Eheight%20%3D%20%28pos%2Eother%2Ebottom%20%2D%20pos%2Eother%2Etop%29%20%2A%20%2E85%20%2B%20%22px%22%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Draws%20the%20given%20range%20as%20a%20highlighted%20selection%0A%20%20function%20drawSelectionRange%28cm%2C%20range%2C%20output%29%20%7B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%2C%20doc%20%3D%20cm%2Edoc%3B%0A%20%20%20%20var%20fragment%20%3D%20document%2EcreateDocumentFragment%28%29%3B%0A%20%20%20%20var%20padding%20%3D%20paddingH%28cm%2Edisplay%29%2C%20leftSide%20%3D%20padding%2Eleft%3B%0A%20%20%20%20var%20rightSide%20%3D%20Math%2Emax%28display%2EsizerWidth%2C%20displayWidth%28cm%29%20%2D%20display%2Esizer%2EoffsetLeft%29%20%2D%20padding%2Eright%3B%0A%0A%20%20%20%20function%20add%28left%2C%20top%2C%20width%2C%20bottom%29%20%7B%0A%20%20%20%20%20%20if%20%28top%20%3C%200%29%20top%20%3D%200%3B%0A%20%20%20%20%20%20top%20%3D%20Math%2Eround%28top%29%3B%0A%20%20%20%20%20%20bottom%20%3D%20Math%2Eround%28bottom%29%3B%0A%20%20%20%20%20%20fragment%2EappendChild%28elt%28%22div%22%2C%20null%2C%20%22CodeMirror%2Dselected%22%2C%20%22position%3A%20absolute%3B%20left%3A%20%22%20%2B%20left%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22px%3B%20top%3A%20%22%20%2B%20top%20%2B%20%22px%3B%20width%3A%20%22%20%2B%20%28width%20%3D%3D%20null%20%3F%20rightSide%20%2D%20left%20%3A%20width%29%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22px%3B%20height%3A%20%22%20%2B%20%28bottom%20%2D%20top%29%20%2B%20%22px%22%29%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20drawForLine%28line%2C%20fromArg%2C%20toArg%29%20%7B%0A%20%20%20%20%20%20var%20lineObj%20%3D%20getLine%28doc%2C%20line%29%3B%0A%20%20%20%20%20%20var%20lineLen%20%3D%20lineObj%2Etext%2Elength%3B%0A%20%20%20%20%20%20var%20start%2C%20end%3B%0A%20%20%20%20%20%20function%20coords%28ch%2C%20bias%29%20%7B%0A%20%20%20%20%20%20%20%20return%20charCoords%28cm%2C%20Pos%28line%2C%20ch%29%2C%20%22div%22%2C%20lineObj%2C%20bias%29%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20iterateBidiSections%28getOrder%28lineObj%29%2C%20fromArg%20%7C%7C%200%2C%20toArg%20%3D%3D%20null%20%3F%20lineLen%20%3A%20toArg%2C%20function%28from%2C%20to%2C%20dir%29%20%7B%0A%20%20%20%20%20%20%20%20var%20leftPos%20%3D%20coords%28from%2C%20%22left%22%29%2C%20rightPos%2C%20left%2C%20right%3B%0A%20%20%20%20%20%20%20%20if%20%28from%20%3D%3D%20to%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20rightPos%20%3D%20leftPos%3B%0A%20%20%20%20%20%20%20%20%20%20left%20%3D%20right%20%3D%20leftPos%2Eleft%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20rightPos%20%3D%20coords%28to%20%2D%201%2C%20%22right%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28dir%20%3D%3D%20%22rtl%22%29%20%7B%20var%20tmp%20%3D%20leftPos%3B%20leftPos%20%3D%20rightPos%3B%20rightPos%20%3D%20tmp%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20left%20%3D%20leftPos%2Eleft%3B%0A%20%20%20%20%20%20%20%20%20%20right%20%3D%20rightPos%2Eright%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28fromArg%20%3D%3D%20null%20%26%26%20from%20%3D%3D%200%29%20left%20%3D%20leftSide%3B%0A%20%20%20%20%20%20%20%20if%20%28rightPos%2Etop%20%2D%20leftPos%2Etop%20%3E%203%29%20%7B%20%2F%2F%20Different%20lines%2C%20draw%20top%20part%0A%20%20%20%20%20%20%20%20%20%20add%28left%2C%20leftPos%2Etop%2C%20null%2C%20leftPos%2Ebottom%29%3B%0A%20%20%20%20%20%20%20%20%20%20left%20%3D%20leftSide%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28leftPos%2Ebottom%20%3C%20rightPos%2Etop%29%20add%28left%2C%20leftPos%2Ebottom%2C%20null%2C%20rightPos%2Etop%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28toArg%20%3D%3D%20null%20%26%26%20to%20%3D%3D%20lineLen%29%20right%20%3D%20rightSide%3B%0A%20%20%20%20%20%20%20%20if%20%28%21start%20%7C%7C%20leftPos%2Etop%20%3C%20start%2Etop%20%7C%7C%20leftPos%2Etop%20%3D%3D%20start%2Etop%20%26%26%20leftPos%2Eleft%20%3C%20start%2Eleft%29%0A%20%20%20%20%20%20%20%20%20%20start%20%3D%20leftPos%3B%0A%20%20%20%20%20%20%20%20if%20%28%21end%20%7C%7C%20rightPos%2Ebottom%20%3E%20end%2Ebottom%20%7C%7C%20rightPos%2Ebottom%20%3D%3D%20end%2Ebottom%20%26%26%20rightPos%2Eright%20%3E%20end%2Eright%29%0A%20%20%20%20%20%20%20%20%20%20end%20%3D%20rightPos%3B%0A%20%20%20%20%20%20%20%20if%20%28left%20%3C%20leftSide%20%2B%201%29%20left%20%3D%20leftSide%3B%0A%20%20%20%20%20%20%20%20add%28left%2C%20rightPos%2Etop%2C%20right%20%2D%20left%2C%20rightPos%2Ebottom%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20return%20%7Bstart%3A%20start%2C%20end%3A%20end%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20sFrom%20%3D%20range%2Efrom%28%29%2C%20sTo%20%3D%20range%2Eto%28%29%3B%0A%20%20%20%20if%20%28sFrom%2Eline%20%3D%3D%20sTo%2Eline%29%20%7B%0A%20%20%20%20%20%20drawForLine%28sFrom%2Eline%2C%20sFrom%2Ech%2C%20sTo%2Ech%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20var%20fromLine%20%3D%20getLine%28doc%2C%20sFrom%2Eline%29%2C%20toLine%20%3D%20getLine%28doc%2C%20sTo%2Eline%29%3B%0A%20%20%20%20%20%20var%20singleVLine%20%3D%20visualLine%28fromLine%29%20%3D%3D%20visualLine%28toLine%29%3B%0A%20%20%20%20%20%20var%20leftEnd%20%3D%20drawForLine%28sFrom%2Eline%2C%20sFrom%2Ech%2C%20singleVLine%20%3F%20fromLine%2Etext%2Elength%20%2B%201%20%3A%20null%29%2Eend%3B%0A%20%20%20%20%20%20var%20rightStart%20%3D%20drawForLine%28sTo%2Eline%2C%20singleVLine%20%3F%200%20%3A%20null%2C%20sTo%2Ech%29%2Estart%3B%0A%20%20%20%20%20%20if%20%28singleVLine%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28leftEnd%2Etop%20%3C%20rightStart%2Etop%20%2D%202%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20add%28leftEnd%2Eright%2C%20leftEnd%2Etop%2C%20null%2C%20leftEnd%2Ebottom%29%3B%0A%20%20%20%20%20%20%20%20%20%20add%28leftSide%2C%20rightStart%2Etop%2C%20rightStart%2Eleft%2C%20rightStart%2Ebottom%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20add%28leftEnd%2Eright%2C%20leftEnd%2Etop%2C%20rightStart%2Eleft%20%2D%20leftEnd%2Eright%2C%20leftEnd%2Ebottom%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28leftEnd%2Ebottom%20%3C%20rightStart%2Etop%29%0A%20%20%20%20%20%20%20%20add%28leftSide%2C%20leftEnd%2Ebottom%2C%20null%2C%20rightStart%2Etop%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20output%2EappendChild%28fragment%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Cursor%2Dblinking%0A%20%20function%20restartBlink%28cm%29%20%7B%0A%20%20%20%20if%20%28%21cm%2Estate%2Efocused%29%20return%3B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20clearInterval%28display%2Eblinker%29%3B%0A%20%20%20%20var%20on%20%3D%20true%3B%0A%20%20%20%20display%2EcursorDiv%2Estyle%2Evisibility%20%3D%20%22%22%3B%0A%20%20%20%20if%20%28cm%2Eoptions%2EcursorBlinkRate%20%3E%200%29%0A%20%20%20%20%20%20display%2Eblinker%20%3D%20setInterval%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20display%2EcursorDiv%2Estyle%2Evisibility%20%3D%20%28on%20%3D%20%21on%29%20%3F%20%22%22%20%3A%20%22hidden%22%3B%0A%20%20%20%20%20%20%7D%2C%20cm%2Eoptions%2EcursorBlinkRate%29%3B%0A%20%20%20%20else%20if%20%28cm%2Eoptions%2EcursorBlinkRate%20%3C%200%29%0A%20%20%20%20%20%20display%2EcursorDiv%2Estyle%2Evisibility%20%3D%20%22hidden%22%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20HIGHLIGHT%20WORKER%0A%0A%20%20function%20startWorker%28cm%2C%20time%29%20%7B%0A%20%20%20%20if%20%28cm%2Edoc%2Emode%2EstartState%20%26%26%20cm%2Edoc%2Efrontier%20%3C%20cm%2Edisplay%2EviewTo%29%0A%20%20%20%20%20%20cm%2Estate%2Ehighlight%2Eset%28time%2C%20bind%28highlightWorker%2C%20cm%29%29%3B%0A%20%20%7D%0A%0A%20%20function%20highlightWorker%28cm%29%20%7B%0A%20%20%20%20var%20doc%20%3D%20cm%2Edoc%3B%0A%20%20%20%20if%20%28doc%2Efrontier%20%3C%20doc%2Efirst%29%20doc%2Efrontier%20%3D%20doc%2Efirst%3B%0A%20%20%20%20if%20%28doc%2Efrontier%20%3E%3D%20cm%2Edisplay%2EviewTo%29%20return%3B%0A%20%20%20%20var%20end%20%3D%20%2Bnew%20Date%20%2B%20cm%2Eoptions%2EworkTime%3B%0A%20%20%20%20var%20state%20%3D%20copyState%28doc%2Emode%2C%20getStateBefore%28cm%2C%20doc%2Efrontier%29%29%3B%0A%20%20%20%20var%20changedLines%20%3D%20%5B%5D%3B%0A%0A%20%20%20%20doc%2Eiter%28doc%2Efrontier%2C%20Math%2Emin%28doc%2Efirst%20%2B%20doc%2Esize%2C%20cm%2Edisplay%2EviewTo%20%2B%20500%29%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20if%20%28doc%2Efrontier%20%3E%3D%20cm%2Edisplay%2EviewFrom%29%20%7B%20%2F%2F%20Visible%0A%20%20%20%20%20%20%20%20var%20oldStyles%20%3D%20line%2Estyles%2C%20tooLong%20%3D%20line%2Etext%2Elength%20%3E%20cm%2Eoptions%2EmaxHighlightLength%3B%0A%20%20%20%20%20%20%20%20var%20highlighted%20%3D%20highlightLine%28cm%2C%20line%2C%20tooLong%20%3F%20copyState%28doc%2Emode%2C%20state%29%20%3A%20state%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20line%2Estyles%20%3D%20highlighted%2Estyles%3B%0A%20%20%20%20%20%20%20%20var%20oldCls%20%3D%20line%2EstyleClasses%2C%20newCls%20%3D%20highlighted%2Eclasses%3B%0A%20%20%20%20%20%20%20%20if%20%28newCls%29%20line%2EstyleClasses%20%3D%20newCls%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28oldCls%29%20line%2EstyleClasses%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20var%20ischange%20%3D%20%21oldStyles%20%7C%7C%20oldStyles%2Elength%20%21%3D%20line%2Estyles%2Elength%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20oldCls%20%21%3D%20newCls%20%26%26%20%28%21oldCls%20%7C%7C%20%21newCls%20%7C%7C%20oldCls%2EbgClass%20%21%3D%20newCls%2EbgClass%20%7C%7C%20oldCls%2EtextClass%20%21%3D%20newCls%2EtextClass%29%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20%21ischange%20%26%26%20i%20%3C%20oldStyles%2Elength%3B%20%2B%2Bi%29%20ischange%20%3D%20oldStyles%5Bi%5D%20%21%3D%20line%2Estyles%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28ischange%29%20changedLines%2Epush%28doc%2Efrontier%29%3B%0A%20%20%20%20%20%20%20%20line%2EstateAfter%20%3D%20tooLong%20%3F%20state%20%3A%20copyState%28doc%2Emode%2C%20state%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20if%20%28line%2Etext%2Elength%20%3C%3D%20cm%2Eoptions%2EmaxHighlightLength%29%0A%20%20%20%20%20%20%20%20%20%20processLine%28cm%2C%20line%2Etext%2C%20state%29%3B%0A%20%20%20%20%20%20%20%20line%2EstateAfter%20%3D%20doc%2Efrontier%20%25%205%20%3D%3D%200%20%3F%20copyState%28doc%2Emode%2C%20state%29%20%3A%20null%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2B%2Bdoc%2Efrontier%3B%0A%20%20%20%20%20%20if%20%28%2Bnew%20Date%20%3E%20end%29%20%7B%0A%20%20%20%20%20%20%20%20startWorker%28cm%2C%20cm%2Eoptions%2EworkDelay%29%3B%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20if%20%28changedLines%2Elength%29%20runInOp%28cm%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20changedLines%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20regLineChange%28cm%2C%20changedLines%5Bi%5D%2C%20%22text%22%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Finds%20the%20line%20to%20start%20with%20when%20starting%20a%20parse%2E%20Tries%20to%0A%20%20%2F%2F%20find%20a%20line%20with%20a%20stateAfter%2C%20so%20that%20it%20can%20start%20with%20a%0A%20%20%2F%2F%20valid%20state%2E%20If%20that%20fails%2C%20it%20returns%20the%20line%20with%20the%0A%20%20%2F%2F%20smallest%20indentation%2C%20which%20tends%20to%20need%20the%20least%20context%20to%0A%20%20%2F%2F%20parse%20correctly%2E%0A%20%20function%20findStartLine%28cm%2C%20n%2C%20precise%29%20%7B%0A%20%20%20%20var%20minindent%2C%20minline%2C%20doc%20%3D%20cm%2Edoc%3B%0A%20%20%20%20var%20lim%20%3D%20precise%20%3F%20%2D1%20%3A%20n%20%2D%20%28cm%2Edoc%2Emode%2EinnerMode%20%3F%201000%20%3A%20100%29%3B%0A%20%20%20%20for%20%28var%20search%20%3D%20n%3B%20search%20%3E%20lim%3B%20%2D%2Dsearch%29%20%7B%0A%20%20%20%20%20%20if%20%28search%20%3C%3D%20doc%2Efirst%29%20return%20doc%2Efirst%3B%0A%20%20%20%20%20%20var%20line%20%3D%20getLine%28doc%2C%20search%20%2D%201%29%3B%0A%20%20%20%20%20%20if%20%28line%2EstateAfter%20%26%26%20%28%21precise%20%7C%7C%20search%20%3C%3D%20doc%2Efrontier%29%29%20return%20search%3B%0A%20%20%20%20%20%20var%20indented%20%3D%20countColumn%28line%2Etext%2C%20null%2C%20cm%2Eoptions%2EtabSize%29%3B%0A%20%20%20%20%20%20if%20%28minline%20%3D%3D%20null%20%7C%7C%20minindent%20%3E%20indented%29%20%7B%0A%20%20%20%20%20%20%20%20minline%20%3D%20search%20%2D%201%3B%0A%20%20%20%20%20%20%20%20minindent%20%3D%20indented%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20minline%3B%0A%20%20%7D%0A%0A%20%20function%20getStateBefore%28cm%2C%20n%2C%20precise%29%20%7B%0A%20%20%20%20var%20doc%20%3D%20cm%2Edoc%2C%20display%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20if%20%28%21doc%2Emode%2EstartState%29%20return%20true%3B%0A%20%20%20%20var%20pos%20%3D%20findStartLine%28cm%2C%20n%2C%20precise%29%2C%20state%20%3D%20pos%20%3E%20doc%2Efirst%20%26%26%20getLine%28doc%2C%20pos%2D1%29%2EstateAfter%3B%0A%20%20%20%20if%20%28%21state%29%20state%20%3D%20startState%28doc%2Emode%29%3B%0A%20%20%20%20else%20state%20%3D%20copyState%28doc%2Emode%2C%20state%29%3B%0A%20%20%20%20doc%2Eiter%28pos%2C%20n%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20processLine%28cm%2C%20line%2Etext%2C%20state%29%3B%0A%20%20%20%20%20%20var%20save%20%3D%20pos%20%3D%3D%20n%20%2D%201%20%7C%7C%20pos%20%25%205%20%3D%3D%200%20%7C%7C%20pos%20%3E%3D%20display%2EviewFrom%20%26%26%20pos%20%3C%20display%2EviewTo%3B%0A%20%20%20%20%20%20line%2EstateAfter%20%3D%20save%20%3F%20copyState%28doc%2Emode%2C%20state%29%20%3A%20null%3B%0A%20%20%20%20%20%20%2B%2Bpos%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20if%20%28precise%29%20doc%2Efrontier%20%3D%20pos%3B%0A%20%20%20%20return%20state%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20POSITION%20MEASUREMENT%0A%0A%20%20function%20paddingTop%28display%29%20%7Breturn%20display%2ElineSpace%2EoffsetTop%3B%7D%0A%20%20function%20paddingVert%28display%29%20%7Breturn%20display%2Emover%2EoffsetHeight%20%2D%20display%2ElineSpace%2EoffsetHeight%3B%7D%0A%20%20function%20paddingH%28display%29%20%7B%0A%20%20%20%20if%20%28display%2EcachedPaddingH%29%20return%20display%2EcachedPaddingH%3B%0A%20%20%20%20var%20e%20%3D%20removeChildrenAndAdd%28display%2Emeasure%2C%20elt%28%22pre%22%2C%20%22x%22%29%29%3B%0A%20%20%20%20var%20style%20%3D%20window%2EgetComputedStyle%20%3F%20window%2EgetComputedStyle%28e%29%20%3A%20e%2EcurrentStyle%3B%0A%20%20%20%20var%20data%20%3D%20%7Bleft%3A%20parseInt%28style%2EpaddingLeft%29%2C%20right%3A%20parseInt%28style%2EpaddingRight%29%7D%3B%0A%20%20%20%20if%20%28%21isNaN%28data%2Eleft%29%20%26%26%20%21isNaN%28data%2Eright%29%29%20display%2EcachedPaddingH%20%3D%20data%3B%0A%20%20%20%20return%20data%3B%0A%20%20%7D%0A%0A%20%20function%20scrollGap%28cm%29%20%7B%20return%20scrollerGap%20%2D%20cm%2Edisplay%2EnativeBarWidth%3B%20%7D%0A%20%20function%20displayWidth%28cm%29%20%7B%0A%20%20%20%20return%20cm%2Edisplay%2Escroller%2EclientWidth%20%2D%20scrollGap%28cm%29%20%2D%20cm%2Edisplay%2EbarWidth%3B%0A%20%20%7D%0A%20%20function%20displayHeight%28cm%29%20%7B%0A%20%20%20%20return%20cm%2Edisplay%2Escroller%2EclientHeight%20%2D%20scrollGap%28cm%29%20%2D%20cm%2Edisplay%2EbarHeight%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Ensure%20the%20lineView%2Ewrapping%2Eheights%20array%20is%20populated%2E%20This%20is%0A%20%20%2F%2F%20an%20array%20of%20bottom%20offsets%20for%20the%20lines%20that%20make%20up%20a%20drawn%0A%20%20%2F%2F%20line%2E%20When%20lineWrapping%20is%20on%2C%20there%20might%20be%20more%20than%20one%0A%20%20%2F%2F%20height%2E%0A%20%20function%20ensureLineHeights%28cm%2C%20lineView%2C%20rect%29%20%7B%0A%20%20%20%20var%20wrapping%20%3D%20cm%2Eoptions%2ElineWrapping%3B%0A%20%20%20%20var%20curWidth%20%3D%20wrapping%20%26%26%20displayWidth%28cm%29%3B%0A%20%20%20%20if%20%28%21lineView%2Emeasure%2Eheights%20%7C%7C%20wrapping%20%26%26%20lineView%2Emeasure%2Ewidth%20%21%3D%20curWidth%29%20%7B%0A%20%20%20%20%20%20var%20heights%20%3D%20lineView%2Emeasure%2Eheights%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20if%20%28wrapping%29%20%7B%0A%20%20%20%20%20%20%20%20lineView%2Emeasure%2Ewidth%20%3D%20curWidth%3B%0A%20%20%20%20%20%20%20%20var%20rects%20%3D%20lineView%2Etext%2EfirstChild%2EgetClientRects%28%29%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20rects%2Elength%20%2D%201%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20cur%20%3D%20rects%5Bi%5D%2C%20next%20%3D%20rects%5Bi%20%2B%201%5D%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28Math%2Eabs%28cur%2Ebottom%20%2D%20next%2Ebottom%29%20%3E%202%29%0A%20%20%20%20%20%20%20%20%20%20%20%20heights%2Epush%28%28cur%2Ebottom%20%2B%20next%2Etop%29%20%2F%202%20%2D%20rect%2Etop%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20heights%2Epush%28rect%2Ebottom%20%2D%20rect%2Etop%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Find%20a%20line%20map%20%28mapping%20character%20offsets%20to%20text%20nodes%29%20and%20a%0A%20%20%2F%2F%20measurement%20cache%20for%20the%20given%20line%20number%2E%20%28A%20line%20view%20might%0A%20%20%2F%2F%20contain%20multiple%20lines%20when%20collapsed%20ranges%20are%20present%2E%29%0A%20%20function%20mapFromLineView%28lineView%2C%20line%2C%20lineN%29%20%7B%0A%20%20%20%20if%20%28lineView%2Eline%20%3D%3D%20line%29%0A%20%20%20%20%20%20return%20%7Bmap%3A%20lineView%2Emeasure%2Emap%2C%20cache%3A%20lineView%2Emeasure%2Ecache%7D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20lineView%2Erest%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20if%20%28lineView%2Erest%5Bi%5D%20%3D%3D%20line%29%0A%20%20%20%20%20%20%20%20return%20%7Bmap%3A%20lineView%2Emeasure%2Emaps%5Bi%5D%2C%20cache%3A%20lineView%2Emeasure%2Ecaches%5Bi%5D%7D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20lineView%2Erest%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20if%20%28lineNo%28lineView%2Erest%5Bi%5D%29%20%3E%20lineN%29%0A%20%20%20%20%20%20%20%20return%20%7Bmap%3A%20lineView%2Emeasure%2Emaps%5Bi%5D%2C%20cache%3A%20lineView%2Emeasure%2Ecaches%5Bi%5D%2C%20before%3A%20true%7D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Render%20a%20line%20into%20the%20hidden%20node%20display%2EexternalMeasured%2E%20Used%0A%20%20%2F%2F%20when%20measurement%20is%20needed%20for%20a%20line%20that%27s%20not%20in%20the%20viewport%2E%0A%20%20function%20updateExternalMeasurement%28cm%2C%20line%29%20%7B%0A%20%20%20%20line%20%3D%20visualLine%28line%29%3B%0A%20%20%20%20var%20lineN%20%3D%20lineNo%28line%29%3B%0A%20%20%20%20var%20view%20%3D%20cm%2Edisplay%2EexternalMeasured%20%3D%20new%20LineView%28cm%2Edoc%2C%20line%2C%20lineN%29%3B%0A%20%20%20%20view%2ElineN%20%3D%20lineN%3B%0A%20%20%20%20var%20built%20%3D%20view%2Ebuilt%20%3D%20buildLineContent%28cm%2C%20view%29%3B%0A%20%20%20%20view%2Etext%20%3D%20built%2Epre%3B%0A%20%20%20%20removeChildrenAndAdd%28cm%2Edisplay%2ElineMeasure%2C%20built%2Epre%29%3B%0A%20%20%20%20return%20view%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Get%20a%20%7Btop%2C%20bottom%2C%20left%2C%20right%7D%20box%20%28in%20line%2Dlocal%20coordinates%29%0A%20%20%2F%2F%20for%20a%20given%20character%2E%0A%20%20function%20measureChar%28cm%2C%20line%2C%20ch%2C%20bias%29%20%7B%0A%20%20%20%20return%20measureCharPrepared%28cm%2C%20prepareMeasureForLine%28cm%2C%20line%29%2C%20ch%2C%20bias%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Find%20a%20line%20view%20that%20corresponds%20to%20the%20given%20line%20number%2E%0A%20%20function%20findViewForLine%28cm%2C%20lineN%29%20%7B%0A%20%20%20%20if%20%28lineN%20%3E%3D%20cm%2Edisplay%2EviewFrom%20%26%26%20lineN%20%3C%20cm%2Edisplay%2EviewTo%29%0A%20%20%20%20%20%20return%20cm%2Edisplay%2Eview%5BfindViewIndex%28cm%2C%20lineN%29%5D%3B%0A%20%20%20%20var%20ext%20%3D%20cm%2Edisplay%2EexternalMeasured%3B%0A%20%20%20%20if%20%28ext%20%26%26%20lineN%20%3E%3D%20ext%2ElineN%20%26%26%20lineN%20%3C%20ext%2ElineN%20%2B%20ext%2Esize%29%0A%20%20%20%20%20%20return%20ext%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Measurement%20can%20be%20split%20in%20two%20steps%2C%20the%20set%2Dup%20work%20that%0A%20%20%2F%2F%20applies%20to%20the%20whole%20line%2C%20and%20the%20measurement%20of%20the%20actual%0A%20%20%2F%2F%20character%2E%20Functions%20like%20coordsChar%2C%20that%20need%20to%20do%20a%20lot%20of%0A%20%20%2F%2F%20measurements%20in%20a%20row%2C%20can%20thus%20ensure%20that%20the%20set%2Dup%20work%20is%0A%20%20%2F%2F%20only%20done%20once%2E%0A%20%20function%20prepareMeasureForLine%28cm%2C%20line%29%20%7B%0A%20%20%20%20var%20lineN%20%3D%20lineNo%28line%29%3B%0A%20%20%20%20var%20view%20%3D%20findViewForLine%28cm%2C%20lineN%29%3B%0A%20%20%20%20if%20%28view%20%26%26%20%21view%2Etext%29%20%7B%0A%20%20%20%20%20%20view%20%3D%20null%3B%0A%20%20%20%20%7D%20else%20if%20%28view%20%26%26%20view%2Echanges%29%20%7B%0A%20%20%20%20%20%20updateLineForChanges%28cm%2C%20view%2C%20lineN%2C%20getDimensions%28cm%29%29%3B%0A%20%20%20%20%20%20cm%2EcurOp%2EforceUpdate%20%3D%20true%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28%21view%29%0A%20%20%20%20%20%20view%20%3D%20updateExternalMeasurement%28cm%2C%20line%29%3B%0A%0A%20%20%20%20var%20info%20%3D%20mapFromLineView%28view%2C%20line%2C%20lineN%29%3B%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20line%3A%20line%2C%20view%3A%20view%2C%20rect%3A%20null%2C%0A%20%20%20%20%20%20map%3A%20info%2Emap%2C%20cache%3A%20info%2Ecache%2C%20before%3A%20info%2Ebefore%2C%0A%20%20%20%20%20%20hasHeights%3A%20false%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Given%20a%20prepared%20measurement%20object%2C%20measures%20the%20position%20of%20an%0A%20%20%2F%2F%20actual%20character%20%28or%20fetches%20it%20from%20the%20cache%29%2E%0A%20%20function%20measureCharPrepared%28cm%2C%20prepared%2C%20ch%2C%20bias%2C%20varHeight%29%20%7B%0A%20%20%20%20if%20%28prepared%2Ebefore%29%20ch%20%3D%20%2D1%3B%0A%20%20%20%20var%20key%20%3D%20ch%20%2B%20%28bias%20%7C%7C%20%22%22%29%2C%20found%3B%0A%20%20%20%20if%20%28prepared%2Ecache%2EhasOwnProperty%28key%29%29%20%7B%0A%20%20%20%20%20%20found%20%3D%20prepared%2Ecache%5Bkey%5D%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20if%20%28%21prepared%2Erect%29%0A%20%20%20%20%20%20%20%20prepared%2Erect%20%3D%20prepared%2Eview%2Etext%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20%20%20if%20%28%21prepared%2EhasHeights%29%20%7B%0A%20%20%20%20%20%20%20%20ensureLineHeights%28cm%2C%20prepared%2Eview%2C%20prepared%2Erect%29%3B%0A%20%20%20%20%20%20%20%20prepared%2EhasHeights%20%3D%20true%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20found%20%3D%20measureCharInner%28cm%2C%20prepared%2C%20ch%2C%20bias%29%3B%0A%20%20%20%20%20%20if%20%28%21found%2Ebogus%29%20prepared%2Ecache%5Bkey%5D%20%3D%20found%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20%7Bleft%3A%20found%2Eleft%2C%20right%3A%20found%2Eright%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20top%3A%20varHeight%20%3F%20found%2Ertop%20%3A%20found%2Etop%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20bottom%3A%20varHeight%20%3F%20found%2Erbottom%20%3A%20found%2Ebottom%7D%3B%0A%20%20%7D%0A%0A%20%20var%20nullRect%20%3D%20%7Bleft%3A%200%2C%20right%3A%200%2C%20top%3A%200%2C%20bottom%3A%200%7D%3B%0A%0A%20%20function%20nodeAndOffsetInLineMap%28map%2C%20ch%2C%20bias%29%20%7B%0A%20%20%20%20var%20node%2C%20start%2C%20end%2C%20collapse%3B%0A%20%20%20%20%2F%2F%20First%2C%20search%20the%20line%20map%20for%20the%20text%20node%20corresponding%20to%2C%0A%20%20%20%20%2F%2F%20or%20closest%20to%2C%20the%20target%20character%2E%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20map%2Elength%3B%20i%20%2B%3D%203%29%20%7B%0A%20%20%20%20%20%20var%20mStart%20%3D%20map%5Bi%5D%2C%20mEnd%20%3D%20map%5Bi%20%2B%201%5D%3B%0A%20%20%20%20%20%20if%20%28ch%20%3C%20mStart%29%20%7B%0A%20%20%20%20%20%20%20%20start%20%3D%200%3B%20end%20%3D%201%3B%0A%20%20%20%20%20%20%20%20collapse%20%3D%20%22left%22%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28ch%20%3C%20mEnd%29%20%7B%0A%20%20%20%20%20%20%20%20start%20%3D%20ch%20%2D%20mStart%3B%0A%20%20%20%20%20%20%20%20end%20%3D%20start%20%2B%201%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28i%20%3D%3D%20map%2Elength%20%2D%203%20%7C%7C%20ch%20%3D%3D%20mEnd%20%26%26%20map%5Bi%20%2B%203%5D%20%3E%20ch%29%20%7B%0A%20%20%20%20%20%20%20%20end%20%3D%20mEnd%20%2D%20mStart%3B%0A%20%20%20%20%20%20%20%20start%20%3D%20end%20%2D%201%3B%0A%20%20%20%20%20%20%20%20if%20%28ch%20%3E%3D%20mEnd%29%20collapse%20%3D%20%22right%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28start%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20node%20%3D%20map%5Bi%20%2B%202%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28mStart%20%3D%3D%20mEnd%20%26%26%20bias%20%3D%3D%20%28node%2EinsertLeft%20%3F%20%22left%22%20%3A%20%22right%22%29%29%0A%20%20%20%20%20%20%20%20%20%20collapse%20%3D%20bias%3B%0A%20%20%20%20%20%20%20%20if%20%28bias%20%3D%3D%20%22left%22%20%26%26%20start%20%3D%3D%200%29%0A%20%20%20%20%20%20%20%20%20%20while%20%28i%20%26%26%20map%5Bi%20%2D%202%5D%20%3D%3D%20map%5Bi%20%2D%203%5D%20%26%26%20map%5Bi%20%2D%201%5D%2EinsertLeft%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20node%20%3D%20map%5B%28i%20%2D%3D%203%29%20%2B%202%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20collapse%20%3D%20%22left%22%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28bias%20%3D%3D%20%22right%22%20%26%26%20start%20%3D%3D%20mEnd%20%2D%20mStart%29%0A%20%20%20%20%20%20%20%20%20%20while%20%28i%20%3C%20map%2Elength%20%2D%203%20%26%26%20map%5Bi%20%2B%203%5D%20%3D%3D%20map%5Bi%20%2B%204%5D%20%26%26%20%21map%5Bi%20%2B%205%5D%2EinsertLeft%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20node%20%3D%20map%5B%28i%20%2B%3D%203%29%20%2B%202%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20collapse%20%3D%20%22right%22%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20%7Bnode%3A%20node%2C%20start%3A%20start%2C%20end%3A%20end%2C%20collapse%3A%20collapse%2C%20coverStart%3A%20mStart%2C%20coverEnd%3A%20mEnd%7D%3B%0A%20%20%7D%0A%0A%20%20function%20measureCharInner%28cm%2C%20prepared%2C%20ch%2C%20bias%29%20%7B%0A%20%20%20%20var%20place%20%3D%20nodeAndOffsetInLineMap%28prepared%2Emap%2C%20ch%2C%20bias%29%3B%0A%20%20%20%20var%20node%20%3D%20place%2Enode%2C%20start%20%3D%20place%2Estart%2C%20end%20%3D%20place%2Eend%2C%20collapse%20%3D%20place%2Ecollapse%3B%0A%0A%20%20%20%20var%20rect%3B%0A%20%20%20%20if%20%28node%2EnodeType%20%3D%3D%203%29%20%7B%20%2F%2F%20If%20it%20is%20a%20text%20node%2C%20use%20a%20range%20to%20retrieve%20the%20coordinates%2E%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%204%3B%20i%2B%2B%29%20%7B%20%2F%2F%20Retry%20a%20maximum%20of%204%20times%20when%20nonsense%20rectangles%20are%20returned%0A%20%20%20%20%20%20%20%20while%20%28start%20%26%26%20isExtendingChar%28prepared%2Eline%2Etext%2EcharAt%28place%2EcoverStart%20%2B%20start%29%29%29%20%2D%2Dstart%3B%0A%20%20%20%20%20%20%20%20while%20%28place%2EcoverStart%20%2B%20end%20%3C%20place%2EcoverEnd%20%26%26%20isExtendingChar%28prepared%2Eline%2Etext%2EcharAt%28place%2EcoverStart%20%2B%20end%29%29%29%20%2B%2Bend%3B%0A%20%20%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%209%20%26%26%20start%20%3D%3D%200%20%26%26%20end%20%3D%3D%20place%2EcoverEnd%20%2D%20place%2EcoverStart%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20rect%20%3D%20node%2EparentNode%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28ie%20%26%26%20cm%2Eoptions%2ElineWrapping%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20rects%20%3D%20range%28node%2C%20start%2C%20end%29%2EgetClientRects%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28rects%2Elength%29%0A%20%20%20%20%20%20%20%20%20%20%20%20rect%20%3D%20rects%5Bbias%20%3D%3D%20%22right%22%20%3F%20rects%2Elength%20%2D%201%20%3A%200%5D%3B%0A%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20rect%20%3D%20nullRect%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20rect%20%3D%20range%28node%2C%20start%2C%20end%29%2EgetBoundingClientRect%28%29%20%7C%7C%20nullRect%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28rect%2Eleft%20%7C%7C%20rect%2Eright%20%7C%7C%20start%20%3D%3D%200%29%20break%3B%0A%20%20%20%20%20%20%20%20end%20%3D%20start%3B%0A%20%20%20%20%20%20%20%20start%20%3D%20start%20%2D%201%3B%0A%20%20%20%20%20%20%20%20collapse%20%3D%20%22right%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%2011%29%20rect%20%3D%20maybeUpdateRectForZooming%28cm%2Edisplay%2Emeasure%2C%20rect%29%3B%0A%20%20%20%20%7D%20else%20%7B%20%2F%2F%20If%20it%20is%20a%20widget%2C%20simply%20get%20the%20box%20for%20the%20whole%20widget%2E%0A%20%20%20%20%20%20if%20%28start%20%3E%200%29%20collapse%20%3D%20bias%20%3D%20%22right%22%3B%0A%20%20%20%20%20%20var%20rects%3B%0A%20%20%20%20%20%20if%20%28cm%2Eoptions%2ElineWrapping%20%26%26%20%28rects%20%3D%20node%2EgetClientRects%28%29%29%2Elength%20%3E%201%29%0A%20%20%20%20%20%20%20%20rect%20%3D%20rects%5Bbias%20%3D%3D%20%22right%22%20%3F%20rects%2Elength%20%2D%201%20%3A%200%5D%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20rect%20%3D%20node%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%209%20%26%26%20%21start%20%26%26%20%28%21rect%20%7C%7C%20%21rect%2Eleft%20%26%26%20%21rect%2Eright%29%29%20%7B%0A%20%20%20%20%20%20var%20rSpan%20%3D%20node%2EparentNode%2EgetClientRects%28%29%5B0%5D%3B%0A%20%20%20%20%20%20if%20%28rSpan%29%0A%20%20%20%20%20%20%20%20rect%20%3D%20%7Bleft%3A%20rSpan%2Eleft%2C%20right%3A%20rSpan%2Eleft%20%2B%20charWidth%28cm%2Edisplay%29%2C%20top%3A%20rSpan%2Etop%2C%20bottom%3A%20rSpan%2Ebottom%7D%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20rect%20%3D%20nullRect%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20rtop%20%3D%20rect%2Etop%20%2D%20prepared%2Erect%2Etop%2C%20rbot%20%3D%20rect%2Ebottom%20%2D%20prepared%2Erect%2Etop%3B%0A%20%20%20%20var%20mid%20%3D%20%28rtop%20%2B%20rbot%29%20%2F%202%3B%0A%20%20%20%20var%20heights%20%3D%20prepared%2Eview%2Emeasure%2Eheights%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20heights%2Elength%20%2D%201%3B%20i%2B%2B%29%0A%20%20%20%20%20%20if%20%28mid%20%3C%20heights%5Bi%5D%29%20break%3B%0A%20%20%20%20var%20top%20%3D%20i%20%3F%20heights%5Bi%20%2D%201%5D%20%3A%200%2C%20bot%20%3D%20heights%5Bi%5D%3B%0A%20%20%20%20var%20result%20%3D%20%7Bleft%3A%20%28collapse%20%3D%3D%20%22right%22%20%3F%20rect%2Eright%20%3A%20rect%2Eleft%29%20%2D%20prepared%2Erect%2Eleft%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20right%3A%20%28collapse%20%3D%3D%20%22left%22%20%3F%20rect%2Eleft%20%3A%20rect%2Eright%29%20%2D%20prepared%2Erect%2Eleft%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top%3A%20top%2C%20bottom%3A%20bot%7D%3B%0A%20%20%20%20if%20%28%21rect%2Eleft%20%26%26%20%21rect%2Eright%29%20result%2Ebogus%20%3D%20true%3B%0A%20%20%20%20if%20%28%21cm%2Eoptions%2EsingleCursorHeightPerLine%29%20%7B%20result%2Ertop%20%3D%20rtop%3B%20result%2Erbottom%20%3D%20rbot%3B%20%7D%0A%0A%20%20%20%20return%20result%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Work%20around%20problem%20with%20bounding%20client%20rects%20on%20ranges%20being%0A%20%20%2F%2F%20returned%20incorrectly%20when%20zoomed%20on%20IE10%20and%20below%2E%0A%20%20function%20maybeUpdateRectForZooming%28measure%2C%20rect%29%20%7B%0A%20%20%20%20if%20%28%21window%2Escreen%20%7C%7C%20screen%2ElogicalXDPI%20%3D%3D%20null%20%7C%7C%0A%20%20%20%20%20%20%20%20screen%2ElogicalXDPI%20%3D%3D%20screen%2EdeviceXDPI%20%7C%7C%20%21hasBadZoomedRects%28measure%29%29%0A%20%20%20%20%20%20return%20rect%3B%0A%20%20%20%20var%20scaleX%20%3D%20screen%2ElogicalXDPI%20%2F%20screen%2EdeviceXDPI%3B%0A%20%20%20%20var%20scaleY%20%3D%20screen%2ElogicalYDPI%20%2F%20screen%2EdeviceYDPI%3B%0A%20%20%20%20return%20%7Bleft%3A%20rect%2Eleft%20%2A%20scaleX%2C%20right%3A%20rect%2Eright%20%2A%20scaleX%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20top%3A%20rect%2Etop%20%2A%20scaleY%2C%20bottom%3A%20rect%2Ebottom%20%2A%20scaleY%7D%3B%0A%20%20%7D%0A%0A%20%20function%20clearLineMeasurementCacheFor%28lineView%29%20%7B%0A%20%20%20%20if%20%28lineView%2Emeasure%29%20%7B%0A%20%20%20%20%20%20lineView%2Emeasure%2Ecache%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20lineView%2Emeasure%2Eheights%20%3D%20null%3B%0A%20%20%20%20%20%20if%20%28lineView%2Erest%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20lineView%2Erest%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20lineView%2Emeasure%2Ecaches%5Bi%5D%20%3D%20%7B%7D%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20clearLineMeasurementCache%28cm%29%20%7B%0A%20%20%20%20cm%2Edisplay%2EexternalMeasure%20%3D%20null%3B%0A%20%20%20%20removeChildren%28cm%2Edisplay%2ElineMeasure%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20cm%2Edisplay%2Eview%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20clearLineMeasurementCacheFor%28cm%2Edisplay%2Eview%5Bi%5D%29%3B%0A%20%20%7D%0A%0A%20%20function%20clearCaches%28cm%29%20%7B%0A%20%20%20%20clearLineMeasurementCache%28cm%29%3B%0A%20%20%20%20cm%2Edisplay%2EcachedCharWidth%20%3D%20cm%2Edisplay%2EcachedTextHeight%20%3D%20cm%2Edisplay%2EcachedPaddingH%20%3D%20null%3B%0A%20%20%20%20if%20%28%21cm%2Eoptions%2ElineWrapping%29%20cm%2Edisplay%2EmaxLineChanged%20%3D%20true%3B%0A%20%20%20%20cm%2Edisplay%2ElineNumChars%20%3D%20null%3B%0A%20%20%7D%0A%0A%20%20function%20pageScrollX%28%29%20%7B%20return%20window%2EpageXOffset%20%7C%7C%20%28document%2EdocumentElement%20%7C%7C%20document%2Ebody%29%2EscrollLeft%3B%20%7D%0A%20%20function%20pageScrollY%28%29%20%7B%20return%20window%2EpageYOffset%20%7C%7C%20%28document%2EdocumentElement%20%7C%7C%20document%2Ebody%29%2EscrollTop%3B%20%7D%0A%0A%20%20%2F%2F%20Converts%20a%20%7Btop%2C%20bottom%2C%20left%2C%20right%7D%20box%20from%20line%2Dlocal%0A%20%20%2F%2F%20coordinates%20into%20another%20coordinate%20system%2E%20Context%20may%20be%20one%20of%0A%20%20%2F%2F%20%22line%22%2C%20%22div%22%20%28display%2ElineDiv%29%2C%20%22local%22%2Fnull%20%28editor%29%2C%20%22window%22%2C%0A%20%20%2F%2F%20or%20%22page%22%2E%0A%20%20function%20intoCoordSystem%28cm%2C%20lineObj%2C%20rect%2C%20context%29%20%7B%0A%20%20%20%20if%20%28lineObj%2Ewidgets%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20lineObj%2Ewidgets%2Elength%3B%20%2B%2Bi%29%20if%20%28lineObj%2Ewidgets%5Bi%5D%2Eabove%29%20%7B%0A%20%20%20%20%20%20var%20size%20%3D%20widgetHeight%28lineObj%2Ewidgets%5Bi%5D%29%3B%0A%20%20%20%20%20%20rect%2Etop%20%2B%3D%20size%3B%20rect%2Ebottom%20%2B%3D%20size%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28context%20%3D%3D%20%22line%22%29%20return%20rect%3B%0A%20%20%20%20if%20%28%21context%29%20context%20%3D%20%22local%22%3B%0A%20%20%20%20var%20yOff%20%3D%20heightAtLine%28lineObj%29%3B%0A%20%20%20%20if%20%28context%20%3D%3D%20%22local%22%29%20yOff%20%2B%3D%20paddingTop%28cm%2Edisplay%29%3B%0A%20%20%20%20else%20yOff%20%2D%3D%20cm%2Edisplay%2EviewOffset%3B%0A%20%20%20%20if%20%28context%20%3D%3D%20%22page%22%20%7C%7C%20context%20%3D%3D%20%22window%22%29%20%7B%0A%20%20%20%20%20%20var%20lOff%20%3D%20cm%2Edisplay%2ElineSpace%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20%20%20yOff%20%2B%3D%20lOff%2Etop%20%2B%20%28context%20%3D%3D%20%22window%22%20%3F%200%20%3A%20pageScrollY%28%29%29%3B%0A%20%20%20%20%20%20var%20xOff%20%3D%20lOff%2Eleft%20%2B%20%28context%20%3D%3D%20%22window%22%20%3F%200%20%3A%20pageScrollX%28%29%29%3B%0A%20%20%20%20%20%20rect%2Eleft%20%2B%3D%20xOff%3B%20rect%2Eright%20%2B%3D%20xOff%3B%0A%20%20%20%20%7D%0A%20%20%20%20rect%2Etop%20%2B%3D%20yOff%3B%20rect%2Ebottom%20%2B%3D%20yOff%3B%0A%20%20%20%20return%20rect%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Coverts%20a%20box%20from%20%22div%22%20coords%20to%20another%20coordinate%20system%2E%0A%20%20%2F%2F%20Context%20may%20be%20%22window%22%2C%20%22page%22%2C%20%22div%22%2C%20or%20%22local%22%2Fnull%2E%0A%20%20function%20fromCoordSystem%28cm%2C%20coords%2C%20context%29%20%7B%0A%20%20%20%20if%20%28context%20%3D%3D%20%22div%22%29%20return%20coords%3B%0A%20%20%20%20var%20left%20%3D%20coords%2Eleft%2C%20top%20%3D%20coords%2Etop%3B%0A%20%20%20%20%2F%2F%20First%20move%20into%20%22page%22%20coordinate%20system%0A%20%20%20%20if%20%28context%20%3D%3D%20%22page%22%29%20%7B%0A%20%20%20%20%20%20left%20%2D%3D%20pageScrollX%28%29%3B%0A%20%20%20%20%20%20top%20%2D%3D%20pageScrollY%28%29%3B%0A%20%20%20%20%7D%20else%20if%20%28context%20%3D%3D%20%22local%22%20%7C%7C%20%21context%29%20%7B%0A%20%20%20%20%20%20var%20localBox%20%3D%20cm%2Edisplay%2Esizer%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20%20%20left%20%2B%3D%20localBox%2Eleft%3B%0A%20%20%20%20%20%20top%20%2B%3D%20localBox%2Etop%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20lineSpaceBox%20%3D%20cm%2Edisplay%2ElineSpace%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20return%20%7Bleft%3A%20left%20%2D%20lineSpaceBox%2Eleft%2C%20top%3A%20top%20%2D%20lineSpaceBox%2Etop%7D%3B%0A%20%20%7D%0A%0A%20%20function%20charCoords%28cm%2C%20pos%2C%20context%2C%20lineObj%2C%20bias%29%20%7B%0A%20%20%20%20if%20%28%21lineObj%29%20lineObj%20%3D%20getLine%28cm%2Edoc%2C%20pos%2Eline%29%3B%0A%20%20%20%20return%20intoCoordSystem%28cm%2C%20lineObj%2C%20measureChar%28cm%2C%20lineObj%2C%20pos%2Ech%2C%20bias%29%2C%20context%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Returns%20a%20box%20for%20a%20given%20cursor%20position%2C%20which%20may%20have%20an%0A%20%20%2F%2F%20%27other%27%20property%20containing%20the%20position%20of%20the%20secondary%20cursor%0A%20%20%2F%2F%20on%20a%20bidi%20boundary%2E%0A%20%20function%20cursorCoords%28cm%2C%20pos%2C%20context%2C%20lineObj%2C%20preparedMeasure%2C%20varHeight%29%20%7B%0A%20%20%20%20lineObj%20%3D%20lineObj%20%7C%7C%20getLine%28cm%2Edoc%2C%20pos%2Eline%29%3B%0A%20%20%20%20if%20%28%21preparedMeasure%29%20preparedMeasure%20%3D%20prepareMeasureForLine%28cm%2C%20lineObj%29%3B%0A%20%20%20%20function%20get%28ch%2C%20right%29%20%7B%0A%20%20%20%20%20%20var%20m%20%3D%20measureCharPrepared%28cm%2C%20preparedMeasure%2C%20ch%2C%20right%20%3F%20%22right%22%20%3A%20%22left%22%2C%20varHeight%29%3B%0A%20%20%20%20%20%20if%20%28right%29%20m%2Eleft%20%3D%20m%2Eright%3B%20else%20m%2Eright%20%3D%20m%2Eleft%3B%0A%20%20%20%20%20%20return%20intoCoordSystem%28cm%2C%20lineObj%2C%20m%2C%20context%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20function%20getBidi%28ch%2C%20partPos%29%20%7B%0A%20%20%20%20%20%20var%20part%20%3D%20order%5BpartPos%5D%2C%20right%20%3D%20part%2Elevel%20%25%202%3B%0A%20%20%20%20%20%20if%20%28ch%20%3D%3D%20bidiLeft%28part%29%20%26%26%20partPos%20%26%26%20part%2Elevel%20%3C%20order%5BpartPos%20%2D%201%5D%2Elevel%29%20%7B%0A%20%20%20%20%20%20%20%20part%20%3D%20order%5B%2D%2DpartPos%5D%3B%0A%20%20%20%20%20%20%20%20ch%20%3D%20bidiRight%28part%29%20%2D%20%28part%2Elevel%20%25%202%20%3F%200%20%3A%201%29%3B%0A%20%20%20%20%20%20%20%20right%20%3D%20true%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20bidiRight%28part%29%20%26%26%20partPos%20%3C%20order%2Elength%20%2D%201%20%26%26%20part%2Elevel%20%3C%20order%5BpartPos%20%2B%201%5D%2Elevel%29%20%7B%0A%20%20%20%20%20%20%20%20part%20%3D%20order%5B%2B%2BpartPos%5D%3B%0A%20%20%20%20%20%20%20%20ch%20%3D%20bidiLeft%28part%29%20%2D%20part%2Elevel%20%25%202%3B%0A%20%20%20%20%20%20%20%20right%20%3D%20false%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28right%20%26%26%20ch%20%3D%3D%20part%2Eto%20%26%26%20ch%20%3E%20part%2Efrom%29%20return%20get%28ch%20%2D%201%29%3B%0A%20%20%20%20%20%20return%20get%28ch%2C%20right%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20order%20%3D%20getOrder%28lineObj%29%2C%20ch%20%3D%20pos%2Ech%3B%0A%20%20%20%20if%20%28%21order%29%20return%20get%28ch%29%3B%0A%20%20%20%20var%20partPos%20%3D%20getBidiPartAt%28order%2C%20ch%29%3B%0A%20%20%20%20var%20val%20%3D%20getBidi%28ch%2C%20partPos%29%3B%0A%20%20%20%20if%20%28bidiOther%20%21%3D%20null%29%20val%2Eother%20%3D%20getBidi%28ch%2C%20bidiOther%29%3B%0A%20%20%20%20return%20val%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Used%20to%20cheaply%20estimate%20the%20coordinates%20for%20a%20position%2E%20Used%20for%0A%20%20%2F%2F%20intermediate%20scroll%20updates%2E%0A%20%20function%20estimateCoords%28cm%2C%20pos%29%20%7B%0A%20%20%20%20var%20left%20%3D%200%2C%20pos%20%3D%20clipPos%28cm%2Edoc%2C%20pos%29%3B%0A%20%20%20%20if%20%28%21cm%2Eoptions%2ElineWrapping%29%20left%20%3D%20charWidth%28cm%2Edisplay%29%20%2A%20pos%2Ech%3B%0A%20%20%20%20var%20lineObj%20%3D%20getLine%28cm%2Edoc%2C%20pos%2Eline%29%3B%0A%20%20%20%20var%20top%20%3D%20heightAtLine%28lineObj%29%20%2B%20paddingTop%28cm%2Edisplay%29%3B%0A%20%20%20%20return%20%7Bleft%3A%20left%2C%20right%3A%20left%2C%20top%3A%20top%2C%20bottom%3A%20top%20%2B%20lineObj%2Eheight%7D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Positions%20returned%20by%20coordsChar%20contain%20some%20extra%20information%2E%0A%20%20%2F%2F%20xRel%20is%20the%20relative%20x%20position%20of%20the%20input%20coordinates%20compared%0A%20%20%2F%2F%20to%20the%20found%20position%20%28so%20xRel%20%3E%200%20means%20the%20coordinates%20are%20to%0A%20%20%2F%2F%20the%20right%20of%20the%20character%20position%2C%20for%20example%29%2E%20When%20outside%0A%20%20%2F%2F%20is%20true%2C%20that%20means%20the%20coordinates%20lie%20outside%20the%20line%27s%0A%20%20%2F%2F%20vertical%20range%2E%0A%20%20function%20PosWithInfo%28line%2C%20ch%2C%20outside%2C%20xRel%29%20%7B%0A%20%20%20%20var%20pos%20%3D%20Pos%28line%2C%20ch%29%3B%0A%20%20%20%20pos%2ExRel%20%3D%20xRel%3B%0A%20%20%20%20if%20%28outside%29%20pos%2Eoutside%20%3D%20true%3B%0A%20%20%20%20return%20pos%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Compute%20the%20character%20position%20closest%20to%20the%20given%20coordinates%2E%0A%20%20%2F%2F%20Input%20must%20be%20lineSpace%2Dlocal%20%28%22div%22%20coordinate%20system%29%2E%0A%20%20function%20coordsChar%28cm%2C%20x%2C%20y%29%20%7B%0A%20%20%20%20var%20doc%20%3D%20cm%2Edoc%3B%0A%20%20%20%20y%20%2B%3D%20cm%2Edisplay%2EviewOffset%3B%0A%20%20%20%20if%20%28y%20%3C%200%29%20return%20PosWithInfo%28doc%2Efirst%2C%200%2C%20true%2C%20%2D1%29%3B%0A%20%20%20%20var%20lineN%20%3D%20lineAtHeight%28doc%2C%20y%29%2C%20last%20%3D%20doc%2Efirst%20%2B%20doc%2Esize%20%2D%201%3B%0A%20%20%20%20if%20%28lineN%20%3E%20last%29%0A%20%20%20%20%20%20return%20PosWithInfo%28doc%2Efirst%20%2B%20doc%2Esize%20%2D%201%2C%20getLine%28doc%2C%20last%29%2Etext%2Elength%2C%20true%2C%201%29%3B%0A%20%20%20%20if%20%28x%20%3C%200%29%20x%20%3D%200%3B%0A%0A%20%20%20%20var%20lineObj%20%3D%20getLine%28doc%2C%20lineN%29%3B%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20var%20found%20%3D%20coordsCharInner%28cm%2C%20lineObj%2C%20lineN%2C%20x%2C%20y%29%3B%0A%20%20%20%20%20%20var%20merged%20%3D%20collapsedSpanAtEnd%28lineObj%29%3B%0A%20%20%20%20%20%20var%20mergedPos%20%3D%20merged%20%26%26%20merged%2Efind%280%2C%20true%29%3B%0A%20%20%20%20%20%20if%20%28merged%20%26%26%20%28found%2Ech%20%3E%20mergedPos%2Efrom%2Ech%20%7C%7C%20found%2Ech%20%3D%3D%20mergedPos%2Efrom%2Ech%20%26%26%20found%2ExRel%20%3E%200%29%29%0A%20%20%20%20%20%20%20%20lineN%20%3D%20lineNo%28lineObj%20%3D%20mergedPos%2Eto%2Eline%29%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20return%20found%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20coordsCharInner%28cm%2C%20lineObj%2C%20lineNo%2C%20x%2C%20y%29%20%7B%0A%20%20%20%20var%20innerOff%20%3D%20y%20%2D%20heightAtLine%28lineObj%29%3B%0A%20%20%20%20var%20wrongLine%20%3D%20false%2C%20adjust%20%3D%202%20%2A%20cm%2Edisplay%2Ewrapper%2EclientWidth%3B%0A%20%20%20%20var%20preparedMeasure%20%3D%20prepareMeasureForLine%28cm%2C%20lineObj%29%3B%0A%0A%20%20%20%20function%20getX%28ch%29%20%7B%0A%20%20%20%20%20%20var%20sp%20%3D%20cursorCoords%28cm%2C%20Pos%28lineNo%2C%20ch%29%2C%20%22line%22%2C%20lineObj%2C%20preparedMeasure%29%3B%0A%20%20%20%20%20%20wrongLine%20%3D%20true%3B%0A%20%20%20%20%20%20if%20%28innerOff%20%3E%20sp%2Ebottom%29%20return%20sp%2Eleft%20%2D%20adjust%3B%0A%20%20%20%20%20%20else%20if%20%28innerOff%20%3C%20sp%2Etop%29%20return%20sp%2Eleft%20%2B%20adjust%3B%0A%20%20%20%20%20%20else%20wrongLine%20%3D%20false%3B%0A%20%20%20%20%20%20return%20sp%2Eleft%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20bidi%20%3D%20getOrder%28lineObj%29%2C%20dist%20%3D%20lineObj%2Etext%2Elength%3B%0A%20%20%20%20var%20from%20%3D%20lineLeft%28lineObj%29%2C%20to%20%3D%20lineRight%28lineObj%29%3B%0A%20%20%20%20var%20fromX%20%3D%20getX%28from%29%2C%20fromOutside%20%3D%20wrongLine%2C%20toX%20%3D%20getX%28to%29%2C%20toOutside%20%3D%20wrongLine%3B%0A%0A%20%20%20%20if%20%28x%20%3E%20toX%29%20return%20PosWithInfo%28lineNo%2C%20to%2C%20toOutside%2C%201%29%3B%0A%20%20%20%20%2F%2F%20Do%20a%20binary%20search%20between%20these%20bounds%2E%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20if%20%28bidi%20%3F%20to%20%3D%3D%20from%20%7C%7C%20to%20%3D%3D%20moveVisually%28lineObj%2C%20from%2C%201%29%20%3A%20to%20%2D%20from%20%3C%3D%201%29%20%7B%0A%20%20%20%20%20%20%20%20var%20ch%20%3D%20x%20%3C%20fromX%20%7C%7C%20x%20%2D%20fromX%20%3C%3D%20toX%20%2D%20x%20%3F%20from%20%3A%20to%3B%0A%20%20%20%20%20%20%20%20var%20xDiff%20%3D%20x%20%2D%20%28ch%20%3D%3D%20from%20%3F%20fromX%20%3A%20toX%29%3B%0A%20%20%20%20%20%20%20%20while%20%28isExtendingChar%28lineObj%2Etext%2EcharAt%28ch%29%29%29%20%2B%2Bch%3B%0A%20%20%20%20%20%20%20%20var%20pos%20%3D%20PosWithInfo%28lineNo%2C%20ch%2C%20ch%20%3D%3D%20from%20%3F%20fromOutside%20%3A%20toOutside%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20xDiff%20%3C%20%2D1%20%3F%20%2D1%20%3A%20xDiff%20%3E%201%20%3F%201%20%3A%200%29%3B%0A%20%20%20%20%20%20%20%20return%20pos%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20step%20%3D%20Math%2Eceil%28dist%20%2F%202%29%2C%20middle%20%3D%20from%20%2B%20step%3B%0A%20%20%20%20%20%20if%20%28bidi%29%20%7B%0A%20%20%20%20%20%20%20%20middle%20%3D%20from%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20step%3B%20%2B%2Bi%29%20middle%20%3D%20moveVisually%28lineObj%2C%20middle%2C%201%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20middleX%20%3D%20getX%28middle%29%3B%0A%20%20%20%20%20%20if%20%28middleX%20%3E%20x%29%20%7Bto%20%3D%20middle%3B%20toX%20%3D%20middleX%3B%20if%20%28toOutside%20%3D%20wrongLine%29%20toX%20%2B%3D%201000%3B%20dist%20%3D%20step%3B%7D%0A%20%20%20%20%20%20else%20%7Bfrom%20%3D%20middle%3B%20fromX%20%3D%20middleX%3B%20fromOutside%20%3D%20wrongLine%3B%20dist%20%2D%3D%20step%3B%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20measureText%3B%0A%20%20%2F%2F%20Compute%20the%20default%20text%20height%2E%0A%20%20function%20textHeight%28display%29%20%7B%0A%20%20%20%20if%20%28display%2EcachedTextHeight%20%21%3D%20null%29%20return%20display%2EcachedTextHeight%3B%0A%20%20%20%20if%20%28measureText%20%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20measureText%20%3D%20elt%28%22pre%22%29%3B%0A%20%20%20%20%20%20%2F%2F%20Measure%20a%20bunch%20of%20lines%2C%20for%20browsers%20that%20compute%0A%20%20%20%20%20%20%2F%2F%20fractional%20heights%2E%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%2049%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20measureText%2EappendChild%28document%2EcreateTextNode%28%22x%22%29%29%3B%0A%20%20%20%20%20%20%20%20measureText%2EappendChild%28elt%28%22br%22%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20measureText%2EappendChild%28document%2EcreateTextNode%28%22x%22%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20removeChildrenAndAdd%28display%2Emeasure%2C%20measureText%29%3B%0A%20%20%20%20var%20height%20%3D%20measureText%2EoffsetHeight%20%2F%2050%3B%0A%20%20%20%20if%20%28height%20%3E%203%29%20display%2EcachedTextHeight%20%3D%20height%3B%0A%20%20%20%20removeChildren%28display%2Emeasure%29%3B%0A%20%20%20%20return%20height%20%7C%7C%201%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Compute%20the%20default%20character%20width%2E%0A%20%20function%20charWidth%28display%29%20%7B%0A%20%20%20%20if%20%28display%2EcachedCharWidth%20%21%3D%20null%29%20return%20display%2EcachedCharWidth%3B%0A%20%20%20%20var%20anchor%20%3D%20elt%28%22span%22%2C%20%22xxxxxxxxxx%22%29%3B%0A%20%20%20%20var%20pre%20%3D%20elt%28%22pre%22%2C%20%5Banchor%5D%29%3B%0A%20%20%20%20removeChildrenAndAdd%28display%2Emeasure%2C%20pre%29%3B%0A%20%20%20%20var%20rect%20%3D%20anchor%2EgetBoundingClientRect%28%29%2C%20width%20%3D%20%28rect%2Eright%20%2D%20rect%2Eleft%29%20%2F%2010%3B%0A%20%20%20%20if%20%28width%20%3E%202%29%20display%2EcachedCharWidth%20%3D%20width%3B%0A%20%20%20%20return%20width%20%7C%7C%2010%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20OPERATIONS%0A%0A%20%20%2F%2F%20Operations%20are%20used%20to%20wrap%20a%20series%20of%20changes%20to%20the%20editor%0A%20%20%2F%2F%20state%20in%20such%20a%20way%20that%20each%20change%20won%27t%20have%20to%20update%20the%0A%20%20%2F%2F%20cursor%20and%20display%20%28which%20would%20be%20awkward%2C%20slow%2C%20and%0A%20%20%2F%2F%20error%2Dprone%29%2E%20Instead%2C%20display%20updates%20are%20batched%20and%20then%20all%0A%20%20%2F%2F%20combined%20and%20executed%20at%20once%2E%0A%0A%20%20var%20operationGroup%20%3D%20null%3B%0A%0A%20%20var%20nextOpId%20%3D%200%3B%0A%20%20%2F%2F%20Start%20a%20new%20operation%2E%0A%20%20function%20startOperation%28cm%29%20%7B%0A%20%20%20%20cm%2EcurOp%20%3D%20%7B%0A%20%20%20%20%20%20cm%3A%20cm%2C%0A%20%20%20%20%20%20viewChanged%3A%20false%2C%20%20%20%20%20%20%2F%2F%20Flag%20that%20indicates%20that%20lines%20might%20need%20to%20be%20redrawn%0A%20%20%20%20%20%20startHeight%3A%20cm%2Edoc%2Eheight%2C%20%2F%2F%20Used%20to%20detect%20need%20to%20update%20scrollbar%0A%20%20%20%20%20%20forceUpdate%3A%20false%2C%20%20%20%20%20%20%2F%2F%20Used%20to%20force%20a%20redraw%0A%20%20%20%20%20%20updateInput%3A%20null%2C%20%20%20%20%20%20%20%2F%2F%20Whether%20to%20reset%20the%20input%20textarea%0A%20%20%20%20%20%20typing%3A%20false%2C%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Whether%20this%20reset%20should%20be%20careful%20to%20leave%20existing%20text%20%28for%20compositing%29%0A%20%20%20%20%20%20changeObjs%3A%20null%2C%20%20%20%20%20%20%20%20%2F%2F%20Accumulated%20changes%2C%20for%20firing%20change%20events%0A%20%20%20%20%20%20cursorActivityHandlers%3A%20null%2C%20%2F%2F%20Set%20of%20handlers%20to%20fire%20cursorActivity%20on%0A%20%20%20%20%20%20cursorActivityCalled%3A%200%2C%20%2F%2F%20Tracks%20which%20cursorActivity%20handlers%20have%20been%20called%20already%0A%20%20%20%20%20%20selectionChanged%3A%20false%2C%20%2F%2F%20Whether%20the%20selection%20needs%20to%20be%20redrawn%0A%20%20%20%20%20%20updateMaxLine%3A%20false%2C%20%20%20%20%2F%2F%20Set%20when%20the%20widest%20line%20needs%20to%20be%20determined%20anew%0A%20%20%20%20%20%20scrollLeft%3A%20null%2C%20scrollTop%3A%20null%2C%20%2F%2F%20Intermediate%20scroll%20position%2C%20not%20pushed%20to%20DOM%20yet%0A%20%20%20%20%20%20scrollToPos%3A%20null%2C%20%20%20%20%20%20%20%2F%2F%20Used%20to%20scroll%20to%20a%20specific%20position%0A%20%20%20%20%20%20focus%3A%20false%2C%0A%20%20%20%20%20%20id%3A%20%2B%2BnextOpId%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Unique%20ID%0A%20%20%20%20%7D%3B%0A%20%20%20%20if%20%28operationGroup%29%20%7B%0A%20%20%20%20%20%20operationGroup%2Eops%2Epush%28cm%2EcurOp%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20cm%2EcurOp%2EownsGroup%20%3D%20operationGroup%20%3D%20%7B%0A%20%20%20%20%20%20%20%20ops%3A%20%5Bcm%2EcurOp%5D%2C%0A%20%20%20%20%20%20%20%20delayedCallbacks%3A%20%5B%5D%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20fireCallbacksForOps%28group%29%20%7B%0A%20%20%20%20%2F%2F%20Calls%20delayed%20callbacks%20and%20cursorActivity%20handlers%20until%20no%0A%20%20%20%20%2F%2F%20new%20ones%20appear%0A%20%20%20%20var%20callbacks%20%3D%20group%2EdelayedCallbacks%2C%20i%20%3D%200%3B%0A%20%20%20%20do%20%7B%0A%20%20%20%20%20%20for%20%28%3B%20i%20%3C%20callbacks%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20callbacks%5Bi%5D%2Ecall%28null%29%3B%0A%20%20%20%20%20%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20group%2Eops%2Elength%3B%20j%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20op%20%3D%20group%2Eops%5Bj%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28op%2EcursorActivityHandlers%29%0A%20%20%20%20%20%20%20%20%20%20while%20%28op%2EcursorActivityCalled%20%3C%20op%2EcursorActivityHandlers%2Elength%29%0A%20%20%20%20%20%20%20%20%20%20%20%20op%2EcursorActivityHandlers%5Bop%2EcursorActivityCalled%2B%2B%5D%2Ecall%28null%2C%20op%2Ecm%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20while%20%28i%20%3C%20callbacks%2Elength%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Finish%20an%20operation%2C%20updating%20the%20display%20and%20signalling%20delayed%20events%0A%20%20function%20endOperation%28cm%29%20%7B%0A%20%20%20%20var%20op%20%3D%20cm%2EcurOp%2C%20group%20%3D%20op%2EownsGroup%3B%0A%20%20%20%20if%20%28%21group%29%20return%3B%0A%0A%20%20%20%20try%20%7B%20fireCallbacksForOps%28group%29%3B%20%7D%0A%20%20%20%20finally%20%7B%0A%20%20%20%20%20%20operationGroup%20%3D%20null%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20group%2Eops%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20group%2Eops%5Bi%5D%2Ecm%2EcurOp%20%3D%20null%3B%0A%20%20%20%20%20%20endOperations%28group%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20The%20DOM%20updates%20done%20when%20an%20operation%20finishes%20are%20batched%20so%0A%20%20%2F%2F%20that%20the%20minimum%20number%20of%20relayouts%20are%20required%2E%0A%20%20function%20endOperations%28group%29%20%7B%0A%20%20%20%20var%20ops%20%3D%20group%2Eops%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ops%2Elength%3B%20i%2B%2B%29%20%2F%2F%20Read%20DOM%0A%20%20%20%20%20%20endOperation%5FR1%28ops%5Bi%5D%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ops%2Elength%3B%20i%2B%2B%29%20%2F%2F%20Write%20DOM%20%28maybe%29%0A%20%20%20%20%20%20endOperation%5FW1%28ops%5Bi%5D%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ops%2Elength%3B%20i%2B%2B%29%20%2F%2F%20Read%20DOM%0A%20%20%20%20%20%20endOperation%5FR2%28ops%5Bi%5D%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ops%2Elength%3B%20i%2B%2B%29%20%2F%2F%20Write%20DOM%20%28maybe%29%0A%20%20%20%20%20%20endOperation%5FW2%28ops%5Bi%5D%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ops%2Elength%3B%20i%2B%2B%29%20%2F%2F%20Read%20DOM%0A%20%20%20%20%20%20endOperation%5Ffinish%28ops%5Bi%5D%29%3B%0A%20%20%7D%0A%0A%20%20function%20endOperation%5FR1%28op%29%20%7B%0A%20%20%20%20var%20cm%20%3D%20op%2Ecm%2C%20display%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20maybeClipScrollbars%28cm%29%3B%0A%20%20%20%20if%20%28op%2EupdateMaxLine%29%20findMaxLine%28cm%29%3B%0A%0A%20%20%20%20op%2EmustUpdate%20%3D%20op%2EviewChanged%20%7C%7C%20op%2EforceUpdate%20%7C%7C%20op%2EscrollTop%20%21%3D%20null%20%7C%7C%0A%20%20%20%20%20%20op%2EscrollToPos%20%26%26%20%28op%2EscrollToPos%2Efrom%2Eline%20%3C%20display%2EviewFrom%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20op%2EscrollToPos%2Eto%2Eline%20%3E%3D%20display%2EviewTo%29%20%7C%7C%0A%20%20%20%20%20%20display%2EmaxLineChanged%20%26%26%20cm%2Eoptions%2ElineWrapping%3B%0A%20%20%20%20op%2Eupdate%20%3D%20op%2EmustUpdate%20%26%26%0A%20%20%20%20%20%20new%20DisplayUpdate%28cm%2C%20op%2EmustUpdate%20%26%26%20%7Btop%3A%20op%2EscrollTop%2C%20ensure%3A%20op%2EscrollToPos%7D%2C%20op%2EforceUpdate%29%3B%0A%20%20%7D%0A%0A%20%20function%20endOperation%5FW1%28op%29%20%7B%0A%20%20%20%20op%2EupdatedDisplay%20%3D%20op%2EmustUpdate%20%26%26%20updateDisplayIfNeeded%28op%2Ecm%2C%20op%2Eupdate%29%3B%0A%20%20%7D%0A%0A%20%20function%20endOperation%5FR2%28op%29%20%7B%0A%20%20%20%20var%20cm%20%3D%20op%2Ecm%2C%20display%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20if%20%28op%2EupdatedDisplay%29%20updateHeightsInViewport%28cm%29%3B%0A%0A%20%20%20%20op%2EbarMeasure%20%3D%20measureForScrollbars%28cm%29%3B%0A%0A%20%20%20%20%2F%2F%20If%20the%20max%20line%20changed%20since%20it%20was%20last%20measured%2C%20measure%20it%2C%0A%20%20%20%20%2F%2F%20and%20ensure%20the%20document%27s%20width%20matches%20it%2E%0A%20%20%20%20%2F%2F%20updateDisplay%5FW2%20will%20use%20these%20properties%20to%20do%20the%20actual%20resizing%0A%20%20%20%20if%20%28display%2EmaxLineChanged%20%26%26%20%21cm%2Eoptions%2ElineWrapping%29%20%7B%0A%20%20%20%20%20%20op%2EadjustWidthTo%20%3D%20measureChar%28cm%2C%20display%2EmaxLine%2C%20display%2EmaxLine%2Etext%2Elength%29%2Eleft%20%2B%203%3B%0A%20%20%20%20%20%20cm%2Edisplay%2EsizerWidth%20%3D%20op%2EadjustWidthTo%3B%0A%20%20%20%20%20%20op%2EbarMeasure%2EscrollWidth%20%3D%0A%20%20%20%20%20%20%20%20Math%2Emax%28display%2Escroller%2EclientWidth%2C%20display%2Esizer%2EoffsetLeft%20%2B%20op%2EadjustWidthTo%20%2B%20scrollGap%28cm%29%20%2B%20cm%2Edisplay%2EbarWidth%29%3B%0A%20%20%20%20%20%20op%2EmaxScrollLeft%20%3D%20Math%2Emax%280%2C%20display%2Esizer%2EoffsetLeft%20%2B%20op%2EadjustWidthTo%20%2D%20displayWidth%28cm%29%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28op%2EupdatedDisplay%20%7C%7C%20op%2EselectionChanged%29%0A%20%20%20%20%20%20op%2EpreparedSelection%20%3D%20display%2Einput%2EprepareSelection%28%29%3B%0A%20%20%7D%0A%0A%20%20function%20endOperation%5FW2%28op%29%20%7B%0A%20%20%20%20var%20cm%20%3D%20op%2Ecm%3B%0A%0A%20%20%20%20if%20%28op%2EadjustWidthTo%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20cm%2Edisplay%2Esizer%2Estyle%2EminWidth%20%3D%20op%2EadjustWidthTo%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20if%20%28op%2EmaxScrollLeft%20%3C%20cm%2Edoc%2EscrollLeft%29%0A%20%20%20%20%20%20%20%20setScrollLeft%28cm%2C%20Math%2Emin%28cm%2Edisplay%2Escroller%2EscrollLeft%2C%20op%2EmaxScrollLeft%29%2C%20true%29%3B%0A%20%20%20%20%20%20cm%2Edisplay%2EmaxLineChanged%20%3D%20false%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28op%2EpreparedSelection%29%0A%20%20%20%20%20%20cm%2Edisplay%2Einput%2EshowSelection%28op%2EpreparedSelection%29%3B%0A%20%20%20%20if%20%28op%2EupdatedDisplay%29%0A%20%20%20%20%20%20setDocumentHeight%28cm%2C%20op%2EbarMeasure%29%3B%0A%20%20%20%20if%20%28op%2EupdatedDisplay%20%7C%7C%20op%2EstartHeight%20%21%3D%20cm%2Edoc%2Eheight%29%0A%20%20%20%20%20%20updateScrollbars%28cm%2C%20op%2EbarMeasure%29%3B%0A%0A%20%20%20%20if%20%28op%2EselectionChanged%29%20restartBlink%28cm%29%3B%0A%0A%20%20%20%20if%20%28cm%2Estate%2Efocused%20%26%26%20op%2EupdateInput%29%0A%20%20%20%20%20%20cm%2Edisplay%2Einput%2Ereset%28op%2Etyping%29%3B%0A%20%20%20%20if%20%28op%2Efocus%20%26%26%20op%2Efocus%20%3D%3D%20activeElt%28%29%20%26%26%20%28%21document%2EhasFocus%20%7C%7C%20document%2EhasFocus%28%29%29%29%0A%20%20%20%20%20%20ensureFocus%28op%2Ecm%29%3B%0A%20%20%7D%0A%0A%20%20function%20endOperation%5Ffinish%28op%29%20%7B%0A%20%20%20%20var%20cm%20%3D%20op%2Ecm%2C%20display%20%3D%20cm%2Edisplay%2C%20doc%20%3D%20cm%2Edoc%3B%0A%0A%20%20%20%20if%20%28op%2EupdatedDisplay%29%20postUpdateDisplay%28cm%2C%20op%2Eupdate%29%3B%0A%0A%20%20%20%20%2F%2F%20Abort%20mouse%20wheel%20delta%20measurement%2C%20when%20scrolling%20explicitly%0A%20%20%20%20if%20%28display%2EwheelStartX%20%21%3D%20null%20%26%26%20%28op%2EscrollTop%20%21%3D%20null%20%7C%7C%20op%2EscrollLeft%20%21%3D%20null%20%7C%7C%20op%2EscrollToPos%29%29%0A%20%20%20%20%20%20display%2EwheelStartX%20%3D%20display%2EwheelStartY%20%3D%20null%3B%0A%0A%20%20%20%20%2F%2F%20Propagate%20the%20scroll%20position%20to%20the%20actual%20DOM%20scroller%0A%20%20%20%20if%20%28op%2EscrollTop%20%21%3D%20null%20%26%26%20%28display%2Escroller%2EscrollTop%20%21%3D%20op%2EscrollTop%20%7C%7C%20op%2EforceScroll%29%29%20%7B%0A%20%20%20%20%20%20doc%2EscrollTop%20%3D%20Math%2Emax%280%2C%20Math%2Emin%28display%2Escroller%2EscrollHeight%20%2D%20display%2Escroller%2EclientHeight%2C%20op%2EscrollTop%29%29%3B%0A%20%20%20%20%20%20display%2Escrollbars%2EsetScrollTop%28doc%2EscrollTop%29%3B%0A%20%20%20%20%20%20display%2Escroller%2EscrollTop%20%3D%20doc%2EscrollTop%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28op%2EscrollLeft%20%21%3D%20null%20%26%26%20%28display%2Escroller%2EscrollLeft%20%21%3D%20op%2EscrollLeft%20%7C%7C%20op%2EforceScroll%29%29%20%7B%0A%20%20%20%20%20%20doc%2EscrollLeft%20%3D%20Math%2Emax%280%2C%20Math%2Emin%28display%2Escroller%2EscrollWidth%20%2D%20displayWidth%28cm%29%2C%20op%2EscrollLeft%29%29%3B%0A%20%20%20%20%20%20display%2Escrollbars%2EsetScrollLeft%28doc%2EscrollLeft%29%3B%0A%20%20%20%20%20%20display%2Escroller%2EscrollLeft%20%3D%20doc%2EscrollLeft%3B%0A%20%20%20%20%20%20alignHorizontally%28cm%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F%2F%20If%20we%20need%20to%20scroll%20a%20specific%20position%20into%20view%2C%20do%20so%2E%0A%20%20%20%20if%20%28op%2EscrollToPos%29%20%7B%0A%20%20%20%20%20%20var%20coords%20%3D%20scrollPosIntoView%28cm%2C%20clipPos%28doc%2C%20op%2EscrollToPos%2Efrom%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20clipPos%28doc%2C%20op%2EscrollToPos%2Eto%29%2C%20op%2EscrollToPos%2Emargin%29%3B%0A%20%20%20%20%20%20if%20%28op%2EscrollToPos%2EisCursor%20%26%26%20cm%2Estate%2Efocused%29%20maybeScrollWindow%28cm%2C%20coords%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Fire%20events%20for%20markers%20that%20are%20hidden%2Funidden%20by%20editing%20or%0A%20%20%20%20%2F%2F%20undoing%0A%20%20%20%20var%20hidden%20%3D%20op%2EmaybeHiddenMarkers%2C%20unhidden%20%3D%20op%2EmaybeUnhiddenMarkers%3B%0A%20%20%20%20if%20%28hidden%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20hidden%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20if%20%28%21hidden%5Bi%5D%2Elines%2Elength%29%20signal%28hidden%5Bi%5D%2C%20%22hide%22%29%3B%0A%20%20%20%20if%20%28unhidden%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20unhidden%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20if%20%28unhidden%5Bi%5D%2Elines%2Elength%29%20signal%28unhidden%5Bi%5D%2C%20%22unhide%22%29%3B%0A%0A%20%20%20%20if%20%28display%2Ewrapper%2EoffsetHeight%29%0A%20%20%20%20%20%20doc%2EscrollTop%20%3D%20cm%2Edisplay%2Escroller%2EscrollTop%3B%0A%0A%20%20%20%20%2F%2F%20Fire%20change%20events%2C%20and%20delayed%20event%20handlers%0A%20%20%20%20if%20%28op%2EchangeObjs%29%0A%20%20%20%20%20%20signal%28cm%2C%20%22changes%22%2C%20cm%2C%20op%2EchangeObjs%29%3B%0A%20%20%20%20if%20%28op%2Eupdate%29%0A%20%20%20%20%20%20op%2Eupdate%2Efinish%28%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Run%20the%20given%20function%20in%20an%20operation%0A%20%20function%20runInOp%28cm%2C%20f%29%20%7B%0A%20%20%20%20if%20%28cm%2EcurOp%29%20return%20f%28%29%3B%0A%20%20%20%20startOperation%28cm%29%3B%0A%20%20%20%20try%20%7B%20return%20f%28%29%3B%20%7D%0A%20%20%20%20finally%20%7B%20endOperation%28cm%29%3B%20%7D%0A%20%20%7D%0A%20%20%2F%2F%20Wraps%20a%20function%20in%20an%20operation%2E%20Returns%20the%20wrapped%20function%2E%0A%20%20function%20operation%28cm%2C%20f%29%20%7B%0A%20%20%20%20return%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28cm%2EcurOp%29%20return%20f%2Eapply%28cm%2C%20arguments%29%3B%0A%20%20%20%20%20%20startOperation%28cm%29%3B%0A%20%20%20%20%20%20try%20%7B%20return%20f%2Eapply%28cm%2C%20arguments%29%3B%20%7D%0A%20%20%20%20%20%20finally%20%7B%20endOperation%28cm%29%3B%20%7D%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%20%20%2F%2F%20Used%20to%20add%20methods%20to%20editor%20and%20doc%20instances%2C%20wrapping%20them%20in%0A%20%20%2F%2F%20operations%2E%0A%20%20function%20methodOp%28f%29%20%7B%0A%20%20%20%20return%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28this%2EcurOp%29%20return%20f%2Eapply%28this%2C%20arguments%29%3B%0A%20%20%20%20%20%20startOperation%28this%29%3B%0A%20%20%20%20%20%20try%20%7B%20return%20f%2Eapply%28this%2C%20arguments%29%3B%20%7D%0A%20%20%20%20%20%20finally%20%7B%20endOperation%28this%29%3B%20%7D%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%20%20function%20docMethodOp%28f%29%20%7B%0A%20%20%20%20return%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20cm%20%3D%20this%2Ecm%3B%0A%20%20%20%20%20%20if%20%28%21cm%20%7C%7C%20cm%2EcurOp%29%20return%20f%2Eapply%28this%2C%20arguments%29%3B%0A%20%20%20%20%20%20startOperation%28cm%29%3B%0A%20%20%20%20%20%20try%20%7B%20return%20f%2Eapply%28this%2C%20arguments%29%3B%20%7D%0A%20%20%20%20%20%20finally%20%7B%20endOperation%28cm%29%3B%20%7D%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20VIEW%20TRACKING%0A%0A%20%20%2F%2F%20These%20objects%20are%20used%20to%20represent%20the%20visible%20%28currently%20drawn%29%0A%20%20%2F%2F%20part%20of%20the%20document%2E%20A%20LineView%20may%20correspond%20to%20multiple%0A%20%20%2F%2F%20logical%20lines%2C%20if%20those%20are%20connected%20by%20collapsed%20ranges%2E%0A%20%20function%20LineView%28doc%2C%20line%2C%20lineN%29%20%7B%0A%20%20%20%20%2F%2F%20The%20starting%20line%0A%20%20%20%20this%2Eline%20%3D%20line%3B%0A%20%20%20%20%2F%2F%20Continuing%20lines%2C%20if%20any%0A%20%20%20%20this%2Erest%20%3D%20visualLineContinued%28line%29%3B%0A%20%20%20%20%2F%2F%20Number%20of%20logical%20lines%20in%20this%20visual%20line%0A%20%20%20%20this%2Esize%20%3D%20this%2Erest%20%3F%20lineNo%28lst%28this%2Erest%29%29%20%2D%20lineN%20%2B%201%20%3A%201%3B%0A%20%20%20%20this%2Enode%20%3D%20this%2Etext%20%3D%20null%3B%0A%20%20%20%20this%2Ehidden%20%3D%20lineIsHidden%28doc%2C%20line%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Create%20a%20range%20of%20LineView%20objects%20for%20the%20given%20lines%2E%0A%20%20function%20buildViewArray%28cm%2C%20from%2C%20to%29%20%7B%0A%20%20%20%20var%20array%20%3D%20%5B%5D%2C%20nextPos%3B%0A%20%20%20%20for%20%28var%20pos%20%3D%20from%3B%20pos%20%3C%20to%3B%20pos%20%3D%20nextPos%29%20%7B%0A%20%20%20%20%20%20var%20view%20%3D%20new%20LineView%28cm%2Edoc%2C%20getLine%28cm%2Edoc%2C%20pos%29%2C%20pos%29%3B%0A%20%20%20%20%20%20nextPos%20%3D%20pos%20%2B%20view%2Esize%3B%0A%20%20%20%20%20%20array%2Epush%28view%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20array%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Updates%20the%20display%2Eview%20data%20structure%20for%20a%20given%20change%20to%20the%0A%20%20%2F%2F%20document%2E%20From%20and%20to%20are%20in%20pre%2Dchange%20coordinates%2E%20Lendiff%20is%0A%20%20%2F%2F%20the%20amount%20of%20lines%20added%20or%20subtracted%20by%20the%20change%2E%20This%20is%0A%20%20%2F%2F%20used%20for%20changes%20that%20span%20multiple%20lines%2C%20or%20change%20the%20way%0A%20%20%2F%2F%20lines%20are%20divided%20into%20visual%20lines%2E%20regLineChange%20%28below%29%0A%20%20%2F%2F%20registers%20single%2Dline%20changes%2E%0A%20%20function%20regChange%28cm%2C%20from%2C%20to%2C%20lendiff%29%20%7B%0A%20%20%20%20if%20%28from%20%3D%3D%20null%29%20from%20%3D%20cm%2Edoc%2Efirst%3B%0A%20%20%20%20if%20%28to%20%3D%3D%20null%29%20to%20%3D%20cm%2Edoc%2Efirst%20%2B%20cm%2Edoc%2Esize%3B%0A%20%20%20%20if%20%28%21lendiff%29%20lendiff%20%3D%200%3B%0A%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20if%20%28lendiff%20%26%26%20to%20%3C%20display%2EviewTo%20%26%26%0A%20%20%20%20%20%20%20%20%28display%2EupdateLineNumbers%20%3D%3D%20null%20%7C%7C%20display%2EupdateLineNumbers%20%3E%20from%29%29%0A%20%20%20%20%20%20display%2EupdateLineNumbers%20%3D%20from%3B%0A%0A%20%20%20%20cm%2EcurOp%2EviewChanged%20%3D%20true%3B%0A%0A%20%20%20%20if%20%28from%20%3E%3D%20display%2EviewTo%29%20%7B%20%2F%2F%20Change%20after%0A%20%20%20%20%20%20if%20%28sawCollapsedSpans%20%26%26%20visualLineNo%28cm%2Edoc%2C%20from%29%20%3C%20display%2EviewTo%29%0A%20%20%20%20%20%20%20%20resetView%28cm%29%3B%0A%20%20%20%20%7D%20else%20if%20%28to%20%3C%3D%20display%2EviewFrom%29%20%7B%20%2F%2F%20Change%20before%0A%20%20%20%20%20%20if%20%28sawCollapsedSpans%20%26%26%20visualLineEndNo%28cm%2Edoc%2C%20to%20%2B%20lendiff%29%20%3E%20display%2EviewFrom%29%20%7B%0A%20%20%20%20%20%20%20%20resetView%28cm%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20display%2EviewFrom%20%2B%3D%20lendiff%3B%0A%20%20%20%20%20%20%20%20display%2EviewTo%20%2B%3D%20lendiff%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20if%20%28from%20%3C%3D%20display%2EviewFrom%20%26%26%20to%20%3E%3D%20display%2EviewTo%29%20%7B%20%2F%2F%20Full%20overlap%0A%20%20%20%20%20%20resetView%28cm%29%3B%0A%20%20%20%20%7D%20else%20if%20%28from%20%3C%3D%20display%2EviewFrom%29%20%7B%20%2F%2F%20Top%20overlap%0A%20%20%20%20%20%20var%20cut%20%3D%20viewCuttingPoint%28cm%2C%20to%2C%20to%20%2B%20lendiff%2C%201%29%3B%0A%20%20%20%20%20%20if%20%28cut%29%20%7B%0A%20%20%20%20%20%20%20%20display%2Eview%20%3D%20display%2Eview%2Eslice%28cut%2Eindex%29%3B%0A%20%20%20%20%20%20%20%20display%2EviewFrom%20%3D%20cut%2ElineN%3B%0A%20%20%20%20%20%20%20%20display%2EviewTo%20%2B%3D%20lendiff%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20resetView%28cm%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20if%20%28to%20%3E%3D%20display%2EviewTo%29%20%7B%20%2F%2F%20Bottom%20overlap%0A%20%20%20%20%20%20var%20cut%20%3D%20viewCuttingPoint%28cm%2C%20from%2C%20from%2C%20%2D1%29%3B%0A%20%20%20%20%20%20if%20%28cut%29%20%7B%0A%20%20%20%20%20%20%20%20display%2Eview%20%3D%20display%2Eview%2Eslice%280%2C%20cut%2Eindex%29%3B%0A%20%20%20%20%20%20%20%20display%2EviewTo%20%3D%20cut%2ElineN%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20resetView%28cm%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20%7B%20%2F%2F%20Gap%20in%20the%20middle%0A%20%20%20%20%20%20var%20cutTop%20%3D%20viewCuttingPoint%28cm%2C%20from%2C%20from%2C%20%2D1%29%3B%0A%20%20%20%20%20%20var%20cutBot%20%3D%20viewCuttingPoint%28cm%2C%20to%2C%20to%20%2B%20lendiff%2C%201%29%3B%0A%20%20%20%20%20%20if%20%28cutTop%20%26%26%20cutBot%29%20%7B%0A%20%20%20%20%20%20%20%20display%2Eview%20%3D%20display%2Eview%2Eslice%280%2C%20cutTop%2Eindex%29%0A%20%20%20%20%20%20%20%20%20%20%2Econcat%28buildViewArray%28cm%2C%20cutTop%2ElineN%2C%20cutBot%2ElineN%29%29%0A%20%20%20%20%20%20%20%20%20%20%2Econcat%28display%2Eview%2Eslice%28cutBot%2Eindex%29%29%3B%0A%20%20%20%20%20%20%20%20display%2EviewTo%20%2B%3D%20lendiff%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20resetView%28cm%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20ext%20%3D%20display%2EexternalMeasured%3B%0A%20%20%20%20if%20%28ext%29%20%7B%0A%20%20%20%20%20%20if%20%28to%20%3C%20ext%2ElineN%29%0A%20%20%20%20%20%20%20%20ext%2ElineN%20%2B%3D%20lendiff%3B%0A%20%20%20%20%20%20else%20if%20%28from%20%3C%20ext%2ElineN%20%2B%20ext%2Esize%29%0A%20%20%20%20%20%20%20%20display%2EexternalMeasured%20%3D%20null%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Register%20a%20change%20to%20a%20single%20line%2E%20Type%20must%20be%20one%20of%20%22text%22%2C%0A%20%20%2F%2F%20%22gutter%22%2C%20%22class%22%2C%20%22widget%22%0A%20%20function%20regLineChange%28cm%2C%20line%2C%20type%29%20%7B%0A%20%20%20%20cm%2EcurOp%2EviewChanged%20%3D%20true%3B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%2C%20ext%20%3D%20cm%2Edisplay%2EexternalMeasured%3B%0A%20%20%20%20if%20%28ext%20%26%26%20line%20%3E%3D%20ext%2ElineN%20%26%26%20line%20%3C%20ext%2ElineN%20%2B%20ext%2Esize%29%0A%20%20%20%20%20%20display%2EexternalMeasured%20%3D%20null%3B%0A%0A%20%20%20%20if%20%28line%20%3C%20display%2EviewFrom%20%7C%7C%20line%20%3E%3D%20display%2EviewTo%29%20return%3B%0A%20%20%20%20var%20lineView%20%3D%20display%2Eview%5BfindViewIndex%28cm%2C%20line%29%5D%3B%0A%20%20%20%20if%20%28lineView%2Enode%20%3D%3D%20null%29%20return%3B%0A%20%20%20%20var%20arr%20%3D%20lineView%2Echanges%20%7C%7C%20%28lineView%2Echanges%20%3D%20%5B%5D%29%3B%0A%20%20%20%20if%20%28indexOf%28arr%2C%20type%29%20%3D%3D%20%2D1%29%20arr%2Epush%28type%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Clear%20the%20view%2E%0A%20%20function%20resetView%28cm%29%20%7B%0A%20%20%20%20cm%2Edisplay%2EviewFrom%20%3D%20cm%2Edisplay%2EviewTo%20%3D%20cm%2Edoc%2Efirst%3B%0A%20%20%20%20cm%2Edisplay%2Eview%20%3D%20%5B%5D%3B%0A%20%20%20%20cm%2Edisplay%2EviewOffset%20%3D%200%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Find%20the%20view%20element%20corresponding%20to%20a%20given%20line%2E%20Return%20null%0A%20%20%2F%2F%20when%20the%20line%20isn%27t%20visible%2E%0A%20%20function%20findViewIndex%28cm%2C%20n%29%20%7B%0A%20%20%20%20if%20%28n%20%3E%3D%20cm%2Edisplay%2EviewTo%29%20return%20null%3B%0A%20%20%20%20n%20%2D%3D%20cm%2Edisplay%2EviewFrom%3B%0A%20%20%20%20if%20%28n%20%3C%200%29%20return%20null%3B%0A%20%20%20%20var%20view%20%3D%20cm%2Edisplay%2Eview%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20view%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20n%20%2D%3D%20view%5Bi%5D%2Esize%3B%0A%20%20%20%20%20%20if%20%28n%20%3C%200%29%20return%20i%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20viewCuttingPoint%28cm%2C%20oldN%2C%20newN%2C%20dir%29%20%7B%0A%20%20%20%20var%20index%20%3D%20findViewIndex%28cm%2C%20oldN%29%2C%20diff%2C%20view%20%3D%20cm%2Edisplay%2Eview%3B%0A%20%20%20%20if%20%28%21sawCollapsedSpans%20%7C%7C%20newN%20%3D%3D%20cm%2Edoc%2Efirst%20%2B%20cm%2Edoc%2Esize%29%0A%20%20%20%20%20%20return%20%7Bindex%3A%20index%2C%20lineN%3A%20newN%7D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%2C%20n%20%3D%20cm%2Edisplay%2EviewFrom%3B%20i%20%3C%20index%3B%20i%2B%2B%29%0A%20%20%20%20%20%20n%20%2B%3D%20view%5Bi%5D%2Esize%3B%0A%20%20%20%20if%20%28n%20%21%3D%20oldN%29%20%7B%0A%20%20%20%20%20%20if%20%28dir%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28index%20%3D%3D%20view%2Elength%20%2D%201%29%20return%20null%3B%0A%20%20%20%20%20%20%20%20diff%20%3D%20%28n%20%2B%20view%5Bindex%5D%2Esize%29%20%2D%20oldN%3B%0A%20%20%20%20%20%20%20%20index%2B%2B%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20diff%20%3D%20n%20%2D%20oldN%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20oldN%20%2B%3D%20diff%3B%20newN%20%2B%3D%20diff%3B%0A%20%20%20%20%7D%0A%20%20%20%20while%20%28visualLineNo%28cm%2Edoc%2C%20newN%29%20%21%3D%20newN%29%20%7B%0A%20%20%20%20%20%20if%20%28index%20%3D%3D%20%28dir%20%3C%200%20%3F%200%20%3A%20view%2Elength%20%2D%201%29%29%20return%20null%3B%0A%20%20%20%20%20%20newN%20%2B%3D%20dir%20%2A%20view%5Bindex%20%2D%20%28dir%20%3C%200%20%3F%201%20%3A%200%29%5D%2Esize%3B%0A%20%20%20%20%20%20index%20%2B%3D%20dir%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20%7Bindex%3A%20index%2C%20lineN%3A%20newN%7D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Force%20the%20view%20to%20cover%20a%20given%20range%2C%20adding%20empty%20view%20element%0A%20%20%2F%2F%20or%20clipping%20off%20existing%20ones%20as%20needed%2E%0A%20%20function%20adjustView%28cm%2C%20from%2C%20to%29%20%7B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%2C%20view%20%3D%20display%2Eview%3B%0A%20%20%20%20if%20%28view%2Elength%20%3D%3D%200%20%7C%7C%20from%20%3E%3D%20display%2EviewTo%20%7C%7C%20to%20%3C%3D%20display%2EviewFrom%29%20%7B%0A%20%20%20%20%20%20display%2Eview%20%3D%20buildViewArray%28cm%2C%20from%2C%20to%29%3B%0A%20%20%20%20%20%20display%2EviewFrom%20%3D%20from%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20if%20%28display%2EviewFrom%20%3E%20from%29%0A%20%20%20%20%20%20%20%20display%2Eview%20%3D%20buildViewArray%28cm%2C%20from%2C%20display%2EviewFrom%29%2Econcat%28display%2Eview%29%3B%0A%20%20%20%20%20%20else%20if%20%28display%2EviewFrom%20%3C%20from%29%0A%20%20%20%20%20%20%20%20display%2Eview%20%3D%20display%2Eview%2Eslice%28findViewIndex%28cm%2C%20from%29%29%3B%0A%20%20%20%20%20%20display%2EviewFrom%20%3D%20from%3B%0A%20%20%20%20%20%20if%20%28display%2EviewTo%20%3C%20to%29%0A%20%20%20%20%20%20%20%20display%2Eview%20%3D%20display%2Eview%2Econcat%28buildViewArray%28cm%2C%20display%2EviewTo%2C%20to%29%29%3B%0A%20%20%20%20%20%20else%20if%20%28display%2EviewTo%20%3E%20to%29%0A%20%20%20%20%20%20%20%20display%2Eview%20%3D%20display%2Eview%2Eslice%280%2C%20findViewIndex%28cm%2C%20to%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20display%2EviewTo%20%3D%20to%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Count%20the%20number%20of%20lines%20in%20the%20view%20whose%20DOM%20representation%20is%0A%20%20%2F%2F%20out%20of%20date%20%28or%20nonexistent%29%2E%0A%20%20function%20countDirtyView%28cm%29%20%7B%0A%20%20%20%20var%20view%20%3D%20cm%2Edisplay%2Eview%2C%20dirty%20%3D%200%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20view%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20lineView%20%3D%20view%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28%21lineView%2Ehidden%20%26%26%20%28%21lineView%2Enode%20%7C%7C%20lineView%2Echanges%29%29%20%2B%2Bdirty%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20dirty%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20EVENT%20HANDLERS%0A%0A%20%20%2F%2F%20Attach%20the%20necessary%20event%20handlers%20when%20initializing%20the%20editor%0A%20%20function%20registerEventHandlers%28cm%29%20%7B%0A%20%20%20%20var%20d%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20on%28d%2Escroller%2C%20%22mousedown%22%2C%20operation%28cm%2C%20onMouseDown%29%29%3B%0A%20%20%20%20%2F%2F%20Older%20IE%27s%20will%20not%20fire%20a%20second%20mousedown%20for%20a%20double%20click%0A%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%2011%29%0A%20%20%20%20%20%20on%28d%2Escroller%2C%20%22dblclick%22%2C%20operation%28cm%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28signalDOMEvent%28cm%2C%20e%29%29%20return%3B%0A%20%20%20%20%20%20%20%20var%20pos%20%3D%20posFromMouse%28cm%2C%20e%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21pos%20%7C%7C%20clickInGutter%28cm%2C%20e%29%20%7C%7C%20eventInWidget%28cm%2Edisplay%2C%20e%29%29%20return%3B%0A%20%20%20%20%20%20%20%20e%5FpreventDefault%28e%29%3B%0A%20%20%20%20%20%20%20%20var%20word%20%3D%20cm%2EfindWordAt%28pos%29%3B%0A%20%20%20%20%20%20%20%20extendSelection%28cm%2Edoc%2C%20word%2Eanchor%2C%20word%2Ehead%29%3B%0A%20%20%20%20%20%20%7D%29%29%3B%0A%20%20%20%20else%0A%20%20%20%20%20%20on%28d%2Escroller%2C%20%22dblclick%22%2C%20function%28e%29%20%7B%20signalDOMEvent%28cm%2C%20e%29%20%7C%7C%20e%5FpreventDefault%28e%29%3B%20%7D%29%3B%0A%20%20%20%20%2F%2F%20Some%20browsers%20fire%20contextmenu%20%2Aafter%2A%20opening%20the%20menu%2C%20at%0A%20%20%20%20%2F%2F%20which%20point%20we%20can%27t%20mess%20with%20it%20anymore%2E%20Context%20menu%20is%0A%20%20%20%20%2F%2F%20handled%20in%20onMouseDown%20for%20these%20browsers%2E%0A%20%20%20%20if%20%28%21captureRightClick%29%20on%28d%2Escroller%2C%20%22contextmenu%22%2C%20function%28e%29%20%7BonContextMenu%28cm%2C%20e%29%3B%7D%29%3B%0A%0A%20%20%20%20%2F%2F%20Used%20to%20suppress%20mouse%20event%20handling%20when%20a%20touch%20happens%0A%20%20%20%20var%20touchFinished%2C%20prevTouch%20%3D%20%7Bend%3A%200%7D%3B%0A%20%20%20%20function%20finishTouch%28%29%20%7B%0A%20%20%20%20%20%20if%20%28d%2EactiveTouch%29%20%7B%0A%20%20%20%20%20%20%20%20touchFinished%20%3D%20setTimeout%28function%28%29%20%7Bd%2EactiveTouch%20%3D%20null%3B%7D%2C%201000%29%3B%0A%20%20%20%20%20%20%20%20prevTouch%20%3D%20d%2EactiveTouch%3B%0A%20%20%20%20%20%20%20%20prevTouch%2Eend%20%3D%20%2Bnew%20Date%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%20%20%20%20function%20isMouseLikeTouchEvent%28e%29%20%7B%0A%20%20%20%20%20%20if%20%28e%2Etouches%2Elength%20%21%3D%201%29%20return%20false%3B%0A%20%20%20%20%20%20var%20touch%20%3D%20e%2Etouches%5B0%5D%3B%0A%20%20%20%20%20%20return%20touch%2EradiusX%20%3C%3D%201%20%26%26%20touch%2EradiusY%20%3C%3D%201%3B%0A%20%20%20%20%7D%0A%20%20%20%20function%20farAway%28touch%2C%20other%29%20%7B%0A%20%20%20%20%20%20if%20%28other%2Eleft%20%3D%3D%20null%29%20return%20true%3B%0A%20%20%20%20%20%20var%20dx%20%3D%20other%2Eleft%20%2D%20touch%2Eleft%2C%20dy%20%3D%20other%2Etop%20%2D%20touch%2Etop%3B%0A%20%20%20%20%20%20return%20dx%20%2A%20dx%20%2B%20dy%20%2A%20dy%20%3E%2020%20%2A%2020%3B%0A%20%20%20%20%7D%0A%20%20%20%20on%28d%2Escroller%2C%20%22touchstart%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20if%20%28%21signalDOMEvent%28cm%2C%20e%29%20%26%26%20%21isMouseLikeTouchEvent%28e%29%29%20%7B%0A%20%20%20%20%20%20%20%20clearTimeout%28touchFinished%29%3B%0A%20%20%20%20%20%20%20%20var%20now%20%3D%20%2Bnew%20Date%3B%0A%20%20%20%20%20%20%20%20d%2EactiveTouch%20%3D%20%7Bstart%3A%20now%2C%20moved%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prev%3A%20now%20%2D%20prevTouch%2Eend%20%3C%3D%20300%20%3F%20prevTouch%20%3A%20null%7D%3B%0A%20%20%20%20%20%20%20%20if%20%28e%2Etouches%2Elength%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20d%2EactiveTouch%2Eleft%20%3D%20e%2Etouches%5B0%5D%2EpageX%3B%0A%20%20%20%20%20%20%20%20%20%20d%2EactiveTouch%2Etop%20%3D%20e%2Etouches%5B0%5D%2EpageY%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20on%28d%2Escroller%2C%20%22touchmove%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28d%2EactiveTouch%29%20d%2EactiveTouch%2Emoved%20%3D%20true%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20on%28d%2Escroller%2C%20%22touchend%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20var%20touch%20%3D%20d%2EactiveTouch%3B%0A%20%20%20%20%20%20if%20%28touch%20%26%26%20%21eventInWidget%28d%2C%20e%29%20%26%26%20touch%2Eleft%20%21%3D%20null%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%21touch%2Emoved%20%26%26%20new%20Date%20%2D%20touch%2Estart%20%3C%20300%29%20%7B%0A%20%20%20%20%20%20%20%20var%20pos%20%3D%20cm%2EcoordsChar%28d%2EactiveTouch%2C%20%22page%22%29%2C%20range%3B%0A%20%20%20%20%20%20%20%20if%20%28%21touch%2Eprev%20%7C%7C%20farAway%28touch%2C%20touch%2Eprev%29%29%20%2F%2F%20Single%20tap%0A%20%20%20%20%20%20%20%20%20%20range%20%3D%20new%20Range%28pos%2C%20pos%29%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28%21touch%2Eprev%2Eprev%20%7C%7C%20farAway%28touch%2C%20touch%2Eprev%2Eprev%29%29%20%2F%2F%20Double%20tap%0A%20%20%20%20%20%20%20%20%20%20range%20%3D%20cm%2EfindWordAt%28pos%29%3B%0A%20%20%20%20%20%20%20%20else%20%2F%2F%20Triple%20tap%0A%20%20%20%20%20%20%20%20%20%20range%20%3D%20new%20Range%28Pos%28pos%2Eline%2C%200%29%2C%20clipPos%28cm%2Edoc%2C%20Pos%28pos%2Eline%20%2B%201%2C%200%29%29%29%3B%0A%20%20%20%20%20%20%20%20cm%2EsetSelection%28range%2Eanchor%2C%20range%2Ehead%29%3B%0A%20%20%20%20%20%20%20%20cm%2Efocus%28%29%3B%0A%20%20%20%20%20%20%20%20e%5FpreventDefault%28e%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20finishTouch%28%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20on%28d%2Escroller%2C%20%22touchcancel%22%2C%20finishTouch%29%3B%0A%0A%20%20%20%20%2F%2F%20Sync%20scrolling%20between%20fake%20scrollbars%20and%20real%20scrollable%0A%20%20%20%20%2F%2F%20area%2C%20ensure%20viewport%20is%20updated%20when%20scrolling%2E%0A%20%20%20%20on%28d%2Escroller%2C%20%22scroll%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28d%2Escroller%2EclientHeight%29%20%7B%0A%20%20%20%20%20%20%20%20setScrollTop%28cm%2C%20d%2Escroller%2EscrollTop%29%3B%0A%20%20%20%20%20%20%20%20setScrollLeft%28cm%2C%20d%2Escroller%2EscrollLeft%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20signal%28cm%2C%20%22scroll%22%2C%20cm%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%2F%2F%20Listen%20to%20wheel%20events%20in%20order%20to%20try%20and%20update%20the%20viewport%20on%20time%2E%0A%20%20%20%20on%28d%2Escroller%2C%20%22mousewheel%22%2C%20function%28e%29%7BonScrollWheel%28cm%2C%20e%29%3B%7D%29%3B%0A%20%20%20%20on%28d%2Escroller%2C%20%22DOMMouseScroll%22%2C%20function%28e%29%7BonScrollWheel%28cm%2C%20e%29%3B%7D%29%3B%0A%0A%20%20%20%20%2F%2F%20Prevent%20wrapper%20from%20ever%20scrolling%0A%20%20%20%20on%28d%2Ewrapper%2C%20%22scroll%22%2C%20function%28%29%20%7B%20d%2Ewrapper%2EscrollTop%20%3D%20d%2Ewrapper%2EscrollLeft%20%3D%200%3B%20%7D%29%3B%0A%0A%20%20%20%20d%2EdragFunctions%20%3D%20%7B%0A%20%20%20%20%20%20enter%3A%20function%28e%29%20%7Bif%20%28%21signalDOMEvent%28cm%2C%20e%29%29%20e%5Fstop%28e%29%3B%7D%2C%0A%20%20%20%20%20%20over%3A%20function%28e%29%20%7Bif%20%28%21signalDOMEvent%28cm%2C%20e%29%29%20%7B%20onDragOver%28cm%2C%20e%29%3B%20e%5Fstop%28e%29%3B%20%7D%7D%2C%0A%20%20%20%20%20%20start%3A%20function%28e%29%7BonDragStart%28cm%2C%20e%29%3B%7D%2C%0A%20%20%20%20%20%20drop%3A%20operation%28cm%2C%20onDrop%29%2C%0A%20%20%20%20%20%20leave%3A%20function%28%29%20%7BclearDragCursor%28cm%29%3B%7D%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20var%20inp%20%3D%20d%2Einput%2EgetField%28%29%3B%0A%20%20%20%20on%28inp%2C%20%22keyup%22%2C%20function%28e%29%20%7B%20onKeyUp%2Ecall%28cm%2C%20e%29%3B%20%7D%29%3B%0A%20%20%20%20on%28inp%2C%20%22keydown%22%2C%20operation%28cm%2C%20onKeyDown%29%29%3B%0A%20%20%20%20on%28inp%2C%20%22keypress%22%2C%20operation%28cm%2C%20onKeyPress%29%29%3B%0A%20%20%20%20on%28inp%2C%20%22focus%22%2C%20bind%28onFocus%2C%20cm%29%29%3B%0A%20%20%20%20on%28inp%2C%20%22blur%22%2C%20bind%28onBlur%2C%20cm%29%29%3B%0A%20%20%7D%0A%0A%20%20function%20dragDropChanged%28cm%2C%20value%2C%20old%29%20%7B%0A%20%20%20%20var%20wasOn%20%3D%20old%20%26%26%20old%20%21%3D%20CodeMirror%2EInit%3B%0A%20%20%20%20if%20%28%21value%20%21%3D%20%21wasOn%29%20%7B%0A%20%20%20%20%20%20var%20funcs%20%3D%20cm%2Edisplay%2EdragFunctions%3B%0A%20%20%20%20%20%20var%20toggle%20%3D%20value%20%3F%20on%20%3A%20off%3B%0A%20%20%20%20%20%20toggle%28cm%2Edisplay%2Escroller%2C%20%22dragstart%22%2C%20funcs%2Estart%29%3B%0A%20%20%20%20%20%20toggle%28cm%2Edisplay%2Escroller%2C%20%22dragenter%22%2C%20funcs%2Eenter%29%3B%0A%20%20%20%20%20%20toggle%28cm%2Edisplay%2Escroller%2C%20%22dragover%22%2C%20funcs%2Eover%29%3B%0A%20%20%20%20%20%20toggle%28cm%2Edisplay%2Escroller%2C%20%22dragleave%22%2C%20funcs%2Eleave%29%3B%0A%20%20%20%20%20%20toggle%28cm%2Edisplay%2Escroller%2C%20%22drop%22%2C%20funcs%2Edrop%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Called%20when%20the%20window%20resizes%0A%20%20function%20onResize%28cm%29%20%7B%0A%20%20%20%20var%20d%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20if%20%28d%2ElastWrapHeight%20%3D%3D%20d%2Ewrapper%2EclientHeight%20%26%26%20d%2ElastWrapWidth%20%3D%3D%20d%2Ewrapper%2EclientWidth%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20%2F%2F%20Might%20be%20a%20text%20scaling%20operation%2C%20clear%20size%20caches%2E%0A%20%20%20%20d%2EcachedCharWidth%20%3D%20d%2EcachedTextHeight%20%3D%20d%2EcachedPaddingH%20%3D%20null%3B%0A%20%20%20%20d%2EscrollbarsClipped%20%3D%20false%3B%0A%20%20%20%20cm%2EsetSize%28%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20MOUSE%20EVENTS%0A%0A%20%20%2F%2F%20Return%20true%20when%20the%20given%20mouse%20event%20happened%20in%20a%20widget%0A%20%20function%20eventInWidget%28display%2C%20e%29%20%7B%0A%20%20%20%20for%20%28var%20n%20%3D%20e%5Ftarget%28e%29%3B%20n%20%21%3D%20display%2Ewrapper%3B%20n%20%3D%20n%2EparentNode%29%20%7B%0A%20%20%20%20%20%20if%20%28%21n%20%7C%7C%20%28n%2EnodeType%20%3D%3D%201%20%26%26%20n%2EgetAttribute%28%22cm%2Dignore%2Devents%22%29%20%3D%3D%20%22true%22%29%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%28n%2EparentNode%20%3D%3D%20display%2Esizer%20%26%26%20n%20%21%3D%20display%2Emover%29%29%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Given%20a%20mouse%20event%2C%20find%20the%20corresponding%20position%2E%20If%20liberal%0A%20%20%2F%2F%20is%20false%2C%20it%20checks%20whether%20a%20gutter%20or%20scrollbar%20was%20clicked%2C%0A%20%20%2F%2F%20and%20returns%20null%20if%20it%20was%2E%20forRect%20is%20used%20by%20rectangular%0A%20%20%2F%2F%20selections%2C%20and%20tries%20to%20estimate%20a%20character%20position%20even%20for%0A%20%20%2F%2F%20coordinates%20beyond%20the%20right%20of%20the%20text%2E%0A%20%20function%20posFromMouse%28cm%2C%20e%2C%20liberal%2C%20forRect%29%20%7B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20if%20%28%21liberal%20%26%26%20e%5Ftarget%28e%29%2EgetAttribute%28%22cm%2Dnot%2Dcontent%22%29%20%3D%3D%20%22true%22%29%20return%20null%3B%0A%0A%20%20%20%20var%20x%2C%20y%2C%20space%20%3D%20display%2ElineSpace%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20%2F%2F%20Fails%20unpredictably%20on%20IE%5B67%5D%20when%20mouse%20is%20dragged%20around%20quickly%2E%0A%20%20%20%20try%20%7B%20x%20%3D%20e%2EclientX%20%2D%20space%2Eleft%3B%20y%20%3D%20e%2EclientY%20%2D%20space%2Etop%3B%20%7D%0A%20%20%20%20catch%20%28e%29%20%7B%20return%20null%3B%20%7D%0A%20%20%20%20var%20coords%20%3D%20coordsChar%28cm%2C%20x%2C%20y%29%2C%20line%3B%0A%20%20%20%20if%20%28forRect%20%26%26%20coords%2ExRel%20%3D%3D%201%20%26%26%20%28line%20%3D%20getLine%28cm%2Edoc%2C%20coords%2Eline%29%2Etext%29%2Elength%20%3D%3D%20coords%2Ech%29%20%7B%0A%20%20%20%20%20%20var%20colDiff%20%3D%20countColumn%28line%2C%20line%2Elength%2C%20cm%2Eoptions%2EtabSize%29%20%2D%20line%2Elength%3B%0A%20%20%20%20%20%20coords%20%3D%20Pos%28coords%2Eline%2C%20Math%2Emax%280%2C%20Math%2Eround%28%28x%20%2D%20paddingH%28cm%2Edisplay%29%2Eleft%29%20%2F%20charWidth%28cm%2Edisplay%29%29%20%2D%20colDiff%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20coords%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20A%20mouse%20down%20can%20be%20a%20single%20click%2C%20double%20click%2C%20triple%20click%2C%0A%20%20%2F%2F%20start%20of%20selection%20drag%2C%20start%20of%20text%20drag%2C%20new%20cursor%0A%20%20%2F%2F%20%28ctrl%2Dclick%29%2C%20rectangle%20drag%20%28alt%2Ddrag%29%2C%20or%20xwin%0A%20%20%2F%2F%20middle%2Dclick%2Dpaste%2E%20Or%20it%20might%20be%20a%20click%20on%20something%20we%20should%0A%20%20%2F%2F%20not%20interfere%20with%2C%20such%20as%20a%20scrollbar%20or%20widget%2E%0A%20%20function%20onMouseDown%28e%29%20%7B%0A%20%20%20%20var%20cm%20%3D%20this%2C%20display%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20if%20%28signalDOMEvent%28cm%2C%20e%29%20%7C%7C%20display%2EactiveTouch%20%26%26%20display%2Einput%2EsupportsTouch%28%29%29%20return%3B%0A%20%20%20%20display%2Eshift%20%3D%20e%2EshiftKey%3B%0A%0A%20%20%20%20if%20%28eventInWidget%28display%2C%20e%29%29%20%7B%0A%20%20%20%20%20%20if%20%28%21webkit%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Briefly%20turn%20off%20draggability%2C%20to%20allow%20widgets%20to%20do%0A%20%20%20%20%20%20%20%20%2F%2F%20normal%20dragging%20things%2E%0A%20%20%20%20%20%20%20%20display%2Escroller%2Edraggable%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20setTimeout%28function%28%29%7Bdisplay%2Escroller%2Edraggable%20%3D%20true%3B%7D%2C%20100%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28clickInGutter%28cm%2C%20e%29%29%20return%3B%0A%20%20%20%20var%20start%20%3D%20posFromMouse%28cm%2C%20e%29%3B%0A%20%20%20%20window%2Efocus%28%29%3B%0A%0A%20%20%20%20switch%20%28e%5Fbutton%28e%29%29%20%7B%0A%20%20%20%20case%201%3A%0A%20%20%20%20%20%20%2F%2F%20%233261%3A%20make%20sure%2C%20that%20we%27re%20not%20starting%20a%20second%20selection%0A%20%20%20%20%20%20if%20%28cm%2Estate%2EselectingText%29%0A%20%20%20%20%20%20%20%20cm%2Estate%2EselectingText%28e%29%3B%0A%20%20%20%20%20%20else%20if%20%28start%29%0A%20%20%20%20%20%20%20%20leftButtonDown%28cm%2C%20e%2C%20start%29%3B%0A%20%20%20%20%20%20else%20if%20%28e%5Ftarget%28e%29%20%3D%3D%20display%2Escroller%29%0A%20%20%20%20%20%20%20%20e%5FpreventDefault%28e%29%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%202%3A%0A%20%20%20%20%20%20if%20%28webkit%29%20cm%2Estate%2ElastMiddleDown%20%3D%20%2Bnew%20Date%3B%0A%20%20%20%20%20%20if%20%28start%29%20extendSelection%28cm%2Edoc%2C%20start%29%3B%0A%20%20%20%20%20%20setTimeout%28function%28%29%20%7Bdisplay%2Einput%2Efocus%28%29%3B%7D%2C%2020%29%3B%0A%20%20%20%20%20%20e%5FpreventDefault%28e%29%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%203%3A%0A%20%20%20%20%20%20if%20%28captureRightClick%29%20onContextMenu%28cm%2C%20e%29%3B%0A%20%20%20%20%20%20else%20delayBlurEvent%28cm%29%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20lastClick%2C%20lastDoubleClick%3B%0A%20%20function%20leftButtonDown%28cm%2C%20e%2C%20start%29%20%7B%0A%20%20%20%20if%20%28ie%29%20setTimeout%28bind%28ensureFocus%2C%20cm%29%2C%200%29%3B%0A%20%20%20%20else%20cm%2EcurOp%2Efocus%20%3D%20activeElt%28%29%3B%0A%0A%20%20%20%20var%20now%20%3D%20%2Bnew%20Date%2C%20type%3B%0A%20%20%20%20if%20%28lastDoubleClick%20%26%26%20lastDoubleClick%2Etime%20%3E%20now%20%2D%20400%20%26%26%20cmp%28lastDoubleClick%2Epos%2C%20start%29%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20type%20%3D%20%22triple%22%3B%0A%20%20%20%20%7D%20else%20if%20%28lastClick%20%26%26%20lastClick%2Etime%20%3E%20now%20%2D%20400%20%26%26%20cmp%28lastClick%2Epos%2C%20start%29%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20type%20%3D%20%22double%22%3B%0A%20%20%20%20%20%20lastDoubleClick%20%3D%20%7Btime%3A%20now%2C%20pos%3A%20start%7D%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20type%20%3D%20%22single%22%3B%0A%20%20%20%20%20%20lastClick%20%3D%20%7Btime%3A%20now%2C%20pos%3A%20start%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20sel%20%3D%20cm%2Edoc%2Esel%2C%20modifier%20%3D%20mac%20%3F%20e%2EmetaKey%20%3A%20e%2EctrlKey%2C%20contained%3B%0A%20%20%20%20if%20%28cm%2Eoptions%2EdragDrop%20%26%26%20dragAndDrop%20%26%26%20%21cm%2EisReadOnly%28%29%20%26%26%0A%20%20%20%20%20%20%20%20type%20%3D%3D%20%22single%22%20%26%26%20%28contained%20%3D%20sel%2Econtains%28start%29%29%20%3E%20%2D1%20%26%26%0A%20%20%20%20%20%20%20%20%28cmp%28%28contained%20%3D%20sel%2Eranges%5Bcontained%5D%29%2Efrom%28%29%2C%20start%29%20%3C%200%20%7C%7C%20start%2ExRel%20%3E%200%29%20%26%26%0A%20%20%20%20%20%20%20%20%28cmp%28contained%2Eto%28%29%2C%20start%29%20%3E%200%20%7C%7C%20start%2ExRel%20%3C%200%29%29%0A%20%20%20%20%20%20leftButtonStartDrag%28cm%2C%20e%2C%20start%2C%20modifier%29%3B%0A%20%20%20%20else%0A%20%20%20%20%20%20leftButtonSelect%28cm%2C%20e%2C%20start%2C%20type%2C%20modifier%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Start%20a%20text%20drag%2E%20When%20it%20ends%2C%20see%20if%20any%20dragging%20actually%0A%20%20%2F%2F%20happen%2C%20and%20treat%20as%20a%20click%20if%20it%20didn%27t%2E%0A%20%20function%20leftButtonStartDrag%28cm%2C%20e%2C%20start%2C%20modifier%29%20%7B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%2C%20startTime%20%3D%20%2Bnew%20Date%3B%0A%20%20%20%20var%20dragEnd%20%3D%20operation%28cm%2C%20function%28e2%29%20%7B%0A%20%20%20%20%20%20if%20%28webkit%29%20display%2Escroller%2Edraggable%20%3D%20false%3B%0A%20%20%20%20%20%20cm%2Estate%2EdraggingText%20%3D%20false%3B%0A%20%20%20%20%20%20off%28document%2C%20%22mouseup%22%2C%20dragEnd%29%3B%0A%20%20%20%20%20%20off%28display%2Escroller%2C%20%22drop%22%2C%20dragEnd%29%3B%0A%20%20%20%20%20%20if%20%28Math%2Eabs%28e%2EclientX%20%2D%20e2%2EclientX%29%20%2B%20Math%2Eabs%28e%2EclientY%20%2D%20e2%2EclientY%29%20%3C%2010%29%20%7B%0A%20%20%20%20%20%20%20%20e%5FpreventDefault%28e2%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21modifier%20%26%26%20%2Bnew%20Date%20%2D%20200%20%3C%20startTime%29%0A%20%20%20%20%20%20%20%20%20%20extendSelection%28cm%2Edoc%2C%20start%29%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20Work%20around%20unexplainable%20focus%20problem%20in%20IE9%20%28%232127%29%20and%20Chrome%20%28%233081%29%0A%20%20%20%20%20%20%20%20if%20%28webkit%20%7C%7C%20ie%20%26%26%20ie%5Fversion%20%3D%3D%209%29%0A%20%20%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7Bdocument%2Ebody%2Efocus%28%29%3B%20display%2Einput%2Efocus%28%29%3B%7D%2C%2020%29%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20display%2Einput%2Efocus%28%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20%2F%2F%20Let%20the%20drag%20handler%20handle%20this%2E%0A%20%20%20%20if%20%28webkit%29%20display%2Escroller%2Edraggable%20%3D%20true%3B%0A%20%20%20%20cm%2Estate%2EdraggingText%20%3D%20dragEnd%3B%0A%20%20%20%20%2F%2F%20IE%27s%20approach%20to%20draggable%0A%20%20%20%20if%20%28display%2Escroller%2EdragDrop%29%20display%2Escroller%2EdragDrop%28%29%3B%0A%20%20%20%20on%28document%2C%20%22mouseup%22%2C%20dragEnd%29%3B%0A%20%20%20%20on%28display%2Escroller%2C%20%22drop%22%2C%20dragEnd%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Normal%20selection%2C%20as%20opposed%20to%20text%20dragging%2E%0A%20%20function%20leftButtonSelect%28cm%2C%20e%2C%20start%2C%20type%2C%20addNew%29%20%7B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%2C%20doc%20%3D%20cm%2Edoc%3B%0A%20%20%20%20e%5FpreventDefault%28e%29%3B%0A%0A%20%20%20%20var%20ourRange%2C%20ourIndex%2C%20startSel%20%3D%20doc%2Esel%2C%20ranges%20%3D%20startSel%2Eranges%3B%0A%20%20%20%20if%20%28addNew%20%26%26%20%21e%2EshiftKey%29%20%7B%0A%20%20%20%20%20%20ourIndex%20%3D%20doc%2Esel%2Econtains%28start%29%3B%0A%20%20%20%20%20%20if%20%28ourIndex%20%3E%20%2D1%29%0A%20%20%20%20%20%20%20%20ourRange%20%3D%20ranges%5BourIndex%5D%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20ourRange%20%3D%20new%20Range%28start%2C%20start%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20ourRange%20%3D%20doc%2Esel%2Eprimary%28%29%3B%0A%20%20%20%20%20%20ourIndex%20%3D%20doc%2Esel%2EprimIndex%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28e%2EaltKey%29%20%7B%0A%20%20%20%20%20%20type%20%3D%20%22rect%22%3B%0A%20%20%20%20%20%20if%20%28%21addNew%29%20ourRange%20%3D%20new%20Range%28start%2C%20start%29%3B%0A%20%20%20%20%20%20start%20%3D%20posFromMouse%28cm%2C%20e%2C%20true%2C%20true%29%3B%0A%20%20%20%20%20%20ourIndex%20%3D%20%2D1%3B%0A%20%20%20%20%7D%20else%20if%20%28type%20%3D%3D%20%22double%22%29%20%7B%0A%20%20%20%20%20%20var%20word%20%3D%20cm%2EfindWordAt%28start%29%3B%0A%20%20%20%20%20%20if%20%28cm%2Edisplay%2Eshift%20%7C%7C%20doc%2Eextend%29%0A%20%20%20%20%20%20%20%20ourRange%20%3D%20extendRange%28doc%2C%20ourRange%2C%20word%2Eanchor%2C%20word%2Ehead%29%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20ourRange%20%3D%20word%3B%0A%20%20%20%20%7D%20else%20if%20%28type%20%3D%3D%20%22triple%22%29%20%7B%0A%20%20%20%20%20%20var%20line%20%3D%20new%20Range%28Pos%28start%2Eline%2C%200%29%2C%20clipPos%28doc%2C%20Pos%28start%2Eline%20%2B%201%2C%200%29%29%29%3B%0A%20%20%20%20%20%20if%20%28cm%2Edisplay%2Eshift%20%7C%7C%20doc%2Eextend%29%0A%20%20%20%20%20%20%20%20ourRange%20%3D%20extendRange%28doc%2C%20ourRange%2C%20line%2Eanchor%2C%20line%2Ehead%29%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20ourRange%20%3D%20line%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20ourRange%20%3D%20extendRange%28doc%2C%20ourRange%2C%20start%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28%21addNew%29%20%7B%0A%20%20%20%20%20%20ourIndex%20%3D%200%3B%0A%20%20%20%20%20%20setSelection%28doc%2C%20new%20Selection%28%5BourRange%5D%2C%200%29%2C%20sel%5Fmouse%29%3B%0A%20%20%20%20%20%20startSel%20%3D%20doc%2Esel%3B%0A%20%20%20%20%7D%20else%20if%20%28ourIndex%20%3D%3D%20%2D1%29%20%7B%0A%20%20%20%20%20%20ourIndex%20%3D%20ranges%2Elength%3B%0A%20%20%20%20%20%20setSelection%28doc%2C%20normalizeSelection%28ranges%2Econcat%28%5BourRange%5D%29%2C%20ourIndex%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7Bscroll%3A%20false%2C%20origin%3A%20%22%2Amouse%22%7D%29%3B%0A%20%20%20%20%7D%20else%20if%20%28ranges%2Elength%20%3E%201%20%26%26%20ranges%5BourIndex%5D%2Eempty%28%29%20%26%26%20type%20%3D%3D%20%22single%22%20%26%26%20%21e%2EshiftKey%29%20%7B%0A%20%20%20%20%20%20setSelection%28doc%2C%20normalizeSelection%28ranges%2Eslice%280%2C%20ourIndex%29%2Econcat%28ranges%2Eslice%28ourIndex%20%2B%201%29%29%2C%200%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7Bscroll%3A%20false%2C%20origin%3A%20%22%2Amouse%22%7D%29%3B%0A%20%20%20%20%20%20startSel%20%3D%20doc%2Esel%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20replaceOneSelection%28doc%2C%20ourIndex%2C%20ourRange%2C%20sel%5Fmouse%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20lastPos%20%3D%20start%3B%0A%20%20%20%20function%20extendTo%28pos%29%20%7B%0A%20%20%20%20%20%20if%20%28cmp%28lastPos%2C%20pos%29%20%3D%3D%200%29%20return%3B%0A%20%20%20%20%20%20lastPos%20%3D%20pos%3B%0A%0A%20%20%20%20%20%20if%20%28type%20%3D%3D%20%22rect%22%29%20%7B%0A%20%20%20%20%20%20%20%20var%20ranges%20%3D%20%5B%5D%2C%20tabSize%20%3D%20cm%2Eoptions%2EtabSize%3B%0A%20%20%20%20%20%20%20%20var%20startCol%20%3D%20countColumn%28getLine%28doc%2C%20start%2Eline%29%2Etext%2C%20start%2Ech%2C%20tabSize%29%3B%0A%20%20%20%20%20%20%20%20var%20posCol%20%3D%20countColumn%28getLine%28doc%2C%20pos%2Eline%29%2Etext%2C%20pos%2Ech%2C%20tabSize%29%3B%0A%20%20%20%20%20%20%20%20var%20left%20%3D%20Math%2Emin%28startCol%2C%20posCol%29%2C%20right%20%3D%20Math%2Emax%28startCol%2C%20posCol%29%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20line%20%3D%20Math%2Emin%28start%2Eline%2C%20pos%2Eline%29%2C%20end%20%3D%20Math%2Emin%28cm%2ElastLine%28%29%2C%20Math%2Emax%28start%2Eline%2C%20pos%2Eline%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20line%20%3C%3D%20end%3B%20line%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20text%20%3D%20getLine%28doc%2C%20line%29%2Etext%2C%20leftPos%20%3D%20findColumn%28text%2C%20left%2C%20tabSize%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28left%20%3D%3D%20right%29%0A%20%20%20%20%20%20%20%20%20%20%20%20ranges%2Epush%28new%20Range%28Pos%28line%2C%20leftPos%29%2C%20Pos%28line%2C%20leftPos%29%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20else%20if%20%28text%2Elength%20%3E%20leftPos%29%0A%20%20%20%20%20%20%20%20%20%20%20%20ranges%2Epush%28new%20Range%28Pos%28line%2C%20leftPos%29%2C%20Pos%28line%2C%20findColumn%28text%2C%20right%2C%20tabSize%29%29%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28%21ranges%2Elength%29%20ranges%2Epush%28new%20Range%28start%2C%20start%29%29%3B%0A%20%20%20%20%20%20%20%20setSelection%28doc%2C%20normalizeSelection%28startSel%2Eranges%2Eslice%280%2C%20ourIndex%29%2Econcat%28ranges%29%2C%20ourIndex%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7Borigin%3A%20%22%2Amouse%22%2C%20scroll%3A%20false%7D%29%3B%0A%20%20%20%20%20%20%20%20cm%2EscrollIntoView%28pos%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20var%20oldRange%20%3D%20ourRange%3B%0A%20%20%20%20%20%20%20%20var%20anchor%20%3D%20oldRange%2Eanchor%2C%20head%20%3D%20pos%3B%0A%20%20%20%20%20%20%20%20if%20%28type%20%21%3D%20%22single%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28type%20%3D%3D%20%22double%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20range%20%3D%20cm%2EfindWordAt%28pos%29%3B%0A%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20range%20%3D%20new%20Range%28Pos%28pos%2Eline%2C%200%29%2C%20clipPos%28doc%2C%20Pos%28pos%2Eline%20%2B%201%2C%200%29%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28cmp%28range%2Eanchor%2C%20anchor%29%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20head%20%3D%20range%2Ehead%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20anchor%20%3D%20minPos%28oldRange%2Efrom%28%29%2C%20range%2Eanchor%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20head%20%3D%20range%2Eanchor%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20anchor%20%3D%20maxPos%28oldRange%2Eto%28%29%2C%20range%2Ehead%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20var%20ranges%20%3D%20startSel%2Eranges%2Eslice%280%29%3B%0A%20%20%20%20%20%20%20%20ranges%5BourIndex%5D%20%3D%20new%20Range%28clipPos%28doc%2C%20anchor%29%2C%20head%29%3B%0A%20%20%20%20%20%20%20%20setSelection%28doc%2C%20normalizeSelection%28ranges%2C%20ourIndex%29%2C%20sel%5Fmouse%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20editorSize%20%3D%20display%2Ewrapper%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20%2F%2F%20Used%20to%20ensure%20timeout%20re%2Dtries%20don%27t%20fire%20when%20another%20extend%0A%20%20%20%20%2F%2F%20happened%20in%20the%20meantime%20%28clearTimeout%20isn%27t%20reliable%20%2D%2D%20at%0A%20%20%20%20%2F%2F%20least%20on%20Chrome%2C%20the%20timeouts%20still%20happen%20even%20when%20cleared%2C%0A%20%20%20%20%2F%2F%20if%20the%20clear%20happens%20after%20their%20scheduled%20firing%20time%29%2E%0A%20%20%20%20var%20counter%20%3D%200%3B%0A%0A%20%20%20%20function%20extend%28e%29%20%7B%0A%20%20%20%20%20%20var%20curCount%20%3D%20%2B%2Bcounter%3B%0A%20%20%20%20%20%20var%20cur%20%3D%20posFromMouse%28cm%2C%20e%2C%20true%2C%20type%20%3D%3D%20%22rect%22%29%3B%0A%20%20%20%20%20%20if%20%28%21cur%29%20return%3B%0A%20%20%20%20%20%20if%20%28cmp%28cur%2C%20lastPos%29%20%21%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20cm%2EcurOp%2Efocus%20%3D%20activeElt%28%29%3B%0A%20%20%20%20%20%20%20%20extendTo%28cur%29%3B%0A%20%20%20%20%20%20%20%20var%20visible%20%3D%20visibleLines%28display%2C%20doc%29%3B%0A%20%20%20%20%20%20%20%20if%20%28cur%2Eline%20%3E%3D%20visible%2Eto%20%7C%7C%20cur%2Eline%20%3C%20visible%2Efrom%29%0A%20%20%20%20%20%20%20%20%20%20setTimeout%28operation%28cm%2C%20function%28%29%7Bif%20%28counter%20%3D%3D%20curCount%29%20extend%28e%29%3B%7D%29%2C%20150%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20var%20outside%20%3D%20e%2EclientY%20%3C%20editorSize%2Etop%20%3F%20%2D20%20%3A%20e%2EclientY%20%3E%20editorSize%2Ebottom%20%3F%2020%20%3A%200%3B%0A%20%20%20%20%20%20%20%20if%20%28outside%29%20setTimeout%28operation%28cm%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28counter%20%21%3D%20curCount%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20display%2Escroller%2EscrollTop%20%2B%3D%20outside%3B%0A%20%20%20%20%20%20%20%20%20%20extend%28e%29%3B%0A%20%20%20%20%20%20%20%20%7D%29%2C%2050%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20done%28e%29%20%7B%0A%20%20%20%20%20%20cm%2Estate%2EselectingText%20%3D%20false%3B%0A%20%20%20%20%20%20counter%20%3D%20Infinity%3B%0A%20%20%20%20%20%20e%5FpreventDefault%28e%29%3B%0A%20%20%20%20%20%20display%2Einput%2Efocus%28%29%3B%0A%20%20%20%20%20%20off%28document%2C%20%22mousemove%22%2C%20move%29%3B%0A%20%20%20%20%20%20off%28document%2C%20%22mouseup%22%2C%20up%29%3B%0A%20%20%20%20%20%20doc%2Ehistory%2ElastSelOrigin%20%3D%20null%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20move%20%3D%20operation%28cm%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20if%20%28%21e%5Fbutton%28e%29%29%20done%28e%29%3B%0A%20%20%20%20%20%20else%20extend%28e%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20var%20up%20%3D%20operation%28cm%2C%20done%29%3B%0A%20%20%20%20cm%2Estate%2EselectingText%20%3D%20up%3B%0A%20%20%20%20on%28document%2C%20%22mousemove%22%2C%20move%29%3B%0A%20%20%20%20on%28document%2C%20%22mouseup%22%2C%20up%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Determines%20whether%20an%20event%20happened%20in%20the%20gutter%2C%20and%20fires%20the%0A%20%20%2F%2F%20handlers%20for%20the%20corresponding%20event%2E%0A%20%20function%20gutterEvent%28cm%2C%20e%2C%20type%2C%20prevent%29%20%7B%0A%20%20%20%20try%20%7B%20var%20mX%20%3D%20e%2EclientX%2C%20mY%20%3D%20e%2EclientY%3B%20%7D%0A%20%20%20%20catch%28e%29%20%7B%20return%20false%3B%20%7D%0A%20%20%20%20if%20%28mX%20%3E%3D%20Math%2Efloor%28cm%2Edisplay%2Egutters%2EgetBoundingClientRect%28%29%2Eright%29%29%20return%20false%3B%0A%20%20%20%20if%20%28prevent%29%20e%5FpreventDefault%28e%29%3B%0A%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%3B%0A%20%20%20%20var%20lineBox%20%3D%20display%2ElineDiv%2EgetBoundingClientRect%28%29%3B%0A%0A%20%20%20%20if%20%28mY%20%3E%20lineBox%2Ebottom%20%7C%7C%20%21hasHandler%28cm%2C%20type%29%29%20return%20e%5FdefaultPrevented%28e%29%3B%0A%20%20%20%20mY%20%2D%3D%20lineBox%2Etop%20%2D%20display%2EviewOffset%3B%0A%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20cm%2Eoptions%2Egutters%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20g%20%3D%20display%2Egutters%2EchildNodes%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28g%20%26%26%20g%2EgetBoundingClientRect%28%29%2Eright%20%3E%3D%20mX%29%20%7B%0A%20%20%20%20%20%20%20%20var%20line%20%3D%20lineAtHeight%28cm%2Edoc%2C%20mY%29%3B%0A%20%20%20%20%20%20%20%20var%20gutter%20%3D%20cm%2Eoptions%2Egutters%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20signal%28cm%2C%20type%2C%20cm%2C%20line%2C%20gutter%2C%20e%29%3B%0A%20%20%20%20%20%20%20%20return%20e%5FdefaultPrevented%28e%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20clickInGutter%28cm%2C%20e%29%20%7B%0A%20%20%20%20return%20gutterEvent%28cm%2C%20e%2C%20%22gutterClick%22%2C%20true%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Kludge%20to%20work%20around%20strange%20IE%20behavior%20where%20it%27ll%20sometimes%0A%20%20%2F%2F%20re%2Dfire%20a%20series%20of%20drag%2Drelated%20events%20right%20after%20the%20drop%20%28%231551%29%0A%20%20var%20lastDrop%20%3D%200%3B%0A%0A%20%20function%20onDrop%28e%29%20%7B%0A%20%20%20%20var%20cm%20%3D%20this%3B%0A%20%20%20%20clearDragCursor%28cm%29%3B%0A%20%20%20%20if%20%28signalDOMEvent%28cm%2C%20e%29%20%7C%7C%20eventInWidget%28cm%2Edisplay%2C%20e%29%29%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20e%5FpreventDefault%28e%29%3B%0A%20%20%20%20if%20%28ie%29%20lastDrop%20%3D%20%2Bnew%20Date%3B%0A%20%20%20%20var%20pos%20%3D%20posFromMouse%28cm%2C%20e%2C%20true%29%2C%20files%20%3D%20e%2EdataTransfer%2Efiles%3B%0A%20%20%20%20if%20%28%21pos%20%7C%7C%20cm%2EisReadOnly%28%29%29%20return%3B%0A%20%20%20%20%2F%2F%20Might%20be%20a%20file%20drop%2C%20in%20which%20case%20we%20simply%20extract%20the%20text%0A%20%20%20%20%2F%2F%20and%20insert%20it%2E%0A%20%20%20%20if%20%28files%20%26%26%20files%2Elength%20%26%26%20window%2EFileReader%20%26%26%20window%2EFile%29%20%7B%0A%20%20%20%20%20%20var%20n%20%3D%20files%2Elength%2C%20text%20%3D%20Array%28n%29%2C%20read%20%3D%200%3B%0A%20%20%20%20%20%20var%20loadFile%20%3D%20function%28file%2C%20i%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28cm%2Eoptions%2EallowDropFileTypes%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20indexOf%28cm%2Eoptions%2EallowDropFileTypes%2C%20file%2Etype%29%20%3D%3D%20%2D1%29%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20%20%20%20%20var%20reader%20%3D%20new%20FileReader%3B%0A%20%20%20%20%20%20%20%20reader%2Eonload%20%3D%20operation%28cm%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20content%20%3D%20reader%2Eresult%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%2F%5B%5Cx00%2D%5Cx08%5Cx0e%2D%5Cx1f%5D%7B2%7D%2F%2Etest%28content%29%29%20content%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20text%5Bi%5D%20%3D%20content%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%2B%2Bread%20%3D%3D%20n%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20pos%20%3D%20clipPos%28cm%2Edoc%2C%20pos%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20change%20%3D%20%7Bfrom%3A%20pos%2C%20to%3A%20pos%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20cm%2Edoc%2EsplitLines%28text%2Ejoin%28cm%2Edoc%2ElineSeparator%28%29%29%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20origin%3A%20%22paste%22%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20makeChange%28cm%2Edoc%2C%20change%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20setSelectionReplaceHistory%28cm%2Edoc%2C%20simpleSelection%28pos%2C%20changeEnd%28change%29%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20reader%2EreadAsText%28file%29%3B%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20n%3B%20%2B%2Bi%29%20loadFile%28files%5Bi%5D%2C%20i%29%3B%0A%20%20%20%20%7D%20else%20%7B%20%2F%2F%20Normal%20drop%0A%20%20%20%20%20%20%2F%2F%20Don%27t%20do%20a%20replace%20if%20the%20drop%20happened%20inside%20of%20the%20selected%20text%2E%0A%20%20%20%20%20%20if%20%28cm%2Estate%2EdraggingText%20%26%26%20cm%2Edoc%2Esel%2Econtains%28pos%29%20%3E%20%2D1%29%20%7B%0A%20%20%20%20%20%20%20%20cm%2Estate%2EdraggingText%28e%29%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20Ensure%20the%20editor%20is%20re%2Dfocused%0A%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7Bcm%2Edisplay%2Einput%2Efocus%28%29%3B%7D%2C%2020%29%3B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20var%20text%20%3D%20e%2EdataTransfer%2EgetData%28%22Text%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28text%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28cm%2Estate%2EdraggingText%20%26%26%20%21%28mac%20%3F%20e%2EaltKey%20%3A%20e%2EctrlKey%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20selected%20%3D%20cm%2ElistSelections%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20setSelectionNoUndo%28cm%2Edoc%2C%20simpleSelection%28pos%2C%20pos%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28selected%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20selected%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20%20%20%20%20%20%20replaceRange%28cm%2Edoc%2C%20%22%22%2C%20selected%5Bi%5D%2Eanchor%2C%20selected%5Bi%5D%2Ehead%2C%20%22drag%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20cm%2EreplaceSelection%28text%2C%20%22around%22%2C%20%22paste%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20cm%2Edisplay%2Einput%2Efocus%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20catch%28e%29%7B%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20onDragStart%28cm%2C%20e%29%20%7B%0A%20%20%20%20if%20%28ie%20%26%26%20%28%21cm%2Estate%2EdraggingText%20%7C%7C%20%2Bnew%20Date%20%2D%20lastDrop%20%3C%20100%29%29%20%7B%20e%5Fstop%28e%29%3B%20return%3B%20%7D%0A%20%20%20%20if%20%28signalDOMEvent%28cm%2C%20e%29%20%7C%7C%20eventInWidget%28cm%2Edisplay%2C%20e%29%29%20return%3B%0A%0A%20%20%20%20e%2EdataTransfer%2EsetData%28%22Text%22%2C%20cm%2EgetSelection%28%29%29%3B%0A%0A%20%20%20%20%2F%2F%20Use%20dummy%20image%20instead%20of%20default%20browsers%20image%2E%0A%20%20%20%20%2F%2F%20Recent%20Safari%20%28%7E6%2E0%2E2%29%20have%20a%20tendency%20to%20segfault%20when%20this%20happens%2C%20so%20we%20don%27t%20do%20it%20there%2E%0A%20%20%20%20if%20%28e%2EdataTransfer%2EsetDragImage%20%26%26%20%21safari%29%20%7B%0A%20%20%20%20%20%20var%20img%20%3D%20elt%28%22img%22%2C%20null%2C%20null%2C%20%22position%3A%20fixed%3B%20left%3A%200%3B%20top%3A%200%3B%22%29%3B%0A%20%20%20%20%20%20img%2Esrc%20%3D%20%22data%3Aimage%2Fgif%3Bbase64%2CR0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw%3D%3D%22%3B%0A%20%20%20%20%20%20if%20%28presto%29%20%7B%0A%20%20%20%20%20%20%20%20img%2Ewidth%20%3D%20img%2Eheight%20%3D%201%3B%0A%20%20%20%20%20%20%20%20cm%2Edisplay%2Ewrapper%2EappendChild%28img%29%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20Force%20a%20relayout%2C%20or%20Opera%20won%27t%20use%20our%20image%20for%20some%20obscure%20reason%0A%20%20%20%20%20%20%20%20img%2E%5Ftop%20%3D%20img%2EoffsetTop%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20e%2EdataTransfer%2EsetDragImage%28img%2C%200%2C%200%29%3B%0A%20%20%20%20%20%20if%20%28presto%29%20img%2EparentNode%2EremoveChild%28img%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20onDragOver%28cm%2C%20e%29%20%7B%0A%20%20%20%20var%20pos%20%3D%20posFromMouse%28cm%2C%20e%29%3B%0A%20%20%20%20if%20%28%21pos%29%20return%3B%0A%20%20%20%20var%20frag%20%3D%20document%2EcreateDocumentFragment%28%29%3B%0A%20%20%20%20drawSelectionCursor%28cm%2C%20pos%2C%20frag%29%3B%0A%20%20%20%20if%20%28%21cm%2Edisplay%2EdragCursor%29%20%7B%0A%20%20%20%20%20%20cm%2Edisplay%2EdragCursor%20%3D%20elt%28%22div%22%2C%20null%2C%20%22CodeMirror%2Dcursors%20CodeMirror%2Ddragcursors%22%29%3B%0A%20%20%20%20%20%20cm%2Edisplay%2ElineSpace%2EinsertBefore%28cm%2Edisplay%2EdragCursor%2C%20cm%2Edisplay%2EcursorDiv%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20removeChildrenAndAdd%28cm%2Edisplay%2EdragCursor%2C%20frag%29%3B%0A%20%20%7D%0A%0A%20%20function%20clearDragCursor%28cm%29%20%7B%0A%20%20%20%20if%20%28cm%2Edisplay%2EdragCursor%29%20%7B%0A%20%20%20%20%20%20cm%2Edisplay%2ElineSpace%2EremoveChild%28cm%2Edisplay%2EdragCursor%29%3B%0A%20%20%20%20%20%20cm%2Edisplay%2EdragCursor%20%3D%20null%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20SCROLL%20EVENTS%0A%0A%20%20%2F%2F%20Sync%20the%20scrollable%20area%20and%20scrollbars%2C%20ensure%20the%20viewport%0A%20%20%2F%2F%20covers%20the%20visible%20area%2E%0A%20%20function%20setScrollTop%28cm%2C%20val%29%20%7B%0A%20%20%20%20if%20%28Math%2Eabs%28cm%2Edoc%2EscrollTop%20%2D%20val%29%20%3C%202%29%20return%3B%0A%20%20%20%20cm%2Edoc%2EscrollTop%20%3D%20val%3B%0A%20%20%20%20if%20%28%21gecko%29%20updateDisplaySimple%28cm%2C%20%7Btop%3A%20val%7D%29%3B%0A%20%20%20%20if%20%28cm%2Edisplay%2Escroller%2EscrollTop%20%21%3D%20val%29%20cm%2Edisplay%2Escroller%2EscrollTop%20%3D%20val%3B%0A%20%20%20%20cm%2Edisplay%2Escrollbars%2EsetScrollTop%28val%29%3B%0A%20%20%20%20if%20%28gecko%29%20updateDisplaySimple%28cm%29%3B%0A%20%20%20%20startWorker%28cm%2C%20100%29%3B%0A%20%20%7D%0A%20%20%2F%2F%20Sync%20scroller%20and%20scrollbar%2C%20ensure%20the%20gutter%20elements%20are%0A%20%20%2F%2F%20aligned%2E%0A%20%20function%20setScrollLeft%28cm%2C%20val%2C%20isScroller%29%20%7B%0A%20%20%20%20if%20%28isScroller%20%3F%20val%20%3D%3D%20cm%2Edoc%2EscrollLeft%20%3A%20Math%2Eabs%28cm%2Edoc%2EscrollLeft%20%2D%20val%29%20%3C%202%29%20return%3B%0A%20%20%20%20val%20%3D%20Math%2Emin%28val%2C%20cm%2Edisplay%2Escroller%2EscrollWidth%20%2D%20cm%2Edisplay%2Escroller%2EclientWidth%29%3B%0A%20%20%20%20cm%2Edoc%2EscrollLeft%20%3D%20val%3B%0A%20%20%20%20alignHorizontally%28cm%29%3B%0A%20%20%20%20if%20%28cm%2Edisplay%2Escroller%2EscrollLeft%20%21%3D%20val%29%20cm%2Edisplay%2Escroller%2EscrollLeft%20%3D%20val%3B%0A%20%20%20%20cm%2Edisplay%2Escrollbars%2EsetScrollLeft%28val%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Since%20the%20delta%20values%20reported%20on%20mouse%20wheel%20events%20are%0A%20%20%2F%2F%20unstandardized%20between%20browsers%20and%20even%20browser%20versions%2C%20and%0A%20%20%2F%2F%20generally%20horribly%20unpredictable%2C%20this%20code%20starts%20by%20measuring%0A%20%20%2F%2F%20the%20scroll%20effect%20that%20the%20first%20few%20mouse%20wheel%20events%20have%2C%0A%20%20%2F%2F%20and%2C%20from%20that%2C%20detects%20the%20way%20it%20can%20convert%20deltas%20to%20pixel%0A%20%20%2F%2F%20offsets%20afterwards%2E%0A%20%20%2F%2F%0A%20%20%2F%2F%20The%20reason%20we%20want%20to%20know%20the%20amount%20a%20wheel%20event%20will%20scroll%0A%20%20%2F%2F%20is%20that%20it%20gives%20us%20a%20chance%20to%20update%20the%20display%20before%20the%0A%20%20%2F%2F%20actual%20scrolling%20happens%2C%20reducing%20flickering%2E%0A%0A%20%20var%20wheelSamples%20%3D%200%2C%20wheelPixelsPerUnit%20%3D%20null%3B%0A%20%20%2F%2F%20Fill%20in%20a%20browser%2Ddetected%20starting%20value%20on%20browsers%20where%20we%0A%20%20%2F%2F%20know%20one%2E%20These%20don%27t%20have%20to%20be%20accurate%20%2D%2D%20the%20result%20of%20them%0A%20%20%2F%2F%20being%20wrong%20would%20just%20be%20a%20slight%20flicker%20on%20the%20first%20wheel%0A%20%20%2F%2F%20scroll%20%28if%20it%20is%20large%20enough%29%2E%0A%20%20if%20%28ie%29%20wheelPixelsPerUnit%20%3D%20%2D%2E53%3B%0A%20%20else%20if%20%28gecko%29%20wheelPixelsPerUnit%20%3D%2015%3B%0A%20%20else%20if%20%28chrome%29%20wheelPixelsPerUnit%20%3D%20%2D%2E7%3B%0A%20%20else%20if%20%28safari%29%20wheelPixelsPerUnit%20%3D%20%2D1%2F3%3B%0A%0A%20%20var%20wheelEventDelta%20%3D%20function%28e%29%20%7B%0A%20%20%20%20var%20dx%20%3D%20e%2EwheelDeltaX%2C%20dy%20%3D%20e%2EwheelDeltaY%3B%0A%20%20%20%20if%20%28dx%20%3D%3D%20null%20%26%26%20e%2Edetail%20%26%26%20e%2Eaxis%20%3D%3D%20e%2EHORIZONTAL%5FAXIS%29%20dx%20%3D%20e%2Edetail%3B%0A%20%20%20%20if%20%28dy%20%3D%3D%20null%20%26%26%20e%2Edetail%20%26%26%20e%2Eaxis%20%3D%3D%20e%2EVERTICAL%5FAXIS%29%20dy%20%3D%20e%2Edetail%3B%0A%20%20%20%20else%20if%20%28dy%20%3D%3D%20null%29%20dy%20%3D%20e%2EwheelDelta%3B%0A%20%20%20%20return%20%7Bx%3A%20dx%2C%20y%3A%20dy%7D%3B%0A%20%20%7D%3B%0A%20%20CodeMirror%2EwheelEventPixels%20%3D%20function%28e%29%20%7B%0A%20%20%20%20var%20delta%20%3D%20wheelEventDelta%28e%29%3B%0A%20%20%20%20delta%2Ex%20%2A%3D%20wheelPixelsPerUnit%3B%0A%20%20%20%20delta%2Ey%20%2A%3D%20wheelPixelsPerUnit%3B%0A%20%20%20%20return%20delta%3B%0A%20%20%7D%3B%0A%0A%20%20function%20onScrollWheel%28cm%2C%20e%29%20%7B%0A%20%20%20%20var%20delta%20%3D%20wheelEventDelta%28e%29%2C%20dx%20%3D%20delta%2Ex%2C%20dy%20%3D%20delta%2Ey%3B%0A%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%2C%20scroll%20%3D%20display%2Escroller%3B%0A%20%20%20%20%2F%2F%20Quit%20if%20there%27s%20nothing%20to%20scroll%20here%0A%20%20%20%20var%20canScrollX%20%3D%20scroll%2EscrollWidth%20%3E%20scroll%2EclientWidth%3B%0A%20%20%20%20var%20canScrollY%20%3D%20scroll%2EscrollHeight%20%3E%20scroll%2EclientHeight%3B%0A%20%20%20%20if%20%28%21%28dx%20%26%26%20canScrollX%20%7C%7C%20dy%20%26%26%20canScrollY%29%29%20return%3B%0A%0A%20%20%20%20%2F%2F%20Webkit%20browsers%20on%20OS%20X%20abort%20momentum%20scrolls%20when%20the%20target%0A%20%20%20%20%2F%2F%20of%20the%20scroll%20event%20is%20removed%20from%20the%20scrollable%20element%2E%0A%20%20%20%20%2F%2F%20This%20hack%20%28see%20related%20code%20in%20patchDisplay%29%20makes%20sure%20the%0A%20%20%20%20%2F%2F%20element%20is%20kept%20around%2E%0A%20%20%20%20if%20%28dy%20%26%26%20mac%20%26%26%20webkit%29%20%7B%0A%20%20%20%20%20%20outer%3A%20for%20%28var%20cur%20%3D%20e%2Etarget%2C%20view%20%3D%20display%2Eview%3B%20cur%20%21%3D%20scroll%3B%20cur%20%3D%20cur%2EparentNode%29%20%7B%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20view%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28view%5Bi%5D%2Enode%20%3D%3D%20cur%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20cm%2Edisplay%2EcurrentWheelTarget%20%3D%20cur%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%20outer%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20On%20some%20browsers%2C%20horizontal%20scrolling%20will%20cause%20redraws%20to%0A%20%20%20%20%2F%2F%20happen%20before%20the%20gutter%20has%20been%20realigned%2C%20causing%20it%20to%0A%20%20%20%20%2F%2F%20wriggle%20around%20in%20a%20most%20unseemly%20way%2E%20When%20we%20have%20an%0A%20%20%20%20%2F%2F%20estimated%20pixels%2Fdelta%20value%2C%20we%20just%20handle%20horizontal%0A%20%20%20%20%2F%2F%20scrolling%20entirely%20here%2E%20It%27ll%20be%20slightly%20off%20from%20native%2C%20but%0A%20%20%20%20%2F%2F%20better%20than%20glitching%20out%2E%0A%20%20%20%20if%20%28dx%20%26%26%20%21gecko%20%26%26%20%21presto%20%26%26%20wheelPixelsPerUnit%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20if%20%28dy%20%26%26%20canScrollY%29%0A%20%20%20%20%20%20%20%20setScrollTop%28cm%2C%20Math%2Emax%280%2C%20Math%2Emin%28scroll%2EscrollTop%20%2B%20dy%20%2A%20wheelPixelsPerUnit%2C%20scroll%2EscrollHeight%20%2D%20scroll%2EclientHeight%29%29%29%3B%0A%20%20%20%20%20%20setScrollLeft%28cm%2C%20Math%2Emax%280%2C%20Math%2Emin%28scroll%2EscrollLeft%20%2B%20dx%20%2A%20wheelPixelsPerUnit%2C%20scroll%2EscrollWidth%20%2D%20scroll%2EclientWidth%29%29%29%3B%0A%20%20%20%20%20%20%2F%2F%20Only%20prevent%20default%20scrolling%20if%20vertical%20scrolling%20is%0A%20%20%20%20%20%20%2F%2F%20actually%20possible%2E%20Otherwise%2C%20it%20causes%20vertical%20scroll%0A%20%20%20%20%20%20%2F%2F%20jitter%20on%20OSX%20trackpads%20when%20deltaX%20is%20small%20and%20deltaY%0A%20%20%20%20%20%20%2F%2F%20is%20large%20%28issue%20%233579%29%0A%20%20%20%20%20%20if%20%28%21dy%20%7C%7C%20%28dy%20%26%26%20canScrollY%29%29%0A%20%20%20%20%20%20%20%20e%5FpreventDefault%28e%29%3B%0A%20%20%20%20%20%20display%2EwheelStartX%20%3D%20null%3B%20%2F%2F%20Abort%20measurement%2C%20if%20in%20progress%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20%27Project%27%20the%20visible%20viewport%20to%20cover%20the%20area%20that%20is%20being%0A%20%20%20%20%2F%2F%20scrolled%20into%20view%20%28if%20we%20know%20enough%20to%20estimate%20it%29%2E%0A%20%20%20%20if%20%28dy%20%26%26%20wheelPixelsPerUnit%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20var%20pixels%20%3D%20dy%20%2A%20wheelPixelsPerUnit%3B%0A%20%20%20%20%20%20var%20top%20%3D%20cm%2Edoc%2EscrollTop%2C%20bot%20%3D%20top%20%2B%20display%2Ewrapper%2EclientHeight%3B%0A%20%20%20%20%20%20if%20%28pixels%20%3C%200%29%20top%20%3D%20Math%2Emax%280%2C%20top%20%2B%20pixels%20%2D%2050%29%3B%0A%20%20%20%20%20%20else%20bot%20%3D%20Math%2Emin%28cm%2Edoc%2Eheight%2C%20bot%20%2B%20pixels%20%2B%2050%29%3B%0A%20%20%20%20%20%20updateDisplaySimple%28cm%2C%20%7Btop%3A%20top%2C%20bottom%3A%20bot%7D%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28wheelSamples%20%3C%2020%29%20%7B%0A%20%20%20%20%20%20if%20%28display%2EwheelStartX%20%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20display%2EwheelStartX%20%3D%20scroll%2EscrollLeft%3B%20display%2EwheelStartY%20%3D%20scroll%2EscrollTop%3B%0A%20%20%20%20%20%20%20%20display%2EwheelDX%20%3D%20dx%3B%20display%2EwheelDY%20%3D%20dy%3B%0A%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28display%2EwheelStartX%20%3D%3D%20null%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20var%20movedX%20%3D%20scroll%2EscrollLeft%20%2D%20display%2EwheelStartX%3B%0A%20%20%20%20%20%20%20%20%20%20var%20movedY%20%3D%20scroll%2EscrollTop%20%2D%20display%2EwheelStartY%3B%0A%20%20%20%20%20%20%20%20%20%20var%20sample%20%3D%20%28movedY%20%26%26%20display%2EwheelDY%20%26%26%20movedY%20%2F%20display%2EwheelDY%29%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%28movedX%20%26%26%20display%2EwheelDX%20%26%26%20movedX%20%2F%20display%2EwheelDX%29%3B%0A%20%20%20%20%20%20%20%20%20%20display%2EwheelStartX%20%3D%20display%2EwheelStartY%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21sample%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20wheelPixelsPerUnit%20%3D%20%28wheelPixelsPerUnit%20%2A%20wheelSamples%20%2B%20sample%29%20%2F%20%28wheelSamples%20%2B%201%29%3B%0A%20%20%20%20%20%20%20%20%20%20%2B%2BwheelSamples%3B%0A%20%20%20%20%20%20%20%20%7D%2C%20200%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20display%2EwheelDX%20%2B%3D%20dx%3B%20display%2EwheelDY%20%2B%3D%20dy%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20KEY%20EVENTS%0A%0A%20%20%2F%2F%20Run%20a%20handler%20that%20was%20bound%20to%20a%20key%2E%0A%20%20function%20doHandleBinding%28cm%2C%20bound%2C%20dropShift%29%20%7B%0A%20%20%20%20if%20%28typeof%20bound%20%3D%3D%20%22string%22%29%20%7B%0A%20%20%20%20%20%20bound%20%3D%20commands%5Bbound%5D%3B%0A%20%20%20%20%20%20if%20%28%21bound%29%20return%20false%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F%2F%20Ensure%20previous%20input%20has%20been%20read%2C%20so%20that%20the%20handler%20sees%20a%0A%20%20%20%20%2F%2F%20consistent%20view%20of%20the%20document%0A%20%20%20%20cm%2Edisplay%2Einput%2EensurePolled%28%29%3B%0A%20%20%20%20var%20prevShift%20%3D%20cm%2Edisplay%2Eshift%2C%20done%20%3D%20false%3B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20if%20%28cm%2EisReadOnly%28%29%29%20cm%2Estate%2EsuppressEdits%20%3D%20true%3B%0A%20%20%20%20%20%20if%20%28dropShift%29%20cm%2Edisplay%2Eshift%20%3D%20false%3B%0A%20%20%20%20%20%20done%20%3D%20bound%28cm%29%20%21%3D%20Pass%3B%0A%20%20%20%20%7D%20finally%20%7B%0A%20%20%20%20%20%20cm%2Edisplay%2Eshift%20%3D%20prevShift%3B%0A%20%20%20%20%20%20cm%2Estate%2EsuppressEdits%20%3D%20false%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20done%3B%0A%20%20%7D%0A%0A%20%20function%20lookupKeyForEditor%28cm%2C%20name%2C%20handle%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20cm%2Estate%2EkeyMaps%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20result%20%3D%20lookupKey%28name%2C%20cm%2Estate%2EkeyMaps%5Bi%5D%2C%20handle%2C%20cm%29%3B%0A%20%20%20%20%20%20if%20%28result%29%20return%20result%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20%28cm%2Eoptions%2EextraKeys%20%26%26%20lookupKey%28name%2C%20cm%2Eoptions%2EextraKeys%2C%20handle%2C%20cm%29%29%0A%20%20%20%20%20%20%7C%7C%20lookupKey%28name%2C%20cm%2Eoptions%2EkeyMap%2C%20handle%2C%20cm%29%3B%0A%20%20%7D%0A%0A%20%20var%20stopSeq%20%3D%20new%20Delayed%3B%0A%20%20function%20dispatchKey%28cm%2C%20name%2C%20e%2C%20handle%29%20%7B%0A%20%20%20%20var%20seq%20%3D%20cm%2Estate%2EkeySeq%3B%0A%20%20%20%20if%20%28seq%29%20%7B%0A%20%20%20%20%20%20if%20%28isModifierKey%28name%29%29%20return%20%22handled%22%3B%0A%20%20%20%20%20%20stopSeq%2Eset%2850%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28cm%2Estate%2EkeySeq%20%3D%3D%20seq%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20cm%2Estate%2EkeySeq%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20%20%20cm%2Edisplay%2Einput%2Ereset%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20name%20%3D%20seq%20%2B%20%22%20%22%20%2B%20name%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20result%20%3D%20lookupKeyForEditor%28cm%2C%20name%2C%20handle%29%3B%0A%0A%20%20%20%20if%20%28result%20%3D%3D%20%22multi%22%29%0A%20%20%20%20%20%20cm%2Estate%2EkeySeq%20%3D%20name%3B%0A%20%20%20%20if%20%28result%20%3D%3D%20%22handled%22%29%0A%20%20%20%20%20%20signalLater%28cm%2C%20%22keyHandled%22%2C%20cm%2C%20name%2C%20e%29%3B%0A%0A%20%20%20%20if%20%28result%20%3D%3D%20%22handled%22%20%7C%7C%20result%20%3D%3D%20%22multi%22%29%20%7B%0A%20%20%20%20%20%20e%5FpreventDefault%28e%29%3B%0A%20%20%20%20%20%20restartBlink%28cm%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28seq%20%26%26%20%21result%20%26%26%20%2F%5C%27%24%2F%2Etest%28name%29%29%20%7B%0A%20%20%20%20%20%20e%5FpreventDefault%28e%29%3B%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20%21%21result%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Handle%20a%20key%20from%20the%20keydown%20event%2E%0A%20%20function%20handleKeyBinding%28cm%2C%20e%29%20%7B%0A%20%20%20%20var%20name%20%3D%20keyName%28e%2C%20true%29%3B%0A%20%20%20%20if%20%28%21name%29%20return%20false%3B%0A%0A%20%20%20%20if%20%28e%2EshiftKey%20%26%26%20%21cm%2Estate%2EkeySeq%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20First%20try%20to%20resolve%20full%20name%20%28including%20%27Shift%2D%27%29%2E%20Failing%0A%20%20%20%20%20%20%2F%2F%20that%2C%20see%20if%20there%20is%20a%20cursor%2Dmotion%20command%20%28starting%20with%0A%20%20%20%20%20%20%2F%2F%20%27go%27%29%20bound%20to%20the%20keyname%20without%20%27Shift%2D%27%2E%0A%20%20%20%20%20%20return%20dispatchKey%28cm%2C%20%22Shift%2D%22%20%2B%20name%2C%20e%2C%20function%28b%29%20%7Breturn%20doHandleBinding%28cm%2C%20b%2C%20true%29%3B%7D%29%0A%20%20%20%20%20%20%20%20%20%20%7C%7C%20dispatchKey%28cm%2C%20name%2C%20e%2C%20function%28b%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28typeof%20b%20%3D%3D%20%22string%22%20%3F%20%2F%5Ego%5BA%2DZ%5D%2F%2Etest%28b%29%20%3A%20b%2Emotion%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20doHandleBinding%28cm%2C%20b%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20dispatchKey%28cm%2C%20name%2C%20e%2C%20function%28b%29%20%7B%20return%20doHandleBinding%28cm%2C%20b%29%3B%20%7D%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Handle%20a%20key%20from%20the%20keypress%20event%0A%20%20function%20handleCharBinding%28cm%2C%20e%2C%20ch%29%20%7B%0A%20%20%20%20return%20dispatchKey%28cm%2C%20%22%27%22%20%2B%20ch%20%2B%20%22%27%22%2C%20e%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20function%28b%29%20%7B%20return%20doHandleBinding%28cm%2C%20b%2C%20true%29%3B%20%7D%29%3B%0A%20%20%7D%0A%0A%20%20var%20lastStoppedKey%20%3D%20null%3B%0A%20%20function%20onKeyDown%28e%29%20%7B%0A%20%20%20%20var%20cm%20%3D%20this%3B%0A%20%20%20%20cm%2EcurOp%2Efocus%20%3D%20activeElt%28%29%3B%0A%20%20%20%20if%20%28signalDOMEvent%28cm%2C%20e%29%29%20return%3B%0A%20%20%20%20%2F%2F%20IE%20does%20strange%20things%20with%20escape%2E%0A%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%2011%20%26%26%20e%2EkeyCode%20%3D%3D%2027%29%20e%2EreturnValue%20%3D%20false%3B%0A%20%20%20%20var%20code%20%3D%20e%2EkeyCode%3B%0A%20%20%20%20cm%2Edisplay%2Eshift%20%3D%20code%20%3D%3D%2016%20%7C%7C%20e%2EshiftKey%3B%0A%20%20%20%20var%20handled%20%3D%20handleKeyBinding%28cm%2C%20e%29%3B%0A%20%20%20%20if%20%28presto%29%20%7B%0A%20%20%20%20%20%20lastStoppedKey%20%3D%20handled%20%3F%20code%20%3A%20null%3B%0A%20%20%20%20%20%20%2F%2F%20Opera%20has%20no%20cut%20event%2E%2E%2E%20we%20try%20to%20at%20least%20catch%20the%20key%20combo%0A%20%20%20%20%20%20if%20%28%21handled%20%26%26%20code%20%3D%3D%2088%20%26%26%20%21hasCopyEvent%20%26%26%20%28mac%20%3F%20e%2EmetaKey%20%3A%20e%2EctrlKey%29%29%0A%20%20%20%20%20%20%20%20cm%2EreplaceSelection%28%22%22%2C%20null%2C%20%22cut%22%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Turn%20mouse%20into%20crosshair%20when%20Alt%20is%20held%20on%20Mac%2E%0A%20%20%20%20if%20%28code%20%3D%3D%2018%20%26%26%20%21%2F%5CbCodeMirror%2Dcrosshair%5Cb%2F%2Etest%28cm%2Edisplay%2ElineDiv%2EclassName%29%29%0A%20%20%20%20%20%20showCrossHair%28cm%29%3B%0A%20%20%7D%0A%0A%20%20function%20showCrossHair%28cm%29%20%7B%0A%20%20%20%20var%20lineDiv%20%3D%20cm%2Edisplay%2ElineDiv%3B%0A%20%20%20%20addClass%28lineDiv%2C%20%22CodeMirror%2Dcrosshair%22%29%3B%0A%0A%20%20%20%20function%20up%28e%29%20%7B%0A%20%20%20%20%20%20if%20%28e%2EkeyCode%20%3D%3D%2018%20%7C%7C%20%21e%2EaltKey%29%20%7B%0A%20%20%20%20%20%20%20%20rmClass%28lineDiv%2C%20%22CodeMirror%2Dcrosshair%22%29%3B%0A%20%20%20%20%20%20%20%20off%28document%2C%20%22keyup%22%2C%20up%29%3B%0A%20%20%20%20%20%20%20%20off%28document%2C%20%22mouseover%22%2C%20up%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20on%28document%2C%20%22keyup%22%2C%20up%29%3B%0A%20%20%20%20on%28document%2C%20%22mouseover%22%2C%20up%29%3B%0A%20%20%7D%0A%0A%20%20function%20onKeyUp%28e%29%20%7B%0A%20%20%20%20if%20%28e%2EkeyCode%20%3D%3D%2016%29%20this%2Edoc%2Esel%2Eshift%20%3D%20false%3B%0A%20%20%20%20signalDOMEvent%28this%2C%20e%29%3B%0A%20%20%7D%0A%0A%20%20function%20onKeyPress%28e%29%20%7B%0A%20%20%20%20var%20cm%20%3D%20this%3B%0A%20%20%20%20if%20%28eventInWidget%28cm%2Edisplay%2C%20e%29%20%7C%7C%20signalDOMEvent%28cm%2C%20e%29%20%7C%7C%20e%2EctrlKey%20%26%26%20%21e%2EaltKey%20%7C%7C%20mac%20%26%26%20e%2EmetaKey%29%20return%3B%0A%20%20%20%20var%20keyCode%20%3D%20e%2EkeyCode%2C%20charCode%20%3D%20e%2EcharCode%3B%0A%20%20%20%20if%20%28presto%20%26%26%20keyCode%20%3D%3D%20lastStoppedKey%29%20%7BlastStoppedKey%20%3D%20null%3B%20e%5FpreventDefault%28e%29%3B%20return%3B%7D%0A%20%20%20%20if%20%28%28presto%20%26%26%20%28%21e%2Ewhich%20%7C%7C%20e%2Ewhich%20%3C%2010%29%29%20%26%26%20handleKeyBinding%28cm%2C%20e%29%29%20return%3B%0A%20%20%20%20var%20ch%20%3D%20String%2EfromCharCode%28charCode%20%3D%3D%20null%20%3F%20keyCode%20%3A%20charCode%29%3B%0A%20%20%20%20if%20%28handleCharBinding%28cm%2C%20e%2C%20ch%29%29%20return%3B%0A%20%20%20%20cm%2Edisplay%2Einput%2EonKeyPress%28e%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20FOCUS%2FBLUR%20EVENTS%0A%0A%20%20function%20delayBlurEvent%28cm%29%20%7B%0A%20%20%20%20cm%2Estate%2EdelayingBlurEvent%20%3D%20true%3B%0A%20%20%20%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28cm%2Estate%2EdelayingBlurEvent%29%20%7B%0A%20%20%20%20%20%20%20%20cm%2Estate%2EdelayingBlurEvent%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20onBlur%28cm%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%20100%29%3B%0A%20%20%7D%0A%0A%20%20function%20onFocus%28cm%29%20%7B%0A%20%20%20%20if%20%28cm%2Estate%2EdelayingBlurEvent%29%20cm%2Estate%2EdelayingBlurEvent%20%3D%20false%3B%0A%0A%20%20%20%20if%20%28cm%2Eoptions%2EreadOnly%20%3D%3D%20%22nocursor%22%29%20return%3B%0A%20%20%20%20if%20%28%21cm%2Estate%2Efocused%29%20%7B%0A%20%20%20%20%20%20signal%28cm%2C%20%22focus%22%2C%20cm%29%3B%0A%20%20%20%20%20%20cm%2Estate%2Efocused%20%3D%20true%3B%0A%20%20%20%20%20%20addClass%28cm%2Edisplay%2Ewrapper%2C%20%22CodeMirror%2Dfocused%22%29%3B%0A%20%20%20%20%20%20%2F%2F%20This%20test%20prevents%20this%20from%20firing%20when%20a%20context%0A%20%20%20%20%20%20%2F%2F%20menu%20is%20closed%20%28since%20the%20input%20reset%20would%20kill%20the%0A%20%20%20%20%20%20%2F%2F%20select%2Dall%20detection%20hack%29%0A%20%20%20%20%20%20if%20%28%21cm%2EcurOp%20%26%26%20cm%2Edisplay%2EselForContextMenu%20%21%3D%20cm%2Edoc%2Esel%29%20%7B%0A%20%20%20%20%20%20%20%20cm%2Edisplay%2Einput%2Ereset%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28webkit%29%20setTimeout%28function%28%29%20%7B%20cm%2Edisplay%2Einput%2Ereset%28true%29%3B%20%7D%2C%2020%29%3B%20%2F%2F%20Issue%20%231730%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20cm%2Edisplay%2Einput%2EreceivedFocus%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20restartBlink%28cm%29%3B%0A%20%20%7D%0A%20%20function%20onBlur%28cm%29%20%7B%0A%20%20%20%20if%20%28cm%2Estate%2EdelayingBlurEvent%29%20return%3B%0A%0A%20%20%20%20if%20%28cm%2Estate%2Efocused%29%20%7B%0A%20%20%20%20%20%20signal%28cm%2C%20%22blur%22%2C%20cm%29%3B%0A%20%20%20%20%20%20cm%2Estate%2Efocused%20%3D%20false%3B%0A%20%20%20%20%20%20rmClass%28cm%2Edisplay%2Ewrapper%2C%20%22CodeMirror%2Dfocused%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20clearInterval%28cm%2Edisplay%2Eblinker%29%3B%0A%20%20%20%20setTimeout%28function%28%29%20%7Bif%20%28%21cm%2Estate%2Efocused%29%20cm%2Edisplay%2Eshift%20%3D%20false%3B%7D%2C%20150%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20CONTEXT%20MENU%20HANDLING%0A%0A%20%20%2F%2F%20To%20make%20the%20context%20menu%20work%2C%20we%20need%20to%20briefly%20unhide%20the%0A%20%20%2F%2F%20textarea%20%28making%20it%20as%20unobtrusive%20as%20possible%29%20to%20let%20the%0A%20%20%2F%2F%20right%2Dclick%20take%20effect%20on%20it%2E%0A%20%20function%20onContextMenu%28cm%2C%20e%29%20%7B%0A%20%20%20%20if%20%28eventInWidget%28cm%2Edisplay%2C%20e%29%20%7C%7C%20contextMenuInGutter%28cm%2C%20e%29%29%20return%3B%0A%20%20%20%20if%20%28signalDOMEvent%28cm%2C%20e%2C%20%22contextmenu%22%29%29%20return%3B%0A%20%20%20%20cm%2Edisplay%2Einput%2EonContextMenu%28e%29%3B%0A%20%20%7D%0A%0A%20%20function%20contextMenuInGutter%28cm%2C%20e%29%20%7B%0A%20%20%20%20if%20%28%21hasHandler%28cm%2C%20%22gutterContextMenu%22%29%29%20return%20false%3B%0A%20%20%20%20return%20gutterEvent%28cm%2C%20e%2C%20%22gutterContextMenu%22%2C%20false%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20UPDATING%0A%0A%20%20%2F%2F%20Compute%20the%20position%20of%20the%20end%20of%20a%20change%20%28its%20%27to%27%20property%0A%20%20%2F%2F%20refers%20to%20the%20pre%2Dchange%20end%29%2E%0A%20%20var%20changeEnd%20%3D%20CodeMirror%2EchangeEnd%20%3D%20function%28change%29%20%7B%0A%20%20%20%20if%20%28%21change%2Etext%29%20return%20change%2Eto%3B%0A%20%20%20%20return%20Pos%28change%2Efrom%2Eline%20%2B%20change%2Etext%2Elength%20%2D%201%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lst%28change%2Etext%29%2Elength%20%2B%20%28change%2Etext%2Elength%20%3D%3D%201%20%3F%20change%2Efrom%2Ech%20%3A%200%29%29%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Adjust%20a%20position%20to%20refer%20to%20the%20post%2Dchange%20position%20of%20the%0A%20%20%2F%2F%20same%20text%2C%20or%20the%20end%20of%20the%20change%20if%20the%20change%20covers%20it%2E%0A%20%20function%20adjustForChange%28pos%2C%20change%29%20%7B%0A%20%20%20%20if%20%28cmp%28pos%2C%20change%2Efrom%29%20%3C%200%29%20return%20pos%3B%0A%20%20%20%20if%20%28cmp%28pos%2C%20change%2Eto%29%20%3C%3D%200%29%20return%20changeEnd%28change%29%3B%0A%0A%20%20%20%20var%20line%20%3D%20pos%2Eline%20%2B%20change%2Etext%2Elength%20%2D%20%28change%2Eto%2Eline%20%2D%20change%2Efrom%2Eline%29%20%2D%201%2C%20ch%20%3D%20pos%2Ech%3B%0A%20%20%20%20if%20%28pos%2Eline%20%3D%3D%20change%2Eto%2Eline%29%20ch%20%2B%3D%20changeEnd%28change%29%2Ech%20%2D%20change%2Eto%2Ech%3B%0A%20%20%20%20return%20Pos%28line%2C%20ch%29%3B%0A%20%20%7D%0A%0A%20%20function%20computeSelAfterChange%28doc%2C%20change%29%20%7B%0A%20%20%20%20var%20out%20%3D%20%5B%5D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20doc%2Esel%2Eranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20range%20%3D%20doc%2Esel%2Eranges%5Bi%5D%3B%0A%20%20%20%20%20%20out%2Epush%28new%20Range%28adjustForChange%28range%2Eanchor%2C%20change%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20adjustForChange%28range%2Ehead%2C%20change%29%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20normalizeSelection%28out%2C%20doc%2Esel%2EprimIndex%29%3B%0A%20%20%7D%0A%0A%20%20function%20offsetPos%28pos%2C%20old%2C%20nw%29%20%7B%0A%20%20%20%20if%20%28pos%2Eline%20%3D%3D%20old%2Eline%29%0A%20%20%20%20%20%20return%20Pos%28nw%2Eline%2C%20pos%2Ech%20%2D%20old%2Ech%20%2B%20nw%2Ech%29%3B%0A%20%20%20%20else%0A%20%20%20%20%20%20return%20Pos%28nw%2Eline%20%2B%20%28pos%2Eline%20%2D%20old%2Eline%29%2C%20pos%2Ech%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Used%20by%20replaceSelections%20to%20allow%20moving%20the%20selection%20to%20the%0A%20%20%2F%2F%20start%20or%20around%20the%20replaced%20test%2E%20Hint%20may%20be%20%22start%22%20or%20%22around%22%2E%0A%20%20function%20computeReplacedSel%28doc%2C%20changes%2C%20hint%29%20%7B%0A%20%20%20%20var%20out%20%3D%20%5B%5D%3B%0A%20%20%20%20var%20oldPrev%20%3D%20Pos%28doc%2Efirst%2C%200%29%2C%20newPrev%20%3D%20oldPrev%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20changes%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20change%20%3D%20changes%5Bi%5D%3B%0A%20%20%20%20%20%20var%20from%20%3D%20offsetPos%28change%2Efrom%2C%20oldPrev%2C%20newPrev%29%3B%0A%20%20%20%20%20%20var%20to%20%3D%20offsetPos%28changeEnd%28change%29%2C%20oldPrev%2C%20newPrev%29%3B%0A%20%20%20%20%20%20oldPrev%20%3D%20change%2Eto%3B%0A%20%20%20%20%20%20newPrev%20%3D%20to%3B%0A%20%20%20%20%20%20if%20%28hint%20%3D%3D%20%22around%22%29%20%7B%0A%20%20%20%20%20%20%20%20var%20range%20%3D%20doc%2Esel%2Eranges%5Bi%5D%2C%20inv%20%3D%20cmp%28range%2Ehead%2C%20range%2Eanchor%29%20%3C%200%3B%0A%20%20%20%20%20%20%20%20out%5Bi%5D%20%3D%20new%20Range%28inv%20%3F%20to%20%3A%20from%2C%20inv%20%3F%20from%20%3A%20to%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20out%5Bi%5D%20%3D%20new%20Range%28from%2C%20from%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20new%20Selection%28out%2C%20doc%2Esel%2EprimIndex%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Allow%20%22beforeChange%22%20event%20handlers%20to%20influence%20a%20change%0A%20%20function%20filterChange%28doc%2C%20change%2C%20update%29%20%7B%0A%20%20%20%20var%20obj%20%3D%20%7B%0A%20%20%20%20%20%20canceled%3A%20false%2C%0A%20%20%20%20%20%20from%3A%20change%2Efrom%2C%0A%20%20%20%20%20%20to%3A%20change%2Eto%2C%0A%20%20%20%20%20%20text%3A%20change%2Etext%2C%0A%20%20%20%20%20%20origin%3A%20change%2Eorigin%2C%0A%20%20%20%20%20%20cancel%3A%20function%28%29%20%7B%20this%2Ecanceled%20%3D%20true%3B%20%7D%0A%20%20%20%20%7D%3B%0A%20%20%20%20if%20%28update%29%20obj%2Eupdate%20%3D%20function%28from%2C%20to%2C%20text%2C%20origin%29%20%7B%0A%20%20%20%20%20%20if%20%28from%29%20this%2Efrom%20%3D%20clipPos%28doc%2C%20from%29%3B%0A%20%20%20%20%20%20if%20%28to%29%20this%2Eto%20%3D%20clipPos%28doc%2C%20to%29%3B%0A%20%20%20%20%20%20if%20%28text%29%20this%2Etext%20%3D%20text%3B%0A%20%20%20%20%20%20if%20%28origin%20%21%3D%3D%20undefined%29%20this%2Eorigin%20%3D%20origin%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20signal%28doc%2C%20%22beforeChange%22%2C%20doc%2C%20obj%29%3B%0A%20%20%20%20if%20%28doc%2Ecm%29%20signal%28doc%2Ecm%2C%20%22beforeChange%22%2C%20doc%2Ecm%2C%20obj%29%3B%0A%0A%20%20%20%20if%20%28obj%2Ecanceled%29%20return%20null%3B%0A%20%20%20%20return%20%7Bfrom%3A%20obj%2Efrom%2C%20to%3A%20obj%2Eto%2C%20text%3A%20obj%2Etext%2C%20origin%3A%20obj%2Eorigin%7D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Apply%20a%20change%20to%20a%20document%2C%20and%20add%20it%20to%20the%20document%27s%0A%20%20%2F%2F%20history%2C%20and%20propagating%20it%20to%20all%20linked%20documents%2E%0A%20%20function%20makeChange%28doc%2C%20change%2C%20ignoreReadOnly%29%20%7B%0A%20%20%20%20if%20%28doc%2Ecm%29%20%7B%0A%20%20%20%20%20%20if%20%28%21doc%2Ecm%2EcurOp%29%20return%20operation%28doc%2Ecm%2C%20makeChange%29%28doc%2C%20change%2C%20ignoreReadOnly%29%3B%0A%20%20%20%20%20%20if%20%28doc%2Ecm%2Estate%2EsuppressEdits%29%20return%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28hasHandler%28doc%2C%20%22beforeChange%22%29%20%7C%7C%20doc%2Ecm%20%26%26%20hasHandler%28doc%2Ecm%2C%20%22beforeChange%22%29%29%20%7B%0A%20%20%20%20%20%20change%20%3D%20filterChange%28doc%2C%20change%2C%20true%29%3B%0A%20%20%20%20%20%20if%20%28%21change%29%20return%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Possibly%20split%20or%20suppress%20the%20update%20based%20on%20the%20presence%0A%20%20%20%20%2F%2F%20of%20read%2Donly%20spans%20in%20its%20range%2E%0A%20%20%20%20var%20split%20%3D%20sawReadOnlySpans%20%26%26%20%21ignoreReadOnly%20%26%26%20removeReadOnlyRanges%28doc%2C%20change%2Efrom%2C%20change%2Eto%29%3B%0A%20%20%20%20if%20%28split%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%20split%2Elength%20%2D%201%3B%20i%20%3E%3D%200%3B%20%2D%2Di%29%0A%20%20%20%20%20%20%20%20makeChangeInner%28doc%2C%20%7Bfrom%3A%20split%5Bi%5D%2Efrom%2C%20to%3A%20split%5Bi%5D%2Eto%2C%20text%3A%20i%20%3F%20%5B%22%22%5D%20%3A%20change%2Etext%7D%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20makeChangeInner%28doc%2C%20change%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20makeChangeInner%28doc%2C%20change%29%20%7B%0A%20%20%20%20if%20%28change%2Etext%2Elength%20%3D%3D%201%20%26%26%20change%2Etext%5B0%5D%20%3D%3D%20%22%22%20%26%26%20cmp%28change%2Efrom%2C%20change%2Eto%29%20%3D%3D%200%29%20return%3B%0A%20%20%20%20var%20selAfter%20%3D%20computeSelAfterChange%28doc%2C%20change%29%3B%0A%20%20%20%20addChangeToHistory%28doc%2C%20change%2C%20selAfter%2C%20doc%2Ecm%20%3F%20doc%2Ecm%2EcurOp%2Eid%20%3A%20NaN%29%3B%0A%0A%20%20%20%20makeChangeSingleDoc%28doc%2C%20change%2C%20selAfter%2C%20stretchSpansOverChange%28doc%2C%20change%29%29%3B%0A%20%20%20%20var%20rebased%20%3D%20%5B%5D%3B%0A%0A%20%20%20%20linkedDocs%28doc%2C%20function%28doc%2C%20sharedHist%29%20%7B%0A%20%20%20%20%20%20if%20%28%21sharedHist%20%26%26%20indexOf%28rebased%2C%20doc%2Ehistory%29%20%3D%3D%20%2D1%29%20%7B%0A%20%20%20%20%20%20%20%20rebaseHist%28doc%2Ehistory%2C%20change%29%3B%0A%20%20%20%20%20%20%20%20rebased%2Epush%28doc%2Ehistory%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20makeChangeSingleDoc%28doc%2C%20change%2C%20null%2C%20stretchSpansOverChange%28doc%2C%20change%29%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Revert%20a%20change%20stored%20in%20a%20document%27s%20history%2E%0A%20%20function%20makeChangeFromHistory%28doc%2C%20type%2C%20allowSelectionOnly%29%20%7B%0A%20%20%20%20if%20%28doc%2Ecm%20%26%26%20doc%2Ecm%2Estate%2EsuppressEdits%29%20return%3B%0A%0A%20%20%20%20var%20hist%20%3D%20doc%2Ehistory%2C%20event%2C%20selAfter%20%3D%20doc%2Esel%3B%0A%20%20%20%20var%20source%20%3D%20type%20%3D%3D%20%22undo%22%20%3F%20hist%2Edone%20%3A%20hist%2Eundone%2C%20dest%20%3D%20type%20%3D%3D%20%22undo%22%20%3F%20hist%2Eundone%20%3A%20hist%2Edone%3B%0A%0A%20%20%20%20%2F%2F%20Verify%20that%20there%20is%20a%20useable%20event%20%28so%20that%20ctrl%2Dz%20won%27t%0A%20%20%20%20%2F%2F%20needlessly%20clear%20selection%20events%29%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20source%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20event%20%3D%20source%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28allowSelectionOnly%20%3F%20event%2Eranges%20%26%26%20%21event%2Eequals%28doc%2Esel%29%20%3A%20%21event%2Eranges%29%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28i%20%3D%3D%20source%2Elength%29%20return%3B%0A%20%20%20%20hist%2ElastOrigin%20%3D%20hist%2ElastSelOrigin%20%3D%20null%3B%0A%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20event%20%3D%20source%2Epop%28%29%3B%0A%20%20%20%20%20%20if%20%28event%2Eranges%29%20%7B%0A%20%20%20%20%20%20%20%20pushSelectionToHistory%28event%2C%20dest%29%3B%0A%20%20%20%20%20%20%20%20if%20%28allowSelectionOnly%20%26%26%20%21event%2Eequals%28doc%2Esel%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20setSelection%28doc%2C%20event%2C%20%7BclearRedo%3A%20false%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20selAfter%20%3D%20event%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20else%20break%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Build%20up%20a%20reverse%20change%20object%20to%20add%20to%20the%20opposite%20history%0A%20%20%20%20%2F%2F%20stack%20%28redo%20when%20undoing%2C%20and%20vice%20versa%29%2E%0A%20%20%20%20var%20antiChanges%20%3D%20%5B%5D%3B%0A%20%20%20%20pushSelectionToHistory%28selAfter%2C%20dest%29%3B%0A%20%20%20%20dest%2Epush%28%7Bchanges%3A%20antiChanges%2C%20generation%3A%20hist%2Egeneration%7D%29%3B%0A%20%20%20%20hist%2Egeneration%20%3D%20event%2Egeneration%20%7C%7C%20%2B%2Bhist%2EmaxGeneration%3B%0A%0A%20%20%20%20var%20filter%20%3D%20hasHandler%28doc%2C%20%22beforeChange%22%29%20%7C%7C%20doc%2Ecm%20%26%26%20hasHandler%28doc%2Ecm%2C%20%22beforeChange%22%29%3B%0A%0A%20%20%20%20for%20%28var%20i%20%3D%20event%2Echanges%2Elength%20%2D%201%3B%20i%20%3E%3D%200%3B%20%2D%2Di%29%20%7B%0A%20%20%20%20%20%20var%20change%20%3D%20event%2Echanges%5Bi%5D%3B%0A%20%20%20%20%20%20change%2Eorigin%20%3D%20type%3B%0A%20%20%20%20%20%20if%20%28filter%20%26%26%20%21filterChange%28doc%2C%20change%2C%20false%29%29%20%7B%0A%20%20%20%20%20%20%20%20source%2Elength%20%3D%200%3B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20antiChanges%2Epush%28historyChangeFromChange%28doc%2C%20change%29%29%3B%0A%0A%20%20%20%20%20%20var%20after%20%3D%20i%20%3F%20computeSelAfterChange%28doc%2C%20change%29%20%3A%20lst%28source%29%3B%0A%20%20%20%20%20%20makeChangeSingleDoc%28doc%2C%20change%2C%20after%2C%20mergeOldSpans%28doc%2C%20change%29%29%3B%0A%20%20%20%20%20%20if%20%28%21i%20%26%26%20doc%2Ecm%29%20doc%2Ecm%2EscrollIntoView%28%7Bfrom%3A%20change%2Efrom%2C%20to%3A%20changeEnd%28change%29%7D%29%3B%0A%20%20%20%20%20%20var%20rebased%20%3D%20%5B%5D%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Propagate%20to%20the%20linked%20documents%0A%20%20%20%20%20%20linkedDocs%28doc%2C%20function%28doc%2C%20sharedHist%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21sharedHist%20%26%26%20indexOf%28rebased%2C%20doc%2Ehistory%29%20%3D%3D%20%2D1%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20rebaseHist%28doc%2Ehistory%2C%20change%29%3B%0A%20%20%20%20%20%20%20%20%20%20rebased%2Epush%28doc%2Ehistory%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20makeChangeSingleDoc%28doc%2C%20change%2C%20null%2C%20mergeOldSpans%28doc%2C%20change%29%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Sub%2Dviews%20need%20their%20line%20numbers%20shifted%20when%20text%20is%20added%0A%20%20%2F%2F%20above%20or%20below%20them%20in%20the%20parent%20document%2E%0A%20%20function%20shiftDoc%28doc%2C%20distance%29%20%7B%0A%20%20%20%20if%20%28distance%20%3D%3D%200%29%20return%3B%0A%20%20%20%20doc%2Efirst%20%2B%3D%20distance%3B%0A%20%20%20%20doc%2Esel%20%3D%20new%20Selection%28map%28doc%2Esel%2Eranges%2C%20function%28range%29%20%7B%0A%20%20%20%20%20%20return%20new%20Range%28Pos%28range%2Eanchor%2Eline%20%2B%20distance%2C%20range%2Eanchor%2Ech%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Pos%28range%2Ehead%2Eline%20%2B%20distance%2C%20range%2Ehead%2Ech%29%29%3B%0A%20%20%20%20%7D%29%2C%20doc%2Esel%2EprimIndex%29%3B%0A%20%20%20%20if%20%28doc%2Ecm%29%20%7B%0A%20%20%20%20%20%20regChange%28doc%2Ecm%2C%20doc%2Efirst%2C%20doc%2Efirst%20%2D%20distance%2C%20distance%29%3B%0A%20%20%20%20%20%20for%20%28var%20d%20%3D%20doc%2Ecm%2Edisplay%2C%20l%20%3D%20d%2EviewFrom%3B%20l%20%3C%20d%2EviewTo%3B%20l%2B%2B%29%0A%20%20%20%20%20%20%20%20regLineChange%28doc%2Ecm%2C%20l%2C%20%22gutter%22%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20More%20lower%2Dlevel%20change%20function%2C%20handling%20only%20a%20single%20document%0A%20%20%2F%2F%20%28not%20linked%20ones%29%2E%0A%20%20function%20makeChangeSingleDoc%28doc%2C%20change%2C%20selAfter%2C%20spans%29%20%7B%0A%20%20%20%20if%20%28doc%2Ecm%20%26%26%20%21doc%2Ecm%2EcurOp%29%0A%20%20%20%20%20%20return%20operation%28doc%2Ecm%2C%20makeChangeSingleDoc%29%28doc%2C%20change%2C%20selAfter%2C%20spans%29%3B%0A%0A%20%20%20%20if%20%28change%2Eto%2Eline%20%3C%20doc%2Efirst%29%20%7B%0A%20%20%20%20%20%20shiftDoc%28doc%2C%20change%2Etext%2Elength%20%2D%201%20%2D%20%28change%2Eto%2Eline%20%2D%20change%2Efrom%2Eline%29%29%3B%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28change%2Efrom%2Eline%20%3E%20doc%2ElastLine%28%29%29%20return%3B%0A%0A%20%20%20%20%2F%2F%20Clip%20the%20change%20to%20the%20size%20of%20this%20doc%0A%20%20%20%20if%20%28change%2Efrom%2Eline%20%3C%20doc%2Efirst%29%20%7B%0A%20%20%20%20%20%20var%20shift%20%3D%20change%2Etext%2Elength%20%2D%201%20%2D%20%28doc%2Efirst%20%2D%20change%2Efrom%2Eline%29%3B%0A%20%20%20%20%20%20shiftDoc%28doc%2C%20shift%29%3B%0A%20%20%20%20%20%20change%20%3D%20%7Bfrom%3A%20Pos%28doc%2Efirst%2C%200%29%2C%20to%3A%20Pos%28change%2Eto%2Eline%20%2B%20shift%2C%20change%2Eto%2Ech%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%5Blst%28change%2Etext%29%5D%2C%20origin%3A%20change%2Eorigin%7D%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20last%20%3D%20doc%2ElastLine%28%29%3B%0A%20%20%20%20if%20%28change%2Eto%2Eline%20%3E%20last%29%20%7B%0A%20%20%20%20%20%20change%20%3D%20%7Bfrom%3A%20change%2Efrom%2C%20to%3A%20Pos%28last%2C%20getLine%28doc%2C%20last%29%2Etext%2Elength%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%5Bchange%2Etext%5B0%5D%5D%2C%20origin%3A%20change%2Eorigin%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20change%2Eremoved%20%3D%20getBetween%28doc%2C%20change%2Efrom%2C%20change%2Eto%29%3B%0A%0A%20%20%20%20if%20%28%21selAfter%29%20selAfter%20%3D%20computeSelAfterChange%28doc%2C%20change%29%3B%0A%20%20%20%20if%20%28doc%2Ecm%29%20makeChangeSingleDocInEditor%28doc%2Ecm%2C%20change%2C%20spans%29%3B%0A%20%20%20%20else%20updateDoc%28doc%2C%20change%2C%20spans%29%3B%0A%20%20%20%20setSelectionNoUndo%28doc%2C%20selAfter%2C%20sel%5FdontScroll%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Handle%20the%20interaction%20of%20a%20change%20to%20a%20document%20with%20the%20editor%0A%20%20%2F%2F%20that%20this%20document%20is%20part%20of%2E%0A%20%20function%20makeChangeSingleDocInEditor%28cm%2C%20change%2C%20spans%29%20%7B%0A%20%20%20%20var%20doc%20%3D%20cm%2Edoc%2C%20display%20%3D%20cm%2Edisplay%2C%20from%20%3D%20change%2Efrom%2C%20to%20%3D%20change%2Eto%3B%0A%0A%20%20%20%20var%20recomputeMaxLength%20%3D%20false%2C%20checkWidthStart%20%3D%20from%2Eline%3B%0A%20%20%20%20if%20%28%21cm%2Eoptions%2ElineWrapping%29%20%7B%0A%20%20%20%20%20%20checkWidthStart%20%3D%20lineNo%28visualLine%28getLine%28doc%2C%20from%2Eline%29%29%29%3B%0A%20%20%20%20%20%20doc%2Eiter%28checkWidthStart%2C%20to%2Eline%20%2B%201%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28line%20%3D%3D%20display%2EmaxLine%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20recomputeMaxLength%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28doc%2Esel%2Econtains%28change%2Efrom%2C%20change%2Eto%29%20%3E%20%2D1%29%0A%20%20%20%20%20%20signalCursorActivity%28cm%29%3B%0A%0A%20%20%20%20updateDoc%28doc%2C%20change%2C%20spans%2C%20estimateHeight%28cm%29%29%3B%0A%0A%20%20%20%20if%20%28%21cm%2Eoptions%2ElineWrapping%29%20%7B%0A%20%20%20%20%20%20doc%2Eiter%28checkWidthStart%2C%20from%2Eline%20%2B%20change%2Etext%2Elength%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20%20%20var%20len%20%3D%20lineLength%28line%29%3B%0A%20%20%20%20%20%20%20%20if%20%28len%20%3E%20display%2EmaxLineLength%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20display%2EmaxLine%20%3D%20line%3B%0A%20%20%20%20%20%20%20%20%20%20display%2EmaxLineLength%20%3D%20len%3B%0A%20%20%20%20%20%20%20%20%20%20display%2EmaxLineChanged%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20recomputeMaxLength%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20if%20%28recomputeMaxLength%29%20cm%2EcurOp%2EupdateMaxLine%20%3D%20true%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Adjust%20frontier%2C%20schedule%20worker%0A%20%20%20%20doc%2Efrontier%20%3D%20Math%2Emin%28doc%2Efrontier%2C%20from%2Eline%29%3B%0A%20%20%20%20startWorker%28cm%2C%20400%29%3B%0A%0A%20%20%20%20var%20lendiff%20%3D%20change%2Etext%2Elength%20%2D%20%28to%2Eline%20%2D%20from%2Eline%29%20%2D%201%3B%0A%20%20%20%20%2F%2F%20Remember%20that%20these%20lines%20changed%2C%20for%20updating%20the%20display%0A%20%20%20%20if%20%28change%2Efull%29%0A%20%20%20%20%20%20regChange%28cm%29%3B%0A%20%20%20%20else%20if%20%28from%2Eline%20%3D%3D%20to%2Eline%20%26%26%20change%2Etext%2Elength%20%3D%3D%201%20%26%26%20%21isWholeLineUpdate%28cm%2Edoc%2C%20change%29%29%0A%20%20%20%20%20%20regLineChange%28cm%2C%20from%2Eline%2C%20%22text%22%29%3B%0A%20%20%20%20else%0A%20%20%20%20%20%20regChange%28cm%2C%20from%2Eline%2C%20to%2Eline%20%2B%201%2C%20lendiff%29%3B%0A%0A%20%20%20%20var%20changesHandler%20%3D%20hasHandler%28cm%2C%20%22changes%22%29%2C%20changeHandler%20%3D%20hasHandler%28cm%2C%20%22change%22%29%3B%0A%20%20%20%20if%20%28changeHandler%20%7C%7C%20changesHandler%29%20%7B%0A%20%20%20%20%20%20var%20obj%20%3D%20%7B%0A%20%20%20%20%20%20%20%20from%3A%20from%2C%20to%3A%20to%2C%0A%20%20%20%20%20%20%20%20text%3A%20change%2Etext%2C%0A%20%20%20%20%20%20%20%20removed%3A%20change%2Eremoved%2C%0A%20%20%20%20%20%20%20%20origin%3A%20change%2Eorigin%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20if%20%28changeHandler%29%20signalLater%28cm%2C%20%22change%22%2C%20cm%2C%20obj%29%3B%0A%20%20%20%20%20%20if%20%28changesHandler%29%20%28cm%2EcurOp%2EchangeObjs%20%7C%7C%20%28cm%2EcurOp%2EchangeObjs%20%3D%20%5B%5D%29%29%2Epush%28obj%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20cm%2Edisplay%2EselForContextMenu%20%3D%20null%3B%0A%20%20%7D%0A%0A%20%20function%20replaceRange%28doc%2C%20code%2C%20from%2C%20to%2C%20origin%29%20%7B%0A%20%20%20%20if%20%28%21to%29%20to%20%3D%20from%3B%0A%20%20%20%20if%20%28cmp%28to%2C%20from%29%20%3C%200%29%20%7B%20var%20tmp%20%3D%20to%3B%20to%20%3D%20from%3B%20from%20%3D%20tmp%3B%20%7D%0A%20%20%20%20if%20%28typeof%20code%20%3D%3D%20%22string%22%29%20code%20%3D%20doc%2EsplitLines%28code%29%3B%0A%20%20%20%20makeChange%28doc%2C%20%7Bfrom%3A%20from%2C%20to%3A%20to%2C%20text%3A%20code%2C%20origin%3A%20origin%7D%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20SCROLLING%20THINGS%20INTO%20VIEW%0A%0A%20%20%2F%2F%20If%20an%20editor%20sits%20on%20the%20top%20or%20bottom%20of%20the%20window%2C%20partially%0A%20%20%2F%2F%20scrolled%20out%20of%20view%2C%20this%20ensures%20that%20the%20cursor%20is%20visible%2E%0A%20%20function%20maybeScrollWindow%28cm%2C%20coords%29%20%7B%0A%20%20%20%20if%20%28signalDOMEvent%28cm%2C%20%22scrollCursorIntoView%22%29%29%20return%3B%0A%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%2C%20box%20%3D%20display%2Esizer%2EgetBoundingClientRect%28%29%2C%20doScroll%20%3D%20null%3B%0A%20%20%20%20if%20%28coords%2Etop%20%2B%20box%2Etop%20%3C%200%29%20doScroll%20%3D%20true%3B%0A%20%20%20%20else%20if%20%28coords%2Ebottom%20%2B%20box%2Etop%20%3E%20%28window%2EinnerHeight%20%7C%7C%20document%2EdocumentElement%2EclientHeight%29%29%20doScroll%20%3D%20false%3B%0A%20%20%20%20if%20%28doScroll%20%21%3D%20null%20%26%26%20%21phantom%29%20%7B%0A%20%20%20%20%20%20var%20scrollNode%20%3D%20elt%28%22div%22%2C%20%22%5Cu200b%22%2C%20null%2C%20%22position%3A%20absolute%3B%20top%3A%20%22%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28coords%2Etop%20%2D%20display%2EviewOffset%20%2D%20paddingTop%28cm%2Edisplay%29%29%20%2B%20%22px%3B%20height%3A%20%22%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28coords%2Ebottom%20%2D%20coords%2Etop%20%2B%20scrollGap%28cm%29%20%2B%20display%2EbarHeight%29%20%2B%20%22px%3B%20left%3A%20%22%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20coords%2Eleft%20%2B%20%22px%3B%20width%3A%202px%3B%22%29%3B%0A%20%20%20%20%20%20cm%2Edisplay%2ElineSpace%2EappendChild%28scrollNode%29%3B%0A%20%20%20%20%20%20scrollNode%2EscrollIntoView%28doScroll%29%3B%0A%20%20%20%20%20%20cm%2Edisplay%2ElineSpace%2EremoveChild%28scrollNode%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Scroll%20a%20given%20position%20into%20view%20%28immediately%29%2C%20verifying%20that%0A%20%20%2F%2F%20it%20actually%20became%20visible%20%28as%20line%20heights%20are%20accurately%0A%20%20%2F%2F%20measured%2C%20the%20position%20of%20something%20may%20%27drift%27%20during%20drawing%29%2E%0A%20%20function%20scrollPosIntoView%28cm%2C%20pos%2C%20end%2C%20margin%29%20%7B%0A%20%20%20%20if%20%28margin%20%3D%3D%20null%29%20margin%20%3D%200%3B%0A%20%20%20%20for%20%28var%20limit%20%3D%200%3B%20limit%20%3C%205%3B%20limit%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20changed%20%3D%20false%2C%20coords%20%3D%20cursorCoords%28cm%2C%20pos%29%3B%0A%20%20%20%20%20%20var%20endCoords%20%3D%20%21end%20%7C%7C%20end%20%3D%3D%20pos%20%3F%20coords%20%3A%20cursorCoords%28cm%2C%20end%29%3B%0A%20%20%20%20%20%20var%20scrollPos%20%3D%20calculateScrollPos%28cm%2C%20Math%2Emin%28coords%2Eleft%2C%20endCoords%2Eleft%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Math%2Emin%28coords%2Etop%2C%20endCoords%2Etop%29%20%2D%20margin%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Math%2Emax%28coords%2Eleft%2C%20endCoords%2Eleft%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Math%2Emax%28coords%2Ebottom%2C%20endCoords%2Ebottom%29%20%2B%20margin%29%3B%0A%20%20%20%20%20%20var%20startTop%20%3D%20cm%2Edoc%2EscrollTop%2C%20startLeft%20%3D%20cm%2Edoc%2EscrollLeft%3B%0A%20%20%20%20%20%20if%20%28scrollPos%2EscrollTop%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20setScrollTop%28cm%2C%20scrollPos%2EscrollTop%29%3B%0A%20%20%20%20%20%20%20%20if%20%28Math%2Eabs%28cm%2Edoc%2EscrollTop%20%2D%20startTop%29%20%3E%201%29%20changed%20%3D%20true%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28scrollPos%2EscrollLeft%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20setScrollLeft%28cm%2C%20scrollPos%2EscrollLeft%29%3B%0A%20%20%20%20%20%20%20%20if%20%28Math%2Eabs%28cm%2Edoc%2EscrollLeft%20%2D%20startLeft%29%20%3E%201%29%20changed%20%3D%20true%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28%21changed%29%20break%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20coords%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Scroll%20a%20given%20set%20of%20coordinates%20into%20view%20%28immediately%29%2E%0A%20%20function%20scrollIntoView%28cm%2C%20x1%2C%20y1%2C%20x2%2C%20y2%29%20%7B%0A%20%20%20%20var%20scrollPos%20%3D%20calculateScrollPos%28cm%2C%20x1%2C%20y1%2C%20x2%2C%20y2%29%3B%0A%20%20%20%20if%20%28scrollPos%2EscrollTop%20%21%3D%20null%29%20setScrollTop%28cm%2C%20scrollPos%2EscrollTop%29%3B%0A%20%20%20%20if%20%28scrollPos%2EscrollLeft%20%21%3D%20null%29%20setScrollLeft%28cm%2C%20scrollPos%2EscrollLeft%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Calculate%20a%20new%20scroll%20position%20needed%20to%20scroll%20the%20given%0A%20%20%2F%2F%20rectangle%20into%20view%2E%20Returns%20an%20object%20with%20scrollTop%20and%0A%20%20%2F%2F%20scrollLeft%20properties%2E%20When%20these%20are%20undefined%2C%20the%0A%20%20%2F%2F%20vertical%2Fhorizontal%20position%20does%20not%20need%20to%20be%20adjusted%2E%0A%20%20function%20calculateScrollPos%28cm%2C%20x1%2C%20y1%2C%20x2%2C%20y2%29%20%7B%0A%20%20%20%20var%20display%20%3D%20cm%2Edisplay%2C%20snapMargin%20%3D%20textHeight%28cm%2Edisplay%29%3B%0A%20%20%20%20if%20%28y1%20%3C%200%29%20y1%20%3D%200%3B%0A%20%20%20%20var%20screentop%20%3D%20cm%2EcurOp%20%26%26%20cm%2EcurOp%2EscrollTop%20%21%3D%20null%20%3F%20cm%2EcurOp%2EscrollTop%20%3A%20display%2Escroller%2EscrollTop%3B%0A%20%20%20%20var%20screen%20%3D%20displayHeight%28cm%29%2C%20result%20%3D%20%7B%7D%3B%0A%20%20%20%20if%20%28y2%20%2D%20y1%20%3E%20screen%29%20y2%20%3D%20y1%20%2B%20screen%3B%0A%20%20%20%20var%20docBottom%20%3D%20cm%2Edoc%2Eheight%20%2B%20paddingVert%28display%29%3B%0A%20%20%20%20var%20atTop%20%3D%20y1%20%3C%20snapMargin%2C%20atBottom%20%3D%20y2%20%3E%20docBottom%20%2D%20snapMargin%3B%0A%20%20%20%20if%20%28y1%20%3C%20screentop%29%20%7B%0A%20%20%20%20%20%20result%2EscrollTop%20%3D%20atTop%20%3F%200%20%3A%20y1%3B%0A%20%20%20%20%7D%20else%20if%20%28y2%20%3E%20screentop%20%2B%20screen%29%20%7B%0A%20%20%20%20%20%20var%20newTop%20%3D%20Math%2Emin%28y1%2C%20%28atBottom%20%3F%20docBottom%20%3A%20y2%29%20%2D%20screen%29%3B%0A%20%20%20%20%20%20if%20%28newTop%20%21%3D%20screentop%29%20result%2EscrollTop%20%3D%20newTop%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20screenleft%20%3D%20cm%2EcurOp%20%26%26%20cm%2EcurOp%2EscrollLeft%20%21%3D%20null%20%3F%20cm%2EcurOp%2EscrollLeft%20%3A%20display%2Escroller%2EscrollLeft%3B%0A%20%20%20%20var%20screenw%20%3D%20displayWidth%28cm%29%20%2D%20%28cm%2Eoptions%2EfixedGutter%20%3F%20display%2Egutters%2EoffsetWidth%20%3A%200%29%3B%0A%20%20%20%20var%20tooWide%20%3D%20x2%20%2D%20x1%20%3E%20screenw%3B%0A%20%20%20%20if%20%28tooWide%29%20x2%20%3D%20x1%20%2B%20screenw%3B%0A%20%20%20%20if%20%28x1%20%3C%2010%29%0A%20%20%20%20%20%20result%2EscrollLeft%20%3D%200%3B%0A%20%20%20%20else%20if%20%28x1%20%3C%20screenleft%29%0A%20%20%20%20%20%20result%2EscrollLeft%20%3D%20Math%2Emax%280%2C%20x1%20%2D%20%28tooWide%20%3F%200%20%3A%2010%29%29%3B%0A%20%20%20%20else%20if%20%28x2%20%3E%20screenw%20%2B%20screenleft%20%2D%203%29%0A%20%20%20%20%20%20result%2EscrollLeft%20%3D%20x2%20%2B%20%28tooWide%20%3F%200%20%3A%2010%29%20%2D%20screenw%3B%0A%20%20%20%20return%20result%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Store%20a%20relative%20adjustment%20to%20the%20scroll%20position%20in%20the%20current%0A%20%20%2F%2F%20operation%20%28to%20be%20applied%20when%20the%20operation%20finishes%29%2E%0A%20%20function%20addToScrollPos%28cm%2C%20left%2C%20top%29%20%7B%0A%20%20%20%20if%20%28left%20%21%3D%20null%20%7C%7C%20top%20%21%3D%20null%29%20resolveScrollToPos%28cm%29%3B%0A%20%20%20%20if%20%28left%20%21%3D%20null%29%0A%20%20%20%20%20%20cm%2EcurOp%2EscrollLeft%20%3D%20%28cm%2EcurOp%2EscrollLeft%20%3D%3D%20null%20%3F%20cm%2Edoc%2EscrollLeft%20%3A%20cm%2EcurOp%2EscrollLeft%29%20%2B%20left%3B%0A%20%20%20%20if%20%28top%20%21%3D%20null%29%0A%20%20%20%20%20%20cm%2EcurOp%2EscrollTop%20%3D%20%28cm%2EcurOp%2EscrollTop%20%3D%3D%20null%20%3F%20cm%2Edoc%2EscrollTop%20%3A%20cm%2EcurOp%2EscrollTop%29%20%2B%20top%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Make%20sure%20that%20at%20the%20end%20of%20the%20operation%20the%20current%20cursor%20is%0A%20%20%2F%2F%20shown%2E%0A%20%20function%20ensureCursorVisible%28cm%29%20%7B%0A%20%20%20%20resolveScrollToPos%28cm%29%3B%0A%20%20%20%20var%20cur%20%3D%20cm%2EgetCursor%28%29%2C%20from%20%3D%20cur%2C%20to%20%3D%20cur%3B%0A%20%20%20%20if%20%28%21cm%2Eoptions%2ElineWrapping%29%20%7B%0A%20%20%20%20%20%20from%20%3D%20cur%2Ech%20%3F%20Pos%28cur%2Eline%2C%20cur%2Ech%20%2D%201%29%20%3A%20cur%3B%0A%20%20%20%20%20%20to%20%3D%20Pos%28cur%2Eline%2C%20cur%2Ech%20%2B%201%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20cm%2EcurOp%2EscrollToPos%20%3D%20%7Bfrom%3A%20from%2C%20to%3A%20to%2C%20margin%3A%20cm%2Eoptions%2EcursorScrollMargin%2C%20isCursor%3A%20true%7D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20When%20an%20operation%20has%20its%20scrollToPos%20property%20set%2C%20and%20another%0A%20%20%2F%2F%20scroll%20action%20is%20applied%20before%20the%20end%20of%20the%20operation%2C%20this%0A%20%20%2F%2F%20%27simulates%27%20scrolling%20that%20position%20into%20view%20in%20a%20cheap%20way%2C%20so%0A%20%20%2F%2F%20that%20the%20effect%20of%20intermediate%20scroll%20commands%20is%20not%20ignored%2E%0A%20%20function%20resolveScrollToPos%28cm%29%20%7B%0A%20%20%20%20var%20range%20%3D%20cm%2EcurOp%2EscrollToPos%3B%0A%20%20%20%20if%20%28range%29%20%7B%0A%20%20%20%20%20%20cm%2EcurOp%2EscrollToPos%20%3D%20null%3B%0A%20%20%20%20%20%20var%20from%20%3D%20estimateCoords%28cm%2C%20range%2Efrom%29%2C%20to%20%3D%20estimateCoords%28cm%2C%20range%2Eto%29%3B%0A%20%20%20%20%20%20var%20sPos%20%3D%20calculateScrollPos%28cm%2C%20Math%2Emin%28from%2Eleft%2C%20to%2Eleft%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Math%2Emin%28from%2Etop%2C%20to%2Etop%29%20%2D%20range%2Emargin%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Math%2Emax%28from%2Eright%2C%20to%2Eright%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Math%2Emax%28from%2Ebottom%2C%20to%2Ebottom%29%20%2B%20range%2Emargin%29%3B%0A%20%20%20%20%20%20cm%2EscrollTo%28sPos%2EscrollLeft%2C%20sPos%2EscrollTop%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20API%20UTILITIES%0A%0A%20%20%2F%2F%20Indent%20the%20given%20line%2E%20The%20how%20parameter%20can%20be%20%22smart%22%2C%0A%20%20%2F%2F%20%22add%22%2Fnull%2C%20%22subtract%22%2C%20or%20%22prev%22%2E%20When%20aggressive%20is%20false%0A%20%20%2F%2F%20%28typically%20set%20to%20true%20for%20forced%20single%2Dline%20indents%29%2C%20empty%0A%20%20%2F%2F%20lines%20are%20not%20indented%2C%20and%20places%20where%20the%20mode%20returns%20Pass%0A%20%20%2F%2F%20are%20left%20alone%2E%0A%20%20function%20indentLine%28cm%2C%20n%2C%20how%2C%20aggressive%29%20%7B%0A%20%20%20%20var%20doc%20%3D%20cm%2Edoc%2C%20state%3B%0A%20%20%20%20if%20%28how%20%3D%3D%20null%29%20how%20%3D%20%22add%22%3B%0A%20%20%20%20if%20%28how%20%3D%3D%20%22smart%22%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Fall%20back%20to%20%22prev%22%20when%20the%20mode%20doesn%27t%20have%20an%20indentation%0A%20%20%20%20%20%20%2F%2F%20method%2E%0A%20%20%20%20%20%20if%20%28%21doc%2Emode%2Eindent%29%20how%20%3D%20%22prev%22%3B%0A%20%20%20%20%20%20else%20state%20%3D%20getStateBefore%28cm%2C%20n%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20tabSize%20%3D%20cm%2Eoptions%2EtabSize%3B%0A%20%20%20%20var%20line%20%3D%20getLine%28doc%2C%20n%29%2C%20curSpace%20%3D%20countColumn%28line%2Etext%2C%20null%2C%20tabSize%29%3B%0A%20%20%20%20if%20%28line%2EstateAfter%29%20line%2EstateAfter%20%3D%20null%3B%0A%20%20%20%20var%20curSpaceString%20%3D%20line%2Etext%2Ematch%28%2F%5E%5Cs%2A%2F%29%5B0%5D%2C%20indentation%3B%0A%20%20%20%20if%20%28%21aggressive%20%26%26%20%21%2F%5CS%2F%2Etest%28line%2Etext%29%29%20%7B%0A%20%20%20%20%20%20indentation%20%3D%200%3B%0A%20%20%20%20%20%20how%20%3D%20%22not%22%3B%0A%20%20%20%20%7D%20else%20if%20%28how%20%3D%3D%20%22smart%22%29%20%7B%0A%20%20%20%20%20%20indentation%20%3D%20doc%2Emode%2Eindent%28state%2C%20line%2Etext%2Eslice%28curSpaceString%2Elength%29%2C%20line%2Etext%29%3B%0A%20%20%20%20%20%20if%20%28indentation%20%3D%3D%20Pass%20%7C%7C%20indentation%20%3E%20150%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21aggressive%29%20return%3B%0A%20%20%20%20%20%20%20%20how%20%3D%20%22prev%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28how%20%3D%3D%20%22prev%22%29%20%7B%0A%20%20%20%20%20%20if%20%28n%20%3E%20doc%2Efirst%29%20indentation%20%3D%20countColumn%28getLine%28doc%2C%20n%2D1%29%2Etext%2C%20null%2C%20tabSize%29%3B%0A%20%20%20%20%20%20else%20indentation%20%3D%200%3B%0A%20%20%20%20%7D%20else%20if%20%28how%20%3D%3D%20%22add%22%29%20%7B%0A%20%20%20%20%20%20indentation%20%3D%20curSpace%20%2B%20cm%2Eoptions%2EindentUnit%3B%0A%20%20%20%20%7D%20else%20if%20%28how%20%3D%3D%20%22subtract%22%29%20%7B%0A%20%20%20%20%20%20indentation%20%3D%20curSpace%20%2D%20cm%2Eoptions%2EindentUnit%3B%0A%20%20%20%20%7D%20else%20if%20%28typeof%20how%20%3D%3D%20%22number%22%29%20%7B%0A%20%20%20%20%20%20indentation%20%3D%20curSpace%20%2B%20how%3B%0A%20%20%20%20%7D%0A%20%20%20%20indentation%20%3D%20Math%2Emax%280%2C%20indentation%29%3B%0A%0A%20%20%20%20var%20indentString%20%3D%20%22%22%2C%20pos%20%3D%200%3B%0A%20%20%20%20if%20%28cm%2Eoptions%2EindentWithTabs%29%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%20Math%2Efloor%28indentation%20%2F%20tabSize%29%3B%20i%3B%20%2D%2Di%29%20%7Bpos%20%2B%3D%20tabSize%3B%20indentString%20%2B%3D%20%22%5Ct%22%3B%7D%0A%20%20%20%20if%20%28pos%20%3C%20indentation%29%20indentString%20%2B%3D%20spaceStr%28indentation%20%2D%20pos%29%3B%0A%0A%20%20%20%20if%20%28indentString%20%21%3D%20curSpaceString%29%20%7B%0A%20%20%20%20%20%20replaceRange%28doc%2C%20indentString%2C%20Pos%28n%2C%200%29%2C%20Pos%28n%2C%20curSpaceString%2Elength%29%2C%20%22%2Binput%22%29%3B%0A%20%20%20%20%20%20line%2EstateAfter%20%3D%20null%3B%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%2F%2F%20Ensure%20that%2C%20if%20the%20cursor%20was%20in%20the%20whitespace%20at%20the%20start%0A%20%20%20%20%20%20%2F%2F%20of%20the%20line%2C%20it%20is%20moved%20to%20the%20end%20of%20that%20space%2E%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20doc%2Esel%2Eranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20range%20%3D%20doc%2Esel%2Eranges%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28range%2Ehead%2Eline%20%3D%3D%20n%20%26%26%20range%2Ehead%2Ech%20%3C%20curSpaceString%2Elength%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20pos%20%3D%20Pos%28n%2C%20curSpaceString%2Elength%29%3B%0A%20%20%20%20%20%20%20%20%20%20replaceOneSelection%28doc%2C%20i%2C%20new%20Range%28pos%2C%20pos%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Utility%20for%20applying%20a%20change%20to%20a%20line%20by%20handle%20or%20number%2C%0A%20%20%2F%2F%20returning%20the%20number%20and%20optionally%20registering%20the%20line%20as%0A%20%20%2F%2F%20changed%2E%0A%20%20function%20changeLine%28doc%2C%20handle%2C%20changeType%2C%20op%29%20%7B%0A%20%20%20%20var%20no%20%3D%20handle%2C%20line%20%3D%20handle%3B%0A%20%20%20%20if%20%28typeof%20handle%20%3D%3D%20%22number%22%29%20line%20%3D%20getLine%28doc%2C%20clipLine%28doc%2C%20handle%29%29%3B%0A%20%20%20%20else%20no%20%3D%20lineNo%28handle%29%3B%0A%20%20%20%20if%20%28no%20%3D%3D%20null%29%20return%20null%3B%0A%20%20%20%20if%20%28op%28line%2C%20no%29%20%26%26%20doc%2Ecm%29%20regLineChange%28doc%2Ecm%2C%20no%2C%20changeType%29%3B%0A%20%20%20%20return%20line%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Helper%20for%20deleting%20text%20near%20the%20selection%28s%29%2C%20used%20to%20implement%0A%20%20%2F%2F%20backspace%2C%20delete%2C%20and%20similar%20functionality%2E%0A%20%20function%20deleteNearSelection%28cm%2C%20compute%29%20%7B%0A%20%20%20%20var%20ranges%20%3D%20cm%2Edoc%2Esel%2Eranges%2C%20kill%20%3D%20%5B%5D%3B%0A%20%20%20%20%2F%2F%20Build%20up%20a%20set%20of%20ranges%20to%20kill%20first%2C%20merging%20overlapping%0A%20%20%20%20%2F%2F%20ranges%2E%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20toKill%20%3D%20compute%28ranges%5Bi%5D%29%3B%0A%20%20%20%20%20%20while%20%28kill%2Elength%20%26%26%20cmp%28toKill%2Efrom%2C%20lst%28kill%29%2Eto%29%20%3C%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20var%20replaced%20%3D%20kill%2Epop%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28cmp%28replaced%2Efrom%2C%20toKill%2Efrom%29%20%3C%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20toKill%2Efrom%20%3D%20replaced%2Efrom%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20kill%2Epush%28toKill%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F%2F%20Next%2C%20remove%20those%20actual%20ranges%2E%0A%20%20%20%20runInOp%28cm%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%20kill%2Elength%20%2D%201%3B%20i%20%3E%3D%200%3B%20i%2D%2D%29%0A%20%20%20%20%20%20%20%20replaceRange%28cm%2Edoc%2C%20%22%22%2C%20kill%5Bi%5D%2Efrom%2C%20kill%5Bi%5D%2Eto%2C%20%22%2Bdelete%22%29%3B%0A%20%20%20%20%20%20ensureCursorVisible%28cm%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Used%20for%20horizontal%20relative%20motion%2E%20Dir%20is%20%2D1%20or%201%20%28left%20or%0A%20%20%2F%2F%20right%29%2C%20unit%20can%20be%20%22char%22%2C%20%22column%22%20%28like%20char%2C%20but%20doesn%27t%0A%20%20%2F%2F%20cross%20line%20boundaries%29%2C%20%22word%22%20%28across%20next%20word%29%2C%20or%20%22group%22%20%28to%0A%20%20%2F%2F%20the%20start%20of%20next%20group%20of%20word%20or%20non%2Dword%2Dnon%2Dwhitespace%0A%20%20%2F%2F%20chars%29%2E%20The%20visually%20param%20controls%20whether%2C%20in%20right%2Dto%2Dleft%0A%20%20%2F%2F%20text%2C%20direction%201%20means%20to%20move%20towards%20the%20next%20index%20in%20the%0A%20%20%2F%2F%20string%2C%20or%20towards%20the%20character%20to%20the%20right%20of%20the%20current%0A%20%20%2F%2F%20position%2E%20The%20resulting%20position%20will%20have%20a%20hitSide%3Dtrue%0A%20%20%2F%2F%20property%20if%20it%20reached%20the%20end%20of%20the%20document%2E%0A%20%20function%20findPosH%28doc%2C%20pos%2C%20dir%2C%20unit%2C%20visually%29%20%7B%0A%20%20%20%20var%20line%20%3D%20pos%2Eline%2C%20ch%20%3D%20pos%2Ech%2C%20origDir%20%3D%20dir%3B%0A%20%20%20%20var%20lineObj%20%3D%20getLine%28doc%2C%20line%29%3B%0A%20%20%20%20function%20findNextLine%28%29%20%7B%0A%20%20%20%20%20%20var%20l%20%3D%20line%20%2B%20dir%3B%0A%20%20%20%20%20%20if%20%28l%20%3C%20doc%2Efirst%20%7C%7C%20l%20%3E%3D%20doc%2Efirst%20%2B%20doc%2Esize%29%20return%20false%0A%20%20%20%20%20%20line%20%3D%20l%3B%0A%20%20%20%20%20%20return%20lineObj%20%3D%20getLine%28doc%2C%20l%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20function%20moveOnce%28boundToLine%29%20%7B%0A%20%20%20%20%20%20var%20next%20%3D%20%28visually%20%3F%20moveVisually%20%3A%20moveLogically%29%28lineObj%2C%20ch%2C%20dir%2C%20true%29%3B%0A%20%20%20%20%20%20if%20%28next%20%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21boundToLine%20%26%26%20findNextLine%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28visually%29%20ch%20%3D%20%28dir%20%3C%200%20%3F%20lineRight%20%3A%20lineLeft%29%28lineObj%29%3B%0A%20%20%20%20%20%20%20%20%20%20else%20ch%20%3D%20dir%20%3C%200%20%3F%20lineObj%2Etext%2Elength%20%3A%200%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20return%20false%0A%20%20%20%20%20%20%7D%20else%20ch%20%3D%20next%3B%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28unit%20%3D%3D%20%22char%22%29%20%7B%0A%20%20%20%20%20%20moveOnce%28%29%0A%20%20%20%20%7D%20else%20if%20%28unit%20%3D%3D%20%22column%22%29%20%7B%0A%20%20%20%20%20%20moveOnce%28true%29%0A%20%20%20%20%7D%20else%20if%20%28unit%20%3D%3D%20%22word%22%20%7C%7C%20unit%20%3D%3D%20%22group%22%29%20%7B%0A%20%20%20%20%20%20var%20sawType%20%3D%20null%2C%20group%20%3D%20unit%20%3D%3D%20%22group%22%3B%0A%20%20%20%20%20%20var%20helper%20%3D%20doc%2Ecm%20%26%26%20doc%2Ecm%2EgetHelper%28pos%2C%20%22wordChars%22%29%3B%0A%20%20%20%20%20%20for%20%28var%20first%20%3D%20true%3B%3B%20first%20%3D%20false%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28dir%20%3C%200%20%26%26%20%21moveOnce%28%21first%29%29%20break%3B%0A%20%20%20%20%20%20%20%20var%20cur%20%3D%20lineObj%2Etext%2EcharAt%28ch%29%20%7C%7C%20%22%5Cn%22%3B%0A%20%20%20%20%20%20%20%20var%20type%20%3D%20isWordChar%28cur%2C%20helper%29%20%3F%20%22w%22%0A%20%20%20%20%20%20%20%20%20%20%3A%20group%20%26%26%20cur%20%3D%3D%20%22%5Cn%22%20%3F%20%22n%22%0A%20%20%20%20%20%20%20%20%20%20%3A%20%21group%20%7C%7C%20%2F%5Cs%2F%2Etest%28cur%29%20%3F%20null%0A%20%20%20%20%20%20%20%20%20%20%3A%20%22p%22%3B%0A%20%20%20%20%20%20%20%20if%20%28group%20%26%26%20%21first%20%26%26%20%21type%29%20type%20%3D%20%22s%22%3B%0A%20%20%20%20%20%20%20%20if%20%28sawType%20%26%26%20sawType%20%21%3D%20type%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28dir%20%3C%200%29%20%7Bdir%20%3D%201%3B%20moveOnce%28%29%3B%7D%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28type%29%20sawType%20%3D%20type%3B%0A%20%20%20%20%20%20%20%20if%20%28dir%20%3E%200%20%26%26%20%21moveOnce%28%21first%29%29%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20var%20result%20%3D%20skipAtomic%28doc%2C%20Pos%28line%2C%20ch%29%2C%20pos%2C%20origDir%2C%20true%29%3B%0A%20%20%20%20if%20%28%21cmp%28pos%2C%20result%29%29%20result%2EhitSide%20%3D%20true%3B%0A%20%20%20%20return%20result%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20For%20relative%20vertical%20movement%2E%20Dir%20may%20be%20%2D1%20or%201%2E%20Unit%20can%20be%0A%20%20%2F%2F%20%22page%22%20or%20%22line%22%2E%20The%20resulting%20position%20will%20have%20a%20hitSide%3Dtrue%0A%20%20%2F%2F%20property%20if%20it%20reached%20the%20end%20of%20the%20document%2E%0A%20%20function%20findPosV%28cm%2C%20pos%2C%20dir%2C%20unit%29%20%7B%0A%20%20%20%20var%20doc%20%3D%20cm%2Edoc%2C%20x%20%3D%20pos%2Eleft%2C%20y%3B%0A%20%20%20%20if%20%28unit%20%3D%3D%20%22page%22%29%20%7B%0A%20%20%20%20%20%20var%20pageSize%20%3D%20Math%2Emin%28cm%2Edisplay%2Ewrapper%2EclientHeight%2C%20window%2EinnerHeight%20%7C%7C%20document%2EdocumentElement%2EclientHeight%29%3B%0A%20%20%20%20%20%20y%20%3D%20pos%2Etop%20%2B%20dir%20%2A%20%28pageSize%20%2D%20%28dir%20%3C%200%20%3F%201%2E5%20%3A%20%2E5%29%20%2A%20textHeight%28cm%2Edisplay%29%29%3B%0A%20%20%20%20%7D%20else%20if%20%28unit%20%3D%3D%20%22line%22%29%20%7B%0A%20%20%20%20%20%20y%20%3D%20dir%20%3E%200%20%3F%20pos%2Ebottom%20%2B%203%20%3A%20pos%2Etop%20%2D%203%3B%0A%20%20%20%20%7D%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20var%20target%20%3D%20coordsChar%28cm%2C%20x%2C%20y%29%3B%0A%20%20%20%20%20%20if%20%28%21target%2Eoutside%29%20break%3B%0A%20%20%20%20%20%20if%20%28dir%20%3C%200%20%3F%20y%20%3C%3D%200%20%3A%20y%20%3E%3D%20doc%2Eheight%29%20%7B%20target%2EhitSide%20%3D%20true%3B%20break%3B%20%7D%0A%20%20%20%20%20%20y%20%2B%3D%20dir%20%2A%205%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20target%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20EDITOR%20METHODS%0A%0A%20%20%2F%2F%20The%20publicly%20visible%20API%2E%20Note%20that%20methodOp%28f%29%20means%0A%20%20%2F%2F%20%27wrap%20f%20in%20an%20operation%2C%20performed%20on%20its%20%60this%60%20parameter%27%2E%0A%0A%20%20%2F%2F%20This%20is%20not%20the%20complete%20set%20of%20editor%20methods%2E%20Most%20of%20the%0A%20%20%2F%2F%20methods%20defined%20on%20the%20Doc%20type%20are%20also%20injected%20into%0A%20%20%2F%2F%20CodeMirror%2Eprototype%2C%20for%20backwards%20compatibility%20and%0A%20%20%2F%2F%20convenience%2E%0A%0A%20%20CodeMirror%2Eprototype%20%3D%20%7B%0A%20%20%20%20constructor%3A%20CodeMirror%2C%0A%20%20%20%20focus%3A%20function%28%29%7Bwindow%2Efocus%28%29%3B%20this%2Edisplay%2Einput%2Efocus%28%29%3B%7D%2C%0A%0A%20%20%20%20setOption%3A%20function%28option%2C%20value%29%20%7B%0A%20%20%20%20%20%20var%20options%20%3D%20this%2Eoptions%2C%20old%20%3D%20options%5Boption%5D%3B%0A%20%20%20%20%20%20if%20%28options%5Boption%5D%20%3D%3D%20value%20%26%26%20option%20%21%3D%20%22mode%22%29%20return%3B%0A%20%20%20%20%20%20options%5Boption%5D%20%3D%20value%3B%0A%20%20%20%20%20%20if%20%28optionHandlers%2EhasOwnProperty%28option%29%29%0A%20%20%20%20%20%20%20%20operation%28this%2C%20optionHandlers%5Boption%5D%29%28this%2C%20value%2C%20old%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20getOption%3A%20function%28option%29%20%7Breturn%20this%2Eoptions%5Boption%5D%3B%7D%2C%0A%20%20%20%20getDoc%3A%20function%28%29%20%7Breturn%20this%2Edoc%3B%7D%2C%0A%0A%20%20%20%20addKeyMap%3A%20function%28map%2C%20bottom%29%20%7B%0A%20%20%20%20%20%20this%2Estate%2EkeyMaps%5Bbottom%20%3F%20%22push%22%20%3A%20%22unshift%22%5D%28getKeyMap%28map%29%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20removeKeyMap%3A%20function%28map%29%20%7B%0A%20%20%20%20%20%20var%20maps%20%3D%20this%2Estate%2EkeyMaps%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20maps%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20%20%20if%20%28maps%5Bi%5D%20%3D%3D%20map%20%7C%7C%20maps%5Bi%5D%2Ename%20%3D%3D%20map%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20maps%2Esplice%28i%2C%201%29%3B%0A%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20addOverlay%3A%20methodOp%28function%28spec%2C%20options%29%20%7B%0A%20%20%20%20%20%20var%20mode%20%3D%20spec%2Etoken%20%3F%20spec%20%3A%20CodeMirror%2EgetMode%28this%2Eoptions%2C%20spec%29%3B%0A%20%20%20%20%20%20if%20%28mode%2EstartState%29%20throw%20new%20Error%28%22Overlays%20may%20not%20be%20stateful%2E%22%29%3B%0A%20%20%20%20%20%20this%2Estate%2Eoverlays%2Epush%28%7Bmode%3A%20mode%2C%20modeSpec%3A%20spec%2C%20opaque%3A%20options%20%26%26%20options%2Eopaque%7D%29%3B%0A%20%20%20%20%20%20this%2Estate%2EmodeGen%2B%2B%3B%0A%20%20%20%20%20%20regChange%28this%29%3B%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20removeOverlay%3A%20methodOp%28function%28spec%29%20%7B%0A%20%20%20%20%20%20var%20overlays%20%3D%20this%2Estate%2Eoverlays%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20overlays%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20cur%20%3D%20overlays%5Bi%5D%2EmodeSpec%3B%0A%20%20%20%20%20%20%20%20if%20%28cur%20%3D%3D%20spec%20%7C%7C%20typeof%20spec%20%3D%3D%20%22string%22%20%26%26%20cur%2Ename%20%3D%3D%20spec%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20overlays%2Esplice%28i%2C%201%29%3B%0A%20%20%20%20%20%20%20%20%20%20this%2Estate%2EmodeGen%2B%2B%3B%0A%20%20%20%20%20%20%20%20%20%20regChange%28this%29%3B%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%2C%0A%0A%20%20%20%20indentLine%3A%20methodOp%28function%28n%2C%20dir%2C%20aggressive%29%20%7B%0A%20%20%20%20%20%20if%20%28typeof%20dir%20%21%3D%20%22string%22%20%26%26%20typeof%20dir%20%21%3D%20%22number%22%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28dir%20%3D%3D%20null%29%20dir%20%3D%20this%2Eoptions%2EsmartIndent%20%3F%20%22smart%22%20%3A%20%22prev%22%3B%0A%20%20%20%20%20%20%20%20else%20dir%20%3D%20dir%20%3F%20%22add%22%20%3A%20%22subtract%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28isLine%28this%2Edoc%2C%20n%29%29%20indentLine%28this%2C%20n%2C%20dir%2C%20aggressive%29%3B%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20indentSelection%3A%20methodOp%28function%28how%29%20%7B%0A%20%20%20%20%20%20var%20ranges%20%3D%20this%2Edoc%2Esel%2Eranges%2C%20end%20%3D%20%2D1%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20range%20%3D%20ranges%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28%21range%2Eempty%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20from%20%3D%20range%2Efrom%28%29%2C%20to%20%3D%20range%2Eto%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20var%20start%20%3D%20Math%2Emax%28end%2C%20from%2Eline%29%3B%0A%20%20%20%20%20%20%20%20%20%20end%20%3D%20Math%2Emin%28this%2ElastLine%28%29%2C%20to%2Eline%20%2D%20%28to%2Ech%20%3F%200%20%3A%201%29%29%20%2B%201%3B%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20j%20%3D%20start%3B%20j%20%3C%20end%3B%20%2B%2Bj%29%0A%20%20%20%20%20%20%20%20%20%20%20%20indentLine%28this%2C%20j%2C%20how%29%3B%0A%20%20%20%20%20%20%20%20%20%20var%20newRanges%20%3D%20this%2Edoc%2Esel%2Eranges%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28from%2Ech%20%3D%3D%200%20%26%26%20ranges%2Elength%20%3D%3D%20newRanges%2Elength%20%26%26%20newRanges%5Bi%5D%2Efrom%28%29%2Ech%20%3E%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20replaceOneSelection%28this%2Edoc%2C%20i%2C%20new%20Range%28from%2C%20newRanges%5Bi%5D%2Eto%28%29%29%2C%20sel%5FdontScroll%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28range%2Ehead%2Eline%20%3E%20end%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20indentLine%28this%2C%20range%2Ehead%2Eline%2C%20how%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20%20%20end%20%3D%20range%2Ehead%2Eline%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28i%20%3D%3D%20this%2Edoc%2Esel%2EprimIndex%29%20ensureCursorVisible%28this%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%2C%0A%0A%20%20%20%20%2F%2F%20Fetch%20the%20parser%20token%20for%20a%20given%20character%2E%20Useful%20for%20hacks%0A%20%20%20%20%2F%2F%20that%20want%20to%20inspect%20the%20mode%20state%20%28say%2C%20for%20completion%29%2E%0A%20%20%20%20getTokenAt%3A%20function%28pos%2C%20precise%29%20%7B%0A%20%20%20%20%20%20return%20takeToken%28this%2C%20pos%2C%20precise%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20getLineTokens%3A%20function%28line%2C%20precise%29%20%7B%0A%20%20%20%20%20%20return%20takeToken%28this%2C%20Pos%28line%29%2C%20precise%2C%20true%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20getTokenTypeAt%3A%20function%28pos%29%20%7B%0A%20%20%20%20%20%20pos%20%3D%20clipPos%28this%2Edoc%2C%20pos%29%3B%0A%20%20%20%20%20%20var%20styles%20%3D%20getLineStyles%28this%2C%20getLine%28this%2Edoc%2C%20pos%2Eline%29%29%3B%0A%20%20%20%20%20%20var%20before%20%3D%200%2C%20after%20%3D%20%28styles%2Elength%20%2D%201%29%20%2F%202%2C%20ch%20%3D%20pos%2Ech%3B%0A%20%20%20%20%20%20var%20type%3B%0A%20%20%20%20%20%20if%20%28ch%20%3D%3D%200%29%20type%20%3D%20styles%5B2%5D%3B%0A%20%20%20%20%20%20else%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20mid%20%3D%20%28before%20%2B%20after%29%20%3E%3E%201%3B%0A%20%20%20%20%20%20%20%20if%20%28%28mid%20%3F%20styles%5Bmid%20%2A%202%20%2D%201%5D%20%3A%200%29%20%3E%3D%20ch%29%20after%20%3D%20mid%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28styles%5Bmid%20%2A%202%20%2B%201%5D%20%3C%20ch%29%20before%20%3D%20mid%20%2B%201%3B%0A%20%20%20%20%20%20%20%20else%20%7B%20type%20%3D%20styles%5Bmid%20%2A%202%20%2B%202%5D%3B%20break%3B%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20cut%20%3D%20type%20%3F%20type%2EindexOf%28%22cm%2Doverlay%20%22%29%20%3A%20%2D1%3B%0A%20%20%20%20%20%20return%20cut%20%3C%200%20%3F%20type%20%3A%20cut%20%3D%3D%200%20%3F%20null%20%3A%20type%2Eslice%280%2C%20cut%20%2D%201%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20getModeAt%3A%20function%28pos%29%20%7B%0A%20%20%20%20%20%20var%20mode%20%3D%20this%2Edoc%2Emode%3B%0A%20%20%20%20%20%20if%20%28%21mode%2EinnerMode%29%20return%20mode%3B%0A%20%20%20%20%20%20return%20CodeMirror%2EinnerMode%28mode%2C%20this%2EgetTokenAt%28pos%29%2Estate%29%2Emode%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20getHelper%3A%20function%28pos%2C%20type%29%20%7B%0A%20%20%20%20%20%20return%20this%2EgetHelpers%28pos%2C%20type%29%5B0%5D%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20getHelpers%3A%20function%28pos%2C%20type%29%20%7B%0A%20%20%20%20%20%20var%20found%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20if%20%28%21helpers%2EhasOwnProperty%28type%29%29%20return%20found%3B%0A%20%20%20%20%20%20var%20help%20%3D%20helpers%5Btype%5D%2C%20mode%20%3D%20this%2EgetModeAt%28pos%29%3B%0A%20%20%20%20%20%20if%20%28typeof%20mode%5Btype%5D%20%3D%3D%20%22string%22%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28help%5Bmode%5Btype%5D%5D%29%20found%2Epush%28help%5Bmode%5Btype%5D%5D%29%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28mode%5Btype%5D%29%20%7B%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20mode%5Btype%5D%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20val%20%3D%20help%5Bmode%5Btype%5D%5Bi%5D%5D%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28val%29%20found%2Epush%28val%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20if%20%28mode%2EhelperType%20%26%26%20help%5Bmode%2EhelperType%5D%29%20%7B%0A%20%20%20%20%20%20%20%20found%2Epush%28help%5Bmode%2EhelperType%5D%29%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28help%5Bmode%2Ename%5D%29%20%7B%0A%20%20%20%20%20%20%20%20found%2Epush%28help%5Bmode%2Ename%5D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20help%2E%5Fglobal%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20cur%20%3D%20help%2E%5Fglobal%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28cur%2Epred%28mode%2C%20this%29%20%26%26%20indexOf%28found%2C%20cur%2Eval%29%20%3D%3D%20%2D1%29%0A%20%20%20%20%20%20%20%20%20%20found%2Epush%28cur%2Eval%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20found%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20getStateAfter%3A%20function%28line%2C%20precise%29%20%7B%0A%20%20%20%20%20%20var%20doc%20%3D%20this%2Edoc%3B%0A%20%20%20%20%20%20line%20%3D%20clipLine%28doc%2C%20line%20%3D%3D%20null%20%3F%20doc%2Efirst%20%2B%20doc%2Esize%20%2D%201%3A%20line%29%3B%0A%20%20%20%20%20%20return%20getStateBefore%28this%2C%20line%20%2B%201%2C%20precise%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20cursorCoords%3A%20function%28start%2C%20mode%29%20%7B%0A%20%20%20%20%20%20var%20pos%2C%20range%20%3D%20this%2Edoc%2Esel%2Eprimary%28%29%3B%0A%20%20%20%20%20%20if%20%28start%20%3D%3D%20null%29%20pos%20%3D%20range%2Ehead%3B%0A%20%20%20%20%20%20else%20if%20%28typeof%20start%20%3D%3D%20%22object%22%29%20pos%20%3D%20clipPos%28this%2Edoc%2C%20start%29%3B%0A%20%20%20%20%20%20else%20pos%20%3D%20start%20%3F%20range%2Efrom%28%29%20%3A%20range%2Eto%28%29%3B%0A%20%20%20%20%20%20return%20cursorCoords%28this%2C%20pos%2C%20mode%20%7C%7C%20%22page%22%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20charCoords%3A%20function%28pos%2C%20mode%29%20%7B%0A%20%20%20%20%20%20return%20charCoords%28this%2C%20clipPos%28this%2Edoc%2C%20pos%29%2C%20mode%20%7C%7C%20%22page%22%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20coordsChar%3A%20function%28coords%2C%20mode%29%20%7B%0A%20%20%20%20%20%20coords%20%3D%20fromCoordSystem%28this%2C%20coords%2C%20mode%20%7C%7C%20%22page%22%29%3B%0A%20%20%20%20%20%20return%20coordsChar%28this%2C%20coords%2Eleft%2C%20coords%2Etop%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20lineAtHeight%3A%20function%28height%2C%20mode%29%20%7B%0A%20%20%20%20%20%20height%20%3D%20fromCoordSystem%28this%2C%20%7Btop%3A%20height%2C%20left%3A%200%7D%2C%20mode%20%7C%7C%20%22page%22%29%2Etop%3B%0A%20%20%20%20%20%20return%20lineAtHeight%28this%2Edoc%2C%20height%20%2B%20this%2Edisplay%2EviewOffset%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20heightAtLine%3A%20function%28line%2C%20mode%29%20%7B%0A%20%20%20%20%20%20var%20end%20%3D%20false%2C%20lineObj%3B%0A%20%20%20%20%20%20if%20%28typeof%20line%20%3D%3D%20%22number%22%29%20%7B%0A%20%20%20%20%20%20%20%20var%20last%20%3D%20this%2Edoc%2Efirst%20%2B%20this%2Edoc%2Esize%20%2D%201%3B%0A%20%20%20%20%20%20%20%20if%20%28line%20%3C%20this%2Edoc%2Efirst%29%20line%20%3D%20this%2Edoc%2Efirst%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28line%20%3E%20last%29%20%7B%20line%20%3D%20last%3B%20end%20%3D%20true%3B%20%7D%0A%20%20%20%20%20%20%20%20lineObj%20%3D%20getLine%28this%2Edoc%2C%20line%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20lineObj%20%3D%20line%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20intoCoordSystem%28this%2C%20lineObj%2C%20%7Btop%3A%200%2C%20left%3A%200%7D%2C%20mode%20%7C%7C%20%22page%22%29%2Etop%20%2B%0A%20%20%20%20%20%20%20%20%28end%20%3F%20this%2Edoc%2Eheight%20%2D%20heightAtLine%28lineObj%29%20%3A%200%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20defaultTextHeight%3A%20function%28%29%20%7B%20return%20textHeight%28this%2Edisplay%29%3B%20%7D%2C%0A%20%20%20%20defaultCharWidth%3A%20function%28%29%20%7B%20return%20charWidth%28this%2Edisplay%29%3B%20%7D%2C%0A%0A%20%20%20%20setGutterMarker%3A%20methodOp%28function%28line%2C%20gutterID%2C%20value%29%20%7B%0A%20%20%20%20%20%20return%20changeLine%28this%2Edoc%2C%20line%2C%20%22gutter%22%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20%20%20var%20markers%20%3D%20line%2EgutterMarkers%20%7C%7C%20%28line%2EgutterMarkers%20%3D%20%7B%7D%29%3B%0A%20%20%20%20%20%20%20%20markers%5BgutterID%5D%20%3D%20value%3B%0A%20%20%20%20%20%20%20%20if%20%28%21value%20%26%26%20isEmpty%28markers%29%29%20line%2EgutterMarkers%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%29%2C%0A%0A%20%20%20%20clearGutter%3A%20methodOp%28function%28gutterID%29%20%7B%0A%20%20%20%20%20%20var%20cm%20%3D%20this%2C%20doc%20%3D%20cm%2Edoc%2C%20i%20%3D%20doc%2Efirst%3B%0A%20%20%20%20%20%20doc%2Eiter%28function%28line%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28line%2EgutterMarkers%20%26%26%20line%2EgutterMarkers%5BgutterID%5D%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20line%2EgutterMarkers%5BgutterID%5D%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20%20%20regLineChange%28cm%2C%20i%2C%20%22gutter%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28isEmpty%28line%2EgutterMarkers%29%29%20line%2EgutterMarkers%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%2B%2Bi%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%29%2C%0A%0A%20%20%20%20lineInfo%3A%20function%28line%29%20%7B%0A%20%20%20%20%20%20if%20%28typeof%20line%20%3D%3D%20%22number%22%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21isLine%28this%2Edoc%2C%20line%29%29%20return%20null%3B%0A%20%20%20%20%20%20%20%20var%20n%20%3D%20line%3B%0A%20%20%20%20%20%20%20%20line%20%3D%20getLine%28this%2Edoc%2C%20line%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21line%29%20return%20null%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20var%20n%20%3D%20lineNo%28line%29%3B%0A%20%20%20%20%20%20%20%20if%20%28n%20%3D%3D%20null%29%20return%20null%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%7Bline%3A%20n%2C%20handle%3A%20line%2C%20text%3A%20line%2Etext%2C%20gutterMarkers%3A%20line%2EgutterMarkers%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20textClass%3A%20line%2EtextClass%2C%20bgClass%3A%20line%2EbgClass%2C%20wrapClass%3A%20line%2EwrapClass%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20widgets%3A%20line%2Ewidgets%7D%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20getViewport%3A%20function%28%29%20%7B%20return%20%7Bfrom%3A%20this%2Edisplay%2EviewFrom%2C%20to%3A%20this%2Edisplay%2EviewTo%7D%3B%7D%2C%0A%0A%20%20%20%20addWidget%3A%20function%28pos%2C%20node%2C%20scroll%2C%20vert%2C%20horiz%29%20%7B%0A%20%20%20%20%20%20var%20display%20%3D%20this%2Edisplay%3B%0A%20%20%20%20%20%20pos%20%3D%20cursorCoords%28this%2C%20clipPos%28this%2Edoc%2C%20pos%29%29%3B%0A%20%20%20%20%20%20var%20top%20%3D%20pos%2Ebottom%2C%20left%20%3D%20pos%2Eleft%3B%0A%20%20%20%20%20%20node%2Estyle%2Eposition%20%3D%20%22absolute%22%3B%0A%20%20%20%20%20%20node%2EsetAttribute%28%22cm%2Dignore%2Devents%22%2C%20%22true%22%29%3B%0A%20%20%20%20%20%20this%2Edisplay%2Einput%2EsetUneditable%28node%29%3B%0A%20%20%20%20%20%20display%2Esizer%2EappendChild%28node%29%3B%0A%20%20%20%20%20%20if%20%28vert%20%3D%3D%20%22over%22%29%20%7B%0A%20%20%20%20%20%20%20%20top%20%3D%20pos%2Etop%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28vert%20%3D%3D%20%22above%22%20%7C%7C%20vert%20%3D%3D%20%22near%22%29%20%7B%0A%20%20%20%20%20%20%20%20var%20vspace%20%3D%20Math%2Emax%28display%2Ewrapper%2EclientHeight%2C%20this%2Edoc%2Eheight%29%2C%0A%20%20%20%20%20%20%20%20hspace%20%3D%20Math%2Emax%28display%2Esizer%2EclientWidth%2C%20display%2ElineSpace%2EclientWidth%29%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20Default%20to%20positioning%20above%20%28if%20specified%20and%20possible%29%3B%20otherwise%20default%20to%20positioning%20below%0A%20%20%20%20%20%20%20%20if%20%28%28vert%20%3D%3D%20%27above%27%20%7C%7C%20pos%2Ebottom%20%2B%20node%2EoffsetHeight%20%3E%20vspace%29%20%26%26%20pos%2Etop%20%3E%20node%2EoffsetHeight%29%0A%20%20%20%20%20%20%20%20%20%20top%20%3D%20pos%2Etop%20%2D%20node%2EoffsetHeight%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28pos%2Ebottom%20%2B%20node%2EoffsetHeight%20%3C%3D%20vspace%29%0A%20%20%20%20%20%20%20%20%20%20top%20%3D%20pos%2Ebottom%3B%0A%20%20%20%20%20%20%20%20if%20%28left%20%2B%20node%2EoffsetWidth%20%3E%20hspace%29%0A%20%20%20%20%20%20%20%20%20%20left%20%3D%20hspace%20%2D%20node%2EoffsetWidth%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20node%2Estyle%2Etop%20%3D%20top%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20node%2Estyle%2Eleft%20%3D%20node%2Estyle%2Eright%20%3D%20%22%22%3B%0A%20%20%20%20%20%20if%20%28horiz%20%3D%3D%20%22right%22%29%20%7B%0A%20%20%20%20%20%20%20%20left%20%3D%20display%2Esizer%2EclientWidth%20%2D%20node%2EoffsetWidth%3B%0A%20%20%20%20%20%20%20%20node%2Estyle%2Eright%20%3D%20%220px%22%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20if%20%28horiz%20%3D%3D%20%22left%22%29%20left%20%3D%200%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28horiz%20%3D%3D%20%22middle%22%29%20left%20%3D%20%28display%2Esizer%2EclientWidth%20%2D%20node%2EoffsetWidth%29%20%2F%202%3B%0A%20%20%20%20%20%20%20%20node%2Estyle%2Eleft%20%3D%20left%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28scroll%29%0A%20%20%20%20%20%20%20%20scrollIntoView%28this%2C%20left%2C%20top%2C%20left%20%2B%20node%2EoffsetWidth%2C%20top%20%2B%20node%2EoffsetHeight%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20triggerOnKeyDown%3A%20methodOp%28onKeyDown%29%2C%0A%20%20%20%20triggerOnKeyPress%3A%20methodOp%28onKeyPress%29%2C%0A%20%20%20%20triggerOnKeyUp%3A%20onKeyUp%2C%0A%0A%20%20%20%20execCommand%3A%20function%28cmd%29%20%7B%0A%20%20%20%20%20%20if%20%28commands%2EhasOwnProperty%28cmd%29%29%0A%20%20%20%20%20%20%20%20return%20commands%5Bcmd%5D%2Ecall%28null%2C%20this%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20triggerElectric%3A%20methodOp%28function%28text%29%20%7B%20triggerElectric%28this%2C%20text%29%3B%20%7D%29%2C%0A%0A%20%20%20%20findPosH%3A%20function%28from%2C%20amount%2C%20unit%2C%20visually%29%20%7B%0A%20%20%20%20%20%20var%20dir%20%3D%201%3B%0A%20%20%20%20%20%20if%20%28amount%20%3C%200%29%20%7B%20dir%20%3D%20%2D1%3B%20amount%20%3D%20%2Damount%3B%20%7D%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%2C%20cur%20%3D%20clipPos%28this%2Edoc%2C%20from%29%3B%20i%20%3C%20amount%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20cur%20%3D%20findPosH%28this%2Edoc%2C%20cur%2C%20dir%2C%20unit%2C%20visually%29%3B%0A%20%20%20%20%20%20%20%20if%20%28cur%2EhitSide%29%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20cur%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20moveH%3A%20methodOp%28function%28dir%2C%20unit%29%20%7B%0A%20%20%20%20%20%20var%20cm%20%3D%20this%3B%0A%20%20%20%20%20%20cm%2EextendSelectionsBy%28function%28range%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28cm%2Edisplay%2Eshift%20%7C%7C%20cm%2Edoc%2Eextend%20%7C%7C%20range%2Eempty%28%29%29%0A%20%20%20%20%20%20%20%20%20%20return%20findPosH%28cm%2Edoc%2C%20range%2Ehead%2C%20dir%2C%20unit%2C%20cm%2Eoptions%2ErtlMoveVisually%29%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20return%20dir%20%3C%200%20%3F%20range%2Efrom%28%29%20%3A%20range%2Eto%28%29%3B%0A%20%20%20%20%20%20%7D%2C%20sel%5Fmove%29%3B%0A%20%20%20%20%7D%29%2C%0A%0A%20%20%20%20deleteH%3A%20methodOp%28function%28dir%2C%20unit%29%20%7B%0A%20%20%20%20%20%20var%20sel%20%3D%20this%2Edoc%2Esel%2C%20doc%20%3D%20this%2Edoc%3B%0A%20%20%20%20%20%20if%20%28sel%2EsomethingSelected%28%29%29%0A%20%20%20%20%20%20%20%20doc%2EreplaceSelection%28%22%22%2C%20null%2C%20%22%2Bdelete%22%29%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20deleteNearSelection%28this%2C%20function%28range%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20other%20%3D%20findPosH%28doc%2C%20range%2Ehead%2C%20dir%2C%20unit%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20return%20dir%20%3C%200%20%3F%20%7Bfrom%3A%20other%2C%20to%3A%20range%2Ehead%7D%20%3A%20%7Bfrom%3A%20range%2Ehead%2C%20to%3A%20other%7D%3B%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%29%2C%0A%0A%20%20%20%20findPosV%3A%20function%28from%2C%20amount%2C%20unit%2C%20goalColumn%29%20%7B%0A%20%20%20%20%20%20var%20dir%20%3D%201%2C%20x%20%3D%20goalColumn%3B%0A%20%20%20%20%20%20if%20%28amount%20%3C%200%29%20%7B%20dir%20%3D%20%2D1%3B%20amount%20%3D%20%2Damount%3B%20%7D%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%2C%20cur%20%3D%20clipPos%28this%2Edoc%2C%20from%29%3B%20i%20%3C%20amount%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20coords%20%3D%20cursorCoords%28this%2C%20cur%2C%20%22div%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28x%20%3D%3D%20null%29%20x%20%3D%20coords%2Eleft%3B%0A%20%20%20%20%20%20%20%20else%20coords%2Eleft%20%3D%20x%3B%0A%20%20%20%20%20%20%20%20cur%20%3D%20findPosV%28this%2C%20coords%2C%20dir%2C%20unit%29%3B%0A%20%20%20%20%20%20%20%20if%20%28cur%2EhitSide%29%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20cur%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20moveV%3A%20methodOp%28function%28dir%2C%20unit%29%20%7B%0A%20%20%20%20%20%20var%20cm%20%3D%20this%2C%20doc%20%3D%20this%2Edoc%2C%20goals%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20var%20collapse%20%3D%20%21cm%2Edisplay%2Eshift%20%26%26%20%21doc%2Eextend%20%26%26%20doc%2Esel%2EsomethingSelected%28%29%3B%0A%20%20%20%20%20%20doc%2EextendSelectionsBy%28function%28range%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28collapse%29%0A%20%20%20%20%20%20%20%20%20%20return%20dir%20%3C%200%20%3F%20range%2Efrom%28%29%20%3A%20range%2Eto%28%29%3B%0A%20%20%20%20%20%20%20%20var%20headPos%20%3D%20cursorCoords%28cm%2C%20range%2Ehead%2C%20%22div%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28range%2EgoalColumn%20%21%3D%20null%29%20headPos%2Eleft%20%3D%20range%2EgoalColumn%3B%0A%20%20%20%20%20%20%20%20goals%2Epush%28headPos%2Eleft%29%3B%0A%20%20%20%20%20%20%20%20var%20pos%20%3D%20findPosV%28cm%2C%20headPos%2C%20dir%2C%20unit%29%3B%0A%20%20%20%20%20%20%20%20if%20%28unit%20%3D%3D%20%22page%22%20%26%26%20range%20%3D%3D%20doc%2Esel%2Eprimary%28%29%29%0A%20%20%20%20%20%20%20%20%20%20addToScrollPos%28cm%2C%20null%2C%20charCoords%28cm%2C%20pos%2C%20%22div%22%29%2Etop%20%2D%20headPos%2Etop%29%3B%0A%20%20%20%20%20%20%20%20return%20pos%3B%0A%20%20%20%20%20%20%7D%2C%20sel%5Fmove%29%3B%0A%20%20%20%20%20%20if%20%28goals%2Elength%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20doc%2Esel%2Eranges%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20doc%2Esel%2Eranges%5Bi%5D%2EgoalColumn%20%3D%20goals%5Bi%5D%3B%0A%20%20%20%20%7D%29%2C%0A%0A%20%20%20%20%2F%2F%20Find%20the%20word%20at%20the%20given%20position%20%28as%20returned%20by%20coordsChar%29%2E%0A%20%20%20%20findWordAt%3A%20function%28pos%29%20%7B%0A%20%20%20%20%20%20var%20doc%20%3D%20this%2Edoc%2C%20line%20%3D%20getLine%28doc%2C%20pos%2Eline%29%2Etext%3B%0A%20%20%20%20%20%20var%20start%20%3D%20pos%2Ech%2C%20end%20%3D%20pos%2Ech%3B%0A%20%20%20%20%20%20if%20%28line%29%20%7B%0A%20%20%20%20%20%20%20%20var%20helper%20%3D%20this%2EgetHelper%28pos%2C%20%22wordChars%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%28pos%2ExRel%20%3C%200%20%7C%7C%20end%20%3D%3D%20line%2Elength%29%20%26%26%20start%29%20%2D%2Dstart%3B%20else%20%2B%2Bend%3B%0A%20%20%20%20%20%20%20%20var%20startChar%20%3D%20line%2EcharAt%28start%29%3B%0A%20%20%20%20%20%20%20%20var%20check%20%3D%20isWordChar%28startChar%2C%20helper%29%0A%20%20%20%20%20%20%20%20%20%20%3F%20function%28ch%29%20%7B%20return%20isWordChar%28ch%2C%20helper%29%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%3A%20%2F%5Cs%2F%2Etest%28startChar%29%20%3F%20function%28ch%29%20%7Breturn%20%2F%5Cs%2F%2Etest%28ch%29%3B%7D%0A%20%20%20%20%20%20%20%20%20%20%3A%20function%28ch%29%20%7Breturn%20%21%2F%5Cs%2F%2Etest%28ch%29%20%26%26%20%21isWordChar%28ch%29%3B%7D%3B%0A%20%20%20%20%20%20%20%20while%20%28start%20%3E%200%20%26%26%20check%28line%2EcharAt%28start%20%2D%201%29%29%29%20%2D%2Dstart%3B%0A%20%20%20%20%20%20%20%20while%20%28end%20%3C%20line%2Elength%20%26%26%20check%28line%2EcharAt%28end%29%29%29%20%2B%2Bend%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20new%20Range%28Pos%28pos%2Eline%2C%20start%29%2C%20Pos%28pos%2Eline%2C%20end%29%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20toggleOverwrite%3A%20function%28value%29%20%7B%0A%20%20%20%20%20%20if%20%28value%20%21%3D%20null%20%26%26%20value%20%3D%3D%20this%2Estate%2Eoverwrite%29%20return%3B%0A%20%20%20%20%20%20if%20%28this%2Estate%2Eoverwrite%20%3D%20%21this%2Estate%2Eoverwrite%29%0A%20%20%20%20%20%20%20%20addClass%28this%2Edisplay%2EcursorDiv%2C%20%22CodeMirror%2Doverwrite%22%29%3B%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20rmClass%28this%2Edisplay%2EcursorDiv%2C%20%22CodeMirror%2Doverwrite%22%29%3B%0A%0A%20%20%20%20%20%20signal%28this%2C%20%22overwriteToggle%22%2C%20this%2C%20this%2Estate%2Eoverwrite%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20hasFocus%3A%20function%28%29%20%7B%20return%20this%2Edisplay%2Einput%2EgetField%28%29%20%3D%3D%20activeElt%28%29%3B%20%7D%2C%0A%20%20%20%20isReadOnly%3A%20function%28%29%20%7B%20return%20%21%21%28this%2Eoptions%2EreadOnly%20%7C%7C%20this%2Edoc%2EcantEdit%29%3B%20%7D%2C%0A%0A%20%20%20%20scrollTo%3A%20methodOp%28function%28x%2C%20y%29%20%7B%0A%20%20%20%20%20%20if%20%28x%20%21%3D%20null%20%7C%7C%20y%20%21%3D%20null%29%20resolveScrollToPos%28this%29%3B%0A%20%20%20%20%20%20if%20%28x%20%21%3D%20null%29%20this%2EcurOp%2EscrollLeft%20%3D%20x%3B%0A%20%20%20%20%20%20if%20%28y%20%21%3D%20null%29%20this%2EcurOp%2EscrollTop%20%3D%20y%3B%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20getScrollInfo%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20scroller%20%3D%20this%2Edisplay%2Escroller%3B%0A%20%20%20%20%20%20return%20%7Bleft%3A%20scroller%2EscrollLeft%2C%20top%3A%20scroller%2EscrollTop%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20height%3A%20scroller%2EscrollHeight%20%2D%20scrollGap%28this%29%20%2D%20this%2Edisplay%2EbarHeight%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20width%3A%20scroller%2EscrollWidth%20%2D%20scrollGap%28this%29%20%2D%20this%2Edisplay%2EbarWidth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20clientHeight%3A%20displayHeight%28this%29%2C%20clientWidth%3A%20displayWidth%28this%29%7D%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20scrollIntoView%3A%20methodOp%28function%28range%2C%20margin%29%20%7B%0A%20%20%20%20%20%20if%20%28range%20%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20range%20%3D%20%7Bfrom%3A%20this%2Edoc%2Esel%2Eprimary%28%29%2Ehead%2C%20to%3A%20null%7D%3B%0A%20%20%20%20%20%20%20%20if%20%28margin%20%3D%3D%20null%29%20margin%20%3D%20this%2Eoptions%2EcursorScrollMargin%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28typeof%20range%20%3D%3D%20%22number%22%29%20%7B%0A%20%20%20%20%20%20%20%20range%20%3D%20%7Bfrom%3A%20Pos%28range%2C%200%29%2C%20to%3A%20null%7D%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28range%2Efrom%20%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20range%20%3D%20%7Bfrom%3A%20range%2C%20to%3A%20null%7D%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28%21range%2Eto%29%20range%2Eto%20%3D%20range%2Efrom%3B%0A%20%20%20%20%20%20range%2Emargin%20%3D%20margin%20%7C%7C%200%3B%0A%0A%20%20%20%20%20%20if%20%28range%2Efrom%2Eline%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20resolveScrollToPos%28this%29%3B%0A%20%20%20%20%20%20%20%20this%2EcurOp%2EscrollToPos%20%3D%20range%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20var%20sPos%20%3D%20calculateScrollPos%28this%2C%20Math%2Emin%28range%2Efrom%2Eleft%2C%20range%2Eto%2Eleft%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Math%2Emin%28range%2Efrom%2Etop%2C%20range%2Eto%2Etop%29%20%2D%20range%2Emargin%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Math%2Emax%28range%2Efrom%2Eright%2C%20range%2Eto%2Eright%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Math%2Emax%28range%2Efrom%2Ebottom%2C%20range%2Eto%2Ebottom%29%20%2B%20range%2Emargin%29%3B%0A%20%20%20%20%20%20%20%20this%2EscrollTo%28sPos%2EscrollLeft%2C%20sPos%2EscrollTop%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%2C%0A%0A%20%20%20%20setSize%3A%20methodOp%28function%28width%2C%20height%29%20%7B%0A%20%20%20%20%20%20var%20cm%20%3D%20this%3B%0A%20%20%20%20%20%20function%20interpret%28val%29%20%7B%0A%20%20%20%20%20%20%20%20return%20typeof%20val%20%3D%3D%20%22number%22%20%7C%7C%20%2F%5E%5Cd%2B%24%2F%2Etest%28String%28val%29%29%20%3F%20val%20%2B%20%22px%22%20%3A%20val%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28width%20%21%3D%20null%29%20cm%2Edisplay%2Ewrapper%2Estyle%2Ewidth%20%3D%20interpret%28width%29%3B%0A%20%20%20%20%20%20if%20%28height%20%21%3D%20null%29%20cm%2Edisplay%2Ewrapper%2Estyle%2Eheight%20%3D%20interpret%28height%29%3B%0A%20%20%20%20%20%20if%20%28cm%2Eoptions%2ElineWrapping%29%20clearLineMeasurementCache%28this%29%3B%0A%20%20%20%20%20%20var%20lineNo%20%3D%20cm%2Edisplay%2EviewFrom%3B%0A%20%20%20%20%20%20cm%2Edoc%2Eiter%28lineNo%2C%20cm%2Edisplay%2EviewTo%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28line%2Ewidgets%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20line%2Ewidgets%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20%20%20if%20%28line%2Ewidgets%5Bi%5D%2EnoHScroll%29%20%7B%20regLineChange%28cm%2C%20lineNo%2C%20%22widget%22%29%3B%20break%3B%20%7D%0A%20%20%20%20%20%20%20%20%2B%2BlineNo%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20cm%2EcurOp%2EforceUpdate%20%3D%20true%3B%0A%20%20%20%20%20%20signal%28cm%2C%20%22refresh%22%2C%20this%29%3B%0A%20%20%20%20%7D%29%2C%0A%0A%20%20%20%20operation%3A%20function%28f%29%7Breturn%20runInOp%28this%2C%20f%29%3B%7D%2C%0A%0A%20%20%20%20refresh%3A%20methodOp%28function%28%29%20%7B%0A%20%20%20%20%20%20var%20oldHeight%20%3D%20this%2Edisplay%2EcachedTextHeight%3B%0A%20%20%20%20%20%20regChange%28this%29%3B%0A%20%20%20%20%20%20this%2EcurOp%2EforceUpdate%20%3D%20true%3B%0A%20%20%20%20%20%20clearCaches%28this%29%3B%0A%20%20%20%20%20%20this%2EscrollTo%28this%2Edoc%2EscrollLeft%2C%20this%2Edoc%2EscrollTop%29%3B%0A%20%20%20%20%20%20updateGutterSpace%28this%29%3B%0A%20%20%20%20%20%20if%20%28oldHeight%20%3D%3D%20null%20%7C%7C%20Math%2Eabs%28oldHeight%20%2D%20textHeight%28this%2Edisplay%29%29%20%3E%20%2E5%29%0A%20%20%20%20%20%20%20%20estimateLineHeights%28this%29%3B%0A%20%20%20%20%20%20signal%28this%2C%20%22refresh%22%2C%20this%29%3B%0A%20%20%20%20%7D%29%2C%0A%0A%20%20%20%20swapDoc%3A%20methodOp%28function%28doc%29%20%7B%0A%20%20%20%20%20%20var%20old%20%3D%20this%2Edoc%3B%0A%20%20%20%20%20%20old%2Ecm%20%3D%20null%3B%0A%20%20%20%20%20%20attachDoc%28this%2C%20doc%29%3B%0A%20%20%20%20%20%20clearCaches%28this%29%3B%0A%20%20%20%20%20%20this%2Edisplay%2Einput%2Ereset%28%29%3B%0A%20%20%20%20%20%20this%2EscrollTo%28doc%2EscrollLeft%2C%20doc%2EscrollTop%29%3B%0A%20%20%20%20%20%20this%2EcurOp%2EforceScroll%20%3D%20true%3B%0A%20%20%20%20%20%20signalLater%28this%2C%20%22swapDoc%22%2C%20this%2C%20old%29%3B%0A%20%20%20%20%20%20return%20old%3B%0A%20%20%20%20%7D%29%2C%0A%0A%20%20%20%20getInputField%3A%20function%28%29%7Breturn%20this%2Edisplay%2Einput%2EgetField%28%29%3B%7D%2C%0A%20%20%20%20getWrapperElement%3A%20function%28%29%7Breturn%20this%2Edisplay%2Ewrapper%3B%7D%2C%0A%20%20%20%20getScrollerElement%3A%20function%28%29%7Breturn%20this%2Edisplay%2Escroller%3B%7D%2C%0A%20%20%20%20getGutterElement%3A%20function%28%29%7Breturn%20this%2Edisplay%2Egutters%3B%7D%0A%20%20%7D%3B%0A%20%20eventMixin%28CodeMirror%29%3B%0A%0A%20%20%2F%2F%20OPTION%20DEFAULTS%0A%0A%20%20%2F%2F%20The%20default%20configuration%20options%2E%0A%20%20var%20defaults%20%3D%20CodeMirror%2Edefaults%20%3D%20%7B%7D%3B%0A%20%20%2F%2F%20Functions%20to%20run%20when%20options%20are%20changed%2E%0A%20%20var%20optionHandlers%20%3D%20CodeMirror%2EoptionHandlers%20%3D%20%7B%7D%3B%0A%0A%20%20function%20option%28name%2C%20deflt%2C%20handle%2C%20notOnInit%29%20%7B%0A%20%20%20%20CodeMirror%2Edefaults%5Bname%5D%20%3D%20deflt%3B%0A%20%20%20%20if%20%28handle%29%20optionHandlers%5Bname%5D%20%3D%0A%20%20%20%20%20%20notOnInit%20%3F%20function%28cm%2C%20val%2C%20old%29%20%7Bif%20%28old%20%21%3D%20Init%29%20handle%28cm%2C%20val%2C%20old%29%3B%7D%20%3A%20handle%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Passed%20to%20option%20handlers%20when%20there%20is%20no%20old%20value%2E%0A%20%20var%20Init%20%3D%20CodeMirror%2EInit%20%3D%20%7BtoString%3A%20function%28%29%7Breturn%20%22CodeMirror%2EInit%22%3B%7D%7D%3B%0A%0A%20%20%2F%2F%20These%20two%20are%2C%20on%20init%2C%20called%20from%20the%20constructor%20because%20they%0A%20%20%2F%2F%20have%20to%20be%20initialized%20before%20the%20editor%20can%20start%20at%20all%2E%0A%20%20option%28%22value%22%2C%20%22%22%2C%20function%28cm%2C%20val%29%20%7B%0A%20%20%20%20cm%2EsetValue%28val%29%3B%0A%20%20%7D%2C%20true%29%3B%0A%20%20option%28%22mode%22%2C%20null%2C%20function%28cm%2C%20val%29%20%7B%0A%20%20%20%20cm%2Edoc%2EmodeOption%20%3D%20val%3B%0A%20%20%20%20loadMode%28cm%29%3B%0A%20%20%7D%2C%20true%29%3B%0A%0A%20%20option%28%22indentUnit%22%2C%202%2C%20loadMode%2C%20true%29%3B%0A%20%20option%28%22indentWithTabs%22%2C%20false%29%3B%0A%20%20option%28%22smartIndent%22%2C%20true%29%3B%0A%20%20option%28%22tabSize%22%2C%204%2C%20function%28cm%29%20%7B%0A%20%20%20%20resetModeState%28cm%29%3B%0A%20%20%20%20clearCaches%28cm%29%3B%0A%20%20%20%20regChange%28cm%29%3B%0A%20%20%7D%2C%20true%29%3B%0A%20%20option%28%22lineSeparator%22%2C%20null%2C%20function%28cm%2C%20val%29%20%7B%0A%20%20%20%20cm%2Edoc%2ElineSep%20%3D%20val%3B%0A%20%20%20%20if%20%28%21val%29%20return%3B%0A%20%20%20%20var%20newBreaks%20%3D%20%5B%5D%2C%20lineNo%20%3D%20cm%2Edoc%2Efirst%3B%0A%20%20%20%20cm%2Edoc%2Eiter%28function%28line%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20pos%20%3D%200%3B%3B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20found%20%3D%20line%2Etext%2EindexOf%28val%2C%20pos%29%3B%0A%20%20%20%20%20%20%20%20if%20%28found%20%3D%3D%20%2D1%29%20break%3B%0A%20%20%20%20%20%20%20%20pos%20%3D%20found%20%2B%20val%2Elength%3B%0A%20%20%20%20%20%20%20%20newBreaks%2Epush%28Pos%28lineNo%2C%20found%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20lineNo%2B%2B%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%20newBreaks%2Elength%20%2D%201%3B%20i%20%3E%3D%200%3B%20i%2D%2D%29%0A%20%20%20%20%20%20replaceRange%28cm%2Edoc%2C%20val%2C%20newBreaks%5Bi%5D%2C%20Pos%28newBreaks%5Bi%5D%2Eline%2C%20newBreaks%5Bi%5D%2Ech%20%2B%20val%2Elength%29%29%0A%20%20%7D%29%3B%0A%20%20option%28%22specialChars%22%2C%20%2F%5B%5Ct%5Cu0000%2D%5Cu0019%5Cu00ad%5Cu200b%2D%5Cu200f%5Cu2028%5Cu2029%5Cufeff%5D%2Fg%2C%20function%28cm%2C%20val%2C%20old%29%20%7B%0A%20%20%20%20cm%2Estate%2EspecialChars%20%3D%20new%20RegExp%28val%2Esource%20%2B%20%28val%2Etest%28%22%5Ct%22%29%20%3F%20%22%22%20%3A%20%22%7C%5Ct%22%29%2C%20%22g%22%29%3B%0A%20%20%20%20if%20%28old%20%21%3D%20CodeMirror%2EInit%29%20cm%2Erefresh%28%29%3B%0A%20%20%7D%29%3B%0A%20%20option%28%22specialCharPlaceholder%22%2C%20defaultSpecialCharPlaceholder%2C%20function%28cm%29%20%7Bcm%2Erefresh%28%29%3B%7D%2C%20true%29%3B%0A%20%20option%28%22electricChars%22%2C%20true%29%3B%0A%20%20option%28%22inputStyle%22%2C%20mobile%20%3F%20%22contenteditable%22%20%3A%20%22textarea%22%2C%20function%28%29%20%7B%0A%20%20%20%20throw%20new%20Error%28%22inputStyle%20can%20not%20%28yet%29%20be%20changed%20in%20a%20running%20editor%22%29%3B%20%2F%2F%20FIXME%0A%20%20%7D%2C%20true%29%3B%0A%20%20option%28%22rtlMoveVisually%22%2C%20%21windows%29%3B%0A%20%20option%28%22wholeLineUpdateBefore%22%2C%20true%29%3B%0A%0A%20%20option%28%22theme%22%2C%20%22default%22%2C%20function%28cm%29%20%7B%0A%20%20%20%20themeChanged%28cm%29%3B%0A%20%20%20%20guttersChanged%28cm%29%3B%0A%20%20%7D%2C%20true%29%3B%0A%20%20option%28%22keyMap%22%2C%20%22default%22%2C%20function%28cm%2C%20val%2C%20old%29%20%7B%0A%20%20%20%20var%20next%20%3D%20getKeyMap%28val%29%3B%0A%20%20%20%20var%20prev%20%3D%20old%20%21%3D%20CodeMirror%2EInit%20%26%26%20getKeyMap%28old%29%3B%0A%20%20%20%20if%20%28prev%20%26%26%20prev%2Edetach%29%20prev%2Edetach%28cm%2C%20next%29%3B%0A%20%20%20%20if%20%28next%2Eattach%29%20next%2Eattach%28cm%2C%20prev%20%7C%7C%20null%29%3B%0A%20%20%7D%29%3B%0A%20%20option%28%22extraKeys%22%2C%20null%29%3B%0A%0A%20%20option%28%22lineWrapping%22%2C%20false%2C%20wrappingChanged%2C%20true%29%3B%0A%20%20option%28%22gutters%22%2C%20%5B%5D%2C%20function%28cm%29%20%7B%0A%20%20%20%20setGuttersForLineNumbers%28cm%2Eoptions%29%3B%0A%20%20%20%20guttersChanged%28cm%29%3B%0A%20%20%7D%2C%20true%29%3B%0A%20%20option%28%22fixedGutter%22%2C%20true%2C%20function%28cm%2C%20val%29%20%7B%0A%20%20%20%20cm%2Edisplay%2Egutters%2Estyle%2Eleft%20%3D%20val%20%3F%20compensateForHScroll%28cm%2Edisplay%29%20%2B%20%22px%22%20%3A%20%220%22%3B%0A%20%20%20%20cm%2Erefresh%28%29%3B%0A%20%20%7D%2C%20true%29%3B%0A%20%20option%28%22coverGutterNextToScrollbar%22%2C%20false%2C%20function%28cm%29%20%7BupdateScrollbars%28cm%29%3B%7D%2C%20true%29%3B%0A%20%20option%28%22scrollbarStyle%22%2C%20%22native%22%2C%20function%28cm%29%20%7B%0A%20%20%20%20initScrollbars%28cm%29%3B%0A%20%20%20%20updateScrollbars%28cm%29%3B%0A%20%20%20%20cm%2Edisplay%2Escrollbars%2EsetScrollTop%28cm%2Edoc%2EscrollTop%29%3B%0A%20%20%20%20cm%2Edisplay%2Escrollbars%2EsetScrollLeft%28cm%2Edoc%2EscrollLeft%29%3B%0A%20%20%7D%2C%20true%29%3B%0A%20%20option%28%22lineNumbers%22%2C%20false%2C%20function%28cm%29%20%7B%0A%20%20%20%20setGuttersForLineNumbers%28cm%2Eoptions%29%3B%0A%20%20%20%20guttersChanged%28cm%29%3B%0A%20%20%7D%2C%20true%29%3B%0A%20%20option%28%22firstLineNumber%22%2C%201%2C%20guttersChanged%2C%20true%29%3B%0A%20%20option%28%22lineNumberFormatter%22%2C%20function%28integer%29%20%7Breturn%20integer%3B%7D%2C%20guttersChanged%2C%20true%29%3B%0A%20%20option%28%22showCursorWhenSelecting%22%2C%20false%2C%20updateSelection%2C%20true%29%3B%0A%0A%20%20option%28%22resetSelectionOnContextMenu%22%2C%20true%29%3B%0A%20%20option%28%22lineWiseCopyCut%22%2C%20true%29%3B%0A%0A%20%20option%28%22readOnly%22%2C%20false%2C%20function%28cm%2C%20val%29%20%7B%0A%20%20%20%20if%20%28val%20%3D%3D%20%22nocursor%22%29%20%7B%0A%20%20%20%20%20%20onBlur%28cm%29%3B%0A%20%20%20%20%20%20cm%2Edisplay%2Einput%2Eblur%28%29%3B%0A%20%20%20%20%20%20cm%2Edisplay%2Edisabled%20%3D%20true%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20cm%2Edisplay%2Edisabled%20%3D%20false%3B%0A%20%20%20%20%7D%0A%20%20%20%20cm%2Edisplay%2Einput%2EreadOnlyChanged%28val%29%0A%20%20%7D%29%3B%0A%20%20option%28%22disableInput%22%2C%20false%2C%20function%28cm%2C%20val%29%20%7Bif%20%28%21val%29%20cm%2Edisplay%2Einput%2Ereset%28%29%3B%7D%2C%20true%29%3B%0A%20%20option%28%22dragDrop%22%2C%20true%2C%20dragDropChanged%29%3B%0A%20%20option%28%22allowDropFileTypes%22%2C%20null%29%3B%0A%0A%20%20option%28%22cursorBlinkRate%22%2C%20530%29%3B%0A%20%20option%28%22cursorScrollMargin%22%2C%200%29%3B%0A%20%20option%28%22cursorHeight%22%2C%201%2C%20updateSelection%2C%20true%29%3B%0A%20%20option%28%22singleCursorHeightPerLine%22%2C%20true%2C%20updateSelection%2C%20true%29%3B%0A%20%20option%28%22workTime%22%2C%20100%29%3B%0A%20%20option%28%22workDelay%22%2C%20100%29%3B%0A%20%20option%28%22flattenSpans%22%2C%20true%2C%20resetModeState%2C%20true%29%3B%0A%20%20option%28%22addModeClass%22%2C%20false%2C%20resetModeState%2C%20true%29%3B%0A%20%20option%28%22pollInterval%22%2C%20100%29%3B%0A%20%20option%28%22undoDepth%22%2C%20200%2C%20function%28cm%2C%20val%29%7Bcm%2Edoc%2Ehistory%2EundoDepth%20%3D%20val%3B%7D%29%3B%0A%20%20option%28%22historyEventDelay%22%2C%201250%29%3B%0A%20%20option%28%22viewportMargin%22%2C%2010%2C%20function%28cm%29%7Bcm%2Erefresh%28%29%3B%7D%2C%20true%29%3B%0A%20%20option%28%22maxHighlightLength%22%2C%2010000%2C%20resetModeState%2C%20true%29%3B%0A%20%20option%28%22moveInputWithCursor%22%2C%20true%2C%20function%28cm%2C%20val%29%20%7B%0A%20%20%20%20if%20%28%21val%29%20cm%2Edisplay%2Einput%2EresetPosition%28%29%3B%0A%20%20%7D%29%3B%0A%0A%20%20option%28%22tabindex%22%2C%20null%2C%20function%28cm%2C%20val%29%20%7B%0A%20%20%20%20cm%2Edisplay%2Einput%2EgetField%28%29%2EtabIndex%20%3D%20val%20%7C%7C%20%22%22%3B%0A%20%20%7D%29%3B%0A%20%20option%28%22autofocus%22%2C%20null%29%3B%0A%0A%20%20%2F%2F%20MODE%20DEFINITION%20AND%20QUERYING%0A%0A%20%20%2F%2F%20Known%20modes%2C%20by%20name%20and%20by%20MIME%0A%20%20var%20modes%20%3D%20CodeMirror%2Emodes%20%3D%20%7B%7D%2C%20mimeModes%20%3D%20CodeMirror%2EmimeModes%20%3D%20%7B%7D%3B%0A%0A%20%20%2F%2F%20Extra%20arguments%20are%20stored%20as%20the%20mode%27s%20dependencies%2C%20which%20is%0A%20%20%2F%2F%20used%20by%20%28legacy%29%20mechanisms%20like%20loadmode%2Ejs%20to%20automatically%0A%20%20%2F%2F%20load%20a%20mode%2E%20%28Preferred%20mechanism%20is%20the%20require%2Fdefine%20calls%2E%29%0A%20%20CodeMirror%2EdefineMode%20%3D%20function%28name%2C%20mode%29%20%7B%0A%20%20%20%20if%20%28%21CodeMirror%2Edefaults%2Emode%20%26%26%20name%20%21%3D%20%22null%22%29%20CodeMirror%2Edefaults%2Emode%20%3D%20name%3B%0A%20%20%20%20if%20%28arguments%2Elength%20%3E%202%29%0A%20%20%20%20%20%20mode%2Edependencies%20%3D%20Array%2Eprototype%2Eslice%2Ecall%28arguments%2C%202%29%3B%0A%20%20%20%20modes%5Bname%5D%20%3D%20mode%3B%0A%20%20%7D%3B%0A%0A%20%20CodeMirror%2EdefineMIME%20%3D%20function%28mime%2C%20spec%29%20%7B%0A%20%20%20%20mimeModes%5Bmime%5D%20%3D%20spec%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Given%20a%20MIME%20type%2C%20a%20%7Bname%2C%20%2E%2E%2Eoptions%7D%20config%20object%2C%20or%20a%20name%0A%20%20%2F%2F%20string%2C%20return%20a%20mode%20config%20object%2E%0A%20%20CodeMirror%2EresolveMode%20%3D%20function%28spec%29%20%7B%0A%20%20%20%20if%20%28typeof%20spec%20%3D%3D%20%22string%22%20%26%26%20mimeModes%2EhasOwnProperty%28spec%29%29%20%7B%0A%20%20%20%20%20%20spec%20%3D%20mimeModes%5Bspec%5D%3B%0A%20%20%20%20%7D%20else%20if%20%28spec%20%26%26%20typeof%20spec%2Ename%20%3D%3D%20%22string%22%20%26%26%20mimeModes%2EhasOwnProperty%28spec%2Ename%29%29%20%7B%0A%20%20%20%20%20%20var%20found%20%3D%20mimeModes%5Bspec%2Ename%5D%3B%0A%20%20%20%20%20%20if%20%28typeof%20found%20%3D%3D%20%22string%22%29%20found%20%3D%20%7Bname%3A%20found%7D%3B%0A%20%20%20%20%20%20spec%20%3D%20createObj%28found%2C%20spec%29%3B%0A%20%20%20%20%20%20spec%2Ename%20%3D%20found%2Ename%3B%0A%20%20%20%20%7D%20else%20if%20%28typeof%20spec%20%3D%3D%20%22string%22%20%26%26%20%2F%5E%5B%5Cw%5C%2D%5D%2B%5C%2F%5B%5Cw%5C%2D%5D%2B%5C%2Bxml%24%2F%2Etest%28spec%29%29%20%7B%0A%20%20%20%20%20%20return%20CodeMirror%2EresolveMode%28%22application%2Fxml%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28typeof%20spec%20%3D%3D%20%22string%22%29%20return%20%7Bname%3A%20spec%7D%3B%0A%20%20%20%20else%20return%20spec%20%7C%7C%20%7Bname%3A%20%22null%22%7D%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Given%20a%20mode%20spec%20%28anything%20that%20resolveMode%20accepts%29%2C%20find%20and%0A%20%20%2F%2F%20initialize%20an%20actual%20mode%20object%2E%0A%20%20CodeMirror%2EgetMode%20%3D%20function%28options%2C%20spec%29%20%7B%0A%20%20%20%20var%20spec%20%3D%20CodeMirror%2EresolveMode%28spec%29%3B%0A%20%20%20%20var%20mfactory%20%3D%20modes%5Bspec%2Ename%5D%3B%0A%20%20%20%20if%20%28%21mfactory%29%20return%20CodeMirror%2EgetMode%28options%2C%20%22text%2Fplain%22%29%3B%0A%20%20%20%20var%20modeObj%20%3D%20mfactory%28options%2C%20spec%29%3B%0A%20%20%20%20if%20%28modeExtensions%2EhasOwnProperty%28spec%2Ename%29%29%20%7B%0A%20%20%20%20%20%20var%20exts%20%3D%20modeExtensions%5Bspec%2Ename%5D%3B%0A%20%20%20%20%20%20for%20%28var%20prop%20in%20exts%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21exts%2EhasOwnProperty%28prop%29%29%20continue%3B%0A%20%20%20%20%20%20%20%20if%20%28modeObj%2EhasOwnProperty%28prop%29%29%20modeObj%5B%22%5F%22%20%2B%20prop%5D%20%3D%20modeObj%5Bprop%5D%3B%0A%20%20%20%20%20%20%20%20modeObj%5Bprop%5D%20%3D%20exts%5Bprop%5D%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20modeObj%2Ename%20%3D%20spec%2Ename%3B%0A%20%20%20%20if%20%28spec%2EhelperType%29%20modeObj%2EhelperType%20%3D%20spec%2EhelperType%3B%0A%20%20%20%20if%20%28spec%2EmodeProps%29%20for%20%28var%20prop%20in%20spec%2EmodeProps%29%0A%20%20%20%20%20%20modeObj%5Bprop%5D%20%3D%20spec%2EmodeProps%5Bprop%5D%3B%0A%0A%20%20%20%20return%20modeObj%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Minimal%20default%20mode%2E%0A%20%20CodeMirror%2EdefineMode%28%22null%22%2C%20function%28%29%20%7B%0A%20%20%20%20return%20%7Btoken%3A%20function%28stream%29%20%7Bstream%2EskipToEnd%28%29%3B%7D%7D%3B%0A%20%20%7D%29%3B%0A%20%20CodeMirror%2EdefineMIME%28%22text%2Fplain%22%2C%20%22null%22%29%3B%0A%0A%20%20%2F%2F%20This%20can%20be%20used%20to%20attach%20properties%20to%20mode%20objects%20from%0A%20%20%2F%2F%20outside%20the%20actual%20mode%20definition%2E%0A%20%20var%20modeExtensions%20%3D%20CodeMirror%2EmodeExtensions%20%3D%20%7B%7D%3B%0A%20%20CodeMirror%2EextendMode%20%3D%20function%28mode%2C%20properties%29%20%7B%0A%20%20%20%20var%20exts%20%3D%20modeExtensions%2EhasOwnProperty%28mode%29%20%3F%20modeExtensions%5Bmode%5D%20%3A%20%28modeExtensions%5Bmode%5D%20%3D%20%7B%7D%29%3B%0A%20%20%20%20copyObj%28properties%2C%20exts%29%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20EXTENSIONS%0A%0A%20%20CodeMirror%2EdefineExtension%20%3D%20function%28name%2C%20func%29%20%7B%0A%20%20%20%20CodeMirror%2Eprototype%5Bname%5D%20%3D%20func%3B%0A%20%20%7D%3B%0A%20%20CodeMirror%2EdefineDocExtension%20%3D%20function%28name%2C%20func%29%20%7B%0A%20%20%20%20Doc%2Eprototype%5Bname%5D%20%3D%20func%3B%0A%20%20%7D%3B%0A%20%20CodeMirror%2EdefineOption%20%3D%20option%3B%0A%0A%20%20var%20initHooks%20%3D%20%5B%5D%3B%0A%20%20CodeMirror%2EdefineInitHook%20%3D%20function%28f%29%20%7BinitHooks%2Epush%28f%29%3B%7D%3B%0A%0A%20%20var%20helpers%20%3D%20CodeMirror%2Ehelpers%20%3D%20%7B%7D%3B%0A%20%20CodeMirror%2EregisterHelper%20%3D%20function%28type%2C%20name%2C%20value%29%20%7B%0A%20%20%20%20if%20%28%21helpers%2EhasOwnProperty%28type%29%29%20helpers%5Btype%5D%20%3D%20CodeMirror%5Btype%5D%20%3D%20%7B%5Fglobal%3A%20%5B%5D%7D%3B%0A%20%20%20%20helpers%5Btype%5D%5Bname%5D%20%3D%20value%3B%0A%20%20%7D%3B%0A%20%20CodeMirror%2EregisterGlobalHelper%20%3D%20function%28type%2C%20name%2C%20predicate%2C%20value%29%20%7B%0A%20%20%20%20CodeMirror%2EregisterHelper%28type%2C%20name%2C%20value%29%3B%0A%20%20%20%20helpers%5Btype%5D%2E%5Fglobal%2Epush%28%7Bpred%3A%20predicate%2C%20val%3A%20value%7D%29%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20MODE%20STATE%20HANDLING%0A%0A%20%20%2F%2F%20Utility%20functions%20for%20working%20with%20state%2E%20Exported%20because%20nested%0A%20%20%2F%2F%20modes%20need%20to%20do%20this%20for%20their%20inner%20modes%2E%0A%0A%20%20var%20copyState%20%3D%20CodeMirror%2EcopyState%20%3D%20function%28mode%2C%20state%29%20%7B%0A%20%20%20%20if%20%28state%20%3D%3D%3D%20true%29%20return%20state%3B%0A%20%20%20%20if%20%28mode%2EcopyState%29%20return%20mode%2EcopyState%28state%29%3B%0A%20%20%20%20var%20nstate%20%3D%20%7B%7D%3B%0A%20%20%20%20for%20%28var%20n%20in%20state%29%20%7B%0A%20%20%20%20%20%20var%20val%20%3D%20state%5Bn%5D%3B%0A%20%20%20%20%20%20if%20%28val%20instanceof%20Array%29%20val%20%3D%20val%2Econcat%28%5B%5D%29%3B%0A%20%20%20%20%20%20nstate%5Bn%5D%20%3D%20val%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20nstate%3B%0A%20%20%7D%3B%0A%0A%20%20var%20startState%20%3D%20CodeMirror%2EstartState%20%3D%20function%28mode%2C%20a1%2C%20a2%29%20%7B%0A%20%20%20%20return%20mode%2EstartState%20%3F%20mode%2EstartState%28a1%2C%20a2%29%20%3A%20true%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Given%20a%20mode%20and%20a%20state%20%28for%20that%20mode%29%2C%20find%20the%20inner%20mode%20and%0A%20%20%2F%2F%20state%20at%20the%20position%20that%20the%20state%20refers%20to%2E%0A%20%20CodeMirror%2EinnerMode%20%3D%20function%28mode%2C%20state%29%20%7B%0A%20%20%20%20while%20%28mode%2EinnerMode%29%20%7B%0A%20%20%20%20%20%20var%20info%20%3D%20mode%2EinnerMode%28state%29%3B%0A%20%20%20%20%20%20if%20%28%21info%20%7C%7C%20info%2Emode%20%3D%3D%20mode%29%20break%3B%0A%20%20%20%20%20%20state%20%3D%20info%2Estate%3B%0A%20%20%20%20%20%20mode%20%3D%20info%2Emode%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20info%20%7C%7C%20%7Bmode%3A%20mode%2C%20state%3A%20state%7D%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20STANDARD%20COMMANDS%0A%0A%20%20%2F%2F%20Commands%20are%20parameter%2Dless%20actions%20that%20can%20be%20performed%20on%20an%0A%20%20%2F%2F%20editor%2C%20mostly%20used%20for%20keybindings%2E%0A%20%20var%20commands%20%3D%20CodeMirror%2Ecommands%20%3D%20%7B%0A%20%20%20%20selectAll%3A%20function%28cm%29%20%7Bcm%2EsetSelection%28Pos%28cm%2EfirstLine%28%29%2C%200%29%2C%20Pos%28cm%2ElastLine%28%29%29%2C%20sel%5FdontScroll%29%3B%7D%2C%0A%20%20%20%20singleSelection%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20cm%2EsetSelection%28cm%2EgetCursor%28%22anchor%22%29%2C%20cm%2EgetCursor%28%22head%22%29%2C%20sel%5FdontScroll%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20killLine%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20deleteNearSelection%28cm%2C%20function%28range%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28range%2Eempty%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20len%20%3D%20getLine%28cm%2Edoc%2C%20range%2Ehead%2Eline%29%2Etext%2Elength%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28range%2Ehead%2Ech%20%3D%3D%20len%20%26%26%20range%2Ehead%2Eline%20%3C%20cm%2ElastLine%28%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%7Bfrom%3A%20range%2Ehead%2C%20to%3A%20Pos%28range%2Ehead%2Eline%20%2B%201%2C%200%29%7D%3B%0A%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%7Bfrom%3A%20range%2Ehead%2C%20to%3A%20Pos%28range%2Ehead%2Eline%2C%20len%29%7D%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20%7Bfrom%3A%20range%2Efrom%28%29%2C%20to%3A%20range%2Eto%28%29%7D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20deleteLine%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20deleteNearSelection%28cm%2C%20function%28range%29%20%7B%0A%20%20%20%20%20%20%20%20return%20%7Bfrom%3A%20Pos%28range%2Efrom%28%29%2Eline%2C%200%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20to%3A%20clipPos%28cm%2Edoc%2C%20Pos%28range%2Eto%28%29%2Eline%20%2B%201%2C%200%29%29%7D%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20delLineLeft%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20deleteNearSelection%28cm%2C%20function%28range%29%20%7B%0A%20%20%20%20%20%20%20%20return%20%7Bfrom%3A%20Pos%28range%2Efrom%28%29%2Eline%2C%200%29%2C%20to%3A%20range%2Efrom%28%29%7D%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20delWrappedLineLeft%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20deleteNearSelection%28cm%2C%20function%28range%29%20%7B%0A%20%20%20%20%20%20%20%20var%20top%20%3D%20cm%2EcharCoords%28range%2Ehead%2C%20%22div%22%29%2Etop%20%2B%205%3B%0A%20%20%20%20%20%20%20%20var%20leftPos%20%3D%20cm%2EcoordsChar%28%7Bleft%3A%200%2C%20top%3A%20top%7D%2C%20%22div%22%29%3B%0A%20%20%20%20%20%20%20%20return%20%7Bfrom%3A%20leftPos%2C%20to%3A%20range%2Efrom%28%29%7D%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20delWrappedLineRight%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20deleteNearSelection%28cm%2C%20function%28range%29%20%7B%0A%20%20%20%20%20%20%20%20var%20top%20%3D%20cm%2EcharCoords%28range%2Ehead%2C%20%22div%22%29%2Etop%20%2B%205%3B%0A%20%20%20%20%20%20%20%20var%20rightPos%20%3D%20cm%2EcoordsChar%28%7Bleft%3A%20cm%2Edisplay%2ElineDiv%2EoffsetWidth%20%2B%20100%2C%20top%3A%20top%7D%2C%20%22div%22%29%3B%0A%20%20%20%20%20%20%20%20return%20%7Bfrom%3A%20range%2Efrom%28%29%2C%20to%3A%20rightPos%20%7D%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20undo%3A%20function%28cm%29%20%7Bcm%2Eundo%28%29%3B%7D%2C%0A%20%20%20%20redo%3A%20function%28cm%29%20%7Bcm%2Eredo%28%29%3B%7D%2C%0A%20%20%20%20undoSelection%3A%20function%28cm%29%20%7Bcm%2EundoSelection%28%29%3B%7D%2C%0A%20%20%20%20redoSelection%3A%20function%28cm%29%20%7Bcm%2EredoSelection%28%29%3B%7D%2C%0A%20%20%20%20goDocStart%3A%20function%28cm%29%20%7Bcm%2EextendSelection%28Pos%28cm%2EfirstLine%28%29%2C%200%29%29%3B%7D%2C%0A%20%20%20%20goDocEnd%3A%20function%28cm%29%20%7Bcm%2EextendSelection%28Pos%28cm%2ElastLine%28%29%29%29%3B%7D%2C%0A%20%20%20%20goLineStart%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20cm%2EextendSelectionsBy%28function%28range%29%20%7B%20return%20lineStart%28cm%2C%20range%2Ehead%2Eline%29%3B%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7Borigin%3A%20%22%2Bmove%22%2C%20bias%3A%201%7D%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20goLineStartSmart%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20cm%2EextendSelectionsBy%28function%28range%29%20%7B%0A%20%20%20%20%20%20%20%20return%20lineStartSmart%28cm%2C%20range%2Ehead%29%3B%0A%20%20%20%20%20%20%7D%2C%20%7Borigin%3A%20%22%2Bmove%22%2C%20bias%3A%201%7D%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20goLineEnd%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20cm%2EextendSelectionsBy%28function%28range%29%20%7B%20return%20lineEnd%28cm%2C%20range%2Ehead%2Eline%29%3B%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7Borigin%3A%20%22%2Bmove%22%2C%20bias%3A%20%2D1%7D%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20goLineRight%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20cm%2EextendSelectionsBy%28function%28range%29%20%7B%0A%20%20%20%20%20%20%20%20var%20top%20%3D%20cm%2EcharCoords%28range%2Ehead%2C%20%22div%22%29%2Etop%20%2B%205%3B%0A%20%20%20%20%20%20%20%20return%20cm%2EcoordsChar%28%7Bleft%3A%20cm%2Edisplay%2ElineDiv%2EoffsetWidth%20%2B%20100%2C%20top%3A%20top%7D%2C%20%22div%22%29%3B%0A%20%20%20%20%20%20%7D%2C%20sel%5Fmove%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20goLineLeft%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20cm%2EextendSelectionsBy%28function%28range%29%20%7B%0A%20%20%20%20%20%20%20%20var%20top%20%3D%20cm%2EcharCoords%28range%2Ehead%2C%20%22div%22%29%2Etop%20%2B%205%3B%0A%20%20%20%20%20%20%20%20return%20cm%2EcoordsChar%28%7Bleft%3A%200%2C%20top%3A%20top%7D%2C%20%22div%22%29%3B%0A%20%20%20%20%20%20%7D%2C%20sel%5Fmove%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20goLineLeftSmart%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20cm%2EextendSelectionsBy%28function%28range%29%20%7B%0A%20%20%20%20%20%20%20%20var%20top%20%3D%20cm%2EcharCoords%28range%2Ehead%2C%20%22div%22%29%2Etop%20%2B%205%3B%0A%20%20%20%20%20%20%20%20var%20pos%20%3D%20cm%2EcoordsChar%28%7Bleft%3A%200%2C%20top%3A%20top%7D%2C%20%22div%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28pos%2Ech%20%3C%20cm%2EgetLine%28pos%2Eline%29%2Esearch%28%2F%5CS%2F%29%29%20return%20lineStartSmart%28cm%2C%20range%2Ehead%29%3B%0A%20%20%20%20%20%20%20%20return%20pos%3B%0A%20%20%20%20%20%20%7D%2C%20sel%5Fmove%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20goLineUp%3A%20function%28cm%29%20%7Bcm%2EmoveV%28%2D1%2C%20%22line%22%29%3B%7D%2C%0A%20%20%20%20goLineDown%3A%20function%28cm%29%20%7Bcm%2EmoveV%281%2C%20%22line%22%29%3B%7D%2C%0A%20%20%20%20goPageUp%3A%20function%28cm%29%20%7Bcm%2EmoveV%28%2D1%2C%20%22page%22%29%3B%7D%2C%0A%20%20%20%20goPageDown%3A%20function%28cm%29%20%7Bcm%2EmoveV%281%2C%20%22page%22%29%3B%7D%2C%0A%20%20%20%20goCharLeft%3A%20function%28cm%29%20%7Bcm%2EmoveH%28%2D1%2C%20%22char%22%29%3B%7D%2C%0A%20%20%20%20goCharRight%3A%20function%28cm%29%20%7Bcm%2EmoveH%281%2C%20%22char%22%29%3B%7D%2C%0A%20%20%20%20goColumnLeft%3A%20function%28cm%29%20%7Bcm%2EmoveH%28%2D1%2C%20%22column%22%29%3B%7D%2C%0A%20%20%20%20goColumnRight%3A%20function%28cm%29%20%7Bcm%2EmoveH%281%2C%20%22column%22%29%3B%7D%2C%0A%20%20%20%20goWordLeft%3A%20function%28cm%29%20%7Bcm%2EmoveH%28%2D1%2C%20%22word%22%29%3B%7D%2C%0A%20%20%20%20goGroupRight%3A%20function%28cm%29%20%7Bcm%2EmoveH%281%2C%20%22group%22%29%3B%7D%2C%0A%20%20%20%20goGroupLeft%3A%20function%28cm%29%20%7Bcm%2EmoveH%28%2D1%2C%20%22group%22%29%3B%7D%2C%0A%20%20%20%20goWordRight%3A%20function%28cm%29%20%7Bcm%2EmoveH%281%2C%20%22word%22%29%3B%7D%2C%0A%20%20%20%20delCharBefore%3A%20function%28cm%29%20%7Bcm%2EdeleteH%28%2D1%2C%20%22char%22%29%3B%7D%2C%0A%20%20%20%20delCharAfter%3A%20function%28cm%29%20%7Bcm%2EdeleteH%281%2C%20%22char%22%29%3B%7D%2C%0A%20%20%20%20delWordBefore%3A%20function%28cm%29%20%7Bcm%2EdeleteH%28%2D1%2C%20%22word%22%29%3B%7D%2C%0A%20%20%20%20delWordAfter%3A%20function%28cm%29%20%7Bcm%2EdeleteH%281%2C%20%22word%22%29%3B%7D%2C%0A%20%20%20%20delGroupBefore%3A%20function%28cm%29%20%7Bcm%2EdeleteH%28%2D1%2C%20%22group%22%29%3B%7D%2C%0A%20%20%20%20delGroupAfter%3A%20function%28cm%29%20%7Bcm%2EdeleteH%281%2C%20%22group%22%29%3B%7D%2C%0A%20%20%20%20indentAuto%3A%20function%28cm%29%20%7Bcm%2EindentSelection%28%22smart%22%29%3B%7D%2C%0A%20%20%20%20indentMore%3A%20function%28cm%29%20%7Bcm%2EindentSelection%28%22add%22%29%3B%7D%2C%0A%20%20%20%20indentLess%3A%20function%28cm%29%20%7Bcm%2EindentSelection%28%22subtract%22%29%3B%7D%2C%0A%20%20%20%20insertTab%3A%20function%28cm%29%20%7Bcm%2EreplaceSelection%28%22%5Ct%22%29%3B%7D%2C%0A%20%20%20%20insertSoftTab%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20var%20spaces%20%3D%20%5B%5D%2C%20ranges%20%3D%20cm%2ElistSelections%28%29%2C%20tabSize%20%3D%20cm%2Eoptions%2EtabSize%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20pos%20%3D%20ranges%5Bi%5D%2Efrom%28%29%3B%0A%20%20%20%20%20%20%20%20var%20col%20%3D%20countColumn%28cm%2EgetLine%28pos%2Eline%29%2C%20pos%2Ech%2C%20tabSize%29%3B%0A%20%20%20%20%20%20%20%20spaces%2Epush%28new%20Array%28tabSize%20%2D%20col%20%25%20tabSize%20%2B%201%29%2Ejoin%28%22%20%22%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20cm%2EreplaceSelections%28spaces%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20defaultTab%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20if%20%28cm%2EsomethingSelected%28%29%29%20cm%2EindentSelection%28%22add%22%29%3B%0A%20%20%20%20%20%20else%20cm%2EexecCommand%28%22insertTab%22%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20transposeChars%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20runInOp%28cm%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20var%20ranges%20%3D%20cm%2ElistSelections%28%29%2C%20newSel%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20cur%20%3D%20ranges%5Bi%5D%2Ehead%2C%20line%20%3D%20getLine%28cm%2Edoc%2C%20cur%2Eline%29%2Etext%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28line%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28cur%2Ech%20%3D%3D%20line%2Elength%29%20cur%20%3D%20new%20Pos%28cur%2Eline%2C%20cur%2Ech%20%2D%201%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28cur%2Ech%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20cur%20%3D%20new%20Pos%28cur%2Eline%2C%20cur%2Ech%20%2B%201%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20cm%2EreplaceRange%28line%2EcharAt%28cur%2Ech%20%2D%201%29%20%2B%20line%2EcharAt%28cur%2Ech%20%2D%202%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Pos%28cur%2Eline%2C%20cur%2Ech%20%2D%202%29%2C%20cur%2C%20%22%2Btranspose%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20%28cur%2Eline%20%3E%20cm%2Edoc%2Efirst%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20prev%20%3D%20getLine%28cm%2Edoc%2C%20cur%2Eline%20%2D%201%29%2Etext%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28prev%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cm%2EreplaceRange%28line%2EcharAt%280%29%20%2B%20cm%2Edoc%2ElineSeparator%28%29%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prev%2EcharAt%28prev%2Elength%20%2D%201%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Pos%28cur%2Eline%20%2D%201%2C%20prev%2Elength%20%2D%201%29%2C%20Pos%28cur%2Eline%2C%201%29%2C%20%22%2Btranspose%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20newSel%2Epush%28new%20Range%28cur%2C%20cur%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20cm%2EsetSelections%28newSel%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20newlineAndIndent%3A%20function%28cm%29%20%7B%0A%20%20%20%20%20%20runInOp%28cm%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20var%20len%20%3D%20cm%2ElistSelections%28%29%2Elength%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20len%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20range%20%3D%20cm%2ElistSelections%28%29%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20cm%2EreplaceRange%28cm%2Edoc%2ElineSeparator%28%29%2C%20range%2Eanchor%2C%20range%2Ehead%2C%20%22%2Binput%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20cm%2EindentLine%28range%2Efrom%28%29%2Eline%20%2B%201%2C%20null%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20ensureCursorVisible%28cm%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20toggleOverwrite%3A%20function%28cm%29%20%7Bcm%2EtoggleOverwrite%28%29%3B%7D%0A%20%20%7D%3B%0A%0A%0A%20%20%2F%2F%20STANDARD%20KEYMAPS%0A%0A%20%20var%20keyMap%20%3D%20CodeMirror%2EkeyMap%20%3D%20%7B%7D%3B%0A%0A%20%20keyMap%2Ebasic%20%3D%20%7B%0A%20%20%20%20%22Left%22%3A%20%22goCharLeft%22%2C%20%22Right%22%3A%20%22goCharRight%22%2C%20%22Up%22%3A%20%22goLineUp%22%2C%20%22Down%22%3A%20%22goLineDown%22%2C%0A%20%20%20%20%22End%22%3A%20%22goLineEnd%22%2C%20%22Home%22%3A%20%22goLineStartSmart%22%2C%20%22PageUp%22%3A%20%22goPageUp%22%2C%20%22PageDown%22%3A%20%22goPageDown%22%2C%0A%20%20%20%20%22Delete%22%3A%20%22delCharAfter%22%2C%20%22Backspace%22%3A%20%22delCharBefore%22%2C%20%22Shift%2DBackspace%22%3A%20%22delCharBefore%22%2C%0A%20%20%20%20%22Tab%22%3A%20%22defaultTab%22%2C%20%22Shift%2DTab%22%3A%20%22indentAuto%22%2C%0A%20%20%20%20%22Enter%22%3A%20%22newlineAndIndent%22%2C%20%22Insert%22%3A%20%22toggleOverwrite%22%2C%0A%20%20%20%20%22Esc%22%3A%20%22singleSelection%22%0A%20%20%7D%3B%0A%20%20%2F%2F%20Note%20that%20the%20save%20and%20find%2Drelated%20commands%20aren%27t%20defined%20by%0A%20%20%2F%2F%20default%2E%20User%20code%20or%20addons%20can%20define%20them%2E%20Unknown%20commands%0A%20%20%2F%2F%20are%20simply%20ignored%2E%0A%20%20keyMap%2EpcDefault%20%3D%20%7B%0A%20%20%20%20%22Ctrl%2DA%22%3A%20%22selectAll%22%2C%20%22Ctrl%2DD%22%3A%20%22deleteLine%22%2C%20%22Ctrl%2DZ%22%3A%20%22undo%22%2C%20%22Shift%2DCtrl%2DZ%22%3A%20%22redo%22%2C%20%22Ctrl%2DY%22%3A%20%22redo%22%2C%0A%20%20%20%20%22Ctrl%2DHome%22%3A%20%22goDocStart%22%2C%20%22Ctrl%2DEnd%22%3A%20%22goDocEnd%22%2C%20%22Ctrl%2DUp%22%3A%20%22goLineUp%22%2C%20%22Ctrl%2DDown%22%3A%20%22goLineDown%22%2C%0A%20%20%20%20%22Ctrl%2DLeft%22%3A%20%22goGroupLeft%22%2C%20%22Ctrl%2DRight%22%3A%20%22goGroupRight%22%2C%20%22Alt%2DLeft%22%3A%20%22goLineStart%22%2C%20%22Alt%2DRight%22%3A%20%22goLineEnd%22%2C%0A%20%20%20%20%22Ctrl%2DBackspace%22%3A%20%22delGroupBefore%22%2C%20%22Ctrl%2DDelete%22%3A%20%22delGroupAfter%22%2C%20%22Ctrl%2DS%22%3A%20%22save%22%2C%20%22Ctrl%2DF%22%3A%20%22find%22%2C%0A%20%20%20%20%22Ctrl%2DG%22%3A%20%22findNext%22%2C%20%22Shift%2DCtrl%2DG%22%3A%20%22findPrev%22%2C%20%22Shift%2DCtrl%2DF%22%3A%20%22replace%22%2C%20%22Shift%2DCtrl%2DR%22%3A%20%22replaceAll%22%2C%0A%20%20%20%20%22Ctrl%2D%5B%22%3A%20%22indentLess%22%2C%20%22Ctrl%2D%5D%22%3A%20%22indentMore%22%2C%0A%20%20%20%20%22Ctrl%2DU%22%3A%20%22undoSelection%22%2C%20%22Shift%2DCtrl%2DU%22%3A%20%22redoSelection%22%2C%20%22Alt%2DU%22%3A%20%22redoSelection%22%2C%0A%20%20%20%20fallthrough%3A%20%22basic%22%0A%20%20%7D%3B%0A%20%20%2F%2F%20Very%20basic%20readline%2Femacs%2Dstyle%20bindings%2C%20which%20are%20standard%20on%20Mac%2E%0A%20%20keyMap%2Eemacsy%20%3D%20%7B%0A%20%20%20%20%22Ctrl%2DF%22%3A%20%22goCharRight%22%2C%20%22Ctrl%2DB%22%3A%20%22goCharLeft%22%2C%20%22Ctrl%2DP%22%3A%20%22goLineUp%22%2C%20%22Ctrl%2DN%22%3A%20%22goLineDown%22%2C%0A%20%20%20%20%22Alt%2DF%22%3A%20%22goWordRight%22%2C%20%22Alt%2DB%22%3A%20%22goWordLeft%22%2C%20%22Ctrl%2DA%22%3A%20%22goLineStart%22%2C%20%22Ctrl%2DE%22%3A%20%22goLineEnd%22%2C%0A%20%20%20%20%22Ctrl%2DV%22%3A%20%22goPageDown%22%2C%20%22Shift%2DCtrl%2DV%22%3A%20%22goPageUp%22%2C%20%22Ctrl%2DD%22%3A%20%22delCharAfter%22%2C%20%22Ctrl%2DH%22%3A%20%22delCharBefore%22%2C%0A%20%20%20%20%22Alt%2DD%22%3A%20%22delWordAfter%22%2C%20%22Alt%2DBackspace%22%3A%20%22delWordBefore%22%2C%20%22Ctrl%2DK%22%3A%20%22killLine%22%2C%20%22Ctrl%2DT%22%3A%20%22transposeChars%22%0A%20%20%7D%3B%0A%20%20keyMap%2EmacDefault%20%3D%20%7B%0A%20%20%20%20%22Cmd%2DA%22%3A%20%22selectAll%22%2C%20%22Cmd%2DD%22%3A%20%22deleteLine%22%2C%20%22Cmd%2DZ%22%3A%20%22undo%22%2C%20%22Shift%2DCmd%2DZ%22%3A%20%22redo%22%2C%20%22Cmd%2DY%22%3A%20%22redo%22%2C%0A%20%20%20%20%22Cmd%2DHome%22%3A%20%22goDocStart%22%2C%20%22Cmd%2DUp%22%3A%20%22goDocStart%22%2C%20%22Cmd%2DEnd%22%3A%20%22goDocEnd%22%2C%20%22Cmd%2DDown%22%3A%20%22goDocEnd%22%2C%20%22Alt%2DLeft%22%3A%20%22goGroupLeft%22%2C%0A%20%20%20%20%22Alt%2DRight%22%3A%20%22goGroupRight%22%2C%20%22Cmd%2DLeft%22%3A%20%22goLineLeft%22%2C%20%22Cmd%2DRight%22%3A%20%22goLineRight%22%2C%20%22Alt%2DBackspace%22%3A%20%22delGroupBefore%22%2C%0A%20%20%20%20%22Ctrl%2DAlt%2DBackspace%22%3A%20%22delGroupAfter%22%2C%20%22Alt%2DDelete%22%3A%20%22delGroupAfter%22%2C%20%22Cmd%2DS%22%3A%20%22save%22%2C%20%22Cmd%2DF%22%3A%20%22find%22%2C%0A%20%20%20%20%22Cmd%2DG%22%3A%20%22findNext%22%2C%20%22Shift%2DCmd%2DG%22%3A%20%22findPrev%22%2C%20%22Cmd%2DAlt%2DF%22%3A%20%22replace%22%2C%20%22Shift%2DCmd%2DAlt%2DF%22%3A%20%22replaceAll%22%2C%0A%20%20%20%20%22Cmd%2D%5B%22%3A%20%22indentLess%22%2C%20%22Cmd%2D%5D%22%3A%20%22indentMore%22%2C%20%22Cmd%2DBackspace%22%3A%20%22delWrappedLineLeft%22%2C%20%22Cmd%2DDelete%22%3A%20%22delWrappedLineRight%22%2C%0A%20%20%20%20%22Cmd%2DU%22%3A%20%22undoSelection%22%2C%20%22Shift%2DCmd%2DU%22%3A%20%22redoSelection%22%2C%20%22Ctrl%2DUp%22%3A%20%22goDocStart%22%2C%20%22Ctrl%2DDown%22%3A%20%22goDocEnd%22%2C%0A%20%20%20%20fallthrough%3A%20%5B%22basic%22%2C%20%22emacsy%22%5D%0A%20%20%7D%3B%0A%20%20keyMap%5B%22default%22%5D%20%3D%20mac%20%3F%20keyMap%2EmacDefault%20%3A%20keyMap%2EpcDefault%3B%0A%0A%20%20%2F%2F%20KEYMAP%20DISPATCH%0A%0A%20%20function%20normalizeKeyName%28name%29%20%7B%0A%20%20%20%20var%20parts%20%3D%20name%2Esplit%28%2F%2D%28%3F%21%24%29%2F%29%2C%20name%20%3D%20parts%5Bparts%2Elength%20%2D%201%5D%3B%0A%20%20%20%20var%20alt%2C%20ctrl%2C%20shift%2C%20cmd%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20parts%2Elength%20%2D%201%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20mod%20%3D%20parts%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28%2F%5E%28cmd%7Cmeta%7Cm%29%24%2Fi%2Etest%28mod%29%29%20cmd%20%3D%20true%3B%0A%20%20%20%20%20%20else%20if%20%28%2F%5Ea%28lt%29%3F%24%2Fi%2Etest%28mod%29%29%20alt%20%3D%20true%3B%0A%20%20%20%20%20%20else%20if%20%28%2F%5E%28c%7Cctrl%7Ccontrol%29%24%2Fi%2Etest%28mod%29%29%20ctrl%20%3D%20true%3B%0A%20%20%20%20%20%20else%20if%20%28%2F%5Es%28hift%29%24%2Fi%2Etest%28mod%29%29%20shift%20%3D%20true%3B%0A%20%20%20%20%20%20else%20throw%20new%20Error%28%22Unrecognized%20modifier%20name%3A%20%22%20%2B%20mod%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28alt%29%20name%20%3D%20%22Alt%2D%22%20%2B%20name%3B%0A%20%20%20%20if%20%28ctrl%29%20name%20%3D%20%22Ctrl%2D%22%20%2B%20name%3B%0A%20%20%20%20if%20%28cmd%29%20name%20%3D%20%22Cmd%2D%22%20%2B%20name%3B%0A%20%20%20%20if%20%28shift%29%20name%20%3D%20%22Shift%2D%22%20%2B%20name%3B%0A%20%20%20%20return%20name%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20This%20is%20a%20kludge%20to%20keep%20keymaps%20mostly%20working%20as%20raw%20objects%0A%20%20%2F%2F%20%28backwards%20compatibility%29%20while%20at%20the%20same%20time%20support%20features%0A%20%20%2F%2F%20like%20normalization%20and%20multi%2Dstroke%20key%20bindings%2E%20It%20compiles%20a%0A%20%20%2F%2F%20new%20normalized%20keymap%2C%20and%20then%20updates%20the%20old%20object%20to%20reflect%0A%20%20%2F%2F%20this%2E%0A%20%20CodeMirror%2EnormalizeKeyMap%20%3D%20function%28keymap%29%20%7B%0A%20%20%20%20var%20copy%20%3D%20%7B%7D%3B%0A%20%20%20%20for%20%28var%20keyname%20in%20keymap%29%20if%20%28keymap%2EhasOwnProperty%28keyname%29%29%20%7B%0A%20%20%20%20%20%20var%20value%20%3D%20keymap%5Bkeyname%5D%3B%0A%20%20%20%20%20%20if%20%28%2F%5E%28name%7Cfallthrough%7C%28de%7Cat%29tach%29%24%2F%2Etest%28keyname%29%29%20continue%3B%0A%20%20%20%20%20%20if%20%28value%20%3D%3D%20%22%2E%2E%2E%22%29%20%7B%20delete%20keymap%5Bkeyname%5D%3B%20continue%3B%20%7D%0A%0A%20%20%20%20%20%20var%20keys%20%3D%20map%28keyname%2Esplit%28%22%20%22%29%2C%20normalizeKeyName%29%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20keys%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20val%2C%20name%3B%0A%20%20%20%20%20%20%20%20if%20%28i%20%3D%3D%20keys%2Elength%20%2D%201%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20name%20%3D%20keys%2Ejoin%28%22%20%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20val%20%3D%20value%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20name%20%3D%20keys%2Eslice%280%2C%20i%20%2B%201%29%2Ejoin%28%22%20%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20val%20%3D%20%22%2E%2E%2E%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20var%20prev%20%3D%20copy%5Bname%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28%21prev%29%20copy%5Bname%5D%20%3D%20val%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28prev%20%21%3D%20val%29%20throw%20new%20Error%28%22Inconsistent%20bindings%20for%20%22%20%2B%20name%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20delete%20keymap%5Bkeyname%5D%3B%0A%20%20%20%20%7D%0A%20%20%20%20for%20%28var%20prop%20in%20copy%29%20keymap%5Bprop%5D%20%3D%20copy%5Bprop%5D%3B%0A%20%20%20%20return%20keymap%3B%0A%20%20%7D%3B%0A%0A%20%20var%20lookupKey%20%3D%20CodeMirror%2ElookupKey%20%3D%20function%28key%2C%20map%2C%20handle%2C%20context%29%20%7B%0A%20%20%20%20map%20%3D%20getKeyMap%28map%29%3B%0A%20%20%20%20var%20found%20%3D%20map%2Ecall%20%3F%20map%2Ecall%28key%2C%20context%29%20%3A%20map%5Bkey%5D%3B%0A%20%20%20%20if%20%28found%20%3D%3D%3D%20false%29%20return%20%22nothing%22%3B%0A%20%20%20%20if%20%28found%20%3D%3D%3D%20%22%2E%2E%2E%22%29%20return%20%22multi%22%3B%0A%20%20%20%20if%20%28found%20%21%3D%20null%20%26%26%20handle%28found%29%29%20return%20%22handled%22%3B%0A%0A%20%20%20%20if%20%28map%2Efallthrough%29%20%7B%0A%20%20%20%20%20%20if%20%28Object%2Eprototype%2EtoString%2Ecall%28map%2Efallthrough%29%20%21%3D%20%22%5Bobject%20Array%5D%22%29%0A%20%20%20%20%20%20%20%20return%20lookupKey%28key%2C%20map%2Efallthrough%2C%20handle%2C%20context%29%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20map%2Efallthrough%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20result%20%3D%20lookupKey%28key%2C%20map%2Efallthrough%5Bi%5D%2C%20handle%2C%20context%29%3B%0A%20%20%20%20%20%20%20%20if%20%28result%29%20return%20result%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Modifier%20key%20presses%20don%27t%20count%20as%20%27real%27%20key%20presses%20for%20the%0A%20%20%2F%2F%20purpose%20of%20keymap%20fallthrough%2E%0A%20%20var%20isModifierKey%20%3D%20CodeMirror%2EisModifierKey%20%3D%20function%28value%29%20%7B%0A%20%20%20%20var%20name%20%3D%20typeof%20value%20%3D%3D%20%22string%22%20%3F%20value%20%3A%20keyNames%5Bvalue%2EkeyCode%5D%3B%0A%20%20%20%20return%20name%20%3D%3D%20%22Ctrl%22%20%7C%7C%20name%20%3D%3D%20%22Alt%22%20%7C%7C%20name%20%3D%3D%20%22Shift%22%20%7C%7C%20name%20%3D%3D%20%22Mod%22%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Look%20up%20the%20name%20of%20a%20key%20as%20indicated%20by%20an%20event%20object%2E%0A%20%20var%20keyName%20%3D%20CodeMirror%2EkeyName%20%3D%20function%28event%2C%20noShift%29%20%7B%0A%20%20%20%20if%20%28presto%20%26%26%20event%2EkeyCode%20%3D%3D%2034%20%26%26%20event%5B%22char%22%5D%29%20return%20false%3B%0A%20%20%20%20var%20base%20%3D%20keyNames%5Bevent%2EkeyCode%5D%2C%20name%20%3D%20base%3B%0A%20%20%20%20if%20%28name%20%3D%3D%20null%20%7C%7C%20event%2EaltGraphKey%29%20return%20false%3B%0A%20%20%20%20if%20%28event%2EaltKey%20%26%26%20base%20%21%3D%20%22Alt%22%29%20name%20%3D%20%22Alt%2D%22%20%2B%20name%3B%0A%20%20%20%20if%20%28%28flipCtrlCmd%20%3F%20event%2EmetaKey%20%3A%20event%2EctrlKey%29%20%26%26%20base%20%21%3D%20%22Ctrl%22%29%20name%20%3D%20%22Ctrl%2D%22%20%2B%20name%3B%0A%20%20%20%20if%20%28%28flipCtrlCmd%20%3F%20event%2EctrlKey%20%3A%20event%2EmetaKey%29%20%26%26%20base%20%21%3D%20%22Cmd%22%29%20name%20%3D%20%22Cmd%2D%22%20%2B%20name%3B%0A%20%20%20%20if%20%28%21noShift%20%26%26%20event%2EshiftKey%20%26%26%20base%20%21%3D%20%22Shift%22%29%20name%20%3D%20%22Shift%2D%22%20%2B%20name%3B%0A%20%20%20%20return%20name%3B%0A%20%20%7D%3B%0A%0A%20%20function%20getKeyMap%28val%29%20%7B%0A%20%20%20%20return%20typeof%20val%20%3D%3D%20%22string%22%20%3F%20keyMap%5Bval%5D%20%3A%20val%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20FROMTEXTAREA%0A%0A%20%20CodeMirror%2EfromTextArea%20%3D%20function%28textarea%2C%20options%29%20%7B%0A%20%20%20%20options%20%3D%20options%20%3F%20copyObj%28options%29%20%3A%20%7B%7D%3B%0A%20%20%20%20options%2Evalue%20%3D%20textarea%2Evalue%3B%0A%20%20%20%20if%20%28%21options%2Etabindex%20%26%26%20textarea%2EtabIndex%29%0A%20%20%20%20%20%20options%2Etabindex%20%3D%20textarea%2EtabIndex%3B%0A%20%20%20%20if%20%28%21options%2Eplaceholder%20%26%26%20textarea%2Eplaceholder%29%0A%20%20%20%20%20%20options%2Eplaceholder%20%3D%20textarea%2Eplaceholder%3B%0A%20%20%20%20%2F%2F%20Set%20autofocus%20to%20true%20if%20this%20textarea%20is%20focused%2C%20or%20if%20it%20has%0A%20%20%20%20%2F%2F%20autofocus%20and%20no%20other%20element%20is%20focused%2E%0A%20%20%20%20if%20%28options%2Eautofocus%20%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20var%20hasFocus%20%3D%20activeElt%28%29%3B%0A%20%20%20%20%20%20options%2Eautofocus%20%3D%20hasFocus%20%3D%3D%20textarea%20%7C%7C%0A%20%20%20%20%20%20%20%20textarea%2EgetAttribute%28%22autofocus%22%29%20%21%3D%20null%20%26%26%20hasFocus%20%3D%3D%20document%2Ebody%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20save%28%29%20%7Btextarea%2Evalue%20%3D%20cm%2EgetValue%28%29%3B%7D%0A%20%20%20%20if%20%28textarea%2Eform%29%20%7B%0A%20%20%20%20%20%20on%28textarea%2Eform%2C%20%22submit%22%2C%20save%29%3B%0A%20%20%20%20%20%20%2F%2F%20Deplorable%20hack%20to%20make%20the%20submit%20method%20do%20the%20right%20thing%2E%0A%20%20%20%20%20%20if%20%28%21options%2EleaveSubmitMethodAlone%29%20%7B%0A%20%20%20%20%20%20%20%20var%20form%20%3D%20textarea%2Eform%2C%20realSubmit%20%3D%20form%2Esubmit%3B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20wrappedSubmit%20%3D%20form%2Esubmit%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20save%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20form%2Esubmit%20%3D%20realSubmit%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20form%2Esubmit%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20form%2Esubmit%20%3D%20wrappedSubmit%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%28e%29%20%7B%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20options%2EfinishInit%20%3D%20function%28cm%29%20%7B%0A%20%20%20%20%20%20cm%2Esave%20%3D%20save%3B%0A%20%20%20%20%20%20cm%2EgetTextArea%20%3D%20function%28%29%20%7B%20return%20textarea%3B%20%7D%3B%0A%20%20%20%20%20%20cm%2EtoTextArea%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20cm%2EtoTextArea%20%3D%20isNaN%3B%20%2F%2F%20Prevent%20this%20from%20being%20ran%20twice%0A%20%20%20%20%20%20%20%20save%28%29%3B%0A%20%20%20%20%20%20%20%20textarea%2EparentNode%2EremoveChild%28cm%2EgetWrapperElement%28%29%29%3B%0A%20%20%20%20%20%20%20%20textarea%2Estyle%2Edisplay%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20if%20%28textarea%2Eform%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20off%28textarea%2Eform%2C%20%22submit%22%2C%20save%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28typeof%20textarea%2Eform%2Esubmit%20%3D%3D%20%22function%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20textarea%2Eform%2Esubmit%20%3D%20realSubmit%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20textarea%2Estyle%2Edisplay%20%3D%20%22none%22%3B%0A%20%20%20%20var%20cm%20%3D%20CodeMirror%28function%28node%29%20%7B%0A%20%20%20%20%20%20textarea%2EparentNode%2EinsertBefore%28node%2C%20textarea%2EnextSibling%29%3B%0A%20%20%20%20%7D%2C%20options%29%3B%0A%20%20%20%20return%20cm%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20STRING%20STREAM%0A%0A%20%20%2F%2F%20Fed%20to%20the%20mode%20parsers%2C%20provides%20helper%20functions%20to%20make%0A%20%20%2F%2F%20parsers%20more%20succinct%2E%0A%0A%20%20var%20StringStream%20%3D%20CodeMirror%2EStringStream%20%3D%20function%28string%2C%20tabSize%29%20%7B%0A%20%20%20%20this%2Epos%20%3D%20this%2Estart%20%3D%200%3B%0A%20%20%20%20this%2Estring%20%3D%20string%3B%0A%20%20%20%20this%2EtabSize%20%3D%20tabSize%20%7C%7C%208%3B%0A%20%20%20%20this%2ElastColumnPos%20%3D%20this%2ElastColumnValue%20%3D%200%3B%0A%20%20%20%20this%2ElineStart%20%3D%200%3B%0A%20%20%7D%3B%0A%0A%20%20StringStream%2Eprototype%20%3D%20%7B%0A%20%20%20%20eol%3A%20function%28%29%20%7Breturn%20this%2Epos%20%3E%3D%20this%2Estring%2Elength%3B%7D%2C%0A%20%20%20%20sol%3A%20function%28%29%20%7Breturn%20this%2Epos%20%3D%3D%20this%2ElineStart%3B%7D%2C%0A%20%20%20%20peek%3A%20function%28%29%20%7Breturn%20this%2Estring%2EcharAt%28this%2Epos%29%20%7C%7C%20undefined%3B%7D%2C%0A%20%20%20%20next%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28this%2Epos%20%3C%20this%2Estring%2Elength%29%0A%20%20%20%20%20%20%20%20return%20this%2Estring%2EcharAt%28this%2Epos%2B%2B%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20eat%3A%20function%28match%29%20%7B%0A%20%20%20%20%20%20var%20ch%20%3D%20this%2Estring%2EcharAt%28this%2Epos%29%3B%0A%20%20%20%20%20%20if%20%28typeof%20match%20%3D%3D%20%22string%22%29%20var%20ok%20%3D%20ch%20%3D%3D%20match%3B%0A%20%20%20%20%20%20else%20var%20ok%20%3D%20ch%20%26%26%20%28match%2Etest%20%3F%20match%2Etest%28ch%29%20%3A%20match%28ch%29%29%3B%0A%20%20%20%20%20%20if%20%28ok%29%20%7B%2B%2Bthis%2Epos%3B%20return%20ch%3B%7D%0A%20%20%20%20%7D%2C%0A%20%20%20%20eatWhile%3A%20function%28match%29%20%7B%0A%20%20%20%20%20%20var%20start%20%3D%20this%2Epos%3B%0A%20%20%20%20%20%20while%20%28this%2Eeat%28match%29%29%7B%7D%0A%20%20%20%20%20%20return%20this%2Epos%20%3E%20start%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20eatSpace%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20start%20%3D%20this%2Epos%3B%0A%20%20%20%20%20%20while%20%28%2F%5B%5Cs%5Cu00a0%5D%2F%2Etest%28this%2Estring%2EcharAt%28this%2Epos%29%29%29%20%2B%2Bthis%2Epos%3B%0A%20%20%20%20%20%20return%20this%2Epos%20%3E%20start%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20skipToEnd%3A%20function%28%29%20%7Bthis%2Epos%20%3D%20this%2Estring%2Elength%3B%7D%2C%0A%20%20%20%20skipTo%3A%20function%28ch%29%20%7B%0A%20%20%20%20%20%20var%20found%20%3D%20this%2Estring%2EindexOf%28ch%2C%20this%2Epos%29%3B%0A%20%20%20%20%20%20if%20%28found%20%3E%20%2D1%29%20%7Bthis%2Epos%20%3D%20found%3B%20return%20true%3B%7D%0A%20%20%20%20%7D%2C%0A%20%20%20%20backUp%3A%20function%28n%29%20%7Bthis%2Epos%20%2D%3D%20n%3B%7D%2C%0A%20%20%20%20column%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28this%2ElastColumnPos%20%3C%20this%2Estart%29%20%7B%0A%20%20%20%20%20%20%20%20this%2ElastColumnValue%20%3D%20countColumn%28this%2Estring%2C%20this%2Estart%2C%20this%2EtabSize%2C%20this%2ElastColumnPos%2C%20this%2ElastColumnValue%29%3B%0A%20%20%20%20%20%20%20%20this%2ElastColumnPos%20%3D%20this%2Estart%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20this%2ElastColumnValue%20%2D%20%28this%2ElineStart%20%3F%20countColumn%28this%2Estring%2C%20this%2ElineStart%2C%20this%2EtabSize%29%20%3A%200%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20indentation%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20return%20countColumn%28this%2Estring%2C%20null%2C%20this%2EtabSize%29%20%2D%0A%20%20%20%20%20%20%20%20%28this%2ElineStart%20%3F%20countColumn%28this%2Estring%2C%20this%2ElineStart%2C%20this%2EtabSize%29%20%3A%200%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20match%3A%20function%28pattern%2C%20consume%2C%20caseInsensitive%29%20%7B%0A%20%20%20%20%20%20if%20%28typeof%20pattern%20%3D%3D%20%22string%22%29%20%7B%0A%20%20%20%20%20%20%20%20var%20cased%20%3D%20function%28str%29%20%7Breturn%20caseInsensitive%20%3F%20str%2EtoLowerCase%28%29%20%3A%20str%3B%7D%3B%0A%20%20%20%20%20%20%20%20var%20substr%20%3D%20this%2Estring%2Esubstr%28this%2Epos%2C%20pattern%2Elength%29%3B%0A%20%20%20%20%20%20%20%20if%20%28cased%28substr%29%20%3D%3D%20cased%28pattern%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28consume%20%21%3D%3D%20false%29%20this%2Epos%20%2B%3D%20pattern%2Elength%3B%0A%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20var%20match%20%3D%20this%2Estring%2Eslice%28this%2Epos%29%2Ematch%28pattern%29%3B%0A%20%20%20%20%20%20%20%20if%20%28match%20%26%26%20match%2Eindex%20%3E%200%29%20return%20null%3B%0A%20%20%20%20%20%20%20%20if%20%28match%20%26%26%20consume%20%21%3D%3D%20false%29%20this%2Epos%20%2B%3D%20match%5B0%5D%2Elength%3B%0A%20%20%20%20%20%20%20%20return%20match%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%20%20%20%20current%3A%20function%28%29%7Breturn%20this%2Estring%2Eslice%28this%2Estart%2C%20this%2Epos%29%3B%7D%2C%0A%20%20%20%20hideFirstChars%3A%20function%28n%2C%20inner%29%20%7B%0A%20%20%20%20%20%20this%2ElineStart%20%2B%3D%20n%3B%0A%20%20%20%20%20%20try%20%7B%20return%20inner%28%29%3B%20%7D%0A%20%20%20%20%20%20finally%20%7B%20this%2ElineStart%20%2D%3D%20n%3B%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20TEXTMARKERS%0A%0A%20%20%2F%2F%20Created%20with%20markText%20and%20setBookmark%20methods%2E%20A%20TextMarker%20is%20a%0A%20%20%2F%2F%20handle%20that%20can%20be%20used%20to%20clear%20or%20find%20a%20marked%20position%20in%20the%0A%20%20%2F%2F%20document%2E%20Line%20objects%20hold%20arrays%20%28markedSpans%29%20containing%0A%20%20%2F%2F%20%7Bfrom%2C%20to%2C%20marker%7D%20object%20pointing%20to%20such%20marker%20objects%2C%20and%0A%20%20%2F%2F%20indicating%20that%20such%20a%20marker%20is%20present%20on%20that%20line%2E%20Multiple%0A%20%20%2F%2F%20lines%20may%20point%20to%20the%20same%20marker%20when%20it%20spans%20across%20lines%2E%0A%20%20%2F%2F%20The%20spans%20will%20have%20null%20for%20their%20from%2Fto%20properties%20when%20the%0A%20%20%2F%2F%20marker%20continues%20beyond%20the%20start%2Fend%20of%20the%20line%2E%20Markers%20have%0A%20%20%2F%2F%20links%20back%20to%20the%20lines%20they%20currently%20touch%2E%0A%0A%20%20var%20nextMarkerId%20%3D%200%3B%0A%0A%20%20var%20TextMarker%20%3D%20CodeMirror%2ETextMarker%20%3D%20function%28doc%2C%20type%29%20%7B%0A%20%20%20%20this%2Elines%20%3D%20%5B%5D%3B%0A%20%20%20%20this%2Etype%20%3D%20type%3B%0A%20%20%20%20this%2Edoc%20%3D%20doc%3B%0A%20%20%20%20this%2Eid%20%3D%20%2B%2BnextMarkerId%3B%0A%20%20%7D%3B%0A%20%20eventMixin%28TextMarker%29%3B%0A%0A%20%20%2F%2F%20Clear%20the%20marker%2E%0A%20%20TextMarker%2Eprototype%2Eclear%20%3D%20function%28%29%20%7B%0A%20%20%20%20if%20%28this%2EexplicitlyCleared%29%20return%3B%0A%20%20%20%20var%20cm%20%3D%20this%2Edoc%2Ecm%2C%20withOp%20%3D%20cm%20%26%26%20%21cm%2EcurOp%3B%0A%20%20%20%20if%20%28withOp%29%20startOperation%28cm%29%3B%0A%20%20%20%20if%20%28hasHandler%28this%2C%20%22clear%22%29%29%20%7B%0A%20%20%20%20%20%20var%20found%20%3D%20this%2Efind%28%29%3B%0A%20%20%20%20%20%20if%20%28found%29%20signalLater%28this%2C%20%22clear%22%2C%20found%2Efrom%2C%20found%2Eto%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20min%20%3D%20null%2C%20max%20%3D%20null%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Elines%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20line%20%3D%20this%2Elines%5Bi%5D%3B%0A%20%20%20%20%20%20var%20span%20%3D%20getMarkedSpanFor%28line%2EmarkedSpans%2C%20this%29%3B%0A%20%20%20%20%20%20if%20%28cm%20%26%26%20%21this%2Ecollapsed%29%20regLineChange%28cm%2C%20lineNo%28line%29%2C%20%22text%22%29%3B%0A%20%20%20%20%20%20else%20if%20%28cm%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28span%2Eto%20%21%3D%20null%29%20max%20%3D%20lineNo%28line%29%3B%0A%20%20%20%20%20%20%20%20if%20%28span%2Efrom%20%21%3D%20null%29%20min%20%3D%20lineNo%28line%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20line%2EmarkedSpans%20%3D%20removeMarkedSpan%28line%2EmarkedSpans%2C%20span%29%3B%0A%20%20%20%20%20%20if%20%28span%2Efrom%20%3D%3D%20null%20%26%26%20this%2Ecollapsed%20%26%26%20%21lineIsHidden%28this%2Edoc%2C%20line%29%20%26%26%20cm%29%0A%20%20%20%20%20%20%20%20updateLineHeight%28line%2C%20textHeight%28cm%2Edisplay%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28cm%20%26%26%20this%2Ecollapsed%20%26%26%20%21cm%2Eoptions%2ElineWrapping%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Elines%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20visual%20%3D%20visualLine%28this%2Elines%5Bi%5D%29%2C%20len%20%3D%20lineLength%28visual%29%3B%0A%20%20%20%20%20%20if%20%28len%20%3E%20cm%2Edisplay%2EmaxLineLength%29%20%7B%0A%20%20%20%20%20%20%20%20cm%2Edisplay%2EmaxLine%20%3D%20visual%3B%0A%20%20%20%20%20%20%20%20cm%2Edisplay%2EmaxLineLength%20%3D%20len%3B%0A%20%20%20%20%20%20%20%20cm%2Edisplay%2EmaxLineChanged%20%3D%20true%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28min%20%21%3D%20null%20%26%26%20cm%20%26%26%20this%2Ecollapsed%29%20regChange%28cm%2C%20min%2C%20max%20%2B%201%29%3B%0A%20%20%20%20this%2Elines%2Elength%20%3D%200%3B%0A%20%20%20%20this%2EexplicitlyCleared%20%3D%20true%3B%0A%20%20%20%20if%20%28this%2Eatomic%20%26%26%20this%2Edoc%2EcantEdit%29%20%7B%0A%20%20%20%20%20%20this%2Edoc%2EcantEdit%20%3D%20false%3B%0A%20%20%20%20%20%20if%20%28cm%29%20reCheckSelection%28cm%2Edoc%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28cm%29%20signalLater%28cm%2C%20%22markerCleared%22%2C%20cm%2C%20this%29%3B%0A%20%20%20%20if%20%28withOp%29%20endOperation%28cm%29%3B%0A%20%20%20%20if%20%28this%2Eparent%29%20this%2Eparent%2Eclear%28%29%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Find%20the%20position%20of%20the%20marker%20in%20the%20document%2E%20Returns%20a%20%7Bfrom%2C%0A%20%20%2F%2F%20to%7D%20object%20by%20default%2E%20Side%20can%20be%20passed%20to%20get%20a%20specific%20side%0A%20%20%2F%2F%20%2D%2D%200%20%28both%29%2C%20%2D1%20%28left%29%2C%20or%201%20%28right%29%2E%20When%20lineObj%20is%20true%2C%20the%0A%20%20%2F%2F%20Pos%20objects%20returned%20contain%20a%20line%20object%2C%20rather%20than%20a%20line%0A%20%20%2F%2F%20number%20%28used%20to%20prevent%20looking%20up%20the%20same%20line%20twice%29%2E%0A%20%20TextMarker%2Eprototype%2Efind%20%3D%20function%28side%2C%20lineObj%29%20%7B%0A%20%20%20%20if%20%28side%20%3D%3D%20null%20%26%26%20this%2Etype%20%3D%3D%20%22bookmark%22%29%20side%20%3D%201%3B%0A%20%20%20%20var%20from%2C%20to%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Elines%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20line%20%3D%20this%2Elines%5Bi%5D%3B%0A%20%20%20%20%20%20var%20span%20%3D%20getMarkedSpanFor%28line%2EmarkedSpans%2C%20this%29%3B%0A%20%20%20%20%20%20if%20%28span%2Efrom%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20from%20%3D%20Pos%28lineObj%20%3F%20line%20%3A%20lineNo%28line%29%2C%20span%2Efrom%29%3B%0A%20%20%20%20%20%20%20%20if%20%28side%20%3D%3D%20%2D1%29%20return%20from%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28span%2Eto%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20to%20%3D%20Pos%28lineObj%20%3F%20line%20%3A%20lineNo%28line%29%2C%20span%2Eto%29%3B%0A%20%20%20%20%20%20%20%20if%20%28side%20%3D%3D%201%29%20return%20to%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20from%20%26%26%20%7Bfrom%3A%20from%2C%20to%3A%20to%7D%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Signals%20that%20the%20marker%27s%20widget%20changed%2C%20and%20surrounding%20layout%0A%20%20%2F%2F%20should%20be%20recomputed%2E%0A%20%20TextMarker%2Eprototype%2Echanged%20%3D%20function%28%29%20%7B%0A%20%20%20%20var%20pos%20%3D%20this%2Efind%28%2D1%2C%20true%29%2C%20widget%20%3D%20this%2C%20cm%20%3D%20this%2Edoc%2Ecm%3B%0A%20%20%20%20if%20%28%21pos%20%7C%7C%20%21cm%29%20return%3B%0A%20%20%20%20runInOp%28cm%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20line%20%3D%20pos%2Eline%2C%20lineN%20%3D%20lineNo%28pos%2Eline%29%3B%0A%20%20%20%20%20%20var%20view%20%3D%20findViewForLine%28cm%2C%20lineN%29%3B%0A%20%20%20%20%20%20if%20%28view%29%20%7B%0A%20%20%20%20%20%20%20%20clearLineMeasurementCacheFor%28view%29%3B%0A%20%20%20%20%20%20%20%20cm%2EcurOp%2EselectionChanged%20%3D%20cm%2EcurOp%2EforceUpdate%20%3D%20true%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20cm%2EcurOp%2EupdateMaxLine%20%3D%20true%3B%0A%20%20%20%20%20%20if%20%28%21lineIsHidden%28widget%2Edoc%2C%20line%29%20%26%26%20widget%2Eheight%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20var%20oldHeight%20%3D%20widget%2Eheight%3B%0A%20%20%20%20%20%20%20%20widget%2Eheight%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20var%20dHeight%20%3D%20widgetHeight%28widget%29%20%2D%20oldHeight%3B%0A%20%20%20%20%20%20%20%20if%20%28dHeight%29%0A%20%20%20%20%20%20%20%20%20%20updateLineHeight%28line%2C%20line%2Eheight%20%2B%20dHeight%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%3B%0A%0A%20%20TextMarker%2Eprototype%2EattachLine%20%3D%20function%28line%29%20%7B%0A%20%20%20%20if%20%28%21this%2Elines%2Elength%20%26%26%20this%2Edoc%2Ecm%29%20%7B%0A%20%20%20%20%20%20var%20op%20%3D%20this%2Edoc%2Ecm%2EcurOp%3B%0A%20%20%20%20%20%20if%20%28%21op%2EmaybeHiddenMarkers%20%7C%7C%20indexOf%28op%2EmaybeHiddenMarkers%2C%20this%29%20%3D%3D%20%2D1%29%0A%20%20%20%20%20%20%20%20%28op%2EmaybeUnhiddenMarkers%20%7C%7C%20%28op%2EmaybeUnhiddenMarkers%20%3D%20%5B%5D%29%29%2Epush%28this%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20this%2Elines%2Epush%28line%29%3B%0A%20%20%7D%3B%0A%20%20TextMarker%2Eprototype%2EdetachLine%20%3D%20function%28line%29%20%7B%0A%20%20%20%20this%2Elines%2Esplice%28indexOf%28this%2Elines%2C%20line%29%2C%201%29%3B%0A%20%20%20%20if%20%28%21this%2Elines%2Elength%20%26%26%20this%2Edoc%2Ecm%29%20%7B%0A%20%20%20%20%20%20var%20op%20%3D%20this%2Edoc%2Ecm%2EcurOp%3B%0A%20%20%20%20%20%20%28op%2EmaybeHiddenMarkers%20%7C%7C%20%28op%2EmaybeHiddenMarkers%20%3D%20%5B%5D%29%29%2Epush%28this%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Collapsed%20markers%20have%20unique%20ids%2C%20in%20order%20to%20be%20able%20to%20order%0A%20%20%2F%2F%20them%2C%20which%20is%20needed%20for%20uniquely%20determining%20an%20outer%20marker%0A%20%20%2F%2F%20when%20they%20overlap%20%28they%20may%20nest%2C%20but%20not%20partially%20overlap%29%2E%0A%20%20var%20nextMarkerId%20%3D%200%3B%0A%0A%20%20%2F%2F%20Create%20a%20marker%2C%20wire%20it%20up%20to%20the%20right%20lines%2C%20and%0A%20%20function%20markText%28doc%2C%20from%2C%20to%2C%20options%2C%20type%29%20%7B%0A%20%20%20%20%2F%2F%20Shared%20markers%20%28across%20linked%20documents%29%20are%20handled%20separately%0A%20%20%20%20%2F%2F%20%28markTextShared%20will%20call%20out%20to%20this%20again%2C%20once%20per%0A%20%20%20%20%2F%2F%20document%29%2E%0A%20%20%20%20if%20%28options%20%26%26%20options%2Eshared%29%20return%20markTextShared%28doc%2C%20from%2C%20to%2C%20options%2C%20type%29%3B%0A%20%20%20%20%2F%2F%20Ensure%20we%20are%20in%20an%20operation%2E%0A%20%20%20%20if%20%28doc%2Ecm%20%26%26%20%21doc%2Ecm%2EcurOp%29%20return%20operation%28doc%2Ecm%2C%20markText%29%28doc%2C%20from%2C%20to%2C%20options%2C%20type%29%3B%0A%0A%20%20%20%20var%20marker%20%3D%20new%20TextMarker%28doc%2C%20type%29%2C%20diff%20%3D%20cmp%28from%2C%20to%29%3B%0A%20%20%20%20if%20%28options%29%20copyObj%28options%2C%20marker%2C%20false%29%3B%0A%20%20%20%20%2F%2F%20Don%27t%20connect%20empty%20markers%20unless%20clearWhenEmpty%20is%20false%0A%20%20%20%20if%20%28diff%20%3E%200%20%7C%7C%20diff%20%3D%3D%200%20%26%26%20marker%2EclearWhenEmpty%20%21%3D%3D%20false%29%0A%20%20%20%20%20%20return%20marker%3B%0A%20%20%20%20if%20%28marker%2EreplacedWith%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Showing%20up%20as%20a%20widget%20implies%20collapsed%20%28widget%20replaces%20text%29%0A%20%20%20%20%20%20marker%2Ecollapsed%20%3D%20true%3B%0A%20%20%20%20%20%20marker%2EwidgetNode%20%3D%20elt%28%22span%22%2C%20%5Bmarker%2EreplacedWith%5D%2C%20%22CodeMirror%2Dwidget%22%29%3B%0A%20%20%20%20%20%20if%20%28%21options%2EhandleMouseEvents%29%20marker%2EwidgetNode%2EsetAttribute%28%22cm%2Dignore%2Devents%22%2C%20%22true%22%29%3B%0A%20%20%20%20%20%20if%20%28options%2EinsertLeft%29%20marker%2EwidgetNode%2EinsertLeft%20%3D%20true%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28marker%2Ecollapsed%29%20%7B%0A%20%20%20%20%20%20if%20%28conflictingCollapsedRange%28doc%2C%20from%2Eline%2C%20from%2C%20to%2C%20marker%29%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20from%2Eline%20%21%3D%20to%2Eline%20%26%26%20conflictingCollapsedRange%28doc%2C%20to%2Eline%2C%20from%2C%20to%2C%20marker%29%29%0A%20%20%20%20%20%20%20%20throw%20new%20Error%28%22Inserting%20collapsed%20marker%20partially%20overlapping%20an%20existing%20one%22%29%3B%0A%20%20%20%20%20%20sawCollapsedSpans%20%3D%20true%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28marker%2EaddToHistory%29%0A%20%20%20%20%20%20addChangeToHistory%28doc%2C%20%7Bfrom%3A%20from%2C%20to%3A%20to%2C%20origin%3A%20%22markText%22%7D%2C%20doc%2Esel%2C%20NaN%29%3B%0A%0A%20%20%20%20var%20curLine%20%3D%20from%2Eline%2C%20cm%20%3D%20doc%2Ecm%2C%20updateMaxLine%3B%0A%20%20%20%20doc%2Eiter%28curLine%2C%20to%2Eline%20%2B%201%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20if%20%28cm%20%26%26%20marker%2Ecollapsed%20%26%26%20%21cm%2Eoptions%2ElineWrapping%20%26%26%20visualLine%28line%29%20%3D%3D%20cm%2Edisplay%2EmaxLine%29%0A%20%20%20%20%20%20%20%20updateMaxLine%20%3D%20true%3B%0A%20%20%20%20%20%20if%20%28marker%2Ecollapsed%20%26%26%20curLine%20%21%3D%20from%2Eline%29%20updateLineHeight%28line%2C%200%29%3B%0A%20%20%20%20%20%20addMarkedSpan%28line%2C%20new%20MarkedSpan%28marker%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20curLine%20%3D%3D%20from%2Eline%20%3F%20from%2Ech%20%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20curLine%20%3D%3D%20to%2Eline%20%3F%20to%2Ech%20%3A%20null%29%29%3B%0A%20%20%20%20%20%20%2B%2BcurLine%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20%2F%2F%20lineIsHidden%20depends%20on%20the%20presence%20of%20the%20spans%2C%20so%20needs%20a%20second%20pass%0A%20%20%20%20if%20%28marker%2Ecollapsed%29%20doc%2Eiter%28from%2Eline%2C%20to%2Eline%20%2B%201%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20if%20%28lineIsHidden%28doc%2C%20line%29%29%20updateLineHeight%28line%2C%200%29%3B%0A%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20if%20%28marker%2EclearOnEnter%29%20on%28marker%2C%20%22beforeCursorEnter%22%2C%20function%28%29%20%7B%20marker%2Eclear%28%29%3B%20%7D%29%3B%0A%0A%20%20%20%20if%20%28marker%2EreadOnly%29%20%7B%0A%20%20%20%20%20%20sawReadOnlySpans%20%3D%20true%3B%0A%20%20%20%20%20%20if%20%28doc%2Ehistory%2Edone%2Elength%20%7C%7C%20doc%2Ehistory%2Eundone%2Elength%29%0A%20%20%20%20%20%20%20%20doc%2EclearHistory%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28marker%2Ecollapsed%29%20%7B%0A%20%20%20%20%20%20marker%2Eid%20%3D%20%2B%2BnextMarkerId%3B%0A%20%20%20%20%20%20marker%2Eatomic%20%3D%20true%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28cm%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Sync%20editor%20state%0A%20%20%20%20%20%20if%20%28updateMaxLine%29%20cm%2EcurOp%2EupdateMaxLine%20%3D%20true%3B%0A%20%20%20%20%20%20if%20%28marker%2Ecollapsed%29%0A%20%20%20%20%20%20%20%20regChange%28cm%2C%20from%2Eline%2C%20to%2Eline%20%2B%201%29%3B%0A%20%20%20%20%20%20else%20if%20%28marker%2EclassName%20%7C%7C%20marker%2Etitle%20%7C%7C%20marker%2EstartStyle%20%7C%7C%20marker%2EendStyle%20%7C%7C%20marker%2Ecss%29%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%20from%2Eline%3B%20i%20%3C%3D%20to%2Eline%3B%20i%2B%2B%29%20regLineChange%28cm%2C%20i%2C%20%22text%22%29%3B%0A%20%20%20%20%20%20if%20%28marker%2Eatomic%29%20reCheckSelection%28cm%2Edoc%29%3B%0A%20%20%20%20%20%20signalLater%28cm%2C%20%22markerAdded%22%2C%20cm%2C%20marker%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20marker%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20SHARED%20TEXTMARKERS%0A%0A%20%20%2F%2F%20A%20shared%20marker%20spans%20multiple%20linked%20documents%2E%20It%20is%0A%20%20%2F%2F%20implemented%20as%20a%20meta%2Dmarker%2Dobject%20controlling%20multiple%20normal%0A%20%20%2F%2F%20markers%2E%0A%20%20var%20SharedTextMarker%20%3D%20CodeMirror%2ESharedTextMarker%20%3D%20function%28markers%2C%20primary%29%20%7B%0A%20%20%20%20this%2Emarkers%20%3D%20markers%3B%0A%20%20%20%20this%2Eprimary%20%3D%20primary%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20markers%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20markers%5Bi%5D%2Eparent%20%3D%20this%3B%0A%20%20%7D%3B%0A%20%20eventMixin%28SharedTextMarker%29%3B%0A%0A%20%20SharedTextMarker%2Eprototype%2Eclear%20%3D%20function%28%29%20%7B%0A%20%20%20%20if%20%28this%2EexplicitlyCleared%29%20return%3B%0A%20%20%20%20this%2EexplicitlyCleared%20%3D%20true%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Emarkers%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20this%2Emarkers%5Bi%5D%2Eclear%28%29%3B%0A%20%20%20%20signalLater%28this%2C%20%22clear%22%29%3B%0A%20%20%7D%3B%0A%20%20SharedTextMarker%2Eprototype%2Efind%20%3D%20function%28side%2C%20lineObj%29%20%7B%0A%20%20%20%20return%20this%2Eprimary%2Efind%28side%2C%20lineObj%29%3B%0A%20%20%7D%3B%0A%0A%20%20function%20markTextShared%28doc%2C%20from%2C%20to%2C%20options%2C%20type%29%20%7B%0A%20%20%20%20options%20%3D%20copyObj%28options%29%3B%0A%20%20%20%20options%2Eshared%20%3D%20false%3B%0A%20%20%20%20var%20markers%20%3D%20%5BmarkText%28doc%2C%20from%2C%20to%2C%20options%2C%20type%29%5D%2C%20primary%20%3D%20markers%5B0%5D%3B%0A%20%20%20%20var%20widget%20%3D%20options%2EwidgetNode%3B%0A%20%20%20%20linkedDocs%28doc%2C%20function%28doc%29%20%7B%0A%20%20%20%20%20%20if%20%28widget%29%20options%2EwidgetNode%20%3D%20widget%2EcloneNode%28true%29%3B%0A%20%20%20%20%20%20markers%2Epush%28markText%28doc%2C%20clipPos%28doc%2C%20from%29%2C%20clipPos%28doc%2C%20to%29%2C%20options%2C%20type%29%29%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20doc%2Elinked%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20%20%20if%20%28doc%2Elinked%5Bi%5D%2EisParent%29%20return%3B%0A%20%20%20%20%20%20primary%20%3D%20lst%28markers%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20return%20new%20SharedTextMarker%28markers%2C%20primary%29%3B%0A%20%20%7D%0A%0A%20%20function%20findSharedMarkers%28doc%29%20%7B%0A%20%20%20%20return%20doc%2EfindMarks%28Pos%28doc%2Efirst%2C%200%29%2C%20doc%2EclipPos%28Pos%28doc%2ElastLine%28%29%29%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20function%28m%29%20%7B%20return%20m%2Eparent%3B%20%7D%29%3B%0A%20%20%7D%0A%0A%20%20function%20copySharedMarkers%28doc%2C%20markers%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20markers%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20marker%20%3D%20markers%5Bi%5D%2C%20pos%20%3D%20marker%2Efind%28%29%3B%0A%20%20%20%20%20%20var%20mFrom%20%3D%20doc%2EclipPos%28pos%2Efrom%29%2C%20mTo%20%3D%20doc%2EclipPos%28pos%2Eto%29%3B%0A%20%20%20%20%20%20if%20%28cmp%28mFrom%2C%20mTo%29%29%20%7B%0A%20%20%20%20%20%20%20%20var%20subMark%20%3D%20markText%28doc%2C%20mFrom%2C%20mTo%2C%20marker%2Eprimary%2C%20marker%2Eprimary%2Etype%29%3B%0A%20%20%20%20%20%20%20%20marker%2Emarkers%2Epush%28subMark%29%3B%0A%20%20%20%20%20%20%20%20subMark%2Eparent%20%3D%20marker%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20detachSharedMarkers%28markers%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20markers%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20marker%20%3D%20markers%5Bi%5D%2C%20linked%20%3D%20%5Bmarker%2Eprimary%2Edoc%5D%3B%3B%0A%20%20%20%20%20%20linkedDocs%28marker%2Eprimary%2Edoc%2C%20function%28d%29%20%7B%20linked%2Epush%28d%29%3B%20%7D%29%3B%0A%20%20%20%20%20%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20marker%2Emarkers%2Elength%3B%20j%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20subMarker%20%3D%20marker%2Emarkers%5Bj%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28indexOf%28linked%2C%20subMarker%2Edoc%29%20%3D%3D%20%2D1%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20subMarker%2Eparent%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20%20%20marker%2Emarkers%2Esplice%28j%2D%2D%2C%201%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20TEXTMARKER%20SPANS%0A%0A%20%20function%20MarkedSpan%28marker%2C%20from%2C%20to%29%20%7B%0A%20%20%20%20this%2Emarker%20%3D%20marker%3B%0A%20%20%20%20this%2Efrom%20%3D%20from%3B%20this%2Eto%20%3D%20to%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Search%20an%20array%20of%20spans%20for%20a%20span%20matching%20the%20given%20marker%2E%0A%20%20function%20getMarkedSpanFor%28spans%2C%20marker%29%20%7B%0A%20%20%20%20if%20%28spans%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20spans%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20span%20%3D%20spans%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28span%2Emarker%20%3D%3D%20marker%29%20return%20span%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%2F%2F%20Remove%20a%20span%20from%20an%20array%2C%20returning%20undefined%20if%20no%20spans%20are%0A%20%20%2F%2F%20left%20%28we%20don%27t%20store%20arrays%20for%20lines%20without%20spans%29%2E%0A%20%20function%20removeMarkedSpan%28spans%2C%20span%29%20%7B%0A%20%20%20%20for%20%28var%20r%2C%20i%20%3D%200%3B%20i%20%3C%20spans%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20if%20%28spans%5Bi%5D%20%21%3D%20span%29%20%28r%20%7C%7C%20%28r%20%3D%20%5B%5D%29%29%2Epush%28spans%5Bi%5D%29%3B%0A%20%20%20%20return%20r%3B%0A%20%20%7D%0A%20%20%2F%2F%20Add%20a%20span%20to%20a%20line%2E%0A%20%20function%20addMarkedSpan%28line%2C%20span%29%20%7B%0A%20%20%20%20line%2EmarkedSpans%20%3D%20line%2EmarkedSpans%20%3F%20line%2EmarkedSpans%2Econcat%28%5Bspan%5D%29%20%3A%20%5Bspan%5D%3B%0A%20%20%20%20span%2Emarker%2EattachLine%28line%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Used%20for%20the%20algorithm%20that%20adjusts%20markers%20for%20a%20change%20in%20the%0A%20%20%2F%2F%20document%2E%20These%20functions%20cut%20an%20array%20of%20spans%20at%20a%20given%0A%20%20%2F%2F%20character%20position%2C%20returning%20an%20array%20of%20remaining%20chunks%20%28or%0A%20%20%2F%2F%20undefined%20if%20nothing%20remains%29%2E%0A%20%20function%20markedSpansBefore%28old%2C%20startCh%2C%20isInsert%29%20%7B%0A%20%20%20%20if%20%28old%29%20for%20%28var%20i%20%3D%200%2C%20nw%3B%20i%20%3C%20old%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20span%20%3D%20old%5Bi%5D%2C%20marker%20%3D%20span%2Emarker%3B%0A%20%20%20%20%20%20var%20startsBefore%20%3D%20span%2Efrom%20%3D%3D%20null%20%7C%7C%20%28marker%2EinclusiveLeft%20%3F%20span%2Efrom%20%3C%3D%20startCh%20%3A%20span%2Efrom%20%3C%20startCh%29%3B%0A%20%20%20%20%20%20if%20%28startsBefore%20%7C%7C%20span%2Efrom%20%3D%3D%20startCh%20%26%26%20marker%2Etype%20%3D%3D%20%22bookmark%22%20%26%26%20%28%21isInsert%20%7C%7C%20%21span%2Emarker%2EinsertLeft%29%29%20%7B%0A%20%20%20%20%20%20%20%20var%20endsAfter%20%3D%20span%2Eto%20%3D%3D%20null%20%7C%7C%20%28marker%2EinclusiveRight%20%3F%20span%2Eto%20%3E%3D%20startCh%20%3A%20span%2Eto%20%3E%20startCh%29%3B%0A%20%20%20%20%20%20%20%20%28nw%20%7C%7C%20%28nw%20%3D%20%5B%5D%29%29%2Epush%28new%20MarkedSpan%28marker%2C%20span%2Efrom%2C%20endsAfter%20%3F%20null%20%3A%20span%2Eto%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20nw%3B%0A%20%20%7D%0A%20%20function%20markedSpansAfter%28old%2C%20endCh%2C%20isInsert%29%20%7B%0A%20%20%20%20if%20%28old%29%20for%20%28var%20i%20%3D%200%2C%20nw%3B%20i%20%3C%20old%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20span%20%3D%20old%5Bi%5D%2C%20marker%20%3D%20span%2Emarker%3B%0A%20%20%20%20%20%20var%20endsAfter%20%3D%20span%2Eto%20%3D%3D%20null%20%7C%7C%20%28marker%2EinclusiveRight%20%3F%20span%2Eto%20%3E%3D%20endCh%20%3A%20span%2Eto%20%3E%20endCh%29%3B%0A%20%20%20%20%20%20if%20%28endsAfter%20%7C%7C%20span%2Efrom%20%3D%3D%20endCh%20%26%26%20marker%2Etype%20%3D%3D%20%22bookmark%22%20%26%26%20%28%21isInsert%20%7C%7C%20span%2Emarker%2EinsertLeft%29%29%20%7B%0A%20%20%20%20%20%20%20%20var%20startsBefore%20%3D%20span%2Efrom%20%3D%3D%20null%20%7C%7C%20%28marker%2EinclusiveLeft%20%3F%20span%2Efrom%20%3C%3D%20endCh%20%3A%20span%2Efrom%20%3C%20endCh%29%3B%0A%20%20%20%20%20%20%20%20%28nw%20%7C%7C%20%28nw%20%3D%20%5B%5D%29%29%2Epush%28new%20MarkedSpan%28marker%2C%20startsBefore%20%3F%20null%20%3A%20span%2Efrom%20%2D%20endCh%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20span%2Eto%20%3D%3D%20null%20%3F%20null%20%3A%20span%2Eto%20%2D%20endCh%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20nw%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Given%20a%20change%20object%2C%20compute%20the%20new%20set%20of%20marker%20spans%20that%0A%20%20%2F%2F%20cover%20the%20line%20in%20which%20the%20change%20took%20place%2E%20Removes%20spans%0A%20%20%2F%2F%20entirely%20within%20the%20change%2C%20reconnects%20spans%20belonging%20to%20the%0A%20%20%2F%2F%20same%20marker%20that%20appear%20on%20both%20sides%20of%20the%20change%2C%20and%20cuts%20off%0A%20%20%2F%2F%20spans%20partially%20within%20the%20change%2E%20Returns%20an%20array%20of%20span%0A%20%20%2F%2F%20arrays%20with%20one%20element%20for%20each%20line%20in%20%28after%29%20the%20change%2E%0A%20%20function%20stretchSpansOverChange%28doc%2C%20change%29%20%7B%0A%20%20%20%20if%20%28change%2Efull%29%20return%20null%3B%0A%20%20%20%20var%20oldFirst%20%3D%20isLine%28doc%2C%20change%2Efrom%2Eline%29%20%26%26%20getLine%28doc%2C%20change%2Efrom%2Eline%29%2EmarkedSpans%3B%0A%20%20%20%20var%20oldLast%20%3D%20isLine%28doc%2C%20change%2Eto%2Eline%29%20%26%26%20getLine%28doc%2C%20change%2Eto%2Eline%29%2EmarkedSpans%3B%0A%20%20%20%20if%20%28%21oldFirst%20%26%26%20%21oldLast%29%20return%20null%3B%0A%0A%20%20%20%20var%20startCh%20%3D%20change%2Efrom%2Ech%2C%20endCh%20%3D%20change%2Eto%2Ech%2C%20isInsert%20%3D%20cmp%28change%2Efrom%2C%20change%2Eto%29%20%3D%3D%200%3B%0A%20%20%20%20%2F%2F%20Get%20the%20spans%20that%20%27stick%20out%27%20on%20both%20sides%0A%20%20%20%20var%20first%20%3D%20markedSpansBefore%28oldFirst%2C%20startCh%2C%20isInsert%29%3B%0A%20%20%20%20var%20last%20%3D%20markedSpansAfter%28oldLast%2C%20endCh%2C%20isInsert%29%3B%0A%0A%20%20%20%20%2F%2F%20Next%2C%20merge%20those%20two%20ends%0A%20%20%20%20var%20sameLine%20%3D%20change%2Etext%2Elength%20%3D%3D%201%2C%20offset%20%3D%20lst%28change%2Etext%29%2Elength%20%2B%20%28sameLine%20%3F%20startCh%20%3A%200%29%3B%0A%20%20%20%20if%20%28first%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Fix%20up%20%2Eto%20properties%20of%20first%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20first%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20span%20%3D%20first%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28span%2Eto%20%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20found%20%3D%20getMarkedSpanFor%28last%2C%20span%2Emarker%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21found%29%20span%2Eto%20%3D%20startCh%3B%0A%20%20%20%20%20%20%20%20%20%20else%20if%20%28sameLine%29%20span%2Eto%20%3D%20found%2Eto%20%3D%3D%20null%20%3F%20null%20%3A%20found%2Eto%20%2B%20offset%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28last%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Fix%20up%20%2Efrom%20in%20last%20%28or%20move%20them%20into%20first%20in%20case%20of%20sameLine%29%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20last%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20span%20%3D%20last%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28span%2Eto%20%21%3D%20null%29%20span%2Eto%20%2B%3D%20offset%3B%0A%20%20%20%20%20%20%20%20if%20%28span%2Efrom%20%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20found%20%3D%20getMarkedSpanFor%28first%2C%20span%2Emarker%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21found%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20span%2Efrom%20%3D%20offset%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28sameLine%29%20%28first%20%7C%7C%20%28first%20%3D%20%5B%5D%29%29%2Epush%28span%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20span%2Efrom%20%2B%3D%20offset%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28sameLine%29%20%28first%20%7C%7C%20%28first%20%3D%20%5B%5D%29%29%2Epush%28span%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20%2F%2F%20Make%20sure%20we%20didn%27t%20create%20any%20zero%2Dlength%20spans%0A%20%20%20%20if%20%28first%29%20first%20%3D%20clearEmptySpans%28first%29%3B%0A%20%20%20%20if%20%28last%20%26%26%20last%20%21%3D%20first%29%20last%20%3D%20clearEmptySpans%28last%29%3B%0A%0A%20%20%20%20var%20newMarkers%20%3D%20%5Bfirst%5D%3B%0A%20%20%20%20if%20%28%21sameLine%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Fill%20gap%20with%20whole%2Dline%2Dspans%0A%20%20%20%20%20%20var%20gap%20%3D%20change%2Etext%2Elength%20%2D%202%2C%20gapMarkers%3B%0A%20%20%20%20%20%20if%20%28gap%20%3E%200%20%26%26%20first%29%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20first%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20%20%20%20%20if%20%28first%5Bi%5D%2Eto%20%3D%3D%20null%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%28gapMarkers%20%7C%7C%20%28gapMarkers%20%3D%20%5B%5D%29%29%2Epush%28new%20MarkedSpan%28first%5Bi%5D%2Emarker%2C%20null%2C%20null%29%29%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20gap%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20%20%20newMarkers%2Epush%28gapMarkers%29%3B%0A%20%20%20%20%20%20newMarkers%2Epush%28last%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20newMarkers%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Remove%20spans%20that%20are%20empty%20and%20don%27t%20have%20a%20clearWhenEmpty%0A%20%20%2F%2F%20option%20of%20false%2E%0A%20%20function%20clearEmptySpans%28spans%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20spans%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20span%20%3D%20spans%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28span%2Efrom%20%21%3D%20null%20%26%26%20span%2Efrom%20%3D%3D%20span%2Eto%20%26%26%20span%2Emarker%2EclearWhenEmpty%20%21%3D%3D%20false%29%0A%20%20%20%20%20%20%20%20spans%2Esplice%28i%2D%2D%2C%201%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28%21spans%2Elength%29%20return%20null%3B%0A%20%20%20%20return%20spans%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Used%20for%20un%2Fre%2Ddoing%20changes%20from%20the%20history%2E%20Combines%20the%0A%20%20%2F%2F%20result%20of%20computing%20the%20existing%20spans%20with%20the%20set%20of%20spans%20that%0A%20%20%2F%2F%20existed%20in%20the%20history%20%28so%20that%20deleting%20around%20a%20span%20and%20then%0A%20%20%2F%2F%20undoing%20brings%20back%20the%20span%29%2E%0A%20%20function%20mergeOldSpans%28doc%2C%20change%29%20%7B%0A%20%20%20%20var%20old%20%3D%20getOldSpans%28doc%2C%20change%29%3B%0A%20%20%20%20var%20stretched%20%3D%20stretchSpansOverChange%28doc%2C%20change%29%3B%0A%20%20%20%20if%20%28%21old%29%20return%20stretched%3B%0A%20%20%20%20if%20%28%21stretched%29%20return%20old%3B%0A%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20old%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20oldCur%20%3D%20old%5Bi%5D%2C%20stretchCur%20%3D%20stretched%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28oldCur%20%26%26%20stretchCur%29%20%7B%0A%20%20%20%20%20%20%20%20spans%3A%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20stretchCur%2Elength%3B%20%2B%2Bj%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20span%20%3D%20stretchCur%5Bj%5D%3B%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20k%20%3D%200%3B%20k%20%3C%20oldCur%2Elength%3B%20%2B%2Bk%29%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28oldCur%5Bk%5D%2Emarker%20%3D%3D%20span%2Emarker%29%20continue%20spans%3B%0A%20%20%20%20%20%20%20%20%20%20oldCur%2Epush%28span%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20if%20%28stretchCur%29%20%7B%0A%20%20%20%20%20%20%20%20old%5Bi%5D%20%3D%20stretchCur%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20old%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Used%20to%20%27clip%27%20out%20readOnly%20ranges%20when%20making%20a%20change%2E%0A%20%20function%20removeReadOnlyRanges%28doc%2C%20from%2C%20to%29%20%7B%0A%20%20%20%20var%20markers%20%3D%20null%3B%0A%20%20%20%20doc%2Eiter%28from%2Eline%2C%20to%2Eline%20%2B%201%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20if%20%28line%2EmarkedSpans%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20line%2EmarkedSpans%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20mark%20%3D%20line%2EmarkedSpans%5Bi%5D%2Emarker%3B%0A%20%20%20%20%20%20%20%20if%20%28mark%2EreadOnly%20%26%26%20%28%21markers%20%7C%7C%20indexOf%28markers%2C%20mark%29%20%3D%3D%20%2D1%29%29%0A%20%20%20%20%20%20%20%20%20%20%28markers%20%7C%7C%20%28markers%20%3D%20%5B%5D%29%29%2Epush%28mark%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20if%20%28%21markers%29%20return%20null%3B%0A%20%20%20%20var%20parts%20%3D%20%5B%7Bfrom%3A%20from%2C%20to%3A%20to%7D%5D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20markers%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20mk%20%3D%20markers%5Bi%5D%2C%20m%20%3D%20mk%2Efind%280%29%3B%0A%20%20%20%20%20%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20parts%2Elength%3B%20%2B%2Bj%29%20%7B%0A%20%20%20%20%20%20%20%20var%20p%20%3D%20parts%5Bj%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28cmp%28p%2Eto%2C%20m%2Efrom%29%20%3C%200%20%7C%7C%20cmp%28p%2Efrom%2C%20m%2Eto%29%20%3E%200%29%20continue%3B%0A%20%20%20%20%20%20%20%20var%20newParts%20%3D%20%5Bj%2C%201%5D%2C%20dfrom%20%3D%20cmp%28p%2Efrom%2C%20m%2Efrom%29%2C%20dto%20%3D%20cmp%28p%2Eto%2C%20m%2Eto%29%3B%0A%20%20%20%20%20%20%20%20if%20%28dfrom%20%3C%200%20%7C%7C%20%21mk%2EinclusiveLeft%20%26%26%20%21dfrom%29%0A%20%20%20%20%20%20%20%20%20%20newParts%2Epush%28%7Bfrom%3A%20p%2Efrom%2C%20to%3A%20m%2Efrom%7D%29%3B%0A%20%20%20%20%20%20%20%20if%20%28dto%20%3E%200%20%7C%7C%20%21mk%2EinclusiveRight%20%26%26%20%21dto%29%0A%20%20%20%20%20%20%20%20%20%20newParts%2Epush%28%7Bfrom%3A%20m%2Eto%2C%20to%3A%20p%2Eto%7D%29%3B%0A%20%20%20%20%20%20%20%20parts%2Esplice%2Eapply%28parts%2C%20newParts%29%3B%0A%20%20%20%20%20%20%20%20j%20%2B%3D%20newParts%2Elength%20%2D%201%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20parts%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Connect%20or%20disconnect%20spans%20from%20a%20line%2E%0A%20%20function%20detachMarkedSpans%28line%29%20%7B%0A%20%20%20%20var%20spans%20%3D%20line%2EmarkedSpans%3B%0A%20%20%20%20if%20%28%21spans%29%20return%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20spans%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20spans%5Bi%5D%2Emarker%2EdetachLine%28line%29%3B%0A%20%20%20%20line%2EmarkedSpans%20%3D%20null%3B%0A%20%20%7D%0A%20%20function%20attachMarkedSpans%28line%2C%20spans%29%20%7B%0A%20%20%20%20if%20%28%21spans%29%20return%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20spans%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20spans%5Bi%5D%2Emarker%2EattachLine%28line%29%3B%0A%20%20%20%20line%2EmarkedSpans%20%3D%20spans%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Helpers%20used%20when%20computing%20which%20overlapping%20collapsed%20span%0A%20%20%2F%2F%20counts%20as%20the%20larger%20one%2E%0A%20%20function%20extraLeft%28marker%29%20%7B%20return%20marker%2EinclusiveLeft%20%3F%20%2D1%20%3A%200%3B%20%7D%0A%20%20function%20extraRight%28marker%29%20%7B%20return%20marker%2EinclusiveRight%20%3F%201%20%3A%200%3B%20%7D%0A%0A%20%20%2F%2F%20Returns%20a%20number%20indicating%20which%20of%20two%20overlapping%20collapsed%0A%20%20%2F%2F%20spans%20is%20larger%20%28and%20thus%20includes%20the%20other%29%2E%20Falls%20back%20to%0A%20%20%2F%2F%20comparing%20ids%20when%20the%20spans%20cover%20exactly%20the%20same%20range%2E%0A%20%20function%20compareCollapsedMarkers%28a%2C%20b%29%20%7B%0A%20%20%20%20var%20lenDiff%20%3D%20a%2Elines%2Elength%20%2D%20b%2Elines%2Elength%3B%0A%20%20%20%20if%20%28lenDiff%20%21%3D%200%29%20return%20lenDiff%3B%0A%20%20%20%20var%20aPos%20%3D%20a%2Efind%28%29%2C%20bPos%20%3D%20b%2Efind%28%29%3B%0A%20%20%20%20var%20fromCmp%20%3D%20cmp%28aPos%2Efrom%2C%20bPos%2Efrom%29%20%7C%7C%20extraLeft%28a%29%20%2D%20extraLeft%28b%29%3B%0A%20%20%20%20if%20%28fromCmp%29%20return%20%2DfromCmp%3B%0A%20%20%20%20var%20toCmp%20%3D%20cmp%28aPos%2Eto%2C%20bPos%2Eto%29%20%7C%7C%20extraRight%28a%29%20%2D%20extraRight%28b%29%3B%0A%20%20%20%20if%20%28toCmp%29%20return%20toCmp%3B%0A%20%20%20%20return%20b%2Eid%20%2D%20a%2Eid%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Find%20out%20whether%20a%20line%20ends%20or%20starts%20in%20a%20collapsed%20span%2E%20If%0A%20%20%2F%2F%20so%2C%20return%20the%20marker%20for%20that%20span%2E%0A%20%20function%20collapsedSpanAtSide%28line%2C%20start%29%20%7B%0A%20%20%20%20var%20sps%20%3D%20sawCollapsedSpans%20%26%26%20line%2EmarkedSpans%2C%20found%3B%0A%20%20%20%20if%20%28sps%29%20for%20%28var%20sp%2C%20i%20%3D%200%3B%20i%20%3C%20sps%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20sp%20%3D%20sps%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28sp%2Emarker%2Ecollapsed%20%26%26%20%28start%20%3F%20sp%2Efrom%20%3A%20sp%2Eto%29%20%3D%3D%20null%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%28%21found%20%7C%7C%20compareCollapsedMarkers%28found%2C%20sp%2Emarker%29%20%3C%200%29%29%0A%20%20%20%20%20%20%20%20found%20%3D%20sp%2Emarker%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20found%3B%0A%20%20%7D%0A%20%20function%20collapsedSpanAtStart%28line%29%20%7B%20return%20collapsedSpanAtSide%28line%2C%20true%29%3B%20%7D%0A%20%20function%20collapsedSpanAtEnd%28line%29%20%7B%20return%20collapsedSpanAtSide%28line%2C%20false%29%3B%20%7D%0A%0A%20%20%2F%2F%20Test%20whether%20there%20exists%20a%20collapsed%20span%20that%20partially%0A%20%20%2F%2F%20overlaps%20%28covers%20the%20start%20or%20end%2C%20but%20not%20both%29%20of%20a%20new%20span%2E%0A%20%20%2F%2F%20Such%20overlap%20is%20not%20allowed%2E%0A%20%20function%20conflictingCollapsedRange%28doc%2C%20lineNo%2C%20from%2C%20to%2C%20marker%29%20%7B%0A%20%20%20%20var%20line%20%3D%20getLine%28doc%2C%20lineNo%29%3B%0A%20%20%20%20var%20sps%20%3D%20sawCollapsedSpans%20%26%26%20line%2EmarkedSpans%3B%0A%20%20%20%20if%20%28sps%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20sps%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20sp%20%3D%20sps%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28%21sp%2Emarker%2Ecollapsed%29%20continue%3B%0A%20%20%20%20%20%20var%20found%20%3D%20sp%2Emarker%2Efind%280%29%3B%0A%20%20%20%20%20%20var%20fromCmp%20%3D%20cmp%28found%2Efrom%2C%20from%29%20%7C%7C%20extraLeft%28sp%2Emarker%29%20%2D%20extraLeft%28marker%29%3B%0A%20%20%20%20%20%20var%20toCmp%20%3D%20cmp%28found%2Eto%2C%20to%29%20%7C%7C%20extraRight%28sp%2Emarker%29%20%2D%20extraRight%28marker%29%3B%0A%20%20%20%20%20%20if%20%28fromCmp%20%3E%3D%200%20%26%26%20toCmp%20%3C%3D%200%20%7C%7C%20fromCmp%20%3C%3D%200%20%26%26%20toCmp%20%3E%3D%200%29%20continue%3B%0A%20%20%20%20%20%20if%20%28fromCmp%20%3C%3D%200%20%26%26%20%28cmp%28found%2Eto%2C%20from%29%20%3E%200%20%7C%7C%20%28sp%2Emarker%2EinclusiveRight%20%26%26%20marker%2EinclusiveLeft%29%29%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20fromCmp%20%3E%3D%200%20%26%26%20%28cmp%28found%2Efrom%2C%20to%29%20%3C%200%20%7C%7C%20%28sp%2Emarker%2EinclusiveLeft%20%26%26%20marker%2EinclusiveRight%29%29%29%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20A%20visual%20line%20is%20a%20line%20as%20drawn%20on%20the%20screen%2E%20Folding%2C%20for%0A%20%20%2F%2F%20example%2C%20can%20cause%20multiple%20logical%20lines%20to%20appear%20on%20the%20same%0A%20%20%2F%2F%20visual%20line%2E%20This%20finds%20the%20start%20of%20the%20visual%20line%20that%20the%0A%20%20%2F%2F%20given%20line%20is%20part%20of%20%28usually%20that%20is%20the%20line%20itself%29%2E%0A%20%20function%20visualLine%28line%29%20%7B%0A%20%20%20%20var%20merged%3B%0A%20%20%20%20while%20%28merged%20%3D%20collapsedSpanAtStart%28line%29%29%0A%20%20%20%20%20%20line%20%3D%20merged%2Efind%28%2D1%2C%20true%29%2Eline%3B%0A%20%20%20%20return%20line%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Returns%20an%20array%20of%20logical%20lines%20that%20continue%20the%20visual%20line%0A%20%20%2F%2F%20started%20by%20the%20argument%2C%20or%20undefined%20if%20there%20are%20no%20such%20lines%2E%0A%20%20function%20visualLineContinued%28line%29%20%7B%0A%20%20%20%20var%20merged%2C%20lines%3B%0A%20%20%20%20while%20%28merged%20%3D%20collapsedSpanAtEnd%28line%29%29%20%7B%0A%20%20%20%20%20%20line%20%3D%20merged%2Efind%281%2C%20true%29%2Eline%3B%0A%20%20%20%20%20%20%28lines%20%7C%7C%20%28lines%20%3D%20%5B%5D%29%29%2Epush%28line%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20lines%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Get%20the%20line%20number%20of%20the%20start%20of%20the%20visual%20line%20that%20the%0A%20%20%2F%2F%20given%20line%20number%20is%20part%20of%2E%0A%20%20function%20visualLineNo%28doc%2C%20lineN%29%20%7B%0A%20%20%20%20var%20line%20%3D%20getLine%28doc%2C%20lineN%29%2C%20vis%20%3D%20visualLine%28line%29%3B%0A%20%20%20%20if%20%28line%20%3D%3D%20vis%29%20return%20lineN%3B%0A%20%20%20%20return%20lineNo%28vis%29%3B%0A%20%20%7D%0A%20%20%2F%2F%20Get%20the%20line%20number%20of%20the%20start%20of%20the%20next%20visual%20line%20after%0A%20%20%2F%2F%20the%20given%20line%2E%0A%20%20function%20visualLineEndNo%28doc%2C%20lineN%29%20%7B%0A%20%20%20%20if%20%28lineN%20%3E%20doc%2ElastLine%28%29%29%20return%20lineN%3B%0A%20%20%20%20var%20line%20%3D%20getLine%28doc%2C%20lineN%29%2C%20merged%3B%0A%20%20%20%20if%20%28%21lineIsHidden%28doc%2C%20line%29%29%20return%20lineN%3B%0A%20%20%20%20while%20%28merged%20%3D%20collapsedSpanAtEnd%28line%29%29%0A%20%20%20%20%20%20line%20%3D%20merged%2Efind%281%2C%20true%29%2Eline%3B%0A%20%20%20%20return%20lineNo%28line%29%20%2B%201%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Compute%20whether%20a%20line%20is%20hidden%2E%20Lines%20count%20as%20hidden%20when%20they%0A%20%20%2F%2F%20are%20part%20of%20a%20visual%20line%20that%20starts%20with%20another%20line%2C%20or%20when%0A%20%20%2F%2F%20they%20are%20entirely%20covered%20by%20collapsed%2C%20non%2Dwidget%20span%2E%0A%20%20function%20lineIsHidden%28doc%2C%20line%29%20%7B%0A%20%20%20%20var%20sps%20%3D%20sawCollapsedSpans%20%26%26%20line%2EmarkedSpans%3B%0A%20%20%20%20if%20%28sps%29%20for%20%28var%20sp%2C%20i%20%3D%200%3B%20i%20%3C%20sps%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20sp%20%3D%20sps%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28%21sp%2Emarker%2Ecollapsed%29%20continue%3B%0A%20%20%20%20%20%20if%20%28sp%2Efrom%20%3D%3D%20null%29%20return%20true%3B%0A%20%20%20%20%20%20if%20%28sp%2Emarker%2EwidgetNode%29%20continue%3B%0A%20%20%20%20%20%20if%20%28sp%2Efrom%20%3D%3D%200%20%26%26%20sp%2Emarker%2EinclusiveLeft%20%26%26%20lineIsHiddenInner%28doc%2C%20line%2C%20sp%29%29%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20function%20lineIsHiddenInner%28doc%2C%20line%2C%20span%29%20%7B%0A%20%20%20%20if%20%28span%2Eto%20%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20var%20end%20%3D%20span%2Emarker%2Efind%281%2C%20true%29%3B%0A%20%20%20%20%20%20return%20lineIsHiddenInner%28doc%2C%20end%2Eline%2C%20getMarkedSpanFor%28end%2Eline%2EmarkedSpans%2C%20span%2Emarker%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28span%2Emarker%2EinclusiveRight%20%26%26%20span%2Eto%20%3D%3D%20line%2Etext%2Elength%29%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20for%20%28var%20sp%2C%20i%20%3D%200%3B%20i%20%3C%20line%2EmarkedSpans%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20sp%20%3D%20line%2EmarkedSpans%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28sp%2Emarker%2Ecollapsed%20%26%26%20%21sp%2Emarker%2EwidgetNode%20%26%26%20sp%2Efrom%20%3D%3D%20span%2Eto%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%28sp%2Eto%20%3D%3D%20null%20%7C%7C%20sp%2Eto%20%21%3D%20span%2Efrom%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%28sp%2Emarker%2EinclusiveLeft%20%7C%7C%20span%2Emarker%2EinclusiveRight%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20lineIsHiddenInner%28doc%2C%20line%2C%20sp%29%29%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20LINE%20WIDGETS%0A%0A%20%20%2F%2F%20Line%20widgets%20are%20block%20elements%20displayed%20above%20or%20below%20a%20line%2E%0A%0A%20%20var%20LineWidget%20%3D%20CodeMirror%2ELineWidget%20%3D%20function%28doc%2C%20node%2C%20options%29%20%7B%0A%20%20%20%20if%20%28options%29%20for%20%28var%20opt%20in%20options%29%20if%20%28options%2EhasOwnProperty%28opt%29%29%0A%20%20%20%20%20%20this%5Bopt%5D%20%3D%20options%5Bopt%5D%3B%0A%20%20%20%20this%2Edoc%20%3D%20doc%3B%0A%20%20%20%20this%2Enode%20%3D%20node%3B%0A%20%20%7D%3B%0A%20%20eventMixin%28LineWidget%29%3B%0A%0A%20%20function%20adjustScrollWhenAboveVisible%28cm%2C%20line%2C%20diff%29%20%7B%0A%20%20%20%20if%20%28heightAtLine%28line%29%20%3C%20%28%28cm%2EcurOp%20%26%26%20cm%2EcurOp%2EscrollTop%29%20%7C%7C%20cm%2Edoc%2EscrollTop%29%29%0A%20%20%20%20%20%20addToScrollPos%28cm%2C%20null%2C%20diff%29%3B%0A%20%20%7D%0A%0A%20%20LineWidget%2Eprototype%2Eclear%20%3D%20function%28%29%20%7B%0A%20%20%20%20var%20cm%20%3D%20this%2Edoc%2Ecm%2C%20ws%20%3D%20this%2Eline%2Ewidgets%2C%20line%20%3D%20this%2Eline%2C%20no%20%3D%20lineNo%28line%29%3B%0A%20%20%20%20if%20%28no%20%3D%3D%20null%20%7C%7C%20%21ws%29%20return%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ws%2Elength%3B%20%2B%2Bi%29%20if%20%28ws%5Bi%5D%20%3D%3D%20this%29%20ws%2Esplice%28i%2D%2D%2C%201%29%3B%0A%20%20%20%20if%20%28%21ws%2Elength%29%20line%2Ewidgets%20%3D%20null%3B%0A%20%20%20%20var%20height%20%3D%20widgetHeight%28this%29%3B%0A%20%20%20%20updateLineHeight%28line%2C%20Math%2Emax%280%2C%20line%2Eheight%20%2D%20height%29%29%3B%0A%20%20%20%20if%20%28cm%29%20runInOp%28cm%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20adjustScrollWhenAboveVisible%28cm%2C%20line%2C%20%2Dheight%29%3B%0A%20%20%20%20%20%20regLineChange%28cm%2C%20no%2C%20%22widget%22%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%3B%0A%20%20LineWidget%2Eprototype%2Echanged%20%3D%20function%28%29%20%7B%0A%20%20%20%20var%20oldH%20%3D%20this%2Eheight%2C%20cm%20%3D%20this%2Edoc%2Ecm%2C%20line%20%3D%20this%2Eline%3B%0A%20%20%20%20this%2Eheight%20%3D%20null%3B%0A%20%20%20%20var%20diff%20%3D%20widgetHeight%28this%29%20%2D%20oldH%3B%0A%20%20%20%20if%20%28%21diff%29%20return%3B%0A%20%20%20%20updateLineHeight%28line%2C%20line%2Eheight%20%2B%20diff%29%3B%0A%20%20%20%20if%20%28cm%29%20runInOp%28cm%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20cm%2EcurOp%2EforceUpdate%20%3D%20true%3B%0A%20%20%20%20%20%20adjustScrollWhenAboveVisible%28cm%2C%20line%2C%20diff%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%3B%0A%0A%20%20function%20widgetHeight%28widget%29%20%7B%0A%20%20%20%20if%20%28widget%2Eheight%20%21%3D%20null%29%20return%20widget%2Eheight%3B%0A%20%20%20%20var%20cm%20%3D%20widget%2Edoc%2Ecm%3B%0A%20%20%20%20if%20%28%21cm%29%20return%200%3B%0A%20%20%20%20if%20%28%21contains%28document%2Ebody%2C%20widget%2Enode%29%29%20%7B%0A%20%20%20%20%20%20var%20parentStyle%20%3D%20%22position%3A%20relative%3B%22%3B%0A%20%20%20%20%20%20if%20%28widget%2EcoverGutter%29%0A%20%20%20%20%20%20%20%20parentStyle%20%2B%3D%20%22margin%2Dleft%3A%20%2D%22%20%2B%20cm%2Edisplay%2Egutters%2EoffsetWidth%20%2B%20%22px%3B%22%3B%0A%20%20%20%20%20%20if%20%28widget%2EnoHScroll%29%0A%20%20%20%20%20%20%20%20parentStyle%20%2B%3D%20%22width%3A%20%22%20%2B%20cm%2Edisplay%2Ewrapper%2EclientWidth%20%2B%20%22px%3B%22%3B%0A%20%20%20%20%20%20removeChildrenAndAdd%28cm%2Edisplay%2Emeasure%2C%20elt%28%22div%22%2C%20%5Bwidget%2Enode%5D%2C%20null%2C%20parentStyle%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20widget%2Eheight%20%3D%20widget%2Enode%2EparentNode%2EoffsetHeight%3B%0A%20%20%7D%0A%0A%20%20function%20addLineWidget%28doc%2C%20handle%2C%20node%2C%20options%29%20%7B%0A%20%20%20%20var%20widget%20%3D%20new%20LineWidget%28doc%2C%20node%2C%20options%29%3B%0A%20%20%20%20var%20cm%20%3D%20doc%2Ecm%3B%0A%20%20%20%20if%20%28cm%20%26%26%20widget%2EnoHScroll%29%20cm%2Edisplay%2EalignWidgets%20%3D%20true%3B%0A%20%20%20%20changeLine%28doc%2C%20handle%2C%20%22widget%22%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20var%20widgets%20%3D%20line%2Ewidgets%20%7C%7C%20%28line%2Ewidgets%20%3D%20%5B%5D%29%3B%0A%20%20%20%20%20%20if%20%28widget%2EinsertAt%20%3D%3D%20null%29%20widgets%2Epush%28widget%29%3B%0A%20%20%20%20%20%20else%20widgets%2Esplice%28Math%2Emin%28widgets%2Elength%20%2D%201%2C%20Math%2Emax%280%2C%20widget%2EinsertAt%29%29%2C%200%2C%20widget%29%3B%0A%20%20%20%20%20%20widget%2Eline%20%3D%20line%3B%0A%20%20%20%20%20%20if%20%28cm%20%26%26%20%21lineIsHidden%28doc%2C%20line%29%29%20%7B%0A%20%20%20%20%20%20%20%20var%20aboveVisible%20%3D%20heightAtLine%28line%29%20%3C%20doc%2EscrollTop%3B%0A%20%20%20%20%20%20%20%20updateLineHeight%28line%2C%20line%2Eheight%20%2B%20widgetHeight%28widget%29%29%3B%0A%20%20%20%20%20%20%20%20if%20%28aboveVisible%29%20addToScrollPos%28cm%2C%20null%2C%20widget%2Eheight%29%3B%0A%20%20%20%20%20%20%20%20cm%2EcurOp%2EforceUpdate%20%3D%20true%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20return%20widget%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20LINE%20DATA%20STRUCTURE%0A%0A%20%20%2F%2F%20Line%20objects%2E%20These%20hold%20state%20related%20to%20a%20line%2C%20including%0A%20%20%2F%2F%20highlighting%20info%20%28the%20styles%20array%29%2E%0A%20%20var%20Line%20%3D%20CodeMirror%2ELine%20%3D%20function%28text%2C%20markedSpans%2C%20estimateHeight%29%20%7B%0A%20%20%20%20this%2Etext%20%3D%20text%3B%0A%20%20%20%20attachMarkedSpans%28this%2C%20markedSpans%29%3B%0A%20%20%20%20this%2Eheight%20%3D%20estimateHeight%20%3F%20estimateHeight%28this%29%20%3A%201%3B%0A%20%20%7D%3B%0A%20%20eventMixin%28Line%29%3B%0A%20%20Line%2Eprototype%2ElineNo%20%3D%20function%28%29%20%7B%20return%20lineNo%28this%29%3B%20%7D%3B%0A%0A%20%20%2F%2F%20Change%20the%20content%20%28text%2C%20markers%29%20of%20a%20line%2E%20Automatically%0A%20%20%2F%2F%20invalidates%20cached%20information%20and%20tries%20to%20re%2Destimate%20the%0A%20%20%2F%2F%20line%27s%20height%2E%0A%20%20function%20updateLine%28line%2C%20text%2C%20markedSpans%2C%20estimateHeight%29%20%7B%0A%20%20%20%20line%2Etext%20%3D%20text%3B%0A%20%20%20%20if%20%28line%2EstateAfter%29%20line%2EstateAfter%20%3D%20null%3B%0A%20%20%20%20if%20%28line%2Estyles%29%20line%2Estyles%20%3D%20null%3B%0A%20%20%20%20if%20%28line%2Eorder%20%21%3D%20null%29%20line%2Eorder%20%3D%20null%3B%0A%20%20%20%20detachMarkedSpans%28line%29%3B%0A%20%20%20%20attachMarkedSpans%28line%2C%20markedSpans%29%3B%0A%20%20%20%20var%20estHeight%20%3D%20estimateHeight%20%3F%20estimateHeight%28line%29%20%3A%201%3B%0A%20%20%20%20if%20%28estHeight%20%21%3D%20line%2Eheight%29%20updateLineHeight%28line%2C%20estHeight%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Detach%20a%20line%20from%20the%20document%20tree%20and%20its%20markers%2E%0A%20%20function%20cleanUpLine%28line%29%20%7B%0A%20%20%20%20line%2Eparent%20%3D%20null%3B%0A%20%20%20%20detachMarkedSpans%28line%29%3B%0A%20%20%7D%0A%0A%20%20function%20extractLineClasses%28type%2C%20output%29%20%7B%0A%20%20%20%20if%20%28type%29%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20var%20lineClass%20%3D%20type%2Ematch%28%2F%28%3F%3A%5E%7C%5Cs%2B%29line%2D%28background%2D%29%3F%28%5CS%2B%29%2F%29%3B%0A%20%20%20%20%20%20if%20%28%21lineClass%29%20break%3B%0A%20%20%20%20%20%20type%20%3D%20type%2Eslice%280%2C%20lineClass%2Eindex%29%20%2B%20type%2Eslice%28lineClass%2Eindex%20%2B%20lineClass%5B0%5D%2Elength%29%3B%0A%20%20%20%20%20%20var%20prop%20%3D%20lineClass%5B1%5D%20%3F%20%22bgClass%22%20%3A%20%22textClass%22%3B%0A%20%20%20%20%20%20if%20%28output%5Bprop%5D%20%3D%3D%20null%29%0A%20%20%20%20%20%20%20%20output%5Bprop%5D%20%3D%20lineClass%5B2%5D%3B%0A%20%20%20%20%20%20else%20if%20%28%21%28new%20RegExp%28%22%28%3F%3A%5E%7C%5Cs%29%22%20%2B%20lineClass%5B2%5D%20%2B%20%22%28%3F%3A%24%7C%5Cs%29%22%29%29%2Etest%28output%5Bprop%5D%29%29%0A%20%20%20%20%20%20%20%20output%5Bprop%5D%20%2B%3D%20%22%20%22%20%2B%20lineClass%5B2%5D%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20type%3B%0A%20%20%7D%0A%0A%20%20function%20callBlankLine%28mode%2C%20state%29%20%7B%0A%20%20%20%20if%20%28mode%2EblankLine%29%20return%20mode%2EblankLine%28state%29%3B%0A%20%20%20%20if%20%28%21mode%2EinnerMode%29%20return%3B%0A%20%20%20%20var%20inner%20%3D%20CodeMirror%2EinnerMode%28mode%2C%20state%29%3B%0A%20%20%20%20if%20%28inner%2Emode%2EblankLine%29%20return%20inner%2Emode%2EblankLine%28inner%2Estate%29%3B%0A%20%20%7D%0A%0A%20%20function%20readToken%28mode%2C%20stream%2C%20state%2C%20inner%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%2010%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20if%20%28inner%29%20inner%5B0%5D%20%3D%20CodeMirror%2EinnerMode%28mode%2C%20state%29%2Emode%3B%0A%20%20%20%20%20%20var%20style%20%3D%20mode%2Etoken%28stream%2C%20state%29%3B%0A%20%20%20%20%20%20if%20%28stream%2Epos%20%3E%20stream%2Estart%29%20return%20style%3B%0A%20%20%20%20%7D%0A%20%20%20%20throw%20new%20Error%28%22Mode%20%22%20%2B%20mode%2Ename%20%2B%20%22%20failed%20to%20advance%20stream%2E%22%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Utility%20for%20getTokenAt%20and%20getLineTokens%0A%20%20function%20takeToken%28cm%2C%20pos%2C%20precise%2C%20asArray%29%20%7B%0A%20%20%20%20function%20getObj%28copy%29%20%7B%0A%20%20%20%20%20%20return%20%7Bstart%3A%20stream%2Estart%2C%20end%3A%20stream%2Epos%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20string%3A%20stream%2Ecurrent%28%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20style%20%7C%7C%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20state%3A%20copy%20%3F%20copyState%28doc%2Emode%2C%20state%29%20%3A%20state%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20doc%20%3D%20cm%2Edoc%2C%20mode%20%3D%20doc%2Emode%2C%20style%3B%0A%20%20%20%20pos%20%3D%20clipPos%28doc%2C%20pos%29%3B%0A%20%20%20%20var%20line%20%3D%20getLine%28doc%2C%20pos%2Eline%29%2C%20state%20%3D%20getStateBefore%28cm%2C%20pos%2Eline%2C%20precise%29%3B%0A%20%20%20%20var%20stream%20%3D%20new%20StringStream%28line%2Etext%2C%20cm%2Eoptions%2EtabSize%29%2C%20tokens%3B%0A%20%20%20%20if%20%28asArray%29%20tokens%20%3D%20%5B%5D%3B%0A%20%20%20%20while%20%28%28asArray%20%7C%7C%20stream%2Epos%20%3C%20pos%2Ech%29%20%26%26%20%21stream%2Eeol%28%29%29%20%7B%0A%20%20%20%20%20%20stream%2Estart%20%3D%20stream%2Epos%3B%0A%20%20%20%20%20%20style%20%3D%20readToken%28mode%2C%20stream%2C%20state%29%3B%0A%20%20%20%20%20%20if%20%28asArray%29%20tokens%2Epush%28getObj%28true%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20asArray%20%3F%20tokens%20%3A%20getObj%28%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Run%20the%20given%20mode%27s%20parser%20over%20a%20line%2C%20calling%20f%20for%20each%20token%2E%0A%20%20function%20runMode%28cm%2C%20text%2C%20mode%2C%20state%2C%20f%2C%20lineClasses%2C%20forceToEnd%29%20%7B%0A%20%20%20%20var%20flattenSpans%20%3D%20mode%2EflattenSpans%3B%0A%20%20%20%20if%20%28flattenSpans%20%3D%3D%20null%29%20flattenSpans%20%3D%20cm%2Eoptions%2EflattenSpans%3B%0A%20%20%20%20var%20curStart%20%3D%200%2C%20curStyle%20%3D%20null%3B%0A%20%20%20%20var%20stream%20%3D%20new%20StringStream%28text%2C%20cm%2Eoptions%2EtabSize%29%2C%20style%3B%0A%20%20%20%20var%20inner%20%3D%20cm%2Eoptions%2EaddModeClass%20%26%26%20%5Bnull%5D%3B%0A%20%20%20%20if%20%28text%20%3D%3D%20%22%22%29%20extractLineClasses%28callBlankLine%28mode%2C%20state%29%2C%20lineClasses%29%3B%0A%20%20%20%20while%20%28%21stream%2Eeol%28%29%29%20%7B%0A%20%20%20%20%20%20if%20%28stream%2Epos%20%3E%20cm%2Eoptions%2EmaxHighlightLength%29%20%7B%0A%20%20%20%20%20%20%20%20flattenSpans%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20if%20%28forceToEnd%29%20processLine%28cm%2C%20text%2C%20state%2C%20stream%2Epos%29%3B%0A%20%20%20%20%20%20%20%20stream%2Epos%20%3D%20text%2Elength%3B%0A%20%20%20%20%20%20%20%20style%20%3D%20null%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20style%20%3D%20extractLineClasses%28readToken%28mode%2C%20stream%2C%20state%2C%20inner%29%2C%20lineClasses%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28inner%29%20%7B%0A%20%20%20%20%20%20%20%20var%20mName%20%3D%20inner%5B0%5D%2Ename%3B%0A%20%20%20%20%20%20%20%20if%20%28mName%29%20style%20%3D%20%22m%2D%22%20%2B%20%28style%20%3F%20mName%20%2B%20%22%20%22%20%2B%20style%20%3A%20mName%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28%21flattenSpans%20%7C%7C%20curStyle%20%21%3D%20style%29%20%7B%0A%20%20%20%20%20%20%20%20while%20%28curStart%20%3C%20stream%2Estart%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20curStart%20%3D%20Math%2Emin%28stream%2Estart%2C%20curStart%20%2B%2050000%29%3B%0A%20%20%20%20%20%20%20%20%20%20f%28curStart%2C%20curStyle%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20curStyle%20%3D%20style%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20stream%2Estart%20%3D%20stream%2Epos%3B%0A%20%20%20%20%7D%0A%20%20%20%20while%20%28curStart%20%3C%20stream%2Epos%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Webkit%20seems%20to%20refuse%20to%20render%20text%20nodes%20longer%20than%2057444%20characters%0A%20%20%20%20%20%20var%20pos%20%3D%20Math%2Emin%28stream%2Epos%2C%20curStart%20%2B%2050000%29%3B%0A%20%20%20%20%20%20f%28pos%2C%20curStyle%29%3B%0A%20%20%20%20%20%20curStart%20%3D%20pos%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Compute%20a%20style%20array%20%28an%20array%20starting%20with%20a%20mode%20generation%0A%20%20%2F%2F%20%2D%2D%20for%20invalidation%20%2D%2D%20followed%20by%20pairs%20of%20end%20positions%20and%0A%20%20%2F%2F%20style%20strings%29%2C%20which%20is%20used%20to%20highlight%20the%20tokens%20on%20the%0A%20%20%2F%2F%20line%2E%0A%20%20function%20highlightLine%28cm%2C%20line%2C%20state%2C%20forceToEnd%29%20%7B%0A%20%20%20%20%2F%2F%20A%20styles%20array%20always%20starts%20with%20a%20number%20identifying%20the%0A%20%20%20%20%2F%2F%20mode%2Foverlays%20that%20it%20is%20based%20on%20%28for%20easy%20invalidation%29%2E%0A%20%20%20%20var%20st%20%3D%20%5Bcm%2Estate%2EmodeGen%5D%2C%20lineClasses%20%3D%20%7B%7D%3B%0A%20%20%20%20%2F%2F%20Compute%20the%20base%20array%20of%20styles%0A%20%20%20%20runMode%28cm%2C%20line%2Etext%2C%20cm%2Edoc%2Emode%2C%20state%2C%20function%28end%2C%20style%29%20%7B%0A%20%20%20%20%20%20st%2Epush%28end%2C%20style%29%3B%0A%20%20%20%20%7D%2C%20lineClasses%2C%20forceToEnd%29%3B%0A%0A%20%20%20%20%2F%2F%20Run%20overlays%2C%20adjust%20style%20array%2E%0A%20%20%20%20for%20%28var%20o%20%3D%200%3B%20o%20%3C%20cm%2Estate%2Eoverlays%2Elength%3B%20%2B%2Bo%29%20%7B%0A%20%20%20%20%20%20var%20overlay%20%3D%20cm%2Estate%2Eoverlays%5Bo%5D%2C%20i%20%3D%201%2C%20at%20%3D%200%3B%0A%20%20%20%20%20%20runMode%28cm%2C%20line%2Etext%2C%20overlay%2Emode%2C%20true%2C%20function%28end%2C%20style%29%20%7B%0A%20%20%20%20%20%20%20%20var%20start%20%3D%20i%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20Ensure%20there%27s%20a%20token%20end%20at%20the%20current%20position%2C%20and%20that%20i%20points%20at%20it%0A%20%20%20%20%20%20%20%20while%20%28at%20%3C%20end%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20i%5Fend%20%3D%20st%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28i%5Fend%20%3E%20end%29%0A%20%20%20%20%20%20%20%20%20%20%20%20st%2Esplice%28i%2C%201%2C%20end%2C%20st%5Bi%2B1%5D%2C%20i%5Fend%29%3B%0A%20%20%20%20%20%20%20%20%20%20i%20%2B%3D%202%3B%0A%20%20%20%20%20%20%20%20%20%20at%20%3D%20Math%2Emin%28end%2C%20i%5Fend%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28%21style%29%20return%3B%0A%20%20%20%20%20%20%20%20if%20%28overlay%2Eopaque%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20st%2Esplice%28start%2C%20i%20%2D%20start%2C%20end%2C%20%22cm%2Doverlay%20%22%20%2B%20style%29%3B%0A%20%20%20%20%20%20%20%20%20%20i%20%3D%20start%20%2B%202%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20for%20%28%3B%20start%20%3C%20i%3B%20start%20%2B%3D%202%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20cur%20%3D%20st%5Bstart%2B1%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20st%5Bstart%2B1%5D%20%3D%20%28cur%20%3F%20cur%20%2B%20%22%20%22%20%3A%20%22%22%29%20%2B%20%22cm%2Doverlay%20%22%20%2B%20style%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%2C%20lineClasses%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20%7Bstyles%3A%20st%2C%20classes%3A%20lineClasses%2EbgClass%20%7C%7C%20lineClasses%2EtextClass%20%3F%20lineClasses%20%3A%20null%7D%3B%0A%20%20%7D%0A%0A%20%20function%20getLineStyles%28cm%2C%20line%2C%20updateFrontier%29%20%7B%0A%20%20%20%20if%20%28%21line%2Estyles%20%7C%7C%20line%2Estyles%5B0%5D%20%21%3D%20cm%2Estate%2EmodeGen%29%20%7B%0A%20%20%20%20%20%20var%20state%20%3D%20getStateBefore%28cm%2C%20lineNo%28line%29%29%3B%0A%20%20%20%20%20%20var%20result%20%3D%20highlightLine%28cm%2C%20line%2C%20line%2Etext%2Elength%20%3E%20cm%2Eoptions%2EmaxHighlightLength%20%3F%20copyState%28cm%2Edoc%2Emode%2C%20state%29%20%3A%20state%29%3B%0A%20%20%20%20%20%20line%2EstateAfter%20%3D%20state%3B%0A%20%20%20%20%20%20line%2Estyles%20%3D%20result%2Estyles%3B%0A%20%20%20%20%20%20if%20%28result%2Eclasses%29%20line%2EstyleClasses%20%3D%20result%2Eclasses%3B%0A%20%20%20%20%20%20else%20if%20%28line%2EstyleClasses%29%20line%2EstyleClasses%20%3D%20null%3B%0A%20%20%20%20%20%20if%20%28updateFrontier%20%3D%3D%3D%20cm%2Edoc%2Efrontier%29%20cm%2Edoc%2Efrontier%2B%2B%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20line%2Estyles%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Lightweight%20form%20of%20highlight%20%2D%2D%20proceed%20over%20this%20line%20and%0A%20%20%2F%2F%20update%20state%2C%20but%20don%27t%20save%20a%20style%20array%2E%20Used%20for%20lines%20that%0A%20%20%2F%2F%20aren%27t%20currently%20visible%2E%0A%20%20function%20processLine%28cm%2C%20text%2C%20state%2C%20startAt%29%20%7B%0A%20%20%20%20var%20mode%20%3D%20cm%2Edoc%2Emode%3B%0A%20%20%20%20var%20stream%20%3D%20new%20StringStream%28text%2C%20cm%2Eoptions%2EtabSize%29%3B%0A%20%20%20%20stream%2Estart%20%3D%20stream%2Epos%20%3D%20startAt%20%7C%7C%200%3B%0A%20%20%20%20if%20%28text%20%3D%3D%20%22%22%29%20callBlankLine%28mode%2C%20state%29%3B%0A%20%20%20%20while%20%28%21stream%2Eeol%28%29%29%20%7B%0A%20%20%20%20%20%20readToken%28mode%2C%20stream%2C%20state%29%3B%0A%20%20%20%20%20%20stream%2Estart%20%3D%20stream%2Epos%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Convert%20a%20style%20as%20returned%20by%20a%20mode%20%28either%20null%2C%20or%20a%20string%0A%20%20%2F%2F%20containing%20one%20or%20more%20styles%29%20to%20a%20CSS%20style%2E%20This%20is%20cached%2C%0A%20%20%2F%2F%20and%20also%20looks%20for%20line%2Dwide%20styles%2E%0A%20%20var%20styleToClassCache%20%3D%20%7B%7D%2C%20styleToClassCacheWithMode%20%3D%20%7B%7D%3B%0A%20%20function%20interpretTokenStyle%28style%2C%20options%29%20%7B%0A%20%20%20%20if%20%28%21style%20%7C%7C%20%2F%5E%5Cs%2A%24%2F%2Etest%28style%29%29%20return%20null%3B%0A%20%20%20%20var%20cache%20%3D%20options%2EaddModeClass%20%3F%20styleToClassCacheWithMode%20%3A%20styleToClassCache%3B%0A%20%20%20%20return%20cache%5Bstyle%5D%20%7C%7C%0A%20%20%20%20%20%20%28cache%5Bstyle%5D%20%3D%20style%2Ereplace%28%2F%5CS%2B%2Fg%2C%20%22cm%2D%24%26%22%29%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Render%20the%20DOM%20representation%20of%20the%20text%20of%20a%20line%2E%20Also%20builds%0A%20%20%2F%2F%20up%20a%20%27line%20map%27%2C%20which%20points%20at%20the%20DOM%20nodes%20that%20represent%0A%20%20%2F%2F%20specific%20stretches%20of%20text%2C%20and%20is%20used%20by%20the%20measuring%20code%2E%0A%20%20%2F%2F%20The%20returned%20object%20contains%20the%20DOM%20node%2C%20this%20map%2C%20and%0A%20%20%2F%2F%20information%20about%20line%2Dwide%20styles%20that%20were%20set%20by%20the%20mode%2E%0A%20%20function%20buildLineContent%28cm%2C%20lineView%29%20%7B%0A%20%20%20%20%2F%2F%20The%20padding%2Dright%20forces%20the%20element%20to%20have%20a%20%27border%27%2C%20which%0A%20%20%20%20%2F%2F%20is%20needed%20on%20Webkit%20to%20be%20able%20to%20get%20line%2Dlevel%20bounding%0A%20%20%20%20%2F%2F%20rectangles%20for%20it%20%28in%20measureChar%29%2E%0A%20%20%20%20var%20content%20%3D%20elt%28%22span%22%2C%20null%2C%20null%2C%20webkit%20%3F%20%22padding%2Dright%3A%20%2E1px%22%20%3A%20null%29%3B%0A%20%20%20%20var%20builder%20%3D%20%7Bpre%3A%20elt%28%22pre%22%2C%20%5Bcontent%5D%2C%20%22CodeMirror%2Dline%22%29%2C%20content%3A%20content%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20col%3A%200%2C%20pos%3A%200%2C%20cm%3A%20cm%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20splitSpaces%3A%20%28ie%20%7C%7C%20webkit%29%20%26%26%20cm%2EgetOption%28%22lineWrapping%22%29%7D%3B%0A%20%20%20%20lineView%2Emeasure%20%3D%20%7B%7D%3B%0A%0A%20%20%20%20%2F%2F%20Iterate%20over%20the%20logical%20lines%20that%20make%20up%20this%20visual%20line%2E%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%3D%20%28lineView%2Erest%20%3F%20lineView%2Erest%2Elength%20%3A%200%29%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20line%20%3D%20i%20%3F%20lineView%2Erest%5Bi%20%2D%201%5D%20%3A%20lineView%2Eline%2C%20order%3B%0A%20%20%20%20%20%20builder%2Epos%20%3D%200%3B%0A%20%20%20%20%20%20builder%2EaddToken%20%3D%20buildToken%3B%0A%20%20%20%20%20%20%2F%2F%20Optionally%20wire%20in%20some%20hacks%20into%20the%20token%2Drendering%0A%20%20%20%20%20%20%2F%2F%20algorithm%2C%20to%20deal%20with%20browser%20quirks%2E%0A%20%20%20%20%20%20if%20%28hasBadBidiRects%28cm%2Edisplay%2Emeasure%29%20%26%26%20%28order%20%3D%20getOrder%28line%29%29%29%0A%20%20%20%20%20%20%20%20builder%2EaddToken%20%3D%20buildTokenBadBidi%28builder%2EaddToken%2C%20order%29%3B%0A%20%20%20%20%20%20builder%2Emap%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20var%20allowFrontierUpdate%20%3D%20lineView%20%21%3D%20cm%2Edisplay%2EexternalMeasured%20%26%26%20lineNo%28line%29%3B%0A%20%20%20%20%20%20insertLineContent%28line%2C%20builder%2C%20getLineStyles%28cm%2C%20line%2C%20allowFrontierUpdate%29%29%3B%0A%20%20%20%20%20%20if%20%28line%2EstyleClasses%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28line%2EstyleClasses%2EbgClass%29%0A%20%20%20%20%20%20%20%20%20%20builder%2EbgClass%20%3D%20joinClasses%28line%2EstyleClasses%2EbgClass%2C%20builder%2EbgClass%20%7C%7C%20%22%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28line%2EstyleClasses%2EtextClass%29%0A%20%20%20%20%20%20%20%20%20%20builder%2EtextClass%20%3D%20joinClasses%28line%2EstyleClasses%2EtextClass%2C%20builder%2EtextClass%20%7C%7C%20%22%22%29%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20Ensure%20at%20least%20a%20single%20node%20is%20present%2C%20for%20measuring%2E%0A%20%20%20%20%20%20if%20%28builder%2Emap%2Elength%20%3D%3D%200%29%0A%20%20%20%20%20%20%20%20builder%2Emap%2Epush%280%2C%200%2C%20builder%2Econtent%2EappendChild%28zeroWidthElement%28cm%2Edisplay%2Emeasure%29%29%29%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Store%20the%20map%20and%20a%20cache%20object%20for%20the%20current%20logical%20line%0A%20%20%20%20%20%20if%20%28i%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20lineView%2Emeasure%2Emap%20%3D%20builder%2Emap%3B%0A%20%20%20%20%20%20%20%20lineView%2Emeasure%2Ecache%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%28lineView%2Emeasure%2Emaps%20%7C%7C%20%28lineView%2Emeasure%2Emaps%20%3D%20%5B%5D%29%29%2Epush%28builder%2Emap%29%3B%0A%20%20%20%20%20%20%20%20%28lineView%2Emeasure%2Ecaches%20%7C%7C%20%28lineView%2Emeasure%2Ecaches%20%3D%20%5B%5D%29%29%2Epush%28%7B%7D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20See%20issue%20%232901%0A%20%20%20%20if%20%28webkit%20%26%26%20%2F%5Cbcm%2Dtab%5Cb%2F%2Etest%28builder%2Econtent%2ElastChild%2EclassName%29%29%0A%20%20%20%20%20%20builder%2Econtent%2EclassName%20%3D%20%22cm%2Dtab%2Dwrap%2Dhack%22%3B%0A%0A%20%20%20%20signal%28cm%2C%20%22renderLine%22%2C%20cm%2C%20lineView%2Eline%2C%20builder%2Epre%29%3B%0A%20%20%20%20if%20%28builder%2Epre%2EclassName%29%0A%20%20%20%20%20%20builder%2EtextClass%20%3D%20joinClasses%28builder%2Epre%2EclassName%2C%20builder%2EtextClass%20%7C%7C%20%22%22%29%3B%0A%0A%20%20%20%20return%20builder%3B%0A%20%20%7D%0A%0A%20%20function%20defaultSpecialCharPlaceholder%28ch%29%20%7B%0A%20%20%20%20var%20token%20%3D%20elt%28%22span%22%2C%20%22%5Cu2022%22%2C%20%22cm%2Dinvalidchar%22%29%3B%0A%20%20%20%20token%2Etitle%20%3D%20%22%5C%5Cu%22%20%2B%20ch%2EcharCodeAt%280%29%2EtoString%2816%29%3B%0A%20%20%20%20token%2EsetAttribute%28%22aria%2Dlabel%22%2C%20token%2Etitle%29%3B%0A%20%20%20%20return%20token%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Build%20up%20the%20DOM%20representation%20for%20a%20single%20token%2C%20and%20add%20it%20to%0A%20%20%2F%2F%20the%20line%20map%2E%20Takes%20care%20to%20render%20special%20characters%20separately%2E%0A%20%20function%20buildToken%28builder%2C%20text%2C%20style%2C%20startStyle%2C%20endStyle%2C%20title%2C%20css%29%20%7B%0A%20%20%20%20if%20%28%21text%29%20return%3B%0A%20%20%20%20var%20displayText%20%3D%20builder%2EsplitSpaces%20%3F%20text%2Ereplace%28%2F%20%7B3%2C%7D%2Fg%2C%20splitSpaces%29%20%3A%20text%3B%0A%20%20%20%20var%20special%20%3D%20builder%2Ecm%2Estate%2EspecialChars%2C%20mustWrap%20%3D%20false%3B%0A%20%20%20%20if%20%28%21special%2Etest%28text%29%29%20%7B%0A%20%20%20%20%20%20builder%2Ecol%20%2B%3D%20text%2Elength%3B%0A%20%20%20%20%20%20var%20content%20%3D%20document%2EcreateTextNode%28displayText%29%3B%0A%20%20%20%20%20%20builder%2Emap%2Epush%28builder%2Epos%2C%20builder%2Epos%20%2B%20text%2Elength%2C%20content%29%3B%0A%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%209%29%20mustWrap%20%3D%20true%3B%0A%20%20%20%20%20%20builder%2Epos%20%2B%3D%20text%2Elength%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20var%20content%20%3D%20document%2EcreateDocumentFragment%28%29%2C%20pos%20%3D%200%3B%0A%20%20%20%20%20%20while%20%28true%29%20%7B%0A%20%20%20%20%20%20%20%20special%2ElastIndex%20%3D%20pos%3B%0A%20%20%20%20%20%20%20%20var%20m%20%3D%20special%2Eexec%28text%29%3B%0A%20%20%20%20%20%20%20%20var%20skipped%20%3D%20m%20%3F%20m%2Eindex%20%2D%20pos%20%3A%20text%2Elength%20%2D%20pos%3B%0A%20%20%20%20%20%20%20%20if%20%28skipped%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20txt%20%3D%20document%2EcreateTextNode%28displayText%2Eslice%28pos%2C%20pos%20%2B%20skipped%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%209%29%20content%2EappendChild%28elt%28%22span%22%2C%20%5Btxt%5D%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20else%20content%2EappendChild%28txt%29%3B%0A%20%20%20%20%20%20%20%20%20%20builder%2Emap%2Epush%28builder%2Epos%2C%20builder%2Epos%20%2B%20skipped%2C%20txt%29%3B%0A%20%20%20%20%20%20%20%20%20%20builder%2Ecol%20%2B%3D%20skipped%3B%0A%20%20%20%20%20%20%20%20%20%20builder%2Epos%20%2B%3D%20skipped%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28%21m%29%20break%3B%0A%20%20%20%20%20%20%20%20pos%20%2B%3D%20skipped%20%2B%201%3B%0A%20%20%20%20%20%20%20%20if%20%28m%5B0%5D%20%3D%3D%20%22%5Ct%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20tabSize%20%3D%20builder%2Ecm%2Eoptions%2EtabSize%2C%20tabWidth%20%3D%20tabSize%20%2D%20builder%2Ecol%20%25%20tabSize%3B%0A%20%20%20%20%20%20%20%20%20%20var%20txt%20%3D%20content%2EappendChild%28elt%28%22span%22%2C%20spaceStr%28tabWidth%29%2C%20%22cm%2Dtab%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20txt%2EsetAttribute%28%22role%22%2C%20%22presentation%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20txt%2EsetAttribute%28%22cm%2Dtext%22%2C%20%22%5Ct%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20builder%2Ecol%20%2B%3D%20tabWidth%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28m%5B0%5D%20%3D%3D%20%22%5Cr%22%20%7C%7C%20m%5B0%5D%20%3D%3D%20%22%5Cn%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20txt%20%3D%20content%2EappendChild%28elt%28%22span%22%2C%20m%5B0%5D%20%3D%3D%20%22%5Cr%22%20%3F%20%22%5Cu240d%22%20%3A%20%22%5Cu2424%22%2C%20%22cm%2Dinvalidchar%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20txt%2EsetAttribute%28%22cm%2Dtext%22%2C%20m%5B0%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%20builder%2Ecol%20%2B%3D%201%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20txt%20%3D%20builder%2Ecm%2Eoptions%2EspecialCharPlaceholder%28m%5B0%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%20txt%2EsetAttribute%28%22cm%2Dtext%22%2C%20m%5B0%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%209%29%20content%2EappendChild%28elt%28%22span%22%2C%20%5Btxt%5D%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20else%20content%2EappendChild%28txt%29%3B%0A%20%20%20%20%20%20%20%20%20%20builder%2Ecol%20%2B%3D%201%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20builder%2Emap%2Epush%28builder%2Epos%2C%20builder%2Epos%20%2B%201%2C%20txt%29%3B%0A%20%20%20%20%20%20%20%20builder%2Epos%2B%2B%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28style%20%7C%7C%20startStyle%20%7C%7C%20endStyle%20%7C%7C%20mustWrap%20%7C%7C%20css%29%20%7B%0A%20%20%20%20%20%20var%20fullStyle%20%3D%20style%20%7C%7C%20%22%22%3B%0A%20%20%20%20%20%20if%20%28startStyle%29%20fullStyle%20%2B%3D%20startStyle%3B%0A%20%20%20%20%20%20if%20%28endStyle%29%20fullStyle%20%2B%3D%20endStyle%3B%0A%20%20%20%20%20%20var%20token%20%3D%20elt%28%22span%22%2C%20%5Bcontent%5D%2C%20fullStyle%2C%20css%29%3B%0A%20%20%20%20%20%20if%20%28title%29%20token%2Etitle%20%3D%20title%3B%0A%20%20%20%20%20%20return%20builder%2Econtent%2EappendChild%28token%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20builder%2Econtent%2EappendChild%28content%29%3B%0A%20%20%7D%0A%0A%20%20function%20splitSpaces%28old%29%20%7B%0A%20%20%20%20var%20out%20%3D%20%22%20%22%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20old%2Elength%20%2D%202%3B%20%2B%2Bi%29%20out%20%2B%3D%20i%20%25%202%20%3F%20%22%20%22%20%3A%20%22%5Cu00a0%22%3B%0A%20%20%20%20out%20%2B%3D%20%22%20%22%3B%0A%20%20%20%20return%20out%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Work%20around%20nonsense%20dimensions%20being%20reported%20for%20stretches%20of%0A%20%20%2F%2F%20right%2Dto%2Dleft%20text%2E%0A%20%20function%20buildTokenBadBidi%28inner%2C%20order%29%20%7B%0A%20%20%20%20return%20function%28builder%2C%20text%2C%20style%2C%20startStyle%2C%20endStyle%2C%20title%2C%20css%29%20%7B%0A%20%20%20%20%20%20style%20%3D%20style%20%3F%20style%20%2B%20%22%20cm%2Dforce%2Dborder%22%20%3A%20%22cm%2Dforce%2Dborder%22%3B%0A%20%20%20%20%20%20var%20start%20%3D%20builder%2Epos%2C%20end%20%3D%20start%20%2B%20text%2Elength%3B%0A%20%20%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Find%20the%20part%20that%20overlaps%20with%20the%20start%20of%20this%20text%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20order%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20part%20%3D%20order%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28part%2Eto%20%3E%20start%20%26%26%20part%2Efrom%20%3C%3D%20start%29%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28part%2Eto%20%3E%3D%20end%29%20return%20inner%28builder%2C%20text%2C%20style%2C%20startStyle%2C%20endStyle%2C%20title%2C%20css%29%3B%0A%20%20%20%20%20%20%20%20inner%28builder%2C%20text%2Eslice%280%2C%20part%2Eto%20%2D%20start%29%2C%20style%2C%20startStyle%2C%20null%2C%20title%2C%20css%29%3B%0A%20%20%20%20%20%20%20%20startStyle%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20text%20%3D%20text%2Eslice%28part%2Eto%20%2D%20start%29%3B%0A%20%20%20%20%20%20%20%20start%20%3D%20part%2Eto%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20function%20buildCollapsedSpan%28builder%2C%20size%2C%20marker%2C%20ignoreWidget%29%20%7B%0A%20%20%20%20var%20widget%20%3D%20%21ignoreWidget%20%26%26%20marker%2EwidgetNode%3B%0A%20%20%20%20if%20%28widget%29%20builder%2Emap%2Epush%28builder%2Epos%2C%20builder%2Epos%20%2B%20size%2C%20widget%29%3B%0A%20%20%20%20if%20%28%21ignoreWidget%20%26%26%20builder%2Ecm%2Edisplay%2Einput%2EneedsContentAttribute%29%20%7B%0A%20%20%20%20%20%20if%20%28%21widget%29%0A%20%20%20%20%20%20%20%20widget%20%3D%20builder%2Econtent%2EappendChild%28document%2EcreateElement%28%22span%22%29%29%3B%0A%20%20%20%20%20%20widget%2EsetAttribute%28%22cm%2Dmarker%22%2C%20marker%2Eid%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28widget%29%20%7B%0A%20%20%20%20%20%20builder%2Ecm%2Edisplay%2Einput%2EsetUneditable%28widget%29%3B%0A%20%20%20%20%20%20builder%2Econtent%2EappendChild%28widget%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20builder%2Epos%20%2B%3D%20size%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Outputs%20a%20number%20of%20spans%20to%20make%20up%20a%20line%2C%20taking%20highlighting%0A%20%20%2F%2F%20and%20marked%20text%20into%20account%2E%0A%20%20function%20insertLineContent%28line%2C%20builder%2C%20styles%29%20%7B%0A%20%20%20%20var%20spans%20%3D%20line%2EmarkedSpans%2C%20allText%20%3D%20line%2Etext%2C%20at%20%3D%200%3B%0A%20%20%20%20if%20%28%21spans%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%201%3B%20i%20%3C%20styles%2Elength%3B%20i%2B%3D2%29%0A%20%20%20%20%20%20%20%20builder%2EaddToken%28builder%2C%20allText%2Eslice%28at%2C%20at%20%3D%20styles%5Bi%5D%29%2C%20interpretTokenStyle%28styles%5Bi%2B1%5D%2C%20builder%2Ecm%2Eoptions%29%29%3B%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20len%20%3D%20allText%2Elength%2C%20pos%20%3D%200%2C%20i%20%3D%201%2C%20text%20%3D%20%22%22%2C%20style%2C%20css%3B%0A%20%20%20%20var%20nextChange%20%3D%200%2C%20spanStyle%2C%20spanEndStyle%2C%20spanStartStyle%2C%20title%2C%20collapsed%3B%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20if%20%28nextChange%20%3D%3D%20pos%29%20%7B%20%2F%2F%20Update%20current%20marker%20set%0A%20%20%20%20%20%20%20%20spanStyle%20%3D%20spanEndStyle%20%3D%20spanStartStyle%20%3D%20title%20%3D%20css%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20collapsed%20%3D%20null%3B%20nextChange%20%3D%20Infinity%3B%0A%20%20%20%20%20%20%20%20var%20foundBookmarks%20%3D%20%5B%5D%2C%20endStyles%0A%20%20%20%20%20%20%20%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20spans%2Elength%3B%20%2B%2Bj%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20sp%20%3D%20spans%5Bj%5D%2C%20m%20%3D%20sp%2Emarker%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28m%2Etype%20%3D%3D%20%22bookmark%22%20%26%26%20sp%2Efrom%20%3D%3D%20pos%20%26%26%20m%2EwidgetNode%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20foundBookmarks%2Epush%28m%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20%28sp%2Efrom%20%3C%3D%20pos%20%26%26%20%28sp%2Eto%20%3D%3D%20null%20%7C%7C%20sp%2Eto%20%3E%20pos%20%7C%7C%20m%2Ecollapsed%20%26%26%20sp%2Eto%20%3D%3D%20pos%20%26%26%20sp%2Efrom%20%3D%3D%20pos%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28sp%2Eto%20%21%3D%20null%20%26%26%20sp%2Eto%20%21%3D%20pos%20%26%26%20nextChange%20%3E%20sp%2Eto%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20nextChange%20%3D%20sp%2Eto%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20spanEndStyle%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28m%2EclassName%29%20spanStyle%20%2B%3D%20%22%20%22%20%2B%20m%2EclassName%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28m%2Ecss%29%20css%20%3D%20%28css%20%3F%20css%20%2B%20%22%3B%22%20%3A%20%22%22%29%20%2B%20m%2Ecss%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28m%2EstartStyle%20%26%26%20sp%2Efrom%20%3D%3D%20pos%29%20spanStartStyle%20%2B%3D%20%22%20%22%20%2B%20m%2EstartStyle%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28m%2EendStyle%20%26%26%20sp%2Eto%20%3D%3D%20nextChange%29%20%28endStyles%20%7C%7C%20%28endStyles%20%3D%20%5B%5D%29%29%2Epush%28m%2EendStyle%2C%20sp%2Eto%29%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28m%2Etitle%20%26%26%20%21title%29%20title%20%3D%20m%2Etitle%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28m%2Ecollapsed%20%26%26%20%28%21collapsed%20%7C%7C%20compareCollapsedMarkers%28collapsed%2Emarker%2C%20m%29%20%3C%200%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20collapsed%20%3D%20sp%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20%28sp%2Efrom%20%3E%20pos%20%26%26%20nextChange%20%3E%20sp%2Efrom%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20nextChange%20%3D%20sp%2Efrom%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28endStyles%29%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20endStyles%2Elength%3B%20j%20%2B%3D%202%29%0A%20%20%20%20%20%20%20%20%20%20if%20%28endStyles%5Bj%20%2B%201%5D%20%3D%3D%20nextChange%29%20spanEndStyle%20%2B%3D%20%22%20%22%20%2B%20endStyles%5Bj%5D%0A%0A%20%20%20%20%20%20%20%20if%20%28%21collapsed%20%7C%7C%20collapsed%2Efrom%20%3D%3D%20pos%29%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20foundBookmarks%2Elength%3B%20%2B%2Bj%29%0A%20%20%20%20%20%20%20%20%20%20buildCollapsedSpan%28builder%2C%200%2C%20foundBookmarks%5Bj%5D%29%3B%0A%20%20%20%20%20%20%20%20if%20%28collapsed%20%26%26%20%28collapsed%2Efrom%20%7C%7C%200%29%20%3D%3D%20pos%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20buildCollapsedSpan%28builder%2C%20%28collapsed%2Eto%20%3D%3D%20null%20%3F%20len%20%2B%201%20%3A%20collapsed%2Eto%29%20%2D%20pos%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20collapsed%2Emarker%2C%20collapsed%2Efrom%20%3D%3D%20null%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28collapsed%2Eto%20%3D%3D%20null%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28collapsed%2Eto%20%3D%3D%20pos%29%20collapsed%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28pos%20%3E%3D%20len%29%20break%3B%0A%0A%20%20%20%20%20%20var%20upto%20%3D%20Math%2Emin%28len%2C%20nextChange%29%3B%0A%20%20%20%20%20%20while%20%28true%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28text%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20end%20%3D%20pos%20%2B%20text%2Elength%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21collapsed%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20tokenText%20%3D%20end%20%3E%20upto%20%3F%20text%2Eslice%280%2C%20upto%20%2D%20pos%29%20%3A%20text%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20builder%2EaddToken%28builder%2C%20tokenText%2C%20style%20%3F%20style%20%2B%20spanStyle%20%3A%20spanStyle%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20spanStartStyle%2C%20pos%20%2B%20tokenText%2Elength%20%3D%3D%20nextChange%20%3F%20spanEndStyle%20%3A%20%22%22%2C%20title%2C%20css%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28end%20%3E%3D%20upto%29%20%7Btext%20%3D%20text%2Eslice%28upto%20%2D%20pos%29%3B%20pos%20%3D%20upto%3B%20break%3B%7D%0A%20%20%20%20%20%20%20%20%20%20pos%20%3D%20end%3B%0A%20%20%20%20%20%20%20%20%20%20spanStartStyle%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20text%20%3D%20allText%2Eslice%28at%2C%20at%20%3D%20styles%5Bi%2B%2B%5D%29%3B%0A%20%20%20%20%20%20%20%20style%20%3D%20interpretTokenStyle%28styles%5Bi%2B%2B%5D%2C%20builder%2Ecm%2Eoptions%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20DOCUMENT%20DATA%20STRUCTURE%0A%0A%20%20%2F%2F%20By%20default%2C%20updates%20that%20start%20and%20end%20at%20the%20beginning%20of%20a%20line%0A%20%20%2F%2F%20are%20treated%20specially%2C%20in%20order%20to%20make%20the%20association%20of%20line%0A%20%20%2F%2F%20widgets%20and%20marker%20elements%20with%20the%20text%20behave%20more%20intuitive%2E%0A%20%20function%20isWholeLineUpdate%28doc%2C%20change%29%20%7B%0A%20%20%20%20return%20change%2Efrom%2Ech%20%3D%3D%200%20%26%26%20change%2Eto%2Ech%20%3D%3D%200%20%26%26%20lst%28change%2Etext%29%20%3D%3D%20%22%22%20%26%26%0A%20%20%20%20%20%20%28%21doc%2Ecm%20%7C%7C%20doc%2Ecm%2Eoptions%2EwholeLineUpdateBefore%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Perform%20a%20change%20on%20the%20document%20data%20structure%2E%0A%20%20function%20updateDoc%28doc%2C%20change%2C%20markedSpans%2C%20estimateHeight%29%20%7B%0A%20%20%20%20function%20spansFor%28n%29%20%7Breturn%20markedSpans%20%3F%20markedSpans%5Bn%5D%20%3A%20null%3B%7D%0A%20%20%20%20function%20update%28line%2C%20text%2C%20spans%29%20%7B%0A%20%20%20%20%20%20updateLine%28line%2C%20text%2C%20spans%2C%20estimateHeight%29%3B%0A%20%20%20%20%20%20signalLater%28line%2C%20%22change%22%2C%20line%2C%20change%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20function%20linesFor%28start%2C%20end%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%20start%2C%20result%20%3D%20%5B%5D%3B%20i%20%3C%20end%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20%20%20result%2Epush%28new%20Line%28text%5Bi%5D%2C%20spansFor%28i%29%2C%20estimateHeight%29%29%3B%0A%20%20%20%20%20%20return%20result%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20from%20%3D%20change%2Efrom%2C%20to%20%3D%20change%2Eto%2C%20text%20%3D%20change%2Etext%3B%0A%20%20%20%20var%20firstLine%20%3D%20getLine%28doc%2C%20from%2Eline%29%2C%20lastLine%20%3D%20getLine%28doc%2C%20to%2Eline%29%3B%0A%20%20%20%20var%20lastText%20%3D%20lst%28text%29%2C%20lastSpans%20%3D%20spansFor%28text%2Elength%20%2D%201%29%2C%20nlines%20%3D%20to%2Eline%20%2D%20from%2Eline%3B%0A%0A%20%20%20%20%2F%2F%20Adjust%20the%20line%20structure%0A%20%20%20%20if%20%28change%2Efull%29%20%7B%0A%20%20%20%20%20%20doc%2Einsert%280%2C%20linesFor%280%2C%20text%2Elength%29%29%3B%0A%20%20%20%20%20%20doc%2Eremove%28text%2Elength%2C%20doc%2Esize%20%2D%20text%2Elength%29%3B%0A%20%20%20%20%7D%20else%20if%20%28isWholeLineUpdate%28doc%2C%20change%29%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20This%20is%20a%20whole%2Dline%20replace%2E%20Treated%20specially%20to%20make%0A%20%20%20%20%20%20%2F%2F%20sure%20line%20objects%20move%20the%20way%20they%20are%20supposed%20to%2E%0A%20%20%20%20%20%20var%20added%20%3D%20linesFor%280%2C%20text%2Elength%20%2D%201%29%3B%0A%20%20%20%20%20%20update%28lastLine%2C%20lastLine%2Etext%2C%20lastSpans%29%3B%0A%20%20%20%20%20%20if%20%28nlines%29%20doc%2Eremove%28from%2Eline%2C%20nlines%29%3B%0A%20%20%20%20%20%20if%20%28added%2Elength%29%20doc%2Einsert%28from%2Eline%2C%20added%29%3B%0A%20%20%20%20%7D%20else%20if%20%28firstLine%20%3D%3D%20lastLine%29%20%7B%0A%20%20%20%20%20%20if%20%28text%2Elength%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20%20%20update%28firstLine%2C%20firstLine%2Etext%2Eslice%280%2C%20from%2Ech%29%20%2B%20lastText%20%2B%20firstLine%2Etext%2Eslice%28to%2Ech%29%2C%20lastSpans%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20var%20added%20%3D%20linesFor%281%2C%20text%2Elength%20%2D%201%29%3B%0A%20%20%20%20%20%20%20%20added%2Epush%28new%20Line%28lastText%20%2B%20firstLine%2Etext%2Eslice%28to%2Ech%29%2C%20lastSpans%2C%20estimateHeight%29%29%3B%0A%20%20%20%20%20%20%20%20update%28firstLine%2C%20firstLine%2Etext%2Eslice%280%2C%20from%2Ech%29%20%2B%20text%5B0%5D%2C%20spansFor%280%29%29%3B%0A%20%20%20%20%20%20%20%20doc%2Einsert%28from%2Eline%20%2B%201%2C%20added%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20if%20%28text%2Elength%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20update%28firstLine%2C%20firstLine%2Etext%2Eslice%280%2C%20from%2Ech%29%20%2B%20text%5B0%5D%20%2B%20lastLine%2Etext%2Eslice%28to%2Ech%29%2C%20spansFor%280%29%29%3B%0A%20%20%20%20%20%20doc%2Eremove%28from%2Eline%20%2B%201%2C%20nlines%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20update%28firstLine%2C%20firstLine%2Etext%2Eslice%280%2C%20from%2Ech%29%20%2B%20text%5B0%5D%2C%20spansFor%280%29%29%3B%0A%20%20%20%20%20%20update%28lastLine%2C%20lastText%20%2B%20lastLine%2Etext%2Eslice%28to%2Ech%29%2C%20lastSpans%29%3B%0A%20%20%20%20%20%20var%20added%20%3D%20linesFor%281%2C%20text%2Elength%20%2D%201%29%3B%0A%20%20%20%20%20%20if%20%28nlines%20%3E%201%29%20doc%2Eremove%28from%2Eline%20%2B%201%2C%20nlines%20%2D%201%29%3B%0A%20%20%20%20%20%20doc%2Einsert%28from%2Eline%20%2B%201%2C%20added%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20signalLater%28doc%2C%20%22change%22%2C%20doc%2C%20change%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20The%20document%20is%20represented%20as%20a%20BTree%20consisting%20of%20leaves%2C%20with%0A%20%20%2F%2F%20chunk%20of%20lines%20in%20them%2C%20and%20branches%2C%20with%20up%20to%20ten%20leaves%20or%0A%20%20%2F%2F%20other%20branch%20nodes%20below%20them%2E%20The%20top%20node%20is%20always%20a%20branch%0A%20%20%2F%2F%20node%2C%20and%20is%20the%20document%20object%20itself%20%28meaning%20it%20has%0A%20%20%2F%2F%20additional%20methods%20and%20properties%29%2E%0A%20%20%2F%2F%0A%20%20%2F%2F%20All%20nodes%20have%20parent%20links%2E%20The%20tree%20is%20used%20both%20to%20go%20from%0A%20%20%2F%2F%20line%20numbers%20to%20line%20objects%2C%20and%20to%20go%20from%20objects%20to%20numbers%2E%0A%20%20%2F%2F%20It%20also%20indexes%20by%20height%2C%20and%20is%20used%20to%20convert%20between%20height%0A%20%20%2F%2F%20and%20line%20object%2C%20and%20to%20find%20the%20total%20height%20of%20the%20document%2E%0A%20%20%2F%2F%0A%20%20%2F%2F%20See%20also%20http%3A%2F%2Fmarijnhaverbeke%2Enl%2Fblog%2Fcodemirror%2Dline%2Dtree%2Ehtml%0A%0A%20%20function%20LeafChunk%28lines%29%20%7B%0A%20%20%20%20this%2Elines%20%3D%20lines%3B%0A%20%20%20%20this%2Eparent%20%3D%20null%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%2C%20height%20%3D%200%3B%20i%20%3C%20lines%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20lines%5Bi%5D%2Eparent%20%3D%20this%3B%0A%20%20%20%20%20%20height%20%2B%3D%20lines%5Bi%5D%2Eheight%3B%0A%20%20%20%20%7D%0A%20%20%20%20this%2Eheight%20%3D%20height%3B%0A%20%20%7D%0A%0A%20%20LeafChunk%2Eprototype%20%3D%20%7B%0A%20%20%20%20chunkSize%3A%20function%28%29%20%7B%20return%20this%2Elines%2Elength%3B%20%7D%2C%0A%20%20%20%20%2F%2F%20Remove%20the%20n%20lines%20at%20offset%20%27at%27%2E%0A%20%20%20%20removeInner%3A%20function%28at%2C%20n%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%20at%2C%20e%20%3D%20at%20%2B%20n%3B%20i%20%3C%20e%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20line%20%3D%20this%2Elines%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20this%2Eheight%20%2D%3D%20line%2Eheight%3B%0A%20%20%20%20%20%20%20%20cleanUpLine%28line%29%3B%0A%20%20%20%20%20%20%20%20signalLater%28line%2C%20%22delete%22%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20this%2Elines%2Esplice%28at%2C%20n%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20%2F%2F%20Helper%20used%20to%20collapse%20a%20small%20branch%20into%20a%20single%20leaf%2E%0A%20%20%20%20collapse%3A%20function%28lines%29%20%7B%0A%20%20%20%20%20%20lines%2Epush%2Eapply%28lines%2C%20this%2Elines%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20%2F%2F%20Insert%20the%20given%20array%20of%20lines%20at%20offset%20%27at%27%2C%20count%20them%20as%0A%20%20%20%20%2F%2F%20having%20the%20given%20height%2E%0A%20%20%20%20insertInner%3A%20function%28at%2C%20lines%2C%20height%29%20%7B%0A%20%20%20%20%20%20this%2Eheight%20%2B%3D%20height%3B%0A%20%20%20%20%20%20this%2Elines%20%3D%20this%2Elines%2Eslice%280%2C%20at%29%2Econcat%28lines%29%2Econcat%28this%2Elines%2Eslice%28at%29%29%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20lines%2Elength%3B%20%2B%2Bi%29%20lines%5Bi%5D%2Eparent%20%3D%20this%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20%2F%2F%20Used%20to%20iterate%20over%20a%20part%20of%20the%20tree%2E%0A%20%20%20%20iterN%3A%20function%28at%2C%20n%2C%20op%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20e%20%3D%20at%20%2B%20n%3B%20at%20%3C%20e%3B%20%2B%2Bat%29%0A%20%20%20%20%20%20%20%20if%20%28op%28this%2Elines%5Bat%5D%29%29%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20function%20BranchChunk%28children%29%20%7B%0A%20%20%20%20this%2Echildren%20%3D%20children%3B%0A%20%20%20%20var%20size%20%3D%200%2C%20height%20%3D%200%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20children%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20ch%20%3D%20children%5Bi%5D%3B%0A%20%20%20%20%20%20size%20%2B%3D%20ch%2EchunkSize%28%29%3B%20height%20%2B%3D%20ch%2Eheight%3B%0A%20%20%20%20%20%20ch%2Eparent%20%3D%20this%3B%0A%20%20%20%20%7D%0A%20%20%20%20this%2Esize%20%3D%20size%3B%0A%20%20%20%20this%2Eheight%20%3D%20height%3B%0A%20%20%20%20this%2Eparent%20%3D%20null%3B%0A%20%20%7D%0A%0A%20%20BranchChunk%2Eprototype%20%3D%20%7B%0A%20%20%20%20chunkSize%3A%20function%28%29%20%7B%20return%20this%2Esize%3B%20%7D%2C%0A%20%20%20%20removeInner%3A%20function%28at%2C%20n%29%20%7B%0A%20%20%20%20%20%20this%2Esize%20%2D%3D%20n%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Echildren%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20child%20%3D%20this%2Echildren%5Bi%5D%2C%20sz%20%3D%20child%2EchunkSize%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28at%20%3C%20sz%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20rm%20%3D%20Math%2Emin%28n%2C%20sz%20%2D%20at%29%2C%20oldHeight%20%3D%20child%2Eheight%3B%0A%20%20%20%20%20%20%20%20%20%20child%2EremoveInner%28at%2C%20rm%29%3B%0A%20%20%20%20%20%20%20%20%20%20this%2Eheight%20%2D%3D%20oldHeight%20%2D%20child%2Eheight%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28sz%20%3D%3D%20rm%29%20%7B%20this%2Echildren%2Esplice%28i%2D%2D%2C%201%29%3B%20child%2Eparent%20%3D%20null%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28%28n%20%2D%3D%20rm%29%20%3D%3D%200%29%20break%3B%0A%20%20%20%20%20%20%20%20%20%20at%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20at%20%2D%3D%20sz%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F%2F%20If%20the%20result%20is%20smaller%20than%2025%20lines%2C%20ensure%20that%20it%20is%20a%0A%20%20%20%20%20%20%2F%2F%20single%20leaf%20node%2E%0A%20%20%20%20%20%20if%20%28this%2Esize%20%2D%20n%20%3C%2025%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%28this%2Echildren%2Elength%20%3E%201%20%7C%7C%20%21%28this%2Echildren%5B0%5D%20instanceof%20LeafChunk%29%29%29%20%7B%0A%20%20%20%20%20%20%20%20var%20lines%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20this%2Ecollapse%28lines%29%3B%0A%20%20%20%20%20%20%20%20this%2Echildren%20%3D%20%5Bnew%20LeafChunk%28lines%29%5D%3B%0A%20%20%20%20%20%20%20%20this%2Echildren%5B0%5D%2Eparent%20%3D%20this%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%20%20%20%20collapse%3A%20function%28lines%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Echildren%2Elength%3B%20%2B%2Bi%29%20this%2Echildren%5Bi%5D%2Ecollapse%28lines%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20insertInner%3A%20function%28at%2C%20lines%2C%20height%29%20%7B%0A%20%20%20%20%20%20this%2Esize%20%2B%3D%20lines%2Elength%3B%0A%20%20%20%20%20%20this%2Eheight%20%2B%3D%20height%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Echildren%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20child%20%3D%20this%2Echildren%5Bi%5D%2C%20sz%20%3D%20child%2EchunkSize%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28at%20%3C%3D%20sz%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20child%2EinsertInner%28at%2C%20lines%2C%20height%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28child%2Elines%20%26%26%20child%2Elines%2Elength%20%3E%2050%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20while%20%28child%2Elines%2Elength%20%3E%2050%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20spilled%20%3D%20child%2Elines%2Esplice%28child%2Elines%2Elength%20%2D%2025%2C%2025%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20newleaf%20%3D%20new%20LeafChunk%28spilled%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20child%2Eheight%20%2D%3D%20newleaf%2Eheight%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this%2Echildren%2Esplice%28i%20%2B%201%2C%200%2C%20newleaf%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20newleaf%2Eparent%20%3D%20this%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20this%2EmaybeSpill%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20at%20%2D%3D%20sz%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%20%20%20%20%2F%2F%20When%20a%20node%20has%20grown%2C%20check%20whether%20it%20should%20be%20split%2E%0A%20%20%20%20maybeSpill%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28this%2Echildren%2Elength%20%3C%3D%2010%29%20return%3B%0A%20%20%20%20%20%20var%20me%20%3D%20this%3B%0A%20%20%20%20%20%20do%20%7B%0A%20%20%20%20%20%20%20%20var%20spilled%20%3D%20me%2Echildren%2Esplice%28me%2Echildren%2Elength%20%2D%205%2C%205%29%3B%0A%20%20%20%20%20%20%20%20var%20sibling%20%3D%20new%20BranchChunk%28spilled%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21me%2Eparent%29%20%7B%20%2F%2F%20Become%20the%20parent%20node%0A%20%20%20%20%20%20%20%20%20%20var%20copy%20%3D%20new%20BranchChunk%28me%2Echildren%29%3B%0A%20%20%20%20%20%20%20%20%20%20copy%2Eparent%20%3D%20me%3B%0A%20%20%20%20%20%20%20%20%20%20me%2Echildren%20%3D%20%5Bcopy%2C%20sibling%5D%3B%0A%20%20%20%20%20%20%20%20%20%20me%20%3D%20copy%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20me%2Esize%20%2D%3D%20sibling%2Esize%3B%0A%20%20%20%20%20%20%20%20%20%20me%2Eheight%20%2D%3D%20sibling%2Eheight%3B%0A%20%20%20%20%20%20%20%20%20%20var%20myIndex%20%3D%20indexOf%28me%2Eparent%2Echildren%2C%20me%29%3B%0A%20%20%20%20%20%20%20%20%20%20me%2Eparent%2Echildren%2Esplice%28myIndex%20%2B%201%2C%200%2C%20sibling%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20sibling%2Eparent%20%3D%20me%2Eparent%3B%0A%20%20%20%20%20%20%7D%20while%20%28me%2Echildren%2Elength%20%3E%2010%29%3B%0A%20%20%20%20%20%20me%2Eparent%2EmaybeSpill%28%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20iterN%3A%20function%28at%2C%20n%2C%20op%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Echildren%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20child%20%3D%20this%2Echildren%5Bi%5D%2C%20sz%20%3D%20child%2EchunkSize%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28at%20%3C%20sz%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20used%20%3D%20Math%2Emin%28n%2C%20sz%20%2D%20at%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28child%2EiterN%28at%2C%20used%2C%20op%29%29%20return%20true%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%28n%20%2D%3D%20used%29%20%3D%3D%200%29%20break%3B%0A%20%20%20%20%20%20%20%20%20%20at%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20at%20%2D%3D%20sz%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20var%20nextDocId%20%3D%200%3B%0A%20%20var%20Doc%20%3D%20CodeMirror%2EDoc%20%3D%20function%28text%2C%20mode%2C%20firstLine%2C%20lineSep%29%20%7B%0A%20%20%20%20if%20%28%21%28this%20instanceof%20Doc%29%29%20return%20new%20Doc%28text%2C%20mode%2C%20firstLine%2C%20lineSep%29%3B%0A%20%20%20%20if%20%28firstLine%20%3D%3D%20null%29%20firstLine%20%3D%200%3B%0A%0A%20%20%20%20BranchChunk%2Ecall%28this%2C%20%5Bnew%20LeafChunk%28%5Bnew%20Line%28%22%22%2C%20null%29%5D%29%5D%29%3B%0A%20%20%20%20this%2Efirst%20%3D%20firstLine%3B%0A%20%20%20%20this%2EscrollTop%20%3D%20this%2EscrollLeft%20%3D%200%3B%0A%20%20%20%20this%2EcantEdit%20%3D%20false%3B%0A%20%20%20%20this%2EcleanGeneration%20%3D%201%3B%0A%20%20%20%20this%2Efrontier%20%3D%20firstLine%3B%0A%20%20%20%20var%20start%20%3D%20Pos%28firstLine%2C%200%29%3B%0A%20%20%20%20this%2Esel%20%3D%20simpleSelection%28start%29%3B%0A%20%20%20%20this%2Ehistory%20%3D%20new%20History%28null%29%3B%0A%20%20%20%20this%2Eid%20%3D%20%2B%2BnextDocId%3B%0A%20%20%20%20this%2EmodeOption%20%3D%20mode%3B%0A%20%20%20%20this%2ElineSep%20%3D%20lineSep%3B%0A%20%20%20%20this%2Eextend%20%3D%20false%3B%0A%0A%20%20%20%20if%20%28typeof%20text%20%3D%3D%20%22string%22%29%20text%20%3D%20this%2EsplitLines%28text%29%3B%0A%20%20%20%20updateDoc%28this%2C%20%7Bfrom%3A%20start%2C%20to%3A%20start%2C%20text%3A%20text%7D%29%3B%0A%20%20%20%20setSelection%28this%2C%20simpleSelection%28start%29%2C%20sel%5FdontScroll%29%3B%0A%20%20%7D%3B%0A%0A%20%20Doc%2Eprototype%20%3D%20createObj%28BranchChunk%2Eprototype%2C%20%7B%0A%20%20%20%20constructor%3A%20Doc%2C%0A%20%20%20%20%2F%2F%20Iterate%20over%20the%20document%2E%20Supports%20two%20forms%20%2D%2D%20with%20only%20one%0A%20%20%20%20%2F%2F%20argument%2C%20it%20calls%20that%20for%20each%20line%20in%20the%20document%2E%20With%0A%20%20%20%20%2F%2F%20three%2C%20it%20iterates%20over%20the%20range%20given%20by%20the%20first%20two%20%28with%0A%20%20%20%20%2F%2F%20the%20second%20being%20non%2Dinclusive%29%2E%0A%20%20%20%20iter%3A%20function%28from%2C%20to%2C%20op%29%20%7B%0A%20%20%20%20%20%20if%20%28op%29%20this%2EiterN%28from%20%2D%20this%2Efirst%2C%20to%20%2D%20from%2C%20op%29%3B%0A%20%20%20%20%20%20else%20this%2EiterN%28this%2Efirst%2C%20this%2Efirst%20%2B%20this%2Esize%2C%20from%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20%2F%2F%20Non%2Dpublic%20interface%20for%20adding%20and%20removing%20lines%2E%0A%20%20%20%20insert%3A%20function%28at%2C%20lines%29%20%7B%0A%20%20%20%20%20%20var%20height%20%3D%200%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20lines%2Elength%3B%20%2B%2Bi%29%20height%20%2B%3D%20lines%5Bi%5D%2Eheight%3B%0A%20%20%20%20%20%20this%2EinsertInner%28at%20%2D%20this%2Efirst%2C%20lines%2C%20height%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20remove%3A%20function%28at%2C%20n%29%20%7B%20this%2EremoveInner%28at%20%2D%20this%2Efirst%2C%20n%29%3B%20%7D%2C%0A%0A%20%20%20%20%2F%2F%20From%20here%2C%20the%20methods%20are%20part%20of%20the%20public%20interface%2E%20Most%0A%20%20%20%20%2F%2F%20are%20also%20available%20from%20CodeMirror%20%28editor%29%20instances%2E%0A%0A%20%20%20%20getValue%3A%20function%28lineSep%29%20%7B%0A%20%20%20%20%20%20var%20lines%20%3D%20getLines%28this%2C%20this%2Efirst%2C%20this%2Efirst%20%2B%20this%2Esize%29%3B%0A%20%20%20%20%20%20if%20%28lineSep%20%3D%3D%3D%20false%29%20return%20lines%3B%0A%20%20%20%20%20%20return%20lines%2Ejoin%28lineSep%20%7C%7C%20this%2ElineSeparator%28%29%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20setValue%3A%20docMethodOp%28function%28code%29%20%7B%0A%20%20%20%20%20%20var%20top%20%3D%20Pos%28this%2Efirst%2C%200%29%2C%20last%20%3D%20this%2Efirst%20%2B%20this%2Esize%20%2D%201%3B%0A%20%20%20%20%20%20makeChange%28this%2C%20%7Bfrom%3A%20top%2C%20to%3A%20Pos%28last%2C%20getLine%28this%2C%20last%29%2Etext%2Elength%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20this%2EsplitLines%28code%29%2C%20origin%3A%20%22setValue%22%2C%20full%3A%20true%7D%2C%20true%29%3B%0A%20%20%20%20%20%20setSelection%28this%2C%20simpleSelection%28top%29%29%3B%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20replaceRange%3A%20function%28code%2C%20from%2C%20to%2C%20origin%29%20%7B%0A%20%20%20%20%20%20from%20%3D%20clipPos%28this%2C%20from%29%3B%0A%20%20%20%20%20%20to%20%3D%20to%20%3F%20clipPos%28this%2C%20to%29%20%3A%20from%3B%0A%20%20%20%20%20%20replaceRange%28this%2C%20code%2C%20from%2C%20to%2C%20origin%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20getRange%3A%20function%28from%2C%20to%2C%20lineSep%29%20%7B%0A%20%20%20%20%20%20var%20lines%20%3D%20getBetween%28this%2C%20clipPos%28this%2C%20from%29%2C%20clipPos%28this%2C%20to%29%29%3B%0A%20%20%20%20%20%20if%20%28lineSep%20%3D%3D%3D%20false%29%20return%20lines%3B%0A%20%20%20%20%20%20return%20lines%2Ejoin%28lineSep%20%7C%7C%20this%2ElineSeparator%28%29%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20getLine%3A%20function%28line%29%20%7Bvar%20l%20%3D%20this%2EgetLineHandle%28line%29%3B%20return%20l%20%26%26%20l%2Etext%3B%7D%2C%0A%0A%20%20%20%20getLineHandle%3A%20function%28line%29%20%7Bif%20%28isLine%28this%2C%20line%29%29%20return%20getLine%28this%2C%20line%29%3B%7D%2C%0A%20%20%20%20getLineNumber%3A%20function%28line%29%20%7Breturn%20lineNo%28line%29%3B%7D%2C%0A%0A%20%20%20%20getLineHandleVisualStart%3A%20function%28line%29%20%7B%0A%20%20%20%20%20%20if%20%28typeof%20line%20%3D%3D%20%22number%22%29%20line%20%3D%20getLine%28this%2C%20line%29%3B%0A%20%20%20%20%20%20return%20visualLine%28line%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20lineCount%3A%20function%28%29%20%7Breturn%20this%2Esize%3B%7D%2C%0A%20%20%20%20firstLine%3A%20function%28%29%20%7Breturn%20this%2Efirst%3B%7D%2C%0A%20%20%20%20lastLine%3A%20function%28%29%20%7Breturn%20this%2Efirst%20%2B%20this%2Esize%20%2D%201%3B%7D%2C%0A%0A%20%20%20%20clipPos%3A%20function%28pos%29%20%7Breturn%20clipPos%28this%2C%20pos%29%3B%7D%2C%0A%0A%20%20%20%20getCursor%3A%20function%28start%29%20%7B%0A%20%20%20%20%20%20var%20range%20%3D%20this%2Esel%2Eprimary%28%29%2C%20pos%3B%0A%20%20%20%20%20%20if%20%28start%20%3D%3D%20null%20%7C%7C%20start%20%3D%3D%20%22head%22%29%20pos%20%3D%20range%2Ehead%3B%0A%20%20%20%20%20%20else%20if%20%28start%20%3D%3D%20%22anchor%22%29%20pos%20%3D%20range%2Eanchor%3B%0A%20%20%20%20%20%20else%20if%20%28start%20%3D%3D%20%22end%22%20%7C%7C%20start%20%3D%3D%20%22to%22%20%7C%7C%20start%20%3D%3D%3D%20false%29%20pos%20%3D%20range%2Eto%28%29%3B%0A%20%20%20%20%20%20else%20pos%20%3D%20range%2Efrom%28%29%3B%0A%20%20%20%20%20%20return%20pos%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20listSelections%3A%20function%28%29%20%7B%20return%20this%2Esel%2Eranges%3B%20%7D%2C%0A%20%20%20%20somethingSelected%3A%20function%28%29%20%7Breturn%20this%2Esel%2EsomethingSelected%28%29%3B%7D%2C%0A%0A%20%20%20%20setCursor%3A%20docMethodOp%28function%28line%2C%20ch%2C%20options%29%20%7B%0A%20%20%20%20%20%20setSimpleSelection%28this%2C%20clipPos%28this%2C%20typeof%20line%20%3D%3D%20%22number%22%20%3F%20Pos%28line%2C%20ch%20%7C%7C%200%29%20%3A%20line%29%2C%20null%2C%20options%29%3B%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20setSelection%3A%20docMethodOp%28function%28anchor%2C%20head%2C%20options%29%20%7B%0A%20%20%20%20%20%20setSimpleSelection%28this%2C%20clipPos%28this%2C%20anchor%29%2C%20clipPos%28this%2C%20head%20%7C%7C%20anchor%29%2C%20options%29%3B%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20extendSelection%3A%20docMethodOp%28function%28head%2C%20other%2C%20options%29%20%7B%0A%20%20%20%20%20%20extendSelection%28this%2C%20clipPos%28this%2C%20head%29%2C%20other%20%26%26%20clipPos%28this%2C%20other%29%2C%20options%29%3B%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20extendSelections%3A%20docMethodOp%28function%28heads%2C%20options%29%20%7B%0A%20%20%20%20%20%20extendSelections%28this%2C%20clipPosArray%28this%2C%20heads%29%2C%20options%29%3B%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20extendSelectionsBy%3A%20docMethodOp%28function%28f%2C%20options%29%20%7B%0A%20%20%20%20%20%20var%20heads%20%3D%20map%28this%2Esel%2Eranges%2C%20f%29%3B%0A%20%20%20%20%20%20extendSelections%28this%2C%20clipPosArray%28this%2C%20heads%29%2C%20options%29%3B%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20setSelections%3A%20docMethodOp%28function%28ranges%2C%20primary%2C%20options%29%20%7B%0A%20%20%20%20%20%20if%20%28%21ranges%2Elength%29%20return%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%2C%20out%20%3D%20%5B%5D%3B%20i%20%3C%20ranges%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20out%5Bi%5D%20%3D%20new%20Range%28clipPos%28this%2C%20ranges%5Bi%5D%2Eanchor%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20clipPos%28this%2C%20ranges%5Bi%5D%2Ehead%29%29%3B%0A%20%20%20%20%20%20if%20%28primary%20%3D%3D%20null%29%20primary%20%3D%20Math%2Emin%28ranges%2Elength%20%2D%201%2C%20this%2Esel%2EprimIndex%29%3B%0A%20%20%20%20%20%20setSelection%28this%2C%20normalizeSelection%28out%2C%20primary%29%2C%20options%29%3B%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20addSelection%3A%20docMethodOp%28function%28anchor%2C%20head%2C%20options%29%20%7B%0A%20%20%20%20%20%20var%20ranges%20%3D%20this%2Esel%2Eranges%2Eslice%280%29%3B%0A%20%20%20%20%20%20ranges%2Epush%28new%20Range%28clipPos%28this%2C%20anchor%29%2C%20clipPos%28this%2C%20head%20%7C%7C%20anchor%29%29%29%3B%0A%20%20%20%20%20%20setSelection%28this%2C%20normalizeSelection%28ranges%2C%20ranges%2Elength%20%2D%201%29%2C%20options%29%3B%0A%20%20%20%20%7D%29%2C%0A%0A%20%20%20%20getSelection%3A%20function%28lineSep%29%20%7B%0A%20%20%20%20%20%20var%20ranges%20%3D%20this%2Esel%2Eranges%2C%20lines%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20sel%20%3D%20getBetween%28this%2C%20ranges%5Bi%5D%2Efrom%28%29%2C%20ranges%5Bi%5D%2Eto%28%29%29%3B%0A%20%20%20%20%20%20%20%20lines%20%3D%20lines%20%3F%20lines%2Econcat%28sel%29%20%3A%20sel%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28lineSep%20%3D%3D%3D%20false%29%20return%20lines%3B%0A%20%20%20%20%20%20else%20return%20lines%2Ejoin%28lineSep%20%7C%7C%20this%2ElineSeparator%28%29%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20getSelections%3A%20function%28lineSep%29%20%7B%0A%20%20%20%20%20%20var%20parts%20%3D%20%5B%5D%2C%20ranges%20%3D%20this%2Esel%2Eranges%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20ranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20sel%20%3D%20getBetween%28this%2C%20ranges%5Bi%5D%2Efrom%28%29%2C%20ranges%5Bi%5D%2Eto%28%29%29%3B%0A%20%20%20%20%20%20%20%20if%20%28lineSep%20%21%3D%3D%20false%29%20sel%20%3D%20sel%2Ejoin%28lineSep%20%7C%7C%20this%2ElineSeparator%28%29%29%3B%0A%20%20%20%20%20%20%20%20parts%5Bi%5D%20%3D%20sel%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20parts%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20replaceSelection%3A%20function%28code%2C%20collapse%2C%20origin%29%20%7B%0A%20%20%20%20%20%20var%20dup%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Esel%2Eranges%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20dup%5Bi%5D%20%3D%20code%3B%0A%20%20%20%20%20%20this%2EreplaceSelections%28dup%2C%20collapse%2C%20origin%20%7C%7C%20%22%2Binput%22%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20replaceSelections%3A%20docMethodOp%28function%28code%2C%20collapse%2C%20origin%29%20%7B%0A%20%20%20%20%20%20var%20changes%20%3D%20%5B%5D%2C%20sel%20%3D%20this%2Esel%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20sel%2Eranges%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20range%20%3D%20sel%2Eranges%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20changes%5Bi%5D%20%3D%20%7Bfrom%3A%20range%2Efrom%28%29%2C%20to%3A%20range%2Eto%28%29%2C%20text%3A%20this%2EsplitLines%28code%5Bi%5D%29%2C%20origin%3A%20origin%7D%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20newSel%20%3D%20collapse%20%26%26%20collapse%20%21%3D%20%22end%22%20%26%26%20computeReplacedSel%28this%2C%20changes%2C%20collapse%29%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%20changes%2Elength%20%2D%201%3B%20i%20%3E%3D%200%3B%20i%2D%2D%29%0A%20%20%20%20%20%20%20%20makeChange%28this%2C%20changes%5Bi%5D%29%3B%0A%20%20%20%20%20%20if%20%28newSel%29%20setSelectionReplaceHistory%28this%2C%20newSel%29%3B%0A%20%20%20%20%20%20else%20if%20%28this%2Ecm%29%20ensureCursorVisible%28this%2Ecm%29%3B%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20undo%3A%20docMethodOp%28function%28%29%20%7BmakeChangeFromHistory%28this%2C%20%22undo%22%29%3B%7D%29%2C%0A%20%20%20%20redo%3A%20docMethodOp%28function%28%29%20%7BmakeChangeFromHistory%28this%2C%20%22redo%22%29%3B%7D%29%2C%0A%20%20%20%20undoSelection%3A%20docMethodOp%28function%28%29%20%7BmakeChangeFromHistory%28this%2C%20%22undo%22%2C%20true%29%3B%7D%29%2C%0A%20%20%20%20redoSelection%3A%20docMethodOp%28function%28%29%20%7BmakeChangeFromHistory%28this%2C%20%22redo%22%2C%20true%29%3B%7D%29%2C%0A%0A%20%20%20%20setExtending%3A%20function%28val%29%20%7Bthis%2Eextend%20%3D%20val%3B%7D%2C%0A%20%20%20%20getExtending%3A%20function%28%29%20%7Breturn%20this%2Eextend%3B%7D%2C%0A%0A%20%20%20%20historySize%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20hist%20%3D%20this%2Ehistory%2C%20done%20%3D%200%2C%20undone%20%3D%200%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20hist%2Edone%2Elength%3B%20i%2B%2B%29%20if%20%28%21hist%2Edone%5Bi%5D%2Eranges%29%20%2B%2Bdone%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20hist%2Eundone%2Elength%3B%20i%2B%2B%29%20if%20%28%21hist%2Eundone%5Bi%5D%2Eranges%29%20%2B%2Bundone%3B%0A%20%20%20%20%20%20return%20%7Bundo%3A%20done%2C%20redo%3A%20undone%7D%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20clearHistory%3A%20function%28%29%20%7Bthis%2Ehistory%20%3D%20new%20History%28this%2Ehistory%2EmaxGeneration%29%3B%7D%2C%0A%0A%20%20%20%20markClean%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20this%2EcleanGeneration%20%3D%20this%2EchangeGeneration%28true%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20changeGeneration%3A%20function%28forceSplit%29%20%7B%0A%20%20%20%20%20%20if%20%28forceSplit%29%0A%20%20%20%20%20%20%20%20this%2Ehistory%2ElastOp%20%3D%20this%2Ehistory%2ElastSelOp%20%3D%20this%2Ehistory%2ElastOrigin%20%3D%20null%3B%0A%20%20%20%20%20%20return%20this%2Ehistory%2Egeneration%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20isClean%3A%20function%20%28gen%29%20%7B%0A%20%20%20%20%20%20return%20this%2Ehistory%2Egeneration%20%3D%3D%20%28gen%20%7C%7C%20this%2EcleanGeneration%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20getHistory%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20return%20%7Bdone%3A%20copyHistoryArray%28this%2Ehistory%2Edone%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20undone%3A%20copyHistoryArray%28this%2Ehistory%2Eundone%29%7D%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20setHistory%3A%20function%28histData%29%20%7B%0A%20%20%20%20%20%20var%20hist%20%3D%20this%2Ehistory%20%3D%20new%20History%28this%2Ehistory%2EmaxGeneration%29%3B%0A%20%20%20%20%20%20hist%2Edone%20%3D%20copyHistoryArray%28histData%2Edone%2Eslice%280%29%2C%20null%2C%20true%29%3B%0A%20%20%20%20%20%20hist%2Eundone%20%3D%20copyHistoryArray%28histData%2Eundone%2Eslice%280%29%2C%20null%2C%20true%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20addLineClass%3A%20docMethodOp%28function%28handle%2C%20where%2C%20cls%29%20%7B%0A%20%20%20%20%20%20return%20changeLine%28this%2C%20handle%2C%20where%20%3D%3D%20%22gutter%22%20%3F%20%22gutter%22%20%3A%20%22class%22%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20%20%20var%20prop%20%3D%20where%20%3D%3D%20%22text%22%20%3F%20%22textClass%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20where%20%3D%3D%20%22background%22%20%3F%20%22bgClass%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20where%20%3D%3D%20%22gutter%22%20%3F%20%22gutterClass%22%20%3A%20%22wrapClass%22%3B%0A%20%20%20%20%20%20%20%20if%20%28%21line%5Bprop%5D%29%20line%5Bprop%5D%20%3D%20cls%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28classTest%28cls%29%2Etest%28line%5Bprop%5D%29%29%20return%20false%3B%0A%20%20%20%20%20%20%20%20else%20line%5Bprop%5D%20%2B%3D%20%22%20%22%20%2B%20cls%3B%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20removeLineClass%3A%20docMethodOp%28function%28handle%2C%20where%2C%20cls%29%20%7B%0A%20%20%20%20%20%20return%20changeLine%28this%2C%20handle%2C%20where%20%3D%3D%20%22gutter%22%20%3F%20%22gutter%22%20%3A%20%22class%22%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20%20%20var%20prop%20%3D%20where%20%3D%3D%20%22text%22%20%3F%20%22textClass%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20where%20%3D%3D%20%22background%22%20%3F%20%22bgClass%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20where%20%3D%3D%20%22gutter%22%20%3F%20%22gutterClass%22%20%3A%20%22wrapClass%22%3B%0A%20%20%20%20%20%20%20%20var%20cur%20%3D%20line%5Bprop%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28%21cur%29%20return%20false%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28cls%20%3D%3D%20null%29%20line%5Bprop%5D%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20found%20%3D%20cur%2Ematch%28classTest%28cls%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21found%29%20return%20false%3B%0A%20%20%20%20%20%20%20%20%20%20var%20end%20%3D%20found%2Eindex%20%2B%20found%5B0%5D%2Elength%3B%0A%20%20%20%20%20%20%20%20%20%20line%5Bprop%5D%20%3D%20cur%2Eslice%280%2C%20found%2Eindex%29%20%2B%20%28%21found%2Eindex%20%7C%7C%20end%20%3D%3D%20cur%2Elength%20%3F%20%22%22%20%3A%20%22%20%22%29%20%2B%20cur%2Eslice%28end%29%20%7C%7C%20null%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%29%2C%0A%0A%20%20%20%20addLineWidget%3A%20docMethodOp%28function%28handle%2C%20node%2C%20options%29%20%7B%0A%20%20%20%20%20%20return%20addLineWidget%28this%2C%20handle%2C%20node%2C%20options%29%3B%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20removeLineWidget%3A%20function%28widget%29%20%7B%20widget%2Eclear%28%29%3B%20%7D%2C%0A%0A%20%20%20%20markText%3A%20function%28from%2C%20to%2C%20options%29%20%7B%0A%20%20%20%20%20%20return%20markText%28this%2C%20clipPos%28this%2C%20from%29%2C%20clipPos%28this%2C%20to%29%2C%20options%2C%20options%20%26%26%20options%2Etype%20%7C%7C%20%22range%22%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20setBookmark%3A%20function%28pos%2C%20options%29%20%7B%0A%20%20%20%20%20%20var%20realOpts%20%3D%20%7BreplacedWith%3A%20options%20%26%26%20%28options%2EnodeType%20%3D%3D%20null%20%3F%20options%2Ewidget%20%3A%20options%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20insertLeft%3A%20options%20%26%26%20options%2EinsertLeft%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20clearWhenEmpty%3A%20false%2C%20shared%3A%20options%20%26%26%20options%2Eshared%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20handleMouseEvents%3A%20options%20%26%26%20options%2EhandleMouseEvents%7D%3B%0A%20%20%20%20%20%20pos%20%3D%20clipPos%28this%2C%20pos%29%3B%0A%20%20%20%20%20%20return%20markText%28this%2C%20pos%2C%20pos%2C%20realOpts%2C%20%22bookmark%22%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20findMarksAt%3A%20function%28pos%29%20%7B%0A%20%20%20%20%20%20pos%20%3D%20clipPos%28this%2C%20pos%29%3B%0A%20%20%20%20%20%20var%20markers%20%3D%20%5B%5D%2C%20spans%20%3D%20getLine%28this%2C%20pos%2Eline%29%2EmarkedSpans%3B%0A%20%20%20%20%20%20if%20%28spans%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20spans%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20span%20%3D%20spans%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28%28span%2Efrom%20%3D%3D%20null%20%7C%7C%20span%2Efrom%20%3C%3D%20pos%2Ech%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%28span%2Eto%20%3D%3D%20null%20%7C%7C%20span%2Eto%20%3E%3D%20pos%2Ech%29%29%0A%20%20%20%20%20%20%20%20%20%20markers%2Epush%28span%2Emarker%2Eparent%20%7C%7C%20span%2Emarker%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20markers%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20findMarks%3A%20function%28from%2C%20to%2C%20filter%29%20%7B%0A%20%20%20%20%20%20from%20%3D%20clipPos%28this%2C%20from%29%3B%20to%20%3D%20clipPos%28this%2C%20to%29%3B%0A%20%20%20%20%20%20var%20found%20%3D%20%5B%5D%2C%20lineNo%20%3D%20from%2Eline%3B%0A%20%20%20%20%20%20this%2Eiter%28from%2Eline%2C%20to%2Eline%20%2B%201%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20%20%20var%20spans%20%3D%20line%2EmarkedSpans%3B%0A%20%20%20%20%20%20%20%20if%20%28spans%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20spans%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20span%20%3D%20spans%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21%28lineNo%20%3D%3D%20from%2Eline%20%26%26%20from%2Ech%20%3E%20span%2Eto%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20span%2Efrom%20%3D%3D%20null%20%26%26%20lineNo%20%21%3D%20from%2Eline%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lineNo%20%3D%3D%20to%2Eline%20%26%26%20span%2Efrom%20%3E%20to%2Ech%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28%21filter%20%7C%7C%20filter%28span%2Emarker%29%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20found%2Epush%28span%2Emarker%2Eparent%20%7C%7C%20span%2Emarker%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%2B%2BlineNo%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20return%20found%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20getAllMarks%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20markers%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20this%2Eiter%28function%28line%29%20%7B%0A%20%20%20%20%20%20%20%20var%20sps%20%3D%20line%2EmarkedSpans%3B%0A%20%20%20%20%20%20%20%20if%20%28sps%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20sps%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20%20%20%20%20if%20%28sps%5Bi%5D%2Efrom%20%21%3D%20null%29%20markers%2Epush%28sps%5Bi%5D%2Emarker%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20return%20markers%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20posFromIndex%3A%20function%28off%29%20%7B%0A%20%20%20%20%20%20var%20ch%2C%20lineNo%20%3D%20this%2Efirst%3B%0A%20%20%20%20%20%20this%2Eiter%28function%28line%29%20%7B%0A%20%20%20%20%20%20%20%20var%20sz%20%3D%20line%2Etext%2Elength%20%2B%201%3B%0A%20%20%20%20%20%20%20%20if%20%28sz%20%3E%20off%29%20%7B%20ch%20%3D%20off%3B%20return%20true%3B%20%7D%0A%20%20%20%20%20%20%20%20off%20%2D%3D%20sz%3B%0A%20%20%20%20%20%20%20%20%2B%2BlineNo%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20return%20clipPos%28this%2C%20Pos%28lineNo%2C%20ch%29%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20indexFromPos%3A%20function%20%28coords%29%20%7B%0A%20%20%20%20%20%20coords%20%3D%20clipPos%28this%2C%20coords%29%3B%0A%20%20%20%20%20%20var%20index%20%3D%20coords%2Ech%3B%0A%20%20%20%20%20%20if%20%28coords%2Eline%20%3C%20this%2Efirst%20%7C%7C%20coords%2Ech%20%3C%200%29%20return%200%3B%0A%20%20%20%20%20%20this%2Eiter%28this%2Efirst%2C%20coords%2Eline%2C%20function%20%28line%29%20%7B%0A%20%20%20%20%20%20%20%20index%20%2B%3D%20line%2Etext%2Elength%20%2B%201%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20return%20index%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20copy%3A%20function%28copyHistory%29%20%7B%0A%20%20%20%20%20%20var%20doc%20%3D%20new%20Doc%28getLines%28this%2C%20this%2Efirst%2C%20this%2Efirst%20%2B%20this%2Esize%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this%2EmodeOption%2C%20this%2Efirst%2C%20this%2ElineSep%29%3B%0A%20%20%20%20%20%20doc%2EscrollTop%20%3D%20this%2EscrollTop%3B%20doc%2EscrollLeft%20%3D%20this%2EscrollLeft%3B%0A%20%20%20%20%20%20doc%2Esel%20%3D%20this%2Esel%3B%0A%20%20%20%20%20%20doc%2Eextend%20%3D%20false%3B%0A%20%20%20%20%20%20if%20%28copyHistory%29%20%7B%0A%20%20%20%20%20%20%20%20doc%2Ehistory%2EundoDepth%20%3D%20this%2Ehistory%2EundoDepth%3B%0A%20%20%20%20%20%20%20%20doc%2EsetHistory%28this%2EgetHistory%28%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20doc%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20linkedDoc%3A%20function%28options%29%20%7B%0A%20%20%20%20%20%20if%20%28%21options%29%20options%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20var%20from%20%3D%20this%2Efirst%2C%20to%20%3D%20this%2Efirst%20%2B%20this%2Esize%3B%0A%20%20%20%20%20%20if%20%28options%2Efrom%20%21%3D%20null%20%26%26%20options%2Efrom%20%3E%20from%29%20from%20%3D%20options%2Efrom%3B%0A%20%20%20%20%20%20if%20%28options%2Eto%20%21%3D%20null%20%26%26%20options%2Eto%20%3C%20to%29%20to%20%3D%20options%2Eto%3B%0A%20%20%20%20%20%20var%20copy%20%3D%20new%20Doc%28getLines%28this%2C%20from%2C%20to%29%2C%20options%2Emode%20%7C%7C%20this%2EmodeOption%2C%20from%2C%20this%2ElineSep%29%3B%0A%20%20%20%20%20%20if%20%28options%2EsharedHist%29%20copy%2Ehistory%20%3D%20this%2Ehistory%3B%0A%20%20%20%20%20%20%28this%2Elinked%20%7C%7C%20%28this%2Elinked%20%3D%20%5B%5D%29%29%2Epush%28%7Bdoc%3A%20copy%2C%20sharedHist%3A%20options%2EsharedHist%7D%29%3B%0A%20%20%20%20%20%20copy%2Elinked%20%3D%20%5B%7Bdoc%3A%20this%2C%20isParent%3A%20true%2C%20sharedHist%3A%20options%2EsharedHist%7D%5D%3B%0A%20%20%20%20%20%20copySharedMarkers%28copy%2C%20findSharedMarkers%28this%29%29%3B%0A%20%20%20%20%20%20return%20copy%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20unlinkDoc%3A%20function%28other%29%20%7B%0A%20%20%20%20%20%20if%20%28other%20instanceof%20CodeMirror%29%20other%20%3D%20other%2Edoc%3B%0A%20%20%20%20%20%20if%20%28this%2Elinked%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20this%2Elinked%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20link%20%3D%20this%2Elinked%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28link%2Edoc%20%21%3D%20other%29%20continue%3B%0A%20%20%20%20%20%20%20%20this%2Elinked%2Esplice%28i%2C%201%29%3B%0A%20%20%20%20%20%20%20%20other%2EunlinkDoc%28this%29%3B%0A%20%20%20%20%20%20%20%20detachSharedMarkers%28findSharedMarkers%28this%29%29%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F%2F%20If%20the%20histories%20were%20shared%2C%20split%20them%20again%0A%20%20%20%20%20%20if%20%28other%2Ehistory%20%3D%3D%20this%2Ehistory%29%20%7B%0A%20%20%20%20%20%20%20%20var%20splitIds%20%3D%20%5Bother%2Eid%5D%3B%0A%20%20%20%20%20%20%20%20linkedDocs%28other%2C%20function%28doc%29%20%7BsplitIds%2Epush%28doc%2Eid%29%3B%7D%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20other%2Ehistory%20%3D%20new%20History%28null%29%3B%0A%20%20%20%20%20%20%20%20other%2Ehistory%2Edone%20%3D%20copyHistoryArray%28this%2Ehistory%2Edone%2C%20splitIds%29%3B%0A%20%20%20%20%20%20%20%20other%2Ehistory%2Eundone%20%3D%20copyHistoryArray%28this%2Ehistory%2Eundone%2C%20splitIds%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%20%20%20%20iterLinkedDocs%3A%20function%28f%29%20%7BlinkedDocs%28this%2C%20f%29%3B%7D%2C%0A%0A%20%20%20%20getMode%3A%20function%28%29%20%7Breturn%20this%2Emode%3B%7D%2C%0A%20%20%20%20getEditor%3A%20function%28%29%20%7Breturn%20this%2Ecm%3B%7D%2C%0A%0A%20%20%20%20splitLines%3A%20function%28str%29%20%7B%0A%20%20%20%20%20%20if%20%28this%2ElineSep%29%20return%20str%2Esplit%28this%2ElineSep%29%3B%0A%20%20%20%20%20%20return%20splitLinesAuto%28str%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20lineSeparator%3A%20function%28%29%20%7B%20return%20this%2ElineSep%20%7C%7C%20%22%5Cn%22%3B%20%7D%0A%20%20%7D%29%3B%0A%0A%20%20%2F%2F%20Public%20alias%2E%0A%20%20Doc%2Eprototype%2EeachLine%20%3D%20Doc%2Eprototype%2Eiter%3B%0A%0A%20%20%2F%2F%20Set%20up%20methods%20on%20CodeMirror%27s%20prototype%20to%20redirect%20to%20the%20editor%27s%20document%2E%0A%20%20var%20dontDelegate%20%3D%20%22iter%20insert%20remove%20copy%20getEditor%20constructor%22%2Esplit%28%22%20%22%29%3B%0A%20%20for%20%28var%20prop%20in%20Doc%2Eprototype%29%20if%20%28Doc%2Eprototype%2EhasOwnProperty%28prop%29%20%26%26%20indexOf%28dontDelegate%2C%20prop%29%20%3C%200%29%0A%20%20%20%20CodeMirror%2Eprototype%5Bprop%5D%20%3D%20%28function%28method%29%20%7B%0A%20%20%20%20%20%20return%20function%28%29%20%7Breturn%20method%2Eapply%28this%2Edoc%2C%20arguments%29%3B%7D%3B%0A%20%20%20%20%7D%29%28Doc%2Eprototype%5Bprop%5D%29%3B%0A%0A%20%20eventMixin%28Doc%29%3B%0A%0A%20%20%2F%2F%20Call%20f%20for%20all%20linked%20documents%2E%0A%20%20function%20linkedDocs%28doc%2C%20f%2C%20sharedHistOnly%29%20%7B%0A%20%20%20%20function%20propagate%28doc%2C%20skip%2C%20sharedHist%29%20%7B%0A%20%20%20%20%20%20if%20%28doc%2Elinked%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20doc%2Elinked%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20rel%20%3D%20doc%2Elinked%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28rel%2Edoc%20%3D%3D%20skip%29%20continue%3B%0A%20%20%20%20%20%20%20%20var%20shared%20%3D%20sharedHist%20%26%26%20rel%2EsharedHist%3B%0A%20%20%20%20%20%20%20%20if%20%28sharedHistOnly%20%26%26%20%21shared%29%20continue%3B%0A%20%20%20%20%20%20%20%20f%28rel%2Edoc%2C%20shared%29%3B%0A%20%20%20%20%20%20%20%20propagate%28rel%2Edoc%2C%20doc%2C%20shared%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20propagate%28doc%2C%20null%2C%20true%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Attach%20a%20document%20to%20an%20editor%2E%0A%20%20function%20attachDoc%28cm%2C%20doc%29%20%7B%0A%20%20%20%20if%20%28doc%2Ecm%29%20throw%20new%20Error%28%22This%20document%20is%20already%20in%20use%2E%22%29%3B%0A%20%20%20%20cm%2Edoc%20%3D%20doc%3B%0A%20%20%20%20doc%2Ecm%20%3D%20cm%3B%0A%20%20%20%20estimateLineHeights%28cm%29%3B%0A%20%20%20%20loadMode%28cm%29%3B%0A%20%20%20%20if%20%28%21cm%2Eoptions%2ElineWrapping%29%20findMaxLine%28cm%29%3B%0A%20%20%20%20cm%2Eoptions%2Emode%20%3D%20doc%2EmodeOption%3B%0A%20%20%20%20regChange%28cm%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20LINE%20UTILITIES%0A%0A%20%20%2F%2F%20Find%20the%20line%20object%20corresponding%20to%20the%20given%20line%20number%2E%0A%20%20function%20getLine%28doc%2C%20n%29%20%7B%0A%20%20%20%20n%20%2D%3D%20doc%2Efirst%3B%0A%20%20%20%20if%20%28n%20%3C%200%20%7C%7C%20n%20%3E%3D%20doc%2Esize%29%20throw%20new%20Error%28%22There%20is%20no%20line%20%22%20%2B%20%28n%20%2B%20doc%2Efirst%29%20%2B%20%22%20in%20the%20document%2E%22%29%3B%0A%20%20%20%20for%20%28var%20chunk%20%3D%20doc%3B%20%21chunk%2Elines%3B%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20child%20%3D%20chunk%2Echildren%5Bi%5D%2C%20sz%20%3D%20child%2EchunkSize%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28n%20%3C%20sz%29%20%7B%20chunk%20%3D%20child%3B%20break%3B%20%7D%0A%20%20%20%20%20%20%20%20n%20%2D%3D%20sz%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20chunk%2Elines%5Bn%5D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Get%20the%20part%20of%20a%20document%20between%20two%20positions%2C%20as%20an%20array%20of%0A%20%20%2F%2F%20strings%2E%0A%20%20function%20getBetween%28doc%2C%20start%2C%20end%29%20%7B%0A%20%20%20%20var%20out%20%3D%20%5B%5D%2C%20n%20%3D%20start%2Eline%3B%0A%20%20%20%20doc%2Eiter%28start%2Eline%2C%20end%2Eline%20%2B%201%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20var%20text%20%3D%20line%2Etext%3B%0A%20%20%20%20%20%20if%20%28n%20%3D%3D%20end%2Eline%29%20text%20%3D%20text%2Eslice%280%2C%20end%2Ech%29%3B%0A%20%20%20%20%20%20if%20%28n%20%3D%3D%20start%2Eline%29%20text%20%3D%20text%2Eslice%28start%2Ech%29%3B%0A%20%20%20%20%20%20out%2Epush%28text%29%3B%0A%20%20%20%20%20%20%2B%2Bn%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20return%20out%3B%0A%20%20%7D%0A%20%20%2F%2F%20Get%20the%20lines%20between%20from%20and%20to%2C%20as%20array%20of%20strings%2E%0A%20%20function%20getLines%28doc%2C%20from%2C%20to%29%20%7B%0A%20%20%20%20var%20out%20%3D%20%5B%5D%3B%0A%20%20%20%20doc%2Eiter%28from%2C%20to%2C%20function%28line%29%20%7B%20out%2Epush%28line%2Etext%29%3B%20%7D%29%3B%0A%20%20%20%20return%20out%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Update%20the%20height%20of%20a%20line%2C%20propagating%20the%20height%20change%0A%20%20%2F%2F%20upwards%20to%20parent%20nodes%2E%0A%20%20function%20updateLineHeight%28line%2C%20height%29%20%7B%0A%20%20%20%20var%20diff%20%3D%20height%20%2D%20line%2Eheight%3B%0A%20%20%20%20if%20%28diff%29%20for%20%28var%20n%20%3D%20line%3B%20n%3B%20n%20%3D%20n%2Eparent%29%20n%2Eheight%20%2B%3D%20diff%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Given%20a%20line%20object%2C%20find%20its%20line%20number%20by%20walking%20up%20through%0A%20%20%2F%2F%20its%20parent%20links%2E%0A%20%20function%20lineNo%28line%29%20%7B%0A%20%20%20%20if%20%28line%2Eparent%20%3D%3D%20null%29%20return%20null%3B%0A%20%20%20%20var%20cur%20%3D%20line%2Eparent%2C%20no%20%3D%20indexOf%28cur%2Elines%2C%20line%29%3B%0A%20%20%20%20for%20%28var%20chunk%20%3D%20cur%2Eparent%3B%20chunk%3B%20cur%20%3D%20chunk%2C%20chunk%20%3D%20chunk%2Eparent%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28chunk%2Echildren%5Bi%5D%20%3D%3D%20cur%29%20break%3B%0A%20%20%20%20%20%20%20%20no%20%2B%3D%20chunk%2Echildren%5Bi%5D%2EchunkSize%28%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20no%20%2B%20cur%2Efirst%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Find%20the%20line%20at%20the%20given%20vertical%20position%2C%20using%20the%20height%0A%20%20%2F%2F%20information%20in%20the%20document%20tree%2E%0A%20%20function%20lineAtHeight%28chunk%2C%20h%29%20%7B%0A%20%20%20%20var%20n%20%3D%20chunk%2Efirst%3B%0A%20%20%20%20outer%3A%20do%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20chunk%2Echildren%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20child%20%3D%20chunk%2Echildren%5Bi%5D%2C%20ch%20%3D%20child%2Eheight%3B%0A%20%20%20%20%20%20%20%20if%20%28h%20%3C%20ch%29%20%7B%20chunk%20%3D%20child%3B%20continue%20outer%3B%20%7D%0A%20%20%20%20%20%20%20%20h%20%2D%3D%20ch%3B%0A%20%20%20%20%20%20%20%20n%20%2B%3D%20child%2EchunkSize%28%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20n%3B%0A%20%20%20%20%7D%20while%20%28%21chunk%2Elines%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20chunk%2Elines%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20line%20%3D%20chunk%2Elines%5Bi%5D%2C%20lh%20%3D%20line%2Eheight%3B%0A%20%20%20%20%20%20if%20%28h%20%3C%20lh%29%20break%3B%0A%20%20%20%20%20%20h%20%2D%3D%20lh%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20n%20%2B%20i%3B%0A%20%20%7D%0A%0A%0A%20%20%2F%2F%20Find%20the%20height%20above%20the%20given%20line%2E%0A%20%20function%20heightAtLine%28lineObj%29%20%7B%0A%20%20%20%20lineObj%20%3D%20visualLine%28lineObj%29%3B%0A%0A%20%20%20%20var%20h%20%3D%200%2C%20chunk%20%3D%20lineObj%2Eparent%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20chunk%2Elines%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20line%20%3D%20chunk%2Elines%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28line%20%3D%3D%20lineObj%29%20break%3B%0A%20%20%20%20%20%20else%20h%20%2B%3D%20line%2Eheight%3B%0A%20%20%20%20%7D%0A%20%20%20%20for%20%28var%20p%20%3D%20chunk%2Eparent%3B%20p%3B%20chunk%20%3D%20p%2C%20p%20%3D%20chunk%2Eparent%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20p%2Echildren%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20cur%20%3D%20p%2Echildren%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28cur%20%3D%3D%20chunk%29%20break%3B%0A%20%20%20%20%20%20%20%20else%20h%20%2B%3D%20cur%2Eheight%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20h%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Get%20the%20bidi%20ordering%20for%20the%20given%20line%20%28and%20cache%20it%29%2E%20Returns%0A%20%20%2F%2F%20false%20for%20lines%20that%20are%20fully%20left%2Dto%2Dright%2C%20and%20an%20array%20of%0A%20%20%2F%2F%20BidiSpan%20objects%20otherwise%2E%0A%20%20function%20getOrder%28line%29%20%7B%0A%20%20%20%20var%20order%20%3D%20line%2Eorder%3B%0A%20%20%20%20if%20%28order%20%3D%3D%20null%29%20order%20%3D%20line%2Eorder%20%3D%20bidiOrdering%28line%2Etext%29%3B%0A%20%20%20%20return%20order%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20HISTORY%0A%0A%20%20function%20History%28startGen%29%20%7B%0A%20%20%20%20%2F%2F%20Arrays%20of%20change%20events%20and%20selections%2E%20Doing%20something%20adds%20an%0A%20%20%20%20%2F%2F%20event%20to%20done%20and%20clears%20undo%2E%20Undoing%20moves%20events%20from%20done%0A%20%20%20%20%2F%2F%20to%20undone%2C%20redoing%20moves%20them%20in%20the%20other%20direction%2E%0A%20%20%20%20this%2Edone%20%3D%20%5B%5D%3B%20this%2Eundone%20%3D%20%5B%5D%3B%0A%20%20%20%20this%2EundoDepth%20%3D%20Infinity%3B%0A%20%20%20%20%2F%2F%20Used%20to%20track%20when%20changes%20can%20be%20merged%20into%20a%20single%20undo%0A%20%20%20%20%2F%2F%20event%0A%20%20%20%20this%2ElastModTime%20%3D%20this%2ElastSelTime%20%3D%200%3B%0A%20%20%20%20this%2ElastOp%20%3D%20this%2ElastSelOp%20%3D%20null%3B%0A%20%20%20%20this%2ElastOrigin%20%3D%20this%2ElastSelOrigin%20%3D%20null%3B%0A%20%20%20%20%2F%2F%20Used%20by%20the%20isClean%28%29%20method%0A%20%20%20%20this%2Egeneration%20%3D%20this%2EmaxGeneration%20%3D%20startGen%20%7C%7C%201%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Create%20a%20history%20change%20event%20from%20an%20updateDoc%2Dstyle%20change%0A%20%20%2F%2F%20object%2E%0A%20%20function%20historyChangeFromChange%28doc%2C%20change%29%20%7B%0A%20%20%20%20var%20histChange%20%3D%20%7Bfrom%3A%20copyPos%28change%2Efrom%29%2C%20to%3A%20changeEnd%28change%29%2C%20text%3A%20getBetween%28doc%2C%20change%2Efrom%2C%20change%2Eto%29%7D%3B%0A%20%20%20%20attachLocalSpans%28doc%2C%20histChange%2C%20change%2Efrom%2Eline%2C%20change%2Eto%2Eline%20%2B%201%29%3B%0A%20%20%20%20linkedDocs%28doc%2C%20function%28doc%29%20%7BattachLocalSpans%28doc%2C%20histChange%2C%20change%2Efrom%2Eline%2C%20change%2Eto%2Eline%20%2B%201%29%3B%7D%2C%20true%29%3B%0A%20%20%20%20return%20histChange%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Pop%20all%20selection%20events%20off%20the%20end%20of%20a%20history%20array%2E%20Stop%20at%0A%20%20%2F%2F%20a%20change%20event%2E%0A%20%20function%20clearSelectionEvents%28array%29%20%7B%0A%20%20%20%20while%20%28array%2Elength%29%20%7B%0A%20%20%20%20%20%20var%20last%20%3D%20lst%28array%29%3B%0A%20%20%20%20%20%20if%20%28last%2Eranges%29%20array%2Epop%28%29%3B%0A%20%20%20%20%20%20else%20break%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Find%20the%20top%20change%20event%20in%20the%20history%2E%20Pop%20off%20selection%0A%20%20%2F%2F%20events%20that%20are%20in%20the%20way%2E%0A%20%20function%20lastChangeEvent%28hist%2C%20force%29%20%7B%0A%20%20%20%20if%20%28force%29%20%7B%0A%20%20%20%20%20%20clearSelectionEvents%28hist%2Edone%29%3B%0A%20%20%20%20%20%20return%20lst%28hist%2Edone%29%3B%0A%20%20%20%20%7D%20else%20if%20%28hist%2Edone%2Elength%20%26%26%20%21lst%28hist%2Edone%29%2Eranges%29%20%7B%0A%20%20%20%20%20%20return%20lst%28hist%2Edone%29%3B%0A%20%20%20%20%7D%20else%20if%20%28hist%2Edone%2Elength%20%3E%201%20%26%26%20%21hist%2Edone%5Bhist%2Edone%2Elength%20%2D%202%5D%2Eranges%29%20%7B%0A%20%20%20%20%20%20hist%2Edone%2Epop%28%29%3B%0A%20%20%20%20%20%20return%20lst%28hist%2Edone%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Register%20a%20change%20in%20the%20history%2E%20Merges%20changes%20that%20are%20within%0A%20%20%2F%2F%20a%20single%20operation%2C%20ore%20are%20close%20together%20with%20an%20origin%20that%0A%20%20%2F%2F%20allows%20merging%20%28starting%20with%20%22%2B%22%29%20into%20a%20single%20event%2E%0A%20%20function%20addChangeToHistory%28doc%2C%20change%2C%20selAfter%2C%20opId%29%20%7B%0A%20%20%20%20var%20hist%20%3D%20doc%2Ehistory%3B%0A%20%20%20%20hist%2Eundone%2Elength%20%3D%200%3B%0A%20%20%20%20var%20time%20%3D%20%2Bnew%20Date%2C%20cur%3B%0A%0A%20%20%20%20if%20%28%28hist%2ElastOp%20%3D%3D%20opId%20%7C%7C%0A%20%20%20%20%20%20%20%20%20hist%2ElastOrigin%20%3D%3D%20change%2Eorigin%20%26%26%20change%2Eorigin%20%26%26%0A%20%20%20%20%20%20%20%20%20%28%28change%2Eorigin%2EcharAt%280%29%20%3D%3D%20%22%2B%22%20%26%26%20doc%2Ecm%20%26%26%20hist%2ElastModTime%20%3E%20time%20%2D%20doc%2Ecm%2Eoptions%2EhistoryEventDelay%29%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20change%2Eorigin%2EcharAt%280%29%20%3D%3D%20%22%2A%22%29%29%20%26%26%0A%20%20%20%20%20%20%20%20%28cur%20%3D%20lastChangeEvent%28hist%2C%20hist%2ElastOp%20%3D%3D%20opId%29%29%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Merge%20this%20change%20into%20the%20last%20event%0A%20%20%20%20%20%20var%20last%20%3D%20lst%28cur%2Echanges%29%3B%0A%20%20%20%20%20%20if%20%28cmp%28change%2Efrom%2C%20change%2Eto%29%20%3D%3D%200%20%26%26%20cmp%28change%2Efrom%2C%20last%2Eto%29%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Optimized%20case%20for%20simple%20insertion%20%2D%2D%20don%27t%20want%20to%20add%0A%20%20%20%20%20%20%20%20%2F%2F%20new%20changesets%20for%20every%20character%20typed%0A%20%20%20%20%20%20%20%20last%2Eto%20%3D%20changeEnd%28change%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Add%20new%20sub%2Devent%0A%20%20%20%20%20%20%20%20cur%2Echanges%2Epush%28historyChangeFromChange%28doc%2C%20change%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%2F%2F%20Can%20not%20be%20merged%2C%20start%20a%20new%20event%2E%0A%20%20%20%20%20%20var%20before%20%3D%20lst%28hist%2Edone%29%3B%0A%20%20%20%20%20%20if%20%28%21before%20%7C%7C%20%21before%2Eranges%29%0A%20%20%20%20%20%20%20%20pushSelectionToHistory%28doc%2Esel%2C%20hist%2Edone%29%3B%0A%20%20%20%20%20%20cur%20%3D%20%7Bchanges%3A%20%5BhistoryChangeFromChange%28doc%2C%20change%29%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20generation%3A%20hist%2Egeneration%7D%3B%0A%20%20%20%20%20%20hist%2Edone%2Epush%28cur%29%3B%0A%20%20%20%20%20%20while%20%28hist%2Edone%2Elength%20%3E%20hist%2EundoDepth%29%20%7B%0A%20%20%20%20%20%20%20%20hist%2Edone%2Eshift%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21hist%2Edone%5B0%5D%2Eranges%29%20hist%2Edone%2Eshift%28%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20hist%2Edone%2Epush%28selAfter%29%3B%0A%20%20%20%20hist%2Egeneration%20%3D%20%2B%2Bhist%2EmaxGeneration%3B%0A%20%20%20%20hist%2ElastModTime%20%3D%20hist%2ElastSelTime%20%3D%20time%3B%0A%20%20%20%20hist%2ElastOp%20%3D%20hist%2ElastSelOp%20%3D%20opId%3B%0A%20%20%20%20hist%2ElastOrigin%20%3D%20hist%2ElastSelOrigin%20%3D%20change%2Eorigin%3B%0A%0A%20%20%20%20if%20%28%21last%29%20signal%28doc%2C%20%22historyAdded%22%29%3B%0A%20%20%7D%0A%0A%20%20function%20selectionEventCanBeMerged%28doc%2C%20origin%2C%20prev%2C%20sel%29%20%7B%0A%20%20%20%20var%20ch%20%3D%20origin%2EcharAt%280%29%3B%0A%20%20%20%20return%20ch%20%3D%3D%20%22%2A%22%20%7C%7C%0A%20%20%20%20%20%20ch%20%3D%3D%20%22%2B%22%20%26%26%0A%20%20%20%20%20%20prev%2Eranges%2Elength%20%3D%3D%20sel%2Eranges%2Elength%20%26%26%0A%20%20%20%20%20%20prev%2EsomethingSelected%28%29%20%3D%3D%20sel%2EsomethingSelected%28%29%20%26%26%0A%20%20%20%20%20%20new%20Date%20%2D%20doc%2Ehistory%2ElastSelTime%20%3C%3D%20%28doc%2Ecm%20%3F%20doc%2Ecm%2Eoptions%2EhistoryEventDelay%20%3A%20500%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Called%20whenever%20the%20selection%20changes%2C%20sets%20the%20new%20selection%20as%0A%20%20%2F%2F%20the%20pending%20selection%20in%20the%20history%2C%20and%20pushes%20the%20old%20pending%0A%20%20%2F%2F%20selection%20into%20the%20%27done%27%20array%20when%20it%20was%20significantly%0A%20%20%2F%2F%20different%20%28in%20number%20of%20selected%20ranges%2C%20emptiness%2C%20or%20time%29%2E%0A%20%20function%20addSelectionToHistory%28doc%2C%20sel%2C%20opId%2C%20options%29%20%7B%0A%20%20%20%20var%20hist%20%3D%20doc%2Ehistory%2C%20origin%20%3D%20options%20%26%26%20options%2Eorigin%3B%0A%0A%20%20%20%20%2F%2F%20A%20new%20event%20is%20started%20when%20the%20previous%20origin%20does%20not%20match%0A%20%20%20%20%2F%2F%20the%20current%2C%20or%20the%20origins%20don%27t%20allow%20matching%2E%20Origins%0A%20%20%20%20%2F%2F%20starting%20with%20%2A%20are%20always%20merged%2C%20those%20starting%20with%20%2B%20are%0A%20%20%20%20%2F%2F%20merged%20when%20similar%20and%20close%20together%20in%20time%2E%0A%20%20%20%20if%20%28opId%20%3D%3D%20hist%2ElastSelOp%20%7C%7C%0A%20%20%20%20%20%20%20%20%28origin%20%26%26%20hist%2ElastSelOrigin%20%3D%3D%20origin%20%26%26%0A%20%20%20%20%20%20%20%20%20%28hist%2ElastModTime%20%3D%3D%20hist%2ElastSelTime%20%26%26%20hist%2ElastOrigin%20%3D%3D%20origin%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20selectionEventCanBeMerged%28doc%2C%20origin%2C%20lst%28hist%2Edone%29%2C%20sel%29%29%29%29%0A%20%20%20%20%20%20hist%2Edone%5Bhist%2Edone%2Elength%20%2D%201%5D%20%3D%20sel%3B%0A%20%20%20%20else%0A%20%20%20%20%20%20pushSelectionToHistory%28sel%2C%20hist%2Edone%29%3B%0A%0A%20%20%20%20hist%2ElastSelTime%20%3D%20%2Bnew%20Date%3B%0A%20%20%20%20hist%2ElastSelOrigin%20%3D%20origin%3B%0A%20%20%20%20hist%2ElastSelOp%20%3D%20opId%3B%0A%20%20%20%20if%20%28options%20%26%26%20options%2EclearRedo%20%21%3D%3D%20false%29%0A%20%20%20%20%20%20clearSelectionEvents%28hist%2Eundone%29%3B%0A%20%20%7D%0A%0A%20%20function%20pushSelectionToHistory%28sel%2C%20dest%29%20%7B%0A%20%20%20%20var%20top%20%3D%20lst%28dest%29%3B%0A%20%20%20%20if%20%28%21%28top%20%26%26%20top%2Eranges%20%26%26%20top%2Eequals%28sel%29%29%29%0A%20%20%20%20%20%20dest%2Epush%28sel%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Used%20to%20store%20marked%20span%20information%20in%20the%20history%2E%0A%20%20function%20attachLocalSpans%28doc%2C%20change%2C%20from%2C%20to%29%20%7B%0A%20%20%20%20var%20existing%20%3D%20change%5B%22spans%5F%22%20%2B%20doc%2Eid%5D%2C%20n%20%3D%200%3B%0A%20%20%20%20doc%2Eiter%28Math%2Emax%28doc%2Efirst%2C%20from%29%2C%20Math%2Emin%28doc%2Efirst%20%2B%20doc%2Esize%2C%20to%29%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20if%20%28line%2EmarkedSpans%29%0A%20%20%20%20%20%20%20%20%28existing%20%7C%7C%20%28existing%20%3D%20change%5B%22spans%5F%22%20%2B%20doc%2Eid%5D%20%3D%20%7B%7D%29%29%5Bn%5D%20%3D%20line%2EmarkedSpans%3B%0A%20%20%20%20%20%20%2B%2Bn%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20When%20un%2Fre%2Ddoing%20restores%20text%20containing%20marked%20spans%2C%20those%0A%20%20%2F%2F%20that%20have%20been%20explicitly%20cleared%20should%20not%20be%20restored%2E%0A%20%20function%20removeClearedSpans%28spans%29%20%7B%0A%20%20%20%20if%20%28%21spans%29%20return%20null%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%2C%20out%3B%20i%20%3C%20spans%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20if%20%28spans%5Bi%5D%2Emarker%2EexplicitlyCleared%29%20%7B%20if%20%28%21out%29%20out%20%3D%20spans%2Eslice%280%2C%20i%29%3B%20%7D%0A%20%20%20%20%20%20else%20if%20%28out%29%20out%2Epush%28spans%5Bi%5D%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20%21out%20%3F%20spans%20%3A%20out%2Elength%20%3F%20out%20%3A%20null%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Retrieve%20and%20filter%20the%20old%20marked%20spans%20stored%20in%20a%20change%20event%2E%0A%20%20function%20getOldSpans%28doc%2C%20change%29%20%7B%0A%20%20%20%20var%20found%20%3D%20change%5B%22spans%5F%22%20%2B%20doc%2Eid%5D%3B%0A%20%20%20%20if%20%28%21found%29%20return%20null%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%2C%20nw%20%3D%20%5B%5D%3B%20i%20%3C%20change%2Etext%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20nw%2Epush%28removeClearedSpans%28found%5Bi%5D%29%29%3B%0A%20%20%20%20return%20nw%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Used%20both%20to%20provide%20a%20JSON%2Dsafe%20object%20in%20%2EgetHistory%2C%20and%2C%20when%0A%20%20%2F%2F%20detaching%20a%20document%2C%20to%20split%20the%20history%20in%20two%0A%20%20function%20copyHistoryArray%28events%2C%20newGroup%2C%20instantiateSel%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%2C%20copy%20%3D%20%5B%5D%3B%20i%20%3C%20events%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20event%20%3D%20events%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28event%2Eranges%29%20%7B%0A%20%20%20%20%20%20%20%20copy%2Epush%28instantiateSel%20%3F%20Selection%2Eprototype%2EdeepCopy%2Ecall%28event%29%20%3A%20event%29%3B%0A%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20changes%20%3D%20event%2Echanges%2C%20newChanges%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20copy%2Epush%28%7Bchanges%3A%20newChanges%7D%29%3B%0A%20%20%20%20%20%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20changes%2Elength%3B%20%2B%2Bj%29%20%7B%0A%20%20%20%20%20%20%20%20var%20change%20%3D%20changes%5Bj%5D%2C%20m%3B%0A%20%20%20%20%20%20%20%20newChanges%2Epush%28%7Bfrom%3A%20change%2Efrom%2C%20to%3A%20change%2Eto%2C%20text%3A%20change%2Etext%7D%29%3B%0A%20%20%20%20%20%20%20%20if%20%28newGroup%29%20for%20%28var%20prop%20in%20change%29%20if%20%28m%20%3D%20prop%2Ematch%28%2F%5Espans%5F%28%5Cd%2B%29%24%2F%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28indexOf%28newGroup%2C%20Number%28m%5B1%5D%29%29%20%3E%20%2D1%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20lst%28newChanges%29%5Bprop%5D%20%3D%20change%5Bprop%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20delete%20change%5Bprop%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20copy%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Rebasing%2Fresetting%20history%20to%20deal%20with%20externally%2Dsourced%20changes%0A%0A%20%20function%20rebaseHistSelSingle%28pos%2C%20from%2C%20to%2C%20diff%29%20%7B%0A%20%20%20%20if%20%28to%20%3C%20pos%2Eline%29%20%7B%0A%20%20%20%20%20%20pos%2Eline%20%2B%3D%20diff%3B%0A%20%20%20%20%7D%20else%20if%20%28from%20%3C%20pos%2Eline%29%20%7B%0A%20%20%20%20%20%20pos%2Eline%20%3D%20from%3B%0A%20%20%20%20%20%20pos%2Ech%20%3D%200%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Tries%20to%20rebase%20an%20array%20of%20history%20events%20given%20a%20change%20in%20the%0A%20%20%2F%2F%20document%2E%20If%20the%20change%20touches%20the%20same%20lines%20as%20the%20event%2C%20the%0A%20%20%2F%2F%20event%2C%20and%20everything%20%27behind%27%20it%2C%20is%20discarded%2E%20If%20the%20change%20is%0A%20%20%2F%2F%20before%20the%20event%2C%20the%20event%27s%20positions%20are%20updated%2E%20Uses%20a%0A%20%20%2F%2F%20copy%2Don%2Dwrite%20scheme%20for%20the%20positions%2C%20to%20avoid%20having%20to%0A%20%20%2F%2F%20reallocate%20them%20all%20on%20every%20rebase%2C%20but%20also%20avoid%20problems%20with%0A%20%20%2F%2F%20shared%20position%20objects%20being%20unsafely%20updated%2E%0A%20%20function%20rebaseHistArray%28array%2C%20from%2C%20to%2C%20diff%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20array%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20sub%20%3D%20array%5Bi%5D%2C%20ok%20%3D%20true%3B%0A%20%20%20%20%20%20if%20%28sub%2Eranges%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21sub%2Ecopied%29%20%7B%20sub%20%3D%20array%5Bi%5D%20%3D%20sub%2EdeepCopy%28%29%3B%20sub%2Ecopied%20%3D%20true%3B%20%7D%0A%20%20%20%20%20%20%20%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20sub%2Eranges%2Elength%3B%20j%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20rebaseHistSelSingle%28sub%2Eranges%5Bj%5D%2Eanchor%2C%20from%2C%20to%2C%20diff%29%3B%0A%20%20%20%20%20%20%20%20%20%20rebaseHistSelSingle%28sub%2Eranges%5Bj%5D%2Ehead%2C%20from%2C%20to%2C%20diff%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20sub%2Echanges%2Elength%3B%20%2B%2Bj%29%20%7B%0A%20%20%20%20%20%20%20%20var%20cur%20%3D%20sub%2Echanges%5Bj%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28to%20%3C%20cur%2Efrom%2Eline%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20cur%2Efrom%20%3D%20Pos%28cur%2Efrom%2Eline%20%2B%20diff%2C%20cur%2Efrom%2Ech%29%3B%0A%20%20%20%20%20%20%20%20%20%20cur%2Eto%20%3D%20Pos%28cur%2Eto%2Eline%20%2B%20diff%2C%20cur%2Eto%2Ech%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28from%20%3C%3D%20cur%2Eto%2Eline%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20ok%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28%21ok%29%20%7B%0A%20%20%20%20%20%20%20%20array%2Esplice%280%2C%20i%20%2B%201%29%3B%0A%20%20%20%20%20%20%20%20i%20%3D%200%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20rebaseHist%28hist%2C%20change%29%20%7B%0A%20%20%20%20var%20from%20%3D%20change%2Efrom%2Eline%2C%20to%20%3D%20change%2Eto%2Eline%2C%20diff%20%3D%20change%2Etext%2Elength%20%2D%20%28to%20%2D%20from%29%20%2D%201%3B%0A%20%20%20%20rebaseHistArray%28hist%2Edone%2C%20from%2C%20to%2C%20diff%29%3B%0A%20%20%20%20rebaseHistArray%28hist%2Eundone%2C%20from%2C%20to%2C%20diff%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20EVENT%20UTILITIES%0A%0A%20%20%2F%2F%20Due%20to%20the%20fact%20that%20we%20still%20support%20jurassic%20IE%20versions%2C%20some%0A%20%20%2F%2F%20compatibility%20wrappers%20are%20needed%2E%0A%0A%20%20var%20e%5FpreventDefault%20%3D%20CodeMirror%2Ee%5FpreventDefault%20%3D%20function%28e%29%20%7B%0A%20%20%20%20if%20%28e%2EpreventDefault%29%20e%2EpreventDefault%28%29%3B%0A%20%20%20%20else%20e%2EreturnValue%20%3D%20false%3B%0A%20%20%7D%3B%0A%20%20var%20e%5FstopPropagation%20%3D%20CodeMirror%2Ee%5FstopPropagation%20%3D%20function%28e%29%20%7B%0A%20%20%20%20if%20%28e%2EstopPropagation%29%20e%2EstopPropagation%28%29%3B%0A%20%20%20%20else%20e%2EcancelBubble%20%3D%20true%3B%0A%20%20%7D%3B%0A%20%20function%20e%5FdefaultPrevented%28e%29%20%7B%0A%20%20%20%20return%20e%2EdefaultPrevented%20%21%3D%20null%20%3F%20e%2EdefaultPrevented%20%3A%20e%2EreturnValue%20%3D%3D%20false%3B%0A%20%20%7D%0A%20%20var%20e%5Fstop%20%3D%20CodeMirror%2Ee%5Fstop%20%3D%20function%28e%29%20%7Be%5FpreventDefault%28e%29%3B%20e%5FstopPropagation%28e%29%3B%7D%3B%0A%0A%20%20function%20e%5Ftarget%28e%29%20%7Breturn%20e%2Etarget%20%7C%7C%20e%2EsrcElement%3B%7D%0A%20%20function%20e%5Fbutton%28e%29%20%7B%0A%20%20%20%20var%20b%20%3D%20e%2Ewhich%3B%0A%20%20%20%20if%20%28b%20%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20if%20%28e%2Ebutton%20%26%201%29%20b%20%3D%201%3B%0A%20%20%20%20%20%20else%20if%20%28e%2Ebutton%20%26%202%29%20b%20%3D%203%3B%0A%20%20%20%20%20%20else%20if%20%28e%2Ebutton%20%26%204%29%20b%20%3D%202%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28mac%20%26%26%20e%2EctrlKey%20%26%26%20b%20%3D%3D%201%29%20b%20%3D%203%3B%0A%20%20%20%20return%20b%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20EVENT%20HANDLING%0A%0A%20%20%2F%2F%20Lightweight%20event%20framework%2E%20on%2Foff%20also%20work%20on%20DOM%20nodes%2C%0A%20%20%2F%2F%20registering%20native%20DOM%20handlers%2E%0A%0A%20%20var%20on%20%3D%20CodeMirror%2Eon%20%3D%20function%28emitter%2C%20type%2C%20f%29%20%7B%0A%20%20%20%20if%20%28emitter%2EaddEventListener%29%0A%20%20%20%20%20%20emitter%2EaddEventListener%28type%2C%20f%2C%20false%29%3B%0A%20%20%20%20else%20if%20%28emitter%2EattachEvent%29%0A%20%20%20%20%20%20emitter%2EattachEvent%28%22on%22%20%2B%20type%2C%20f%29%3B%0A%20%20%20%20else%20%7B%0A%20%20%20%20%20%20var%20map%20%3D%20emitter%2E%5Fhandlers%20%7C%7C%20%28emitter%2E%5Fhandlers%20%3D%20%7B%7D%29%3B%0A%20%20%20%20%20%20var%20arr%20%3D%20map%5Btype%5D%20%7C%7C%20%28map%5Btype%5D%20%3D%20%5B%5D%29%3B%0A%20%20%20%20%20%20arr%2Epush%28f%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20var%20noHandlers%20%3D%20%5B%5D%0A%20%20function%20getHandlers%28emitter%2C%20type%2C%20copy%29%20%7B%0A%20%20%20%20var%20arr%20%3D%20emitter%2E%5Fhandlers%20%26%26%20emitter%2E%5Fhandlers%5Btype%5D%0A%20%20%20%20if%20%28copy%29%20return%20arr%20%26%26%20arr%2Elength%20%3E%200%20%3F%20arr%2Eslice%28%29%20%3A%20noHandlers%0A%20%20%20%20else%20return%20arr%20%7C%7C%20noHandlers%0A%20%20%7D%0A%0A%20%20var%20off%20%3D%20CodeMirror%2Eoff%20%3D%20function%28emitter%2C%20type%2C%20f%29%20%7B%0A%20%20%20%20if%20%28emitter%2EremoveEventListener%29%0A%20%20%20%20%20%20emitter%2EremoveEventListener%28type%2C%20f%2C%20false%29%3B%0A%20%20%20%20else%20if%20%28emitter%2EdetachEvent%29%0A%20%20%20%20%20%20emitter%2EdetachEvent%28%22on%22%20%2B%20type%2C%20f%29%3B%0A%20%20%20%20else%20%7B%0A%20%20%20%20%20%20var%20handlers%20%3D%20getHandlers%28emitter%2C%20type%2C%20false%29%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20handlers%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20%20%20if%20%28handlers%5Bi%5D%20%3D%3D%20f%29%20%7B%20handlers%2Esplice%28i%2C%201%29%3B%20break%3B%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20var%20signal%20%3D%20CodeMirror%2Esignal%20%3D%20function%28emitter%2C%20type%20%2F%2A%2C%20values%2E%2E%2E%2A%2F%29%20%7B%0A%20%20%20%20var%20handlers%20%3D%20getHandlers%28emitter%2C%20type%2C%20true%29%0A%20%20%20%20if%20%28%21handlers%2Elength%29%20return%3B%0A%20%20%20%20var%20args%20%3D%20Array%2Eprototype%2Eslice%2Ecall%28arguments%2C%202%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20handlers%2Elength%3B%20%2B%2Bi%29%20handlers%5Bi%5D%2Eapply%28null%2C%20args%29%3B%0A%20%20%7D%3B%0A%0A%20%20var%20orphanDelayedCallbacks%20%3D%20null%3B%0A%0A%20%20%2F%2F%20Often%2C%20we%20want%20to%20signal%20events%20at%20a%20point%20where%20we%20are%20in%20the%0A%20%20%2F%2F%20middle%20of%20some%20work%2C%20but%20don%27t%20want%20the%20handler%20to%20start%20calling%0A%20%20%2F%2F%20other%20methods%20on%20the%20editor%2C%20which%20might%20be%20in%20an%20inconsistent%0A%20%20%2F%2F%20state%20or%20simply%20not%20expect%20any%20other%20events%20to%20happen%2E%0A%20%20%2F%2F%20signalLater%20looks%20whether%20there%20are%20any%20handlers%2C%20and%20schedules%0A%20%20%2F%2F%20them%20to%20be%20executed%20when%20the%20last%20operation%20ends%2C%20or%2C%20if%20no%0A%20%20%2F%2F%20operation%20is%20active%2C%20when%20a%20timeout%20fires%2E%0A%20%20function%20signalLater%28emitter%2C%20type%20%2F%2A%2C%20values%2E%2E%2E%2A%2F%29%20%7B%0A%20%20%20%20var%20arr%20%3D%20getHandlers%28emitter%2C%20type%2C%20false%29%0A%20%20%20%20if%20%28%21arr%2Elength%29%20return%3B%0A%20%20%20%20var%20args%20%3D%20Array%2Eprototype%2Eslice%2Ecall%28arguments%2C%202%29%2C%20list%3B%0A%20%20%20%20if%20%28operationGroup%29%20%7B%0A%20%20%20%20%20%20list%20%3D%20operationGroup%2EdelayedCallbacks%3B%0A%20%20%20%20%7D%20else%20if%20%28orphanDelayedCallbacks%29%20%7B%0A%20%20%20%20%20%20list%20%3D%20orphanDelayedCallbacks%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20list%20%3D%20orphanDelayedCallbacks%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20setTimeout%28fireOrphanDelayed%2C%200%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20function%20bnd%28f%29%20%7Breturn%20function%28%29%7Bf%2Eapply%28null%2C%20args%29%3B%7D%3B%7D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20arr%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20list%2Epush%28bnd%28arr%5Bi%5D%29%29%3B%0A%20%20%7D%0A%0A%20%20function%20fireOrphanDelayed%28%29%20%7B%0A%20%20%20%20var%20delayed%20%3D%20orphanDelayedCallbacks%3B%0A%20%20%20%20orphanDelayedCallbacks%20%3D%20null%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20delayed%2Elength%3B%20%2B%2Bi%29%20delayed%5Bi%5D%28%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20The%20DOM%20events%20that%20CodeMirror%20handles%20can%20be%20overridden%20by%0A%20%20%2F%2F%20registering%20a%20%28non%2DDOM%29%20handler%20on%20the%20editor%20for%20the%20event%20name%2C%0A%20%20%2F%2F%20and%20preventDefault%2Ding%20the%20event%20in%20that%20handler%2E%0A%20%20function%20signalDOMEvent%28cm%2C%20e%2C%20override%29%20%7B%0A%20%20%20%20if%20%28typeof%20e%20%3D%3D%20%22string%22%29%0A%20%20%20%20%20%20e%20%3D%20%7Btype%3A%20e%2C%20preventDefault%3A%20function%28%29%20%7B%20this%2EdefaultPrevented%20%3D%20true%3B%20%7D%7D%3B%0A%20%20%20%20signal%28cm%2C%20override%20%7C%7C%20e%2Etype%2C%20cm%2C%20e%29%3B%0A%20%20%20%20return%20e%5FdefaultPrevented%28e%29%20%7C%7C%20e%2EcodemirrorIgnore%3B%0A%20%20%7D%0A%0A%20%20function%20signalCursorActivity%28cm%29%20%7B%0A%20%20%20%20var%20arr%20%3D%20cm%2E%5Fhandlers%20%26%26%20cm%2E%5Fhandlers%2EcursorActivity%3B%0A%20%20%20%20if%20%28%21arr%29%20return%3B%0A%20%20%20%20var%20set%20%3D%20cm%2EcurOp%2EcursorActivityHandlers%20%7C%7C%20%28cm%2EcurOp%2EcursorActivityHandlers%20%3D%20%5B%5D%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20arr%2Elength%3B%20%2B%2Bi%29%20if%20%28indexOf%28set%2C%20arr%5Bi%5D%29%20%3D%3D%20%2D1%29%0A%20%20%20%20%20%20set%2Epush%28arr%5Bi%5D%29%3B%0A%20%20%7D%0A%0A%20%20function%20hasHandler%28emitter%2C%20type%29%20%7B%0A%20%20%20%20return%20getHandlers%28emitter%2C%20type%29%2Elength%20%3E%200%0A%20%20%7D%0A%0A%20%20%2F%2F%20Add%20on%20and%20off%20methods%20to%20a%20constructor%27s%20prototype%2C%20to%20make%0A%20%20%2F%2F%20registering%20events%20on%20such%20objects%20more%20convenient%2E%0A%20%20function%20eventMixin%28ctor%29%20%7B%0A%20%20%20%20ctor%2Eprototype%2Eon%20%3D%20function%28type%2C%20f%29%20%7Bon%28this%2C%20type%2C%20f%29%3B%7D%3B%0A%20%20%20%20ctor%2Eprototype%2Eoff%20%3D%20function%28type%2C%20f%29%20%7Boff%28this%2C%20type%2C%20f%29%3B%7D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20MISC%20UTILITIES%0A%0A%20%20%2F%2F%20Number%20of%20pixels%20added%20to%20scroller%20and%20sizer%20to%20hide%20scrollbar%0A%20%20var%20scrollerGap%20%3D%2030%3B%0A%0A%20%20%2F%2F%20Returned%20or%20thrown%20by%20various%20protocols%20to%20signal%20%27I%27m%20not%0A%20%20%2F%2F%20handling%20this%27%2E%0A%20%20var%20Pass%20%3D%20CodeMirror%2EPass%20%3D%20%7BtoString%3A%20function%28%29%7Breturn%20%22CodeMirror%2EPass%22%3B%7D%7D%3B%0A%0A%20%20%2F%2F%20Reused%20option%20objects%20for%20setSelection%20%26%20friends%0A%20%20var%20sel%5FdontScroll%20%3D%20%7Bscroll%3A%20false%7D%2C%20sel%5Fmouse%20%3D%20%7Borigin%3A%20%22%2Amouse%22%7D%2C%20sel%5Fmove%20%3D%20%7Borigin%3A%20%22%2Bmove%22%7D%3B%0A%0A%20%20function%20Delayed%28%29%20%7Bthis%2Eid%20%3D%20null%3B%7D%0A%20%20Delayed%2Eprototype%2Eset%20%3D%20function%28ms%2C%20f%29%20%7B%0A%20%20%20%20clearTimeout%28this%2Eid%29%3B%0A%20%20%20%20this%2Eid%20%3D%20setTimeout%28f%2C%20ms%29%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Counts%20the%20column%20offset%20in%20a%20string%2C%20taking%20tabs%20into%20account%2E%0A%20%20%2F%2F%20Used%20mostly%20to%20find%20indentation%2E%0A%20%20var%20countColumn%20%3D%20CodeMirror%2EcountColumn%20%3D%20function%28string%2C%20end%2C%20tabSize%2C%20startIndex%2C%20startValue%29%20%7B%0A%20%20%20%20if%20%28end%20%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20end%20%3D%20string%2Esearch%28%2F%5B%5E%5Cs%5Cu00a0%5D%2F%29%3B%0A%20%20%20%20%20%20if%20%28end%20%3D%3D%20%2D1%29%20end%20%3D%20string%2Elength%3B%0A%20%20%20%20%7D%0A%20%20%20%20for%20%28var%20i%20%3D%20startIndex%20%7C%7C%200%2C%20n%20%3D%20startValue%20%7C%7C%200%3B%3B%29%20%7B%0A%20%20%20%20%20%20var%20nextTab%20%3D%20string%2EindexOf%28%22%5Ct%22%2C%20i%29%3B%0A%20%20%20%20%20%20if%20%28nextTab%20%3C%200%20%7C%7C%20nextTab%20%3E%3D%20end%29%0A%20%20%20%20%20%20%20%20return%20n%20%2B%20%28end%20%2D%20i%29%3B%0A%20%20%20%20%20%20n%20%2B%3D%20nextTab%20%2D%20i%3B%0A%20%20%20%20%20%20n%20%2B%3D%20tabSize%20%2D%20%28n%20%25%20tabSize%29%3B%0A%20%20%20%20%20%20i%20%3D%20nextTab%20%2B%201%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20The%20inverse%20of%20countColumn%20%2D%2D%20find%20the%20offset%20that%20corresponds%20to%0A%20%20%2F%2F%20a%20particular%20column%2E%0A%20%20var%20findColumn%20%3D%20CodeMirror%2EfindColumn%20%3D%20function%28string%2C%20goal%2C%20tabSize%29%20%7B%0A%20%20%20%20for%20%28var%20pos%20%3D%200%2C%20col%20%3D%200%3B%3B%29%20%7B%0A%20%20%20%20%20%20var%20nextTab%20%3D%20string%2EindexOf%28%22%5Ct%22%2C%20pos%29%3B%0A%20%20%20%20%20%20if%20%28nextTab%20%3D%3D%20%2D1%29%20nextTab%20%3D%20string%2Elength%3B%0A%20%20%20%20%20%20var%20skipped%20%3D%20nextTab%20%2D%20pos%3B%0A%20%20%20%20%20%20if%20%28nextTab%20%3D%3D%20string%2Elength%20%7C%7C%20col%20%2B%20skipped%20%3E%3D%20goal%29%0A%20%20%20%20%20%20%20%20return%20pos%20%2B%20Math%2Emin%28skipped%2C%20goal%20%2D%20col%29%3B%0A%20%20%20%20%20%20col%20%2B%3D%20nextTab%20%2D%20pos%3B%0A%20%20%20%20%20%20col%20%2B%3D%20tabSize%20%2D%20%28col%20%25%20tabSize%29%3B%0A%20%20%20%20%20%20pos%20%3D%20nextTab%20%2B%201%3B%0A%20%20%20%20%20%20if%20%28col%20%3E%3D%20goal%29%20return%20pos%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20spaceStrs%20%3D%20%5B%22%22%5D%3B%0A%20%20function%20spaceStr%28n%29%20%7B%0A%20%20%20%20while%20%28spaceStrs%2Elength%20%3C%3D%20n%29%0A%20%20%20%20%20%20spaceStrs%2Epush%28lst%28spaceStrs%29%20%2B%20%22%20%22%29%3B%0A%20%20%20%20return%20spaceStrs%5Bn%5D%3B%0A%20%20%7D%0A%0A%20%20function%20lst%28arr%29%20%7B%20return%20arr%5Barr%2Elength%2D1%5D%3B%20%7D%0A%0A%20%20var%20selectInput%20%3D%20function%28node%29%20%7B%20node%2Eselect%28%29%3B%20%7D%3B%0A%20%20if%20%28ios%29%20%2F%2F%20Mobile%20Safari%20apparently%20has%20a%20bug%20where%20select%28%29%20is%20broken%2E%0A%20%20%20%20selectInput%20%3D%20function%28node%29%20%7B%20node%2EselectionStart%20%3D%200%3B%20node%2EselectionEnd%20%3D%20node%2Evalue%2Elength%3B%20%7D%3B%0A%20%20else%20if%20%28ie%29%20%2F%2F%20Suppress%20mysterious%20IE10%20errors%0A%20%20%20%20selectInput%20%3D%20function%28node%29%20%7B%20try%20%7B%20node%2Eselect%28%29%3B%20%7D%20catch%28%5Fe%29%20%7B%7D%20%7D%3B%0A%0A%20%20function%20indexOf%28array%2C%20elt%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20array%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20if%20%28array%5Bi%5D%20%3D%3D%20elt%29%20return%20i%3B%0A%20%20%20%20return%20%2D1%3B%0A%20%20%7D%0A%20%20function%20map%28array%2C%20f%29%20%7B%0A%20%20%20%20var%20out%20%3D%20%5B%5D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20array%2Elength%3B%20i%2B%2B%29%20out%5Bi%5D%20%3D%20f%28array%5Bi%5D%2C%20i%29%3B%0A%20%20%20%20return%20out%3B%0A%20%20%7D%0A%0A%20%20function%20nothing%28%29%20%7B%7D%0A%0A%20%20function%20createObj%28base%2C%20props%29%20%7B%0A%20%20%20%20var%20inst%3B%0A%20%20%20%20if%20%28Object%2Ecreate%29%20%7B%0A%20%20%20%20%20%20inst%20%3D%20Object%2Ecreate%28base%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20nothing%2Eprototype%20%3D%20base%3B%0A%20%20%20%20%20%20inst%20%3D%20new%20nothing%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28props%29%20copyObj%28props%2C%20inst%29%3B%0A%20%20%20%20return%20inst%3B%0A%20%20%7D%3B%0A%0A%20%20function%20copyObj%28obj%2C%20target%2C%20overwrite%29%20%7B%0A%20%20%20%20if%20%28%21target%29%20target%20%3D%20%7B%7D%3B%0A%20%20%20%20for%20%28var%20prop%20in%20obj%29%0A%20%20%20%20%20%20if%20%28obj%2EhasOwnProperty%28prop%29%20%26%26%20%28overwrite%20%21%3D%3D%20false%20%7C%7C%20%21target%2EhasOwnProperty%28prop%29%29%29%0A%20%20%20%20%20%20%20%20target%5Bprop%5D%20%3D%20obj%5Bprop%5D%3B%0A%20%20%20%20return%20target%3B%0A%20%20%7D%0A%0A%20%20function%20bind%28f%29%20%7B%0A%20%20%20%20var%20args%20%3D%20Array%2Eprototype%2Eslice%2Ecall%28arguments%2C%201%29%3B%0A%20%20%20%20return%20function%28%29%7Breturn%20f%2Eapply%28null%2C%20args%29%3B%7D%3B%0A%20%20%7D%0A%0A%20%20var%20nonASCIISingleCaseWordChar%20%3D%20%2F%5B%5Cu00df%5Cu0587%5Cu0590%2D%5Cu05f4%5Cu0600%2D%5Cu06ff%5Cu3040%2D%5Cu309f%5Cu30a0%2D%5Cu30ff%5Cu3400%2D%5Cu4db5%5Cu4e00%2D%5Cu9fcc%5Cuac00%2D%5Cud7af%5D%2F%3B%0A%20%20var%20isWordCharBasic%20%3D%20CodeMirror%2EisWordChar%20%3D%20function%28ch%29%20%7B%0A%20%20%20%20return%20%2F%5Cw%2F%2Etest%28ch%29%20%7C%7C%20ch%20%3E%20%22%5Cx80%22%20%26%26%0A%20%20%20%20%20%20%28ch%2EtoUpperCase%28%29%20%21%3D%20ch%2EtoLowerCase%28%29%20%7C%7C%20nonASCIISingleCaseWordChar%2Etest%28ch%29%29%3B%0A%20%20%7D%3B%0A%20%20function%20isWordChar%28ch%2C%20helper%29%20%7B%0A%20%20%20%20if%20%28%21helper%29%20return%20isWordCharBasic%28ch%29%3B%0A%20%20%20%20if%20%28helper%2Esource%2EindexOf%28%22%5C%5Cw%22%29%20%3E%20%2D1%20%26%26%20isWordCharBasic%28ch%29%29%20return%20true%3B%0A%20%20%20%20return%20helper%2Etest%28ch%29%3B%0A%20%20%7D%0A%0A%20%20function%20isEmpty%28obj%29%20%7B%0A%20%20%20%20for%20%28var%20n%20in%20obj%29%20if%20%28obj%2EhasOwnProperty%28n%29%20%26%26%20obj%5Bn%5D%29%20return%20false%3B%0A%20%20%20%20return%20true%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Extending%20unicode%20characters%2E%20A%20series%20of%20a%20non%2Dextending%20char%20%2B%0A%20%20%2F%2F%20any%20number%20of%20extending%20chars%20is%20treated%20as%20a%20single%20unit%20as%20far%0A%20%20%2F%2F%20as%20editing%20and%20measuring%20is%20concerned%2E%20This%20is%20not%20fully%20correct%2C%0A%20%20%2F%2F%20since%20some%20scripts%2Ffonts%2Fbrowsers%20also%20treat%20other%20configurations%0A%20%20%2F%2F%20of%20code%20points%20as%20a%20group%2E%0A%20%20var%20extendingChars%20%3D%20%2F%5B%5Cu0300%2D%5Cu036f%5Cu0483%2D%5Cu0489%5Cu0591%2D%5Cu05bd%5Cu05bf%5Cu05c1%5Cu05c2%5Cu05c4%5Cu05c5%5Cu05c7%5Cu0610%2D%5Cu061a%5Cu064b%2D%5Cu065e%5Cu0670%5Cu06d6%2D%5Cu06dc%5Cu06de%2D%5Cu06e4%5Cu06e7%5Cu06e8%5Cu06ea%2D%5Cu06ed%5Cu0711%5Cu0730%2D%5Cu074a%5Cu07a6%2D%5Cu07b0%5Cu07eb%2D%5Cu07f3%5Cu0816%2D%5Cu0819%5Cu081b%2D%5Cu0823%5Cu0825%2D%5Cu0827%5Cu0829%2D%5Cu082d%5Cu0900%2D%5Cu0902%5Cu093c%5Cu0941%2D%5Cu0948%5Cu094d%5Cu0951%2D%5Cu0955%5Cu0962%5Cu0963%5Cu0981%5Cu09bc%5Cu09be%5Cu09c1%2D%5Cu09c4%5Cu09cd%5Cu09d7%5Cu09e2%5Cu09e3%5Cu0a01%5Cu0a02%5Cu0a3c%5Cu0a41%5Cu0a42%5Cu0a47%5Cu0a48%5Cu0a4b%2D%5Cu0a4d%5Cu0a51%5Cu0a70%5Cu0a71%5Cu0a75%5Cu0a81%5Cu0a82%5Cu0abc%5Cu0ac1%2D%5Cu0ac5%5Cu0ac7%5Cu0ac8%5Cu0acd%5Cu0ae2%5Cu0ae3%5Cu0b01%5Cu0b3c%5Cu0b3e%5Cu0b3f%5Cu0b41%2D%5Cu0b44%5Cu0b4d%5Cu0b56%5Cu0b57%5Cu0b62%5Cu0b63%5Cu0b82%5Cu0bbe%5Cu0bc0%5Cu0bcd%5Cu0bd7%5Cu0c3e%2D%5Cu0c40%5Cu0c46%2D%5Cu0c48%5Cu0c4a%2D%5Cu0c4d%5Cu0c55%5Cu0c56%5Cu0c62%5Cu0c63%5Cu0cbc%5Cu0cbf%5Cu0cc2%5Cu0cc6%5Cu0ccc%5Cu0ccd%5Cu0cd5%5Cu0cd6%5Cu0ce2%5Cu0ce3%5Cu0d3e%5Cu0d41%2D%5Cu0d44%5Cu0d4d%5Cu0d57%5Cu0d62%5Cu0d63%5Cu0dca%5Cu0dcf%5Cu0dd2%2D%5Cu0dd4%5Cu0dd6%5Cu0ddf%5Cu0e31%5Cu0e34%2D%5Cu0e3a%5Cu0e47%2D%5Cu0e4e%5Cu0eb1%5Cu0eb4%2D%5Cu0eb9%5Cu0ebb%5Cu0ebc%5Cu0ec8%2D%5Cu0ecd%5Cu0f18%5Cu0f19%5Cu0f35%5Cu0f37%5Cu0f39%5Cu0f71%2D%5Cu0f7e%5Cu0f80%2D%5Cu0f84%5Cu0f86%5Cu0f87%5Cu0f90%2D%5Cu0f97%5Cu0f99%2D%5Cu0fbc%5Cu0fc6%5Cu102d%2D%5Cu1030%5Cu1032%2D%5Cu1037%5Cu1039%5Cu103a%5Cu103d%5Cu103e%5Cu1058%5Cu1059%5Cu105e%2D%5Cu1060%5Cu1071%2D%5Cu1074%5Cu1082%5Cu1085%5Cu1086%5Cu108d%5Cu109d%5Cu135f%5Cu1712%2D%5Cu1714%5Cu1732%2D%5Cu1734%5Cu1752%5Cu1753%5Cu1772%5Cu1773%5Cu17b7%2D%5Cu17bd%5Cu17c6%5Cu17c9%2D%5Cu17d3%5Cu17dd%5Cu180b%2D%5Cu180d%5Cu18a9%5Cu1920%2D%5Cu1922%5Cu1927%5Cu1928%5Cu1932%5Cu1939%2D%5Cu193b%5Cu1a17%5Cu1a18%5Cu1a56%5Cu1a58%2D%5Cu1a5e%5Cu1a60%5Cu1a62%5Cu1a65%2D%5Cu1a6c%5Cu1a73%2D%5Cu1a7c%5Cu1a7f%5Cu1b00%2D%5Cu1b03%5Cu1b34%5Cu1b36%2D%5Cu1b3a%5Cu1b3c%5Cu1b42%5Cu1b6b%2D%5Cu1b73%5Cu1b80%5Cu1b81%5Cu1ba2%2D%5Cu1ba5%5Cu1ba8%5Cu1ba9%5Cu1c2c%2D%5Cu1c33%5Cu1c36%5Cu1c37%5Cu1cd0%2D%5Cu1cd2%5Cu1cd4%2D%5Cu1ce0%5Cu1ce2%2D%5Cu1ce8%5Cu1ced%5Cu1dc0%2D%5Cu1de6%5Cu1dfd%2D%5Cu1dff%5Cu200c%5Cu200d%5Cu20d0%2D%5Cu20f0%5Cu2cef%2D%5Cu2cf1%5Cu2de0%2D%5Cu2dff%5Cu302a%2D%5Cu302f%5Cu3099%5Cu309a%5Cua66f%2D%5Cua672%5Cua67c%5Cua67d%5Cua6f0%5Cua6f1%5Cua802%5Cua806%5Cua80b%5Cua825%5Cua826%5Cua8c4%5Cua8e0%2D%5Cua8f1%5Cua926%2D%5Cua92d%5Cua947%2D%5Cua951%5Cua980%2D%5Cua982%5Cua9b3%5Cua9b6%2D%5Cua9b9%5Cua9bc%5Cuaa29%2D%5Cuaa2e%5Cuaa31%5Cuaa32%5Cuaa35%5Cuaa36%5Cuaa43%5Cuaa4c%5Cuaab0%5Cuaab2%2D%5Cuaab4%5Cuaab7%5Cuaab8%5Cuaabe%5Cuaabf%5Cuaac1%5Cuabe5%5Cuabe8%5Cuabed%5Cudc00%2D%5Cudfff%5Cufb1e%5Cufe00%2D%5Cufe0f%5Cufe20%2D%5Cufe26%5Cuff9e%5Cuff9f%5D%2F%3B%0A%20%20function%20isExtendingChar%28ch%29%20%7B%20return%20ch%2EcharCodeAt%280%29%20%3E%3D%20768%20%26%26%20extendingChars%2Etest%28ch%29%3B%20%7D%0A%0A%20%20%2F%2F%20DOM%20UTILITIES%0A%0A%20%20function%20elt%28tag%2C%20content%2C%20className%2C%20style%29%20%7B%0A%20%20%20%20var%20e%20%3D%20document%2EcreateElement%28tag%29%3B%0A%20%20%20%20if%20%28className%29%20e%2EclassName%20%3D%20className%3B%0A%20%20%20%20if%20%28style%29%20e%2Estyle%2EcssText%20%3D%20style%3B%0A%20%20%20%20if%20%28typeof%20content%20%3D%3D%20%22string%22%29%20e%2EappendChild%28document%2EcreateTextNode%28content%29%29%3B%0A%20%20%20%20else%20if%20%28content%29%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20content%2Elength%3B%20%2B%2Bi%29%20e%2EappendChild%28content%5Bi%5D%29%3B%0A%20%20%20%20return%20e%3B%0A%20%20%7D%0A%0A%20%20var%20range%3B%0A%20%20if%20%28document%2EcreateRange%29%20range%20%3D%20function%28node%2C%20start%2C%20end%2C%20endNode%29%20%7B%0A%20%20%20%20var%20r%20%3D%20document%2EcreateRange%28%29%3B%0A%20%20%20%20r%2EsetEnd%28endNode%20%7C%7C%20node%2C%20end%29%3B%0A%20%20%20%20r%2EsetStart%28node%2C%20start%29%3B%0A%20%20%20%20return%20r%3B%0A%20%20%7D%3B%0A%20%20else%20range%20%3D%20function%28node%2C%20start%2C%20end%29%20%7B%0A%20%20%20%20var%20r%20%3D%20document%2Ebody%2EcreateTextRange%28%29%3B%0A%20%20%20%20try%20%7B%20r%2EmoveToElementText%28node%2EparentNode%29%3B%20%7D%0A%20%20%20%20catch%28e%29%20%7B%20return%20r%3B%20%7D%0A%20%20%20%20r%2Ecollapse%28true%29%3B%0A%20%20%20%20r%2EmoveEnd%28%22character%22%2C%20end%29%3B%0A%20%20%20%20r%2EmoveStart%28%22character%22%2C%20start%29%3B%0A%20%20%20%20return%20r%3B%0A%20%20%7D%3B%0A%0A%20%20function%20removeChildren%28e%29%20%7B%0A%20%20%20%20for%20%28var%20count%20%3D%20e%2EchildNodes%2Elength%3B%20count%20%3E%200%3B%20%2D%2Dcount%29%0A%20%20%20%20%20%20e%2EremoveChild%28e%2EfirstChild%29%3B%0A%20%20%20%20return%20e%3B%0A%20%20%7D%0A%0A%20%20function%20removeChildrenAndAdd%28parent%2C%20e%29%20%7B%0A%20%20%20%20return%20removeChildren%28parent%29%2EappendChild%28e%29%3B%0A%20%20%7D%0A%0A%20%20var%20contains%20%3D%20CodeMirror%2Econtains%20%3D%20function%28parent%2C%20child%29%20%7B%0A%20%20%20%20if%20%28child%2EnodeType%20%3D%3D%203%29%20%2F%2F%20Android%20browser%20always%20returns%20false%20when%20child%20is%20a%20textnode%0A%20%20%20%20%20%20child%20%3D%20child%2EparentNode%3B%0A%20%20%20%20if%20%28parent%2Econtains%29%0A%20%20%20%20%20%20return%20parent%2Econtains%28child%29%3B%0A%20%20%20%20do%20%7B%0A%20%20%20%20%20%20if%20%28child%2EnodeType%20%3D%3D%2011%29%20child%20%3D%20child%2Ehost%3B%0A%20%20%20%20%20%20if%20%28child%20%3D%3D%20parent%29%20return%20true%3B%0A%20%20%20%20%7D%20while%20%28child%20%3D%20child%2EparentNode%29%3B%0A%20%20%7D%3B%0A%0A%20%20function%20activeElt%28%29%20%7B%0A%20%20%20%20var%20activeElement%20%3D%20document%2EactiveElement%3B%0A%20%20%20%20while%20%28activeElement%20%26%26%20activeElement%2Eroot%20%26%26%20activeElement%2Eroot%2EactiveElement%29%0A%20%20%20%20%20%20activeElement%20%3D%20activeElement%2Eroot%2EactiveElement%3B%0A%20%20%20%20return%20activeElement%3B%0A%20%20%7D%0A%20%20%2F%2F%20Older%20versions%20of%20IE%20throws%20unspecified%20error%20when%20touching%0A%20%20%2F%2F%20document%2EactiveElement%20in%20some%20cases%20%28during%20loading%2C%20in%20iframe%29%0A%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%2011%29%20activeElt%20%3D%20function%28%29%20%7B%0A%20%20%20%20try%20%7B%20return%20document%2EactiveElement%3B%20%7D%0A%20%20%20%20catch%28e%29%20%7B%20return%20document%2Ebody%3B%20%7D%0A%20%20%7D%3B%0A%0A%20%20function%20classTest%28cls%29%20%7B%20return%20new%20RegExp%28%22%28%5E%7C%5C%5Cs%29%22%20%2B%20cls%20%2B%20%22%28%3F%3A%24%7C%5C%5Cs%29%5C%5Cs%2A%22%29%3B%20%7D%0A%20%20var%20rmClass%20%3D%20CodeMirror%2ErmClass%20%3D%20function%28node%2C%20cls%29%20%7B%0A%20%20%20%20var%20current%20%3D%20node%2EclassName%3B%0A%20%20%20%20var%20match%20%3D%20classTest%28cls%29%2Eexec%28current%29%3B%0A%20%20%20%20if%20%28match%29%20%7B%0A%20%20%20%20%20%20var%20after%20%3D%20current%2Eslice%28match%2Eindex%20%2B%20match%5B0%5D%2Elength%29%3B%0A%20%20%20%20%20%20node%2EclassName%20%3D%20current%2Eslice%280%2C%20match%2Eindex%29%20%2B%20%28after%20%3F%20match%5B1%5D%20%2B%20after%20%3A%20%22%22%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%20%20var%20addClass%20%3D%20CodeMirror%2EaddClass%20%3D%20function%28node%2C%20cls%29%20%7B%0A%20%20%20%20var%20current%20%3D%20node%2EclassName%3B%0A%20%20%20%20if%20%28%21classTest%28cls%29%2Etest%28current%29%29%20node%2EclassName%20%2B%3D%20%28current%20%3F%20%22%20%22%20%3A%20%22%22%29%20%2B%20cls%3B%0A%20%20%7D%3B%0A%20%20function%20joinClasses%28a%2C%20b%29%20%7B%0A%20%20%20%20var%20as%20%3D%20a%2Esplit%28%22%20%22%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20as%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20if%20%28as%5Bi%5D%20%26%26%20%21classTest%28as%5Bi%5D%29%2Etest%28b%29%29%20b%20%2B%3D%20%22%20%22%20%2B%20as%5Bi%5D%3B%0A%20%20%20%20return%20b%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20WINDOW%2DWIDE%20EVENTS%0A%0A%20%20%2F%2F%20These%20must%20be%20handled%20carefully%2C%20because%20naively%20registering%20a%0A%20%20%2F%2F%20handler%20for%20each%20editor%20will%20cause%20the%20editors%20to%20never%20be%0A%20%20%2F%2F%20garbage%20collected%2E%0A%0A%20%20function%20forEachCodeMirror%28f%29%20%7B%0A%20%20%20%20if%20%28%21document%2Ebody%2EgetElementsByClassName%29%20return%3B%0A%20%20%20%20var%20byClass%20%3D%20document%2Ebody%2EgetElementsByClassName%28%22CodeMirror%22%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20byClass%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20cm%20%3D%20byClass%5Bi%5D%2ECodeMirror%3B%0A%20%20%20%20%20%20if%20%28cm%29%20f%28cm%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20globalsRegistered%20%3D%20false%3B%0A%20%20function%20ensureGlobalHandlers%28%29%20%7B%0A%20%20%20%20if%20%28globalsRegistered%29%20return%3B%0A%20%20%20%20registerGlobalHandlers%28%29%3B%0A%20%20%20%20globalsRegistered%20%3D%20true%3B%0A%20%20%7D%0A%20%20function%20registerGlobalHandlers%28%29%20%7B%0A%20%20%20%20%2F%2F%20When%20the%20window%20resizes%2C%20we%20need%20to%20refresh%20active%20editors%2E%0A%20%20%20%20var%20resizeTimer%3B%0A%20%20%20%20on%28window%2C%20%22resize%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28resizeTimer%20%3D%3D%20null%29%20resizeTimer%20%3D%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20resizeTimer%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20forEachCodeMirror%28onResize%29%3B%0A%20%20%20%20%20%20%7D%2C%20100%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20%2F%2F%20When%20the%20window%20loses%20focus%2C%20we%20want%20to%20show%20the%20editor%20as%20blurred%0A%20%20%20%20on%28window%2C%20%22blur%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20forEachCodeMirror%28onBlur%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20FEATURE%20DETECTION%0A%0A%20%20%2F%2F%20Detect%20drag%2Dand%2Ddrop%0A%20%20var%20dragAndDrop%20%3D%20function%28%29%20%7B%0A%20%20%20%20%2F%2F%20There%20is%20%2Asome%2A%20kind%20of%20drag%2Dand%2Ddrop%20support%20in%20IE6%2D8%2C%20but%20I%0A%20%20%20%20%2F%2F%20couldn%27t%20get%20it%20to%20work%20yet%2E%0A%20%20%20%20if%20%28ie%20%26%26%20ie%5Fversion%20%3C%209%29%20return%20false%3B%0A%20%20%20%20var%20div%20%3D%20elt%28%27div%27%29%3B%0A%20%20%20%20return%20%22draggable%22%20in%20div%20%7C%7C%20%22dragDrop%22%20in%20div%3B%0A%20%20%7D%28%29%3B%0A%0A%20%20var%20zwspSupported%3B%0A%20%20function%20zeroWidthElement%28measure%29%20%7B%0A%20%20%20%20if%20%28zwspSupported%20%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20var%20test%20%3D%20elt%28%22span%22%2C%20%22%5Cu200b%22%29%3B%0A%20%20%20%20%20%20removeChildrenAndAdd%28measure%2C%20elt%28%22span%22%2C%20%5Btest%2C%20document%2EcreateTextNode%28%22x%22%29%5D%29%29%3B%0A%20%20%20%20%20%20if%20%28measure%2EfirstChild%2EoffsetHeight%20%21%3D%200%29%0A%20%20%20%20%20%20%20%20zwspSupported%20%3D%20test%2EoffsetWidth%20%3C%3D%201%20%26%26%20test%2EoffsetHeight%20%3E%202%20%26%26%20%21%28ie%20%26%26%20ie%5Fversion%20%3C%208%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20node%20%3D%20zwspSupported%20%3F%20elt%28%22span%22%2C%20%22%5Cu200b%22%29%20%3A%0A%20%20%20%20%20%20elt%28%22span%22%2C%20%22%5Cu00a0%22%2C%20null%2C%20%22display%3A%20inline%2Dblock%3B%20width%3A%201px%3B%20margin%2Dright%3A%20%2D1px%22%29%3B%0A%20%20%20%20node%2EsetAttribute%28%22cm%2Dtext%22%2C%20%22%22%29%3B%0A%20%20%20%20return%20node%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Feature%2Ddetect%20IE%27s%20crummy%20client%20rect%20reporting%20for%20bidi%20text%0A%20%20var%20badBidiRects%3B%0A%20%20function%20hasBadBidiRects%28measure%29%20%7B%0A%20%20%20%20if%20%28badBidiRects%20%21%3D%20null%29%20return%20badBidiRects%3B%0A%20%20%20%20var%20txt%20%3D%20removeChildrenAndAdd%28measure%2C%20document%2EcreateTextNode%28%22A%5Cu062eA%22%29%29%3B%0A%20%20%20%20var%20r0%20%3D%20range%28txt%2C%200%2C%201%29%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20if%20%28%21r0%20%7C%7C%20r0%2Eleft%20%3D%3D%20r0%2Eright%29%20return%20false%3B%20%2F%2F%20Safari%20returns%20null%20in%20some%20cases%20%28%232780%29%0A%20%20%20%20var%20r1%20%3D%20range%28txt%2C%201%2C%202%29%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20return%20badBidiRects%20%3D%20%28r1%2Eright%20%2D%20r0%2Eright%20%3C%203%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20See%20if%20%22%22%2Esplit%20is%20the%20broken%20IE%20version%2C%20if%20so%2C%20provide%20an%0A%20%20%2F%2F%20alternative%20way%20to%20split%20lines%2E%0A%20%20var%20splitLinesAuto%20%3D%20CodeMirror%2EsplitLines%20%3D%20%22%5Cn%5Cnb%22%2Esplit%28%2F%5Cn%2F%29%2Elength%20%21%3D%203%20%3F%20function%28string%29%20%7B%0A%20%20%20%20var%20pos%20%3D%200%2C%20result%20%3D%20%5B%5D%2C%20l%20%3D%20string%2Elength%3B%0A%20%20%20%20while%20%28pos%20%3C%3D%20l%29%20%7B%0A%20%20%20%20%20%20var%20nl%20%3D%20string%2EindexOf%28%22%5Cn%22%2C%20pos%29%3B%0A%20%20%20%20%20%20if%20%28nl%20%3D%3D%20%2D1%29%20nl%20%3D%20string%2Elength%3B%0A%20%20%20%20%20%20var%20line%20%3D%20string%2Eslice%28pos%2C%20string%2EcharAt%28nl%20%2D%201%29%20%3D%3D%20%22%5Cr%22%20%3F%20nl%20%2D%201%20%3A%20nl%29%3B%0A%20%20%20%20%20%20var%20rt%20%3D%20line%2EindexOf%28%22%5Cr%22%29%3B%0A%20%20%20%20%20%20if%20%28rt%20%21%3D%20%2D1%29%20%7B%0A%20%20%20%20%20%20%20%20result%2Epush%28line%2Eslice%280%2C%20rt%29%29%3B%0A%20%20%20%20%20%20%20%20pos%20%2B%3D%20rt%20%2B%201%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20result%2Epush%28line%29%3B%0A%20%20%20%20%20%20%20%20pos%20%3D%20nl%20%2B%201%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20result%3B%0A%20%20%7D%20%3A%20function%28string%29%7Breturn%20string%2Esplit%28%2F%5Cr%5Cn%3F%7C%5Cn%2F%29%3B%7D%3B%0A%0A%20%20var%20hasSelection%20%3D%20window%2EgetSelection%20%3F%20function%28te%29%20%7B%0A%20%20%20%20try%20%7B%20return%20te%2EselectionStart%20%21%3D%20te%2EselectionEnd%3B%20%7D%0A%20%20%20%20catch%28e%29%20%7B%20return%20false%3B%20%7D%0A%20%20%7D%20%3A%20function%28te%29%20%7B%0A%20%20%20%20try%20%7Bvar%20range%20%3D%20te%2EownerDocument%2Eselection%2EcreateRange%28%29%3B%7D%0A%20%20%20%20catch%28e%29%20%7B%7D%0A%20%20%20%20if%20%28%21range%20%7C%7C%20range%2EparentElement%28%29%20%21%3D%20te%29%20return%20false%3B%0A%20%20%20%20return%20range%2EcompareEndPoints%28%22StartToEnd%22%2C%20range%29%20%21%3D%200%3B%0A%20%20%7D%3B%0A%0A%20%20var%20hasCopyEvent%20%3D%20%28function%28%29%20%7B%0A%20%20%20%20var%20e%20%3D%20elt%28%22div%22%29%3B%0A%20%20%20%20if%20%28%22oncopy%22%20in%20e%29%20return%20true%3B%0A%20%20%20%20e%2EsetAttribute%28%22oncopy%22%2C%20%22return%3B%22%29%3B%0A%20%20%20%20return%20typeof%20e%2Eoncopy%20%3D%3D%20%22function%22%3B%0A%20%20%7D%29%28%29%3B%0A%0A%20%20var%20badZoomedRects%20%3D%20null%3B%0A%20%20function%20hasBadZoomedRects%28measure%29%20%7B%0A%20%20%20%20if%20%28badZoomedRects%20%21%3D%20null%29%20return%20badZoomedRects%3B%0A%20%20%20%20var%20node%20%3D%20removeChildrenAndAdd%28measure%2C%20elt%28%22span%22%2C%20%22x%22%29%29%3B%0A%20%20%20%20var%20normal%20%3D%20node%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20var%20fromRange%20%3D%20range%28node%2C%200%2C%201%29%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20return%20badZoomedRects%20%3D%20Math%2Eabs%28normal%2Eleft%20%2D%20fromRange%2Eleft%29%20%3E%201%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20KEY%20NAMES%0A%0A%20%20var%20keyNames%20%3D%20CodeMirror%2EkeyNames%20%3D%20%7B%0A%20%20%20%203%3A%20%22Enter%22%2C%208%3A%20%22Backspace%22%2C%209%3A%20%22Tab%22%2C%2013%3A%20%22Enter%22%2C%2016%3A%20%22Shift%22%2C%2017%3A%20%22Ctrl%22%2C%2018%3A%20%22Alt%22%2C%0A%20%20%20%2019%3A%20%22Pause%22%2C%2020%3A%20%22CapsLock%22%2C%2027%3A%20%22Esc%22%2C%2032%3A%20%22Space%22%2C%2033%3A%20%22PageUp%22%2C%2034%3A%20%22PageDown%22%2C%2035%3A%20%22End%22%2C%0A%20%20%20%2036%3A%20%22Home%22%2C%2037%3A%20%22Left%22%2C%2038%3A%20%22Up%22%2C%2039%3A%20%22Right%22%2C%2040%3A%20%22Down%22%2C%2044%3A%20%22PrintScrn%22%2C%2045%3A%20%22Insert%22%2C%0A%20%20%20%2046%3A%20%22Delete%22%2C%2059%3A%20%22%3B%22%2C%2061%3A%20%22%3D%22%2C%2091%3A%20%22Mod%22%2C%2092%3A%20%22Mod%22%2C%2093%3A%20%22Mod%22%2C%0A%20%20%20%20106%3A%20%22%2A%22%2C%20107%3A%20%22%3D%22%2C%20109%3A%20%22%2D%22%2C%20110%3A%20%22%2E%22%2C%20111%3A%20%22%2F%22%2C%20127%3A%20%22Delete%22%2C%0A%20%20%20%20173%3A%20%22%2D%22%2C%20186%3A%20%22%3B%22%2C%20187%3A%20%22%3D%22%2C%20188%3A%20%22%2C%22%2C%20189%3A%20%22%2D%22%2C%20190%3A%20%22%2E%22%2C%20191%3A%20%22%2F%22%2C%20192%3A%20%22%60%22%2C%20219%3A%20%22%5B%22%2C%20220%3A%20%22%5C%5C%22%2C%0A%20%20%20%20221%3A%20%22%5D%22%2C%20222%3A%20%22%27%22%2C%2063232%3A%20%22Up%22%2C%2063233%3A%20%22Down%22%2C%2063234%3A%20%22Left%22%2C%2063235%3A%20%22Right%22%2C%2063272%3A%20%22Delete%22%2C%0A%20%20%20%2063273%3A%20%22Home%22%2C%2063275%3A%20%22End%22%2C%2063276%3A%20%22PageUp%22%2C%2063277%3A%20%22PageDown%22%2C%2063302%3A%20%22Insert%22%0A%20%20%7D%3B%0A%20%20%28function%28%29%20%7B%0A%20%20%20%20%2F%2F%20Number%20keys%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%2010%3B%20i%2B%2B%29%20keyNames%5Bi%20%2B%2048%5D%20%3D%20keyNames%5Bi%20%2B%2096%5D%20%3D%20String%28i%29%3B%0A%20%20%20%20%2F%2F%20Alphabetic%20keys%0A%20%20%20%20for%20%28var%20i%20%3D%2065%3B%20i%20%3C%3D%2090%3B%20i%2B%2B%29%20keyNames%5Bi%5D%20%3D%20String%2EfromCharCode%28i%29%3B%0A%20%20%20%20%2F%2F%20Function%20keys%0A%20%20%20%20for%20%28var%20i%20%3D%201%3B%20i%20%3C%3D%2012%3B%20i%2B%2B%29%20keyNames%5Bi%20%2B%20111%5D%20%3D%20keyNames%5Bi%20%2B%2063235%5D%20%3D%20%22F%22%20%2B%20i%3B%0A%20%20%7D%29%28%29%3B%0A%0A%20%20%2F%2F%20BIDI%20HELPERS%0A%0A%20%20function%20iterateBidiSections%28order%2C%20from%2C%20to%2C%20f%29%20%7B%0A%20%20%20%20if%20%28%21order%29%20return%20f%28from%2C%20to%2C%20%22ltr%22%29%3B%0A%20%20%20%20var%20found%20%3D%20false%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20order%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20part%20%3D%20order%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28part%2Efrom%20%3C%20to%20%26%26%20part%2Eto%20%3E%20from%20%7C%7C%20from%20%3D%3D%20to%20%26%26%20part%2Eto%20%3D%3D%20from%29%20%7B%0A%20%20%20%20%20%20%20%20f%28Math%2Emax%28part%2Efrom%2C%20from%29%2C%20Math%2Emin%28part%2Eto%2C%20to%29%2C%20part%2Elevel%20%3D%3D%201%20%3F%20%22rtl%22%20%3A%20%22ltr%22%29%3B%0A%20%20%20%20%20%20%20%20found%20%3D%20true%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28%21found%29%20f%28from%2C%20to%2C%20%22ltr%22%29%3B%0A%20%20%7D%0A%0A%20%20function%20bidiLeft%28part%29%20%7B%20return%20part%2Elevel%20%25%202%20%3F%20part%2Eto%20%3A%20part%2Efrom%3B%20%7D%0A%20%20function%20bidiRight%28part%29%20%7B%20return%20part%2Elevel%20%25%202%20%3F%20part%2Efrom%20%3A%20part%2Eto%3B%20%7D%0A%0A%20%20function%20lineLeft%28line%29%20%7B%20var%20order%20%3D%20getOrder%28line%29%3B%20return%20order%20%3F%20bidiLeft%28order%5B0%5D%29%20%3A%200%3B%20%7D%0A%20%20function%20lineRight%28line%29%20%7B%0A%20%20%20%20var%20order%20%3D%20getOrder%28line%29%3B%0A%20%20%20%20if%20%28%21order%29%20return%20line%2Etext%2Elength%3B%0A%20%20%20%20return%20bidiRight%28lst%28order%29%29%3B%0A%20%20%7D%0A%0A%20%20function%20lineStart%28cm%2C%20lineN%29%20%7B%0A%20%20%20%20var%20line%20%3D%20getLine%28cm%2Edoc%2C%20lineN%29%3B%0A%20%20%20%20var%20visual%20%3D%20visualLine%28line%29%3B%0A%20%20%20%20if%20%28visual%20%21%3D%20line%29%20lineN%20%3D%20lineNo%28visual%29%3B%0A%20%20%20%20var%20order%20%3D%20getOrder%28visual%29%3B%0A%20%20%20%20var%20ch%20%3D%20%21order%20%3F%200%20%3A%20order%5B0%5D%2Elevel%20%25%202%20%3F%20lineRight%28visual%29%20%3A%20lineLeft%28visual%29%3B%0A%20%20%20%20return%20Pos%28lineN%2C%20ch%29%3B%0A%20%20%7D%0A%20%20function%20lineEnd%28cm%2C%20lineN%29%20%7B%0A%20%20%20%20var%20merged%2C%20line%20%3D%20getLine%28cm%2Edoc%2C%20lineN%29%3B%0A%20%20%20%20while%20%28merged%20%3D%20collapsedSpanAtEnd%28line%29%29%20%7B%0A%20%20%20%20%20%20line%20%3D%20merged%2Efind%281%2C%20true%29%2Eline%3B%0A%20%20%20%20%20%20lineN%20%3D%20null%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20order%20%3D%20getOrder%28line%29%3B%0A%20%20%20%20var%20ch%20%3D%20%21order%20%3F%20line%2Etext%2Elength%20%3A%20order%5B0%5D%2Elevel%20%25%202%20%3F%20lineLeft%28line%29%20%3A%20lineRight%28line%29%3B%0A%20%20%20%20return%20Pos%28lineN%20%3D%3D%20null%20%3F%20lineNo%28line%29%20%3A%20lineN%2C%20ch%29%3B%0A%20%20%7D%0A%20%20function%20lineStartSmart%28cm%2C%20pos%29%20%7B%0A%20%20%20%20var%20start%20%3D%20lineStart%28cm%2C%20pos%2Eline%29%3B%0A%20%20%20%20var%20line%20%3D%20getLine%28cm%2Edoc%2C%20start%2Eline%29%3B%0A%20%20%20%20var%20order%20%3D%20getOrder%28line%29%3B%0A%20%20%20%20if%20%28%21order%20%7C%7C%20order%5B0%5D%2Elevel%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20var%20firstNonWS%20%3D%20Math%2Emax%280%2C%20line%2Etext%2Esearch%28%2F%5CS%2F%29%29%3B%0A%20%20%20%20%20%20var%20inWS%20%3D%20pos%2Eline%20%3D%3D%20start%2Eline%20%26%26%20pos%2Ech%20%3C%3D%20firstNonWS%20%26%26%20pos%2Ech%3B%0A%20%20%20%20%20%20return%20Pos%28start%2Eline%2C%20inWS%20%3F%200%20%3A%20firstNonWS%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20start%3B%0A%20%20%7D%0A%0A%20%20function%20compareBidiLevel%28order%2C%20a%2C%20b%29%20%7B%0A%20%20%20%20var%20linedir%20%3D%20order%5B0%5D%2Elevel%3B%0A%20%20%20%20if%20%28a%20%3D%3D%20linedir%29%20return%20true%3B%0A%20%20%20%20if%20%28b%20%3D%3D%20linedir%29%20return%20false%3B%0A%20%20%20%20return%20a%20%3C%20b%3B%0A%20%20%7D%0A%20%20var%20bidiOther%3B%0A%20%20function%20getBidiPartAt%28order%2C%20pos%29%20%7B%0A%20%20%20%20bidiOther%20%3D%20null%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%2C%20found%3B%20i%20%3C%20order%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20var%20cur%20%3D%20order%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28cur%2Efrom%20%3C%20pos%20%26%26%20cur%2Eto%20%3E%20pos%29%20return%20i%3B%0A%20%20%20%20%20%20if%20%28%28cur%2Efrom%20%3D%3D%20pos%20%7C%7C%20cur%2Eto%20%3D%3D%20pos%29%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28found%20%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20found%20%3D%20i%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28compareBidiLevel%28order%2C%20cur%2Elevel%2C%20order%5Bfound%5D%2Elevel%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28cur%2Efrom%20%21%3D%20cur%2Eto%29%20bidiOther%20%3D%20found%3B%0A%20%20%20%20%20%20%20%20%20%20return%20i%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28cur%2Efrom%20%21%3D%20cur%2Eto%29%20bidiOther%20%3D%20i%3B%0A%20%20%20%20%20%20%20%20%20%20return%20found%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20found%3B%0A%20%20%7D%0A%0A%20%20function%20moveInLine%28line%2C%20pos%2C%20dir%2C%20byUnit%29%20%7B%0A%20%20%20%20if%20%28%21byUnit%29%20return%20pos%20%2B%20dir%3B%0A%20%20%20%20do%20pos%20%2B%3D%20dir%3B%0A%20%20%20%20while%20%28pos%20%3E%200%20%26%26%20isExtendingChar%28line%2Etext%2EcharAt%28pos%29%29%29%3B%0A%20%20%20%20return%20pos%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20This%20is%20needed%20in%20order%20to%20move%20%27visually%27%20through%20bi%2Ddirectional%0A%20%20%2F%2F%20text%20%2D%2D%20i%2Ee%2E%2C%20pressing%20left%20should%20make%20the%20cursor%20go%20left%2C%20even%0A%20%20%2F%2F%20when%20in%20RTL%20text%2E%20The%20tricky%20part%20is%20the%20%27jumps%27%2C%20where%20RTL%20and%0A%20%20%2F%2F%20LTR%20text%20touch%20each%20other%2E%20This%20often%20requires%20the%20cursor%20offset%0A%20%20%2F%2F%20to%20move%20more%20than%20one%20unit%2C%20in%20order%20to%20visually%20move%20one%20unit%2E%0A%20%20function%20moveVisually%28line%2C%20start%2C%20dir%2C%20byUnit%29%20%7B%0A%20%20%20%20var%20bidi%20%3D%20getOrder%28line%29%3B%0A%20%20%20%20if%20%28%21bidi%29%20return%20moveLogically%28line%2C%20start%2C%20dir%2C%20byUnit%29%3B%0A%20%20%20%20var%20pos%20%3D%20getBidiPartAt%28bidi%2C%20start%29%2C%20part%20%3D%20bidi%5Bpos%5D%3B%0A%20%20%20%20var%20target%20%3D%20moveInLine%28line%2C%20start%2C%20part%2Elevel%20%25%202%20%3F%20%2Ddir%20%3A%20dir%2C%20byUnit%29%3B%0A%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20if%20%28target%20%3E%20part%2Efrom%20%26%26%20target%20%3C%20part%2Eto%29%20return%20target%3B%0A%20%20%20%20%20%20if%20%28target%20%3D%3D%20part%2Efrom%20%7C%7C%20target%20%3D%3D%20part%2Eto%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28getBidiPartAt%28bidi%2C%20target%29%20%3D%3D%20pos%29%20return%20target%3B%0A%20%20%20%20%20%20%20%20part%20%3D%20bidi%5Bpos%20%2B%3D%20dir%5D%3B%0A%20%20%20%20%20%20%20%20return%20%28dir%20%3E%200%29%20%3D%3D%20part%2Elevel%20%25%202%20%3F%20part%2Eto%20%3A%20part%2Efrom%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20part%20%3D%20bidi%5Bpos%20%2B%3D%20dir%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28%21part%29%20return%20null%3B%0A%20%20%20%20%20%20%20%20if%20%28%28dir%20%3E%200%29%20%3D%3D%20part%2Elevel%20%25%202%29%0A%20%20%20%20%20%20%20%20%20%20target%20%3D%20moveInLine%28line%2C%20part%2Eto%2C%20%2D1%2C%20byUnit%29%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20target%20%3D%20moveInLine%28line%2C%20part%2Efrom%2C%201%2C%20byUnit%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20moveLogically%28line%2C%20start%2C%20dir%2C%20byUnit%29%20%7B%0A%20%20%20%20var%20target%20%3D%20start%20%2B%20dir%3B%0A%20%20%20%20if%20%28byUnit%29%20while%20%28target%20%3E%200%20%26%26%20isExtendingChar%28line%2Etext%2EcharAt%28target%29%29%29%20target%20%2B%3D%20dir%3B%0A%20%20%20%20return%20target%20%3C%200%20%7C%7C%20target%20%3E%20line%2Etext%2Elength%20%3F%20null%20%3A%20target%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Bidirectional%20ordering%20algorithm%0A%20%20%2F%2F%20See%20http%3A%2F%2Funicode%2Eorg%2Freports%2Ftr9%2Ftr9%2D13%2Ehtml%20for%20the%20algorithm%0A%20%20%2F%2F%20that%20this%20%28partially%29%20implements%2E%0A%0A%20%20%2F%2F%20One%2Dchar%20codes%20used%20for%20character%20types%3A%0A%20%20%2F%2F%20L%20%28L%29%3A%20%20%20Left%2Dto%2DRight%0A%20%20%2F%2F%20R%20%28R%29%3A%20%20%20Right%2Dto%2DLeft%0A%20%20%2F%2F%20r%20%28AL%29%3A%20%20Right%2Dto%2DLeft%20Arabic%0A%20%20%2F%2F%201%20%28EN%29%3A%20%20European%20Number%0A%20%20%2F%2F%20%2B%20%28ES%29%3A%20%20European%20Number%20Separator%0A%20%20%2F%2F%20%25%20%28ET%29%3A%20%20European%20Number%20Terminator%0A%20%20%2F%2F%20n%20%28AN%29%3A%20%20Arabic%20Number%0A%20%20%2F%2F%20%2C%20%28CS%29%3A%20%20Common%20Number%20Separator%0A%20%20%2F%2F%20m%20%28NSM%29%3A%20Non%2DSpacing%20Mark%0A%20%20%2F%2F%20b%20%28BN%29%3A%20%20Boundary%20Neutral%0A%20%20%2F%2F%20s%20%28B%29%3A%20%20%20Paragraph%20Separator%0A%20%20%2F%2F%20t%20%28S%29%3A%20%20%20Segment%20Separator%0A%20%20%2F%2F%20w%20%28WS%29%3A%20%20Whitespace%0A%20%20%2F%2F%20N%20%28ON%29%3A%20%20Other%20Neutrals%0A%0A%20%20%2F%2F%20Returns%20null%20if%20characters%20are%20ordered%20as%20they%20appear%0A%20%20%2F%2F%20%28left%2Dto%2Dright%29%2C%20or%20an%20array%20of%20sections%20%28%7Bfrom%2C%20to%2C%20level%7D%0A%20%20%2F%2F%20objects%29%20in%20the%20order%20in%20which%20they%20occur%20visually%2E%0A%20%20var%20bidiOrdering%20%3D%20%28function%28%29%20%7B%0A%20%20%20%20%2F%2F%20Character%20types%20for%20codepoints%200%20to%200xff%0A%20%20%20%20var%20lowTypes%20%3D%20%22bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%25%25%25NNNNNN%2CN%2CN1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb%2CN%25%25%25%25NNNNLNNNNN%25%2511NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN%22%3B%0A%20%20%20%20%2F%2F%20Character%20types%20for%20codepoints%200x600%20to%200x6ff%0A%20%20%20%20var%20arabicTypes%20%3D%20%22rrrrrrrrrrrr%2CrNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%25nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm%22%3B%0A%20%20%20%20function%20charType%28code%29%20%7B%0A%20%20%20%20%20%20if%20%28code%20%3C%3D%200xf7%29%20return%20lowTypes%2EcharAt%28code%29%3B%0A%20%20%20%20%20%20else%20if%20%280x590%20%3C%3D%20code%20%26%26%20code%20%3C%3D%200x5f4%29%20return%20%22R%22%3B%0A%20%20%20%20%20%20else%20if%20%280x600%20%3C%3D%20code%20%26%26%20code%20%3C%3D%200x6ed%29%20return%20arabicTypes%2EcharAt%28code%20%2D%200x600%29%3B%0A%20%20%20%20%20%20else%20if%20%280x6ee%20%3C%3D%20code%20%26%26%20code%20%3C%3D%200x8ac%29%20return%20%22r%22%3B%0A%20%20%20%20%20%20else%20if%20%280x2000%20%3C%3D%20code%20%26%26%20code%20%3C%3D%200x200b%29%20return%20%22w%22%3B%0A%20%20%20%20%20%20else%20if%20%28code%20%3D%3D%200x200c%29%20return%20%22b%22%3B%0A%20%20%20%20%20%20else%20return%20%22L%22%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20bidiRE%20%3D%20%2F%5B%5Cu0590%2D%5Cu05f4%5Cu0600%2D%5Cu06ff%5Cu0700%2D%5Cu08ac%5D%2F%3B%0A%20%20%20%20var%20isNeutral%20%3D%20%2F%5BstwN%5D%2F%2C%20isStrong%20%3D%20%2F%5BLRr%5D%2F%2C%20countsAsLeft%20%3D%20%2F%5BLb1n%5D%2F%2C%20countsAsNum%20%3D%20%2F%5B1n%5D%2F%3B%0A%20%20%20%20%2F%2F%20Browsers%20seem%20to%20always%20treat%20the%20boundaries%20of%20block%20elements%20as%20being%20L%2E%0A%20%20%20%20var%20outerType%20%3D%20%22L%22%3B%0A%0A%20%20%20%20function%20BidiSpan%28level%2C%20from%2C%20to%29%20%7B%0A%20%20%20%20%20%20this%2Elevel%20%3D%20level%3B%0A%20%20%20%20%20%20this%2Efrom%20%3D%20from%3B%20this%2Eto%20%3D%20to%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20function%28str%29%20%7B%0A%20%20%20%20%20%20if%20%28%21bidiRE%2Etest%28str%29%29%20return%20false%3B%0A%20%20%20%20%20%20var%20len%20%3D%20str%2Elength%2C%20types%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%2C%20type%3B%20i%20%3C%20len%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20%20%20types%2Epush%28type%20%3D%20charType%28str%2EcharCodeAt%28i%29%29%29%3B%0A%0A%20%20%20%20%20%20%2F%2F%20W1%2E%20Examine%20each%20non%2Dspacing%20mark%20%28NSM%29%20in%20the%20level%20run%2C%20and%0A%20%20%20%20%20%20%2F%2F%20change%20the%20type%20of%20the%20NSM%20to%20the%20type%20of%20the%20previous%0A%20%20%20%20%20%20%2F%2F%20character%2E%20If%20the%20NSM%20is%20at%20the%20start%20of%20the%20level%20run%2C%20it%20will%0A%20%20%20%20%20%20%2F%2F%20get%20the%20type%20of%20sor%2E%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%2C%20prev%20%3D%20outerType%3B%20i%20%3C%20len%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20type%20%3D%20types%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28type%20%3D%3D%20%22m%22%29%20types%5Bi%5D%20%3D%20prev%3B%0A%20%20%20%20%20%20%20%20else%20prev%20%3D%20type%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20W2%2E%20Search%20backwards%20from%20each%20instance%20of%20a%20European%20number%0A%20%20%20%20%20%20%2F%2F%20until%20the%20first%20strong%20type%20%28R%2C%20L%2C%20AL%2C%20or%20sor%29%20is%20found%2E%20If%20an%0A%20%20%20%20%20%20%2F%2F%20AL%20is%20found%2C%20change%20the%20type%20of%20the%20European%20number%20to%20Arabic%0A%20%20%20%20%20%20%2F%2F%20number%2E%0A%20%20%20%20%20%20%2F%2F%20W3%2E%20Change%20all%20ALs%20to%20R%2E%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%2C%20cur%20%3D%20outerType%3B%20i%20%3C%20len%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20type%20%3D%20types%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28type%20%3D%3D%20%221%22%20%26%26%20cur%20%3D%3D%20%22r%22%29%20types%5Bi%5D%20%3D%20%22n%22%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28isStrong%2Etest%28type%29%29%20%7B%20cur%20%3D%20type%3B%20if%20%28type%20%3D%3D%20%22r%22%29%20types%5Bi%5D%20%3D%20%22R%22%3B%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20W4%2E%20A%20single%20European%20separator%20between%20two%20European%20numbers%0A%20%20%20%20%20%20%2F%2F%20changes%20to%20a%20European%20number%2E%20A%20single%20common%20separator%20between%0A%20%20%20%20%20%20%2F%2F%20two%20numbers%20of%20the%20same%20type%20changes%20to%20that%20type%2E%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%201%2C%20prev%20%3D%20types%5B0%5D%3B%20i%20%3C%20len%20%2D%201%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20type%20%3D%20types%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28type%20%3D%3D%20%22%2B%22%20%26%26%20prev%20%3D%3D%20%221%22%20%26%26%20types%5Bi%2B1%5D%20%3D%3D%20%221%22%29%20types%5Bi%5D%20%3D%20%221%22%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28type%20%3D%3D%20%22%2C%22%20%26%26%20prev%20%3D%3D%20types%5Bi%2B1%5D%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28prev%20%3D%3D%20%221%22%20%7C%7C%20prev%20%3D%3D%20%22n%22%29%29%20types%5Bi%5D%20%3D%20prev%3B%0A%20%20%20%20%20%20%20%20prev%20%3D%20type%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20W5%2E%20A%20sequence%20of%20European%20terminators%20adjacent%20to%20European%0A%20%20%20%20%20%20%2F%2F%20numbers%20changes%20to%20all%20European%20numbers%2E%0A%20%20%20%20%20%20%2F%2F%20W6%2E%20Otherwise%2C%20separators%20and%20terminators%20change%20to%20Other%0A%20%20%20%20%20%20%2F%2F%20Neutral%2E%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20len%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20type%20%3D%20types%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28type%20%3D%3D%20%22%2C%22%29%20types%5Bi%5D%20%3D%20%22N%22%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28type%20%3D%3D%20%22%25%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20end%20%3D%20i%20%2B%201%3B%20end%20%3C%20len%20%26%26%20types%5Bend%5D%20%3D%3D%20%22%25%22%3B%20%2B%2Bend%29%20%7B%7D%0A%20%20%20%20%20%20%20%20%20%20var%20replace%20%3D%20%28i%20%26%26%20types%5Bi%2D1%5D%20%3D%3D%20%22%21%22%29%20%7C%7C%20%28end%20%3C%20len%20%26%26%20types%5Bend%5D%20%3D%3D%20%221%22%29%20%3F%20%221%22%20%3A%20%22N%22%3B%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20j%20%3D%20i%3B%20j%20%3C%20end%3B%20%2B%2Bj%29%20types%5Bj%5D%20%3D%20replace%3B%0A%20%20%20%20%20%20%20%20%20%20i%20%3D%20end%20%2D%201%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20W7%2E%20Search%20backwards%20from%20each%20instance%20of%20a%20European%20number%0A%20%20%20%20%20%20%2F%2F%20until%20the%20first%20strong%20type%20%28R%2C%20L%2C%20or%20sor%29%20is%20found%2E%20If%20an%20L%20is%0A%20%20%20%20%20%20%2F%2F%20found%2C%20then%20change%20the%20type%20of%20the%20European%20number%20to%20L%2E%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%2C%20cur%20%3D%20outerType%3B%20i%20%3C%20len%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20type%20%3D%20types%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28cur%20%3D%3D%20%22L%22%20%26%26%20type%20%3D%3D%20%221%22%29%20types%5Bi%5D%20%3D%20%22L%22%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28isStrong%2Etest%28type%29%29%20cur%20%3D%20type%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20N1%2E%20A%20sequence%20of%20neutrals%20takes%20the%20direction%20of%20the%0A%20%20%20%20%20%20%2F%2F%20surrounding%20strong%20text%20if%20the%20text%20on%20both%20sides%20has%20the%20same%0A%20%20%20%20%20%20%2F%2F%20direction%2E%20European%20and%20Arabic%20numbers%20act%20as%20if%20they%20were%20R%20in%0A%20%20%20%20%20%20%2F%2F%20terms%20of%20their%20influence%20on%20neutrals%2E%20Start%2Dof%2Dlevel%2Drun%20%28sor%29%0A%20%20%20%20%20%20%2F%2F%20and%20end%2Dof%2Dlevel%2Drun%20%28eor%29%20are%20used%20at%20level%20run%20boundaries%2E%0A%20%20%20%20%20%20%2F%2F%20N2%2E%20Any%20remaining%20neutrals%20take%20the%20embedding%20direction%2E%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20len%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28isNeutral%2Etest%28types%5Bi%5D%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20end%20%3D%20i%20%2B%201%3B%20end%20%3C%20len%20%26%26%20isNeutral%2Etest%28types%5Bend%5D%29%3B%20%2B%2Bend%29%20%7B%7D%0A%20%20%20%20%20%20%20%20%20%20var%20before%20%3D%20%28i%20%3F%20types%5Bi%2D1%5D%20%3A%20outerType%29%20%3D%3D%20%22L%22%3B%0A%20%20%20%20%20%20%20%20%20%20var%20after%20%3D%20%28end%20%3C%20len%20%3F%20types%5Bend%5D%20%3A%20outerType%29%20%3D%3D%20%22L%22%3B%0A%20%20%20%20%20%20%20%20%20%20var%20replace%20%3D%20before%20%7C%7C%20after%20%3F%20%22L%22%20%3A%20%22R%22%3B%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20j%20%3D%20i%3B%20j%20%3C%20end%3B%20%2B%2Bj%29%20types%5Bj%5D%20%3D%20replace%3B%0A%20%20%20%20%20%20%20%20%20%20i%20%3D%20end%20%2D%201%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20Here%20we%20depart%20from%20the%20documented%20algorithm%2C%20in%20order%20to%20avoid%0A%20%20%20%20%20%20%2F%2F%20building%20up%20an%20actual%20levels%20array%2E%20Since%20there%20are%20only%20three%0A%20%20%20%20%20%20%2F%2F%20levels%20%280%2C%201%2C%202%29%20in%20an%20implementation%20that%20doesn%27t%20take%0A%20%20%20%20%20%20%2F%2F%20explicit%20embedding%20into%20account%2C%20we%20can%20build%20up%20the%20order%20on%0A%20%20%20%20%20%20%2F%2F%20the%20fly%2C%20without%20following%20the%20level%2Dbased%20algorithm%2E%0A%20%20%20%20%20%20var%20order%20%3D%20%5B%5D%2C%20m%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20len%3B%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28countsAsLeft%2Etest%28types%5Bi%5D%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20start%20%3D%20i%3B%0A%20%20%20%20%20%20%20%20%20%20for%20%28%2B%2Bi%3B%20i%20%3C%20len%20%26%26%20countsAsLeft%2Etest%28types%5Bi%5D%29%3B%20%2B%2Bi%29%20%7B%7D%0A%20%20%20%20%20%20%20%20%20%20order%2Epush%28new%20BidiSpan%280%2C%20start%2C%20i%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20pos%20%3D%20i%2C%20at%20%3D%20order%2Elength%3B%0A%20%20%20%20%20%20%20%20%20%20for%20%28%2B%2Bi%3B%20i%20%3C%20len%20%26%26%20types%5Bi%5D%20%21%3D%20%22L%22%3B%20%2B%2Bi%29%20%7B%7D%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20j%20%3D%20pos%3B%20j%20%3C%20i%3B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28countsAsNum%2Etest%28types%5Bj%5D%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28pos%20%3C%20j%29%20order%2Esplice%28at%2C%200%2C%20new%20BidiSpan%281%2C%20pos%2C%20j%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20nstart%20%3D%20j%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20%28%2B%2Bj%3B%20j%20%3C%20i%20%26%26%20countsAsNum%2Etest%28types%5Bj%5D%29%3B%20%2B%2Bj%29%20%7B%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20order%2Esplice%28at%2C%200%2C%20new%20BidiSpan%282%2C%20nstart%2C%20j%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20pos%20%3D%20j%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%2B%2Bj%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28pos%20%3C%20i%29%20order%2Esplice%28at%2C%200%2C%20new%20BidiSpan%281%2C%20pos%2C%20i%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28order%5B0%5D%2Elevel%20%3D%3D%201%20%26%26%20%28m%20%3D%20str%2Ematch%28%2F%5E%5Cs%2B%2F%29%29%29%20%7B%0A%20%20%20%20%20%20%20%20order%5B0%5D%2Efrom%20%3D%20m%5B0%5D%2Elength%3B%0A%20%20%20%20%20%20%20%20order%2Eunshift%28new%20BidiSpan%280%2C%200%2C%20m%5B0%5D%2Elength%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28lst%28order%29%2Elevel%20%3D%3D%201%20%26%26%20%28m%20%3D%20str%2Ematch%28%2F%5Cs%2B%24%2F%29%29%29%20%7B%0A%20%20%20%20%20%20%20%20lst%28order%29%2Eto%20%2D%3D%20m%5B0%5D%2Elength%3B%0A%20%20%20%20%20%20%20%20order%2Epush%28new%20BidiSpan%280%2C%20len%20%2D%20m%5B0%5D%2Elength%2C%20len%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28order%5B0%5D%2Elevel%20%3D%3D%202%29%0A%20%20%20%20%20%20%20%20order%2Eunshift%28new%20BidiSpan%281%2C%20order%5B0%5D%2Eto%2C%20order%5B0%5D%2Eto%29%29%3B%0A%20%20%20%20%20%20if%20%28order%5B0%5D%2Elevel%20%21%3D%20lst%28order%29%2Elevel%29%0A%20%20%20%20%20%20%20%20order%2Epush%28new%20BidiSpan%28order%5B0%5D%2Elevel%2C%20len%2C%20len%29%29%3B%0A%0A%20%20%20%20%20%20return%20order%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%29%28%29%3B%0A%0A%20%20%2F%2F%20THE%20END%0A%0A%20%20CodeMirror%2Eversion%20%3D%20%225%2E10%2E1%22%3B%0A%0A%20%20return%20CodeMirror%3B%0A%7D%29%3B%0A"></script>
<script src="data:application/x-javascript,HTMLWidgets%2Ewidget%28%7B%0A%0A%20%20name%3A%20%27codemirror%27%2C%0A%0A%20%20type%3A%20%27output%27%2C%0A%0A%20%20factory%3A%20function%28el%2C%20width%2C%20height%29%20%7B%0A%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20editor%20%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20renderValue%3A%20function%28x%29%20%7B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20el%2Estyle%2Eoverflow%20%3D%20%22scroll%22%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20var%20editor%20%3D%20CodeMirror%28el%2C%20x%29%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20this%2Eeditor%20%3D%20editor%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20resize%3A%20function%28width%2C%20height%29%20%7B%0A%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%0A%20%20%20%20%7D%3B%0A%0A%20%20%7D%0A%7D%29%3B"></script>
<script src="data:application/x-javascript,%2F%2F%20CodeMirror%2C%20copyright%20%28c%29%20by%20Marijn%20Haverbeke%20and%20others%0A%2F%2F%20Distributed%20under%20an%20MIT%20license%3A%20http%3A%2F%2Fcodemirror%2Enet%2FLICENSE%0A%0A%28function%28mod%29%20%7B%0A%20%20if%20%28typeof%20exports%20%3D%3D%20%22object%22%20%26%26%20typeof%20module%20%3D%3D%20%22object%22%29%20%2F%2F%20CommonJS%0A%20%20%20%20mod%28require%28%22%2E%2E%2F%2E%2E%2Flib%2Fcodemirror%22%29%29%3B%0A%20%20else%20if%20%28typeof%20define%20%3D%3D%20%22function%22%20%26%26%20define%2Eamd%29%20%2F%2F%20AMD%0A%20%20%20%20define%28%5B%22%2E%2E%2F%2E%2E%2Flib%2Fcodemirror%22%5D%2C%20mod%29%3B%0A%20%20else%20%2F%2F%20Plain%20browser%20env%0A%20%20%20%20mod%28CodeMirror%29%3B%0A%7D%29%28function%28CodeMirror%29%20%7B%0A%22use%20strict%22%3B%0A%0ACodeMirror%2EdefineMode%28%22r%22%2C%20function%28config%29%20%7B%0A%20%20function%20wordObj%28str%29%20%7B%0A%20%20%20%20var%20words%20%3D%20str%2Esplit%28%22%20%22%29%2C%20res%20%3D%20%7B%7D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20words%2Elength%3B%20%2B%2Bi%29%20res%5Bwords%5Bi%5D%5D%20%3D%20true%3B%0A%20%20%20%20return%20res%3B%0A%20%20%7D%0A%20%20var%20atoms%20%3D%20wordObj%28%22NULL%20NA%20Inf%20NaN%20NA%5Finteger%5F%20NA%5Freal%5F%20NA%5Fcomplex%5F%20NA%5Fcharacter%5F%22%29%3B%0A%20%20var%20builtins%20%3D%20wordObj%28%22list%20quote%20bquote%20eval%20return%20call%20parse%20deparse%22%29%3B%0A%20%20var%20keywords%20%3D%20wordObj%28%22if%20else%20repeat%20while%20function%20for%20in%20next%20break%22%29%3B%0A%20%20var%20blockkeywords%20%3D%20wordObj%28%22if%20else%20repeat%20while%20function%20for%22%29%3B%0A%20%20var%20opChars%20%3D%20%2F%5B%2B%5C%2D%2A%5C%2F%5E%3C%3E%3D%21%26%7C%7E%24%3A%5D%2F%3B%0A%20%20var%20curPunc%3B%0A%0A%20%20function%20tokenBase%28stream%2C%20state%29%20%7B%0A%20%20%20%20curPunc%20%3D%20null%3B%0A%20%20%20%20var%20ch%20%3D%20stream%2Enext%28%29%3B%0A%20%20%20%20if%20%28ch%20%3D%3D%20%22%23%22%29%20%7B%0A%20%20%20%20%20%20stream%2EskipToEnd%28%29%3B%0A%20%20%20%20%20%20return%20%22comment%22%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%220%22%20%26%26%20stream%2Eeat%28%22x%22%29%29%20%7B%0A%20%20%20%20%20%20stream%2EeatWhile%28%2F%5B%5Cda%2Df%5D%2Fi%29%3B%0A%20%20%20%20%20%20return%20%22number%22%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%2E%22%20%26%26%20stream%2Eeat%28%2F%5Cd%2F%29%29%20%7B%0A%20%20%20%20%20%20stream%2Ematch%28%2F%5Cd%2A%28%3F%3Ae%5B%2B%5C%2D%5D%3F%5Cd%2B%29%3F%2F%29%3B%0A%20%20%20%20%20%20return%20%22number%22%3B%0A%20%20%20%20%7D%20else%20if%20%28%2F%5Cd%2F%2Etest%28ch%29%29%20%7B%0A%20%20%20%20%20%20stream%2Ematch%28%2F%5Cd%2A%28%3F%3A%5C%2E%5Cd%2B%29%3F%28%3F%3Ae%5B%2B%5C%2D%5D%5Cd%2B%29%3FL%3F%2F%29%3B%0A%20%20%20%20%20%20return%20%22number%22%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%27%22%20%7C%7C%20ch%20%3D%3D%20%27%22%27%29%20%7B%0A%20%20%20%20%20%20state%2Etokenize%20%3D%20tokenString%28ch%29%3B%0A%20%20%20%20%20%20return%20%22string%22%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%2E%22%20%26%26%20stream%2Ematch%28%2F%2E%5B%2E%5Cd%5D%2B%2F%29%29%20%7B%0A%20%20%20%20%20%20return%20%22keyword%22%3B%0A%20%20%20%20%7D%20else%20if%20%28%2F%5B%5Cw%5C%2E%5D%2F%2Etest%28ch%29%20%26%26%20ch%20%21%3D%20%22%5F%22%29%20%7B%0A%20%20%20%20%20%20stream%2EeatWhile%28%2F%5B%5Cw%5C%2E%5D%2F%29%3B%0A%20%20%20%20%20%20var%20word%20%3D%20stream%2Ecurrent%28%29%3B%0A%20%20%20%20%20%20if%20%28atoms%2EpropertyIsEnumerable%28word%29%29%20return%20%22atom%22%3B%0A%20%20%20%20%20%20if%20%28keywords%2EpropertyIsEnumerable%28word%29%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Block%20keywords%20start%20new%20blocks%2C%20except%20%27else%20if%27%2C%20which%20only%20starts%0A%20%20%20%20%20%20%20%20%2F%2F%20one%20new%20block%20for%20the%20%27if%27%2C%20no%20block%20for%20the%20%27else%27%2E%0A%20%20%20%20%20%20%20%20if%20%28blockkeywords%2EpropertyIsEnumerable%28word%29%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%21stream%2Ematch%28%2F%5Cs%2Aif%28%5Cs%2B%7C%24%29%2F%2C%20false%29%29%0A%20%20%20%20%20%20%20%20%20%20curPunc%20%3D%20%22block%22%3B%0A%20%20%20%20%20%20%20%20return%20%22keyword%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28builtins%2EpropertyIsEnumerable%28word%29%29%20return%20%22builtin%22%3B%0A%20%20%20%20%20%20return%20%22variable%22%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%25%22%29%20%7B%0A%20%20%20%20%20%20if%20%28stream%2EskipTo%28%22%25%22%29%29%20stream%2Enext%28%29%3B%0A%20%20%20%20%20%20return%20%22variable%2D2%22%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%3C%22%20%26%26%20stream%2Eeat%28%22%2D%22%29%29%20%7B%0A%20%20%20%20%20%20return%20%22arrow%22%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%3D%22%20%26%26%20state%2Ectx%2EargList%29%20%7B%0A%20%20%20%20%20%20return%20%22arg%2Dis%22%3B%0A%20%20%20%20%7D%20else%20if%20%28opChars%2Etest%28ch%29%29%20%7B%0A%20%20%20%20%20%20if%20%28ch%20%3D%3D%20%22%24%22%29%20return%20%22dollar%22%3B%0A%20%20%20%20%20%20stream%2EeatWhile%28opChars%29%3B%0A%20%20%20%20%20%20return%20%22operator%22%3B%0A%20%20%20%20%7D%20else%20if%20%28%2F%5B%5C%28%5C%29%7B%7D%5C%5B%5C%5D%3B%5D%2F%2Etest%28ch%29%29%20%7B%0A%20%20%20%20%20%20curPunc%20%3D%20ch%3B%0A%20%20%20%20%20%20if%20%28ch%20%3D%3D%20%22%3B%22%29%20return%20%22semi%22%3B%0A%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20tokenString%28quote%29%20%7B%0A%20%20%20%20return%20function%28stream%2C%20state%29%20%7B%0A%20%20%20%20%20%20if%20%28stream%2Eeat%28%22%5C%5C%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20var%20ch%20%3D%20stream%2Enext%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28ch%20%3D%3D%20%22x%22%29%20stream%2Ematch%28%2F%5E%5Ba%2Df0%2D9%5D%7B2%7D%2Fi%29%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28%28ch%20%3D%3D%20%22u%22%20%7C%7C%20ch%20%3D%3D%20%22U%22%29%20%26%26%20stream%2Eeat%28%22%7B%22%29%20%26%26%20stream%2EskipTo%28%22%7D%22%29%29%20stream%2Enext%28%29%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28ch%20%3D%3D%20%22u%22%29%20stream%2Ematch%28%2F%5E%5Ba%2Df0%2D9%5D%7B4%7D%2Fi%29%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28ch%20%3D%3D%20%22U%22%29%20stream%2Ematch%28%2F%5E%5Ba%2Df0%2D9%5D%7B8%7D%2Fi%29%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28%2F%5B0%2D7%5D%2F%2Etest%28ch%29%29%20stream%2Ematch%28%2F%5E%5B0%2D7%5D%7B1%2C2%7D%2F%29%3B%0A%20%20%20%20%20%20%20%20return%20%22string%2D2%22%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20var%20next%3B%0A%20%20%20%20%20%20%20%20while%20%28%28next%20%3D%20stream%2Enext%28%29%29%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28next%20%3D%3D%20quote%29%20%7B%20state%2Etokenize%20%3D%20tokenBase%3B%20break%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28next%20%3D%3D%20%22%5C%5C%22%29%20%7B%20stream%2EbackUp%281%29%3B%20break%3B%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%22string%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20function%20push%28state%2C%20type%2C%20stream%29%20%7B%0A%20%20%20%20state%2Ectx%20%3D%20%7Btype%3A%20type%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20indent%3A%20state%2Eindent%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20align%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20column%3A%20stream%2Ecolumn%28%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prev%3A%20state%2Ectx%7D%3B%0A%20%20%7D%0A%20%20function%20pop%28state%29%20%7B%0A%20%20%20%20state%2Eindent%20%3D%20state%2Ectx%2Eindent%3B%0A%20%20%20%20state%2Ectx%20%3D%20state%2Ectx%2Eprev%3B%0A%20%20%7D%0A%0A%20%20return%20%7B%0A%20%20%20%20startState%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20return%20%7Btokenize%3A%20tokenBase%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ctx%3A%20%7Btype%3A%20%22top%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20indent%3A%20%2Dconfig%2EindentUnit%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20align%3A%20false%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20indent%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20afterIdent%3A%20false%7D%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20token%3A%20function%28stream%2C%20state%29%20%7B%0A%20%20%20%20%20%20if%20%28stream%2Esol%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28state%2Ectx%2Ealign%20%3D%3D%20null%29%20state%2Ectx%2Ealign%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20state%2Eindent%20%3D%20stream%2Eindentation%28%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28stream%2EeatSpace%28%29%29%20return%20null%3B%0A%20%20%20%20%20%20var%20style%20%3D%20state%2Etokenize%28stream%2C%20state%29%3B%0A%20%20%20%20%20%20if%20%28style%20%21%3D%20%22comment%22%20%26%26%20state%2Ectx%2Ealign%20%3D%3D%20null%29%20state%2Ectx%2Ealign%20%3D%20true%3B%0A%0A%20%20%20%20%20%20var%20ctype%20%3D%20state%2Ectx%2Etype%3B%0A%20%20%20%20%20%20if%20%28%28curPunc%20%3D%3D%20%22%3B%22%20%7C%7C%20curPunc%20%3D%3D%20%22%7B%22%20%7C%7C%20curPunc%20%3D%3D%20%22%7D%22%29%20%26%26%20ctype%20%3D%3D%20%22block%22%29%20pop%28state%29%3B%0A%20%20%20%20%20%20if%20%28curPunc%20%3D%3D%20%22%7B%22%29%20push%28state%2C%20%22%7D%22%2C%20stream%29%3B%0A%20%20%20%20%20%20else%20if%20%28curPunc%20%3D%3D%20%22%28%22%29%20%7B%0A%20%20%20%20%20%20%20%20push%28state%2C%20%22%29%22%2C%20stream%29%3B%0A%20%20%20%20%20%20%20%20if%20%28state%2EafterIdent%29%20state%2Ectx%2EargList%20%3D%20true%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20else%20if%20%28curPunc%20%3D%3D%20%22%5B%22%29%20push%28state%2C%20%22%5D%22%2C%20stream%29%3B%0A%20%20%20%20%20%20else%20if%20%28curPunc%20%3D%3D%20%22block%22%29%20push%28state%2C%20%22block%22%2C%20stream%29%3B%0A%20%20%20%20%20%20else%20if%20%28curPunc%20%3D%3D%20ctype%29%20pop%28state%29%3B%0A%20%20%20%20%20%20state%2EafterIdent%20%3D%20style%20%3D%3D%20%22variable%22%20%7C%7C%20style%20%3D%3D%20%22keyword%22%3B%0A%20%20%20%20%20%20return%20style%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20indent%3A%20function%28state%2C%20textAfter%29%20%7B%0A%20%20%20%20%20%20if%20%28state%2Etokenize%20%21%3D%20tokenBase%29%20return%200%3B%0A%20%20%20%20%20%20var%20firstChar%20%3D%20textAfter%20%26%26%20textAfter%2EcharAt%280%29%2C%20ctx%20%3D%20state%2Ectx%2C%0A%20%20%20%20%20%20%20%20%20%20closing%20%3D%20firstChar%20%3D%3D%20ctx%2Etype%3B%0A%20%20%20%20%20%20if%20%28ctx%2Etype%20%3D%3D%20%22block%22%29%20return%20ctx%2Eindent%20%2B%20%28firstChar%20%3D%3D%20%22%7B%22%20%3F%200%20%3A%20config%2EindentUnit%29%3B%0A%20%20%20%20%20%20else%20if%20%28ctx%2Ealign%29%20return%20ctx%2Ecolumn%20%2B%20%28closing%20%3F%200%20%3A%201%29%3B%0A%20%20%20%20%20%20else%20return%20ctx%2Eindent%20%2B%20%28closing%20%3F%200%20%3A%20config%2EindentUnit%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20lineComment%3A%20%22%23%22%0A%20%20%7D%3B%0A%7D%29%3B%0A%0ACodeMirror%2EdefineMIME%28%22text%2Fx%2Drsrc%22%2C%20%22r%22%29%3B%0A%0A%7D%29%3B%0A"></script>
<script src="data:application/x-javascript,%2F%2F%20CodeMirror%2C%20copyright%20%28c%29%20by%20Marijn%20Haverbeke%20and%20others%0A%2F%2F%20Distributed%20under%20an%20MIT%20license%3A%20http%3A%2F%2Fcodemirror%2Enet%2FLICENSE%0A%0A%2F%2F%20TODO%20actually%20recognize%20syntax%20of%20TypeScript%20constructs%0A%0A%28function%28mod%29%20%7B%0A%20%20if%20%28typeof%20exports%20%3D%3D%20%22object%22%20%26%26%20typeof%20module%20%3D%3D%20%22object%22%29%20%2F%2F%20CommonJS%0A%20%20%20%20mod%28require%28%22%2E%2E%2F%2E%2E%2Flib%2Fcodemirror%22%29%29%3B%0A%20%20else%20if%20%28typeof%20define%20%3D%3D%20%22function%22%20%26%26%20define%2Eamd%29%20%2F%2F%20AMD%0A%20%20%20%20define%28%5B%22%2E%2E%2F%2E%2E%2Flib%2Fcodemirror%22%5D%2C%20mod%29%3B%0A%20%20else%20%2F%2F%20Plain%20browser%20env%0A%20%20%20%20mod%28CodeMirror%29%3B%0A%7D%29%28function%28CodeMirror%29%20%7B%0A%22use%20strict%22%3B%0A%0Afunction%20expressionAllowed%28stream%2C%20state%2C%20backUp%29%20%7B%0A%20%20return%20%2F%5E%28%3F%3Aoperator%7Csof%7Ckeyword%20c%7Ccase%7Cnew%7C%5B%5C%5B%7B%7D%5C%28%2C%3B%3A%5D%7C%3D%3E%29%24%2F%2Etest%28state%2ElastType%29%20%7C%7C%0A%20%20%20%20%28state%2ElastType%20%3D%3D%20%22quasi%22%20%26%26%20%2F%5C%7B%5Cs%2A%24%2F%2Etest%28stream%2Estring%2Eslice%280%2C%20stream%2Epos%20%2D%20%28backUp%20%7C%7C%200%29%29%29%29%0A%7D%0A%0ACodeMirror%2EdefineMode%28%22javascript%22%2C%20function%28config%2C%20parserConfig%29%20%7B%0A%20%20var%20indentUnit%20%3D%20config%2EindentUnit%3B%0A%20%20var%20statementIndent%20%3D%20parserConfig%2EstatementIndent%3B%0A%20%20var%20jsonldMode%20%3D%20parserConfig%2Ejsonld%3B%0A%20%20var%20jsonMode%20%3D%20parserConfig%2Ejson%20%7C%7C%20jsonldMode%3B%0A%20%20var%20isTS%20%3D%20parserConfig%2Etypescript%3B%0A%20%20var%20wordRE%20%3D%20parserConfig%2EwordCharacters%20%7C%7C%20%2F%5B%5Cw%24%5Cxa1%2D%5Cuffff%5D%2F%3B%0A%0A%20%20%2F%2F%20Tokenizer%0A%0A%20%20var%20keywords%20%3D%20function%28%29%7B%0A%20%20%20%20function%20kw%28type%29%20%7Breturn%20%7Btype%3A%20type%2C%20style%3A%20%22keyword%22%7D%3B%7D%0A%20%20%20%20var%20A%20%3D%20kw%28%22keyword%20a%22%29%2C%20B%20%3D%20kw%28%22keyword%20b%22%29%2C%20C%20%3D%20kw%28%22keyword%20c%22%29%3B%0A%20%20%20%20var%20operator%20%3D%20kw%28%22operator%22%29%2C%20atom%20%3D%20%7Btype%3A%20%22atom%22%2C%20style%3A%20%22atom%22%7D%3B%0A%0A%20%20%20%20var%20jsKeywords%20%3D%20%7B%0A%20%20%20%20%20%20%22if%22%3A%20kw%28%22if%22%29%2C%20%22while%22%3A%20A%2C%20%22with%22%3A%20A%2C%20%22else%22%3A%20B%2C%20%22do%22%3A%20B%2C%20%22try%22%3A%20B%2C%20%22finally%22%3A%20B%2C%0A%20%20%20%20%20%20%22return%22%3A%20C%2C%20%22break%22%3A%20C%2C%20%22continue%22%3A%20C%2C%20%22new%22%3A%20kw%28%22new%22%29%2C%20%22delete%22%3A%20C%2C%20%22throw%22%3A%20C%2C%20%22debugger%22%3A%20C%2C%0A%20%20%20%20%20%20%22var%22%3A%20kw%28%22var%22%29%2C%20%22const%22%3A%20kw%28%22var%22%29%2C%20%22let%22%3A%20kw%28%22var%22%29%2C%0A%20%20%20%20%20%20%22function%22%3A%20kw%28%22function%22%29%2C%20%22catch%22%3A%20kw%28%22catch%22%29%2C%0A%20%20%20%20%20%20%22for%22%3A%20kw%28%22for%22%29%2C%20%22switch%22%3A%20kw%28%22switch%22%29%2C%20%22case%22%3A%20kw%28%22case%22%29%2C%20%22default%22%3A%20kw%28%22default%22%29%2C%0A%20%20%20%20%20%20%22in%22%3A%20operator%2C%20%22typeof%22%3A%20operator%2C%20%22instanceof%22%3A%20operator%2C%0A%20%20%20%20%20%20%22true%22%3A%20atom%2C%20%22false%22%3A%20atom%2C%20%22null%22%3A%20atom%2C%20%22undefined%22%3A%20atom%2C%20%22NaN%22%3A%20atom%2C%20%22Infinity%22%3A%20atom%2C%0A%20%20%20%20%20%20%22this%22%3A%20kw%28%22this%22%29%2C%20%22class%22%3A%20kw%28%22class%22%29%2C%20%22super%22%3A%20kw%28%22atom%22%29%2C%0A%20%20%20%20%20%20%22yield%22%3A%20C%2C%20%22export%22%3A%20kw%28%22export%22%29%2C%20%22import%22%3A%20kw%28%22import%22%29%2C%20%22extends%22%3A%20C%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20%2F%2F%20Extend%20the%20%27normal%27%20keywords%20with%20the%20TypeScript%20language%20extensions%0A%20%20%20%20if%20%28isTS%29%20%7B%0A%20%20%20%20%20%20var%20type%20%3D%20%7Btype%3A%20%22variable%22%2C%20style%3A%20%22variable%2D3%22%7D%3B%0A%20%20%20%20%20%20var%20tsKeywords%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20object%2Dlike%20things%0A%20%20%20%20%20%20%20%20%22interface%22%3A%20kw%28%22class%22%29%2C%0A%20%20%20%20%20%20%20%20%22implements%22%3A%20C%2C%0A%20%20%20%20%20%20%20%20%22namespace%22%3A%20C%2C%0A%20%20%20%20%20%20%20%20%22module%22%3A%20kw%28%22module%22%29%2C%0A%20%20%20%20%20%20%20%20%22enum%22%3A%20kw%28%22module%22%29%2C%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20scope%20modifiers%0A%20%20%20%20%20%20%20%20%22public%22%3A%20kw%28%22modifier%22%29%2C%0A%20%20%20%20%20%20%20%20%22private%22%3A%20kw%28%22modifier%22%29%2C%0A%20%20%20%20%20%20%20%20%22protected%22%3A%20kw%28%22modifier%22%29%2C%0A%20%20%20%20%20%20%20%20%22abstract%22%3A%20kw%28%22modifier%22%29%2C%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20operators%0A%20%20%20%20%20%20%20%20%22as%22%3A%20operator%2C%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20types%0A%20%20%20%20%20%20%20%20%22string%22%3A%20type%2C%20%22number%22%3A%20type%2C%20%22boolean%22%3A%20type%2C%20%22any%22%3A%20type%0A%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20for%20%28var%20attr%20in%20tsKeywords%29%20%7B%0A%20%20%20%20%20%20%20%20jsKeywords%5Battr%5D%20%3D%20tsKeywords%5Battr%5D%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20jsKeywords%3B%0A%20%20%7D%28%29%3B%0A%0A%20%20var%20isOperatorChar%20%3D%20%2F%5B%2B%5C%2D%2A%26%25%3D%3C%3E%21%3F%7C%7E%5E%5D%2F%3B%0A%20%20var%20isJsonldKeyword%20%3D%20%2F%5E%40%28context%7Cid%7Cvalue%7Clanguage%7Ctype%7Ccontainer%7Clist%7Cset%7Creverse%7Cindex%7Cbase%7Cvocab%7Cgraph%29%22%2F%3B%0A%0A%20%20function%20readRegexp%28stream%29%20%7B%0A%20%20%20%20var%20escaped%20%3D%20false%2C%20next%2C%20inSet%20%3D%20false%3B%0A%20%20%20%20while%20%28%28next%20%3D%20stream%2Enext%28%29%29%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20if%20%28%21escaped%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28next%20%3D%3D%20%22%2F%22%20%26%26%20%21inSet%29%20return%3B%0A%20%20%20%20%20%20%20%20if%20%28next%20%3D%3D%20%22%5B%22%29%20inSet%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28inSet%20%26%26%20next%20%3D%3D%20%22%5D%22%29%20inSet%20%3D%20false%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20escaped%20%3D%20%21escaped%20%26%26%20next%20%3D%3D%20%22%5C%5C%22%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Used%20as%20scratch%20variables%20to%20communicate%20multiple%20values%20without%0A%20%20%2F%2F%20consing%20up%20tons%20of%20objects%2E%0A%20%20var%20type%2C%20content%3B%0A%20%20function%20ret%28tp%2C%20style%2C%20cont%29%20%7B%0A%20%20%20%20type%20%3D%20tp%3B%20content%20%3D%20cont%3B%0A%20%20%20%20return%20style%3B%0A%20%20%7D%0A%20%20function%20tokenBase%28stream%2C%20state%29%20%7B%0A%20%20%20%20var%20ch%20%3D%20stream%2Enext%28%29%3B%0A%20%20%20%20if%20%28ch%20%3D%3D%20%27%22%27%20%7C%7C%20ch%20%3D%3D%20%22%27%22%29%20%7B%0A%20%20%20%20%20%20state%2Etokenize%20%3D%20tokenString%28ch%29%3B%0A%20%20%20%20%20%20return%20state%2Etokenize%28stream%2C%20state%29%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%2E%22%20%26%26%20stream%2Ematch%28%2F%5E%5Cd%2B%28%3F%3A%5BeE%5D%5B%2B%5C%2D%5D%3F%5Cd%2B%29%3F%2F%29%29%20%7B%0A%20%20%20%20%20%20return%20ret%28%22number%22%2C%20%22number%22%29%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%2E%22%20%26%26%20stream%2Ematch%28%22%2E%2E%22%29%29%20%7B%0A%20%20%20%20%20%20return%20ret%28%22spread%22%2C%20%22meta%22%29%3B%0A%20%20%20%20%7D%20else%20if%20%28%2F%5B%5C%5B%5C%5D%7B%7D%5C%28%5C%29%2C%3B%5C%3A%5C%2E%5D%2F%2Etest%28ch%29%29%20%7B%0A%20%20%20%20%20%20return%20ret%28ch%29%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%3D%22%20%26%26%20stream%2Eeat%28%22%3E%22%29%29%20%7B%0A%20%20%20%20%20%20return%20ret%28%22%3D%3E%22%2C%20%22operator%22%29%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%220%22%20%26%26%20stream%2Eeat%28%2Fx%2Fi%29%29%20%7B%0A%20%20%20%20%20%20stream%2EeatWhile%28%2F%5B%5Cda%2Df%5D%2Fi%29%3B%0A%20%20%20%20%20%20return%20ret%28%22number%22%2C%20%22number%22%29%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%220%22%20%26%26%20stream%2Eeat%28%2Fo%2Fi%29%29%20%7B%0A%20%20%20%20%20%20stream%2EeatWhile%28%2F%5B0%2D7%5D%2Fi%29%3B%0A%20%20%20%20%20%20return%20ret%28%22number%22%2C%20%22number%22%29%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%220%22%20%26%26%20stream%2Eeat%28%2Fb%2Fi%29%29%20%7B%0A%20%20%20%20%20%20stream%2EeatWhile%28%2F%5B01%5D%2Fi%29%3B%0A%20%20%20%20%20%20return%20ret%28%22number%22%2C%20%22number%22%29%3B%0A%20%20%20%20%7D%20else%20if%20%28%2F%5Cd%2F%2Etest%28ch%29%29%20%7B%0A%20%20%20%20%20%20stream%2Ematch%28%2F%5E%5Cd%2A%28%3F%3A%5C%2E%5Cd%2A%29%3F%28%3F%3A%5BeE%5D%5B%2B%5C%2D%5D%3F%5Cd%2B%29%3F%2F%29%3B%0A%20%20%20%20%20%20return%20ret%28%22number%22%2C%20%22number%22%29%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%2F%22%29%20%7B%0A%20%20%20%20%20%20if%20%28stream%2Eeat%28%22%2A%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20state%2Etokenize%20%3D%20tokenComment%3B%0A%20%20%20%20%20%20%20%20return%20tokenComment%28stream%2C%20state%29%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28stream%2Eeat%28%22%2F%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20stream%2EskipToEnd%28%29%3B%0A%20%20%20%20%20%20%20%20return%20ret%28%22comment%22%2C%20%22comment%22%29%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28expressionAllowed%28stream%2C%20state%2C%201%29%29%20%7B%0A%20%20%20%20%20%20%20%20readRegexp%28stream%29%3B%0A%20%20%20%20%20%20%20%20stream%2Ematch%28%2F%5E%5Cb%28%28%5Bgimyu%5D%29%28%3F%21%5Bgimyu%5D%2A%5C2%29%29%2B%5Cb%2F%29%3B%0A%20%20%20%20%20%20%20%20return%20ret%28%22regexp%22%2C%20%22string%2D2%22%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20stream%2EeatWhile%28isOperatorChar%29%3B%0A%20%20%20%20%20%20%20%20return%20ret%28%22operator%22%2C%20%22operator%22%2C%20stream%2Ecurrent%28%29%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%60%22%29%20%7B%0A%20%20%20%20%20%20state%2Etokenize%20%3D%20tokenQuasi%3B%0A%20%20%20%20%20%20return%20tokenQuasi%28stream%2C%20state%29%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%23%22%29%20%7B%0A%20%20%20%20%20%20stream%2EskipToEnd%28%29%3B%0A%20%20%20%20%20%20return%20ret%28%22error%22%2C%20%22error%22%29%3B%0A%20%20%20%20%7D%20else%20if%20%28isOperatorChar%2Etest%28ch%29%29%20%7B%0A%20%20%20%20%20%20stream%2EeatWhile%28isOperatorChar%29%3B%0A%20%20%20%20%20%20return%20ret%28%22operator%22%2C%20%22operator%22%2C%20stream%2Ecurrent%28%29%29%3B%0A%20%20%20%20%7D%20else%20if%20%28wordRE%2Etest%28ch%29%29%20%7B%0A%20%20%20%20%20%20stream%2EeatWhile%28wordRE%29%3B%0A%20%20%20%20%20%20var%20word%20%3D%20stream%2Ecurrent%28%29%2C%20known%20%3D%20keywords%2EpropertyIsEnumerable%28word%29%20%26%26%20keywords%5Bword%5D%3B%0A%20%20%20%20%20%20return%20%28known%20%26%26%20state%2ElastType%20%21%3D%20%22%2E%22%29%20%3F%20ret%28known%2Etype%2C%20known%2Estyle%2C%20word%29%20%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ret%28%22variable%22%2C%20%22variable%22%2C%20word%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20tokenString%28quote%29%20%7B%0A%20%20%20%20return%20function%28stream%2C%20state%29%20%7B%0A%20%20%20%20%20%20var%20escaped%20%3D%20false%2C%20next%3B%0A%20%20%20%20%20%20if%20%28jsonldMode%20%26%26%20stream%2Epeek%28%29%20%3D%3D%20%22%40%22%20%26%26%20stream%2Ematch%28isJsonldKeyword%29%29%7B%0A%20%20%20%20%20%20%20%20state%2Etokenize%20%3D%20tokenBase%3B%0A%20%20%20%20%20%20%20%20return%20ret%28%22jsonld%2Dkeyword%22%2C%20%22meta%22%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20while%20%28%28next%20%3D%20stream%2Enext%28%29%29%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28next%20%3D%3D%20quote%20%26%26%20%21escaped%29%20break%3B%0A%20%20%20%20%20%20%20%20escaped%20%3D%20%21escaped%20%26%26%20next%20%3D%3D%20%22%5C%5C%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28%21escaped%29%20state%2Etokenize%20%3D%20tokenBase%3B%0A%20%20%20%20%20%20return%20ret%28%22string%22%2C%20%22string%22%29%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20function%20tokenComment%28stream%2C%20state%29%20%7B%0A%20%20%20%20var%20maybeEnd%20%3D%20false%2C%20ch%3B%0A%20%20%20%20while%20%28ch%20%3D%20stream%2Enext%28%29%29%20%7B%0A%20%20%20%20%20%20if%20%28ch%20%3D%3D%20%22%2F%22%20%26%26%20maybeEnd%29%20%7B%0A%20%20%20%20%20%20%20%20state%2Etokenize%20%3D%20tokenBase%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20maybeEnd%20%3D%20%28ch%20%3D%3D%20%22%2A%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20ret%28%22comment%22%2C%20%22comment%22%29%3B%0A%20%20%7D%0A%0A%20%20function%20tokenQuasi%28stream%2C%20state%29%20%7B%0A%20%20%20%20var%20escaped%20%3D%20false%2C%20next%3B%0A%20%20%20%20while%20%28%28next%20%3D%20stream%2Enext%28%29%29%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20if%20%28%21escaped%20%26%26%20%28next%20%3D%3D%20%22%60%22%20%7C%7C%20next%20%3D%3D%20%22%24%22%20%26%26%20stream%2Eeat%28%22%7B%22%29%29%29%20%7B%0A%20%20%20%20%20%20%20%20state%2Etokenize%20%3D%20tokenBase%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20escaped%20%3D%20%21escaped%20%26%26%20next%20%3D%3D%20%22%5C%5C%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20ret%28%22quasi%22%2C%20%22string%2D2%22%2C%20stream%2Ecurrent%28%29%29%3B%0A%20%20%7D%0A%0A%20%20var%20brackets%20%3D%20%22%28%5B%7B%7D%5D%29%22%3B%0A%20%20%2F%2F%20This%20is%20a%20crude%20lookahead%20trick%20to%20try%20and%20notice%20that%20we%27re%0A%20%20%2F%2F%20parsing%20the%20argument%20patterns%20for%20a%20fat%2Darrow%20function%20before%20we%0A%20%20%2F%2F%20actually%20hit%20the%20arrow%20token%2E%20It%20only%20works%20if%20the%20arrow%20is%20on%0A%20%20%2F%2F%20the%20same%20line%20as%20the%20arguments%20and%20there%27s%20no%20strange%20noise%0A%20%20%2F%2F%20%28comments%29%20in%20between%2E%20Fallback%20is%20to%20only%20notice%20when%20we%20hit%20the%0A%20%20%2F%2F%20arrow%2C%20and%20not%20declare%20the%20arguments%20as%20locals%20for%20the%20arrow%0A%20%20%2F%2F%20body%2E%0A%20%20function%20findFatArrow%28stream%2C%20state%29%20%7B%0A%20%20%20%20if%20%28state%2EfatArrowAt%29%20state%2EfatArrowAt%20%3D%20null%3B%0A%20%20%20%20var%20arrow%20%3D%20stream%2Estring%2EindexOf%28%22%3D%3E%22%2C%20stream%2Estart%29%3B%0A%20%20%20%20if%20%28arrow%20%3C%200%29%20return%3B%0A%0A%20%20%20%20var%20depth%20%3D%200%2C%20sawSomething%20%3D%20false%3B%0A%20%20%20%20for%20%28var%20pos%20%3D%20arrow%20%2D%201%3B%20pos%20%3E%3D%200%3B%20%2D%2Dpos%29%20%7B%0A%20%20%20%20%20%20var%20ch%20%3D%20stream%2Estring%2EcharAt%28pos%29%3B%0A%20%20%20%20%20%20var%20bracket%20%3D%20brackets%2EindexOf%28ch%29%3B%0A%20%20%20%20%20%20if%20%28bracket%20%3E%3D%200%20%26%26%20bracket%20%3C%203%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21depth%29%20%7B%20%2B%2Bpos%3B%20break%3B%20%7D%0A%20%20%20%20%20%20%20%20if%20%28%2D%2Ddepth%20%3D%3D%200%29%20break%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28bracket%20%3E%3D%203%20%26%26%20bracket%20%3C%206%29%20%7B%0A%20%20%20%20%20%20%20%20%2B%2Bdepth%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28wordRE%2Etest%28ch%29%29%20%7B%0A%20%20%20%20%20%20%20%20sawSomething%20%3D%20true%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28%2F%5B%22%27%5C%2F%5D%2F%2Etest%28ch%29%29%20%7B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28sawSomething%20%26%26%20%21depth%29%20%7B%0A%20%20%20%20%20%20%20%20%2B%2Bpos%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28sawSomething%20%26%26%20%21depth%29%20state%2EfatArrowAt%20%3D%20pos%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Parser%0A%0A%20%20var%20atomicTypes%20%3D%20%7B%22atom%22%3A%20true%2C%20%22number%22%3A%20true%2C%20%22variable%22%3A%20true%2C%20%22string%22%3A%20true%2C%20%22regexp%22%3A%20true%2C%20%22this%22%3A%20true%2C%20%22jsonld%2Dkeyword%22%3A%20true%7D%3B%0A%0A%20%20function%20JSLexical%28indented%2C%20column%2C%20type%2C%20align%2C%20prev%2C%20info%29%20%7B%0A%20%20%20%20this%2Eindented%20%3D%20indented%3B%0A%20%20%20%20this%2Ecolumn%20%3D%20column%3B%0A%20%20%20%20this%2Etype%20%3D%20type%3B%0A%20%20%20%20this%2Eprev%20%3D%20prev%3B%0A%20%20%20%20this%2Einfo%20%3D%20info%3B%0A%20%20%20%20if%20%28align%20%21%3D%20null%29%20this%2Ealign%20%3D%20align%3B%0A%20%20%7D%0A%0A%20%20function%20inScope%28state%2C%20varname%29%20%7B%0A%20%20%20%20for%20%28var%20v%20%3D%20state%2ElocalVars%3B%20v%3B%20v%20%3D%20v%2Enext%29%0A%20%20%20%20%20%20if%20%28v%2Ename%20%3D%3D%20varname%29%20return%20true%3B%0A%20%20%20%20for%20%28var%20cx%20%3D%20state%2Econtext%3B%20cx%3B%20cx%20%3D%20cx%2Eprev%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20v%20%3D%20cx%2Evars%3B%20v%3B%20v%20%3D%20v%2Enext%29%0A%20%20%20%20%20%20%20%20if%20%28v%2Ename%20%3D%3D%20varname%29%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20parseJS%28state%2C%20style%2C%20type%2C%20content%2C%20stream%29%20%7B%0A%20%20%20%20var%20cc%20%3D%20state%2Ecc%3B%0A%20%20%20%20%2F%2F%20Communicate%20our%20context%20to%20the%20combinators%2E%0A%20%20%20%20%2F%2F%20%28Less%20wasteful%20than%20consing%20up%20a%20hundred%20closures%20on%20every%20call%2E%29%0A%20%20%20%20cx%2Estate%20%3D%20state%3B%20cx%2Estream%20%3D%20stream%3B%20cx%2Emarked%20%3D%20null%2C%20cx%2Ecc%20%3D%20cc%3B%20cx%2Estyle%20%3D%20style%3B%0A%0A%20%20%20%20if%20%28%21state%2Elexical%2EhasOwnProperty%28%22align%22%29%29%0A%20%20%20%20%20%20state%2Elexical%2Ealign%20%3D%20true%3B%0A%0A%20%20%20%20while%28true%29%20%7B%0A%20%20%20%20%20%20var%20combinator%20%3D%20cc%2Elength%20%3F%20cc%2Epop%28%29%20%3A%20jsonMode%20%3F%20expression%20%3A%20statement%3B%0A%20%20%20%20%20%20if%20%28combinator%28type%2C%20content%29%29%20%7B%0A%20%20%20%20%20%20%20%20while%28cc%2Elength%20%26%26%20cc%5Bcc%2Elength%20%2D%201%5D%2Elex%29%0A%20%20%20%20%20%20%20%20%20%20cc%2Epop%28%29%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28cx%2Emarked%29%20return%20cx%2Emarked%3B%0A%20%20%20%20%20%20%20%20if%20%28type%20%3D%3D%20%22variable%22%20%26%26%20inScope%28state%2C%20content%29%29%20return%20%22variable%2D2%22%3B%0A%20%20%20%20%20%20%20%20return%20style%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Combinator%20utils%0A%0A%20%20var%20cx%20%3D%20%7Bstate%3A%20null%2C%20column%3A%20null%2C%20marked%3A%20null%2C%20cc%3A%20null%7D%3B%0A%20%20function%20pass%28%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%20arguments%2Elength%20%2D%201%3B%20i%20%3E%3D%200%3B%20i%2D%2D%29%20cx%2Ecc%2Epush%28arguments%5Bi%5D%29%3B%0A%20%20%7D%0A%20%20function%20cont%28%29%20%7B%0A%20%20%20%20pass%2Eapply%28null%2C%20arguments%29%3B%0A%20%20%20%20return%20true%3B%0A%20%20%7D%0A%20%20function%20register%28varname%29%20%7B%0A%20%20%20%20function%20inList%28list%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20v%20%3D%20list%3B%20v%3B%20v%20%3D%20v%2Enext%29%0A%20%20%20%20%20%20%20%20if%20%28v%2Ename%20%3D%3D%20varname%29%20return%20true%3B%0A%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20state%20%3D%20cx%2Estate%3B%0A%20%20%20%20cx%2Emarked%20%3D%20%22def%22%3B%0A%20%20%20%20if%20%28state%2Econtext%29%20%7B%0A%20%20%20%20%20%20if%20%28inList%28state%2ElocalVars%29%29%20return%3B%0A%20%20%20%20%20%20state%2ElocalVars%20%3D%20%7Bname%3A%20varname%2C%20next%3A%20state%2ElocalVars%7D%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20if%20%28inList%28state%2EglobalVars%29%29%20return%3B%0A%20%20%20%20%20%20if%20%28parserConfig%2EglobalVars%29%0A%20%20%20%20%20%20%20%20state%2EglobalVars%20%3D%20%7Bname%3A%20varname%2C%20next%3A%20state%2EglobalVars%7D%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Combinators%0A%0A%20%20var%20defaultVars%20%3D%20%7Bname%3A%20%22this%22%2C%20next%3A%20%7Bname%3A%20%22arguments%22%7D%7D%3B%0A%20%20function%20pushcontext%28%29%20%7B%0A%20%20%20%20cx%2Estate%2Econtext%20%3D%20%7Bprev%3A%20cx%2Estate%2Econtext%2C%20vars%3A%20cx%2Estate%2ElocalVars%7D%3B%0A%20%20%20%20cx%2Estate%2ElocalVars%20%3D%20defaultVars%3B%0A%20%20%7D%0A%20%20function%20popcontext%28%29%20%7B%0A%20%20%20%20cx%2Estate%2ElocalVars%20%3D%20cx%2Estate%2Econtext%2Evars%3B%0A%20%20%20%20cx%2Estate%2Econtext%20%3D%20cx%2Estate%2Econtext%2Eprev%3B%0A%20%20%7D%0A%20%20function%20pushlex%28type%2C%20info%29%20%7B%0A%20%20%20%20var%20result%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20state%20%3D%20cx%2Estate%2C%20indent%20%3D%20state%2Eindented%3B%0A%20%20%20%20%20%20if%20%28state%2Elexical%2Etype%20%3D%3D%20%22stat%22%29%20indent%20%3D%20state%2Elexical%2Eindented%3B%0A%20%20%20%20%20%20else%20for%20%28var%20outer%20%3D%20state%2Elexical%3B%20outer%20%26%26%20outer%2Etype%20%3D%3D%20%22%29%22%20%26%26%20outer%2Ealign%3B%20outer%20%3D%20outer%2Eprev%29%0A%20%20%20%20%20%20%20%20indent%20%3D%20outer%2Eindented%3B%0A%20%20%20%20%20%20state%2Elexical%20%3D%20new%20JSLexical%28indent%2C%20cx%2Estream%2Ecolumn%28%29%2C%20type%2C%20null%2C%20state%2Elexical%2C%20info%29%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20result%2Elex%20%3D%20true%3B%0A%20%20%20%20return%20result%3B%0A%20%20%7D%0A%20%20function%20poplex%28%29%20%7B%0A%20%20%20%20var%20state%20%3D%20cx%2Estate%3B%0A%20%20%20%20if%20%28state%2Elexical%2Eprev%29%20%7B%0A%20%20%20%20%20%20if%20%28state%2Elexical%2Etype%20%3D%3D%20%22%29%22%29%0A%20%20%20%20%20%20%20%20state%2Eindented%20%3D%20state%2Elexical%2Eindented%3B%0A%20%20%20%20%20%20state%2Elexical%20%3D%20state%2Elexical%2Eprev%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20poplex%2Elex%20%3D%20true%3B%0A%0A%20%20function%20expect%28wanted%29%20%7B%0A%20%20%20%20function%20exp%28type%29%20%7B%0A%20%20%20%20%20%20if%20%28type%20%3D%3D%20wanted%29%20return%20cont%28%29%3B%0A%20%20%20%20%20%20else%20if%20%28wanted%20%3D%3D%20%22%3B%22%29%20return%20pass%28%29%3B%0A%20%20%20%20%20%20else%20return%20cont%28exp%29%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20return%20exp%3B%0A%20%20%7D%0A%0A%20%20function%20statement%28type%2C%20value%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22var%22%29%20return%20cont%28pushlex%28%22vardef%22%2C%20value%2Elength%29%2C%20vardef%2C%20expect%28%22%3B%22%29%2C%20poplex%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22keyword%20a%22%29%20return%20cont%28pushlex%28%22form%22%29%2C%20expression%2C%20statement%2C%20poplex%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22keyword%20b%22%29%20return%20cont%28pushlex%28%22form%22%29%2C%20statement%2C%20poplex%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%7B%22%29%20return%20cont%28pushlex%28%22%7D%22%29%2C%20block%2C%20poplex%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%3B%22%29%20return%20cont%28%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22if%22%29%20%7B%0A%20%20%20%20%20%20if%20%28cx%2Estate%2Elexical%2Einfo%20%3D%3D%20%22else%22%20%26%26%20cx%2Estate%2Ecc%5Bcx%2Estate%2Ecc%2Elength%20%2D%201%5D%20%3D%3D%20poplex%29%0A%20%20%20%20%20%20%20%20cx%2Estate%2Ecc%2Epop%28%29%28%29%3B%0A%20%20%20%20%20%20return%20cont%28pushlex%28%22form%22%29%2C%20expression%2C%20statement%2C%20poplex%2C%20maybeelse%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28type%20%3D%3D%20%22function%22%29%20return%20cont%28functiondef%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22for%22%29%20return%20cont%28pushlex%28%22form%22%29%2C%20forspec%2C%20statement%2C%20poplex%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22variable%22%29%20return%20cont%28pushlex%28%22stat%22%29%2C%20maybelabel%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22switch%22%29%20return%20cont%28pushlex%28%22form%22%29%2C%20expression%2C%20pushlex%28%22%7D%22%2C%20%22switch%22%29%2C%20expect%28%22%7B%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20block%2C%20poplex%2C%20poplex%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22case%22%29%20return%20cont%28expression%2C%20expect%28%22%3A%22%29%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22default%22%29%20return%20cont%28expect%28%22%3A%22%29%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22catch%22%29%20return%20cont%28pushlex%28%22form%22%29%2C%20pushcontext%2C%20expect%28%22%28%22%29%2C%20funarg%2C%20expect%28%22%29%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20statement%2C%20poplex%2C%20popcontext%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22class%22%29%20return%20cont%28pushlex%28%22form%22%29%2C%20className%2C%20poplex%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22export%22%29%20return%20cont%28pushlex%28%22stat%22%29%2C%20afterExport%2C%20poplex%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22import%22%29%20return%20cont%28pushlex%28%22stat%22%29%2C%20afterImport%2C%20poplex%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22module%22%29%20return%20cont%28pushlex%28%22form%22%29%2C%20pattern%2C%20pushlex%28%22%7D%22%29%2C%20expect%28%22%7B%22%29%2C%20block%2C%20poplex%2C%20poplex%29%0A%20%20%20%20return%20pass%28pushlex%28%22stat%22%29%2C%20expression%2C%20expect%28%22%3B%22%29%2C%20poplex%29%3B%0A%20%20%7D%0A%20%20function%20expression%28type%29%20%7B%0A%20%20%20%20return%20expressionInner%28type%2C%20false%29%3B%0A%20%20%7D%0A%20%20function%20expressionNoComma%28type%29%20%7B%0A%20%20%20%20return%20expressionInner%28type%2C%20true%29%3B%0A%20%20%7D%0A%20%20function%20expressionInner%28type%2C%20noComma%29%20%7B%0A%20%20%20%20if%20%28cx%2Estate%2EfatArrowAt%20%3D%3D%20cx%2Estream%2Estart%29%20%7B%0A%20%20%20%20%20%20var%20body%20%3D%20noComma%20%3F%20arrowBodyNoComma%20%3A%20arrowBody%3B%0A%20%20%20%20%20%20if%20%28type%20%3D%3D%20%22%28%22%29%20return%20cont%28pushcontext%2C%20pushlex%28%22%29%22%29%2C%20commasep%28pattern%2C%20%22%29%22%29%2C%20poplex%2C%20expect%28%22%3D%3E%22%29%2C%20body%2C%20popcontext%29%3B%0A%20%20%20%20%20%20else%20if%20%28type%20%3D%3D%20%22variable%22%29%20return%20pass%28pushcontext%2C%20pattern%2C%20expect%28%22%3D%3E%22%29%2C%20body%2C%20popcontext%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20maybeop%20%3D%20noComma%20%3F%20maybeoperatorNoComma%20%3A%20maybeoperatorComma%3B%0A%20%20%20%20if%20%28atomicTypes%2EhasOwnProperty%28type%29%29%20return%20cont%28maybeop%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22function%22%29%20return%20cont%28functiondef%2C%20maybeop%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22keyword%20c%22%29%20return%20cont%28noComma%20%3F%20maybeexpressionNoComma%20%3A%20maybeexpression%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%28%22%29%20return%20cont%28pushlex%28%22%29%22%29%2C%20maybeexpression%2C%20comprehension%2C%20expect%28%22%29%22%29%2C%20poplex%2C%20maybeop%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22operator%22%20%7C%7C%20type%20%3D%3D%20%22spread%22%29%20return%20cont%28noComma%20%3F%20expressionNoComma%20%3A%20expression%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%5B%22%29%20return%20cont%28pushlex%28%22%5D%22%29%2C%20arrayLiteral%2C%20poplex%2C%20maybeop%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%7B%22%29%20return%20contCommasep%28objprop%2C%20%22%7D%22%2C%20null%2C%20maybeop%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22quasi%22%29%20return%20pass%28quasi%2C%20maybeop%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22new%22%29%20return%20cont%28maybeTarget%28noComma%29%29%3B%0A%20%20%20%20return%20cont%28%29%3B%0A%20%20%7D%0A%20%20function%20maybeexpression%28type%29%20%7B%0A%20%20%20%20if%20%28type%2Ematch%28%2F%5B%3B%5C%7D%5C%29%5C%5D%2C%5D%2F%29%29%20return%20pass%28%29%3B%0A%20%20%20%20return%20pass%28expression%29%3B%0A%20%20%7D%0A%20%20function%20maybeexpressionNoComma%28type%29%20%7B%0A%20%20%20%20if%20%28type%2Ematch%28%2F%5B%3B%5C%7D%5C%29%5C%5D%2C%5D%2F%29%29%20return%20pass%28%29%3B%0A%20%20%20%20return%20pass%28expressionNoComma%29%3B%0A%20%20%7D%0A%0A%20%20function%20maybeoperatorComma%28type%2C%20value%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%2C%22%29%20return%20cont%28expression%29%3B%0A%20%20%20%20return%20maybeoperatorNoComma%28type%2C%20value%2C%20false%29%3B%0A%20%20%7D%0A%20%20function%20maybeoperatorNoComma%28type%2C%20value%2C%20noComma%29%20%7B%0A%20%20%20%20var%20me%20%3D%20noComma%20%3D%3D%20false%20%3F%20maybeoperatorComma%20%3A%20maybeoperatorNoComma%3B%0A%20%20%20%20var%20expr%20%3D%20noComma%20%3D%3D%20false%20%3F%20expression%20%3A%20expressionNoComma%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%3D%3E%22%29%20return%20cont%28pushcontext%2C%20noComma%20%3F%20arrowBodyNoComma%20%3A%20arrowBody%2C%20popcontext%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22operator%22%29%20%7B%0A%20%20%20%20%20%20if%20%28%2F%5C%2B%5C%2B%7C%2D%2D%2F%2Etest%28value%29%29%20return%20cont%28me%29%3B%0A%20%20%20%20%20%20if%20%28value%20%3D%3D%20%22%3F%22%29%20return%20cont%28expression%2C%20expect%28%22%3A%22%29%2C%20expr%29%3B%0A%20%20%20%20%20%20return%20cont%28expr%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28type%20%3D%3D%20%22quasi%22%29%20%7B%20return%20pass%28quasi%2C%20me%29%3B%20%7D%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%3B%22%29%20return%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%28%22%29%20return%20contCommasep%28expressionNoComma%2C%20%22%29%22%2C%20%22call%22%2C%20me%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%2E%22%29%20return%20cont%28property%2C%20me%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%5B%22%29%20return%20cont%28pushlex%28%22%5D%22%29%2C%20maybeexpression%2C%20expect%28%22%5D%22%29%2C%20poplex%2C%20me%29%3B%0A%20%20%7D%0A%20%20function%20quasi%28type%2C%20value%29%20%7B%0A%20%20%20%20if%20%28type%20%21%3D%20%22quasi%22%29%20return%20pass%28%29%3B%0A%20%20%20%20if%20%28value%2Eslice%28value%2Elength%20%2D%202%29%20%21%3D%20%22%24%7B%22%29%20return%20cont%28quasi%29%3B%0A%20%20%20%20return%20cont%28expression%2C%20continueQuasi%29%3B%0A%20%20%7D%0A%20%20function%20continueQuasi%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%7D%22%29%20%7B%0A%20%20%20%20%20%20cx%2Emarked%20%3D%20%22string%2D2%22%3B%0A%20%20%20%20%20%20cx%2Estate%2Etokenize%20%3D%20tokenQuasi%3B%0A%20%20%20%20%20%20return%20cont%28quasi%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20function%20arrowBody%28type%29%20%7B%0A%20%20%20%20findFatArrow%28cx%2Estream%2C%20cx%2Estate%29%3B%0A%20%20%20%20return%20pass%28type%20%3D%3D%20%22%7B%22%20%3F%20statement%20%3A%20expression%29%3B%0A%20%20%7D%0A%20%20function%20arrowBodyNoComma%28type%29%20%7B%0A%20%20%20%20findFatArrow%28cx%2Estream%2C%20cx%2Estate%29%3B%0A%20%20%20%20return%20pass%28type%20%3D%3D%20%22%7B%22%20%3F%20statement%20%3A%20expressionNoComma%29%3B%0A%20%20%7D%0A%20%20function%20maybeTarget%28noComma%29%20%7B%0A%20%20%20%20return%20function%28type%29%20%7B%0A%20%20%20%20%20%20if%20%28type%20%3D%3D%20%22%2E%22%29%20return%20cont%28noComma%20%3F%20targetNoComma%20%3A%20target%29%3B%0A%20%20%20%20%20%20else%20return%20pass%28noComma%20%3F%20expressionNoComma%20%3A%20expression%29%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%20%20function%20target%28%5F%2C%20value%29%20%7B%0A%20%20%20%20if%20%28value%20%3D%3D%20%22target%22%29%20%7B%20cx%2Emarked%20%3D%20%22keyword%22%3B%20return%20cont%28maybeoperatorComma%29%3B%20%7D%0A%20%20%7D%0A%20%20function%20targetNoComma%28%5F%2C%20value%29%20%7B%0A%20%20%20%20if%20%28value%20%3D%3D%20%22target%22%29%20%7B%20cx%2Emarked%20%3D%20%22keyword%22%3B%20return%20cont%28maybeoperatorNoComma%29%3B%20%7D%0A%20%20%7D%0A%20%20function%20maybelabel%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%3A%22%29%20return%20cont%28poplex%2C%20statement%29%3B%0A%20%20%20%20return%20pass%28maybeoperatorComma%2C%20expect%28%22%3B%22%29%2C%20poplex%29%3B%0A%20%20%7D%0A%20%20function%20property%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22variable%22%29%20%7Bcx%2Emarked%20%3D%20%22property%22%3B%20return%20cont%28%29%3B%7D%0A%20%20%7D%0A%20%20function%20objprop%28type%2C%20value%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22variable%22%20%7C%7C%20cx%2Estyle%20%3D%3D%20%22keyword%22%29%20%7B%0A%20%20%20%20%20%20cx%2Emarked%20%3D%20%22property%22%3B%0A%20%20%20%20%20%20if%20%28value%20%3D%3D%20%22get%22%20%7C%7C%20value%20%3D%3D%20%22set%22%29%20return%20cont%28getterSetter%29%3B%0A%20%20%20%20%20%20return%20cont%28afterprop%29%3B%0A%20%20%20%20%7D%20else%20if%20%28type%20%3D%3D%20%22number%22%20%7C%7C%20type%20%3D%3D%20%22string%22%29%20%7B%0A%20%20%20%20%20%20cx%2Emarked%20%3D%20jsonldMode%20%3F%20%22property%22%20%3A%20%28cx%2Estyle%20%2B%20%22%20property%22%29%3B%0A%20%20%20%20%20%20return%20cont%28afterprop%29%3B%0A%20%20%20%20%7D%20else%20if%20%28type%20%3D%3D%20%22jsonld%2Dkeyword%22%29%20%7B%0A%20%20%20%20%20%20return%20cont%28afterprop%29%3B%0A%20%20%20%20%7D%20else%20if%20%28type%20%3D%3D%20%22modifier%22%29%20%7B%0A%20%20%20%20%20%20return%20cont%28objprop%29%0A%20%20%20%20%7D%20else%20if%20%28type%20%3D%3D%20%22%5B%22%29%20%7B%0A%20%20%20%20%20%20return%20cont%28expression%2C%20expect%28%22%5D%22%29%2C%20afterprop%29%3B%0A%20%20%20%20%7D%20else%20if%20%28type%20%3D%3D%20%22spread%22%29%20%7B%0A%20%20%20%20%20%20return%20cont%28expression%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20function%20getterSetter%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%21%3D%20%22variable%22%29%20return%20pass%28afterprop%29%3B%0A%20%20%20%20cx%2Emarked%20%3D%20%22property%22%3B%0A%20%20%20%20return%20cont%28functiondef%29%3B%0A%20%20%7D%0A%20%20function%20afterprop%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%3A%22%29%20return%20cont%28expressionNoComma%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%28%22%29%20return%20pass%28functiondef%29%3B%0A%20%20%7D%0A%20%20function%20commasep%28what%2C%20end%29%20%7B%0A%20%20%20%20function%20proceed%28type%29%20%7B%0A%20%20%20%20%20%20if%20%28type%20%3D%3D%20%22%2C%22%29%20%7B%0A%20%20%20%20%20%20%20%20var%20lex%20%3D%20cx%2Estate%2Elexical%3B%0A%20%20%20%20%20%20%20%20if%20%28lex%2Einfo%20%3D%3D%20%22call%22%29%20lex%2Epos%20%3D%20%28lex%2Epos%20%7C%7C%200%29%20%2B%201%3B%0A%20%20%20%20%20%20%20%20return%20cont%28what%2C%20proceed%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28type%20%3D%3D%20end%29%20return%20cont%28%29%3B%0A%20%20%20%20%20%20return%20cont%28expect%28end%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20function%28type%29%20%7B%0A%20%20%20%20%20%20if%20%28type%20%3D%3D%20end%29%20return%20cont%28%29%3B%0A%20%20%20%20%20%20return%20pass%28what%2C%20proceed%29%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%20%20function%20contCommasep%28what%2C%20end%2C%20info%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%203%3B%20i%20%3C%20arguments%2Elength%3B%20i%2B%2B%29%0A%20%20%20%20%20%20cx%2Ecc%2Epush%28arguments%5Bi%5D%29%3B%0A%20%20%20%20return%20cont%28pushlex%28end%2C%20info%29%2C%20commasep%28what%2C%20end%29%2C%20poplex%29%3B%0A%20%20%7D%0A%20%20function%20block%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%7D%22%29%20return%20cont%28%29%3B%0A%20%20%20%20return%20pass%28statement%2C%20block%29%3B%0A%20%20%7D%0A%20%20function%20maybetype%28type%29%20%7B%0A%20%20%20%20if%20%28isTS%20%26%26%20type%20%3D%3D%20%22%3A%22%29%20return%20cont%28typedef%29%3B%0A%20%20%7D%0A%20%20function%20maybedefault%28%5F%2C%20value%29%20%7B%0A%20%20%20%20if%20%28value%20%3D%3D%20%22%3D%22%29%20return%20cont%28expressionNoComma%29%3B%0A%20%20%7D%0A%20%20function%20typedef%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22variable%22%29%20%7Bcx%2Emarked%20%3D%20%22variable%2D3%22%3B%20return%20cont%28%29%3B%7D%0A%20%20%7D%0A%20%20function%20vardef%28%29%20%7B%0A%20%20%20%20return%20pass%28pattern%2C%20maybetype%2C%20maybeAssign%2C%20vardefCont%29%3B%0A%20%20%7D%0A%20%20function%20pattern%28type%2C%20value%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22modifier%22%29%20return%20cont%28pattern%29%0A%20%20%20%20if%20%28type%20%3D%3D%20%22variable%22%29%20%7B%20register%28value%29%3B%20return%20cont%28%29%3B%20%7D%0A%20%20%20%20if%20%28type%20%3D%3D%20%22spread%22%29%20return%20cont%28pattern%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%5B%22%29%20return%20contCommasep%28pattern%2C%20%22%5D%22%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%7B%22%29%20return%20contCommasep%28proppattern%2C%20%22%7D%22%29%3B%0A%20%20%7D%0A%20%20function%20proppattern%28type%2C%20value%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22variable%22%20%26%26%20%21cx%2Estream%2Ematch%28%2F%5E%5Cs%2A%3A%2F%2C%20false%29%29%20%7B%0A%20%20%20%20%20%20register%28value%29%3B%0A%20%20%20%20%20%20return%20cont%28maybeAssign%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28type%20%3D%3D%20%22variable%22%29%20cx%2Emarked%20%3D%20%22property%22%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22spread%22%29%20return%20cont%28pattern%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%7D%22%29%20return%20pass%28%29%3B%0A%20%20%20%20return%20cont%28expect%28%22%3A%22%29%2C%20pattern%2C%20maybeAssign%29%3B%0A%20%20%7D%0A%20%20function%20maybeAssign%28%5Ftype%2C%20value%29%20%7B%0A%20%20%20%20if%20%28value%20%3D%3D%20%22%3D%22%29%20return%20cont%28expressionNoComma%29%3B%0A%20%20%7D%0A%20%20function%20vardefCont%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%2C%22%29%20return%20cont%28vardef%29%3B%0A%20%20%7D%0A%20%20function%20maybeelse%28type%2C%20value%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22keyword%20b%22%20%26%26%20value%20%3D%3D%20%22else%22%29%20return%20cont%28pushlex%28%22form%22%2C%20%22else%22%29%2C%20statement%2C%20poplex%29%3B%0A%20%20%7D%0A%20%20function%20forspec%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%28%22%29%20return%20cont%28pushlex%28%22%29%22%29%2C%20forspec1%2C%20expect%28%22%29%22%29%2C%20poplex%29%3B%0A%20%20%7D%0A%20%20function%20forspec1%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22var%22%29%20return%20cont%28vardef%2C%20expect%28%22%3B%22%29%2C%20forspec2%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%3B%22%29%20return%20cont%28forspec2%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22variable%22%29%20return%20cont%28formaybeinof%29%3B%0A%20%20%20%20return%20pass%28expression%2C%20expect%28%22%3B%22%29%2C%20forspec2%29%3B%0A%20%20%7D%0A%20%20function%20formaybeinof%28%5Ftype%2C%20value%29%20%7B%0A%20%20%20%20if%20%28value%20%3D%3D%20%22in%22%20%7C%7C%20value%20%3D%3D%20%22of%22%29%20%7B%20cx%2Emarked%20%3D%20%22keyword%22%3B%20return%20cont%28expression%29%3B%20%7D%0A%20%20%20%20return%20cont%28maybeoperatorComma%2C%20forspec2%29%3B%0A%20%20%7D%0A%20%20function%20forspec2%28type%2C%20value%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%3B%22%29%20return%20cont%28forspec3%29%3B%0A%20%20%20%20if%20%28value%20%3D%3D%20%22in%22%20%7C%7C%20value%20%3D%3D%20%22of%22%29%20%7B%20cx%2Emarked%20%3D%20%22keyword%22%3B%20return%20cont%28expression%29%3B%20%7D%0A%20%20%20%20return%20pass%28expression%2C%20expect%28%22%3B%22%29%2C%20forspec3%29%3B%0A%20%20%7D%0A%20%20function%20forspec3%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%21%3D%20%22%29%22%29%20cont%28expression%29%3B%0A%20%20%7D%0A%20%20function%20functiondef%28type%2C%20value%29%20%7B%0A%20%20%20%20if%20%28value%20%3D%3D%20%22%2A%22%29%20%7Bcx%2Emarked%20%3D%20%22keyword%22%3B%20return%20cont%28functiondef%29%3B%7D%0A%20%20%20%20if%20%28type%20%3D%3D%20%22variable%22%29%20%7Bregister%28value%29%3B%20return%20cont%28functiondef%29%3B%7D%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%28%22%29%20return%20cont%28pushcontext%2C%20pushlex%28%22%29%22%29%2C%20commasep%28funarg%2C%20%22%29%22%29%2C%20poplex%2C%20statement%2C%20popcontext%29%3B%0A%20%20%7D%0A%20%20function%20funarg%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22spread%22%29%20return%20cont%28funarg%29%3B%0A%20%20%20%20return%20pass%28pattern%2C%20maybetype%2C%20maybedefault%29%3B%0A%20%20%7D%0A%20%20function%20className%28type%2C%20value%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22variable%22%29%20%7Bregister%28value%29%3B%20return%20cont%28classNameAfter%29%3B%7D%0A%20%20%7D%0A%20%20function%20classNameAfter%28type%2C%20value%29%20%7B%0A%20%20%20%20if%20%28value%20%3D%3D%20%22extends%22%29%20return%20cont%28expression%2C%20classNameAfter%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%7B%22%29%20return%20cont%28pushlex%28%22%7D%22%29%2C%20classBody%2C%20poplex%29%3B%0A%20%20%7D%0A%20%20function%20classBody%28type%2C%20value%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22variable%22%20%7C%7C%20cx%2Estyle%20%3D%3D%20%22keyword%22%29%20%7B%0A%20%20%20%20%20%20if%20%28value%20%3D%3D%20%22static%22%29%20%7B%0A%20%20%20%20%20%20%20%20cx%2Emarked%20%3D%20%22keyword%22%3B%0A%20%20%20%20%20%20%20%20return%20cont%28classBody%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20cx%2Emarked%20%3D%20%22property%22%3B%0A%20%20%20%20%20%20if%20%28value%20%3D%3D%20%22get%22%20%7C%7C%20value%20%3D%3D%20%22set%22%29%20return%20cont%28classGetterSetter%2C%20functiondef%2C%20classBody%29%3B%0A%20%20%20%20%20%20return%20cont%28functiondef%2C%20classBody%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28value%20%3D%3D%20%22%2A%22%29%20%7B%0A%20%20%20%20%20%20cx%2Emarked%20%3D%20%22keyword%22%3B%0A%20%20%20%20%20%20return%20cont%28classBody%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%3B%22%29%20return%20cont%28classBody%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%7D%22%29%20return%20cont%28%29%3B%0A%20%20%7D%0A%20%20function%20classGetterSetter%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%21%3D%20%22variable%22%29%20return%20pass%28%29%3B%0A%20%20%20%20cx%2Emarked%20%3D%20%22property%22%3B%0A%20%20%20%20return%20cont%28%29%3B%0A%20%20%7D%0A%20%20function%20afterExport%28%5Ftype%2C%20value%29%20%7B%0A%20%20%20%20if%20%28value%20%3D%3D%20%22%2A%22%29%20%7B%20cx%2Emarked%20%3D%20%22keyword%22%3B%20return%20cont%28maybeFrom%2C%20expect%28%22%3B%22%29%29%3B%20%7D%0A%20%20%20%20if%20%28value%20%3D%3D%20%22default%22%29%20%7B%20cx%2Emarked%20%3D%20%22keyword%22%3B%20return%20cont%28expression%2C%20expect%28%22%3B%22%29%29%3B%20%7D%0A%20%20%20%20return%20pass%28statement%29%3B%0A%20%20%7D%0A%20%20function%20afterImport%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22string%22%29%20return%20cont%28%29%3B%0A%20%20%20%20return%20pass%28importSpec%2C%20maybeFrom%29%3B%0A%20%20%7D%0A%20%20function%20importSpec%28type%2C%20value%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%7B%22%29%20return%20contCommasep%28importSpec%2C%20%22%7D%22%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22variable%22%29%20register%28value%29%3B%0A%20%20%20%20if%20%28value%20%3D%3D%20%22%2A%22%29%20cx%2Emarked%20%3D%20%22keyword%22%3B%0A%20%20%20%20return%20cont%28maybeAs%29%3B%0A%20%20%7D%0A%20%20function%20maybeAs%28%5Ftype%2C%20value%29%20%7B%0A%20%20%20%20if%20%28value%20%3D%3D%20%22as%22%29%20%7B%20cx%2Emarked%20%3D%20%22keyword%22%3B%20return%20cont%28importSpec%29%3B%20%7D%0A%20%20%7D%0A%20%20function%20maybeFrom%28%5Ftype%2C%20value%29%20%7B%0A%20%20%20%20if%20%28value%20%3D%3D%20%22from%22%29%20%7B%20cx%2Emarked%20%3D%20%22keyword%22%3B%20return%20cont%28expression%29%3B%20%7D%0A%20%20%7D%0A%20%20function%20arrayLiteral%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%5D%22%29%20return%20cont%28%29%3B%0A%20%20%20%20return%20pass%28expressionNoComma%2C%20maybeArrayComprehension%29%3B%0A%20%20%7D%0A%20%20function%20maybeArrayComprehension%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22for%22%29%20return%20pass%28comprehension%2C%20expect%28%22%5D%22%29%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22%2C%22%29%20return%20cont%28commasep%28maybeexpressionNoComma%2C%20%22%5D%22%29%29%3B%0A%20%20%20%20return%20pass%28commasep%28expressionNoComma%2C%20%22%5D%22%29%29%3B%0A%20%20%7D%0A%20%20function%20comprehension%28type%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22for%22%29%20return%20cont%28forspec%2C%20comprehension%29%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22if%22%29%20return%20cont%28expression%2C%20comprehension%29%3B%0A%20%20%7D%0A%0A%20%20function%20isContinuedStatement%28state%2C%20textAfter%29%20%7B%0A%20%20%20%20return%20state%2ElastType%20%3D%3D%20%22operator%22%20%7C%7C%20state%2ElastType%20%3D%3D%20%22%2C%22%20%7C%7C%0A%20%20%20%20%20%20isOperatorChar%2Etest%28textAfter%2EcharAt%280%29%29%20%7C%7C%0A%20%20%20%20%20%20%2F%5B%2C%2E%5D%2F%2Etest%28textAfter%2EcharAt%280%29%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Interface%0A%0A%20%20return%20%7B%0A%20%20%20%20startState%3A%20function%28basecolumn%29%20%7B%0A%20%20%20%20%20%20var%20state%20%3D%20%7B%0A%20%20%20%20%20%20%20%20tokenize%3A%20tokenBase%2C%0A%20%20%20%20%20%20%20%20lastType%3A%20%22sof%22%2C%0A%20%20%20%20%20%20%20%20cc%3A%20%5B%5D%2C%0A%20%20%20%20%20%20%20%20lexical%3A%20new%20JSLexical%28%28basecolumn%20%7C%7C%200%29%20%2D%20indentUnit%2C%200%2C%20%22block%22%2C%20false%29%2C%0A%20%20%20%20%20%20%20%20localVars%3A%20parserConfig%2ElocalVars%2C%0A%20%20%20%20%20%20%20%20context%3A%20parserConfig%2ElocalVars%20%26%26%20%7Bvars%3A%20parserConfig%2ElocalVars%7D%2C%0A%20%20%20%20%20%20%20%20indented%3A%20basecolumn%20%7C%7C%200%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20if%20%28parserConfig%2EglobalVars%20%26%26%20typeof%20parserConfig%2EglobalVars%20%3D%3D%20%22object%22%29%0A%20%20%20%20%20%20%20%20state%2EglobalVars%20%3D%20parserConfig%2EglobalVars%3B%0A%20%20%20%20%20%20return%20state%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20token%3A%20function%28stream%2C%20state%29%20%7B%0A%20%20%20%20%20%20if%20%28stream%2Esol%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21state%2Elexical%2EhasOwnProperty%28%22align%22%29%29%0A%20%20%20%20%20%20%20%20%20%20state%2Elexical%2Ealign%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20state%2Eindented%20%3D%20stream%2Eindentation%28%29%3B%0A%20%20%20%20%20%20%20%20findFatArrow%28stream%2C%20state%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28state%2Etokenize%20%21%3D%20tokenComment%20%26%26%20stream%2EeatSpace%28%29%29%20return%20null%3B%0A%20%20%20%20%20%20var%20style%20%3D%20state%2Etokenize%28stream%2C%20state%29%3B%0A%20%20%20%20%20%20if%20%28type%20%3D%3D%20%22comment%22%29%20return%20style%3B%0A%20%20%20%20%20%20state%2ElastType%20%3D%20type%20%3D%3D%20%22operator%22%20%26%26%20%28content%20%3D%3D%20%22%2B%2B%22%20%7C%7C%20content%20%3D%3D%20%22%2D%2D%22%29%20%3F%20%22incdec%22%20%3A%20type%3B%0A%20%20%20%20%20%20return%20parseJS%28state%2C%20style%2C%20type%2C%20content%2C%20stream%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20indent%3A%20function%28state%2C%20textAfter%29%20%7B%0A%20%20%20%20%20%20if%20%28state%2Etokenize%20%3D%3D%20tokenComment%29%20return%20CodeMirror%2EPass%3B%0A%20%20%20%20%20%20if%20%28state%2Etokenize%20%21%3D%20tokenBase%29%20return%200%3B%0A%20%20%20%20%20%20var%20firstChar%20%3D%20textAfter%20%26%26%20textAfter%2EcharAt%280%29%2C%20lexical%20%3D%20state%2Elexical%3B%0A%20%20%20%20%20%20%2F%2F%20Kludge%20to%20prevent%20%27maybelse%27%20from%20blocking%20lexical%20scope%20pops%0A%20%20%20%20%20%20if%20%28%21%2F%5E%5Cs%2Aelse%5Cb%2F%2Etest%28textAfter%29%29%20for%20%28var%20i%20%3D%20state%2Ecc%2Elength%20%2D%201%3B%20i%20%3E%3D%200%3B%20%2D%2Di%29%20%7B%0A%20%20%20%20%20%20%20%20var%20c%20%3D%20state%2Ecc%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20if%20%28c%20%3D%3D%20poplex%29%20lexical%20%3D%20lexical%2Eprev%3B%0A%20%20%20%20%20%20%20%20else%20if%20%28c%20%21%3D%20maybeelse%29%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28lexical%2Etype%20%3D%3D%20%22stat%22%20%26%26%20firstChar%20%3D%3D%20%22%7D%22%29%20lexical%20%3D%20lexical%2Eprev%3B%0A%20%20%20%20%20%20if%20%28statementIndent%20%26%26%20lexical%2Etype%20%3D%3D%20%22%29%22%20%26%26%20lexical%2Eprev%2Etype%20%3D%3D%20%22stat%22%29%0A%20%20%20%20%20%20%20%20lexical%20%3D%20lexical%2Eprev%3B%0A%20%20%20%20%20%20var%20type%20%3D%20lexical%2Etype%2C%20closing%20%3D%20firstChar%20%3D%3D%20type%3B%0A%0A%20%20%20%20%20%20if%20%28type%20%3D%3D%20%22vardef%22%29%20return%20lexical%2Eindented%20%2B%20%28state%2ElastType%20%3D%3D%20%22operator%22%20%7C%7C%20state%2ElastType%20%3D%3D%20%22%2C%22%20%3F%20lexical%2Einfo%20%2B%201%20%3A%200%29%3B%0A%20%20%20%20%20%20else%20if%20%28type%20%3D%3D%20%22form%22%20%26%26%20firstChar%20%3D%3D%20%22%7B%22%29%20return%20lexical%2Eindented%3B%0A%20%20%20%20%20%20else%20if%20%28type%20%3D%3D%20%22form%22%29%20return%20lexical%2Eindented%20%2B%20indentUnit%3B%0A%20%20%20%20%20%20else%20if%20%28type%20%3D%3D%20%22stat%22%29%0A%20%20%20%20%20%20%20%20return%20lexical%2Eindented%20%2B%20%28isContinuedStatement%28state%2C%20textAfter%29%20%3F%20statementIndent%20%7C%7C%20indentUnit%20%3A%200%29%3B%0A%20%20%20%20%20%20else%20if%20%28lexical%2Einfo%20%3D%3D%20%22switch%22%20%26%26%20%21closing%20%26%26%20parserConfig%2EdoubleIndentSwitch%20%21%3D%20false%29%0A%20%20%20%20%20%20%20%20return%20lexical%2Eindented%20%2B%20%28%2F%5E%28%3F%3Acase%7Cdefault%29%5Cb%2F%2Etest%28textAfter%29%20%3F%20indentUnit%20%3A%202%20%2A%20indentUnit%29%3B%0A%20%20%20%20%20%20else%20if%20%28lexical%2Ealign%29%20return%20lexical%2Ecolumn%20%2B%20%28closing%20%3F%200%20%3A%201%29%3B%0A%20%20%20%20%20%20else%20return%20lexical%2Eindented%20%2B%20%28closing%20%3F%200%20%3A%20indentUnit%29%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20electricInput%3A%20%2F%5E%5Cs%2A%28%3F%3Acase%20%2E%2A%3F%3A%7Cdefault%3A%7C%5C%7B%7C%5C%7D%29%24%2F%2C%0A%20%20%20%20blockCommentStart%3A%20jsonMode%20%3F%20null%20%3A%20%22%2F%2A%22%2C%0A%20%20%20%20blockCommentEnd%3A%20jsonMode%20%3F%20null%20%3A%20%22%2A%2F%22%2C%0A%20%20%20%20lineComment%3A%20jsonMode%20%3F%20null%20%3A%20%22%2F%2F%22%2C%0A%20%20%20%20fold%3A%20%22brace%22%2C%0A%20%20%20%20closeBrackets%3A%20%22%28%29%5B%5D%7B%7D%27%27%5C%22%5C%22%60%60%22%2C%0A%0A%20%20%20%20helperType%3A%20jsonMode%20%3F%20%22json%22%20%3A%20%22javascript%22%2C%0A%20%20%20%20jsonldMode%3A%20jsonldMode%2C%0A%20%20%20%20jsonMode%3A%20jsonMode%2C%0A%0A%20%20%20%20expressionAllowed%3A%20expressionAllowed%2C%0A%20%20%20%20skipExpression%3A%20function%28state%29%20%7B%0A%20%20%20%20%20%20var%20top%20%3D%20state%2Ecc%5Bstate%2Ecc%2Elength%20%2D%201%5D%0A%20%20%20%20%20%20if%20%28top%20%3D%3D%20expression%20%7C%7C%20top%20%3D%3D%20expressionNoComma%29%20state%2Ecc%2Epop%28%29%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%7D%29%3B%0A%0ACodeMirror%2EregisterHelper%28%22wordChars%22%2C%20%22javascript%22%2C%20%2F%5B%5Cw%24%5D%2F%29%3B%0A%0ACodeMirror%2EdefineMIME%28%22text%2Fjavascript%22%2C%20%22javascript%22%29%3B%0ACodeMirror%2EdefineMIME%28%22text%2Fecmascript%22%2C%20%22javascript%22%29%3B%0ACodeMirror%2EdefineMIME%28%22application%2Fjavascript%22%2C%20%22javascript%22%29%3B%0ACodeMirror%2EdefineMIME%28%22application%2Fx%2Djavascript%22%2C%20%22javascript%22%29%3B%0ACodeMirror%2EdefineMIME%28%22application%2Fecmascript%22%2C%20%22javascript%22%29%3B%0ACodeMirror%2EdefineMIME%28%22application%2Fjson%22%2C%20%7Bname%3A%20%22javascript%22%2C%20json%3A%20true%7D%29%3B%0ACodeMirror%2EdefineMIME%28%22application%2Fx%2Djson%22%2C%20%7Bname%3A%20%22javascript%22%2C%20json%3A%20true%7D%29%3B%0ACodeMirror%2EdefineMIME%28%22application%2Fld%2Bjson%22%2C%20%7Bname%3A%20%22javascript%22%2C%20jsonld%3A%20true%7D%29%3B%0ACodeMirror%2EdefineMIME%28%22text%2Ftypescript%22%2C%20%7B%20name%3A%20%22javascript%22%2C%20typescript%3A%20true%20%7D%29%3B%0ACodeMirror%2EdefineMIME%28%22application%2Ftypescript%22%2C%20%7B%20name%3A%20%22javascript%22%2C%20typescript%3A%20true%20%7D%29%3B%0A%0A%7D%29%3B%0A"></script>
<script src="data:application/x-javascript,%2F%2F%20CodeMirror%2C%20copyright%20%28c%29%20by%20Marijn%20Haverbeke%20and%20others%0A%2F%2F%20Distributed%20under%20an%20MIT%20license%3A%20http%3A%2F%2Fcodemirror%2Enet%2FLICENSE%0A%0A%28function%28mod%29%20%7B%0A%20%20if%20%28typeof%20exports%20%3D%3D%20%22object%22%20%26%26%20typeof%20module%20%3D%3D%20%22object%22%29%20%2F%2F%20CommonJS%0A%20%20%20%20mod%28require%28%22%2E%2E%2F%2E%2E%2Flib%2Fcodemirror%22%29%29%3B%0A%20%20else%20if%20%28typeof%20define%20%3D%3D%20%22function%22%20%26%26%20define%2Eamd%29%20%2F%2F%20AMD%0A%20%20%20%20define%28%5B%22%2E%2E%2F%2E%2E%2Flib%2Fcodemirror%22%5D%2C%20mod%29%3B%0A%20%20else%20%2F%2F%20Plain%20browser%20env%0A%20%20%20%20mod%28CodeMirror%29%3B%0A%7D%29%28function%28CodeMirror%29%20%7B%0A%22use%20strict%22%3B%0A%0Avar%20htmlConfig%20%3D%20%7B%0A%20%20autoSelfClosers%3A%20%7B%27area%27%3A%20true%2C%20%27base%27%3A%20true%2C%20%27br%27%3A%20true%2C%20%27col%27%3A%20true%2C%20%27command%27%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27embed%27%3A%20true%2C%20%27frame%27%3A%20true%2C%20%27hr%27%3A%20true%2C%20%27img%27%3A%20true%2C%20%27input%27%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27keygen%27%3A%20true%2C%20%27link%27%3A%20true%2C%20%27meta%27%3A%20true%2C%20%27param%27%3A%20true%2C%20%27source%27%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27track%27%3A%20true%2C%20%27wbr%27%3A%20true%2C%20%27menuitem%27%3A%20true%7D%2C%0A%20%20implicitlyClosed%3A%20%7B%27dd%27%3A%20true%2C%20%27li%27%3A%20true%2C%20%27optgroup%27%3A%20true%2C%20%27option%27%3A%20true%2C%20%27p%27%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27rp%27%3A%20true%2C%20%27rt%27%3A%20true%2C%20%27tbody%27%3A%20true%2C%20%27td%27%3A%20true%2C%20%27tfoot%27%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27th%27%3A%20true%2C%20%27tr%27%3A%20true%7D%2C%0A%20%20contextGrabbers%3A%20%7B%0A%20%20%20%20%27dd%27%3A%20%7B%27dd%27%3A%20true%2C%20%27dt%27%3A%20true%7D%2C%0A%20%20%20%20%27dt%27%3A%20%7B%27dd%27%3A%20true%2C%20%27dt%27%3A%20true%7D%2C%0A%20%20%20%20%27li%27%3A%20%7B%27li%27%3A%20true%7D%2C%0A%20%20%20%20%27option%27%3A%20%7B%27option%27%3A%20true%2C%20%27optgroup%27%3A%20true%7D%2C%0A%20%20%20%20%27optgroup%27%3A%20%7B%27optgroup%27%3A%20true%7D%2C%0A%20%20%20%20%27p%27%3A%20%7B%27address%27%3A%20true%2C%20%27article%27%3A%20true%2C%20%27aside%27%3A%20true%2C%20%27blockquote%27%3A%20true%2C%20%27dir%27%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%27div%27%3A%20true%2C%20%27dl%27%3A%20true%2C%20%27fieldset%27%3A%20true%2C%20%27footer%27%3A%20true%2C%20%27form%27%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%27h1%27%3A%20true%2C%20%27h2%27%3A%20true%2C%20%27h3%27%3A%20true%2C%20%27h4%27%3A%20true%2C%20%27h5%27%3A%20true%2C%20%27h6%27%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%27header%27%3A%20true%2C%20%27hgroup%27%3A%20true%2C%20%27hr%27%3A%20true%2C%20%27menu%27%3A%20true%2C%20%27nav%27%3A%20true%2C%20%27ol%27%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%27p%27%3A%20true%2C%20%27pre%27%3A%20true%2C%20%27section%27%3A%20true%2C%20%27table%27%3A%20true%2C%20%27ul%27%3A%20true%7D%2C%0A%20%20%20%20%27rp%27%3A%20%7B%27rp%27%3A%20true%2C%20%27rt%27%3A%20true%7D%2C%0A%20%20%20%20%27rt%27%3A%20%7B%27rp%27%3A%20true%2C%20%27rt%27%3A%20true%7D%2C%0A%20%20%20%20%27tbody%27%3A%20%7B%27tbody%27%3A%20true%2C%20%27tfoot%27%3A%20true%7D%2C%0A%20%20%20%20%27td%27%3A%20%7B%27td%27%3A%20true%2C%20%27th%27%3A%20true%7D%2C%0A%20%20%20%20%27tfoot%27%3A%20%7B%27tbody%27%3A%20true%7D%2C%0A%20%20%20%20%27th%27%3A%20%7B%27td%27%3A%20true%2C%20%27th%27%3A%20true%7D%2C%0A%20%20%20%20%27thead%27%3A%20%7B%27tbody%27%3A%20true%2C%20%27tfoot%27%3A%20true%7D%2C%0A%20%20%20%20%27tr%27%3A%20%7B%27tr%27%3A%20true%7D%0A%20%20%7D%2C%0A%20%20doNotIndent%3A%20%7B%22pre%22%3A%20true%7D%2C%0A%20%20allowUnquoted%3A%20true%2C%0A%20%20allowMissing%3A%20true%2C%0A%20%20caseFold%3A%20true%0A%7D%0A%0Avar%20xmlConfig%20%3D%20%7B%0A%20%20autoSelfClosers%3A%20%7B%7D%2C%0A%20%20implicitlyClosed%3A%20%7B%7D%2C%0A%20%20contextGrabbers%3A%20%7B%7D%2C%0A%20%20doNotIndent%3A%20%7B%7D%2C%0A%20%20allowUnquoted%3A%20false%2C%0A%20%20allowMissing%3A%20false%2C%0A%20%20caseFold%3A%20false%0A%7D%0A%0ACodeMirror%2EdefineMode%28%22xml%22%2C%20function%28editorConf%2C%20config%5F%29%20%7B%0A%20%20var%20indentUnit%20%3D%20editorConf%2EindentUnit%0A%20%20var%20config%20%3D%20%7B%7D%0A%20%20var%20defaults%20%3D%20config%5F%2EhtmlMode%20%3F%20htmlConfig%20%3A%20xmlConfig%0A%20%20for%20%28var%20prop%20in%20defaults%29%20config%5Bprop%5D%20%3D%20defaults%5Bprop%5D%0A%20%20for%20%28var%20prop%20in%20config%5F%29%20config%5Bprop%5D%20%3D%20config%5F%5Bprop%5D%0A%0A%20%20%2F%2F%20Return%20variables%20for%20tokenizers%0A%20%20var%20type%2C%20setStyle%3B%0A%0A%20%20function%20inText%28stream%2C%20state%29%20%7B%0A%20%20%20%20function%20chain%28parser%29%20%7B%0A%20%20%20%20%20%20state%2Etokenize%20%3D%20parser%3B%0A%20%20%20%20%20%20return%20parser%28stream%2C%20state%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20ch%20%3D%20stream%2Enext%28%29%3B%0A%20%20%20%20if%20%28ch%20%3D%3D%20%22%3C%22%29%20%7B%0A%20%20%20%20%20%20if%20%28stream%2Eeat%28%22%21%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28stream%2Eeat%28%22%5B%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28stream%2Ematch%28%22CDATA%5B%22%29%29%20return%20chain%28inBlock%28%22atom%22%2C%20%22%5D%5D%3E%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20else%20return%20null%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28stream%2Ematch%28%22%2D%2D%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20chain%28inBlock%28%22comment%22%2C%20%22%2D%2D%3E%22%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28stream%2Ematch%28%22DOCTYPE%22%2C%20true%2C%20true%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20stream%2EeatWhile%28%2F%5B%5Cw%5C%2E%5F%5C%2D%5D%2F%29%3B%0A%20%20%20%20%20%20%20%20%20%20return%20chain%28doctype%281%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20if%20%28stream%2Eeat%28%22%3F%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20stream%2EeatWhile%28%2F%5B%5Cw%5C%2E%5F%5C%2D%5D%2F%29%3B%0A%20%20%20%20%20%20%20%20state%2Etokenize%20%3D%20inBlock%28%22meta%22%2C%20%22%3F%3E%22%29%3B%0A%20%20%20%20%20%20%20%20return%20%22meta%22%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20type%20%3D%20stream%2Eeat%28%22%2F%22%29%20%3F%20%22closeTag%22%20%3A%20%22openTag%22%3B%0A%20%20%20%20%20%20%20%20state%2Etokenize%20%3D%20inTag%3B%0A%20%20%20%20%20%20%20%20return%20%22tag%20bracket%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%26%22%29%20%7B%0A%20%20%20%20%20%20var%20ok%3B%0A%20%20%20%20%20%20if%20%28stream%2Eeat%28%22%23%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28stream%2Eeat%28%22x%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20ok%20%3D%20stream%2EeatWhile%28%2F%5Ba%2DfA%2DF%5Cd%5D%2F%29%20%26%26%20stream%2Eeat%28%22%3B%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20ok%20%3D%20stream%2EeatWhile%28%2F%5B%5Cd%5D%2F%29%20%26%26%20stream%2Eeat%28%22%3B%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20ok%20%3D%20stream%2EeatWhile%28%2F%5B%5Cw%5C%2E%5C%2D%3A%5D%2F%29%20%26%26%20stream%2Eeat%28%22%3B%22%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20ok%20%3F%20%22atom%22%20%3A%20%22error%22%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20stream%2EeatWhile%28%2F%5B%5E%26%3C%5D%2F%29%3B%0A%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20inText%2EisInText%20%3D%20true%3B%0A%0A%20%20function%20inTag%28stream%2C%20state%29%20%7B%0A%20%20%20%20var%20ch%20%3D%20stream%2Enext%28%29%3B%0A%20%20%20%20if%20%28ch%20%3D%3D%20%22%3E%22%20%7C%7C%20%28ch%20%3D%3D%20%22%2F%22%20%26%26%20stream%2Eeat%28%22%3E%22%29%29%29%20%7B%0A%20%20%20%20%20%20state%2Etokenize%20%3D%20inText%3B%0A%20%20%20%20%20%20type%20%3D%20ch%20%3D%3D%20%22%3E%22%20%3F%20%22endTag%22%20%3A%20%22selfcloseTag%22%3B%0A%20%20%20%20%20%20return%20%22tag%20bracket%22%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%3D%22%29%20%7B%0A%20%20%20%20%20%20type%20%3D%20%22equals%22%3B%0A%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%3C%22%29%20%7B%0A%20%20%20%20%20%20state%2Etokenize%20%3D%20inText%3B%0A%20%20%20%20%20%20state%2Estate%20%3D%20baseState%3B%0A%20%20%20%20%20%20state%2EtagName%20%3D%20state%2EtagStart%20%3D%20null%3B%0A%20%20%20%20%20%20var%20next%20%3D%20state%2Etokenize%28stream%2C%20state%29%3B%0A%20%20%20%20%20%20return%20next%20%3F%20next%20%2B%20%22%20tag%20error%22%20%3A%20%22tag%20error%22%3B%0A%20%20%20%20%7D%20else%20if%20%28%2F%5B%5C%27%5C%22%5D%2F%2Etest%28ch%29%29%20%7B%0A%20%20%20%20%20%20state%2Etokenize%20%3D%20inAttribute%28ch%29%3B%0A%20%20%20%20%20%20state%2EstringStartCol%20%3D%20stream%2Ecolumn%28%29%3B%0A%20%20%20%20%20%20return%20state%2Etokenize%28stream%2C%20state%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20stream%2Ematch%28%2F%5E%5B%5E%5Cs%5Cu00a0%3D%3C%3E%5C%22%5C%27%5D%2A%5B%5E%5Cs%5Cu00a0%3D%3C%3E%5C%22%5C%27%5C%2F%5D%2F%29%3B%0A%20%20%20%20%20%20return%20%22word%22%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20inAttribute%28quote%29%20%7B%0A%20%20%20%20var%20closure%20%3D%20function%28stream%2C%20state%29%20%7B%0A%20%20%20%20%20%20while%20%28%21stream%2Eeol%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28stream%2Enext%28%29%20%3D%3D%20quote%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20state%2Etokenize%20%3D%20inTag%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%22string%22%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20closure%2EisInAttribute%20%3D%20true%3B%0A%20%20%20%20return%20closure%3B%0A%20%20%7D%0A%0A%20%20function%20inBlock%28style%2C%20terminator%29%20%7B%0A%20%20%20%20return%20function%28stream%2C%20state%29%20%7B%0A%20%20%20%20%20%20while%20%28%21stream%2Eeol%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28stream%2Ematch%28terminator%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20state%2Etokenize%20%3D%20inText%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20stream%2Enext%28%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20style%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%20%20function%20doctype%28depth%29%20%7B%0A%20%20%20%20return%20function%28stream%2C%20state%29%20%7B%0A%20%20%20%20%20%20var%20ch%3B%0A%20%20%20%20%20%20while%20%28%28ch%20%3D%20stream%2Enext%28%29%29%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28ch%20%3D%3D%20%22%3C%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20state%2Etokenize%20%3D%20doctype%28depth%20%2B%201%29%3B%0A%20%20%20%20%20%20%20%20%20%20return%20state%2Etokenize%28stream%2C%20state%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28ch%20%3D%3D%20%22%3E%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28depth%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20state%2Etokenize%20%3D%20inText%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20state%2Etokenize%20%3D%20doctype%28depth%20%2D%201%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20state%2Etokenize%28stream%2C%20state%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%22meta%22%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20function%20Context%28state%2C%20tagName%2C%20startOfLine%29%20%7B%0A%20%20%20%20this%2Eprev%20%3D%20state%2Econtext%3B%0A%20%20%20%20this%2EtagName%20%3D%20tagName%3B%0A%20%20%20%20this%2Eindent%20%3D%20state%2Eindented%3B%0A%20%20%20%20this%2EstartOfLine%20%3D%20startOfLine%3B%0A%20%20%20%20if%20%28config%2EdoNotIndent%2EhasOwnProperty%28tagName%29%20%7C%7C%20%28state%2Econtext%20%26%26%20state%2Econtext%2EnoIndent%29%29%0A%20%20%20%20%20%20this%2EnoIndent%20%3D%20true%3B%0A%20%20%7D%0A%20%20function%20popContext%28state%29%20%7B%0A%20%20%20%20if%20%28state%2Econtext%29%20state%2Econtext%20%3D%20state%2Econtext%2Eprev%3B%0A%20%20%7D%0A%20%20function%20maybePopContext%28state%2C%20nextTagName%29%20%7B%0A%20%20%20%20var%20parentTagName%3B%0A%20%20%20%20while%20%28true%29%20%7B%0A%20%20%20%20%20%20if%20%28%21state%2Econtext%29%20%7B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20parentTagName%20%3D%20state%2Econtext%2EtagName%3B%0A%20%20%20%20%20%20if%20%28%21config%2EcontextGrabbers%2EhasOwnProperty%28parentTagName%29%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%21config%2EcontextGrabbers%5BparentTagName%5D%2EhasOwnProperty%28nextTagName%29%29%20%7B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20popContext%28state%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20baseState%28type%2C%20stream%2C%20state%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22openTag%22%29%20%7B%0A%20%20%20%20%20%20state%2EtagStart%20%3D%20stream%2Ecolumn%28%29%3B%0A%20%20%20%20%20%20return%20tagNameState%3B%0A%20%20%20%20%7D%20else%20if%20%28type%20%3D%3D%20%22closeTag%22%29%20%7B%0A%20%20%20%20%20%20return%20closeTagNameState%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20baseState%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20function%20tagNameState%28type%2C%20stream%2C%20state%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22word%22%29%20%7B%0A%20%20%20%20%20%20state%2EtagName%20%3D%20stream%2Ecurrent%28%29%3B%0A%20%20%20%20%20%20setStyle%20%3D%20%22tag%22%3B%0A%20%20%20%20%20%20return%20attrState%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20setStyle%20%3D%20%22error%22%3B%0A%20%20%20%20%20%20return%20tagNameState%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20function%20closeTagNameState%28type%2C%20stream%2C%20state%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22word%22%29%20%7B%0A%20%20%20%20%20%20var%20tagName%20%3D%20stream%2Ecurrent%28%29%3B%0A%20%20%20%20%20%20if%20%28state%2Econtext%20%26%26%20state%2Econtext%2EtagName%20%21%3D%20tagName%20%26%26%0A%20%20%20%20%20%20%20%20%20%20config%2EimplicitlyClosed%2EhasOwnProperty%28state%2Econtext%2EtagName%29%29%0A%20%20%20%20%20%20%20%20popContext%28state%29%3B%0A%20%20%20%20%20%20if%20%28state%2Econtext%20%26%26%20state%2Econtext%2EtagName%20%3D%3D%20tagName%29%20%7B%0A%20%20%20%20%20%20%20%20setStyle%20%3D%20%22tag%22%3B%0A%20%20%20%20%20%20%20%20return%20closeState%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20setStyle%20%3D%20%22tag%20error%22%3B%0A%20%20%20%20%20%20%20%20return%20closeStateErr%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20setStyle%20%3D%20%22error%22%3B%0A%20%20%20%20%20%20return%20closeStateErr%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20closeState%28type%2C%20%5Fstream%2C%20state%29%20%7B%0A%20%20%20%20if%20%28type%20%21%3D%20%22endTag%22%29%20%7B%0A%20%20%20%20%20%20setStyle%20%3D%20%22error%22%3B%0A%20%20%20%20%20%20return%20closeState%3B%0A%20%20%20%20%7D%0A%20%20%20%20popContext%28state%29%3B%0A%20%20%20%20return%20baseState%3B%0A%20%20%7D%0A%20%20function%20closeStateErr%28type%2C%20stream%2C%20state%29%20%7B%0A%20%20%20%20setStyle%20%3D%20%22error%22%3B%0A%20%20%20%20return%20closeState%28type%2C%20stream%2C%20state%29%3B%0A%20%20%7D%0A%0A%20%20function%20attrState%28type%2C%20%5Fstream%2C%20state%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22word%22%29%20%7B%0A%20%20%20%20%20%20setStyle%20%3D%20%22attribute%22%3B%0A%20%20%20%20%20%20return%20attrEqState%3B%0A%20%20%20%20%7D%20else%20if%20%28type%20%3D%3D%20%22endTag%22%20%7C%7C%20type%20%3D%3D%20%22selfcloseTag%22%29%20%7B%0A%20%20%20%20%20%20var%20tagName%20%3D%20state%2EtagName%2C%20tagStart%20%3D%20state%2EtagStart%3B%0A%20%20%20%20%20%20state%2EtagName%20%3D%20state%2EtagStart%20%3D%20null%3B%0A%20%20%20%20%20%20if%20%28type%20%3D%3D%20%22selfcloseTag%22%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20config%2EautoSelfClosers%2EhasOwnProperty%28tagName%29%29%20%7B%0A%20%20%20%20%20%20%20%20maybePopContext%28state%2C%20tagName%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20maybePopContext%28state%2C%20tagName%29%3B%0A%20%20%20%20%20%20%20%20state%2Econtext%20%3D%20new%20Context%28state%2C%20tagName%2C%20tagStart%20%3D%3D%20state%2Eindented%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20baseState%3B%0A%20%20%20%20%7D%0A%20%20%20%20setStyle%20%3D%20%22error%22%3B%0A%20%20%20%20return%20attrState%3B%0A%20%20%7D%0A%20%20function%20attrEqState%28type%2C%20stream%2C%20state%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22equals%22%29%20return%20attrValueState%3B%0A%20%20%20%20if%20%28%21config%2EallowMissing%29%20setStyle%20%3D%20%22error%22%3B%0A%20%20%20%20return%20attrState%28type%2C%20stream%2C%20state%29%3B%0A%20%20%7D%0A%20%20function%20attrValueState%28type%2C%20stream%2C%20state%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22string%22%29%20return%20attrContinuedState%3B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22word%22%20%26%26%20config%2EallowUnquoted%29%20%7BsetStyle%20%3D%20%22string%22%3B%20return%20attrState%3B%7D%0A%20%20%20%20setStyle%20%3D%20%22error%22%3B%0A%20%20%20%20return%20attrState%28type%2C%20stream%2C%20state%29%3B%0A%20%20%7D%0A%20%20function%20attrContinuedState%28type%2C%20stream%2C%20state%29%20%7B%0A%20%20%20%20if%20%28type%20%3D%3D%20%22string%22%29%20return%20attrContinuedState%3B%0A%20%20%20%20return%20attrState%28type%2C%20stream%2C%20state%29%3B%0A%20%20%7D%0A%0A%20%20return%20%7B%0A%20%20%20%20startState%3A%20function%28baseIndent%29%20%7B%0A%20%20%20%20%20%20var%20state%20%3D%20%7Btokenize%3A%20inText%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20state%3A%20baseState%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20indented%3A%20baseIndent%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tagName%3A%20null%2C%20tagStart%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20context%3A%20null%7D%0A%20%20%20%20%20%20if%20%28baseIndent%20%21%3D%20null%29%20state%2EbaseIndent%20%3D%20baseIndent%0A%20%20%20%20%20%20return%20state%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20token%3A%20function%28stream%2C%20state%29%20%7B%0A%20%20%20%20%20%20if%20%28%21state%2EtagName%20%26%26%20stream%2Esol%28%29%29%0A%20%20%20%20%20%20%20%20state%2Eindented%20%3D%20stream%2Eindentation%28%29%3B%0A%0A%20%20%20%20%20%20if%20%28stream%2EeatSpace%28%29%29%20return%20null%3B%0A%20%20%20%20%20%20type%20%3D%20null%3B%0A%20%20%20%20%20%20var%20style%20%3D%20state%2Etokenize%28stream%2C%20state%29%3B%0A%20%20%20%20%20%20if%20%28%28style%20%7C%7C%20type%29%20%26%26%20style%20%21%3D%20%22comment%22%29%20%7B%0A%20%20%20%20%20%20%20%20setStyle%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20state%2Estate%20%3D%20state%2Estate%28type%20%7C%7C%20style%2C%20stream%2C%20state%29%3B%0A%20%20%20%20%20%20%20%20if%20%28setStyle%29%0A%20%20%20%20%20%20%20%20%20%20style%20%3D%20setStyle%20%3D%3D%20%22error%22%20%3F%20style%20%2B%20%22%20error%22%20%3A%20setStyle%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20style%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20indent%3A%20function%28state%2C%20textAfter%2C%20fullLine%29%20%7B%0A%20%20%20%20%20%20var%20context%20%3D%20state%2Econtext%3B%0A%20%20%20%20%20%20%2F%2F%20Indent%20multi%2Dline%20strings%20%28e%2Eg%2E%20css%29%2E%0A%20%20%20%20%20%20if%20%28state%2Etokenize%2EisInAttribute%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28state%2EtagStart%20%3D%3D%20state%2Eindented%29%0A%20%20%20%20%20%20%20%20%20%20return%20state%2EstringStartCol%20%2B%201%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20return%20state%2Eindented%20%2B%20indentUnit%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28context%20%26%26%20context%2EnoIndent%29%20return%20CodeMirror%2EPass%3B%0A%20%20%20%20%20%20if%20%28state%2Etokenize%20%21%3D%20inTag%20%26%26%20state%2Etokenize%20%21%3D%20inText%29%0A%20%20%20%20%20%20%20%20return%20fullLine%20%3F%20fullLine%2Ematch%28%2F%5E%28%5Cs%2A%29%2F%29%5B0%5D%2Elength%20%3A%200%3B%0A%20%20%20%20%20%20%2F%2F%20Indent%20the%20starts%20of%20attribute%20names%2E%0A%20%20%20%20%20%20if%20%28state%2EtagName%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28config%2EmultilineTagIndentPastTag%20%21%3D%3D%20false%29%0A%20%20%20%20%20%20%20%20%20%20return%20state%2EtagStart%20%2B%20state%2EtagName%2Elength%20%2B%202%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20return%20state%2EtagStart%20%2B%20indentUnit%20%2A%20%28config%2EmultilineTagIndentFactor%20%7C%7C%201%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28config%2EalignCDATA%20%26%26%20%2F%3C%21%5C%5BCDATA%5C%5B%2F%2Etest%28textAfter%29%29%20return%200%3B%0A%20%20%20%20%20%20var%20tagAfter%20%3D%20textAfter%20%26%26%20%2F%5E%3C%28%5C%2F%29%3F%28%5B%5Cw%5F%3A%5C%2E%2D%5D%2A%29%2F%2Eexec%28textAfter%29%3B%0A%20%20%20%20%20%20if%20%28tagAfter%20%26%26%20tagAfter%5B1%5D%29%20%7B%20%2F%2F%20Closing%20tag%20spotted%0A%20%20%20%20%20%20%20%20while%20%28context%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28context%2EtagName%20%3D%3D%20tagAfter%5B2%5D%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20context%20%3D%20context%2Eprev%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20%28config%2EimplicitlyClosed%2EhasOwnProperty%28context%2EtagName%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20context%20%3D%20context%2Eprev%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20if%20%28tagAfter%29%20%7B%20%2F%2F%20Opening%20tag%20spotted%0A%20%20%20%20%20%20%20%20while%20%28context%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20grabbers%20%3D%20config%2EcontextGrabbers%5Bcontext%2EtagName%5D%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28grabbers%20%26%26%20grabbers%2EhasOwnProperty%28tagAfter%5B2%5D%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20context%20%3D%20context%2Eprev%3B%0A%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20while%20%28context%20%26%26%20context%2Eprev%20%26%26%20%21context%2EstartOfLine%29%0A%20%20%20%20%20%20%20%20context%20%3D%20context%2Eprev%3B%0A%20%20%20%20%20%20if%20%28context%29%20return%20context%2Eindent%20%2B%20indentUnit%3B%0A%20%20%20%20%20%20else%20return%20state%2EbaseIndent%20%7C%7C%200%3B%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20electricInput%3A%20%2F%3C%5C%2F%5B%5Cs%5Cw%3A%5D%2B%3E%24%2F%2C%0A%20%20%20%20blockCommentStart%3A%20%22%3C%21%2D%2D%22%2C%0A%20%20%20%20blockCommentEnd%3A%20%22%2D%2D%3E%22%2C%0A%0A%20%20%20%20configuration%3A%20config%2EhtmlMode%20%3F%20%22html%22%20%3A%20%22xml%22%2C%0A%20%20%20%20helperType%3A%20config%2EhtmlMode%20%3F%20%22html%22%20%3A%20%22xml%22%2C%0A%0A%20%20%20%20skipAttribute%3A%20function%28state%29%20%7B%0A%20%20%20%20%20%20if%20%28state%2Estate%20%3D%3D%20attrValueState%29%0A%20%20%20%20%20%20%20%20state%2Estate%20%3D%20attrState%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%7D%29%3B%0A%0ACodeMirror%2EdefineMIME%28%22text%2Fxml%22%2C%20%22xml%22%29%3B%0ACodeMirror%2EdefineMIME%28%22application%2Fxml%22%2C%20%22xml%22%29%3B%0Aif%20%28%21CodeMirror%2EmimeModes%2EhasOwnProperty%28%22text%2Fhtml%22%29%29%0A%20%20CodeMirror%2EdefineMIME%28%22text%2Fhtml%22%2C%20%7Bname%3A%20%22xml%22%2C%20htmlMode%3A%20true%7D%29%3B%0A%0A%7D%29%3B%0A"></script>
<link href="data:text/css,%2F%2A%20Loosely%20based%20on%20the%20Midnight%20Textmate%20theme%20%2A%2F%0A%0A%2Ecm%2Ds%2Dnight%2ECodeMirror%20%7B%20background%3A%20%230a001f%3B%20color%3A%20%23f8f8f8%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20div%2ECodeMirror%2Dselected%20%7B%20background%3A%20%23447%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20%2ECodeMirror%2Dline%3A%3Aselection%2C%20%2Ecm%2Ds%2Dnight%20%2ECodeMirror%2Dline%20%3E%20span%3A%3Aselection%2C%20%2Ecm%2Ds%2Dnight%20%2ECodeMirror%2Dline%20%3E%20span%20%3E%20span%3A%3Aselection%20%7B%20background%3A%20rgba%2868%2C%2068%2C%20119%2C%20%2E99%29%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20%2ECodeMirror%2Dline%3A%3A%2Dmoz%2Dselection%2C%20%2Ecm%2Ds%2Dnight%20%2ECodeMirror%2Dline%20%3E%20span%3A%3A%2Dmoz%2Dselection%2C%20%2Ecm%2Ds%2Dnight%20%2ECodeMirror%2Dline%20%3E%20span%20%3E%20span%3A%3A%2Dmoz%2Dselection%20%7B%20background%3A%20rgba%2868%2C%2068%2C%20119%2C%20%2E99%29%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20%2ECodeMirror%2Dgutters%20%7B%20background%3A%20%230a001f%3B%20border%2Dright%3A%201px%20solid%20%23aaa%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20%2ECodeMirror%2Dguttermarker%20%7B%20color%3A%20white%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20%2ECodeMirror%2Dguttermarker%2Dsubtle%20%7B%20color%3A%20%23bbb%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20%2ECodeMirror%2Dlinenumber%20%7B%20color%3A%20%23f8f8f8%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20%2ECodeMirror%2Dcursor%20%7B%20border%2Dleft%3A%201px%20solid%20white%3B%20%7D%0A%0A%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dcomment%20%7B%20color%3A%20%236900a1%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20span%2Ecm%2Datom%20%7B%20color%3A%20%23845dc4%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dnumber%2C%20%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dattribute%20%7B%20color%3A%20%23ffd500%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dkeyword%20%7B%20color%3A%20%23599eff%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dstring%20%7B%20color%3A%20%2337f14a%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dmeta%20%7B%20color%3A%20%237678e2%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dvariable%2D2%2C%20%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dtag%20%7B%20color%3A%20%2399b2ff%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dvariable%2D3%2C%20%2Ecm%2Ds%2Dnight%20span%2Ecm%2Ddef%20%7B%20color%3A%20white%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dbracket%20%7B%20color%3A%20%238da6ce%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dcomment%20%7B%20color%3A%20%236900a1%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dbuiltin%2C%20%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dspecial%20%7B%20color%3A%20%23ff9e59%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20span%2Ecm%2Dlink%20%7B%20color%3A%20%23845dc4%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20span%2Ecm%2Derror%20%7B%20color%3A%20%239d1e15%3B%20%7D%0A%0A%2Ecm%2Ds%2Dnight%20%2ECodeMirror%2Dactiveline%2Dbackground%20%7B%20background%3A%20%231C005A%3B%20%7D%0A%2Ecm%2Ds%2Dnight%20%2ECodeMirror%2Dmatchingbracket%20%7B%20outline%3A1px%20solid%20grey%3B%20color%3Awhite%20%21important%3B%20%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript,%2F%2F%20CodeMirror%2C%20copyright%20%28c%29%20by%20Marijn%20Haverbeke%20and%20others%0A%2F%2F%20Distributed%20under%20an%20MIT%20license%3A%20http%3A%2F%2Fcodemirror%2Enet%2FLICENSE%0A%0A%28function%28mod%29%20%7B%0A%20%20if%20%28typeof%20exports%20%3D%3D%20%22object%22%20%26%26%20typeof%20module%20%3D%3D%20%22object%22%29%20%2F%2F%20CommonJS%0A%20%20%20%20mod%28require%28%22%2E%2E%2F%2E%2E%2Flib%2Fcodemirror%22%29%29%3B%0A%20%20else%20if%20%28typeof%20define%20%3D%3D%20%22function%22%20%26%26%20define%2Eamd%29%20%2F%2F%20AMD%0A%20%20%20%20define%28%5B%22%2E%2E%2F%2E%2E%2Flib%2Fcodemirror%22%5D%2C%20mod%29%3B%0A%20%20else%20%2F%2F%20Plain%20browser%20env%0A%20%20%20%20mod%28CodeMirror%29%3B%0A%7D%29%28function%28CodeMirror%29%20%7B%0A%20%20%22use%20strict%22%3B%0A%0A%20%20function%20doFold%28cm%2C%20pos%2C%20options%2C%20force%29%20%7B%0A%20%20%20%20if%20%28options%20%26%26%20options%2Ecall%29%20%7B%0A%20%20%20%20%20%20var%20finder%20%3D%20options%3B%0A%20%20%20%20%20%20options%20%3D%20null%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20var%20finder%20%3D%20getOption%28cm%2C%20options%2C%20%22rangeFinder%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28typeof%20pos%20%3D%3D%20%22number%22%29%20pos%20%3D%20CodeMirror%2EPos%28pos%2C%200%29%3B%0A%20%20%20%20var%20minSize%20%3D%20getOption%28cm%2C%20options%2C%20%22minFoldSize%22%29%3B%0A%0A%20%20%20%20function%20getRange%28allowFolded%29%20%7B%0A%20%20%20%20%20%20var%20range%20%3D%20finder%28cm%2C%20pos%29%3B%0A%20%20%20%20%20%20if%20%28%21range%20%7C%7C%20range%2Eto%2Eline%20%2D%20range%2Efrom%2Eline%20%3C%20minSize%29%20return%20null%3B%0A%20%20%20%20%20%20var%20marks%20%3D%20cm%2EfindMarksAt%28range%2Efrom%29%3B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20marks%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28marks%5Bi%5D%2E%5F%5FisFold%20%26%26%20force%20%21%3D%3D%20%22fold%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21allowFolded%29%20return%20null%3B%0A%20%20%20%20%20%20%20%20%20%20range%2Ecleared%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20marks%5Bi%5D%2Eclear%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20range%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20range%20%3D%20getRange%28true%29%3B%0A%20%20%20%20if%20%28getOption%28cm%2C%20options%2C%20%22scanUp%22%29%29%20while%20%28%21range%20%26%26%20pos%2Eline%20%3E%20cm%2EfirstLine%28%29%29%20%7B%0A%20%20%20%20%20%20pos%20%3D%20CodeMirror%2EPos%28pos%2Eline%20%2D%201%2C%200%29%3B%0A%20%20%20%20%20%20range%20%3D%20getRange%28false%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28%21range%20%7C%7C%20range%2Ecleared%20%7C%7C%20force%20%3D%3D%3D%20%22unfold%22%29%20return%3B%0A%0A%20%20%20%20var%20myWidget%20%3D%20makeWidget%28cm%2C%20options%29%3B%0A%20%20%20%20CodeMirror%2Eon%28myWidget%2C%20%22mousedown%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20myRange%2Eclear%28%29%3B%0A%20%20%20%20%20%20CodeMirror%2Ee%5FpreventDefault%28e%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20var%20myRange%20%3D%20cm%2EmarkText%28range%2Efrom%2C%20range%2Eto%2C%20%7B%0A%20%20%20%20%20%20replacedWith%3A%20myWidget%2C%0A%20%20%20%20%20%20clearOnEnter%3A%20true%2C%0A%20%20%20%20%20%20%5F%5FisFold%3A%20true%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20myRange%2Eon%28%22clear%22%2C%20function%28from%2C%20to%29%20%7B%0A%20%20%20%20%20%20CodeMirror%2Esignal%28cm%2C%20%22unfold%22%2C%20cm%2C%20from%2C%20to%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20CodeMirror%2Esignal%28cm%2C%20%22fold%22%2C%20cm%2C%20range%2Efrom%2C%20range%2Eto%29%3B%0A%20%20%7D%0A%0A%20%20function%20makeWidget%28cm%2C%20options%29%20%7B%0A%20%20%20%20var%20widget%20%3D%20getOption%28cm%2C%20options%2C%20%22widget%22%29%3B%0A%20%20%20%20if%20%28typeof%20widget%20%3D%3D%20%22string%22%29%20%7B%0A%20%20%20%20%20%20var%20text%20%3D%20document%2EcreateTextNode%28widget%29%3B%0A%20%20%20%20%20%20widget%20%3D%20document%2EcreateElement%28%22span%22%29%3B%0A%20%20%20%20%20%20widget%2EappendChild%28text%29%3B%0A%20%20%20%20%20%20widget%2EclassName%20%3D%20%22CodeMirror%2Dfoldmarker%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20widget%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Clumsy%20backwards%2Dcompatible%20interface%0A%20%20CodeMirror%2EnewFoldFunction%20%3D%20function%28rangeFinder%2C%20widget%29%20%7B%0A%20%20%20%20return%20function%28cm%2C%20pos%29%20%7B%20doFold%28cm%2C%20pos%2C%20%7BrangeFinder%3A%20rangeFinder%2C%20widget%3A%20widget%7D%29%3B%20%7D%3B%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20New%2Dstyle%20interface%0A%20%20CodeMirror%2EdefineExtension%28%22foldCode%22%2C%20function%28pos%2C%20options%2C%20force%29%20%7B%0A%20%20%20%20doFold%28this%2C%20pos%2C%20options%2C%20force%29%3B%0A%20%20%7D%29%3B%0A%0A%20%20CodeMirror%2EdefineExtension%28%22isFolded%22%2C%20function%28pos%29%20%7B%0A%20%20%20%20var%20marks%20%3D%20this%2EfindMarksAt%28pos%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20marks%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20if%20%28marks%5Bi%5D%2E%5F%5FisFold%29%20return%20true%3B%0A%20%20%7D%29%3B%0A%0A%20%20CodeMirror%2Ecommands%2EtoggleFold%20%3D%20function%28cm%29%20%7B%0A%20%20%20%20cm%2EfoldCode%28cm%2EgetCursor%28%29%29%3B%0A%20%20%7D%3B%0A%20%20CodeMirror%2Ecommands%2Efold%20%3D%20function%28cm%29%20%7B%0A%20%20%20%20cm%2EfoldCode%28cm%2EgetCursor%28%29%2C%20null%2C%20%22fold%22%29%3B%0A%20%20%7D%3B%0A%20%20CodeMirror%2Ecommands%2Eunfold%20%3D%20function%28cm%29%20%7B%0A%20%20%20%20cm%2EfoldCode%28cm%2EgetCursor%28%29%2C%20null%2C%20%22unfold%22%29%3B%0A%20%20%7D%3B%0A%20%20CodeMirror%2Ecommands%2EfoldAll%20%3D%20function%28cm%29%20%7B%0A%20%20%20%20cm%2Eoperation%28function%28%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%20cm%2EfirstLine%28%29%2C%20e%20%3D%20cm%2ElastLine%28%29%3B%20i%20%3C%3D%20e%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20cm%2EfoldCode%28CodeMirror%2EPos%28i%2C%200%29%2C%20null%2C%20%22fold%22%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%3B%0A%20%20CodeMirror%2Ecommands%2EunfoldAll%20%3D%20function%28cm%29%20%7B%0A%20%20%20%20cm%2Eoperation%28function%28%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%20cm%2EfirstLine%28%29%2C%20e%20%3D%20cm%2ElastLine%28%29%3B%20i%20%3C%3D%20e%3B%20i%2B%2B%29%0A%20%20%20%20%20%20%20%20cm%2EfoldCode%28CodeMirror%2EPos%28i%2C%200%29%2C%20null%2C%20%22unfold%22%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%3B%0A%0A%20%20CodeMirror%2EregisterHelper%28%22fold%22%2C%20%22combine%22%2C%20function%28%29%20%7B%0A%20%20%20%20var%20funcs%20%3D%20Array%2Eprototype%2Eslice%2Ecall%28arguments%2C%200%29%3B%0A%20%20%20%20return%20function%28cm%2C%20start%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20funcs%2Elength%3B%20%2B%2Bi%29%20%7B%0A%20%20%20%20%20%20%20%20var%20found%20%3D%20funcs%5Bi%5D%28cm%2C%20start%29%3B%0A%20%20%20%20%20%20%20%20if%20%28found%29%20return%20found%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%20%20%7D%29%3B%0A%0A%20%20CodeMirror%2EregisterHelper%28%22fold%22%2C%20%22auto%22%2C%20function%28cm%2C%20start%29%20%7B%0A%20%20%20%20var%20helpers%20%3D%20cm%2EgetHelpers%28start%2C%20%22fold%22%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20helpers%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20cur%20%3D%20helpers%5Bi%5D%28cm%2C%20start%29%3B%0A%20%20%20%20%20%20if%20%28cur%29%20return%20cur%3B%0A%20%20%20%20%7D%0A%20%20%7D%29%3B%0A%0A%20%20var%20defaultOptions%20%3D%20%7B%0A%20%20%20%20rangeFinder%3A%20CodeMirror%2Efold%2Eauto%2C%0A%20%20%20%20widget%3A%20%22%5Cu2194%22%2C%0A%20%20%20%20minFoldSize%3A%200%2C%0A%20%20%20%20scanUp%3A%20false%0A%20%20%7D%3B%0A%0A%20%20CodeMirror%2EdefineOption%28%22foldOptions%22%2C%20null%29%3B%0A%0A%20%20function%20getOption%28cm%2C%20options%2C%20name%29%20%7B%0A%20%20%20%20if%20%28options%20%26%26%20options%5Bname%5D%20%21%3D%3D%20undefined%29%0A%20%20%20%20%20%20return%20options%5Bname%5D%3B%0A%20%20%20%20var%20editorOptions%20%3D%20cm%2Eoptions%2EfoldOptions%3B%0A%20%20%20%20if%20%28editorOptions%20%26%26%20editorOptions%5Bname%5D%20%21%3D%3D%20undefined%29%0A%20%20%20%20%20%20return%20editorOptions%5Bname%5D%3B%0A%20%20%20%20return%20defaultOptions%5Bname%5D%3B%0A%20%20%7D%0A%0A%20%20CodeMirror%2EdefineExtension%28%22foldOption%22%2C%20function%28options%2C%20name%29%20%7B%0A%20%20%20%20return%20getOption%28this%2C%20options%2C%20name%29%3B%0A%20%20%7D%29%3B%0A%7D%29%3B%0A"></script>
<link href="data:text/css,%2ECodeMirror%2Dfoldmarker%20%7B%0A%20%20color%3A%20blue%3B%0A%20%20text%2Dshadow%3A%20%23b9f%201px%201px%202px%2C%20%23b9f%20%2D1px%20%2D1px%202px%2C%20%23b9f%201px%20%2D1px%202px%2C%20%23b9f%20%2D1px%201px%202px%3B%0A%20%20font%2Dfamily%3A%20arial%3B%0A%20%20line%2Dheight%3A%20%2E3%3B%0A%20%20cursor%3A%20pointer%3B%0A%7D%0A%2ECodeMirror%2Dfoldgutter%20%7B%0A%20%20width%3A%20%2E7em%3B%0A%7D%0A%2ECodeMirror%2Dfoldgutter%2Dopen%2C%0A%2ECodeMirror%2Dfoldgutter%2Dfolded%20%7B%0A%20%20cursor%3A%20pointer%3B%0A%7D%0A%2ECodeMirror%2Dfoldgutter%2Dopen%3Aafter%20%7B%0A%20%20content%3A%20%22%5C25BE%22%3B%0A%7D%0A%2ECodeMirror%2Dfoldgutter%2Dfolded%3Aafter%20%7B%0A%20%20content%3A%20%22%5C25B8%22%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript,%2F%2F%20CodeMirror%2C%20copyright%20%28c%29%20by%20Marijn%20Haverbeke%20and%20others%0A%2F%2F%20Distributed%20under%20an%20MIT%20license%3A%20http%3A%2F%2Fcodemirror%2Enet%2FLICENSE%0A%0A%28function%28mod%29%20%7B%0A%20%20if%20%28typeof%20exports%20%3D%3D%20%22object%22%20%26%26%20typeof%20module%20%3D%3D%20%22object%22%29%20%2F%2F%20CommonJS%0A%20%20%20%20mod%28require%28%22%2E%2E%2F%2E%2E%2Flib%2Fcodemirror%22%29%2C%20require%28%22%2E%2Ffoldcode%22%29%29%3B%0A%20%20else%20if%20%28typeof%20define%20%3D%3D%20%22function%22%20%26%26%20define%2Eamd%29%20%2F%2F%20AMD%0A%20%20%20%20define%28%5B%22%2E%2E%2F%2E%2E%2Flib%2Fcodemirror%22%2C%20%22%2E%2Ffoldcode%22%5D%2C%20mod%29%3B%0A%20%20else%20%2F%2F%20Plain%20browser%20env%0A%20%20%20%20mod%28CodeMirror%29%3B%0A%7D%29%28function%28CodeMirror%29%20%7B%0A%20%20%22use%20strict%22%3B%0A%0A%20%20CodeMirror%2EdefineOption%28%22foldGutter%22%2C%20false%2C%20function%28cm%2C%20val%2C%20old%29%20%7B%0A%20%20%20%20if%20%28old%20%26%26%20old%20%21%3D%20CodeMirror%2EInit%29%20%7B%0A%20%20%20%20%20%20cm%2EclearGutter%28cm%2Estate%2EfoldGutter%2Eoptions%2Egutter%29%3B%0A%20%20%20%20%20%20cm%2Estate%2EfoldGutter%20%3D%20null%3B%0A%20%20%20%20%20%20cm%2Eoff%28%22gutterClick%22%2C%20onGutterClick%29%3B%0A%20%20%20%20%20%20cm%2Eoff%28%22change%22%2C%20onChange%29%3B%0A%20%20%20%20%20%20cm%2Eoff%28%22viewportChange%22%2C%20onViewportChange%29%3B%0A%20%20%20%20%20%20cm%2Eoff%28%22fold%22%2C%20onFold%29%3B%0A%20%20%20%20%20%20cm%2Eoff%28%22unfold%22%2C%20onFold%29%3B%0A%20%20%20%20%20%20cm%2Eoff%28%22swapDoc%22%2C%20onChange%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28val%29%20%7B%0A%20%20%20%20%20%20cm%2Estate%2EfoldGutter%20%3D%20new%20State%28parseOptions%28val%29%29%3B%0A%20%20%20%20%20%20updateInViewport%28cm%29%3B%0A%20%20%20%20%20%20cm%2Eon%28%22gutterClick%22%2C%20onGutterClick%29%3B%0A%20%20%20%20%20%20cm%2Eon%28%22change%22%2C%20onChange%29%3B%0A%20%20%20%20%20%20cm%2Eon%28%22viewportChange%22%2C%20onViewportChange%29%3B%0A%20%20%20%20%20%20cm%2Eon%28%22fold%22%2C%20onFold%29%3B%0A%20%20%20%20%20%20cm%2Eon%28%22unfold%22%2C%20onFold%29%3B%0A%20%20%20%20%20%20cm%2Eon%28%22swapDoc%22%2C%20onChange%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%29%3B%0A%0A%20%20var%20Pos%20%3D%20CodeMirror%2EPos%3B%0A%0A%20%20function%20State%28options%29%20%7B%0A%20%20%20%20this%2Eoptions%20%3D%20options%3B%0A%20%20%20%20this%2Efrom%20%3D%20this%2Eto%20%3D%200%3B%0A%20%20%7D%0A%0A%20%20function%20parseOptions%28opts%29%20%7B%0A%20%20%20%20if%20%28opts%20%3D%3D%3D%20true%29%20opts%20%3D%20%7B%7D%3B%0A%20%20%20%20if%20%28opts%2Egutter%20%3D%3D%20null%29%20opts%2Egutter%20%3D%20%22CodeMirror%2Dfoldgutter%22%3B%0A%20%20%20%20if%20%28opts%2EindicatorOpen%20%3D%3D%20null%29%20opts%2EindicatorOpen%20%3D%20%22CodeMirror%2Dfoldgutter%2Dopen%22%3B%0A%20%20%20%20if%20%28opts%2EindicatorFolded%20%3D%3D%20null%29%20opts%2EindicatorFolded%20%3D%20%22CodeMirror%2Dfoldgutter%2Dfolded%22%3B%0A%20%20%20%20return%20opts%3B%0A%20%20%7D%0A%0A%20%20function%20isFolded%28cm%2C%20line%29%20%7B%0A%20%20%20%20var%20marks%20%3D%20cm%2EfindMarksAt%28Pos%28line%29%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20marks%2Elength%3B%20%2B%2Bi%29%0A%20%20%20%20%20%20if%20%28marks%5Bi%5D%2E%5F%5FisFold%20%26%26%20marks%5Bi%5D%2Efind%28%29%2Efrom%2Eline%20%3D%3D%20line%29%20return%20marks%5Bi%5D%3B%0A%20%20%7D%0A%0A%20%20function%20marker%28spec%29%20%7B%0A%20%20%20%20if%20%28typeof%20spec%20%3D%3D%20%22string%22%29%20%7B%0A%20%20%20%20%20%20var%20elt%20%3D%20document%2EcreateElement%28%22div%22%29%3B%0A%20%20%20%20%20%20elt%2EclassName%20%3D%20spec%20%2B%20%22%20CodeMirror%2Dguttermarker%2Dsubtle%22%3B%0A%20%20%20%20%20%20return%20elt%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20spec%2EcloneNode%28true%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20updateFoldInfo%28cm%2C%20from%2C%20to%29%20%7B%0A%20%20%20%20var%20opts%20%3D%20cm%2Estate%2EfoldGutter%2Eoptions%2C%20cur%20%3D%20from%3B%0A%20%20%20%20var%20minSize%20%3D%20cm%2EfoldOption%28opts%2C%20%22minFoldSize%22%29%3B%0A%20%20%20%20var%20func%20%3D%20cm%2EfoldOption%28opts%2C%20%22rangeFinder%22%29%3B%0A%20%20%20%20cm%2EeachLine%28from%2C%20to%2C%20function%28line%29%20%7B%0A%20%20%20%20%20%20var%20mark%20%3D%20null%3B%0A%20%20%20%20%20%20if%20%28isFolded%28cm%2C%20cur%29%29%20%7B%0A%20%20%20%20%20%20%20%20mark%20%3D%20marker%28opts%2EindicatorFolded%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20var%20pos%20%3D%20Pos%28cur%2C%200%29%3B%0A%20%20%20%20%20%20%20%20var%20range%20%3D%20func%20%26%26%20func%28cm%2C%20pos%29%3B%0A%20%20%20%20%20%20%20%20if%20%28range%20%26%26%20range%2Eto%2Eline%20%2D%20range%2Efrom%2Eline%20%3E%3D%20minSize%29%0A%20%20%20%20%20%20%20%20%20%20mark%20%3D%20marker%28opts%2EindicatorOpen%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20cm%2EsetGutterMarker%28line%2C%20opts%2Egutter%2C%20mark%29%3B%0A%20%20%20%20%20%20%2B%2Bcur%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%0A%0A%20%20function%20updateInViewport%28cm%29%20%7B%0A%20%20%20%20var%20vp%20%3D%20cm%2EgetViewport%28%29%2C%20state%20%3D%20cm%2Estate%2EfoldGutter%3B%0A%20%20%20%20if%20%28%21state%29%20return%3B%0A%20%20%20%20cm%2Eoperation%28function%28%29%20%7B%0A%20%20%20%20%20%20updateFoldInfo%28cm%2C%20vp%2Efrom%2C%20vp%2Eto%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20state%2Efrom%20%3D%20vp%2Efrom%3B%20state%2Eto%20%3D%20vp%2Eto%3B%0A%20%20%7D%0A%0A%20%20function%20onGutterClick%28cm%2C%20line%2C%20gutter%29%20%7B%0A%20%20%20%20var%20state%20%3D%20cm%2Estate%2EfoldGutter%3B%0A%20%20%20%20if%20%28%21state%29%20return%3B%0A%20%20%20%20var%20opts%20%3D%20state%2Eoptions%3B%0A%20%20%20%20if%20%28gutter%20%21%3D%20opts%2Egutter%29%20return%3B%0A%20%20%20%20var%20folded%20%3D%20isFolded%28cm%2C%20line%29%3B%0A%20%20%20%20if%20%28folded%29%20folded%2Eclear%28%29%3B%0A%20%20%20%20else%20cm%2EfoldCode%28Pos%28line%2C%200%29%2C%20opts%2ErangeFinder%29%3B%0A%20%20%7D%0A%0A%20%20function%20onChange%28cm%29%20%7B%0A%20%20%20%20var%20state%20%3D%20cm%2Estate%2EfoldGutter%3B%0A%20%20%20%20if%20%28%21state%29%20return%3B%0A%20%20%20%20var%20opts%20%3D%20state%2Eoptions%3B%0A%20%20%20%20state%2Efrom%20%3D%20state%2Eto%20%3D%200%3B%0A%20%20%20%20clearTimeout%28state%2EchangeUpdate%29%3B%0A%20%20%20%20state%2EchangeUpdate%20%3D%20setTimeout%28function%28%29%20%7B%20updateInViewport%28cm%29%3B%20%7D%2C%20opts%2EfoldOnChangeTimeSpan%20%7C%7C%20600%29%3B%0A%20%20%7D%0A%0A%20%20function%20onViewportChange%28cm%29%20%7B%0A%20%20%20%20var%20state%20%3D%20cm%2Estate%2EfoldGutter%3B%0A%20%20%20%20if%20%28%21state%29%20return%3B%0A%20%20%20%20var%20opts%20%3D%20state%2Eoptions%3B%0A%20%20%20%20clearTimeout%28state%2EchangeUpdate%29%3B%0A%20%20%20%20state%2EchangeUpdate%20%3D%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20var%20vp%20%3D%20cm%2EgetViewport%28%29%3B%0A%20%20%20%20%20%20if%20%28state%2Efrom%20%3D%3D%20state%2Eto%20%7C%7C%20vp%2Efrom%20%2D%20state%2Eto%20%3E%2020%20%7C%7C%20state%2Efrom%20%2D%20vp%2Eto%20%3E%2020%29%20%7B%0A%20%20%20%20%20%20%20%20updateInViewport%28cm%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20cm%2Eoperation%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28vp%2Efrom%20%3C%20state%2Efrom%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20updateFoldInfo%28cm%2C%20vp%2Efrom%2C%20state%2Efrom%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20state%2Efrom%20%3D%20vp%2Efrom%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28vp%2Eto%20%3E%20state%2Eto%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20updateFoldInfo%28cm%2C%20state%2Eto%2C%20vp%2Eto%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20state%2Eto%20%3D%20vp%2Eto%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%20opts%2EupdateViewportTimeSpan%20%7C%7C%20400%29%3B%0A%20%20%7D%0A%0A%20%20function%20onFold%28cm%2C%20from%29%20%7B%0A%20%20%20%20var%20state%20%3D%20cm%2Estate%2EfoldGutter%3B%0A%20%20%20%20if%20%28%21state%29%20return%3B%0A%20%20%20%20var%20line%20%3D%20from%2Eline%3B%0A%20%20%20%20if%20%28line%20%3E%3D%20state%2Efrom%20%26%26%20line%20%3C%20state%2Eto%29%0A%20%20%20%20%20%20updateFoldInfo%28cm%2C%20line%2C%20line%20%2B%201%29%3B%0A%20%20%7D%0A%7D%29%3B%0A"></script>
<script src="data:application/x-javascript,%2F%2F%20CodeMirror%2C%20copyright%20%28c%29%20by%20Marijn%20Haverbeke%20and%20others%0A%2F%2F%20Distributed%20under%20an%20MIT%20license%3A%20http%3A%2F%2Fcodemirror%2Enet%2FLICENSE%0A%0A%28function%28mod%29%20%7B%0A%20%20if%20%28typeof%20exports%20%3D%3D%20%22object%22%20%26%26%20typeof%20module%20%3D%3D%20%22object%22%29%20%2F%2F%20CommonJS%0A%20%20%20%20mod%28require%28%22%2E%2E%2F%2E%2E%2Flib%2Fcodemirror%22%29%29%3B%0A%20%20else%20if%20%28typeof%20define%20%3D%3D%20%22function%22%20%26%26%20define%2Eamd%29%20%2F%2F%20AMD%0A%20%20%20%20define%28%5B%22%2E%2E%2F%2E%2E%2Flib%2Fcodemirror%22%5D%2C%20mod%29%3B%0A%20%20else%20%2F%2F%20Plain%20browser%20env%0A%20%20%20%20mod%28CodeMirror%29%3B%0A%7D%29%28function%28CodeMirror%29%20%7B%0A%20%20%22use%20strict%22%3B%0A%0A%20%20var%20Pos%20%3D%20CodeMirror%2EPos%3B%0A%20%20function%20cmp%28a%2C%20b%29%20%7B%20return%20a%2Eline%20%2D%20b%2Eline%20%7C%7C%20a%2Ech%20%2D%20b%2Ech%3B%20%7D%0A%0A%20%20var%20nameStartChar%20%3D%20%22A%2DZ%5Fa%2Dz%5C%5Cu00C0%2D%5C%5Cu00D6%5C%5Cu00D8%2D%5C%5Cu00F6%5C%5Cu00F8%2D%5C%5Cu02FF%5C%5Cu0370%2D%5C%5Cu037D%5C%5Cu037F%2D%5C%5Cu1FFF%5C%5Cu200C%2D%5C%5Cu200D%5C%5Cu2070%2D%5C%5Cu218F%5C%5Cu2C00%2D%5C%5Cu2FEF%5C%5Cu3001%2D%5C%5CuD7FF%5C%5CuF900%2D%5C%5CuFDCF%5C%5CuFDF0%2D%5C%5CuFFFD%22%3B%0A%20%20var%20nameChar%20%3D%20nameStartChar%20%2B%20%22%5C%2D%5C%3A%5C%2E0%2D9%5C%5Cu00B7%5C%5Cu0300%2D%5C%5Cu036F%5C%5Cu203F%2D%5C%5Cu2040%22%3B%0A%20%20var%20xmlTagStart%20%3D%20new%20RegExp%28%22%3C%28%2F%3F%29%28%5B%22%20%2B%20nameStartChar%20%2B%20%22%5D%5B%22%20%2B%20nameChar%20%2B%20%22%5D%2A%29%22%2C%20%22g%22%29%3B%0A%0A%20%20function%20Iter%28cm%2C%20line%2C%20ch%2C%20range%29%20%7B%0A%20%20%20%20this%2Eline%20%3D%20line%3B%20this%2Ech%20%3D%20ch%3B%0A%20%20%20%20this%2Ecm%20%3D%20cm%3B%20this%2Etext%20%3D%20cm%2EgetLine%28line%29%3B%0A%20%20%20%20this%2Emin%20%3D%20range%20%3F%20range%2Efrom%20%3A%20cm%2EfirstLine%28%29%3B%0A%20%20%20%20this%2Emax%20%3D%20range%20%3F%20range%2Eto%20%2D%201%20%3A%20cm%2ElastLine%28%29%3B%0A%20%20%7D%0A%0A%20%20function%20tagAt%28iter%2C%20ch%29%20%7B%0A%20%20%20%20var%20type%20%3D%20iter%2Ecm%2EgetTokenTypeAt%28Pos%28iter%2Eline%2C%20ch%29%29%3B%0A%20%20%20%20return%20type%20%26%26%20%2F%5Cbtag%5Cb%2F%2Etest%28type%29%3B%0A%20%20%7D%0A%0A%20%20function%20nextLine%28iter%29%20%7B%0A%20%20%20%20if%20%28iter%2Eline%20%3E%3D%20iter%2Emax%29%20return%3B%0A%20%20%20%20iter%2Ech%20%3D%200%3B%0A%20%20%20%20iter%2Etext%20%3D%20iter%2Ecm%2EgetLine%28%2B%2Biter%2Eline%29%3B%0A%20%20%20%20return%20true%3B%0A%20%20%7D%0A%20%20function%20prevLine%28iter%29%20%7B%0A%20%20%20%20if%20%28iter%2Eline%20%3C%3D%20iter%2Emin%29%20return%3B%0A%20%20%20%20iter%2Etext%20%3D%20iter%2Ecm%2EgetLine%28%2D%2Diter%2Eline%29%3B%0A%20%20%20%20iter%2Ech%20%3D%20iter%2Etext%2Elength%3B%0A%20%20%20%20return%20true%3B%0A%20%20%7D%0A%0A%20%20function%20toTagEnd%28iter%29%20%7B%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20var%20gt%20%3D%20iter%2Etext%2EindexOf%28%22%3E%22%2C%20iter%2Ech%29%3B%0A%20%20%20%20%20%20if%20%28gt%20%3D%3D%20%2D1%29%20%7B%20if%20%28nextLine%28iter%29%29%20continue%3B%20else%20return%3B%20%7D%0A%20%20%20%20%20%20if%20%28%21tagAt%28iter%2C%20gt%20%2B%201%29%29%20%7B%20iter%2Ech%20%3D%20gt%20%2B%201%3B%20continue%3B%20%7D%0A%20%20%20%20%20%20var%20lastSlash%20%3D%20iter%2Etext%2ElastIndexOf%28%22%2F%22%2C%20gt%29%3B%0A%20%20%20%20%20%20var%20selfClose%20%3D%20lastSlash%20%3E%20%2D1%20%26%26%20%21%2F%5CS%2F%2Etest%28iter%2Etext%2Eslice%28lastSlash%20%2B%201%2C%20gt%29%29%3B%0A%20%20%20%20%20%20iter%2Ech%20%3D%20gt%20%2B%201%3B%0A%20%20%20%20%20%20return%20selfClose%20%3F%20%22selfClose%22%20%3A%20%22regular%22%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20function%20toTagStart%28iter%29%20%7B%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20var%20lt%20%3D%20iter%2Ech%20%3F%20iter%2Etext%2ElastIndexOf%28%22%3C%22%2C%20iter%2Ech%20%2D%201%29%20%3A%20%2D1%3B%0A%20%20%20%20%20%20if%20%28lt%20%3D%3D%20%2D1%29%20%7B%20if%20%28prevLine%28iter%29%29%20continue%3B%20else%20return%3B%20%7D%0A%20%20%20%20%20%20if%20%28%21tagAt%28iter%2C%20lt%20%2B%201%29%29%20%7B%20iter%2Ech%20%3D%20lt%3B%20continue%3B%20%7D%0A%20%20%20%20%20%20xmlTagStart%2ElastIndex%20%3D%20lt%3B%0A%20%20%20%20%20%20iter%2Ech%20%3D%20lt%3B%0A%20%20%20%20%20%20var%20match%20%3D%20xmlTagStart%2Eexec%28iter%2Etext%29%3B%0A%20%20%20%20%20%20if%20%28match%20%26%26%20match%2Eindex%20%3D%3D%20lt%29%20return%20match%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20toNextTag%28iter%29%20%7B%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20xmlTagStart%2ElastIndex%20%3D%20iter%2Ech%3B%0A%20%20%20%20%20%20var%20found%20%3D%20xmlTagStart%2Eexec%28iter%2Etext%29%3B%0A%20%20%20%20%20%20if%20%28%21found%29%20%7B%20if%20%28nextLine%28iter%29%29%20continue%3B%20else%20return%3B%20%7D%0A%20%20%20%20%20%20if%20%28%21tagAt%28iter%2C%20found%2Eindex%20%2B%201%29%29%20%7B%20iter%2Ech%20%3D%20found%2Eindex%20%2B%201%3B%20continue%3B%20%7D%0A%20%20%20%20%20%20iter%2Ech%20%3D%20found%2Eindex%20%2B%20found%5B0%5D%2Elength%3B%0A%20%20%20%20%20%20return%20found%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20function%20toPrevTag%28iter%29%20%7B%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20var%20gt%20%3D%20iter%2Ech%20%3F%20iter%2Etext%2ElastIndexOf%28%22%3E%22%2C%20iter%2Ech%20%2D%201%29%20%3A%20%2D1%3B%0A%20%20%20%20%20%20if%20%28gt%20%3D%3D%20%2D1%29%20%7B%20if%20%28prevLine%28iter%29%29%20continue%3B%20else%20return%3B%20%7D%0A%20%20%20%20%20%20if%20%28%21tagAt%28iter%2C%20gt%20%2B%201%29%29%20%7B%20iter%2Ech%20%3D%20gt%3B%20continue%3B%20%7D%0A%20%20%20%20%20%20var%20lastSlash%20%3D%20iter%2Etext%2ElastIndexOf%28%22%2F%22%2C%20gt%29%3B%0A%20%20%20%20%20%20var%20selfClose%20%3D%20lastSlash%20%3E%20%2D1%20%26%26%20%21%2F%5CS%2F%2Etest%28iter%2Etext%2Eslice%28lastSlash%20%2B%201%2C%20gt%29%29%3B%0A%20%20%20%20%20%20iter%2Ech%20%3D%20gt%20%2B%201%3B%0A%20%20%20%20%20%20return%20selfClose%20%3F%20%22selfClose%22%20%3A%20%22regular%22%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20findMatchingClose%28iter%2C%20tag%29%20%7B%0A%20%20%20%20var%20stack%20%3D%20%5B%5D%3B%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20var%20next%20%3D%20toNextTag%28iter%29%2C%20end%2C%20startLine%20%3D%20iter%2Eline%2C%20startCh%20%3D%20iter%2Ech%20%2D%20%28next%20%3F%20next%5B0%5D%2Elength%20%3A%200%29%3B%0A%20%20%20%20%20%20if%20%28%21next%20%7C%7C%20%21%28end%20%3D%20toTagEnd%28iter%29%29%29%20return%3B%0A%20%20%20%20%20%20if%20%28end%20%3D%3D%20%22selfClose%22%29%20continue%3B%0A%20%20%20%20%20%20if%20%28next%5B1%5D%29%20%7B%20%2F%2F%20closing%20tag%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%20stack%2Elength%20%2D%201%3B%20i%20%3E%3D%200%3B%20%2D%2Di%29%20if%20%28stack%5Bi%5D%20%3D%3D%20next%5B2%5D%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20stack%2Elength%20%3D%20i%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28i%20%3C%200%20%26%26%20%28%21tag%20%7C%7C%20tag%20%3D%3D%20next%5B2%5D%29%29%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20tag%3A%20next%5B2%5D%2C%0A%20%20%20%20%20%20%20%20%20%20from%3A%20Pos%28startLine%2C%20startCh%29%2C%0A%20%20%20%20%20%20%20%20%20%20to%3A%20Pos%28iter%2Eline%2C%20iter%2Ech%29%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%20%2F%2F%20opening%20tag%0A%20%20%20%20%20%20%20%20stack%2Epush%28next%5B2%5D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20function%20findMatchingOpen%28iter%2C%20tag%29%20%7B%0A%20%20%20%20var%20stack%20%3D%20%5B%5D%3B%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20var%20prev%20%3D%20toPrevTag%28iter%29%3B%0A%20%20%20%20%20%20if%20%28%21prev%29%20return%3B%0A%20%20%20%20%20%20if%20%28prev%20%3D%3D%20%22selfClose%22%29%20%7B%20toTagStart%28iter%29%3B%20continue%3B%20%7D%0A%20%20%20%20%20%20var%20endLine%20%3D%20iter%2Eline%2C%20endCh%20%3D%20iter%2Ech%3B%0A%20%20%20%20%20%20var%20start%20%3D%20toTagStart%28iter%29%3B%0A%20%20%20%20%20%20if%20%28%21start%29%20return%3B%0A%20%20%20%20%20%20if%20%28start%5B1%5D%29%20%7B%20%2F%2F%20closing%20tag%0A%20%20%20%20%20%20%20%20stack%2Epush%28start%5B2%5D%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%20%2F%2F%20opening%20tag%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%20stack%2Elength%20%2D%201%3B%20i%20%3E%3D%200%3B%20%2D%2Di%29%20if%20%28stack%5Bi%5D%20%3D%3D%20start%5B2%5D%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20stack%2Elength%20%3D%20i%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20%28i%20%3C%200%20%26%26%20%28%21tag%20%7C%7C%20tag%20%3D%3D%20start%5B2%5D%29%29%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20tag%3A%20start%5B2%5D%2C%0A%20%20%20%20%20%20%20%20%20%20from%3A%20Pos%28iter%2Eline%2C%20iter%2Ech%29%2C%0A%20%20%20%20%20%20%20%20%20%20to%3A%20Pos%28endLine%2C%20endCh%29%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20CodeMirror%2EregisterHelper%28%22fold%22%2C%20%22xml%22%2C%20function%28cm%2C%20start%29%20%7B%0A%20%20%20%20var%20iter%20%3D%20new%20Iter%28cm%2C%20start%2Eline%2C%200%29%3B%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20var%20openTag%20%3D%20toNextTag%28iter%29%2C%20end%3B%0A%20%20%20%20%20%20if%20%28%21openTag%20%7C%7C%20iter%2Eline%20%21%3D%20start%2Eline%20%7C%7C%20%21%28end%20%3D%20toTagEnd%28iter%29%29%29%20return%3B%0A%20%20%20%20%20%20if%20%28%21openTag%5B1%5D%20%26%26%20end%20%21%3D%20%22selfClose%22%29%20%7B%0A%20%20%20%20%20%20%20%20var%20start%20%3D%20Pos%28iter%2Eline%2C%20iter%2Ech%29%3B%0A%20%20%20%20%20%20%20%20var%20close%20%3D%20findMatchingClose%28iter%2C%20openTag%5B2%5D%29%3B%0A%20%20%20%20%20%20%20%20return%20close%20%26%26%20%7Bfrom%3A%20start%2C%20to%3A%20close%2Efrom%7D%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%29%3B%0A%20%20CodeMirror%2EfindMatchingTag%20%3D%20function%28cm%2C%20pos%2C%20range%29%20%7B%0A%20%20%20%20var%20iter%20%3D%20new%20Iter%28cm%2C%20pos%2Eline%2C%20pos%2Ech%2C%20range%29%3B%0A%20%20%20%20if%20%28iter%2Etext%2EindexOf%28%22%3E%22%29%20%3D%3D%20%2D1%20%26%26%20iter%2Etext%2EindexOf%28%22%3C%22%29%20%3D%3D%20%2D1%29%20return%3B%0A%20%20%20%20var%20end%20%3D%20toTagEnd%28iter%29%2C%20to%20%3D%20end%20%26%26%20Pos%28iter%2Eline%2C%20iter%2Ech%29%3B%0A%20%20%20%20var%20start%20%3D%20end%20%26%26%20toTagStart%28iter%29%3B%0A%20%20%20%20if%20%28%21end%20%7C%7C%20%21start%20%7C%7C%20cmp%28iter%2C%20pos%29%20%3E%200%29%20return%3B%0A%20%20%20%20var%20here%20%3D%20%7Bfrom%3A%20Pos%28iter%2Eline%2C%20iter%2Ech%29%2C%20to%3A%20to%2C%20tag%3A%20start%5B2%5D%7D%3B%0A%20%20%20%20if%20%28end%20%3D%3D%20%22selfClose%22%29%20return%20%7Bopen%3A%20here%2C%20close%3A%20null%2C%20at%3A%20%22open%22%7D%3B%0A%0A%20%20%20%20if%20%28start%5B1%5D%29%20%7B%20%2F%2F%20closing%20tag%0A%20%20%20%20%20%20return%20%7Bopen%3A%20findMatchingOpen%28iter%2C%20start%5B2%5D%29%2C%20close%3A%20here%2C%20at%3A%20%22close%22%7D%3B%0A%20%20%20%20%7D%20else%20%7B%20%2F%2F%20opening%20tag%0A%20%20%20%20%20%20iter%20%3D%20new%20Iter%28cm%2C%20to%2Eline%2C%20to%2Ech%2C%20range%29%3B%0A%20%20%20%20%20%20return%20%7Bopen%3A%20here%2C%20close%3A%20findMatchingClose%28iter%2C%20start%5B2%5D%29%2C%20at%3A%20%22open%22%7D%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20CodeMirror%2EfindEnclosingTag%20%3D%20function%28cm%2C%20pos%2C%20range%29%20%7B%0A%20%20%20%20var%20iter%20%3D%20new%20Iter%28cm%2C%20pos%2Eline%2C%20pos%2Ech%2C%20range%29%3B%0A%20%20%20%20for%20%28%3B%3B%29%20%7B%0A%20%20%20%20%20%20var%20open%20%3D%20findMatchingOpen%28iter%29%3B%0A%20%20%20%20%20%20if%20%28%21open%29%20break%3B%0A%20%20%20%20%20%20var%20forward%20%3D%20new%20Iter%28cm%2C%20pos%2Eline%2C%20pos%2Ech%2C%20range%29%3B%0A%20%20%20%20%20%20var%20close%20%3D%20findMatchingClose%28forward%2C%20open%2Etag%29%3B%0A%20%20%20%20%20%20if%20%28close%29%20return%20%7Bopen%3A%20open%2C%20close%3A%20close%7D%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Used%20by%20addon%2Fedit%2Fclosetag%2Ejs%0A%20%20CodeMirror%2EscanForClosingTag%20%3D%20function%28cm%2C%20pos%2C%20name%2C%20end%29%20%7B%0A%20%20%20%20var%20iter%20%3D%20new%20Iter%28cm%2C%20pos%2Eline%2C%20pos%2Ech%2C%20end%20%3F%20%7Bfrom%3A%200%2C%20to%3A%20end%7D%20%3A%20null%29%3B%0A%20%20%20%20return%20findMatchingClose%28iter%2C%20name%29%3B%0A%20%20%7D%3B%0A%7D%29%3B%0A"></script>
<style type="text/css">code{white-space: pre;}</style>
<style type="text/css">
table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {
margin: 0; padding: 0; vertical-align: baseline; border: none; }
table.sourceCode { width: 100%; line-height: 100%; }
td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; }
td.sourceCode { padding-left: 5px; }
code > span.kw { color: #007020; font-weight: bold; }
code > span.dt { color: #902000; }
code > span.dv { color: #40a070; }
code > span.bn { color: #40a070; }
code > span.fl { color: #40a070; }
code > span.ch { color: #4070a0; }
code > span.st { color: #4070a0; }
code > span.co { color: #60a0b0; font-style: italic; }
code > span.ot { color: #007020; }
code > span.al { color: #ff0000; font-weight: bold; }
code > span.fu { color: #06287e; }
code > span.er { color: #ff0000; font-weight: bold; }
</style>
<style type="text/css">
pre:not([class]) {
background-color: white;
}
</style>
<link href="data:text/css,body%20%7B%0A%20%20background%2Dcolor%3A%20%23fff%3B%0A%20%20margin%3A%201em%20auto%3B%0A%20%20max%2Dwidth%3A%20700px%3B%0A%20%20overflow%3A%20visible%3B%0A%20%20padding%2Dleft%3A%202em%3B%0A%20%20padding%2Dright%3A%202em%3B%0A%20%20font%2Dfamily%3A%20%22Open%20Sans%22%2C%20%22Helvetica%20Neue%22%2C%20Helvetica%2C%20Arial%2C%20sans%2Dserif%3B%0A%20%20font%2Dsize%3A%2014px%3B%0A%20%20line%2Dheight%3A%201%2E35%3B%0A%7D%0A%0A%23header%20%7B%0A%20%20text%2Dalign%3A%20center%3B%0A%7D%0A%0A%23TOC%20%7B%0A%20%20clear%3A%20both%3B%0A%20%20margin%3A%200%200%2010px%2010px%3B%0A%20%20padding%3A%204px%3B%0A%20%20width%3A%20400px%3B%0A%20%20border%3A%201px%20solid%20%23CCCCCC%3B%0A%20%20border%2Dradius%3A%205px%3B%0A%0A%20%20background%2Dcolor%3A%20%23f6f6f6%3B%0A%20%20font%2Dsize%3A%2013px%3B%0A%20%20line%2Dheight%3A%201%2E3%3B%0A%7D%0A%20%20%23TOC%20%2Etoctitle%20%7B%0A%20%20%20%20font%2Dweight%3A%20bold%3B%0A%20%20%20%20font%2Dsize%3A%2015px%3B%0A%20%20%20%20margin%2Dleft%3A%205px%3B%0A%20%20%7D%0A%0A%20%20%23TOC%20ul%20%7B%0A%20%20%20%20padding%2Dleft%3A%2040px%3B%0A%20%20%20%20margin%2Dleft%3A%20%2D1%2E5em%3B%0A%20%20%20%20margin%2Dtop%3A%205px%3B%0A%20%20%20%20margin%2Dbottom%3A%205px%3B%0A%20%20%7D%0A%20%20%23TOC%20ul%20ul%20%7B%0A%20%20%20%20margin%2Dleft%3A%20%2D2em%3B%0A%20%20%7D%0A%20%20%23TOC%20li%20%7B%0A%20%20%20%20line%2Dheight%3A%2016px%3B%0A%20%20%7D%0A%0Atable%20%7B%0A%20%20margin%3A%201em%20auto%3B%0A%20%20border%2Dwidth%3A%201px%3B%0A%20%20border%2Dcolor%3A%20%23DDDDDD%3B%0A%20%20border%2Dstyle%3A%20outset%3B%0A%20%20border%2Dcollapse%3A%20collapse%3B%0A%7D%0Atable%20th%20%7B%0A%20%20border%2Dwidth%3A%202px%3B%0A%20%20padding%3A%205px%3B%0A%20%20border%2Dstyle%3A%20inset%3B%0A%7D%0Atable%20td%20%7B%0A%20%20border%2Dwidth%3A%201px%3B%0A%20%20border%2Dstyle%3A%20inset%3B%0A%20%20line%2Dheight%3A%2018px%3B%0A%20%20padding%3A%205px%205px%3B%0A%7D%0Atable%2C%20table%20th%2C%20table%20td%20%7B%0A%20%20border%2Dleft%2Dstyle%3A%20none%3B%0A%20%20border%2Dright%2Dstyle%3A%20none%3B%0A%7D%0Atable%20thead%2C%20table%20tr%2Eeven%20%7B%0A%20%20background%2Dcolor%3A%20%23f7f7f7%3B%0A%7D%0A%0Ap%20%7B%0A%20%20margin%3A%200%2E5em%200%3B%0A%7D%0A%0Ablockquote%20%7B%0A%20%20background%2Dcolor%3A%20%23f6f6f6%3B%0A%20%20padding%3A%200%2E25em%200%2E75em%3B%0A%7D%0A%0Ahr%20%7B%0A%20%20border%2Dstyle%3A%20solid%3B%0A%20%20border%3A%20none%3B%0A%20%20border%2Dtop%3A%201px%20solid%20%23777%3B%0A%20%20margin%3A%2028px%200%3B%0A%7D%0A%0Adl%20%7B%0A%20%20margin%2Dleft%3A%200%3B%0A%7D%0A%20%20dl%20dd%20%7B%0A%20%20%20%20margin%2Dbottom%3A%2013px%3B%0A%20%20%20%20margin%2Dleft%3A%2013px%3B%0A%20%20%7D%0A%20%20dl%20dt%20%7B%0A%20%20%20%20font%2Dweight%3A%20bold%3B%0A%20%20%7D%0A%0Aul%20%7B%0A%20%20margin%2Dtop%3A%200%3B%0A%7D%0A%20%20ul%20li%20%7B%0A%20%20%20%20list%2Dstyle%3A%20circle%20outside%3B%0A%20%20%7D%0A%20%20ul%20ul%20%7B%0A%20%20%20%20margin%2Dbottom%3A%200%3B%0A%20%20%7D%0A%0Apre%2C%20code%20%7B%0A%20%20background%2Dcolor%3A%20%23f7f7f7%3B%0A%20%20border%2Dradius%3A%203px%3B%0A%20%20color%3A%20%23333%3B%0A%7D%0Apre%20%7B%0A%20%20white%2Dspace%3A%20pre%2Dwrap%3B%20%20%20%20%2F%2A%20Wrap%20long%20lines%20%2A%2F%0A%20%20border%2Dradius%3A%203px%3B%0A%20%20margin%3A%205px%200px%2010px%200px%3B%0A%20%20padding%3A%2010px%3B%0A%7D%0Apre%3Anot%28%5Bclass%5D%29%20%7B%0A%20%20background%2Dcolor%3A%20%23f7f7f7%3B%0A%7D%0A%0Acode%20%7B%0A%20%20font%2Dfamily%3A%20Consolas%2C%20Monaco%2C%20%27Courier%20New%27%2C%20monospace%3B%0A%20%20font%2Dsize%3A%2085%25%3B%0A%7D%0Ap%20%3E%20code%2C%20li%20%3E%20code%20%7B%0A%20%20padding%3A%202px%200px%3B%0A%7D%0A%0Adiv%2Efigure%20%7B%0A%20%20text%2Dalign%3A%20center%3B%0A%7D%0Aimg%20%7B%0A%20%20background%2Dcolor%3A%20%23FFFFFF%3B%0A%20%20padding%3A%202px%3B%0A%20%20border%3A%201px%20solid%20%23DDDDDD%3B%0A%20%20border%2Dradius%3A%203px%3B%0A%20%20border%3A%201px%20solid%20%23CCCCCC%3B%0A%20%20margin%3A%200%205px%3B%0A%7D%0A%0Ah1%20%7B%0A%20%20margin%2Dtop%3A%200%3B%0A%20%20font%2Dsize%3A%2035px%3B%0A%20%20line%2Dheight%3A%2040px%3B%0A%7D%0A%0Ah2%20%7B%0A%20%20border%2Dbottom%3A%204px%20solid%20%23f7f7f7%3B%0A%20%20padding%2Dtop%3A%2010px%3B%0A%20%20padding%2Dbottom%3A%202px%3B%0A%20%20font%2Dsize%3A%20145%25%3B%0A%7D%0A%0Ah3%20%7B%0A%20%20border%2Dbottom%3A%202px%20solid%20%23f7f7f7%3B%0A%20%20padding%2Dtop%3A%2010px%3B%0A%20%20font%2Dsize%3A%20120%25%3B%0A%7D%0A%0Ah4%20%7B%0A%20%20border%2Dbottom%3A%201px%20solid%20%23f7f7f7%3B%0A%20%20margin%2Dleft%3A%208px%3B%0A%20%20font%2Dsize%3A%20105%25%3B%0A%7D%0A%0Ah5%2C%20h6%20%7B%0A%20%20border%2Dbottom%3A%201px%20solid%20%23ccc%3B%0A%20%20font%2Dsize%3A%20105%25%3B%0A%7D%0A%0Aa%20%7B%0A%20%20color%3A%20%230033dd%3B%0A%20%20text%2Ddecoration%3A%20none%3B%0A%7D%0A%20%20a%3Ahover%20%7B%0A%20%20%20%20color%3A%20%236666ff%3B%20%7D%0A%20%20a%3Avisited%20%7B%0A%20%20%20%20color%3A%20%23800080%3B%20%7D%0A%20%20a%3Avisited%3Ahover%20%7B%0A%20%20%20%20color%3A%20%23BB00BB%3B%20%7D%0A%20%20a%5Bhref%5E%3D%22http%3A%22%5D%20%7B%0A%20%20%20%20text%2Ddecoration%3A%20underline%3B%20%7D%0A%20%20a%5Bhref%5E%3D%22https%3A%22%5D%20%7B%0A%20%20%20%20text%2Ddecoration%3A%20underline%3B%20%7D%0A%0A%2F%2A%20Class%20described%20in%20https%3A%2F%2Fbenjeffrey%2Ecom%2Fposts%2Fpandoc%2Dsyntax%2Dhighlighting%2Dcss%0A%20%20%20Colours%20from%20https%3A%2F%2Fgist%2Egithub%2Ecom%2Frobsimmons%2F1172277%20%2A%2F%0A%0Acode%20%3E%20span%2Ekw%20%7B%20color%3A%20%23555%3B%20font%2Dweight%3A%20bold%3B%20%7D%20%2F%2A%20Keyword%20%2A%2F%0Acode%20%3E%20span%2Edt%20%7B%20color%3A%20%23902000%3B%20%7D%20%2F%2A%20DataType%20%2A%2F%0Acode%20%3E%20span%2Edv%20%7B%20color%3A%20%2340a070%3B%20%7D%20%2F%2A%20DecVal%20%28decimal%20values%29%20%2A%2F%0Acode%20%3E%20span%2Ebn%20%7B%20color%3A%20%23d14%3B%20%7D%20%2F%2A%20BaseN%20%2A%2F%0Acode%20%3E%20span%2Efl%20%7B%20color%3A%20%23d14%3B%20%7D%20%2F%2A%20Float%20%2A%2F%0Acode%20%3E%20span%2Ech%20%7B%20color%3A%20%23d14%3B%20%7D%20%2F%2A%20Char%20%2A%2F%0Acode%20%3E%20span%2Est%20%7B%20color%3A%20%23d14%3B%20%7D%20%2F%2A%20String%20%2A%2F%0Acode%20%3E%20span%2Eco%20%7B%20color%3A%20%23888888%3B%20font%2Dstyle%3A%20italic%3B%20%7D%20%2F%2A%20Comment%20%2A%2F%0Acode%20%3E%20span%2Eot%20%7B%20color%3A%20%23007020%3B%20%7D%20%2F%2A%20OtherToken%20%2A%2F%0Acode%20%3E%20span%2Eal%20%7B%20color%3A%20%23ff0000%3B%20font%2Dweight%3A%20bold%3B%20%7D%20%2F%2A%20AlertToken%20%2A%2F%0Acode%20%3E%20span%2Efu%20%7B%20color%3A%20%23900%3B%20font%2Dweight%3A%20bold%3B%20%7D%20%2F%2A%20Function%20calls%20%2A%2F%20%0Acode%20%3E%20span%2Eer%20%7B%20color%3A%20%23a61717%3B%20background%2Dcolor%3A%20%23e3d2d2%3B%20%7D%20%2F%2A%20ErrorTok%20%2A%2F%0A%0A" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="header">
<h1 class="title">Intro to codemirrorR</h1>
<h4 class="author"><em>Kenton Russell</em></h4>
<h4 class="date"><em>2016-01-15</em></h4>
</div>
<div id="codemirror-htmlwidget-for-r" class="section level1">
<h1>CodeMirror htmlwidget for R</h1>
<p>This is an early version of a R <a href="http://htmlwidgets.org"><code>htmlwidget</code></a> version of <a href="https://codemirror.net">CodeMirror</a> by <a href="https://marijnhaverbeke.nl/fund/">Marijn Haverbeke</a>.</p>
<div id="installation" class="section level2">
<h2>Installation</h2>
<pre class="sourceCode r"><code class="sourceCode r">devtools::<span class="kw">install_github</span>(<span class="st">&quot;timelyportfolio/codemirrorR&quot;</span>)</code></pre>
</div>
<div id="examples" class="section level2">
<h2>Examples</h2>
<div id="simple" class="section level3">
<h3>Simple</h3>
<pre class="sourceCode r"><code class="sourceCode r"><span class="kw">library</span>(codemirrorR)
<span class="kw">codemirror</span>(<span class="st">&quot;hi&quot;</span>)</code></pre>
<p><div id="htmlwidget-1940" style="width:100%;height:288px;" class="codemirror"></div>
<script type="application/json" data-for="htmlwidget-1940">{"x":{"value":"hi"},"evals":[],"jsHooks":[]}</script></p>
</div>
<div id="mode" class="section level3">
<h3>Mode</h3>
<pre class="sourceCode r"><code class="sourceCode r"><span class="kw">library</span>(codemirrorR)
<span class="kw">codemirror</span>(
<span class="st">&quot;</span>
<span class="st"> library(codemirror)</span>
<span class="st"> </span>
<span class="st"> codemirror('hi')</span>
<span class="st"> &quot;</span>,
<span class="dt">mode =</span> <span class="st">&quot;r&quot;</span>
)</code></pre>
<p><div id="htmlwidget-5198" style="width:100%;height:288px;" class="codemirror"></div>
<script type="application/json" data-for="htmlwidget-5198">{"x":{"value":"\n library(codemirror)\n \n codemirror('hi')\n ","mode":"r"},"evals":[],"jsHooks":[]}</script></p>
<pre class="sourceCode r"><code class="sourceCode r"><span class="kw">library</span>(codemirrorR)
<span class="kw">codemirror</span>(
<span class="kw">system.file</span>(
<span class="st">&quot;htmlwidgets/codemirror.js&quot;</span>,
<span class="dt">package =</span> <span class="st">&quot;codemirrorR&quot;</span>
),
<span class="dt">mode =</span> <span class="st">&quot;javascript&quot;</span>,
<span class="dt">width =</span> <span class="st">&quot;100%&quot;</span>,
<span class="dt">height =</span> <span class="st">&quot;400px&quot;</span>
)</code></pre>
<p><div id="htmlwidget-6265" style="width:100%;height:400px;" class="codemirror"></div>
<script type="application/json" data-for="htmlwidget-6265">{"x":{"value":"HTMLWidgets.widget({\n\n name: 'codemirror',\n\n type: 'output',\n\n factory: function(el, width, height) {\n\n return {\n \n editor : {},\n \n renderValue: function(x) {\n \n el.style.overflow = \"scroll\";\n \n var editor = CodeMirror(el, x);\n \n this.editor = editor;\n \n },\n \n resize: function(width, height) {\n\n }\n \n };\n\n }\n});","mode":"javascript"},"evals":[],"jsHooks":[]}</script></p>
<pre class="sourceCode r"><code class="sourceCode r"><span class="kw">library</span>(codemirrorR)
<span class="kw">library</span>(xml2)</code></pre>
<pre><code>## Warning: package 'xml2' was built under R version 3.2.3</code></pre>
<pre class="sourceCode r"><code class="sourceCode r"><span class="co"># ?xml2::readxml</span>
cd &lt;-<span class="st"> </span><span class="kw">read_xml</span>(<span class="st">&quot;http://www.xmlfiles.com/examples/cd_catalog.xml&quot;</span>)
<span class="kw">codemirror</span>(cd, <span class="dt">mode =</span> <span class="st">&quot;xml&quot;</span>, <span class="dt">width =</span> <span class="st">&quot;100%&quot;</span>, <span class="dt">height =</span> <span class="st">&quot;400px&quot;</span>)</code></pre>
<p><div id="htmlwidget-4114" style="width:100%;height:400px;" class="codemirror"></div>
<script type="application/json" data-for="htmlwidget-4114">{"x":{"value":"<?xml version=\"1.0\" encoding=\"ISO8859-1\"?>\n<CATALOG>\n <CD>\n <TITLE>Empire Burlesque\u003c/TITLE>\n <ARTIST>Bob Dylan\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>Columbia\u003c/COMPANY>\n <PRICE>10.90\u003c/PRICE>\n <YEAR>1985\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Hide your heart\u003c/TITLE>\n <ARTIST>Bonnie Tylor\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>CBS Records\u003c/COMPANY>\n <PRICE>9.90\u003c/PRICE>\n <YEAR>1988\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Greatest Hits\u003c/TITLE>\n <ARTIST>Dolly Parton\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>RCA\u003c/COMPANY>\n <PRICE>9.90\u003c/PRICE>\n <YEAR>1982\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Still got the blues\u003c/TITLE>\n <ARTIST>Gary More\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Virgin redords\u003c/COMPANY>\n <PRICE>10.20\u003c/PRICE>\n <YEAR>1990\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Eros\u003c/TITLE>\n <ARTIST>Eros Ramazzotti\u003c/ARTIST>\n <COUNTRY>EU\u003c/COUNTRY>\n <COMPANY>BMG\u003c/COMPANY>\n <PRICE>9.90\u003c/PRICE>\n <YEAR>1997\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>One night only\u003c/TITLE>\n <ARTIST>Bee Gees\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Polydor\u003c/COMPANY>\n <PRICE>10.90\u003c/PRICE>\n <YEAR>1998\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Sylvias Mother\u003c/TITLE>\n <ARTIST>Dr.Hook\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>CBS\u003c/COMPANY>\n <PRICE>8.10\u003c/PRICE>\n <YEAR>1973\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Maggie May\u003c/TITLE>\n <ARTIST>Rod Stewart\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Pickwick\u003c/COMPANY>\n <PRICE>8.50\u003c/PRICE>\n <YEAR>1990\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Romanza\u003c/TITLE>\n <ARTIST>Andrea Bocelli\u003c/ARTIST>\n <COUNTRY>EU\u003c/COUNTRY>\n <COMPANY>Polydor\u003c/COMPANY>\n <PRICE>10.80\u003c/PRICE>\n <YEAR>1996\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>When a man loves a woman\u003c/TITLE>\n <ARTIST>Percy Sledge\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>Atlantic\u003c/COMPANY>\n <PRICE>8.70\u003c/PRICE>\n <YEAR>1987\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Black angel\u003c/TITLE>\n <ARTIST>Savage Rose\u003c/ARTIST>\n <COUNTRY>EU\u003c/COUNTRY>\n <COMPANY>Mega\u003c/COMPANY>\n <PRICE>10.90\u003c/PRICE>\n <YEAR>1995\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>1999 Grammy Nominees\u003c/TITLE>\n <ARTIST>Many\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>Grammy\u003c/COMPANY>\n <PRICE>10.20\u003c/PRICE>\n <YEAR>1999\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>For the good times\u003c/TITLE>\n <ARTIST>Kenny Rogers\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Mucik Master\u003c/COMPANY>\n <PRICE>8.70\u003c/PRICE>\n <YEAR>1995\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Big Willie style\u003c/TITLE>\n <ARTIST>Will Smith\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>Columbia\u003c/COMPANY>\n <PRICE>9.90\u003c/PRICE>\n <YEAR>1997\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Tupelo Honey\u003c/TITLE>\n <ARTIST>Van Morrison\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Polydor\u003c/COMPANY>\n <PRICE>8.20\u003c/PRICE>\n <YEAR>1971\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Soulsville\u003c/TITLE>\n <ARTIST>Jorn Hoel\u003c/ARTIST>\n <COUNTRY>Norway\u003c/COUNTRY>\n <COMPANY>WEA\u003c/COMPANY>\n <PRICE>7.90\u003c/PRICE>\n <YEAR>1996\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>The very best of\u003c/TITLE>\n <ARTIST>Cat Stevens\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Island\u003c/COMPANY>\n <PRICE>8.90\u003c/PRICE>\n <YEAR>1990\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Stop\u003c/TITLE>\n <ARTIST>Sam Brown\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>A and M\u003c/COMPANY>\n <PRICE>8.90\u003c/PRICE>\n <YEAR>1988\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Bridge of Spies\u003c/TITLE>\n <ARTIST>T`Pau\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Siren\u003c/COMPANY>\n <PRICE>7.90\u003c/PRICE>\n <YEAR>1987\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Private Dancer\u003c/TITLE>\n <ARTIST>Tina Turner\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Capitol\u003c/COMPANY>\n <PRICE>8.90\u003c/PRICE>\n <YEAR>1983\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Midt om natten\u003c/TITLE>\n <ARTIST>Kim Larsen\u003c/ARTIST>\n <COUNTRY>EU\u003c/COUNTRY>\n <COMPANY>Medley\u003c/COMPANY>\n <PRICE>7.80\u003c/PRICE>\n <YEAR>1983\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Pavarotti Gala Concert\u003c/TITLE>\n <ARTIST>Luciano Pavarotti\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>DECCA\u003c/COMPANY>\n <PRICE>9.90\u003c/PRICE>\n <YEAR>1991\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>The dock of the bay\u003c/TITLE>\n <ARTIST>Otis Redding\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>Atlantic\u003c/COMPANY>\n <PRICE>7.90\u003c/PRICE>\n <YEAR>1987\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Picture book\u003c/TITLE>\n <ARTIST>Simply Red\u003c/ARTIST>\n <COUNTRY>EU\u003c/COUNTRY>\n <COMPANY>Elektra\u003c/COMPANY>\n <PRICE>7.20\u003c/PRICE>\n <YEAR>1985\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Red\u003c/TITLE>\n <ARTIST>The Communards\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>London\u003c/COMPANY>\n <PRICE>7.80\u003c/PRICE>\n <YEAR>1987\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Unchain my heart\u003c/TITLE>\n <ARTIST>Joe Cocker\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>EMI\u003c/COMPANY>\n <PRICE>8.20\u003c/PRICE>\n <YEAR>1987\u003c/YEAR>\n \u003c/CD>\n\u003c/CATALOG>\n","mode":"xml"},"evals":[],"jsHooks":[]}</script></p>
</div>
<div id="themes" class="section level3">
<h3>Themes</h3>
<pre class="sourceCode r"><code class="sourceCode r"><span class="kw">library</span>(codemirrorR)
<span class="kw">codemirror</span>(
<span class="kw">system.file</span>(
<span class="st">&quot;htmlwidgets/codemirror.js&quot;</span>,
<span class="dt">package =</span> <span class="st">&quot;codemirrorR&quot;</span>
),
<span class="dt">mode =</span> <span class="st">&quot;javascript&quot;</span>,
<span class="dt">theme =</span> <span class="st">&quot;night&quot;</span>
)</code></pre>
<p><div id="htmlwidget-9140" style="width:100%;height:288px;" class="codemirror"></div>
<script type="application/json" data-for="htmlwidget-9140">{"x":{"value":"HTMLWidgets.widget({\n\n name: 'codemirror',\n\n type: 'output',\n\n factory: function(el, width, height) {\n\n return {\n \n editor : {},\n \n renderValue: function(x) {\n \n el.style.overflow = \"scroll\";\n \n var editor = CodeMirror(el, x);\n \n this.editor = editor;\n \n },\n \n resize: function(width, height) {\n\n }\n \n };\n\n }\n});","mode":"javascript","theme":"night"},"evals":[],"jsHooks":[]}</script></p>
</div>
<div id="addons" class="section level3">
<h3>Addons</h3>
<p><strong>will add much better support for addons</strong></p>
<h4>
xml folding
</h4>
<pre class="sourceCode r"><code class="sourceCode r"><span class="kw">library</span>(codemirrorR)
<span class="kw">library</span>(xml2)
<span class="co"># ?xml2::readxml</span>
cd &lt;-<span class="st"> </span><span class="kw">read_xml</span>(<span class="st">&quot;http://www.xmlfiles.com/examples/cd_catalog.xml&quot;</span>)
cm &lt;-<span class="st"> </span><span class="kw">codemirror</span>(
cd,
<span class="dt">mode =</span> <span class="st">&quot;xml&quot;</span>,
<span class="dt">lineNumbers =</span> <span class="ot">TRUE</span>
)
<span class="kw">cm_foldcode</span>(cm, <span class="st">&quot;xml-fold&quot;</span>)</code></pre>
<p><div id="htmlwidget-2396" style="width:100%;height:288px;" class="codemirror"></div>
<script type="application/json" data-for="htmlwidget-2396">{"x":{"value":"<?xml version=\"1.0\" encoding=\"ISO8859-1\"?>\n<CATALOG>\n <CD>\n <TITLE>Empire Burlesque\u003c/TITLE>\n <ARTIST>Bob Dylan\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>Columbia\u003c/COMPANY>\n <PRICE>10.90\u003c/PRICE>\n <YEAR>1985\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Hide your heart\u003c/TITLE>\n <ARTIST>Bonnie Tylor\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>CBS Records\u003c/COMPANY>\n <PRICE>9.90\u003c/PRICE>\n <YEAR>1988\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Greatest Hits\u003c/TITLE>\n <ARTIST>Dolly Parton\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>RCA\u003c/COMPANY>\n <PRICE>9.90\u003c/PRICE>\n <YEAR>1982\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Still got the blues\u003c/TITLE>\n <ARTIST>Gary More\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Virgin redords\u003c/COMPANY>\n <PRICE>10.20\u003c/PRICE>\n <YEAR>1990\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Eros\u003c/TITLE>\n <ARTIST>Eros Ramazzotti\u003c/ARTIST>\n <COUNTRY>EU\u003c/COUNTRY>\n <COMPANY>BMG\u003c/COMPANY>\n <PRICE>9.90\u003c/PRICE>\n <YEAR>1997\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>One night only\u003c/TITLE>\n <ARTIST>Bee Gees\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Polydor\u003c/COMPANY>\n <PRICE>10.90\u003c/PRICE>\n <YEAR>1998\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Sylvias Mother\u003c/TITLE>\n <ARTIST>Dr.Hook\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>CBS\u003c/COMPANY>\n <PRICE>8.10\u003c/PRICE>\n <YEAR>1973\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Maggie May\u003c/TITLE>\n <ARTIST>Rod Stewart\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Pickwick\u003c/COMPANY>\n <PRICE>8.50\u003c/PRICE>\n <YEAR>1990\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Romanza\u003c/TITLE>\n <ARTIST>Andrea Bocelli\u003c/ARTIST>\n <COUNTRY>EU\u003c/COUNTRY>\n <COMPANY>Polydor\u003c/COMPANY>\n <PRICE>10.80\u003c/PRICE>\n <YEAR>1996\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>When a man loves a woman\u003c/TITLE>\n <ARTIST>Percy Sledge\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>Atlantic\u003c/COMPANY>\n <PRICE>8.70\u003c/PRICE>\n <YEAR>1987\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Black angel\u003c/TITLE>\n <ARTIST>Savage Rose\u003c/ARTIST>\n <COUNTRY>EU\u003c/COUNTRY>\n <COMPANY>Mega\u003c/COMPANY>\n <PRICE>10.90\u003c/PRICE>\n <YEAR>1995\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>1999 Grammy Nominees\u003c/TITLE>\n <ARTIST>Many\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>Grammy\u003c/COMPANY>\n <PRICE>10.20\u003c/PRICE>\n <YEAR>1999\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>For the good times\u003c/TITLE>\n <ARTIST>Kenny Rogers\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Mucik Master\u003c/COMPANY>\n <PRICE>8.70\u003c/PRICE>\n <YEAR>1995\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Big Willie style\u003c/TITLE>\n <ARTIST>Will Smith\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>Columbia\u003c/COMPANY>\n <PRICE>9.90\u003c/PRICE>\n <YEAR>1997\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Tupelo Honey\u003c/TITLE>\n <ARTIST>Van Morrison\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Polydor\u003c/COMPANY>\n <PRICE>8.20\u003c/PRICE>\n <YEAR>1971\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Soulsville\u003c/TITLE>\n <ARTIST>Jorn Hoel\u003c/ARTIST>\n <COUNTRY>Norway\u003c/COUNTRY>\n <COMPANY>WEA\u003c/COMPANY>\n <PRICE>7.90\u003c/PRICE>\n <YEAR>1996\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>The very best of\u003c/TITLE>\n <ARTIST>Cat Stevens\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Island\u003c/COMPANY>\n <PRICE>8.90\u003c/PRICE>\n <YEAR>1990\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Stop\u003c/TITLE>\n <ARTIST>Sam Brown\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>A and M\u003c/COMPANY>\n <PRICE>8.90\u003c/PRICE>\n <YEAR>1988\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Bridge of Spies\u003c/TITLE>\n <ARTIST>T`Pau\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Siren\u003c/COMPANY>\n <PRICE>7.90\u003c/PRICE>\n <YEAR>1987\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Private Dancer\u003c/TITLE>\n <ARTIST>Tina Turner\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>Capitol\u003c/COMPANY>\n <PRICE>8.90\u003c/PRICE>\n <YEAR>1983\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Midt om natten\u003c/TITLE>\n <ARTIST>Kim Larsen\u003c/ARTIST>\n <COUNTRY>EU\u003c/COUNTRY>\n <COMPANY>Medley\u003c/COMPANY>\n <PRICE>7.80\u003c/PRICE>\n <YEAR>1983\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Pavarotti Gala Concert\u003c/TITLE>\n <ARTIST>Luciano Pavarotti\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>DECCA\u003c/COMPANY>\n <PRICE>9.90\u003c/PRICE>\n <YEAR>1991\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>The dock of the bay\u003c/TITLE>\n <ARTIST>Otis Redding\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>Atlantic\u003c/COMPANY>\n <PRICE>7.90\u003c/PRICE>\n <YEAR>1987\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Picture book\u003c/TITLE>\n <ARTIST>Simply Red\u003c/ARTIST>\n <COUNTRY>EU\u003c/COUNTRY>\n <COMPANY>Elektra\u003c/COMPANY>\n <PRICE>7.20\u003c/PRICE>\n <YEAR>1985\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Red\u003c/TITLE>\n <ARTIST>The Communards\u003c/ARTIST>\n <COUNTRY>UK\u003c/COUNTRY>\n <COMPANY>London\u003c/COMPANY>\n <PRICE>7.80\u003c/PRICE>\n <YEAR>1987\u003c/YEAR>\n \u003c/CD>\n <CD>\n <TITLE>Unchain my heart\u003c/TITLE>\n <ARTIST>Joe Cocker\u003c/ARTIST>\n <COUNTRY>USA\u003c/COUNTRY>\n <COMPANY>EMI\u003c/COMPANY>\n <PRICE>8.20\u003c/PRICE>\n <YEAR>1987\u003c/YEAR>\n \u003c/CD>\n\u003c/CATALOG>\n","mode":"xml","lineNumbers":true,"foldGutter":true,"gutters":["CodeMirror-linenumbers","CodeMirror-foldgutter"]},"evals":[],"jsHooks":[]}</script></p>
<h4>
brace folding
</h4>
<pre class="sourceCode r"><code class="sourceCode r"><span class="co"># brace fold</span>
<span class="kw">library</span>(pipeR)
<span class="kw">codemirror</span>(
<span class="kw">system.file</span>(
<span class="st">&quot;htmlwidgets/codemirror.js&quot;</span>,
<span class="dt">package =</span> <span class="st">&quot;codemirrorR&quot;</span>
),
<span class="dt">mode =</span> <span class="st">&quot;javascript&quot;</span>,
<span class="dt">theme =</span> <span class="st">&quot;night&quot;</span>
) %&gt;&gt;%<span class="st"> </span><span class="kw">cm_foldcode</span>(<span class="st">&quot;brace-fold&quot;</span>)</code></pre>
<p><div id="htmlwidget-2469" style="width:100%;height:288px;" class="codemirror"></div>
<script type="application/json" data-for="htmlwidget-2469">{"x":{"value":"HTMLWidgets.widget({\n\n name: 'codemirror',\n\n type: 'output',\n\n factory: function(el, width, height) {\n\n return {\n \n editor : {},\n \n renderValue: function(x) {\n \n el.style.overflow = \"scroll\";\n \n var editor = CodeMirror(el, x);\n \n this.editor = editor;\n \n },\n \n resize: function(width, height) {\n\n }\n \n };\n\n }\n});","mode":"javascript","theme":"night","lineNumbers":true,"foldGutter":true,"gutters":["CodeMirror-linenumbers","CodeMirror-foldgutter"]},"evals":[],"jsHooks":[]}</script></p>
</div>
</div>
<div id="praise-thanks-and-attribution" class="section level2">
<h2>Praise, Thanks, and Attribution</h2>
<p>For those of you who don’t know the incredible work of <a href="https://marijnhaverbeke.nl/">Marijn Haverbeke</a>, go see it and <a href="https://marijnhaverbeke.nl/fund/">fund him</a>. Thanks Marijn!</p>
</div>
</div>
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment