{"version":3,"sources":["webpack:///./node_modules/brace/index.js","webpack:///(webpack)/buildin/amd-define.js","webpack:///./src/mixins/att.ts","webpack:///./node_modules/brace/ext/language_tools.js","webpack:///./node_modules/core-js/modules/es6.regexp.split.js","webpack:///./src/mixins/fetch_mixin.ts","webpack:///./node_modules/brace/mode/mysql.js","webpack:///./src/components/editor.vue?9714","webpack:///src/components/editor.vue","webpack:///./src/components/editor.vue?12a0","webpack:///./src/components/editor.vue","webpack:///./node_modules/core-js/modules/_is-regexp.js","webpack:///./node_modules/brace/ext/emmet.js","webpack:///./node_modules/brace/theme/xcode.js","webpack:///./src/mixins/order_mixin.ts"],"names":["ACE_NAMESPACE","global","this","window","acequirejs","define","module","deps","payload","arguments","length","modules","payloads","original","apply","console","error","trace","_acequire","parentId","callback","lookup","undefined","Object","prototype","toString","call","params","i","l","dep","acequire","push","packagedModule","normalizeModule","moduleName","indexOf","chunks","split","charAt","base","slice","join","previous","replace","exports","mod","id","uri","packaged","req","returnValue","exportAce","ns","root","ace","real","exec","RegExp","test","match","String","compliantExecNpcg","compliantLastIndexIncrement","x","lastIndex","getNativeFlags","regex","ignoreCase","multiline","extended","sticky","array","item","from","Array","str","name","r2","source","index","_xregexp","captureNames","Empty","Function","bind","that","target","TypeError","args","bound","result","concat","defineGetter","defineSetter","lookupGetter","lookupSetter","supportsAccessors","prototypeOfArray","prototypeOfObject","_toString","owns","hasOwnProperty","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","splice","makeArray","a","lengthBefore","array_splice","start","deleteCount","pos","removeCount","Math","max","removed","insert","add","remove","min","tailOldPos","tailNewPos","tailCount","lengthAfterRemove","isArray","obj","createEmpty","boxedString","splitString","forEach","fun","object","toObject","self","thisp","map","filter","value","every","some","reduce","reduceRight","sought","toInteger","lastIndexOf","abs","getPrototypeOf","__proto__","constructor","getOwnPropertyDescriptor","ERR_NON_OBJECT","property","descriptor","enumerable","configurable","getter","setter","get","set","getOwnPropertyNames","keys","create","empty","propertyIsEnumerable","isPrototypeOf","toLocaleString","valueOf","properties","Type","defineProperties","doesDefinePropertyWork","defineProperty","exception","definePropertyWorksOnObject","definePropertyWorksOnDom","document","createElement","definePropertyFallback","ERR_NON_OBJECT_DESCRIPTOR","ERR_NON_OBJECT_TARGET","ERR_ACCESSORS_NOT_SUPPORTED","seal","freeze","freezeObject","preventExtensions","isSealed","isFrozen","isExtensible","hasDontEnumBug","dontEnums","dontEnumsLength","key","ii","dontEnum","Date","now","getTime","ws","trim","trimBeginRegexp","trimEndRegexp","n","floor","o","XHTML_NS","getDocumentHead","doc","head","getElementsByTagName","documentElement","tag","createElementNS","hasCssClass","el","classes","className","addCssClass","removeCssClass","toggleCssClass","setCssClass","node","include","hasCssString","sheets","createStyleSheet","styleSheets","owningElement","importCssString","cssText","style","appendChild","createTextNode","importCssStylsheet","link","rel","href","getInnerWidth","element","parseInt","computedStyle","clientWidth","getInnerHeight","clientHeight","scrollbarWidth","inner","width","minWidth","height","display","outer","position","left","overflow","body","noScrollbar","offsetWidth","withScrollbar","removeChild","pageYOffset","getPageScrollTop","getPageScrollLeft","pageXOffset","scrollTop","scrollLeft","getComputedStyle","currentStyle","setInnerHtml","innerHtml","cloneNode","innerHTML","parentNode","replaceChild","setInnerText","innerText","textContent","getInnerText","getParentWindow","defaultView","parentWindow","inherits","ctor","superCtor","super_","writable","mixin","implement","proto","oop","Keys","ret","MODIFIER_KEYS","16","17","18","224","KEY_MODS","FUNCTION_KEYS","8","9","13","19","27","32","33","34","35","36","37","38","39","40","44","45","46","96","97","98","99","100","101","102","103","104","105","112","113","114","115","116","117","118","119","120","121","122","123","144","145","PRINTABLE_KEYS","48","49","50","51","52","53","54","55","56","57","59","61","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","107","109","110","186","187","188","189","190","191","192","219","220","221","222","111","106","toLowerCase","enter","escape","esc","del","mods","pow","keyCodeToString","keyCode","keyString","fromCharCode","OS","LINUX","MAC","WINDOWS","getOS","isMac","isLinux","navigator","os","platform","ua","userAgent","isWin","isIE","appName","parseFloat","isOldIE","isGecko","isMozilla","Controllers","controllers","product","isOldGecko","isOpera","opera","isWebKit","isChrome","isAIR","isIPad","isChromeOS","isIOS","MSStream","useragent","pressedKeys","ts","addListener","elem","type","addEventListener","attachEvent","wrapper","event","_wrapper","removeListener","removeEventListener","detachEvent","stopEvent","e","stopPropagation","preventDefault","cancelBubble","getButton","ctrlKey","altKey","shiftKey","button","1","2","4","capture","eventHandler","releaseCaptureHandler","onMouseUp","addTouchMoveListener","startx","starty","touches","touchObj","clientX","clientY","wheelX","wheelY","addMouseWheelListener","factor","wheelDeltaX","wheelDeltaY","wheelDelta","deltaMode","DOM_DELTA_PIXEL","deltaX","deltaY","DOM_DELTA_LINE","DOM_DELTA_PAGE","axis","HORIZONTAL_AXIS","detail","addMultiMouseDownListener","elements","timeouts","callbackName","startX","startY","timer","clicks","eventNames","3","onMousedown","isNewClick","clearTimeout","setTimeout","_clicks","onDblclick","getModifierHash","metaKey","normalizeCommandKeys","hashId","getModifierState","altGr","location","keyLocation","timeStamp","dt","defaultPrevented","resetPressedKeys","getModifierString","addCommandKeyListener","lastKeyDownKeyCode","lastDefaultPrevented","postMessage","postMessageId","nextTick","win","messageName","listener","data","nextFrame","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","last","stringReverse","string","reverse","stringRepeat","count","stringTrimLeft","stringTrimRight","copyObject","copy","copyArray","deepCopy","arrayToMap","arr","createMap","props","arrayRemove","escapeRegExp","escapeHTML","getMatchOffsets","regExp","matches","offset","deferredCall","fcn","deferred","timeout","cancel","schedule","isPending","delayedCall","defaultTimeout","_self","delay","dom","lang","KEYS","MODS","BROKEN_SETDATA","USE_IE_MIME_TYPE","TextInput","host","text","isTouchPad","setAttribute","opacity","insertBefore","firstChild","PLACEHOLDER","copied","cut","pasted","inComposition","tempStyle","isSelectionEmpty","isFocused","activeElement","onBlur","onFocus","resetSelection","focus","blur","syncSelection","syncValue","isEmpty","inputHandler","selectionStart","selectionEnd","setSelectionRange","resetValue","selection","isAllSelected","onSelect","selectAll","setInputHandler","cb","getInputHandler","afterContextMenu","sendText","onPaste","substr","execCommand","substring","onTextInput","onInput","handleClipboardData","forceIEMime","clipboardData","mime","setData","getData","doCopy","isCut","getCopyText","onCut","onCopy","select","onCommandKey","closeTimeout","onCompositionStart","$readOnly","canUndo","session","$undoManager","onCompositionUpdate","on","onCompositionEnd","markUndoGroup","clearSelection","val","lastValue","undo","r","getRange","range","setRange","c","needsOnInput","syncComposition","onContextMenuClose","renderer","$keepTextAreaAtCursor","$moveTextAreaToCursor","getElement","setReadOnly","readOnly","onContextMenu","_emit","domEvent","moveToMouse","bringToFront","rect","container","getBoundingClientRect","top","borderTopWidth","borderLeftWidth","maxTop","bottom","move","textInput","scroller","typingResetTimeout","typing","detectArrowKeys","up","home","option","right","end","down","shift","TextInputIOS","DRAG_OFFSET","SCROLL_COOLDOWN_T","DefaultHandlers","mouseHandler","$clickSelection","editor","setDefaultHandler","onMouseDown","onDoubleClick","onTripleClick","onQuadClick","onMouseWheel","onTouchMove","selectByLines","extendSelectionBy","selectByWords","calcDistance","ax","ay","bx","by","sqrt","calcRangeOrientation","cursor","row","cmp","column","anchor","ev","inSelection","getDocumentPosition","mousedownEvent","selectionRange","getSelectionRange","selectionEmpty","$blockScrolling","moveToPosition","time","$focusTimout","inMultiSelectMode","captureMouse","startSelect","setState","waitForClickSelection","screenToTextCoordinates","y","getShiftKey","selectToPosition","setCapture","setStyle","comparePoint","orientedRange","setSelectionAnchor","scrollCursorIntoView","unitName","cmpStart","cmpEnd","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","unsetStyle","releaseCapture","focusWait","distance","getBracketRange","getWordRange","isMultiLine","contains","getLineRange","getAccelKey","$lastScroll","t","vx","vy","allowed","prevScroll","direction","canScroll","isScrollableBy","speed","isSlower","scrollBy","stop","Tooltip","isOpen","$element","$parentNode","$init","setText","setHtml","html","setPosition","setClassName","show","hide","getHeight","offsetHeight","getWidth","destroy","GutterHandler","tooltipTimeout","mouseEvent","tooltipAnnotation","gutter","$gutterLayer","tooltip","GutterTooltip","showTooltip","annotation","$annotations","hideTooltip","maxRow","getLength","screenRow","pixelToScreenCoordinates","$pos","documentToScreenRow","_signal","$tooltipFollowsMouse","moveTooltip","gutterElement","gutterRegion","getRegion","selectTo","srcElement","isMousePressed","$gutter","windowWidth","innerWidth","windowHeight","innerHeight","MouseEvent","$inSelection","propagationStopped","AUTOSCROLL_DELAY","SCROLL_CURSOR_DELAY","SCROLL_CURSOR_HYSTERESIS","DragdropHandler","blankImage","src","dragSelectionMarker","timerId","dragCursor","dragOperation","isInternal","autoScrollStartTime","cursorMovedTime","cursorPointOnCaretMoved","mouseTarget","counter","prevCursor","vMovement","hMovement","moveCursorToPosition","autoScroll","lineHeight","layerConfig","characterWidth","editorRect","offsets","nearestXOffset","nearestYOffset","scrollCursor","vScroll","hScroll","onDragInterval","addDragMarker","toOrientedRange","addMarker","getSelectionStyle","$cursorLayer","setBlinking","clearInterval","setInterval","onMouseMove","clearDragMarker","removeMarker","fromOrientedRange","getReadOnly","onDragStart","cancelDrag","draggable","dataTransfer","effectAllowed","setDragImage","clearData","getTextRange","onDragEnd","dropEffect","setCursorStyle","onDragEnter","canAccept","getDropEffect","onDragOver","onMouseMoveTimer","onDragLeave","onDrop","moveText","dropData","types","copyAllowed","moveAllowed","copyModifierState","dragWait","interval","getDragDelay","startDrag","dragWaitEnd","dragReadyEnd","cursorStyle","onMouseDrag","state","dragDrop","$dragEnabled","clickCount","eventTarget","unselectable","url","xhr","XMLHttpRequest","open","onreadystatechange","readyState","responseText","send","loadScript","path","s","onload","_","isAbort","qualifyURL","EventEmitter","_dispatchEvent","eventName","_eventRegistry","_defaultHandlers","listeners","defaultHandler","once","newCallback","handlers","_disabled_","old","disabled","removeDefaultHandler","pop","capturing","off","removeAllListeners","optionsProvider","setOptions","optList","setOption","getOptions","optionNames","$options","getOption","opt","warn","forwardTo","handlesSet","message","reportError","msg","Error","AppConfig","$defaultOptions","defineOptions","options","initialValue","resetOptions","setDefaultValue","opts","setDefaultValues","optionHash","net","workerPath","modePath","themePath","basePath","suffix","$moduleUrls","init","scriptOptions","scriptUrl","currentScript","_currentScript","currentDocument","ownerDocument","scripts","script","getAttribute","attributes","j","attr","deHyphenate","m","m1","toUpperCase","all","moduleUrl","component","parts","sep","re","setModuleUrl","subst","$loading","loadModule","onLoad","moduleType","afterLoad","DefaultGutterHandler","config","MouseHandler","focusEditor","windowBlurred","hasFocus","getMouseEventTarget","onMouseEvent","scrollBarV","scrollBarH","Boolean","gutterEl","$dragDelay","character","insideStart","mousemove","$scrollSpeed","mouseMoveHandler","which","releaseMouse","$mouseMoved","onCaptureEnd","onCaptureInterval","$onCaptureMouseMove","cancelContextMenu","scrollSpeed","dragDelay","dragEnabled","focusTimout","tooltipFollowsMouse","FoldHandler","fold","getFoldAt","removeFold","expandFold","foldWidgets","onFoldWidgetClick","getParentFoldRangeData","firstRange","getLine","addFold","keyUtil","KeyBinding","$editor","$data","$handlers","commands","kb","removeKeyboardHandler","$defaultHandler","addKeyboardHandler","setKeyboardHandler","h","handleKeyboard","attach","detach","getKeyboardHandler","getStatusText","$callKeyboardHandlers","toExecute","success","command","passEvent","dir","hiLevel","lastArabic","hasUBAT_B","hasUBAT_S","impTab_LTR","impTab_RTL","LTR","RTL","L","R","EN","AN","ON","B","S","AL","WS","CS","ES","ET","NSM","LRE","RLE","PDF","LRO","RLO","BN","UnicodeTBL00","UnicodeTBL20","_computeLevels","chars","levels","len","charTypes","impTab","prevState","newClass","newLevel","newState","action","cond","condPos","ix","_getCharacterType","_getCharClass","_invertLevel","lev","_array","lo","hi","tmp","wType","nType","cType","rtlCandidate","ch","uc","charCodeAt","ON_R","R_H","DOT","doBidiReorder","textCharTypes","isRtl","logicalFromVisual","bidiLevels","hasBidiCharacters","getVisualFromLogicalIdx","logIdx","rowMap","bidiUtil","bidiRE","BidiHandler","bidiMap","currentRow","charWidths","EOL","showInvisibles","isRtlDir","line","wrapIndent","isLastRow","EOF","seenBidi","isBidiRow","docRow","splitIndex","updateRowLine","updateBidiMap","onChange","delta","lines","getDocumentRow","rowCache","$screenRowCache","$getRowCacheIndex","$docRowCache","getSplitIndex","currentIndex","prevIndex","$useWrapMode","splits","$wrapData","indent","size","isFullWidth","getScreenTabSize","endOfLine","markAsDirty","updateCharacterWidths","fontMetrics","$characterSize","bidiCharWidth","$measureCharWidth","getShowInvisibles","setShowInvisibles","setEolChar","eolChar","setTextDir","getPosLeft","col","visualIdx","getSelections","startCol","endCol","level","selections","selColMin","selColMax","isSelected","isSelectedPrev","visIdx","offsetToCol","posX","logicalIdx","charWidth","comparePoints","p1","p2","Range","startRow","startColumn","endRow","endColumn","isEqual","compare","compareRange","p","containsRange","intersects","isEnd","isStart","setStart","setEnd","inside","insideEnd","compareStart","compareEnd","compareInside","clipRows","firstRow","lastRow","fromPoints","extend","clone","collapseRows","toScreenRange","screenPosStart","documentToScreenPosition","screenPosEnd","moveBy","Selection","getDocument","lead","selectionLead","createAnchor","selectionAnchor","$isEmpty","$keepDesiredColumnOnChange","$desiredColumn","getCursor","getPosition","getSelectionAnchor","getSelectionLead","shiftSelection","columns","moveCursorTo","isBackwards","$moveSelection","mover","moveTo","selectUp","moveCursorUp","selectDown","moveCursorDown","selectRight","moveCursorRight","selectLeft","moveCursorLeft","selectLineStart","moveCursorLineStart","selectLineEnd","moveCursorLineEnd","selectFileEnd","moveCursorFileEnd","selectFileStart","moveCursorFileStart","selectWordRight","moveCursorWordRight","selectWordLeft","moveCursorWordLeft","selectWord","selectAWord","getAWordRange","excludeLastChar","rowEnd","rowStart","foldLine","getFoldLine","selectLine","moveCursorBy","wouldMoveIntoSoftTab","tabSize","isTabStop","getTabSize","getNavigateWithinSoftTabs","firstColumnPosition","screenToDocumentPosition","beforeCursor","getDisplayLine","leadingSpace","$useEmacsStyleLineStart","lineEnd","getDocumentLastRowColumnPosition","textEnd","search","moveCursorLongWordRight","rightOfCursor","nonTokenRe","tokenRe","moveCursorLongWordLeft","getFoldStringAt","leftOfCursor","$shortWordEndIndex","whitespaceRe","moveCursorShortWordRight","moveCursorShortWordLeft","$selectLongWords","rows","offsetX","screenPos","$bidiHandler","round","docPos","lineWidgets","keepDesiredColumn","moveCursorToScreen","desiredColumn","getRangeOfMovements","func","toJSON","rangeCount","ranges","r1","fromJSON","rangeList","toSingleRange","addRange","MAX_TOKEN_COUNT","Tokenizer","rules","states","regExps","matchMappings","ruleRegExps","matchTotal","mapping","defaultToken","flag","splitterRurles","rule","caseInsensitive","adjustedregex","matchcount","token","groupCount","tokenArray","onMatch","$arrayTokens","$applyToken","digit","removeCapturingGroups","splitRegex","createSplitterRegexp","$setMaxTokenCount","values","tokens","stack","inChClass","lastCapture","parenOpen","parenClose","square","getLineTokens","startState","currentState","matchAttempts","skipped","next","consumeLineEnd","merge","unshift","TextHighlightRules","$rules","addRules","prefix","nextState","getRules","embedRules","HighlightRules","escapeRules","append","$embeds","getEmbeds","pushState","popState","normalizeRules","processState","processed","toInsert","stateName","includeName","noEscape","keywordMap","createKeywordMapper","splitChar","keywords","list","$keywordList","getKeywords","$keywords","Behaviour","$behaviours","addBehaviours","behaviours","inherit","mode","getBehaviours","TokenIterator","initialRow","initialColumn","$session","$row","$rowTokens","getTokens","getTokenAt","$tokenIndex","stepBackward","stepForward","rowCount","getCurrentToken","getCurrentTokenRow","getCurrentTokenColumn","rowTokens","tokenIndex","getCurrentTokenPosition","getCurrentTokenRange","context","SAFE_INSERT_IN_TOKENS","SAFE_INSERT_BEFORE_TOKENS","contextCache","defaultQuotes","initContext","multiSelect","autoInsertedBrackets","autoInsertedRow","autoInsertedLineEnd","maybeInsertedBrackets","maybeInsertedRow","maybeInsertedLineStart","maybeInsertedLineEnd","getWrapped","selected","opening","closing","rowDiff","CstyleBehaviour","getCursorPosition","getWrapBehavioursEnabled","isSaneInsertion","braces","recordAutoInsert","recordMaybeInsert","rightChar","matching","$findOpeningBracket","isAutoInsertedClosing","popAutoInsertedClosing","isMaybeInsertedClosing","clearMaybeInsertedClosing","openBracePos","findMatchingBracket","next_indent","$getIndent","getTabString","quotes","$mode","$quotes","lineCommentStart","quote","leftChar","rightToken","pair","stringBefore","stringAfter","wordRe","isWordBefore","isWordAfter","iterator","$matchTokenType","iterator2","bracket","addUnicodePackage","pack","codePoint","packages","Ll","Lu","Lt","Lm","Lo","M","Mn","Mc","Me","N","Nd","Nl","No","P","Pd","Ps","Pe","Pi","Pf","Pc","Po","Sm","Sc","Sk","So","Z","Zs","Zl","Zp","C","Cc","Cf","Co","Cs","Cn","unicode","Mode","$defaultBehaviour","getTokenizer","$tokenizer","$highlightRules","$highlightRuleConfig","blockComment","toggleCommentLines","ignoreBlankLines","shouldRemove","minIndent","Infinity","insertAtTabStop","regexpStart","getUseSoftTabs","uncomment","shouldInsertSpace","removeInLine","commentWithSpace","comment","insertInLine","testRemove","before","after","spaces","lineCommentEnd","regexpEnd","iter","minEmptyLength","toggleBlockComment","colDiff","initialRange","startRange","endRange","getNextLineIndent","tab","checkOutdent","input","autoOutdent","createWorker","createModeDelegates","$modes","delegations","scope","functionName","$delegator","method","transformAction","param","$behaviour","completionKeywords","ruleItr","aLength","$createKeywordList","getCompletions","word","score","meta","$id","applyDelta","docLines","doNotValidate","Anchor","$onChange","$pointsInOrder","point1","point2","equalPointsInOrder","bColIsAfter","$getTransformedPoint","point","moveIfEqual","deltaIsInsert","deltaRowShift","deltaColShift","deltaStart","deltaEnd","$clipPositionToDocument","$insertRight","noClip","Document","textOrLines","$lines","insertMergedLines","setValue","getValue","getAllLines","getNewLineCharacter","$split","$detectNewLine","$autoNewLine","$newLineMode","setNewLineMode","newLineMode","getNewLineMode","isNewLine","getLines","getLinesForRange","insertLines","insertFullLines","removeLines","removeFullLines","insertNewLine","clippedPos","clonePos","$clipPosition","deleteFirstNewLine","deleteLastNewLine","deletedLines","removeNewLine","applyDeltas","deltas","revertDeltas","revertDelta","isInsert","$splitAndapplyLargeDelta","MAX","to","chunk","indexToPosition","newlineLength","positionToIndex","BackgroundTokenizer","tokenizer","running","currentLine","$worker","workerStart","endLine","startLine","processedLines","$tokenizeRow","fireUpdateEvent","setTokenizer","setDocument","first","scheduleStart","$updateOnChange","getState","SearchHighlight","clazz","setRegexp","MAX_RANGES","cache","update","markerLayer","drawSingleLineMarker","FoldLine","foldData","folds","setFoldLine","shiftRow","sameRow","sort","b","containsRow","walk","lastEnd","isNewRow","placeholder","getNextFoldTo","kind","addRemoveChars","log","foldBefore","newFoldLine","foldLineNext","idxToPosition","idx","lastFoldEndColumn","RangeList","pointIndex","excludeEdges","startIndex","endIndex","addList","substractPoint","containsPoint","rangeAtPoint","clipped","removeAll","lineDif","Fold","subFolds","consumePoint","consumeRange","restorePoint","restoreRange","subFold","collapseChildren","addSubFold","afterStart","Folding","side","getFoldsInRange","foldLines","$foldData","foundFolds","getFoldsInRangeList","getAllFolds","lastFold","startFoldLine","getNextFoldLine","getFoldedRowCount","$addFoldLine","added","$clipRangeToDocument","startFold","endFold","removeFolds","$updateWrapData","$updateRowLengthCache","$modified","addFolds","$updating","cloneFolds","foldAll","expandFolds","unfold","expandInner","isRowFolded","startFoldRow","getRowFoldEnd","getRowFoldStart","getFoldDisplayLine","textLine","lastColumn","$cloneFoldData","fd","toggleFold","tryToUnfold","bracketPos","getCommentFoldRange","depth","getFoldWidget","getFoldWidgetRange","$foldStyles","$foldStyle","setFoldStyle","$foldMode","$setFolding","foldMode","$updateFoldWidgets","$tokenizerUpdateFoldWidgets","updateFoldWidgets","tokenizerUpdateFoldWidgets","ignoreCurrent","fw","children","siblings","$toggleFoldWidget","toggleFoldWidget","toggleParent","BracketMatch","chr","charBeforeCursor","$findClosingBracket","$brackets","typeRe","openBracket","valueIndex","closingBracket","valueLength","TextMode","EditSession","$breakpoints","$decorations","$frontMarkers","$backMarkers","$markerId","$undoSelect","$uid","onChangeFold","setMode","bgTokenizer","resetCaches","$resetRowCache","cacheArray","low","mid","$rowLengthCache","removedFolds","$updateInternalDataOnChange","$fromUndo","ignore","$deltasDoc","$deltasFold","$informUndoManager","$deltas","setUndoManager","getUndoManager","reset","getSelection","undoManager","$syncInformUndoManager","group","execute","mergeUndoDeltas","$defaultUndoManager","redo","setUseSoftTabs","$useSoftTabs","$indentWithTabs","setTabSize","$tabSize","setNavigateWithinSoftTabs","navigateWithinSoftTabs","$navigateWithinSoftTabs","$overwrite","setOverwrite","overwrite","getOverwrite","toggleOverwrite","addGutterDecoration","removeGutterDecoration","getBreakpoints","setBreakpoints","clearBreakpoints","setBreakpoint","clearBreakpoint","inFront","marker","addDynamicMarker","markerId","markers","getMarkers","highlight","$searchHighlight","highlightLines","setAnnotations","annotations","getAnnotations","clearAnnotations","inToken","wordRange","setUseWorker","useWorker","getUseWorker","$useWorker","onReloadTokenizer","$modeId","$onChangeMode","$isPlaceholder","$stopWorker","$startWorker","attachToSession","wrapMethod","$wrapMethod","foldingRules","terminate","getMode","$scrollTop","setScrollTop","isNaN","getScrollTop","$scrollLeft","setScrollLeft","getScrollLeft","getScreenWidth","$computeWidth","getLineWidgetMaxWidth","screenWidth","lineWidgetsWidth","w","lineWidgetWidth","force","$wrapLimit","longestScreenLine","foldIndex","foldStart","$getStringScreenWidth","undoChanges","dontSelect","lastUndoRange","$getUndoSelection","foldDelta","redoChanges","setUndoSelect","enable","isUndo","fromRange","toPosition","toRange","collDiff","oldStart","newStart","indentRows","indentString","outdentRows","rowRange","deleteRange","$moveLines","diff","$clipRowToDocument","Number","MAX_VALUE","moveLinesUp","moveLinesDown","duplicateLines","$clipColumnToRow","$wrapLimitRange","setUseWrapMode","useWrapMode","getUseWrapMode","setWrapLimitRange","adjustWrapLimit","desiredLimit","$printMargin","limits","wrapLimit","$constrainWrapLimit","getWrapLimit","setWrapLimit","limit","getWrapLimitRange","foldLineBefore","wrapData","walkTokens","$getDisplayTokens","PLACEHOLDER_START","PLACEHOLDER_BODY","$computeWrapSplits","CHAR","CHAR_EXT","PUNCTUATION","SPACE","TAB","TAB_SPACE","displayLength","lastSplit","lastDocSplit","isCode","$wrapAsCode","indentedSoftWrap","$indentedSoftWrap","maxIndent","getWrapIndent","indentation","addSplit","displayed","minSplit","maxScreenColumn","screenColumn","getRowLength","getRowLineCount","getRowWrapIndent","getScreenLastRowColumn","documentToScreenColumn","getDocumentLastRowColumn","docColumn","getRowSplitData","screenToDocumentRow","screenToDocumentColumn","rowLength","doCache","foldStartRow","wrapRow","screenRowOffset","getScreenLength","screenRows","$getWidgetScreenLength","$setFontMetrics","fm","$enableVarChar","getCharacterWidth","wrap","$wrap","firstLineNumber","useSoftTabs","Search","addWordBoundary","needle","wordBoundary","find","$matchIterator","sr","sc","er","ec","skipCurrent","findAll","$assembleRegExp","$isMultiLine","prevRange","replacement","preserveCase","$disableFakeMultiline","wholeWord","modifier","caseSensitive","$assembleMultilineRegExp","backwards","forEachInLine","HashHandler","commandKeyBinding","addCommands","$singleCommand","MultiHashHandler","bindKey","isDefault","addCommand","removeCommand","_buildKeyHash","keepCommand","ckb","keyId","cmdGroup","keyPart","chain","binding","parseKeys","_addCommandToBinding","other","otherPos","removeCommands","bindKeys","keyList","findKeyCommand","$keyChain","CommandManager","byName","isAvailable","toggleRecording","$inReplay","recording","macro","$addCommandToMacro","oldMacro","replay","trimMacro","mac","showSettingsMenu","showErrorMarker","scrollIntoView","centerSelection","prompt","gotoLine","multiSelectAction","getAllRanges","findNext","findPrevious","aceCommandGroup","navigateFileStart","navigateUp","times","navigateFileEnd","navigateDown","navigateWordLeft","navigateLineStart","navigateLeft","navigateWordRight","navigateLineEnd","navigateRight","selectPageDown","scrollPageDown","gotoPageDown","selectPageUp","scrollPageUp","gotoPageUp","jumpToMatching","$handlePaste","duplicateSelection","sortLines","modifyNumber","copyLinesUp","copyLinesDown","removeToLineStart","removeToLineEnd","removeWordLeft","removeWordRight","blockOutdent","blockIndent","splitLine","transposeLetters","transposeSelections","firstLineEndCol","selectedText","selectedCount","insertLine","curLine","newRanges","exitMultiSelectMode","defaultCommands","Editor","getContainerElement","getTextAreaContainer","textarea","$mouseHandler","keyBinding","$search","$historyTracker","$initOperationListeners","_$emitInputEvent","setSession","startOperation","endOperation","$opResetTimer","curOp","docChanged","selectionChanged","prevOp","commadEvent","previousCommand","scrollSelectionIntoView","animateScrolling","$mergeableCommands","$mergeUndoDeltas","prev","mergeableCommands","shouldMerge","mergeNextCommand","sequenceStartTime","keyboardHandler","$keybindingId","handler","oldSession","$onDocumentChange","$onTokenizerUpdate","$onChangeTabSize","$onChangeWrapLimit","$onChangeWrapMode","$onChangeFold","$onChangeFrontMarker","$onChangeBackMarker","$onChangeBreakpoint","$onChangeAnnotation","$onCursorChange","$onScrollTopChange","$onScrollLeftChange","$onSelectionChange","onDocumentChange","onChangeMode","onTokenizerUpdate","onChangeTabSize","onChangeWrapLimit","onChangeWrapMode","onChangeFrontMarker","onChangeBackMarker","onChangeBreakpoint","onChangeAnnotation","onCursorChange","onScrollTopChange","onScrollLeftChange","onSelectionChange","updateFull","oldEditor","getSession","cursorPos","resize","onResize","setTheme","theme","getTheme","getFontSize","setFontSize","$highlightBrackets","$bracketHighlight","$highlightPending","getMatching","$highlightTags","$highlightTagPending","$tagHighlight","prevToken","sbm","$isFocused","showCursor","visualizeFocus","hideCursor","visualizeBlur","$cursorChange","updateCursor","updateLines","$updateHighlightActiveLine","scrollToY","scrollToX","$highlightActiveLine","$selectionStyle","$maxLines","$minLines","$highlightLineMarker","$selectionMarker","$highlightSelectedWord","$getSelectionHighLightRegexp","startOuter","endOuter","lineCols","updateFrontMarkers","updateBackMarkers","updateBreakpoints","updateText","getSelectedText","inVirtualSelectionMode","getBehavioursEnabled","transform","$mergeNextCommand","d","lineState","shouldOutdent","lineIndent","setScrollSpeed","getScrollSpeed","setDragDelay","setSelectionStyle","setHighlightActiveLine","shouldHighlight","getHighlightActiveLine","setHighlightGutterLine","getHighlightGutterLine","setHighlightSelectedWord","getHighlightSelectedWord","setAnimatedScroll","shouldAnimate","getAnimatedScroll","setDisplayIndentGuides","getDisplayIndentGuides","setShowPrintMargin","showPrintMargin","getShowPrintMargin","setPrintMarginColumn","getPrintMarginColumn","setBehavioursEnabled","enabled","setWrapBehavioursEnabled","setShowFoldWidgets","getShowFoldWidgets","setFadeFoldWidgets","fade","getFadeFoldWidgets","new_range","swap","originalRange","$getSelectedRows","getNumberAt","_numberRx","number","amount","charRange","isFinite","nr","fp","decimals","nnr","toFixed","replaceRange","sel","endPoint","moved","totalDiff","rangeIndex","subRows","showComposition","setCompositionText","hideComposition","getFirstVisibleRow","getLastVisibleRow","isRowVisible","isRowFullyVisible","getFirstFullyVisibleRow","getLastFullyVisibleRow","$getVisibleRowCount","getScrollBottomRow","getScrollTopRow","$moveByPage","scrollToRow","scrollToLine","center","animate","alignCursor","getCursorPositionScreen","expand","matchType","bracketType","found","brackets","lineNumber","navigateTo","replaced","$tryReplace","replaceAll","getLastSearchOptions","newRange","preventScroll","revealRange","setAutoScrollEditorIntoView","shouldScroll","$scrollAnchor","scrollAnchor","onChangeSelection","onBeforeRender","onAfterRender","searchBox","$pixelPos","$resetCursorStyle","$cursorStyle","cursorLayer","setSmoothBlinking","isBlinking","selectionStyle","highlightActiveLine","highlightSelectedWord","behavioursEnabled","wrapBehavioursEnabled","autoScrollEditorIntoView","keybindingId","hScrollBarAlwaysVisible","vScrollBarAlwaysVisible","highlightGutterLine","animatedScroll","printMarginColumn","printMargin","fadeFoldWidgets","showFoldWidgets","showLineNumbers","showGutter","displayIndentGuides","fontSize","fontFamily","maxLines","minLines","scrollPastEnd","fixedWidthGutter","foldStyle","UndoManager","$serializeDelta","$deserializeDelta","cloneDeltaSetsObj","deltaSets_old","fnGetModifiedDelta","deltaSets_new","deltaSet_old","deltaSet_new","delta_old","deltaSets","$doc","hasUndo","dirtyCounter","$undoStack","$redoStack","NaN","undoSelectionRange","redoSelectionRange","$deserializeDeltas","hasRedo","markClean","isClean","$serializeDeltas","Gutter","parentEl","$showFoldWidgets","gutterWidth","$updateAnnotations","$cells","rowInfo","annoText","gutterOffset","breakpoints","decorations","$firstLineNumber","lastLineNumber","gutterRenderer","$renderer","cell","textNode","foldWidget","getText","minHeight","$fixedWidth","padding","$padding","$computePadding","ceil","$showLineNumbers","setShowLineNumbers","getShowLineNumbers","paddingLeft","paddingRight","Marker","getBorderClass","tl","tr","br","bl","setPadding","setMarkers","$getTop","drawFullLineMarker","drawScreenLineMarker","drawTextMarker","drawMultiLineMarker","drawBidiSingleLineMarker","firstRowScreen","stringBuilder","extraStyle","curr","clazzModified","lineRange","range1","radiusClass","extraLength","Text","$updateEolChar","EOF_CHAR","EOL_CHAR_LF","EOL_CHAR_CRLF","EOL_CHAR","TAB_CHAR","SPACE_CHAR","getLineHeight","$fontMetrics","measure","$pollSizeChanges","checkForSizeChanges","$pollSizeChangesTimer","$computeTabString","$tabStrings","tabStr","$indentGuideRe","spaceClass","tabClass","spaceContent","tabContent","scrollLines","lineElements","childNodes","lineElementsIdx","lineElement","$renderLine","$useLineGroups","oldConfig","lastChild","fragment","$renderLinesFragment","createDocumentFragment","$textToken","$renderToken","replaceReg","replaceFunc","tabIdx","idx4","classToUse","space","output","renderIndentGuide","cols","$renderWrappedLine","onlyContents","splitChars","$renderSimpleLine","$getFoldLineTokens","renderTokens","addTokens","$measureNode","isIE8","Cursor","isVisible","blinkInterval","smoothBlinking","cursors","addCursor","$updateCursors","$updateVisibility","$updateOpacity","visibility","blinking","restartTimer","setBlinkInterval","removeCursor","intervalId","timeoutId","blink","getPixelPosition","onScreen","cursorLeft","cursorTop","$selectionMarkers","cursorIndex","pixelPos","drawCursor","$setOverwrite","MAX_SCROLL_H","ScrollBar","parent","classSuffix","setVisible","skipEvent","onScroll","coeff","VScrollBar","scrollHeight","$scrollbarWidth","$minWidth","setHeight","setInnerHeight","setScrollHeight","HScrollBar","setWidth","setInnerWidth","setScrollWidth","ScrollBarV","ScrollBarH","RenderLoop","onRender","pending","changes","change","CHAR_COUNT","FontMetrics","$setMeasureNodeStyles","$main","$testFractionalRect","isRoot","whiteSpace","font","$measureSizes","fontWeight","boldSize","charSizes","allowBoldFonts","setPolling","GutterLayer","MarkerLayer","TextLayer","CursorLayer","editorCss","VirtualRenderer","content","onGutterResize","$markerBack","textLayer","$textLayer","canvas","$markerFront","$horizScroll","$vScroll","scrollBar","$scrollAnimation","scrollMargin","updateCharacterSize","$size","scrollerHeight","scrollerWidth","$dirty","maxHeight","v","$loop","$renderChanges","CHANGE_FULL","CHANGE_CURSOR","CHANGE_MARKER","CHANGE_GUTTER","CHANGE_SCROLL","CHANGE_LINES","CHANGE_TEXT","CHANGE_SIZE","CHANGE_MARKER_BACK","CHANGE_MARKER_FRONT","CHANGE_H_SCROLL","$allowBoldFonts","$updatePrintMargin","onChangeNewLineMode","$changedLines","updateFontSize","$changes","$updateSizeAsync","resizing","scrollWidth","$updateCachedSize","$extraHeight","oldSize","$showGutter","$computeLayerConfig","availableWidth","$showPrintMargin","$printMarginColumn","$animatedScroll","getShowGutter","setShowGutter","$updateGutterLineHighlight","$gutterLineHighlight","$printMarginEl","containerEl","posTop","posLeft","$composition","setScrollMargin","sm","getHScrollBarAlwaysVisible","$hScrollBarAlwaysVisible","setHScrollBarAlwaysVisible","alwaysVisible","getVScrollBarAlwaysVisible","$vScrollBarAlwaysVisible","setVScrollBarAlwaysVisible","$updateScrollBarV","$scrollPastEnd","$updateScrollBarH","$frozen","unfreeze","st","marginTop","marginLeft","$highlightGutterLine","$updateLines","$autosize","desiredHeight","$maxPixelHeight","$gutterWidth","hideScrollbars","screenLines","longestLine","$getLongestLine","horizScroll","hScrollChanged","vScrollBefore","vScrollChanged","firstRowHeight","lineCount","charCount","$viewMargin","topMargin","bottomMargin","alignment","STEPS","$calcSteps","fromValue","toValue","steps","x_min","dx","initialScroll","oldSteps","$timer","scrollTo","canvasPos","textToScreenCoordinates","pageX","pageY","keepTextAreaAtCursor","$themeId","cssClass","$theme","isDark","setMouseCursor","maxPixelHeight","$workerBlob","workerUrl","Blob","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","blobBuilder","getBlob","blob","URL","webkitURL","blobURL","createObjectURL","Worker","WorkerClient","topLevelNamespaces","classname","importScripts","$sendDeltaQueue","changeListener","onMessage","nameToUrl","toUrl","normalizePath","$normalizePath","tlns","callbackId","callbacks","onmessage","err","deltaQueue","cmd","emit","ex","attachToDocument","q","UIWorkerClient","messageBuffer","main","emitSync","sender","processNext","setEmitSync","Main","PlaceHolder","others","mainClass","othersClass","$onUpdate","onUpdate","$others","undoStack","$undostack","$undoStackDepth","setup","selectionBefore","showOtherMarkers","othersActive","hideOtherMarkers","updateAnchors","lengthDiff","inMainRange","distanceFromStart","newPos","updateMarkers","updateMarker","undosRequired","isSamePoint","alt","ctrl","accel","selectionMode","isMultiSelect","mouseX","mouseY","onMouseSelection","screenAnchor","screenCursor","$enableJumpToDef","$blockSelectEnabled","addSelectionMarker","oldRange","removeSelectionMarker","tmpSel","rectSel","blockSelect","newCursor","removeSelectionMarkers","rectangularRangeBlock","updateSelectionMarkers","onMouseSelectionEnd","onSelectionInterval","selectMoreLines","selectMore","splitIntoLines","alignCursors","multiSelectCommands","getSelectionMarkers","$blockChangeEvents","$onAddRange","$onRemoveRange","mergeOverlappingRanges","lastRange","$initRangeList","toggleBlockSelection","includeEmptyLines","xBackwards","startOffsetX","endOffsetX","yBackwards","docEnd","MultiSelect","$multiselectOnSessionChange","$onMultiSelect","$onSingleSelect","onSessionChange","$checkMultiselectChange","addAltCursorListeners","altCursor","altDown","selectionMarkerCount","markerList","$onMultiSelectExec","inVirtualMode","forEachSelection","keepOrder","$byLines","reg","cmdResult","anim","buf","nl","additive","skip","screenLead","toRemove","words","stopAtFirst","sameRowRanges","maxCol","minSpace","spaceOffsets","spaceOffset","fr","lr","guessRange","$reAlignText","forceLeft","startW","textW","endW","isLeftAligned","isRightAligned","alignLeft","alignRight","unAlign","enableMultiselect","enableBlockSelect","FoldMode","foldingStartMarker","foldingStopMarker","indentationBlock","startLevel","openingBracketBlock","closingBracketBlock","LineWidgets","widgetManager","updateOnChange","renderWidgets","measureWidgets","_changedWidgets","$onChangeEditor","updateOnFold","hidden","_inDocument","removeLineWidget","$updateRows","noWidgets","$oldWidget","addLineWidget","zIndex","coverGutter","pixelHeight","$fold","onWidgetChanged","w1","getWidgetsAtRow","changedWidgets","fixedWidth","coverLine","fullWidth","binarySearch","comparator","findAnnotations","matched","oldWidget","gutterAnno","arrow","onmousedown","Renderer","edit","_id","getElementById","env","tagName","oldNode","createEditSession","version","att_mixins","formItem","database","backup","idc","table","assigned","tp","isquery","ip","username","password","port","wordList","page_number","current","picker","user","valve","query","department","computer_room","connection_name","table_data","testResults","validate_gen","loading","is_open","group_list","group_props","edit_password","savePassLoading","components","SnippetManager","snippetMap","snippetNameMap","TabstopToken","inFormatString","tabstopId","expectIf","elseBranch","changeCase","local","snippetVar","choices","fmtString","guard","fmt","code","formatString","tokenizeTmSnippet","$getDefaultValue","variables","__","getVariableValue","varName","tmStrFormat","fmtTokens","formatted","fmtParts","resolveVariables","gChangeCase","snippet","gotoNext","i1","insertSnippetForSelection","snippetText","tabString","tabstops","isNested","expanding","copyValue","arg","tabstopManager","TabstopManager","selectionId","addTabstops","insertSnippet","tabNext","$getScope","inlinePhp","getActiveScopes","scopes","includeScopes","expandWithTab","expandSnippetForSelection","snippets","findMatchingSnippet","dryRun","replaceBefore","replaceAfter","M__","matchBefore","T__","matchAfter","snippetList","startRe","endRe","triggerRe","endTriggerRe","register","wrapRegexp","guardedRegexp","addSnippet","unregister","tabTrigger","trigger","endTrigger","endGuard","removeSnippet","nameMap","parseSnippetFile","JSON","parse","guardRe","getSnippetByName","$onChangeSelection","$onChangeSession","onChangeSession","$onAfterExec","onAfterExec","$openTabstops","selectedTabstop","removeTabstopMarkers","isRemove","$inChange","changedOutside","removeRange","updateLinkedFields","hasLinkedRanges","firstNonLinked","linked","snippetManager","containsLead","containsAnchor","selectTabstop","addTabstopMarkers","moveRelative","dest","movePoint","tabstop","ed","changeTracker","expandSnippet","$singleLineEditor","$focusWaitTimout","AcePopup","popup","lastMouseEvent","noop","selectionMarker","hoverMarker","setSelectOnHover","setRow","setHoverMarker","getRow","selectedNode","hideHoverMarker","suppressRedraw","getHoveredRow","caption","matchMask","maxW","metaData","isTopdown","autoSelect","topdownOnly","screenHeight","maxH","$borderSize","allowTopdown","getTextLeftOffset","$imageSize","parForEach","fn","completed","arLength","ID_REGEX","retrievePrecedingIdentifier","retrieveFollowingIdentifier","getCompletionPrefix","completers","completer","identifierRegexps","identifierRegex","util","Autocomplete","autoInsert","exactMatch","gatherCompletionsId","blurListener","mousedownListener","mousewheelListener","changeTimer","updateCompletions","tooltipTimer","updateDocTooltip","insertMatch","getPopup","openPopup","keepPopupPosition","completions","filtered","hideDocTooltip","activated","fromTooltip","relatedTarget","tooltipNode","goTo","where","filterText","deleteSuffix","gatherCompletions","total","results","finished","showPopup","setFilter","detachIfFinished","FilteredList","getDocTooltip","docText","docHTML","showDocTooltip","margin","pointerEvents","tabIndex","onblur","onclick","onTooltipClick","nodeName","startCommand","filterCompletions","items","upper","lower","loop","penalty","i2","getWordIndex","textBefore","wordDistance","prefixPos","wordScores","currentWord","wordScore","textCompleter","keyWordCompleter","snippetCompleter","setCompleters","addCompleter","loadSnippetsForMode","files","loadSnippetFile","modes","snippetFilePath","doLiveAutocomplete","hasCompleter","enableBasicAutocompletion","enableLiveAutocompletion","enableSnippets","isRegExp","anObject","speciesConstructor","advanceStringIndex","toLength","callRegExpExec","regexpExec","fails","$min","$push","$SPLIT","LENGTH","LAST_INDEX","MAX_UINT32","SUPPORTS_Y","defined","SPLIT","maybeCallNative","internalSplit","separator","lastLength","flags","lastLastIndex","splitLimit","separatorCopy","O","splitter","regexp","res","done","rx","unicodeMatching","lim","A","z","fetch_mixins","fetchData","$config","then","notice","catch","err_notice","put","DocCommentHighlightRules","getTagRule","getStartRule","getEndRule","MysqlHighlightRules","mySqlKeywords","builtins","variable","keywordMapper","escapeSeq","render","_vm","_h","$createElement","_c","staticStyle","staticRenderFns","isObject","cof","MATCH","it","emmet","emmetPath","AceEmmetEditor","setupContext","resources","require","setVariable","$syntax","getSyntax","createSelection","getCurrentLineRange","lineLength","getCaretPos","setCaretPos","getCurrentLine","replaceContent","noIndent","getContent","$updateTabstops","syntax","getProfileName","profile","getVariable","emmetConfig","title","getFilePath","zeroBase","lastZero","tabStops","settings","getVocabulary","tabstopOptions","isZero","processText","common","utils","replaceSubstring","keymap","expand_abbreviation","match_pair_outward","match_pair_inward","matching_pair","next_edit_point","prev_edit_point","toggle_comment","split_join_tag","remove_tag","evaluate_math_expression","increment_number_by_1","decrement_number_by_1","increment_number_by_01","decrement_number_by_01","increment_number_by_10","decrement_number_by_10","select_next_item","select_previous_item","reflect_css_value","encode_decode_data_url","expand_abbreviation_with_tab","wrap_with_abbreviation","editorProxy","runEmmetCommand","actions","run","load","updateCommands","isSupportedMode","isSupported","enableEmmet","setCore","order_mixins","testColumns","ruleValidate","required","invalidDate","disabledDate","date","clearObj","vl"],"mappings":"sGAoCA,WAEA,IAAIA,EAAgB,MAEhBC,EAAS,WAAc,OAAOC,KAArB,GAIb,GAHKD,GAA2B,oBAAVE,SAAuBF,EAASE,QAGjDH,GAAuC,qBAAfI,WAA7B,CAIA,IAAIC,EAAS,SAASC,EAAQC,EAAMC,GACV,kBAAXF,GASa,GAApBG,UAAUC,SACVF,EAAUD,GACTF,EAAOM,QAAQL,KAChBD,EAAOO,SAASN,GAAUE,EAC1BH,EAAOM,QAAQL,GAAU,OAZrBD,EAAOQ,SACPR,EAAOQ,SAASC,MAAMZ,KAAMO,YAE5BM,QAAQC,MAAM,mDACdD,QAAQE,UAYpBZ,EAAOM,QAAU,GACjBN,EAAOO,SAAW,GAKlB,IAAIM,EAAY,SAASC,EAAUb,EAAQc,GACvC,GAAsB,kBAAXd,EAAqB,CAC5B,IAAIE,EAAUa,EAAOF,EAAUb,GAC/B,QAAegB,GAAXd,EAEA,OADAY,GAAYA,IACLZ,OAER,GAA+C,mBAA3Ce,OAAOC,UAAUC,SAASC,KAAKpB,GAA8B,CAEpE,IADA,IAAIqB,EAAS,GACJC,EAAI,EAAGC,EAAIvB,EAAOI,OAAQkB,EAAIC,IAAKD,EAAG,CAC3C,IAAIE,EAAMT,EAAOF,EAAUb,EAAOsB,IAClC,QAAWN,GAAPQ,GAAoBC,EAASlB,SAC7B,OACJc,EAAOK,KAAKF,GAEhB,OAAOV,GAAYA,EAASN,MAAM,KAAMa,KAAW,IAIvDI,EAAW,SAASzB,EAAQc,GAC5B,IAAIa,EAAiBf,EAAU,GAAIZ,EAAQc,GAC3C,YAAsBE,GAAlBW,GAA+BF,EAASlB,SACjCkB,EAASlB,SAASC,MAAMZ,KAAMO,WAClCwB,GAGPC,EAAkB,SAASf,EAAUgB,GAErC,IAAiC,IAA7BA,EAAWC,QAAQ,KAAa,CAChC,IAAIC,EAASF,EAAWG,MAAM,KAC9B,OAAOJ,EAAgBf,EAAUkB,EAAO,IAAM,IAAMH,EAAgBf,EAAUkB,EAAO,IAGzF,GAA4B,KAAxBF,EAAWI,OAAO,GAAW,CAC7B,IAAIC,EAAOrB,EAASmB,MAAM,KAAKG,MAAM,GAAI,GAAGC,KAAK,KACjDP,EAAaK,EAAO,IAAML,EAE1B,OAAmC,IAA7BA,EAAWC,QAAQ,MAAeO,GAAYR,EAAY,CAC5D,IAAIQ,EAAWR,EACfA,EAAaA,EAAWS,QAAQ,SAAU,KAAKA,QAAQ,iBAAkB,KAGjF,OAAOT,GAOPd,EAAS,SAASF,EAAUgB,GAC5BA,EAAaD,EAAgBf,EAAUgB,GAEvC,IAAI7B,EAASD,EAAOM,QAAQwB,GAC5B,IAAK7B,EAAQ,CAET,GADAA,EAASD,EAAOO,SAASuB,GACH,oBAAX7B,EAAuB,CAC9B,IAAIuC,EAAU,GACVC,EAAM,CACNC,GAAIZ,EACJa,IAAK,GACLH,QAASA,EACTI,UAAU,GAGVC,EAAM,SAAS5C,EAAQc,GACvB,OAAOF,EAAUiB,EAAY7B,EAAQc,IAGrC+B,EAAc7C,EAAO4C,EAAKL,EAASC,GACvCD,EAAUM,GAAeL,EAAID,QAC7BxC,EAAOM,QAAQwB,GAAcU,SACtBxC,EAAOO,SAASuB,GAE3B7B,EAASD,EAAOM,QAAQwB,GAAcU,GAAWvC,EAErD,OAAOA,GAwBX8C,EAAUpD,GArBV,SAASoD,EAAUC,GACf,IAAIC,EAAOrD,EACPoD,IACKpD,EAAOoD,KACRpD,EAAOoD,GAAM,IACjBC,EAAOrD,EAAOoD,IAGbC,EAAKjD,QAAWiD,EAAKjD,OAAO4C,WAC7B5C,EAAOQ,SAAWyC,EAAKjD,OACvBiD,EAAKjD,OAASA,EACdiD,EAAKjD,OAAO4C,UAAW,GAGtBK,EAAKvB,UAAauB,EAAKvB,SAASkB,WACjClB,EAASlB,SAAWyC,EAAKvB,SACzBuB,EAAKvB,SAAWA,EAChBuB,EAAKvB,SAASkB,UAAW,KAnIjC,GA2IAM,IAAIlD,OAAO,iBAAiB,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GACxF,aAEI,IAAIkD,EAAO,CACHC,KAAMC,OAAOlC,UAAUiC,KACvBE,KAAMD,OAAOlC,UAAUmC,KACvBC,MAAOC,OAAOrC,UAAUoC,MACxBhB,QAASiB,OAAOrC,UAAUoB,QAC1BN,MAAOuB,OAAOrC,UAAUc,OAE5BwB,OAAsDxC,IAAlCkC,EAAKC,KAAK/B,KAAK,OAAQ,IAAI,GAC/CqC,EAA8B,WAC1B,IAAIC,EAAI,KAER,OADAR,EAAKG,KAAKjC,KAAKsC,EAAG,KACVA,EAAEC,UAHgB,GA0ClC,SAASC,EAAgBC,GACrB,OAAQA,EAAMlE,OAAa,IAAM,KACzBkE,EAAMC,WAAa,IAAM,KACzBD,EAAME,UAAa,IAAM,KACzBF,EAAMG,SAAa,IAAM,KACzBH,EAAMI,OAAa,IAAM,IAGrC,SAASnC,EAASoC,EAAOC,EAAMC,GAC3B,GAAIC,MAAMnD,UAAUY,QAChB,OAAOoC,EAAMpC,QAAQqC,EAAMC,GAC/B,IAAK,IAAI9C,EAAI8C,GAAQ,EAAG9C,EAAI4C,EAAM9D,OAAQkB,IACtC,GAAI4C,EAAM5C,KAAO6C,EACb,OAAO7C,EAEf,OAAQ,EAnDRmC,GAA+BD,IAEnCJ,OAAOlC,UAAUiC,KAAO,SAAUmB,GAC9B,IACIC,EAAMC,EADNlB,EAAQJ,EAAKC,KAAK3C,MAAMZ,KAAMO,WAElC,GAAoB,iBAAT,GAAqBmD,EAAO,CAUnC,IATKE,GAAqBF,EAAMlD,OAAS,GAAK0B,EAAQwB,EAAO,KAAO,IAChEkB,EAAKpB,OAAOxD,KAAK6E,OAAQvB,EAAKZ,QAAQlB,KAAKwC,EAAehE,MAAO,IAAK,KACtEsD,EAAKZ,QAAQlB,KAAKkD,EAAInC,MAAMmB,EAAMoB,OAAQF,EAAI,WAC1C,IAAK,IAAIlD,EAAI,EAAGA,EAAInB,UAAUC,OAAS,EAAGkB,SACjBN,IAAjBb,UAAUmB,KACVgC,EAAMhC,QAAKN,MAIvBpB,KAAK+E,UAAY/E,KAAK+E,SAASC,aAC/B,IAAK,IAAItD,EAAI,EAAGA,EAAIgC,EAAMlD,OAAQkB,IAC9BiD,EAAO3E,KAAK+E,SAASC,aAAatD,EAAI,GAClCiD,IACDjB,EAAMiB,GAAQjB,EAAMhC,KAG1BmC,GAA+B7D,KAAKD,SAAW2D,EAAM,GAAGlD,QAAWR,KAAK+D,UAAYL,EAAMoB,OAC3F9E,KAAK+D,YAEb,OAAOL,GAENG,IACDL,OAAOlC,UAAUmC,KAAO,SAAUiB,GAC9B,IAAIhB,EAAQJ,EAAKC,KAAK/B,KAAKxB,KAAM0E,GAGjC,OAFIhB,GAAS1D,KAAKD,SAAW2D,EAAM,GAAGlD,QAAWR,KAAK+D,UAAYL,EAAMoB,OACpE9E,KAAK+D,cACAL,OAwBrBL,IAAIlD,OAAO,mBAAmB,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GAE1F,SAAS6E,KAEJC,SAAS5D,UAAU6D,OACpBD,SAAS5D,UAAU6D,KAAO,SAAcC,GACpC,IAAIC,EAASrF,KACb,GAAqB,mBAAVqF,EACP,MAAM,IAAIC,UAAU,kDAAoDD,GAE5E,IAAIE,EAAOhD,EAAMf,KAAKjB,UAAW,GAC7BiF,EAAQ,WAER,GAAIxF,gBAAgBwF,EAAO,CAEvB,IAAIC,EAASJ,EAAOzE,MAChBZ,KACAuF,EAAKG,OAAOnD,EAAMf,KAAKjB,aAE3B,OAAIc,OAAOoE,KAAYA,EACZA,EAEJzF,KAGP,OAAOqF,EAAOzE,MACVwE,EACAG,EAAKG,OAAOnD,EAAMf,KAAKjB,cAWnC,OALG8E,EAAO/D,YACN2D,EAAM3D,UAAY+D,EAAO/D,UACzBkE,EAAMlE,UAAY,IAAI2D,EACtBA,EAAM3D,UAAY,MAEfkE,IAGf,IAMIG,EACAC,EACAC,EACAC,EACAC,EAVAvE,EAAO0D,SAAS5D,UAAUE,KAC1BwE,EAAmBvB,MAAMnD,UACzB2E,EAAoB5E,OAAOC,UAC3BiB,EAAQyD,EAAiBzD,MACzB2D,EAAY1E,EAAK2D,KAAKc,EAAkB1E,UACxC4E,EAAO3E,EAAK2D,KAAKc,EAAkBG,gBAYvC,IANKL,EAAoBI,EAAKF,EAAmB,uBAC7CN,EAAenE,EAAK2D,KAAKc,EAAkBI,kBAC3CT,EAAepE,EAAK2D,KAAKc,EAAkBK,kBAC3CT,EAAerE,EAAK2D,KAAKc,EAAkBM,kBAC3CT,EAAetE,EAAK2D,KAAKc,EAAkBO,mBAEjB,GAA1B,CAAC,EAAE,GAAGC,OAAO,GAAGjG,OAChB,GAAG,WACC,SAASkG,EAAU/E,GACf,IAAIgF,EAAI,IAAIlC,MAAM9C,EAAE,GAEpB,OADAgF,EAAE,GAAKA,EAAE,GAAK,EACPA,EAEX,IAAgBC,EAAZtC,EAAQ,GAUZ,GARAA,EAAMmC,OAAO7F,MAAM0D,EAAOoC,EAAU,KACpCpC,EAAMmC,OAAO7F,MAAM0D,EAAOoC,EAAU,KAEpCE,EAAetC,EAAM9D,OACrB8D,EAAMmC,OAAO,EAAG,EAAG,OAECnC,EAAM9D,OAEtBoG,EAAe,GAAKtC,EAAM9D,OAC1B,OAAO,EAjBZ,GAmBE,CACD,IAAIqG,EAAepC,MAAMnD,UAAUmF,OACnChC,MAAMnD,UAAUmF,OAAS,SAASK,EAAOC,GACrC,OAAKxG,UAAUC,OAGJqG,EAAajG,MAAMZ,KAAM,MAClB,IAAV8G,EAAmB,EAAIA,OACP,IAAhBC,EAA0B/G,KAAKQ,OAASsG,EAASC,GACnDrB,OAAOnD,EAAMf,KAAKjB,UAAW,KALxB,SASfkE,MAAMnD,UAAUmF,OAAS,SAASO,EAAKC,GACnC,IAAIzG,EAASR,KAAKQ,OACdwG,EAAM,EACFA,EAAMxG,IACNwG,EAAMxG,QACI,GAAPwG,EACPA,EAAM,EACCA,EAAM,IACbA,EAAME,KAAKC,IAAI3G,EAASwG,EAAK,IAG3BA,EAAIC,EAAczG,IACpByG,EAAczG,EAASwG,GAE3B,IAAII,EAAUpH,KAAKuC,MAAMyE,EAAKA,EAAIC,GAC9BI,EAAS9E,EAAMf,KAAKjB,UAAW,GAC/B+G,EAAMD,EAAO7G,OACjB,GAAIwG,IAAQxG,EACJ8G,GACAtH,KAAK8B,KAAKlB,MAAMZ,KAAMqH,OAEvB,CACH,IAAIE,EAASL,KAAKM,IAAIP,EAAazG,EAASwG,GACxCS,EAAaT,EAAMO,EACnBG,EAAaD,EAAaH,EAAMC,EAChCI,EAAYnH,EAASiH,EACrBG,EAAoBpH,EAAS+G,EAEjC,GAAIG,EAAaD,EACb,IAAK,IAAI/F,EAAI,EAAGA,EAAIiG,IAAajG,EAC7B1B,KAAK0H,EAAWhG,GAAK1B,KAAKyH,EAAW/F,QAEtC,GAAIgG,EAAaD,EACpB,IAAK/F,EAAIiG,EAAWjG,KAChB1B,KAAK0H,EAAWhG,GAAK1B,KAAKyH,EAAW/F,GAI7C,GAAI4F,GAAON,IAAQY,EACf5H,KAAKQ,OAASoH,EACd5H,KAAK8B,KAAKlB,MAAMZ,KAAMqH,QAGtB,IADArH,KAAKQ,OAASoH,EAAoBN,EAC7B5F,EAAI,EAAGA,EAAI4F,IAAO5F,EACnB1B,KAAKgH,EAAItF,GAAK2F,EAAO3F,GAIjC,OAAO0F,GAId3C,MAAMoD,UACPpD,MAAMoD,QAAU,SAAiBC,GAC7B,MAAyB,kBAAlB5B,EAAU4B,KAGzB,IAoRQC,EApRJC,EAAc3G,OAAO,KACrB4G,EAAgC,KAAlBD,EAAY,MAAe,KAAKA,GAgPlD,GA9OKvD,MAAMnD,UAAU4G,UACjBzD,MAAMnD,UAAU4G,QAAU,SAAiBC,GACvC,IAAIC,EAASC,EAASrI,MAClBsI,EAAOL,GAAkC,mBAAnB/B,EAAUlG,MAC5BA,KAAKoC,MAAM,IACXgG,EACJG,EAAQhI,UAAU,GAClBmB,GAAK,EACLlB,EAAS8H,EAAK9H,SAAW,EAC7B,GAAsB,qBAAlB0F,EAAUiC,GACV,MAAM,IAAI7C,UAGd,QAAS5D,EAAIlB,EACLkB,KAAK4G,GACLH,EAAI3G,KAAK+G,EAAOD,EAAK5G,GAAIA,EAAG0G,KAKvC3D,MAAMnD,UAAUkH,MACjB/D,MAAMnD,UAAUkH,IAAM,SAAaL,GAC/B,IAAIC,EAASC,EAASrI,MAClBsI,EAAOL,GAAkC,mBAAnB/B,EAAUlG,MAC5BA,KAAKoC,MAAM,IACXgG,EACJ5H,EAAS8H,EAAK9H,SAAW,EACzBiF,EAAShB,MAAMjE,GACf+H,EAAQhI,UAAU,GACtB,GAAsB,qBAAlB2F,EAAUiC,GACV,MAAM,IAAI7C,UAAU6C,EAAM,sBAG9B,IAAK,IAAIzG,EAAI,EAAGA,EAAIlB,EAAQkB,IACpBA,KAAK4G,IACL7C,EAAO/D,GAAKyG,EAAI3G,KAAK+G,EAAOD,EAAK5G,GAAIA,EAAG0G,IAEhD,OAAO3C,IAGVhB,MAAMnD,UAAUmH,SACjBhE,MAAMnD,UAAUmH,OAAS,SAAgBN,GACrC,IAMIO,EANAN,EAASC,EAASrI,MAClBsI,EAAOL,GAAkC,mBAAnB/B,EAAUlG,MAC5BA,KAAKoC,MAAM,IACPgG,EACR5H,EAAS8H,EAAK9H,SAAW,EACzBiF,EAAS,GAET8C,EAAQhI,UAAU,GACtB,GAAsB,qBAAlB2F,EAAUiC,GACV,MAAM,IAAI7C,UAAU6C,EAAM,sBAG9B,IAAK,IAAIzG,EAAI,EAAGA,EAAIlB,EAAQkB,IACpBA,KAAK4G,IACLI,EAAQJ,EAAK5G,GACTyG,EAAI3G,KAAK+G,EAAOG,EAAOhH,EAAG0G,IAC1B3C,EAAO3D,KAAK4G,IAIxB,OAAOjD,IAGVhB,MAAMnD,UAAUqH,QACjBlE,MAAMnD,UAAUqH,MAAQ,SAAeR,GACnC,IAAIC,EAASC,EAASrI,MAClBsI,EAAOL,GAAkC,mBAAnB/B,EAAUlG,MAC5BA,KAAKoC,MAAM,IACXgG,EACJ5H,EAAS8H,EAAK9H,SAAW,EACzB+H,EAAQhI,UAAU,GACtB,GAAsB,qBAAlB2F,EAAUiC,GACV,MAAM,IAAI7C,UAAU6C,EAAM,sBAG9B,IAAK,IAAIzG,EAAI,EAAGA,EAAIlB,EAAQkB,IACxB,GAAIA,KAAK4G,IAASH,EAAI3G,KAAK+G,EAAOD,EAAK5G,GAAIA,EAAG0G,GAC1C,OAAO,EAGf,OAAO,IAGV3D,MAAMnD,UAAUsH,OACjBnE,MAAMnD,UAAUsH,KAAO,SAAcT,GACjC,IAAIC,EAASC,EAASrI,MAClBsI,EAAOL,GAAkC,mBAAnB/B,EAAUlG,MAC5BA,KAAKoC,MAAM,IACXgG,EACJ5H,EAAS8H,EAAK9H,SAAW,EACzB+H,EAAQhI,UAAU,GACtB,GAAsB,qBAAlB2F,EAAUiC,GACV,MAAM,IAAI7C,UAAU6C,EAAM,sBAG9B,IAAK,IAAIzG,EAAI,EAAGA,EAAIlB,EAAQkB,IACxB,GAAIA,KAAK4G,GAAQH,EAAI3G,KAAK+G,EAAOD,EAAK5G,GAAIA,EAAG0G,GACzC,OAAO,EAGf,OAAO,IAGV3D,MAAMnD,UAAUuH,SACjBpE,MAAMnD,UAAUuH,OAAS,SAAgBV,GACrC,IAAIC,EAASC,EAASrI,MAClBsI,EAAOL,GAAkC,mBAAnB/B,EAAUlG,MAC5BA,KAAKoC,MAAM,IACXgG,EACJ5H,EAAS8H,EAAK9H,SAAW,EAC7B,GAAsB,qBAAlB0F,EAAUiC,GACV,MAAM,IAAI7C,UAAU6C,EAAM,sBAE9B,IAAK3H,GAA8B,GAApBD,UAAUC,OACrB,MAAM,IAAI8E,UAAU,+CAGxB,IACIG,EADA/D,EAAI,EAER,GAAInB,UAAUC,QAAU,EACpBiF,EAASlF,UAAU,QAEnB,EAAG,CACC,GAAImB,KAAK4G,EAAM,CACX7C,EAAS6C,EAAK5G,KACd,MAEJ,KAAMA,GAAKlB,EACP,MAAM,IAAI8E,UAAU,qDAEnB,GAGb,KAAO5D,EAAIlB,EAAQkB,IACXA,KAAK4G,IACL7C,EAAS0C,EAAI3G,UAAK,EAAQiE,EAAQ6C,EAAK5G,GAAIA,EAAG0G,IAItD,OAAO3C,IAGVhB,MAAMnD,UAAUwH,cACjBrE,MAAMnD,UAAUwH,YAAc,SAAqBX,GAC/C,IAAIC,EAASC,EAASrI,MAClBsI,EAAOL,GAAkC,mBAAnB/B,EAAUlG,MAC5BA,KAAKoC,MAAM,IACXgG,EACJ5H,EAAS8H,EAAK9H,SAAW,EAC7B,GAAsB,qBAAlB0F,EAAUiC,GACV,MAAM,IAAI7C,UAAU6C,EAAM,sBAE9B,IAAK3H,GAA8B,GAApBD,UAAUC,OACrB,MAAM,IAAI8E,UAAU,oDAGxB,IAAIG,EAAQ/D,EAAIlB,EAAS,EACzB,GAAID,UAAUC,QAAU,EACpBiF,EAASlF,UAAU,QAEnB,EAAG,CACC,GAAImB,KAAK4G,EAAM,CACX7C,EAAS6C,EAAK5G,KACd,MAEJ,KAAMA,EAAI,EACN,MAAM,IAAI4D,UAAU,0DAEnB,GAGb,GACQ5D,KAAK1B,OACLyF,EAAS0C,EAAI3G,UAAK,EAAQiE,EAAQ6C,EAAK5G,GAAIA,EAAG0G,UAE7C1G,KAET,OAAO+D,IAGVhB,MAAMnD,UAAUY,UAAqC,GAAzB,CAAC,EAAG,GAAGA,QAAQ,EAAG,KAC/CuC,MAAMnD,UAAUY,QAAU,SAAiB6G,GACvC,IAAIT,EAAOL,GAAkC,mBAAnB/B,EAAUlG,MAC5BA,KAAKoC,MAAM,IACXiG,EAASrI,MACbQ,EAAS8H,EAAK9H,SAAW,EAE7B,IAAKA,EACD,OAAQ,EAGZ,IAAIkB,EAAI,EAKR,IAJInB,UAAUC,OAAS,IACnBkB,EAAIsH,EAAUzI,UAAU,KAE5BmB,EAAIA,GAAK,EAAIA,EAAIwF,KAAKC,IAAI,EAAG3G,EAASkB,GAC/BA,EAAIlB,EAAQkB,IACf,GAAIA,KAAK4G,GAAQA,EAAK5G,KAAOqH,EACzB,OAAOrH,EAGf,OAAQ,IAGX+C,MAAMnD,UAAU2H,cAA8C,GAA9B,CAAC,EAAG,GAAGA,YAAY,GAAI,KACxDxE,MAAMnD,UAAU2H,YAAc,SAAqBF,GAC/C,IAAIT,EAAOL,GAAkC,mBAAnB/B,EAAUlG,MAC5BA,KAAKoC,MAAM,IACXiG,EAASrI,MACbQ,EAAS8H,EAAK9H,SAAW,EAE7B,IAAKA,EACD,OAAQ,EAEZ,IAAIkB,EAAIlB,EAAS,EAKjB,IAJID,UAAUC,OAAS,IACnBkB,EAAIwF,KAAKM,IAAI9F,EAAGsH,EAAUzI,UAAU,MAExCmB,EAAIA,GAAK,EAAIA,EAAIlB,EAAS0G,KAAKgC,IAAIxH,GAC5BA,GAAK,EAAGA,IACX,GAAIA,KAAK4G,GAAQS,IAAWT,EAAK5G,GAC7B,OAAOA,EAGf,OAAQ,IAGXL,OAAO8H,iBACR9H,OAAO8H,eAAiB,SAAwBf,GAC5C,OAAOA,EAAOgB,YACVhB,EAAOiB,YACPjB,EAAOiB,YAAY/H,UACnB2E,MAIP5E,OAAOiI,yBAA0B,CAClC,IAAIC,EAAiB,2DAErBlI,OAAOiI,yBAA2B,SAAkClB,EAAQoB,GACxE,GAAsB,iBAAVpB,GAAuC,mBAAVA,GAAoC,OAAXA,EAC9D,MAAM,IAAI9C,UAAUiE,EAAiBnB,GACzC,GAAKjC,EAAKiC,EAAQoB,GAAlB,CAGA,IAAIC,EAEJ,GADAA,EAAc,CAAEC,YAAY,EAAMC,cAAc,GAC5C5D,EAAmB,CACnB,IAAIzE,EAAY8G,EAAOgB,UACvBhB,EAAOgB,UAAYnD,EAEnB,IAAI2D,EAAS/D,EAAauC,EAAQoB,GAC9BK,EAAS/D,EAAasC,EAAQoB,GAGlC,GAFApB,EAAOgB,UAAY9H,EAEfsI,GAAUC,EAGV,OAFID,IAAQH,EAAWK,IAAMF,GACzBC,IAAQJ,EAAWM,IAAMF,GACtBJ,EAIf,OADAA,EAAWf,MAAQN,EAAOoB,GACnBC,KAGVpI,OAAO2I,sBACR3I,OAAO2I,oBAAsB,SAA6B5B,GACtD,OAAO/G,OAAO4I,KAAK7B,KAGtB/G,OAAO6I,UAGJnC,EAD+B,OAA/B1G,OAAOC,UAAU8H,UACH,WACV,MAAO,CAAE,UAAa,OAGZ,WACV,IAAIe,EAAQ,GACZ,IAAK,IAAIzI,KAAKyI,EACVA,EAAMzI,GAAK,KASf,OARAyI,EAAMd,YACNc,EAAM/D,eACN+D,EAAMC,qBACND,EAAME,cACNF,EAAMG,eACNH,EAAM5I,SACN4I,EAAMI,QACNJ,EAAMf,UAAY,KACXe,GAIf9I,OAAO6I,OAAS,SAAgB5I,EAAWkJ,GACvC,IAAIpC,EACJ,GAAkB,OAAd9G,EACA8G,EAASL,QACN,CACH,GAAwB,iBAAbzG,EACP,MAAM,IAAIgE,UAAU,2BAA4BhE,EAAW,iBAC/D,IAAImJ,EAAO,aACXA,EAAKnJ,UAAYA,EACjB8G,EAAS,IAAIqC,EACbrC,EAAOgB,UAAY9H,EAIvB,YAFmB,IAAfkJ,GACAnJ,OAAOqJ,iBAAiBtC,EAAQoC,GAC7BpC,IAIf,SAASuC,EAAuBvC,GAC5B,IAEI,OADA/G,OAAOuJ,eAAexC,EAAQ,WAAY,IACnC,aAAcA,EACvB,MAAOyC,KAGb,GAAIxJ,OAAOuJ,eAAgB,CACvB,IAAIE,EAA8BH,EAAuB,IACrDI,EAA8C,oBAAZC,UAClCL,EAAuBK,SAASC,cAAc,QAClD,IAAKH,IAAgCC,EACjC,IAAIG,EAAyB7J,OAAOuJ,eAI5C,IAAKvJ,OAAOuJ,gBAAkBM,EAAwB,CAClD,IAAIC,EAA4B,2CAC5BC,EAAwB,+CACxBC,EAA8B,iEAGlChK,OAAOuJ,eAAiB,SAAwBxC,EAAQoB,EAAUC,GAC9D,GAAsB,iBAAVrB,GAAuC,mBAAVA,GAAoC,OAAXA,EAC9D,MAAM,IAAI9C,UAAU8F,EAAwBhD,GAChD,GAA0B,iBAAdqB,GAA+C,mBAAdA,GAA4C,OAAfA,EACtE,MAAM,IAAInE,UAAU6F,EAA4B1B,GACpD,GAAIyB,EACA,IACI,OAAOA,EAAuB1J,KAAKH,OAAQ+G,EAAQoB,EAAUC,GAC/D,MAAOoB,IAGb,GAAI1E,EAAKsD,EAAY,SAEjB,GAAI1D,IAAsBF,EAAauC,EAAQoB,IACrB1D,EAAasC,EAAQoB,IAC/C,CACI,IAAIlI,EAAY8G,EAAOgB,UACvBhB,EAAOgB,UAAYnD,SACZmC,EAAOoB,GACdpB,EAAOoB,GAAYC,EAAWf,MAC9BN,EAAOgB,UAAY9H,OAEnB8G,EAAOoB,GAAYC,EAAWf,UAE/B,CACH,IAAK3C,EACD,MAAM,IAAIT,UAAU+F,GACpBlF,EAAKsD,EAAY,QACjB9D,EAAayC,EAAQoB,EAAUC,EAAWK,KAC1C3D,EAAKsD,EAAY,QACjB7D,EAAawC,EAAQoB,EAAUC,EAAWM,KAGlD,OAAO3B,GAGV/G,OAAOqJ,mBACRrJ,OAAOqJ,iBAAmB,SAA0BtC,EAAQoC,GACxD,IAAK,IAAIhB,KAAYgB,EACbrE,EAAKqE,EAAYhB,IACjBnI,OAAOuJ,eAAexC,EAAQoB,EAAUgB,EAAWhB,IAE3D,OAAOpB,IAGV/G,OAAOiK,OACRjK,OAAOiK,KAAO,SAAclD,GACxB,OAAOA,IAGV/G,OAAOkK,SACRlK,OAAOkK,OAAS,SAAgBnD,GAC5B,OAAOA,IAGf,IACI/G,OAAOkK,OAAO,cAChB,MAAOV,GACLxJ,OAAOkK,OAAS,SAAiBC,GAC7B,OAAO,SAAgBpD,GACnB,MAAqB,mBAAVA,EACAA,EAEAoD,EAAapD,IALhB,CAQb/G,OAAOkK,QAgCd,GA9BKlK,OAAOoK,oBACRpK,OAAOoK,kBAAoB,SAA2BrD,GAClD,OAAOA,IAGV/G,OAAOqK,WACRrK,OAAOqK,SAAW,SAAkBtD,GAChC,OAAO,IAGV/G,OAAOsK,WACRtK,OAAOsK,SAAW,SAAkBvD,GAChC,OAAO,IAGV/G,OAAOuK,eACRvK,OAAOuK,aAAe,SAAsBxD,GACxC,GAAI/G,OAAO+G,KAAYA,EACnB,MAAM,IAAI9C,UAEd,IAAIX,EAAO,GACX,MAAOwB,EAAKiC,EAAQzD,GAChBA,GAAQ,IAEZyD,EAAOzD,IAAQ,EACf,IAAI1B,EAAckD,EAAKiC,EAAQzD,GAE/B,cADOyD,EAAOzD,GACP1B,KAGV5B,OAAO4I,KAAM,CACd,IAAI4B,GAAiB,EACjBC,EAAY,CACR,WACA,iBACA,UACA,iBACA,gBACA,uBACA,eAEJC,EAAkBD,EAAUtL,OAEhC,IAAK,IAAIwL,IAAO,CAAC,SAAY,MACzBH,GAAiB,EAGrBxK,OAAO4I,KAAO,SAAc7B,GAExB,GACsB,iBAAVA,GAAuC,mBAAVA,GAC1B,OAAXA,EAEA,MAAM,IAAI9C,UAAU,sCAGxB,IAAI2E,EAAO,GACX,IAAK,IAAItF,KAAQyD,EACTjC,EAAKiC,EAAQzD,IACbsF,EAAKnI,KAAK6C,GAIlB,GAAIkH,EACA,IAAK,IAAInK,EAAI,EAAGuK,EAAKF,EAAiBrK,EAAIuK,EAAIvK,IAAK,CAC/C,IAAIwK,EAAWJ,EAAUpK,GACrByE,EAAKiC,EAAQ8D,IACbjC,EAAKnI,KAAKoK,GAItB,OAAOjC,GAIVkC,KAAKC,MACND,KAAKC,IAAM,WACP,OAAO,IAAID,MAAOE,YAG1B,IAAIC,EAAK,iDAGT,IAAK3I,OAAOrC,UAAUiL,MAAQD,EAAGC,OAAQ,CACrCD,EAAK,IAAMA,EAAK,IAChB,IAAIE,EAAkB,IAAIhJ,OAAO,IAAM8I,EAAKA,EAAK,KAC7CG,EAAgB,IAAIjJ,OAAO8I,EAAKA,EAAK,MACzC3I,OAAOrC,UAAUiL,KAAO,WACpB,OAAO5I,OAAO3D,MAAM0C,QAAQ8J,EAAiB,IAAI9J,QAAQ+J,EAAe,KAIhF,SAASzD,EAAU0D,GAOf,OANAA,GAAKA,EACDA,IAAMA,EACNA,EAAI,EACS,IAANA,GAAWA,IAAM,KAASA,KAAO,MACxCA,GAAKA,EAAI,IAAM,GAAKxF,KAAKyF,MAAMzF,KAAKgC,IAAIwD,KAErCA,EAmCX,IAAIrE,EAAW,SAAUuE,GACrB,GAAS,MAALA,EACA,MAAM,IAAItH,UAAU,iBAAiBsH,EAAE,cAE3C,OAAOvL,OAAOuL,MAKlBvJ,IAAIlD,OAAO,yBAAyB,CAAC,UAAU,UAAU,SAAS,iBAAiB,oBAAqB,SAAS0B,EAAUc,EAASvC,GACpI,aAEAyB,EAAS,YACTA,EAAS,gBAITwB,IAAIlD,OAAO,cAAc,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GACrF,aAEA,IAAIyM,EAAW,+BAEflK,EAAQmK,gBAAkB,SAASC,GAG/B,OAFKA,IACDA,EAAM/B,UACH+B,EAAIC,MAAQD,EAAIE,qBAAqB,QAAQ,IAAMF,EAAIG,iBAGlEvK,EAAQsI,cAAgB,SAASkC,EAAKhK,GAClC,OAAO6H,SAASoC,gBACTpC,SAASoC,gBAAgBjK,GAAM0J,EAAUM,GACzCnC,SAASC,cAAckC,IAGlCxK,EAAQ0K,YAAc,SAASC,EAAI3I,GAC/B,IAAI4I,GAAWD,EAAGE,UAAY,IAAIpL,MAAM,QACxC,OAAkC,IAA3BmL,EAAQrL,QAAQyC,IAE3BhC,EAAQ8K,YAAc,SAASH,EAAI3I,GAC1BhC,EAAQ0K,YAAYC,EAAI3I,KACzB2I,EAAGE,WAAa,IAAM7I,IAG9BhC,EAAQ+K,eAAiB,SAASJ,EAAI3I,GAClC,IAAI4I,EAAUD,EAAGE,UAAUpL,MAAM,QACjC,MAAO,EAAM,CACT,IAAI0C,EAAQyI,EAAQrL,QAAQyC,GAC5B,IAAc,GAAVG,EACA,MAEJyI,EAAQ9G,OAAO3B,EAAO,GAE1BwI,EAAGE,UAAYD,EAAQ/K,KAAK,MAGhCG,EAAQgL,eAAiB,SAASL,EAAI3I,GAClC,IAAI4I,EAAUD,EAAGE,UAAUpL,MAAM,QAASkF,GAAM,EAChD,MAAO,EAAM,CACT,IAAIxC,EAAQyI,EAAQrL,QAAQyC,GAC5B,IAAc,GAAVG,EACA,MAEJwC,GAAM,EACNiG,EAAQ9G,OAAO3B,EAAO,GAM1B,OAJIwC,GACAiG,EAAQzL,KAAK6C,GAEjB2I,EAAGE,UAAYD,EAAQ/K,KAAK,KACrB8E,GAEX3E,EAAQiL,YAAc,SAASC,EAAML,EAAWM,GACxCA,EACAnL,EAAQ8K,YAAYI,EAAML,GAE1B7K,EAAQ+K,eAAeG,EAAML,IAIrC7K,EAAQoL,aAAe,SAASlL,EAAIkK,GAChC,IAAeiB,EAAXlJ,EAAQ,EAGZ,GAFAiI,EAAMA,GAAO/B,SAET+B,EAAIkB,mBAAqBD,EAASjB,EAAImB,cACtC,MAAOpJ,EAAQkJ,EAAOxN,OAClB,GAAIwN,EAAOlJ,KAASqJ,cAActL,KAAOA,EAAI,OAAO,OACrD,GAAKmL,EAASjB,EAAIE,qBAAqB,SAC1C,MAAOnI,EAAQkJ,EAAOxN,OAClB,GAAIwN,EAAOlJ,KAASjC,KAAOA,EAAI,OAAO,EAG9C,OAAO,GAGXF,EAAQyL,gBAAkB,SAAyBC,EAASxL,EAAIkK,GAE5D,GADAA,EAAMA,GAAO/B,SACTnI,GAAMF,EAAQoL,aAAalL,EAAIkK,GAC/B,OAAO,KAEX,IAAIuB,EAEAzL,IACAwL,GAAW,2BAA6BxL,EAAK,OAE7CkK,EAAIkB,kBACJK,EAAQvB,EAAIkB,mBACZK,EAAMD,QAAUA,EACZxL,IACAyL,EAAMH,cAActL,GAAKA,KAE7ByL,EAAQ3L,EAAQsI,cAAc,SAC9BqD,EAAMC,YAAYxB,EAAIyB,eAAeH,IACjCxL,IACAyL,EAAMzL,GAAKA,GAEfF,EAAQmK,gBAAgBC,GAAKwB,YAAYD,KAIjD3L,EAAQ8L,mBAAqB,SAAS3L,EAAKiK,GACvC,GAAIA,EAAIkB,iBACJlB,EAAIkB,iBAAiBnL,OAClB,CACH,IAAI4L,EAAO/L,EAAQsI,cAAc,QACjCyD,EAAKC,IAAM,aACXD,EAAKE,KAAO9L,EAEZH,EAAQmK,gBAAgBC,GAAKwB,YAAYG,KAIjD/L,EAAQkM,cAAgB,SAASC,GAC7B,OACIC,SAASpM,EAAQqM,cAAcF,EAAS,eAAgB,IACxDC,SAASpM,EAAQqM,cAAcF,EAAS,gBAAiB,IACzDA,EAAQG,aAIhBtM,EAAQuM,eAAiB,SAASJ,GAC9B,OACIC,SAASpM,EAAQqM,cAAcF,EAAS,cAAe,IACvDC,SAASpM,EAAQqM,cAAcF,EAAS,iBAAkB,IAC1DA,EAAQK,cAIhBxM,EAAQyM,eAAiB,SAASpE,GAC9B,IAAIqE,EAAQ1M,EAAQsI,cAAc,aAClCoE,EAAMf,MAAMgB,MAAQ,OACpBD,EAAMf,MAAMiB,SAAW,MACvBF,EAAMf,MAAMkB,OAAS,QACrBH,EAAMf,MAAMmB,QAAU,QAEtB,IAAIC,EAAQ/M,EAAQsI,cAAc,aAC9BqD,EAAQoB,EAAMpB,MAElBA,EAAMqB,SAAW,WACjBrB,EAAMsB,KAAO,WACbtB,EAAMuB,SAAW,SACjBvB,EAAMgB,MAAQ,QACdhB,EAAMiB,SAAW,MACjBjB,EAAMkB,OAAS,QACflB,EAAMmB,QAAU,QAEhBC,EAAMnB,YAAYc,GAElB,IAAIS,EAAO9E,EAASkC,gBACpB4C,EAAKvB,YAAYmB,GAEjB,IAAIK,EAAcV,EAAMW,YAExB1B,EAAMuB,SAAW,SACjB,IAAII,EAAgBZ,EAAMW,YAQ1B,OANID,GAAeE,IACfA,EAAgBP,EAAMT,aAG1Ba,EAAKI,YAAYR,GAEVK,EAAYE,GAGA,oBAAZjF,eAKgB5J,IAAvBnB,OAAOkQ,aACPxN,EAAQyN,iBAAmB,WACvB,OAAOnQ,OAAOkQ,aAGlBxN,EAAQ0N,kBAAoB,WACxB,OAAOpQ,OAAOqQ,eAIlB3N,EAAQyN,iBAAmB,WACvB,OAAOpF,SAAS8E,KAAKS,WAGzB5N,EAAQ0N,kBAAoB,WACxB,OAAOrF,SAAS8E,KAAKU,aAIzBvQ,OAAOwQ,iBACP9N,EAAQqM,cAAgB,SAASF,EAASR,GACtC,OAAIA,GACQrO,OAAOwQ,iBAAiB3B,EAAS,KAAO,IAAIR,IAAU,GAC3DrO,OAAOwQ,iBAAiB3B,EAAS,KAAO,IAGnDnM,EAAQqM,cAAgB,SAASF,EAASR,GACtC,OAAIA,EACOQ,EAAQ4B,aAAapC,GACzBQ,EAAQ4B,cAEvB/N,EAAQgO,aAAe,SAASrD,EAAIsD,GAChC,IAAI9B,EAAUxB,EAAGuD,WAAU,GAG3B,OAFA/B,EAAQgC,UAAYF,EACpBtD,EAAGyD,WAAWC,aAAalC,EAASxB,GAC7BwB,GAGP,gBAAiB9D,SAASkC,iBAC1BvK,EAAQsO,aAAe,SAAS3D,EAAI4D,GAChC5D,EAAG6D,YAAcD,GAGrBvO,EAAQyO,aAAe,SAAS9D,GAC5B,OAAOA,EAAG6D,eAIdxO,EAAQsO,aAAe,SAAS3D,EAAI4D,GAChC5D,EAAG4D,UAAYA,GAGnBvO,EAAQyO,aAAe,SAAS9D,GAC5B,OAAOA,EAAG4D,YAIlBvO,EAAQ0O,gBAAkB,SAASrG,GAC/B,OAAOA,EAASsG,aAAetG,EAASuG,eA9DxC5O,EAAQyL,gBAAkB,eAmE9B/K,IAAIlD,OAAO,cAAc,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GACrF,aAEAuC,EAAQ6O,SAAW,SAASC,EAAMC,GAC9BD,EAAKE,OAASD,EACdD,EAAKnQ,UAAYD,OAAO6I,OAAOwH,EAAUpQ,UAAW,CAChD+H,YAAa,CACTX,MAAO+I,EACP/H,YAAY,EACZkI,UAAU,EACVjI,cAAc,MAK1BhH,EAAQkP,MAAQ,SAAS/J,EAAK+J,GAC1B,IAAK,IAAI7F,KAAO6F,EACZ/J,EAAIkE,GAAO6F,EAAM7F,GAErB,OAAOlE,GAGXnF,EAAQmP,UAAY,SAASC,EAAOF,GAChClP,EAAQkP,MAAME,EAAOF,MAKzBxO,IAAIlD,OAAO,eAAe,CAAC,UAAU,UAAU,SAAS,yBAAyB,eAAgB,SAAS0B,EAAUc,EAASvC,GAC7H,aAEAyB,EAAS,oBAET,IAAImQ,EAAMnQ,EAAS,SACfoQ,EAAO,WACP,IAkEItN,EAAMjD,EAlENwQ,EAAM,CACNC,cAAe,CACXC,GAAI,QAASC,GAAI,OAAQC,GAAI,MAAOC,IAAK,QAG7CC,SAAU,CACN,KAAQ,EAAG,IAAO,EAAG,OAAW,EAAG,MAAS,EAC5C,MAAS,EAAG,KAAQ,EAAG,QAAW,EAAG,IAAO,GAGhDC,cAAgB,CACZC,EAAK,YACLC,EAAK,MACLC,GAAK,SACLC,GAAK,QACLC,GAAK,MACLC,GAAK,QACLC,GAAK,SACLC,GAAK,WACLC,GAAK,MACLC,GAAK,OACLC,GAAK,OACLC,GAAK,KACLC,GAAK,QACLC,GAAK,OACLC,GAAK,QACLC,GAAK,SACLC,GAAK,SACLC,GAAK,UACLC,GAAK,UACLC,GAAK,UACLC,GAAK,UACLC,IAAK,UACLC,IAAK,UACLC,IAAK,UACLC,IAAK,UACLC,IAAK,UACLC,IAAK,UACL,MAAO,cACPC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,UACLC,IAAK,cAGTC,eAAgB,CACbpC,GAAI,IAAMqC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAKC,GAAK,IAChEC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAKC,GAAK,IAChEC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAKC,GAAK,IAChEC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAKC,GAAK,IAChEC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAKC,GAAK,IAChEC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAKC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IACjEC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IACjEC,IAAK,IAAKC,IAAK,KAAKC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IAAKC,IAAK,MAI7D,IAAK/W,KAAKwQ,EAAIO,cACV9N,EAAOuN,EAAIO,cAAc/Q,GAAGgX,cAC5BxG,EAAIvN,GAAQoK,SAASrN,EAAG,IAE5B,IAAKA,KAAKwQ,EAAIiD,eACVxQ,EAAOuN,EAAIiD,eAAezT,GAAGgX,cAC7BxG,EAAIvN,GAAQoK,SAASrN,EAAG,IAsB5B,OApBAsQ,EAAIH,MAAMK,EAAKA,EAAIC,eACnBH,EAAIH,MAAMK,EAAKA,EAAIiD,gBACnBnD,EAAIH,MAAMK,EAAKA,EAAIO,eACnBP,EAAIyG,MAAQzG,EAAI,UAChBA,EAAI0G,OAAS1G,EAAI2G,IACjB3G,EAAI4G,IAAM5G,EAAI,UACdA,EAAI,KAAO,IAEX,WAEI,IADA,IAAI6G,EAAO,CAAC,MAAO,OAAQ,MAAO,SACzBrX,EAAIwF,KAAK8R,IAAI,EAAGD,EAAKvY,QAASkB,KACnCwQ,EAAIM,SAAS9Q,GAAKqX,EAAKtQ,OAAO,SAAS3E,GACnC,OAAOpC,EAAIwQ,EAAIM,SAAS1O,KACzBtB,KAAK,KAAO,IALvB,GASA0P,EAAIM,SAAS,GAAK,GAClBN,EAAIM,UAAU,GAAK,SAEZN,EAhGA,GAkGXF,EAAIH,MAAMlP,EAASsP,GAEnBtP,EAAQsW,gBAAkB,SAASC,GAC/B,IAAIC,EAAYlH,EAAKiH,GAGrB,MAFwB,iBAAbC,IACPA,EAAYxV,OAAOyV,aAAaF,IAC7BC,EAAUT,iBAKrBrV,IAAIlD,OAAO,oBAAoB,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GAC3F,aAeA,GAdAuC,EAAQ0W,GAAK,CACTC,MAAO,QACPC,IAAK,MACLC,QAAS,WAEb7W,EAAQ8W,MAAQ,WACZ,OAAI9W,EAAQ+W,MACD/W,EAAQ0W,GAAGE,IACX5W,EAAQgX,QACRhX,EAAQ0W,GAAGC,MAEX3W,EAAQ0W,GAAGG,SAGF,iBAAbI,UAAX,CAGA,IAAIC,GAAMD,UAAUE,SAASpW,MAAM,mBAAqB,CAAC,UAAU,GAAGgV,cAClEqB,EAAKH,UAAUI,UACnBrX,EAAQsX,MAAe,OAANJ,EACjBlX,EAAQ+W,MAAe,OAANG,EACjBlX,EAAQgX,QAAiB,SAANE,EACnBlX,EAAQuX,KACkB,+BAArBN,UAAUO,SAA4CP,UAAUO,QAAQjY,QAAQ,cAAgB,EAC/FkY,YAAYL,EAAGrW,MAAM,4DAA4D,IAAI,IACrF0W,YAAYL,EAAGrW,MAAM,sDAAsD,IAAI,IAErFf,EAAQ0X,QAAU1X,EAAQuX,MAAQvX,EAAQuX,KAAO,EACjDvX,EAAQ2X,QAAU3X,EAAQ4X,WAAata,OAAOua,aAAeva,OAAOwa,cAA6C,UAA7Bxa,OAAO2Z,UAAUc,QACrG/X,EAAQgY,WAAahY,EAAQ2X,SAAWvL,UAAUgL,EAAGrW,MAAM,aAAa,IAAI,GAAI,IAAM,EACtFf,EAAQiY,QAAU3a,OAAO4a,OAAyD,kBAAhDxZ,OAAOC,UAAUC,SAASC,KAAKvB,OAAO4a,OACxElY,EAAQmY,SAAWV,WAAWL,EAAG3X,MAAM,WAAW,UAAOhB,EAEzDuB,EAAQoY,SAAWX,WAAWL,EAAG3X,MAAM,YAAY,UAAOhB,EAE1DuB,EAAQqY,MAAQjB,EAAG7X,QAAQ,aAAe,EAE1CS,EAAQsY,OAASlB,EAAG7X,QAAQ,SAAW,EAEvCS,EAAQuY,WAAanB,EAAG7X,QAAQ,WAAa,EAE7CS,EAAQwY,MAAQ,mBAAmB1X,KAAKsW,KAAQ9Z,OAAOmb,SAEnDzY,EAAQwY,QAAOxY,EAAQ+W,OAAQ,MAInCrW,IAAIlD,OAAO,gBAAgB,CAAC,UAAU,UAAU,SAAS,eAAe,qBAAsB,SAAS0B,EAAUc,EAASvC,GAC1H,aAEA,IAAI6J,EAAOpI,EAAS,UAChBwZ,EAAYxZ,EAAS,eAErByZ,EAAc,KACdC,EAAK,EAET5Y,EAAQ6Y,YAAc,SAASC,EAAMC,EAAMxa,GACvC,GAAIua,EAAKE,iBACL,OAAOF,EAAKE,iBAAiBD,EAAMxa,GAAU,GAEjD,GAAIua,EAAKG,YAAa,CAClB,IAAIC,EAAU,WACV3a,EAASM,KAAKia,EAAMxb,OAAO6b,QAE/B5a,EAAS6a,SAAWF,EACpBJ,EAAKG,YAAY,KAAOF,EAAMG,KAItClZ,EAAQqZ,eAAiB,SAASP,EAAMC,EAAMxa,GAC1C,GAAIua,EAAKQ,oBACL,OAAOR,EAAKQ,oBAAoBP,EAAMxa,GAAU,GAEhDua,EAAKS,aACLT,EAAKS,YAAY,KAAOR,EAAMxa,EAAS6a,UAAY7a,IAG3DyB,EAAQwZ,UAAY,SAASC,GAGzB,OAFAzZ,EAAQ0Z,gBAAgBD,GACxBzZ,EAAQ2Z,eAAeF,IAChB,GAGXzZ,EAAQ0Z,gBAAkB,SAASD,GAC3BA,EAAEC,gBACFD,EAAEC,kBAEFD,EAAEG,cAAe,GAGzB5Z,EAAQ2Z,eAAiB,SAASF,GAC1BA,EAAEE,eACFF,EAAEE,iBAEFF,EAAEnZ,aAAc,GAExBN,EAAQ6Z,UAAY,SAASJ,GACzB,MAAc,YAAVA,EAAEV,KACK,EACG,eAAVU,EAAEV,MAA0BL,EAAU3B,OAAU0C,EAAEK,UAAYL,EAAEM,SAAWN,EAAEO,SACtE,EACPP,EAAEE,eACKF,EAAEQ,OAGF,CAACC,EAAE,EAAGC,EAAE,EAAGC,EAAE,GAAGX,EAAEQ,SAIjCja,EAAQqa,QAAU,SAAS1P,EAAI2P,EAAcC,GACzC,SAASC,EAAUf,GACfa,GAAgBA,EAAab,GAC7Bc,GAAyBA,EAAsBd,GAE/CzZ,EAAQqZ,eAAehR,SAAU,YAAaiS,GAAc,GAC5Dta,EAAQqZ,eAAehR,SAAU,UAAWmS,GAAW,GACvDxa,EAAQqZ,eAAehR,SAAU,YAAamS,GAAW,GAO7D,OAJAxa,EAAQ6Y,YAAYxQ,SAAU,YAAaiS,GAAc,GACzDta,EAAQ6Y,YAAYxQ,SAAU,UAAWmS,GAAW,GACpDxa,EAAQ6Y,YAAYxQ,SAAU,YAAamS,GAAW,GAE/CA,GAGXxa,EAAQya,qBAAuB,SAAU9P,EAAIpM,GACzC,IAAImc,EAAQC,EACZ3a,EAAQ6Y,YAAYlO,EAAI,aAAc,SAAU8O,GAC5C,IAAImB,EAAUnB,EAAEmB,QACZC,EAAWD,EAAQ,GACvBF,EAASG,EAASC,QAClBH,EAASE,EAASE,UAEtB/a,EAAQ6Y,YAAYlO,EAAI,YAAa,SAAU8O,GAC3C,IAAImB,EAAUnB,EAAEmB,QAChB,KAAIA,EAAQ/c,OAAS,GAArB,CAEA,IAAIgd,EAAWD,EAAQ,GAEvBnB,EAAEuB,OAASN,EAASG,EAASC,QAC7BrB,EAAEwB,OAASN,EAASE,EAASE,QAE7BL,EAASG,EAASC,QAClBH,EAASE,EAASE,QAElBxc,EAASkb,OAIjBzZ,EAAQkb,sBAAwB,SAASvQ,EAAIpM,GACrC,iBAAkBoM,EAClB3K,EAAQ6Y,YAAYlO,EAAI,aAAc,SAAS8O,GAC3C,IAAI0B,EAAS,OACS1c,IAAlBgb,EAAE2B,aACF3B,EAAEuB,QAAUvB,EAAE2B,YAAcD,EAC5B1B,EAAEwB,QAAUxB,EAAE4B,YAAcF,IAE5B1B,EAAEuB,OAAS,EACXvB,EAAEwB,QAAUxB,EAAE6B,WAAaH,GAE/B5c,EAASkb,KAEN,YAAa9O,EACpB3K,EAAQ6Y,YAAYlO,EAAI,QAAU,SAAS8O,GACvC,IAAI0B,EAAS,IACb,OAAQ1B,EAAE8B,WACN,KAAK9B,EAAE+B,gBACH/B,EAAEuB,OAASvB,EAAEgC,OAASN,GAAU,EAChC1B,EAAEwB,OAASxB,EAAEiC,OAASP,GAAU,EAChC,MACJ,KAAK1B,EAAEkC,eACP,KAAKlC,EAAEmC,eACHnC,EAAEuB,OAA2B,GAAjBvB,EAAEgC,QAAU,GACxBhC,EAAEwB,OAA2B,GAAjBxB,EAAEiC,QAAU,GACxB,MAGRnd,EAASkb,KAGbzZ,EAAQ6Y,YAAYlO,EAAI,iBAAkB,SAAS8O,GAC3CA,EAAEoC,MAAQpC,EAAEoC,MAAQpC,EAAEqC,iBACtBrC,EAAEuB,OAA2B,GAAjBvB,EAAEsC,QAAU,GACxBtC,EAAEwB,OAAS,IAEXxB,EAAEuB,OAAS,EACXvB,EAAEwB,OAA2B,GAAjBxB,EAAEsC,QAAU,IAE5Bxd,EAASkb,MAKrBzZ,EAAQgc,0BAA4B,SAASC,EAAUC,EAAU5B,EAAc6B,GAC3E,IACIC,EAAQC,EAAQC,EADhBC,EAAS,EAETC,EAAa,CACbrC,EAAG,WACHsC,EAAG,cACHrC,EAAG,aAGP,SAASsC,EAAYjD,GAUjB,GAT6B,IAAzBzZ,EAAQ6Z,UAAUJ,GAClB8C,EAAS,EACF9C,EAAEsC,OAAS,GAClBQ,IACIA,EAAS,IACTA,EAAS,IAEbA,EAAS,EAET7D,EAAUnB,KAAM,CAChB,IAAIoF,EAAapY,KAAKgC,IAAIkT,EAAEqB,QAAUsB,GAAU,GAAK7X,KAAKgC,IAAIkT,EAAEsB,QAAUsB,GAAU,EAC/EC,IAASK,IACVJ,EAAS,GACTD,GACAM,aAAaN,GACjBA,EAAQO,WAAW,WAAYP,EAAQ,MAAQJ,EAASK,EAAS,IAAM,KAEzD,GAAVA,IACAH,EAAS3C,EAAEqB,QACXuB,EAAS5C,EAAEsB,SAQnB,GAJAtB,EAAEqD,QAAUP,EAEZjC,EAAa6B,GAAc,YAAa1C,GAEpC8C,EAAS,EACTA,EAAS,OACR,GAAIA,EAAS,EACd,OAAOjC,EAAa6B,GAAcK,EAAWD,GAAS9C,GAE9D,SAASsD,EAAWtD,GAChB8C,EAAS,EACLD,GACAM,aAAaN,GACjBA,EAAQO,WAAW,WAAYP,EAAQ,MAAQJ,EAASK,EAAS,IAAM,KACvEjC,EAAa6B,GAAc,YAAa1C,GACxCa,EAAa6B,GAAcK,EAAWD,GAAS9C,GAE9C3X,MAAMoD,QAAQ+W,KACfA,EAAW,CAACA,IAChBA,EAAS1W,QAAQ,SAASoF,GACtB3K,EAAQ6Y,YAAYlO,EAAI,YAAa+R,GACjChE,EAAUhB,SACV1X,EAAQ6Y,YAAYlO,EAAI,WAAYoS,MAIhD,IAAIC,GAAkBtE,EAAU3B,QAAS2B,EAAUT,SAAa,kBAAmB3a,OAI7E,SAASmc,GACP,OAAO,GAAKA,EAAEK,QAAU,EAAI,IAAML,EAAEM,OAAS,EAAI,IAAMN,EAAEO,SAAW,EAAI,IAAMP,EAAEwD,QAAU,EAAI,IAJhG,SAASxD,GACP,OAAO,GAAKA,EAAEwD,QAAU,EAAI,IAAMxD,EAAEM,OAAS,EAAI,IAAMN,EAAEO,SAAW,EAAI,IAAMP,EAAEK,QAAU,EAAI,IAUtG,SAASoD,EAAqB3e,EAAUkb,EAAGlD,GACvC,IAAI4G,EAASH,EAAgBvD,GAE7B,IAAKf,EAAU3B,OAAS4B,EAAa,CAGjC,GAFIc,EAAE2D,mBAAqB3D,EAAE2D,iBAAiB,OAAS3D,EAAE2D,iBAAiB,UACtED,GAAU,GACVxE,EAAY0E,MAAO,CACnB,GAAoB,IAAf,EAAIF,GAGL,OAFAxE,EAAY0E,MAAQ,EAI5B,GAAgB,KAAZ9G,GAA8B,KAAZA,EAAgB,CAClC,IAAI+G,EAAW,aAAc7D,EAAIA,EAAE6D,SAAW7D,EAAE8D,YAChD,GAAgB,KAAZhH,GAA+B,IAAb+G,EACU,GAAxB3E,EAAYpC,KACZqC,EAAKa,EAAE+D,gBACR,GAAgB,KAAZjH,GAA6B,IAAX4G,GAA6B,IAAbG,EAAgB,CACzD,IAAIG,EAAKhE,EAAE+D,UAAY5E,EACnB6E,EAAK,KACL9E,EAAY0E,OAAQ,KAYpC,GAPI9G,KAAWjP,EAAKkI,gBAChB+G,GAAW,GAEF,EAAT4G,GAAe5G,GAAW,IAAMA,GAAW,KAC3CA,GAAW,IAGV4G,GAAsB,KAAZ5G,EAAgB,CACvB+G,EAAW,aAAc7D,EAAIA,EAAE6D,SAAW7D,EAAE8D,YAChD,GAAiB,IAAbD,IACA/e,EAASkb,EAAG0D,GAAS5G,GACjBkD,EAAEiE,kBACF,OAIZ,GAAIhF,EAAUH,YAAuB,EAAT4E,EAAY,CAEpC,GADA5e,EAASkb,EAAG0D,EAAQ5G,GAChBkD,EAAEiE,iBACF,OAEAP,IAAU,EAElB,SAAKA,GAAY5G,KAAWjP,EAAKwI,eAAoByG,KAAWjP,EAAKkL,iBAI9DjU,EAASkb,EAAG0D,EAAQ5G,GAyC/B,SAASoH,IACLhF,EAAcja,OAAO6I,OAAO,MAGhC,GArGAvH,EAAQ4d,kBAAoB,SAASnE,GACjC,OAAOnS,EAAKuI,SAASmN,EAAgBvD,KA2DzCzZ,EAAQ6d,sBAAwB,SAASlT,EAAIpM,GACzC,IAAIsa,EAAc7Y,EAAQ6Y,YAC1B,GAAIH,EAAUV,YAAeU,EAAUT,WAAa,kBAAmB3a,QAAU,CAC7E,IAAIwgB,EAAqB,KACzBjF,EAAYlO,EAAI,UAAW,SAAS8O,GAChCqE,EAAqBrE,EAAElD,UAE3BsC,EAAYlO,EAAI,WAAY,SAAS8O,GACjC,OAAOyD,EAAqB3e,EAAUkb,EAAGqE,SAE1C,CACH,IAAIC,EAAuB,KAE3BlF,EAAYlO,EAAI,UAAW,SAAS8O,GAChCd,EAAYc,EAAElD,UAAYoC,EAAYc,EAAElD,UAAY,GAAK,EACzD,IAAIzT,EAASoa,EAAqB3e,EAAUkb,EAAGA,EAAElD,SAEjD,OADAwH,EAAuBtE,EAAEiE,iBAClB5a,IAGX+V,EAAYlO,EAAI,WAAY,SAAS8O,GAC7BsE,IAAyBtE,EAAEK,SAAWL,EAAEM,QAAUN,EAAEO,UAAYP,EAAEwD,WAClEjd,EAAQwZ,UAAUC,GAClBsE,EAAuB,QAI/BlF,EAAYlO,EAAI,QAAS,SAAS8O,GAC9Bd,EAAYc,EAAElD,SAAW,OAGxBoC,IACDgF,IACA9E,EAAYvb,OAAQ,QAASqgB,MAQpB,iBAAVrgB,QAAsBA,OAAO0gB,cAAgBtF,EAAUhB,QAAS,CACvE,IAAIuG,EAAgB,EACpBje,EAAQke,SAAW,SAAS3f,EAAU4f,GAClCA,EAAMA,GAAO7gB,OACb,IAAI8gB,EAAc,wBAA0BH,EAC5Cje,EAAQ6Y,YAAYsF,EAAK,UAAW,SAASE,EAAS5E,GAC9CA,EAAE6E,MAAQF,IACVpe,EAAQ0Z,gBAAgBD,GACxBzZ,EAAQqZ,eAAe8E,EAAK,UAAWE,GACvC9f,OAGR4f,EAAIH,YAAYI,EAAa,MAKrCpe,EAAQue,UAA6B,iBAAVjhB,SAAuBA,OAAOkhB,uBAClDlhB,OAAOmhB,0BACPnhB,OAAOohB,6BACPphB,OAAOqhB,yBACPrhB,OAAOshB,wBAEV5e,EAAQue,UACRve,EAAQue,UAAYve,EAAQue,UAAU/b,KAAKlF,QAE3C0C,EAAQue,UAAY,SAAShgB,GACzBse,WAAWte,EAAU,OAI7BmC,IAAIlD,OAAO,eAAe,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GACtF,aAEAuC,EAAQ6e,KAAO,SAAS7a,GACpB,OAAOA,EAAEA,EAAEnG,OAAS,IAGxBmC,EAAQ8e,cAAgB,SAASC,GAC7B,OAAOA,EAAOtf,MAAM,IAAIuf,UAAUnf,KAAK,KAG3CG,EAAQif,aAAe,SAAUF,EAAQG,GACrC,IAAIpc,EAAS,GACb,MAAOoc,EAAQ,EACC,EAARA,IACApc,GAAUic,IAEVG,IAAU,KACVH,GAAUA,GAElB,OAAOjc,GAGX,IAAI+G,EAAkB,SAClBC,EAAgB,SAEpB9J,EAAQmf,eAAiB,SAAUJ,GAC/B,OAAOA,EAAOhf,QAAQ8J,EAAiB,KAG3C7J,EAAQof,gBAAkB,SAAUL,GAChC,OAAOA,EAAOhf,QAAQ+J,EAAe,KAGzC9J,EAAQqf,WAAa,SAASla,GAC1B,IAAIma,EAAO,GACX,IAAK,IAAIjW,KAAOlE,EACZma,EAAKjW,GAAOlE,EAAIkE,GAEpB,OAAOiW,GAGXtf,EAAQuf,UAAY,SAAS5d,GAEzB,IADA,IAAI2d,EAAO,GACFvgB,EAAE,EAAGC,EAAE2C,EAAM9D,OAAQkB,EAAEC,EAAGD,IAC3B4C,EAAM5C,IAAyB,iBAAZ4C,EAAM5C,GACzBugB,EAAKvgB,GAAK1B,KAAKgiB,WAAW1d,EAAM5C,IAEhCugB,EAAKvgB,GAAK4C,EAAM5C,GAExB,OAAOugB,GAGXtf,EAAQwf,SAAW,SAASA,EAASra,GACjC,GAAmB,kBAARA,IAAqBA,EAC5B,OAAOA,EACX,IAAIma,EACJ,GAAIxd,MAAMoD,QAAQC,GAAM,CACpBma,EAAO,GACP,IAAK,IAAIjW,EAAM,EAAGA,EAAMlE,EAAItH,OAAQwL,IAChCiW,EAAKjW,GAAOmW,EAASra,EAAIkE,IAE7B,OAAOiW,EAEX,GAA4C,oBAAxC5gB,OAAOC,UAAUC,SAASC,KAAKsG,GAC/B,OAAOA,EAGX,IAAK,IAAIkE,KADTiW,EAAO,GACSna,EACZma,EAAKjW,GAAOmW,EAASra,EAAIkE,IAC7B,OAAOiW,GAGXtf,EAAQyf,WAAa,SAASC,GAE1B,IADA,IAAI7Z,EAAM,GACD9G,EAAE,EAAGA,EAAE2gB,EAAI7hB,OAAQkB,IACxB8G,EAAI6Z,EAAI3gB,IAAM,EAElB,OAAO8G,GAIX7F,EAAQ2f,UAAY,SAASC,GACzB,IAAI/Z,EAAMnH,OAAO6I,OAAO,MACxB,IAAK,IAAIxI,KAAK6gB,EACV/Z,EAAI9G,GAAK6gB,EAAM7gB,GAEnB,OAAO8G,GAEX7F,EAAQ6f,YAAc,SAASle,EAAOoE,GACpC,IAAK,IAAIhH,EAAI,EAAGA,GAAK4C,EAAM9D,OAAQkB,IAC7BgH,IAAUpE,EAAM5C,IAClB4C,EAAMmC,OAAO/E,EAAG,IAKtBiB,EAAQ8f,aAAe,SAAS/d,GAC5B,OAAOA,EAAIhC,QAAQ,0BAA2B,SAGlDC,EAAQ+f,WAAa,SAAShe,GAC1B,OAAOA,EAAIhC,QAAQ,KAAM,SAASA,QAAQ,KAAM,SAASA,QAAQ,KAAM,SAASA,QAAQ,KAAM,UAGlGC,EAAQggB,gBAAkB,SAASjB,EAAQkB,GACvC,IAAIC,EAAU,GASd,OAPAnB,EAAOhf,QAAQkgB,EAAQ,SAASle,GAC5Bme,EAAQ/gB,KAAK,CACTghB,OAAQviB,UAAUA,UAAUC,OAAO,GACnCA,OAAQkE,EAAIlE,WAIbqiB,GAEXlgB,EAAQogB,aAAe,SAASC,GAC5B,IAAI/D,EAAQ,KACR/d,EAAW,WACX+d,EAAQ,KACR+D,KAGAC,EAAW,SAASC,GAGpB,OAFAD,EAASE,SACTlE,EAAQO,WAAWte,EAAUgiB,GAAW,GACjCD,GAqBX,OAlBAA,EAASG,SAAWH,EAEpBA,EAASzhB,KAAO,WAGZ,OAFAxB,KAAKmjB,SACLH,IACOC,GAGXA,EAASE,OAAS,WAGd,OAFA5D,aAAaN,GACbA,EAAQ,KACDgE,GAGXA,EAASI,UAAY,WACjB,OAAOpE,GAGJgE,GAIXtgB,EAAQ2gB,YAAc,SAASN,EAAKO,GAChC,IAAItE,EAAQ,KACR/d,EAAW,WACX+d,EAAQ,KACR+D,KAGAQ,EAAQ,SAASN,GACJ,MAATjE,IACAA,EAAQO,WAAWte,EAAUgiB,GAAWK,KAuBhD,OApBAC,EAAMC,MAAQ,SAASP,GACnBjE,GAASM,aAAaN,GACtBA,EAAQO,WAAWte,EAAUgiB,GAAWK,IAE5CC,EAAMJ,SAAWI,EAEjBA,EAAMhiB,KAAO,WACTxB,KAAKmjB,SACLH,KAGJQ,EAAML,OAAS,WACXlE,GAASM,aAAaN,GACtBA,EAAQ,MAGZuE,EAAMH,UAAY,WACd,OAAOpE,GAGJuE,KAIXngB,IAAIlD,OAAO,6BAA6B,CAAC,UAAU,UAAU,SAAS,gBAAgB,oBAAoB,cAAc,eAAe,gBAAiB,SAAS0B,EAAUc,EAASvC,GACpL,aAEA,IAAI0b,EAAQja,EAAS,gBACjBwZ,EAAYxZ,EAAS,oBACrB6hB,EAAM7hB,EAAS,cACf8hB,EAAO9hB,EAAS,eAChB+hB,EAAO/hB,EAAS,eAChBgiB,EAAOD,EAAKpR,SACZsR,EAAiBzI,EAAUN,SAAW,GACtCgJ,EAAoB1I,EAAUnB,KAE9B8J,EAAY,SAASjT,EAAYkT,GACjC,IACIC,EAAOR,EAAIzY,cAAc,YAC7BiZ,EAAK1W,UAAY6N,EAAUF,MAAQ,oCAAsC,iBAErEE,EAAU8I,YACVD,EAAKE,aAAa,2BAA2B,GAEjDF,EAAKE,aAAa,OAAQ,OAC1BF,EAAKE,aAAa,cAAe,OACjCF,EAAKE,aAAa,iBAAkB,OACpCF,EAAKE,aAAa,cAAc,GAEhCF,EAAK5V,MAAM+V,QAAU,IACrBtT,EAAWuT,aAAaJ,EAAMnT,EAAWwT,YAEzC,IAAIC,EAAc,cAEdC,GAAS,EACTC,GAAM,EACNC,GAAS,EACTC,GAAgB,EAChBC,EAAY,GACZC,GAAmB,EACvB,IAAM,IAAIC,EAAY/Z,SAASga,gBAAkBd,EAAQ,MAAM9H,IAE/DN,EAAMN,YAAY0I,EAAM,OAAQ,SAAS9H,GACrC6H,EAAKgB,OAAO7I,GACZ2I,GAAY,IAEhBjJ,EAAMN,YAAY0I,EAAM,QAAS,SAAS9H,GACtC2I,GAAY,EACZd,EAAKiB,QAAQ9I,GACb+I,MAEJnlB,KAAKolB,MAAQ,WACT,GAAIP,EAAW,OAAOX,EAAKkB,QAC3BlB,EAAK5V,MAAMqB,SAAW,QACtBuU,EAAKkB,SAETplB,KAAKqlB,KAAO,WACRnB,EAAKmB,QAETrlB,KAAK+kB,UAAY,WACb,OAAOA,GAEX,IAAIO,EAAgB3B,EAAKL,YAAY,WACjCyB,GAAaI,EAAeL,KAE5BS,EAAY5B,EAAKL,YAAY,WACvBsB,IACFV,EAAKxb,MAAQ8b,EACbO,GAAaI,OAIrB,SAASA,EAAeK,GACpB,IAAIZ,EAAJ,CAIA,GAFAA,GAAgB,EAEZa,EACAC,EAAiB,EACjBC,EAAeH,EAAU,EAAItB,EAAKxb,MAAMlI,OAAS,OAEjD,IAAIklB,EAAiB,EACjBC,EAAe,EAEvB,IACIzB,EAAK0B,kBAAkBF,EAAgBC,GACzC,MAAMvJ,IAERwI,GAAgB,GAGpB,SAASiB,IACDjB,IAEJV,EAAKxb,MAAQ8b,EACTnJ,EAAUP,UACVyK,EAAUnC,YAGlB/H,EAAUP,UAAYmJ,EAAKtI,iBAAiB,kBAAmB,WACvDsI,EAAK6B,UAAUN,WAAaV,IAC5BA,GAAoBA,EACpBQ,EAAclC,cAItByC,IACId,GACAd,EAAKiB,UAGT,IAAIa,EAAgB,SAAS7B,GACzB,OAA+B,IAAxBA,EAAKwB,gBAAwBxB,EAAKyB,eAAiBzB,EAAKxb,MAAMlI,QAGrEwlB,EAAW,SAAS5J,GAChB2J,EAAc7B,IACdD,EAAKgC,YACLd,KACOM,GACPN,EAAelB,EAAK6B,UAAUN,YAIlCC,EAAe,KACnBzlB,KAAKkmB,gBAAkB,SAASC,GAAKV,EAAeU,GACpDnmB,KAAKomB,gBAAkB,WAAY,OAAOX,GAC1C,IAAIY,GAAmB,EAEnBC,EAAW,SAASrF,GACQ,IAAxBiD,EAAKwB,gBAA8C,IAAtBxB,EAAKyB,eAGlCF,IACAxE,EAAOwE,EAAaxE,GACpBwE,EAAe,MAEfd,GACAQ,IACIlE,GACAgD,EAAKsC,QAAQtF,GACjB0D,GAAS,GACF1D,GAAQuD,EAAYgC,OAAO,IAA8B,IAAxBtC,EAAKwB,eACzCW,EACApC,EAAKwC,YAAY,MAAO,CAAC5hB,OAAQ,QAEjCof,EAAKwC,YAAY,YAAa,CAAC5hB,OAAQ,QACnC4f,IACJxD,EAAKyF,UAAU,EAAG,IAAMlC,GAAevD,EAAKzgB,OAASgkB,EAAYhkB,OACjEygB,EAAOA,EAAKuF,OAAO,GACdvF,EAAKuF,OAAO,EAAG,IAAMhC,EAAYgC,OAAO,EAAG,GAChDvF,EAAOA,EAAKuF,OAAO,EAAGvF,EAAKzgB,OAASgkB,EAAYhkB,OAAS,GACpDygB,EAAK5e,OAAO4e,EAAKzgB,OAAS,IAAMgkB,EAAYniB,OAAO,KACxD4e,EAAOA,EAAK1e,MAAM,GAAI,IACtB0e,GAAQuD,EAAYniB,OAAO,IACpB4e,EAAK5e,OAAO4e,EAAKzgB,OAAS,IAAMgkB,EAAYniB,OAAO,KAC1D4e,EAAOA,EAAK1e,MAAM,GAAI,IAEtB0e,GACAgD,EAAK0C,YAAY1F,IAErBwD,IACFA,GAAS,GAEP4B,IACAA,GAAmB,KAEvBO,EAAU,SAASxK,GACnB,IAAIwI,EAAJ,CAEA,IAAI3D,EAAOiD,EAAKxb,MAChB4d,EAASrF,GACT4E,MAGAgB,EAAsB,SAASzK,EAAG6E,EAAM6F,GACxC,IAAIC,EAAgB3K,EAAE2K,eAAiB9mB,OAAO8mB,cAC9C,GAAKA,IAAiBjD,EAAtB,CAEA,IAAIkD,EAAOjD,GAAoB+C,EAAc,OAAS,aACtD,IACI,OAAI7F,GAC6C,IAAtC8F,EAAcE,QAAQD,EAAM/F,GAE5B8F,EAAcG,QAAQF,GAEnC,MAAM5K,GACJ,IAAK0K,EACD,OAAOD,EAAoBzK,EAAG6E,GAAM,MAI5CkG,EAAS,SAAS/K,EAAGgL,GACrB,IAAInG,EAAOgD,EAAKoD,cAChB,IAAKpG,EACD,OAAOnF,EAAMQ,eAAeF,GAE5ByK,EAAoBzK,EAAG6E,IACnB5F,EAAUF,QACVuJ,EAAM0C,EACNlD,EAAKxb,MAAQ,QAAUuY,EAAO,QAC9BiD,EAAK0B,kBAAkB,EAAG,EAAI3E,EAAKzgB,QACnCikB,EAAS,CACL/b,MAAOuY,IAGfmG,EAAQnD,EAAKqD,QAAUrD,EAAKsD,SACvBlM,EAAUF,OAAOW,EAAMQ,eAAeF,KAE3CqI,GAAS,EACTP,EAAKxb,MAAQuY,EACbiD,EAAKsD,SACLhI,WAAW,WACPiF,GAAS,EACToB,IACAV,IACAiC,EAAQnD,EAAKqD,QAAUrD,EAAKsD,aAKpCD,EAAQ,SAASlL,GACjB+K,EAAO/K,GAAG,IAGVmL,EAAS,SAASnL,GAClB+K,EAAO/K,GAAG,IAGVmK,EAAU,SAASnK,GACnB,IAAI6E,EAAO4F,EAAoBzK,GACZ,iBAAR6E,GACHA,GACAgD,EAAKsC,QAAQtF,EAAM7E,GACnBf,EAAUnB,MACVsF,WAAW2F,GACfrJ,EAAMQ,eAAeF,KAGrB8H,EAAKxb,MAAQ,GACbic,GAAS,IAIjB7I,EAAM0E,sBAAsB0D,EAAMD,EAAKwD,aAAatiB,KAAK8e,IAEzDnI,EAAMN,YAAY0I,EAAM,SAAU8B,GAElClK,EAAMN,YAAY0I,EAAM,QAAS0C,GAEjC9K,EAAMN,YAAY0I,EAAM,MAAOoD,GAC/BxL,EAAMN,YAAY0I,EAAM,OAAQqD,GAChCzL,EAAMN,YAAY0I,EAAM,QAASqC,GACjC,IAuIImB,EAvIAC,EAAqB,SAASvL,GAC1BwI,IAAkBX,EAAK0D,oBAAsB1D,EAAK2D,YAEtDhD,EAAgB,GAChBA,EAAciD,QAAU5D,EAAK6D,QAAQC,aACrC9D,EAAK0D,qBACLnI,WAAWwI,EAAqB,GAChC/D,EAAKgE,GAAG,YAAaC,GACjBtD,EAAciD,UAAY5D,EAAK6B,UAAUN,YACzCvB,EAAK5c,OAAO,IACZ4c,EAAK6D,QAAQK,gBACblE,EAAK6B,UAAUsC,kBAEnBnE,EAAK6D,QAAQK,kBAGbH,EAAsB,WACtB,GAAKpD,GAAkBX,EAAK+D,sBAAuB/D,EAAK2D,UAAxD,CAEA,IAAIS,EAAMnE,EAAKxb,MAAMhG,QAAQ,QAAS,IACtC,GAAIkiB,EAAc0D,YAAcD,IAEhCpE,EAAK+D,oBAAoBK,GACrBzD,EAAc0D,WACdrE,EAAKsE,OACL3D,EAAciD,UACdjD,EAAc0D,UAAYD,GAC1BzD,EAAc0D,WAAW,CACzB,IAAIE,EAAIvE,EAAK6B,UAAU2C,WACvBxE,EAAK5c,OAAOud,EAAc0D,WAC1BrE,EAAK6D,QAAQK,gBACbvD,EAAc8D,MAAQzE,EAAK6B,UAAU2C,WACrCxE,EAAK6B,UAAU6C,SAASH,GACxBvE,EAAK6B,UAAUsC,oBAInBF,EAAmB,SAAS9L,GAC5B,GAAK6H,EAAKiE,mBAAoBjE,EAAK2D,UAAnC,CACA,IAAIgB,EAAIhE,EACRA,GAAgB,EAChB,IAAI3F,EAAQO,WAAW,WACnBP,EAAQ,KACR,IAAIva,EAAMwf,EAAKxb,MAAMhG,QAAQ,QAAS,IAClCkiB,IAEKlgB,GAAOkkB,EAAEN,UACdzC,KACM+C,EAAEN,WAAa5jB,IACrBmhB,IACAS,EAAS5hB,OAGjB+gB,EAAe,SAAiC/gB,GAI5C,OAHIua,GACAM,aAAaN,GACjBva,EAAMA,EAAIhC,QAAQ,QAAS,IACvBgC,GAAOkkB,EAAEN,UACF,IACPM,EAAEN,WAAarJ,GACfgF,EAAKsE,OACF7jB,IAEXuf,EAAKiE,mBACLjE,EAAKjI,eAAe,YAAakM,GACnB,kBAAV9L,EAAEV,MAA4BkN,EAAEF,OAChCzE,EAAK6B,UAAU6C,SAASC,EAAEF,OAE9B,IAAIG,IACGxN,EAAUN,UAAYM,EAAUN,UAAY,MAC5CM,EAAUP,UAAYO,EAAUP,UAAY,IAE/C+N,GACFjC,MAMFkC,EAAkBnF,EAAKL,YAAY0E,EAAqB,IAyD5D,SAASe,IACLxJ,aAAamI,GACbA,EAAelI,WAAW,WAClBqF,IACAX,EAAK5V,MAAMD,QAAUwW,EACrBA,EAAY,IAE2B,MAAvCZ,EAAK+E,SAASC,wBACdhF,EAAK+E,SAASC,uBAAwB,EACtChF,EAAK+E,SAASE,0BAEnB,GAlEPpN,EAAMN,YAAY0I,EAAM,mBAAoByD,GACxCtM,EAAUf,QACVwB,EAAMN,YAAY0I,EAAM,OAAQ,WAAW4E,EAAgB1F,cAE3DtH,EAAMN,YAAY0I,EAAM,QAAS,WAAW4E,EAAgB1F,aAC5DtH,EAAMN,YAAY0I,EAAM,UAAW,WAAW4E,EAAgB1F,cAElEtH,EAAMN,YAAY0I,EAAM,iBAAkBgE,GAE1CloB,KAAKmpB,WAAa,WACd,OAAOjF,GAGXlkB,KAAKopB,YAAc,SAASC,GACzBnF,EAAKmF,SAAWA,GAGnBrpB,KAAKspB,cAAgB,SAASlN,GAC1BiK,GAAmB,EACnBlB,EAAelB,EAAK6B,UAAUN,WAC9BvB,EAAKsF,MAAM,oBAAqB,CAAClkB,OAAQ4e,EAAMuF,SAAUpN,IACzDpc,KAAKypB,YAAYrN,GAAG,IAGxBpc,KAAKypB,YAAc,SAASrN,EAAGsN,GACtB7E,IACDA,EAAYX,EAAK5V,MAAMD,SAC3B6V,EAAK5V,MAAMD,SAAWqb,EAAe,kBAAoB,IACnD,UAAYxF,EAAK5V,MAAMkB,OAAS,KAC/B6L,EAAUnB,KAAO,eAAiB,IAEzC,IAAIyP,EAAO1F,EAAK2F,UAAUC,wBACtBvb,EAAQoV,EAAI1U,cAAciV,EAAK2F,WAC/BE,EAAMH,EAAKG,KAAO/a,SAAST,EAAMyb,iBAAmB,GACpDna,EAAO+Z,EAAK/Z,MAAQb,SAAS4a,EAAKK,kBAAoB,GACtDC,EAASN,EAAKO,OAASJ,EAAM5F,EAAK/U,aAAc,EAChDgb,EAAO,SAAS/N,GAChB8H,EAAK5V,MAAMsB,KAAOwM,EAAEqB,QAAU7N,EAAO,EAAI,KACzCsU,EAAK5V,MAAMwb,IAAM5iB,KAAKM,IAAI4U,EAAEsB,QAAUoM,EAAM,EAAGG,GAAU,MAE7DE,EAAK/N,GAES,aAAVA,EAAEV,OAGFuI,EAAK+E,SAASC,wBACdhF,EAAK+E,SAASC,sBAAwB,MAE1C1J,aAAamI,GACTrM,EAAUpB,OACV6B,EAAMkB,QAAQiH,EAAK2F,UAAWO,EAAMpB,KAG5C/oB,KAAK+oB,mBAAqBA,EAgB1B,IAAIO,EAAgB,SAASlN,GACzB6H,EAAKmG,UAAUd,cAAclN,GAC7B2M,KAUJ,GARAjN,EAAMN,YAAY0I,EAAM,UAAWoF,GACnCxN,EAAMN,YAAY0I,EAAM,YAAa,SAAS9H,GAC1CA,EAAEE,iBACFyM,MAEJjN,EAAMN,YAAYyI,EAAK+E,SAASqB,SAAU,cAAef,GACzDxN,EAAMN,YAAY0I,EAAM,cAAeoF,GAEnCjO,EAAUF,MAAO,CACjB,IAAImP,EAAqB,KACrBC,GAAS,EAEbxZ,EAAW4K,iBAAiB,UAAW,SAAUS,GACzCkO,GAAoB/K,aAAa+K,GACrCC,GAAS,IAGbxZ,EAAW4K,iBAAiB,QAAS,SAAUS,GAC3CkO,EAAqB9K,WAAW,WAC5B+K,GAAS,GACV,OAEP,IAAIC,EAAkB,SAASpO,GAC3B,GAAIpR,SAASga,gBAAkBd,IAC3BqG,EAAJ,CAEA,GAAI7F,EACA,OAAOlF,WAAW,WACdkF,GAAM,GACP,KAEP,IAAIgB,EAAiBxB,EAAKwB,eACtBC,EAAezB,EAAKyB,aAExB,GADAzB,EAAK0B,kBAAkB,EAAG,GACtBF,GAAkBC,EAClB,OAAQD,GACJ,KAAK,EAAGzB,EAAKwD,aAAa,KAAM,EAAG7D,EAAK6G,IAAK,MAC7C,KAAK,EAAGxG,EAAKwD,aAAa,KAAM,EAAG7D,EAAK8G,MAAO,MAC/C,KAAK,EAAGzG,EAAKwD,aAAa,KAAM5D,EAAK8G,OAAQ/G,EAAKhU,MAAO,MACzD,KAAK,EAAGqU,EAAKwD,aAAa,KAAM,EAAG7D,EAAKhU,MAAO,MAC/C,KAAK,EAAGqU,EAAKwD,aAAa,KAAM,EAAG7D,EAAKgH,OAAQ,MAChD,KAAK,EAAG3G,EAAKwD,aAAa,KAAM5D,EAAK8G,OAAQ/G,EAAKgH,OAAQ,MAC1D,KAAK,EAAG3G,EAAKwD,aAAa,KAAM,EAAG7D,EAAKiH,KAAM,MAC9C,KAAK,EAAG5G,EAAKwD,aAAa,KAAM,EAAG7D,EAAKkH,MAAO,UAEhD,CACH,OAAQnF,GACJ,KAAK,EAAG1B,EAAKwD,aAAa,KAAM5D,EAAKkH,MAAOnH,EAAKgH,OAAQ,MACzD,KAAK,EAAG3G,EAAKwD,aAAa,KAAM5D,EAAKkH,MAAQlH,EAAK8G,OAAQ/G,EAAKgH,OAAQ,MACvE,KAAK,EAAG3G,EAAKwD,aAAa,KAAM5D,EAAKkH,MAAOnH,EAAKiH,KAAM,MACvD,KAAK,EAAG5G,EAAKwD,aAAa,KAAM5D,EAAKkH,MAAOnH,EAAKkH,MAAO,MAE5D,OAAQpF,GACJ,KAAK,EAAGzB,EAAKwD,aAAa,KAAM5D,EAAKkH,MAAOnH,EAAK6G,IAAK,MACtD,KAAK,EAAGxG,EAAKwD,aAAa,KAAM5D,EAAKkH,MAAOnH,EAAK8G,MAAO,MACxD,KAAK,EAAGzG,EAAKwD,aAAa,KAAM5D,EAAKkH,MAAQlH,EAAK8G,OAAQ/G,EAAKhU,MAAO,MACtE,KAAK,EAAGqU,EAAKwD,aAAa,KAAM5D,EAAKkH,MAAOnH,EAAKhU,MAAO,UAIpE5E,SAAS2Q,iBAAiB,kBAAmB6O,GAC7CvG,EAAKgE,GAAG,UAAW,WACfjd,SAASiR,oBAAoB,kBAAmBuO,OAK5D7nB,EAAQqhB,UAAYA,IAGpB3gB,IAAIlD,OAAO,yBAAyB,CAAC,UAAU,UAAU,SAAS,gBAAgB,oBAAoB,cAAc,eAAe,8BAA+B,SAAS0B,EAAUc,EAASvC,GAC9L,aAEA,IAAI0b,EAAQja,EAAS,gBACjBwZ,EAAYxZ,EAAS,oBACrB6hB,EAAM7hB,EAAS,cACf8hB,EAAO9hB,EAAS,eAChBiiB,EAAiBzI,EAAUN,SAAW,GACtCgJ,EAAoB1I,EAAUnB,KAE9B8Q,EAAenpB,EAAS,mBAAmBmiB,UAC3CA,EAAY,SAASjT,EAAYkT,GACjC,GAAI5I,EAAUF,MACV,OAAO6P,EAAaxpB,KAAKxB,KAAM+Q,EAAYkT,GAE/C,IAAIC,EAAOR,EAAIzY,cAAc,YAC7BiZ,EAAK1W,UAAY,iBAEjB0W,EAAKE,aAAa,OAAQ,OAC1BF,EAAKE,aAAa,cAAe,OACjCF,EAAKE,aAAa,iBAAkB,OACpCF,EAAKE,aAAa,cAAc,GAEhCF,EAAK5V,MAAM+V,QAAU,IACrBtT,EAAWuT,aAAaJ,EAAMnT,EAAWwT,YAEzC,IAAIC,EAAc,eAEdC,GAAS,EACTE,GAAS,EACTC,GAAgB,EAChBC,EAAY,GACZC,GAAmB,EACvB,IAAM,IAAIC,EAAY/Z,SAASga,gBAAkBd,EAAQ,MAAM9H,IAE/DN,EAAMN,YAAY0I,EAAM,OAAQ,SAAS9H,GACrC6H,EAAKgB,OAAO7I,GACZ2I,GAAY,IAEhBjJ,EAAMN,YAAY0I,EAAM,QAAS,SAAS9H,GACtC2I,GAAY,EACZd,EAAKiB,QAAQ9I,GACb+I,MAEJnlB,KAAKolB,MAAQ,WACT,GAAIP,EAAW,OAAOX,EAAKkB,QAC3B,IAAI0E,EAAM5F,EAAK5V,MAAMwb,IACrB5F,EAAK5V,MAAMqB,SAAW,QACtBuU,EAAK5V,MAAMwb,IAAM,MACjB5F,EAAKkB,QACL5F,WAAW,WACP0E,EAAK5V,MAAMqB,SAAW,GACA,OAAlBuU,EAAK5V,MAAMwb,MACX5F,EAAK5V,MAAMwb,IAAMA,IACtB,IAEP9pB,KAAKqlB,KAAO,WACRnB,EAAKmB,QAETrlB,KAAK+kB,UAAY,WACb,OAAOA,GAEX,IAAIO,EAAgB3B,EAAKL,YAAY,WACjCyB,GAAaI,EAAeL,KAE5BS,EAAY5B,EAAKL,YAAY,WACvBsB,IACFV,EAAKxb,MAAQ8b,EACbO,GAAaI,OAIrB,SAASA,EAAeK,GACpB,IAAIZ,EAAJ,CAIA,GAFAA,GAAgB,EAEZa,EACA,IAAIC,EAAiB,EACjBC,EAAeH,EAAU,EAAItB,EAAKxb,MAAMlI,OAAS,OAEjDklB,EAAiBF,EAAU,EAAI,EAC/BG,EAAe,EAEvB,IACIzB,EAAK0B,kBAAkBF,EAAgBC,GACzC,MAAMvJ,IAERwI,GAAgB,GAGpB,SAASiB,IACDjB,IAEJV,EAAKxb,MAAQ8b,EACTnJ,EAAUP,UACVyK,EAAUnC,YAGlB/H,EAAUP,UAAYmJ,EAAKtI,iBAAiB,kBAAmB,WACvDsI,EAAK6B,UAAUN,WAAaV,IAC5BA,GAAoBA,EACpBQ,EAAclC,cAItByC,IACId,GACAd,EAAKiB,UAGT,IAAIa,EAAgB,SAAS7B,GACzB,OAA+B,IAAxBA,EAAKwB,gBAAwBxB,EAAKyB,eAAiBzB,EAAKxb,MAAMlI,QAGrEwlB,EAAW,SAAS5J,GAChBqI,EACAA,GAAS,EACFsB,EAAc7B,IACrBD,EAAKgC,YACLd,KACOM,GACPN,EAAelB,EAAK6B,UAAUN,YAIlCC,EAAe,KACnBzlB,KAAKkmB,gBAAkB,SAASC,GAAKV,EAAeU,GACpDnmB,KAAKomB,gBAAkB,WAAY,OAAOX,GAC1C,IAAIY,GAAmB,EAEnBC,EAAW,SAASrF,GAChBwE,IACAxE,EAAOwE,EAAaxE,GACpBwE,EAAe,MAEfd,GACAQ,IACIlE,GACAgD,EAAKsC,QAAQtF,GACjB0D,GAAS,GACF1D,GAAQuD,EAAYniB,OAAO,GAC9BgkB,EACApC,EAAKwC,YAAY,MAAO,CAAC5hB,OAAQ,QAEjCof,EAAKwC,YAAY,YAAa,CAAC5hB,OAAQ,SAEvCoc,EAAKyF,UAAU,EAAG,IAAMlC,EACxBvD,EAAOA,EAAKuF,OAAO,GACdvF,EAAK5e,OAAO,IAAMmiB,EAAYniB,OAAO,GAC1C4e,EAAOA,EAAKuF,OAAO,GACdvF,EAAK5e,OAAO4e,EAAKzgB,OAAS,IAAMgkB,EAAYniB,OAAO,KACxD4e,EAAOA,EAAK1e,MAAM,GAAI,IACtB0e,EAAK5e,OAAO4e,EAAKzgB,OAAS,IAAMgkB,EAAYniB,OAAO,KACnD4e,EAAOA,EAAK1e,MAAM,GAAI,IAEtB0e,GACAgD,EAAK0C,YAAY1F,IAErBoF,IACAA,GAAmB,IAEvBO,EAAU,SAASxK,GACnB,IAAIwI,EAAJ,CAEA,IAAI3D,EAAOiD,EAAKxb,MAChB4d,EAASrF,GACT4E,MAGAgB,EAAsB,SAASzK,EAAG6E,EAAM6F,GACxC,IAAIC,EAAgB3K,EAAE2K,eAAiB9mB,OAAO8mB,cAC9C,GAAKA,IAAiBjD,EAAtB,CAEA,IAAIkD,EAAOjD,GAAoB+C,EAAc,OAAS,aACtD,IACI,OAAI7F,GAC6C,IAAtC8F,EAAcE,QAAQD,EAAM/F,GAE5B8F,EAAcG,QAAQF,GAEnC,MAAM5K,GACJ,IAAK0K,EACD,OAAOD,EAAoBzK,EAAG6E,GAAM,MAI5CkG,EAAS,SAAS/K,EAAGgL,GACrB,IAAInG,EAAOgD,EAAKoD,cAChB,IAAKpG,EACD,OAAOnF,EAAMQ,eAAeF,GAE5ByK,EAAoBzK,EAAG6E,IACvBmG,EAAQnD,EAAKqD,QAAUrD,EAAKsD,SAC5BzL,EAAMQ,eAAeF,KAErBqI,GAAS,EACTP,EAAKxb,MAAQuY,EACbiD,EAAKsD,SACLhI,WAAW,WACPiF,GAAS,EACToB,IACAV,IACAiC,EAAQnD,EAAKqD,QAAUrD,EAAKsD,aAKpCD,EAAQ,SAASlL,GACjB+K,EAAO/K,GAAG,IAGVmL,EAAS,SAASnL,GAClB+K,EAAO/K,GAAG,IAGVmK,EAAU,SAASnK,GACnB,IAAI6E,EAAO4F,EAAoBzK,GACZ,iBAAR6E,GACHA,GACAgD,EAAKsC,QAAQtF,EAAM7E,GACnBf,EAAUnB,MACVsF,WAAW2F,GACfrJ,EAAMQ,eAAeF,KAGrB8H,EAAKxb,MAAQ,GACbic,GAAS,IAIjB7I,EAAM0E,sBAAsB0D,EAAMD,EAAKwD,aAAatiB,KAAK8e,IAEzDnI,EAAMN,YAAY0I,EAAM,SAAU8B,GAElClK,EAAMN,YAAY0I,EAAM,QAAS0C,GAEjC9K,EAAMN,YAAY0I,EAAM,MAAOoD,GAC/BxL,EAAMN,YAAY0I,EAAM,OAAQqD,GAChCzL,EAAMN,YAAY0I,EAAM,QAASqC,GAC3B,UAAWrC,GAAW,WAAYA,GAAW,YAAaA,GAC5DpI,EAAMN,YAAYzK,EAAY,UAAW,SAASqL,GAC9C,KAAKf,EAAU3B,OAAU0C,EAAEwD,UAAaxD,EAAEK,QAG1C,OAAQL,EAAElD,SACN,KAAK,GACDqO,EAAOnL,GACP,MACJ,KAAK,GACDmK,EAAQnK,GACR,MACJ,KAAK,GACDkL,EAAMlL,GACN,SAIhB,IAuIIsL,EAvIAC,EAAqB,SAASvL,GAC1BwI,IAAkBX,EAAK0D,oBAAsB1D,EAAK2D,YAEtDhD,EAAgB,GAChBA,EAAciD,QAAU5D,EAAK6D,QAAQC,aACrC9D,EAAK0D,qBACLnI,WAAWwI,EAAqB,GAChC/D,EAAKgE,GAAG,YAAaC,GACjBtD,EAAciD,UAAY5D,EAAK6B,UAAUN,YACzCvB,EAAK5c,OAAO,IACZ4c,EAAK6D,QAAQK,gBACblE,EAAK6B,UAAUsC,kBAEnBnE,EAAK6D,QAAQK,kBAGbH,EAAsB,WACtB,GAAKpD,GAAkBX,EAAK+D,sBAAuB/D,EAAK2D,UAAxD,CAEA,IAAIS,EAAMnE,EAAKxb,MAAMhG,QAAQ,UAAW,IACxC,GAAIkiB,EAAc0D,YAAcD,IAEhCpE,EAAK+D,oBAAoBK,GACrBzD,EAAc0D,WACdrE,EAAKsE,OACL3D,EAAciD,UACdjD,EAAc0D,UAAYD,GAC1BzD,EAAc0D,WAAW,CACzB,IAAIE,EAAIvE,EAAK6B,UAAU2C,WACvBxE,EAAK5c,OAAOud,EAAc0D,WAC1BrE,EAAK6D,QAAQK,gBACbvD,EAAc8D,MAAQzE,EAAK6B,UAAU2C,WACrCxE,EAAK6B,UAAU6C,SAASH,GACxBvE,EAAK6B,UAAUsC,oBAInBF,EAAmB,SAAS9L,GAC5B,GAAK6H,EAAKiE,mBAAoBjE,EAAK2D,UAAnC,CACA,IAAIgB,EAAIhE,EACRA,GAAgB,EAChB,IAAI3F,EAAQO,WAAW,WACnBP,EAAQ,KACR,IAAIva,EAAMwf,EAAKxb,MAAMhG,QAAQ,UAAW,IACpCkiB,IAEKlgB,GAAOkkB,EAAEN,UACdzC,KACM+C,EAAEN,WAAa5jB,IACrBmhB,IACAS,EAAS5hB,OAGjB+gB,EAAe,SAAiC/gB,GAI5C,OAHIua,GACAM,aAAaN,GACjBva,EAAMA,EAAIhC,QAAQ,UAAW,IACzBgC,GAAOkkB,EAAEN,UACF,IACPM,EAAEN,WAAarJ,GACfgF,EAAKsE,OACF7jB,IAEXuf,EAAKiE,mBACLjE,EAAKjI,eAAe,YAAakM,GACnB,kBAAV9L,EAAEV,MAA4BkN,EAAEF,OAChCzE,EAAK6B,UAAU6C,SAASC,EAAEF,OAE9B,IAAIG,IACGxN,EAAUN,UAAYM,EAAUN,UAAY,MAC5CM,EAAUP,UAAYO,EAAUP,UAAY,IAE/C+N,GACFjC,MAMFkC,EAAkBnF,EAAKL,YAAY0E,EAAqB,IAyD5D,SAASe,IACLxJ,aAAamI,GACbA,EAAelI,WAAW,WAClBqF,IACAX,EAAK5V,MAAMD,QAAUwW,EACrBA,EAAY,IAE2B,MAAvCZ,EAAK+E,SAASC,wBACdhF,EAAK+E,SAASC,uBAAwB,EACtChF,EAAK+E,SAASE,0BAEnB,GAlEPpN,EAAMN,YAAY0I,EAAM,mBAAoByD,GACxCtM,EAAUf,QACVwB,EAAMN,YAAY0I,EAAM,OAAQ,WAAW4E,EAAgB1F,cAE3DtH,EAAMN,YAAY0I,EAAM,QAAS,WAAW4E,EAAgB1F,aAC5DtH,EAAMN,YAAY0I,EAAM,UAAW,WAAW4E,EAAgB1F,cAElEtH,EAAMN,YAAY0I,EAAM,iBAAkBgE,GAE1CloB,KAAKmpB,WAAa,WACd,OAAOjF,GAGXlkB,KAAKopB,YAAc,SAASC,GACzBnF,EAAKmF,SAAWA,GAGnBrpB,KAAKspB,cAAgB,SAASlN,GAC1BiK,GAAmB,EACnBlB,EAAelB,EAAK6B,UAAUN,WAC9BvB,EAAKsF,MAAM,oBAAqB,CAAClkB,OAAQ4e,EAAMuF,SAAUpN,IACzDpc,KAAKypB,YAAYrN,GAAG,IAGxBpc,KAAKypB,YAAc,SAASrN,EAAGsN,GACtB7E,IACDA,EAAYX,EAAK5V,MAAMD,SAC3B6V,EAAK5V,MAAMD,SAAWqb,EAAe,kBAAoB,IACnD,UAAYxF,EAAK5V,MAAMkB,OAAS,KAC/B6L,EAAUnB,KAAO,eAAiB,IAEzC,IAAIyP,EAAO1F,EAAK2F,UAAUC,wBACtBvb,EAAQoV,EAAI1U,cAAciV,EAAK2F,WAC/BE,EAAMH,EAAKG,KAAO/a,SAAST,EAAMyb,iBAAmB,GACpDna,EAAO+Z,EAAK/Z,MAAQb,SAAS4a,EAAKK,kBAAoB,GACtDC,EAASN,EAAKO,OAASJ,EAAM5F,EAAK/U,aAAc,EAChDgb,EAAO,SAAS/N,GAChB8H,EAAK5V,MAAMsB,KAAOwM,EAAEqB,QAAU7N,EAAO,EAAI,KACzCsU,EAAK5V,MAAMwb,IAAM5iB,KAAKM,IAAI4U,EAAEsB,QAAUoM,EAAM,EAAGG,GAAU,MAE7DE,EAAK/N,GAES,aAAVA,EAAEV,OAGFuI,EAAK+E,SAASC,wBACdhF,EAAK+E,SAASC,sBAAwB,MAE1C1J,aAAamI,GACTrM,EAAUpB,OACV6B,EAAMkB,QAAQiH,EAAK2F,UAAWO,EAAMpB,KAG5C/oB,KAAK+oB,mBAAqBA,EAgB1B,IAAIO,EAAgB,SAASlN,GACzB6H,EAAKmG,UAAUd,cAAclN,GAC7B2M,KAEJjN,EAAMN,YAAY0I,EAAM,UAAWoF,GACnCxN,EAAMN,YAAY0I,EAAM,YAAa,SAAS9H,GAC1CA,EAAEE,iBACFyM,MAEJjN,EAAMN,YAAYyI,EAAK+E,SAASqB,SAAU,cAAef,GACzDxN,EAAMN,YAAY0I,EAAM,cAAeoF,IAG3C3mB,EAAQqhB,UAAYA,IAGpB3gB,IAAIlD,OAAO,6BAA6B,CAAC,UAAU,UAAU,SAAS,cAAc,gBAAgB,qBAAsB,SAAS0B,EAAUc,EAASvC,GACtJ,aAEUyB,EAAS,cACPA,EAAS,gBADrB,IAEIwZ,EAAYxZ,EAAS,oBAErBopB,EAAc,EACdC,EAAoB,IAExB,SAASC,EAAgBC,GACrBA,EAAaC,gBAAkB,KAE/B,IAAIC,EAASF,EAAaE,OAC1BA,EAAOC,kBAAkB,YAAavrB,KAAKwrB,YAAYrmB,KAAKimB,IAC5DE,EAAOC,kBAAkB,WAAYvrB,KAAKyrB,cAActmB,KAAKimB,IAC7DE,EAAOC,kBAAkB,cAAevrB,KAAK0rB,cAAcvmB,KAAKimB,IAChEE,EAAOC,kBAAkB,YAAavrB,KAAK2rB,YAAYxmB,KAAKimB,IAC5DE,EAAOC,kBAAkB,aAAcvrB,KAAK4rB,aAAazmB,KAAKimB,IAC9DE,EAAOC,kBAAkB,YAAavrB,KAAK6rB,YAAY1mB,KAAKimB,IAE5D,IAAIzoB,EAAU,CAAC,SAAU,cAAe,YAAa,eAAgB,mBACjE,mBAAoB,WAAY,cAAe,aAEnDA,EAAQuF,QAAQ,SAASpE,GACrBsnB,EAAatnB,GAAK9D,KAAK8D,IACxB9D,MAEHorB,EAAaU,cAAgB9rB,KAAK+rB,kBAAkB5mB,KAAKimB,EAAc,gBACvEA,EAAaY,cAAgBhsB,KAAK+rB,kBAAkB5mB,KAAKimB,EAAc,gBAgP3E,SAASa,EAAaC,EAAIC,EAAIC,EAAIC,GAC9B,OAAOnlB,KAAKolB,KAAKplB,KAAK8R,IAAIoT,EAAKF,EAAI,GAAKhlB,KAAK8R,IAAIqT,EAAKF,EAAI,IAG9D,SAASI,EAAqB7D,EAAO8D,GACjC,GAAI9D,EAAM5hB,MAAM2lB,KAAO/D,EAAMmC,IAAI4B,IAC7B,IAAIC,EAAM,EAAIF,EAAOG,OAASjE,EAAM5hB,MAAM6lB,OAASjE,EAAMmC,IAAI8B,YAC5D,GAAIjE,EAAM5hB,MAAM2lB,KAAO/D,EAAMmC,IAAI4B,IAAM,GAAM/D,EAAM5hB,MAAM6lB,QAAWjE,EAAMmC,IAAI8B,OAG3ED,EAAM,EAAIF,EAAOC,IAAM/D,EAAM5hB,MAAM2lB,IAAM/D,EAAMmC,IAAI4B,SAFvD,IAAIC,EAAMF,EAAOG,OAAS,EAI9B,OAAID,EAAM,EACC,CAACF,OAAQ9D,EAAM5hB,MAAO8lB,OAAQlE,EAAMmC,KAEpC,CAAC2B,OAAQ9D,EAAMmC,IAAK+B,OAAQlE,EAAM5hB,QA5PjD,WAEI9G,KAAKwrB,YAAc,SAASqB,GACxB,IAAIC,EAAcD,EAAGC,cACjB9lB,EAAM6lB,EAAGE,sBACb/sB,KAAKgtB,eAAiBH,EACtB,IAAIvB,EAAStrB,KAAKsrB,OAEd1O,EAASiQ,EAAGrQ,YAChB,GAAe,IAAXI,EAAc,CACd,IAAIqQ,EAAiB3B,EAAO4B,oBACxBC,EAAiBF,EAAezH,UAUpC,OATA8F,EAAO8B,mBACHD,GAA4B,GAAVvQ,IAClB0O,EAAOxF,UAAUuH,eAAermB,GACpCskB,EAAO8B,uBACO,GAAVxQ,IACA0O,EAAOlB,UAAUd,cAAcuD,EAAGrD,UAC7BnO,EAAUd,WACXsS,EAAGvQ,mBAMf,OADAtc,KAAKgtB,eAAeM,KAAOnhB,KAAKC,OAC5B0gB,GAAgBxB,EAAOvG,cACvBuG,EAAOlG,SACHplB,KAAKutB,cAAiBvtB,KAAKqrB,iBAAoBC,EAAOkC,oBAO9DxtB,KAAKytB,aAAaZ,GAClB7sB,KAAK0tB,YAAY1mB,EAAK6lB,EAAGrD,SAAS/J,QAAU,GACrCoN,EAAGvQ,mBARFtc,KAAK2tB,SAAS,kBACd3tB,KAAKytB,aAAaZ,KAU9B7sB,KAAK0tB,YAAc,SAAS1mB,EAAK4mB,GAC7B5mB,EAAMA,GAAOhH,KAAKsrB,OAAOtC,SAAS6E,wBAAwB7tB,KAAK8D,EAAG9D,KAAK8tB,GACvE,IAAIxC,EAAStrB,KAAKsrB,OAClBA,EAAO8B,kBACHptB,KAAKgtB,eAAee,cACpBzC,EAAOxF,UAAUkI,iBAAiBhnB,GAC5B4mB,GACNtC,EAAOxF,UAAUuH,eAAermB,GAC/B4mB,GACD5tB,KAAKwnB,SACL8D,EAAOtC,SAASqB,SAAS4D,YACzB3C,EAAOtC,SAASqB,SAAS4D,aAE7B3C,EAAO4C,SAAS,iBAChBluB,KAAK2tB,SAAS,UACdrC,EAAO8B,mBAGXptB,KAAKwnB,OAAS,WACV,IAAIoF,EAAQtB,EAAStrB,KAAKsrB,OACtBkB,EAASlB,EAAOtC,SAAS6E,wBAAwB7tB,KAAK8D,EAAG9D,KAAK8tB,GAElE,GADAxC,EAAO8B,kBACHptB,KAAKqrB,gBAAiB,CACtB,IAAIqB,EAAM1sB,KAAKqrB,gBAAgB8C,aAAa3B,GAE5C,IAAY,GAARE,EACAE,EAAS5sB,KAAKqrB,gBAAgBR,SAC3B,GAAW,GAAP6B,EACPE,EAAS5sB,KAAKqrB,gBAAgBvkB,UAC3B,CACH,IAAIsnB,EAAgB7B,EAAqBvsB,KAAKqrB,gBAAiBmB,GAC/DA,EAAS4B,EAAc5B,OACvBI,EAASwB,EAAcxB,OAE3BtB,EAAOxF,UAAUuI,mBAAmBzB,EAAOH,IAAKG,EAAOD,QAE3DrB,EAAOxF,UAAUkI,iBAAiBxB,GAClClB,EAAO8B,kBACP9B,EAAOtC,SAASsF,wBAGpBtuB,KAAK+rB,kBAAoB,SAASwC,GAC9B,IAAI3B,EAAQtB,EAAStrB,KAAKsrB,OACtBkB,EAASlB,EAAOtC,SAAS6E,wBAAwB7tB,KAAK8D,EAAG9D,KAAK8tB,GAC9DpF,EAAQ4C,EAAOxF,UAAUyI,GAAU/B,EAAOC,IAAKD,EAAOG,QAE1D,GADArB,EAAO8B,kBACHptB,KAAKqrB,gBAAiB,CACtB,IAAImD,EAAWxuB,KAAKqrB,gBAAgB8C,aAAazF,EAAM5hB,OACnD2nB,EAASzuB,KAAKqrB,gBAAgB8C,aAAazF,EAAMmC,KAErD,IAAiB,GAAb2D,GAAkBC,GAAU,EAC5B7B,EAAS5sB,KAAKqrB,gBAAgBR,IAC1BnC,EAAMmC,IAAI4B,KAAOD,EAAOC,KAAO/D,EAAMmC,IAAI8B,QAAUH,EAAOG,SAC1DH,EAAS9D,EAAM5hB,YAChB,GAAc,GAAV2nB,GAAeD,GAAY,EAClC5B,EAAS5sB,KAAKqrB,gBAAgBvkB,MAC1B4hB,EAAM5hB,MAAM2lB,KAAOD,EAAOC,KAAO/D,EAAM5hB,MAAM6lB,QAAUH,EAAOG,SAC9DH,EAAS9D,EAAMmC,UAChB,IAAiB,GAAb2D,GAA4B,GAAVC,EACzBjC,EAAS9D,EAAMmC,IACf+B,EAASlE,EAAM5hB,UACZ,CACH,IAAIsnB,EAAgB7B,EAAqBvsB,KAAKqrB,gBAAiBmB,GAC/DA,EAAS4B,EAAc5B,OACvBI,EAASwB,EAAcxB,OAE3BtB,EAAOxF,UAAUuI,mBAAmBzB,EAAOH,IAAKG,EAAOD,QAE3DrB,EAAOxF,UAAUkI,iBAAiBxB,GAClClB,EAAO8B,kBACP9B,EAAOtC,SAASsF,wBAGpBtuB,KAAK0uB,UACL1uB,KAAK2uB,aACL3uB,KAAK4uB,iBACL5uB,KAAK6uB,iBAAmB,WACpB7uB,KAAKqrB,gBAAkB,KACvBrrB,KAAKsrB,OAAOwD,WAAW,iBACnB9uB,KAAKsrB,OAAOtC,SAASqB,SAAS0E,gBAC9B/uB,KAAKsrB,OAAOtC,SAASqB,SAAS0E,kBAItC/uB,KAAKgvB,UAAY,WACb,IAAIC,EAAWhD,EAAajsB,KAAKgtB,eAAelpB,EAAG9D,KAAKgtB,eAAec,EAAG9tB,KAAK8D,EAAG9D,KAAK8tB,GACnFR,EAAOnhB,KAAKC,OAEZ6iB,EAAWhE,GAAeqC,EAAOttB,KAAKgtB,eAAeM,KAAOttB,KAAKutB,eACjEvtB,KAAK0tB,YAAY1tB,KAAKgtB,eAAeD,wBAG7C/sB,KAAKyrB,cAAgB,SAASoB,GAC1B,IAAI7lB,EAAM6lB,EAAGE,sBACTzB,EAAStrB,KAAKsrB,OACdxD,EAAUwD,EAAOxD,QAEjBY,EAAQZ,EAAQoH,gBAAgBloB,GAChC0hB,GACIA,EAAMlD,YACNkD,EAAM5hB,MAAM6lB,SACZjE,EAAMmC,IAAI8B,UAEd3sB,KAAK2tB,SAAS,YAEdjF,EAAQ4C,EAAOxF,UAAUqJ,aAAanoB,EAAIylB,IAAKzlB,EAAI2lB,QACnD3sB,KAAK2tB,SAAS,kBAElB3tB,KAAKqrB,gBAAkB3C,EACvB1oB,KAAKwnB,UAGTxnB,KAAK0rB,cAAgB,SAASmB,GAC1B,IAAI7lB,EAAM6lB,EAAGE,sBACTzB,EAAStrB,KAAKsrB,OAElBtrB,KAAK2tB,SAAS,iBACd,IAAIjF,EAAQ4C,EAAO4B,oBACfxE,EAAM0G,eAAiB1G,EAAM2G,SAASroB,EAAIylB,IAAKzlB,EAAI2lB,SACnD3sB,KAAKqrB,gBAAkBC,EAAOxF,UAAUwJ,aAAa5G,EAAM5hB,MAAM2lB,KACjEzsB,KAAKqrB,gBAAgBR,IAAMS,EAAOxF,UAAUwJ,aAAa5G,EAAMmC,IAAI4B,KAAK5B,KAExE7qB,KAAKqrB,gBAAkBC,EAAOxF,UAAUwJ,aAAatoB,EAAIylB,KAE7DzsB,KAAKwnB,UAGTxnB,KAAK2rB,YAAc,SAASkB,GACxB,IAAIvB,EAAStrB,KAAKsrB,OAElBA,EAAOrF,YACPjmB,KAAKqrB,gBAAkBC,EAAO4B,oBAC9BltB,KAAK2tB,SAAS,cAGlB3tB,KAAK4rB,aAAe,SAASiB,GACzB,IAAIA,EAAG0C,cAAP,CAEI1C,EAAGkB,eAAiBlB,EAAGjP,SAAWiP,EAAGlP,SACrCkP,EAAGlP,OAASkP,EAAGjP,OACfiP,EAAGjP,OAAS,GAGhB,IAAI0N,EAAStrB,KAAKsrB,OAEbtrB,KAAKwvB,cACNxvB,KAAKwvB,YAAc,CAAEC,EAAG,EAAGC,GAAI,EAAGC,GAAI,EAAGC,QAAS,IAEtD,IAAIC,EAAa7vB,KAAKwvB,YAClBC,EAAI5C,EAAGrD,SAASrJ,UAChBC,EAAKqP,EAAII,EAAWJ,EACpBC,EAAK7C,EAAGlP,OAASyC,EACjBuP,EAAK9C,EAAGjP,OAASwC,EACjBA,EAAK8K,IACLwE,GAAMA,EAAKG,EAAWH,IAAM,EAC5BC,GAAMA,EAAKE,EAAWF,IAAM,GAGhC,IAAIG,EAAY5oB,KAAKgC,IAAIwmB,EAAKC,GAE1BI,GAAY,EAMhB,GALID,GAAa,GAAKxE,EAAOtC,SAASgH,eAAenD,EAAGlP,OAASkP,EAAGoD,MAAO,KACvEF,GAAY,GACZD,GAAa,GAAKxE,EAAOtC,SAASgH,eAAe,EAAGnD,EAAGjP,OAASiP,EAAGoD,SACnEF,GAAY,GAEZA,EACAF,EAAWD,QAAUH,OAClB,GAAIA,EAAII,EAAWD,QAAU1E,EAAmB,CACnD,IAAIgF,EAAWhpB,KAAKgC,IAAIwmB,IAAO,IAAMxoB,KAAKgC,IAAI2mB,EAAWH,KAClDxoB,KAAKgC,IAAIymB,IAAO,IAAMzoB,KAAKgC,IAAI2mB,EAAWF,IAC7CO,GACAH,GAAY,EACZF,EAAWD,QAAUH,GAGrBI,EAAWD,QAAU,EAQ7B,OAJAC,EAAWJ,EAAIA,EACfI,EAAWH,GAAKA,EAChBG,EAAWF,GAAKA,EAEZI,GACAzE,EAAOtC,SAASmH,SAAStD,EAAGlP,OAASkP,EAAGoD,MAAOpD,EAAGjP,OAASiP,EAAGoD,OACvDpD,EAAGuD,aAFd,IAMJpwB,KAAK6rB,YAAc,SAASgB,GACxB7sB,KAAKsrB,OAAO/B,MAAM,aAAcsD,MAGrCrrB,KAAK2pB,EAAgB7pB,WAExBqB,EAAQwoB,gBAAkBA,IAsB1B9nB,IAAIlD,OAAO,cAAc,CAAC,UAAU,UAAU,SAAS,cAAc,eAAgB,SAAS0B,EAAUc,EAASvC,GACjH,aAEUyB,EAAS,aAAnB,IACI6hB,EAAM7hB,EAAS,aACnB,SAASwuB,EAAStf,GACd/Q,KAAKswB,QAAS,EACdtwB,KAAKuwB,SAAW,KAChBvwB,KAAKwwB,YAAczf,GAGvB,WACI/Q,KAAKywB,MAAQ,WAKT,OAJAzwB,KAAKuwB,SAAW7M,EAAIzY,cAAc,OAClCjL,KAAKuwB,SAAS/iB,UAAY,cAC1BxN,KAAKuwB,SAASjiB,MAAMmB,QAAU,OAC9BzP,KAAKwwB,YAAYjiB,YAAYvO,KAAKuwB,UAC3BvwB,KAAKuwB,UAEhBvwB,KAAKmpB,WAAa,WACd,OAAOnpB,KAAKuwB,UAAYvwB,KAAKywB,SAEjCzwB,KAAK0wB,QAAU,SAASxM,GACpBR,EAAIzS,aAAajR,KAAKmpB,aAAcjF,IAExClkB,KAAK2wB,QAAU,SAASC,GACpB5wB,KAAKmpB,aAAarY,UAAY8f,GAElC5wB,KAAK6wB,YAAc,SAAS/sB,EAAGgqB,GAC3B9tB,KAAKmpB,aAAa7a,MAAMsB,KAAO9L,EAAI,KACnC9D,KAAKmpB,aAAa7a,MAAMwb,IAAMgE,EAAI,MAEtC9tB,KAAK8wB,aAAe,SAAStjB,GACzBkW,EAAIjW,YAAYzN,KAAKmpB,aAAc3b,IAEvCxN,KAAK+wB,KAAO,SAAS7M,EAAMpgB,EAAGgqB,GACd,MAAR5J,GACAlkB,KAAK0wB,QAAQxM,GACR,MAALpgB,GAAkB,MAALgqB,GACb9tB,KAAK6wB,YAAY/sB,EAAGgqB,GACnB9tB,KAAKswB,SACNtwB,KAAKmpB,aAAa7a,MAAMmB,QAAU,QAClCzP,KAAKswB,QAAS,IAItBtwB,KAAKgxB,KAAO,WACJhxB,KAAKswB,SACLtwB,KAAKmpB,aAAa7a,MAAMmB,QAAU,OAClCzP,KAAKswB,QAAS,IAGtBtwB,KAAKixB,UAAY,WACb,OAAOjxB,KAAKmpB,aAAa+H,cAE7BlxB,KAAKmxB,SAAW,WACZ,OAAOnxB,KAAKmpB,aAAanZ,aAG7BhQ,KAAKoxB,QAAU,WACXpxB,KAAKswB,QAAS,EACVtwB,KAAKuwB,UAAYvwB,KAAKuwB,SAASxf,YAC/B/Q,KAAKuwB,SAASxf,WAAWb,YAAYlQ,KAAKuwB,aAInD/uB,KAAK6uB,EAAQ/uB,WAEhBqB,EAAQ0tB,QAAUA,IAGlBhtB,IAAIlD,OAAO,mCAAmC,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,gBAAgB,eAAgB,SAAS0B,EAAUc,EAASvC,GACpK,aACA,IAAIsjB,EAAM7hB,EAAS,cACfmQ,EAAMnQ,EAAS,cACfia,EAAQja,EAAS,gBACjBwuB,EAAUxuB,EAAS,cAAcwuB,QAErC,SAASgB,EAAcjG,GACnB,IA8BIkG,EAAgBC,EAAYC,EA9B5BlG,EAASF,EAAaE,OACtBmG,EAASnG,EAAOtC,SAAS0I,aACzBC,EAAU,IAAIC,EAActG,EAAO1B,WA8BvC,SAASiI,IACL,IAAIpF,EAAM8E,EAAWxE,sBAAsBN,IACvCqF,EAAaL,EAAOM,aAAatF,GACrC,IAAKqF,EACD,OAAOE,IAEX,IAAIC,EAAS3G,EAAOxD,QAAQoK,YAC5B,GAAIzF,GAAOwF,EAAQ,CACf,IAAIE,EAAY7G,EAAOtC,SAASoJ,yBAAyB,EAAGb,EAAWzD,GAAGrB,IACtEzlB,EAAMuqB,EAAWc,KACrB,GAAIF,EAAY7G,EAAOxD,QAAQwK,oBAAoBtrB,EAAIylB,IAAKzlB,EAAI2lB,QAC5D,OAAOqF,IAGf,GAAIR,GAAqBM,EASzB,GAPAN,EAAoBM,EAAW5N,KAAK1hB,KAAK,SAEzCmvB,EAAQhB,QAAQa,GAChBG,EAAQZ,OACRzF,EAAOiH,QAAQ,oBAAqBZ,GACpCrG,EAAOrD,GAAG,aAAc+J,GAEpB5G,EAAaoH,qBACbC,EAAYlB,OACT,CACH,IAAImB,EAAgBnB,EAAW/H,SAASnkB,OACpCskB,EAAO+I,EAAc7I,wBACrBvb,EAAQqjB,EAAQxI,aAAa7a,MACjCA,EAAMsB,KAAO+Z,EAAKiB,MAAQ,KAC1Btc,EAAMwb,IAAMH,EAAKO,OAAS,MAIlC,SAAS8H,IACDV,IACAA,EAAiB/R,aAAa+R,IAC9BE,IACAG,EAAQX,OACRQ,EAAoB,KACpBlG,EAAOiH,QAAQ,oBAAqBZ,GACpCrG,EAAOrP,oBAAoB,aAAc+V,IAIjD,SAASS,EAAYrW,GACjBuV,EAAQd,YAAYzU,EAAEtY,EAAGsY,EAAE0R,GA1E/B1C,EAAaE,OAAOC,kBAAkB,kBAAmB,SAASnP,GAC9D,GAAKkP,EAAOvG,aAAgC,GAAjB3I,EAAEI,YAA7B,CAEA,IAAImW,EAAelB,EAAOmB,UAAUxW,GAEpC,GAAoB,eAAhBuW,EAAJ,CAGA,IAAIlG,EAAMrQ,EAAE2Q,sBAAsBN,IAC9B3G,EAAYwF,EAAOxD,QAAQhC,UAE/B,GAAI1J,EAAE2R,cACFjI,EAAU+M,SAASpG,EAAK,OACvB,CACD,GAAyB,GAArBrQ,EAAEoN,SAAS9K,OAEX,OADA4M,EAAOrF,YACA7J,EAAEE,iBAEb8O,EAAaC,gBAAkBC,EAAOxF,UAAUwJ,aAAa7C,GAIjE,OAFArB,EAAauC,SAAS,iBACtBvC,EAAaqC,aAAarR,GACnBA,EAAEE,qBAuDb8O,EAAaE,OAAOC,kBAAkB,kBAAmB,SAASnP,GAC9D,IAAI/W,EAAS+W,EAAEoN,SAASnkB,QAAU+W,EAAEoN,SAASsJ,WAC7C,GAAIpP,EAAIrW,YAAYhI,EAAQ,mBACxB,OAAO2sB,IAEPR,GAAqBpG,EAAaoH,sBAClCC,EAAYrW,GAEhBmV,EAAanV,EACTkV,IAEJA,EAAiB9R,WAAW,WACxB8R,EAAiB,KACbC,IAAenG,EAAa2H,eAC5BlB,IAEAG,KACL,OAGPlW,EAAMN,YAAY8P,EAAOtC,SAASgK,QAAS,WAAY,SAAS5W,GAC5DmV,EAAa,KACRC,IAAqBF,IAG1BA,EAAiB9R,WAAW,WACxB8R,EAAiB,KACjBU,KACD,OAGP1G,EAAOrD,GAAG,gBAAiB+J,GAG/B,SAASJ,EAAc7gB,GACnBsf,EAAQ7uB,KAAKxB,KAAM+Q,GAGvBiB,EAAIR,SAASogB,EAAevB,GAE5B,WACIrwB,KAAK6wB,YAAc,SAAS/sB,EAAGgqB,GAC3B,IAAImF,EAAchzB,OAAOizB,YAAcloB,SAASkC,gBAAgB+B,YAC5DkkB,EAAelzB,OAAOmzB,aAAepoB,SAASkC,gBAAgBiC,aAC9DG,EAAQtP,KAAKmxB,WACb3hB,EAASxP,KAAKixB,YAClBntB,GAAK,GACLgqB,GAAK,GACDhqB,EAAIwL,EAAQ2jB,IACZnvB,GAAMA,EAAIwL,EAAS2jB,GAEnBnF,EAAIte,EAAS2jB,IACbrF,GAAK,GAAKte,GAEd6gB,EAAQ/uB,UAAUuvB,YAAYrvB,KAAKxB,KAAM8D,EAAGgqB,KAGjDtsB,KAAKowB,EAActwB,WAItBqB,EAAQ0uB,cAAgBA,IAIxBhuB,IAAIlD,OAAO,wBAAwB,CAAC,UAAU,UAAU,SAAS,gBAAgB,qBAAsB,SAAS0B,EAAUc,EAASvC,GACnI,aAEA,IAAI0b,EAAQja,EAAS,gBACjBwZ,EAAYxZ,EAAS,oBACrBwxB,EAAa1wB,EAAQ0wB,WAAa,SAAS7J,EAAU8B,GACrDtrB,KAAKwpB,SAAWA,EAChBxpB,KAAKsrB,OAASA,EAEdtrB,KAAK8D,EAAI9D,KAAKyd,QAAU+L,EAAS/L,QACjCzd,KAAK8tB,EAAI9tB,KAAK0d,QAAU8L,EAAS9L,QAEjC1d,KAAKqyB,KAAO,KACZryB,KAAKszB,aAAe,KAEpBtzB,KAAKuzB,oBAAqB,EAC1BvzB,KAAKqgB,kBAAmB,IAG5B,WAEIrgB,KAAKqc,gBAAkB,WACnBP,EAAMO,gBAAgBrc,KAAKwpB,UAC3BxpB,KAAKuzB,oBAAqB,GAG9BvzB,KAAKsc,eAAiB,WAClBR,EAAMQ,eAAetc,KAAKwpB,UAC1BxpB,KAAKqgB,kBAAmB,GAG5BrgB,KAAKowB,KAAO,WACRpwB,KAAKqc,kBACLrc,KAAKsc,kBAETtc,KAAK+sB,oBAAsB,WACvB,OAAI/sB,KAAKqyB,KACEryB,KAAKqyB,MAEhBryB,KAAKqyB,KAAOryB,KAAKsrB,OAAOtC,SAAS6E,wBAAwB7tB,KAAKyd,QAASzd,KAAK0d,SACrE1d,KAAKqyB,OAEhBryB,KAAK8sB,YAAc,WACf,GAA0B,OAAtB9sB,KAAKszB,aACL,OAAOtzB,KAAKszB,aAEhB,IAAIhI,EAAStrB,KAAKsrB,OAGd2B,EAAiB3B,EAAO4B,oBAC5B,GAAID,EAAezH,UACfxlB,KAAKszB,cAAe,MACnB,CACD,IAAItsB,EAAMhH,KAAK+sB,sBACf/sB,KAAKszB,aAAerG,EAAeoC,SAASroB,EAAIylB,IAAKzlB,EAAI2lB,QAG7D,OAAO3sB,KAAKszB,cAEhBtzB,KAAKwc,UAAY,WACb,OAAOV,EAAMU,UAAUxc,KAAKwpB,WAEhCxpB,KAAK+tB,YAAc,WACf,OAAO/tB,KAAKwpB,SAAS7M,UAGzB3c,KAAKuvB,YAAclU,EAAU3B,MACvB,WAAa,OAAO1Z,KAAKwpB,SAAS5J,SAClC,WAAa,OAAO5f,KAAKwpB,SAAS/M,WAEzCjb,KAAK6xB,EAAW/xB,aAInB+B,IAAIlD,OAAO,6BAA6B,CAAC,UAAU,UAAU,SAAS,cAAc,gBAAgB,qBAAsB,SAAS0B,EAAUc,EAASvC,GACtJ,aAEA,IAAIsjB,EAAM7hB,EAAS,cACfia,EAAQja,EAAS,gBACjBwZ,EAAYxZ,EAAS,oBAErB2xB,EAAmB,IACnBC,EAAsB,IACtBC,EAA2B,EAE/B,SAASC,EAAgBvI,GAErB,IAAIE,EAASF,EAAaE,OAEtBsI,EAAalQ,EAAIzY,cAAc,OACnC2oB,EAAWC,IAAM,6EACbxY,EAAUT,UACVgZ,EAAWtlB,MAAMD,QAAU,kFAE/B,IAAI1L,EAAU,CAAC,WAAY,cAAe,YAAa,eAAgB,eAEtEA,EAAQuF,QAAQ,SAASpE,GACrBsnB,EAAatnB,GAAK9D,KAAK8D,IACzB9D,MACHsrB,EAAO3P,iBAAiB,YAAa3b,KAAKwrB,YAAYrmB,KAAKimB,IAG3D,IACI0I,EAAqBhwB,EAAGgqB,EACxBiG,EAASrL,EACTsL,EACAC,EACAC,EACAC,EACAC,EACAC,EARAC,EAAchJ,EAAO1B,UAGT2K,EAAU,EA8H1B,SAASjG,EAAqB9B,EAAQgI,GAClC,IAAIpoB,EAAMD,KAAKC,MACXqoB,GAAaD,GAAchI,EAAOC,KAAO+H,EAAW/H,IACpDiI,GAAaF,GAAchI,EAAOG,QAAU6H,EAAW7H,OAC3D,IAAKyH,GAAmBK,GAAaC,EACjCpJ,EAAO8B,iBAAmB,EAC1B9B,EAAOqJ,qBAAqBnI,GAC5BlB,EAAO8B,iBAAmB,EAC1BgH,EAAkBhoB,EAClBioB,EAA0B,CAACvwB,EAAGA,EAAGgqB,EAAGA,OACjC,CACH,IAAImB,EAAWhD,EAAaoI,EAAwBvwB,EAAGuwB,EAAwBvG,EAAGhqB,EAAGgqB,GACjFmB,EAAWyE,EACXU,EAAkB,KACXhoB,EAAMgoB,GAAmBX,IAChCnI,EAAOtC,SAASsF,uBAChB8F,EAAkB,OAK9B,SAASQ,EAAWpI,EAAQgI,GACxB,IAAIpoB,EAAMD,KAAKC,MACXyoB,EAAavJ,EAAOtC,SAAS8L,YAAYD,WACzCE,EAAiBzJ,EAAOtC,SAAS8L,YAAYC,eAC7CC,EAAa1J,EAAOtC,SAASqB,SAASR,wBACtCoL,EAAU,CACXnxB,EAAG,CACC8L,KAAM9L,EAAIkxB,EAAWplB,KACrBgb,MAAOoK,EAAWpK,MAAQ9mB,GAE9BgqB,EAAG,CACChE,IAAKgE,EAAIkH,EAAWlL,IACpBI,OAAQ8K,EAAW9K,OAAS4D,IAG/BoH,EAAiBhuB,KAAKM,IAAIytB,EAAQnxB,EAAE8L,KAAMqlB,EAAQnxB,EAAE8mB,OACpDuK,EAAiBjuB,KAAKM,IAAIytB,EAAQnH,EAAEhE,IAAKmL,EAAQnH,EAAE5D,QACnDkL,EAAe,CAAC3I,IAAKD,EAAOC,IAAKE,OAAQH,EAAOG,QAChDuI,EAAiBH,GAAkB,IACnCK,EAAazI,QAAWsI,EAAQnxB,EAAE8L,KAAOqlB,EAAQnxB,EAAE8mB,OAAS,EAAI,GAEhEuK,EAAiBN,GAAc,IAC/BO,EAAa3I,KAAQwI,EAAQnH,EAAEhE,IAAMmL,EAAQnH,EAAE5D,QAAU,EAAI,GAEjE,IAAImL,EAAU7I,EAAOC,KAAO2I,EAAa3I,IACrC6I,EAAU9I,EAAOG,QAAUyI,EAAazI,OACxC8H,GAAaD,GAAchI,EAAOC,KAAO+H,EAAW/H,IACpD4I,GAAYC,IAAYb,EACnBN,EAEI/nB,EAAM+nB,GAAuBX,GAClClI,EAAOtC,SAASsF,qBAAqB8G,GAFrCjB,EAAsB/nB,EAI1B+nB,EAAsB,KAI9B,SAASoB,IACL,IAAIf,EAAaR,EACjBA,EAAa1I,EAAOtC,SAAS6E,wBAAwB/pB,EAAGgqB,GACxDQ,EAAqB0F,EAAYQ,GACjCI,EAAWZ,EAAYQ,GAG3B,SAASgB,IACL9M,EAAQ4C,EAAOxF,UAAU2P,kBACzB3B,EAAsBxI,EAAOxD,QAAQ4N,UAAUhN,EAAO,gBAAiB4C,EAAOqK,qBAC9ErK,EAAOlD,iBACHkD,EAAOvG,aACPuG,EAAOtC,SAAS4M,aAAaC,aAAY,GAC7CC,cAAc/B,GACdwB,IACAxB,EAAUgC,YAAYR,EAAgB,IACtChB,EAAU,EACVzY,EAAMN,YAAYxQ,SAAU,YAAagrB,GAG7C,SAASC,IACLH,cAAc/B,GACdzI,EAAOxD,QAAQoO,aAAapC,GAC5BA,EAAsB,KACtBxI,EAAO8B,iBAAmB,EAC1B9B,EAAOxF,UAAUqQ,kBAAkBzN,GACnC4C,EAAO8B,iBAAmB,EACtB9B,EAAOvG,cAAgBmP,GACvB5I,EAAOtC,SAAS4M,aAAaC,aAAavK,EAAO8K,eACrD1N,EAAQ,KACRsL,EAAa,KACbO,EAAU,EACVJ,EAAsB,KACtBC,EAAkB,KAClBtY,EAAME,eAAehR,SAAU,YAAagrB,GAnNhDh2B,KAAKq2B,YAAc,SAASja,GACxB,GAAIpc,KAAKs2B,aAAehC,EAAYiC,UAAW,CAC3C,IAAIjuB,EAAOtI,KAKX,OAJAwf,WAAW,WACPlX,EAAKolB,cACLplB,EAAKmlB,aAAarR,IACnB,GACIA,EAAEE,iBAEboM,EAAQ4C,EAAO4B,oBAEf,IAAIsJ,EAAepa,EAAEoa,aACrBA,EAAaC,cAAgBnL,EAAO8K,cAAgB,OAAS,WACzD/a,EAAUT,UACV0Q,EAAO1B,UAAUrb,YAAYqlB,GAC7BA,EAAWrjB,UAAY,GAE3BimB,EAAaE,cAAgBF,EAAaE,aAAa9C,EAAY,EAAG,GAClEvY,EAAUT,SACV0Q,EAAO1B,UAAU1Z,YAAY0jB,GAEjC4C,EAAaG,YACbH,EAAavP,QAAQ,OAAQqE,EAAOxD,QAAQ8O,gBAE5C1C,GAAa,EACbl0B,KAAK2tB,SAAS,SAGlB3tB,KAAK62B,UAAY,SAASza,GAItB,GAHAkY,EAAYiC,WAAY,EACxBrC,GAAa,EACbl0B,KAAK2tB,SAAS,OACTrC,EAAO8K,cAAe,CACvB,IAAIU,EAAa1a,EAAEoa,aAAaM,WAC3B7C,GAA+B,QAAd6C,GAClBxL,EAAOxD,QAAQvgB,OAAO+jB,EAAO4B,qBACjC5B,EAAOtC,SAAS4M,aAAaC,aAAY,GAE7C71B,KAAKsrB,OAAOwD,WAAW,gBACvB9uB,KAAKsrB,OAAOtC,SAAS+N,eAAe,KAGxC/2B,KAAKg3B,YAAc,SAAS5a,GACxB,IAAIkP,EAAO8K,eAAkBa,EAAU7a,EAAEoa,cAQzC,OANA1yB,EAAIsY,EAAEqB,QACNqQ,EAAI1R,EAAEsB,QACDoW,GACD0B,IACJjB,IACAnY,EAAEoa,aAAaM,WAAa7C,EAAgBiD,EAAc9a,GACnDN,EAAMQ,eAAeF,IAGhCpc,KAAKm3B,WAAa,SAAS/a,GACvB,IAAIkP,EAAO8K,eAAkBa,EAAU7a,EAAEoa,cAYzC,OAVA1yB,EAAIsY,EAAEqB,QACNqQ,EAAI1R,EAAEsB,QACDoW,IACD0B,IACAjB,KAEqB,OAArB6C,IACAA,EAAmB,MAEvBhb,EAAEoa,aAAaM,WAAa7C,EAAgBiD,EAAc9a,GACnDN,EAAMQ,eAAeF,IAGhCpc,KAAKq3B,YAAc,SAASjb,GAExB,GADAmY,IACIA,GAAW,GAAKT,EAGhB,OAFAmC,IACAhC,EAAgB,KACTnY,EAAMQ,eAAeF,IAIpCpc,KAAKs3B,OAAS,SAASlb,GACnB,GAAK4X,EAAL,CAEA,IAAIwC,EAAepa,EAAEoa,aACrB,GAAItC,EACA,OAAQD,GACJ,IAAK,OAEGvL,EADAA,EAAM2G,SAAS2E,EAAWvH,IAAKuH,EAAWrH,QAClC,CACJ7lB,MAAOktB,EACPnJ,IAAKmJ,GAGD1I,EAAOiM,SAAS7O,EAAOsL,GAEnC,MACJ,IAAK,OACDtL,EAAQ4C,EAAOiM,SAAS7O,EAAOsL,GAAY,GAC3C,UAEL,CACH,IAAIwD,EAAWhB,EAAatP,QAAQ,QACpCwB,EAAQ,CACJ5hB,MAAOktB,EACPnJ,IAAKS,EAAOxD,QAAQzgB,OAAO2sB,EAAYwD,IAE3ClM,EAAOlG,QACP6O,EAAgB,KAGpB,OADAgC,IACOna,EAAMQ,eAAeF,KAGhCN,EAAMN,YAAY8Y,EAAa,YAAat0B,KAAKq2B,YAAYlxB,KAAKimB,IAClEtP,EAAMN,YAAY8Y,EAAa,UAAWt0B,KAAK62B,UAAU1xB,KAAKimB,IAC9DtP,EAAMN,YAAY8Y,EAAa,YAAat0B,KAAKg3B,YAAY7xB,KAAKimB,IAClEtP,EAAMN,YAAY8Y,EAAa,WAAYt0B,KAAKm3B,WAAWhyB,KAAKimB,IAChEtP,EAAMN,YAAY8Y,EAAa,YAAat0B,KAAKq3B,YAAYlyB,KAAKimB,IAClEtP,EAAMN,YAAY8Y,EAAa,OAAQt0B,KAAKs3B,OAAOnyB,KAAKimB,IAgGxD,IAAIgM,EAAmB,KACvB,SAASpB,IACmB,MAApBoB,IACAA,EAAmB5X,WAAW,WACF,MAApB4X,GAA4BtD,GAC5BmC,KACL,KAIX,SAASgB,EAAUT,GACf,IAAIiB,EAAQjB,EAAaiB,MACzB,OAAQA,GAAShzB,MAAMnD,UAAUsH,KAAKpH,KAAKi2B,EAAO,SAAS/b,GACvD,MAAe,cAARA,GAAgC,QAARA,IAIvC,SAASwb,EAAc9a,GACnB,IAAIsb,EAAc,CAAC,OAAQ,WAAY,MAAO,iBAC1CC,EAAc,CAAC,OAAQ,WAAY,WAAY,MAAO,iBAEtDC,EAAoBvc,EAAU3B,MAAQ0C,EAAEM,OAASN,EAAEK,QACnDga,EAAgB,gBACpB,IACIA,EAAgBra,EAAEoa,aAAaC,cAAc/d,cAC/C,MAAO0D,IACT,IAAI0a,EAAa,OASjB,OAPIc,GAAqBF,EAAYx1B,QAAQu0B,IAAkB,EAC3DK,EAAa,OACRa,EAAYz1B,QAAQu0B,IAAkB,EAC3CK,EAAa,OACRY,EAAYx1B,QAAQu0B,IAAkB,IAC3CK,EAAa,QAEVA,GAwFf,SAAS7K,EAAaC,EAAIC,EAAIC,EAAIC,GAC9B,OAAOnlB,KAAKolB,KAAKplB,KAAK8R,IAAIoT,EAAKF,EAAI,GAAKhlB,KAAK8R,IAAIqT,EAAKF,EAAI,KArF9D,WAEInsB,KAAK63B,SAAW,WACZ,IAAIC,EAAW3rB,KAAKC,MAAQpM,KAAKgtB,eAAeM,KAC5CwK,EAAW93B,KAAKsrB,OAAOyM,gBACvB/3B,KAAKg4B,aAGbh4B,KAAKi4B,YAAc,WACf,IAAI5yB,EAASrF,KAAKsrB,OAAO1B,UACzBvkB,EAAOkxB,WAAY,EACnBv2B,KAAK0tB,YAAY1tB,KAAKgtB,eAAeD,uBACrC/sB,KAAK0uB,aAGT1uB,KAAKk4B,aAAe,SAAS9b,GACzBpc,KAAKsrB,OAAOtC,SAAS4M,aAAaC,aAAa71B,KAAKsrB,OAAO8K,eAC3Dp2B,KAAKsrB,OAAOwD,WAAW,gBACvB9uB,KAAKsrB,OAAOtC,SAAS+N,eAAe,IACpC/2B,KAAKi4B,eAGTj4B,KAAKg4B,UAAY,WACbh4B,KAAKs2B,YAAa,EAClB,IAAIhL,EAAStrB,KAAKsrB,OACdjmB,EAASimB,EAAO1B,UACpBvkB,EAAOkxB,WAAY,EACnBjL,EAAOtC,SAAS4M,aAAaC,aAAY,GACzCvK,EAAO4C,SAAS,gBAChB,IAAIiK,EAAc9c,EAAUpB,MAAQ,UAAY,OAChDqR,EAAOtC,SAAS+N,eAAeoB,GAC/Bn4B,KAAK2tB,SAAS,cAGlB3tB,KAAKo4B,YAAc,SAAShc,GACxB,IAAI/W,EAASrF,KAAKsrB,OAAO1B,UACzB,GAAIvO,EAAUnB,MAAsB,aAAdla,KAAKq4B,MAAsB,CAC7C,IAAIpJ,EAAWhD,EAAajsB,KAAKgtB,eAAelpB,EAAG9D,KAAKgtB,eAAec,EAAG9tB,KAAK8D,EAAG9D,KAAK8tB,GACnFmB,EAAW,GACX5pB,EAAOizB,WAEf,GAAmB,aAAft4B,KAAKq4B,MAAsB,CACvBpJ,EAAWhD,EAAajsB,KAAKgtB,eAAelpB,EAAG9D,KAAKgtB,eAAec,EAAG9tB,KAAK8D,EAAG9D,KAAK8tB,GACnFmB,EAAW,IACX5pB,EAAOkxB,WAAY,EACnBv2B,KAAK0tB,YAAY1tB,KAAKgtB,eAAeD,0BAKjD/sB,KAAKwrB,YAAc,SAASpP,GACxB,GAAKpc,KAAKu4B,aAAV,CAEAv4B,KAAKgtB,eAAiB5Q,EACtB,IAAIkP,EAAStrB,KAAKsrB,OAEdwB,EAAc1Q,EAAE0Q,cAChBlQ,EAASR,EAAEI,YACXgc,EAAapc,EAAEoN,SAAS9K,QAAU,EACtC,GAAmB,IAAf8Z,GAA+B,IAAX5b,GAAgBkQ,EAAa,CACjD,GAAI1Q,EAAEkP,OAAOkC,oBAAsBpR,EAAEmT,eAAiBnT,EAAE2R,eACpD,OACJ/tB,KAAKgtB,eAAeM,KAAOnhB,KAAKC,MAChC,IAAIqsB,EAAcrc,EAAEoN,SAASnkB,QAAU+W,EAAEoN,SAASsJ,WAGlD,GAFI,iBAAkB2F,IAClBA,EAAYC,aAAe,MAC3BpN,EAAOyM,eAAgB,CACvB,GAAI1c,EAAUP,SAAU,CACpB9a,KAAKs2B,YAAa,EAClB,IAAIhC,EAAchJ,EAAO1B,UACzB0K,EAAYiC,WAAY,EAE5Bv2B,KAAK2tB,SAAS,iBAEd3tB,KAAKg4B,YAETh4B,KAAKytB,aAAarR,EAAGpc,KAAKo4B,YAAYjzB,KAAKnF,OAC3Coc,EAAEiE,kBAAmB,OAI9B7e,KAAKmyB,EAAgBryB,WAOxBqB,EAAQgxB,gBAAkBA,IAI1BtwB,IAAIlD,OAAO,cAAc,CAAC,UAAU,UAAU,SAAS,eAAgB,SAAS0B,EAAUc,EAASvC,GACnG,aACA,IAAIsjB,EAAM7hB,EAAS,SAEnBc,EAAQmH,IAAM,SAAU6uB,EAAKz3B,GACzB,IAAI03B,EAAM,IAAIC,eACdD,EAAIE,KAAK,MAAOH,GAAK,GACrBC,EAAIG,mBAAqB,WACE,IAAnBH,EAAII,YACJ93B,EAAS03B,EAAIK,eAGrBL,EAAIM,KAAK,OAGbv2B,EAAQw2B,WAAa,SAASC,EAAMl4B,GAChC,IAAI8L,EAAO0W,EAAI5W,kBACXusB,EAAIruB,SAASC,cAAc,UAE/BouB,EAAExF,IAAMuF,EACRpsB,EAAKuB,YAAY8qB,GAEjBA,EAAEC,OAASD,EAAEN,mBAAqB,SAASQ,EAAGC,IACtCA,GAAYH,EAAEL,YAA8B,UAAhBK,EAAEL,YAA0C,YAAhBK,EAAEL,aAC1DK,EAAIA,EAAEC,OAASD,EAAEN,mBAAqB,KACjCS,GACDt4B,OAIhByB,EAAQ82B,WAAa,SAASd,GAC1B,IAAIhyB,EAAIqE,SAASC,cAAc,KAE/B,OADAtE,EAAEiI,KAAO+pB,EACFhyB,EAAEiI,QAKbvL,IAAIlD,OAAO,wBAAwB,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GAC/F,aAEA,IAAIs5B,EAAe,GACfrd,EAAkB,WAAarc,KAAKuzB,oBAAqB,GACzDjX,EAAiB,WAAatc,KAAKqgB,kBAAmB,GAE1DqZ,EAAanQ,MACbmQ,EAAaC,eAAiB,SAASC,EAAWxd,GAC9Cpc,KAAK65B,iBAAmB75B,KAAK65B,eAAiB,IAC9C75B,KAAK85B,mBAAqB95B,KAAK85B,iBAAmB,IAElD,IAAIC,EAAY/5B,KAAK65B,eAAeD,IAAc,GAC9CI,EAAiBh6B,KAAK85B,iBAAiBF,GAC3C,GAAKG,EAAUv5B,QAAWw5B,EAA1B,CAGgB,iBAAL5d,GAAkBA,IACzBA,EAAI,IAEHA,EAAEV,OACHU,EAAEV,KAAOke,GACRxd,EAAEC,kBACHD,EAAEC,gBAAkBA,GACnBD,EAAEE,iBACHF,EAAEE,eAAiBA,GAEvByd,EAAYA,EAAUx3B,QACtB,IAAK,IAAIb,EAAE,EAAGA,EAAEq4B,EAAUv5B,OAAQkB,IAE9B,GADAq4B,EAAUr4B,GAAG0a,EAAGpc,MACZoc,EAAEmX,mBACF,MAGR,OAAIyG,IAAmB5d,EAAEiE,iBACd2Z,EAAe5d,EAAGpc,WAD7B,IAKJ05B,EAAanH,QAAU,SAASqH,EAAWxd,GACvC,IAAI2d,GAAa/5B,KAAK65B,gBAAkB,IAAID,GAC5C,GAAKG,EAAL,CAEAA,EAAYA,EAAUx3B,QACtB,IAAK,IAAIb,EAAE,EAAGA,EAAEq4B,EAAUv5B,OAAQkB,IAC9Bq4B,EAAUr4B,GAAG0a,EAAGpc,QAGxB05B,EAAaO,KAAO,SAASL,EAAW14B,GACpC,IAAIsiB,EAAQxjB,KACZkB,GAAYlB,KAAK2b,iBAAiBie,EAAW,SAASM,IAClD1W,EAAMvH,oBAAoB2d,EAAWM,GACrCh5B,EAASN,MAAM,KAAML,cAK7Bm5B,EAAanO,kBAAoB,SAASqO,EAAW14B,GACjD,IAAIi5B,EAAWn6B,KAAK85B,iBAIpB,GAHKK,IACDA,EAAWn6B,KAAK85B,iBAAmB,CAACM,WAAY,KAEhDD,EAASP,GAAY,CACrB,IAAIS,EAAMF,EAASP,GACfU,EAAWH,EAASC,WAAWR,GAC9BU,IACDH,EAASC,WAAWR,GAAaU,EAAW,IAChDA,EAASx4B,KAAKu4B,GACd,IAAI34B,EAAI44B,EAASp4B,QAAQhB,IACf,GAANQ,GACA44B,EAAS7zB,OAAO/E,EAAG,GAE3By4B,EAASP,GAAa14B,GAE1Bw4B,EAAaa,qBAAuB,SAASX,EAAW14B,GACpD,IAAIi5B,EAAWn6B,KAAK85B,iBACpB,GAAKK,EAAL,CAEA,IAAIG,EAAWH,EAASC,WAAWR,GAEnC,GAAIO,EAASP,IAAc14B,EAAU,CACvBi5B,EAASP,GACfU,GACAt6B,KAAKurB,kBAAkBqO,EAAWU,EAASE,YAC5C,GAAIF,EAAU,CACjB,IAAI54B,EAAI44B,EAASp4B,QAAQhB,IACf,GAANQ,GACA44B,EAAS7zB,OAAO/E,EAAG,MAI/Bg4B,EAAazR,GACbyR,EAAa/d,iBAAmB,SAASie,EAAW14B,EAAUu5B,GAC1Dz6B,KAAK65B,eAAiB75B,KAAK65B,gBAAkB,GAE7C,IAAIE,EAAY/5B,KAAK65B,eAAeD,GAMpC,OALKG,IACDA,EAAY/5B,KAAK65B,eAAeD,GAAa,KAEb,GAAhCG,EAAU73B,QAAQhB,IAClB64B,EAAUU,EAAY,UAAY,QAAQv5B,GACvCA,GAGXw4B,EAAagB,IACbhB,EAAa1d,eACb0d,EAAazd,oBAAsB,SAAS2d,EAAW14B,GACnDlB,KAAK65B,eAAiB75B,KAAK65B,gBAAkB,GAE7C,IAAIE,EAAY/5B,KAAK65B,eAAeD,GACpC,GAAKG,EAAL,CAGA,IAAIj1B,EAAQi1B,EAAU73B,QAAQhB,IACf,IAAX4D,GACAi1B,EAAUtzB,OAAO3B,EAAO,KAGhC40B,EAAaiB,mBAAqB,SAASf,GACnC55B,KAAK65B,iBAAgB75B,KAAK65B,eAAeD,GAAa,KAG9Dj3B,EAAQ+2B,aAAeA,IAIvBr2B,IAAIlD,OAAO,qBAAqB,CAAC,UAAU,UAAU,SAAS,cAAc,yBAA0B,SAAS0B,EAAUc,EAASvC,GAGlI,IAAI4R,EAAMnQ,EAAS,SACf63B,EAAe73B,EAAS,mBAAmB63B,aAE3CkB,EAAkB,CAClBC,WAAY,SAASC,GACjBz5B,OAAO4I,KAAK6wB,GAAS5yB,QAAQ,SAAS8D,GAClChM,KAAK+6B,UAAU/uB,EAAK8uB,EAAQ9uB,KAC7BhM,OAEPg7B,WAAY,SAASC,GACjB,IAAIx1B,EAAS,GAUb,OATKw1B,EAEOx2B,MAAMoD,QAAQozB,KACtBx1B,EAASw1B,EACTA,EAAc55B,OAAO4I,KAAKxE,IAH1Bw1B,EAAc55B,OAAO4I,KAAKjK,KAAKk7B,UAKnCD,EAAY/yB,QAAQ,SAAS8D,GACzBvG,EAAOuG,GAAOhM,KAAKm7B,UAAUnvB,IAC9BhM,MACIyF,GAEXs1B,UAAW,SAASp2B,EAAM+D,GACtB,GAAI1I,KAAK,IAAM2E,KAAU+D,EAAzB,CAEA,IAAI0yB,EAAMp7B,KAAKk7B,SAASv2B,GACxB,IAAKy2B,EACD,OAAOC,EAAK,sBAAwB12B,EAAO,KAE/C,GAAIy2B,EAAIE,UACJ,OAAOt7B,KAAKo7B,EAAIE,YAAct7B,KAAKo7B,EAAIE,WAAWP,UAAUp2B,EAAM+D,GAEjE0yB,EAAIG,aACLv7B,KAAK,IAAM2E,GAAQ+D,GACnB0yB,GAAOA,EAAIrxB,KACXqxB,EAAIrxB,IAAIvI,KAAKxB,KAAM0I,KAE3ByyB,UAAW,SAASx2B,GAChB,IAAIy2B,EAAMp7B,KAAKk7B,SAASv2B,GACxB,OAAKy2B,EAGDA,EAAIE,UACGt7B,KAAKo7B,EAAIE,YAAct7B,KAAKo7B,EAAIE,WAAWH,UAAUx2B,GACzDy2B,GAAOA,EAAItxB,IAAMsxB,EAAItxB,IAAItI,KAAKxB,MAAQA,KAAK,IAAM2E,GAJ7C02B,EAAK,sBAAwB12B,EAAO,OAQvD,SAAS02B,EAAKG,GACY,oBAAX36B,SAA0BA,QAAQw6B,MACzCx6B,QAAQw6B,KAAKz6B,MAAMC,QAASN,WAGpC,SAASk7B,EAAYC,EAAKza,GACtB,IAAI7E,EAAI,IAAIuf,MAAMD,GAClBtf,EAAE6E,KAAOA,EACa,iBAAXpgB,SAAuBA,QAAQC,OACtCD,QAAQC,MAAMsb,GAClBoD,WAAW,WAAa,MAAMpD,IAGlC,IAAIwf,EAAY,WACZ57B,KAAK67B,gBAAkB,KAG3B,WACI7pB,EAAIF,UAAU9R,KAAM05B,GACpB15B,KAAK87B,cAAgB,SAASh0B,EAAKsxB,EAAM2C,GAgBrC,OAfKj0B,EAAIozB,WACLl7B,KAAK67B,gBAAgBzC,GAAQtxB,EAAIozB,SAAW,IAEhD75B,OAAO4I,KAAK8xB,GAAS7zB,QAAQ,SAAS8D,GAClC,IAAIovB,EAAMW,EAAQ/vB,GACA,iBAAPovB,IACPA,EAAM,CAACE,UAAWF,IAEtBA,EAAIz2B,OAASy2B,EAAIz2B,KAAOqH,GACxBlE,EAAIozB,SAASE,EAAIz2B,MAAQy2B,EACrB,iBAAkBA,IAClBtzB,EAAI,IAAMszB,EAAIz2B,MAAQy2B,EAAIY,gBAElChqB,EAAIF,UAAUhK,EAAK8yB,GAEZ56B,MAGXA,KAAKi8B,aAAe,SAASn0B,GACzBzG,OAAO4I,KAAKnC,EAAIozB,UAAUhzB,QAAQ,SAAS8D,GACvC,IAAIovB,EAAMtzB,EAAIozB,SAASlvB,GACnB,UAAWovB,GACXtzB,EAAIizB,UAAU/uB,EAAKovB,EAAI1yB,UAInC1I,KAAKk8B,gBAAkB,SAAS9C,EAAMz0B,EAAM+D,GACxC,IAAIyzB,EAAOn8B,KAAK67B,gBAAgBzC,KAAUp5B,KAAK67B,gBAAgBzC,GAAQ,IACnE+C,EAAKx3B,KACDw3B,EAAKb,UACLt7B,KAAKk8B,gBAAgBC,EAAKb,UAAW32B,EAAM+D,GAE3CyzB,EAAKx3B,GAAM+D,MAAQA,IAI/B1I,KAAKo8B,iBAAmB,SAAShD,EAAMiD,GACnCh7B,OAAO4I,KAAKoyB,GAAYn0B,QAAQ,SAAS8D,GACrChM,KAAKk8B,gBAAgB9C,EAAMptB,EAAKqwB,EAAWrwB,KAC5ChM,OAGPA,KAAKq7B,KAAOA,EACZr7B,KAAKy7B,YAAcA,IAEpBj6B,KAAKo6B,EAAUt6B,WAElBqB,EAAQi5B,UAAYA,IAIpBv4B,IAAIlD,OAAO,aAAa,CAAC,UAAU,UAAU,SAAS,eAAe,cAAc,cAAc,sBAAuB,SAAS0B,EAAUc,EAASvC,GAGpJ,IAAIujB,EAAO9hB,EAAS,cAEhBy6B,GADMz6B,EAAS,aACTA,EAAS,cACf+5B,EAAY/5B,EAAS,oBAAoB+5B,UAE7Cx7B,EAAOuC,QAAUA,EAAU,IAAIi5B,EAE/B,IAAI77B,EAAS,WACT,OAAOC,MAAyB,oBAAVC,QAAyBA,OADtC,GAIT87B,EAAU,CACVh5B,UAAU,EACVw5B,WAAY,KACZC,SAAU,KACVC,UAAW,KACXC,SAAU,GACVC,OAAQ,MACRC,YAAa,IAuFN,SAASC,EAAK95B,GAErB,GAAKhD,GAAWA,EAAOiL,SAAvB,CAGA+wB,EAAQh5B,SAAWA,GAAYlB,EAASkB,UAAY3C,EAAO2C,UAAahD,EAAOI,QAAU,UAAO4C,SAQhG,IANA,IAAI+5B,EAAgB,GAChBC,EAAY,GACZC,EAAiBhyB,SAASgyB,eAAiBhyB,SAASiyB,eACpDC,EAAkBF,GAAiBA,EAAcG,eAAiBnyB,SAElEoyB,EAAUF,EAAgBjwB,qBAAqB,UAC1CvL,EAAE,EAAGA,EAAE07B,EAAQ58B,OAAQkB,IAAK,CACjC,IAAI27B,EAASD,EAAQ17B,GAEjBmyB,EAAMwJ,EAAOxJ,KAAOwJ,EAAOC,aAAa,OAC5C,GAAKzJ,EAAL,CAIA,IADA,IAAI0J,EAAaF,EAAOE,WACfC,EAAE,EAAG77B,EAAE47B,EAAW/8B,OAAQg9B,EAAI77B,EAAG67B,IAAK,CAC3C,IAAIC,EAAOF,EAAWC,GACiB,IAAnCC,EAAK94B,KAAKzC,QAAQ,eAClB46B,EAAcY,EAAYD,EAAK94B,KAAKjC,QAAQ,aAAc,MAAQ+6B,EAAK/0B,OAI/E,IAAIi1B,EAAI9J,EAAInwB,MAAM,gCACdi6B,IACAZ,EAAYY,EAAE,KActB,IAAK,IAAI3xB,KAXL+wB,IACAD,EAAcx6B,KAAOw6B,EAAcx6B,MAAQy6B,EAC3CD,EAAc/5B,UAAW,GAG7B+5B,EAAcJ,SAAWI,EAAcx6B,KACvCw6B,EAAcP,WAAaO,EAAcP,YAAcO,EAAcx6B,KACrEw6B,EAAcN,SAAWM,EAAcN,UAAYM,EAAcx6B,KACjEw6B,EAAcL,UAAYK,EAAcL,WAAaK,EAAcx6B,YAC5Dw6B,EAAcx6B,KAELw6B,EACsB,qBAAvBA,EAAc9wB,IACrBrJ,EAAQoH,IAAIiC,EAAK8wB,EAAc9wB,KAK3C,SAAS0xB,EAAYh5B,GACjB,OAAOA,EAAIhC,QAAQ,QAAS,SAASi7B,EAAGC,GAAM,OAAOA,EAAGC,gBAxI5Dl7B,EAAQmH,IAAM,SAASkC,GACnB,IAAK+vB,EAAQ31B,eAAe4F,GACxB,MAAM,IAAI2vB,MAAM,uBAAyB3vB,GAE7C,OAAO+vB,EAAQ/vB,IAGnBrJ,EAAQoH,IAAM,SAASiC,EAAKtD,GACxB,IAAKqzB,EAAQ31B,eAAe4F,GACxB,MAAM,IAAI2vB,MAAM,uBAAyB3vB,GAE7C+vB,EAAQ/vB,GAAOtD,GAGnB/F,EAAQm7B,IAAM,WACV,OAAOna,EAAK3B,WAAW+Z,IAE3Bp5B,EAAQo7B,UAAY,SAASp5B,EAAMq5B,GAC/B,GAAIjC,EAAQa,YAAYj4B,GACpB,OAAOo3B,EAAQa,YAAYj4B,GAE/B,IAAIs5B,EAAQt5B,EAAKvC,MAAM,KACvB47B,EAAYA,GAAaC,EAAMA,EAAMz9B,OAAS,IAAM,GACpD,IAAI09B,EAAmB,YAAbF,EAA0B,IAAM,IACtC17B,EAAO27B,EAAMA,EAAMz9B,OAAS,GAChC,GAAiB,UAAbw9B,GAAgC,KAAPE,EAAY,CACrC,IAAIC,EAAK,IAAI36B,OAAO,IAAMw6B,EAAY,gBAAkBA,EAAY,IAAK,KACzE17B,EAAOA,EAAKI,QAAQy7B,EAAI,MAGtB77B,GAAQA,GAAQ07B,IAAcC,EAAMz9B,OAAS,IAC/C8B,EAAO27B,EAAMA,EAAMz9B,OAAS,IAChC,IAAI44B,EAAO2C,EAAQiC,EAAY,QAQ/B,OAPY,MAAR5E,EACAA,EAAO2C,EAAQW,SACD,KAAPwB,IACPF,EAAYE,EAAM,IAElB9E,GAA0B,KAAlBA,EAAK72B,OAAO,KACpB62B,GAAQ,KACLA,EAAO4E,EAAYE,EAAM57B,EAAOtC,KAAK8J,IAAI,WAGpDnH,EAAQy7B,aAAe,SAASz5B,EAAM05B,GAClC,OAAOtC,EAAQa,YAAYj4B,GAAQ05B,GAGvC17B,EAAQ27B,SAAW,GACnB37B,EAAQ47B,WAAa,SAASt8B,EAAYu8B,GACtC,IAAIp+B,EAAQq+B,EACRh6B,MAAMoD,QAAQ5F,KACdw8B,EAAax8B,EAAW,GACxBA,EAAaA,EAAW,IAG5B,IACI7B,EAASyB,EAASI,GACpB,MAAOma,IACT,GAAIhc,IAAWuC,EAAQ27B,SAASr8B,GAC5B,OAAOu8B,GAAUA,EAAOp+B,GAO5B,GALKuC,EAAQ27B,SAASr8B,KAClBU,EAAQ27B,SAASr8B,GAAc,IAEnCU,EAAQ27B,SAASr8B,GAAYH,KAAK08B,KAE9B77B,EAAQ27B,SAASr8B,GAAYzB,OAAS,GAA1C,CAGA,IAAIk+B,EAAY,WACZ78B,EAAS,CAACI,GAAa,SAAS7B,GAC5BuC,EAAQ4mB,MAAM,cAAe,CAAC5kB,KAAM1C,EAAY7B,OAAQA,IACxD,IAAI25B,EAAYp3B,EAAQ27B,SAASr8B,GACjCU,EAAQ27B,SAASr8B,GAAc,KAC/B83B,EAAU7xB,QAAQ,SAASs2B,GACvBA,GAAUA,EAAOp+B,QAK7B,IAAKuC,EAAQmH,IAAI,YACb,OAAO40B,IACXpC,EAAInD,WAAWx2B,EAAQo7B,UAAU97B,EAAYw8B,GAAaC,KAE9D7B,GAAK,GAiDLl6B,EAAQk6B,KAAOA,IAQfx5B,IAAIlD,OAAO,0BAA0B,CAAC,UAAU,UAAU,SAAS,gBAAgB,oBAAoB,6BAA6B,mCAAmC,wBAAwB,6BAA6B,cAAe,SAAS0B,EAAUc,EAASvC,GACvQ,aAEA,IAAI0b,EAAQja,EAAS,gBACjBwZ,EAAYxZ,EAAS,oBACrBspB,EAAkBtpB,EAAS,sBAAsBspB,gBACjDwT,EAAuB98B,EAAS,4BAA4BwvB,cAC5DgC,EAAaxxB,EAAS,iBAAiBwxB,WACvCM,EAAkB9xB,EAAS,sBAAsB8xB,gBACjDiL,EAAS/8B,EAAS,aAElBg9B,EAAe,SAASvT,GACxB,IAAI9H,EAAQxjB,KACZA,KAAKsrB,OAASA,EAEd,IAAIH,EAAgBnrB,MACpB,IAAI2+B,EAAqB3+B,MACzB,IAAI2zB,EAAgB3zB,MAEpB,IAAI8+B,EAAc,SAAS1iB,GACvB,IAAI2iB,GAAiB/zB,SAASg0B,WAAah0B,SAASg0B,aAC5C1T,EAAOvG,aAAe/Z,SAASga,gBAAkBsG,EAAOlB,WAAakB,EAAOlB,UAAUjB,cAC1F4V,GACA9+B,OAAOmlB,QACXkG,EAAOlG,SAGPkP,EAAchJ,EAAOtC,SAASiW,sBAClCnjB,EAAMN,YAAY8Y,EAAa,QAASt0B,KAAKk/B,aAAa/5B,KAAKnF,KAAM,UACrE8b,EAAMN,YAAY8Y,EAAa,YAAat0B,KAAKg2B,YAAY7wB,KAAKnF,KAAM,cACxE8b,EAAM6C,0BAA0B,CAC5B2V,EACAhJ,EAAOtC,SAASmW,YAAc7T,EAAOtC,SAASmW,WAAW9vB,MACzDic,EAAOtC,SAASoW,YAAc9T,EAAOtC,SAASoW,WAAW/vB,MACzDic,EAAOlB,WAAakB,EAAOlB,UAAUjB,cACvC1gB,OAAO42B,SAAU,CAAC,IAAK,IAAK,KAAMr/B,KAAM,gBAC1C8b,EAAM+B,sBAAsByN,EAAO1B,UAAW5pB,KAAK4rB,aAAazmB,KAAKnF,KAAM,eAC3E8b,EAAMsB,qBAAqBkO,EAAO1B,UAAW5pB,KAAK6rB,YAAY1mB,KAAKnF,KAAM,cAEzE,IAAIs/B,EAAWhU,EAAOtC,SAASgK,QAC/BlX,EAAMN,YAAY8jB,EAAU,YAAat/B,KAAKk/B,aAAa/5B,KAAKnF,KAAM,oBACtE8b,EAAMN,YAAY8jB,EAAU,QAASt/B,KAAKk/B,aAAa/5B,KAAKnF,KAAM,gBAClE8b,EAAMN,YAAY8jB,EAAU,WAAYt/B,KAAKk/B,aAAa/5B,KAAKnF,KAAM,mBACrE8b,EAAMN,YAAY8jB,EAAU,YAAat/B,KAAKk/B,aAAa/5B,KAAKnF,KAAM,oBAEtE8b,EAAMN,YAAY8Y,EAAa,YAAawK,GAC5ChjB,EAAMN,YAAY8jB,EAAU,YAAaR,GACrCzjB,EAAUnB,MAAQoR,EAAOtC,SAASmW,aAClCrjB,EAAMN,YAAY8P,EAAOtC,SAASmW,WAAWrwB,QAAS,YAAagwB,GACnEhjB,EAAMN,YAAY8P,EAAOtC,SAASoW,WAAWtwB,QAAS,YAAagwB,IAGvExT,EAAOrD,GAAG,YAAa,SAAS7L,GAC5B,IAAIoH,EAAM6U,QAAS7U,EAAM+b,YAAe/b,EAAM+U,aAA9C,CAGA,IAAIiH,EAAYlU,EAAOtC,SAAS6E,wBAAwBzR,EAAEtY,EAAGsY,EAAE0R,GAC3DpF,EAAQ4C,EAAOxD,QAAQhC,UAAU2C,WACjCO,EAAWsC,EAAOtC,UAEjBN,EAAMlD,WAAakD,EAAM+W,YAAYD,EAAU/S,IAAK+S,EAAU7S,QAC/D3D,EAAS+N,eAAe,WAExB/N,EAAS+N,eAAe,SAKpC,WACI/2B,KAAKk/B,aAAe,SAASv6B,EAAMyX,GAC/Bpc,KAAKsrB,OAAO/B,MAAM5kB,EAAM,IAAI0uB,EAAWjX,EAAGpc,KAAKsrB,UAGnDtrB,KAAKg2B,YAAc,SAASrxB,EAAMyX,GAC9B,IAAI2d,EAAY/5B,KAAKsrB,OAAOuO,gBAAkB75B,KAAKsrB,OAAOuO,eAAe6F,UACpE3F,GAAcA,EAAUv5B,QAG7BR,KAAKsrB,OAAO/B,MAAM5kB,EAAM,IAAI0uB,EAAWjX,EAAGpc,KAAKsrB,UAGnDtrB,KAAK4rB,aAAe,SAASjnB,EAAMyX,GAC/B,IAAImV,EAAa,IAAI8B,EAAWjX,EAAGpc,KAAKsrB,QACxCiG,EAAWtB,MAA4B,EAApBjwB,KAAK2/B,aACxBpO,EAAW5T,OAASvB,EAAEuB,OACtB4T,EAAW3T,OAASxB,EAAEwB,OAEtB5d,KAAKsrB,OAAO/B,MAAM5kB,EAAM4sB,IAG5BvxB,KAAK6rB,YAAc,SAAUlnB,EAAMyX,GAC/B,IAAImV,EAAa,IAAI8B,EAAWjX,EAAGpc,KAAKsrB,QACxCiG,EAAWtB,MAAQ,EACnBsB,EAAW5T,OAASvB,EAAEuB,OACtB4T,EAAW3T,OAASxB,EAAEwB,OACtB5d,KAAKsrB,OAAO/B,MAAM5kB,EAAM4sB,IAG5BvxB,KAAK2tB,SAAW,SAAS0K,GACrBr4B,KAAKq4B,MAAQA,GAGjBr4B,KAAKytB,aAAe,SAASZ,EAAI+S,GAC7B5/B,KAAK8D,EAAI+oB,EAAG/oB,EACZ9D,KAAK8tB,EAAIjB,EAAGiB,EAEZ9tB,KAAK+yB,gBAAiB,EACtB,IAAI/J,EAAWhpB,KAAKsrB,OAAOtC,SACvBA,EAASC,wBACTD,EAASC,sBAAwB,MAErC,IAAI3gB,EAAOtI,KACPg2B,EAAc,SAAS5Z,GACvB,GAAKA,EAAL,CACA,GAAIf,EAAUP,WAAasB,EAAEyjB,OAASv3B,EAAKw3B,aACvC,OAAOx3B,EAAKw3B,eAEhBx3B,EAAKxE,EAAIsY,EAAEqB,QACXnV,EAAKwlB,EAAI1R,EAAEsB,QACXkiB,GAAoBA,EAAiBxjB,GACrC9T,EAAKipB,WAAa,IAAI8B,EAAWjX,EAAG9T,EAAKgjB,QACzChjB,EAAKy3B,aAAc,IAGnBC,EAAe,SAAS5jB,GACxB0Z,cAAc/B,GACdkM,IACA33B,EAAKA,EAAK+vB,MAAQ,QAAU/vB,EAAKA,EAAK+vB,MAAQ,OAAOjc,GACrD9T,EAAK+vB,MAAQ,GACyB,MAAlCrP,EAASC,wBACTD,EAASC,uBAAwB,EACjCD,EAASE,yBAEb5gB,EAAKyqB,gBAAiB,EACtBzqB,EAAK43B,oBAAsB53B,EAAKw3B,aAAe,KAC/C1jB,GAAK9T,EAAK42B,aAAa,UAAW9iB,IAGlC6jB,EAAoB,WACpB33B,EAAKA,EAAK+vB,QAAU/vB,EAAKA,EAAK+vB,SAC9B/vB,EAAKy3B,aAAc,GAGvB,GAAI1kB,EAAUhB,SAA+B,YAApBwS,EAAGrD,SAAS9N,KACjC,OAAO8D,WAAW,WAAYwgB,EAAanT,KAG/CvkB,EAAK43B,oBAAsBlK,EAC3B1tB,EAAKw3B,aAAehkB,EAAMkB,QAAQhd,KAAKsrB,OAAO1B,UAAWoM,EAAagK,GACtE,IAAIjM,EAAUgC,YAAYkK,EAAmB,KAEjDjgC,KAAK8/B,aAAe,KACpB9/B,KAAKmgC,kBAAoB,WACrB,IAAI/P,EAAO,SAAShU,GACZA,GAAKA,EAAEoN,UAA+B,eAAnBpN,EAAEoN,SAAS9N,OAElC1b,KAAKsrB,OAAOoP,IAAI,oBAAqBtK,GACjChU,GAAKA,EAAEoN,UACP1N,EAAMK,UAAUC,EAAEoN,YACxBrkB,KAAKnF,MACPwf,WAAW4Q,EAAM,IACjBpwB,KAAKsrB,OAAOrD,GAAG,oBAAqBmI,MAEzC5uB,KAAKq9B,EAAav9B,WAErBs9B,EAAO9C,cAAc+C,EAAav9B,UAAW,eAAgB,CACzD8+B,YAAa,CAACpE,aAAc,GAC5BqE,UAAW,CAACrE,aAAe3gB,EAAU3B,MAAQ,IAAM,GACnD4mB,YAAa,CAACtE,cAAc,GAC5BuE,YAAa,CAACvE,aAAc,GAC5BwE,oBAAqB,CAACxE,cAAc,KAIxCr5B,EAAQk8B,aAAeA,IAGvBx7B,IAAIlD,OAAO,yBAAyB,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GAChG,aAEA,SAASqgC,EAAYnV,GAEjBA,EAAOrD,GAAG,QAAS,SAAS7L,GACxB,IAAIzM,EAAWyM,EAAE2Q,sBACbjF,EAAUwD,EAAOxD,QACjB4Y,EAAO5Y,EAAQ6Y,UAAUhxB,EAAS8c,IAAK9c,EAASgd,OAAQ,GACxD+T,IACItkB,EAAEmT,cACFzH,EAAQ8Y,WAAWF,GAEnB5Y,EAAQ+Y,WAAWH,GAEvBtkB,EAAEgU,UAIV9E,EAAOrD,GAAG,cAAe,SAAS7L,GAC9B,IAAIuW,EAAerH,EAAOtC,SAAS0I,aAAakB,UAAUxW,GAE1D,GAAoB,eAAhBuW,EAA+B,CAC/B,IAAIlG,EAAMrQ,EAAE2Q,sBAAsBN,IAC9B3E,EAAUwD,EAAOxD,QACjBA,EAAQgZ,aAAehZ,EAAQgZ,YAAYrU,IAC3CnB,EAAOxD,QAAQiZ,kBAAkBtU,EAAKrQ,GACrCkP,EAAOvG,aACRuG,EAAOlG,QACXhJ,EAAEgU,UAIV9E,EAAOrD,GAAG,iBAAkB,SAAS7L,GACjC,IAAIuW,EAAerH,EAAOtC,SAAS0I,aAAakB,UAAUxW,GAE1D,GAAoB,eAAhBuW,EAA+B,CAC/B,IAAIlG,EAAMrQ,EAAE2Q,sBAAsBN,IAC9B3E,EAAUwD,EAAOxD,QACjB7G,EAAO6G,EAAQkZ,uBAAuBvU,GAAK,GAC3C/D,EAAQzH,EAAKyH,OAASzH,EAAKggB,WAE/B,GAAIvY,EAAO,CACP+D,EAAM/D,EAAM5hB,MAAM2lB,IAClB,IAAIiU,EAAO5Y,EAAQ6Y,UAAUlU,EAAK3E,EAAQoZ,QAAQzU,GAAKjsB,OAAQ,GAE3DkgC,EACA5Y,EAAQ8Y,WAAWF,IAEnB5Y,EAAQqZ,QAAQ,MAAOzY,GACvB4C,EAAOtC,SAASsF,qBAAqB,CAAC7B,IAAK/D,EAAM5hB,MAAM2lB,IAAKE,OAAQ,KAG5EvQ,EAAEgU,UAKdztB,EAAQ89B,YAAcA,IAItBp9B,IAAIlD,OAAO,0BAA0B,CAAC,UAAU,UAAU,SAAS,eAAe,iBAAkB,SAAS0B,EAAUc,EAASvC,GAChI,aAEA,IAAIghC,EAAWv/B,EAAS,eACpBia,EAAQja,EAAS,gBAEjBw/B,EAAa,SAAS/V,GACtBtrB,KAAKshC,QAAUhW,EACftrB,KAAKuhC,MAAQ,CAACjW,OAAQA,GACtBtrB,KAAKwhC,UAAY,GACjBxhC,KAAKurB,kBAAkBD,EAAOmW,YAGlC,WACIzhC,KAAKurB,kBAAoB,SAASmW,GAC9B1hC,KAAK2hC,sBAAsB3hC,KAAK4hC,iBAChC5hC,KAAK4hC,gBAAkBF,EACvB1hC,KAAK6hC,mBAAmBH,EAAI,IAGhC1hC,KAAK8hC,mBAAqB,SAASJ,GAC/B,IAAIK,EAAI/hC,KAAKwhC,UACb,GAAIO,EAAEA,EAAEvhC,OAAS,IAAMkhC,EAAvB,CAGA,MAAOK,EAAEA,EAAEvhC,OAAS,IAAMuhC,EAAEA,EAAEvhC,OAAS,IAAMR,KAAK4hC,gBAC9C5hC,KAAK2hC,sBAAsBI,EAAEA,EAAEvhC,OAAS,IAE5CR,KAAK6hC,mBAAmBH,EAAI,KAGhC1hC,KAAK6hC,mBAAqB,SAASH,EAAI16B,GACnC,GAAK06B,EAAL,CAEiB,mBAANA,GAAqBA,EAAGM,iBAC/BN,EAAGM,eAAiBN,GACxB,IAAIhgC,EAAI1B,KAAKwhC,UAAUt/B,QAAQw/B,IACrB,GAANhgC,GACA1B,KAAKwhC,UAAU/6B,OAAO/E,EAAG,QAElBN,GAAP4F,EACAhH,KAAKwhC,UAAU1/B,KAAK4/B,GAEpB1hC,KAAKwhC,UAAU/6B,OAAOO,EAAK,EAAG06B,IAExB,GAANhgC,GAAWggC,EAAGO,QACdP,EAAGO,OAAOjiC,KAAKshC,WAGvBthC,KAAK2hC,sBAAwB,SAASD,GAClC,IAAIhgC,EAAI1B,KAAKwhC,UAAUt/B,QAAQw/B,GAC/B,OAAU,GAANhgC,IAEJ1B,KAAKwhC,UAAU/6B,OAAO/E,EAAG,GACzBggC,EAAGQ,QAAUR,EAAGQ,OAAOliC,KAAKshC,UACrB,IAGXthC,KAAKmiC,mBAAqB,WACtB,OAAOniC,KAAKwhC,UAAUxhC,KAAKwhC,UAAUhhC,OAAS,IAGlDR,KAAKoiC,cAAgB,WACjB,IAAInhB,EAAOjhB,KAAKuhC,MACZjW,EAASrK,EAAKqK,OAClB,OAAOtrB,KAAKwhC,UAAUh5B,IAAI,SAASu5B,GAC/B,OAAOA,EAAEK,eAAiBL,EAAEK,cAAc9W,EAAQrK,IAAS,KAC5DxY,OAAO42B,SAAS78B,KAAK,MAG5BxC,KAAKqiC,sBAAwB,SAASviB,EAAQ3G,EAAWD,EAASkD,GAK9D,IAJA,IAAIkmB,EACAC,GAAU,EACVd,EAAWzhC,KAAKshC,QAAQG,SAEnB//B,EAAI1B,KAAKwhC,UAAUhhC,OAAQkB,KAIhC,GAHA4gC,EAAYtiC,KAAKwhC,UAAU9/B,GAAGsgC,eAC1BhiC,KAAKuhC,MAAOzhB,EAAQ3G,EAAWD,EAASkD,GAEvCkmB,GAAcA,EAAUE,UAGzBD,EADqB,QAArBD,EAAUE,SAGAf,EAASl+B,KAAK++B,EAAUE,QAASxiC,KAAKshC,QAASgB,EAAU/8B,KAAM6W,GAEzEmmB,GAAWnmB,IAAgB,GAAX0D,GACO,GAAvBwiB,EAAUG,WAAoD,GAA/BH,EAAUE,QAAQC,WAEjD3mB,EAAMK,UAAUC,GAEhBmmB,GACA,MAWR,OARKA,IAAsB,GAAXziB,IACZwiB,EAAY,CAACE,QAAS,gBACtBD,EAAUd,EAASl+B,KAAK,eAAgBvD,KAAKshC,QAASnoB,IAGtDopB,GAAWviC,KAAKshC,QAAQ/O,SACxBvyB,KAAKshC,QAAQ/O,QAAQ,mBAAoB+P,GAEtCC,GAGXviC,KAAKynB,aAAe,SAASrL,EAAG0D,EAAQ5G,GACpC,IAAIC,EAAYioB,EAAQnoB,gBAAgBC,GACxClZ,KAAKqiC,sBAAsBviB,EAAQ3G,EAAWD,EAASkD,IAG3Dpc,KAAK2mB,YAAc,SAASzC,GACxBlkB,KAAKqiC,uBAAuB,EAAGne,MAGpC1iB,KAAK6/B,EAAW//B,WAEnBqB,EAAQ0+B,WAAaA,IAGrBh+B,IAAIlD,OAAO,mBAAmB,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GAC1F,aAEA,IAEIsiC,EAAM,EAAGC,EAAU,EACnBC,GAAa,EAA4BC,GAAY,EAAQC,GAAY,EAEzEC,EAAa,CAAE,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,GAAO,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,GAAO,GAAO,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,IAG7MC,EAAa,CAAE,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,GAAO,EAAI,EAAI,IAGzIC,EAAM,EAAGC,EAAM,EAEfC,EAAI,EACJC,EAAI,EACJC,EAAK,EACLC,EAAK,EACLC,EAAK,EACLC,EAAI,EACJC,EAAI,EACJC,EAAK,EACLC,EAAK,EACLC,EAAK,EACLC,EAAK,GACLC,EAAK,GACLC,EAAM,GACNC,EAAM,GACNC,EAAM,GACNC,EAAM,GACNC,EAAM,GACNC,EAAM,GACNC,EAAK,GAELC,EAAe,CACnBD,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGZ,EAAED,EAAEC,EAAEE,EAAGH,EAAEa,EAAGA,EACzCA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGb,EAAEA,EAAEA,EAAEC,EAC1CE,EAAGJ,EAAGA,EAAGO,EAAGA,EAAGA,EAAGP,EAAGA,EAAGA,EAAGA,EAAGA,EAAGM,EAAGD,EAAGC,EAAGD,EAAGA,EAC7CP,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGO,EAAGL,EAAGA,EAAGA,EAAGA,EAAGA,EAC7CA,EAAGJ,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAC/BA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEI,EAAGA,EAAGA,EAAGA,EAAGA,EAClCA,EAAGJ,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAC/BA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEI,EAAGA,EAAGA,EAAGA,EAAGc,EAClCA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGb,EAAEa,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAC5CA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAC7CT,EAAGL,EAAGO,EAAGA,EAAGA,EAAGA,EAAGP,EAAGA,EAAGA,EAAGA,EAAGJ,EAAEI,EAAGA,EAAGc,EAAGd,EAAGA,EAC5CO,EAAGA,EAAGT,EAAGA,EAAGE,EAAGJ,EAAEI,EAAGA,EAAGA,EAAGF,EAAGF,EAAEI,EAAGA,EAAGA,EAAGA,EAAGA,GAGvCgB,EAAe,CACnBZ,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGU,EAAGA,EAAGA,EAAGlB,EAAEC,EAC5CG,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAC7CA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGI,EAAGH,EAAEQ,EAAIC,EAAIC,EAAIC,EAAIC,EAAIR,EACjDE,EAAGA,EAAGA,EAAGA,EAAGA,EAAGP,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAC7CA,EAAGA,EAAGA,EAAGA,EAAGK,EAAGL,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAC7CA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGI,GAG7C,SAASa,EAAeC,EAAOC,EAAQC,EAAKC,GAC3C,IAAIC,EAASnC,EAAMM,EAAaD,EAC7B+B,EAAY,KAAMC,EAAW,KAAMC,EAAW,KAAMC,EAAW,EAC/DC,EAAS,KAAMC,EAAO,KAAMC,GAAW,EAAG1jC,EAAI,KAAM2jC,EAAK,KAAM93B,EAAU,GAE5E,IAAKq3B,EACJ,IAAKljC,EAAI,EAAGkjC,EAAY,GAAIljC,EAAIijC,EAAKjjC,IACpCkjC,EAAUljC,GAAK4jC,EAAkBb,EAAM/iC,IAQzC,IALAihC,EAAUD,EACVE,GAAa,GACA,EACbC,GAAY,EACZC,GAAY,EACPuC,EAAK,EAAGA,EAAKV,EAAKU,IAAK,CAO3B,GANAP,EAAYG,EACZ13B,EAAQ83B,GAAMN,EAAWQ,EAAcd,EAAOG,EAAWr3B,EAAS83B,GAClEJ,EAAWJ,EAAOC,GAAWC,GAC7BG,EAAoB,IAAXD,EACTA,GAAY,GACZP,EAAOW,GAAML,EAAWH,EAAOI,GAAU,GACrCC,EAAS,EACZ,GAAc,IAAVA,EAAe,CAClB,IAAIxjC,EAAI0jC,EAAS1jC,EAAI2jC,EAAI3jC,IACxBgjC,EAAOhjC,GAAK,EAEb0jC,GAAW,OAEXA,GAAW,EAIb,GADAD,EAAON,EAAOI,GAAU,GACpBE,GACY,GAAZC,IACFA,EAAUC,QAGX,GAAID,GAAW,EAAE,CAChB,IAAI1jC,EAAI0jC,EAAS1jC,EAAI2jC,EAAI3jC,IACxBgjC,EAAOhjC,GAAKsjC,EAEbI,GAAW,EAGTR,EAAUS,IAAO7B,IACpBkB,EAAOW,GAAM,GAEd1C,GAAWqC,EAEZ,GAAIlC,EACH,IAAIphC,EAAI,EAAGA,EAAIijC,EAAKjjC,IACnB,GAAGkjC,EAAUljC,IAAM+hC,EAAE,CACpBiB,EAAOhjC,GAAKghC,EACZ,IAAI,IAAIlF,EAAI97B,EAAI,EAAG87B,GAAK,EAAGA,IAAI,CAC9B,GAAGoH,EAAUpH,IAAMmG,EAGlB,MAFAe,EAAOlH,GAAKkF,IAUlB,SAAS8C,EAAaC,EAAKf,EAAQgB,GAClC,KAAI/C,EAAU8C,GAGd,GAAW,GAAPA,GAAY/C,GAAOQ,GAAQL,EAA/B,CAIA,IAAoChY,EAAK8a,EAAIC,EAAIC,EAA7ClB,EAAMe,EAAOllC,OAAQsG,EAAQ,EACjC,MAAMA,EAAQ69B,EAAI,CACjB,GAAID,EAAO59B,IAAU2+B,EAAI,CACxB5a,EAAM/jB,EAAQ,EACf,MAAM+jB,EAAM8Z,GAAOD,EAAO7Z,IAAQ4a,EACjC5a,IAED,IAAI8a,EAAK7+B,EAAO8+B,EAAK/a,EAAM,EAAI8a,EAAKC,EAAID,IAAMC,IAC7CC,EAAMH,EAAOC,GACbD,EAAOC,GAAMD,EAAOE,GACpBF,EAAOE,GAAMC,EAEd/+B,EAAQ+jB,EAET/jB,UAjBC4+B,EAAO/jB,UAqBT,SAAS4jB,EAAcd,EAAOhN,EAAOlqB,EAAS83B,GAC7C,IAAuBS,EAAOC,EAAOpB,EAAKjjC,EAAtCskC,EAAQvO,EAAM4N,GAClB,OAAOW,GACN,KAAK7C,EACL,KAAKC,EACJR,GAAa,EACd,KAAKW,EACL,KAAKD,EACJ,OAAO0C,EACR,KAAK3C,EACJ,OAAOT,EAAaU,EAAKD,EAC1B,KAAKK,EAGJ,OAFAd,GAAa,GACA,EACNQ,EACR,KAAKO,EACJ,OAAOJ,EACR,KAAKK,EACJ,OAAIyB,EAAK,GAAMA,EAAK,GAAM5N,EAAMj3B,SAC7BslC,EAAQv4B,EAAQ83B,EAAK,KAAOhC,GAAMyC,GAASxC,IAC3CyC,EAAQtO,EAAM4N,EAAK,KAAOhC,GAAM0C,GAASzC,EACpCC,GAEJX,IAAYmD,EAAQzC,GACjByC,GAASD,EAAQC,EAAQxC,GACjC,KAAKM,EAEJ,OADAiC,EAAQT,EAAK,EAAI93B,EAAQ83B,EAAK,GAAK7B,EAC/BsC,GAASzC,GAAOgC,EAAK,EAAK5N,EAAMj3B,QAAUi3B,EAAM4N,EAAK,IAAMhC,EACvDA,EAEDE,EACR,KAAKO,EACJ,GAAIuB,EAAK,GAAK93B,EAAQ83B,EAAK,IAAMhC,EAChC,OAAOA,EAER,GAAIT,EACH,OAAOW,EAER7hC,EAAI2jC,EAAK,EACTV,EAAMlN,EAAMj3B,OACZ,MAAOkB,EAAIijC,GAAOlN,EAAM/1B,IAAMoiC,EAC7BpiC,IAED,OAAIA,EAAIijC,GAAOlN,EAAM/1B,IAAM2hC,EACnBA,EAEDE,EACR,KAAKQ,EACJY,EAAMlN,EAAMj3B,OACZkB,EAAI2jC,EAAK,EACT,MAAO3jC,EAAIijC,GAAOlN,EAAM/1B,IAAMqiC,EAC7BriC,IAED,GAAIA,EAAIijC,EAAI,CACX,IAAI/b,EAAI6b,EAAMY,GAAKY,EAAgBrd,GAAK,MAAUA,GAAK,MAAgB,OAALA,EAGlE,GADAkd,EAAQrO,EAAM/1B,GACVukC,IAAiBH,GAAS1C,GAAK0C,GAASpC,GAC3C,OAAON,EAIT,OAAIiC,EAAK,IAAMS,EAAQrO,EAAM4N,EAAK,KAAO7B,EACjCD,EAEDh2B,EAAQ83B,EAAK,GACrB,KAAK7B,EAGJ,OAFAZ,GAAa,EACbC,GAAY,EACLH,EACR,KAAKe,EAEJ,OADAX,GAAY,EACLS,EACR,KAAKS,EACL,KAAKC,EACL,KAAKE,EACL,KAAKC,EACL,KAAKF,EACJtB,GAAa,EACd,KAAKyB,EACJ,OAAOd,GAIV,SAAS+B,EAAmBY,GAC3B,IAAIC,EAAKD,EAAGE,WAAW,GAAIR,EAAKO,GAAM,EAEtC,OAAU,GAANP,EACMO,EAAK,IAAUhD,EAAImB,EAAa6B,GACzB,GAANP,EACF,kBAAkBniC,KAAKyiC,GAAM9C,EAAID,EACzB,GAANyC,EACN,yDAAyDniC,KAAKyiC,GAC1DnC,EACC,+BAA+BtgC,KAAKyiC,GACrC5C,EACO,MAAN6C,EACDrC,EACC,kBAAkBrgC,KAAKyiC,GACxB7C,EAEAK,EACQ,IAANkC,GAAcO,GAAM,KACvB5B,EAAkB,IAAL4B,GACJ,KAANP,GACFO,GAAM,MAASzC,EAEjBH,EAMR5gC,EAAQwgC,EAAIA,EACZxgC,EAAQygC,EAAIA,EACZzgC,EAAQ0gC,GAAKA,EACb1gC,EAAQ0jC,KAAO,EACf1jC,EAAQ2gC,GAAK,EACb3gC,EAAQ2jC,IAAM,EACd3jC,EAAQ6gC,EAAI,EAEZ7gC,EAAQ4jC,IAAM,IACd5jC,EAAQ6jC,cAAgB,SAAStiB,EAAMuiB,EAAeC,GACrD,GAAIxiB,EAAK1jB,OAAS,EACjB,MAAO,GAER,IAAIikC,EAAQvgB,EAAK9hB,MAAM,IAAKukC,EAAoB,IAAIliC,MAAMggC,EAAMjkC,QAC/DomC,EAAa,IAAIniC,MAAMggC,EAAMjkC,QAASkkC,EAAS,GAEhDhC,EAAMgE,EAAQxD,EAAMD,EAEpBuB,EAAeC,EAAOC,EAAQD,EAAMjkC,OAAQimC,GAE5C,IAAK,IAAI/kC,EAAI,EAAGA,EAAIilC,EAAkBnmC,OAAQmmC,EAAkBjlC,GAAKA,EAAGA,KAExE8jC,EAAa,EAAGd,EAAQiC,GACxBnB,EAAa,EAAGd,EAAQiC,GAExB,IAASjlC,EAAI,EAAGA,EAAIilC,EAAkBnmC,OAAS,EAAGkB,IAC7C+kC,EAAc/kC,KAAO4hC,EACxBoB,EAAOhjC,GAAKiB,EAAQ2gC,GACVoB,EAAOhjC,KAAO0hC,IAAOqD,EAAc/kC,GAAKgiC,GAAM+C,EAAc/kC,GAAKsiC,GACxEyC,EAAc/kC,KAAO6hC,GAAMkD,EAAc/kC,KAAO2iC,GACnDK,EAAOhjC,GAAKiB,EAAQ0jC,KACT3kC,EAAI,GAAsB,MAAjB+iC,EAAM/iC,EAAI,IAAoB,8BAA8B+B,KAAKghC,EAAM/iC,MAC3FgjC,EAAOhjC,EAAI,GAAKgjC,EAAOhjC,GAAKiB,EAAQ2jC,IACpC5kC,KAGE+iC,EAAMA,EAAMjkC,OAAS,KAAOmC,EAAQ4jC,MACvC7B,EAAOD,EAAMjkC,OAAS,GAAKmC,EAAQ6gC,GAEpC,IAAS9hC,EAAI,EAAGA,EAAIilC,EAAkBnmC,OAAQkB,IAC7CklC,EAAWllC,GAAKgjC,EAAOiC,EAAkBjlC,IAG1C,MAAO,CAAC,kBAAqBilC,EAAmB,WAAcC,IAE/DjkC,EAAQkkC,kBAAoB,SAAS3iB,EAAMuiB,GAE1C,IADA,IAAIv0B,GAAM,EACDxQ,EAAI,EAAGA,EAAIwiB,EAAK1jB,OAAQkB,IAChC+kC,EAAc/kC,GAAK4jC,EAAkBphB,EAAK7hB,OAAOX,IAC5CwQ,GAAQu0B,EAAc/kC,IAAM0hC,GAAKqD,EAAc/kC,IAAMgiC,IACzDxxB,GAAM,GAER,OAAOA,GAERvP,EAAQmkC,wBAA0B,SAASC,EAAQC,GAClD,IAAK,IAAItlC,EAAI,EAAGA,EAAIslC,EAAOL,kBAAkBnmC,OAAQkB,IACpD,GAAIslC,EAAOL,kBAAkBjlC,IAAMqlC,EAClC,OAAOrlC,EAET,OAAO,KAKR2B,IAAIlD,OAAO,kBAAkB,CAAC,UAAU,UAAU,SAAS,mBAAmB,eAAe,qBAAsB,SAAS0B,EAAUc,EAASvC,GAC/I,aAEA,IAAI6mC,EAAWplC,EAAS,kBACpB8hB,EAAO9hB,EAAS,cAChBwZ,EAAYxZ,EAAS,mBACrBqlC,EAAS,4CACTC,EAAc,SAASrf,GACvB9nB,KAAK8nB,QAAUA,EACf9nB,KAAKonC,QAAU,GACfpnC,KAAKqnC,WAAa,KAClBrnC,KAAKinC,SAAWA,EAChBjnC,KAAKsnC,WAAa,GAClBtnC,KAAKunC,IAAM,IACXvnC,KAAKwnC,gBAAiB,EACtBxnC,KAAKynC,UAAW,EAChBznC,KAAK0nC,KAAO,GACZ1nC,KAAK2nC,WAAa,EAClB3nC,KAAK4nC,WAAY,EACjB5nC,KAAK6nC,IAAM,IACX7nC,KAAK8nC,UAAW,IAGpB,WACI9nC,KAAK+nC,UAAY,SAAS5V,EAAW6V,EAAQC,GACzC,QAAKjoC,KAAK8nC,WAEN3V,IAAcnyB,KAAKqnC,aACnBrnC,KAAKqnC,WAAalV,EAClBnyB,KAAKkoC,cAAcF,EAAQC,GAC3BjoC,KAAKmoC,iBAEFnoC,KAAKonC,QAAQR,aAGxB5mC,KAAKooC,SAAW,SAASC,GAChBroC,KAAK8nC,SAON9nC,KAAKqnC,WAAa,KANE,UAAhBgB,EAAMnD,QAAsBgC,EAAOzjC,KAAK4kC,EAAMC,MAAM9lC,KAAK,SACzDxC,KAAK8nC,UAAW,EAChB9nC,KAAKqnC,WAAa,OAQ9BrnC,KAAKuoC,eAAiB,WAClB,IAAIP,EAAS,EACTQ,EAAWxoC,KAAK8nB,QAAQ2gB,gBAC5B,GAAID,EAAShoC,OAAQ,CACjB,IAAIsE,EAAQ9E,KAAK8nB,QAAQ4gB,kBAAkBF,EAAUxoC,KAAKqnC,YACtDviC,GAAS,IACTkjC,EAAShoC,KAAK8nB,QAAQ6gB,aAAa7jC,IAG3C,OAAOkjC,GAGXhoC,KAAK4oC,cAAgB,WACjB,IAAIX,EAAa,EACbO,EAAWxoC,KAAK8nB,QAAQ2gB,gBAC5B,GAAID,EAAShoC,OAAQ,CACjB,IAAIqoC,EAAcC,EAAY9oC,KAAK8nB,QAAQ4gB,kBAAkBF,EAAUxoC,KAAKqnC,YAC5E,MAAOrnC,KAAKqnC,WAAaY,EAAa,EAAG,CAErC,GADAY,EAAe7oC,KAAK8nB,QAAQ4gB,kBAAkBF,EAAUxoC,KAAKqnC,WAAaY,EAAa,GACnFY,IAAiBC,EACjB,MAEJA,EAAYD,EACZZ,KAIR,OAAOA,GAGXjoC,KAAKkoC,cAAgB,SAASF,EAAQC,GAOlC,QANe7mC,IAAX4mC,IACAA,EAAShoC,KAAKuoC,kBAElBvoC,KAAK2nC,WAAa,EAClB3nC,KAAK4nC,UAAaI,IAAWhoC,KAAK8nB,QAAQoK,YAAc,EACxDlyB,KAAK0nC,KAAO1nC,KAAK8nB,QAAQoZ,QAAQ8G,GAC7BhoC,KAAK8nB,QAAQihB,aAAc,CAC3B,IAAIC,EAAShpC,KAAK8nB,QAAQmhB,UAAUjB,GAChCgB,SACmB5nC,IAAf6mC,IACAA,EAAajoC,KAAK4oC,iBAEnBX,EAAa,GAAKe,EAAOxoC,QACxBR,KAAK2nC,WAAaqB,EAAOE,OACzBlpC,KAAK0nC,KAAQO,EAAae,EAAOxoC,OAC7BR,KAAK0nC,KAAKhhB,UAAUsiB,EAAOf,EAAa,GAAIe,EAAOA,EAAOxoC,OAAS,IAC/DR,KAAK0nC,KAAKhhB,UAAUsiB,EAAOA,EAAOxoC,OAAS,KAEnDR,KAAK0nC,KAAO1nC,KAAK0nC,KAAKhhB,UAAU,EAAGsiB,EAAOf,KAItD,IAAuCkB,EAAnCrhB,EAAU9nB,KAAK8nB,QAASiD,EAAQ,EACpC/qB,KAAK0nC,KAAO1nC,KAAK0nC,KAAKhlC,QAAQ,qCAAsC,SAASwjC,EAAIxkC,GAC7E,MAAW,OAAPwkC,GAAepe,EAAQshB,YAAYlD,EAAGE,WAAW,KACjD+C,EAAe,OAAPjD,EAAepe,EAAQuhB,iBAAiB3nC,EAAIqpB,GAAS,EAC7DA,GAASoe,EAAO,EACTxlB,EAAK/B,aAAaqlB,EAASV,IAAK4C,IAEpCjD,KAIflmC,KAAKmoC,cAAgB,WACjB,IAAI1B,EAAgB,GAAI6C,EAAYtpC,KAAK4nC,UAAY5nC,KAAK6nC,IAAM7nC,KAAKunC,IACjEG,EAAO1nC,KAAK0nC,MAAQ1nC,KAAKwnC,eAAiB8B,EAAYrC,EAASV,KAC/DU,EAASJ,kBAAkBa,EAAMjB,GACjCzmC,KAAKonC,QAAUH,EAAST,cAAckB,EAAMjB,EAAezmC,KAAKynC,UAEhEznC,KAAKonC,QAAU,IAGvBpnC,KAAKupC,YAAc,WACfvpC,KAAKqnC,WAAa,MAEtBrnC,KAAKwpC,sBAAwB,SAASC,GAClC,GAAKzpC,KAAK8nC,UAEN9nC,KAAK+0B,iBAAmB0U,EAAYC,eAAep6B,MAAvD,CAGA,IAAIylB,EAAiB/0B,KAAK+0B,eAAiB0U,EAAYC,eAAep6B,MAClEq6B,EAAgBF,EAAYG,kBAAkB,KAElD5pC,KAAKsnC,WAAWL,EAAS9D,GAAKnjC,KAAKsnC,WAAWL,EAAS5D,IAAMrjC,KAAKsnC,WAAWL,EAASZ,MAAQtR,EAC9F/0B,KAAKsnC,WAAWL,EAAS7D,GAAKpjC,KAAKsnC,WAAWL,EAAS3D,IAAMqG,EAC7D3pC,KAAKsnC,WAAWL,EAASX,KAAOjrB,EAAUN,SAAW4uB,EAAgC,IAAhBA,EACrE3pC,KAAKsnC,WAAWL,EAASzD,GAAK,EAE9BxjC,KAAKqnC,WAAa,OAGtBrnC,KAAK6pC,kBAAoB,WACrB,OAAO7pC,KAAKwnC,gBAGhBxnC,KAAK8pC,kBAAoB,SAAStC,GAC9BxnC,KAAKwnC,eAAiBA,EACtBxnC,KAAKqnC,WAAa,MAGtBrnC,KAAK+pC,WAAa,SAASC,GACvBhqC,KAAKunC,IAAMyC,GAGfhqC,KAAKiqC,WAAa,SAASxC,GACvBznC,KAAKynC,SAAWA,GAEpBznC,KAAKkqC,WAAa,SAASC,GACvBA,GAAOnqC,KAAK2nC,WACZ,IAAIyC,EAAYnD,EAASH,wBAAwBqD,EAAM,EAAIA,EAAM,EAAI,EAAGnqC,KAAKonC,SACzE1C,EAAS1kC,KAAKonC,QAAQR,WAAYh3B,EAAO,EAEjC,IAARu6B,GAAazF,EAAO0F,GAAa,IAAM,GACvCA,IAEJ,IAAK,IAAI1oC,EAAI,EAAGA,EAAI0oC,EAAW1oC,IAC3BkO,GAAQ5P,KAAKsnC,WAAW5C,EAAOhjC,IASnC,OANY,IAARyoC,GAAazF,EAAO0F,GAAa,IAAM,IACvCx6B,GAAQ5P,KAAKsnC,WAAW5C,EAAO0F,KAE/BpqC,KAAK2nC,aACL/3B,GAAQ5P,KAAK2nC,WAAa3nC,KAAKsnC,WAAWL,EAAS9D,IAEhDvzB,GAEX5P,KAAKqqC,cAAgB,SAASC,EAAUC,GAKpC,IAJA,IAAiDC,EAIxCzD,EAJLv+B,EAAMxI,KAAKonC,QAAS1C,EAASl8B,EAAIo+B,WAAmB9jB,EAAS9iB,KAAK2nC,WAAa3nC,KAAKsnC,WAAWL,EAAS9D,GAAIsH,EAAa,GACzHC,EAAYxjC,KAAKM,IAAI8iC,EAAUC,GAAUvqC,KAAK2nC,WAAYgD,EAAYzjC,KAAKC,IAAImjC,EAAUC,GAAUvqC,KAAK2nC,WACpGiD,GAAa,EAAOC,GAAiB,EAAOnlB,EAAiB,EAEpDolB,EAAS,EAAGA,EAASpG,EAAOlkC,OAAQsqC,IACjD/D,EAASv+B,EAAIm+B,kBAAkBmE,GAC/BN,EAAQ9F,EAAOoG,GACfF,EAAc7D,GAAU2D,GAAe3D,EAAS4D,EAC5CC,IAAeC,EACfnlB,EAAiB5C,GACT8nB,GAAcC,GACtBJ,EAAW3oC,KAAK,CAAC8N,KAAM8V,EAAgBpW,MAAOwT,EAAS4C,IAE3D5C,GAAU9iB,KAAKsnC,WAAWkD,GAC1BK,EAAiBD,EAOrB,OAJIA,GAAeE,IAAWpG,EAAOlkC,QACjCiqC,EAAW3oC,KAAK,CAAC8N,KAAM8V,EAAgBpW,MAAOwT,EAAS4C,IAGpD+kB,GAEXzqC,KAAK+qC,YAAc,SAASC,GACxB,IAAIC,EAAa,EACbnoB,GADgBkoB,EAAO9jC,KAAKC,IAAI6jC,EAAM,GAC7B,GAAGZ,EAAY,EAAG1F,EAAS1kC,KAAKonC,QAAQR,WAC7CsE,EAAYlrC,KAAKsnC,WAAW5C,EAAO0F,IAEvCpqC,KAAK2nC,aACLqD,GAAQhrC,KAAK2nC,WAAa3nC,KAAKsnC,WAAWL,EAAS9D,IAGvD,MAAM6H,EAAOloB,EAASooB,EAAU,EAAG,CAE/B,GADApoB,GAAUooB,EACPd,IAAc1F,EAAOlkC,OAAS,EAAG,CAChC0qC,EAAY,EACZ,MAEJA,EAAYlrC,KAAKsnC,WAAW5C,IAAS0F,IAqBzC,OAlBIA,EAAY,GAAM1F,EAAO0F,EAAY,GAAK,IAAM,GAAO1F,EAAO0F,GAAa,IAAM,GAC9EY,EAAOloB,GACNsnB,IACJa,EAAajrC,KAAKonC,QAAQT,kBAAkByD,IAErCA,EAAY,GAAM1F,EAAO0F,EAAY,GAAK,IAAM,GAAO1F,EAAO0F,GAAa,IAAM,EACxFa,EAAa,GAAMD,EAAOloB,EAAU9iB,KAAKonC,QAAQT,kBAAkByD,GACzDpqC,KAAKonC,QAAQT,kBAAkByD,EAAY,IAE7CpqC,KAAKynC,UAAY2C,IAAc1F,EAAOlkC,OAAS,GAAmB,IAAd0qC,GAAoBxG,EAAO0F,EAAY,GAAK,IAAM,IACrGpqC,KAAKynC,UAA0B,IAAd2C,GAAoB1F,EAAO0F,GAAa,IAAM,EACxEa,EAAa,EAAIjrC,KAAKonC,QAAQT,kBAAkByD,IAE5CA,EAAY,GAAM1F,EAAO0F,EAAY,GAAK,IAAM,GAAoB,IAAdc,GACtDd,IACJa,EAAajrC,KAAKonC,QAAQT,kBAAkByD,IAGxCa,EAAajrC,KAAK2nC,cAG/BnmC,KAAK2lC,EAAY7lC,WAEpBqB,EAAQwkC,YAAcA,IAGtB9jC,IAAIlD,OAAO,YAAY,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GACnF,aACA,IAAI+qC,EAAgB,SAASC,EAAIC,GAC7B,OAAOD,EAAG3e,IAAM4e,EAAG5e,KAAO2e,EAAGze,OAAS0e,EAAG1e,QAEzC2e,EAAQ,SAASC,EAAUC,EAAaC,EAAQC,GAChD1rC,KAAK8G,MAAQ,CACT2lB,IAAK8e,EACL5e,OAAQ6e,GAGZxrC,KAAK6qB,IAAM,CACP4B,IAAKgf,EACL9e,OAAQ+e,KAIhB,WACI1rC,KAAK2rC,QAAU,SAASjjB,GACpB,OAAO1oB,KAAK8G,MAAM2lB,MAAQ/D,EAAM5hB,MAAM2lB,KAClCzsB,KAAK6qB,IAAI4B,MAAQ/D,EAAMmC,IAAI4B,KAC3BzsB,KAAK8G,MAAM6lB,SAAWjE,EAAM5hB,MAAM6lB,QAClC3sB,KAAK6qB,IAAI8B,SAAWjE,EAAMmC,IAAI8B,QAEtC3sB,KAAKuB,SAAW,WACZ,MAAQ,WAAavB,KAAK8G,MAAM2lB,IAAM,IAAMzsB,KAAK8G,MAAM6lB,OACnD,SAAW3sB,KAAK6qB,IAAI4B,IAAM,IAAMzsB,KAAK6qB,IAAI8B,OAAS,KAG1D3sB,KAAKqvB,SAAW,SAAS5C,EAAKE,GAC1B,OAAoC,GAA7B3sB,KAAK4rC,QAAQnf,EAAKE,IAE7B3sB,KAAK6rC,aAAe,SAASnjB,GACzB,IAAIgE,EACA7B,EAAMnC,EAAMmC,IACZ/jB,EAAQ4hB,EAAM5hB,MAGlB,OADA4lB,EAAM1sB,KAAK4rC,QAAQ/gB,EAAI4B,IAAK5B,EAAI8B,QACrB,GAAPD,GACAA,EAAM1sB,KAAK4rC,QAAQ9kC,EAAM2lB,IAAK3lB,EAAM6lB,QACzB,GAAPD,EACO,EACO,GAAPA,EACA,EAEA,IAEI,GAARA,GACC,GAERA,EAAM1sB,KAAK4rC,QAAQ9kC,EAAM2lB,IAAK3lB,EAAM6lB,SACxB,GAARD,GACQ,EACM,GAAPA,EACA,GAEA,IAInB1sB,KAAKmuB,aAAe,SAAS2d,GACzB,OAAO9rC,KAAK4rC,QAAQE,EAAErf,IAAKqf,EAAEnf,SAEjC3sB,KAAK+rC,cAAgB,SAASrjB,GAC1B,OAAyC,GAAlC1oB,KAAKmuB,aAAazF,EAAM5hB,QAA+C,GAAhC9G,KAAKmuB,aAAazF,EAAMmC,MAE1E7qB,KAAKgsC,WAAa,SAAStjB,GACvB,IAAIgE,EAAM1sB,KAAK6rC,aAAanjB,GAC5B,OAAgB,GAARgE,GAAoB,GAAPA,GAAmB,GAAPA,GAErC1sB,KAAKisC,MAAQ,SAASxf,EAAKE,GACvB,OAAO3sB,KAAK6qB,IAAI4B,KAAOA,GAAOzsB,KAAK6qB,IAAI8B,QAAUA,GAErD3sB,KAAKksC,QAAU,SAASzf,EAAKE,GACzB,OAAO3sB,KAAK8G,MAAM2lB,KAAOA,GAAOzsB,KAAK8G,MAAM6lB,QAAUA,GAEzD3sB,KAAKmsC,SAAW,SAAS1f,EAAKE,GACR,iBAAPF,GACPzsB,KAAK8G,MAAM6lB,OAASF,EAAIE,OACxB3sB,KAAK8G,MAAM2lB,IAAMA,EAAIA,MAErBzsB,KAAK8G,MAAM2lB,IAAMA,EACjBzsB,KAAK8G,MAAM6lB,OAASA,IAG5B3sB,KAAKosC,OAAS,SAAS3f,EAAKE,GACN,iBAAPF,GACPzsB,KAAK6qB,IAAI8B,OAASF,EAAIE,OACtB3sB,KAAK6qB,IAAI4B,IAAMA,EAAIA,MAEnBzsB,KAAK6qB,IAAI4B,IAAMA,EACfzsB,KAAK6qB,IAAI8B,OAASA,IAG1B3sB,KAAKqsC,OAAS,SAAS5f,EAAKE,GACxB,OAAiC,GAA7B3sB,KAAK4rC,QAAQnf,EAAKE,MACd3sB,KAAKisC,MAAMxf,EAAKE,KAAW3sB,KAAKksC,QAAQzf,EAAKE,KAQzD3sB,KAAKy/B,YAAc,SAAShT,EAAKE,GAC7B,OAAiC,GAA7B3sB,KAAK4rC,QAAQnf,EAAKE,KACd3sB,KAAKisC,MAAMxf,EAAKE,IAQ5B3sB,KAAKssC,UAAY,SAAS7f,EAAKE,GAC3B,OAAiC,GAA7B3sB,KAAK4rC,QAAQnf,EAAKE,KACd3sB,KAAKksC,QAAQzf,EAAKE,IAQ9B3sB,KAAK4rC,QAAU,SAASnf,EAAKE,GACzB,OAAK3sB,KAAKovB,eACF3C,IAAQzsB,KAAK8G,MAAM2lB,IAKvBA,EAAMzsB,KAAK8G,MAAM2lB,KACT,EAERA,EAAMzsB,KAAK6qB,IAAI4B,IACR,EAEPzsB,KAAK8G,MAAM2lB,MAAQA,EACZE,GAAU3sB,KAAK8G,MAAM6lB,OAAS,GAAK,EAE1C3sB,KAAK6qB,IAAI4B,MAAQA,EACVE,GAAU3sB,KAAK6qB,IAAI8B,OAAS,EAAI,EAEpC,EAhBQA,EAAS3sB,KAAK8G,MAAM6lB,QAAU,EAAKA,EAAS3sB,KAAK6qB,IAAI8B,OAAS,EAAI,GAkBrF3sB,KAAKusC,aAAe,SAAS9f,EAAKE,GAC9B,OAAI3sB,KAAK8G,MAAM2lB,KAAOA,GAAOzsB,KAAK8G,MAAM6lB,QAAUA,GACtC,EAED3sB,KAAK4rC,QAAQnf,EAAKE,IAGjC3sB,KAAKwsC,WAAa,SAAS/f,EAAKE,GAC5B,OAAI3sB,KAAK6qB,IAAI4B,KAAOA,GAAOzsB,KAAK6qB,IAAI8B,QAAUA,EACnC,EAEA3sB,KAAK4rC,QAAQnf,EAAKE,IAGjC3sB,KAAKysC,cAAgB,SAAShgB,EAAKE,GAC/B,OAAI3sB,KAAK6qB,IAAI4B,KAAOA,GAAOzsB,KAAK6qB,IAAI8B,QAAUA,EACnC,EACA3sB,KAAK8G,MAAM2lB,KAAOA,GAAOzsB,KAAK8G,MAAM6lB,QAAUA,GAC7C,EAED3sB,KAAK4rC,QAAQnf,EAAKE,IAGjC3sB,KAAK0sC,SAAW,SAASC,EAAUC,GAC/B,GAAI5sC,KAAK6qB,IAAI4B,IAAMmgB,EACf,IAAI/hB,EAAM,CAAC4B,IAAKmgB,EAAU,EAAGjgB,OAAQ,QACpC,GAAI3sB,KAAK6qB,IAAI4B,IAAMkgB,EAChB9hB,EAAM,CAAC4B,IAAKkgB,EAAUhgB,OAAQ,GAEtC,GAAI3sB,KAAK8G,MAAM2lB,IAAMmgB,EACjB,IAAI9lC,EAAQ,CAAC2lB,IAAKmgB,EAAU,EAAGjgB,OAAQ,QACtC,GAAI3sB,KAAK8G,MAAM2lB,IAAMkgB,EAClB7lC,EAAQ,CAAC2lB,IAAKkgB,EAAUhgB,OAAQ,GAExC,OAAO2e,EAAMuB,WAAW/lC,GAAS9G,KAAK8G,MAAO+jB,GAAO7qB,KAAK6qB,MAE7D7qB,KAAK8sC,OAAS,SAASrgB,EAAKE,GACxB,IAAID,EAAM1sB,KAAK4rC,QAAQnf,EAAKE,GAE5B,GAAW,GAAPD,EACA,OAAO1sB,KACN,IAAY,GAAR0sB,EACL,IAAI5lB,EAAQ,CAAC2lB,IAAKA,EAAKE,OAAQA,QAE/B,IAAI9B,EAAM,CAAC4B,IAAKA,EAAKE,OAAQA,GAEjC,OAAO2e,EAAMuB,WAAW/lC,GAAS9G,KAAK8G,MAAO+jB,GAAO7qB,KAAK6qB,MAG7D7qB,KAAKwlB,QAAU,WACX,OAAQxlB,KAAK8G,MAAM2lB,MAAQzsB,KAAK6qB,IAAI4B,KAAOzsB,KAAK8G,MAAM6lB,SAAW3sB,KAAK6qB,IAAI8B,QAE9E3sB,KAAKovB,YAAc,WACf,OAAQpvB,KAAK8G,MAAM2lB,MAAQzsB,KAAK6qB,IAAI4B,KAExCzsB,KAAK+sC,MAAQ,WACT,OAAOzB,EAAMuB,WAAW7sC,KAAK8G,MAAO9G,KAAK6qB,MAE7C7qB,KAAKgtC,aAAe,WAChB,OAAuB,GAAnBhtC,KAAK6qB,IAAI8B,OACF,IAAI2e,EAAMtrC,KAAK8G,MAAM2lB,IAAK,EAAGvlB,KAAKC,IAAInH,KAAK8G,MAAM2lB,IAAKzsB,KAAK6qB,IAAI4B,IAAI,GAAI,GAEvE,IAAI6e,EAAMtrC,KAAK8G,MAAM2lB,IAAK,EAAGzsB,KAAK6qB,IAAI4B,IAAK,IAE1DzsB,KAAKitC,cAAgB,SAASnlB,GAC1B,IAAIolB,EAAiBplB,EAAQqlB,yBAAyBntC,KAAK8G,OACvDsmC,EAAetlB,EAAQqlB,yBAAyBntC,KAAK6qB,KAEzD,OAAO,IAAIygB,EACP4B,EAAezgB,IAAKygB,EAAevgB,OACnCygB,EAAa3gB,IAAK2gB,EAAazgB,SAGvC3sB,KAAKqtC,OAAS,SAAS5gB,EAAKE,GACxB3sB,KAAK8G,MAAM2lB,KAAOA,EAClBzsB,KAAK8G,MAAM6lB,QAAUA,EACrB3sB,KAAK6qB,IAAI4B,KAAOA,EAChBzsB,KAAK6qB,IAAI8B,QAAUA,KAGxBnrB,KAAK8pC,EAAMhqC,WACdgqC,EAAMuB,WAAa,SAAS/lC,EAAO+jB,GAC/B,OAAO,IAAIygB,EAAMxkC,EAAM2lB,IAAK3lB,EAAM6lB,OAAQ9B,EAAI4B,IAAK5B,EAAI8B,SAE3D2e,EAAMH,cAAgBA,EAEtBG,EAAMH,cAAgB,SAASC,EAAIC,GAC/B,OAAOD,EAAG3e,IAAM4e,EAAG5e,KAAO2e,EAAGze,OAAS0e,EAAG1e,QAI7ChqB,EAAQ2oC,MAAQA,IAGhBjoC,IAAIlD,OAAO,gBAAgB,CAAC,UAAU,UAAU,SAAS,cAAc,eAAe,wBAAwB,aAAc,SAAS0B,EAAUc,EAASvC,GACxJ,aAEA,IAAI4R,EAAMnQ,EAAS,aACf8hB,EAAO9hB,EAAS,cAChB63B,EAAe73B,EAAS,uBAAuB63B,aAC/C4R,EAAQzpC,EAAS,WAAWypC,MAC5BgC,EAAY,SAASxlB,GACrB9nB,KAAK8nB,QAAUA,EACf9nB,KAAK+M,IAAM+a,EAAQylB,cAEnBvtC,KAAKooB,iBACLpoB,KAAKwtC,KAAOxtC,KAAKytC,cAAgBztC,KAAK+M,IAAI2gC,aAAa,EAAG,GAC1D1tC,KAAK4sB,OAAS5sB,KAAK2tC,gBAAkB3tC,KAAK+M,IAAI2gC,aAAa,EAAG,GAE9D,IAAIplC,EAAOtI,KACXA,KAAKwtC,KAAKvlB,GAAG,SAAU,SAAS7L,GAC5B9T,EAAKihB,MAAM,gBACNjhB,EAAKslC,UACNtlC,EAAKihB,MAAM,mBACVjhB,EAAKulC,4BAA8BzxB,EAAEie,IAAI1N,QAAUvQ,EAAE1T,MAAMikB,SAC5DrkB,EAAKwlC,eAAiB,QAG9B9tC,KAAK2tC,gBAAgB1lB,GAAG,SAAU,WACzB3f,EAAKslC,UACNtlC,EAAKihB,MAAM,uBAIvB,WAEIvX,EAAIF,UAAU9R,KAAM05B,GACpB15B,KAAKwlB,QAAU,WACX,OAAQxlB,KAAK4tC,UACT5tC,KAAK4sB,OAAOH,KAAOzsB,KAAKwtC,KAAK/gB,KAC7BzsB,KAAK4sB,OAAOD,QAAU3sB,KAAKwtC,KAAK7gB,QAGxC3sB,KAAKovB,YAAc,WACf,OAAIpvB,KAAKwlB,WAIFxlB,KAAKyoB,WAAW2G,eAE3BpvB,KAAK+tC,UAAY,WACb,OAAO/tC,KAAKwtC,KAAKQ,eAErBhuC,KAAKquB,mBAAqB,SAAS5B,EAAKE,GACpC3sB,KAAK4sB,OAAOiE,YAAYpE,EAAKE,GAEzB3sB,KAAK4tC,WACL5tC,KAAK4tC,UAAW,EAChB5tC,KAAKupB,MAAM,qBAGnBvpB,KAAKiuC,mBAAqB,WACtB,OAAIjuC,KAAK4tC,SACE5tC,KAAKkuC,mBAELluC,KAAK4sB,OAAOohB,eAE3BhuC,KAAKkuC,iBAAmB,WACpB,OAAOluC,KAAKwtC,KAAKQ,eAErBhuC,KAAKmuC,eAAiB,SAASC,GAC3B,GAAIpuC,KAAK4tC,SACL5tC,KAAKquC,aAAaruC,KAAKwtC,KAAK/gB,IAAKzsB,KAAKwtC,KAAK7gB,OAASyhB,OADxD,CAKA,IAAIxhB,EAAS5sB,KAAKiuC,qBACdT,EAAOxtC,KAAKkuC,mBAEZI,EAActuC,KAAKsuC,cAElBA,GAAiC,IAAlB1hB,EAAOD,QACvB3sB,KAAKquB,mBAAmBzB,EAAOH,IAAKG,EAAOD,OAASyhB,IAEpDE,GAA+B,IAAhBd,EAAK7gB,SACpB3sB,KAAKuuC,eAAe,WAChBvuC,KAAKquC,aAAab,EAAK/gB,IAAK+gB,EAAK7gB,OAASyhB,OAItDpuC,KAAKsuC,YAAc,WACf,IAAI1hB,EAAS5sB,KAAK4sB,OACd4gB,EAAOxtC,KAAKwtC,KAChB,OAAQ5gB,EAAOH,IAAM+gB,EAAK/gB,KAAQG,EAAOH,KAAO+gB,EAAK/gB,KAAOG,EAAOD,OAAS6gB,EAAK7gB,QAErF3sB,KAAKyoB,SAAW,WACZ,IAAImE,EAAS5sB,KAAK4sB,OACd4gB,EAAOxtC,KAAKwtC,KAEhB,OAAIxtC,KAAKwlB,UACE8lB,EAAMuB,WAAWW,EAAMA,GAE9BxtC,KAAKsuC,cACEhD,EAAMuB,WAAWW,EAAM5gB,GAGvB0e,EAAMuB,WAAWjgB,EAAQ4gB,IAGxCxtC,KAAKooB,eAAiB,WACbpoB,KAAK4tC,WACN5tC,KAAK4tC,UAAW,EAChB5tC,KAAKupB,MAAM,qBAGnBvpB,KAAKimB,UAAY,WACb,IAAI2mB,EAAU5sC,KAAK+M,IAAImlB,YAAc,EACrClyB,KAAKquB,mBAAmB,EAAG,GAC3BruB,KAAKquC,aAAazB,EAAS5sC,KAAK+M,IAAIm0B,QAAQ0L,GAASpsC,SAEzDR,KAAK2oB,SACL3oB,KAAK4lB,kBAAoB,SAAS8C,EAAO/G,GACjCA,GACA3hB,KAAKquB,mBAAmB3F,EAAMmC,IAAI4B,IAAK/D,EAAMmC,IAAI8B,QACjD3sB,KAAK6yB,SAASnK,EAAM5hB,MAAM2lB,IAAK/D,EAAM5hB,MAAM6lB,UAE3C3sB,KAAKquB,mBAAmB3F,EAAM5hB,MAAM2lB,IAAK/D,EAAM5hB,MAAM6lB,QACrD3sB,KAAK6yB,SAASnK,EAAMmC,IAAI4B,IAAK/D,EAAMmC,IAAI8B,SAEvC3sB,KAAKyoB,WAAWjD,YAChBxlB,KAAK4tC,UAAW,GACpB5tC,KAAK8tC,eAAiB,MAG1B9tC,KAAKuuC,eAAiB,SAASC,GAC3B,IAAIhB,EAAOxtC,KAAKwtC,KACZxtC,KAAK4tC,UACL5tC,KAAKquB,mBAAmBmf,EAAK/gB,IAAK+gB,EAAK7gB,QAE3C6hB,EAAMhtC,KAAKxB,OAEfA,KAAK6yB,SAAW,SAASpG,EAAKE,GAC1B3sB,KAAKuuC,eAAe,WAChBvuC,KAAKquC,aAAa5hB,EAAKE,MAG/B3sB,KAAKguB,iBAAmB,SAAShnB,GAC7BhH,KAAKuuC,eAAe,WAChBvuC,KAAK20B,qBAAqB3tB,MAGlChH,KAAKyuC,OAAS,SAAShiB,EAAKE,GACxB3sB,KAAKooB,iBACLpoB,KAAKquC,aAAa5hB,EAAKE,IAE3B3sB,KAAKqtB,eAAiB,SAASrmB,GAC3BhH,KAAKooB,iBACLpoB,KAAK20B,qBAAqB3tB,IAE9BhH,KAAK0uC,SAAW,WACZ1uC,KAAKuuC,eAAevuC,KAAK2uC,eAE7B3uC,KAAK4uC,WAAa,WACd5uC,KAAKuuC,eAAevuC,KAAK6uC,iBAE7B7uC,KAAK8uC,YAAc,WACf9uC,KAAKuuC,eAAevuC,KAAK+uC,kBAE7B/uC,KAAKgvC,WAAa,WACdhvC,KAAKuuC,eAAevuC,KAAKivC,iBAE7BjvC,KAAKkvC,gBAAkB,WACnBlvC,KAAKuuC,eAAevuC,KAAKmvC,sBAE7BnvC,KAAKovC,cAAgB,WACjBpvC,KAAKuuC,eAAevuC,KAAKqvC,oBAE7BrvC,KAAKsvC,cAAgB,WACjBtvC,KAAKuuC,eAAevuC,KAAKuvC,oBAE7BvvC,KAAKwvC,gBAAkB,WACnBxvC,KAAKuuC,eAAevuC,KAAKyvC,sBAE7BzvC,KAAK0vC,gBAAkB,WACnB1vC,KAAKuuC,eAAevuC,KAAK2vC,sBAE7B3vC,KAAK4vC,eAAiB,WAClB5vC,KAAKuuC,eAAevuC,KAAK6vC,qBAE7B7vC,KAAKmvB,aAAe,SAAS1C,EAAKE,GAC9B,GAAqB,oBAAVA,EAAuB,CAC9B,IAAIH,EAASC,GAAOzsB,KAAKwtC,KACzB/gB,EAAMD,EAAOC,IACbE,EAASH,EAAOG,OAEpB,OAAO3sB,KAAK8nB,QAAQqH,aAAa1C,EAAKE,IAE1C3sB,KAAK8vC,WAAa,WACd9vC,KAAK4lB,kBAAkB5lB,KAAKmvB,iBAEhCnvB,KAAK+vC,YAAc,WACf,IAAIvjB,EAASxsB,KAAK+tC,YACdrlB,EAAQ1oB,KAAK8nB,QAAQkoB,cAAcxjB,EAAOC,IAAKD,EAAOG,QAC1D3sB,KAAK4lB,kBAAkB8C,IAG3B1oB,KAAKsvB,aAAe,SAAS7C,EAAKwjB,GAC9B,IACIC,EADAC,EAAyB,iBAAP1jB,EAAkBA,EAAMzsB,KAAKwtC,KAAK/gB,IAGpD2jB,EAAWpwC,KAAK8nB,QAAQuoB,YAAYF,GAOxC,OANIC,GACAD,EAAWC,EAAStpC,MAAM2lB,IAC1ByjB,EAASE,EAASvlB,IAAI4B,KAEtByjB,EAASC,GAEW,IAApBF,EACO,IAAI3E,EAAM6E,EAAU,EAAGD,EAAQlwC,KAAK8nB,QAAQoZ,QAAQgP,GAAQ1vC,QAE5D,IAAI8qC,EAAM6E,EAAU,EAAGD,EAAS,EAAG,IAElDlwC,KAAKswC,WAAa,WACdtwC,KAAK4lB,kBAAkB5lB,KAAKsvB,iBAEhCtvB,KAAK2uC,aAAe,WAChB3uC,KAAKuwC,cAAc,EAAG,IAE1BvwC,KAAK6uC,eAAiB,WAClB7uC,KAAKuwC,aAAa,EAAG,IAEzBvwC,KAAKwwC,qBAAuB,SAAShkB,EAAQikB,EAAS3gB,GAClD,IAAIhpB,EAAQ0lB,EAAOG,OACf9B,EAAM2B,EAAOG,OAAS8jB,EAM1B,OAJI3gB,EAAY,IACZhpB,EAAQ0lB,EAAOG,OAAS8jB,EACxB5lB,EAAM2B,EAAOG,QAEV3sB,KAAK8nB,QAAQ4oB,UAAUlkB,IAAWxsB,KAAK+M,IAAIm0B,QAAQ1U,EAAOC,KAAKlqB,MAAMuE,EAAO+jB,GAAKzoB,MAAM,KAAK5B,OAAO,GAAKiwC,GAEnHzwC,KAAKivC,eAAiB,WAClB,IACIvO,EADAlU,EAASxsB,KAAKwtC,KAAKQ,cAGvB,GAAItN,EAAO1gC,KAAK8nB,QAAQ6Y,UAAUnU,EAAOC,IAAKD,EAAOG,QAAS,GAC1D3sB,KAAKquC,aAAa3N,EAAK55B,MAAM2lB,IAAKiU,EAAK55B,MAAM6lB,aAC1C,GAAsB,IAAlBH,EAAOG,OACVH,EAAOC,IAAM,GACbzsB,KAAKquC,aAAa7hB,EAAOC,IAAM,EAAGzsB,KAAK+M,IAAIm0B,QAAQ1U,EAAOC,IAAM,GAAGjsB,YAGtE,CACD,IAAIiwC,EAAUzwC,KAAK8nB,QAAQ6oB,aACvB3wC,KAAKwwC,qBAAqBhkB,EAAQikB,GAAU,KAAOzwC,KAAK8nB,QAAQ8oB,4BAChE5wC,KAAKuwC,aAAa,GAAIE,GAEtBzwC,KAAKuwC,aAAa,GAAI,KAIlCvwC,KAAK+uC,gBAAkB,WACnB,IACIrO,EADAlU,EAASxsB,KAAKwtC,KAAKQ,cAEvB,GAAItN,EAAO1gC,KAAK8nB,QAAQ6Y,UAAUnU,EAAOC,IAAKD,EAAOG,OAAQ,GACzD3sB,KAAKquC,aAAa3N,EAAK7V,IAAI4B,IAAKiU,EAAK7V,IAAI8B,aAExC,GAAI3sB,KAAKwtC,KAAK7gB,QAAU3sB,KAAK+M,IAAIm0B,QAAQlhC,KAAKwtC,KAAK/gB,KAAKjsB,OACrDR,KAAKwtC,KAAK/gB,IAAMzsB,KAAK+M,IAAImlB,YAAc,GACvClyB,KAAKquC,aAAaruC,KAAKwtC,KAAK/gB,IAAM,EAAG,OAGxC,CACD,IAAIgkB,EAAUzwC,KAAK8nB,QAAQ6oB,aACvBnkB,EAASxsB,KAAKwtC,KACdxtC,KAAKwwC,qBAAqBhkB,EAAQikB,EAAS,KAAOzwC,KAAK8nB,QAAQ8oB,4BAC/D5wC,KAAKuwC,aAAa,EAAGE,GAErBzwC,KAAKuwC,aAAa,EAAG,KAIjCvwC,KAAKmvC,oBAAsB,WACvB,IAAI1iB,EAAMzsB,KAAKwtC,KAAK/gB,IAChBE,EAAS3sB,KAAKwtC,KAAK7gB,OACnBwF,EAAYnyB,KAAK8nB,QAAQwK,oBAAoB7F,EAAKE,GAClDkkB,EAAsB7wC,KAAK8nB,QAAQgpB,yBAAyB3e,EAAW,GACvE4e,EAAe/wC,KAAK8nB,QAAQkpB,eAC5BvkB,EAAK,KAAMokB,EAAoBpkB,IAC/BokB,EAAoBlkB,QAGpBskB,EAAeF,EAAartC,MAAM,QAClCutC,EAAa,GAAGzwC,QAAUmsB,GAAW3sB,KAAK8nB,QAAQopB,0BAClDL,EAAoBlkB,QAAUskB,EAAa,GAAGzwC,QAClDR,KAAK20B,qBAAqBkc,IAE9B7wC,KAAKqvC,kBAAoB,WACrB,IAAI7B,EAAOxtC,KAAKwtC,KACZ2D,EAAUnxC,KAAK8nB,QAAQspB,iCAAiC5D,EAAK/gB,IAAK+gB,EAAK7gB,QAC3E,GAAI3sB,KAAKwtC,KAAK7gB,QAAUwkB,EAAQxkB,OAAQ,CACpC,IAAI+a,EAAO1nC,KAAK8nB,QAAQoZ,QAAQiQ,EAAQ1kB,KACxC,GAAI0kB,EAAQxkB,QAAU+a,EAAKlnC,OAAQ,CAC/B,IAAI6wC,EAAU3J,EAAK4J,OAAO,QACtBD,EAAU,IACVF,EAAQxkB,OAAS0kB,IAI7BrxC,KAAKquC,aAAa8C,EAAQ1kB,IAAK0kB,EAAQxkB,SAE3C3sB,KAAKuvC,kBAAoB,WACrB,IAAI9iB,EAAMzsB,KAAK+M,IAAImlB,YAAc,EAC7BvF,EAAS3sB,KAAK+M,IAAIm0B,QAAQzU,GAAKjsB,OACnCR,KAAKquC,aAAa5hB,EAAKE,IAE3B3sB,KAAKyvC,oBAAsB,WACvBzvC,KAAKquC,aAAa,EAAG,IAEzBruC,KAAKuxC,wBAA0B,WAC3B,IAAI9kB,EAAMzsB,KAAKwtC,KAAK/gB,IAChBE,EAAS3sB,KAAKwtC,KAAK7gB,OACnB+a,EAAO1nC,KAAK+M,IAAIm0B,QAAQzU,GACxB+kB,EAAgB9J,EAAKhhB,UAAUiG,GAGnC3sB,KAAK8nB,QAAQ2pB,WAAW1tC,UAAY,EACpC/D,KAAK8nB,QAAQ4pB,QAAQ3tC,UAAY,EACjC,IAAI28B,EAAO1gC,KAAK8nB,QAAQ6Y,UAAUlU,EAAKE,EAAQ,GAC/C,GAAI+T,EACA1gC,KAAKquC,aAAa3N,EAAK7V,IAAI4B,IAAKiU,EAAK7V,IAAI8B,YAD7C,CASA,GALY3sB,KAAK8nB,QAAQ2pB,WAAWluC,KAAKiuC,KACrC7kB,GAAU3sB,KAAK8nB,QAAQ2pB,WAAW1tC,UAClC/D,KAAK8nB,QAAQ2pB,WAAW1tC,UAAY,EACpCytC,EAAgB9J,EAAKhhB,UAAUiG,IAE/BA,GAAU+a,EAAKlnC,OAKf,OAJAR,KAAKquC,aAAa5hB,EAAKib,EAAKlnC,QAC5BR,KAAK+uC,uBACDtiB,EAAMzsB,KAAK+M,IAAImlB,YAAc,GAC7BlyB,KAAK2vC,uBAGD3vC,KAAK8nB,QAAQ4pB,QAAQnuC,KAAKiuC,KAClC7kB,GAAU3sB,KAAK8nB,QAAQ4pB,QAAQ3tC,UAC/B/D,KAAK8nB,QAAQ4pB,QAAQ3tC,UAAY,GAGrC/D,KAAKquC,aAAa5hB,EAAKE,KAE3B3sB,KAAK2xC,uBAAyB,WAC1B,IAEIjR,EAFAjU,EAAMzsB,KAAKwtC,KAAK/gB,IAChBE,EAAS3sB,KAAKwtC,KAAK7gB,OAEvB,GAAI+T,EAAO1gC,KAAK8nB,QAAQ6Y,UAAUlU,EAAKE,GAAS,GAC5C3sB,KAAKquC,aAAa3N,EAAK55B,MAAM2lB,IAAKiU,EAAK55B,MAAM6lB,YADjD,CAKA,IAAIjoB,EAAM1E,KAAK8nB,QAAQ8pB,gBAAgBnlB,EAAKE,GAAS,GAC1C,MAAPjoB,IACAA,EAAM1E,KAAK+M,IAAIm0B,QAAQzU,GAAK/F,UAAU,EAAGiG,IAG7C,IAAIklB,EAAeluB,EAAKlC,cAAc/c,GAStC,GAPA1E,KAAK8nB,QAAQ2pB,WAAW1tC,UAAY,EACpC/D,KAAK8nB,QAAQ4pB,QAAQ3tC,UAAY,EACrB/D,KAAK8nB,QAAQ2pB,WAAWluC,KAAKsuC,KACrCllB,GAAU3sB,KAAK8nB,QAAQ2pB,WAAW1tC,UAClC8tC,EAAeA,EAAatvC,MAAMvC,KAAK8nB,QAAQ2pB,WAAW1tC,WAC1D/D,KAAK8nB,QAAQ2pB,WAAW1tC,UAAY,GAEpC4oB,GAAU,EAKV,OAJA3sB,KAAKquC,aAAa5hB,EAAK,GACvBzsB,KAAKivC,sBACDxiB,EAAM,GACNzsB,KAAK6vC,sBAGD7vC,KAAK8nB,QAAQ4pB,QAAQnuC,KAAKsuC,KAClCllB,GAAU3sB,KAAK8nB,QAAQ4pB,QAAQ3tC,UAC/B/D,KAAK8nB,QAAQ4pB,QAAQ3tC,UAAY,GAGrC/D,KAAKquC,aAAa5hB,EAAKE,KAG3B3sB,KAAK8xC,mBAAqB,SAASN,GAC/B,IAAsBtL,EAAXphC,EAAQ,EACfitC,EAAe,KACfL,EAAU1xC,KAAK8nB,QAAQ4pB,QAG3B,GADAA,EAAQ3tC,UAAY,EACR/D,KAAK8nB,QAAQ4pB,QAAQnuC,KAAKiuC,GAClC1sC,EAAQ9E,KAAK8nB,QAAQ4pB,QAAQ3tC,cAC1B,CACH,OAAQmiC,EAAKsL,EAAc1sC,KAAWitC,EAAatuC,KAAKyiC,GACpDphC,IAEJ,GAAIA,EAAQ,EAAG,CACX4sC,EAAQ3tC,UAAY,EACnB,OAAQmiC,EAAKsL,EAAc1sC,MAAY4sC,EAAQjuC,KAAKyiC,GAGjD,GAFAwL,EAAQ3tC,UAAY,EACpBe,IACIitC,EAAatuC,KAAKyiC,GAAK,CACvB,GAAIphC,EAAQ,EAAG,CACXA,IACA,MAEA,OAAQohC,EAAKsL,EAAc1sC,KAAWitC,EAAatuC,KAAKyiC,GACpDphC,IACJ,GAAIA,EAAQ,EACR,QAQxB,OAFA4sC,EAAQ3tC,UAAY,EAEbe,GAGX9E,KAAKgyC,yBAA2B,WAC5B,IAAIvlB,EAAMzsB,KAAKwtC,KAAK/gB,IAChBE,EAAS3sB,KAAKwtC,KAAK7gB,OACnB+a,EAAO1nC,KAAK+M,IAAIm0B,QAAQzU,GACxB+kB,EAAgB9J,EAAKhhB,UAAUiG,GAE/B+T,EAAO1gC,KAAK8nB,QAAQ6Y,UAAUlU,EAAKE,EAAQ,GAC/C,GAAI+T,EACA,OAAO1gC,KAAKquC,aAAa3N,EAAK7V,IAAI4B,IAAKiU,EAAK7V,IAAI8B,QAEpD,GAAIA,GAAU+a,EAAKlnC,OAAQ,CACvB,IAAImB,EAAI3B,KAAK+M,IAAImlB,YACjB,GACIzF,IACA+kB,EAAgBxxC,KAAK+M,IAAIm0B,QAAQzU,SAC5BA,EAAM9qB,GAAK,QAAQ8B,KAAK+tC,IAE5B,OAAO/tC,KAAK+tC,KACbA,EAAgB,IACpB7kB,EAAS,EAGb,IAAI7nB,EAAQ9E,KAAK8xC,mBAAmBN,GAEpCxxC,KAAKquC,aAAa5hB,EAAKE,EAAS7nB,IAGpC9E,KAAKiyC,wBAA0B,WAC3B,IAGIvR,EAHAjU,EAAMzsB,KAAKwtC,KAAK/gB,IAChBE,EAAS3sB,KAAKwtC,KAAK7gB,OAGvB,GAAI+T,EAAO1gC,KAAK8nB,QAAQ6Y,UAAUlU,EAAKE,GAAS,GAC5C,OAAO3sB,KAAKquC,aAAa3N,EAAK55B,MAAM2lB,IAAKiU,EAAK55B,MAAM6lB,QAExD,IAAI+a,EAAO1nC,KAAK8nB,QAAQoZ,QAAQzU,GAAK/F,UAAU,EAAGiG,GAClD,GAAe,IAAXA,EAAc,CACd,GACIF,IACAib,EAAO1nC,KAAK+M,IAAIm0B,QAAQzU,SACnBA,EAAM,GAAK,QAAQhpB,KAAKikC,IAEjC/a,EAAS+a,EAAKlnC,OACT,OAAOiD,KAAKikC,KACbA,EAAO,IAGf,IAAImK,EAAeluB,EAAKlC,cAAcimB,GAClC5iC,EAAQ9E,KAAK8xC,mBAAmBD,GAEpC,OAAO7xC,KAAKquC,aAAa5hB,EAAKE,EAAS7nB,IAG3C9E,KAAK2vC,oBAAsB,WACnB3vC,KAAK8nB,QAAQoqB,iBACblyC,KAAKuxC,0BAELvxC,KAAKgyC,4BAGbhyC,KAAK6vC,mBAAqB,WAClB7vC,KAAK8nB,QAAQoqB,iBACblyC,KAAK2xC,yBAEL3xC,KAAKiyC,2BAEbjyC,KAAKuwC,aAAe,SAAS4B,EAAM1N,GAC/B,IAKI2N,EALAC,EAAYryC,KAAK8nB,QAAQqlB,yBACzBntC,KAAKwtC,KAAK/gB,IACVzsB,KAAKwtC,KAAK7gB,QAKA,IAAV8X,IACa,IAAT0N,IACInyC,KAAK8nB,QAAQwqB,aAAavK,UAAUsK,EAAU5lB,IAAKzsB,KAAKwtC,KAAK/gB,MAC7D2lB,EAAUpyC,KAAK8nB,QAAQwqB,aAAapI,WAAWmI,EAAU1lB,QACzD0lB,EAAU1lB,OAASzlB,KAAKqrC,MAAMH,EAAUpyC,KAAK8nB,QAAQwqB,aAAahL,WAAW,KAE7E8K,EAAUC,EAAU1lB,OAAS3sB,KAAK8nB,QAAQwqB,aAAahL,WAAW,IAItEtnC,KAAK8tC,eACLuE,EAAU1lB,OAAS3sB,KAAK8tC,eAExB9tC,KAAK8tC,eAAiBuE,EAAU1lB,QAGxC,IAAI6lB,EAASxyC,KAAK8nB,QAAQgpB,yBAAyBuB,EAAU5lB,IAAM0lB,EAAME,EAAU1lB,OAAQylB,GAE9E,IAATD,GAAwB,IAAV1N,GAAe+N,EAAO/lB,MAAQzsB,KAAKwtC,KAAK/gB,KAAO+lB,EAAO7lB,SAAW3sB,KAAKwtC,KAAK7gB,QACrF3sB,KAAK8nB,QAAQ2qB,aAAezyC,KAAK8nB,QAAQ2qB,YAAYD,EAAO/lB,OACxD+lB,EAAO/lB,IAAM,GAAK0lB,EAAO,IACzBK,EAAO/lB,MAGnBzsB,KAAKquC,aAAamE,EAAO/lB,IAAK+lB,EAAO7lB,OAAS8X,EAAiB,IAAVA,IAEzDzkC,KAAK20B,qBAAuB,SAAShlB,GACjC3P,KAAKquC,aAAa1+B,EAAS8c,IAAK9c,EAASgd,SAE7C3sB,KAAKquC,aAAe,SAAS5hB,EAAKE,EAAQ+lB,GACtC,IAAIhS,EAAO1gC,KAAK8nB,QAAQ6Y,UAAUlU,EAAKE,EAAQ,GAC3C+T,IACAjU,EAAMiU,EAAK55B,MAAM2lB,IACjBE,EAAS+T,EAAK55B,MAAM6lB,QAGxB3sB,KAAK6tC,4BAA6B,EAClC,IAAInG,EAAO1nC,KAAK8nB,QAAQoZ,QAAQzU,GAC5B,kBAAkBhpB,KAAKikC,EAAKrlC,OAAOsqB,KAAY+a,EAAKrlC,OAAOsqB,EAAS,KAChE3sB,KAAKwtC,KAAK/gB,KAAOA,GAAOzsB,KAAKwtC,KAAK7gB,QAAUA,EAAS,EACrDA,GAAkB,EAElBA,GAAkB,GAE1B3sB,KAAKwtC,KAAK3c,YAAYpE,EAAKE,GAC3B3sB,KAAK6tC,4BAA6B,EAE7B6E,IACD1yC,KAAK8tC,eAAiB,OAE9B9tC,KAAK2yC,mBAAqB,SAASlmB,EAAKE,EAAQ+lB,GAC5C,IAAI1rC,EAAMhH,KAAK8nB,QAAQgpB,yBAAyBrkB,EAAKE,GACrD3sB,KAAKquC,aAAarnC,EAAIylB,IAAKzlB,EAAI2lB,OAAQ+lB,IAE3C1yC,KAAKkiC,OAAS,WACVliC,KAAKwtC,KAAKtL,SACVliC,KAAK4sB,OAAOsV,SACZliC,KAAK8nB,QAAU9nB,KAAK+M,IAAM,MAG9B/M,KAAKm2B,kBAAoB,SAASzN,GAC9B1oB,KAAK4lB,kBAAkB8C,EAAOA,EAAM8D,QAAU9D,EAAM5hB,OACpD9G,KAAK8tC,eAAiBplB,EAAMkqB,eAAiB5yC,KAAK8tC,gBAGtD9tC,KAAKy1B,gBAAkB,SAAS/M,GAC5B,IAAIF,EAAIxoB,KAAKyoB,WAYb,OAXIC,GACAA,EAAM5hB,MAAM6lB,OAASnE,EAAE1hB,MAAM6lB,OAC7BjE,EAAM5hB,MAAM2lB,IAAMjE,EAAE1hB,MAAM2lB,IAC1B/D,EAAMmC,IAAI8B,OAASnE,EAAEqC,IAAI8B,OACzBjE,EAAMmC,IAAI4B,IAAMjE,EAAEqC,IAAI4B,KAEtB/D,EAAQF,EAGZE,EAAM8D,OAASxsB,KAAKsuC,cAAgB5lB,EAAM5hB,MAAQ4hB,EAAMmC,IACxDnC,EAAMkqB,cAAgB5yC,KAAK8tC,eACpBplB,GAEX1oB,KAAK6yC,oBAAsB,SAASC,GAChC,IAAIhsC,EAAQ9G,KAAK+tC,YACjB,IACI+E,EAAK9yC,MACL,IAAI6qB,EAAM7qB,KAAK+tC,YACf,OAAOzC,EAAMuB,WAAW/lC,EAAM+jB,GAChC,MAAMzO,GACJ,OAAOkvB,EAAMuB,WAAW/lC,EAAMA,GAChC,QACE9G,KAAK20B,qBAAqB7tB,KAIlC9G,KAAK+yC,OAAS,WACV,GAAI/yC,KAAKgzC,WACL,IAAI/xB,EAAOjhB,KAAKizC,OAAOzqC,IAAI,SAASggB,GAChC,IAAI0qB,EAAK1qB,EAAEukB,QAEX,OADAmG,EAAG5E,YAAc9lB,EAAEgE,QAAUhE,EAAE1hB,MACxBosC,QAER,CACCjyB,EAAOjhB,KAAKyoB,WAChBxH,EAAKqtB,YAActuC,KAAKsuC,cAE5B,OAAOrtB,GAGXjhB,KAAKmzC,SAAW,SAASlyB,GACrB,QAAkB7f,GAAd6f,EAAKna,MAAoB,CACzB,GAAI9G,KAAKozC,UAAW,CAChBpzC,KAAKqzC,cAAcpyB,EAAK,IACxB,IAAK,IAAIvf,EAAIuf,EAAKzgB,OAAQkB,KAAO,CAC7B,IAAI8mB,EAAI8iB,EAAMuB,WAAW5rB,EAAKvf,GAAGoF,MAAOma,EAAKvf,GAAGmpB,KAC5C5J,EAAKvf,GAAG4sC,cACR9lB,EAAEgE,OAAShE,EAAE1hB,OACjB9G,KAAKszC,SAAS9qB,GAAG,GAErB,OAEAvH,EAAOA,EAAK,GAEhBjhB,KAAKozC,WACLpzC,KAAKqzC,cAAcpyB,GACvBjhB,KAAK4lB,kBAAkB3E,EAAMA,EAAKqtB,cAGtCtuC,KAAK2rC,QAAU,SAAS1qB,GACpB,IAAKA,EAAKzgB,QAAUR,KAAKgzC,aAAe/xB,EAAKzgB,QAAUR,KAAKgzC,WACxD,OAAO,EACX,IAAK/xB,EAAKzgB,SAAWR,KAAKizC,OACtB,OAAOjzC,KAAKyoB,WAAWkjB,QAAQ1qB,GAEnC,IAAK,IAAIvf,EAAI1B,KAAKizC,OAAOzyC,OAAQkB,KAC7B,IAAK1B,KAAKizC,OAAOvxC,GAAGiqC,QAAQ1qB,EAAKvf,IAC7B,OAAO,EAEf,OAAO,KAGZF,KAAK8rC,EAAUhsC,WAElBqB,EAAQ2qC,UAAYA,IAGpBjqC,IAAIlD,OAAO,gBAAgB,CAAC,UAAU,UAAU,SAAS,cAAe,SAAS0B,EAAUc,EAASvC,GACpG,aAEA,IAAIw+B,EAAS/8B,EAAS,YAClB0xC,EAAkB,IAClBC,EAAY,SAASC,GAKrB,IAAK,IAAIznC,KAJThM,KAAK0zC,OAASD,EAEdzzC,KAAK2zC,QAAU,GACf3zC,KAAK4zC,cAAgB,GACL5zC,KAAK0zC,OAAQ,CAQzB,IAPA,IAAIrb,EAAQr4B,KAAK0zC,OAAO1nC,GACpB6nC,EAAc,GACdC,EAAa,EACbC,EAAU/zC,KAAK4zC,cAAc5nC,GAAO,CAACgoC,aAAc,QACnDC,EAAO,IAEPC,EAAiB,GACZxyC,EAAI,EAAGA,EAAI22B,EAAM73B,OAAQkB,IAAK,CACnC,IAAIyyC,EAAO9b,EAAM32B,GAKjB,GAJIyyC,EAAKH,eACLD,EAAQC,aAAeG,EAAKH,cAC5BG,EAAKC,kBACLH,EAAO,MACO,MAAdE,EAAKlwC,MAAT,CAGIkwC,EAAKlwC,iBAAiBT,SACtB2wC,EAAKlwC,MAAQkwC,EAAKlwC,MAAM1C,WAAWgB,MAAM,GAAI,IACjD,IAAI8xC,EAAgBF,EAAKlwC,MACrBqwC,EAAa,IAAI9wC,OAAO,OAAS6wC,EAAgB,UAAU9wC,KAAK,KAAK/C,OAAS,EAC9EiE,MAAMoD,QAAQssC,EAAKI,OACM,GAArBJ,EAAKI,MAAM/zC,QAA6B,GAAd8zC,EAC1BH,EAAKI,MAAQJ,EAAKI,MAAM,GACjBD,EAAa,GAAKH,EAAKI,MAAM/zC,QACpCR,KAAKy7B,YAAY,oDAAqD,CAClE0Y,KAAMA,EACNK,WAAYF,EAAa,IAE7BH,EAAKI,MAAQJ,EAAKI,MAAM,KAExBJ,EAAKM,WAAaN,EAAKI,MACvBJ,EAAKI,MAAQ,KACbJ,EAAKO,QAAU10C,KAAK20C,cAEI,mBAAdR,EAAKI,OAAwBJ,EAAKO,UAE5CP,EAAKO,QADLJ,EAAa,EACEt0C,KAAK40C,YAELT,EAAKI,OAGxBD,EAAa,IACT,OAAO7wC,KAAK0wC,EAAKlwC,OACjBowC,EAAgBF,EAAKlwC,MAAMvB,QAAQ,cAAe,SAASgB,EAAOmxC,GAC9D,MAAO,MAAQ9lC,SAAS8lC,EAAO,IAAMf,EAAa,MAGtDQ,EAAa,EACbD,EAAgBr0C,KAAK80C,sBAAsBX,EAAKlwC,QAE/CkwC,EAAKY,YAAmC,iBAAdZ,EAAKI,OAChCL,EAAepyC,KAAKqyC,IAG5BJ,EAAQD,GAAcpyC,EACtBoyC,GAAcQ,EAEdT,EAAY/xC,KAAKuyC,GACZF,EAAKO,UACNP,EAAKO,QAAU,OAGlBb,EAAYrzC,SACbuzC,EAAQ,GAAK,EACbF,EAAY/xC,KAAK,MAGrBoyC,EAAehsC,QAAQ,SAASisC,GAC5BA,EAAKY,WAAa/0C,KAAKg1C,qBAAqBb,EAAKlwC,MAAOgwC,IACzDj0C,MAEHA,KAAK2zC,QAAQ3nC,GAAO,IAAIxI,OAAO,IAAMqwC,EAAYrxC,KAAK,OAAS,QAASyxC,MAIhF,WACIj0C,KAAKi1C,kBAAoB,SAAStX,GAC9B4V,EAAsB,EAAJ5V,GAGtB39B,KAAK40C,YAAc,SAASlwC,GACxB,IAAIwwC,EAASl1C,KAAK+0C,WAAWxxC,KAAKmB,GAAKnC,MAAM,GACzCk1B,EAAQz3B,KAAKu0C,MAAM3zC,MAAMZ,KAAMk1C,GACnC,GAAqB,kBAAVzd,EACP,MAAO,CAAC,CAAC/b,KAAM+b,EAAO/uB,MAAOhE,IAGjC,IADA,IAAIywC,EAAS,GACJzzC,EAAI,EAAGC,EAAI81B,EAAMj3B,OAAQkB,EAAIC,EAAGD,IACjCwzC,EAAOxzC,KACPyzC,EAAOA,EAAO30C,QAAU,CACpBkb,KAAM+b,EAAM/1B,GACZgH,MAAOwsC,EAAOxzC,KAG1B,OAAOyzC,GAGXn1C,KAAK20C,aAAe,SAASjwC,GACzB,IAAKA,EACD,MAAO,GACX,IAAIwwC,EAASl1C,KAAK+0C,WAAWxxC,KAAKmB,GAClC,IAAKwwC,EACD,MAAO,OAGX,IAFA,IAAIC,EAAS,GACT1d,EAAQz3B,KAAKy0C,WACR/yC,EAAI,EAAGC,EAAI81B,EAAMj3B,OAAQkB,EAAIC,EAAGD,IACjCwzC,EAAOxzC,EAAI,KACXyzC,EAAOA,EAAO30C,QAAU,CACpBkb,KAAM+b,EAAM/1B,GACZgH,MAAOwsC,EAAOxzC,EAAI,KAG9B,OAAOyzC,GAGXn1C,KAAK80C,sBAAwB,SAASjhB,GAClC,IAAIrL,EAAIqL,EAAInxB,QACR,0CACA,SAASoB,EAAGgqB,GAAI,OAAOA,EAAI,MAAQhqB,IAEvC,OAAO0kB,GAGXxoB,KAAKg1C,qBAAuB,SAASnhB,EAAKogB,GACtC,IAA2B,GAAvBpgB,EAAI3xB,QAAQ,OAAc,CAC1B,IAAIkzC,EAAQ,EACRC,GAAY,EACZC,EAAc,GAClBzhB,EAAInxB,QAAQ,uCAAwC,SAChDi7B,EAAG9kB,EAAK08B,EAAWC,EAAYC,EAAQ3wC,GAmBvC,OAjBIuwC,EACAA,EAAsB,KAAVI,EACLA,EACPJ,GAAY,EACLG,GACHJ,GAASE,EAAYF,QACrBE,EAAYzqB,IAAM/lB,EAAM,EACxBwwC,EAAYF,OAAS,GAEzBA,KACOG,IACPH,IACwB,GAApBG,EAAU/0C,SACV80C,EAAYF,MAAQA,EACpBE,EAAYxuC,MAAQhC,IAGrB64B,IAGY,MAAnB2X,EAAYzqB,KAAe,QAAQpnB,KAAKowB,EAAIrN,OAAO8uB,EAAYzqB,QAC/DgJ,EAAMA,EAAInN,UAAU,EAAG4uB,EAAYxuC,OAAS+sB,EAAIrN,OAAO8uB,EAAYzqB,MAK3E,MAHqB,KAAjBgJ,EAAIxxB,OAAO,KAAWwxB,EAAM,IAAMA,GACJ,KAA9BA,EAAIxxB,OAAOwxB,EAAIrzB,OAAS,KAAWqzB,GAAO,KAEvC,IAAIrwB,OAAOqwB,GAAMogB,GAAM,IAAIvxC,QAAQ,IAAK,MAEnD1C,KAAK01C,cAAgB,SAAShO,EAAMiO,GAChC,GAAIA,GAAmC,iBAAdA,EAAwB,CAC7C,IAAIP,EAAQO,EAAWpzC,MAAM,GAC7BozC,EAAaP,EAAM,GACA,SAAfO,IACAP,EAAMrqB,QACN4qB,EAAaP,EAAMrqB,cAGnBqqB,EAAQ,GAEhB,IAAIQ,EAAeD,GAAc,QAC7Btd,EAAQr4B,KAAK0zC,OAAOkC,GACnBvd,IACDud,EAAe,QACfvd,EAAQr4B,KAAK0zC,OAAOkC,IAExB,IAAI7B,EAAU/zC,KAAK4zC,cAAcgC,GAC7BzX,EAAKn+B,KAAK2zC,QAAQiC,GACtBzX,EAAGp6B,UAAY,EAEf,IAAIL,EAAOyxC,EAAS,GAChBpxC,EAAY,EACZ8xC,EAAgB,EAEhBtB,EAAQ,CAAC74B,KAAM,KAAMhT,MAAO,IAEhC,MAAOhF,EAAQy6B,EAAG56B,KAAKmkC,GAAO,CAC1B,IAAIhsB,EAAOq4B,EAAQC,aACfG,EAAO,KACPzrC,EAAQhF,EAAM,GACdoB,EAAQq5B,EAAGp6B,UAEf,GAAIe,EAAQ4D,EAAMlI,OAASuD,EAAW,CAClC,IAAI+xC,EAAUpO,EAAKhhB,UAAU3iB,EAAWe,EAAQ4D,EAAMlI,QAClD+zC,EAAM74B,MAAQA,EACd64B,EAAM7rC,OAASotC,GAEXvB,EAAM74B,MACNy5B,EAAOrzC,KAAKyyC,GAChBA,EAAQ,CAAC74B,KAAMA,EAAMhT,MAAOotC,IAIpC,IAAK,IAAIp0C,EAAI,EAAGA,EAAIgC,EAAMlD,OAAO,EAAGkB,IAChC,QAAqBN,IAAjBsC,EAAMhC,EAAI,GAAd,CAGAyyC,EAAO9b,EAAM0b,EAAQryC,IAGjBga,EADAy4B,EAAKO,QACEP,EAAKO,QAAQhsC,EAAOktC,EAAcR,EAAO1N,GAEzCyM,EAAKI,MAEZJ,EAAK4B,OAEDH,EADoB,iBAAbzB,EAAK4B,KACG5B,EAAK4B,KAEL5B,EAAK4B,KAAKH,EAAcR,GAG3C/c,EAAQr4B,KAAK0zC,OAAOkC,GACfvd,IACDr4B,KAAKy7B,YAAY,sBAAuBma,GACxCA,EAAe,QACfvd,EAAQr4B,KAAK0zC,OAAOkC,IAExB7B,EAAU/zC,KAAK4zC,cAAcgC,GAC7B7xC,EAAYe,EACZq5B,EAAKn+B,KAAK2zC,QAAQiC,GAClBzX,EAAGp6B,UAAYe,GAEfqvC,EAAK6B,iBACLjyC,EAAYe,GAChB,MAGJ,GAAI4D,EACA,GAAoB,kBAATgT,EACDy4B,IAAuB,IAAfA,EAAK8B,OAAoB1B,EAAM74B,OAASA,GAG9C64B,EAAM74B,MACNy5B,EAAOrzC,KAAKyyC,GAChBA,EAAQ,CAAC74B,KAAMA,EAAMhT,MAAOA,IAJ5B6rC,EAAM7rC,OAASA,OAMhB,GAAIgT,EAAM,CACT64B,EAAM74B,MACNy5B,EAAOrzC,KAAKyyC,GAChBA,EAAQ,CAAC74B,KAAM,KAAMhT,MAAO,IAC5B,IAAShH,EAAI,EAAGA,EAAIga,EAAKlb,OAAQkB,IAC7ByzC,EAAOrzC,KAAK4Z,EAAKha,IAI7B,GAAIqC,GAAa2jC,EAAKlnC,OAClB,MAIJ,GAFAuD,EAAYe,EAER+wC,IAAkBtC,EAAiB,CAC/BsC,EAAgB,EAAInO,EAAKlnC,QACzBR,KAAKy7B,YAAY,sCAAuC,CACpDka,WAAYA,EACZjO,KAAMA,IAGd,MAAO3jC,EAAY2jC,EAAKlnC,OAChB+zC,EAAM74B,MACNy5B,EAAOrzC,KAAKyyC,GAChBA,EAAQ,CACJ7rC,MAAOg/B,EAAKhhB,UAAU3iB,EAAWA,GAAa,KAC9C2X,KAAM,YAGdk6B,EAAe,QACfR,EAAQ,GACR,OAWR,OAPIb,EAAM74B,MACNy5B,EAAOrzC,KAAKyyC,GAEZa,EAAM50C,OAAS,GACX40C,EAAM,KAAOQ,GACbR,EAAMc,QAAQ,OAAQN,GAEvB,CACHT,OAASA,EACT9c,MAAQ+c,EAAM50C,OAAS40C,EAAQQ,IAIvC51C,KAAKy7B,YAAcmD,EAAOnD,cAE3Bj6B,KAAKgyC,EAAUlyC,WAElBqB,EAAQ6wC,UAAYA,IAGpBnwC,IAAIlD,OAAO,gCAAgC,CAAC,UAAU,UAAU,SAAS,gBAAiB,SAAS0B,EAAUc,EAASvC,GACtH,aAEA,IAAIujB,EAAO9hB,EAAS,eAEhBs0C,EAAqB,WAErBn2C,KAAKo2C,OAAS,CACV,MAAU,CAAC,CACP7B,MAAQ,aACRtwC,MAAQ,MACT,CACC+vC,aAAe,YAK3B,WAEIh0C,KAAKq2C,SAAW,SAAS5C,EAAO6C,GAC5B,GAAKA,EAKL,IAAK,IAAItqC,KAAOynC,EAAO,CAEnB,IADA,IAAIpb,EAAQob,EAAMznC,GACTtK,EAAI,EAAGA,EAAI22B,EAAM73B,OAAQkB,IAAK,CACnC,IAAIyyC,EAAO9b,EAAM32B,IACbyyC,EAAK4B,MAAQ5B,EAAKO,WACM,iBAAbP,EAAK4B,MACsB,IAA9B5B,EAAK4B,KAAK7zC,QAAQo0C,KAClBnC,EAAK4B,KAAOO,EAASnC,EAAK4B,MAE9B5B,EAAKoC,WAAgD,IAAnCpC,EAAKoC,UAAUr0C,QAAQo0C,KACzCnC,EAAKoC,UAAYD,EAASnC,EAAKoC,YAG3Cv2C,KAAKo2C,OAAOE,EAAStqC,GAAOqsB,OAjB5B,IAAK,IAAIrsB,KAAOynC,EACZzzC,KAAKo2C,OAAOpqC,GAAOynC,EAAMznC,IAoBrChM,KAAKw2C,SAAW,WACZ,OAAOx2C,KAAKo2C,QAGhBp2C,KAAKy2C,WAAa,SAAUC,EAAgBJ,EAAQK,EAAajD,EAAQkD,GACrE,IAAIH,EAAsC,mBAAlBC,GAClB,IAAIA,GAAiBF,WACrBE,EACN,GAAIhD,EACA,IAAK,IAAIhyC,EAAI,EAAGA,EAAIgyC,EAAOlzC,OAAQkB,IAC/BgyC,EAAOhyC,GAAK40C,EAAS5C,EAAOhyC,QAGhC,IAAK,IAAIsK,KADT0nC,EAAS,GACO+C,EACZ/C,EAAO5xC,KAAKw0C,EAAStqC,GAK7B,GAFAhM,KAAKq2C,SAASI,EAAYH,GAEtBK,EACA,KAAIN,EAAW5xC,MAAMnD,UAAUs1C,EAAS,OAAS,WACjD,IAASl1C,EAAI,EAAGA,EAAIgyC,EAAOlzC,OAAQkB,IAC/B20C,EAASz1C,MAAMZ,KAAKo2C,OAAO1C,EAAOhyC,IAAKiiB,EAAKxB,SAASw0B,IAGxD32C,KAAK62C,UACN72C,KAAK62C,QAAU,IACnB72C,KAAK62C,QAAQ/0C,KAAKw0C,IAGtBt2C,KAAK82C,UAAY,WACb,OAAO92C,KAAK62C,SAGhB,IAAIE,EAAY,SAASnB,EAAcR,GAGnC,OAFoB,SAAhBQ,GAA2BR,EAAM50C,SACjC40C,EAAMc,QAAQl2C,KAAKu2C,UAAWX,GAC3B51C,KAAKu2C,WAEZS,EAAW,SAASpB,EAAcR,GAElC,OADAA,EAAMrqB,QACCqqB,EAAMrqB,SAAW,SAG5B/qB,KAAKi3C,eAAiB,WAClB,IAAIp0C,EAAK,EACL4wC,EAAQzzC,KAAKo2C,OACjB,SAASc,EAAalrC,GAClB,IAAIqsB,EAAQob,EAAMznC,GAClBqsB,EAAM8e,WAAY,EAClB,IAAK,IAAIz1C,EAAI,EAAGA,EAAI22B,EAAM73B,OAAQkB,IAAK,CACnC,IAAIyyC,EAAO9b,EAAM32B,GACb01C,EAAW,KACX3yC,MAAMoD,QAAQssC,KACdiD,EAAWjD,EACXA,EAAO,KAENA,EAAKlwC,OAASkwC,EAAKrtC,QACpBqtC,EAAKlwC,MAAQkwC,EAAKrtC,MACbqtC,EAAK4B,OACN5B,EAAK4B,KAAO,IAChB5B,EAAK4B,KAAKj0C,KAAK,CACXkyC,aAAcG,EAAKI,OACpB,CACCA,MAAOJ,EAAKI,MAAQ,OACpBtwC,MAAOkwC,EAAKtpB,KAAOspB,EAAKrtC,MACxBivC,KAAM,QAEV5B,EAAKI,MAAQJ,EAAKI,MAAQ,SAC1BJ,EAAKryC,MAAO,GAEhB,IAAIi0C,EAAO5B,EAAK4B,MAAQ5B,EAAKryC,KAC7B,GAAIi0C,GAAQtxC,MAAMoD,QAAQkuC,GAAO,CAC7B,IAAIsB,EAAYlD,EAAKkD,UAChBA,IACDA,EAAYlD,EAAKI,MACO,iBAAb8C,IACPA,EAAYA,EAAU,IAAM,IAC5B5D,EAAM4D,KACNA,GAAax0C,MAErB4wC,EAAM4D,GAAatB,EACnB5B,EAAK4B,KAAOsB,EACZH,EAAaG,OACE,OAARtB,IACP5B,EAAK4B,KAAOiB,GAShB,GANI7C,EAAKryC,OACLqyC,EAAKoC,UAAYpC,EAAK4B,MAAQ5B,EAAKryC,KACnCqyC,EAAK4B,KAAOgB,SACL5C,EAAKryC,MAGZqyC,EAAKV,MACL,IAAK,IAAIjrB,KAAK2rB,EAAKV,MACXA,EAAMjrB,GACFirB,EAAMjrB,GAAG1mB,MACT2xC,EAAMjrB,GAAG1mB,KAAKlB,MAAM6yC,EAAMjrB,GAAI2rB,EAAKV,MAAMjrB,IAE7CirB,EAAMjrB,GAAK2rB,EAAKV,MAAMjrB,GAIlC,IAAI8uB,EAA6B,iBAARnD,EAAmBA,EAAOA,EAAKrmC,QAQxD,GAPIwpC,IAEIF,EADA3yC,MAAMoD,QAAQyvC,GACHA,EAAY9uC,IAAI,SAAS1E,GAAK,OAAO2vC,EAAM3vC,KAE3C2vC,EAAM6D,IAGrBF,EAAU,CACV,IAAI7xC,EAAO,CAAC7D,EAAG,GAAGgE,OAAO0xC,GACrBjD,EAAKoD,WACLhyC,EAAOA,EAAKkD,OAAO,SAAS3E,GAAI,OAAQA,EAAEiyC,QAC9C1d,EAAM5xB,OAAO7F,MAAMy3B,EAAO9yB,GAC1B7D,IAGAyyC,EAAKqD,aACLrD,EAAKI,MAAQv0C,KAAKy3C,oBACdtD,EAAKqD,WAAYrD,EAAKH,cAAgB,OAAQG,EAAKC,wBAEhDD,EAAKH,eAIxB3yC,OAAO4I,KAAKwpC,GAAOvrC,QAAQgvC,EAAcl3C,OAG7CA,KAAKy3C,oBAAsB,SAASjvC,EAAKwrC,EAAc9vC,EAAYwzC,GAC/D,IAAIC,EAAWt2C,OAAO6I,OAAO,MAc7B,OAbA7I,OAAO4I,KAAKzB,GAAKN,QAAQ,SAASsF,GAC9B,IAAI7G,EAAI6B,EAAIgF,GACRtJ,IACAyC,EAAIA,EAAE+R,eAEV,IADA,IAAIk/B,EAAOjxC,EAAEvE,MAAMs1C,GAAa,KACvBh2C,EAAIk2C,EAAKp3C,OAAQkB,KACtBi2C,EAASC,EAAKl2C,IAAM8L,IAExBnM,OAAO8H,eAAewuC,KACtBA,EAASvuC,UAAY,MAEzBpJ,KAAK63C,aAAex2C,OAAO4I,KAAK0tC,GAChCnvC,EAAM,KACCtE,EACD,SAASwE,GAAQ,OAAOivC,EAASjvC,EAAMgQ,gBAAkBs7B,GACzD,SAAStrC,GAAQ,OAAOivC,EAASjvC,IAAUsrC,IAGrDh0C,KAAK83C,YAAc,WACf,OAAO93C,KAAK+3C,aAGjBv2C,KAAK20C,EAAmB70C,WAE3BqB,EAAQwzC,mBAAqBA,IAG7B9yC,IAAIlD,OAAO,qBAAqB,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GAC5F,aAEA,IAAI43C,EAAY,WACbh4C,KAAKi4C,YAAc,KAGtB,WAEIj4C,KAAKsH,IAAM,SAAU3C,EAAMugC,EAAQhkC,GAC/B,YAAQE,GACN,KAAKpB,KAAKi4C,YACNj4C,KAAKi4C,YAAc,GACvB,KAAKj4C,KAAKi4C,YAAYtzC,GAClB3E,KAAKi4C,YAAYtzC,GAAQ,GAE/B3E,KAAKi4C,YAAYtzC,GAAMugC,GAAUhkC,GAGrClB,KAAKk4C,cAAgB,SAAUC,GAC3B,IAAK,IAAInsC,KAAOmsC,EACZ,IAAK,IAAIjT,KAAUiT,EAAWnsC,GAC1BhM,KAAKsH,IAAI0E,EAAKk5B,EAAQiT,EAAWnsC,GAAKk5B,KAKlDllC,KAAKuH,OAAS,SAAU5C,GAChB3E,KAAKi4C,aAAej4C,KAAKi4C,YAAYtzC,WAC9B3E,KAAKi4C,YAAYtzC,IAIhC3E,KAAKo4C,QAAU,SAAUC,EAAM5vC,GAC3B,GAAoB,oBAAT4vC,EACP,IAAIF,GAAa,IAAIE,GAAOC,cAAc7vC,QAEtC0vC,EAAaE,EAAKC,cAAc7vC,GAExCzI,KAAKk4C,cAAcC,IAGvBn4C,KAAKs4C,cAAgB,SAAU7vC,GAC3B,GAAKA,EAEE,CAEH,IADA,IAAIyJ,EAAM,GACDxQ,EAAI,EAAGA,EAAI+G,EAAOjI,OAAQkB,IAC3B1B,KAAKi4C,YAAYxvC,EAAO/G,MACxBwQ,EAAIzJ,EAAO/G,IAAM1B,KAAKi4C,YAAYxvC,EAAO/G,KAGjD,OAAOwQ,EARP,OAAOlS,KAAKi4C,eAYrBz2C,KAAKw2C,EAAU12C,WAElBqB,EAAQq1C,UAAYA,IAGpB30C,IAAIlD,OAAO,qBAAqB,CAAC,UAAU,UAAU,SAAS,aAAc,SAAS0B,EAAUc,EAASvC,GACxG,aAEA,IAAIkrC,EAAQzpC,EAAS,WAAWypC,MAC5BiN,EAAgB,SAASzwB,EAAS0wB,EAAYC,GAC9Cz4C,KAAK04C,SAAW5wB,EAChB9nB,KAAK24C,KAAOH,EACZx4C,KAAK44C,WAAa9wB,EAAQ+wB,UAAUL,GAEpC,IAAIjE,EAAQzsB,EAAQgxB,WAAWN,EAAYC,GAC3Cz4C,KAAK+4C,YAAcxE,EAAQA,EAAMzvC,OAAS,IAG9C,WACI9E,KAAKg5C,aAAe,WAChBh5C,KAAK+4C,aAAe,EAEpB,MAAO/4C,KAAK+4C,YAAc,EAAG,CAEzB,GADA/4C,KAAK24C,MAAQ,EACT34C,KAAK24C,KAAO,EAEZ,OADA34C,KAAK24C,KAAO,EACL,KAGX34C,KAAK44C,WAAa54C,KAAK04C,SAASG,UAAU74C,KAAK24C,MAC/C34C,KAAK+4C,YAAc/4C,KAAK44C,WAAWp4C,OAAS,EAGhD,OAAOR,KAAK44C,WAAW54C,KAAK+4C,cAEhC/4C,KAAKi5C,YAAc,WAEf,IAAIC,EADJl5C,KAAK+4C,aAAe,EAEpB,MAAO/4C,KAAK+4C,aAAe/4C,KAAK44C,WAAWp4C,OAAQ,CAI/C,GAHAR,KAAK24C,MAAQ,EACRO,IACDA,EAAWl5C,KAAK04C,SAASxmB,aACzBlyB,KAAK24C,MAAQO,EAEb,OADAl5C,KAAK24C,KAAOO,EAAW,EAChB,KAGXl5C,KAAK44C,WAAa54C,KAAK04C,SAASG,UAAU74C,KAAK24C,MAC/C34C,KAAK+4C,YAAc,EAGvB,OAAO/4C,KAAK44C,WAAW54C,KAAK+4C,cAEhC/4C,KAAKm5C,gBAAkB,WACnB,OAAOn5C,KAAK44C,WAAW54C,KAAK+4C,cAEhC/4C,KAAKo5C,mBAAqB,WACtB,OAAOp5C,KAAK24C,MAEhB34C,KAAKq5C,sBAAwB,WACzB,IAAIC,EAAYt5C,KAAK44C,WACjBW,EAAav5C,KAAK+4C,YAClBpsB,EAAS2sB,EAAUC,GAAYzyC,MACnC,QAAe1F,IAAXurB,EACA,OAAOA,EAEXA,EAAS,EACT,MAAO4sB,EAAa,EAChBA,GAAc,EACd5sB,GAAU2sB,EAAUC,GAAY7wC,MAAMlI,OAG1C,OAAOmsB,GAEX3sB,KAAKw5C,wBAA0B,WAC3B,MAAO,CAAC/sB,IAAKzsB,KAAK24C,KAAMhsB,OAAQ3sB,KAAKq5C,0BAEzCr5C,KAAKy5C,qBAAuB,WACxB,IAAIlF,EAAQv0C,KAAK44C,WAAW54C,KAAK+4C,aAC7BpsB,EAAS3sB,KAAKq5C,wBAClB,OAAO,IAAI/N,EAAMtrC,KAAK24C,KAAMhsB,EAAQ3sB,KAAK24C,KAAMhsB,EAAS4nB,EAAM7rC,MAAMlI,WAGzEgB,KAAK+2C,EAAcj3C,WAEtBqB,EAAQ41C,cAAgBA,IAGxBl1C,IAAIlD,OAAO,4BAA4B,CAAC,UAAU,UAAU,SAAS,cAAc,qBAAqB,qBAAqB,gBAAiB,SAAS0B,EAAUc,EAASvC,GAC1K,aAEA,IAUIs5C,EAVA1nC,EAAMnQ,EAAS,iBACfm2C,EAAYn2C,EAAS,gBAAgBm2C,UACrCO,EAAgB12C,EAAS,wBAAwB02C,cACjD50B,EAAO9hB,EAAS,kBAEhB83C,EACA,CAAC,OAAQ,eAAgB,wBACzBC,EACA,CAAC,OAAQ,eAAgB,uBAAwB,WAGjDC,EAAe,GACfC,EAAgB,CAAC,IAAM,IAAK,IAAM,KAElCC,EAAc,SAASzuB,GACvB,IAAIzoB,GAAM,EAMV,GALIyoB,EAAO0uB,cACPn3C,EAAKyoB,EAAOxF,UAAUhhB,MAClB+0C,EAAa7G,YAAc1nB,EAAO0uB,YAAYhH,aAC9C6G,EAAe,CAAC7G,WAAY1nB,EAAO0uB,YAAYhH,cAEnD6G,EAAah3C,GACb,OAAO62C,EAAUG,EAAah3C,GAClC62C,EAAUG,EAAah3C,GAAM,CACzBo3C,qBAAsB,EACtBC,iBAAkB,EAClBC,oBAAqB,GACrBC,sBAAuB,EACvBC,kBAAmB,EACnBC,uBAAwB,GACxBC,qBAAsB,KAI1BC,EAAa,SAAS10B,EAAW20B,EAAUC,EAASC,GACpD,IAAIC,EAAU90B,EAAU+E,IAAI4B,IAAM3G,EAAUhf,MAAM2lB,IAClD,MAAO,CACHvI,KAAMw2B,EAAUD,EAAWE,EAC3B70B,UAAW,CACH,EACAA,EAAUhf,MAAM6lB,OAAS,EACzBiuB,EACA90B,EAAU+E,IAAI8B,QAAUiuB,EAAU,EAAI,MAKlDC,EAAkB,SAAS9e,GAC3B/7B,KAAKsH,IAAI,SAAU,YAAa,SAAS+wB,EAAO6M,EAAQ5Z,EAAQxD,EAAS5D,GACrE,IAAIsI,EAASlB,EAAOwvB,oBAChBpT,EAAO5f,EAAQ/a,IAAIm0B,QAAQ1U,EAAOC,KACtC,GAAY,KAARvI,EAAa,CACb61B,EAAYzuB,GACZ,IAAIxF,EAAYwF,EAAO4B,oBACnButB,EAAW3yB,EAAQ/a,IAAI6pB,aAAa9Q,GACxC,GAAiB,KAAb20B,GAAgC,MAAbA,GAAoBnvB,EAAOyvB,2BAC9C,OAAOP,EAAW10B,EAAW20B,EAAU,IAAK,KACzC,GAAII,EAAgBG,gBAAgB1vB,EAAQxD,GAC/C,MAAI,WAAWrkB,KAAKikC,EAAKlb,EAAOG,UAAYrB,EAAOkC,mBAAqBuO,GAAWA,EAAQkf,QACvFJ,EAAgBK,iBAAiB5vB,EAAQxD,EAAS,KAC3C,CACH5D,KAAM,KACN4B,UAAW,CAAC,EAAG,MAGnB+0B,EAAgBM,kBAAkB7vB,EAAQxD,EAAS,KAC5C,CACH5D,KAAM,IACN4B,UAAW,CAAC,EAAG,UAIxB,GAAY,KAAR5B,EAAa,CACpB61B,EAAYzuB,GACZ,IAAI8vB,EAAY1T,EAAKhhB,UAAU8F,EAAOG,OAAQH,EAAOG,OAAS,GAC9D,GAAiB,KAAbyuB,EAAkB,CAClB,IAAIC,EAAWvzB,EAAQwzB,oBAAoB,IAAK,CAAC3uB,OAAQH,EAAOG,OAAS,EAAGF,IAAKD,EAAOC,MACxF,GAAiB,OAAb4uB,GAAqBR,EAAgBU,sBAAsB/uB,EAAQkb,EAAMxjB,GAEzE,OADA22B,EAAgBW,yBACT,CACHt3B,KAAM,GACN4B,UAAW,CAAC,EAAG,SAIxB,IAAY,MAAR5B,GAAwB,QAARA,EAAgB,CACvC61B,EAAYzuB,GACZ,IAAIqvB,EAAU,GACVE,EAAgBY,uBAAuBjvB,EAAQkb,KAC/CiT,EAAUh3B,EAAK/B,aAAa,IAAK83B,EAAQU,uBACzCS,EAAgBa,6BAEhBN,EAAY1T,EAAKhhB,UAAU8F,EAAOG,OAAQH,EAAOG,OAAS,GAC9D,GAAkB,MAAdyuB,EAAmB,CACnB,IAAIO,EAAe7zB,EAAQ8zB,oBAAoB,CAACnvB,IAAKD,EAAOC,IAAKE,OAAQH,EAAOG,OAAO,GAAI,KAC3F,IAAKgvB,EACA,OAAO,KACZ,IAAIE,EAAc77C,KAAK87C,WAAWh0B,EAAQoZ,QAAQya,EAAalvB,UAC5D,KAAIkuB,EAIP,YADAE,EAAgBa,4BAFZG,EAAc77C,KAAK87C,WAAWpU,GAKtC,IAAIwB,EAAS2S,EAAc/zB,EAAQi0B,eAEnC,MAAO,CACH73B,KAAM,KAAOglB,EAAS,KAAO2S,EAAclB,EAC3C70B,UAAW,CAAC,EAAGojB,EAAO1oC,OAAQ,EAAG0oC,EAAO1oC,SAG5Cq6C,EAAgBa,+BAIxB17C,KAAKsH,IAAI,SAAU,WAAY,SAAS+wB,EAAO6M,EAAQ5Z,EAAQxD,EAASY,GACpE,IAAI+xB,EAAW3yB,EAAQ/a,IAAI6pB,aAAalO,GACxC,IAAKA,EAAM0G,eAA6B,KAAZqrB,EAAiB,CACzCV,EAAYzuB,GACZ,IAAIoc,EAAO5f,EAAQ/a,IAAIm0B,QAAQxY,EAAM5hB,MAAM2lB,KACvC2uB,EAAY1T,EAAKhhB,UAAUgC,EAAMmC,IAAI8B,OAAQjE,EAAMmC,IAAI8B,OAAS,GACpE,GAAiB,KAAbyuB,EAEA,OADA1yB,EAAMmC,IAAI8B,SACHjE,EAEPgxB,EAAQU,2BAKpBp6C,KAAKsH,IAAI,SAAU,YAAa,SAAS+wB,EAAO6M,EAAQ5Z,EAAQxD,EAAS5D,GACrE,GAAY,KAARA,EAAa,CACb61B,EAAYzuB,GACZ,IAAIxF,EAAYwF,EAAO4B,oBACnButB,EAAW3yB,EAAQ/a,IAAI6pB,aAAa9Q,GACxC,GAAiB,KAAb20B,GAAmBnvB,EAAOyvB,2BAC1B,OAAOP,EAAW10B,EAAW20B,EAAU,IAAK,KACzC,GAAII,EAAgBG,gBAAgB1vB,EAAQxD,GAE/C,OADA+yB,EAAgBK,iBAAiB5vB,EAAQxD,EAAS,KAC3C,CACH5D,KAAM,KACN4B,UAAW,CAAC,EAAG,SAGpB,GAAY,KAAR5B,EAAa,CACpB61B,EAAYzuB,GACZ,IAAIkB,EAASlB,EAAOwvB,oBAChBpT,EAAO5f,EAAQ/a,IAAIm0B,QAAQ1U,EAAOC,KAClC2uB,EAAY1T,EAAKhhB,UAAU8F,EAAOG,OAAQH,EAAOG,OAAS,GAC9D,GAAiB,KAAbyuB,EAAkB,CAClB,IAAIC,EAAWvzB,EAAQwzB,oBAAoB,IAAK,CAAC3uB,OAAQH,EAAOG,OAAS,EAAGF,IAAKD,EAAOC,MACxF,GAAiB,OAAb4uB,GAAqBR,EAAgBU,sBAAsB/uB,EAAQkb,EAAMxjB,GAEzE,OADA22B,EAAgBW,yBACT,CACHt3B,KAAM,GACN4B,UAAW,CAAC,EAAG,QAOnC9lB,KAAKsH,IAAI,SAAU,WAAY,SAAS+wB,EAAO6M,EAAQ5Z,EAAQxD,EAASY,GACpE,IAAI+xB,EAAW3yB,EAAQ/a,IAAI6pB,aAAalO,GACxC,IAAKA,EAAM0G,eAA6B,KAAZqrB,EAAiB,CACzCV,EAAYzuB,GACZ,IAAIoc,EAAO5f,EAAQ/a,IAAIm0B,QAAQxY,EAAM5hB,MAAM2lB,KACvC2uB,EAAY1T,EAAKhhB,UAAUgC,EAAM5hB,MAAM6lB,OAAS,EAAGjE,EAAM5hB,MAAM6lB,OAAS,GAC5E,GAAiB,KAAbyuB,EAEA,OADA1yB,EAAMmC,IAAI8B,SACHjE,KAKnB1oB,KAAKsH,IAAI,WAAY,YAAa,SAAS+wB,EAAO6M,EAAQ5Z,EAAQxD,EAAS5D,GACvE,GAAY,KAARA,EAAa,CACb61B,EAAYzuB,GACZ,IAAIxF,EAAYwF,EAAO4B,oBACnButB,EAAW3yB,EAAQ/a,IAAI6pB,aAAa9Q,GACxC,GAAiB,KAAb20B,GAAmBnvB,EAAOyvB,2BAC1B,OAAOP,EAAW10B,EAAW20B,EAAU,IAAK,KACzC,GAAII,EAAgBG,gBAAgB1vB,EAAQxD,GAE/C,OADA+yB,EAAgBK,iBAAiB5vB,EAAQxD,EAAS,KAC3C,CACH5D,KAAM,KACN4B,UAAW,CAAC,EAAG,SAGpB,GAAY,KAAR5B,EAAa,CACpB61B,EAAYzuB,GACZ,IAAIkB,EAASlB,EAAOwvB,oBAChBpT,EAAO5f,EAAQ/a,IAAIm0B,QAAQ1U,EAAOC,KAClC2uB,EAAY1T,EAAKhhB,UAAU8F,EAAOG,OAAQH,EAAOG,OAAS,GAC9D,GAAiB,KAAbyuB,EAAkB,CAClB,IAAIC,EAAWvzB,EAAQwzB,oBAAoB,IAAK,CAAC3uB,OAAQH,EAAOG,OAAS,EAAGF,IAAKD,EAAOC,MACxF,GAAiB,OAAb4uB,GAAqBR,EAAgBU,sBAAsB/uB,EAAQkb,EAAMxjB,GAEzE,OADA22B,EAAgBW,yBACT,CACHt3B,KAAM,GACN4B,UAAW,CAAC,EAAG,QAOnC9lB,KAAKsH,IAAI,WAAY,WAAY,SAAS+wB,EAAO6M,EAAQ5Z,EAAQxD,EAASY,GACtE,IAAI+xB,EAAW3yB,EAAQ/a,IAAI6pB,aAAalO,GACxC,IAAKA,EAAM0G,eAA6B,KAAZqrB,EAAiB,CACzCV,EAAYzuB,GACZ,IAAIoc,EAAO5f,EAAQ/a,IAAIm0B,QAAQxY,EAAM5hB,MAAM2lB,KACvC2uB,EAAY1T,EAAKhhB,UAAUgC,EAAM5hB,MAAM6lB,OAAS,EAAGjE,EAAM5hB,MAAM6lB,OAAS,GAC5E,GAAiB,KAAbyuB,EAEA,OADA1yB,EAAMmC,IAAI8B,SACHjE,KAKnB1oB,KAAKsH,IAAI,iBAAkB,YAAa,SAAS+wB,EAAO6M,EAAQ5Z,EAAQxD,EAAS5D,GAC7E,IAAI83B,EAASl0B,EAAQm0B,MAAMC,SAAWpC,EACtC,GAAmB,GAAf51B,EAAK1jB,QAAew7C,EAAO93B,GAAO,CAClC,GAAIlkB,KAAKm8C,mBAA4D,GAAxCn8C,KAAKm8C,iBAAiBj6C,QAAQgiB,GACvD,OACJ61B,EAAYzuB,GACZ,IAAI8wB,EAAQl4B,EACR4B,EAAYwF,EAAO4B,oBACnButB,EAAW3yB,EAAQ/a,IAAI6pB,aAAa9Q,GACxC,KAAiB,KAAb20B,GAAuC,GAAnBA,EAASj6C,QAAgBw7C,EAAOvB,KAAcnvB,EAAOyvB,2BACzE,OAAOP,EAAW10B,EAAW20B,EAAU2B,EAAOA,GAC3C,IAAK3B,EAAU,CAClB,IAAIjuB,EAASlB,EAAOwvB,oBAChBpT,EAAO5f,EAAQ/a,IAAIm0B,QAAQ1U,EAAOC,KAClC4vB,EAAW3U,EAAKhhB,UAAU8F,EAAOG,OAAO,EAAGH,EAAOG,QAClDyuB,EAAY1T,EAAKhhB,UAAU8F,EAAOG,OAAQH,EAAOG,OAAS,GAE1D4nB,EAAQzsB,EAAQgxB,WAAWtsB,EAAOC,IAAKD,EAAOG,QAC9C2vB,EAAax0B,EAAQgxB,WAAWtsB,EAAOC,IAAKD,EAAOG,OAAS,GAChE,GAAgB,MAAZ0vB,GAAoB9H,GAAS,SAAS9wC,KAAK8wC,EAAM74B,MACjD,OAAO,KAEX,IAGI6gC,EAHAC,EAAejI,GAAS,gBAAgB9wC,KAAK8wC,EAAM74B,MACnD+gC,GAAeH,GAAc,gBAAgB74C,KAAK64C,EAAW5gC,MAGjE,GAAI0/B,GAAagB,EACbG,EAAOC,IAAiBC,EACpBF,GAAQ,cAAc94C,KAAK64C,EAAW5gC,QACtC6gC,GAAO,OACR,CACH,GAAIC,IAAiBC,EACjB,OAAO,KACX,GAAID,GAAgBC,EAChB,OAAO,KACX,IAAIC,EAAS50B,EAAQm0B,MAAMvK,QAC3BgL,EAAO34C,UAAY,EACnB,IAAI44C,EAAeD,EAAOj5C,KAAK44C,GAC/BK,EAAO34C,UAAY,EACnB,IAAI64C,EAAcF,EAAOj5C,KAAK44C,GAC9B,GAAIM,GAAgBC,EAChB,OAAO,KACX,GAAIxB,IAAc,gBAAgB33C,KAAK23C,GACnC,OAAO,KACXmB,GAAO,EAEX,MAAO,CACHr4B,KAAMq4B,EAAOH,EAAQA,EAAQ,GAC7Bt2B,UAAW,CAAC,EAAE,QAM9B9lB,KAAKsH,IAAI,iBAAkB,WAAY,SAAS+wB,EAAO6M,EAAQ5Z,EAAQxD,EAASY,GAC5E,IAAI+xB,EAAW3yB,EAAQ/a,IAAI6pB,aAAalO,GACxC,IAAKA,EAAM0G,gBAA8B,KAAZqrB,GAA+B,KAAZA,GAAkB,CAC9DV,EAAYzuB,GACZ,IAAIoc,EAAO5f,EAAQ/a,IAAIm0B,QAAQxY,EAAM5hB,MAAM2lB,KACvC2uB,EAAY1T,EAAKhhB,UAAUgC,EAAM5hB,MAAM6lB,OAAS,EAAGjE,EAAM5hB,MAAM6lB,OAAS,GAC5E,GAAIyuB,GAAaX,EAEb,OADA/xB,EAAMmC,IAAI8B,SACHjE,MAQvBmyB,EAAgBG,gBAAkB,SAAS1vB,EAAQxD,GAC/C,IAAI0E,EAASlB,EAAOwvB,oBAChB+B,EAAW,IAAItE,EAAczwB,EAAS0E,EAAOC,IAAKD,EAAOG,QAC7D,IAAK3sB,KAAK88C,gBAAgBD,EAAS1D,mBAAqB,OAAQQ,GAAwB,CACpF,IAAIoD,EAAY,IAAIxE,EAAczwB,EAAS0E,EAAOC,IAAKD,EAAOG,OAAS,GACvE,IAAK3sB,KAAK88C,gBAAgBC,EAAU5D,mBAAqB,OAAQQ,GAC7D,OAAO,EAGf,OADAkD,EAAS5D,cACF4D,EAASzD,uBAAyB5sB,EAAOC,KAC5CzsB,KAAK88C,gBAAgBD,EAAS1D,mBAAqB,OAAQS,IAGnEiB,EAAgBiC,gBAAkB,SAASvI,EAAO9c,GAC9C,OAAOA,EAAMv1B,QAAQqyC,EAAM74B,MAAQ64B,IAAU,GAGjDsG,EAAgBK,iBAAmB,SAAS5vB,EAAQxD,EAASk1B,GACzD,IAAIxwB,EAASlB,EAAOwvB,oBAChBpT,EAAO5f,EAAQ/a,IAAIm0B,QAAQ1U,EAAOC,KACjCzsB,KAAKu7C,sBAAsB/uB,EAAQkb,EAAMgS,EAAQS,oBAAoB,MACtET,EAAQO,qBAAuB,GACnCP,EAAQQ,gBAAkB1tB,EAAOC,IACjCitB,EAAQS,oBAAsB6C,EAAUtV,EAAKlhB,OAAOgG,EAAOG,QAC3D+sB,EAAQO,wBAGZY,EAAgBM,kBAAoB,SAAS7vB,EAAQxD,EAASk1B,GAC1D,IAAIxwB,EAASlB,EAAOwvB,oBAChBpT,EAAO5f,EAAQ/a,IAAIm0B,QAAQ1U,EAAOC,KACjCzsB,KAAKy7C,uBAAuBjvB,EAAQkb,KACrCgS,EAAQU,sBAAwB,GACpCV,EAAQW,iBAAmB7tB,EAAOC,IAClCitB,EAAQY,uBAAyB5S,EAAKlhB,OAAO,EAAGgG,EAAOG,QAAUqwB,EACjEtD,EAAQa,qBAAuB7S,EAAKlhB,OAAOgG,EAAOG,QAClD+sB,EAAQU,yBAGZS,EAAgBU,sBAAwB,SAAS/uB,EAAQkb,EAAMsV,GAC3D,OAAOtD,EAAQO,qBAAuB,GAClCztB,EAAOC,MAAQitB,EAAQQ,iBACvB8C,IAAYtD,EAAQS,oBAAoB,IACxCzS,EAAKlhB,OAAOgG,EAAOG,UAAY+sB,EAAQS,qBAG/CU,EAAgBY,uBAAyB,SAASjvB,EAAQkb,GACtD,OAAOgS,EAAQU,sBAAwB,GACnC5tB,EAAOC,MAAQitB,EAAQW,kBACvB3S,EAAKlhB,OAAOgG,EAAOG,UAAY+sB,EAAQa,sBACvC7S,EAAKlhB,OAAO,EAAGgG,EAAOG,SAAW+sB,EAAQY,wBAGjDO,EAAgBW,uBAAyB,WACrC9B,EAAQS,oBAAsBT,EAAQS,oBAAoB3zB,OAAO,GACjEkzB,EAAQO,wBAGZY,EAAgBa,0BAA4B,WACpChC,IACAA,EAAQU,sBAAwB,EAChCV,EAAQW,kBAAoB,IAMpCroC,EAAIR,SAASqpC,EAAiB7C,GAE9Br1C,EAAQk4C,gBAAkBA,IAG1Bx3C,IAAIlD,OAAO,cAAc,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GACrF,aA2CA,SAAS68C,EAAmBC,GACxB,IAAIC,EAAY,SAChB,IAAK,IAAIx4C,KAAQu4C,EACbv6C,EAAQy6C,SAASz4C,GAAQu4C,EAAKv4C,GAAMjC,QAAQy6C,EAAW,SA7C/Dx6C,EAAQy6C,SAAW,GAEnBH,EAAkB,CACd9Z,EAAI,4sFACJka,GAAI,uhFACJC,GAAI,o8EACJC,GAAI,0DACJC,GAAI,8QACJC,GAAI,knEACJC,EAAI,izCACJC,GAAI,4tCACJC,GAAI,qsBACJC,GAAI,0CACJC,EAAI,4hBACJC,GAAI,8TACJC,GAAI,6DACJC,GAAI,+MACJC,EAAI,40BACJC,GAAI,wEACJC,GAAI,mSACJC,GAAI,+RACJC,GAAI,mDACJC,GAAI,2CACJC,GAAI,wCACJC,GAAI,+xBACJhb,EAAI,0kCACJib,GAAI,mWACJC,GAAI,yFACJC,GAAI,4KACJC,GAAI,43BACJC,EAAI,gDACJC,GAAI,wCACJC,GAAI,OACJC,GAAI,OACJC,EAAI,0mFACJC,GAAI,qBACJC,GAAI,iFACJC,GAAI,YACJC,GAAI,YACJC,GAAI,ikFAWRl8C,IAAIlD,OAAO,gBAAgB,CAAC,UAAU,UAAU,SAAS,gBAAgB,gCAAgC,4BAA4B,cAAc,eAAe,qBAAqB,aAAc,SAAS0B,EAAUc,EAASvC,GACjO,aAEA,IAAIozC,EAAY3xC,EAAS,gBAAgB2xC,UACrC2C,EAAqBt0C,EAAS,0BAA0Bs0C,mBACxD0E,EAAkBh5C,EAAS,sBAAsBg5C,gBACjD2E,EAAU39C,EAAS,cACnB8hB,EAAO9hB,EAAS,eAChB02C,EAAgB12C,EAAS,qBAAqB02C,cAC9CjN,EAAQzpC,EAAS,YAAYypC,MAE7BmU,EAAO,WACPz/C,KAAK02C,eAAiBP,IAG1B,WACIn2C,KAAK0/C,kBAAoB,IAAI7E,EAE7B76C,KAAK0xC,QAAU,IAAIluC,OAAO,KACpBg8C,EAAQpC,SAASja,EACjBqc,EAAQpC,SAASO,GAAK6B,EAAQpC,SAASQ,GACvC4B,EAAQpC,SAASW,GACjByB,EAAQpC,SAASoB,GAAK,SAAU,KAGtCx+C,KAAKyxC,WAAa,IAAIjuC,OAAO,SACvBg8C,EAAQpC,SAASja,EACjBqc,EAAQpC,SAASO,GAAK6B,EAAQpC,SAASQ,GACvC4B,EAAQpC,SAASW,GACjByB,EAAQpC,SAASoB,GAAK,eAAgB,KAG5Cx+C,KAAK2/C,aAAe,WAKhB,OAJK3/C,KAAK4/C,aACN5/C,KAAK6/C,gBAAkB7/C,KAAK6/C,iBAAmB,IAAI7/C,KAAK02C,eAAe12C,KAAK8/C,sBAC5E9/C,KAAK4/C,WAAa,IAAIpM,EAAUxzC,KAAK6/C,gBAAgBrJ,aAElDx2C,KAAK4/C,YAGhB5/C,KAAKm8C,iBAAmB,GACxBn8C,KAAK+/C,aAAe,GAEpB//C,KAAKggD,mBAAqB,SAAS3nB,EAAOvQ,EAASyjB,EAAUE,GACzD,IAAI1+B,EAAM+a,EAAQ/a,IAEdkzC,GAAmB,EACnBC,GAAe,EACfC,EAAYC,IACZ3P,EAAU3oB,EAAQ6oB,aAClB0P,GAAkB,EAEtB,GAAKrgD,KAAKm8C,iBAkCH,CACH,GAAI13C,MAAMoD,QAAQ7H,KAAKm8C,kBACfmE,EAActgD,KAAKm8C,iBAAiB3zC,IAAImb,EAAKlB,cAAcjgB,KAAK,KAChE25C,EAAmBn8C,KAAKm8C,iBAAiB,QAEzCmE,EAAc38B,EAAKlB,aAAaziB,KAAKm8C,kBACrCA,EAAmBn8C,KAAKm8C,iBAEhCmE,EAAc,IAAI98C,OAAO,aAAe88C,EAAc,OAEtDD,EAAkBv4B,EAAQy4B,iBAEtBC,EAAY,SAAS9Y,EAAMhmC,GAC3B,IAAIi8B,EAAI+J,EAAKhkC,MAAM48C,GACnB,GAAK3iB,EAAL,CACA,IAAI72B,EAAQ62B,EAAE,GAAGn9B,OAAQqqB,EAAM8S,EAAE,GAAGn9B,OAC/BigD,EAAkB/Y,EAAM5gC,EAAO+jB,IAAyB,KAAjB8S,EAAE,GAAG9S,EAAM,IACnDA,IACJ9d,EAAI2zC,aAAah/C,EAAGoF,EAAO+jB,KAN/B,IAQI81B,EAAmBxE,EAAmB,IAatCsE,GAZAG,EAAU,SAASlZ,EAAMhmC,GACpBu+C,IAAoB,KAAKx8C,KAAKikC,KAC3B+Y,EAAkB/Y,EAAMyY,EAAWA,GACnCpzC,EAAI8zC,aAAa,CAACp0B,IAAK/qB,EAAGirB,OAAQwzB,GAAYQ,GAE9C5zC,EAAI8zC,aAAa,CAACp0B,IAAK/qB,EAAGirB,OAAQwzB,GAAYhE,KAGtD2E,EAAa,SAASpZ,EAAMhmC,GAC5B,OAAO4+C,EAAY78C,KAAKikC,IAGJ,SAASA,EAAMqZ,EAAQC,GAC3C,IAAIC,EAAS,EACb,MAAOF,KAAmC,KAAvBrZ,EAAKrlC,OAAO0+C,GAC3BE,IACJ,GAAIA,EAASxQ,GAAW,EACpB,OAAO,EACPwQ,EAAS,EACb,MAA+B,KAAxBvZ,EAAKrlC,OAAO2+C,KACfC,IACJ,OAAIxQ,EAAU,EACHwQ,EAASxQ,GAAWA,EAAU,EAE9BwQ,EAASxQ,GAAW,QA/EX,CACxB,IAAKzwC,KAAK+/C,aACN,OAAO,EACX,IAAI5D,EAAmBn8C,KAAK+/C,aAAaj5C,MACrCo6C,EAAiBlhD,KAAK+/C,aAAal1B,IACnCy1B,EAAc,IAAI98C,OAAO,aAAemgB,EAAKlB,aAAa05B,GAAoB,KAC9EgF,EAAY,IAAI39C,OAAO,MAAQmgB,EAAKlB,aAAay+B,GAAkB,UAEnEN,EAAU,SAASlZ,EAAMhmC,GACrBo/C,EAAWpZ,EAAMhmC,IAEhBu+C,IAAoB,KAAKx8C,KAAKikC,KAC/B36B,EAAI8zC,aAAa,CAACp0B,IAAK/qB,EAAGirB,OAAQ+a,EAAKlnC,QAAS0gD,GAChDn0C,EAAI8zC,aAAa,CAACp0B,IAAK/qB,EAAGirB,OAAQwzB,GAAYhE,KAIlDqE,EAAY,SAAS9Y,EAAMhmC,GAC3B,IAAIi8B,GACAA,EAAI+J,EAAKhkC,MAAMy9C,KACfp0C,EAAI2zC,aAAah/C,EAAGgmC,EAAKlnC,OAASm9B,EAAE,GAAGn9B,OAAQknC,EAAKlnC,SACpDm9B,EAAI+J,EAAKhkC,MAAM48C,KACfvzC,EAAI2zC,aAAah/C,EAAGi8B,EAAE,GAAGn9B,OAAQm9B,EAAE,GAAGn9B,SAG1CsgD,EAAa,SAASpZ,EAAMjb,GAC5B,GAAI6zB,EAAY78C,KAAKikC,GACjB,OAAO,EAEX,IADA,IAAIyN,EAASrtB,EAAQ+wB,UAAUpsB,GACtB/qB,EAAI,EAAGA,EAAIyzC,EAAO30C,OAAQkB,IAC/B,GAAuB,YAAnByzC,EAAOzzC,GAAGga,KACV,OAAO,GAqDvB,SAAS0lC,EAAKj5C,GACV,IAAK,IAAIzG,EAAI6pC,EAAU7pC,GAAK+pC,EAAQ/pC,IAChCyG,EAAI4E,EAAIm0B,QAAQx/B,GAAIA,GAI5B,IAAI2/C,EAAiBjB,IACrBgB,EAAK,SAAS1Z,EAAMhmC,GAChB,IAAIwnC,EAASxB,EAAK4J,OAAO,OACT,IAAZpI,GACIA,EAASiX,IACTA,EAAYjX,GACZgX,IAAiBY,EAAWpZ,EAAMhmC,KAClCw+C,GAAe,IACZmB,EAAiB3Z,EAAKlnC,SAC7B6gD,EAAiB3Z,EAAKlnC,UAI1B2/C,GAAaC,MACbD,EAAYkB,EACZpB,GAAmB,EACnBC,GAAe,GAGfG,GAAmBF,EAAY1P,GAAW,IAC1C0P,EAAYj5C,KAAKyF,MAAMwzC,EAAY1P,GAAWA,GAElD2Q,EAAKlB,EAAeM,EAAYI,IAGpC5gD,KAAKshD,mBAAqB,SAASjpB,EAAOvQ,EAASY,EAAO8D,GACtD,IAAIo0B,EAAU5gD,KAAK+/C,aACnB,GAAKa,EAAL,EAEKA,EAAQ95C,OAAS85C,EAAQ,KAC1BA,EAAUA,EAAQ,IAEtB,IAKIrV,EAAUgW,EALV1E,EAAW,IAAItE,EAAczwB,EAAS0E,EAAOC,IAAKD,EAAOG,QACzD4nB,EAAQsI,EAAS1D,kBAGjBqI,GADM15B,EAAQhC,UACCgC,EAAQhC,UAAU2P,mBAGrC,GAAI8e,GAAS,UAAU9wC,KAAK8wC,EAAM74B,MAAO,CACrC,IAAI+lC,EAAYC,EAChB,MAAOnN,GAAS,UAAU9wC,KAAK8wC,EAAM74B,MAAO,CACxC,IAAIha,EAAI6yC,EAAM7rC,MAAMxG,QAAQ0+C,EAAQ95C,OACpC,IAAU,GAANpF,EAAS,CACT,IAAI+qB,EAAMowB,EAASzD,qBACfzsB,EAASkwB,EAASxD,wBAA0B33C,EAChD+/C,EAAa,IAAInW,EAAM7e,EAAKE,EAAQF,EAAKE,EAASi0B,EAAQ95C,MAAMtG,QAChE,MAEJ+zC,EAAQsI,EAAS7D,eAGjB6D,EAAW,IAAItE,EAAczwB,EAAS0E,EAAOC,IAAKD,EAAOG,QACzD4nB,EAAQsI,EAAS1D,kBACrB,MAAO5E,GAAS,UAAU9wC,KAAK8wC,EAAM74B,MAAO,CACpCha,EAAI6yC,EAAM7rC,MAAMxG,QAAQ0+C,EAAQ/1B,KACpC,IAAU,GAANnpB,EAAS,CACL+qB,EAAMowB,EAASzD,qBACfzsB,EAASkwB,EAASxD,wBAA0B33C,EAChDggD,EAAW,IAAIpW,EAAM7e,EAAKE,EAAQF,EAAKE,EAASi0B,EAAQ/1B,IAAIrqB,QAC5D,MAEJ+zC,EAAQsI,EAAS5D,cAEjByI,GACA55B,EAAQvgB,OAAOm6C,GACfD,IACA35B,EAAQvgB,OAAOk6C,GACflW,EAAWkW,EAAW36C,MAAM2lB,IAC5B80B,GAAWX,EAAQ95C,MAAMtG,aAG7B+gD,EAAUX,EAAQ95C,MAAMtG,OACxB+qC,EAAW7iB,EAAM5hB,MAAM2lB,IACvB3E,EAAQzgB,OAAOqhB,EAAMmC,IAAK+1B,EAAQ/1B,KAClC/C,EAAQzgB,OAAOqhB,EAAM5hB,MAAO85C,EAAQ95C,OAEpC06C,EAAa16C,MAAM2lB,KAAO8e,IAC1BiW,EAAa16C,MAAM6lB,QAAU40B,GAC7BC,EAAa32B,IAAI4B,KAAO8e,IACxBiW,EAAa32B,IAAI8B,QAAU40B,GAC/Bz5B,EAAQhC,UAAUqQ,kBAAkBqrB,KAGxCxhD,KAAK2hD,kBAAoB,SAAStpB,EAAOqP,EAAMka,GAC3C,OAAO5hD,KAAK87C,WAAWpU,IAG3B1nC,KAAK6hD,aAAe,SAASxpB,EAAOqP,EAAMoa,GACtC,OAAO,GAGX9hD,KAAK+hD,YAAc,SAAS1pB,EAAOtrB,EAAK0f,KAGxCzsB,KAAK87C,WAAa,SAASpU,GACvB,OAAOA,EAAKhkC,MAAM,QAAQ,IAG9B1D,KAAKgiD,aAAe,SAASl6B,GACzB,OAAO,MAGX9nB,KAAKiiD,oBAAsB,SAAUlO,GAGjC,IAAK,IAAIryC,KAFT1B,KAAK62C,QAAU,GACf72C,KAAKkiD,OAAS,GACAnO,EACNA,EAAQryC,KACR1B,KAAK62C,QAAQ/0C,KAAKJ,GAClB1B,KAAKkiD,OAAOxgD,GAAK,IAAIqyC,EAAQryC,IAIrC,IAAIygD,EAAc,CAAC,qBAAsB,qBAAsB,oBAC3D,eAAgB,cAAe,kBAAmB,kBAEtD,IAASzgD,EAAI,EAAGA,EAAIygD,EAAY3hD,OAAQkB,KACnC,SAAS0gD,GACR,IAAIC,EAAeF,EAAYzgD,GAC3Bs4B,EAAiBooB,EAAMC,GAC3BD,EAAMD,EAAYzgD,IAAM,WACpB,OAAO1B,KAAKsiD,WAAWD,EAAc9hD,UAAWy5B,KAJtD,CAMEh6B,OAIVA,KAAKsiD,WAAa,SAASC,EAAQh9C,EAAMy0B,GACrC,IAAI3B,EAAQ9yB,EAAK,GACG,iBAAT8yB,IACPA,EAAQA,EAAM,IAClB,IAAK,IAAI32B,EAAI,EAAGA,EAAI1B,KAAK62C,QAAQr2C,OAAQkB,IACrC,GAAK1B,KAAKkiD,OAAOliD,KAAK62C,QAAQn1C,IAA9B,CAEA,IAAIU,EAAQi2B,EAAMj2B,MAAMpC,KAAK62C,QAAQn1C,IACrC,IAAKU,EAAM,IAAMA,EAAM,GAAI,CACvBmD,EAAK,GAAKnD,EAAM,GAChB,IAAIi2C,EAAOr4C,KAAKkiD,OAAOliD,KAAK62C,QAAQn1C,IACpC,OAAO22C,EAAKkK,GAAQ3hD,MAAMy3C,EAAM9yC,IAGxC,IAAI2M,EAAM8nB,EAAep5B,MAAMZ,KAAMuF,GACrC,OAAOy0B,EAAiB9nB,OAAM9Q,GAGlCpB,KAAKwiD,gBAAkB,SAASnqB,EAAO6M,EAAQ5Z,EAAQxD,EAAS26B,GAC5D,GAAIziD,KAAK0iD,WAAY,CACjB,IAAIvK,EAAan4C,KAAK0iD,WAAWpK,gBACjC,IAAK,IAAItsC,KAAOmsC,EACZ,GAAIA,EAAWnsC,GAAKk5B,GAAS,CACzB,IAAIhzB,EAAMimC,EAAWnsC,GAAKk5B,GAAQtkC,MAAMZ,KAAMO,WAC9C,GAAI2R,EACA,OAAOA,KAO3BlS,KAAK83C,YAAc,SAASlB,GACxB,IAAK52C,KAAK2iD,mBAAoB,CAC1B,IAAIlP,EAAQzzC,KAAK4/C,WAAWnM,MACxBkP,EAAqB,GACzB,IAAK,IAAIxO,KAAQV,EAEb,IADA,IAAImP,EAAUnP,EAAMU,GACX3rB,EAAI,EAAG7mB,EAAIihD,EAAQpiD,OAAQgoB,EAAI7mB,EAAG6mB,IACvC,GAAgC,kBAArBo6B,EAAQp6B,GAAG+rB,MACd,0BAA0B9wC,KAAKm/C,EAAQp6B,GAAG+rB,QAC1CoO,EAAmB7gD,KAAK8gD,EAAQp6B,GAAGvkB,YAEtC,GAAgC,kBAArB2+C,EAAQp6B,GAAG+rB,MACvB,IAAK,IAAI5tC,EAAI,EAAGk8C,EAAUD,EAAQp6B,GAAG+rB,MAAM/zC,OAAQmG,EAAIk8C,EAASl8C,IAC5D,GAAI,0BAA0BlD,KAAKm/C,EAAQp6B,GAAG+rB,MAAM5tC,IAAK,CACjDwtC,EAAOyO,EAAQp6B,GAAGvkB,MAAMP,MAAM,YAAYiD,GAC9Cg8C,EAAmB7gD,KAAKqyC,EAAK3tB,OAAO,EAAG2tB,EAAK3zC,OAAS,IAMzER,KAAK2iD,mBAAqBA,EAE9B,OAAK/L,EAEE+L,EAAmBj9C,OAAO1F,KAAK63C,cAAgB,IAD3C73C,KAAK63C,cAIpB73C,KAAK8iD,mBAAqB,WAGtB,OAFK9iD,KAAK6/C,iBACN7/C,KAAK2/C,eACF3/C,KAAK63C,aAAe73C,KAAK6/C,gBAAgBhI,cAAgB,IAGpE73C,KAAK+iD,eAAiB,SAAS1qB,EAAOvQ,EAAS9gB,EAAKsvC,GAChD,IAAIqB,EAAW33C,KAAK63C,cAAgB73C,KAAK8iD,qBACzC,OAAOnL,EAASnvC,IAAI,SAASw6C,GACzB,MAAO,CACHr+C,KAAMq+C,EACNt6C,MAAOs6C,EACPC,MAAO,EACPC,KAAM,cAKlBljD,KAAKmjD,IAAM,kBACZ3hD,KAAKi+C,EAAKn+C,WAEbqB,EAAQ88C,KAAOA,IAGfp8C,IAAIlD,OAAO,kBAAkB,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GACzF,aA+BAuC,EAAQygD,WAAa,SAASC,EAAUhb,EAAOib,GAE3C,IAAI72B,EAAM4b,EAAMvhC,MAAM2lB,IAClB+e,EAAcnD,EAAMvhC,MAAM6lB,OAC1B+a,EAAO2b,EAAS52B,IAAQ,GAC5B,OAAQ4b,EAAMnD,QACV,IAAK,SACD,IAAIoD,EAAQD,EAAMC,MAClB,GAAqB,IAAjBA,EAAM9nC,OACN6iD,EAAS52B,GAAOib,EAAKhhB,UAAU,EAAG8kB,GAAenD,EAAMC,MAAM,GAAKZ,EAAKhhB,UAAU8kB,OAC9E,CACH,IAAIjmC,EAAO,CAACknB,EAAK,GAAG/mB,OAAO2iC,EAAMC,OACjC+a,EAAS58C,OAAO7F,MAAMyiD,EAAU99C,GAChC89C,EAAS52B,GAAOib,EAAKhhB,UAAU,EAAG8kB,GAAe6X,EAAS52B,GAC1D42B,EAAS52B,EAAM4b,EAAMC,MAAM9nC,OAAS,IAAMknC,EAAKhhB,UAAU8kB,GAE7D,MACJ,IAAK,SACD,IAAIE,EAAYrD,EAAMxd,IAAI8B,OACtB8e,EAASpD,EAAMxd,IAAI4B,IACnBA,IAAQgf,EACR4X,EAAS52B,GAAOib,EAAKhhB,UAAU,EAAG8kB,GAAe9D,EAAKhhB,UAAUglB,GAEhE2X,EAAS58C,OACLgmB,EAAKgf,EAAShf,EAAM,EACpBib,EAAKhhB,UAAU,EAAG8kB,GAAe6X,EAAS5X,GAAQ/kB,UAAUglB,IAGpE,UAKZroC,IAAIlD,OAAO,aAAa,CAAC,UAAU,UAAU,SAAS,cAAc,yBAA0B,SAAS0B,EAAUc,EAASvC,GAC1H,aAEA,IAAI4R,EAAMnQ,EAAS,aACf63B,EAAe73B,EAAS,uBAAuB63B,aAE/C6pB,EAAS5gD,EAAQ4gD,OAAS,SAASx2C,EAAK0f,EAAKE,GAC7C3sB,KAAKwjD,UAAYxjD,KAAKooC,SAASjjC,KAAKnF,MACpCA,KAAKiiC,OAAOl1B,GAES,oBAAV4f,EACP3sB,KAAK6wB,YAAYpE,EAAIA,IAAKA,EAAIE,QAE9B3sB,KAAK6wB,YAAYpE,EAAKE,KAG9B,WAqBI,SAAS82B,EAAeC,EAAQC,EAAQC,GACpC,IAAIC,EAAcD,EAAqBF,EAAO/2B,QAAUg3B,EAAOh3B,OAAS+2B,EAAO/2B,OAASg3B,EAAOh3B,OAC/F,OAAQ+2B,EAAOj3B,IAAMk3B,EAAOl3B,KAASi3B,EAAOj3B,KAAOk3B,EAAOl3B,KAAOo3B,EAGrE,SAASC,EAAqBzb,EAAO0b,EAAOC,GACxC,IAAIC,EAAgC,UAAhB5b,EAAMnD,OACtBgf,GAAiBD,EAAgB,GAAK,IAAM5b,EAAMxd,IAAI4B,IAAS4b,EAAMvhC,MAAM2lB,KAC3E03B,GAAiBF,EAAgB,GAAK,IAAM5b,EAAMxd,IAAI8B,OAAS0b,EAAMvhC,MAAM6lB,QAC3Ey3B,EAAa/b,EAAMvhC,MACnBu9C,EAAWJ,EAAgBG,EAAa/b,EAAMxd,IAClD,OAAI44B,EAAeM,EAAOK,EAAYJ,GAC3B,CACHv3B,IAAKs3B,EAAMt3B,IACXE,OAAQo3B,EAAMp3B,QAGlB82B,EAAeY,EAAUN,GAAQC,GAC1B,CACHv3B,IAAKs3B,EAAMt3B,IAAMy3B,EACjBv3B,OAAQo3B,EAAMp3B,QAAUo3B,EAAMt3B,KAAO43B,EAAS53B,IAAM03B,EAAgB,IAIrE,CACH13B,IAAK23B,EAAW33B,IAChBE,OAAQy3B,EAAWz3B,QA7C3B3a,EAAIF,UAAU9R,KAAM05B,GACpB15B,KAAKguC,YAAc,WACf,OAAOhuC,KAAKskD,wBAAwBtkD,KAAKysB,IAAKzsB,KAAK2sB,SAEvD3sB,KAAKutC,YAAc,WACf,OAAOvtC,KAAKgL,UAEhBhL,KAAKukD,cAAe,EACpBvkD,KAAKooC,SAAW,SAASC,GACrB,IAAIA,EAAMvhC,MAAM2lB,KAAO4b,EAAMxd,IAAI4B,KAAO4b,EAAMvhC,MAAM2lB,KAAOzsB,KAAKysB,QAG5D4b,EAAMvhC,MAAM2lB,IAAMzsB,KAAKysB,KAA3B,CAGA,IAAIs3B,EAAQD,EAAqBzb,EAAO,CAAC5b,IAAKzsB,KAAKysB,IAAKE,OAAQ3sB,KAAK2sB,QAAS3sB,KAAKukD,cACnFvkD,KAAK6wB,YAAYkzB,EAAMt3B,IAAKs3B,EAAMp3B,QAAQ,KAgC9C3sB,KAAK6wB,YAAc,SAASpE,EAAKE,EAAQ63B,GACrC,IAAIx9C,EAUJ,GARIA,EADAw9C,EACM,CACF/3B,IAAKA,EACLE,OAAQA,GAGN3sB,KAAKskD,wBAAwB73B,EAAKE,GAGxC3sB,KAAKysB,KAAOzlB,EAAIylB,KAAOzsB,KAAK2sB,QAAU3lB,EAAI2lB,OAA9C,CAGA,IAAI0N,EAAM,CACN5N,IAAKzsB,KAAKysB,IACVE,OAAQ3sB,KAAK2sB,QAGjB3sB,KAAKysB,IAAMzlB,EAAIylB,IACfzsB,KAAK2sB,OAAS3lB,EAAI2lB,OAClB3sB,KAAKuyB,QAAQ,SAAU,CACnB8H,IAAKA,EACL3xB,MAAO1B,MAGfhH,KAAKkiC,OAAS,WACVliC,KAAKgL,SAASiR,oBAAoB,SAAUjc,KAAKwjD,YAErDxjD,KAAKiiC,OAAS,SAASl1B,GACnB/M,KAAKgL,SAAW+B,GAAO/M,KAAKgL,SAC5BhL,KAAKgL,SAASid,GAAG,SAAUjoB,KAAKwjD,YAEpCxjD,KAAKskD,wBAA0B,SAAS73B,EAAKE,GACzC,IAAI3lB,EAAM,GAkBV,OAhBIylB,GAAOzsB,KAAKgL,SAASknB,aACrBlrB,EAAIylB,IAAMvlB,KAAKC,IAAI,EAAGnH,KAAKgL,SAASknB,YAAc,GAClDlrB,EAAI2lB,OAAS3sB,KAAKgL,SAASk2B,QAAQl6B,EAAIylB,KAAKjsB,QAEvCisB,EAAM,GACXzlB,EAAIylB,IAAM,EACVzlB,EAAI2lB,OAAS,IAGb3lB,EAAIylB,IAAMA,EACVzlB,EAAI2lB,OAASzlB,KAAKM,IAAIxH,KAAKgL,SAASk2B,QAAQl6B,EAAIylB,KAAKjsB,OAAQ0G,KAAKC,IAAI,EAAGwlB,KAGzEA,EAAS,IACT3lB,EAAI2lB,OAAS,GAEV3lB,KAGZxF,KAAK+hD,EAAOjiD,aAIf+B,IAAIlD,OAAO,eAAe,CAAC,UAAU,UAAU,SAAS,cAAc,kBAAkB,wBAAwB,YAAY,cAAe,SAAS0B,EAAUc,EAASvC,GACvK,aAEA,IAAI4R,EAAMnQ,EAAS,aACfuhD,EAAavhD,EAAS,iBAAiBuhD,WACvC1pB,EAAe73B,EAAS,uBAAuB63B,aAC/C4R,EAAQzpC,EAAS,WAAWypC,MAC5BiY,EAAS1hD,EAAS,YAAY0hD,OAE9BkB,EAAW,SAASC,GACpB1kD,KAAK2kD,OAAS,CAAC,IACY,IAAvBD,EAAYlkD,OACZR,KAAK2kD,OAAS,CAAC,IACRlgD,MAAMoD,QAAQ68C,GACrB1kD,KAAK4kD,kBAAkB,CAACn4B,IAAK,EAAGE,OAAQ,GAAI+3B,GAE5C1kD,KAAKqH,OAAO,CAAColB,IAAK,EAAGE,OAAO,GAAI+3B,KAIxC,WAEI1yC,EAAIF,UAAU9R,KAAM05B,GACpB15B,KAAK6kD,SAAW,SAAS3gC,GACrB,IAAIygB,EAAM3kC,KAAKkyB,YAAc,EAC7BlyB,KAAKuH,OAAO,IAAI+jC,EAAM,EAAG,EAAG3G,EAAK3kC,KAAKkhC,QAAQyD,GAAKnkC,SACnDR,KAAKqH,OAAO,CAAColB,IAAK,EAAGE,OAAQ,GAAIzI,IAErClkB,KAAK8kD,SAAW,WACZ,OAAO9kD,KAAK+kD,cAAcviD,KAAKxC,KAAKglD,wBAExChlD,KAAK0tC,aAAe,SAASjhB,EAAKE,GAC9B,OAAO,IAAI42B,EAAOvjD,KAAMysB,EAAKE,IAED,IAA5B,MAAMvqB,MAAM,KAAK5B,OACjBR,KAAKilD,OAAS,SAAS/gC,GACnB,OAAOA,EAAKxhB,QAAQ,WAAY,MAAMN,MAAM,OAGhDpC,KAAKilD,OAAS,SAAS/gC,GACnB,OAAOA,EAAK9hB,MAAM,eAK1BpC,KAAKklD,eAAiB,SAAShhC,GAC3B,IAAIxgB,EAAQwgB,EAAKxgB,MAAM,qBACvB1D,KAAKmlD,aAAezhD,EAAQA,EAAM,GAAK,KACvC1D,KAAKuyB,QAAQ,sBAEjBvyB,KAAKglD,oBAAsB,WACvB,OAAQhlD,KAAKolD,cACX,IAAK,UACH,MAAO,OACT,IAAK,OACH,MAAO,KACT,QACE,OAAOplD,KAAKmlD,cAAgB,OAIpCnlD,KAAKmlD,aAAe,GACpBnlD,KAAKolD,aAAe,OACpBplD,KAAKqlD,eAAiB,SAASC,GACvBtlD,KAAKolD,eAAiBE,IAG1BtlD,KAAKolD,aAAeE,EACpBtlD,KAAKuyB,QAAQ,uBAEjBvyB,KAAKulD,eAAiB,WAClB,OAAOvlD,KAAKolD,cAEhBplD,KAAKwlD,UAAY,SAASthC,GACtB,MAAgB,QAARA,GAA0B,MAARA,GAAwB,MAARA,GAE9ClkB,KAAKkhC,QAAU,SAASzU,GACpB,OAAOzsB,KAAK2kD,OAAOl4B,IAAQ,IAE/BzsB,KAAKylD,SAAW,SAAS9Y,EAAUC,GAC/B,OAAO5sC,KAAK2kD,OAAOpiD,MAAMoqC,EAAUC,EAAU,IAEjD5sC,KAAK+kD,YAAc,WACf,OAAO/kD,KAAKylD,SAAS,EAAGzlD,KAAKkyB,cAEjClyB,KAAKkyB,UAAY,WACb,OAAOlyB,KAAK2kD,OAAOnkD,QAEvBR,KAAK42B,aAAe,SAASlO,GACzB,OAAO1oB,KAAK0lD,iBAAiBh9B,GAAOlmB,KAAKxC,KAAKglD,wBAElDhlD,KAAK0lD,iBAAmB,SAASh9B,GAC7B,IAAI4f,EACJ,GAAI5f,EAAM5hB,MAAM2lB,MAAQ/D,EAAMmC,IAAI4B,IAC9B6b,EAAQ,CAACtoC,KAAKkhC,QAAQxY,EAAM5hB,MAAM2lB,KAAK/F,UAAUgC,EAAM5hB,MAAM6lB,OAAQjE,EAAMmC,IAAI8B,aAC5E,CACH2b,EAAQtoC,KAAKylD,SAAS/8B,EAAM5hB,MAAM2lB,IAAK/D,EAAMmC,IAAI4B,KACjD6b,EAAM,IAAMA,EAAM,IAAM,IAAI5hB,UAAUgC,EAAM5hB,MAAM6lB,QAClD,IAAIhrB,EAAI2mC,EAAM9nC,OAAS,EACnBkoB,EAAMmC,IAAI4B,IAAM/D,EAAM5hB,MAAM2lB,KAAO9qB,IACnC2mC,EAAM3mC,GAAK2mC,EAAM3mC,GAAG+kB,UAAU,EAAGgC,EAAMmC,IAAI8B,SAEnD,OAAO2b,GAEXtoC,KAAK2lD,YAAc,SAASl5B,EAAK6b,GAE7B,OADAznC,QAAQw6B,KAAK,sFACNr7B,KAAK4lD,gBAAgBn5B,EAAK6b,IAErCtoC,KAAK6lD,YAAc,SAASlZ,EAAUC,GAElC,OADA/rC,QAAQw6B,KAAK,sFACNr7B,KAAK8lD,gBAAgBnZ,EAAUC,IAE1C5sC,KAAK+lD,cAAgB,SAASp2C,GAE1B,OADA9O,QAAQw6B,KAAK,mGACNr7B,KAAK4kD,kBAAkBj1C,EAAU,CAAC,GAAI,MAEjD3P,KAAKqH,OAAS,SAASsI,EAAUuU,GAI7B,OAHIlkB,KAAKkyB,aAAe,GACpBlyB,KAAKklD,eAAehhC,GAEjBlkB,KAAK4kD,kBAAkBj1C,EAAU3P,KAAKilD,OAAO/gC,KAExDlkB,KAAK6gD,aAAe,SAASlxC,EAAUuU,GACnC,IAAIpd,EAAQ9G,KAAKgmD,WAAWr2C,EAAS8c,IAAK9c,EAASgd,QAC/C9B,EAAM7qB,KAAKgH,IAAI2I,EAAS8c,IAAK9c,EAASgd,OAASzI,EAAK1jB,QASxD,OAPAR,KAAKojD,WAAW,CACZt8C,MAAOA,EACP+jB,IAAKA,EACLqa,OAAQ,SACRoD,MAAO,CAACpkB,KACT,GAEIlkB,KAAKimD,SAASp7B,IAGzB7qB,KAAKgmD,WAAa,SAASv5B,EAAKE,GAC5B,IAAInsB,EAASR,KAAKkyB,iBACN9wB,IAARqrB,EACAA,EAAMjsB,EACCisB,EAAM,EACbA,EAAM,EACCA,GAAOjsB,IACdisB,EAAMjsB,EAAS,EACfmsB,OAASvrB,GAEb,IAAIsmC,EAAO1nC,KAAKkhC,QAAQzU,GAIxB,YAHcrrB,GAAVurB,IACAA,EAAS+a,EAAKlnC,QAClBmsB,EAASzlB,KAAKM,IAAIN,KAAKC,IAAIwlB,EAAQ,GAAI+a,EAAKlnC,QACrC,CAACisB,IAAKA,EAAKE,OAAQA,IAG9B3sB,KAAKimD,SAAW,SAASj/C,GACrB,MAAO,CAACylB,IAAKzlB,EAAIylB,IAAKE,OAAQ3lB,EAAI2lB,SAGtC3sB,KAAKgH,IAAM,SAASylB,EAAKE,GACrB,MAAO,CAACF,IAAKA,EAAKE,OAAQA,IAG9B3sB,KAAKkmD,cAAgB,SAASv2C,GAC1B,IAAInP,EAASR,KAAKkyB,YAQlB,OAPIviB,EAAS8c,KAAOjsB,GAChBmP,EAAS8c,IAAMvlB,KAAKC,IAAI,EAAG3G,EAAS,GACpCmP,EAASgd,OAAS3sB,KAAKkhC,QAAQ1gC,EAAS,GAAGA,SAE3CmP,EAAS8c,IAAMvlB,KAAKC,IAAI,EAAGwI,EAAS8c,KACpC9c,EAASgd,OAASzlB,KAAKM,IAAIN,KAAKC,IAAIwI,EAASgd,OAAQ,GAAI3sB,KAAKkhC,QAAQvxB,EAAS8c,KAAKjsB,SAEjFmP,GAEX3P,KAAK4lD,gBAAkB,SAASn5B,EAAK6b,GACjC7b,EAAMvlB,KAAKM,IAAIN,KAAKC,IAAIslB,EAAK,GAAIzsB,KAAKkyB,aACtC,IAAIvF,EAAS,EACTF,EAAMzsB,KAAKkyB,aACXoW,EAAQA,EAAM5iC,OAAO,CAAC,KACtBinB,EAAS,IAET2b,EAAQ,CAAC,IAAI5iC,OAAO4iC,GACpB7b,IACAE,EAAS3sB,KAAK2kD,OAAOl4B,GAAKjsB,QAE9BR,KAAK4kD,kBAAkB,CAACn4B,IAAKA,EAAKE,OAAQA,GAAS2b,IAEvDtoC,KAAK4kD,kBAAoB,SAASj1C,EAAU24B,GACxC,IAAIxhC,EAAQ9G,KAAKgmD,WAAWr2C,EAAS8c,IAAK9c,EAASgd,QAC/C9B,EAAM,CACN4B,IAAK3lB,EAAM2lB,IAAM6b,EAAM9nC,OAAS,EAChCmsB,QAAyB,GAAhB2b,EAAM9nC,OAAcsG,EAAM6lB,OAAS,GAAK2b,EAAMA,EAAM9nC,OAAS,GAAGA,QAU7E,OAPAR,KAAKojD,WAAW,CACZt8C,MAAOA,EACP+jB,IAAKA,EACLqa,OAAQ,SACRoD,MAAOA,IAGJtoC,KAAKimD,SAASp7B,IAEzB7qB,KAAKuH,OAAS,SAASmhB,GACnB,IAAI5hB,EAAQ9G,KAAKgmD,WAAWt9B,EAAM5hB,MAAM2lB,IAAK/D,EAAM5hB,MAAM6lB,QACrD9B,EAAM7qB,KAAKgmD,WAAWt9B,EAAMmC,IAAI4B,IAAK/D,EAAMmC,IAAI8B,QAOnD,OANA3sB,KAAKojD,WAAW,CACZt8C,MAAOA,EACP+jB,IAAKA,EACLqa,OAAQ,SACRoD,MAAOtoC,KAAK0lD,iBAAiB,CAAC5+C,MAAOA,EAAO+jB,IAAKA,MAE9C7qB,KAAKimD,SAASn/C,IAEzB9G,KAAK0gD,aAAe,SAASj0B,EAAK+e,EAAaE,GAC3C,IAAI5kC,EAAQ9G,KAAKgmD,WAAWv5B,EAAK+e,GAC7B3gB,EAAM7qB,KAAKgmD,WAAWv5B,EAAKif,GAS/B,OAPA1rC,KAAKojD,WAAW,CACZt8C,MAAOA,EACP+jB,IAAKA,EACLqa,OAAQ,SACRoD,MAAOtoC,KAAK0lD,iBAAiB,CAAC5+C,MAAOA,EAAO+jB,IAAKA,MAClD,GAEI7qB,KAAKimD,SAASn/C,IAEzB9G,KAAK8lD,gBAAkB,SAASnZ,EAAUC,GACtCD,EAAWzlC,KAAKM,IAAIN,KAAKC,IAAI,EAAGwlC,GAAW3sC,KAAKkyB,YAAc,GAC9D0a,EAAW1lC,KAAKM,IAAIN,KAAKC,IAAI,EAAGylC,GAAW5sC,KAAKkyB,YAAc,GAC9D,IAAIi0B,EAAqBvZ,GAAW5sC,KAAKkyB,YAAc,GAAKya,EAAW,EACnEyZ,EAAqBxZ,EAAW5sC,KAAKkyB,YAAc,EACnDqZ,EAAa4a,EAAqBxZ,EAAW,EAAqBA,EAClErC,EAAa6b,EAAqBnmD,KAAKkhC,QAAQqK,GAAU/qC,OAAS,EAClEirC,EAAa2a,EAAqBxZ,EAAU,EAAsBA,EAClErC,EAAa6b,EAAqB,EAAgCpmD,KAAKkhC,QAAQuK,GAAQjrC,OACvFkoB,EAAQ,IAAI4iB,EAAMC,EAAUjB,EAAUmB,EAAQlB,GAC9C8b,EAAermD,KAAK2kD,OAAOpiD,MAAMoqC,EAAUC,EAAU,GAQzD,OANA5sC,KAAKojD,WAAW,CACZt8C,MAAO4hB,EAAM5hB,MACb+jB,IAAKnC,EAAMmC,IACXqa,OAAQ,SACRoD,MAAOtoC,KAAK0lD,iBAAiBh9B,KAE1B29B,GAEXrmD,KAAKsmD,cAAgB,SAAS75B,GACtBA,EAAMzsB,KAAKkyB,YAAc,GAAKzF,GAAO,GACrCzsB,KAAKojD,WAAW,CACZt8C,MAAO9G,KAAKgH,IAAIylB,EAAKzsB,KAAKkhC,QAAQzU,GAAKjsB,QACvCqqB,IAAK7qB,KAAKgH,IAAIylB,EAAM,EAAG,GACvByY,OAAQ,SACRoD,MAAO,CAAC,GAAI,OAIxBtoC,KAAK0C,QAAU,SAASgmB,EAAOxE,GAG3B,OAFMwE,aAAiB4iB,IACnB5iB,EAAQ4iB,EAAMuB,WAAWnkB,EAAM5hB,MAAO4hB,EAAMmC,MAC5B,IAAhB3G,EAAK1jB,QAAgBkoB,EAAMlD,UACpBkD,EAAM5hB,MACbod,GAAQlkB,KAAK42B,aAAalO,GACnBA,EAAMmC,KAEjB7qB,KAAKuH,OAAOmhB,GAGRmC,EADA3G,EACMlkB,KAAKqH,OAAOqhB,EAAM5hB,MAAOod,GAGzBwE,EAAM5hB,MAGT+jB,GARP,IAAIA,GAUR7qB,KAAKumD,YAAc,SAASC,GACxB,IAAK,IAAI9kD,EAAE,EAAGA,EAAE8kD,EAAOhmD,OAAQkB,IAC3B1B,KAAKojD,WAAWoD,EAAO9kD,KAG/B1B,KAAKymD,aAAe,SAASD,GACzB,IAAK,IAAI9kD,EAAE8kD,EAAOhmD,OAAO,EAAGkB,GAAG,EAAGA,IAC9B1B,KAAK0mD,YAAYF,EAAO9kD,KAGhC1B,KAAKojD,WAAa,SAAS/a,EAAOib,GAC9B,IAAIqD,EAA2B,UAAhBte,EAAMnD,QACjByhB,EAAWte,EAAMC,MAAM9nC,QAAU,IAAM6nC,EAAMC,MAAM,IAChDgD,EAAMH,cAAc9C,EAAMvhC,MAAOuhC,EAAMxd,QAI1C87B,GAAYte,EAAMC,MAAM9nC,OAAS,KACjCR,KAAK4mD,yBAAyBve,EAAO,KACzC+a,EAAWpjD,KAAK2kD,OAAQtc,EAAOib,GAC/BtjD,KAAKuyB,QAAQ,SAAU8V,KAG3BroC,KAAK4mD,yBAA2B,SAASve,EAAOwe,GAC5C,IAAIve,EAAQD,EAAMC,MACd3mC,EAAI2mC,EAAM9nC,OACVisB,EAAM4b,EAAMvhC,MAAM2lB,IAClBE,EAAS0b,EAAMvhC,MAAM6lB,OACrBnoB,EAAO,EAAGsiD,EAAK,EACnB,EAAG,CACCtiD,EAAOsiD,EACPA,GAAMD,EAAM,EACZ,IAAIE,EAAQze,EAAM/lC,MAAMiC,EAAMsiD,GAC9B,GAAIA,EAAKnlD,EAAG,CACR0mC,EAAMC,MAAQye,EACd1e,EAAMvhC,MAAM2lB,IAAMA,EAAMjoB,EACxB6jC,EAAMvhC,MAAM6lB,OAASA,EACrB,MAEJo6B,EAAMjlD,KAAK,IACX9B,KAAKojD,WAAW,CACZt8C,MAAO9G,KAAKgH,IAAIylB,EAAMjoB,EAAMmoB,GAC5B9B,IAAK7qB,KAAKgH,IAAIylB,EAAMq6B,EAAIn6B,EAAS,GACjCuY,OAAQmD,EAAMnD,OACdoD,MAAOye,IACR,SACC,IAEZ/mD,KAAK0mD,YAAc,SAASre,GACxBroC,KAAKojD,WAAW,CACZt8C,MAAO9G,KAAKimD,SAAS5d,EAAMvhC,OAC3B+jB,IAAK7qB,KAAKimD,SAAS5d,EAAMxd,KACzBqa,OAAyB,UAAhBmD,EAAMnD,OAAqB,SAAW,SAC/CoD,MAAOD,EAAMC,MAAM/lC,WAG3BvC,KAAKgnD,gBAAkB,SAASliD,EAAOymC,GAGnC,IAFA,IAAIjD,EAAQtoC,KAAK2kD,QAAU3kD,KAAK+kD,cAC5BkC,EAAgBjnD,KAAKglD,sBAAsBxkD,OACtCkB,EAAI6pC,GAAY,EAAG5pC,EAAI2mC,EAAM9nC,OAAQkB,EAAIC,EAAGD,IAEjD,GADAoD,GAASwjC,EAAM5mC,GAAGlB,OAASymD,EACvBniD,EAAQ,EACR,MAAO,CAAC2nB,IAAK/qB,EAAGirB,OAAQ7nB,EAAQwjC,EAAM5mC,GAAGlB,OAASymD,GAE1D,MAAO,CAACx6B,IAAK9qB,EAAE,EAAGgrB,OAAQ2b,EAAM3mC,EAAE,GAAGnB,SAEzCR,KAAKknD,gBAAkB,SAASlgD,EAAKukC,GAKjC,IAJA,IAAIjD,EAAQtoC,KAAK2kD,QAAU3kD,KAAK+kD,cAC5BkC,EAAgBjnD,KAAKglD,sBAAsBxkD,OAC3CsE,EAAQ,EACR2nB,EAAMvlB,KAAKM,IAAIR,EAAIylB,IAAK6b,EAAM9nC,QACzBkB,EAAI6pC,GAAY,EAAG7pC,EAAI+qB,IAAO/qB,EACnCoD,GAASwjC,EAAM5mC,GAAGlB,OAASymD,EAE/B,OAAOniD,EAAQkC,EAAI2lB,UAGxBnrB,KAAKijD,EAASnjD,WAEjBqB,EAAQ8hD,SAAWA,IAGnBphD,IAAIlD,OAAO,2BAA2B,CAAC,UAAU,UAAU,SAAS,cAAc,yBAA0B,SAAS0B,EAAUc,EAASvC,GACxI,aAEA,IAAI4R,EAAMnQ,EAAS,aACf63B,EAAe73B,EAAS,uBAAuB63B,aAE/CytB,EAAsB,SAASC,EAAW97B,GAC1CtrB,KAAKqnD,SAAU,EACfrnD,KAAKsoC,MAAQ,GACbtoC,KAAK0zC,OAAS,GACd1zC,KAAKsnD,YAAc,EACnBtnD,KAAKonD,UAAYA,EAEjB,IAAI9+C,EAAOtI,KAEXA,KAAKunD,QAAU,WACX,GAAKj/C,EAAK++C,QAAV,CAEA,IAAIG,EAAc,IAAIr7C,KAClBm7C,EAAch/C,EAAKg/C,YACnBG,GAAW,EACX16C,EAAMzE,EAAKyE,IAEX26C,EAAYJ,EAChB,MAAOh/C,EAAKggC,MAAMgf,GACdA,IAEJ,IAAI3iB,EAAM53B,EAAImlB,YACVy1B,EAAiB,EACrBr/C,EAAK++C,SAAU,EACf,MAAOC,EAAc3iB,EAAK,CACtBr8B,EAAKs/C,aAAaN,GAClBG,EAAUH,EACV,GACIA,UACKh/C,EAAKggC,MAAMgf,IAEpB,GADAK,IACKA,EAAiB,IAAM,GAAO,IAAIx7C,KAASq7C,EAAe,GAAI,CAC/Dl/C,EAAK++C,QAAU7nC,WAAWlX,EAAKi/C,QAAS,IACxC,OAGRj/C,EAAKg/C,YAAcA,GAEH,GAAZG,IACAA,EAAUH,GAEVI,GAAaD,GACbn/C,EAAKu/C,gBAAgBH,EAAWD,OAI5C,WAEIz1C,EAAIF,UAAU9R,KAAM05B,GACpB15B,KAAK8nD,aAAe,SAASV,GACzBpnD,KAAKonD,UAAYA,EACjBpnD,KAAKsoC,MAAQ,GACbtoC,KAAK0zC,OAAS,GAEd1zC,KAAK8G,MAAM,IAEf9G,KAAK+nD,YAAc,SAASh7C,GACxB/M,KAAK+M,IAAMA,EACX/M,KAAKsoC,MAAQ,GACbtoC,KAAK0zC,OAAS,GAEd1zC,KAAKowB,QAETpwB,KAAK6nD,gBAAkB,SAASlb,EAAUC,GACtC,IAAI3rB,EAAO,CACP+mC,MAAOrb,EACPnrB,KAAMorB,GAEV5sC,KAAKuyB,QAAQ,SAAU,CAACtR,KAAMA,KAElCjhB,KAAK8G,MAAQ,SAASykC,GAClBvrC,KAAKsnD,YAAcpgD,KAAKM,IAAI+jC,GAAY,EAAGvrC,KAAKsnD,YAAatnD,KAAK+M,IAAImlB,aACtElyB,KAAKsoC,MAAM7hC,OAAOzG,KAAKsnD,YAAatnD,KAAKsoC,MAAM9nC,QAC/CR,KAAK0zC,OAAOjtC,OAAOzG,KAAKsnD,YAAatnD,KAAK0zC,OAAOlzC,QAEjDR,KAAKowB,OACLpwB,KAAKqnD,QAAU7nC,WAAWxf,KAAKunD,QAAS,MAG5CvnD,KAAKioD,cAAgB,WACZjoD,KAAKqnD,UACNrnD,KAAKqnD,QAAU7nC,WAAWxf,KAAKunD,QAAS,OAGhDvnD,KAAKkoD,gBAAkB,SAAS7f,GAC5B,IAAIkD,EAAWlD,EAAMvhC,MAAM2lB,IACvBkY,EAAM0D,EAAMxd,IAAI4B,IAAM8e,EAE1B,GAAY,IAAR5G,EACA3kC,KAAKsoC,MAAMiD,GAAY,UACpB,GAAoB,UAAhBlD,EAAMnD,OACbllC,KAAKsoC,MAAM7hC,OAAO8kC,EAAU5G,EAAM,EAAG,MACrC3kC,KAAK0zC,OAAOjtC,OAAO8kC,EAAU5G,EAAM,EAAG,UACnC,CACH,IAAIp/B,EAAOd,MAAMkgC,EAAM,GACvBp/B,EAAK2wC,QAAQ3K,EAAU,GACvBvrC,KAAKsoC,MAAM7hC,OAAO7F,MAAMZ,KAAKsoC,MAAO/iC,GACpCvF,KAAK0zC,OAAOjtC,OAAO7F,MAAMZ,KAAK0zC,OAAQnuC,GAG1CvF,KAAKsnD,YAAcpgD,KAAKM,IAAI+jC,EAAUvrC,KAAKsnD,YAAatnD,KAAK+M,IAAImlB,aAEjElyB,KAAKowB,QAETpwB,KAAKowB,KAAO,WACJpwB,KAAKqnD,SACL9nC,aAAavf,KAAKqnD,SACtBrnD,KAAKqnD,SAAU,GAEnBrnD,KAAK64C,UAAY,SAASpsB,GACtB,OAAOzsB,KAAKsoC,MAAM7b,IAAQzsB,KAAK4nD,aAAan7B,IAEhDzsB,KAAKmoD,SAAW,SAAS17B,GAGrB,OAFIzsB,KAAKsnD,aAAe76B,GACpBzsB,KAAK4nD,aAAan7B,GACfzsB,KAAK0zC,OAAOjnB,IAAQ,SAG/BzsB,KAAK4nD,aAAe,SAASn7B,GACzB,IAAIib,EAAO1nC,KAAK+M,IAAIm0B,QAAQzU,GACxB4L,EAAQr4B,KAAK0zC,OAAOjnB,EAAM,GAE1BxL,EAAOjhB,KAAKonD,UAAU1R,cAAchO,EAAMrP,EAAO5L,GAWrD,OATIzsB,KAAK0zC,OAAOjnB,GAAO,KAAOxL,EAAKoX,MAAQ,IACvCr4B,KAAK0zC,OAAOjnB,GAAOxL,EAAKoX,MACxBr4B,KAAKsoC,MAAM7b,EAAM,GAAK,KAClBzsB,KAAKsnD,YAAc76B,EAAM,IACzBzsB,KAAKsnD,YAAc76B,EAAM,IACtBzsB,KAAKsnD,aAAe76B,IAC3BzsB,KAAKsnD,YAAc76B,EAAM,GAGtBzsB,KAAKsoC,MAAM7b,GAAOxL,EAAKk0B,UAGnC3zC,KAAK2lD,EAAoB7lD,WAE5BqB,EAAQwkD,oBAAsBA,IAG9B9jD,IAAIlD,OAAO,uBAAuB,CAAC,UAAU,UAAU,SAAS,eAAe,cAAc,aAAc,SAAS0B,EAAUc,EAASvC,GACvI,aAEA,IAAIujB,EAAO9hB,EAAS,cAEhBypC,GADMzpC,EAAS,aACPA,EAAS,WAAWypC,OAE5B8c,EAAkB,SAASxlC,EAAQylC,EAAO3sC,GAC1C1b,KAAKsoD,UAAU1lC,GACf5iB,KAAKqoD,MAAQA,EACbroD,KAAK0b,KAAOA,GAAQ,SAGxB,WACI1b,KAAKuoD,WAAa,IAElBvoD,KAAKsoD,UAAY,SAAS1lC,GAClB5iB,KAAK4iB,OAAO,IAAMA,EAAO,KAE7B5iB,KAAK4iB,OAASA,EACd5iB,KAAKwoD,MAAQ,KAGjBxoD,KAAKyoD,OAAS,SAAS73B,EAAM83B,EAAa5gC,EAAS8W,GAC/C,GAAK5+B,KAAK4iB,OAIV,IAFA,IAAI9b,EAAQ83B,EAAO+N,SAAU9hB,EAAM+T,EAAOgO,QAEjClrC,EAAIoF,EAAOpF,GAAKmpB,EAAKnpB,IAAK,CAC/B,IAAIuxC,EAASjzC,KAAKwoD,MAAM9mD,GACV,MAAVuxC,IACAA,EAAStvB,EAAKhB,gBAAgBmF,EAAQoZ,QAAQx/B,GAAI1B,KAAK4iB,QACnDqwB,EAAOzyC,OAASR,KAAKuoD,aACrBtV,EAASA,EAAO1wC,MAAM,EAAGvC,KAAKuoD,aAClCtV,EAASA,EAAOzqC,IAAI,SAAS9E,GACzB,OAAO,IAAI4nC,EAAM5pC,EAAGgC,EAAMof,OAAQphB,EAAGgC,EAAMof,OAASpf,EAAMlD,UAE9DR,KAAKwoD,MAAM9mD,GAAKuxC,EAAOzyC,OAASyyC,EAAS,IAG7C,IAAK,IAAIzV,EAAIyV,EAAOzyC,OAAQg9B,KACxBkrB,EAAYC,qBACR/3B,EAAMqiB,EAAOzV,GAAGyP,cAAcnlB,GAAU9nB,KAAKqoD,MAAOzpB,OAKrEp9B,KAAK4mD,EAAgB9mD,WAExBqB,EAAQylD,gBAAkBA,IAG1B/kD,IAAIlD,OAAO,6BAA6B,CAAC,UAAU,UAAU,SAAS,aAAc,SAAS0B,EAAUc,EAASvC,GAChH,aAEA,IAAIkrC,EAAQzpC,EAAS,YAAYypC,MACjC,SAASsd,EAASC,EAAUC,GACxB9oD,KAAK6oD,SAAWA,EACZpkD,MAAMoD,QAAQihD,GACd9oD,KAAK8oD,MAAQA,EAEbA,EAAQ9oD,KAAK8oD,MAAQ,CAAEA,GAG3B,IAAItnC,EAAOsnC,EAAMA,EAAMtoD,OAAS,GAChCR,KAAK0oB,MAAQ,IAAI4iB,EAAMwd,EAAM,GAAGhiD,MAAM2lB,IAAKq8B,EAAM,GAAGhiD,MAAM6lB,OACnCnL,EAAKqJ,IAAI4B,IAAKjL,EAAKqJ,IAAI8B,QAC9C3sB,KAAK8G,MAAQ9G,KAAK0oB,MAAM5hB,MACxB9G,KAAK6qB,IAAQ7qB,KAAK0oB,MAAMmC,IAExB7qB,KAAK8oD,MAAM5gD,QAAQ,SAASw4B,GACxBA,EAAKqoB,YAAY/oD,OAClBA,OAGP,WACIA,KAAKgpD,SAAW,SAASj+B,GACrB/qB,KAAK8G,MAAM2lB,KAAO1B,EAClB/qB,KAAK6qB,IAAI4B,KAAO1B,EAChB/qB,KAAK8oD,MAAM5gD,QAAQ,SAASw4B,GACxBA,EAAK55B,MAAM2lB,KAAO1B,EAClB2V,EAAK7V,IAAI4B,KAAO1B,KAIxB/qB,KAAKmhC,QAAU,SAAST,GACpB,GAAIA,EAAKuoB,QAAS,CACd,GAAIvoB,EAAK55B,MAAM2lB,IAAMzsB,KAAKurC,UAAY7K,EAAK+K,OAASzrC,KAAKyrC,OACrD,MAAM,IAAI9P,MAAM,6DAEpB37B,KAAK8oD,MAAMhnD,KAAK4+B,GAChB1gC,KAAK8oD,MAAMI,KAAK,SAASviD,EAAGwiD,GACxB,OAAQxiD,EAAE+hB,MAAM8jB,WAAW2c,EAAEriD,MAAM2lB,IAAK08B,EAAEriD,MAAM6lB,UAEhD3sB,KAAK0oB,MAAM8jB,WAAW9L,EAAK55B,MAAM2lB,IAAKiU,EAAK55B,MAAM6lB,QAAU,GAC3D3sB,KAAK6qB,IAAI4B,IAAMiU,EAAK7V,IAAI4B,IACxBzsB,KAAK6qB,IAAI8B,OAAU+T,EAAK7V,IAAI8B,QACrB3sB,KAAK0oB,MAAM6jB,aAAa7L,EAAK7V,IAAI4B,IAAKiU,EAAK7V,IAAI8B,QAAU,IAChE3sB,KAAK8G,MAAM2lB,IAAMiU,EAAK55B,MAAM2lB,IAC5BzsB,KAAK8G,MAAM6lB,OAAS+T,EAAK55B,MAAM6lB,aAEhC,GAAI+T,EAAK55B,MAAM2lB,KAAOzsB,KAAK6qB,IAAI4B,IAClCzsB,KAAK8oD,MAAMhnD,KAAK4+B,GAChB1gC,KAAK6qB,IAAI4B,IAAMiU,EAAK7V,IAAI4B,IACxBzsB,KAAK6qB,IAAI8B,OAAS+T,EAAK7V,IAAI8B,WACxB,IAAI+T,EAAK7V,IAAI4B,KAAOzsB,KAAK8G,MAAM2lB,IAKlC,MAAM,IAAIkP,MAAM,kEAJhB37B,KAAK8oD,MAAM5S,QAAQxV,GACnB1gC,KAAK8G,MAAM2lB,IAAMiU,EAAK55B,MAAM2lB,IAC5BzsB,KAAK8G,MAAM6lB,OAAS+T,EAAK55B,MAAM6lB,OAInC+T,EAAK0P,SAAWpwC,MAGpBA,KAAKopD,YAAc,SAAS38B,GACxB,OAAOA,GAAOzsB,KAAK8G,MAAM2lB,KAAOA,GAAOzsB,KAAK6qB,IAAI4B,KAGpDzsB,KAAKqpD,KAAO,SAASnoD,EAAUuqC,EAAQC,GACnC,IAEIhL,EACAhU,EAAK0D,EAHLk5B,EAAU,EACVR,EAAQ9oD,KAAK8oD,MAEFS,GAAW,EAEZ,MAAV9d,IACAA,EAASzrC,KAAK6qB,IAAI4B,IAClBif,EAAY1rC,KAAK6qB,IAAI8B,QAGzB,IAAK,IAAIjrB,EAAI,EAAGA,EAAIonD,EAAMtoD,OAAQkB,IAAK,CAInC,GAHAg/B,EAAOooB,EAAMpnD,GAEbgrB,EAAMgU,EAAKhY,MAAM6jB,aAAad,EAAQC,IAC1B,GAARhf,EAEA,YADAxrB,EAAS,KAAMuqC,EAAQC,EAAW4d,EAASC,GAM/C,GAFAn5B,EAAOlvB,EAAS,KAAMw/B,EAAK55B,MAAM2lB,IAAKiU,EAAK55B,MAAM6lB,OAAQ28B,EAASC,GAClEn5B,GAAQA,GAAQlvB,EAASw/B,EAAK8oB,YAAa9oB,EAAK55B,MAAM2lB,IAAKiU,EAAK55B,MAAM6lB,OAAQ28B,GAC1El5B,GAAgB,IAAR1D,EACR,OAEJ68B,GAAY7oB,EAAKuoB,QACjBK,EAAU5oB,EAAK7V,IAAI8B,OAEvBzrB,EAAS,KAAMuqC,EAAQC,EAAW4d,EAASC,IAG/CvpD,KAAKypD,cAAgB,SAASh9B,EAAKE,GAE/B,IADA,IAAI+T,EAAMhU,EACDhrB,EAAI,EAAGA,EAAI1B,KAAK8oD,MAAMtoD,OAAQkB,IAAK,CAGxC,GAFAg/B,EAAO1gC,KAAK8oD,MAAMpnD,GAClBgrB,EAAMgU,EAAKhY,MAAM8jB,WAAW/f,EAAKE,IACrB,GAARD,EACA,MAAO,CACHgU,KAAMA,EACNgpB,KAAM,SAEP,GAAY,IAARh9B,EACP,MAAO,CACHgU,KAAMA,EACNgpB,KAAM,UAIlB,OAAO,MAGX1pD,KAAK2pD,eAAiB,SAASl9B,EAAKE,EAAQgY,GACxC,IACIjE,EAAMooB,EADN52C,EAAMlS,KAAKypD,cAAch9B,EAAKE,GAElC,GAAIza,EAEA,GADAwuB,EAAOxuB,EAAIwuB,KACK,UAAZxuB,EAAIw3C,MACDhpB,EAAK55B,MAAM6lB,QAAUA,GACrB+T,EAAK55B,MAAM2lB,KAAOA,EAErBxsB,OAAOY,SAAWZ,OAAOY,QAAQ+oD,IAAIn9B,EAAKE,EAAQ+T,QAC/C,GAAIA,EAAK55B,MAAM2lB,KAAOA,EAAK,CAC9Bq8B,EAAQ9oD,KAAK8oD,MACb,IAAIpnD,EAAIonD,EAAM5mD,QAAQw+B,GAItB,IAHU,IAANh/B,IACA1B,KAAK8G,MAAM6lB,QAAUgY,GAEpBjjC,EAAGA,EAAIonD,EAAMtoD,OAAQkB,IAAK,CAG3B,GAFAg/B,EAAOooB,EAAMpnD,GACbg/B,EAAK55B,MAAM6lB,QAAUgY,GAChBjE,EAAKuoB,QACN,OAEJvoB,EAAK7V,IAAI8B,QAAUgY,EAEvB3kC,KAAK6qB,IAAI8B,QAAUgY,IAK/B3kC,KAAKoC,MAAQ,SAASqqB,EAAKE,GACvB,IAAI3lB,EAAMhH,KAAKypD,cAAch9B,EAAKE,GAElC,IAAK3lB,GAAmB,UAAZA,EAAI0iD,KACZ,OAAO,KAEX,IAAIhpB,EAAO15B,EAAI05B,KACXooB,EAAQ9oD,KAAK8oD,MACbD,EAAW7oD,KAAK6oD,SAEhBnnD,EAAIonD,EAAM5mD,QAAQw+B,GAClBmpB,EAAaf,EAAMpnD,EAAI,GAC3B1B,KAAK6qB,IAAI4B,IAAMo9B,EAAWh/B,IAAI4B,IAC9BzsB,KAAK6qB,IAAI8B,OAASk9B,EAAWh/B,IAAI8B,OACjCm8B,EAAQA,EAAMriD,OAAO/E,EAAGonD,EAAMtoD,OAASkB,GAEvC,IAAIooD,EAAc,IAAIlB,EAASC,EAAUC,GAEzC,OADAD,EAASpiD,OAAOoiD,EAAS3mD,QAAQlC,MAAQ,EAAG,EAAG8pD,GACxCA,GAGX9pD,KAAKi2C,MAAQ,SAAS8T,GAElB,IADA,IAAIjB,EAAQiB,EAAajB,MAChBpnD,EAAI,EAAGA,EAAIonD,EAAMtoD,OAAQkB,IAC9B1B,KAAKmhC,QAAQ2nB,EAAMpnD,IAEvB,IAAImnD,EAAW7oD,KAAK6oD,SACpBA,EAASpiD,OAAOoiD,EAAS3mD,QAAQ6nD,GAAe,IAGpD/pD,KAAKuB,SAAW,WACZ,IAAI2Q,EAAM,CAAClS,KAAK0oB,MAAMnnB,WAAa,OAMnC,OAJAvB,KAAK8oD,MAAM5gD,QAAQ,SAASw4B,GACxBxuB,EAAIpQ,KAAK,KAAO4+B,EAAKn/B,cAEzB2Q,EAAIpQ,KAAK,KACFoQ,EAAI1P,KAAK,OAGpBxC,KAAKgqD,cAAgB,SAASC,GAG1B,IAFA,IAAIC,EAAoB,EAEfxoD,EAAI,EAAGA,EAAI1B,KAAK8oD,MAAMtoD,OAAQkB,IAAK,CACxC,IAAIg/B,EAAO1gC,KAAK8oD,MAAMpnD,GAGtB,GADAuoD,GAAOvpB,EAAK55B,MAAM6lB,OAASu9B,EACvBD,EAAM,EACN,MAAO,CACHx9B,IAAKiU,EAAK55B,MAAM2lB,IAChBE,OAAQ+T,EAAK55B,MAAM6lB,OAASs9B,GAKpC,GADAA,GAAOvpB,EAAK8oB,YAAYhpD,OACpBypD,EAAM,EACN,OAAOvpB,EAAK55B,MAGhBojD,EAAoBxpB,EAAK7V,IAAI8B,OAGjC,MAAO,CACHF,IAAKzsB,KAAK6qB,IAAI4B,IACdE,OAAQ3sB,KAAK6qB,IAAI8B,OAASs9B,MAGnCzoD,KAAKonD,EAAStnD,WAEjBqB,EAAQimD,SAAWA,IAGnBvlD,IAAIlD,OAAO,iBAAiB,CAAC,UAAU,UAAU,SAAS,aAAc,SAAS0B,EAAUc,EAASvC,GACpG,aACA,IAAIkrC,EAAQzpC,EAAS,WAAWypC,MAC5BH,EAAgBG,EAAMH,cAEtBgf,EAAY,WACZnqD,KAAKizC,OAAS,KAGlB,WACIjzC,KAAKmrC,cAAgBA,EAErBnrC,KAAKoqD,WAAa,SAASpjD,EAAKqjD,EAAcC,GAG1C,IAFA,IAAI1S,EAAO53C,KAAKizC,OAEPvxC,EAAI4oD,GAAc,EAAG5oD,EAAIk2C,EAAKp3C,OAAQkB,IAAK,CAChD,IAAIgnB,EAAQkvB,EAAKl2C,GACb+sB,EAAS0c,EAAcnkC,EAAK0hB,EAAMmC,KACtC,KAAI4D,EAAS,GAAb,CAEA,IAAID,EAAW2c,EAAcnkC,EAAK0hB,EAAM5hB,OACxC,OAAe,IAAX2nB,EACO47B,GAA6B,IAAb77B,GAAkB9sB,EAAE,EAAIA,EAC/C8sB,EAAW,GAAmB,IAAbA,IAAmB67B,EAC7B3oD,GAEHA,EAAE,GAEd,OAAQA,EAAI,GAGhB1B,KAAKsH,IAAM,SAASohB,GAChB,IAAI2hC,GAAgB3hC,EAAMlD,UACtB8kC,EAAatqD,KAAKoqD,WAAW1hC,EAAM5hB,MAAOujD,GAC1CC,EAAa,IACbA,GAAcA,EAAa,GAE/B,IAAIC,EAAWvqD,KAAKoqD,WAAW1hC,EAAMmC,IAAKw/B,EAAcC,GAMxD,OAJIC,EAAW,EACXA,GAAYA,EAAW,EAEvBA,IACGvqD,KAAKizC,OAAOxsC,OAAO6jD,EAAYC,EAAWD,EAAY5hC,IAGjE1oB,KAAKwqD,QAAU,SAAS5S,GAEpB,IADA,IAAIxwC,EAAU,GACL1F,EAAIk2C,EAAKp3C,OAAQkB,KACtB0F,EAAQtF,KAAKlB,MAAMwG,EAASpH,KAAKsH,IAAIswC,EAAKl2C,KAE9C,OAAO0F,GAGXpH,KAAKyqD,eAAiB,SAASzjD,GAC3B,IAAItF,EAAI1B,KAAKoqD,WAAWpjD,GAExB,GAAItF,GAAK,EACL,OAAO1B,KAAKizC,OAAOxsC,OAAO/E,EAAG,IAErC1B,KAAKi2C,MAAQ,WACT,IAAI7uC,EAAU,GACVwwC,EAAO53C,KAAKizC,OAEhB2E,EAAOA,EAAKsR,KAAK,SAASviD,EAAGwiD,GACzB,OAAOhe,EAAcxkC,EAAEG,MAAOqiD,EAAEriD,SAIpC,IADA,IAAoB4hB,EAAhBqtB,EAAO6B,EAAK,GACPl2C,EAAI,EAAGA,EAAIk2C,EAAKp3C,OAAQkB,IAAK,CAClCgnB,EAAQqtB,EACRA,EAAO6B,EAAKl2C,GACZ,IAAIgrB,EAAMye,EAAcziB,EAAMmC,IAAKkrB,EAAKjvC,OACpC4lB,EAAM,IAGC,GAAPA,GAAahE,EAAMlD,WAAcuwB,EAAKvwB,aAGtC2lB,EAAcziB,EAAMmC,IAAKkrB,EAAKlrB,KAAO,IACrCnC,EAAMmC,IAAI4B,IAAMspB,EAAKlrB,IAAI4B,IACzB/D,EAAMmC,IAAI8B,OAASopB,EAAKlrB,IAAI8B,QAGhCirB,EAAKnxC,OAAO/E,EAAG,GACf0F,EAAQtF,KAAKi0C,GACbA,EAAOrtB,EACPhnB,KAKJ,OAFA1B,KAAKizC,OAAS2E,EAEPxwC,GAGXpH,KAAKqvB,SAAW,SAAS5C,EAAKE,GAC1B,OAAO3sB,KAAKoqD,WAAW,CAAC39B,IAAKA,EAAKE,OAAQA,KAAY,GAG1D3sB,KAAK0qD,cAAgB,SAAS1jD,GAC1B,OAAOhH,KAAKoqD,WAAWpjD,IAAQ,GAGnChH,KAAK2qD,aAAe,SAAS3jD,GACzB,IAAItF,EAAI1B,KAAKoqD,WAAWpjD,GACxB,GAAItF,GAAK,EACL,OAAO1B,KAAKizC,OAAOvxC,IAI3B1B,KAAK0sC,SAAW,SAASnB,EAAUE,GAC/B,IAAImM,EAAO53C,KAAKizC,OAChB,GAAI2E,EAAK,GAAG9wC,MAAM2lB,IAAMgf,GAAUmM,EAAKA,EAAKp3C,OAAS,GAAGsG,MAAM2lB,IAAM8e,EAChE,MAAO,GAEX,IAAI+e,EAAatqD,KAAKoqD,WAAW,CAAC39B,IAAK8e,EAAU5e,OAAQ,IACrD29B,EAAa,IACbA,GAAcA,EAAa,GAC/B,IAAIC,EAAWvqD,KAAKoqD,WAAW,CAAC39B,IAAKgf,EAAQ9e,OAAQ,GAAI29B,GACrDC,EAAW,IACXA,GAAYA,EAAW,GAG3B,IADA,IAAIK,EAAU,GACLlpD,EAAI4oD,EAAY5oD,EAAI6oD,EAAU7oD,IACnCkpD,EAAQ9oD,KAAK81C,EAAKl2C,IAEtB,OAAOkpD,GAGX5qD,KAAK6qD,UAAY,WACb,OAAO7qD,KAAKizC,OAAOxsC,OAAO,EAAGzG,KAAKizC,OAAOzyC,SAG7CR,KAAKiiC,OAAS,SAASna,GACf9nB,KAAK8nB,SACL9nB,KAAKkiC,SAETliC,KAAK8nB,QAAUA,EACf9nB,KAAKooC,SAAWpoC,KAAKwjD,UAAUr+C,KAAKnF,MAEpCA,KAAK8nB,QAAQG,GAAG,SAAUjoB,KAAKooC,WAGnCpoC,KAAKkiC,OAAS,WACLliC,KAAK8nB,UAEV9nB,KAAK8nB,QAAQ9L,eAAe,SAAUhc,KAAKooC,UAC3CpoC,KAAK8nB,QAAU,OAGnB9nB,KAAKwjD,UAAY,SAASnb,GACtB,GAAoB,UAAhBA,EAAMnD,OACN,IAAIp+B,EAAQuhC,EAAMvhC,MACd+jB,EAAMwd,EAAMxd,SAEZA,EAAMwd,EAAMvhC,MACZA,EAAQuhC,EAAMxd,IAStB,IAPA,IAAI0gB,EAAWzkC,EAAM2lB,IACjBgf,EAAS5gB,EAAI4B,IACbq+B,EAAUrf,EAASF,EAEnBgW,GAAWz6C,EAAM6lB,OAAS9B,EAAI8B,OAC9BsmB,EAASjzC,KAAKizC,OAETvxC,EAAI,EAAGgL,EAAIumC,EAAOzyC,OAAQkB,EAAIgL,EAAGhL,IAAK,CAC3C,IAAI8mB,EAAIyqB,EAAOvxC,GACf,KAAI8mB,EAAEqC,IAAI4B,IAAM8e,GAAhB,CAEA,GAAI/iB,EAAE1hB,MAAM2lB,IAAM8e,EACd,MASJ,GAPI/iB,EAAE1hB,MAAM2lB,KAAO8e,GAAY/iB,EAAE1hB,MAAM6lB,QAAU7lB,EAAM6lB,SAC/CnE,EAAE1hB,MAAM6lB,QAAU7lB,EAAM6lB,QAAU3sB,KAAKukD,eAEvC/7B,EAAE1hB,MAAM6lB,QAAU40B,EAClB/4B,EAAE1hB,MAAM2lB,KAAOq+B,IAGnBtiC,EAAEqC,IAAI4B,KAAO8e,GAAY/iB,EAAEqC,IAAI8B,QAAU7lB,EAAM6lB,OAAQ,CACvD,GAAInE,EAAEqC,IAAI8B,QAAU7lB,EAAM6lB,QAAU3sB,KAAKukD,aACrC,SAEA/7B,EAAEqC,IAAI8B,QAAU7lB,EAAM6lB,QAAU40B,EAAU,GAAK7/C,EAAIgL,EAAI,GACnD8b,EAAEqC,IAAI8B,OAASnE,EAAE1hB,MAAM6lB,QAAUnE,EAAEqC,IAAI8B,QAAUsmB,EAAOvxC,EAAE,GAAGoF,MAAM6lB,SACnEnE,EAAEqC,IAAI8B,QAAU40B,GAExB/4B,EAAEqC,IAAI8B,QAAU40B,EAChB/4B,EAAEqC,IAAI4B,KAAOq+B,IAIrB,GAAe,GAAXA,GAAgBppD,EAAIgL,EACpB,KAAOhL,EAAIgL,EAAGhL,IAAK,CACX8mB,EAAIyqB,EAAOvxC,GACf8mB,EAAE1hB,MAAM2lB,KAAOq+B,EACftiC,EAAEqC,IAAI4B,KAAOq+B,MAK1BtpD,KAAK2oD,EAAU7oD,WAElBqB,EAAQwnD,UAAYA,IAGpB9mD,IAAIlD,OAAO,wBAAwB,CAAC,UAAU,UAAU,SAAS,YAAY,iBAAiB,eAAgB,SAAS0B,EAAUc,EAASvC,GAC1I,aAEYyB,EAAS,YAAYypC,MAAjC,IACI6e,EAAYtoD,EAAS,iBAAiBsoD,UACtCn4C,EAAMnQ,EAAS,cACfkpD,EAAOpoD,EAAQooD,KAAO,SAASriC,EAAO8gC,GACtCxpD,KAAKowC,SAAW,KAChBpwC,KAAKwpD,YAAcA,EACnBxpD,KAAK0oB,MAAQA,EACb1oB,KAAK8G,MAAQ4hB,EAAM5hB,MACnB9G,KAAK6qB,IAAMnC,EAAMmC,IAEjB7qB,KAAKipD,QAAUvgC,EAAM5hB,MAAM2lB,KAAO/D,EAAMmC,IAAI4B,IAC5CzsB,KAAKgrD,SAAWhrD,KAAKizC,OAAS,IAqElC,SAASgY,EAAalH,EAAOn3B,GACzBm3B,EAAMt3B,KAAOG,EAAOH,IACH,GAAbs3B,EAAMt3B,MACNs3B,EAAMp3B,QAAUC,EAAOD,QAE/B,SAASu+B,EAAaxiC,EAAOkE,GACzBq+B,EAAaviC,EAAM5hB,MAAO8lB,GAC1Bq+B,EAAaviC,EAAMmC,IAAK+B,GAE5B,SAASu+B,EAAapH,EAAOn3B,GACR,GAAbm3B,EAAMt3B,MACNs3B,EAAMp3B,QAAUC,EAAOD,QAC3Bo3B,EAAMt3B,KAAOG,EAAOH,IAExB,SAAS2+B,EAAa1iC,EAAOkE,GACzBu+B,EAAaziC,EAAM5hB,MAAO8lB,GAC1Bu+B,EAAaziC,EAAMmC,IAAK+B,GAlF5B5a,EAAIR,SAASu5C,EAAMZ,GAEnB,WAEInqD,KAAKuB,SAAW,WACZ,MAAO,IAAMvB,KAAKwpD,YAAc,KAAOxpD,KAAK0oB,MAAMnnB,YAGtDvB,KAAK+oD,YAAc,SAAS3Y,GACxBpwC,KAAKowC,SAAWA,EAChBpwC,KAAKgrD,SAAS9iD,QAAQ,SAASw4B,GAC3BA,EAAKqoB,YAAY3Y,MAIzBpwC,KAAK+sC,MAAQ,WACT,IAAIrkB,EAAQ1oB,KAAK0oB,MAAMqkB,QACnBrM,EAAO,IAAIqqB,EAAKriC,EAAO1oB,KAAKwpD,aAKhC,OAJAxpD,KAAKgrD,SAAS9iD,QAAQ,SAASmjD,GAC3B3qB,EAAKsqB,SAASlpD,KAAKupD,EAAQte,WAE/BrM,EAAK4qB,iBAAmBtrD,KAAKsrD,iBACtB5qB,GAGX1gC,KAAKurD,WAAa,SAAS7qB,GACvB,IAAI1gC,KAAK0oB,MAAMijB,QAAQjL,GAAvB,CAGA,IAAK1gC,KAAK0oB,MAAMqjB,cAAcrL,GAC1B,MAAM,IAAI/E,MAAM,+CAAiD+E,EAAKhY,MAAQ1oB,KAAK0oB,OACvFwiC,EAAaxqB,EAAM1gC,KAAK8G,OAGxB,IADA,IAAI2lB,EAAMiU,EAAK55B,MAAM2lB,IAAKE,EAAS+T,EAAK55B,MAAM6lB,OACrCjrB,EAAI,EAAGgrB,GAAO,EAAGhrB,EAAI1B,KAAKgrD,SAASxqD,OAAQkB,IAEhD,GADAgrB,EAAM1sB,KAAKgrD,SAAStpD,GAAGgnB,MAAMkjB,QAAQnf,EAAKE,GAC/B,GAAPD,EACA,MAER,IAAI8+B,EAAaxrD,KAAKgrD,SAAStpD,GAE/B,GAAW,GAAPgrB,EACA,OAAO8+B,EAAWD,WAAW7qB,GAC7BjU,EAAMiU,EAAKhY,MAAMmC,IAAI4B,IAAKE,EAAS+T,EAAKhY,MAAMmC,IAAI8B,OAAtD,IACS6Q,EAAI97B,EAAb,IAAgBgrB,GAAO,EAAG8Q,EAAIx9B,KAAKgrD,SAASxqD,OAAQg9B,IAEhD,GADA9Q,EAAM1sB,KAAKgrD,SAASxtB,GAAG9U,MAAMkjB,QAAQnf,EAAKE,GAC/B,GAAPD,EACA,MAEO1sB,KAAKgrD,SAASxtB,GAE7B,GAAW,GAAP9Q,EACA,MAAM,IAAIiP,MAAM,+CAAiD+E,EAAKhY,MAAQ1oB,KAAK0oB,OAEnE1oB,KAAKgrD,SAASvkD,OAAO/E,EAAG87B,EAAI97B,EAAGg/B,GAGnD,OAFAA,EAAKqoB,YAAY/oD,KAAKowC,UAEf1P,IAGX1gC,KAAKorD,aAAe,SAAS1iC,GACzB,OAAO0iC,EAAa1iC,EAAO1oB,KAAK8G,SAGrCtF,KAAKupD,EAAKzpD,aAuBb+B,IAAIlD,OAAO,2BAA2B,CAAC,UAAU,UAAU,SAAS,YAAY,6BAA6B,wBAAwB,sBAAuB,SAAS0B,EAAUc,EAASvC,GACxL,aAEA,IAAIkrC,EAAQzpC,EAAS,YAAYypC,MAC7Bsd,EAAW/mD,EAAS,eAAe+mD,SACnCmC,EAAOlpD,EAAS,UAAUkpD,KAC1BxS,EAAgB12C,EAAS,qBAAqB02C,cAElD,SAASkT,IACLzrD,KAAK2gC,UAAY,SAASlU,EAAKE,EAAQ++B,GACnC,IAAItb,EAAWpwC,KAAKqwC,YAAY5jB,GAChC,IAAK2jB,EACD,OAAO,KAGX,IADA,IAAI0Y,EAAQ1Y,EAAS0Y,MACZpnD,EAAI,EAAGA,EAAIonD,EAAMtoD,OAAQkB,IAAK,CACnC,IAAIg/B,EAAOooB,EAAMpnD,GACjB,GAAIg/B,EAAKhY,MAAM2G,SAAS5C,EAAKE,GAAS,CAClC,GAAY,GAAR++B,GAAahrB,EAAKhY,MAAMujB,MAAMxf,EAAKE,GACnC,SACG,IAAa,GAAT++B,GAAchrB,EAAKhY,MAAMwjB,QAAQzf,EAAKE,GAC7C,SAEJ,OAAO+T,KAInB1gC,KAAK2rD,gBAAkB,SAASjjC,GAC5B,IAAI5hB,EAAQ4hB,EAAM5hB,MACd+jB,EAAMnC,EAAMmC,IACZ+gC,EAAY5rD,KAAK6rD,UACjBC,EAAa,GAEjBhlD,EAAM6lB,QAAU,EAChB9B,EAAI8B,QAAU,EAEd,IAAK,IAAIjrB,EAAI,EAAGA,EAAIkqD,EAAUprD,OAAQkB,IAAK,CACvC,IAAIgrB,EAAMk/B,EAAUlqD,GAAGgnB,MAAMmjB,aAAanjB,GAC1C,GAAW,GAAPgE,EAAJ,CAGK,IAAY,GAARA,EACL,MAIJ,IADA,IAAIo8B,EAAQ8C,EAAUlqD,GAAGonD,MAChBtrB,EAAI,EAAGA,EAAIsrB,EAAMtoD,OAAQg9B,IAAK,CACnC,IAAIkD,EAAOooB,EAAMtrB,GAEjB,GADA9Q,EAAMgU,EAAKhY,MAAMmjB,aAAanjB,IAClB,GAARgE,EACA,MACG,GAAW,GAAPA,EAAJ,CAGP,GAAW,IAAPA,EACA,MAEJo/B,EAAWhqD,KAAK4+B,MAMxB,OAHA55B,EAAM6lB,QAAU,EAChB9B,EAAI8B,QAAU,EAEPm/B,GAGX9rD,KAAK+rD,oBAAsB,SAAS9Y,GAChC,GAAIxuC,MAAMoD,QAAQorC,GAAS,CACvB,IAAI6V,EAAQ,GACZ7V,EAAO/qC,QAAQ,SAASwgB,GACpBogC,EAAQA,EAAMpjD,OAAO1F,KAAK2rD,gBAAgBjjC,KAC3C1oB,WAEC8oD,EAAQ9oD,KAAK2rD,gBAAgB1Y,GAErC,OAAO6V,GAEX9oD,KAAKgsD,YAAc,WAIf,IAHA,IAAIlD,EAAQ,GACR8C,EAAY5rD,KAAK6rD,UAEZnqD,EAAI,EAAGA,EAAIkqD,EAAUprD,OAAQkB,IAClC,IAAK,IAAI87B,EAAI,EAAGA,EAAIouB,EAAUlqD,GAAGonD,MAAMtoD,OAAQg9B,IAC3CsrB,EAAMhnD,KAAK8pD,EAAUlqD,GAAGonD,MAAMtrB,IAEtC,OAAOsrB,GAEX9oD,KAAK4xC,gBAAkB,SAASnlB,EAAKE,EAAQpgB,EAAM6jC,GAE/C,GADAA,EAAWA,GAAYpwC,KAAKqwC,YAAY5jB,IACnC2jB,EACD,OAAO,KAMX,IAJA,IAGI1rC,EAAKg8B,EAHLurB,EAAW,CACXphC,IAAK,CAAE8B,OAAQ,IAGVjrB,EAAI,EAAGA,EAAI0uC,EAAS0Y,MAAMtoD,OAAQkB,IAAK,CAC5Cg/B,EAAO0P,EAAS0Y,MAAMpnD,GACtB,IAAIgrB,EAAMgU,EAAKhY,MAAM8jB,WAAW/f,EAAKE,GACrC,IAAY,GAARD,EAAW,CACXhoB,EAAM1E,KACDkhC,QAAQR,EAAK55B,MAAM2lB,KACnB/F,UAAUulC,EAASphC,IAAI8B,OAAQ+T,EAAK55B,MAAM6lB,QAC/C,MAEC,GAAY,IAARD,EACL,OAAO,KAEXu/B,EAAWvrB,EAKf,OAHKh8B,IACDA,EAAM1E,KAAKkhC,QAAQR,EAAK55B,MAAM2lB,KAAK/F,UAAUulC,EAASphC,IAAI8B,UAEjD,GAATpgB,EACO7H,EAAIgiB,UAAU,EAAGiG,EAASs/B,EAASphC,IAAI8B,QACjC,GAARpgB,EACE7H,EAAIgiB,UAAUiG,EAASs/B,EAASphC,IAAI8B,QAEpCjoB,GAGf1E,KAAKqwC,YAAc,SAASrI,EAAQkkB,GAChC,IAAIrD,EAAW7oD,KAAK6rD,UAChBnqD,EAAI,EAKR,IAJIwqD,IACAxqD,EAAImnD,EAAS3mD,QAAQgqD,KACf,GAANxqD,IACAA,EAAI,GACHA,EAAGA,EAAImnD,EAASroD,OAAQkB,IAAK,CAC9B,IAAI0uC,EAAWyY,EAASnnD,GACxB,GAAI0uC,EAAStpC,MAAM2lB,KAAOub,GAAUoI,EAASvlB,IAAI4B,KAAOub,EACpD,OAAOoI,EACJ,GAAIA,EAASvlB,IAAI4B,IAAMub,EAC1B,OAAO,KAGf,OAAO,MAEXhoC,KAAKmsD,gBAAkB,SAASnkB,EAAQkkB,GACpC,IAAIrD,EAAW7oD,KAAK6rD,UAChBnqD,EAAI,EAKR,IAJIwqD,IACAxqD,EAAImnD,EAAS3mD,QAAQgqD,KACf,GAANxqD,IACAA,EAAI,GACHA,EAAGA,EAAImnD,EAASroD,OAAQkB,IAAK,CAC9B,IAAI0uC,EAAWyY,EAASnnD,GACxB,GAAI0uC,EAASvlB,IAAI4B,KAAOub,EACpB,OAAOoI,EAGf,OAAO,MAGXpwC,KAAKosD,kBAAoB,SAASpE,EAAOxmC,GAErC,IADA,IAAIqnC,EAAW7oD,KAAK6rD,UAAW3S,EAAW13B,EAAKwmC,EAAM,EAC5CtmD,EAAI,EAAGA,EAAImnD,EAASroD,OAAQkB,IAAK,CACtC,IAAI0uC,EAAWyY,EAASnnD,GACpBmpB,EAAMulB,EAASvlB,IAAI4B,IACnB3lB,EAAQspC,EAAStpC,MAAM2lB,IAC3B,GAAI5B,GAAOrJ,EAAM,CACT1a,EAAQ0a,IACJ1a,GAASkhD,EACT9O,GAAY13B,EAAK1a,EAEjBoyC,EAAW,GAEnB,MACOruB,GAAOm9B,IAEV9O,GADApyC,GAASkhD,EACIn9B,EAAI/jB,EAEJ+jB,EAAIm9B,EAAM,GAGnC,OAAO9O,GAGXl5C,KAAKqsD,aAAe,SAASjc,GAKzB,OAJApwC,KAAK6rD,UAAU/pD,KAAKsuC,GACpBpwC,KAAK6rD,UAAU3C,KAAK,SAASviD,EAAGwiD,GAC5B,OAAOxiD,EAAEG,MAAM2lB,IAAM08B,EAAEriD,MAAM2lB,MAE1B2jB,GAEXpwC,KAAKmhC,QAAU,SAASqoB,EAAa9gC,GACjC,IAEIgY,EAFAmoB,EAAW7oD,KAAK6rD,UAChBS,GAAQ,EAGR9C,aAAuBuB,EACvBrqB,EAAO8oB,GAEP9oB,EAAO,IAAIqqB,EAAKriC,EAAO8gC,GACvB9oB,EAAK4qB,iBAAmB5iC,EAAM4iC,kBAElCtrD,KAAKusD,qBAAqB7rB,EAAKhY,OAE/B,IAAI6iB,EAAW7K,EAAK55B,MAAM2lB,IACtB+e,EAAc9K,EAAK55B,MAAM6lB,OACzB8e,EAAS/K,EAAK7V,IAAI4B,IAClBif,EAAYhL,EAAK7V,IAAI8B,OACzB,KAAM4e,EAAWE,GACbF,GAAYE,GAAUD,GAAeE,EAAY,GACjD,MAAM,IAAI/P,MAAM,mDAEpB,IAAI6wB,EAAYxsD,KAAK2gC,UAAU4K,EAAUC,EAAa,GAClDihB,EAAUzsD,KAAK2gC,UAAU8K,EAAQC,GAAY,GACjD,GAAI8gB,GAAaC,GAAWD,EACxB,OAAOA,EAAUjB,WAAW7qB,GAE5B8rB,IAAcA,EAAU9jC,MAAMwjB,QAAQX,EAAUC,IAChDxrC,KAAK4gC,WAAW4rB,GAEhBC,IAAYA,EAAQ/jC,MAAMujB,MAAMR,EAAQC,IACxC1rC,KAAK4gC,WAAW6rB,GACpB,IAAI3D,EAAQ9oD,KAAK2rD,gBAAgBjrB,EAAKhY,OAClCogC,EAAMtoD,OAAS,IACfR,KAAK0sD,YAAY5D,GACjBA,EAAM5gD,QAAQ,SAASmjD,GACnB3qB,EAAK6qB,WAAWF,MAIxB,IAAK,IAAI3pD,EAAI,EAAGA,EAAImnD,EAASroD,OAAQkB,IAAK,CACtC,IAAI0uC,EAAWyY,EAASnnD,GACxB,GAAI+pC,GAAU2E,EAAStpC,MAAM2lB,IAAK,CAC9B2jB,EAASjP,QAAQT,GACjB4rB,GAAQ,EACR,MACG,GAAI/gB,GAAY6E,EAASvlB,IAAI4B,IAAK,CAGrC,GAFA2jB,EAASjP,QAAQT,GACjB4rB,GAAQ,GACH5rB,EAAKuoB,QAAS,CACf,IAAIc,EAAelB,EAASnnD,EAAI,GAChC,GAAIqoD,GAAgBA,EAAajjD,MAAM2lB,KAAOgf,EAAQ,CAClD2E,EAAS6F,MAAM8T,GACf,OAGR,MACG,GAAIte,GAAU2E,EAAStpC,MAAM2lB,IAChC,MAcR,OAVK6/B,IACDlc,EAAWpwC,KAAKqsD,aAAa,IAAIzD,EAAS5oD,KAAK6rD,UAAWnrB,KAE1D1gC,KAAK+oC,aACL/oC,KAAK2sD,gBAAgBvc,EAAStpC,MAAM2lB,IAAK2jB,EAAStpC,MAAM2lB,KAExDzsB,KAAK4sD,sBAAsBxc,EAAStpC,MAAM2lB,IAAK2jB,EAAStpC,MAAM2lB,KAClEzsB,KAAK6sD,WAAY,EACjB7sD,KAAKuyB,QAAQ,aAAc,CAAEtR,KAAMyf,EAAMwE,OAAQ,QAE1CxE,GAGX1gC,KAAK8sD,SAAW,SAAShE,GACrBA,EAAM5gD,QAAQ,SAASw4B,GACnB1gC,KAAKmhC,QAAQT,IACd1gC,OAGPA,KAAK4gC,WAAa,SAASF,GACvB,IAAI0P,EAAW1P,EAAK0P,SAChB7E,EAAW6E,EAAStpC,MAAM2lB,IAC1Bgf,EAAS2E,EAASvlB,IAAI4B,IAEtBm/B,EAAY5rD,KAAK6rD,UACjB/C,EAAQ1Y,EAAS0Y,MACrB,GAAoB,GAAhBA,EAAMtoD,OACNorD,EAAUnlD,OAAOmlD,EAAU1pD,QAAQkuC,GAAW,QAElD,GAAIA,EAAS1nB,MAAMujB,MAAMvL,EAAK7V,IAAI4B,IAAKiU,EAAK7V,IAAI8B,QAC5Cm8B,EAAMtuB,MACN4V,EAASvlB,IAAI4B,IAAMq8B,EAAMA,EAAMtoD,OAAS,GAAGqqB,IAAI4B,IAC/C2jB,EAASvlB,IAAI8B,OAASm8B,EAAMA,EAAMtoD,OAAS,GAAGqqB,IAAI8B,YAEtD,GAAIyjB,EAAS1nB,MAAMwjB,QAAQxL,EAAK55B,MAAM2lB,IAAKiU,EAAK55B,MAAM6lB,QAClDm8B,EAAM/9B,QACNqlB,EAAStpC,MAAM2lB,IAAMq8B,EAAM,GAAGhiD,MAAM2lB,IACpC2jB,EAAStpC,MAAM6lB,OAASm8B,EAAM,GAAGhiD,MAAM6lB,YAE3C,GAAI+T,EAAKuoB,QACLH,EAAMriD,OAAOqiD,EAAM5mD,QAAQw+B,GAAO,OAEtC,CACI,IAAIopB,EAAc1Z,EAAShuC,MAAMs+B,EAAK55B,MAAM2lB,IAAKiU,EAAK55B,MAAM6lB,QAC5Dm8B,EAAQgB,EAAYhB,MACpBA,EAAM/9B,QACN++B,EAAYhjD,MAAM2lB,IAAMq8B,EAAM,GAAGhiD,MAAM2lB,IACvCq9B,EAAYhjD,MAAM6lB,OAASm8B,EAAM,GAAGhiD,MAAM6lB,OAGzC3sB,KAAK+sD,YACF/sD,KAAK+oC,aACL/oC,KAAK2sD,gBAAgBphB,EAAUE,GAE/BzrC,KAAK4sD,sBAAsBrhB,EAAUE,IAE7CzrC,KAAK6sD,WAAY,EACjB7sD,KAAKuyB,QAAQ,aAAc,CAAEtR,KAAMyf,EAAMwE,OAAQ,YAGrDllC,KAAK0sD,YAAc,SAAS5D,GAExB,IADA,IAAIkE,EAAa,GACRtrD,EAAI,EAAGA,EAAIonD,EAAMtoD,OAAQkB,IAC9BsrD,EAAWlrD,KAAKgnD,EAAMpnD,IAG1BsrD,EAAW9kD,QAAQ,SAASw4B,GACxB1gC,KAAK4gC,WAAWF,IACjB1gC,MACHA,KAAK6sD,WAAY,GAGrB7sD,KAAK6gC,WAAa,SAASH,GACvB1gC,KAAK4gC,WAAWF,GAChBA,EAAKsqB,SAAS9iD,QAAQ,SAASmjD,GAC3B3qB,EAAK0qB,aAAaC,GAClBrrD,KAAKmhC,QAAQkqB,IACdrrD,MACC0gC,EAAK4qB,iBAAmB,GACxBtrD,KAAKitD,QAAQvsB,EAAK55B,MAAM2lB,IAAI,EAAGiU,EAAK7V,IAAI4B,IAAKiU,EAAK4qB,iBAAiB,GAEvE5qB,EAAKsqB,SAAW,IAGpBhrD,KAAKktD,YAAc,SAASpE,GACxBA,EAAM5gD,QAAQ,SAASw4B,GACnB1gC,KAAK6gC,WAAWH,IACjB1gC,OAGPA,KAAKmtD,OAAS,SAASltC,EAAUmtC,GAC7B,IAAI1kC,EAAOogC,EAYX,GAXgB,MAAZ7oC,GACAyI,EAAQ,IAAI4iB,EAAM,EAAG,EAAGtrC,KAAKkyB,YAAa,GAC1Ck7B,GAAc,GAEd1kC,EAD0B,iBAAZzI,EACN,IAAIqrB,EAAMrrB,EAAU,EAAGA,EAAUjgB,KAAKkhC,QAAQjhB,GAAUzf,QAC3D,QAASyf,EACNqrB,EAAMuB,WAAW5sB,EAAUA,GAE3BA,EAEZ6oC,EAAQ9oD,KAAK+rD,oBAAoBrjC,GAC7B0kC,EACAptD,KAAK0sD,YAAY5D,OACd,CACH,IAAIkC,EAAWlC,EACf,MAAOkC,EAASxqD,OACZR,KAAKktD,YAAYlC,GACjBA,EAAWhrD,KAAK+rD,oBAAoBrjC,GAG5C,GAAIogC,EAAMtoD,OACN,OAAOsoD,GAEf9oD,KAAKqtD,YAAc,SAASrlB,EAAQslB,GAChC,QAASttD,KAAKqwC,YAAYrI,EAAQslB,IAGtCttD,KAAKutD,cAAgB,SAASvlB,EAAQslB,GAClC,IAAIld,EAAWpwC,KAAKqwC,YAAYrI,EAAQslB,GACxC,OAAOld,EAAWA,EAASvlB,IAAI4B,IAAMub,GAGzChoC,KAAKwtD,gBAAkB,SAASxlB,EAAQslB,GACpC,IAAIld,EAAWpwC,KAAKqwC,YAAYrI,EAAQslB,GACxC,OAAOld,EAAWA,EAAStpC,MAAM2lB,IAAMub,GAG3ChoC,KAAKytD,mBAAqB,SAASrd,EAAU3E,EAAQC,EAAWH,EAAUC,GACtD,MAAZD,IACAA,EAAW6E,EAAStpC,MAAM2lB,KACX,MAAf+e,IACAA,EAAc,GACJ,MAAVC,IACAA,EAAS2E,EAASvlB,IAAI4B,KACT,MAAbif,IACAA,EAAY1rC,KAAKkhC,QAAQuK,GAAQjrC,QACrC,IAAIuM,EAAM/M,KAAK+M,IACX2gD,EAAW,GAiBf,OAfAtd,EAASiZ,KAAK,SAASG,EAAa/8B,EAAKE,EAAQghC,GAC7C,KAAIlhC,EAAM8e,GAAV,CAEA,GAAI9e,GAAO8e,EAAU,CACjB,GAAI5e,EAAS6e,EACT,OACJmiB,EAAazmD,KAAKC,IAAIqkC,EAAamiB,GAInCD,GADe,MAAflE,EACYA,EAEAz8C,EAAIm0B,QAAQzU,GAAK/F,UAAUinC,EAAYhhC,KAExD8e,EAAQC,GACJgiB,GAGX1tD,KAAKgxC,eAAiB,SAASvkB,EAAKif,EAAWH,EAAUC,GACrD,IAGQ9D,EAHJ0I,EAAWpwC,KAAKqwC,YAAY5jB,GAEhC,OAAK2jB,EAKMpwC,KAAKytD,mBACRrd,EAAU3jB,EAAKif,EAAWH,EAAUC,IAJxC9D,EAAO1nC,KAAK+M,IAAIm0B,QAAQzU,GACjBib,EAAKhhB,UAAU8kB,GAAe,EAAGE,GAAahE,EAAKlnC,UAOlER,KAAK4tD,eAAiB,WAClB,IAAIC,EAAK,GAQT,OAPAA,EAAK7tD,KAAK6rD,UAAUrjD,IAAI,SAAS4nC,GAC7B,IAAI0Y,EAAQ1Y,EAAS0Y,MAAMtgD,IAAI,SAASk4B,GACpC,OAAOA,EAAKqM,UAEhB,OAAO,IAAI6b,EAASiF,EAAI/E,KAGrB+E,GAGX7tD,KAAK8tD,WAAa,SAASC,GACvB,IAEIrtB,EACAstB,EAHAloC,EAAY9lB,KAAK8lB,UACjB4C,EAAQ5C,EAAU2C,WAItB,GAAIC,EAAMlD,UAAW,CACjB,IAAIgH,EAAS9D,EAAM5hB,MAGnB,GAFA45B,EAAO1gC,KAAK2gC,UAAUnU,EAAOC,IAAKD,EAAOG,QAErC+T,EAEA,YADA1gC,KAAK6gC,WAAWH,IAETstB,EAAahuD,KAAK47C,oBAAoBpvB,IACP,GAAlC9D,EAAMyF,aAAa6/B,GACnBtlC,EAAMmC,IAAMmjC,GAEZtlC,EAAM5hB,MAAQknD,EACdtlC,EAAM5hB,MAAM6lB,SACZjE,EAAMmC,IAAI8B,WAEPqhC,EAAahuD,KAAK47C,oBAAoB,CAACnvB,IAAKD,EAAOC,IAAKE,OAAQH,EAAOG,OAAS,MACjD,GAAlCjE,EAAMyF,aAAa6/B,GACnBtlC,EAAMmC,IAAMmjC,EAEZtlC,EAAM5hB,MAAQknD,EAElBtlC,EAAM5hB,MAAM6lB,UAEZjE,EAAQ1oB,KAAKiuD,oBAAoBzhC,EAAOC,IAAKD,EAAOG,SAAWjE,MAEhE,CACH,IAAIogC,EAAQ9oD,KAAK2rD,gBAAgBjjC,GACjC,GAAIqlC,GAAejF,EAAMtoD,OAErB,YADAR,KAAKktD,YAAYpE,GAEM,GAAhBA,EAAMtoD,SACbkgC,EAAOooB,EAAM,IAOrB,GAHKpoB,IACDA,EAAO1gC,KAAK2gC,UAAUjY,EAAM5hB,MAAM2lB,IAAK/D,EAAM5hB,MAAM6lB,SAEnD+T,GAAQA,EAAKhY,MAAMnnB,YAAcmnB,EAAMnnB,WACvCvB,KAAK6gC,WAAWH,OADpB,CAKA,IAAI8oB,EAAc,MAClB,IAAK9gC,EAAM0G,cAAe,CAEtB,GADAo6B,EAAcxpD,KAAK42B,aAAalO,GAC5B8gC,EAAYhpD,OAAS,EACrB,OACJgpD,EAAcA,EAAYj9C,OAAOma,UAAU,EAAG,GAAK,KAGvD1mB,KAAKmhC,QAAQqoB,EAAa9gC,KAG9B1oB,KAAKiuD,oBAAsB,SAASxhC,EAAKE,EAAQ+V,GAC7C,IAAIma,EAAW,IAAItE,EAAcv4C,KAAMysB,EAAKE,GACxC4nB,EAAQsI,EAAS1D,kBACjBz9B,EAAO64B,EAAM74B,KACjB,GAAI64B,GAAS,kBAAkB9wC,KAAKiY,GAAO,CACvCA,EAAOA,EAAKhY,MAAM,kBAAkB,GACxB,WAARgY,IACAA,GAAQ,cACZ,IAAIyiB,EAAK,IAAI36B,OAAOkY,GAChBgN,EAAQ,IAAI4iB,EAChB,GAAW,GAAP5I,EAAU,CACV,GACI6R,EAAQsI,EAAS7D,qBACZzE,GAASpW,EAAG16B,KAAK8wC,EAAM74B,OAChCmhC,EAAS5D,cAQb,GALAvwB,EAAM5hB,MAAM2lB,IAAMowB,EAASzD,qBAC3B1wB,EAAM5hB,MAAM6lB,OAASkwB,EAASxD,wBAA0B,EAExDwD,EAAW,IAAItE,EAAcv4C,KAAMysB,EAAKE,IAE5B,GAAR+V,EAAW,CACX,IAAIkK,GAAW,EACf,GAEI,GADA2H,EAAQsI,EAAS5D,eACD,GAAZrM,EAAe,CACf,IAAIvU,EAAQr4B,KAAKmoD,SAAStL,EAASlE,MAC9Bxa,EAAG16B,KAAK40B,KACTuU,EAAUiQ,EAASlE,WACpB,GAAIkE,EAASlE,KAAO/L,EACvB,YAEC2H,GAASpW,EAAG16B,KAAK8wC,EAAM74B,OAChC64B,EAAQsI,EAAS7D,oBAEjBzE,EAAQsI,EAAS1D,kBAIrB,OAFAzwB,EAAMmC,IAAI4B,IAAMowB,EAASzD,qBACzB1wB,EAAMmC,IAAI8B,OAASkwB,EAASxD,wBAA0B9E,EAAM7rC,MAAMlI,OAAS,EACpEkoB,IAIf1oB,KAAKitD,QAAU,SAAS1hB,EAAUE,EAAQyiB,QACzB9sD,GAAT8sD,IACAA,EAAQ,KACZ,IAAIptB,EAAc9gC,KAAK8gC,YACvB,GAAKA,EAAL,CAEA2K,EAASA,GAAUzrC,KAAKkyB,YACxBqZ,EAAWA,GAAY,EACvB,IAAK,IAAI9e,EAAM8e,EAAU9e,EAAMgf,EAAQhf,IAGnC,GAFwB,MAApBqU,EAAYrU,KACZqU,EAAYrU,GAAOzsB,KAAKmuD,cAAc1hC,IAClB,SAApBqU,EAAYrU,GAAhB,CAGA,IAAI/D,EAAQ1oB,KAAKouD,mBAAmB3hC,GACpC,GAAI/D,GAASA,EAAM0G,eACZ1G,EAAMmC,IAAI4B,KAAOgf,GACjB/iB,EAAM5hB,MAAM2lB,KAAO8e,EACxB,CACE9e,EAAM/D,EAAMmC,IAAI4B,IAChB,IACI,IAAIiU,EAAO1gC,KAAKmhC,QAAQ,MAAOzY,GAC3BgY,IACAA,EAAK4qB,iBAAmB4C,GAC9B,MAAM9xC,SAIpBpc,KAAKquD,YAAc,CACf,OAAU,EACV,UAAa,EACb,aAAgB,GAEpBruD,KAAKsuD,WAAa,YAClBtuD,KAAKuuD,aAAe,SAASjgD,GACzB,IAAKtO,KAAKquD,YAAY//C,GAClB,MAAM,IAAIqtB,MAAM,uBAAyBrtB,EAAQ,IAAMjN,OAAO4I,KAAKjK,KAAKquD,aAAa7rD,KAAK,MAAQ,KAEtG,GAAIxC,KAAKsuD,YAAchgD,EAAvB,CAGAtO,KAAKsuD,WAAahgD,EAEL,UAATA,GACAtO,KAAKmtD,SACT,IAAI9U,EAAOr4C,KAAKwuD,UAChBxuD,KAAKyuD,YAAY,MACjBzuD,KAAKyuD,YAAYpW,KAGrBr4C,KAAKyuD,YAAc,SAASC,GACpB1uD,KAAKwuD,WAAaE,IAGtB1uD,KAAKwuD,UAAYE,EAEjB1uD,KAAK06B,IAAI,SAAU16B,KAAK2uD,oBACxB3uD,KAAK06B,IAAI,kBAAmB16B,KAAK4uD,6BACjC5uD,KAAKuyB,QAAQ,oBAERm8B,GAA+B,UAAnB1uD,KAAKsuD,YAKtBtuD,KAAK8gC,YAAc,GACnB9gC,KAAKmuD,cAAgBO,EAASP,cAAchpD,KAAKupD,EAAU1uD,KAAMA,KAAKsuD,YACtEtuD,KAAKouD,mBAAqBM,EAASN,mBAAmBjpD,KAAKupD,EAAU1uD,KAAMA,KAAKsuD,YAEhFtuD,KAAK2uD,mBAAqB3uD,KAAK6uD,kBAAkB1pD,KAAKnF,MACtDA,KAAK4uD,4BAA8B5uD,KAAK8uD,2BAA2B3pD,KAAKnF,MACxEA,KAAKioB,GAAG,SAAUjoB,KAAK2uD,oBACvB3uD,KAAKioB,GAAG,kBAAmBjoB,KAAK4uD,8BAX5B5uD,KAAK8gC,YAAc,OAc3B9gC,KAAKghC,uBAAyB,SAAUvU,EAAKsiC,GACzC,IAAIC,EAAKhvD,KAAK8gC,YACd,IAAKkuB,GAAOD,GAAiBC,EAAGviC,GAC5B,MAAO,GAEX,IAAiBwU,EAAbv/B,EAAI+qB,EAAM,EACd,MAAO/qB,GAAK,EAAG,CACX,IAAIknB,EAAIomC,EAAGttD,GAIX,GAHS,MAALknB,IACAA,EAAIomC,EAAGttD,GAAK1B,KAAKmuD,cAAczsD,IAE1B,SAALknB,EAAc,CACd,IAAIF,EAAQ1oB,KAAKouD,mBAAmB1sD,GAGpC,GAFKu/B,IACDA,EAAavY,GACbA,GAASA,EAAMmC,IAAI4B,KAAOA,EAC1B,MAER/qB,IAGJ,MAAO,CACHgnB,OAAc,IAAPhnB,GAAYgnB,EACnBuY,WAAYA,IAIpBjhC,KAAK+gC,kBAAoB,SAAStU,EAAKrQ,GACnCA,EAAIA,EAAEoN,SACN,IAAIuS,EAAU,CACVkzB,SAAU7yC,EAAEO,SACZmhB,IAAK1hB,EAAEK,SAAWL,EAAEwD,QACpBsvC,SAAU9yC,EAAEM,QAGZgM,EAAQ1oB,KAAKmvD,kBAAkB1iC,EAAKsP,GACxC,IAAKrT,EAAO,CACR,IAAIpb,EAAM8O,EAAE/W,QAAU+W,EAAE0W,WACpBxlB,GAAM,kBAAkB7J,KAAK6J,EAAGE,aAChCF,EAAGE,WAAa,kBAI5BxN,KAAKmvD,kBAAoB,SAAS1iC,EAAKsP,GACnC,GAAK/7B,KAAKmuD,cAAV,CAEA,IAAIzyC,EAAO1b,KAAKmuD,cAAc1hC,GAC1Bib,EAAO1nC,KAAKkhC,QAAQzU,GAEpBiW,EAAe,QAAThnB,GAAkB,EAAI,EAC5BglB,EAAO1gC,KAAK2gC,UAAUlU,GAAc,IAATiW,EAAa,EAAIgF,EAAKlnC,OAAQkiC,GAE7D,GAAIhC,EAKA,OAJI3E,EAAQkzB,UAAYlzB,EAAQ+B,IAC5B99B,KAAK4gC,WAAWF,GAEhB1gC,KAAK6gC,WAAWH,GACbA,EAGX,IAAIhY,EAAQ1oB,KAAKouD,mBAAmB3hC,GAAK,GACzC,GAAI/D,IAAUA,EAAM0G,gBAChBsR,EAAO1gC,KAAK2gC,UAAUjY,EAAM5hB,MAAM2lB,IAAK/D,EAAM5hB,MAAM6lB,OAAQ,GACvD+T,GAAQhY,EAAMijB,QAAQjL,EAAKhY,QAE3B,OADA1oB,KAAK4gC,WAAWF,GACTA,EAIf,GAAI3E,EAAQmzB,SAAU,CAClB,IAAIjuC,EAAOjhB,KAAKghC,uBAAuBvU,GACvC,GAAIxL,EAAKyH,MACL,IAAI6iB,EAAWtqB,EAAKyH,MAAM5hB,MAAM2lB,IAAM,EAClCgf,EAASxqB,EAAKyH,MAAMmC,IAAI4B,IAEhCzsB,KAAKitD,QAAQ1hB,EAAUE,EAAQ1P,EAAQ+B,IAAM,IAAQ,QAC9C/B,EAAQkzB,UACfxjB,EAAS/iB,EAAQA,EAAMmC,IAAI4B,IAAMzsB,KAAKkyB,YACtClyB,KAAKitD,QAAQxgC,EAAM,EAAGgf,EAAQ1P,EAAQ+B,IAAM,IAAQ,IAC7CpV,IACHqT,EAAQ+B,MACRpV,EAAM4iC,iBAAmB,KAC7BtrD,KAAKmhC,QAAQ,MAAOzY,IAGxB,OAAOA,IAKX1oB,KAAKovD,iBAAmB,SAASC,GAC7B,IAAI5iC,EAAMzsB,KAAK8lB,UAAUioB,YAAYthB,IACrCA,EAAMzsB,KAAKwtD,gBAAgB/gC,GAC3B,IAAI/D,EAAQ1oB,KAAKmvD,kBAAkB1iC,EAAK,IAExC,IAAI/D,EAAJ,CAEA,IAAIzH,EAAOjhB,KAAKghC,uBAAuBvU,GAAK,GAG5C,GAFA/D,EAAQzH,EAAKyH,OAASzH,EAAKggB,WAEvBvY,EAAO,CACP+D,EAAM/D,EAAM5hB,MAAM2lB,IAClB,IAAIiU,EAAO1gC,KAAK2gC,UAAUlU,EAAKzsB,KAAKkhC,QAAQzU,GAAKjsB,OAAQ,GAErDkgC,EACA1gC,KAAK4gC,WAAWF,GAEhB1gC,KAAKmhC,QAAQ,MAAOzY,MAKhC1oB,KAAK6uD,kBAAoB,SAASxmB,GAC9B,IAAIsE,EAAWtE,EAAMvhC,MAAM2lB,IACvBkY,EAAM0D,EAAMxd,IAAI4B,IAAMkgB,EAE1B,GAAY,IAARhI,EACA3kC,KAAK8gC,YAAY6L,GAAY,UAC1B,GAAoB,UAAhBtE,EAAMnD,OACbllC,KAAK8gC,YAAYr6B,OAAOkmC,EAAUhI,EAAM,EAAG,UACxC,CACH,IAAIp/B,EAAOd,MAAMkgC,EAAM,GACvBp/B,EAAK2wC,QAAQvJ,EAAU,GACvB3sC,KAAK8gC,YAAYr6B,OAAO7F,MAAMZ,KAAK8gC,YAAav7B,KAGxDvF,KAAK8uD,2BAA6B,SAAS1yC,GACvC,IAAI+1B,EAAO/1B,EAAE6E,KACTkxB,EAAK6V,OAAS7V,EAAK3wB,MACfxhB,KAAK8gC,YAAYtgC,OAAS2xC,EAAK6V,OAC/BhoD,KAAK8gC,YAAYr6B,OAAO0rC,EAAK6V,MAAOhoD,KAAK8gC,YAAYtgC,SAKrEmC,EAAQ8oD,QAAUA,IAIlBpoD,IAAIlD,OAAO,iCAAiC,CAAC,UAAU,UAAU,SAAS,qBAAqB,aAAc,SAAS0B,EAAUc,EAASvC,GACzI,aAEA,IAAIm4C,EAAgB12C,EAAS,qBAAqB02C,cAC9CjN,EAAQzpC,EAAS,YAAYypC,MAGjC,SAASgkB,IAELtvD,KAAK47C,oBAAsB,SAASjsC,EAAU4/C,GAC1C,GAAuB,GAAnB5/C,EAASgd,OAAa,OAAO,KAEjC,IAAI6iC,EAAmBD,GAAOvvD,KAAKkhC,QAAQvxB,EAAS8c,KAAKpqB,OAAOsN,EAASgd,OAAO,GAChF,GAAwB,IAApB6iC,EAAwB,OAAO,KAEnC,IAAI9rD,EAAQ8rD,EAAiB9rD,MAAM,yBACnC,OAAKA,EAGDA,EAAM,GACC1D,KAAKyvD,oBAAoB/rD,EAAM,GAAIiM,GAEnC3P,KAAKs7C,oBAAoB53C,EAAM,GAAIiM,GALnC,MAQf3P,KAAKkvB,gBAAkB,SAASloB,GAC5B,IACmB0hB,EADfgf,EAAO1nC,KAAKkhC,QAAQl6B,EAAIylB,KACxBs0B,GAAS,EAETwO,EAAM7nB,EAAKrlC,OAAO2E,EAAI2lB,OAAO,GAC7BjpB,EAAQ6rD,GAAOA,EAAI7rD,MAAM,yBAO7B,GANKA,IACD6rD,EAAM7nB,EAAKrlC,OAAO2E,EAAI2lB,QACtB3lB,EAAM,CAACylB,IAAKzlB,EAAIylB,IAAKE,OAAQ3lB,EAAI2lB,OAAS,GAC1CjpB,EAAQ6rD,GAAOA,EAAI7rD,MAAM,yBACzBq9C,GAAS,IAERr9C,EACD,OAAO,KAEX,GAAIA,EAAM,GAAI,CACV,IAAIsqD,EAAahuD,KAAKyvD,oBAAoB/rD,EAAM,GAAIsD,GACpD,IAAKgnD,EACD,OAAO,KACXtlC,EAAQ4iB,EAAMuB,WAAW7lC,EAAKgnD,GACzBjN,IACDr4B,EAAMmC,IAAI8B,SACVjE,EAAM5hB,MAAM6lB,UAEhBjE,EAAM8D,OAAS9D,EAAMmC,QAClB,CACCmjC,EAAahuD,KAAKs7C,oBAAoB53C,EAAM,GAAIsD,GACpD,IAAKgnD,EACD,OAAO,KACXtlC,EAAQ4iB,EAAMuB,WAAWmhB,EAAYhnD,GAChC+5C,IACDr4B,EAAM5hB,MAAM6lB,SACZjE,EAAMmC,IAAI8B,UAEdjE,EAAM8D,OAAS9D,EAAM5hB,MAGzB,OAAO4hB,GAGX1oB,KAAK0vD,UAAY,CACb,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KAGT1vD,KAAKs7C,oBAAsB,SAAS0B,EAASrtC,EAAUggD,GACnD,IAAIC,EAAc5vD,KAAK0vD,UAAU1S,GAC7BkR,EAAQ,EAERrR,EAAW,IAAItE,EAAcv4C,KAAM2P,EAAS8c,IAAK9c,EAASgd,QAC1D4nB,EAAQsI,EAAS1D,kBAGrB,GAFK5E,IACDA,EAAQsI,EAAS5D,eAChB1E,EAAL,CAGMob,IACFA,EAAS,IAAInsD,OACT,QACA+wC,EAAM74B,KAAKhZ,QAAQ,IAAK,OAAOA,QAAQ,SAAU,UAC5CA,QAAQ,cAAe,uBAC1B,OAGV,IAAImtD,EAAalgD,EAASgd,OAASkwB,EAASxD,wBAA0B,EAClE3wC,EAAQ6rC,EAAM7rC,MAElB,MAAO,EAAM,CAET,MAAOmnD,GAAc,EAAG,CACpB,IAAIN,EAAM7mD,EAAMrG,OAAOwtD,GACvB,GAAIN,GAAOK,GAEP,GADA1B,GAAS,EACI,GAATA,EACA,MAAO,CAACzhC,IAAKowB,EAASzD,qBAClBzsB,OAAQkjC,EAAahT,EAASxD,8BAGjCkW,GAAOvS,IACZkR,GAAS,GAEb2B,GAAc,EAElB,GACItb,EAAQsI,EAAS7D,qBACZzE,IAAUob,EAAOlsD,KAAK8wC,EAAM74B,OAErC,GAAa,MAAT64B,EACA,MAEJ7rC,EAAQ6rC,EAAM7rC,MACdmnD,EAAannD,EAAMlI,OAAS,EAGhC,OAAO,OAGXR,KAAKyvD,oBAAsB,SAASzS,EAASrtC,EAAUggD,GACnD,IAAIG,EAAiB9vD,KAAK0vD,UAAU1S,GAChCkR,EAAQ,EAERrR,EAAW,IAAItE,EAAcv4C,KAAM2P,EAAS8c,IAAK9c,EAASgd,QAC1D4nB,EAAQsI,EAAS1D,kBAGrB,GAFK5E,IACDA,EAAQsI,EAAS5D,eAChB1E,EAAL,CAGKob,IACDA,EAAS,IAAInsD,OACT,QACA+wC,EAAM74B,KAAKhZ,QAAQ,IAAK,OAAOA,QAAQ,SAAU,UAC5CA,QAAQ,sBAAuB,uBAClC,OAGV,IAAImtD,EAAalgD,EAASgd,OAASkwB,EAASxD,wBAE5C,MAAO,EAAM,CAET,IAAI3wC,EAAQ6rC,EAAM7rC,MACdqnD,EAAcrnD,EAAMlI,OACxB,MAAOqvD,EAAaE,EAAa,CAC7B,IAAIR,EAAM7mD,EAAMrG,OAAOwtD,GACvB,GAAIN,GAAOO,GAEP,GADA5B,GAAS,EACI,GAATA,EACA,MAAO,CAACzhC,IAAKowB,EAASzD,qBAClBzsB,OAAQkjC,EAAahT,EAASxD,8BAGjCkW,GAAOvS,IACZkR,GAAS,GAEb2B,GAAc,EAElB,GACItb,EAAQsI,EAAS5D,oBACZ1E,IAAUob,EAAOlsD,KAAK8wC,EAAM74B,OAErC,GAAa,MAAT64B,EACA,MAEJsb,EAAa,EAGjB,OAAO,OAGfltD,EAAQ2sD,aAAeA,IAIvBjsD,IAAIlD,OAAO,mBAAmB,CAAC,UAAU,UAAU,SAAS,cAAc,eAAe,kBAAkB,aAAa,wBAAwB,gBAAgB,gBAAgB,YAAY,eAAe,2BAA2B,uBAAuB,2BAA2B,kCAAmC,SAAS0B,EAAUc,EAASvC,GACvV,aAEA,IAAI4R,EAAMnQ,EAAS,aACf8hB,EAAO9hB,EAAS,cAChBslC,EAActlC,EAAS,iBAAiBslC,YACxCvI,EAAS/8B,EAAS,YAClB63B,EAAe73B,EAAS,uBAAuB63B,aAC/C4T,EAAYzrC,EAAS,eAAeyrC,UACpC0iB,EAAWnuD,EAAS,eAAe49C,KACnCnU,EAAQzpC,EAAS,WAAWypC,MAC5BmZ,EAAW5iD,EAAS,cAAc4iD,SAClC0C,EAAsBtlD,EAAS,0BAA0BslD,oBACzDiB,EAAkBvmD,EAAS,sBAAsBumD,gBAEjD6H,EAAc,SAAS/rC,EAAMm0B,GAC7Br4C,KAAKkwD,aAAe,GACpBlwD,KAAKmwD,aAAe,GACpBnwD,KAAKowD,cAAgB,GACrBpwD,KAAKqwD,aAAe,GACpBrwD,KAAKswD,UAAY,EACjBtwD,KAAKuwD,aAAc,EAEnBvwD,KAAK6rD,UAAY,GACjB7rD,KAAK6C,GAAK,aAAeotD,EAAYO,KACrCxwD,KAAK6rD,UAAUtqD,SAAW,WACtB,OAAOvB,KAAKwC,KAAK,OAErBxC,KAAKioB,GAAG,aAAcjoB,KAAKywD,aAAatrD,KAAKnF,OAC7CA,KAAKwjD,UAAYxjD,KAAKooC,SAASjjC,KAAKnF,MAEjB,iBAARkkB,GAAqBA,EAAKgd,UACjChd,EAAO,IAAIugC,EAASvgC,IAExBlkB,KAAKsyC,aAAe,IAAInL,EAAYnnC,MACpCA,KAAK+nD,YAAY7jC,GACjBlkB,KAAK8lB,UAAY,IAAIwnB,EAAUttC,MAE/B4+B,EAAO3C,aAAaj8B,MACpBA,KAAK0wD,QAAQrY,GACbzZ,EAAOrM,QAAQ,UAAWvyB,OAI9BiwD,EAAYO,KAAO,EAEnB,WAEIx+C,EAAIF,UAAU9R,KAAM05B,GACpB15B,KAAK+nD,YAAc,SAASh7C,GACpB/M,KAAK+M,KACL/M,KAAK+M,IAAIiP,eAAe,SAAUhc,KAAKwjD,WAE3CxjD,KAAK+M,IAAMA,EACXA,EAAIkb,GAAG,SAAUjoB,KAAKwjD,WAElBxjD,KAAK2wD,aACL3wD,KAAK2wD,YAAY5I,YAAY/nD,KAAKutC,eAEtCvtC,KAAK4wD,eAET5wD,KAAKutC,YAAc,WACf,OAAOvtC,KAAK+M,KAEhB/M,KAAK6wD,eAAiB,SAAS7oB,GAC3B,IAAKA,EAGD,OAFAhoC,KAAK2oC,aAAe,QACpB3oC,KAAKyoC,gBAAkB,IAG3B,IAAI9mC,EAAI3B,KAAK2oC,aAAanoC,OACtBkB,EAAI1B,KAAK0oC,kBAAkB1oC,KAAK2oC,aAAcX,GAAU,EACxDrmC,EAAID,IACJ1B,KAAK2oC,aAAaliC,OAAO/E,EAAGC,GAC5B3B,KAAKyoC,gBAAgBhiC,OAAO/E,EAAGC,KAIvC3B,KAAK0oC,kBAAoB,SAASooB,EAAYzoC,GAC1C,IAAI0oC,EAAM,EACNnrB,EAAKkrB,EAAWtwD,OAAS,EAE7B,MAAOuwD,GAAOnrB,EAAI,CACd,IAAIorB,EAAOD,EAAMnrB,GAAO,EACpBhd,EAAIkoC,EAAWE,GAEnB,GAAI3oC,EAAMO,EACNmoC,EAAMC,EAAM,MACX,MAAI3oC,EAAMO,GAGX,OAAOooC,EAFPprB,EAAKorB,EAAM,GAKnB,OAAOD,EAAK,GAGhB/wD,KAAK4wD,YAAc,WACf5wD,KAAK6sD,WAAY,EACjB7sD,KAAKipC,UAAY,GACjBjpC,KAAKixD,gBAAkB,GACvBjxD,KAAK6wD,eAAe,GAChB7wD,KAAK2wD,aACL3wD,KAAK2wD,YAAY7pD,MAAM,IAG/B9G,KAAKywD,aAAe,SAASr0C,GACzB,IAAIskB,EAAOtkB,EAAE6E,KACbjhB,KAAK6wD,eAAenwB,EAAK55B,MAAM2lB,MAGnCzsB,KAAKooC,SAAW,SAASC,GACrBroC,KAAK6sD,WAAY,EACjB7sD,KAAKsyC,aAAalK,SAASC,GAC3BroC,KAAK6wD,eAAexoB,EAAMvhC,MAAM2lB,KAEhC,IAAIykC,EAAelxD,KAAKmxD,4BAA4B9oB,GAC/CroC,KAAKoxD,YAAapxD,KAAK+nB,cAAiBsgB,EAAMgpB,SAC/CrxD,KAAKsxD,WAAWxvD,KAAKumC,GACjB6oB,GAAuC,GAAvBA,EAAa1wD,QAC7BR,KAAKuxD,YAAYzvD,KAAK,CAClBojC,OAAQ,cACR4jB,MAAQoI,IAIhBlxD,KAAKwxD,mBAAmBpuC,YAG5BpjB,KAAK2wD,aAAe3wD,KAAK2wD,YAAYzI,gBAAgB7f,GACrDroC,KAAKuyB,QAAQ,SAAU8V,IAE3BroC,KAAK6kD,SAAW,SAAS3gC,GACrBlkB,KAAK+M,IAAI83C,SAAS3gC,GAClBlkB,KAAK8lB,UAAU2oB,OAAO,EAAG,GAEzBzuC,KAAK6wD,eAAe,GACpB7wD,KAAKyxD,QAAU,GACfzxD,KAAKsxD,WAAa,GAClBtxD,KAAKuxD,YAAc,GACnBvxD,KAAK0xD,eAAe1xD,KAAK+nB,cACzB/nB,KAAK2xD,iBAAiBC,SAE1B5xD,KAAK8kD,SACL9kD,KAAKuB,SAAW,WACZ,OAAOvB,KAAK+M,IAAI+3C,YAEpB9kD,KAAK6xD,aAAe,WAChB,OAAO7xD,KAAK8lB,WAEhB9lB,KAAKmoD,SAAW,SAAS17B,GACrB,OAAOzsB,KAAK2wD,YAAYxI,SAAS17B,IAErCzsB,KAAK64C,UAAY,SAASpsB,GACtB,OAAOzsB,KAAK2wD,YAAY9X,UAAUpsB,IAEtCzsB,KAAK84C,WAAa,SAASrsB,EAAKE,GAC5B,IACI4nB,EADAY,EAASn1C,KAAK2wD,YAAY9X,UAAUpsB,GAC7B7D,EAAI,EACf,GAAc,MAAV+D,EAAgB,CAChB,IAAIjrB,EAAIyzC,EAAO30C,OAAS,EACxBooB,EAAI5oB,KAAKkhC,QAAQzU,GAAKjsB,YAEtB,IAASkB,EAAI,EAAGA,EAAIyzC,EAAO30C,OAAQkB,IAE/B,GADAknB,GAAKusB,EAAOzzC,GAAGgH,MAAMlI,OACjBooB,GAAK+D,EACL,MAIZ,OADA4nB,EAAQY,EAAOzzC,GACV6yC,GAELA,EAAMzvC,MAAQpD,EACd6yC,EAAMztC,MAAQ8hB,EAAI2rB,EAAM7rC,MAAMlI,OACvB+zC,GAHI,MAKfv0C,KAAK0xD,eAAiB,SAASI,GAS3B,GARA9xD,KAAK+nB,aAAe+pC,EACpB9xD,KAAKyxD,QAAU,GACfzxD,KAAKsxD,WAAa,GAClBtxD,KAAKuxD,YAAc,GAEfvxD,KAAKwxD,oBACLxxD,KAAKwxD,mBAAmBruC,SAExB2uC,EAAa,CACb,IAAIxpD,EAAOtI,KAEXA,KAAK+xD,uBAAyB,WAC1BzpD,EAAKkpD,mBAAmBruC,SAEpB7a,EAAKipD,YAAY/wD,SACjB8H,EAAKmpD,QAAQ3vD,KAAK,CACdkwD,MAAO,OACPxL,OAAQl+C,EAAKipD,cAEjBjpD,EAAKipD,YAAc,IAGnBjpD,EAAKgpD,WAAW9wD,SAChB8H,EAAKmpD,QAAQ3vD,KAAK,CACdkwD,MAAO,MACPxL,OAAQl+C,EAAKgpD,aAEjBhpD,EAAKgpD,WAAa,IAGlBhpD,EAAKmpD,QAAQjxD,OAAS,GACtBsxD,EAAYG,QAAQ,CAChB/sB,OAAQ,YACR3/B,KAAM,CAAC+C,EAAKmpD,QAASnpD,GACrB2tC,MAAO3tC,EAAK4pD,kBAGpB5pD,EAAK4pD,iBAAkB,EACvB5pD,EAAKmpD,QAAU,IAEnBzxD,KAAKwxD,mBAAqB7tC,EAAKL,YAAYtjB,KAAK+xD,0BAGxD/xD,KAAKmoB,cAAgB,WACbnoB,KAAK+xD,wBACL/xD,KAAK+xD,0BAGb/xD,KAAKmyD,oBAAsB,CACvB5pC,KAAM,aACN6pC,KAAM,aACNR,MAAO,cAEX5xD,KAAK2xD,eAAiB,WAClB,OAAO3xD,KAAK+nB,cAAgB/nB,KAAKmyD,qBAErCnyD,KAAK+7C,aAAe,WAChB,OAAI/7C,KAAKugD,iBACE58B,EAAK/B,aAAa,IAAK5hB,KAAK2wC,cAE5B,MAGf3wC,KAAKqyD,eAAiB,SAAShqC,GAC3BroB,KAAK+6B,UAAU,cAAe1S,IAElCroB,KAAKugD,eAAiB,WAClB,OAAOvgD,KAAKsyD,eAAiBtyD,KAAKi8C,MAAMsW,iBAE5CvyD,KAAKwyD,WAAa,SAAS/hB,GACvBzwC,KAAK+6B,UAAU,UAAW0V,IAE9BzwC,KAAK2wC,WAAa,WACd,OAAO3wC,KAAKyyD,UAEhBzyD,KAAK0wC,UAAY,SAAS/gC,GACtB,OAAO3P,KAAKsyD,cAAiB3iD,EAASgd,OAAS3sB,KAAKyyD,WAAa,GAErEzyD,KAAK0yD,0BAA4B,SAAUC,GACvC3yD,KAAK+6B,UAAU,yBAA0B43B,IAE7C3yD,KAAK4wC,0BAA4B,WAC7B,OAAO5wC,KAAK4yD,yBAGhB5yD,KAAK6yD,YAAa,EAClB7yD,KAAK8yD,aAAe,SAASC,GACzB/yD,KAAK+6B,UAAU,YAAag4B,IAEhC/yD,KAAKgzD,aAAe,WAChB,OAAOhzD,KAAK6yD,YAEhB7yD,KAAKizD,gBAAkB,WACnBjzD,KAAK8yD,cAAc9yD,KAAK6yD,aAE5B7yD,KAAKkzD,oBAAsB,SAASzmC,EAAKjf,GAChCxN,KAAKmwD,aAAa1jC,KACnBzsB,KAAKmwD,aAAa1jC,GAAO,IAC7BzsB,KAAKmwD,aAAa1jC,IAAQ,IAAMjf,EAChCxN,KAAKuyB,QAAQ,mBAAoB,KAErCvyB,KAAKmzD,uBAAyB,SAAS1mC,EAAKjf,GACxCxN,KAAKmwD,aAAa1jC,IAAQzsB,KAAKmwD,aAAa1jC,IAAQ,IAAI/pB,QAAQ,IAAM8K,EAAW,IACjFxN,KAAKuyB,QAAQ,mBAAoB,KAErCvyB,KAAKozD,eAAiB,WAClB,OAAOpzD,KAAKkwD,cAEhBlwD,KAAKqzD,eAAiB,SAASlhB,GAC3BnyC,KAAKkwD,aAAe,GACpB,IAAK,IAAIxuD,EAAE,EAAGA,EAAEywC,EAAK3xC,OAAQkB,IACzB1B,KAAKkwD,aAAa/d,EAAKzwC,IAAM,iBAEjC1B,KAAKuyB,QAAQ,mBAAoB,KAErCvyB,KAAKszD,iBAAmB,WACpBtzD,KAAKkwD,aAAe,GACpBlwD,KAAKuyB,QAAQ,mBAAoB,KAErCvyB,KAAKuzD,cAAgB,SAAS9mC,EAAKjf,QACbpM,IAAdoM,IACAA,EAAY,kBACZA,EACAxN,KAAKkwD,aAAazjC,GAAOjf,SAElBxN,KAAKkwD,aAAazjC,GAC7BzsB,KAAKuyB,QAAQ,mBAAoB,KAErCvyB,KAAKwzD,gBAAkB,SAAS/mC,UACrBzsB,KAAKkwD,aAAazjC,GACzBzsB,KAAKuyB,QAAQ,mBAAoB,KAErCvyB,KAAK01B,UAAY,SAAShN,EAAO2/B,EAAO3sC,EAAM+3C,GAC1C,IAAI5wD,EAAK7C,KAAKswD,YAEVoD,EAAS,CACThrC,MAAQA,EACRhN,KAAOA,GAAQ,OACfsN,SAAyB,mBAARtN,EAAqBA,EAAO,KAC7C2sC,MAAQA,EACRoL,UAAWA,EACX5wD,GAAIA,GAWR,OARI4wD,GACAzzD,KAAKowD,cAAcvtD,GAAM6wD,EACzB1zD,KAAKuyB,QAAQ,uBAEbvyB,KAAKqwD,aAAaxtD,GAAM6wD,EACxB1zD,KAAKuyB,QAAQ,qBAGV1vB,GAEX7C,KAAK2zD,iBAAmB,SAASD,EAAQD,GACrC,GAAKC,EAAOjL,OAAZ,CAEA,IAAI5lD,EAAK7C,KAAKswD,YAYd,OAXAoD,EAAO7wD,GAAKA,EACZ6wD,EAAOD,UAAYA,EAEfA,GACAzzD,KAAKowD,cAAcvtD,GAAM6wD,EACzB1zD,KAAKuyB,QAAQ,uBAEbvyB,KAAKqwD,aAAaxtD,GAAM6wD,EACxB1zD,KAAKuyB,QAAQ,qBAGVmhC,IAEX1zD,KAAKk2B,aAAe,SAAS09B,GACzB,IAAIF,EAAS1zD,KAAKowD,cAAcwD,IAAa5zD,KAAKqwD,aAAauD,GAC/D,GAAKF,EAAL,CAGA,IAAIG,EAAUH,EAAOD,QAAUzzD,KAAKowD,cAAgBpwD,KAAKqwD,aACrDqD,WACQG,EAAQD,GAChB5zD,KAAKuyB,QAAQmhC,EAAOD,QAAU,oBAAsB,uBAG5DzzD,KAAK8zD,WAAa,SAASL,GACvB,OAAOA,EAAUzzD,KAAKowD,cAAgBpwD,KAAKqwD,cAG/CrwD,KAAK+zD,UAAY,SAAS51B,GACtB,IAAKn+B,KAAKg0D,iBAAkB,CACxB,IAAID,EAAY,IAAI3L,EAAgB,KAAM,oBAAqB,QAC/DpoD,KAAKg0D,iBAAmBh0D,KAAK2zD,iBAAiBI,GAElD/zD,KAAKg0D,iBAAiB1L,UAAUnqB,IAEpCn+B,KAAKi0D,eAAiB,SAAS1oB,EAAUE,EAAQ4c,EAAOoL,GAC/B,iBAAVhoB,IACP4c,EAAQ5c,EACRA,EAASF,GAER8c,IACDA,EAAQ,YAEZ,IAAI3/B,EAAQ,IAAI4iB,EAAMC,EAAU,EAAGE,EAAQ2U,KAE3C,OADA13B,EAAM7lB,GAAK7C,KAAK01B,UAAUhN,EAAO2/B,EAAO,WAAYoL,GAC7C/qC,GAEX1oB,KAAKk0D,eAAiB,SAASC,GAC3Bn0D,KAAK+xB,aAAeoiC,EACpBn0D,KAAKuyB,QAAQ,mBAAoB,KAErCvyB,KAAKo0D,eAAiB,WAClB,OAAOp0D,KAAK+xB,cAAgB,IAEhC/xB,KAAKq0D,iBAAmB,WACpBr0D,KAAKk0D,eAAe,KAExBl0D,KAAKklD,eAAiB,SAAShhC,GAC3B,IAAIxgB,EAAQwgB,EAAKxgB,MAAM,gBAEnB1D,KAAKmlD,aADLzhD,EACoBA,EAAM,GAEN,MAG5B1D,KAAKmvB,aAAe,SAAS1C,EAAKE,GAC9B,IAAI+a,EAAO1nC,KAAKkhC,QAAQzU,GAEpB6nC,GAAU,EAOd,GANI3nC,EAAS,IACT2nC,IAAY5sB,EAAKrlC,OAAOsqB,EAAS,GAAGjpB,MAAM1D,KAAK0xC,UAE9C4iB,IACDA,IAAY5sB,EAAKrlC,OAAOsqB,GAAQjpB,MAAM1D,KAAK0xC,UAE3C4iB,EACA,IAAIn2B,EAAKn+B,KAAK0xC,aACb,GAAI,QAAQjuC,KAAKikC,EAAKnlC,MAAMoqB,EAAO,EAAGA,EAAO,IAC1CwR,EAAK,UAELA,EAAKn+B,KAAKyxC,WAElB,IAAI3qC,EAAQ6lB,EACZ,GAAI7lB,EAAQ,EAAG,CACX,GACIA,UAEGA,GAAS,GAAK4gC,EAAKrlC,OAAOyE,GAAOpD,MAAMy6B,IAC9Cr3B,IAGJ,IAAI+jB,EAAM8B,EACV,MAAO9B,EAAM6c,EAAKlnC,QAAUknC,EAAKrlC,OAAOwoB,GAAKnnB,MAAMy6B,GAC/CtT,IAGJ,OAAO,IAAIygB,EAAM7e,EAAK3lB,EAAO2lB,EAAK5B,IAEtC7qB,KAAKgwC,cAAgB,SAASvjB,EAAKE,GAC/B,IAAI4nC,EAAYv0D,KAAKmvB,aAAa1C,EAAKE,GACnC+a,EAAO1nC,KAAKkhC,QAAQqzB,EAAU1pC,IAAI4B,KAEtC,MAAOib,EAAKrlC,OAAOkyD,EAAU1pC,IAAI8B,QAAQjpB,MAAM,SAC3C6wD,EAAU1pC,IAAI8B,QAAU,EAE5B,OAAO4nC,GAEXv0D,KAAKqlD,eAAiB,SAASC,GAC3BtlD,KAAK+M,IAAIs4C,eAAeC,IAE5BtlD,KAAKulD,eAAiB,WAClB,OAAOvlD,KAAK+M,IAAIw4C,kBAEpBvlD,KAAKw0D,aAAe,SAASC,GAAaz0D,KAAK+6B,UAAU,YAAa05B,IACtEz0D,KAAK00D,aAAe,WAAa,OAAO10D,KAAK20D,YAC7C30D,KAAK40D,kBAAoB,SAASx4C,GAC9B,IAAI+1B,EAAO/1B,EAAE6E,KACbjhB,KAAK2wD,YAAY7pD,MAAMqrC,EAAK6V,OAC5BhoD,KAAKuyB,QAAQ,kBAAmBnW,IAGpCpc,KAAKkiD,OAAS,GACdliD,KAAKi8C,MAAQ,KACbj8C,KAAK60D,QAAU,KACf70D,KAAK0wD,QAAU,SAASrY,EAAMlyB,GAC1B,GAAIkyB,GAAwB,kBAATA,EAAmB,CAClC,GAAIA,EAAKsH,aACL,OAAO3/C,KAAK80D,cAAczc,GAC9B,IAAItc,EAAUsc,EACVjf,EAAO2C,EAAQ3C,UAEnBA,EAAOif,GAAQ,gBAKnB,GAHKr4C,KAAKkiD,OAAO,mBACbliD,KAAKkiD,OAAO,iBAAmB,IAAI8N,GAEnChwD,KAAKkiD,OAAO9oB,KAAU2C,EAGtB,OAFA/7B,KAAK80D,cAAc90D,KAAKkiD,OAAO9oB,SAC/BjT,GAAMA,KAGVnmB,KAAK60D,QAAUz7B,EACfwF,EAAOL,WAAW,CAAC,OAAQnF,GAAO,SAASuE,GACvC,GAAI39B,KAAK60D,UAAYz7B,EACjB,OAAOjT,GAAMA,IACbnmB,KAAKkiD,OAAO9oB,KAAU2C,EACtB/7B,KAAK80D,cAAc90D,KAAKkiD,OAAO9oB,IACxBuE,GAAKA,EAAE8hB,OACd9hB,EAAI,IAAIA,EAAE8hB,KAAK1jB,GACVA,IACD/7B,KAAKkiD,OAAO9oB,GAAQuE,EACpBA,EAAEwlB,IAAM/pB,GAEZp5B,KAAK80D,cAAcn3B,IAEvBxX,GAAMA,KACRhhB,KAAKnF,OACFA,KAAKi8C,OACNj8C,KAAK80D,cAAc90D,KAAKkiD,OAAO,kBAAkB,IAGzDliD,KAAK80D,cAAgB,SAASzc,EAAM0c,GAGhC,GAFKA,IACD/0D,KAAK60D,QAAUxc,EAAK8K,KACpBnjD,KAAKi8C,QAAU5D,EAAnB,CAGAr4C,KAAKi8C,MAAQ5D,EAEbr4C,KAAKg1D,cAEDh1D,KAAK20D,YACL30D,KAAKi1D,eAET,IAAI7N,EAAY/O,EAAKsH,eAErB,QAAkCv+C,IAA/BgmD,EAAUzrC,iBAAgC,CACzC,IAAIi5C,EAAoB50D,KAAK40D,kBAAkBzvD,KAAKnF,MACpDonD,EAAUzrC,iBAAiB,SAAUi5C,GAGzC,GAAK50D,KAAK2wD,YAON3wD,KAAK2wD,YAAY7I,aAAaV,OAPX,CACnBpnD,KAAK2wD,YAAc,IAAIxJ,EAAoBC,GAC3C,IAAI5jC,EAAQxjB,KACZA,KAAK2wD,YAAYh1C,iBAAiB,SAAU,SAASS,GACjDoH,EAAM+O,QAAQ,kBAAmBnW,KAMzCpc,KAAK2wD,YAAY5I,YAAY/nD,KAAKutC,eAElCvtC,KAAK0xC,QAAU2G,EAAK3G,QACpB1xC,KAAKyxC,WAAa4G,EAAK5G,WAGlBsjB,IACG1c,EAAK6c,iBACL7c,EAAK6c,gBAAgBl1D,MACzBA,KAAKk7B,SAASi6B,WAAWprD,IAAIvI,KAAKxB,KAAMA,KAAKo1D,aAC7Cp1D,KAAKyuD,YAAYpW,EAAKgd,cACtBr1D,KAAK2wD,YAAY7pD,MAAM,GACvB9G,KAAKupB,MAAM,iBAInBvpB,KAAKg1D,YAAc,WACXh1D,KAAKunD,UACLvnD,KAAKunD,QAAQ+N,YACbt1D,KAAKunD,QAAU,OAIvBvnD,KAAKi1D,aAAe,WAChB,IACIj1D,KAAKunD,QAAUvnD,KAAKi8C,MAAM+F,aAAahiD,MACzC,MAAOoc,GACLwiB,EAAOvD,KAAK,wBAAyBjf,GACrCpc,KAAKunD,QAAU,OAGvBvnD,KAAKu1D,QAAU,WACX,OAAOv1D,KAAKi8C,OAGhBj8C,KAAKw1D,WAAa,EAClBx1D,KAAKy1D,aAAe,SAASllD,GACrBvQ,KAAKw1D,aAAejlD,GAAamlD,MAAMnlD,KAG3CvQ,KAAKw1D,WAAajlD,EAClBvQ,KAAKuyB,QAAQ,kBAAmBhiB,KAEpCvQ,KAAK21D,aAAe,WAChB,OAAO31D,KAAKw1D,YAGhBx1D,KAAK41D,YAAc,EACnB51D,KAAK61D,cAAgB,SAASrlD,GACtBxQ,KAAK41D,cAAgBplD,GAAcklD,MAAMllD,KAG7CxQ,KAAK41D,YAAcplD,EACnBxQ,KAAKuyB,QAAQ,mBAAoB/hB,KAErCxQ,KAAK81D,cAAgB,WACjB,OAAO91D,KAAK41D,aAEhB51D,KAAK+1D,eAAiB,WAElB,OADA/1D,KAAKg2D,gBACDh2D,KAAKyyC,YACEvrC,KAAKC,IAAInH,KAAKi2D,wBAAyBj2D,KAAKk2D,aAChDl2D,KAAKk2D,aAGhBl2D,KAAKi2D,sBAAwB,WACzB,GAA6B,MAAzBj2D,KAAKm2D,iBAA0B,OAAOn2D,KAAKm2D,iBAC/C,IAAI7mD,EAAQ,EAKZ,OAJAtP,KAAKyyC,YAAYvqC,QAAQ,SAASkuD,GAC1BA,GAAKA,EAAEF,YAAc5mD,IACrBA,EAAQ8mD,EAAEF,eAEXl2D,KAAKq2D,gBAAkB/mD,GAGlCtP,KAAKg2D,cAAgB,SAASM,GAC1B,GAAIt2D,KAAK6sD,WAAayJ,EAAO,CAGzB,GAFAt2D,KAAK6sD,WAAY,EAEb7sD,KAAK+oC,aACL,OAAO/oC,KAAKk2D,YAAcl2D,KAAKu2D,WAUnC,IARA,IAAIjuB,EAAQtoC,KAAK+M,IAAIg4C,cACjByD,EAAQxoD,KAAKixD,gBACbuF,EAAoB,EACpBC,EAAY,EACZrmB,EAAWpwC,KAAK6rD,UAAU4K,GAC1BC,EAAYtmB,EAAWA,EAAStpC,MAAM2lB,IAAM2zB,IAC5Czb,EAAM2D,EAAM9nC,OAEPkB,EAAI,EAAGA,EAAIijC,EAAKjjC,IAAK,CAC1B,GAAIA,EAAIg1D,EAAW,CAEf,GADAh1D,EAAI0uC,EAASvlB,IAAI4B,IAAM,EACnB/qB,GAAKijC,EACL,MACJyL,EAAWpwC,KAAK6rD,UAAU4K,KAC1BC,EAAYtmB,EAAWA,EAAStpC,MAAM2lB,IAAM2zB,IAGhC,MAAZoI,EAAM9mD,KACN8mD,EAAM9mD,GAAK1B,KAAK22D,sBAAsBruB,EAAM5mC,IAAI,IAEhD8mD,EAAM9mD,GAAK80D,IACXA,EAAoBhO,EAAM9mD,IAElC1B,KAAKk2D,YAAcM,IAG3Bx2D,KAAKkhC,QAAU,SAASzU,GACpB,OAAOzsB,KAAK+M,IAAIm0B,QAAQzU,IAE5BzsB,KAAKylD,SAAW,SAAS9Y,EAAUC,GAC/B,OAAO5sC,KAAK+M,IAAI04C,SAAS9Y,EAAUC,IAEvC5sC,KAAKkyB,UAAY,WACb,OAAOlyB,KAAK+M,IAAImlB,aAEpBlyB,KAAK42B,aAAe,SAASlO,GACzB,OAAO1oB,KAAK+M,IAAI6pB,aAAalO,GAAS1oB,KAAK8lB,UAAU2C,aAEzDzoB,KAAKqH,OAAS,SAASsI,EAAUuU,GAC7B,OAAOlkB,KAAK+M,IAAI1F,OAAOsI,EAAUuU,IAErClkB,KAAKuH,OAAS,SAASmhB,GACnB,OAAO1oB,KAAK+M,IAAIxF,OAAOmhB,IAE3B1oB,KAAK8lD,gBAAkB,SAASnZ,EAAUC,GACtC,OAAO5sC,KAAK+M,IAAI+4C,gBAAgBnZ,EAAUC,IAE9C5sC,KAAK42D,YAAc,SAASpQ,EAAQqQ,GAChC,GAAKrQ,EAAOhmD,OAAZ,CAGAR,KAAKoxD,WAAY,EAEjB,IADA,IAAI0F,EAAgB,KACXp1D,EAAI8kD,EAAOhmD,OAAS,GAAS,GAANkB,EAASA,IAAK,CAC1C,IAAI2mC,EAAQme,EAAO9kD,GACA,OAAf2mC,EAAM2pB,OACNhyD,KAAK+M,IAAI05C,aAAape,EAAMme,QAC5BsQ,EACI92D,KAAK+2D,kBAAkB1uB,EAAMme,QAAQ,EAAMsQ,IAE/CzuB,EAAMme,OAAOt+C,QAAQ,SAAS8uD,GAC1Bh3D,KAAK8sD,SAASkK,EAAUlO,QACzB9oD,MAQX,OALAA,KAAKoxD,WAAY,EACjB0F,GACI92D,KAAKuwD,cACJsG,GACD72D,KAAK8lB,UAAUF,kBAAkBkxC,GAC9BA,IAEX92D,KAAKi3D,YAAc,SAASzQ,EAAQqQ,GAChC,GAAKrQ,EAAOhmD,OAAZ,CAGAR,KAAKoxD,WAAY,EAEjB,IADA,IAAI0F,EAAgB,KACXp1D,EAAI,EAAGA,EAAI8kD,EAAOhmD,OAAQkB,IAAK,CACpC,IAAI2mC,EAAQme,EAAO9kD,GACA,OAAf2mC,EAAM2pB,QACNhyD,KAAK+M,IAAIw5C,YAAYle,EAAMme,QAC3BsQ,EACI92D,KAAK+2D,kBAAkB1uB,EAAMme,QAAQ,EAAOsQ,IAQxD,OALA92D,KAAKoxD,WAAY,EACjB0F,GACI92D,KAAKuwD,cACJsG,GACD72D,KAAK8lB,UAAUF,kBAAkBkxC,GAC9BA,IAEX92D,KAAKk3D,cAAgB,SAASC,GAC1Bn3D,KAAKuwD,YAAc4G,GAGvBn3D,KAAK+2D,kBAAoB,SAASvQ,EAAQ4Q,EAAQN,GAC9C,SAASnQ,EAASte,GACd,OAAO+uB,EAA0B,WAAjB/uB,EAAMnD,OAAuC,WAAjBmD,EAAMnD,OAGtD,IACIxc,EAAOq7B,EADP1b,EAAQme,EAAO,GAGfG,EAASte,GACT3f,EAAQ4iB,EAAMuB,WAAWxE,EAAMvhC,MAAOuhC,EAAMxd,KAG5CnC,EAAQ4iB,EAAMuB,WAAWxE,EAAMvhC,MAAOuhC,EAAMvhC,OAIhD,IAAK,IAAIpF,EAAI,EAAGA,EAAI8kD,EAAOhmD,OAAQkB,IAC/B2mC,EAAQme,EAAO9kD,GACXilD,EAASte,IACT0b,EAAQ1b,EAAMvhC,OACiC,GAA3C4hB,EAAMkjB,QAAQmY,EAAMt3B,IAAKs3B,EAAMp3B,SAC/BjE,EAAMyjB,SAAS4X,GAEnBA,EAAQ1b,EAAMxd,IACgC,GAA1CnC,EAAMkjB,QAAQmY,EAAMt3B,IAAKs3B,EAAMp3B,SAC/BjE,EAAM0jB,OAAO2X,IAEG,IAEpBA,EAAQ1b,EAAMvhC,OACiC,GAA3C4hB,EAAMkjB,QAAQmY,EAAMt3B,IAAKs3B,EAAMp3B,UAC/BjE,EAAQ4iB,EAAMuB,WAAWxE,EAAMvhC,MAAOuhC,EAAMvhC,SAE5B,GAG5B,GAAqB,MAAjBgwD,EAAuB,CACuC,IAA1DxrB,EAAMH,cAAc2rB,EAAchwD,MAAO4hB,EAAM5hB,SAC/CgwD,EAAchwD,MAAM6lB,QAAUjE,EAAMmC,IAAI8B,OAASjE,EAAM5hB,MAAM6lB,OAC7DmqC,EAAcjsC,IAAI8B,QAAUjE,EAAMmC,IAAI8B,OAASjE,EAAM5hB,MAAM6lB,QAG/D,IAAID,EAAMoqC,EAAcjrB,aAAanjB,GAC1B,GAAPgE,EACAhE,EAAMyjB,SAAS2qB,EAAchwD,QACd,GAAR4lB,GACPhE,EAAM0jB,OAAO0qB,EAAcjsC,KAInC,OAAOnC,GAEX1oB,KAAK0C,QAAU,SAASgmB,EAAOxE,GAC3B,OAAOlkB,KAAK+M,IAAIrK,QAAQgmB,EAAOxE,IAEnClkB,KAAKu3B,SAAW,SAAS8/B,EAAWC,EAAYr1C,GAC5C,IAAIiC,EAAOlkB,KAAK42B,aAAaygC,GACzBvO,EAAQ9oD,KAAK2rD,gBAAgB0L,GAE7BE,EAAUjsB,EAAMuB,WAAWyqB,EAAYA,GAC3C,IAAKr1C,EAAM,CACPjiB,KAAKuH,OAAO8vD,GACZ,IAAIzc,EAAUyc,EAAUvwD,MAAM2lB,IAAM4qC,EAAUxsC,IAAI4B,IAC9C+qC,EAAW5c,GAAWyc,EAAUxsC,IAAI8B,OAAS0qC,EAAUvwD,MAAM6lB,OAAS0qC,EAAUxsC,IAAI8B,OACpF6qC,IACID,EAAQzwD,MAAM2lB,KAAO4qC,EAAUxsC,IAAI4B,KAAO8qC,EAAQzwD,MAAM6lB,OAAS0qC,EAAUxsC,IAAI8B,SAC/E4qC,EAAQzwD,MAAM6lB,QAAU6qC,GACxBD,EAAQ1sC,IAAI4B,KAAO4qC,EAAUxsC,IAAI4B,KAAO8qC,EAAQ1sC,IAAI8B,OAAS0qC,EAAUxsC,IAAI8B,SAC3E4qC,EAAQ1sC,IAAI8B,QAAU6qC,IAE1B5c,GAAW2c,EAAQzwD,MAAM2lB,KAAO4qC,EAAUxsC,IAAI4B,MAC9C8qC,EAAQzwD,MAAM2lB,KAAOmuB,EACrB2c,EAAQ1sC,IAAI4B,KAAOmuB,GAK3B,GADA2c,EAAQ1sC,IAAM7qB,KAAKqH,OAAOkwD,EAAQzwD,MAAOod,GACrC4kC,EAAMtoD,OAAQ,CACd,IAAIi3D,EAAWJ,EAAUvwD,MACrB4wD,EAAWH,EAAQzwD,MACnB8zC,EAAU8c,EAASjrC,IAAMgrC,EAAShrC,IAClC+qC,EAAWE,EAAS/qC,OAAS8qC,EAAS9qC,OAC1C3sB,KAAK8sD,SAAShE,EAAMtgD,IAAI,SAAS1E,GAQ7B,OAPAA,EAAIA,EAAEipC,QACFjpC,EAAEgD,MAAM2lB,KAAOgrC,EAAShrC,MACxB3oB,EAAEgD,MAAM6lB,QAAU6qC,GAClB1zD,EAAE+mB,IAAI4B,KAAOgrC,EAAShrC,MACtB3oB,EAAE+mB,IAAI8B,QAAU6qC,GACpB1zD,EAAEgD,MAAM2lB,KAAOmuB,EACf92C,EAAE+mB,IAAI4B,KAAOmuB,EACN92C,KAIf,OAAOyzD,GAEXv3D,KAAK23D,WAAa,SAASpsB,EAAUE,EAAQmsB,GACzCA,EAAeA,EAAal1D,QAAQ,MAAO1C,KAAK+7C,gBAChD,IAAK,IAAItvB,EAAI8e,EAAU9e,GAAKgf,EAAQhf,IAChCzsB,KAAK+M,IAAI8zC,aAAa,CAACp0B,IAAKA,EAAKE,OAAQ,GAAIirC,IAErD53D,KAAK63D,YAAc,SAAUnvC,GAKzB,IAJA,IAAIovC,EAAWpvC,EAAMskB,eACjB+qB,EAAc,IAAIzsB,EAAM,EAAG,EAAG,EAAG,GACjCnC,EAAOnpC,KAAK2wC,aAEPjvC,EAAIo2D,EAAShxD,MAAM2lB,IAAK/qB,GAAKo2D,EAASjtC,IAAI4B,MAAO/qB,EAAG,CACzD,IAAIgmC,EAAO1nC,KAAKkhC,QAAQx/B,GAExBq2D,EAAYjxD,MAAM2lB,IAAM/qB,EACxBq2D,EAAYltC,IAAI4B,IAAM/qB,EACtB,IAAK,IAAI87B,EAAI,EAAGA,EAAI2L,IAAQ3L,EACxB,GAAsB,KAAlBkK,EAAKrlC,OAAOm7B,GACZ,MACJA,EAAI2L,GAA0B,MAAlBzB,EAAKrlC,OAAOm7B,IACxBu6B,EAAYjxD,MAAM6lB,OAAS6Q,EAC3Bu6B,EAAYltC,IAAI8B,OAAS6Q,EAAI,IAE7Bu6B,EAAYjxD,MAAM6lB,OAAS,EAC3BorC,EAAYltC,IAAI8B,OAAS6Q,GAE7Bx9B,KAAKuH,OAAOwwD,KAIpB/3D,KAAKg4D,WAAa,SAASrrB,EAAUC,EAASlK,GAG1C,GAFAiK,EAAW3sC,KAAKwtD,gBAAgB7gB,GAChCC,EAAU5sC,KAAKutD,cAAc3gB,GACzBlK,EAAM,EAAG,CACT,IAAIjW,EAAMzsB,KAAKwtD,gBAAgB7gB,EAAWjK,GAC1C,GAAIjW,EAAM,EAAG,OAAO,EACpB,IAAIwrC,EAAOxrC,EAAIkgB,OACZ,GAAIjK,EAAM,EAAG,CACZjW,EAAMzsB,KAAKutD,cAAc3gB,EAAUlK,GACvC,GAAIjW,EAAMzsB,KAAK+M,IAAImlB,YAAY,EAAG,OAAO,EACrC+lC,EAAOxrC,EAAImgB,MACZ,CACHD,EAAW3sC,KAAKk4D,mBAAmBvrB,GACnCC,EAAU5sC,KAAKk4D,mBAAmBtrB,GAC9BqrB,EAAOrrB,EAAUD,EAAW,EAGpC,IAAIjkB,EAAQ,IAAI4iB,EAAMqB,EAAU,EAAGC,EAASurB,OAAOC,WAC/CtP,EAAQ9oD,KAAK2rD,gBAAgBjjC,GAAOlgB,IAAI,SAAS1E,GAIjD,OAHAA,EAAIA,EAAEipC,QACNjpC,EAAEgD,MAAM2lB,KAAOwrC,EACfn0D,EAAE+mB,IAAI4B,KAAOwrC,EACNn0D,IAGPwkC,EAAe,GAAP5F,EACN1iC,KAAK+M,IAAI04C,SAAS9Y,EAAUC,GAC5B5sC,KAAK+M,IAAI+4C,gBAAgBnZ,EAAUC,GAGzC,OAFA5sC,KAAK+M,IAAI64C,gBAAgBjZ,EAASsrB,EAAM3vB,GACxCwgB,EAAMtoD,QAAUR,KAAK8sD,SAAShE,GACvBmP,GAEXj4D,KAAKq4D,YAAc,SAAS1rB,EAAUC,GAClC,OAAO5sC,KAAKg4D,WAAWrrB,EAAUC,GAAU,IAE/C5sC,KAAKs4D,cAAgB,SAAS3rB,EAAUC,GACpC,OAAO5sC,KAAKg4D,WAAWrrB,EAAUC,EAAS,IAE9C5sC,KAAKu4D,eAAiB,SAAS5rB,EAAUC,GACrC,OAAO5sC,KAAKg4D,WAAWrrB,EAAUC,EAAS,IAI9C5sC,KAAKk4D,mBAAqB,SAASzrC,GAC/B,OAAOvlB,KAAKC,IAAI,EAAGD,KAAKM,IAAIilB,EAAKzsB,KAAK+M,IAAImlB,YAAY,KAG1DlyB,KAAKw4D,iBAAmB,SAAS/rC,EAAKE,GAClC,OAAIA,EAAS,EACF,EACJzlB,KAAKM,IAAIxH,KAAK+M,IAAIm0B,QAAQzU,GAAKjsB,OAAQmsB,IAIlD3sB,KAAKskD,wBAA0B,SAAS73B,EAAKE,GAGzC,GAFAA,EAASzlB,KAAKC,IAAI,EAAGwlB,GAEjBF,EAAM,EACNA,EAAM,EACNE,EAAS,MACN,CACH,IAAIgY,EAAM3kC,KAAK+M,IAAImlB,YACfzF,GAAOkY,GACPlY,EAAMkY,EAAM,EACZhY,EAAS3sB,KAAK+M,IAAIm0B,QAAQyD,EAAI,GAAGnkC,QAEjCmsB,EAASzlB,KAAKM,IAAIxH,KAAK+M,IAAIm0B,QAAQzU,GAAKjsB,OAAQmsB,GAIxD,MAAO,CACHF,IAAKA,EACLE,OAAQA,IAIhB3sB,KAAKusD,qBAAuB,SAAS7jC,GAC7BA,EAAM5hB,MAAM2lB,IAAM,GAClB/D,EAAM5hB,MAAM2lB,IAAM,EAClB/D,EAAM5hB,MAAM6lB,OAAS,GAErBjE,EAAM5hB,MAAM6lB,OAAS3sB,KAAKw4D,iBACtB9vC,EAAM5hB,MAAM2lB,IACZ/D,EAAM5hB,MAAM6lB,QAIpB,IAAIgY,EAAM3kC,KAAK+M,IAAImlB,YAAc,EAUjC,OATIxJ,EAAMmC,IAAI4B,IAAMkY,GAChBjc,EAAMmC,IAAI4B,IAAMkY,EAChBjc,EAAMmC,IAAI8B,OAAS3sB,KAAK+M,IAAIm0B,QAAQyD,GAAKnkC,QAEzCkoB,EAAMmC,IAAI8B,OAAS3sB,KAAKw4D,iBACpB9vC,EAAMmC,IAAI4B,IACV/D,EAAMmC,IAAI8B,QAGXjE,GAEX1oB,KAAKu2D,WAAa,GAClBv2D,KAAK+oC,cAAe,EACpB/oC,KAAKy4D,gBAAkB,CACnBjxD,IAAM,KACNL,IAAM,MAEVnH,KAAK04D,eAAiB,SAASC,GAC3B,GAAIA,GAAe34D,KAAK+oC,aAAc,CAIlC,GAHA/oC,KAAK+oC,aAAe4vB,EACpB34D,KAAK6sD,WAAY,EACjB7sD,KAAK6wD,eAAe,GAChB8H,EAAa,CACb,IAAIh0B,EAAM3kC,KAAKkyB,YACflyB,KAAKipC,UAAYxkC,MAAMkgC,GACvB3kC,KAAK2sD,gBAAgB,EAAGhoB,EAAM,GAGlC3kC,KAAKuyB,QAAQ,oBAGrBvyB,KAAK44D,eAAiB,WAClB,OAAO54D,KAAK+oC,cAEhB/oC,KAAK64D,kBAAoB,SAASrxD,EAAKL,GAC/BnH,KAAKy4D,gBAAgBjxD,MAAQA,GAAOxH,KAAKy4D,gBAAgBtxD,MAAQA,IACjEnH,KAAKy4D,gBAAkB,CAAEjxD,IAAKA,EAAKL,IAAKA,GACxCnH,KAAK6sD,WAAY,EACjB7sD,KAAKsyC,aAAa/I,cACdvpC,KAAK+oC,cACL/oC,KAAKuyB,QAAQ,oBAGzBvyB,KAAK84D,gBAAkB,SAASC,EAAcC,GAC1C,IAAIC,EAASj5D,KAAKy4D,gBACdQ,EAAO9xD,IAAM,IACb8xD,EAAS,CAACzxD,IAAKwxD,EAAc7xD,IAAK6xD,IACtC,IAAIE,EAAYl5D,KAAKm5D,oBAAoBJ,EAAcE,EAAOzxD,IAAKyxD,EAAO9xD,KAC1E,OAAI+xD,GAAal5D,KAAKu2D,YAAc2C,EAAY,IAC5Cl5D,KAAKu2D,WAAa2C,EAClBl5D,KAAK6sD,WAAY,EACb7sD,KAAK+oC,eACL/oC,KAAK2sD,gBAAgB,EAAG3sD,KAAKkyB,YAAc,GAC3ClyB,KAAK6wD,eAAe,GACpB7wD,KAAKuyB,QAAQ,qBAEV,IAKfvyB,KAAKm5D,oBAAsB,SAASD,EAAW1xD,EAAKL,GAOhD,OANIK,IACA0xD,EAAYhyD,KAAKC,IAAIK,EAAK0xD,IAE1B/xD,IACA+xD,EAAYhyD,KAAKM,IAAIL,EAAK+xD,IAEvBA,GAEXl5D,KAAKo5D,aAAe,WAChB,OAAOp5D,KAAKu2D,YAEhBv2D,KAAKq5D,aAAe,SAAUC,GAC1Bt5D,KAAK64D,kBAAkBS,EAAOA,IAElCt5D,KAAKu5D,kBAAoB,WACrB,MAAO,CACH/xD,IAAMxH,KAAKy4D,gBAAgBjxD,IAC3BL,IAAMnH,KAAKy4D,gBAAgBtxD,MAInCnH,KAAKmxD,4BAA8B,SAAS9oB,GACxC,IAAIswB,EAAc34D,KAAK+oC,aACnB7D,EAASmD,EAAMnD,OACfp+B,EAAQuhC,EAAMvhC,MACd+jB,EAAMwd,EAAMxd,IACZ8hB,EAAW7lC,EAAM2lB,IACjBmgB,EAAU/hB,EAAI4B,IACdkY,EAAMiI,EAAUD,EAChBukB,EAAe,KAGnB,GADAlxD,KAAK+sD,WAAY,EACN,GAAPpoB,EACA,GAAe,WAAXO,EAAqB,CACrBllC,KAAK24D,EAAc,YAAc,mBAAmBlyD,OAAOkmC,EAAUhI,GAErE,IAAIinB,EAAY5rD,KAAK6rD,UACrBqF,EAAelxD,KAAK2rD,gBAAgBtjB,GACpCroC,KAAK0sD,YAAYwE,GAEjB,IAAI9gB,EAAWpwC,KAAKqwC,YAAYxlB,EAAI4B,KAChCw9B,EAAM,EACV,GAAI7Z,EAAU,CACVA,EAASuZ,eAAe9+B,EAAI4B,IAAK5B,EAAI8B,OAAQ7lB,EAAM6lB,OAAS9B,EAAI8B,QAChEyjB,EAAS4Y,UAAUrkB,GAEnB,IAAI60B,EAAiBx5D,KAAKqwC,YAAY1D,GAClC6sB,GAAkBA,IAAmBppB,IACrCopB,EAAevjB,MAAM7F,GACrBA,EAAWopB,GAEfvP,EAAM2B,EAAU1pD,QAAQkuC,GAAY,EAGxC,IAAK6Z,EAAKA,EAAM2B,EAAUprD,OAAQypD,IAAO,CACjC7Z,EAAWwb,EAAU3B,GACrB7Z,EAAStpC,MAAM2lB,KAAO5B,EAAI4B,KAC1B2jB,EAAS4Y,UAAUrkB,GAI3BiI,EAAUD,MACP,CACH,IAAIpnC,EAAOd,MAAMkgC,GACjBp/B,EAAK2wC,QAAQvJ,EAAU,GACvB,IAAItqB,EAAMs2C,EAAc34D,KAAKipC,UAAYjpC,KAAKixD,gBAC9C5uC,EAAI5b,OAAO7F,MAAMyhB,EAAK9c,GAClBqmD,EAAY5rD,KAAK6rD,UACjBzb,EAAWpwC,KAAKqwC,YAAY1D,GAC5Bsd,EAAM,EACV,GAAI7Z,EAAU,CACV,IAAI1jB,EAAM0jB,EAAS1nB,MAAM+jB,cAAc3lC,EAAM2lB,IAAK3lB,EAAM6lB,QAC7C,GAAPD,GACA0jB,EAAWA,EAAShuC,MAAM0E,EAAM2lB,IAAK3lB,EAAM6lB,QACvCyjB,IACAA,EAAS4Y,SAASrkB,GAClByL,EAASuZ,eAAe/c,EAAS,EAAG/hB,EAAI8B,OAAS7lB,EAAM6lB,WAGnD,GAARD,IACA0jB,EAASuZ,eAAehd,EAAU,EAAG9hB,EAAI8B,OAAS7lB,EAAM6lB,QACxDyjB,EAAS4Y,SAASrkB,IAEtBslB,EAAM2B,EAAU1pD,QAAQkuC,GAAY,EAGxC,IAAK6Z,EAAKA,EAAM2B,EAAUprD,OAAQypD,IAAO,CACjC7Z,EAAWwb,EAAU3B,GACrB7Z,EAAStpC,MAAM2lB,KAAOkgB,GACtByD,EAAS4Y,SAASrkB,QAI3B,CACHA,EAAMz9B,KAAKgC,IAAIm/B,EAAMvhC,MAAM6lB,OAAS0b,EAAMxd,IAAI8B,QAC/B,WAAXuY,IACAgsB,EAAelxD,KAAK2rD,gBAAgBtjB,GACpCroC,KAAK0sD,YAAYwE,GAEjBvsB,GAAOA,GAEPyL,EAAWpwC,KAAKqwC,YAAY1D,GAC5ByD,GACAA,EAASuZ,eAAehd,EAAU7lC,EAAM6lB,OAAQgY,GAcxD,OAVIg0B,GAAe34D,KAAKipC,UAAUzoC,QAAUR,KAAK+M,IAAImlB,aACjDrxB,QAAQC,MAAM,6DAElBd,KAAK+sD,WAAY,EAEb4L,EACA34D,KAAK2sD,gBAAgBhgB,EAAUC,GAE/B5sC,KAAK4sD,sBAAsBjgB,EAAUC,GAElCskB,GAGXlxD,KAAK4sD,sBAAwB,SAASjgB,EAAUC,EAASuc,GACrDnpD,KAAKixD,gBAAgBtkB,GAAY,KACjC3sC,KAAKixD,gBAAgBrkB,GAAW,MAGpC5sC,KAAK2sD,gBAAkB,SAAShgB,EAAUC,GACtC,IAIIuI,EACA/E,EALA9H,EAAQtoC,KAAK+M,IAAIg4C,cACjBtU,EAAUzwC,KAAK2wC,aACf8oB,EAAWz5D,KAAKipC,UAChBiwB,EAAYl5D,KAAKu2D,WAIjB9pC,EAAMkgB,EACVC,EAAU1lC,KAAKM,IAAIolC,EAAStE,EAAM9nC,OAAS,GAC3C,MAAOisB,GAAOmgB,EACVwD,EAAWpwC,KAAKqwC,YAAY5jB,EAAK2jB,GAC5BA,GAKD+E,EAAS,GACT/E,EAASiZ,KAAK,SAASG,EAAa/8B,EAAKE,EAAQghC,GACzC,IAAI+L,EACJ,GAAmB,MAAflQ,EAAqB,CACrBkQ,EAAa15D,KAAK25D,kBACFnQ,EAAarU,EAAO30C,QACpCk5D,EAAW,GAAKE,EAChB,IAAK,IAAIl4D,EAAI,EAAGA,EAAIg4D,EAAWl5D,OAAQkB,IACnCg4D,EAAWh4D,GAAKm4D,OAGpBH,EAAa15D,KAAK25D,kBACdrxB,EAAM7b,GAAK/F,UAAUinC,EAAYhhC,GACjCwoB,EAAO30C,QAEf20C,EAASA,EAAOzvC,OAAOg0D,IACzBv0D,KAAKnF,MACPowC,EAASvlB,IAAI4B,IACb6b,EAAM8H,EAASvlB,IAAI4B,KAAKjsB,OAAS,GAGrCi5D,EAASrpB,EAAStpC,MAAM2lB,KAAOzsB,KAAK85D,mBAAmB3kB,EAAQ+jB,EAAWzoB,GAC1EhkB,EAAM2jB,EAASvlB,IAAI4B,IAAM,IA1BzB0oB,EAASn1C,KAAK25D,kBAAkBrxB,EAAM7b,IACtCgtC,EAAShtC,GAAOzsB,KAAK85D,mBAAmB3kB,EAAQ+jB,EAAWzoB,GAC3DhkB,MA4BZ,IAAIstC,EAAO,EACPC,EAAW,EACXJ,EAAoB,EACpBC,EAAoB,EACpBI,EAAc,EACdC,EAAQ,GACRC,EAAM,GACNC,EAAY,GAodhB,SAAShxB,EAAYxgB,GACjB,QAAIA,EAAI,QAEDA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OAnf/B5oB,KAAK85D,mBAAqB,SAAS3kB,EAAQ+jB,EAAWzoB,GAClD,GAAqB,GAAjB0E,EAAO30C,OACP,MAAO,GAGX,IAAIwoC,EAAS,GACTqxB,EAAgBllB,EAAO30C,OACvB85D,EAAY,EAAGC,EAAe,EAE9BC,EAASx6D,KAAKy6D,YAEdC,EAAmB16D,KAAK26D,kBACxBC,EAAY1B,GAAahyD,KAAKC,IAAI,EAAIspC,EAAS,KACvB,IAArBiqB,EAA6B,EAAIxzD,KAAKyF,MAAMusD,EAAY,GAE/D,SAAS2B,IACL,IAAIC,EAAc,EAClB,GAAkB,IAAdF,EACA,OAAOE,EACX,GAAIJ,EACA,IAAK,IAAIh5D,EAAI,EAAGA,EAAIyzC,EAAO30C,OAAQkB,IAAK,CACpC,IAAI6yC,EAAQY,EAAOzzC,GACnB,GAAI6yC,GAAS2lB,EACTY,GAAe,MACd,IAAIvmB,GAAS4lB,EAEb,IAAI5lB,GAAS6lB,EACd,SAEA,MAJAU,GAAerqB,GAS3B,OAFI+pB,IAA+B,IAArBE,IACVI,GAAerqB,GACZvpC,KAAKM,IAAIszD,EAAaF,GAEjC,SAASG,EAAS1oB,GACd,IAAI2oB,EAAY7lB,EAAO5yC,MAAM+3D,EAAWjoB,GACpC1N,EAAMq2B,EAAUx6D,OACpBw6D,EAAUx4D,KAAK,IACVE,QAAQ,MAAO,WACZiiC,GAAO,IAEVjiC,QAAQ,KAAM,WACXiiC,GAAO,IAGVqE,EAAOxoC,SACR0oC,EAAS2xB,IACT7xB,EAAOE,OAASA,GAEpBqxB,GAAgB51B,EAChBqE,EAAOlnC,KAAKy4D,GACZD,EAAYjoB,EAEhB,IAAInJ,EAAS,EACb,MAAOmxB,EAAgBC,EAAYpB,EAAYhwB,EAAQ,CACnD,IAAI9mC,EAAQk4D,EAAYpB,EAAYhwB,EACpC,GAAIiM,EAAO/yC,EAAQ,IAAM83D,GAAS/kB,EAAO/yC,IAAU83D,EAC/Ca,EAAS34D,QAGb,GAAI+yC,EAAO/yC,IAAUw3D,GAAqBzkB,EAAO/yC,IAAUy3D,EAA3D,CAsBA,IAAIoB,EAAW/zD,KAAKC,IAAI/E,GAAS82D,GAAYA,GAAW,IAAKoB,EAAY,GACzE,MAAOl4D,EAAQ64D,GAAY9lB,EAAO/yC,GAASw3D,EACvCx3D,IAEJ,GAAIo4D,EAAQ,CACR,MAAOp4D,EAAQ64D,GAAY9lB,EAAO/yC,GAASw3D,EACvCx3D,IAEJ,MAAOA,EAAQ64D,GAAY9lB,EAAO/yC,IAAU63D,EACxC73D,SAGJ,MAAOA,EAAQ64D,GAAY9lB,EAAO/yC,GAAS83D,EACvC93D,IAGJA,EAAQ64D,EACRF,IAAW34D,IAGfA,EAAQk4D,EAAYpB,EAChB/jB,EAAO/yC,IAAU43D,GACjB53D,IACJ24D,EAAS34D,EAAQ8mC,QA7CjB,CACI,IAAK9mC,EAAOA,GAASk4D,EAAY,EAAGl4D,IAChC,GAAI+yC,EAAO/yC,IAAUw3D,EACjB,MAGR,GAAIx3D,EAAQk4D,EAAW,CACnBS,EAAS34D,GACT,SAGJ,IADAA,EAAQk4D,EAAYpB,EACf92D,EAAOA,EAAQ+yC,EAAO30C,OAAQ4B,IAC/B,GAAI+yC,EAAO/yC,IAAUy3D,EACjB,MAGR,GAAIz3D,GAAS+yC,EAAO30C,OAChB,MAEJu6D,EAAS34D,IA4BjB,OAAO4mC,GAEXhpC,KAAK25D,kBAAoB,SAASj1D,EAAKoe,GACnC,IACI2tB,EADApuB,EAAM,GAEVS,EAASA,GAAU,EAEnB,IAAK,IAAIphB,EAAI,EAAGA,EAAIgD,EAAIlE,OAAQkB,IAAK,CACjC,IAAIknB,EAAIlkB,EAAI0hC,WAAW1kC,GACvB,GAAS,GAALknB,EAAQ,CACR6nB,EAAUzwC,KAAKqpC,iBAAiBhnB,EAAI7hB,OAASsiB,GAC7CT,EAAIvgB,KAAKq4D,GACT,IAAK,IAAIztD,EAAI,EAAGA,EAAI+jC,EAAS/jC,IACzB2V,EAAIvgB,KAAKs4D,QAGH,IAALxxC,EACLvG,EAAIvgB,KAAKo4D,GACFtxC,EAAI,IAAMA,EAAI,IAAQA,EAAI,IAAMA,EAAI,GAC3CvG,EAAIvgB,KAAKm4D,GAEJrxC,GAAK,MAAUwgB,EAAYxgB,GAChCvG,EAAIvgB,KAAKi4D,EAAMC,GAEf33C,EAAIvgB,KAAKi4D,GAGjB,OAAO13C,GAEXriB,KAAK22D,sBAAwB,SAASjyD,EAAKw2D,EAAiBC,GACxD,GAAuB,GAAnBD,EACA,MAAO,CAAC,EAAG,GAKf,IAAItyC,EAAG+D,EACP,IALuB,MAAnBuuC,IACAA,EAAkB9a,KACtB+a,EAAeA,GAAgB,EAG1BxuC,EAAS,EAAGA,EAASjoB,EAAIlE,OAAQmsB,IAUlC,GATA/D,EAAIlkB,EAAI0hC,WAAWzZ,GACV,GAAL/D,EACAuyC,GAAgBn7D,KAAKqpC,iBAAiB8xB,GAEjCvyC,GAAK,MAAUwgB,EAAYxgB,GAChCuyC,GAAgB,EAEhBA,GAAgB,EAEhBA,EAAeD,EACf,MAIR,MAAO,CAACC,EAAcxuC,IAG1B3sB,KAAKyyC,YAAc,KACnBzyC,KAAKo7D,aAAe,SAAS3uC,GACzB,GAAIzsB,KAAKyyC,YACL,IAAI1Q,EAAI/hC,KAAKyyC,YAAYhmB,IAAQzsB,KAAKyyC,YAAYhmB,GAAKysB,UAAY,OAEnEnX,EAAI,EACR,OAAK/hC,KAAK+oC,cAAiB/oC,KAAKipC,UAAUxc,GAG/BzsB,KAAKipC,UAAUxc,GAAKjsB,OAAS,EAAIuhC,EAFjC,EAAIA,GAKnB/hC,KAAKq7D,gBAAkB,SAAS5uC,GAC5B,OAAKzsB,KAAK+oC,cAAiB/oC,KAAKipC,UAAUxc,GAG/BzsB,KAAKipC,UAAUxc,GAAKjsB,OAAS,EAF7B,GAMfR,KAAKs7D,iBAAmB,SAASnpC,GAC7B,GAAInyB,KAAK+oC,aAAc,CACnB,IAAI/hC,EAAMhH,KAAK8wC,yBAAyB3e,EAAWgmC,OAAOC,WACtDpvB,EAAShpC,KAAKipC,UAAUjiC,EAAIylB,KAChC,OAAOuc,EAAOxoC,QAAUwoC,EAAO,GAAKhiC,EAAI2lB,OAASqc,EAAOE,OAAS,EAEjE,OAAO,GAGflpC,KAAKu7D,uBAAyB,SAASppC,GACnC,IAAInrB,EAAMhH,KAAK8wC,yBAAyB3e,EAAWgmC,OAAOC,WAC1D,OAAOp4D,KAAKw7D,uBAAuBx0D,EAAIylB,IAAKzlB,EAAI2lB,SAEpD3sB,KAAKy7D,yBAA2B,SAASzzB,EAAQ0zB,GAC7C,IAAIvpC,EAAYnyB,KAAKsyB,oBAAoB0V,EAAQ0zB,GACjD,OAAO17D,KAAKu7D,uBAAuBppC,IAEvCnyB,KAAKoxC,iCAAmC,SAASpJ,EAAQ0zB,GACrD,IAAIvpC,EAAYnyB,KAAKsyB,oBAAoB0V,EAAQ0zB,GACjD,OAAO17D,KAAK8wC,yBAAyB3e,EAAWgmC,OAAOC,UAAY,KAEvEp4D,KAAK27D,gBAAkB,SAASlvC,GAC5B,OAAKzsB,KAAK+oC,aAGC/oC,KAAKipC,UAAUxc,QAFtB,GAKRzsB,KAAKqpC,iBAAmB,SAAS8xB,GAC7B,OAAOn7D,KAAKyyD,SAAW0I,EAAen7D,KAAKyyD,UAI/CzyD,KAAK47D,oBAAsB,SAASzpC,EAAWgpC,GAC3C,OAAOn7D,KAAK8wC,yBAAyB3e,EAAWgpC,GAAc1uC,KAIlEzsB,KAAK67D,uBAAyB,SAAS1pC,EAAWgpC,GAC9C,OAAOn7D,KAAK8wC,yBAAyB3e,EAAWgpC,GAAcxuC,QAElE3sB,KAAK8wC,yBAA2B,SAAS3e,EAAWgpC,EAAc/oB,GAC9D,GAAIjgB,EAAY,EACZ,MAAO,CAAC1F,IAAK,EAAGE,OAAQ,GAE5B,IAAI+a,EAGA/a,EAFAqb,EAAS,EACT0zB,EAAY,EAEZjvC,EAAM,EACNqvC,EAAY,EAEZtzB,EAAWxoC,KAAKyoC,gBAChB/mC,EAAI1B,KAAK0oC,kBAAkBF,EAAUrW,GACrCxwB,EAAI6mC,EAAShoC,OACjB,GAAImB,GAAKD,GAAK,EACV,CAAI+qB,EAAM+b,EAAS9mC,GACfsmC,EAAShoC,KAAK2oC,aAAajnC,GAD/B,IAEIq6D,EAAU5pC,EAAYqW,EAAS7mC,EAAI,QAEnCo6D,GAAWp6D,EAGnB,IAAIswB,EAASjyB,KAAKkyB,YAAc,EAC5Bke,EAAWpwC,KAAKmsD,gBAAgBnkB,GAChC0uB,EAAYtmB,EAAWA,EAAStpC,MAAM2lB,IAAM2zB,IAEhD,MAAO3zB,GAAO0F,EAAW,CAErB,GADA2pC,EAAY97D,KAAKo7D,aAAapzB,GAC1Bvb,EAAMqvC,EAAY3pC,GAAa6V,GAAU/V,EACzC,MAEAxF,GAAOqvC,EACP9zB,IACIA,EAAS0uB,IACT1uB,EAASoI,EAASvlB,IAAI4B,IAAI,EAC1B2jB,EAAWpwC,KAAKmsD,gBAAgBnkB,EAAQoI,GACxCsmB,EAAYtmB,EAAWA,EAAStpC,MAAM2lB,IAAM2zB,KAIhD2b,IACA/7D,KAAK2oC,aAAa7mC,KAAKkmC,GACvBhoC,KAAKyoC,gBAAgB3mC,KAAK2qB,IAIlC,GAAI2jB,GAAYA,EAAStpC,MAAM2lB,KAAOub,EAClCN,EAAO1nC,KAAKytD,mBAAmBrd,GAC/BpI,EAASoI,EAAStpC,MAAM2lB,QACrB,IAAIA,EAAMqvC,GAAa3pC,GAAa6V,EAAS/V,EAChD,MAAO,CACHxF,IAAKwF,EACLtF,OAAQ3sB,KAAKkhC,QAAQjP,GAAQzxB,QAGjCknC,EAAO1nC,KAAKkhC,QAAQ8G,GACpBoI,EAAW,KAEf,IAAIzI,EAAa,EAAGM,EAAa/gC,KAAKyF,MAAMwlB,EAAY1F,GACxD,GAAIzsB,KAAK+oC,aAAc,CACnB,IAAIC,EAAShpC,KAAKipC,UAAUjB,GACxBgB,IACArc,EAASqc,EAAOf,GACbA,EAAa,GAAKe,EAAOxoC,SACxBmnC,EAAaqB,EAAOE,OACpBwyB,EAAY1yB,EAAOf,EAAa,IAAMe,EAAOA,EAAOxoC,OAAS,GAC7DknC,EAAOA,EAAKhhB,UAAUg1C,KAYlC,YAPgBt6D,IAAZgxC,GAAyBpyC,KAAKsyC,aAAavK,UAAUtb,EAAMwb,EAAYD,EAAQC,KAC/EkzB,EAAen7D,KAAKsyC,aAAavH,YAAYqH,IAEjDspB,GAAa17D,KAAK22D,sBAAsBjvB,EAAMyzB,EAAexzB,GAAY,GACrE3nC,KAAK+oC,cAAgB2yB,GAAa/uC,IAClC+uC,EAAY/uC,EAAS,GAErByjB,EACOA,EAAS4Z,cAAc0R,GAE3B,CAACjvC,IAAKub,EAAQrb,OAAQ+uC,IAEjC17D,KAAKmtC,yBAA2B,SAASnF,EAAQ0zB,GAC7C,GAAyB,qBAAdA,EACP,IAAI10D,EAAMhH,KAAKskD,wBAAwBtc,EAAOvb,IAAKub,EAAOrb,aAE1D3lB,EAAMhH,KAAKskD,wBAAwBtc,EAAQ0zB,GAE/C1zB,EAAShhC,EAAIylB,IACbivC,EAAY10D,EAAI2lB,OAEhB,IAAIwF,EAAY,EACZ6pC,EAAe,KACft7B,EAAO,KACXA,EAAO1gC,KAAK2gC,UAAUqH,EAAQ0zB,EAAW,GACrCh7B,IACAsH,EAAStH,EAAK55B,MAAM2lB,IACpBivC,EAAYh7B,EAAK55B,MAAM6lB,QAG3B,IAAIujB,EAAQzjB,EAAM,EAGd+b,EAAWxoC,KAAK2oC,aAChBjnC,EAAI1B,KAAK0oC,kBAAkBF,EAAUR,GACrCrmC,EAAI6mC,EAAShoC,OACjB,GAAImB,GAAKD,GAAK,EACV,CAAI+qB,EAAM+b,EAAS9mC,GACfywB,EAAYnyB,KAAKyoC,gBAAgB/mC,GADrC,IAEIq6D,EAAU/zB,EAASQ,EAAS7mC,EAAI,QAEhCo6D,GAAWp6D,EAGnB,IAAIyuC,EAAWpwC,KAAKmsD,gBAAgB1/B,GAChCiqC,EAAYtmB,EAAUA,EAAStpC,MAAM2lB,IAAK2zB,IAE9C,MAAO3zB,EAAMub,EAAQ,CACjB,GAAIvb,GAAOiqC,EAAW,CAElB,GADAxmB,EAASE,EAASvlB,IAAI4B,IAAM,EACxByjB,EAASlI,EACT,MACJoI,EAAWpwC,KAAKmsD,gBAAgBjc,EAAQE,GACxCsmB,EAAYtmB,EAAUA,EAAStpC,MAAM2lB,IAAK2zB,SAG1ClQ,EAASzjB,EAAM,EAGnB0F,GAAanyB,KAAKo7D,aAAa3uC,GAC/BA,EAAMyjB,EAEF6rB,IACA/7D,KAAK2oC,aAAa7mC,KAAK2qB,GACvBzsB,KAAKyoC,gBAAgB3mC,KAAKqwB,IAGlC,IAAIu7B,EAAW,GACXtd,GAAY3jB,GAAOiqC,GACnBhJ,EAAW1tD,KAAKytD,mBAAmBrd,EAAUpI,EAAQ0zB,GACrDM,EAAe5rB,EAAStpC,MAAM2lB,MAE9BihC,EAAW1tD,KAAKkhC,QAAQ8G,GAAQthB,UAAU,EAAGg1C,GAC7CM,EAAeh0B,GAEnB,IAAIL,EAAa,EACjB,GAAI3nC,KAAK+oC,aAAc,CACnB,IAAIkzB,EAAUj8D,KAAKipC,UAAU+yB,GAC7B,GAAIC,EAAS,CACT,IAAIC,EAAkB,EACtB,MAAOxO,EAASltD,QAAUy7D,EAAQC,GAC9B/pC,IACA+pC,IAEJxO,EAAWA,EAAShnC,UAChBu1C,EAAQC,EAAkB,IAAM,EAAGxO,EAASltD,QAEhDmnC,EAAau0B,EAAkB,EAAID,EAAQ/yB,OAAS,GAI5D,MAAO,CACHzc,IAAK0F,EACLxF,OAAQgb,EAAa3nC,KAAK22D,sBAAsBjJ,GAAU,KAGlE1tD,KAAKw7D,uBAAyB,SAAS/uC,EAAKivC,GACxC,OAAO17D,KAAKmtC,yBAAyB1gB,EAAKivC,GAAW/uC,QAEzD3sB,KAAKsyB,oBAAsB,SAAS0V,EAAQ0zB,GACxC,OAAO17D,KAAKmtC,yBAAyBnF,EAAQ0zB,GAAWjvC,KAE5DzsB,KAAKm8D,gBAAkB,WACnB,IAAIC,EAAa,EACb17B,EAAO,KACX,GAAK1gC,KAAK+oC,aAOH,CACH,IAAI6D,EAAU5sC,KAAKipC,UAAUzoC,OACzBisB,EAAM,EAENiqC,GAFSh1D,EAAI,EACbg/B,EAAO1gC,KAAK6rD,UAAUnqD,KACVg/B,EAAOA,EAAK55B,MAAM2lB,IAAK2zB,KAEvC,MAAO3zB,EAAMmgB,EAAS,CAClB,IAAI5D,EAAShpC,KAAKipC,UAAUxc,GAC5B2vC,GAAcpzB,EAASA,EAAOxoC,OAAS,EAAI,EAC3CisB,IACIA,EAAMiqC,IACNjqC,EAAMiU,EAAK7V,IAAI4B,IAAI,EACnBiU,EAAO1gC,KAAK6rD,UAAUnqD,KACtBg1D,EAAYh2B,EAAMA,EAAK55B,MAAM2lB,IAAK2zB,UApBtB,CACpBgc,EAAap8D,KAAKkyB,YAElB,IADA,IAAI22B,EAAW7oD,KAAK6rD,UACXnqD,EAAI,EAAGA,EAAImnD,EAASroD,OAAQkB,IACjCg/B,EAAOmoB,EAASnnD,GAChB06D,GAAc17B,EAAK7V,IAAI4B,IAAMiU,EAAK55B,MAAM2lB,IAsBhD,OAHIzsB,KAAKyyC,cACL2pB,GAAcp8D,KAAKq8D,0BAEhBD,GAEXp8D,KAAKs8D,gBAAkB,SAASC,GACvBv8D,KAAKw8D,iBACVx8D,KAAK22D,sBAAwB,SAASjyD,EAAKw2D,EAAiBC,GACxD,GAAwB,IAApBD,EACA,MAAO,CAAC,EAAG,GAKf,IAAItyC,EAAG+D,EACP,IALKuuC,IACDA,EAAkB9a,KACtB+a,EAAeA,GAAgB,EAG1BxuC,EAAS,EAAGA,EAASjoB,EAAIlE,OAAQmsB,IAOlC,GANA/D,EAAIlkB,EAAIrC,OAAOsqB,GAEXwuC,GADM,OAANvyC,EACgB5oB,KAAKqpC,iBAAiB8xB,GAEtBoB,EAAGE,kBAAkB7zC,GAErCuyC,EAAeD,EACf,MAIR,MAAO,CAACC,EAAcxuC,MAI9B3sB,KAAKoxB,QAAU,WACPpxB,KAAK2wD,cACL3wD,KAAK2wD,YAAY5I,YAAY,MAC7B/nD,KAAK2wD,YAAc,MAEvB3wD,KAAKg1D,eAGTh1D,KAAKopC,YAAcA,GAsCpB5nC,KAAKyuD,EAAY3uD,WAEpBO,EAAS,0BAA0B4pD,QAAQjqD,KAAKyuD,EAAY3uD,WAC5DO,EAAS,gCAAgCytD,aAAa9tD,KAAKyuD,EAAY3uD,WAGvEs9B,EAAO9C,cAAcm0B,EAAY3uD,UAAW,UAAW,CACnDo7D,KAAM,CACF3yD,IAAK,SAASrB,GAUV,GATKA,GAAkB,OAATA,EAEI,QAATA,EACLA,GAAQ,EACM,eAATA,EACLA,GAAS,EACY,iBAATA,IACZA,EAAQqG,SAASrG,EAAO,MAAO,GAN/BA,GAAQ,EAQR1I,KAAK28D,OAASj0D,EAGlB,GADA1I,KAAK28D,MAAQj0D,EACRA,EAEE,CACH,IAAIyhC,EAAsB,iBAATzhC,EAAoBA,EAAQ,KAC7C1I,KAAK64D,kBAAkB1uB,EAAKA,GAC5BnqC,KAAK04D,gBAAe,QAJpB14D,KAAK04D,gBAAe,IAO5B5uD,IAAK,WACD,OAAI9J,KAAK44D,kBACc,GAAf54D,KAAK28D,MACE,cACN38D,KAAKu5D,oBAAoB/xD,IAEvBxH,KAAK28D,MADD,OAGR,OAEXphC,YAAY,GAEhB45B,WAAY,CACRprD,IAAK,SAASse,GACVA,EAAa,QAAPA,EACmB,QAAnBroB,KAAKi8C,MAAMvgC,KACJ,QAAP2M,EACFA,GAAOroB,KAAKy6D,cACZz6D,KAAKy6D,YAAcpyC,EACfroB,KAAK+oC,eACL/oC,KAAK6sD,WAAY,EACjB7sD,KAAK6wD,eAAe,GACpB7wD,KAAK2sD,gBAAgB,EAAG3sD,KAAKkyB,YAAc,MAIvD8J,aAAc,QAElB0+B,iBAAkB,CAAE1+B,cAAc,GAClC4gC,gBAAiB,CACb7yD,IAAK,WAAY/J,KAAKuyB,QAAQ,qBAC9ByJ,aAAc,GAElBy4B,UAAW,CACP1qD,IAAK,SAAS0qD,GACVz0D,KAAK20D,WAAaF,EAElBz0D,KAAKg1D,cACDP,GACAz0D,KAAKi1D,gBAEbj5B,cAAc,GAElB6gC,YAAa,CAAC7gC,cAAc,GAC5ByU,QAAS,CACL1mC,IAAK,SAAS0mC,GACNilB,MAAMjlB,IAAYzwC,KAAKyyD,WAAahiB,IAExCzwC,KAAK6sD,WAAY,EACjB7sD,KAAKixD,gBAAkB,GACvBjxD,KAAKyyD,SAAWhiB,EAChBzwC,KAAKuyB,QAAQ,mBAEjByJ,aAAc,EACdT,YAAY,GAEhBo3B,uBAAwB,CAAC32B,cAAc,GACvC+2B,UAAW,CACPhpD,IAAK,SAASse,GAAMroB,KAAKuyB,QAAQ,oBACjCyJ,cAAc,GAElBspB,YAAa,CACTv7C,IAAK,SAASse,GAAMroB,KAAK+M,IAAIs4C,eAAeh9B,IAC5Cve,IAAK,WAAY,OAAO9J,KAAK+M,IAAIw4C,kBACjChqB,YAAY,GAEhB8c,KAAM,CACFtuC,IAAK,SAASse,GAAOroB,KAAK0wD,QAAQroC,IAClCve,IAAK,WAAa,OAAO9J,KAAK60D,YAItClyD,EAAQstD,YAAcA,IAGtB5sD,IAAIlD,OAAO,aAAa,CAAC,UAAU,UAAU,SAAS,eAAe,cAAc,aAAc,SAAS0B,EAAUc,EAASvC,GAC7H,aAEA,IAAIujB,EAAO9hB,EAAS,cAChBmQ,EAAMnQ,EAAS,aACfypC,EAAQzpC,EAAS,WAAWypC,MAE5BwxB,EAAS,WACT98D,KAAKk7B,SAAW,IAgSpB,SAAS6hC,EAAgBC,EAAQjhC,GAC7B,SAASkhC,EAAar0C,GAClB,MAAI,KAAKnlB,KAAKmlB,IAAMmT,EAAQnZ,OAAe,MACpC,GAEX,OAAOq6C,EAAaD,EAAO,IAAMA,EAC3BC,EAAaD,EAAOA,EAAOx8D,OAAS,KAnS9C,WACIR,KAAK+J,IAAM,SAASgyB,GAEhB,OADA/pB,EAAIH,MAAM7R,KAAKk7B,SAAUa,GAClB/7B,MAEXA,KAAKg7B,WAAa,WACd,OAAOrX,EAAK3B,WAAWhiB,KAAKk7B,WAEhCl7B,KAAK66B,WAAa,SAASkB,GACvB/7B,KAAKk7B,SAAWa,GAEpB/7B,KAAKk9D,KAAO,SAASp1C,GACjB,IAAIiU,EAAU/7B,KAAKk7B,SACf2hB,EAAW78C,KAAKm9D,eAAer1C,EAASiU,GAC5C,IAAK8gB,EACD,OAAO,EAEX,IAAI5b,EAAa,KAajB,OAZA4b,EAAS30C,QAAQ,SAASk1D,EAAIC,EAAIC,EAAIC,GAElC,OADAt8B,EAAa,IAAIqK,EAAM8xB,EAAIC,EAAIC,EAAIC,KAC/BF,GAAME,GAAMxhC,EAAQj1B,OAASi1B,EAAQj1B,MAAMA,OACjB,GAAvBi1B,EAAQyhC,aAAwBv8B,EAAW0K,QAAQ5P,EAAQj1B,UAE9Dm6B,EAAa,MACN,KAMRA,GAEXjhC,KAAKy9D,QAAU,SAAS31C,GACpB,IAAIiU,EAAU/7B,KAAKk7B,SACnB,IAAKa,EAAQihC,OACT,MAAO,GACXh9D,KAAK09D,gBAAgB3hC,GAErB,IAAIrT,EAAQqT,EAAQrT,MAChB4f,EAAQ5f,EACNZ,EAAQ29B,SAAS/8B,EAAM5hB,MAAM2lB,IAAK/D,EAAMmC,IAAI4B,KAC5C3E,EAAQ/a,IAAIg4C,cAEd9R,EAAS,GACT9U,EAAKpC,EAAQoC,GACjB,GAAIpC,EAAQ4hC,aAAc,CACtB,IAEIC,EAFAj5B,EAAMxG,EAAG39B,OACTyxB,EAASqW,EAAM9nC,OAASmkC,EAE5Bj1B,EAAO,IAAK,IAAI+c,EAAM0R,EAAGrb,QAAU,EAAG2J,GAAOwF,EAAQxF,IAAO,CACxD,IAAK,IAAI+Q,EAAI,EAAGA,EAAImH,EAAKnH,IACrB,IAAqC,GAAjC8K,EAAM7b,EAAM+Q,GAAG8T,OAAOnT,EAAGX,IACzB,SAAS9tB,EAEjB,IAAIg4C,EAAYpf,EAAM7b,GAClBib,EAAOY,EAAM7b,EAAMkY,EAAM,GACzB2lB,EAAa5C,EAAUlnD,OAASknD,EAAUhkD,MAAMy6B,EAAG,IAAI,GAAG39B,OAC1D+pD,EAAW7iB,EAAKhkC,MAAMy6B,EAAGwG,EAAM,IAAI,GAAGnkC,OAEtCo9D,GAAaA,EAAU/yC,IAAI4B,MAAQA,GACnCmxC,EAAU/yC,IAAI8B,OAAS29B,IAI3BrX,EAAOnxC,KAAK87D,EAAY,IAAItyB,EACxB7e,EAAK69B,EAAY79B,EAAMkY,EAAM,EAAG4lB,IAEhC5lB,EAAM,IACNlY,EAAMA,EAAMkY,EAAM,UAG1B,IAAK,IAAIjjC,EAAI,EAAGA,EAAI4mC,EAAM9nC,OAAQkB,IAC9B,KAAImhB,EAAUc,EAAKhB,gBAAgB2lB,EAAM5mC,GAAIy8B,GAC7C,IAASX,EAAI,EAAGA,EAAI3a,EAAQriB,OAAQg9B,IAAK,CACrC,IAAI95B,EAAQmf,EAAQ2a,GACpByV,EAAOnxC,KAAK,IAAIwpC,EAAM5pC,EAAGgC,EAAMof,OAAQphB,EAAGgC,EAAMof,OAASpf,EAAMlD,UAK3E,GAAIkoB,EAAO,CACP,IAAI8iB,EAAc9iB,EAAM5hB,MAAM6lB,OAC1B+e,EAAYhjB,EAAM5hB,MAAM6lB,OACxBjrB,EAAI,EAAG87B,EAAIyV,EAAOzyC,OAAS,EAC/B,MAAOkB,EAAI87B,GAAKyV,EAAOvxC,GAAGoF,MAAM6lB,OAAS6e,GAAeyH,EAAOvxC,GAAGoF,MAAM2lB,KAAO/D,EAAM5hB,MAAM2lB,IACvF/qB,IAEJ,MAAOA,EAAI87B,GAAKyV,EAAOzV,GAAG3S,IAAI8B,OAAS+e,GAAauH,EAAOzV,GAAG3S,IAAI4B,KAAO/D,EAAMmC,IAAI4B,IAC/E+Q,IAGJ,IADAyV,EAASA,EAAO1wC,MAAMb,EAAG87B,EAAI,GACxB97B,EAAI,EAAG87B,EAAIyV,EAAOzyC,OAAQkB,EAAI87B,EAAG97B,IAClCuxC,EAAOvxC,GAAGoF,MAAM2lB,KAAO/D,EAAM5hB,MAAM2lB,IACnCwmB,EAAOvxC,GAAGmpB,IAAI4B,KAAO/D,EAAM5hB,MAAM2lB,IAIzC,OAAOwmB,GAEXjzC,KAAK0C,QAAU,SAASo/C,EAAO+b,GAC3B,IAAI9hC,EAAU/7B,KAAKk7B,SAEfiD,EAAKn+B,KAAK09D,gBAAgB3hC,GAC9B,GAAIA,EAAQ4hC,aACR,OAAOE,EAEX,GAAK1/B,EAAL,CAGA,IAAIz6B,EAAQy6B,EAAG56B,KAAKu+C,GACpB,IAAKp+C,GAASA,EAAM,GAAGlD,QAAUshD,EAAMthD,OACnC,OAAO,KAGX,GADAq9D,EAAc/b,EAAMp/C,QAAQy7B,EAAI0/B,GAC5B9hC,EAAQ+hC,aAAc,CACtBD,EAAcA,EAAYz7D,MAAM,IAChC,IAAK,IAAIV,EAAIwF,KAAKM,IAAIs6C,EAAMthD,OAAQshD,EAAMthD,QAASkB,KAAO,CACtD,IAAIwkC,EAAK4b,EAAMpgD,GACXwkC,GAAMA,EAAGxtB,eAAiBwtB,EAC1B23B,EAAYn8D,GAAKm8D,EAAYn8D,GAAGm8B,cAEhCggC,EAAYn8D,GAAKm8D,EAAYn8D,GAAGgX,cAExCmlD,EAAcA,EAAYr7D,KAAK,IAGnC,OAAOq7D,IAGX79D,KAAK09D,gBAAkB,SAAS3hC,EAASgiC,GACrC,GAAIhiC,EAAQihC,kBAAkBx5D,OAC1B,OAAOu4B,EAAQoC,GAAKpC,EAAQihC,OAEhC,IAAIA,EAASjhC,EAAQihC,OAErB,IAAKjhC,EAAQihC,OACT,OAAOjhC,EAAQoC,IAAK,EAEnBpC,EAAQnZ,SACTo6C,EAASr5C,EAAKlB,aAAau6C,IAE3BjhC,EAAQiiC,YACRhB,EAASD,EAAgBC,EAAQjhC,IAErC,IAAIkiC,EAAWliC,EAAQmiC,cAAgB,KAAO,MAG9C,GADAniC,EAAQ4hC,cAAgBI,GAAyB,SAASt6D,KAAKu5D,GAC3DjhC,EAAQ4hC,aACR,OAAO5hC,EAAQoC,GAAKn+B,KAAKm+D,yBAAyBnB,EAAQiB,GAE9D,IACI,IAAI9/B,EAAK,IAAI36B,OAAOw5D,EAAQiB,GAC9B,MAAM7hD,GACJ+hB,GAAK,EAET,OAAOpC,EAAQoC,GAAKA,GAGxBn+B,KAAKm+D,yBAA2B,SAASnB,EAAQiB,GAG7C,IAFA,IAAIhgC,EAAQ++B,EAAOt6D,QAAQ,cAAe,QAAQN,MAAM,MACpD+7B,EAAK,GACAz8B,EAAI,EAAGA,EAAIu8B,EAAMz9B,OAAQkB,IAAK,IACnCy8B,EAAGr8B,KAAK,IAAI0B,OAAOy6B,EAAMv8B,GAAIu8D,IAC/B,MAAM7hD,GACJ,OAAO,EAEX,OAAO+hB,GAGXn+B,KAAKm9D,eAAiB,SAASr1C,EAASiU,GACpC,IAAIoC,EAAKn+B,KAAK09D,gBAAgB3hC,GAC9B,IAAKoC,EACD,OAAO,EACX,IAAIigC,EAAiC,GAArBriC,EAAQqiC,UACpBZ,EAAqC,GAAvBzhC,EAAQyhC,YAEtB90C,EAAQqT,EAAQrT,MAChB5hB,EAAQi1B,EAAQj1B,MACfA,IACDA,EAAQ4hB,EAAQA,EAAM01C,EAAY,MAAQ,SAAWt2C,EAAQhC,UAAU2C,YAEvE3hB,EAAMA,QACNA,EAAQA,EAAM02D,GAAeY,EAAY,MAAQ,UAErD,IAAIzxB,EAAWjkB,EAAQA,EAAM5hB,MAAM2lB,IAAM,EACrCmgB,EAAUlkB,EAAQA,EAAMmC,IAAI4B,IAAM3E,EAAQoK,YAAc,EAE5D,GAAIksC,EACA,IAAIl2D,EAAU,SAAShH,GACnB,IAAIurB,EAAM3lB,EAAM2lB,IAChB,IAAI4xC,EAAc5xC,EAAK3lB,EAAM6lB,OAAQzrB,GAArC,CAEA,IAAKurB,IAAOA,GAAOkgB,EAAUlgB,IACzB,GAAI4xC,EAAc5xC,EAAK0rC,OAAOC,UAAWl3D,GACrC,OACR,GAAoB,GAAhB66B,EAAQ2gC,KAEZ,IAAKjwC,EAAMmgB,EAASD,EAAW7lC,EAAM2lB,IAAKA,GAAOkgB,EAAUlgB,IACvD,GAAI4xC,EAAc5xC,EAAK0rC,OAAOC,UAAWl3D,GACrC,cAIRgH,EAAU,SAAShH,GACnB,IAAIurB,EAAM3lB,EAAM2lB,IAChB,IAAI4xC,EAAc5xC,EAAK3lB,EAAM6lB,OAAQzrB,GAArC,CAEA,IAAKurB,GAAY,EAAGA,GAAOmgB,EAASngB,IAChC,GAAI4xC,EAAc5xC,EAAK,EAAGvrB,GACtB,OACR,GAAoB,GAAhB66B,EAAQ2gC,KAEZ,IAAKjwC,EAAMkgB,EAAUC,EAAU9lC,EAAM2lB,IAAKA,GAAOmgB,EAASngB,IACtD,GAAI4xC,EAAc5xC,EAAK,EAAGvrB,GACtB,SAIhB,GAAI66B,EAAQ4hC,aACR,IAAIh5B,EAAMxG,EAAG39B,OACT69D,EAAgB,SAAS5xC,EAAK3J,EAAQ5hB,GACtC,IAAIqqC,EAAW6yB,EAAY3xC,EAAMkY,EAAM,EAAIlY,EAC3C,KAAI8e,EAAW,GAAf,CACA,IAAI7D,EAAO5f,EAAQoZ,QAAQqK,GACvB+e,EAAa5iB,EAAK4J,OAAOnT,EAAG,IAChC,MAAKigC,GAAa9T,EAAaxnC,IAA0B,IAAhBwnC,GAAzC,CACA,IAAK,IAAI5oD,EAAI,EAAGA,EAAIijC,EAAKjjC,IAErB,GADAgmC,EAAO5f,EAAQoZ,QAAQqK,EAAW7pC,IACP,GAAvBgmC,EAAK4J,OAAOnT,EAAGz8B,IACf,OAER,IAAI6oD,EAAW7iB,EAAKhkC,MAAMy6B,EAAGwG,EAAM,IAAI,GAAGnkC,OAC1C,KAAI49D,GAAa7T,EAAWznC,GAC5B,QAAI5hB,EAASqqC,EAAU+e,EAAY/e,EAAW5G,EAAM,EAAG4lB,SAAvD,UAIH,GAAI6T,EACDC,EAAgB,SAAS5xC,EAAK89B,EAAUrpD,GACxC,IAEIy8B,EAFA+J,EAAO5f,EAAQoZ,QAAQzU,GACvB5J,EAAU,GACPrB,EAAO,EACd2c,EAAGp6B,UAAY,EACf,MAAO45B,EAAIQ,EAAG56B,KAAKmkC,GAAQ,CACvB,IAAIlnC,EAASm9B,EAAE,GAAGn9B,OAElB,GADAghB,EAAOmc,EAAE74B,OACJtE,EAAQ,CACT,GAAIghB,GAAQkmB,EAAKlnC,OAAQ,MACzB29B,EAAGp6B,UAAYyd,GAAQ,EAE3B,GAAImc,EAAE74B,MAAQtE,EAAS+pD,EACnB,MACJ1nC,EAAQ/gB,KAAK67B,EAAE74B,MAAOtE,GAE1B,IAAK,IAAIkB,EAAImhB,EAAQriB,OAAS,EAAGkB,GAAK,EAAGA,GAAK,EAAG,CAC7C,IAAIirB,EAAS9J,EAAQnhB,EAAI,GACrBlB,EAASqiB,EAAQnhB,GACrB,GAAIR,EAASurB,EAAKE,EAAQF,EAAKE,EAASnsB,GACpC,OAAO,SAKf69D,EAAgB,SAAS5xC,EAAK69B,EAAYppD,GAC1C,IACIy8B,EADA+J,EAAO5f,EAAQoZ,QAAQzU,GAEvBjL,EAAO8oC,EACXnsB,EAAGp6B,UAAYumD,EACf,MAAO3sB,EAAIQ,EAAG56B,KAAKmkC,GAAQ,CACvB,IAAIlnC,EAASm9B,EAAE,GAAGn9B,OAElB,GADAghB,EAAOmc,EAAE74B,MACL5D,EAASurB,EAAKjL,EAAMiL,EAAIjL,EAAOhhB,GAC/B,OAAO,EACX,IAAKA,IACD29B,EAAGp6B,UAAYyd,GAAQ,EACnBA,GAAQkmB,EAAKlnC,QAAQ,OAAO,IAKhD,MAAO,CAAC0H,QAASA,MAGtB1G,KAAKs7D,EAAOx7D,WAWfqB,EAAQm6D,OAASA,IAGjBz5D,IAAIlD,OAAO,4BAA4B,CAAC,UAAU,UAAU,SAAS,eAAe,qBAAsB,SAAS0B,EAAUc,EAASvC,GACtI,aAEA,IAAIghC,EAAUv/B,EAAS,eACnBwZ,EAAYxZ,EAAS,oBACrB2Q,EAAW4uB,EAAQ5uB,SAEvB,SAAS8rD,EAAY1/B,EAAQ9kB,GACzB9Z,KAAK8Z,SAAWA,IAAauB,EAAU3B,MAAQ,MAAQ,OACvD1Z,KAAKyhC,SAAW,GAChBzhC,KAAKu+D,kBAAoB,GACzBv+D,KAAKw+D,YAAY5/B,GACjB5+B,KAAKy+D,gBAAiB,EAG1B,SAASC,EAAiB9/B,EAAQ9kB,GAC9BwkD,EAAY98D,KAAKxB,KAAM4+B,EAAQ9kB,GAC/B9Z,KAAKy+D,gBAAiB,EAG1BC,EAAiBp9D,UAAYg9D,EAAYh9D,UAEzC,WAgEI,SAAS0sC,EAAYxL,GACjB,MAAyB,iBAAXA,GAAuBA,EAAQm8B,SACtCn8B,EAAQm8B,QAAQhvD,WACf6yB,EAAQo8B,WAAa,IAAM,GAhEvC5+D,KAAK6+D,WAAa,SAASr8B,GACnBxiC,KAAKyhC,SAASe,EAAQ79B,OACtB3E,KAAK8+D,cAAct8B,GAEvBxiC,KAAKyhC,SAASe,EAAQ79B,MAAQ69B,EAE1BA,EAAQm8B,SACR3+D,KAAK++D,cAAcv8B,IAG3BxiC,KAAK8+D,cAAgB,SAASt8B,EAASw8B,GACnC,IAAIr6D,EAAO69B,IAA+B,kBAAZA,EAAuBA,EAAUA,EAAQ79B,MACvE69B,EAAUxiC,KAAKyhC,SAAS98B,GACnBq6D,UACMh/D,KAAKyhC,SAAS98B,GACzB,IAAIs6D,EAAMj/D,KAAKu+D,kBACf,IAAK,IAAIW,KAASD,EAAK,CACnB,IAAIE,EAAWF,EAAIC,GACnB,GAAIC,GAAY38B,SACLy8B,EAAIC,QACR,GAAIz6D,MAAMoD,QAAQs3D,GAAW,CAChC,IAAIz9D,EAAIy9D,EAASj9D,QAAQsgC,IACf,GAAN9gC,IACAy9D,EAAS14D,OAAO/E,EAAG,GACI,GAAnBy9D,EAAS3+D,SACTy+D,EAAIC,GAASC,EAAS,QAM1Cn/D,KAAK2+D,QAAU,SAAS3yD,EAAKw2B,EAAS7yB,GAMlC,GALkB,iBAAP3D,GAAmBA,SACV5K,GAAZuO,IACAA,EAAW3D,EAAI2D,UACnB3D,EAAMA,EAAIhM,KAAK8Z,WAEd9N,EAEL,MAAsB,mBAAXw2B,EACAxiC,KAAK6+D,WAAW,CAACt7D,KAAMi/B,EAASm8B,QAAS3yD,EAAKrH,KAAM69B,EAAQ79B,MAAQqH,SAE/EA,EAAI5J,MAAM,KAAK8F,QAAQ,SAASk3D,GAC5B,IAAIC,EAAQ,GACZ,IAA6B,GAAzBD,EAAQl9D,QAAQ,KAAY,CAC5B,IAAI+7B,EAAQmhC,EAAQh9D,MAAM,OAC1Bg9D,EAAUnhC,EAAMzD,MAChByD,EAAM/1B,QAAQ,SAASk3D,GACnB,IAAIE,EAAUt/D,KAAKu/D,UAAUH,GACzBv8D,EAAK2P,EAAS8sD,EAAQx/C,QAAUw/C,EAAQtzD,IAC5CqzD,IAAUA,EAAQ,IAAM,IAAMx8D,EAC9B7C,KAAKw/D,qBAAqBH,EAAO,cAClCr/D,MACHq/D,GAAS,IAEb,IAAIC,EAAUt/D,KAAKu/D,UAAUH,GACzBv8D,EAAK2P,EAAS8sD,EAAQx/C,QAAUw/C,EAAQtzD,IAC5ChM,KAAKw/D,qBAAqBH,EAAQx8D,EAAI2/B,EAAS7yB,IAChD3P,OAQPA,KAAKw/D,qBAAuB,SAASN,EAAO18B,EAAS7yB,GACjD,IAAkCjO,EAA9Bu9D,EAAMj/D,KAAKu+D,kBACf,GAAK/7B,EAEE,IAAKy8B,EAAIC,IAAUl/D,KAAKy+D,eAC3BQ,EAAIC,GAAS18B,MACV,CACE/9B,MAAMoD,QAAQo3D,EAAIC,KAE0B,IAArCx9D,EAAIu9D,EAAIC,GAAOh9D,QAAQsgC,KAC/By8B,EAAIC,GAAOz4D,OAAO/E,EAAG,GAFrBu9D,EAAIC,GAAS,CAACD,EAAIC,IAKC,iBAAZvvD,IACPA,EAAWq+B,EAAYxL,IAG3B,IAAIf,EAAWw9B,EAAIC,GACnB,IAAKx9D,EAAI,EAAGA,EAAI+/B,EAASjhC,OAAQkB,IAAK,CAClC,IAAI+9D,EAAQh+B,EAAS//B,GACjBg+D,EAAW1xB,EAAYyxB,GAC3B,GAAIC,EAAW/vD,EACX,MAER8xB,EAASh7B,OAAO/E,EAAG,EAAG8gC,eArBfy8B,EAAIC,IAyBnBl/D,KAAKw+D,YAAc,SAAS/8B,GACxBA,GAAYpgC,OAAO4I,KAAKw3B,GAAUv5B,QAAQ,SAASvD,GAC/C,IAAI69B,EAAUf,EAAS98B,GACvB,GAAK69B,EAAL,CAGA,GAAuB,kBAAZA,EACP,OAAOxiC,KAAK2+D,QAAQn8B,EAAS79B,GAEV,oBAAZ69B,IACPA,EAAU,CAAEj/B,KAAMi/B,IAEC,kBAAZA,IAGNA,EAAQ79B,OACT69B,EAAQ79B,KAAOA,GAEnB3E,KAAK6+D,WAAWr8B,MACjBxiC,OAGPA,KAAK2/D,eAAiB,SAASl+B,GAC3BpgC,OAAO4I,KAAKw3B,GAAUv5B,QAAQ,SAASvD,GACnC3E,KAAK8+D,cAAcr9B,EAAS98B,KAC7B3E,OAGPA,KAAK4/D,SAAW,SAASC,GACrBx+D,OAAO4I,KAAK41D,GAAS33D,QAAQ,SAAS8D,GAClChM,KAAK2+D,QAAQ3yD,EAAK6zD,EAAQ7zD,KAC3BhM,OAGPA,KAAK++D,cAAgB,SAASv8B,GAC1BxiC,KAAK2+D,QAAQn8B,EAAQm8B,QAASn8B,IAElCxiC,KAAKu/D,UAAY,SAASt1D,GACtB,IAAIg0B,EAAQh0B,EAAKyO,cAActW,MAAM,mBAAmBqG,OAAO,SAAS3E,GAAG,OAAOA,IAC9EkI,EAAMiyB,EAAMzD,MAEZthB,EAAUkoB,EAAQp1B,GACtB,GAAIo1B,EAAQ3uB,cAAcyG,GACtBlN,EAAMo1B,EAAQ3uB,cAAcyG,GAASR,kBACpC,KAAKulB,EAAMz9B,OACZ,MAAO,CAACwL,IAAKA,EAAK8T,QAAS,GAC1B,GAAoB,GAAhBme,EAAMz9B,QAA2B,SAAZy9B,EAAM,GAChC,MAAO,CAACjyB,IAAKA,EAAI6xB,cAAe/d,QAAS,GAG7C,IADA,IAAIA,EAAS,EACJpe,EAAIu8B,EAAMz9B,OAAQkB,KAAM,CAC7B,IAAIu8D,EAAW78B,EAAQ5uB,SAASyrB,EAAMv8B,IACtC,GAAgB,MAAZu8D,EAGA,MAFsB,oBAAXp9D,SACPA,QAAQC,MAAM,oBAAsBm9B,EAAMv8B,GAAK,OAASuI,IACrD,EAEX6V,GAAUm+C,EAEd,MAAO,CAACjyD,IAAKA,EAAK8T,OAAQA,IAG9B9f,KAAK8/D,eAAiB,SAAwBhgD,EAAQ3G,GAClD,IAAInN,EAAMwG,EAASsN,GAAU3G,EAC7B,OAAOnZ,KAAKu+D,kBAAkBvyD,IAGlChM,KAAKgiC,eAAiB,SAAS/gB,EAAMnB,EAAQ3G,EAAWD,GACpD,KAAIA,EAAU,GAAd,CACA,IAAIlN,EAAMwG,EAASsN,GAAU3G,EACzBqpB,EAAUxiC,KAAKu+D,kBAAkBvyD,GAMrC,OALIiV,EAAK8+C,YACL9+C,EAAK8+C,WAAa,IAAM/zD,EACxBw2B,EAAUxiC,KAAKu+D,kBAAkBt9C,EAAK8+C,YAAcv9B,IAGpDA,GACe,aAAXA,GAAyD,aAA/BA,EAAQA,EAAQhiC,OAAS,IAMvDygB,EAAK8+C,YACCjgD,GAAoB,GAAVA,GAAoC,GAApB3G,EAAU3Y,SAEtB,GAAXsf,GAAgB5G,EAAU,KAC/B+H,EAAK8+C,UAAY,IAFjB9+C,EAAK8+C,UAAY9+C,EAAK8+C,UAAUx9D,MAAM,GAAIyJ,EAAIxL,OAAS,IAIxD,CAACgiC,QAASA,KAXTvhB,EAAK8+C,UAAY9+C,EAAK8+C,WAAa/zD,EAC5B,CAACw2B,QAAS,WAa7BxiC,KAAKoiC,cAAgB,SAAS9W,EAAQrK,GAClC,OAAOA,EAAK8+C,WAAa,KAG9Bv+D,KAAK88D,EAAYh9D,WAEpBqB,EAAQ27D,YAAcA,EACtB37D,EAAQ+7D,iBAAmBA,IAG3Br7D,IAAIlD,OAAO,+BAA+B,CAAC,UAAU,UAAU,SAAS,cAAc,4BAA4B,yBAA0B,SAAS0B,EAAUc,EAASvC,GACxK,aAEA,IAAI4R,EAAMnQ,EAAS,cACf68D,EAAmB78D,EAAS,4BAA4B68D,iBACxDhlC,EAAe73B,EAAS,wBAAwB63B,aAEhDsmC,EAAiB,SAASlmD,EAAU2nB,GACpCi9B,EAAiBl9D,KAAKxB,KAAMyhC,EAAU3nB,GACtC9Z,KAAKigE,OAASjgE,KAAKyhC,SACnBzhC,KAAKurB,kBAAkB,OAAQ,SAASnP,GACpC,OAAOA,EAAEomB,QAAQj/B,KAAK6Y,EAAEkP,OAAQlP,EAAE7W,MAAQ,OAIlDyM,EAAIR,SAASwuD,EAAgBtB,GAE7B,WAEI1sD,EAAIF,UAAU9R,KAAM05B,GAEpB15B,KAAKuD,KAAO,SAASi/B,EAASlX,EAAQ/lB,GAClC,GAAId,MAAMoD,QAAQ26B,GAAU,CACxB,IAAK,IAAI9gC,EAAI8gC,EAAQhiC,OAAQkB,KACzB,GAAI1B,KAAKuD,KAAKi/B,EAAQ9gC,GAAI4pB,EAAQ/lB,GAAO,OAAO,EAEpD,OAAO,EAMX,GAHuB,kBAAZi9B,IACPA,EAAUxiC,KAAKyhC,SAASe,KAEvBA,EACD,OAAO,EAEX,GAAIlX,GAAUA,EAAO1D,YAAc4a,EAAQnZ,SACvC,OAAO,EAEX,GAAImZ,EAAQ09B,cAAgB19B,EAAQ09B,YAAY50C,GAC5C,OAAO,EAEX,IAAIlP,EAAI,CAACkP,OAAQA,EAAQkX,QAASA,EAASj9B,KAAMA,GAIjD,OAHA6W,EAAEnZ,YAAcjD,KAAKupB,MAAM,OAAQnN,GACnCpc,KAAKuyB,QAAQ,YAAanW,IAED,IAAlBA,EAAEnZ,aAGbjD,KAAKmgE,gBAAkB,SAAS70C,GAC5B,IAAItrB,KAAKogE,UAIT,OADA90C,GAAUA,EAAO/B,MAAM,gBACnBvpB,KAAKqgE,WACLrgE,KAAKsgE,MAAM9lC,MACXx6B,KAAKic,oBAAoB,OAAQjc,KAAKugE,oBAEjCvgE,KAAKsgE,MAAM9/D,SACZR,KAAKsgE,MAAQtgE,KAAKwgE,UAEfxgE,KAAKqgE,WAAY,IAEvBrgE,KAAKugE,qBACNvgE,KAAKugE,mBAAqB,SAASnkD,GAC/Bpc,KAAKsgE,MAAMx+D,KAAK,CAACsa,EAAEomB,QAASpmB,EAAE7W,QAChCJ,KAAKnF,OAGXA,KAAKwgE,SAAWxgE,KAAKsgE,MACrBtgE,KAAKsgE,MAAQ,GACbtgE,KAAKioB,GAAG,OAAQjoB,KAAKugE,oBACdvgE,KAAKqgE,WAAY,IAG5BrgE,KAAKygE,OAAS,SAASn1C,GACnB,IAAItrB,KAAKogE,WAAcpgE,KAAKsgE,MAA5B,CAGA,GAAItgE,KAAKqgE,UACL,OAAOrgE,KAAKmgE,gBAAgB70C,GAEhC,IACItrB,KAAKogE,WAAY,EACjBpgE,KAAKsgE,MAAMp4D,QAAQ,SAASpE,GACR,iBAALA,EACP9D,KAAKuD,KAAKO,EAAGwnB,GAEbtrB,KAAKuD,KAAKO,EAAE,GAAIwnB,EAAQxnB,EAAE,KAC/B9D,MACL,QACEA,KAAKogE,WAAY,KAIzBpgE,KAAK0gE,UAAY,SAAS/iC,GACtB,OAAOA,EAAEn1B,IAAI,SAAS1E,GAKlB,MAJmB,iBAARA,EAAE,KACTA,EAAE,GAAKA,EAAE,GAAGa,MACXb,EAAE,KACHA,EAAIA,EAAE,IACHA,MAIhBtC,KAAKw+D,EAAe1+D,WAEvBqB,EAAQq9D,eAAiBA,IAIzB38D,IAAIlD,OAAO,gCAAgC,CAAC,UAAU,UAAU,SAAS,eAAe,aAAa,aAAc,SAAS0B,EAAUc,EAASvC,GAC/I,aAEA,IAAIujB,EAAO9hB,EAAS,eAChB+8B,EAAS/8B,EAAS,aAClBypC,EAAQzpC,EAAS,YAAYypC,MAEjC,SAASqzB,EAAQ79C,EAAK6/C,GAClB,MAAO,CAAC7/C,IAAKA,EAAK6/C,IAAKA,GAE3Bh+D,EAAQ8+B,SAAW,CAAC,CAChB98B,KAAM,mBACNg6D,QAASA,EAAQ,SAAU,aAC3Bp7D,KAAM,SAAS+nB,GACXsT,EAAOL,WAAW,wBAAyB,SAASn+B,GAChDA,EAAOy8B,KAAKvR,GACZA,EAAOs1C,sBAGfv3C,UAAU,GACX,CACC1kB,KAAM,gBACNg6D,QAASA,EAAQ,QAAS,MAC1Bp7D,KAAM,SAAS+nB,GACXsT,EAAOL,WAAW,uBAAwB,SAASn+B,GAC/CA,EAAOygE,gBAAgBv1C,EAAQ,MAGvCw1C,eAAgB,UAChBz3C,UAAU,GACX,CACC1kB,KAAM,oBACNg6D,QAASA,EAAQ,cAAe,YAChCp7D,KAAM,SAAS+nB,GACXsT,EAAOL,WAAW,uBAAwB,SAASn+B,GAC/CA,EAAOygE,gBAAgBv1C,GAAS,MAGxCw1C,eAAgB,UAChBz3C,UAAU,GACX,CACC1kB,KAAM,YACNg6D,QAASA,EAAQ,SAAU,aAC3Bp7D,KAAM,SAAS+nB,GAAUA,EAAOrF,aAChCoD,UAAU,GACX,CACC1kB,KAAM,kBACNg6D,QAASA,EAAQ,KAAM,UACvBp7D,KAAM,SAAS+nB,GAAUA,EAAOy1C,mBAChC13C,UAAU,GACX,CACC1kB,KAAM,WACNg6D,QAASA,EAAQ,SAAU,aAC3Bp7D,KAAM,SAAS+nB,GACX,IAAIoc,EAAO34B,SAASiyD,OAAO,sBAAuB,IAC7CtL,MAAMhuB,IACPpc,EAAO21C,SAASv5B,IAGxBre,UAAU,GACX,CACC1kB,KAAM,OACNg6D,QAASA,EAAQ,gBAAiB,4BAClCp7D,KAAM,SAAS+nB,GAAUA,EAAOxD,QAAQgmC,YAAW,IACnDoT,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,SACNg6D,QAASA,EAAQ,4BAA6B,wCAC9Cp7D,KAAM,SAAS+nB,GAAUA,EAAOxD,QAAQgmC,YAAW,IACnDoT,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,mBACNg6D,QAASA,EAAQ,KAAM,MACvBp7D,KAAM,SAAS+nB,GAAUA,EAAOxD,QAAQsnC,oBACxC8R,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,yBACNg6D,QAASA,EAAQ,SAAU,UAC3Bp7D,KAAM,SAAS+nB,GAAUA,EAAOxD,QAAQsnC,kBAAiB,IACzD8R,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,UACNg6D,QAASA,EAAQ,KAAM,yBACvBp7D,KAAM,SAAS+nB,GAAUA,EAAOxD,QAAQmlC,WACxC6T,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,YACNg6D,QAASA,EAAQ,QAAS,oBAC1Bp7D,KAAM,SAAS+nB,GACXA,EAAOxD,QAAQmlC,UACf3hC,EAAOxD,QAAQqlC,OAAO7hC,EAAOxF,UAAUq7C,iBAE3CL,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,YACNg6D,QAASA,EAAQ,cAAe,0BAChCp7D,KAAM,SAAS+nB,GAAUA,EAAOxD,QAAQqlC,UACxC2T,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,WACNg6D,QAASA,EAAQ,SAAU,aAC3Bp7D,KAAM,SAAS+nB,GAAUA,EAAO81C,YAChCF,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,eACNg6D,QAASA,EAAQ,eAAgB,mBACjCp7D,KAAM,SAAS+nB,GAAUA,EAAO+1C,gBAChCH,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,mBACNg6D,QAASA,EAAQ,QAAS,UAC1Bp7D,KAAM,SAAS+nB,GACPA,EAAOxF,UAAUN,UACjB8F,EAAOxF,UAAUgqB,aAEjBxkB,EAAO81C,YAEf/3C,UAAU,GACX,CACC1kB,KAAM,uBACNg6D,QAASA,EAAQ,cAAe,gBAChCp7D,KAAM,SAAS+nB,GACPA,EAAOxF,UAAUN,UACjB8F,EAAOxF,UAAUgqB,aAEjBxkB,EAAO+1C,gBAEfh4C,UAAU,GACX,CACC1kB,KAAM,OACNg6D,QAASA,EAAQ,SAAU,aAC3Bp7D,KAAM,SAAS+nB,GACXsT,EAAOL,WAAW,oBAAqB,SAASniB,GAAIA,EAAE0gD,OAAOxxC,MAEjEjC,UAAU,GACX,CACC1kB,KAAM,YACNg6D,QAAS,SACTp7D,KAAM,SAAS+nB,GAAUA,EAAO2nC,mBAChC5pC,UAAU,GACX,CACC1kB,KAAM,gBACNg6D,QAASA,EAAQ,kBAAmB,uCACpCp7D,KAAM,SAAS+nB,GAAUA,EAAOumC,eAAeriB,mBAC/C0xB,kBAAmB,UACnB73C,UAAU,EACVy3C,eAAgB,UAChBQ,gBAAiB,YAClB,CACC38D,KAAM,YACNg6D,QAASA,EAAQ,YAAa,2BAC9Bp7D,KAAM,SAAS+nB,GAAUA,EAAOi2C,qBAChCL,kBAAmB,UACnB73C,UAAU,EACVy3C,eAAgB,UAChBQ,gBAAiB,YAClB,CACC38D,KAAM,WACNg6D,QAASA,EAAQ,WAAY,yBAC7Bp7D,KAAM,SAAS+nB,GAAUA,EAAOumC,eAAenjB,YAC/CwyB,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,WACNg6D,QAASA,EAAQ,KAAM,aACvBp7D,KAAM,SAAS+nB,EAAQ/lB,GAAQ+lB,EAAOk2C,WAAWj8D,EAAKk8D,QACtDP,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,cACNg6D,QAASA,EAAQ,iBAAkB,wCACnCp7D,KAAM,SAAS+nB,GAAUA,EAAOumC,eAAeviB,iBAC/C4xB,kBAAmB,UACnB73C,UAAU,EACVy3C,eAAgB,UAChBQ,gBAAiB,YAClB,CACC38D,KAAM,UACNg6D,QAASA,EAAQ,WAAY,4BAC7Bp7D,KAAM,SAAS+nB,GAAUA,EAAOo2C,mBAChCR,kBAAmB,UACnB73C,UAAU,EACVy3C,eAAgB,UAChBQ,gBAAiB,YAClB,CACC38D,KAAM,aACNg6D,QAASA,EAAQ,aAAc,2BAC/Bp7D,KAAM,SAAS+nB,GAAUA,EAAOumC,eAAejjB,cAC/CsyB,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,aACNg6D,QAASA,EAAQ,OAAQ,eACzBp7D,KAAM,SAAS+nB,EAAQ/lB,GAAQ+lB,EAAOq2C,aAAap8D,EAAKk8D,QACxDP,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,iBACNg6D,QAASA,EAAQ,kBAAmB,qBACpCp7D,KAAM,SAAS+nB,GAAUA,EAAOumC,eAAejiB,kBAC/CsxB,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,eACNg6D,QAASA,EAAQ,YAAa,eAC9Bp7D,KAAM,SAAS+nB,GAAUA,EAAOs2C,oBAChCV,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,oBACNg6D,QAASA,EAAQ,iBAAkB,mCACnCp7D,KAAM,SAAS+nB,GAAUA,EAAOumC,eAAe3iB,mBAC/CgyB,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,gBACNg6D,QAASA,EAAQ,gBAAiB,4BAClCp7D,KAAM,SAAS+nB,GAAUA,EAAOu2C,qBAChCX,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,aACNg6D,QAASA,EAAQ,aAAc,2BAC/Bp7D,KAAM,SAAS+nB,GAAUA,EAAOumC,eAAe7iB,cAC/CkyB,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,WACNg6D,QAASA,EAAQ,OAAQ,eACzBp7D,KAAM,SAAS+nB,EAAQ/lB,GAAQ+lB,EAAOw2C,aAAav8D,EAAKk8D,QACxDP,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,kBACNg6D,QAASA,EAAQ,mBAAoB,sBACrCp7D,KAAM,SAAS+nB,GAAUA,EAAOumC,eAAeniB,mBAC/CwxB,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,gBACNg6D,QAASA,EAAQ,aAAc,gBAC/Bp7D,KAAM,SAAS+nB,GAAUA,EAAOy2C,qBAChCb,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,kBACNg6D,QAASA,EAAQ,kBAAmB,8CACpCp7D,KAAM,SAAS+nB,GAAUA,EAAOumC,eAAeziB,iBAC/C8xB,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,cACNg6D,QAASA,EAAQ,gBAAiB,4BAClCp7D,KAAM,SAAS+nB,GAAUA,EAAO02C,mBAChCd,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,cACNg6D,QAASA,EAAQ,cAAe,eAChCp7D,KAAM,SAAS+nB,GAAUA,EAAOumC,eAAe/iB,eAC/CoyB,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,YACNg6D,QAASA,EAAQ,QAAS,gBAC1Bp7D,KAAM,SAAS+nB,EAAQ/lB,GAAQ+lB,EAAO22C,cAAc18D,EAAKk8D,QACzDP,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,iBACNg6D,QAAS,iBACTp7D,KAAM,SAAS+nB,GAAUA,EAAO42C,kBAChC74C,UAAU,GACX,CACC1kB,KAAM,WACNg6D,QAASA,EAAQ,KAAM,mBACvBp7D,KAAM,SAAS+nB,GAAUA,EAAO62C,kBAChC94C,UAAU,GACX,CACC1kB,KAAM,eACNg6D,QAASA,EAAQ,WAAY,mBAC7Bp7D,KAAM,SAAS+nB,GAAUA,EAAO82C,gBAChC/4C,UAAU,GACX,CACC1kB,KAAM,eACNg6D,QAAS,eACTp7D,KAAM,SAAS+nB,GAAUA,EAAO+2C,gBAChCh5C,UAAU,GACX,CACC1kB,KAAM,SACNg6D,QAASA,EAAQ,KAAM,iBACvBp7D,KAAM,SAAS+nB,GAAUA,EAAOg3C,gBAChCj5C,UAAU,GACX,CACC1kB,KAAM,aACNg6D,QAAS,SACTp7D,KAAM,SAAS+nB,GAAUA,EAAOi3C,cAChCl5C,UAAU,GACX,CACC1kB,KAAM,WACNg6D,QAASA,EAAQ,UAAW,MAC5Bp7D,KAAM,SAAS6Y,GAAKA,EAAE4M,SAASmH,SAAS,GAAI,EAAI/T,EAAE4M,SAAS8L,YAAYD,aACvExL,UAAU,GACX,CACC1kB,KAAM,aACNg6D,QAASA,EAAQ,YAAa,MAC9Bp7D,KAAM,SAAS6Y,GAAKA,EAAE4M,SAASmH,SAAS,EAAG,EAAI/T,EAAE4M,SAAS8L,YAAYD,aACtExL,UAAU,GACX,CACC1kB,KAAM,kBACNg6D,QAAS,aACTp7D,KAAM,SAAS+nB,GAAUA,EAAOumC,eAAe3iB,mBAC/CgyB,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,gBACNg6D,QAAS,YACTp7D,KAAM,SAAS+nB,GAAUA,EAAOumC,eAAeziB,iBAC/C8xB,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,kBACNg6D,QAASA,EAAQ,aAAc,oBAC/Bp7D,KAAM,SAAS+nB,GAAUA,EAAOmW,SAAS0+B,gBAAgB70C,IACzDjC,UAAU,GACX,CACC1kB,KAAM,cACNg6D,QAASA,EAAQ,eAAgB,mBACjCp7D,KAAM,SAAS+nB,GAAUA,EAAOmW,SAASg/B,OAAOn1C,IAChDjC,UAAU,GACX,CACC1kB,KAAM,iBACNg6D,QAASA,EAAQ,SAAU,UAC3Bp7D,KAAM,SAAS+nB,GAAUA,EAAOk3C,kBAChCtB,kBAAmB,UACnBJ,eAAgB,UAChBz3C,UAAU,GACX,CACC1kB,KAAM,mBACNg6D,QAASA,EAAQ,eAAgB,gBACjCp7D,KAAM,SAAS+nB,GAAUA,EAAOk3C,gBAAe,IAC/CtB,kBAAmB,UACnBJ,eAAgB,UAChBz3C,UAAU,GACX,CACC1kB,KAAM,mBACNg6D,QAASA,EAAQ,eAAgB,gBACjCp7D,KAAM,SAAS+nB,GAAUA,EAAOk3C,gBAAe,GAAM,IACrDtB,kBAAmB,UACnBJ,eAAgB,UAChBz3C,UAAU,GACX,CACC1kB,KAAM,oBACNg6D,QAASA,EAAQ,KAAM,MACvBp7D,KAAM,aACNk/B,WAAW,EACXpZ,UAAU,GACX,CACC1kB,KAAM,OACNpB,KAAM,SAAS+nB,KAEfjC,UAAU,GAEd,CACI1kB,KAAM,MACNpB,KAAM,SAAS+nB,GACX,IAAI5C,EAAQ4C,EAAO4B,oBACnB5B,EAAO/B,MAAM,MAAOb,GAEf4C,EAAOxF,UAAUN,YAClB8F,EAAOxD,QAAQvgB,OAAOmhB,GACtB4C,EAAOlD,mBAGf04C,eAAgB,SAChBI,kBAAmB,WACpB,CACCv8D,KAAM,QACNpB,KAAM,SAAS+nB,EAAQ/lB,GACnB+lB,EAAOm3C,aAAal9D,IAExBu7D,eAAgB,UACjB,CACCn8D,KAAM,aACNg6D,QAASA,EAAQ,SAAU,aAC3Bp7D,KAAM,SAAS+nB,GAAUA,EAAOu6B,eAChCib,eAAgB,SAChBI,kBAAmB,eACpB,CACCv8D,KAAM,qBACNg6D,QAASA,EAAQ,eAAgB,mBACjCp7D,KAAM,SAAS+nB,GAAUA,EAAOo3C,sBAChC5B,eAAgB,SAChBI,kBAAmB,WACpB,CACCv8D,KAAM,YACNg6D,QAASA,EAAQ,aAAc,iBAC/Bp7D,KAAM,SAAS+nB,GAAUA,EAAOq3C,aAChC7B,eAAgB,YAChBI,kBAAmB,eACpB,CACCv8D,KAAM,gBACNg6D,QAASA,EAAQ,SAAU,aAC3Bp7D,KAAM,SAAS+nB,GAAUA,EAAO00B,sBAChCkhB,kBAAmB,cACnBJ,eAAgB,iBACjB,CACCn8D,KAAM,qBACNg6D,QAASA,EAAQ,eAAgB,mBACjCp7D,KAAM,SAAS+nB,GAAUA,EAAOg2B,sBAChC4f,kBAAmB,UACnBJ,eAAgB,iBACjB,CACCn8D,KAAM,iBACNg6D,QAASA,EAAQ,gBAAiB,gBAClCp7D,KAAM,SAAS+nB,GAAUA,EAAOs3C,aAAa,IAC7C9B,eAAgB,SAChBI,kBAAmB,WACpB,CACCv8D,KAAM,mBACNg6D,QAASA,EAAQ,kBAAmB,kBACpCp7D,KAAM,SAAS+nB,GAAUA,EAAOs3C,cAAc,IAC9C9B,eAAgB,SAChBI,kBAAmB,WACpB,CACCv8D,KAAM,UACNg6D,QAASA,EAAQ,SAAU,oBAC3Bp7D,KAAM,SAAS+nB,GACXsT,EAAOL,WAAW,oBAAqB,SAASniB,GAAIA,EAAE0gD,OAAOxxC,GAAQ,OAE1E,CACC3mB,KAAM,OACNg6D,QAASA,EAAQ,SAAU,aAC3Bp7D,KAAM,SAAS+nB,GAAUA,EAAO/C,SACjC,CACC5jB,KAAM,OACNg6D,QAASA,EAAQ,sBAAuB,6BACxCp7D,KAAM,SAAS+nB,GAAUA,EAAO8mC,SACjC,CACCztD,KAAM,cACNg6D,QAASA,EAAQ,eAAgB,qBACjCp7D,KAAM,SAAS+nB,GAAUA,EAAOu3C,eAChC/B,eAAgB,UACjB,CACCn8D,KAAM,cACNg6D,QAASA,EAAQ,SAAU,aAC3Bp7D,KAAM,SAAS+nB,GAAUA,EAAO+sC,eAChCyI,eAAgB,UACjB,CACCn8D,KAAM,gBACNg6D,QAASA,EAAQ,iBAAkB,uBACnCp7D,KAAM,SAAS+nB,GAAUA,EAAOw3C,iBAChChC,eAAgB,UACjB,CACCn8D,KAAM,gBACNg6D,QAASA,EAAQ,WAAY,eAC7Bp7D,KAAM,SAAS+nB,GAAUA,EAAOgtC,iBAChCwI,eAAgB,UACjB,CACCn8D,KAAM,MACNg6D,QAASA,EAAQ,SAAU,8BAC3Bp7D,KAAM,SAAS+nB,GAAUA,EAAO/jB,OAAO,UACvC25D,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,YACNg6D,QAASA,EACL,4BACA,mDAEJp7D,KAAM,SAAS+nB,GAAUA,EAAO/jB,OAAO,SACvC25D,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,gBACNg6D,QAASA,EAAQ,eAAgB,MACjCp7D,KAAM,SAAS+nB,GACX,IAAIA,EAAOxF,UAAUN,UAGjB,OAAO,EAFP8F,EAAO/jB,OAAO,SAKtB25D,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,oBACNg6D,QAASA,EAAQ,gBAAiB,qBAClCp7D,KAAM,SAAS+nB,GAAUA,EAAOy3C,qBAChC7B,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,kBACNg6D,QAASA,EAAQ,aAAc,yBAC/Bp7D,KAAM,SAAS+nB,GAAUA,EAAO03C,mBAChC9B,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,wBACNg6D,QAASA,EAAQ,uBAAwB,MACzCp7D,KAAM,SAAS+nB,GACX,IAAI5C,EAAQ4C,EAAOxF,UAAU2C,WAC7BC,EAAM5hB,MAAM6lB,OAAS,EACrBrB,EAAOxD,QAAQvgB,OAAOmhB,IAE1Bw4C,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,sBACNg6D,QAASA,EAAQ,oBAAqB,MACtCp7D,KAAM,SAAS+nB,GACX,IAAI5C,EAAQ4C,EAAOxF,UAAU2C,WAC7BC,EAAMmC,IAAI8B,OAASwrC,OAAOC,UAC1B9sC,EAAOxD,QAAQvgB,OAAOmhB,IAE1Bw4C,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,iBACNg6D,QAASA,EAAQ,iBAAkB,oCACnCp7D,KAAM,SAAS+nB,GAAUA,EAAO23C,kBAChC/B,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,kBACNg6D,QAASA,EAAQ,cAAe,cAChCp7D,KAAM,SAAS+nB,GAAUA,EAAO43C,mBAChChC,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,UACNg6D,QAASA,EAAQ,YAAa,aAC9Bp7D,KAAM,SAAS+nB,GAAUA,EAAO63C,gBAChCjC,kBAAmB,UACnBJ,eAAgB,iBACjB,CACCn8D,KAAM,SACNg6D,QAASA,EAAQ,MAAO,OACxBp7D,KAAM,SAAS+nB,GAAUA,EAAO4d,UAChCg4B,kBAAmB,UACnBJ,eAAgB,iBACjB,CACCn8D,KAAM,eACNg6D,QAASA,EAAQ,SAAU,UAC3Bp7D,KAAM,SAAS+nB,GAAUA,EAAO63C,gBAChCjC,kBAAmB,cACnBJ,eAAgB,iBACjB,CACCn8D,KAAM,cACNg6D,QAASA,EAAQ,SAAU,UAC3Bp7D,KAAM,SAAS+nB,GAAUA,EAAO83C,eAChClC,kBAAmB,cACnBJ,eAAgB,iBACjB,CACCn8D,KAAM,eACNpB,KAAM,SAAS+nB,EAAQ5mB,GAAO4mB,EAAOjkB,OAAO3C,IAC5Cw8D,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,aACNpB,KAAM,SAAS+nB,EAAQ/lB,GACnB+lB,EAAOjkB,OAAOsc,EAAK/B,aAAarc,EAAK2e,MAAS,GAAI3e,EAAKk8D,OAAS,KAEpEP,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,YACNg6D,QAASA,EAAQ,KAAM,UACvBp7D,KAAM,SAAS+nB,GAAUA,EAAO+3C,aAChCnC,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,mBACNg6D,QAASA,EAAQ,cAAe,UAChCp7D,KAAM,SAAS+nB,GAAUA,EAAOg4C,oBAChCpC,kBAAmB,SAAS51C,GAASA,EAAOi4C,oBAAoB,IAChEzC,eAAgB,UACjB,CACCn8D,KAAM,cACNg6D,QAASA,EAAQ,SAAU,UAC3Bp7D,KAAM,SAAS+nB,GAAUA,EAAOuS,eAChCqjC,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,cACNg6D,QAASA,EAAQ,eAAgB,gBACjCp7D,KAAM,SAAS+nB,GAAUA,EAAO5S,eAChCwoD,kBAAmB,UACnBJ,eAAgB,UACjB,CACCn8D,KAAM,eACNg6D,QAASA,EAAQ,eAAgB,mBACjCp7D,KAAM,SAAS+nB,GACX,IAAI5C,EAAQ4C,EAAOxF,UAAU2C,WAE7BC,EAAM5hB,MAAM6lB,OAASjE,EAAMmC,IAAI8B,OAAS,EACxCjE,EAAMmC,IAAI4B,MACVnB,EAAOxF,UAAU6C,SAASD,GAAO,IAErCw4C,kBAAmB,UACnBJ,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,YACNg6D,QAASA,EAAQ,KAAM,MACvBp7D,KAAM,SAAS+nB,GASX,IARA,IAAIgjB,EAAchjB,EAAOxF,UAAUwoB,cAC/B5oB,EAAiB4oB,EAAchjB,EAAOxF,UAAUooB,mBAAqB5iB,EAAOxF,UAAUmoB,qBACtFtoB,EAAe2oB,EAAchjB,EAAOxF,UAAUmoB,qBAAuB3iB,EAAOxF,UAAUooB,mBACtFs1B,EAAkBl4C,EAAOxD,QAAQ/a,IAAIm0B,QAAQxb,EAAe+G,KAAKjsB,OACjEijE,EAAen4C,EAAOxD,QAAQ/a,IAAI6pB,aAAatL,EAAOxF,UAAU2C,YAChEi7C,EAAgBD,EAAa/gE,QAAQ,QAAS,KAAKlC,OACnDmjE,EAAar4C,EAAOxD,QAAQ/a,IAAIm0B,QAAQxb,EAAe+G,KAElD/qB,EAAIgkB,EAAe+G,IAAM,EAAG/qB,GAAKikB,EAAa8G,IAAM,EAAG/qB,IAAK,CACjE,IAAIkiE,EAAUjgD,EAAK7B,eAAe6B,EAAK5B,gBAAgBuJ,EAAOxD,QAAQ/a,IAAIm0B,QAAQx/B,KAC3D,IAAnBkiE,EAAQpjE,SACRojE,EAAU,IAAMA,GAEpBD,GAAcC,EAGdj+C,EAAa8G,IAAM,EAAKnB,EAAOxD,QAAQ/a,IAAImlB,YAAc,IACzDyxC,GAAcr4C,EAAOxD,QAAQ/a,IAAIi4C,uBAGrC15B,EAAOlD,iBACPkD,EAAOxD,QAAQ/a,IAAIrK,QAAQ,IAAI4oC,EAAM5lB,EAAe+G,IAAK,EAAG9G,EAAa8G,IAAM,EAAG,GAAIk3C,GAElFD,EAAgB,GAChBp4C,EAAOxF,UAAUuoB,aAAa3oB,EAAe+G,IAAK/G,EAAeiH,QACjErB,EAAOxF,UAAU+M,SAASnN,EAAe+G,IAAK/G,EAAeiH,OAAS+2C,KAEtEF,EAAkBl4C,EAAOxD,QAAQ/a,IAAIm0B,QAAQxb,EAAe+G,KAAKjsB,OAASgjE,EAAmBA,EAAkB,EAAKA,EACpHl4C,EAAOxF,UAAUuoB,aAAa3oB,EAAe+G,IAAK+2C,KAG1DtC,kBAAmB,UACnB73C,UAAU,GACX,CACC1kB,KAAM,kBACNg6D,QAASA,EAAQ,KAAM,MACvBp7D,KAAM,SAAS+nB,GACX,IAAImgB,EAASngB,EAAOxD,QAAQ/a,IAAImlB,YAAc,EAC1CqY,EAASjf,EAAOxD,QAAQ/a,IAAIm0B,QAAQuK,GAAQjrC,OAC5CyyC,EAAS3nB,EAAOxF,UAAUstB,UAAUH,OACpC4wB,EAAY,GACZ5wB,EAAOzyC,OAAS,IAChByyC,EAAS,CAAC3nB,EAAOxF,UAAU2C,aAG/B,IAAK,IAAI/mB,EAAI,EAAGA,EAAIuxC,EAAOzyC,OAAQkB,IAC3BA,GAAMuxC,EAAOzyC,OAAS,IAChByyC,EAAOvxC,GAAGmpB,IAAI4B,MAAQgf,GAAUwH,EAAOvxC,GAAGmpB,IAAI8B,SAAW4d,GAC3Ds5B,EAAU/hE,KAAK,IAAIwpC,EAAM2H,EAAOvxC,GAAGmpB,IAAI4B,IAAKwmB,EAAOvxC,GAAGmpB,IAAI8B,OAAQ8e,EAAQlB,KAIxE,IAAN7oC,EAC8B,IAAxBuxC,EAAOvxC,GAAGoF,MAAM2lB,KAAwC,IAA3BwmB,EAAOvxC,GAAGoF,MAAM6lB,QAC/Ck3C,EAAU/hE,KAAK,IAAIwpC,EAAM,EAAG,EAAG2H,EAAOvxC,GAAGoF,MAAM2lB,IAAKwmB,EAAOvxC,GAAGoF,MAAM6lB,SAGxEk3C,EAAU/hE,KAAK,IAAIwpC,EAAM2H,EAAOvxC,EAAE,GAAGmpB,IAAI4B,IAAKwmB,EAAOvxC,EAAE,GAAGmpB,IAAI8B,OAAQsmB,EAAOvxC,GAAGoF,MAAM2lB,IAAKwmB,EAAOvxC,GAAGoF,MAAM6lB,SAInHrB,EAAOw4C,sBACPx4C,EAAOlD,iBAEP,IAAQ1mB,EAAI,EAAGA,EAAImiE,EAAUrjE,OAAQkB,IACjC4pB,EAAOxF,UAAUwtB,SAASuwB,EAAUniE,IAAI,IAGhD2nB,UAAU,EACVy3C,eAAgB,WAKpBz9D,IAAIlD,OAAO,aAAa,CAAC,UAAU,UAAU,SAAS,yBAAyB,cAAc,cAAc,eAAe,oBAAoB,yBAAyB,0BAA0B,yBAAyB,0BAA0B,mBAAmB,aAAa,YAAY,wBAAwB,+BAA+B,gCAAgC,aAAa,sBAAuB,SAAS0B,EAAUc,EAASvC,GACvb,aAEAyB,EAAS,wBAET,IAAImQ,EAAMnQ,EAAS,aACf6hB,EAAM7hB,EAAS,aACf8hB,EAAO9hB,EAAS,cAChBwZ,EAAYxZ,EAAS,mBACrBmiB,EAAYniB,EAAS,wBAAwBmiB,UAC7C6a,EAAeh9B,EAAS,yBAAyBg9B,aACjD4B,EAAc5+B,EAAS,wBAAwB4+B,YAC/CY,EAAax/B,EAAS,yBAAyBw/B,WAC/C4uB,EAAcpuD,EAAS,kBAAkBouD,YACzC6M,EAASj7D,EAAS,YAAYi7D,OAC9BxxB,EAAQzpC,EAAS,WAAWypC,MAC5B5R,EAAe73B,EAAS,uBAAuB63B,aAC/CsmC,EAAiBn+D,EAAS,8BAA8Bm+D,eACxD+D,EAAkBliE,EAAS,+BAA+B4/B,SAC1D7C,EAAS/8B,EAAS,YAClB02C,EAAgB12C,EAAS,oBAAoB02C,cAC7CyrB,EAAS,SAASh7C,EAAUlB,GAC5B,IAAI8B,EAAYZ,EAASi7C,sBACzBjkE,KAAK4pB,UAAYA,EACjB5pB,KAAKgpB,SAAWA,EAChBhpB,KAAK6C,GAAK,YAAcmhE,EAAOxT,KAE/BxwD,KAAKyhC,SAAW,IAAIu+B,EAAe3kD,EAAU3B,MAAQ,MAAQ,MAAOqqD,GAC7C,iBAAZ/4D,WACPhL,KAAKoqB,UAAa,IAAIpG,EAAUgF,EAASk7C,uBAAwBlkE,MACjEA,KAAKgpB,SAASm7C,SAAWnkE,KAAKoqB,UAAUjB,aACxCnpB,KAAKokE,cAAgB,IAAIvlC,EAAa7+B,MACtC,IAAIygC,EAAYzgC,OAGpBA,KAAKqkE,WAAa,IAAIhjC,EAAWrhC,MAEjCA,KAAKotB,gBAAkB,EACvBptB,KAAKskE,SAAU,IAAIxH,GAAS/yD,IAAI,CAC5B2yD,MAAM,IAGV18D,KAAKukE,gBAAkBvkE,KAAKukE,gBAAgBp/D,KAAKnF,MACjDA,KAAKyhC,SAASxZ,GAAG,OAAQjoB,KAAKukE,iBAE9BvkE,KAAKwkE,0BAELxkE,KAAKykE,iBAAmB9gD,EAAKL,YAAY,WACrCtjB,KAAKuyB,QAAQ,QAAS,IAClBvyB,KAAK8nB,SAAW9nB,KAAK8nB,QAAQ6oC,aAC7B3wD,KAAK8nB,QAAQ6oC,YAAY1I,iBAC/B9iD,KAAKnF,OAEPA,KAAKioB,GAAG,SAAU,SAASsR,EAAG/V,GAC1BA,EAAMihD,iBAAiBrhD,SAAS,MAGpCpjB,KAAK0kE,WAAW58C,GAAW,IAAImoC,EAAY,KAC3CrxB,EAAO3C,aAAaj8B,MACpB4+B,EAAOrM,QAAQ,SAAUvyB,OAG7BgkE,EAAOxT,KAAO,EAEd,WAEIx+C,EAAIF,UAAU9R,KAAM05B,GAEpB15B,KAAKwkE,wBAA0B,WAG3BxkE,KAAKyqC,WAAa,GAClBzqC,KAAKyhC,SAASxZ,GAAG,OAAQjoB,KAAK2kE,eAAex/D,KAAKnF,OAAO,GACzDA,KAAKyhC,SAASxZ,GAAG,YAAajoB,KAAK4kE,aAAaz/D,KAAKnF,OAAO,GAE5DA,KAAK6kE,cAAgBlhD,EAAKL,YAAYtjB,KAAK4kE,aAAaz/D,KAAKnF,OAE7DA,KAAKioB,GAAG,SAAU,WACdjoB,KAAK8kE,OAAS9kE,KAAK2kE,iBACnB3kE,KAAK8kE,MAAMC,YAAa,GAC1B5/D,KAAKnF,OAAO,GAEdA,KAAKioB,GAAG,kBAAmB,WACvBjoB,KAAK8kE,OAAS9kE,KAAK2kE,iBACnB3kE,KAAK8kE,MAAME,kBAAmB,GAChC7/D,KAAKnF,OAAO,IAGlBA,KAAK8kE,MAAQ,KACb9kE,KAAKilE,OAAS,GACdjlE,KAAK2kE,eAAiB,SAASO,GAC3B,GAAIllE,KAAK8kE,MAAO,CACZ,IAAKI,GAAellE,KAAK8kE,MAAMtiC,QAC3B,OACJxiC,KAAKilE,OAASjlE,KAAK8kE,MAElBI,IACDllE,KAAKmlE,gBAAkB,KACvBD,EAAc,IAGlBllE,KAAK6kE,cAAczhD,WACnBpjB,KAAK8kE,MAAQ,CACTtiC,QAAS0iC,EAAY1iC,SAAW,GAChCj9B,KAAM2/D,EAAY3/D,KAClBgL,UAAWvQ,KAAKgpB,SAASzY,WAEzBvQ,KAAK8kE,MAAMtiC,QAAQ79B,WAA8CvD,IAAtCpB,KAAK8kE,MAAMtiC,QAAQs+B,gBAC9C9gE,KAAKotB,mBAGbptB,KAAK4kE,aAAe,SAASxoD,GACzB,GAAIpc,KAAK8kE,MAAO,CACZ,GAAI1oD,IAAuB,IAAlBA,EAAEnZ,YACP,OAAOjD,KAAK8kE,MAAQ,KACxB9kE,KAAKuyB,QAAQ,sBACb,IAAIiQ,EAAUxiC,KAAK8kE,MAAMtiC,QACrBA,EAAQ79B,MAAQ3E,KAAKotB,gBAAkB,GACvCptB,KAAKotB,kBACT,IAAI0zC,EAAiBt+B,GAAWA,EAAQs+B,eACxC,GAAIA,EAAgB,CAChB,OAAQA,GACJ,IAAK,iBACDA,EAAiB,UACrB,IAAK,SACD9gE,KAAKgpB,SAASsF,qBAAqB,KAAM,IACzC,MACJ,IAAK,UACL,IAAK,SACDtuB,KAAKgpB,SAASsF,uBACd,MACJ,IAAK,gBACD,IAAI5F,EAAQ1oB,KAAK8lB,UAAU2C,WACvBmW,EAAS5+B,KAAKgpB,SAAS8L,aACvBpM,EAAM5hB,MAAM2lB,KAAOmS,EAAOgO,SAAWlkB,EAAMmC,IAAI4B,KAAOmS,EAAO+N,WAC7D3sC,KAAKgpB,SAASo8C,wBAAwBplE,KAAK8lB,UAAU8G,OAAQ5sB,KAAK8lB,UAAU0nB,MAEhF,MACJ,QACI,MAEc,WAAlBszB,GACA9gE,KAAKgpB,SAASq8C,iBAAiBrlE,KAAK8kE,MAAMv0D,WAGlDvQ,KAAKilE,OAASjlE,KAAK8kE,MACnB9kE,KAAK8kE,MAAQ,OAGrB9kE,KAAKslE,mBAAqB,CAAC,YAAa,MAAO,gBAC/CtlE,KAAKukE,gBAAkB,SAASnoD,GAC5B,GAAKpc,KAAKulE,iBAAV,CAGA,IAAIC,EAAOxlE,KAAKilE,OACZQ,EAAoBzlE,KAAKslE,mBACzBI,EAAcF,EAAKhjC,SAAYpmB,EAAEomB,QAAQ79B,MAAQ6gE,EAAKhjC,QAAQ79B,KAClE,GAAsB,gBAAlByX,EAAEomB,QAAQ79B,KAAwB,CAClC,IAAIuf,EAAO9H,EAAE7W,UACiBnE,IAA1BpB,KAAK2lE,mBACL3lE,KAAK2lE,kBAAmB,GAE5BD,EAAcA,GACP1lE,KAAK2lE,oBACH,KAAKliE,KAAKygB,IAAS,KAAKzgB,KAAK+hE,EAAKjgE,OAE3CvF,KAAK2lE,kBAAmB,OAExBD,EAAcA,IACwC,IAA/CD,EAAkBvjE,QAAQka,EAAEomB,QAAQ79B,MAIlB,UAAzB3E,KAAKulE,kBACFp5D,KAAKC,MAAQpM,KAAK4lE,kBAAoB,MAEzCF,GAAc,GAGdA,EACA1lE,KAAK8nB,QAAQoqC,iBAAkB,GACqB,IAA/CuT,EAAkBvjE,QAAQka,EAAEomB,QAAQ79B,QACzC3E,KAAK4lE,kBAAoBz5D,KAAKC,SAEtCpM,KAAK8hC,mBAAqB,SAAS+jC,EAAiB1/C,GAChD,GAAI0/C,GAA8C,kBAApBA,EAA8B,CACxD7lE,KAAK8lE,cAAgBD,EACrB,IAAIriD,EAAQxjB,KACZ4+B,EAAOL,WAAW,CAAC,aAAcsnC,GAAkB,SAASzlE,GACpDojB,EAAMsiD,eAAiBD,GACvBriD,EAAM6gD,WAAWviC,mBAAmB1hC,GAAUA,EAAO2lE,SACzD5/C,GAAMA,WAGVnmB,KAAK8lE,cAAgB,KACrB9lE,KAAKqkE,WAAWviC,mBAAmB+jC,GACnC1/C,GAAMA,KAGdnmB,KAAKmiC,mBAAqB,WACtB,OAAOniC,KAAKqkE,WAAWliC,sBAE3BniC,KAAK0kE,WAAa,SAAS58C,GACvB,GAAI9nB,KAAK8nB,SAAWA,EAApB,CAEI9nB,KAAK8kE,OAAO9kE,KAAK4kE,eACrB5kE,KAAK8kE,MAAQ,GAEb,IAAIkB,EAAahmE,KAAK8nB,QACtB,GAAIk+C,EAAY,CACZhmE,KAAK8nB,QAAQ4S,IAAI,SAAU16B,KAAKimE,mBAChCjmE,KAAK8nB,QAAQ4S,IAAI,aAAc16B,KAAK80D,eACpC90D,KAAK8nB,QAAQ4S,IAAI,kBAAmB16B,KAAKkmE,oBACzClmE,KAAK8nB,QAAQ4S,IAAI,gBAAiB16B,KAAKmmE,kBACvCnmE,KAAK8nB,QAAQ4S,IAAI,kBAAmB16B,KAAKomE,oBACzCpmE,KAAK8nB,QAAQ4S,IAAI,iBAAkB16B,KAAKqmE,mBACxCrmE,KAAK8nB,QAAQ4S,IAAI,aAAc16B,KAAKsmE,eACpCtmE,KAAK8nB,QAAQ4S,IAAI,oBAAqB16B,KAAKumE,sBAC3CvmE,KAAK8nB,QAAQ4S,IAAI,mBAAoB16B,KAAKwmE,qBAC1CxmE,KAAK8nB,QAAQ4S,IAAI,mBAAoB16B,KAAKymE,qBAC1CzmE,KAAK8nB,QAAQ4S,IAAI,mBAAoB16B,KAAK0mE,qBAC1C1mE,KAAK8nB,QAAQ4S,IAAI,kBAAmB16B,KAAK2mE,iBACzC3mE,KAAK8nB,QAAQ4S,IAAI,kBAAmB16B,KAAK4mE,oBACzC5mE,KAAK8nB,QAAQ4S,IAAI,mBAAoB16B,KAAK6mE,qBAE1C,IAAI/gD,EAAY9lB,KAAK8nB,QAAQ+pC,eAC7B/rC,EAAU4U,IAAI,eAAgB16B,KAAK2mE,iBACnC7gD,EAAU4U,IAAI,kBAAmB16B,KAAK8mE,oBAG1C9mE,KAAK8nB,QAAUA,EACXA,GACA9nB,KAAKimE,kBAAoBjmE,KAAK+mE,iBAAiB5hE,KAAKnF,MACpD8nB,EAAQG,GAAG,SAAUjoB,KAAKimE,mBAC1BjmE,KAAKgpB,SAAS07C,WAAW58C,GAEzB9nB,KAAK80D,cAAgB90D,KAAKgnE,aAAa7hE,KAAKnF,MAC5C8nB,EAAQG,GAAG,aAAcjoB,KAAK80D,eAE9B90D,KAAKkmE,mBAAqBlmE,KAAKinE,kBAAkB9hE,KAAKnF,MACtD8nB,EAAQG,GAAG,kBAAmBjoB,KAAKkmE,oBAEnClmE,KAAKmmE,iBAAmBnmE,KAAKgpB,SAASk+C,gBAAgB/hE,KAAKnF,KAAKgpB,UAChElB,EAAQG,GAAG,gBAAiBjoB,KAAKmmE,kBAEjCnmE,KAAKomE,mBAAqBpmE,KAAKmnE,kBAAkBhiE,KAAKnF,MACtD8nB,EAAQG,GAAG,kBAAmBjoB,KAAKomE,oBAEnCpmE,KAAKqmE,kBAAoBrmE,KAAKonE,iBAAiBjiE,KAAKnF,MACpD8nB,EAAQG,GAAG,iBAAkBjoB,KAAKqmE,mBAElCrmE,KAAKsmE,cAAgBtmE,KAAKywD,aAAatrD,KAAKnF,MAC5C8nB,EAAQG,GAAG,aAAcjoB,KAAKsmE,eAE9BtmE,KAAKumE,qBAAuBvmE,KAAKqnE,oBAAoBliE,KAAKnF,MAC1DA,KAAK8nB,QAAQG,GAAG,oBAAqBjoB,KAAKumE,sBAE1CvmE,KAAKwmE,oBAAsBxmE,KAAKsnE,mBAAmBniE,KAAKnF,MACxDA,KAAK8nB,QAAQG,GAAG,mBAAoBjoB,KAAKwmE,qBAEzCxmE,KAAKymE,oBAAsBzmE,KAAKunE,mBAAmBpiE,KAAKnF,MACxDA,KAAK8nB,QAAQG,GAAG,mBAAoBjoB,KAAKymE,qBAEzCzmE,KAAK0mE,oBAAsB1mE,KAAKwnE,mBAAmBriE,KAAKnF,MACxDA,KAAK8nB,QAAQG,GAAG,mBAAoBjoB,KAAK0mE,qBAEzC1mE,KAAK2mE,gBAAkB3mE,KAAKynE,eAAetiE,KAAKnF,MAChDA,KAAK8nB,QAAQG,GAAG,kBAAmBjoB,KAAK2mE,iBAExC3mE,KAAK4mE,mBAAqB5mE,KAAK0nE,kBAAkBviE,KAAKnF,MACtDA,KAAK8nB,QAAQG,GAAG,kBAAmBjoB,KAAK4mE,oBAExC5mE,KAAK6mE,oBAAsB7mE,KAAK2nE,mBAAmBxiE,KAAKnF,MACxDA,KAAK8nB,QAAQG,GAAG,mBAAoBjoB,KAAK6mE,qBAEzC7mE,KAAK8lB,UAAYgC,EAAQ+pC,eACzB7xD,KAAK8lB,UAAUmC,GAAG,eAAgBjoB,KAAK2mE,iBAEvC3mE,KAAK8mE,mBAAqB9mE,KAAK4nE,kBAAkBziE,KAAKnF,MACtDA,KAAK8lB,UAAUmC,GAAG,kBAAmBjoB,KAAK8mE,oBAE1C9mE,KAAKgnE,eAELhnE,KAAKotB,iBAAmB,EACxBptB,KAAKynE,iBACLznE,KAAKotB,iBAAmB,EAExBptB,KAAK0nE,oBACL1nE,KAAK2nE,qBACL3nE,KAAK4nE,oBACL5nE,KAAKqnE,sBACLrnE,KAAKsnE,qBACLtnE,KAAKunE,qBACLvnE,KAAKwnE,qBACLxnE,KAAK8nB,QAAQ8wC,kBAAoB54D,KAAKgpB,SAAS8vC,kBAC/C94D,KAAKgpB,SAAS6+C,eAEd7nE,KAAK8lB,UAAY,KACjB9lB,KAAKgpB,SAAS07C,WAAW58C,IAG7B9nB,KAAKuyB,QAAQ,gBAAiB,CAC1BzK,QAASA,EACTk+C,WAAYA,IAGhBhmE,KAAK8kE,MAAQ,KAEbkB,GAAcA,EAAWzzC,QAAQ,eAAgB,CAACu1C,UAAW9nE,OAC7D8nB,GAAWA,EAAQyK,QAAQ,eAAgB,CAACjH,OAAQtrB,OAEhD8nB,GAAWA,EAAQ6oC,aACnB7oC,EAAQ6oC,YAAY1I,kBAE5BjoD,KAAK+nE,WAAa,WACd,OAAO/nE,KAAK8nB,SAEhB9nB,KAAK6kD,SAAW,SAASx8B,EAAK2/C,GAU1B,OATAhoE,KAAK8nB,QAAQ/a,IAAI83C,SAASx8B,GAErB2/C,EAEiB,GAAbA,EACLhoE,KAAK0hE,mBACc,GAAdsG,GACLhoE,KAAKuhE,oBAJLvhE,KAAKimB,YAMFoC,GAEXroB,KAAK8kD,SAAW,WACZ,OAAO9kD,KAAK8nB,QAAQg9B,YAExB9kD,KAAK6xD,aAAe,WAChB,OAAO7xD,KAAK8lB,WAEhB9lB,KAAKioE,OAAS,SAAS3R,GACnBt2D,KAAKgpB,SAASk/C,SAAS5R,IAE3Bt2D,KAAKmoE,SAAW,SAASC,EAAOjiD,GAC5BnmB,KAAKgpB,SAASm/C,SAASC,EAAOjiD,IAElCnmB,KAAKqoE,SAAW,WACZ,OAAOroE,KAAKgpB,SAASq/C,YAEzBroE,KAAKkuB,SAAW,SAAS5f,GACrBtO,KAAKgpB,SAASkF,SAAS5f,IAE3BtO,KAAK8uB,WAAa,SAASxgB,GACvBtO,KAAKgpB,SAAS8F,WAAWxgB,IAE7BtO,KAAKsoE,YAAc,WACf,OAAOtoE,KAAKm7B,UAAU,aACnBzX,EAAI1U,cAAchP,KAAK4pB,UAAW,aAEzC5pB,KAAKuoE,YAAc,SAASp/B,GACxBnpC,KAAK+6B,UAAU,WAAYoO,IAG/BnpC,KAAKwoE,mBAAqB,WAMtB,GALIxoE,KAAK8nB,QAAQ2gD,oBACbzoE,KAAK8nB,QAAQoO,aAAal2B,KAAK8nB,QAAQ2gD,mBACvCzoE,KAAK8nB,QAAQ2gD,kBAAoB,OAGjCzoE,KAAK0oE,kBAAT,CAGA,IAAIpgE,EAAOtI,KACXA,KAAK0oE,mBAAoB,EACzBlpD,WAAW,WACPlX,EAAKogE,mBAAoB,EACzB,IAAI5gD,EAAUxf,EAAKwf,QACnB,GAAKA,GAAYA,EAAQ6oC,YAAzB,CACA,IAAI3pD,EAAM8gB,EAAQ8zB,oBAAoBtzC,EAAKwyC,qBAC3C,GAAI9zC,EACA,IAAI0hB,EAAQ,IAAI4iB,EAAMtkC,EAAIylB,IAAKzlB,EAAI2lB,OAAQ3lB,EAAIylB,IAAKzlB,EAAI2lB,OAAS,QAC9D,GAAI7E,EAAQm0B,MAAM0sB,YACjBjgD,EAAQZ,EAAQm0B,MAAM0sB,YAAYrgE,EAAKwf,SAE3CY,IACAZ,EAAQ2gD,kBAAoB3gD,EAAQ4N,UAAUhN,EAAO,cAAe,WACzE,MAEP1oB,KAAK4oE,eAAiB,WAClB,IAAI5oE,KAAK6oE,qBAAT,CAEA,IAAIvgE,EAAOtI,KACXA,KAAK6oE,sBAAuB,EAC5BrpD,WAAW,WACPlX,EAAKugE,sBAAuB,EAE5B,IAAI/gD,EAAUxf,EAAKwf,QACnB,GAAKA,GAAYA,EAAQ6oC,YAAzB,CAEA,IAAI3pD,EAAMsB,EAAKwyC,oBACX+B,EAAW,IAAItE,EAAcjwC,EAAKwf,QAAS9gB,EAAIylB,IAAKzlB,EAAI2lB,QACxD4nB,EAAQsI,EAAS1D,kBAErB,IAAK5E,IAAU,0BAA0B9wC,KAAK8wC,EAAM74B,MAGhD,OAFAoM,EAAQoO,aAAapO,EAAQghD,oBAC7BhhD,EAAQghD,cAAgB,MAI5B,IAAuC,GAAnCv0B,EAAM74B,KAAKxZ,QAAQ,cACnBqyC,EAAQsI,EAAS5D,cACZ1E,GAFT,CAMA,IAAIpnC,EAAMonC,EAAM7rC,MACZwlD,EAAQ,EACR6a,EAAYlsB,EAAS7D,eAEzB,GAAuB,KAAnB+vB,EAAUrgE,MACV,GACIqgE,EAAYx0B,EACZA,EAAQsI,EAAS5D,cAEb1E,GAASA,EAAM7rC,QAAUyE,IAA2C,IAApConC,EAAM74B,KAAKxZ,QAAQ,cAC3B,MAApB6mE,EAAUrgE,MACVwlD,IAC2B,OAApB6a,EAAUrgE,OACjBwlD,WAIH3Z,GAAS2Z,GAAS,OACxB,CACH,GACI3Z,EAAQw0B,EACRA,EAAYlsB,EAAS7D,eAEjBzE,GAASA,EAAM7rC,QAAUyE,IAA2C,IAApConC,EAAM74B,KAAKxZ,QAAQ,cAC3B,MAApB6mE,EAAUrgE,MACVwlD,IAC2B,OAApB6a,EAAUrgE,OACjBwlD,WAGH6a,GAAa7a,GAAS,GAC/BrR,EAAS5D,cAGb,IAAK1E,EAGD,OAFAzsB,EAAQoO,aAAapO,EAAQghD,oBAC7BhhD,EAAQghD,cAAgB,MAI5B,IAAIr8C,EAAMowB,EAASzD,qBACfzsB,EAASkwB,EAASxD,wBAClB3wB,EAAQ,IAAI4iB,EAAM7e,EAAKE,EAAQF,EAAKE,EAAO4nB,EAAM7rC,MAAMlI,QACvDwoE,EAAMlhD,EAAQuoC,aAAavoC,EAAQghD,eACnChhD,EAAQghD,oBAAwB1nE,GAAP4nE,GAAsD,IAAlCtgD,EAAMmjB,aAAam9B,EAAItgD,SACpEZ,EAAQoO,aAAapO,EAAQghD,eAC7BhhD,EAAQghD,cAAgB,MAGxBpgD,IAAUZ,EAAQghD,gBAClBhhD,EAAQghD,cAAgBhhD,EAAQ4N,UAAUhN,EAAO,cAAe,YACrE,MAEP1oB,KAAKolB,MAAQ,WACT,IAAI5B,EAAQxjB,KACZwf,WAAW,WACPgE,EAAM4G,UAAUhF,UAEpBplB,KAAKoqB,UAAUhF,SAEnBplB,KAAK+kB,UAAY,WACb,OAAO/kB,KAAKoqB,UAAUrF,aAE1B/kB,KAAKqlB,KAAO,WACRrlB,KAAKoqB,UAAU/E,QAEnBrlB,KAAKklB,QAAU,SAAS9I,GAChBpc,KAAKipE,aAETjpE,KAAKipE,YAAa,EAClBjpE,KAAKgpB,SAASkgD,aACdlpE,KAAKgpB,SAASmgD,iBACdnpE,KAAKupB,MAAM,QAASnN,KAExBpc,KAAKilB,OAAS,SAAS7I,GACdpc,KAAKipE,aAEVjpE,KAAKipE,YAAa,EAClBjpE,KAAKgpB,SAASogD,aACdppE,KAAKgpB,SAASqgD,gBACdrpE,KAAKupB,MAAM,OAAQnN,KAGvBpc,KAAKspE,cAAgB,WACjBtpE,KAAKgpB,SAASugD,gBAElBvpE,KAAK+mE,iBAAmB,SAAS1+B,GAC7B,IAAIq0B,EAAO18D,KAAK8nB,QAAQihB,aACpB6D,EAAWvE,EAAMvhC,MAAM2lB,KAAO4b,EAAMxd,IAAI4B,IAAM4b,EAAMxd,IAAI4B,IAAM2zB,IAClEpgD,KAAKgpB,SAASwgD,YAAYnhC,EAAMvhC,MAAM2lB,IAAKmgB,EAAS8vB,GAEpD18D,KAAKuyB,QAAQ,SAAU8V,GACvBroC,KAAKspE,gBACLtpE,KAAKypE,8BAGTzpE,KAAKinE,kBAAoB,SAAS7qD,GAC9B,IAAI+1B,EAAO/1B,EAAE6E,KACbjhB,KAAKgpB,SAASwgD,YAAYr3B,EAAK6V,MAAO7V,EAAK3wB,OAI/CxhB,KAAK0nE,kBAAoB,WACrB1nE,KAAKgpB,SAAS0gD,UAAU1pE,KAAK8nB,QAAQ6tC,iBAGzC31D,KAAK2nE,mBAAqB,WACtB3nE,KAAKgpB,SAAS2gD,UAAU3pE,KAAK8nB,QAAQguC,kBAEzC91D,KAAKynE,eAAiB,WAClBznE,KAAKspE,gBAEAtpE,KAAKotB,kBACNwR,EAAOvD,KAAK,kEACR,4CACA,iEAEJr7B,KAAKgpB,SAASsF,wBAGlBtuB,KAAKwoE,qBACLxoE,KAAK4oE,iBACL5oE,KAAKypE,6BACLzpE,KAAKuyB,QAAQ,oBAGjBvyB,KAAKypE,2BAA6B,WAC9B,IAEI1V,EAFAjsC,EAAU9nB,KAAK+nE,aAUnB,GAPI/nE,KAAK4pE,uBACwB,QAAxB5pE,KAAK6pE,iBAA8B7pE,KAAK8lB,UAAUsJ,gBACnD2kC,EAAY/zD,KAAK86C,sBACjB96C,KAAKgpB,SAAS8gD,WAA0C,IAA7B9pE,KAAK8nB,QAAQoK,aAAuBlyB,KAAKgpB,SAAS+gD,UAAY,IACzFhW,GAAY,IAGhBjsC,EAAQkiD,uBAAyBjW,EACjCjsC,EAAQoO,aAAapO,EAAQkiD,qBAAqBnnE,IAClDilB,EAAQkiD,qBAAuB,UAC5B,IAAKliD,EAAQkiD,sBAAwBjW,EAAW,CACnD,IAAIrrC,EAAQ,IAAI4iB,EAAMyoB,EAAUtnC,IAAKsnC,EAAUpnC,OAAQonC,EAAUtnC,IAAK2zB,KACtE13B,EAAM7lB,GAAKilB,EAAQ4N,UAAUhN,EAAO,kBAAmB,cACvDZ,EAAQkiD,qBAAuBthD,OACxBqrC,IACPjsC,EAAQkiD,qBAAqBljE,MAAM2lB,IAAMsnC,EAAUtnC,IACnD3E,EAAQkiD,qBAAqBn/C,IAAI4B,IAAMsnC,EAAUtnC,IACjD3E,EAAQkiD,qBAAqBljE,MAAM6lB,OAASonC,EAAUpnC,OACtD7E,EAAQyK,QAAQ,sBAIxBvyB,KAAK4nE,kBAAoB,SAASxrD,GAC9B,IAAI0L,EAAU9nB,KAAK8nB,QAOnB,GALIA,EAAQmiD,kBACRniD,EAAQoO,aAAapO,EAAQmiD,kBAEjCniD,EAAQmiD,iBAAmB,KAEtBjqE,KAAK8lB,UAAUN,UAKhBxlB,KAAKypE,iCALsB,CAC3B,IAAI/gD,EAAQ1oB,KAAK8lB,UAAU2C,WACvBna,EAAQtO,KAAK21B,oBACjB7N,EAAQmiD,iBAAmBniD,EAAQ4N,UAAUhN,EAAO,gBAAiBpa,GAKzE,IAAI6vB,EAAKn+B,KAAKkqE,wBAA0BlqE,KAAKmqE,+BAC7CnqE,KAAK8nB,QAAQisC,UAAU51B,GAEvBn+B,KAAKuyB,QAAQ,oBAGjBvyB,KAAKmqE,6BAA+B,WAChC,IAAIriD,EAAU9nB,KAAK8nB,QAEfhC,EAAY9lB,KAAKktB,oBACrB,IAAIpH,EAAUN,YAAaM,EAAUsJ,cAArC,CAGA,IAAIg7C,EAAatkD,EAAUhf,MAAM6lB,OAAS,EACtC09C,EAAWvkD,EAAU+E,IAAI8B,OAAS,EAClC+a,EAAO5f,EAAQoZ,QAAQpb,EAAUhf,MAAM2lB,KACvC69C,EAAW5iC,EAAKlnC,OAChBw8D,EAASt1B,EAAKhhB,UAAUxf,KAAKC,IAAIijE,EAAY,GACrBljE,KAAKM,IAAI6iE,EAAUC,IAC/C,KAAKF,GAAc,GAAK,UAAU3mE,KAAKu5D,IAClCqN,GAAYC,GAAY,UAAU7mE,KAAKu5D,MAG5CA,EAASt1B,EAAKhhB,UAAUZ,EAAUhf,MAAM6lB,OAAQ7G,EAAU+E,IAAI8B,QACzD,YAAYlpB,KAAKu5D,IAAtB,CAGA,IAAI7+B,EAAKn+B,KAAKskE,QAAQ5G,gBAAgB,CAClCM,WAAW,EACXE,eAAe,EACflB,OAAQA,IAGZ,OAAO7+B,KAIXn+B,KAAKqnE,oBAAsB,WACvBrnE,KAAKgpB,SAASuhD,sBAGlBvqE,KAAKsnE,mBAAqB,WACtBtnE,KAAKgpB,SAASwhD,qBAIlBxqE,KAAKunE,mBAAqB,WACtBvnE,KAAKgpB,SAASyhD,qBAGlBzqE,KAAKwnE,mBAAqB,WACtBxnE,KAAKgpB,SAASkrC,eAAel0D,KAAK8nB,QAAQssC,mBAI9Cp0D,KAAKgnE,aAAe,SAAS5qD,GACzBpc,KAAKgpB,SAAS0hD,aACd1qE,KAAKupB,MAAM,aAAcnN,IAI7Bpc,KAAKmnE,kBAAoB,WACrBnnE,KAAKgpB,SAAS6+C,cAGlB7nE,KAAKonE,iBAAmB,WACpBpnE,KAAKgpB,SAASk/C,UAAS,IAI3BloE,KAAKywD,aAAe,WAChBzwD,KAAKypE,6BACLzpE,KAAKgpB,SAAS6+C,cAElB7nE,KAAK2qE,gBAAkB,WACnB,OAAO3qE,KAAK8nB,QAAQ8O,aAAa52B,KAAKktB,sBAE1CltB,KAAKqnB,YAAc,WACf,IAAInD,EAAOlkB,KAAK2qE,kBAEhB,OADA3qE,KAAKuyB,QAAQ,OAAQrO,GACdA,GAEXlkB,KAAKunB,OAAS,WACVvnB,KAAKyhC,SAASl+B,KAAK,OAAQvD,OAE/BA,KAAKsnB,MAAQ,WACTtnB,KAAKyhC,SAASl+B,KAAK,MAAOvD,OAE9BA,KAAKumB,QAAU,SAASrC,EAAMpI,GAC1B,IAAIM,EAAI,CAAC8H,KAAMA,EAAMpI,MAAOA,GAC5B9b,KAAKyhC,SAASl+B,KAAK,QAASvD,KAAMoc,IAGtCpc,KAAKyiE,aAAe,SAASrmD,GACT,iBAALA,IACPA,EAAI,CAAC8H,KAAM9H,IACfpc,KAAKuyB,QAAQ,QAASnW,GACtB,IAAI8H,EAAO9H,EAAE8H,KACb,IAAKlkB,KAAKwtB,mBAAqBxtB,KAAK4qE,uBAChC5qE,KAAKqH,OAAO6c,OACT,CACH,IAAIokB,EAAQpkB,EAAK9hB,MAAM,cACnB6wC,EAASjzC,KAAK8lB,UAAUstB,UAAUH,OAEtC,GAAI3K,EAAM9nC,OAASyyC,EAAOzyC,QAAU8nC,EAAM9nC,OAAS,IAAM8nC,EAAM,GAC3D,OAAOtoC,KAAKyhC,SAASl+B,KAAK,eAAgBvD,KAAMkkB,GAEpD,IAAK,IAAIxiB,EAAIuxC,EAAOzyC,OAAQkB,KAAM,CAC9B,IAAIgnB,EAAQuqB,EAAOvxC,GACdgnB,EAAMlD,WACPxlB,KAAK8nB,QAAQvgB,OAAOmhB,GAExB1oB,KAAK8nB,QAAQzgB,OAAOqhB,EAAM5hB,MAAOwhC,EAAM5mC,OAKnD1B,KAAKymB,YAAc,SAAS+b,EAASj9B,GACjC,OAAOvF,KAAKyhC,SAASl+B,KAAKi/B,EAASxiC,KAAMuF,IAE7CvF,KAAKqH,OAAS,SAAS6c,EAAMS,GACzB,IAAImD,EAAU9nB,KAAK8nB,QACfuwB,EAAOvwB,EAAQytC,UACf/oC,EAASxsB,KAAK86C,oBAElB,GAAI96C,KAAK6qE,yBAA2BlmD,EAAQ,CACxC,IAAImmD,EAAYzyB,EAAKmK,gBAAgB16B,EAAQqgC,SAAS37B,EAAOC,KAAM,YAAazsB,KAAM8nB,EAAS5D,GAC3F4mD,IACI5mD,IAAS4mD,EAAU5mD,OACnBlkB,KAAK8nB,QAAQoqC,iBAAkB,EAC/BlyD,KAAK+qE,mBAAoB,GAE7B7mD,EAAO4mD,EAAU5mD,MAOzB,GAFY,MAARA,IACAA,EAAOlkB,KAAK8nB,QAAQi0B,gBACnB/7C,KAAK8lB,UAAUN,WAKf,GAAIxlB,KAAK8nB,QAAQkrC,iBAAyC,GAAvB9uC,EAAKhiB,QAAQ,MAAa,CAC1DwmB,EAAQ,IAAI4iB,EAAMuB,WAAWrgB,EAAQA,GACzC9D,EAAMmC,IAAI8B,QAAUzI,EAAK1jB,OACzBR,KAAK8nB,QAAQvgB,OAAOmhB,QARO,CAC3B,IAAIA,EAAQ1oB,KAAKktB,oBACjBV,EAASxsB,KAAK8nB,QAAQvgB,OAAOmhB,GAC7B1oB,KAAKooB,iBAQT,GAAY,MAARlE,GAAwB,QAARA,EAAgB,CAChC,IAAIwjB,EAAO5f,EAAQoZ,QAAQ1U,EAAOC,KAClC,GAAID,EAAOG,OAAS+a,EAAK4J,OAAO,QAAS,CACrC,IAAI05B,EAAItjC,EAAKlhB,OAAOgG,EAAOG,QAAQ2kB,OAAO,QAC1CxpB,EAAQ/a,IAAI2zC,aAAal0B,EAAOC,IAAKD,EAAOG,OAAQH,EAAOG,OAASq+C,IAG5EhrE,KAAKooB,iBAEL,IAAIthB,EAAQ0lB,EAAOG,OACfs+C,EAAYnjD,EAAQqgC,SAAS37B,EAAOC,KAEpCy+C,GADAxjC,EAAO5f,EAAQoZ,QAAQ1U,EAAOC,KACd4rB,EAAKwJ,aAAaopB,EAAWvjC,EAAMxjB,IAC7C4D,EAAQzgB,OAAOmlB,EAAQtI,GAgBjC,GAdI4mD,GAAaA,EAAUhlD,YACW,GAA9BglD,EAAUhlD,UAAUtlB,OACpBR,KAAK8lB,UAAUF,kBACX,IAAI0lB,EAAM9e,EAAOC,IAAK3lB,EAAQgkE,EAAUhlD,UAAU,GACxC0G,EAAOC,IAAK3lB,EAAQgkE,EAAUhlD,UAAU,KAEtD9lB,KAAK8lB,UAAUF,kBACX,IAAI0lB,EAAM9e,EAAOC,IAAMq+C,EAAUhlD,UAAU,GACjCglD,EAAUhlD,UAAU,GACpB0G,EAAOC,IAAMq+C,EAAUhlD,UAAU,GACjCglD,EAAUhlD,UAAU,MAItCgC,EAAQylB,cAAciY,UAAUthC,GAAO,CACvC,IAAIinD,EAAa9yB,EAAKsJ,kBAAkBspB,EAAWvjC,EAAKnlC,MAAM,EAAGiqB,EAAOG,QAAS7E,EAAQi0B,gBAEzFj0B,EAAQzgB,OAAO,CAAColB,IAAKD,EAAOC,IAAI,EAAGE,OAAQ,GAAIw+C,GAE/CD,GACA7yB,EAAK0J,YAAYkpB,EAAWnjD,EAAS0E,EAAOC,MAGpDzsB,KAAK2mB,YAAc,SAASzC,GACxBlkB,KAAKqkE,WAAW19C,YAAYzC,IAGhClkB,KAAKynB,aAAe,SAASrL,EAAG0D,EAAQ5G,GACpClZ,KAAKqkE,WAAW58C,aAAarL,EAAG0D,EAAQ5G,IAE5ClZ,KAAK8yD,aAAe,SAASC,GACzB/yD,KAAK8nB,QAAQgrC,aAAaC,IAE9B/yD,KAAKgzD,aAAe,WAChB,OAAOhzD,KAAK8nB,QAAQkrC,gBAExBhzD,KAAKizD,gBAAkB,WACnBjzD,KAAK8nB,QAAQmrC,mBAEjBjzD,KAAKorE,eAAiB,SAASn7C,GAC3BjwB,KAAK+6B,UAAU,cAAe9K,IAElCjwB,KAAKqrE,eAAiB,WAClB,OAAOrrE,KAAKm7B,UAAU,gBAE1Bn7B,KAAKsrE,aAAe,SAASjrC,GACzBrgC,KAAK+6B,UAAU,YAAasF,IAEhCrgC,KAAK+3B,aAAe,WAChB,OAAO/3B,KAAKm7B,UAAU,cAE1Bn7B,KAAKurE,kBAAoB,SAASljD,GAC9BroB,KAAK+6B,UAAU,iBAAkB1S,IAErCroB,KAAK21B,kBAAoB,WACrB,OAAO31B,KAAKm7B,UAAU,mBAE1Bn7B,KAAKwrE,uBAAyB,SAASC,GACnCzrE,KAAK+6B,UAAU,sBAAuB0wC,IAE1CzrE,KAAK0rE,uBAAyB,WAC1B,OAAO1rE,KAAKm7B,UAAU,wBAE1Bn7B,KAAK2rE,uBAAyB,SAASF,GACnCzrE,KAAK+6B,UAAU,sBAAuB0wC,IAG1CzrE,KAAK4rE,uBAAyB,WAC1B,OAAO5rE,KAAKm7B,UAAU,wBAE1Bn7B,KAAK6rE,yBAA2B,SAASJ,GACrCzrE,KAAK+6B,UAAU,wBAAyB0wC,IAE5CzrE,KAAK8rE,yBAA2B,WAC5B,OAAO9rE,KAAKkqE,wBAGhBlqE,KAAK+rE,kBAAoB,SAASC,GAC9BhsE,KAAKgpB,SAAS+iD,kBAAkBC,IAGpChsE,KAAKisE,kBAAoB,WACrB,OAAOjsE,KAAKgpB,SAASijD,qBAEzBjsE,KAAK8pC,kBAAoB,SAAStC,GAC9BxnC,KAAKgpB,SAAS8gB,kBAAkBtC,IAEpCxnC,KAAK6pC,kBAAoB,WACrB,OAAO7pC,KAAKgpB,SAAS6gB,qBAGzB7pC,KAAKksE,uBAAyB,SAASz8D,GACnCzP,KAAKgpB,SAASkjD,uBAAuBz8D,IAGzCzP,KAAKmsE,uBAAyB,WAC1B,OAAOnsE,KAAKgpB,SAASmjD,0BAEzBnsE,KAAKosE,mBAAqB,SAASC,GAC/BrsE,KAAKgpB,SAASojD,mBAAmBC,IAErCrsE,KAAKssE,mBAAqB,WACtB,OAAOtsE,KAAKgpB,SAASsjD,sBAEzBtsE,KAAKusE,qBAAuB,SAASF,GACjCrsE,KAAKgpB,SAASujD,qBAAqBF,IAEvCrsE,KAAKwsE,qBAAuB,WACxB,OAAOxsE,KAAKgpB,SAASwjD,wBAEzBxsE,KAAKopB,YAAc,SAASC,GACxBrpB,KAAK+6B,UAAU,WAAY1R,IAE/BrpB,KAAKo2B,YAAc,WACf,OAAOp2B,KAAKm7B,UAAU,aAE1Bn7B,KAAKysE,qBAAuB,SAAUC,GAClC1sE,KAAK+6B,UAAU,oBAAqB2xC,IAExC1sE,KAAK6qE,qBAAuB,WACxB,OAAO7qE,KAAKm7B,UAAU,sBAE1Bn7B,KAAK2sE,yBAA2B,SAAUD,GACtC1sE,KAAK+6B,UAAU,wBAAyB2xC,IAE5C1sE,KAAK+6C,yBAA2B,WAC5B,OAAO/6C,KAAKm7B,UAAU,0BAE1Bn7B,KAAK4sE,mBAAqB,SAAS77C,GAC/B/wB,KAAK+6B,UAAU,kBAAmBhK,IAGtC/wB,KAAK6sE,mBAAqB,WACtB,OAAO7sE,KAAKm7B,UAAU,oBAG1Bn7B,KAAK8sE,mBAAqB,SAASC,GAC/B/sE,KAAK+6B,UAAU,kBAAmBgyC,IAGtC/sE,KAAKgtE,mBAAqB,WACtB,OAAOhtE,KAAKm7B,UAAU,oBAE1Bn7B,KAAKuH,OAAS,SAASm7B,GACf1iC,KAAK8lB,UAAUN,YACJ,QAAPkd,EACA1iC,KAAK8lB,UAAUkpB,aAEfhvC,KAAK8lB,UAAUgpB,eAGvB,IAAIpmB,EAAQ1oB,KAAKktB,oBACjB,GAAIltB,KAAK6qE,uBAAwB,CAC7B,IAAI/iD,EAAU9nB,KAAK8nB,QACfuQ,EAAQvQ,EAAQqgC,SAASz/B,EAAM5hB,MAAM2lB,KACrCwgD,EAAYnlD,EAAQytC,UAAU/S,gBAAgBnqB,EAAO,WAAYr4B,KAAM8nB,EAASY,GAEpF,GAAyB,IAArBA,EAAMmC,IAAI8B,OAAc,CACxB,IAAIzI,EAAO4D,EAAQ8O,aAAalO,GAChC,GAA6B,MAAzBxE,EAAKA,EAAK1jB,OAAS,GAAY,CAC/B,IAAIknC,EAAO5f,EAAQoZ,QAAQxY,EAAMmC,IAAI4B,KACjC,QAAQhpB,KAAKikC,KACbhf,EAAMmC,IAAI8B,OAAS+a,EAAKlnC,SAIhCysE,IACAvkD,EAAQukD,GAGhBjtE,KAAK8nB,QAAQvgB,OAAOmhB,GACpB1oB,KAAKooB,kBAETpoB,KAAKkjE,gBAAkB,WACfljE,KAAK8lB,UAAUN,WACfxlB,KAAK8lB,UAAU4pB,kBAEnB1vC,KAAK8nB,QAAQvgB,OAAOvH,KAAKktB,qBACzBltB,KAAKooB,kBAETpoB,KAAKijE,eAAiB,WACdjjE,KAAK8lB,UAAUN,WACfxlB,KAAK8lB,UAAU8pB,iBAEnB5vC,KAAK8nB,QAAQvgB,OAAOvH,KAAKktB,qBACzBltB,KAAKooB,kBAETpoB,KAAK+iE,kBAAoB,WACjB/iE,KAAK8lB,UAAUN,WACfxlB,KAAK8lB,UAAUopB,kBAEnBlvC,KAAK8nB,QAAQvgB,OAAOvH,KAAKktB,qBACzBltB,KAAKooB,kBAETpoB,KAAKgjE,gBAAkB,WACfhjE,KAAK8lB,UAAUN,WACfxlB,KAAK8lB,UAAUspB,gBAEnB,IAAI1mB,EAAQ1oB,KAAKktB,oBACbxE,EAAM5hB,MAAM6lB,QAAUjE,EAAMmC,IAAI8B,QAAUjE,EAAM5hB,MAAM2lB,KAAO/D,EAAMmC,IAAI4B,MACvE/D,EAAMmC,IAAI8B,OAAS,EACnBjE,EAAMmC,IAAI4B,OAGdzsB,KAAK8nB,QAAQvgB,OAAOmhB,GACpB1oB,KAAKooB,kBAETpoB,KAAKqjE,UAAY,WACRrjE,KAAK8lB,UAAUN,YAChBxlB,KAAK8nB,QAAQvgB,OAAOvH,KAAKktB,qBACzBltB,KAAKooB,kBAGT,IAAIoE,EAASxsB,KAAK86C,oBAClB96C,KAAKqH,OAAO,MACZrH,KAAK20B,qBAAqBnI,IAE9BxsB,KAAKsjE,iBAAmB,WACpB,GAAKtjE,KAAK8lB,UAAUN,UAApB,CAIA,IAAIgH,EAASxsB,KAAK86C,oBACdnuB,EAASH,EAAOG,OACpB,GAAe,IAAXA,EAAJ,CAGA,IACIugD,EAAMxkD,EADNgf,EAAO1nC,KAAK8nB,QAAQoZ,QAAQ1U,EAAOC,KAEnCE,EAAS+a,EAAKlnC,QACd0sE,EAAOxlC,EAAKrlC,OAAOsqB,GAAU+a,EAAKrlC,OAAOsqB,EAAO,GAChDjE,EAAQ,IAAI4iB,EAAM9e,EAAOC,IAAKE,EAAO,EAAGH,EAAOC,IAAKE,EAAO,KAG3DugD,EAAOxlC,EAAKrlC,OAAOsqB,EAAO,GAAK+a,EAAKrlC,OAAOsqB,EAAO,GAClDjE,EAAQ,IAAI4iB,EAAM9e,EAAOC,IAAKE,EAAO,EAAGH,EAAOC,IAAKE,IAExD3sB,KAAK8nB,QAAQplB,QAAQgmB,EAAOwkD,GAC5BltE,KAAK8nB,QAAQhC,UAAUuH,eAAe3E,EAAMmC,QAEhD7qB,KAAK0Y,YAAc,WACf,IAAIy0D,EAAgBntE,KAAKktB,oBACrBltB,KAAK8lB,UAAUN,WACfxlB,KAAK8lB,UAAUgqB,aAGnB,IAAIpnB,EAAQ1oB,KAAKktB,oBACbhJ,EAAOlkB,KAAK8nB,QAAQ8O,aAAalO,GACrC1oB,KAAK8nB,QAAQplB,QAAQgmB,EAAOxE,EAAKxL,eACjC1Y,KAAK8lB,UAAUF,kBAAkBunD,IAErCntE,KAAK69B,YAAc,WACf,IAAIsvC,EAAgBntE,KAAKktB,oBACrBltB,KAAK8lB,UAAUN,WACfxlB,KAAK8lB,UAAUgqB,aAGnB,IAAIpnB,EAAQ1oB,KAAKktB,oBACbhJ,EAAOlkB,KAAK8nB,QAAQ8O,aAAalO,GACrC1oB,KAAK8nB,QAAQplB,QAAQgmB,EAAOxE,EAAK2Z,eACjC79B,KAAK8lB,UAAUF,kBAAkBunD,IAErCntE,KAAKkpC,OAAS,WACV,IAAIphB,EAAU9nB,KAAK8nB,QACfY,EAAQ1oB,KAAKktB,oBAEjB,KAAIxE,EAAM5hB,MAAM2lB,IAAM/D,EAAMmC,IAAI4B,KAAhC,CAIO,GAAI/D,EAAM5hB,MAAM6lB,OAASjE,EAAMmC,IAAI8B,OAAQ,CAC9C,IAAIzI,EAAO4D,EAAQ8O,aAAalO,GAChC,IAAK,QAAQjlB,KAAKygB,GAAO,CACjBiuB,EAAOnyC,KAAKotE,mBAEhB,YADAtlD,EAAQ6vC,WAAWxlB,EAAK6V,MAAO7V,EAAK3wB,KAAM,OAKlD,IAAIkmB,EAAO5f,EAAQoZ,QAAQxY,EAAM5hB,MAAM2lB,KACnC9c,EAAW+Y,EAAM5hB,MACjBqiC,EAAOrhB,EAAQ6oB,aACfhkB,EAAS7E,EAAQ0zC,uBAAuB7rD,EAAS8c,IAAK9c,EAASgd,QAEnE,GAAI3sB,KAAK8nB,QAAQy4B,iBACb,IAAI1+B,EAASsnB,EAAOxc,EAASwc,EACzByuB,EAAej0C,EAAK/B,aAAa,IAAKC,OACvC,CACCA,EAAQ8K,EAASwc,EACrB,MAAuC,KAAhCzB,EAAKhf,EAAM5hB,MAAM6lB,OAAS,IAAa9K,EAC1C6G,EAAM5hB,MAAM6lB,SACZ9K,IAEJ7hB,KAAK8lB,UAAUF,kBAAkB8C,GACjCkvC,EAAe,KAEnB,OAAO53D,KAAKqH,OAAOuwD,GA7Bf,IAAIzlB,EAAOnyC,KAAKotE,mBAChBtlD,EAAQ6vC,WAAWxlB,EAAK6V,MAAO7V,EAAK3wB,KAAM,OA8BlDxhB,KAAKojE,YAAc,WACf,IAAIjxB,EAAOnyC,KAAKotE,mBAChBptE,KAAK8nB,QAAQ6vC,WAAWxlB,EAAK6V,MAAO7V,EAAK3wB,KAAM,OAEnDxhB,KAAKmjE,aAAe,WAChB,IAAIr9C,EAAY9lB,KAAK8nB,QAAQ+pC,eAC7B7xD,KAAK8nB,QAAQ+vC,YAAY/xC,EAAU2C,aAEvCzoB,KAAK2iE,UAAY,WAKb,IAJA,IAAIxwB,EAAOnyC,KAAKotE,mBACZtlD,EAAU9nB,KAAK8nB,QAEfwgB,EAAQ,GACH5mC,EAAIywC,EAAK6V,MAAOtmD,GAAKywC,EAAK3wB,KAAM9f,IACrC4mC,EAAMxmC,KAAKgmB,EAAQoZ,QAAQx/B,IAE/B4mC,EAAM4gB,KAAK,SAASviD,EAAGwiD,GACnB,OAAIxiD,EAAE+R,cAAgBywC,EAAEzwC,eAAuB,EAC3C/R,EAAE+R,cAAgBywC,EAAEzwC,cAAsB,EACvC,IAGX,IAAIq/C,EAAc,IAAIzsB,EAAM,EAAG,EAAG,EAAG,GACrC,IAAS5pC,EAAIywC,EAAK6V,MAAOtmD,GAAKywC,EAAK3wB,KAAM9f,IAAK,CAC1C,IAAIgmC,EAAO5f,EAAQoZ,QAAQx/B,GAC3Bq2D,EAAYjxD,MAAM2lB,IAAM/qB,EACxBq2D,EAAYltC,IAAI4B,IAAM/qB,EACtBq2D,EAAYltC,IAAI8B,OAAS+a,EAAKlnC,OAC9BsnB,EAAQplB,QAAQq1D,EAAazvB,EAAM5mC,EAAEywC,EAAK6V,UAGlDhoD,KAAKggD,mBAAqB,WACtB,IAAI3nB,EAAQr4B,KAAK8nB,QAAQqgC,SAASnoD,KAAK86C,oBAAoBruB,KACvD0lB,EAAOnyC,KAAKotE,mBAChBptE,KAAK8nB,QAAQytC,UAAUvV,mBAAmB3nB,EAAOr4B,KAAK8nB,QAASqqB,EAAK6V,MAAO7V,EAAK3wB,OAGpFxhB,KAAKshD,mBAAqB,WACtB,IAAI90B,EAASxsB,KAAK86C,oBACdziB,EAAQr4B,KAAK8nB,QAAQqgC,SAAS37B,EAAOC,KACrC/D,EAAQ1oB,KAAKktB,oBACjBltB,KAAK8nB,QAAQytC,UAAUjU,mBAAmBjpB,EAAOr4B,KAAK8nB,QAASY,EAAO8D,IAE1ExsB,KAAKqtE,YAAc,SAAS5gD,EAAKE,GAC7B,IAAI2gD,EAAY,4BAChBA,EAAUvpE,UAAY,EAEtB,IAAIs1B,EAAIr5B,KAAK8nB,QAAQoZ,QAAQzU,GAC7B,MAAO6gD,EAAUvpE,UAAY4oB,EAAQ,CACjC,IAAIgR,EAAI2vC,EAAU/pE,KAAK81B,GACvB,GAAGsE,EAAE74B,OAAS6nB,GAAUgR,EAAE74B,MAAM64B,EAAE,GAAGn9B,QAAUmsB,EAAO,CAClD,IAAI4gD,EAAS,CACT7kE,MAAOi1B,EAAE,GACT72B,MAAO62B,EAAE74B,MACT+lB,IAAK8S,EAAE74B,MAAM64B,EAAE,GAAGn9B,QAEtB,OAAO+sE,GAGf,OAAO,MAEXvtE,KAAK4iE,aAAe,SAAS4K,GACzB,IAAI/gD,EAAMzsB,KAAK8lB,UAAUioB,YAAYthB,IACjCE,EAAS3sB,KAAK8lB,UAAUioB,YAAYphB,OACpC8gD,EAAY,IAAIniC,EAAM7e,EAAKE,EAAO,EAAGF,EAAKE,GAE1C/D,EAAI5oB,KAAK8nB,QAAQ8O,aAAa62C,GAClC,IAAK/X,MAAMt7C,WAAWwO,KAAO8kD,SAAS9kD,GAAI,CACtC,IAAI+kD,EAAK3tE,KAAKqtE,YAAY5gD,EAAKE,GAC/B,GAAIghD,EAAI,CACJ,IAAIC,EAAKD,EAAGjlE,MAAMxG,QAAQ,MAAQ,EAAIyrE,EAAG7mE,MAAQ6mE,EAAGjlE,MAAMxG,QAAQ,KAAO,EAAIyrE,EAAG9iD,IAC5EgjD,EAAWF,EAAG7mE,MAAQ6mE,EAAGjlE,MAAMlI,OAASotE,EAExCn+C,EAAIrV,WAAWuzD,EAAGjlE,OACtB+mB,GAAKvoB,KAAK8R,IAAI,GAAI60D,GAGfD,IAAOD,EAAG9iD,KAAO8B,EAASihD,EACzBJ,GAAUtmE,KAAK8R,IAAI,GAAI20D,EAAG9iD,IAAM8B,EAAS,GAEzC6gD,GAAUtmE,KAAK8R,IAAI,GAAI20D,EAAG9iD,IAAM8B,GAGpC8C,GAAK+9C,EACL/9C,GAAKvoB,KAAK8R,IAAI,GAAI60D,GAClB,IAAIC,EAAMr+C,EAAEs+C,QAAQF,GAChBG,EAAe,IAAI1iC,EAAM7e,EAAKkhD,EAAG7mE,MAAO2lB,EAAKkhD,EAAG9iD,KACpD7qB,KAAK8nB,QAAQplB,QAAQsrE,EAAcF,GACnC9tE,KAAKquC,aAAa5hB,EAAKvlB,KAAKC,IAAIwmE,EAAG7mE,MAAO,EAAG6lB,EAASmhD,EAAIttE,OAASmtE,EAAGjlE,MAAMlI,YAKxFR,KAAK6lD,YAAc,WACf,IAAI1T,EAAOnyC,KAAKotE,mBAChBptE,KAAK8nB,QAAQg+B,gBAAgB3T,EAAK6V,MAAO7V,EAAK3wB,MAC9CxhB,KAAKooB,kBAGTpoB,KAAK0iE,mBAAqB,WACtB,IAAIuL,EAAMjuE,KAAK8lB,UACX/Y,EAAM/M,KAAK8nB,QACXY,EAAQulD,EAAIxlD,WACZ9G,EAAUssD,EAAI3/B,cAClB,GAAI5lB,EAAMlD,UAAW,CACjB,IAAIiH,EAAM/D,EAAM5hB,MAAM2lB,IACtB1f,EAAIwrD,eAAe9rC,EAAKA,OACrB,CACH,IAAIs3B,EAAQpiC,EAAU+G,EAAM5hB,MAAQ4hB,EAAMmC,IACtCqjD,EAAWnhE,EAAI1F,OAAO08C,EAAOh3C,EAAI6pB,aAAalO,IAAQ,GAC1DA,EAAM5hB,MAAQi9C,EACdr7B,EAAMmC,IAAMqjD,EAEZD,EAAIroD,kBAAkB8C,EAAO/G,KAGrC3hB,KAAKs4D,cAAgB,WACjBt4D,KAAKg4D,WAAW,GAAG,IAEvBh4D,KAAKq4D,YAAc,WACfr4D,KAAKg4D,YAAY,GAAG,IAExBh4D,KAAKu3B,SAAW,SAAS7O,EAAO4uC,EAAYr1C,GACxC,OAAOjiB,KAAK8nB,QAAQyP,SAAS7O,EAAO4uC,EAAYr1C,IAEpDjiB,KAAK6iE,YAAc,WACf7iE,KAAKg4D,YAAY,GAAG,IAExBh4D,KAAK8iE,cAAgB,WACjB9iE,KAAKg4D,WAAW,GAAG,IAEvBh4D,KAAKg4D,WAAa,SAASt1B,EAAKzgB,GAC5B,IAAIkwB,EAAMg8B,EACNroD,EAAY9lB,KAAK8lB,UACrB,IAAKA,EAAU0H,mBAAqBxtB,KAAK4qE,uBAAwB,CAC7D,IAAIliD,EAAQ5C,EAAU2P,kBACtB0c,EAAOnyC,KAAKotE,iBAAiB1kD,GAC7BylD,EAAQnuE,KAAK8nB,QAAQkwC,WAAW7lB,EAAK6V,MAAO7V,EAAK3wB,KAAMS,EAAO,EAAIygB,GAC9DzgB,IAAgB,GAARygB,IAAWyrC,EAAQ,GAC/BzlD,EAAM2kB,OAAO8gC,EAAO,GACpBroD,EAAUqQ,kBAAkBzN,OACzB,CACH,IAAIuqB,EAASntB,EAAUstB,UAAUH,OACjCntB,EAAUstB,UAAUlR,OAAOliC,KAAK8nB,SAChC9nB,KAAK4qE,wBAAyB,EAK9B,IAHA,IAAI3S,EAAO,EACPmW,EAAY,EACZzsE,EAAIsxC,EAAOzyC,OACNkB,EAAI,EAAGA,EAAIC,EAAGD,IAAK,CACxB,IAAI2sE,EAAa3sE,EACjBuxC,EAAOvxC,GAAG2rC,OAAO4qB,EAAM,GACvB9lB,EAAOnyC,KAAKotE,iBAAiBn6B,EAAOvxC,IACpC,IAAIsmD,EAAQ7V,EAAK6V,MACbxmC,EAAO2wB,EAAK3wB,KAChB,QAAS9f,EAAIC,EAAG,CACRysE,GAAWn7B,EAAOvxC,GAAG2rC,OAAO+gC,EAAW,GAC3C,IAAIE,EAAUtuE,KAAKotE,iBAAiBn6B,EAAOvxC,IAC3C,GAAIugB,GAAQqsD,EAAQtmB,OAASxmC,EACzB,MACC,IAAKS,GAAQqsD,EAAQtmB,MAAQxmC,EAAO,EACrC,MACJA,EAAO8sD,EAAQ9sD,KAEnB9f,IACAu2D,EAAOj4D,KAAK8nB,QAAQkwC,WAAWhQ,EAAOxmC,EAAMS,EAAO,EAAIygB,GACnDzgB,IAAgB,GAARygB,IAAW2rC,EAAa3sE,EAAI,GACxC,MAAO2sE,GAAc3sE,EACjBuxC,EAAOo7B,GAAYhhC,OAAO4qB,EAAM,GAChCoW,IAECpsD,IAAMg2C,EAAO,GAClBmW,GAAanW,EAGjBnyC,EAAUqQ,kBAAkBrQ,EAAUmtB,OAAO,IAC7CntB,EAAUstB,UAAUnR,OAAOjiC,KAAK8nB,SAChC9nB,KAAK4qE,wBAAyB,IAGtC5qE,KAAKotE,iBAAmB,SAAS1kD,GAG7B,OAFAA,GAASA,GAAS1oB,KAAKktB,qBAAqB8f,eAErC,CACHgb,MAAOhoD,KAAK8nB,QAAQ0lC,gBAAgB9kC,EAAM5hB,MAAM2lB,KAChDjL,KAAMxhB,KAAK8nB,QAAQylC,cAAc7kC,EAAMmC,IAAI4B,OAInDzsB,KAAK2nB,mBAAqB,SAASzD,GAC/BlkB,KAAKgpB,SAASulD,gBAAgBvuE,KAAK86C,sBAGvC96C,KAAKgoB,oBAAsB,SAAS9D,GAChClkB,KAAKgpB,SAASwlD,mBAAmBtqD,IAGrClkB,KAAKkoB,iBAAmB,WACpBloB,KAAKgpB,SAASylD,mBAElBzuE,KAAK0uE,mBAAqB,WACtB,OAAO1uE,KAAKgpB,SAAS0lD,sBAEzB1uE,KAAK2uE,kBAAoB,WACrB,OAAO3uE,KAAKgpB,SAAS2lD,qBAEzB3uE,KAAK4uE,aAAe,SAASniD,GACzB,OAAQA,GAAOzsB,KAAK0uE,sBAAwBjiD,GAAOzsB,KAAK2uE,qBAE5D3uE,KAAK6uE,kBAAoB,SAASpiD,GAC9B,OAAQA,GAAOzsB,KAAKgpB,SAAS8lD,2BAA6BriD,GAAOzsB,KAAKgpB,SAAS+lD,0BAEnF/uE,KAAKgvE,oBAAsB,WACvB,OAAOhvE,KAAKgpB,SAASimD,qBAAuBjvE,KAAKgpB,SAASkmD,kBAAoB,GAGlFlvE,KAAKmvE,YAAc,SAASzsC,EAAKlb,GAC7B,IAAIwB,EAAWhpB,KAAKgpB,SAChB4V,EAAS5+B,KAAKgpB,SAAS8L,YACvBqd,EAAOzP,EAAMx7B,KAAKyF,MAAMiyB,EAAOpvB,OAASovB,EAAO/J,YAEnD70B,KAAKotB,mBACU,IAAX5F,EACAxnB,KAAK8lB,UAAUyoB,eAAe,WAC1BvuC,KAAKuwC,aAAa4B,EAAM,MAEV,IAAX3qB,IACPxnB,KAAK8lB,UAAUyqB,aAAa4B,EAAM,GAClCnyC,KAAK8lB,UAAUsC,kBAEnBpoB,KAAKotB,kBAEL,IAAI7c,EAAYyY,EAASzY,UAEzByY,EAASmH,SAAS,EAAGgiB,EAAOvT,EAAO/J,YACrB,MAAVrN,GACAwB,EAASsF,qBAAqB,KAAM,IAExCtF,EAASq8C,iBAAiB90D,IAE9BvQ,KAAKkiE,eAAiB,WAClBliE,KAAKmvE,YAAY,GAAG,IAExBnvE,KAAKqiE,aAAe,WAChBriE,KAAKmvE,aAAa,GAAG,IAEzBnvE,KAAKoiE,aAAe,WACjBpiE,KAAKmvE,YAAY,GAAG,IAEvBnvE,KAAKuiE,WAAa,WACdviE,KAAKmvE,aAAa,GAAG,IAEzBnvE,KAAKmiE,eAAiB,WAClBniE,KAAKmvE,YAAY,IAErBnvE,KAAKsiE,aAAe,WAChBtiE,KAAKmvE,aAAa,IAEtBnvE,KAAKovE,YAAc,SAAS3iD,GACxBzsB,KAAKgpB,SAASomD,YAAY3iD,IAE9BzsB,KAAKqvE,aAAe,SAAS3nC,EAAM4nC,EAAQC,EAASruE,GAChDlB,KAAKgpB,SAASqmD,aAAa3nC,EAAM4nC,EAAQC,EAASruE,IAEtDlB,KAAK+gE,gBAAkB,WACnB,IAAIr4C,EAAQ1oB,KAAKktB,oBACblmB,EAAM,CACNylB,IAAKvlB,KAAKyF,MAAM+b,EAAM5hB,MAAM2lB,KAAO/D,EAAMmC,IAAI4B,IAAM/D,EAAM5hB,MAAM2lB,KAAO,GACtEE,OAAQzlB,KAAKyF,MAAM+b,EAAM5hB,MAAM6lB,QAAUjE,EAAMmC,IAAI8B,OAASjE,EAAM5hB,MAAM6lB,QAAU,IAEtF3sB,KAAKgpB,SAASwmD,YAAYxoE,EAAK,KAEnChH,KAAK86C,kBAAoB,WACrB,OAAO96C,KAAK8lB,UAAUioB,aAE1B/tC,KAAKyvE,wBAA0B,WAC3B,OAAOzvE,KAAK8nB,QAAQqlB,yBAAyBntC,KAAK86C,sBAEtD96C,KAAKktB,kBAAoB,WACrB,OAAOltB,KAAK8lB,UAAU2C,YAE1BzoB,KAAKimB,UAAY,WACbjmB,KAAKotB,iBAAmB,EACxBptB,KAAK8lB,UAAUG,YACfjmB,KAAKotB,iBAAmB,GAE5BptB,KAAKooB,eAAiB,WAClBpoB,KAAK8lB,UAAUsC,kBAEnBpoB,KAAKquC,aAAe,SAAS5hB,EAAKE,GAC9B3sB,KAAK8lB,UAAUuoB,aAAa5hB,EAAKE,IAErC3sB,KAAK20B,qBAAuB,SAAS3tB,GACjChH,KAAK8lB,UAAU6O,qBAAqB3tB,IAExChH,KAAKwiE,eAAiB,SAASh7C,EAAQkoD,GACnC,IAAIljD,EAASxsB,KAAK86C,oBACd+B,EAAW,IAAItE,EAAcv4C,KAAK8nB,QAAS0E,EAAOC,IAAKD,EAAOG,QAC9Do8C,EAAYlsB,EAAS1D,kBACrB5E,EAAQw0B,GAAalsB,EAAS5D,cAElC,GAAK1E,EAAL,CACA,IAAIo7B,EAIAC,EAHAC,GAAQ,EACR3hB,EAAQ,GACRxsD,EAAI8qB,EAAOG,OAAS4nB,EAAMztC,MAE1BgpE,EAAW,CACX,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KAGT,EAAG,CACC,GAAIv7B,EAAM7rC,MAAMhF,MAAM,gBAClB,KAAOhC,EAAI6yC,EAAM7rC,MAAMlI,SAAWqvE,EAAOnuE,IACrC,GAAKouE,EAASv7B,EAAM7rC,MAAMhH,IAU1B,OANAkuE,EAAcE,EAASv7B,EAAM7rC,MAAMhH,IAAM,IAAM6yC,EAAM74B,KAAKhZ,QAAQ,SAAU,UAExEgzD,MAAMxH,EAAM0hB,MACZ1hB,EAAM0hB,GAAe,GAGjBr7B,EAAM7rC,MAAMhH,IAChB,IAAK,IACL,IAAK,IACL,IAAK,IACDwsD,EAAM0hB,KACN,MACJ,IAAK,IACL,IAAK,IACL,IAAK,IACD1hB,EAAM0hB,MAEsB,IAAxB1hB,EAAM0hB,KACND,EAAY,UACZE,GAAQ,GAEhB,YAIHt7B,IAA6C,IAApCA,EAAM74B,KAAKxZ,QAAQ,cAC7BwzD,MAAMxH,EAAM3Z,EAAM7rC,UAClBwlD,EAAM3Z,EAAM7rC,OAAS,GAGD,MAApBqgE,EAAUrgE,MACVwlD,EAAM3Z,EAAM7rC,SAEa,OAApBqgE,EAAUrgE,OACfwlD,EAAM3Z,EAAM7rC,UAGY,IAAxBwlD,EAAM3Z,EAAM7rC,SACZinE,EAAY,MACZE,GAAQ,IAIXA,IACD9G,EAAYx0B,EACZA,EAAQsI,EAAS5D,cACjBv3C,EAAI,SAEH6yC,IAAUs7B,GACnB,GAAKF,EAAL,CAGA,IAAIjnD,EAAO1hB,EACX,GAAkB,YAAd2oE,EACAjnD,EAAQ1oB,KAAK8nB,QAAQoH,gBAAgB1C,GAChC9D,IACDA,EAAQ,IAAI4iB,EACRuR,EAASzD,qBACTyD,EAASxD,wBAA0B33C,EAAI,EACvCm7C,EAASzD,qBACTyD,EAASxD,wBAA0B33C,EAAI,GAE3CsF,EAAM0hB,EAAM5hB,OACR4oE,GAAU1oE,EAAIylB,MAAQD,EAAOC,KAAOvlB,KAAKgC,IAAIlC,EAAI2lB,OAASH,EAAOG,QAAU,KAC3EjE,EAAQ1oB,KAAK8nB,QAAQoH,gBAAgBloB,UAG5C,GAAkB,QAAd2oE,EAAqB,CAC1B,IAAIp7B,IAA6C,IAApCA,EAAM74B,KAAKxZ,QAAQ,YAG5B,OAFA,IAAIiL,EAAMonC,EAAM7rC,MAUpB,GANAggB,EAAQ,IAAI4iB,EACRuR,EAASzD,qBACTyD,EAASxD,wBAA0B,EACnCwD,EAASzD,qBACTyD,EAASxD,wBAA0B,GAEU,IAA7C3wB,EAAMkjB,QAAQpf,EAAOC,IAAKD,EAAOG,QAAe,CAChDkjD,GAAQ,EACR,GACIt7B,EAAQw0B,EACRA,EAAYlsB,EAAS7D,eAEjB+vB,KAC6C,IAAzCA,EAAUrtD,KAAKxZ,QAAQ,cACvBwmB,EAAM0jB,OAAOyQ,EAASzD,qBAAsByD,EAASxD,wBAA0B,GAG/E9E,EAAM7rC,QAAUyE,IAA2C,IAApConC,EAAM74B,KAAKxZ,QAAQ,cAClB,MAApB6mE,EAAUrgE,MACVwlD,EAAM/gD,KAEmB,OAApB47D,EAAUrgE,OACfwlD,EAAM/gD,KAGS,IAAf+gD,EAAM/gD,KACN0iE,GAAQ,WAGf9G,IAAc8G,GAEvBt7B,GAASA,EAAM74B,KAAKxZ,QAAQ,cAC5B8E,EAAM0hB,EAAM5hB,MACRE,EAAIylB,KAAOD,EAAOC,KAAOvlB,KAAKgC,IAAIlC,EAAI2lB,OAASH,EAAOG,QAAU,IAChE3lB,EAAM0hB,EAAMmC,MAIxB7jB,EAAM0hB,GAASA,EAAM8D,QAAUxlB,EAC3BA,IACIwgB,EACIkB,GAASgnD,EACT1vE,KAAK8lB,UAAU6C,SAASD,GACjBA,GAASA,EAAMijB,QAAQ3rC,KAAKktB,qBACnCltB,KAAKooB,iBAELpoB,KAAK8lB,UAAU+M,SAAS7rB,EAAIylB,IAAKzlB,EAAI2lB,QAGzC3sB,KAAK8lB,UAAU2oB,OAAOznC,EAAIylB,IAAKzlB,EAAI2lB,YAI/C3sB,KAAKihE,SAAW,SAAS8O,EAAYpjD,EAAQ4iD,GACzCvvE,KAAK8lB,UAAUsC,iBACfpoB,KAAK8nB,QAAQqlC,OAAO,CAAC1gC,IAAKsjD,EAAa,EAAGpjD,OAAQA,GAAU,IAE5D3sB,KAAKotB,iBAAmB,EACxBptB,KAAK8jE,qBAAuB9jE,KAAK8jE,sBACjC9jE,KAAKquC,aAAa0hC,EAAa,EAAGpjD,GAAU,GAC5C3sB,KAAKotB,iBAAmB,EAEnBptB,KAAK6uE,kBAAkBkB,EAAa,IACrC/vE,KAAKqvE,aAAaU,EAAa,GAAG,EAAMR,IAEhDvvE,KAAKgwE,WAAa,SAASvjD,EAAKE,GAC5B3sB,KAAK8lB,UAAU2oB,OAAOhiB,EAAKE,IAE/B3sB,KAAKwhE,WAAa,SAASC,GACvB,GAAIzhE,KAAK8lB,UAAUsJ,gBAAkBpvB,KAAK8lB,UAAUwoB,cAAe,CAC/D,IAAI5oB,EAAiB1lB,KAAK8lB,UAAU8G,OAAOohB,cAC3C,OAAOhuC,KAAK20B,qBAAqBjP,GAErC1lB,KAAK8lB,UAAUsC,iBACfpoB,KAAK8lB,UAAUyqB,cAAckxB,IAAU,EAAG,IAE9CzhE,KAAK2hE,aAAe,SAASF,GACzB,GAAIzhE,KAAK8lB,UAAUsJ,eAAiBpvB,KAAK8lB,UAAUwoB,cAAe,CAC9D,IAAI3oB,EAAe3lB,KAAK8lB,UAAU8G,OAAOohB,cACzC,OAAOhuC,KAAK20B,qBAAqBhP,GAErC3lB,KAAK8lB,UAAUsC,iBACfpoB,KAAK8lB,UAAUyqB,aAAakxB,GAAS,EAAG,IAE5CzhE,KAAK8hE,aAAe,SAASL,GACzB,GAAKzhE,KAAK8lB,UAAUN,UAIf,CACDi8C,EAAQA,GAAS,EACjB,MAAOA,IACHzhE,KAAK8lB,UAAUmpB,qBAPQ,CAC3B,IAAIvpB,EAAiB1lB,KAAKktB,oBAAoBpmB,MAC9C9G,KAAK20B,qBAAqBjP,GAQ9B1lB,KAAKooB,kBAETpoB,KAAKiiE,cAAgB,SAASR,GAC1B,GAAKzhE,KAAK8lB,UAAUN,UAIf,CACDi8C,EAAQA,GAAS,EACjB,MAAOA,IACHzhE,KAAK8lB,UAAUipB,sBAPQ,CAC3B,IAAIppB,EAAe3lB,KAAKktB,oBAAoBrC,IAC5C7qB,KAAK20B,qBAAqBhP,GAQ9B3lB,KAAKooB,kBAETpoB,KAAK6hE,kBAAoB,WACrB7hE,KAAK8lB,UAAUqpB,sBACfnvC,KAAKooB,kBAETpoB,KAAKgiE,gBAAkB,WACnBhiE,KAAK8lB,UAAUupB,oBACfrvC,KAAKooB,kBAETpoB,KAAK0hE,gBAAkB,WACnB1hE,KAAK8lB,UAAUypB,oBACfvvC,KAAKooB,kBAETpoB,KAAKuhE,kBAAoB,WACrBvhE,KAAK8lB,UAAU2pB,sBACfzvC,KAAKooB,kBAETpoB,KAAK+hE,kBAAoB,WACrB/hE,KAAK8lB,UAAU6pB,sBACf3vC,KAAKooB,kBAETpoB,KAAK4hE,iBAAmB,WACpB5hE,KAAK8lB,UAAU+pB,qBACf7vC,KAAKooB,kBAETpoB,KAAK0C,QAAU,SAASm7D,EAAa9hC,GAC7BA,GACA/7B,KAAKskE,QAAQv6D,IAAIgyB,GAErB,IAAIrT,EAAQ1oB,KAAKskE,QAAQpH,KAAKl9D,KAAK8nB,SAC/BmoD,EAAW,EACf,OAAKvnD,GAGD1oB,KAAKkwE,YAAYxnD,EAAOm1C,KACxBoS,EAAW,GAED,OAAVvnD,IACA1oB,KAAK8lB,UAAUF,kBAAkB8C,GACjC1oB,KAAKgpB,SAASo8C,wBAAwB18C,EAAM5hB,MAAO4hB,EAAMmC,MAGtDolD,GAVIA,GAYfjwE,KAAKmwE,WAAa,SAAStS,EAAa9hC,GAChCA,GACA/7B,KAAKskE,QAAQv6D,IAAIgyB,GAGrB,IAAIkX,EAASjzC,KAAKskE,QAAQ7G,QAAQz9D,KAAK8nB,SACnCmoD,EAAW,EACf,IAAKh9B,EAAOzyC,OACR,OAAOyvE,EAEXjwE,KAAKotB,iBAAmB,EAExB,IAAItH,EAAY9lB,KAAKktB,oBACrBltB,KAAK8lB,UAAU2oB,OAAO,EAAG,GAEzB,IAAK,IAAI/sC,EAAIuxC,EAAOzyC,OAAS,EAAGkB,GAAK,IAAKA,EACnC1B,KAAKkwE,YAAYj9B,EAAOvxC,GAAIm8D,IAC3BoS,IAOR,OAHAjwE,KAAK8lB,UAAUF,kBAAkBE,GACjC9lB,KAAKotB,iBAAmB,EAEjB6iD,GAGXjwE,KAAKkwE,YAAc,SAASxnD,EAAOm1C,GAC/B,IAAI/b,EAAQ9hD,KAAK8nB,QAAQ8O,aAAalO,GAEtC,OADAm1C,EAAc79D,KAAKskE,QAAQ5hE,QAAQo/C,EAAO+b,GACtB,OAAhBA,GACAn1C,EAAMmC,IAAM7qB,KAAK8nB,QAAQplB,QAAQgmB,EAAOm1C,GACjCn1C,GAEA,MAGf1oB,KAAKowE,qBAAuB,WACxB,OAAOpwE,KAAKskE,QAAQtpC,cAExBh7B,KAAKk9D,KAAO,SAASF,EAAQjhC,EAASwzC,GAC7BxzC,IACDA,EAAU,IAEO,iBAAVihC,GAAsBA,aAAkBx5D,OAC/Cu4B,EAAQihC,OAASA,EACK,iBAAVA,GACZhrD,EAAIH,MAAMkqB,EAASihC,GAEvB,IAAIt0C,EAAQ1oB,KAAK8lB,UAAU2C,WACL,MAAlBsT,EAAQihC,SACRA,EAASh9D,KAAK8nB,QAAQ8O,aAAalO,IAC5B1oB,KAAKskE,QAAQppC,SAAS8hC,OACxBA,IACDt0C,EAAQ1oB,KAAK8nB,QAAQqH,aAAazG,EAAM5hB,MAAM2lB,IAAK/D,EAAM5hB,MAAM6lB,QAC/DqwC,EAASh9D,KAAK8nB,QAAQ8O,aAAalO,IAEvC1oB,KAAKskE,QAAQv6D,IAAI,CAACizD,OAAQA,KAG9Bh9D,KAAKskE,QAAQv6D,IAAIgyB,GACZA,EAAQj1B,OACT9G,KAAKskE,QAAQv6D,IAAI,CAACjD,MAAO4hB,IAE7B,IAAI2nD,EAAWrwE,KAAKskE,QAAQpH,KAAKl9D,KAAK8nB,SACtC,OAAIiU,EAAQu0C,cACDD,EACPA,GACArwE,KAAKuwE,YAAYF,EAAUd,GACpBc,IAEPt0C,EAAQqiC,UACR11C,EAAM5hB,MAAQ4hB,EAAMmC,IAEpBnC,EAAMmC,IAAMnC,EAAM5hB,WACtB9G,KAAK8lB,UAAU6C,SAASD,KAE5B1oB,KAAKohE,SAAW,SAASrlC,EAASwzC,GAC9BvvE,KAAKk9D,KAAK,CAACM,aAAa,EAAMY,WAAW,GAAQriC,EAASwzC,IAE9DvvE,KAAKqhE,aAAe,SAAStlC,EAASwzC,GAClCvvE,KAAKk9D,KAAKnhC,EAAS,CAACyhC,aAAa,EAAMY,WAAW,GAAOmR,IAG7DvvE,KAAKuwE,YAAc,SAAS7nD,EAAO6mD,GAC/BvvE,KAAKotB,iBAAmB,EACxBptB,KAAK8nB,QAAQqlC,OAAOzkC,GACpB1oB,KAAK8lB,UAAUF,kBAAkB8C,GACjC1oB,KAAKotB,iBAAmB,EAExB,IAAI7c,EAAYvQ,KAAKgpB,SAASzY,UAC9BvQ,KAAKgpB,SAASo8C,wBAAwB18C,EAAM5hB,MAAO4hB,EAAMmC,IAAK,KAC9C,IAAZ0kD,GACAvvE,KAAKgpB,SAASq8C,iBAAiB90D,IAEvCvQ,KAAKuoB,KAAO,WACRvoB,KAAKotB,kBACLptB,KAAK8nB,QAAQ6pC,iBAAiBppC,OAC9BvoB,KAAKotB,kBACLptB,KAAKgpB,SAASsF,qBAAqB,KAAM,KAE7CtuB,KAAKoyD,KAAO,WACRpyD,KAAKotB,kBACLptB,KAAK8nB,QAAQ6pC,iBAAiBS,OAC9BpyD,KAAKotB,kBACLptB,KAAKgpB,SAASsF,qBAAqB,KAAM,KAE7CtuB,KAAKoxB,QAAU,WACXpxB,KAAKgpB,SAASoI,UACdpxB,KAAKuyB,QAAQ,UAAWvyB,MACpBA,KAAK8nB,SACL9nB,KAAK8nB,QAAQsJ,WAGrBpxB,KAAKwwE,4BAA8B,SAASrZ,GACxC,GAAKA,EAAL,CAEA,IAAIxtC,EACArhB,EAAOtI,KACPywE,GAAe,EACdzwE,KAAK0wE,gBACN1wE,KAAK0wE,cAAgB1lE,SAASC,cAAc,QAChD,IAAI0lE,EAAe3wE,KAAK0wE,cACxBC,EAAariE,MAAMD,QAAU,oBAC7BrO,KAAK4pB,UAAUtF,aAAaqsD,EAAc3wE,KAAK4pB,UAAUrF,YACzD,IAAIqsD,EAAoB5wE,KAAKioB,GAAG,kBAAmB,WAC/CwoD,GAAe,IAEfI,EAAiB7wE,KAAKgpB,SAASf,GAAG,eAAgB,WAC9CwoD,IACA9mD,EAAOrhB,EAAK0gB,SAASY,UAAUC,2BAEnCinD,EAAgB9wE,KAAKgpB,SAASf,GAAG,cAAe,WAChD,GAAIwoD,GAAgB9mD,IAASrhB,EAAKyc,aAC3Bzc,EAAKyoE,WAAazoE,EAAKyoE,UAAUhsD,aACtC,CACE,IAAIiE,EAAW1gB,EAAK0gB,SAChBhiB,EAAMgiB,EAAS4M,aAAao7C,UAC5BpyC,EAAS5V,EAAS8L,YAClBhL,EAAM9iB,EAAI8iB,IAAM8U,EAAO9b,OAEvB2tD,EADAzpE,EAAI8iB,KAAO,GAAKA,EAAMH,EAAKG,IAAM,KAE1B9iB,EAAI8iB,IAAM8U,EAAOpvB,QACxBxI,EAAI8iB,IAAMH,EAAKG,IAAM8U,EAAO/J,WAAa50B,OAAOmzB,cAGjC,KAEC,MAAhBq9C,IACAE,EAAariE,MAAMwb,IAAMA,EAAM,KAC/B6mD,EAAariE,MAAMsB,KAAO5I,EAAI4I,KAAO,KACrC+gE,EAAariE,MAAMkB,OAASovB,EAAO/J,WAAa,KAChD87C,EAAa7P,eAAe2P,IAEhCA,EAAe9mD,EAAO,QAG9B3pB,KAAKwwE,4BAA8B,SAASrZ,GACpCA,WAEGn3D,KAAKwwE,4BACZxwE,KAAK06B,IAAI,kBAAmBk2C,GAC5B5wE,KAAKgpB,SAAS0R,IAAI,cAAeo2C,GACjC9wE,KAAKgpB,SAAS0R,IAAI,eAAgBm2C,OAK1C7wE,KAAKixE,kBAAoB,WACrB,IAAI3iE,EAAQtO,KAAKkxE,cAAgB,MAC7BC,EAAcnxE,KAAKgpB,SAAS4M,aAC3Bu7C,IAELA,EAAYC,kBAAkB,SAAS3tE,KAAK6K,IAC5C6iE,EAAYE,YAAcrxE,KAAK4nB,WAAsB,QAATtZ,EAC5CoV,EAAI9V,YAAYujE,EAAYriE,QAAS,mBAAoB,OAAOrL,KAAK6K,OAG1E9M,KAAKwiE,EAAO1iE,WAIfs9B,EAAO9C,cAAckoC,EAAO1iE,UAAW,SAAU,CAC7CgwE,eAAgB,CACZvnE,IAAK,SAASuE,GACVtO,KAAK4nE,oBACL5nE,KAAKuyB,QAAQ,uBAAwB,CAACtR,KAAM3S,KAEhD0tB,aAAc,QAElBu1C,oBAAqB,CACjBxnE,IAAK,WAAY/J,KAAKypE,8BACtBztC,cAAc,GAElBw1C,sBAAuB,CACnBznE,IAAK,SAAS0hE,GAAkBzrE,KAAK8mE,sBACrC9qC,cAAc,GAElB3S,SAAU,CACNtf,IAAK,SAASsf,GACVrpB,KAAKixE,qBAETj1C,cAAc,GAElB7D,YAAa,CACTpuB,IAAK,SAASse,GAAOroB,KAAKixE,qBAC1B/7B,OAAQ,CAAC,MAAO,OAAQ,SAAU,QAClClZ,aAAc,OAElBk2B,gBAAiB,CACbhd,OAAQ,EAAC,GAAO,EAAM,UACtBlZ,cAAc,GAElBy1C,kBAAmB,CAACz1C,cAAc,GAClC01C,sBAAuB,CAAC11C,cAAc,GACtC21C,yBAA0B,CACtB5nE,IAAK,SAASse,GAAMroB,KAAKwwE,4BAA4BnoD,KAEzDw9C,gBAAiB,CACb97D,IAAK,SAASse,GAAOroB,KAAK8hC,mBAAmBzZ,IAC7Cve,IAAK,WAAa,OAAO9J,KAAK4xE,cAC9Br2C,YAAY,GAGhBs2C,wBAAyB,WACzBC,wBAAyB,WACzBC,oBAAqB,WACrBC,eAAgB,WAChBxqC,eAAgB,WAChB6kC,gBAAiB,WACjB4F,kBAAmB,WACnBC,YAAa,WACbC,gBAAiB,WACjBC,gBAAiB,WACjBC,gBAAiB,WACjBC,WAAY,WACZC,oBAAqB,WACrBC,SAAU,WACVC,WAAY,WACZC,SAAU,WACVC,SAAU,WACVC,cAAe,WACfC,iBAAkB,WAClBzK,MAAO,WAEPhoC,YAAa,gBACbC,UAAW,gBACXC,YAAa,gBACbC,YAAa,gBACbC,oBAAqB,gBAErBo8B,gBAAiB,UACjB7J,UAAW,UACXzN,YAAa,UACbmP,UAAW,UACXoI,YAAa,UACbpsB,QAAS,UACTisB,KAAM,UACNhC,iBAAkB,UAClBoY,UAAW,UACXz6B,KAAM,YAGV11C,EAAQqhE,OAASA,IAGjB3gE,IAAIlD,OAAO,kBAAkB,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GACzF,aACA,IAAI2yE,EAAc,WACd/yE,KAAK4xD,UAGT,WA6DI,SAASohB,EAAgB3qC,GACrB,MAAO,CACHnD,OAAQmD,EAAMnD,OACdp+B,MAAOuhC,EAAMvhC,MACb+jB,IAAKwd,EAAMxd,IACXyd,MAA6B,GAAtBD,EAAMC,MAAM9nC,OAAc,KAAO6nC,EAAMC,MAC9CpkB,KAA4B,GAAtBmkB,EAAMC,MAAM9nC,OAAc6nC,EAAMC,MAAM,GAAK,MAIzD,SAAS2qC,EAAkB5qC,GACvB,MAAO,CACHnD,OAAQmD,EAAMnD,OACdp+B,MAAOuhC,EAAMvhC,MACb+jB,IAAKwd,EAAMxd,IACXyd,MAAOD,EAAMC,OAAS,CAACD,EAAMnkB,OAIrC,SAASgvD,EAAkBC,EAAeC,GAEtC,IADA,IAAIC,EAAgB,IAAI5uE,MAAM0uE,EAAc3yE,QACnCkB,EAAI,EAAGA,EAAIyxE,EAAc3yE,OAAQkB,IAAK,CAI3C,IAHA,IAAI4xE,EAAeH,EAAczxE,GAC7B6xE,EAAe,CAAEvhB,MAAOshB,EAAathB,MAAOxL,OAAQ,IAAI/hD,MAAM6uE,EAAa9yE,SAEtEg9B,EAAI,EAAGA,EAAI81C,EAAa9sB,OAAOhmD,OAAQg9B,IAAK,CACjD,IAAIg2C,EAAYF,EAAa9sB,OAAOhpB,GACpC+1C,EAAa/sB,OAAOhpB,GAAK41C,EAAmBI,GAGhDH,EAAc3xE,GAAK6xE,EAEvB,OAAOF,EA5FXrzE,KAAKiyD,QAAU,SAASl2B,GACpB,IAAI03C,EAAY13C,EAAQx2B,KAAK,GAC7BvF,KAAK0zE,KAAQ33C,EAAQx2B,KAAK,GACtBw2B,EAAQka,OAASj2C,KAAK2zE,YACtB3zE,KAAK4zE,eACLH,EAAYzzE,KAAK6zE,WAAWr5C,MAAM90B,OAAO+tE,IAE7CzzE,KAAK6zE,WAAW/xE,KAAK2xE,GACrBzzE,KAAK8zE,WAAa,GACd9zE,KAAK4zE,aAAe,IACpB5zE,KAAK4zE,aAAeG,KAExB/zE,KAAK4zE,gBAET5zE,KAAKuoB,KAAO,SAASsuC,GACjB,IAAI4c,EAAYzzE,KAAK6zE,WAAWr5C,MAC5Bw5C,EAAqB,KAOzB,OANIP,IACAO,EAAqBh0E,KAAK0zE,KAAK9c,YAAY6c,EAAW5c,GACtD72D,KAAK8zE,WAAWhyE,KAAK2xE,GACrBzzE,KAAK4zE,gBAGFI,GAEXh0E,KAAKoyD,KAAO,SAASyE,GACjB,IAAI4c,EAAYzzE,KAAK8zE,WAAWt5C,MAC5By5C,EAAqB,KAOzB,OANIR,IACAQ,EACIj0E,KAAK0zE,KAAKzc,YAAYj3D,KAAKk0E,mBAAmBT,GAAY5c,GAC9D72D,KAAK6zE,WAAW/xE,KAAK2xE,GACrBzzE,KAAK4zE,gBAEFK,GAEXj0E,KAAK4xD,MAAQ,WACT5xD,KAAK6zE,WAAa,GAClB7zE,KAAK8zE,WAAa,GAClB9zE,KAAK4zE,aAAe,GAExB5zE,KAAK2zE,QAAU,WACX,OAAO3zE,KAAK6zE,WAAWrzE,OAAS,GAEpCR,KAAKm0E,QAAU,WACX,OAAOn0E,KAAK8zE,WAAWtzE,OAAS,GAEpCR,KAAKo0E,UAAY,WACbp0E,KAAK4zE,aAAe,GAExB5zE,KAAKq0E,QAAU,WACX,OAA6B,IAAtBr0E,KAAK4zE,cAEhB5zE,KAAKs0E,iBAAmB,SAASb,GAC7B,OAAOP,EAAkBO,EAAWT,IAExChzE,KAAKk0E,mBAAqB,SAAST,GAC/B,OAAOP,EAAkBO,EAAWR,MAsCzCzxE,KAAKuxE,EAAYzxE,WAEpBqB,EAAQowE,YAAcA,IAGtB1vE,IAAIlD,OAAO,mBAAmB,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,eAAe,yBAA0B,SAAS0B,EAAUc,EAASvC,GAC7J,aAEA,IAAIsjB,EAAM7hB,EAAS,cACfmQ,EAAMnQ,EAAS,cACf8hB,EAAO9hB,EAAS,eAChB63B,EAAe73B,EAAS,wBAAwB63B,aAEhD66C,EAAS,SAASC,GAClBx0E,KAAK8O,QAAU4U,EAAIzY,cAAc,OACjCjL,KAAK8O,QAAQtB,UAAY,6BACzBgnE,EAASjmE,YAAYvO,KAAK8O,SAC1B9O,KAAK4sE,mBAAmB5sE,KAAKy0E,kBAE7Bz0E,KAAK00E,YAAc,EAEnB10E,KAAK+xB,aAAe,GACpB/xB,KAAK20E,mBAAqB30E,KAAK20E,mBAAmBxvE,KAAKnF,MAEvDA,KAAK40E,OAAS,KAGlB,WAEI5iE,EAAIF,UAAU9R,KAAM05B,GAEpB15B,KAAK0kE,WAAa,SAAS58C,GACnB9nB,KAAK8nB,SACL9nB,KAAK8nB,QAAQ7L,oBAAoB,SAAUjc,KAAK20E,oBACpD30E,KAAK8nB,QAAUA,EACXA,GACAA,EAAQG,GAAG,SAAUjoB,KAAK20E,qBAGlC30E,KAAKkzD,oBAAsB,SAASzmC,EAAKjf,GACjCvN,OAAOY,SACPA,QAAQw6B,MAAQx6B,QAAQw6B,KAAK,8CACjCr7B,KAAK8nB,QAAQorC,oBAAoBzmC,EAAKjf,IAG1CxN,KAAKmzD,uBAAyB,SAAS1mC,EAAKjf,GACpCvN,OAAOY,SACPA,QAAQw6B,MAAQx6B,QAAQw6B,KAAK,iDACjCr7B,KAAK8nB,QAAQqrC,uBAAuB1mC,EAAKjf,IAG7CxN,KAAKk0D,eAAiB,SAASC,GAC3Bn0D,KAAK+xB,aAAe,GACpB,IAAK,IAAIrwB,EAAI,EAAGA,EAAIyyD,EAAY3zD,OAAQkB,IAAK,CACzC,IAAIowB,EAAaqiC,EAAYzyD,GACzB+qB,EAAMqF,EAAWrF,IACjBooD,EAAU70E,KAAK+xB,aAAatF,GAC3BooD,IACDA,EAAU70E,KAAK+xB,aAAatF,GAAO,CAACvI,KAAM,KAE9C,IAAI4wD,EAAWhjD,EAAW5N,KAC1B4wD,EAAWA,EAAWnxD,EAAKjB,WAAWoyD,GAAYhjD,EAAWlB,MAAQ,IAE7B,IAApCikD,EAAQ3wD,KAAKhiB,QAAQ4yE,IACrBD,EAAQ3wD,KAAKpiB,KAAKgzE,GAEtB,IAAIp5D,EAAOoW,EAAWpW,KACV,SAARA,EACAm5D,EAAQrnE,UAAY,aACP,WAARkO,GAA0C,cAArBm5D,EAAQrnE,UAClCqnE,EAAQrnE,UAAY,eACP,QAARkO,GAAoBm5D,EAAQrnE,YACjCqnE,EAAQrnE,UAAY,eAIhCxN,KAAK20E,mBAAqB,SAAUtsC,GAChC,GAAKroC,KAAK+xB,aAAavxB,OAAvB,CAEA,IAAImsC,EAAWtE,EAAMvhC,MAAM2lB,IACvBkY,EAAM0D,EAAMxd,IAAI4B,IAAMkgB,EAC1B,GAAY,IAARhI,QACG,GAAoB,UAAhB0D,EAAMnD,OACbllC,KAAK+xB,aAAatrB,OAAOkmC,EAAUhI,EAAM,EAAG,UACzC,CACH,IAAIp/B,EAAO,IAAId,MAAMkgC,EAAM,GAC3Bp/B,EAAK2wC,QAAQvJ,EAAU,GACvB3sC,KAAK+xB,aAAatrB,OAAO7F,MAAMZ,KAAK+xB,aAAcxsB,MAI1DvF,KAAKyoD,OAAS,SAAS7pB,GACnB,IAAI9W,EAAU9nB,KAAK8nB,QACf6kB,EAAW/N,EAAO+N,SAClBC,EAAU1lC,KAAKM,IAAIo3B,EAAOgO,QAAUhO,EAAOm2C,aAC3CjtD,EAAQoK,YAAc,GACtBwO,EAAO5Y,EAAQqkC,gBAAgBxf,GAC/B+pB,EAAYh2B,EAAOA,EAAK55B,MAAM2lB,IAAM2zB,IACpCtf,EAAc9gC,KAAKy0E,kBAAoB3sD,EAAQgZ,YAC/Ck0C,EAAcltD,EAAQooC,aACtB+kB,EAAcntD,EAAQqoC,aACtByM,EAAkB90C,EAAQotD,iBAC1BC,EAAiB,EAEjBC,EAAiBttD,EAAQstD,gBAAkBp1E,KAAKq1E,UAEhDC,EAAO,KACPxwE,GAAS,EACT2nB,EAAMkgB,EACV,MAAO,EAAM,CAMT,GALIlgB,EAAMiqC,IACNjqC,EAAMiU,EAAK7V,IAAI4B,IAAM,EACrBiU,EAAO5Y,EAAQqkC,gBAAgB1/B,EAAKiU,GACpCg2B,EAAYh2B,EAAOA,EAAK55B,MAAM2lB,IAAM2zB,KAEpC3zB,EAAMmgB,EAAS,CACf,MAAO5sC,KAAK40E,OAAOp0E,OAASsE,EAAQ,EAChCwwE,EAAOt1E,KAAK40E,OAAOp6C,MACnBx6B,KAAK8O,QAAQoB,YAAYolE,EAAKxmE,SAElC,MAGJwmE,EAAOt1E,KAAK40E,SAAS9vE,GAChBwwE,IACDA,EAAO,CAACxmE,QAAS,KAAMymE,SAAU,KAAMC,WAAY,MACnDF,EAAKxmE,QAAU4U,EAAIzY,cAAc,OACjCqqE,EAAKC,SAAWvqE,SAASwD,eAAe,IACxC8mE,EAAKxmE,QAAQP,YAAY+mE,EAAKC,UAC9Bv1E,KAAK8O,QAAQP,YAAY+mE,EAAKxmE,SAC9B9O,KAAK40E,OAAO9vE,GAASwwE,GAGzB,IAAI9nE,EAAY,mBACZwnE,EAAYvoD,KACZjf,GAAawnE,EAAYvoD,IACzBwoD,EAAYxoD,KACZjf,GAAaynE,EAAYxoD,IACzBzsB,KAAK+xB,aAAatF,KAClBjf,GAAaxN,KAAK+xB,aAAatF,GAAKjf,WACpC8nE,EAAKxmE,QAAQtB,WAAaA,IAC1B8nE,EAAKxmE,QAAQtB,UAAYA,GAE7B,IAAIgC,EAASsY,EAAQszC,aAAa3uC,GAAOmS,EAAO/J,WAAa,KAI7D,GAHIrlB,GAAU8lE,EAAKxmE,QAAQR,MAAMkB,SAC7B8lE,EAAKxmE,QAAQR,MAAMkB,OAASA,GAE5BsxB,EAAa,CACb,IAAIlY,EAAIkY,EAAYrU,GACX,MAAL7D,IACAA,EAAIkY,EAAYrU,GAAO3E,EAAQqmC,cAAc1hC,IAGrD,GAAI7D,EAAG,CACE0sD,EAAKE,aACNF,EAAKE,WAAa9xD,EAAIzY,cAAc,QACpCqqE,EAAKxmE,QAAQP,YAAY+mE,EAAKE,aAE9BhoE,EAAY,uBAAyBob,EAChC,SAALA,GAAgB6D,GAAOiqC,GAAajqC,EAAMiU,EAAK7V,IAAI4B,IACnDjf,GAAa,cAEbA,GAAa,YACb8nE,EAAKE,WAAWhoE,WAAaA,IAC7B8nE,EAAKE,WAAWhoE,UAAYA,GAE5BgC,EAASovB,EAAO/J,WAAa,KAC7BygD,EAAKE,WAAWlnE,MAAMkB,QAAUA,IAChC8lE,EAAKE,WAAWlnE,MAAMkB,OAASA,QAE/B8lE,EAAKE,aACLF,EAAKxmE,QAAQoB,YAAYolE,EAAKE,YAC9BF,EAAKE,WAAa,MAI1B,IAAItxD,EAAOixD,EAAiBC,EACtBA,EAAeK,QAAQ3tD,EAAS2E,GAChCA,EAAMmwC,EACR14C,IAASoxD,EAAKC,SAASt0D,OACvBq0D,EAAKC,SAASt0D,KAAOiD,GAEzBuI,IAGJzsB,KAAK8O,QAAQR,MAAMkB,OAASovB,EAAO82C,UAAY,MAE3C11E,KAAK21E,aAAe7tD,EAAQihB,gBAC5BosC,EAAiBrtD,EAAQoK,YAAc0qC,GAE3C,IAAI8X,EAAcU,EACZA,EAAejkD,SAASrJ,EAASqtD,EAAgBv2C,GACjDu2C,EAAe5zE,WAAWf,OAASo+B,EAAO7J,eAE5C6gD,EAAU51E,KAAK61E,UAAY71E,KAAK81E,kBACpCpB,GAAekB,EAAQhmE,KAAOgmE,EAAQhrD,MAClC8pD,IAAgB10E,KAAK00E,aAAgBhf,MAAMgf,KAC3C10E,KAAK00E,YAAcA,EACnB10E,KAAK8O,QAAQR,MAAMgB,MAAQpI,KAAK6uE,KAAK/1E,KAAK00E,aAAe,KACzD10E,KAAKupB,MAAM,oBAAqBmrD,KAIxC10E,KAAK21E,aAAc,EAEnB31E,KAAKg2E,kBAAmB,EACxBh2E,KAAKq1E,UAAY,GACjBr1E,KAAKi2E,mBAAqB,SAASllD,GAC/B/wB,KAAKq1E,WAAatkD,GAAQ,CACtBI,SAAU,WAAY,MAAO,IAC7BskD,QAAS,WAAY,MAAO,MAIpCz1E,KAAKk2E,mBAAqB,WACtB,OAAOl2E,KAAKg2E,kBAGhBh2E,KAAKy0E,kBAAmB,EACxBz0E,KAAK4sE,mBAAqB,SAAS77C,GAC3BA,EACArN,EAAIjW,YAAYzN,KAAK8O,QAAS,uBAE9B4U,EAAIhW,eAAe1N,KAAK8O,QAAS,uBAErC9O,KAAKy0E,iBAAmB1jD,EACxB/wB,KAAK61E,SAAW,MAGpB71E,KAAK6sE,mBAAqB,WACtB,OAAO7sE,KAAKy0E,kBAGhBz0E,KAAK81E,gBAAkB,WACnB,IAAK91E,KAAK8O,QAAQyV,WACd,MAAO,CAAC3U,KAAM,EAAGgb,MAAO,GAC5B,IAAItc,EAAQoV,EAAI1U,cAAchP,KAAK8O,QAAQyV,YAI3C,OAHAvkB,KAAK61E,SAAW,GAChB71E,KAAK61E,SAASjmE,KAAOb,SAAST,EAAM6nE,aAAe,GAAK,EACxDn2E,KAAK61E,SAASjrD,MAAQ7b,SAAST,EAAM8nE,eAAiB,EAC/Cp2E,KAAK61E,UAGhB71E,KAAK4yB,UAAY,SAASmxB,GACtB,IAAI6xB,EAAU51E,KAAK61E,UAAY71E,KAAK81E,kBAChCnsD,EAAO3pB,KAAK8O,QAAQ+a,wBACxB,OAAIk6B,EAAMjgD,EAAI8xE,EAAQhmE,KAAO+Z,EAAK/Z,KACvB,UACP5P,KAAKy0E,kBAAoB1wB,EAAMjgD,EAAI6lB,EAAKiB,MAAQgrD,EAAQhrD,MACjD,mBADX,KAILppB,KAAK+yE,EAAOjzE,WAEfqB,EAAQ4xE,OAASA,IAIjBlxE,IAAIlD,OAAO,mBAAmB,CAAC,UAAU,UAAU,SAAS,YAAY,eAAgB,SAAS0B,EAAUc,EAASvC,GACpH,aAEA,IAAIkrC,EAAQzpC,EAAS,YAAYypC,MAC7B5nB,EAAM7hB,EAAS,cAEfw0E,EAAS,SAAS7B,GAClBx0E,KAAK8O,QAAU4U,EAAIzY,cAAc,OACjCjL,KAAK8O,QAAQtB,UAAY,6BACzBgnE,EAASjmE,YAAYvO,KAAK8O,WAG9B,WAgEI,SAASwnE,EAAeC,EAAIC,EAAIC,EAAIC,GAChC,OAAQH,EAAK,EAAI,IAAMC,EAAK,EAAI,IAAMC,EAAK,EAAI,IAAMC,EAAK,EAAI,GA/DlE12E,KAAK61E,SAAW,EAEhB71E,KAAK22E,WAAa,SAASf,GACvB51E,KAAK61E,SAAWD,GAEpB51E,KAAK0kE,WAAa,SAAS58C,GACvB9nB,KAAK8nB,QAAUA,GAGnB9nB,KAAK42E,WAAa,SAAS/iB,GACvB7zD,KAAK6zD,QAAUA,GAGnB7zD,KAAKyoD,OAAS,SAAS7pB,GACnB,GAAKA,EAAL,CAEA5+B,KAAK4+B,OAASA,EAGd,IAAIhO,EAAO,GACX,IAAK,IAAI5kB,KAAOhM,KAAK6zD,QAAS,CAC1B,IAAIH,EAAS1zD,KAAK6zD,QAAQ7nD,GAE1B,GAAK0nD,EAAOhrC,MAAZ,CAKA,IAAIA,EAAQgrC,EAAOhrC,MAAMgkB,SAAS9N,EAAO+N,SAAU/N,EAAOgO,SAC1D,IAAIlkB,EAAMlD,UAGV,GADAkD,EAAQA,EAAMukB,cAAcjtC,KAAK8nB,SAC7B4rC,EAAO1qC,SAAU,CACjB,IAAIc,EAAM9pB,KAAK62E,QAAQnuD,EAAM5hB,MAAM2lB,IAAKmS,GACpChvB,EAAO5P,KAAK61E,UAAY71E,KAAK8nB,QAAQwqB,aAAavK,UAAUrf,EAAM5hB,MAAM2lB,KACtEzsB,KAAK8nB,QAAQwqB,aAAapI,WAAWxhB,EAAM5hB,MAAM6lB,QACjDjE,EAAM5hB,MAAM6lB,OAASiS,EAAO7J,gBAClC2+B,EAAO1qC,SAAS4H,EAAMlI,EAAO9Y,EAAMka,EAAK8U,OAClB,YAAf80B,EAAOh4C,KACd1b,KAAK82E,mBAAmBlmD,EAAMlI,EAAOgrC,EAAOrL,MAAOzpB,GAC7B,cAAf80B,EAAOh4C,KACd1b,KAAK+2E,qBAAqBnmD,EAAMlI,EAAOgrC,EAAOrL,MAAOzpB,GAC9ClW,EAAM0G,cACM,QAAfskC,EAAOh4C,KACP1b,KAAKg3E,eAAepmD,EAAMlI,EAAOgrC,EAAOrL,MAAOzpB,GAE/C5+B,KAAKi3E,oBAAoBrmD,EAAMlI,EAAOgrC,EAAOrL,MAAOzpB,GAEpD5+B,KAAK8nB,QAAQwqB,aAAavK,UAAUrf,EAAM5hB,MAAM2lB,KAChDzsB,KAAKk3E,yBAAyBtmD,EAAMlI,EAAOgrC,EAAOrL,MAAQ,sBAA4BzpB,GAEtF5+B,KAAK2oD,qBAAqB/3B,EAAMlI,EAAOgrC,EAAOrL,MAAQ,sBAA4BzpB,QA3BtF80B,EAAOjL,OAAO73B,EAAM5wB,KAAMA,KAAK8nB,QAAS8W,GA+BhD5+B,KAAK8O,QAAQgC,UAAY8f,EAAKpuB,KAAK,MAGvCxC,KAAK62E,QAAU,SAASpqD,EAAKqI,GACzB,OAAQrI,EAAMqI,EAAYqiD,gBAAkBriD,EAAYD,YAM5D70B,KAAKg3E,eAAiB,SAASI,EAAe1uD,EAAO2/B,EAAOvzB,EAAauiD,GAUrE,IATA,IAAIvvD,EAAU9nB,KAAK8nB,QACfhhB,EAAQ4hB,EAAM5hB,MAAM2lB,IACpB5B,EAAMnC,EAAMmC,IAAI4B,IAChBA,EAAM3lB,EACN0+D,EAAO,EACP8R,EAAO,EACPvhC,EAAOjuB,EAAQyzC,uBAAuB9uC,GACtC8qD,EAAgB,KAChBC,EAAY,IAAIlsC,EAAM7e,EAAK/D,EAAM5hB,MAAM6lB,OAAQF,EAAK6qD,GACjD7qD,GAAO5B,EAAK4B,IACf+qD,EAAU1wE,MAAM2lB,IAAM+qD,EAAU3sD,IAAI4B,IAAMA,EAC1C+qD,EAAU1wE,MAAM6lB,OAASF,GAAO3lB,EAAQ4hB,EAAM5hB,MAAM6lB,OAAS7E,EAAQwzC,iBAAiB7uC,GACtF+qD,EAAU3sD,IAAI8B,OAASopB,EACvByvB,EAAO8R,EACPA,EAAOvhC,EACPA,EAAOtpB,EAAM,EAAI5B,EAAM/C,EAAQyzC,uBAAuB9uC,EAAM,GAAKA,GAAO5B,EAAM,EAAInC,EAAMmC,IAAI8B,OAC5F4qD,EAAgBlvB,GAAS57B,GAAO3lB,EAAS,aAAe,IAAM,UACxDwvE,EAAe7pD,GAAO3lB,GAAS2lB,GAAO3lB,EAAQ,GAAK4hB,EAAM5hB,MAAM6lB,OAAQ64C,EAAO8R,EAAMA,EAAOvhC,EAAMtpB,GAAO5B,GAE1G7qB,KAAK8nB,QAAQwqB,aAAavK,UAAUtb,GACpCzsB,KAAKk3E,yBAAyBE,EAAeI,EAAWD,EACpDziD,EAAarI,GAAO5B,EAAM,EAAI,EAAGwsD,GAErCr3E,KAAK2oD,qBAAqByuB,EAAeI,EAAWD,EAChDziD,EAAarI,GAAO5B,EAAM,EAAI,EAAGwsD,IAIjDr3E,KAAKi3E,oBAAsB,SAASG,EAAe1uD,EAAO2/B,EAAOzpB,EAAQy4C,GACrE,IACI7nE,EAAQsa,EAAKla,EADbgmE,EAAU51E,KAAK61E,SAGpB,GADCwB,EAAaA,GAAc,GACxBr3E,KAAK8nB,QAAQwqB,aAAavK,UAAUrf,EAAM5hB,MAAM2lB,KAAM,CACtD,IAAIgrD,EAAS/uD,EAAMqkB,QACnB0qC,EAAO5sD,IAAI4B,IAAMgrD,EAAO3wE,MAAM2lB,IAC9BgrD,EAAO5sD,IAAI8B,OAAS3sB,KAAK8nB,QAAQoZ,QAAQu2C,EAAO3wE,MAAM2lB,KAAKjsB,OAC3DR,KAAKk3E,yBAAyBE,EAAeK,EAAQpvB,EAAQ,qBAAsBzpB,EAAQ,KAAMy4C,QAEjG7nE,EAASovB,EAAO/J,WAChB/K,EAAM9pB,KAAK62E,QAAQnuD,EAAM5hB,MAAM2lB,IAAKmS,GACpChvB,EAAOgmE,EAAUltD,EAAM5hB,MAAM6lB,OAASiS,EAAO7J,eAC7CqiD,EAAct1E,KACV,eAAgBumD,EAAO,8BACvB,UAAW74C,EAAQ,MACnB,WACA,OAAQsa,EAAK,MACb,QAASla,EAAM,MAAOynE,EAAY,YAGzC,GAAIr3E,KAAK8nB,QAAQwqB,aAAavK,UAAUrf,EAAMmC,IAAI4B,KAAM,CACjDgrD,EAAS/uD,EAAMqkB,QACnB0qC,EAAO3wE,MAAM2lB,IAAMgrD,EAAO5sD,IAAI4B,IAC9BgrD,EAAO3wE,MAAM6lB,OAAS,EACtB3sB,KAAKk3E,yBAAyBE,EAAeK,EAAQpvB,EAAQ,YAAazpB,EAAQ,KAAMy4C,OACpF,CACJ,IAAI/nE,EAAQoZ,EAAMmC,IAAI8B,OAASiS,EAAO7J,eACtCvlB,EAASovB,EAAO/J,WAChB/K,EAAM9pB,KAAK62E,QAAQnuD,EAAMmC,IAAI4B,IAAKmS,GAClCw4C,EAAct1E,KACV,eAAgBumD,EAAO,qBACvB,UAAW74C,EAAQ,MACnB,SAAUF,EAAO,MACjB,OAAQwa,EAAK,MACb,QAAS8rD,EAAS,MAAOyB,EAAY,YAI5C,GADA7nE,GAAUkZ,EAAMmC,IAAI4B,IAAM/D,EAAM5hB,MAAM2lB,IAAM,GAAKmS,EAAO/J,aACpDrlB,GAAU,GAAd,CAEAsa,EAAM9pB,KAAK62E,QAAQnuD,EAAM5hB,MAAM2lB,IAAM,EAAGmS,GAExC,IAAI84C,GAAehvD,EAAM5hB,MAAM6lB,OAAS,EAAI,IAAMjE,EAAMmC,IAAI8B,OAAS,EAAI,GAEzEyqD,EAAct1E,KACV,eAAgBumD,EAAQqvB,EAAc,UAAYA,EAAc,GAAK,YACrE,UAAWloE,EAAQ,MACnB,WACA,OAAQsa,EAAK,MACb,QAAS8rD,EAAS,MAAOyB,EAAY,cAG7Cr3E,KAAK2oD,qBAAuB,SAASyuB,EAAe1uD,EAAO2/B,EAAOzpB,EAAQ+4C,EAAaN,GACnF,IAAI7nE,EAASovB,EAAO/J,WAChBvlB,GAASoZ,EAAMmC,IAAI8B,QAAUgrD,GAAe,GAAKjvD,EAAM5hB,MAAM6lB,QAAUiS,EAAO7J,eAE9EjL,EAAM9pB,KAAK62E,QAAQnuD,EAAM5hB,MAAM2lB,IAAKmS,GACpChvB,EAAO5P,KAAK61E,SAAWntD,EAAM5hB,MAAM6lB,OAASiS,EAAO7J,eAEvDqiD,EAAct1E,KACV,eAAgBumD,EAAO,YACvB,UAAW74C,EAAQ,MACnB,SAAUF,EAAO,MACjB,OAAQwa,EAAK,MACb,QAASla,EAAM,MAAOynE,GAAc,GAAI,aAGhDr3E,KAAKk3E,yBAA2B,SAASE,EAAe1uD,EAAO2/B,EAAOzpB,EAAQ+4C,EAAaN,GACvF,IAAI7nE,EAASovB,EAAO/J,WAAY/K,EAAM9pB,KAAK62E,QAAQnuD,EAAM5hB,MAAM2lB,IAAKmS,GAASg3C,EAAU51E,KAAK61E,SACxFprC,EAAazqC,KAAK8nB,QAAQwqB,aAAajI,cAAc3hB,EAAM5hB,MAAM6lB,OAAQjE,EAAMmC,IAAI8B,QAEvF8d,EAAWviC,QAAQ,SAAS4d,GACxBsxD,EAAct1E,KACV,eAAgBumD,EAAO,YACvB,UAAW74C,EAAQ,MACnB,SAAUsW,EAAUxW,OAASqoE,GAAe,GAAI,MAChD,OAAQ7tD,EAAK,MACb,QAAS8rD,EAAU9vD,EAAUlW,KAAM,MAAOynE,GAAc,GAAI,eAKxEr3E,KAAK82E,mBAAqB,SAASM,EAAe1uD,EAAO2/B,EAAOzpB,EAAQy4C,GACpE,IAAIvtD,EAAM9pB,KAAK62E,QAAQnuD,EAAM5hB,MAAM2lB,IAAKmS,GACpCpvB,EAASovB,EAAO/J,WAChBnM,EAAM5hB,MAAM2lB,KAAO/D,EAAMmC,IAAI4B,MAC7Bjd,GAAUxP,KAAK62E,QAAQnuD,EAAMmC,IAAI4B,IAAKmS,GAAU9U,GAEpDstD,EAAct1E,KACV,eAAgBumD,EAAO,YACvB,UAAW74C,EAAQ,MACnB,OAAQsa,EAAK,MACb,kBAAmButD,GAAc,GAAI,aAI7Cr3E,KAAK+2E,qBAAuB,SAASK,EAAe1uD,EAAO2/B,EAAOzpB,EAAQy4C,GACtE,IAAIvtD,EAAM9pB,KAAK62E,QAAQnuD,EAAM5hB,MAAM2lB,IAAKmS,GACpCpvB,EAASovB,EAAO/J,WAEpBuiD,EAAct1E,KACV,eAAgBumD,EAAO,YACvB,UAAW74C,EAAQ,MACnB,OAAQsa,EAAK,MACb,kBAAmButD,GAAc,GAAI,eAI9C71E,KAAK60E,EAAO/0E,WAEfqB,EAAQ0zE,OAASA,IAIjBhzE,IAAIlD,OAAO,iBAAiB,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,eAAe,oBAAoB,yBAA0B,SAAS0B,EAAUc,EAASvC,GAC/K,aAEA,IAAI4R,EAAMnQ,EAAS,cACf6hB,EAAM7hB,EAAS,cACf8hB,EAAO9hB,EAAS,eAEhB63B,GADY73B,EAAS,oBACNA,EAAS,wBAAwB63B,cAEhDk+C,EAAO,SAASpD,GAChBx0E,KAAK8O,QAAU4U,EAAIzY,cAAc,OACjCjL,KAAK8O,QAAQtB,UAAY,2BACzBgnE,EAASjmE,YAAYvO,KAAK8O,SAC1B9O,KAAK63E,eAAiB73E,KAAK63E,eAAe1yE,KAAKnF,QAGnD,WAEIgS,EAAIF,UAAU9R,KAAM05B,GAEpB15B,KAAK83E,SAAW,IAChB93E,KAAK+3E,YAAc,IACnB/3E,KAAKg4E,cAAgB,IACrBh4E,KAAKi4E,SAAWj4E,KAAK+3E,YACrB/3E,KAAKk4E,SAAW,IAChBl4E,KAAKm4E,WAAa,IAClBn4E,KAAK61E,SAAW,EAEhB71E,KAAK63E,eAAiB,WAClB,IAAII,EAAqD,MAA1Cj4E,KAAK8nB,QAAQ/a,IAAIi4C,sBAC3BhlD,KAAK+3E,YACL/3E,KAAKg4E,cACV,GAAIh4E,KAAKi4E,UAAYA,EAEjB,OADAj4E,KAAKi4E,SAAWA,GACT,GAIfj4E,KAAK22E,WAAa,SAASf,GACvB51E,KAAK61E,SAAWD,EAChB51E,KAAK8O,QAAQR,MAAMsnE,QAAU,KAAOA,EAAU,MAGlD51E,KAAKo4E,cAAgB,WACjB,OAAOp4E,KAAKq4E,aAAa3uC,eAAel6B,QAAU,GAGtDxP,KAAKy8D,kBAAoB,WACrB,OAAOz8D,KAAKq4E,aAAa3uC,eAAep6B,OAAS,GAGrDtP,KAAKs8D,gBAAkB,SAASgc,GAC5Bt4E,KAAKq4E,aAAeC,EACpBt4E,KAAKq4E,aAAapwD,GAAG,sBAAuB,SAAS7L,GACjDpc,KAAKuyB,QAAQ,sBAAuBnW,IACtCjX,KAAKnF,OACPA,KAAKu4E,oBAGTv4E,KAAKw4E,oBAAsB,WACvBx4E,KAAKq4E,aAAaG,uBAEtBx4E,KAAKu4E,iBAAmB,WACpB,OAAOv4E,KAAKy4E,sBAAwBz4E,KAAKq4E,aAAaE,oBAE1Dv4E,KAAK0kE,WAAa,SAAS58C,GACvB9nB,KAAK8nB,QAAUA,EACXA,GACA9nB,KAAK04E,qBAGb14E,KAAKwnC,gBAAiB,EACtBxnC,KAAK8pC,kBAAoB,SAAStC,GAC9B,OAAIxnC,KAAKwnC,gBAAkBA,IAG3BxnC,KAAKwnC,eAAiBA,EACtBxnC,KAAK04E,qBACE,IAGX14E,KAAKuyE,qBAAsB,EAC3BvyE,KAAKksE,uBAAyB,SAASz8D,GACnC,OAAIzP,KAAKuyE,qBAAuB9iE,IAGhCzP,KAAKuyE,oBAAsB9iE,EAC3BzP,KAAK04E,qBACE,IAGX14E,KAAK24E,YAAc,GACnB34E,KAAKknE,gBACLlnE,KAAK04E,kBAAoB,WACrB,IAAIjoC,EAAUzwC,KAAK8nB,QAAQ6oB,aAC3B3wC,KAAKywC,QAAUA,EAEf,IADA,IAAImoC,EAAS54E,KAAK24E,YAAc,CAAC,GACxBj3E,EAAI,EAAGA,EAAI+uC,EAAU,EAAG/uC,IACzB1B,KAAKwnC,eACLoxC,EAAO92E,KAAK,iDACN6hB,EAAK/B,aAAa5hB,KAAKk4E,SAAUx2E,GACjC,WAENk3E,EAAO92E,KAAK6hB,EAAK/B,aAAa,IAAKlgB,IAG3C,GAAI1B,KAAKuyE,oBAAqB,CAC1BvyE,KAAK64E,eAAkB,mBACvB,IAAIrrE,EAAY,mBACZsrE,EAAa,GACbC,EAAW,GACf,GAAI/4E,KAAKwnC,eAAgB,CACrBh6B,GAAa,iBACbsrE,EAAa,uBACbC,EAAW,qBACX,IAAIC,EAAer1D,EAAK/B,aAAa5hB,KAAKm4E,WAAYn4E,KAAKywC,SACvDwoC,EAAat1D,EAAK/B,aAAa5hB,KAAKk4E,SAAUl4E,KAAKywC,cAEnDuoC,EAAer1D,EAAK/B,aAAa,IAAK5hB,KAAKywC,SAC3CwoC,EAAaD,EAGrBh5E,KAAK24E,YAAY,KAAO,gBAAkBnrE,EAAYsrE,EAAa,KAAOE,EAAe,UACzFh5E,KAAK24E,YAAY,MAAQ,gBAAkBnrE,EAAYurE,EAAW,KAAOE,EAAa,YAI9Fj5E,KAAKwpE,YAAc,SAAS5qC,EAAQ+N,EAAUC,GACtC5sC,KAAK4+B,OAAOgO,SAAWhO,EAAOgO,SAC9B5sC,KAAK4+B,OAAO+N,UAAY/N,EAAO+N,UAC/B3sC,KAAKk5E,YAAYt6C,GAErB5+B,KAAK4+B,OAASA,EAQd,IANA,IAAIopB,EAAQ9gD,KAAKC,IAAIwlC,EAAU/N,EAAO+N,UAClCnrB,EAAOta,KAAKM,IAAIolC,EAAShO,EAAOgO,SAEhCusC,EAAen5E,KAAK8O,QAAQsqE,WAC5BC,EAAkB,EAEb5sD,EAAMmS,EAAO+N,SAAUlgB,EAAMu7B,EAAOv7B,IAAO,CAChD,IAAI2jB,EAAWpwC,KAAK8nB,QAAQuoB,YAAY5jB,GACxC,GAAI2jB,EAAU,CACV,GAAIA,EAASgZ,YAAYpB,GAAQ,CAC7BA,EAAQ5X,EAAStpC,MAAM2lB,IACvB,MAEAA,EAAM2jB,EAASvlB,IAAI4B,IAG3B4sD,IAGA5sD,EAAMu7B,EACN5X,EAAWpwC,KAAK8nB,QAAQqkC,gBAAgB1/B,GAD5C,IAEIiqC,EAAYtmB,EAAWA,EAAStpC,MAAM2lB,IAAM2zB,IAEhD,MAAO,EAAM,CAMT,GALI3zB,EAAMiqC,IACNjqC,EAAM2jB,EAASvlB,IAAI4B,IAAI,EACvB2jB,EAAWpwC,KAAK8nB,QAAQqkC,gBAAgB1/B,EAAK2jB,GAC7CsmB,EAAYtmB,EAAWA,EAAStpC,MAAM2lB,IAAK2zB,KAE3C3zB,EAAMjL,EACN,MAEJ,IAAI83D,EAAcH,EAAaE,KAC/B,GAAIC,EAAa,CACb,IAAI1oD,EAAO,GACX5wB,KAAKu5E,YACD3oD,EAAMnE,GAAMzsB,KAAKw5E,iBAAkB/sD,GAAOiqC,GAAYtmB,GAE1DkpC,EAAYhrE,MAAMkB,OAASovB,EAAO/J,WAAa70B,KAAK8nB,QAAQszC,aAAa3uC,GAAO,KAChF6sD,EAAYxoE,UAAY8f,EAAKpuB,KAAK,IAEtCiqB,MAIRzsB,KAAKk5E,YAAc,SAASt6C,GACxB,IAAI66C,EAAYz5E,KAAK4+B,OAGrB,GAFA5+B,KAAK4+B,OAASA,GAET66C,GAAaA,EAAU7sC,QAAUhO,EAAO+N,SACzC,OAAO3sC,KAAKyoD,OAAO7pB,GAEvB,GAAIA,EAAOgO,QAAU6sC,EAAU9sC,SAC3B,OAAO3sC,KAAKyoD,OAAO7pB,GAEvB,IAAItxB,EAAKtN,KAAK8O,QACd,GAAI2qE,EAAU9sC,SAAW/N,EAAO+N,SAC5B,IAAK,IAAIlgB,EAAIzsB,KAAK8nB,QAAQskC,kBAAkBqtB,EAAU9sC,SAAU/N,EAAO+N,SAAW,GAAIlgB,EAAI,EAAGA,IACzFnf,EAAG4C,YAAY5C,EAAGiX,YAE1B,GAAIk1D,EAAU7sC,QAAUhO,EAAOgO,QAC3B,IAASngB,EAAIzsB,KAAK8nB,QAAQskC,kBAAkBxtB,EAAOgO,QAAU,EAAG6sC,EAAU7sC,SAAUngB,EAAI,EAAGA,IACvFnf,EAAG4C,YAAY5C,EAAGosE,WAE1B,GAAI96C,EAAO+N,SAAW8sC,EAAU9sC,SAAU,CACtC,IAAIgtC,EAAW35E,KAAK45E,qBAAqBh7C,EAAQA,EAAO+N,SAAU8sC,EAAU9sC,SAAW,GACnFr/B,EAAGiX,WACHjX,EAAGgX,aAAaq1D,EAAUrsE,EAAGiX,YAE7BjX,EAAGiB,YAAYorE,GAGvB,GAAI/6C,EAAOgO,QAAU6sC,EAAU7sC,QAAS,CAChC+sC,EAAW35E,KAAK45E,qBAAqBh7C,EAAQ66C,EAAU7sC,QAAU,EAAGhO,EAAOgO,SAC/Et/B,EAAGiB,YAAYorE,KAIvB35E,KAAK45E,qBAAuB,SAASh7C,EAAQ+N,EAAUC,GACnD,IAAI+sC,EAAW35E,KAAK8O,QAAQquB,cAAc08C,yBACtCptD,EAAMkgB,EACNyD,EAAWpwC,KAAK8nB,QAAQqkC,gBAAgB1/B,GACxCiqC,EAAYtmB,EAAWA,EAAStpC,MAAM2lB,IAAM2zB,IAEhD,MAAO,EAAM,CAMT,GALI3zB,EAAMiqC,IACNjqC,EAAM2jB,EAASvlB,IAAI4B,IAAI,EACvB2jB,EAAWpwC,KAAK8nB,QAAQqkC,gBAAgB1/B,EAAK2jB,GAC7CsmB,EAAYtmB,EAAWA,EAAStpC,MAAM2lB,IAAM2zB,KAE5C3zB,EAAMmgB,EACN,MAEJ,IAAIhjB,EAAYlG,EAAIzY,cAAc,OAE9B2lB,EAAO,GAGX,GAFA5wB,KAAKu5E,YAAY3oD,EAAMnE,GAAK,EAAOA,GAAOiqC,GAAYtmB,GACtDxmB,EAAU9Y,UAAY8f,EAAKpuB,KAAK,IAC5BxC,KAAKw5E,iBACL5vD,EAAUpc,UAAY,iBACtBmsE,EAASprE,YAAYqb,GACrBA,EAAUtb,MAAMkB,OAASovB,EAAO/J,WAAa70B,KAAK8nB,QAAQszC,aAAa3uC,GAAO,UAG9E,MAAM7C,EAAUrF,WACZo1D,EAASprE,YAAYqb,EAAUrF,YAGvCkI,IAEJ,OAAOktD,GAGX35E,KAAKyoD,OAAS,SAAS7pB,GACnB5+B,KAAK4+B,OAASA,EAEd,IAAIhO,EAAO,GACP+b,EAAW/N,EAAO+N,SAAUC,EAAUhO,EAAOgO,QAE7CngB,EAAMkgB,EACNyD,EAAWpwC,KAAK8nB,QAAQqkC,gBAAgB1/B,GACxCiqC,EAAYtmB,EAAWA,EAAStpC,MAAM2lB,IAAM2zB,IAEhD,MAAO,EAAM,CAMT,GALI3zB,EAAMiqC,IACNjqC,EAAM2jB,EAASvlB,IAAI4B,IAAI,EACvB2jB,EAAWpwC,KAAK8nB,QAAQqkC,gBAAgB1/B,EAAK2jB,GAC7CsmB,EAAYtmB,EAAWA,EAAStpC,MAAM2lB,IAAK2zB,KAE3C3zB,EAAMmgB,EACN,MAEA5sC,KAAKw5E,kBACL5oD,EAAK9uB,KAAK,6CAA8C88B,EAAO/J,WAAW70B,KAAK8nB,QAAQszC,aAAa3uC,GAAM,QAE9GzsB,KAAKu5E,YAAY3oD,EAAMnE,GAAK,EAAOA,GAAOiqC,GAAYtmB,GAElDpwC,KAAKw5E,kBACL5oD,EAAK9uB,KAAK,UAEd2qB,IAEJzsB,KAAK8O,QAAQgC,UAAY8f,EAAKpuB,KAAK,KAGvCxC,KAAK85E,WAAa,CACd,MAAQ,EACR,QAAU,EACV,QAAU,GAGd95E,KAAK+5E,aAAe,SAAS3C,EAAejc,EAAc5mB,EAAO7rC,GAC7D,IAAIJ,EAAOtI,KACPg6E,EAAa,wjBACbC,EAAc,SAASrxD,EAAGjiB,EAAGwiD,EAAG+wB,EAAQC,GACxC,GAAIxzE,EACA,OAAO2B,EAAKk/B,eACN,mDAAqD7jB,EAAK/B,aAAatZ,EAAK6vE,WAAYvvD,EAAEpoB,QAAU,UACpGooB,EACH,GAAS,KAALA,EACP,MAAO,QACJ,GAAS,KAALA,EACP,MAAO,QACJ,GAAS,KAALA,EACP,MAAO,QACJ,GAAS,MAALA,EAAW,CAClB,IAAI6nB,EAAUnoC,EAAKwf,QAAQuhB,iBAAiB8xB,EAAe+e,GAE3D,OADA/e,GAAgB1qB,EAAU,EACnBnoC,EAAKqwE,YAAYloC,GACrB,GAAS,KAAL7nB,EAAe,CACtB,IAAIwxD,EAAa9xE,EAAKk/B,eAAiB,4CAA8C,UACjF6yC,EAAQ/xE,EAAKk/B,eAAiBl/B,EAAK6vE,WAAa,GAEpD,OADAhd,GAAgB,EACT,gBAAkBif,EAAa,kBACJ,EAA7B9xE,EAAKs2B,OAAO7J,eACb,OAASslD,EAAQ,UAClB,OAAIlxB,EACA,+DAAiE7gD,EAAK6vE,WAAa,WAE1Fhd,GAAgB,EACT,sCAC2B,EAA7B7yD,EAAKs2B,OAAO7J,eACb,OAASnM,EAAI,YAIrB0xD,EAAS5xE,EAAMhG,QAAQs3E,EAAYC,GAEvC,GAAKj6E,KAAK85E,WAAWvlC,EAAM74B,MAQvB07D,EAAct1E,KAAKw4E,OARW,CAC9B,IAAI/sE,EAAU,OAASgnC,EAAM74B,KAAKhZ,QAAQ,MAAO,SAC7C4L,EAAQ,GACM,QAAdimC,EAAM74B,OACNpN,EAAQ,iBAAoBimC,EAAM7rC,MAAMlI,OAASR,KAAK4+B,OAAO7J,eAAkB,SACnFqiD,EAAct1E,KAAK,gBAAiByL,EAAS,IAAKe,EAAO,IAAKgsE,EAAQ,WAK1E,OAAOnf,EAAezyD,EAAMlI,QAGhCR,KAAKu6E,kBAAoB,SAASnD,EAAe1uE,EAAOvB,GACpD,IAAIqzE,EAAO9xE,EAAM4oC,OAAOtxC,KAAK64E,gBAC7B,OAAI2B,GAAQ,GAAKA,GAAQrzE,EACduB,EACK,KAAZA,EAAM,IACN8xE,GAAQA,EAAOx6E,KAAKywC,QACpB2mC,EAAct1E,KAAK6hB,EAAK/B,aAAa5hB,KAAK24E,YAAY,KAAM6B,EAAKx6E,KAAKywC,UAC/D/nC,EAAM8d,OAAOg0D,IACD,MAAZ9xE,EAAM,IACb0uE,EAAct1E,KAAK6hB,EAAK/B,aAAa5hB,KAAK24E,YAAY,MAAO6B,IACtD9xE,EAAM8d,OAAOg0D,IAEjB9xE,GAGX1I,KAAKy6E,mBAAqB,SAASrD,EAAejiC,EAAQnM,EAAQ0xC,GAM9D,IALA,IAAIj2C,EAAQ,EACRriC,EAAQ,EACRu4E,EAAa3xC,EAAO,GACpBmyB,EAAe,EAEVz5D,EAAI,EAAGA,EAAIyzC,EAAO30C,OAAQkB,IAAK,CACpC,IAAI6yC,EAAQY,EAAOzzC,GACfgH,EAAQ6rC,EAAM7rC,MAClB,GAAS,GAALhH,GAAU1B,KAAKuyE,oBAAqB,CAGpC,GAFA9tC,EAAQ/7B,EAAMlI,OACdkI,EAAQ1I,KAAKu6E,kBAAkBnD,EAAe1uE,EAAOiyE,IAChDjyE,EACD,SACJ+7B,GAAS/7B,EAAMlI,OAGnB,GAAIikC,EAAQ/7B,EAAMlI,OAASm6E,EACvBxf,EAAen7D,KAAK+5E,aAAa3C,EAAejc,EAAc5mB,EAAO7rC,GACrE+7B,GAAS/7B,EAAMlI,WACZ,CACH,MAAOikC,EAAQ/7B,EAAMlI,QAAUm6E,EAC3Bxf,EAAen7D,KAAK+5E,aAChB3C,EAAejc,EACf5mB,EAAO7rC,EAAMge,UAAU,EAAGi0D,EAAal2C,IAE3C/7B,EAAQA,EAAMge,UAAUi0D,EAAal2C,GACrCA,EAAQk2C,EAEHD,GACDtD,EAAct1E,KAAK,SACf,uCACA9B,KAAK4+B,OAAO/J,WAAY,QAIhCuiD,EAAct1E,KAAK6hB,EAAK/B,aAAa,IAAQonB,EAAOE,SAEpD9mC,IACA+4D,EAAe,EACfwf,EAAa3xC,EAAO5mC,IAAU+1D,OAAOC,UAErB,GAAhB1vD,EAAMlI,SACNikC,GAAS/7B,EAAMlI,OACf26D,EAAen7D,KAAK+5E,aAChB3C,EAAejc,EAAc5mB,EAAO7rC,OAOxD1I,KAAK46E,kBAAoB,SAASxD,EAAejiC,GAC7C,IAAIgmB,EAAe,EACf5mB,EAAQY,EAAO,GACfzsC,EAAQ6rC,EAAM7rC,MACd1I,KAAKuyE,sBACL7pE,EAAQ1I,KAAKu6E,kBAAkBnD,EAAe1uE,IAC9CA,IACAyyD,EAAen7D,KAAK+5E,aAAa3C,EAAejc,EAAc5mB,EAAO7rC,IACzE,IAAK,IAAIhH,EAAI,EAAGA,EAAIyzC,EAAO30C,OAAQkB,IAC/B6yC,EAAQY,EAAOzzC,GACfgH,EAAQ6rC,EAAM7rC,MACdyyD,EAAen7D,KAAK+5E,aAAa3C,EAAejc,EAAc5mB,EAAO7rC,IAG7E1I,KAAKu5E,YAAc,SAASnC,EAAe3qD,EAAKiuD,EAActqC,GAI1D,GAHKA,GAAwB,GAAZA,IACbA,EAAWpwC,KAAK8nB,QAAQuoB,YAAY5jB,IAEpC2jB,EACA,IAAI+E,EAASn1C,KAAK66E,mBAAmBpuD,EAAK2jB,QAEtC+E,EAASn1C,KAAK8nB,QAAQ+wB,UAAUpsB,GAYxC,GATKiuD,GACDtD,EAAct1E,KACV,uCACI9B,KAAK4+B,OAAO/J,YACR70B,KAAKw5E,iBAAmB,EAAGx5E,KAAK8nB,QAAQszC,aAAa3uC,IACtD,QAIX0oB,EAAO30C,OAAQ,CACf,IAAIwoC,EAAShpC,KAAK8nB,QAAQ6zC,gBAAgBlvC,GACtCuc,GAAUA,EAAOxoC,OACjBR,KAAKy6E,mBAAmBrD,EAAejiC,EAAQnM,EAAQ0xC,GAEvD16E,KAAK46E,kBAAkBxD,EAAejiC,GAG1Cn1C,KAAKwnC,iBACD4I,IACA3jB,EAAM2jB,EAASvlB,IAAI4B,KAEvB2qD,EAAct1E,KACV,iDACA2qB,GAAOzsB,KAAK8nB,QAAQoK,YAAc,EAAIlyB,KAAK83E,SAAW93E,KAAKi4E,SAC3D,YAGHyC,GACDtD,EAAct1E,KAAK,WAG3B9B,KAAK66E,mBAAqB,SAASpuD,EAAK2jB,GACpC,IAAItoB,EAAU9nB,KAAK8nB,QACfgzD,EAAe,GAEnB,SAASC,EAAU5lC,EAAQ3wC,EAAMsiD,GAC7B,IAAImD,EAAM,EAAG9f,EAAM,EACnB,MAAQA,EAAMgL,EAAO8U,GAAKvhD,MAAMlI,OAAUgE,EAItC,GAHA2lC,GAAOgL,EAAO8U,GAAKvhD,MAAMlI,OACzBypD,IAEIA,GAAO9U,EAAO30C,OACd,OAER,GAAI2pC,GAAO3lC,EAAM,CACb,IAAIkE,EAAQysC,EAAO8U,GAAKvhD,MAAMge,UAAUliB,EAAO2lC,GAC3CzhC,EAAMlI,OAAUsmD,EAAKtiD,IACrBkE,EAAQA,EAAMge,UAAU,EAAGogC,EAAKtiD,IAEpCs2E,EAAah5E,KAAK,CACd4Z,KAAMy5B,EAAO8U,GAAKvuC,KAClBhT,MAAOA,IAGXyhC,EAAM3lC,EAAOkE,EAAMlI,OACnBypD,GAAO,EAGX,MAAO9f,EAAM2c,GAAMmD,EAAM9U,EAAO30C,OAAQ,CAChCkI,EAAQysC,EAAO8U,GAAKvhD,MACpBA,EAAMlI,OAAS2pC,EAAM2c,EACrBg0B,EAAah5E,KAAK,CACd4Z,KAAMy5B,EAAO8U,GAAKvuC,KAClBhT,MAAOA,EAAMge,UAAU,EAAGogC,EAAK3c,KAGnC2wC,EAAah5E,KAAKqzC,EAAO8U,IAC7B9f,GAAOzhC,EAAMlI,OACbypD,GAAO,GAIf,IAAI9U,EAASrtB,EAAQ+wB,UAAUpsB,GAgB/B,OAfA2jB,EAASiZ,KAAK,SAASG,EAAa/8B,EAAKE,EAAQghC,EAAYpE,GACtC,MAAfC,EACAsxB,EAAah5E,KAAK,CACd4Z,KAAM,OACNhT,MAAO8gD,KAGPD,IACApU,EAASrtB,EAAQ+wB,UAAUpsB,IAE3B0oB,EAAO30C,QACPu6E,EAAU5lC,EAAQwY,EAAYhhC,KAEvCyjB,EAASvlB,IAAI4B,IAAKzsB,KAAK8nB,QAAQoZ,QAAQkP,EAASvlB,IAAI4B,KAAKjsB,QAErDs6E,GAGX96E,KAAKw5E,eAAiB,WAClB,OAAOx5E,KAAK8nB,QAAQ8wC,kBAGxB54D,KAAKoxB,QAAU,WACX0E,cAAc91B,KAAKy4E,uBACfz4E,KAAKg7E,cACLh7E,KAAKg7E,aAAajqE,WAAWb,YAAYlQ,KAAKg7E,qBAC3Ch7E,KAAKg7E,gBAGjBx5E,KAAKo2E,EAAKt2E,WAEbqB,EAAQi1E,KAAOA,IAIfv0E,IAAIlD,OAAO,mBAAmB,CAAC,UAAU,UAAU,SAAS,eAAgB,SAAS0B,EAAUc,EAASvC,GACxG,aAEA,IACI66E,EADAv3D,EAAM7hB,EAAS,cAGfq5E,EAAS,SAAS1G,GAClBx0E,KAAK8O,QAAU4U,EAAIzY,cAAc,OACjCjL,KAAK8O,QAAQtB,UAAY,6BACzBgnE,EAASjmE,YAAYvO,KAAK8O,cAEZ1N,IAAV65E,IACAA,IAAU,YAAaj7E,KAAK8O,QAAQR,QAExCtO,KAAKm7E,WAAY,EACjBn7E,KAAKqxE,YAAa,EAClBrxE,KAAKo7E,cAAgB,IACrBp7E,KAAKq7E,gBAAiB,EAEtBr7E,KAAKs7E,QAAU,GACft7E,KAAKwsB,OAASxsB,KAAKu7E,YACnB73D,EAAIjW,YAAYzN,KAAK8O,QAAS,sBAC9B9O,KAAKw7E,gBAAkBP,EACjBj7E,KAAKy7E,kBACLz7E,KAAK07E,gBAAgBv2E,KAAKnF,QAGpC,WAEIA,KAAKy7E,kBAAoB,SAASpzD,GAE9B,IADA,IAAIizD,EAAUt7E,KAAKs7E,QACV55E,EAAI45E,EAAQ96E,OAAQkB,KACzB45E,EAAQ55E,GAAG4M,MAAMqtE,WAAatzD,EAAM,GAAK,UAEjDroB,KAAK07E,eAAiB,SAASrzD,GAE3B,IADA,IAAIizD,EAAUt7E,KAAKs7E,QACV55E,EAAI45E,EAAQ96E,OAAQkB,KACzB45E,EAAQ55E,GAAG4M,MAAM+V,QAAUgE,EAAM,GAAK,KAI9CroB,KAAK61E,SAAW,EAChB71E,KAAK22E,WAAa,SAASf,GACvB51E,KAAK61E,SAAWD,GAGpB51E,KAAK0kE,WAAa,SAAS58C,GACvB9nB,KAAK8nB,QAAUA,GAGnB9nB,KAAK61B,YAAc,SAAS+lD,GACpBA,GAAY57E,KAAKqxE,aACjBrxE,KAAKqxE,WAAauK,EAClB57E,KAAK67E,iBAIb77E,KAAK87E,iBAAmB,SAASV,GACzBA,GAAiBp7E,KAAKo7E,gBACtBp7E,KAAKo7E,cAAgBA,EACrBp7E,KAAK67E,iBAIb77E,KAAKoxE,kBAAoB,SAASiK,GAC1BA,GAAkBr7E,KAAKq7E,gBAAmBJ,IAC1Cj7E,KAAKq7E,eAAiBA,EACtB33D,EAAI9V,YAAY5N,KAAK8O,QAAS,sBAAuBusE,GACrDr7E,KAAKw7E,gBAAe,GACpBx7E,KAAKw7E,eAAkBx7E,KAAmB,eAAEmF,KAAKnF,MACjDA,KAAK67E,iBAIb77E,KAAKu7E,UAAY,WACb,IAAIjuE,EAAKoW,EAAIzY,cAAc,OAI3B,OAHAqC,EAAGE,UAAY,aACfxN,KAAK8O,QAAQP,YAAYjB,GACzBtN,KAAKs7E,QAAQx5E,KAAKwL,GACXA,GAGXtN,KAAK+7E,aAAe,WAChB,GAAI/7E,KAAKs7E,QAAQ96E,OAAS,EAAG,CACzB,IAAI8M,EAAKtN,KAAKs7E,QAAQ9gD,MAEtB,OADAltB,EAAGyD,WAAWb,YAAY5C,GACnBA,IAIftN,KAAKopE,WAAa,WACdppE,KAAKm7E,WAAY,EACjBz3D,EAAIjW,YAAYzN,KAAK8O,QAAS,sBAC9B9O,KAAK67E,gBAGT77E,KAAKkpE,WAAa,WACdlpE,KAAKm7E,WAAY,EACjBz3D,EAAIhW,eAAe1N,KAAK8O,QAAS,sBACjC9O,KAAK67E,gBAGT77E,KAAK67E,aAAe,WAChB,IAAIpzB,EAASzoD,KAAKw7E,eASlB,GARA1lD,cAAc91B,KAAKg8E,YACnBz8D,aAAavf,KAAKi8E,WACdj8E,KAAKq7E,gBACL33D,EAAIhW,eAAe1N,KAAK8O,QAAS,uBAGrC25C,GAAO,GAEFzoD,KAAKqxE,YAAerxE,KAAKo7E,eAAkBp7E,KAAKm7E,UAArD,CAGIn7E,KAAKq7E,gBACL77D,WAAW,WACPkE,EAAIjW,YAAYzN,KAAK8O,QAAS,wBAChC3J,KAAKnF,OAGX,IAAIk8E,EAAQ,WACRl8E,KAAKi8E,UAAYz8D,WAAW,WACxBipC,GAAO,IACR,GAAMzoD,KAAKo7E,gBAChBj2E,KAAKnF,MAEPA,KAAKg8E,WAAajmD,YAAY,WAC1B0yB,GAAO,GACPyzB,KACDl8E,KAAKo7E,eAERc,MAGJl8E,KAAKm8E,iBAAmB,SAASxsE,EAAUysE,GACvC,IAAKp8E,KAAK4+B,SAAW5+B,KAAK8nB,QACtB,MAAO,CAAClY,KAAO,EAAGka,IAAM,GAEvBna,IACDA,EAAW3P,KAAK8nB,QAAQhC,UAAUioB,aACtC,IAAI/mC,EAAMhH,KAAK8nB,QAAQqlB,yBAAyBx9B,GAC5C0sE,EAAar8E,KAAK61E,UAAY71E,KAAK8nB,QAAQwqB,aAAavK,UAAU/gC,EAAIylB,IAAK9c,EAAS8c,KAClFzsB,KAAK8nB,QAAQwqB,aAAapI,WAAWljC,EAAI2lB,QACzC3lB,EAAI2lB,OAAS3sB,KAAK4+B,OAAO7J,gBAE3BunD,GAAat1E,EAAIylB,KAAO2vD,EAAWp8E,KAAK4+B,OAAOu4C,eAAiB,IAChEn3E,KAAK4+B,OAAO/J,WAEhB,MAAO,CAACjlB,KAAOysE,EAAYvyD,IAAMwyD,IAGrCt8E,KAAKyoD,OAAS,SAAS7pB,GACnB5+B,KAAK4+B,OAASA,EAEd,IAAI6L,EAAazqC,KAAK8nB,QAAQy0D,kBAC1B76E,EAAI,EAAG86E,EAAc,OAENp7E,IAAfqpC,GAAkD,IAAtBA,EAAWjqC,SACvCiqC,EAAa,CAAC,CAACje,OAAQ,QAGlB9qB,EAAI,EAAb,IAAK,IAAWgL,EAAI+9B,EAAWjqC,OAAQkB,EAAIgL,EAAGhL,IAAK,CAC/C,IAAI+6E,EAAWz8E,KAAKm8E,iBAAiB1xC,EAAW/oC,GAAG8qB,QAAQ,GAC3D,MAAKiwD,EAAS3yD,IAAM8U,EAAOpvB,OAASovB,EAAO9b,QACtC25D,EAAS3yD,IAAM,IAAMpoB,EAAI,GAD9B,CAKA,IAAI4M,GAAStO,KAAKs7E,QAAQkB,MAAkBx8E,KAAKu7E,aAAajtE,MAEzDtO,KAAK08E,WAMN18E,KAAK08E,WAAWpuE,EAAOmuE,EAAU79C,EAAQ6L,EAAW/oC,GAAI1B,KAAK8nB,UAL7DxZ,EAAMsB,KAAO6sE,EAAS7sE,KAAO,KAC7BtB,EAAMwb,IAAM2yD,EAAS3yD,IAAM,KAC3Bxb,EAAMgB,MAAQsvB,EAAO7J,eAAiB,KACtCzmB,EAAMkB,OAASovB,EAAO/J,WAAa,OAK3C,MAAO70B,KAAKs7E,QAAQ96E,OAASg8E,EACzBx8E,KAAK+7E,eAET,IAAIhpB,EAAY/yD,KAAK8nB,QAAQkrC,eAC7BhzD,KAAK28E,cAAc5pB,GACnB/yD,KAAKgxE,UAAYyL,EACjBz8E,KAAK67E,gBAGT77E,KAAK08E,WAAa,KAElB18E,KAAK28E,cAAgB,SAAS5pB,GACtBA,GAAa/yD,KAAK+yD,YAClB/yD,KAAK+yD,UAAYA,EACbA,EACArvC,EAAIjW,YAAYzN,KAAK8O,QAAS,yBAE9B4U,EAAIhW,eAAe1N,KAAK8O,QAAS,2BAI7C9O,KAAKoxB,QAAU,WACX0E,cAAc91B,KAAKg8E,YACnBz8D,aAAavf,KAAKi8E,cAGvBz6E,KAAK05E,EAAO55E,WAEfqB,EAAQu4E,OAASA,IAIjB73E,IAAIlD,OAAO,gBAAgB,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,gBAAgB,yBAA0B,SAAS0B,EAAUc,EAASvC,GAC3J,aAEA,IAAI4R,EAAMnQ,EAAS,aACf6hB,EAAM7hB,EAAS,aACfia,EAAQja,EAAS,eACjB63B,EAAe73B,EAAS,uBAAuB63B,aAC/CkjD,EAAe,MACfC,EAAY,SAASC,GACrB98E,KAAK8O,QAAU4U,EAAIzY,cAAc,OACjCjL,KAAK8O,QAAQtB,UAAY,8BAAgCxN,KAAK+8E,YAE9D/8E,KAAKqP,MAAQqU,EAAIzY,cAAc,OAC/BjL,KAAKqP,MAAM7B,UAAY,sBACvBxN,KAAK8O,QAAQP,YAAYvO,KAAKqP,OAE9BytE,EAAOvuE,YAAYvO,KAAK8O,SAExB9O,KAAKg9E,YAAW,GAChBh9E,KAAKi9E,WAAY,EAEjBnhE,EAAMN,YAAYxb,KAAK8O,QAAS,SAAU9O,KAAKk9E,SAAS/3E,KAAKnF,OAC7D8b,EAAMN,YAAYxb,KAAK8O,QAAS,YAAagN,EAAMQ,kBAGvD,WACItK,EAAIF,UAAU9R,KAAM05B,GAEpB15B,KAAKg9E,WAAa,SAAS7B,GACvBn7E,KAAK8O,QAAQR,MAAMmB,QAAU0rE,EAAY,GAAK,OAC9Cn7E,KAAKm7E,UAAYA,EACjBn7E,KAAKm9E,MAAQ,KAElB37E,KAAKq7E,EAAUv7E,WAClB,IAAI87E,EAAa,SAASN,EAAQ9zD,GAC9B6zD,EAAUr7E,KAAKxB,KAAM88E,GACrB98E,KAAKuQ,UAAY,EACjBvQ,KAAKq9E,aAAe,EACpBr0D,EAASs0D,gBACTt9E,KAAKsP,MAAQoU,EAAItU,eAAe0tE,EAAO3/C,eACvCn9B,KAAKqP,MAAMf,MAAMgB,MACjBtP,KAAK8O,QAAQR,MAAMgB,OAAStP,KAAKsP,OAAS,IAAM,EAAI,KACpDtP,KAAKu9E,UAAY,GAGrBvrE,EAAIR,SAAS4rE,EAAYP,GAEzB,WAEI78E,KAAK+8E,YAAc,KACnB/8E,KAAKk9E,SAAW,WACZ,IAAKl9E,KAAKi9E,UAAW,CAEjB,GADAj9E,KAAKuQ,UAAYvQ,KAAK8O,QAAQyB,UACZ,GAAdvQ,KAAKm9E,MAAY,CACjB,IAAIp7C,EAAI/hC,KAAK8O,QAAQK,aAAenP,KAAKq9E,aACzCr9E,KAAKuQ,UAAYvQ,KAAKuQ,WAAa,EAAIwxB,IAAM/hC,KAAKm9E,MAAQp7C,GAE9D/hC,KAAKupB,MAAM,SAAU,CAACtI,KAAMjhB,KAAKuQ,YAErCvQ,KAAKi9E,WAAY,GAErBj9E,KAAKmxB,SAAW,WACZ,OAAOjqB,KAAKC,IAAInH,KAAKm7E,UAAYn7E,KAAKsP,MAAQ,EAAGtP,KAAKu9E,WAAa,IAEvEv9E,KAAKw9E,UAAY,SAAShuE,GACtBxP,KAAK8O,QAAQR,MAAMkB,OAASA,EAAS,MAEzCxP,KAAKy9E,eACLz9E,KAAK09E,gBAAkB,SAASluE,GAC5BxP,KAAKq9E,aAAe7tE,EAChBA,EAASotE,GACT58E,KAAKm9E,MAAQP,EAAeptE,EAC5BA,EAASotE,GACY,GAAd58E,KAAKm9E,QACZn9E,KAAKm9E,MAAQ,GAEjBn9E,KAAKqP,MAAMf,MAAMkB,OAASA,EAAS,MAEvCxP,KAAKy1D,aAAe,SAASllD,GACrBvQ,KAAKuQ,WAAaA,IAClBvQ,KAAKi9E,WAAY,EACjBj9E,KAAKuQ,UAAYA,EACjBvQ,KAAK8O,QAAQyB,UAAYA,EAAYvQ,KAAKm9E,SAInD37E,KAAK47E,EAAW97E,WACnB,IAAIq8E,EAAa,SAASb,EAAQ9zD,GAC9B6zD,EAAUr7E,KAAKxB,KAAM88E,GACrB98E,KAAKwQ,WAAa,EAClBxQ,KAAKwP,OAASwZ,EAASs0D,gBACvBt9E,KAAKqP,MAAMf,MAAMkB,OACjBxP,KAAK8O,QAAQR,MAAMkB,QAAUxP,KAAKwP,QAAU,IAAM,EAAI,MAG1DwC,EAAIR,SAASmsE,EAAYd,GAEzB,WAEI78E,KAAK+8E,YAAc,KACnB/8E,KAAKk9E,SAAW,WACPl9E,KAAKi9E,YACNj9E,KAAKwQ,WAAaxQ,KAAK8O,QAAQ0B,WAC/BxQ,KAAKupB,MAAM,SAAU,CAACtI,KAAMjhB,KAAKwQ,cAErCxQ,KAAKi9E,WAAY,GAErBj9E,KAAKixB,UAAY,WACb,OAAOjxB,KAAKm7E,UAAYn7E,KAAKwP,OAAS,GAE1CxP,KAAK49E,SAAW,SAAStuE,GACrBtP,KAAK8O,QAAQR,MAAMgB,MAAQA,EAAQ,MAEvCtP,KAAK69E,cAAgB,SAASvuE,GAC1BtP,KAAKqP,MAAMf,MAAMgB,MAAQA,EAAQ,MAErCtP,KAAK89E,eAAiB,SAASxuE,GAC3BtP,KAAKqP,MAAMf,MAAMgB,MAAQA,EAAQ,MAErCtP,KAAK61D,cAAgB,SAASrlD,GACtBxQ,KAAKwQ,YAAcA,IACnBxQ,KAAKi9E,WAAY,EACjBj9E,KAAKwQ,WAAaxQ,KAAK8O,QAAQ0B,WAAaA,KAIrDhP,KAAKm8E,EAAWr8E,WAGnBqB,EAAQk6E,UAAYO,EACpBz6E,EAAQo7E,WAAaX,EACrBz6E,EAAQq7E,WAAaL,EAErBh7E,EAAQy6E,WAAaA,EACrBz6E,EAAQg7E,WAAaA,IAGrBt6E,IAAIlD,OAAO,iBAAiB,CAAC,UAAU,UAAU,SAAS,iBAAkB,SAAS0B,EAAUc,EAASvC,GACxG,aAEA,IAAI0b,EAAQja,EAAS,eAGjBo8E,EAAa,SAASC,EAAUp9D,GAChC9gB,KAAKk+E,SAAWA,EAChBl+E,KAAKm+E,SAAU,EACfn+E,KAAKo+E,QAAU,EACfp+E,KAAKC,OAAS6gB,GAAO7gB,SAGzB,WAGID,KAAKojB,SAAW,SAASi7D,GAErB,GADAr+E,KAAKo+E,QAAUp+E,KAAKo+E,QAAUC,GACzBr+E,KAAKm+E,SAAWn+E,KAAKo+E,QAAS,CAC/Bp+E,KAAKm+E,SAAU,EACf,IAAI36D,EAAQxjB,KACZ8b,EAAMoF,UAAU,WAEZ,IAAIk9D,EADJ56D,EAAM26D,SAAU,EAEhB,MAAOC,EAAU56D,EAAM46D,QACnB56D,EAAM46D,QAAU,EAChB56D,EAAM06D,SAASE,IAEpBp+E,KAAKC,YAIjBuB,KAAKy8E,EAAW38E,WAEnBqB,EAAQs7E,WAAaA,IAGrB56E,IAAIlD,OAAO,yBAAyB,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,eAAe,oBAAoB,yBAA0B,SAAS0B,EAAUc,EAASvC,GAEvL,IAAI4R,EAAMnQ,EAAS,cACf6hB,EAAM7hB,EAAS,cACf8hB,EAAO9hB,EAAS,eAChBwZ,EAAYxZ,EAAS,oBACrB63B,EAAe73B,EAAS,wBAAwB63B,aAEhD4kD,EAAa,EAEbC,EAAc57E,EAAQ47E,YAAc,SAAS/J,GAC7Cx0E,KAAKsN,GAAKoW,EAAIzY,cAAc,OAC5BjL,KAAKw+E,sBAAsBx+E,KAAKsN,GAAGgB,OAAO,GAE1CtO,KAAKy+E,MAAQ/6D,EAAIzY,cAAc,OAC/BjL,KAAKw+E,sBAAsBx+E,KAAKy+E,MAAMnwE,OAEtCtO,KAAKg7E,aAAet3D,EAAIzY,cAAc,OACtCjL,KAAKw+E,sBAAsBx+E,KAAKg7E,aAAa1sE,OAG7CtO,KAAKsN,GAAGiB,YAAYvO,KAAKy+E,OACzBz+E,KAAKsN,GAAGiB,YAAYvO,KAAKg7E,cACzBxG,EAASjmE,YAAYvO,KAAKsN,IAErBgxE,GACDt+E,KAAK0+E,sBACT1+E,KAAKg7E,aAAalqE,UAAY6S,EAAK/B,aAAa,IAAK08D,GAErDt+E,KAAK0pC,eAAiB,CAACp6B,MAAO,EAAGE,OAAQ,GACzCxP,KAAKw4E,wBAGT,WAEIxmE,EAAIF,UAAU9R,KAAM05B,GAEpB15B,KAAK0pC,eAAiB,CAACp6B,MAAO,EAAGE,OAAQ,GAEzCxP,KAAK0+E,oBAAsB,WACvB,IAAIpxE,EAAKoW,EAAIzY,cAAc,OAC3BjL,KAAKw+E,sBAAsBlxE,EAAGgB,OAC9BhB,EAAGgB,MAAMgB,MAAQ,QACjBtE,SAASkC,gBAAgBqB,YAAYjB,GACrC,IAAI8oD,EAAI9oD,EAAGuc,wBAAwBva,MAE/BgvE,EADAloB,EAAI,GAAKA,EAAI,EACA,GAEA,IACjB9oD,EAAGyD,WAAWb,YAAY5C,IAG9BtN,KAAKw+E,sBAAwB,SAASlwE,EAAOqwE,GACzCrwE,EAAMgB,MAAQhB,EAAMkB,OAAS,OAC7BlB,EAAMsB,KAAOtB,EAAMwb,IAAM,MACzBxb,EAAMqtE,WAAa,SACnBrtE,EAAMqB,SAAW,WACjBrB,EAAMswE,WAAa,MAEfvjE,EAAUnB,KAAO,EACjB5L,EAAM,eAAiB,UAEvBA,EAAMuwE,KAAO,UAEjBvwE,EAAMuB,SAAW8uE,EAAS,SAAW,WAGzC3+E,KAAKw4E,oBAAsB,WACvB,IAAIrvC,EAAOnpC,KAAK8+E,gBAChB,GAAI31C,IAASnpC,KAAK0pC,eAAep6B,QAAU65B,EAAK75B,OAAStP,KAAK0pC,eAAel6B,SAAW25B,EAAK35B,QAAS,CAClGxP,KAAKg7E,aAAa1sE,MAAMywE,WAAa,OACrC,IAAIC,EAAWh/E,KAAK8+E,gBACpB9+E,KAAKg7E,aAAa1sE,MAAMywE,WAAa,GACrC/+E,KAAK0pC,eAAiBP,EACtBnpC,KAAKi/E,UAAY59E,OAAO6I,OAAO,MAC/BlK,KAAKk/E,eAAiBF,GAAYA,EAAS1vE,QAAU65B,EAAK75B,OAAS0vE,EAASxvE,SAAW25B,EAAK35B,OAC5FxP,KAAKupB,MAAM,sBAAuB,CAACtI,KAAMkoB,MAIjDnpC,KAAKu4E,iBAAmB,WACpB,GAAIv4E,KAAKy4E,sBACL,OAAOz4E,KAAKy4E,sBAChB,IAAInwE,EAAOtI,KACX,OAAOA,KAAKy4E,sBAAwB1iD,YAAY,WAC5CztB,EAAKkwE,uBACN,MAGPx4E,KAAKm/E,WAAa,SAAS92D,GACnBA,EACAroB,KAAKu4E,mBACEv4E,KAAKy4E,wBACZ3iD,cAAc91B,KAAKy4E,uBACnBz4E,KAAKy4E,sBAAwB,IAIrCz4E,KAAK8+E,cAAgB,WACjB,GAAmB,KAAfR,EAAmB,CACnB,IAAI30D,EAAO,KACX,IACGA,EAAO3pB,KAAKg7E,aAAanxD,wBAC1B,MAAMzN,GACLuN,EAAO,CAACra,MAAO,EAAGE,OAAO,GAE5B,IAAI25B,EAAO,CACP35B,OAAQma,EAAKna,OACbF,MAAOqa,EAAKra,MAAQgvE,QAGpBn1C,EAAO,CACP35B,OAAQxP,KAAKg7E,aAAa7rE,aAC1BG,MAAOtP,KAAKg7E,aAAa/rE,YAAcqvE,GAG/C,OAAmB,IAAfn1C,EAAK75B,OAA+B,IAAhB65B,EAAK35B,OAClB,KACJ25B,GAGXnpC,KAAK4pC,kBAAoB,SAAS1D,GAC9BlmC,KAAKy+E,MAAM3tE,UAAY6S,EAAK/B,aAAaskB,EAAIo4C,GAC7C,IAAI30D,EAAO3pB,KAAKy+E,MAAM50D,wBACtB,OAAOF,EAAKra,MAAQgvE,GAGxBt+E,KAAKy8D,kBAAoB,SAASv2B,GAC9B,IAAIkwB,EAAIp2D,KAAKi/E,UAAU/4C,GAIvB,YAHU9kC,IAANg1D,IACAA,EAAIp2D,KAAKi/E,UAAU/4C,GAAMlmC,KAAK4pC,kBAAkB1D,GAAMlmC,KAAK0pC,eAAep6B,OAEvE8mD,GAGXp2D,KAAKoxB,QAAU,WACX0E,cAAc91B,KAAKy4E,uBACfz4E,KAAKsN,IAAMtN,KAAKsN,GAAGyD,YACnB/Q,KAAKsN,GAAGyD,WAAWb,YAAYlQ,KAAKsN,OAG7C9L,KAAK+8E,EAAYj9E,aAIpB+B,IAAIlD,OAAO,uBAAuB,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,aAAa,oBAAoB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,gBAAgB,gBAAgB,iBAAiB,yBAAyB,yBAA0B,SAAS0B,EAAUc,EAASvC,GACvU,aAEA,IAAI4R,EAAMnQ,EAAS,aACf6hB,EAAM7hB,EAAS,aACf+8B,EAAS/8B,EAAS,YAClBwZ,EAAYxZ,EAAS,mBACrBu9E,EAAcv9E,EAAS,kBAAkB0yE,OACzC8K,EAAcx9E,EAAS,kBAAkBw0E,OACzCiJ,EAAYz9E,EAAS,gBAAgB+1E,KACrC2H,EAAc19E,EAAS,kBAAkBq5E,OACzCyC,EAAa97E,EAAS,eAAe87E,WACrCP,EAAav7E,EAAS,eAAeu7E,WACrCa,EAAap8E,EAAS,gBAAgBo8E,WACtCM,EAAc18E,EAAS,wBAAwB08E,YAC/C7kD,EAAe73B,EAAS,uBAAuB63B,aAC/C8lD,EAAY,s6XA6XhB97D,EAAItV,gBAAgBoxE,EAAW,kBAE/B,IAAIC,EAAkB,SAAS71D,EAAWw+C,GACtC,IAAI5kD,EAAQxjB,KAEZA,KAAK4pB,UAAYA,GAAalG,EAAIzY,cAAc,OAChDjL,KAAKipB,uBAAyB5N,EAAUhB,QAExCqJ,EAAIjW,YAAYzN,KAAK4pB,UAAW,cAEhC5pB,KAAKmoE,SAASC,GAEdpoE,KAAKgzB,QAAUtP,EAAIzY,cAAc,OACjCjL,KAAKgzB,QAAQxlB,UAAY,aACzBxN,KAAK4pB,UAAUrb,YAAYvO,KAAKgzB,SAChChzB,KAAKgzB,QAAQ5O,aAAa,eAAe,GAEzCpkB,KAAKqqB,SAAW3G,EAAIzY,cAAc,OAClCjL,KAAKqqB,SAAS7c,UAAY,eAC1BxN,KAAK4pB,UAAUrb,YAAYvO,KAAKqqB,UAEhCrqB,KAAK0/E,QAAUh8D,EAAIzY,cAAc,OACjCjL,KAAK0/E,QAAQlyE,UAAY,cACzBxN,KAAKqqB,SAAS9b,YAAYvO,KAAK0/E,SAE/B1/E,KAAK0xB,aAAe,IAAI0tD,EAAYp/E,KAAKgzB,SACzChzB,KAAK0xB,aAAazJ,GAAG,oBAAqBjoB,KAAK2/E,eAAex6E,KAAKnF,OAEnEA,KAAK4/E,YAAc,IAAIP,EAAYr/E,KAAK0/E,SAExC,IAAIG,EAAY7/E,KAAK8/E,WAAa,IAAIR,EAAUt/E,KAAK0/E,SACrD1/E,KAAK+/E,OAASF,EAAU/wE,QAExB9O,KAAKggF,aAAe,IAAIX,EAAYr/E,KAAK0/E,SAEzC1/E,KAAK41B,aAAe,IAAI2pD,EAAYv/E,KAAK0/E,SACzC1/E,KAAKigF,cAAe,EACpBjgF,KAAKkgF,UAAW,EAEhBlgF,KAAKmgF,UACLngF,KAAKm/B,WAAa,IAAIi+C,EAAWp9E,KAAK4pB,UAAW5pB,MACjDA,KAAKo/B,WAAa,IAAIu+C,EAAW39E,KAAK4pB,UAAW5pB,MACjDA,KAAKm/B,WAAWxjB,iBAAiB,SAAU,SAASS,GAC3CoH,EAAM48D,kBACP58D,EAAMsE,QAAQ2tC,aAAar5C,EAAE6E,KAAOuC,EAAM68D,aAAav2D,OAE/D9pB,KAAKo/B,WAAWzjB,iBAAiB,SAAU,SAASS,GAC3CoH,EAAM48D,kBACP58D,EAAMsE,QAAQ+tC,cAAcz5C,EAAE6E,KAAOuC,EAAM68D,aAAazwE,QAGhE5P,KAAKuQ,UAAY,EACjBvQ,KAAKwQ,WAAa,EAElBxQ,KAAKgoE,UAAY,CACbv7C,IAAM,EACNE,OAAS,GAGb3sB,KAAKq4E,aAAe,IAAIkG,EAAYv+E,KAAK4pB,WACzC5pB,KAAK8/E,WAAWxjB,gBAAgBt8D,KAAKq4E,cACrCr4E,KAAK8/E,WAAWnkE,iBAAiB,sBAAuB,SAASS,GAC7DoH,EAAM88D,sBACN98D,EAAM0kD,UAAS,EAAM1kD,EAAMkxD,YAAalxD,EAAM+8D,MAAMjxE,MAAOkU,EAAM+8D,MAAM/wE,QACvEgU,EAAM+O,QAAQ,sBAAuBnW,KAGzCpc,KAAKugF,MAAQ,CACTjxE,MAAO,EACPE,OAAQ,EACRgxE,eAAgB,EAChBC,cAAe,EACfC,QAAQ,GAGZ1gF,KAAK80B,YAAc,CACfxlB,MAAQ,EACRsmE,QAAU,EACVjpC,SAAW,EACXwqC,eAAgB,EAChBvqC,QAAU,EACV/X,WAAa,EACbE,eAAiB,EACjB2gD,UAAY,EACZiL,UAAY,EACZ79D,OAAS,EACTtT,OAAS,EACTulE,aAAc,GAGlB/0E,KAAKqgF,aAAe,CAChBzwE,KAAM,EACNgb,MAAO,EACPd,IAAK,EACLI,OAAQ,EACR02D,EAAG,EACH7+C,EAAG,GAGP/hC,KAAK6gF,MAAQ,IAAI5C,EACbj+E,KAAK8gF,eAAe37E,KAAKnF,MACzBA,KAAK4pB,UAAUuT,cAAc7rB,aAEjCtR,KAAK6gF,MAAMz9D,SAASpjB,KAAK+gF,aAEzB/gF,KAAKsgF,sBACLtgF,KAAK22E,WAAW,GAChB/3C,EAAO3C,aAAaj8B,MACpB4+B,EAAOrV,MAAM,WAAYvpB,QAG7B,WAEIA,KAAKghF,cAAgB,EACrBhhF,KAAKihF,cAAgB,EACrBjhF,KAAKkhF,cAAgB,EACrBlhF,KAAKmhF,cAAgB,EACrBnhF,KAAKohF,aAAe,GACpBphF,KAAKqhF,YAAc,GACnBrhF,KAAKshF,YAAc,GACnBthF,KAAKuhF,mBAAqB,IAC1BvhF,KAAKwhF,oBAAsB,IAC3BxhF,KAAK+gF,YAAc,IACnB/gF,KAAKyhF,gBAAkB,KAEvBzvE,EAAIF,UAAU9R,KAAM05B,GAEpB15B,KAAKsgF,oBAAsB,WACnBtgF,KAAK8/E,WAAWZ,gBAAkBl/E,KAAK0hF,kBACvC1hF,KAAK0hF,gBAAkB1hF,KAAK8/E,WAAWZ,eACvCl/E,KAAKkuB,SAAS,cAAeluB,KAAK0hF,kBAGtC1hF,KAAK80B,YAAYC,eACjB/0B,KAAK+0B,eAAiB/0B,KAAK8/E,WAAWrjB,oBACtCz8D,KAAK80B,YAAYD,WACjB70B,KAAK60B,WAAa70B,KAAK8/E,WAAW1H,gBAClCp4E,KAAK2hF,sBAET3hF,KAAK0kE,WAAa,SAAS58C,GACnB9nB,KAAK8nB,SACL9nB,KAAK8nB,QAAQ/a,IAAI2tB,IAAI,oBAAqB16B,KAAK4hF,qBAEnD5hF,KAAK8nB,QAAUA,EACXA,GAAW9nB,KAAKqgF,aAAav2D,KAAOhC,EAAQ6tC,gBAAkB,GAC9D7tC,EAAQ2tC,cAAcz1D,KAAKqgF,aAAav2D,KAE5C9pB,KAAK41B,aAAa8uC,WAAW58C,GAC7B9nB,KAAK4/E,YAAYlb,WAAW58C,GAC5B9nB,KAAKggF,aAAatb,WAAW58C,GAC7B9nB,KAAK0xB,aAAagzC,WAAW58C,GAC7B9nB,KAAK8/E,WAAWpb,WAAW58C,GACtBA,IAGL9nB,KAAK6gF,MAAMz9D,SAASpjB,KAAK+gF,aACzB/gF,KAAK8nB,QAAQw0C,gBAAgBt8D,KAAKq4E,cAClCr4E,KAAKo/B,WAAW5uB,WAAaxQ,KAAKm/B,WAAW5uB,UAAY,KAEzDvQ,KAAK4hF,oBAAsB5hF,KAAK4hF,oBAAoBz8E,KAAKnF,MACzDA,KAAK4hF,sBACL5hF,KAAK8nB,QAAQ/a,IAAIkb,GAAG,oBAAqBjoB,KAAK4hF,uBAElD5hF,KAAKwpE,YAAc,SAAS78B,EAAUC,EAAS0pB,GAiB3C,QAhBgBl1D,IAAZwrC,IACAA,EAAUwT,KAETpgD,KAAK6hF,eAOF7hF,KAAK6hF,cAAcl1C,SAAWA,IAC9B3sC,KAAK6hF,cAAcl1C,SAAWA,GAE9B3sC,KAAK6hF,cAAcj1C,QAAUA,IAC7B5sC,KAAK6hF,cAAcj1C,QAAUA,IAVjC5sC,KAAK6hF,cAAgB,CACjBl1C,SAAUA,EACVC,QAASA,GAUb5sC,KAAK6hF,cAAcj1C,QAAU5sC,KAAK80B,YAAY6X,SAAU,CACxD,IAAI2pB,EAGA,OAFAt2D,KAAK6hF,cAAcj1C,QAAU5sC,KAAK80B,YAAY8X,QAIlD5sC,KAAK6hF,cAAcl1C,SAAW3sC,KAAK80B,YAAY8X,SAEnD5sC,KAAK6gF,MAAMz9D,SAASpjB,KAAKohF,eAG7BphF,KAAK4hF,oBAAsB,WACvB5hF,KAAK6gF,MAAMz9D,SAASpjB,KAAKqhF,aACzBrhF,KAAK8/E,WAAWjI,iBAChB73E,KAAK8nB,QAAQwqB,aAAavI,WAAW/pC,KAAK8/E,WAAW7H,WAGzDj4E,KAAKknE,gBAAkB,WACnBlnE,KAAK6gF,MAAMz9D,SAASpjB,KAAKqhF,YAAcrhF,KAAKihF,eAC5CjhF,KAAK8/E,WAAW5Y,mBAEpBlnE,KAAK0qE,WAAa,WACd1qE,KAAK6gF,MAAMz9D,SAASpjB,KAAKqhF,cAE7BrhF,KAAK6nE,WAAa,SAASvR,GACnBA,EACAt2D,KAAK8gF,eAAe9gF,KAAK+gF,aAAa,GAEtC/gF,KAAK6gF,MAAMz9D,SAASpjB,KAAK+gF,cAEjC/gF,KAAK8hF,eAAiB,WAClB9hF,KAAK8/E,WAAWtH,uBAGpBx4E,KAAK+hF,SAAW,EAChB/hF,KAAKgiF,iBAAmB,WAChBhiF,KAAK6gF,MAAM1C,QACXn+E,KAAKugF,MAAMG,QAAS,EAEpB1gF,KAAKkoE,YAEbloE,KAAKkoE,SAAW,SAAS5R,EAAOoe,EAAaplE,EAAOE,GAChD,KAAIxP,KAAKiiF,SAAW,GAApB,CAESjiF,KAAKiiF,SAAW,EACrBjiF,KAAKiiF,WAELjiF,KAAKiiF,SAAW3rB,EAAQ,EAAI,EAChC,IAAIhpD,EAAKtN,KAAK4pB,UACTpa,IACDA,EAASlC,EAAG6B,cAAgB7B,EAAG+vE,cAC9B/tE,IACDA,EAAQhC,EAAG2B,aAAe3B,EAAG40E,aACjC,IAAI9D,EAAUp+E,KAAKmiF,kBAAkB7rB,EAAOoe,EAAaplE,EAAOE,GAGhE,IAAKxP,KAAKugF,MAAMC,iBAAoBlxE,IAAUE,EAC1C,OAAOxP,KAAKiiF,SAAW,EAEvB3rB,IACAt2D,KAAK0xB,aAAamkD,SAAW,MAE7Bvf,EACAt2D,KAAK8gF,eAAe1C,EAAUp+E,KAAK+hF,UAAU,GAE7C/hF,KAAK6gF,MAAMz9D,SAASg7D,EAAUp+E,KAAK+hF,UAEnC/hF,KAAKiiF,WACLjiF,KAAKiiF,SAAW,GACpBjiF,KAAKm/B,WAAW3uB,WAAaxQ,KAAKm/B,WAAW5uB,UAAY,OAG7DvQ,KAAKmiF,kBAAoB,SAAS7rB,EAAOoe,EAAaplE,EAAOE,GACzDA,GAAWxP,KAAKoiF,cAAgB,EAChC,IAAIhE,EAAU,EACVj1C,EAAOnpC,KAAKugF,MACZ8B,EAAU,CACV/yE,MAAO65B,EAAK75B,MACZE,OAAQ25B,EAAK35B,OACbgxE,eAAgBr3C,EAAKq3C,eACrBC,cAAet3C,EAAKs3C,eAwCxB,OAtCIjxE,IAAW8mD,GAASntB,EAAK35B,QAAUA,KACnC25B,EAAK35B,OAASA,EACd4uE,GAAWp+E,KAAKshF,YAEhBn4C,EAAKq3C,eAAiBr3C,EAAK35B,OACvBxP,KAAKigF,eACL92C,EAAKq3C,gBAAkBxgF,KAAKo/B,WAAWnO,aAC3CjxB,KAAKm/B,WAAWrwB,QAAQR,MAAM4b,OAASlqB,KAAKo/B,WAAWnO,YAAc,KAErEmtD,GAAoBp+E,KAAKmhF,eAGzB7xE,IAAUgnD,GAASntB,EAAK75B,OAASA,KACjC8uE,GAAWp+E,KAAKshF,YAChBn4C,EAAK75B,MAAQA,EAEM,MAAfolE,IACAA,EAAc10E,KAAKsiF,YAActiF,KAAKgzB,QAAQhjB,YAAc,GAEhEhQ,KAAK00E,YAAcA,EAEnB10E,KAAKo/B,WAAWtwB,QAAQR,MAAMsB,KAC9B5P,KAAKqqB,SAAS/b,MAAMsB,KAAO8kE,EAAc,KACzCvrC,EAAKs3C,cAAgBv5E,KAAKC,IAAI,EAAGmI,EAAQolE,EAAc10E,KAAKm/B,WAAWhO,YAEvEnxB,KAAKo/B,WAAWtwB,QAAQR,MAAMsc,MAC9B5qB,KAAKqqB,SAAS/b,MAAMsc,MAAQ5qB,KAAKm/B,WAAWhO,WAAa,KACzDnxB,KAAKqqB,SAAS/b,MAAM4b,OAASlqB,KAAKo/B,WAAWnO,YAAc,MAEvDjxB,KAAK8nB,SAAW9nB,KAAK8nB,QAAQ8wC,kBAAoB54D,KAAK84D,mBAAqBxC,KAC3E8nB,GAAWp+E,KAAK+gF,cAGxB53C,EAAKu3C,QAAUpxE,IAAUE,EAErB4uE,GACAp+E,KAAKuyB,QAAQ,SAAU8vD,GAEpBjE,GAGXp+E,KAAK2/E,eAAiB,WAClB,IAAIjL,EAAc10E,KAAKsiF,YAActiF,KAAKgzB,QAAQhjB,YAAc,EAC5D0kE,GAAe10E,KAAK00E,cACpB10E,KAAK+hF,UAAY/hF,KAAKmiF,mBAAkB,EAAMzN,EAAa10E,KAAKugF,MAAMjxE,MAAOtP,KAAKugF,MAAM/wE,SAExFxP,KAAK8nB,QAAQ8wC,kBAAoB54D,KAAK84D,kBACtC94D,KAAK6gF,MAAMz9D,SAASpjB,KAAK+gF,aAClB/gF,KAAKugF,MAAMG,OAClB1gF,KAAK6gF,MAAMz9D,SAASpjB,KAAK+gF,cAEzB/gF,KAAKuiF,sBACLviF,KAAK6gF,MAAMz9D,SAASpjB,KAAKihF,iBAGjCjhF,KAAK84D,gBAAkB,WACnB,IAAI0pB,EAAiBxiF,KAAKugF,MAAME,cAAgC,EAAhBzgF,KAAK61E,SACjDvc,EAAQpyD,KAAKyF,MAAM61E,EAAiBxiF,KAAK+0B,gBAC7C,OAAO/0B,KAAK8nB,QAAQgxC,gBAAgBQ,EAAOt5D,KAAKyiF,kBAAoBziF,KAAK0iF,qBAE7E1iF,KAAK+rE,kBAAoB,SAASC,GAC9BhsE,KAAK+6B,UAAU,iBAAkBixC,IAErChsE,KAAKisE,kBAAoB,WACrB,OAAOjsE,KAAK2iF,iBAEhB3iF,KAAK8pC,kBAAoB,SAAStC,GAC9BxnC,KAAK+6B,UAAU,iBAAkByM,GACjCxnC,KAAK8nB,QAAQwqB,aAAaxI,kBAAkBtC,IAEhDxnC,KAAK6pC,kBAAoB,WACrB,OAAO7pC,KAAKm7B,UAAU,mBAE1Bn7B,KAAKmsE,uBAAyB,WAC1B,OAAOnsE,KAAKm7B,UAAU,wBAG1Bn7B,KAAKksE,uBAAyB,SAASz8D,GACnCzP,KAAK+6B,UAAU,sBAAuBtrB,IAE1CzP,KAAKosE,mBAAqB,SAASC,GAC/BrsE,KAAK+6B,UAAU,kBAAmBsxC,IAEtCrsE,KAAKssE,mBAAqB,WACtB,OAAOtsE,KAAKm7B,UAAU,oBAE1Bn7B,KAAKusE,qBAAuB,SAASF,GACjCrsE,KAAK+6B,UAAU,oBAAqBsxC,IAExCrsE,KAAKwsE,qBAAuB,WACxB,OAAOxsE,KAAKm7B,UAAU,sBAE1Bn7B,KAAK4iF,cAAgB,WACjB,OAAO5iF,KAAKm7B,UAAU,eAE1Bn7B,KAAK6iF,cAAgB,SAAS9xD,GAC1B,OAAO/wB,KAAK+6B,UAAU,aAAchK,IAGxC/wB,KAAKgtE,mBAAqB,WACtB,OAAOhtE,KAAKm7B,UAAU,oBAG1Bn7B,KAAK8sE,mBAAqB,SAAS/7C,GAC/B/wB,KAAK+6B,UAAU,kBAAmBhK,IAGtC/wB,KAAK2rE,uBAAyB,SAASF,GACnCzrE,KAAK+6B,UAAU,sBAAuB0wC,IAG1CzrE,KAAK4rE,uBAAyB,WAC1B,OAAO5rE,KAAKm7B,UAAU,wBAG1Bn7B,KAAK8iF,2BAA6B,WAC9B,IAAI97E,EAAMhH,KAAK41B,aAAao7C,UACxBxhE,EAASxP,KAAK80B,YAAYD,WAC9B,GAAI70B,KAAK8nB,QAAQ8wC,iBAAkB,CAC/B,IAAIpsC,EAASxsB,KAAK8nB,QAAQhC,UAAUioB,YACpCvhB,EAAOG,OAAS,EAChB3lB,EAAMhH,KAAK41B,aAAaumD,iBAAiB3vD,GAAQ,GACjDhd,GAAUxP,KAAK8nB,QAAQszC,aAAa5uC,EAAOC,KAE/CzsB,KAAK+iF,qBAAqBz0E,MAAMwb,IAAM9iB,EAAI8iB,IAAM9pB,KAAK80B,YAAYhS,OAAS,KAC1E9iB,KAAK+iF,qBAAqBz0E,MAAMkB,OAASA,EAAS,MAGtDxP,KAAK2hF,mBAAqB,WACtB,GAAK3hF,KAAKyiF,kBAAqBziF,KAAKgjF,eAApC,CAGA,IAAKhjF,KAAKgjF,eAAgB,CACtB,IAAIC,EAAcv/D,EAAIzY,cAAc,OACpCg4E,EAAYz1E,UAAY,mCACxBxN,KAAKgjF,eAAiBt/D,EAAIzY,cAAc,OACxCjL,KAAKgjF,eAAex1E,UAAY,mBAChCy1E,EAAY10E,YAAYvO,KAAKgjF,gBAC7BhjF,KAAK0/E,QAAQp7D,aAAa2+D,EAAajjF,KAAK0/E,QAAQn7D,YAGxD,IAAIjW,EAAQtO,KAAKgjF,eAAe10E,MAChCA,EAAMsB,KAAS5P,KAAK+0B,eAAiB/0B,KAAK0iF,mBAAsB1iF,KAAK61E,SAAY,KACjFvnE,EAAMqtE,WAAa37E,KAAKyiF,iBAAmB,UAAY,SAEnDziF,KAAK8nB,UAAkC,GAAvB9nB,KAAK8nB,QAAQ60C,OAC7B38D,KAAK84D,oBAEb94D,KAAKikE,oBAAsB,WACvB,OAAOjkE,KAAK4pB,WAEhB5pB,KAAKi/B,oBAAsB,WACvB,OAAOj/B,KAAKqqB,UAEhBrqB,KAAKkkE,qBAAuB,WACxB,OAAOlkE,KAAK4pB,WAEhB5pB,KAAKkpB,sBAAwB,WACzB,GAAKlpB,KAAKipB,sBAAV,CAEA,IAAI2V,EAAS5+B,KAAK80B,YACdouD,EAASljF,KAAK41B,aAAao7C,UAAUlnD,IACrCq5D,EAAUnjF,KAAK41B,aAAao7C,UAAUphE,KAC1CszE,GAAUtkD,EAAO9b,OAEjB,IAAIxU,EAAQtO,KAAKmkE,SAAS71D,MACtByzB,EAAI/hC,KAAK60B,WACb,GAAIquD,EAAS,GAAKA,EAAStkD,EAAOpvB,OAASuyB,EACvCzzB,EAAMwb,IAAMxb,EAAMsB,KAAO,QAD7B,CAKA,IAAIwmD,EAAIp2D,KAAK+0B,eACb,GAAI/0B,KAAKojF,aAAc,CACnB,IAAI/6D,EAAMroB,KAAKmkE,SAASz7D,MAAMhG,QAAQ,SAAU,IAChD0zD,GAAMp2D,KAAK8nB,QAAQ6uC,sBAAsBtuC,GAAK,GAAG,EACjD0Z,GAAK,EAETohD,GAAWnjF,KAAKwQ,WACZ2yE,EAAUnjF,KAAKugF,MAAME,cAAgBrqB,IACrC+sB,EAAUnjF,KAAKugF,MAAME,cAAgBrqB,GAEzC+sB,GAAWnjF,KAAK00E,YAChBpmE,EAAMkB,OAASuyB,EAAI,KACnBzzB,EAAMgB,MAAQ8mD,EAAI,KAClB9nD,EAAMsB,KAAO1I,KAAKM,IAAI27E,EAASnjF,KAAKugF,MAAME,cAAgBrqB,GAAK,KAC/D9nD,EAAMwb,IAAM5iB,KAAKM,IAAI07E,EAAQljF,KAAKugF,MAAM/wE,OAASuyB,GAAK,QAE1D/hC,KAAK0uE,mBAAqB,WACtB,OAAO1uE,KAAK80B,YAAY6X,UAE5B3sC,KAAK8uE,wBAA0B,WAC3B,OAAO9uE,KAAK80B,YAAY6X,UAAwC,IAA5B3sC,KAAK80B,YAAYhS,OAAe,EAAI,IAE5E9iB,KAAK+uE,uBAAyB,WAC1B,IAAInwC,EAAS5+B,KAAK80B,YACd8X,EAAUhO,EAAOgO,QACjB9iB,EAAM9pB,KAAK8nB,QAAQwK,oBAAoBsa,EAAS,GAAKhO,EAAO/J,WAChE,OAAI/K,EAAM9pB,KAAK8nB,QAAQ6tC,eAAiB/2B,EAAOpvB,OAASovB,EAAO/J,WACpD+X,EAAU,EACdA,GAEX5sC,KAAK2uE,kBAAoB,WACrB,OAAO3uE,KAAK80B,YAAY8X,SAG5B5sC,KAAK61E,SAAW,KAChB71E,KAAK22E,WAAa,SAASf,GACvB51E,KAAK61E,SAAWD,EAChB51E,KAAK8/E,WAAWnJ,WAAWf,GAC3B51E,KAAK41B,aAAa+gD,WAAWf,GAC7B51E,KAAKggF,aAAarJ,WAAWf,GAC7B51E,KAAK4/E,YAAYjJ,WAAWf,GAC5B51E,KAAK6gF,MAAMz9D,SAASpjB,KAAK+gF,aACzB/gF,KAAK2hF,sBAGT3hF,KAAKqjF,gBAAkB,SAASv5D,EAAKI,EAAQta,EAAMgb,GAC/C,IAAI04D,EAAKtjF,KAAKqgF,aACdiD,EAAGx5D,IAAU,EAAJA,EACTw5D,EAAGp5D,OAAgB,EAAPA,EACZo5D,EAAG14D,MAAc,EAANA,EACX04D,EAAG1zE,KAAY,EAALA,EACV0zE,EAAG1C,EAAI0C,EAAGx5D,IAAMw5D,EAAGp5D,OACnBo5D,EAAGvhD,EAAIuhD,EAAG1zE,KAAO0zE,EAAG14D,MAChB04D,EAAGx5D,KAAO9pB,KAAKuQ,WAAa,GAAKvQ,KAAK8nB,SACtC9nB,KAAK8nB,QAAQ2tC,cAAc6tB,EAAGx5D,KAClC9pB,KAAK6nE,cAET7nE,KAAKujF,2BAA6B,WAC9B,OAAOvjF,KAAKwjF,0BAEhBxjF,KAAKyjF,2BAA6B,SAASC,GACvC1jF,KAAK+6B,UAAU,0BAA2B2oD,IAE9C1jF,KAAK2jF,2BAA6B,WAC9B,OAAO3jF,KAAK4jF,0BAEhB5jF,KAAK6jF,2BAA6B,SAASH,GACvC1jF,KAAK+6B,UAAU,0BAA2B2oD,IAG9C1jF,KAAK8jF,kBAAoB,WACrB,IAAIzG,EAAer9E,KAAK80B,YAAY6rD,UAChCH,EAAiBxgF,KAAKugF,MAAMC,gBAC3BxgF,KAAK8pE,WAAa9pE,KAAK+jF,iBACxB1G,IAAiBmD,EAAiBxgF,KAAK60B,YAAc70B,KAAK+jF,eACtD/jF,KAAKuQ,UAAY8sE,EAAemD,IAChCnD,EAAer9E,KAAKuQ,UAAYiwE,EAChCxgF,KAAKm/B,WAAW5uB,UAAY,OAGpCvQ,KAAKm/B,WAAWu+C,gBAAgBL,EAAer9E,KAAKqgF,aAAaO,GACjE5gF,KAAKm/B,WAAWs2B,aAAaz1D,KAAKuQ,UAAYvQ,KAAKqgF,aAAav2D,MAEpE9pB,KAAKgkF,kBAAoB,WACrBhkF,KAAKo/B,WAAW0+C,eAAe99E,KAAK80B,YAAYxlB,MAAQ,EAAItP,KAAK61E,SAAW71E,KAAKqgF,aAAat+C,GAC9F/hC,KAAKo/B,WAAWy2B,cAAc71D,KAAKwQ,WAAaxQ,KAAKqgF,aAAazwE,OAGtE5P,KAAKikF,SAAU,EACfjkF,KAAKuL,OAAS,WACVvL,KAAKikF,SAAU,GAGnBjkF,KAAKkkF,SAAW,WACZlkF,KAAKikF,SAAU,GAGnBjkF,KAAK8gF,eAAiB,SAAS1C,EAAS9nB,GAKpC,GAJIt2D,KAAK+hF,WACL3D,GAAWp+E,KAAK+hF,SAChB/hF,KAAK+hF,SAAW,GAEd/hF,KAAK8nB,SAAY9nB,KAAK4pB,UAAU5Z,cAAehQ,KAAKikF,UAAc7F,GAAY9nB,GAApF,CAIA,GAAIt2D,KAAKugF,MAAMG,OAEX,OADA1gF,KAAK+hF,UAAY3D,EACVp+E,KAAKkoE,UAAS,GAEpBloE,KAAK60B,YACN70B,KAAK8/E,WAAWtH,sBAGpBx4E,KAAKuyB,QAAQ,gBAETvyB,KAAK8nB,SAAW9nB,KAAK8nB,QAAQwqB,cAC7BtyC,KAAK8nB,QAAQwqB,aAAa9I,sBAAsBxpC,KAAKq4E,cAEzD,IAAIz5C,EAAS5+B,KAAK80B,YAClB,GAAIspD,EAAUp+E,KAAK+gF,aACf3C,EAAUp+E,KAAKshF,aACflD,EAAUp+E,KAAKqhF,aACfjD,EAAUp+E,KAAKohF,cACfhD,EAAUp+E,KAAKmhF,eACf/C,EAAUp+E,KAAKyhF,gBACjB,CAEE,GADArD,GAAWp+E,KAAKuiF,sBACZ3jD,EAAO+N,UAAY3sC,KAAK80B,YAAY6X,UAAY/N,EAAOu4C,gBAAkBn3E,KAAK80B,YAAYqiD,eAAgB,CAC1G,IAAIgN,EAAKnkF,KAAKuQ,WAAaquB,EAAO+N,SAAW3sC,KAAK80B,YAAY6X,UAAY3sC,KAAK60B,WAC3EsvD,EAAK,IACLnkF,KAAKuQ,UAAY4zE,EACjB/F,GAAoBp+E,KAAKmhF,cACzB/C,GAAWp+E,KAAKuiF,uBAGxB3jD,EAAS5+B,KAAK80B,YACd90B,KAAK8jF,oBACD1F,EAAUp+E,KAAKyhF,iBACfzhF,KAAKgkF,oBACThkF,KAAK0xB,aAAa5iB,QAAQR,MAAM81E,WAAcxlD,EAAO9b,OAAU,KAC/D9iB,KAAK0/E,QAAQpxE,MAAM81E,WAAcxlD,EAAO9b,OAAU,KAClD9iB,KAAK0/E,QAAQpxE,MAAMgB,MAAQsvB,EAAOtvB,MAAQ,EAAItP,KAAK61E,SAAW,KAC9D71E,KAAK0/E,QAAQpxE,MAAMkB,OAASovB,EAAO82C,UAAY,KAMnD,GAJI0I,EAAUp+E,KAAKyhF,kBACfzhF,KAAK0/E,QAAQpxE,MAAM+1E,YAAcrkF,KAAKwQ,WAAa,KACnDxQ,KAAKqqB,SAAS7c,UAAYxN,KAAKwQ,YAAc,EAAI,eAAiB,gCAElE4tE,EAAUp+E,KAAK+gF,YAUf,OATA/gF,KAAK8/E,WAAWr3B,OAAO7pB,GACnB5+B,KAAKsiF,aACLtiF,KAAK0xB,aAAa+2B,OAAO7pB,GAC7B5+B,KAAK4/E,YAAYn3B,OAAO7pB,GACxB5+B,KAAKggF,aAAav3B,OAAO7pB,GACzB5+B,KAAK41B,aAAa6yB,OAAO7pB,GACzB5+B,KAAKkpB,wBACLlpB,KAAKskF,sBAAwBtkF,KAAK8iF,kCAClC9iF,KAAKuyB,QAAQ,eAGjB,GAAI6rD,EAAUp+E,KAAKmhF,cAcf,OAbI/C,EAAUp+E,KAAKqhF,aAAejD,EAAUp+E,KAAKohF,aAC7CphF,KAAK8/E,WAAWr3B,OAAO7pB,GAEvB5+B,KAAK8/E,WAAW5G,YAAYt6C,GAE5B5+B,KAAKsiF,aACLtiF,KAAK0xB,aAAa+2B,OAAO7pB,GAC7B5+B,KAAK4/E,YAAYn3B,OAAO7pB,GACxB5+B,KAAKggF,aAAav3B,OAAO7pB,GACzB5+B,KAAK41B,aAAa6yB,OAAO7pB,GACzB5+B,KAAKskF,sBAAwBtkF,KAAK8iF,6BAClC9iF,KAAKkpB,6BACLlpB,KAAKuyB,QAAQ,eAIb6rD,EAAUp+E,KAAKqhF,aACfrhF,KAAK8/E,WAAWr3B,OAAO7pB,GACnB5+B,KAAKsiF,aACLtiF,KAAK0xB,aAAa+2B,OAAO7pB,IAExBw/C,EAAUp+E,KAAKohF,cAChBphF,KAAKukF,gBAAmBnG,EAAUp+E,KAAKkhF,eAAkBlhF,KAAKsiF,cAC9DtiF,KAAK0xB,aAAa+2B,OAAO7pB,IAExBw/C,EAAUp+E,KAAKqhF,aAAejD,EAAUp+E,KAAKkhF,gBAC9ClhF,KAAKsiF,aACLtiF,KAAK0xB,aAAa+2B,OAAO7pB,GAG7Bw/C,EAAUp+E,KAAKghF,gBACfhhF,KAAK41B,aAAa6yB,OAAO7pB,GACzB5+B,KAAKkpB,wBACLlpB,KAAKskF,sBAAwBtkF,KAAK8iF,8BAGlC1E,GAAWp+E,KAAKihF,cAAgBjhF,KAAKwhF,sBACrCxhF,KAAKggF,aAAav3B,OAAO7pB,GAGzBw/C,GAAWp+E,KAAKihF,cAAgBjhF,KAAKuhF,qBACrCvhF,KAAK4/E,YAAYn3B,OAAO7pB,GAG5B5+B,KAAKuyB,QAAQ,oBAvGTvyB,KAAK+hF,UAAY3D,GA2GzBp+E,KAAKwkF,UAAY,WACb,IAAIh1E,EAASxP,KAAK8nB,QAAQq0C,kBAAoBn8D,KAAK60B,WAC/C8rD,EAAY3gF,KAAK8pE,UAAY9pE,KAAK60B,WAClC4vD,EAAgBv9E,KAAKM,IAAIm5E,EACzBz5E,KAAKC,KAAKnH,KAAK+pE,WAAa,GAAK/pE,KAAK60B,WAAYrlB,IAClDxP,KAAKqgF,aAAaO,GAAK5gF,KAAKoiF,cAAgB,GAC5CpiF,KAAKigF,eACLwE,GAAiBzkF,KAAKo/B,WAAWnO,aACjCjxB,KAAK0kF,iBAAmBD,EAAgBzkF,KAAK0kF,kBAC7CD,EAAgBzkF,KAAK0kF,iBACzB,IAAIrvD,EAAU7lB,EAASmxE,EAEvB,GAAI8D,GAAiBzkF,KAAKykF,eACtBzkF,KAAKugF,MAAM/wE,QAAUxP,KAAKykF,eAAiBpvD,GAAWr1B,KAAKkgF,SAAU,CACjE7qD,GAAWr1B,KAAKkgF,WAChBlgF,KAAKkgF,SAAW7qD,EAChBr1B,KAAKm/B,WAAW69C,WAAW3nD,IAG/B,IAAI+gC,EAAIp2D,KAAK4pB,UAAU3a,YACvBjP,KAAK4pB,UAAUtb,MAAMkB,OAASi1E,EAAgB,KAC9CzkF,KAAKmiF,mBAAkB,EAAMniF,KAAK2kF,aAAcvuB,EAAGquB,GACnDzkF,KAAKykF,cAAgBA,EAErBzkF,KAAKuyB,QAAQ,cAIrBvyB,KAAKuiF,oBAAsB,WACvB,IAAIz6D,EAAU9nB,KAAK8nB,QACfqhB,EAAOnpC,KAAKugF,MAEZqE,EAAiBz7C,EAAK35B,QAAU,EAAIxP,KAAK60B,WACzCgwD,EAAc7kF,KAAK8nB,QAAQq0C,kBAC3BwkB,EAAYkE,EAAc7kF,KAAK60B,WAE/BiwD,EAAc9kF,KAAK+kF,kBAEnBC,GAAeJ,IAAmB5kF,KAAKwjF,0BACvCr6C,EAAKs3C,cAAgBqE,EAAc,EAAI9kF,KAAK61E,SAAW,GAEvDoP,EAAiBjlF,KAAKigF,eAAiB+E,EACvCC,IACAjlF,KAAKigF,aAAe+E,EACpBhlF,KAAKo/B,WAAW49C,WAAWgI,IAE/B,IAAIE,EAAgBllF,KAAKkgF,SACrBlgF,KAAK8pE,WAAa9pE,KAAK60B,WAAa,GACpC70B,KAAKwkF,YAET,IAAI1hE,EAAS9iB,KAAKuQ,UAAYvQ,KAAK60B,WAC/B6gD,EAAYvsC,EAAKq3C,eAAiBxgF,KAAK60B,WAEvC+9C,GAAiB5yE,KAAK8pE,WAAa9pE,KAAK+jF,gBACrC56C,EAAKq3C,eAAiBxgF,KAAK60B,YAAc70B,KAAK+jF,eAC/C,EACNpD,GAAa/N,EAEb,IAAI0Q,EAAKtjF,KAAKqgF,aACdrgF,KAAK8nB,QAAQ2tC,aAAavuD,KAAKC,KAAKm8E,EAAGx5D,IACnC5iB,KAAKM,IAAIxH,KAAKuQ,UAAWowE,EAAYx3C,EAAKq3C,eAAiB8C,EAAGp5D,UAElElqB,KAAK8nB,QAAQ+tC,cAAc3uD,KAAKC,KAAKm8E,EAAG1zE,KAAM1I,KAAKM,IAAIxH,KAAKwQ,WACxDs0E,EAAc,EAAI9kF,KAAK61E,SAAW1sC,EAAKs3C,cAAgB6C,EAAG14D,SAE9D,IAAIyK,GAAWuvD,IAAmB5kF,KAAK4jF,0BACnCz6C,EAAKq3C,eAAiBG,EAAY/N,EAAgB,GAAK5yE,KAAKuQ,UAAY+yE,EAAGx5D,KAC3Eq7D,EAAiBD,IAAkB7vD,EACnC8vD,IACAnlF,KAAKkgF,SAAW7qD,EAChBr1B,KAAKm/B,WAAW69C,WAAW3nD,IAG/B,IAGI8hD,EAAgBiO,EAHhBC,EAAYn+E,KAAK6uE,KAAKL,EAAY11E,KAAK60B,YAAc,EACrD8X,EAAWzlC,KAAKC,IAAI,EAAGD,KAAKqrC,OAAOvyC,KAAKuQ,UAAYuS,GAAU9iB,KAAK60B,aACnE+X,EAAUD,EAAW04C,EAErBxwD,EAAa70B,KAAK60B,WACtB8X,EAAW7kB,EAAQ8zC,oBAAoBjvB,EAAU,GACjD,IAAIyD,EAAWtoB,EAAQuoB,YAAY1D,GAC/ByD,IACAzD,EAAWyD,EAAStpC,MAAM2lB,KAG9B0qD,EAAiBrvD,EAAQwK,oBAAoBqa,EAAU,GACvDy4C,EAAiBt9D,EAAQszC,aAAazuB,GAAY9X,EAElD+X,EAAU1lC,KAAKM,IAAIsgB,EAAQ8zC,oBAAoBhvB,EAAS,GAAI9kB,EAAQoK,YAAc,GAClFwjD,EAAYvsC,EAAKq3C,eAAiB14D,EAAQszC,aAAaxuB,GAAW/X,EAC1BuwD,EAExCtiE,EAAS9iB,KAAKuQ,UAAY4mE,EAAiBtiD,EAE3C,IAAIupD,EAAU,EAyBd,OAxBIp+E,KAAK80B,YAAYxlB,OAASw1E,IAC1B1G,EAAUp+E,KAAKyhF,kBACfwD,GAAkBE,KAClB/G,EAAUp+E,KAAKmiF,mBAAkB,EAAMniF,KAAK00E,YAAavrC,EAAK75B,MAAO65B,EAAK35B,QAC1ExP,KAAKuyB,QAAQ,8BACT4yD,IACAL,EAAc9kF,KAAK+kF,oBAG3B/kF,KAAK80B,YAAc,CACfxlB,MAAQw1E,EACRlP,QAAU51E,KAAK61E,SACflpC,SAAWA,EACXwqC,eAAgBA,EAChBvqC,QAAUA,EACV/X,WAAaA,EACbE,eAAiB/0B,KAAK+0B,eACtB2gD,UAAYA,EACZiL,UAAYA,EACZ79D,OAASA,EACTiyD,aAAelgD,EAAa3tB,KAAKC,IAAI,EAAGD,KAAK6uE,MAAMjzD,EAASqmB,EAAK35B,OAAS25B,EAAKq3C,gBAAkB3rD,IAAe,EAChHrlB,OAASxP,KAAKugF,MAAMC,gBAGjBpC,GAGXp+E,KAAKukF,aAAe,WAChB,GAAKvkF,KAAK6hF,cAAV,CACA,IAAIl1C,EAAW3sC,KAAK6hF,cAAcl1C,SAC9BC,EAAU5sC,KAAK6hF,cAAcj1C,QACjC5sC,KAAK6hF,cAAgB,KAErB,IAAI/sD,EAAc90B,KAAK80B,YAEvB,KAAI6X,EAAW7X,EAAY8X,QAAU,MACjCA,EAAU9X,EAAY6X,UAC1B,OAAIC,IAAYwT,KACRpgD,KAAKsiF,aACLtiF,KAAK0xB,aAAa+2B,OAAO3zB,QAC7B90B,KAAK8/E,WAAWr3B,OAAO3zB,KAG3B90B,KAAK8/E,WAAWtW,YAAY10C,EAAa6X,EAAUC,IAC5C,KAGX5sC,KAAK+kF,gBAAkB,WACnB,IAAIO,EAAYtlF,KAAK8nB,QAAQiuC,iBAI7B,OAHI/1D,KAAKwnC,iBAAmBxnC,KAAK8nB,QAAQihB,eACrCu8C,GAAa,GAEVp+E,KAAKC,IAAInH,KAAKugF,MAAME,cAAgB,EAAIzgF,KAAK61E,SAAU3uE,KAAKqrC,MAAM+yC,EAAYtlF,KAAK+0B,kBAE9F/0B,KAAKuqE,mBAAqB,WACtBvqE,KAAKggF,aAAapJ,WAAW52E,KAAK8nB,QAAQgsC,YAAW,IACrD9zD,KAAK6gF,MAAMz9D,SAASpjB,KAAKwhF,sBAE7BxhF,KAAKwqE,kBAAoB,WACrBxqE,KAAK4/E,YAAYhJ,WAAW52E,KAAK8nB,QAAQgsC,cACzC9zD,KAAK6gF,MAAMz9D,SAASpjB,KAAKuhF,qBAE7BvhF,KAAKkzD,oBAAsB,SAASzmC,EAAKjf,GACrCxN,KAAK0xB,aAAawhC,oBAAoBzmC,EAAKjf,IAE/CxN,KAAKmzD,uBAAyB,SAAS1mC,EAAKjf,GACxCxN,KAAK0xB,aAAayhC,uBAAuB1mC,EAAKjf,IAElDxN,KAAKyqE,kBAAoB,SAASt4B,GAC9BnyC,KAAK6gF,MAAMz9D,SAASpjB,KAAKkhF,gBAE7BlhF,KAAKk0D,eAAiB,SAASC,GAC3Bn0D,KAAK0xB,aAAawiC,eAAeC,GACjCn0D,KAAK6gF,MAAMz9D,SAASpjB,KAAKkhF,gBAE7BlhF,KAAKupE,aAAe,WAChBvpE,KAAK6gF,MAAMz9D,SAASpjB,KAAKghF,gBAE7BhhF,KAAKopE,WAAa,WACdppE,KAAK41B,aAAawzC,cAEtBppE,KAAKkpE,WAAa,WACdlpE,KAAK41B,aAAaszC,cAGtBlpE,KAAKolE,wBAA0B,SAASx4C,EAAQ4gB,EAAM1qB,GAClD9iB,KAAKsuB,qBAAqB1B,EAAQ9J,GAClC9iB,KAAKsuB,qBAAqBkf,EAAM1qB,IAEpC9iB,KAAKsuB,qBAAuB,SAAS9B,EAAQ1J,EAAQyiE,GACjD,GAAkC,IAA9BvlF,KAAKugF,MAAMC,eAAf,CAGA,IAAIx5E,EAAMhH,KAAK41B,aAAaumD,iBAAiB3vD,GAEzC5c,EAAO5I,EAAI4I,KACXka,EAAM9iB,EAAI8iB,IAEV07D,EAAYD,GAAeA,EAAYz7D,KAAO,EAC9C27D,EAAeF,GAAeA,EAAYr7D,QAAU,EAEpD3Z,EAAYvQ,KAAKogF,iBAAmBpgF,KAAK8nB,QAAQ6tC,eAAiB31D,KAAKuQ,UAEvEA,EAAYi1E,EAAY17D,GACpBhH,GAAUvS,EAAYi1E,EAAY17D,EAAM9pB,KAAK60B,aAC7C/K,GAAOhH,EAAS9iB,KAAKugF,MAAMC,gBACnB,IAAR12D,IACAA,GAAO9pB,KAAKqgF,aAAav2D,KAC7B9pB,KAAK8nB,QAAQ2tC,aAAa3rC,IACnBvZ,EAAYvQ,KAAKugF,MAAMC,eAAiBiF,EAAe37D,EAAM9pB,KAAK60B,aACrE/R,GAAUvS,EAAYvQ,KAAKugF,MAAMC,eAAiBiF,EAAe37D,EAAO9pB,KAAK60B,aAC7E/K,GAAOhH,EAAS9iB,KAAKugF,MAAMC,gBAC/BxgF,KAAK8nB,QAAQ2tC,aAAa3rC,EAAM9pB,KAAK60B,WAAa70B,KAAKugF,MAAMC,iBAGjE,IAAIhwE,EAAaxQ,KAAKwQ,WAElBA,EAAaZ,GACTA,EAAO5P,KAAK61E,SAAW,EAAI71E,KAAK80B,YAAYC,iBAC5CnlB,GAAQ5P,KAAKqgF,aAAazwE,MAC9B5P,KAAK8nB,QAAQ+tC,cAAcjmD,IACpBY,EAAaxQ,KAAKugF,MAAME,cAAgB7wE,EAAO5P,KAAK+0B,eAC3D/0B,KAAK8nB,QAAQ+tC,cAAc3uD,KAAKqrC,MAAM3iC,EAAO5P,KAAK+0B,eAAiB/0B,KAAKugF,MAAME,gBACvEjwE,GAAcxQ,KAAK61E,UAAYjmE,EAAOY,EAAaxQ,KAAK+0B,gBAC/D/0B,KAAK8nB,QAAQ+tC,cAAc,KAGnC71D,KAAK21D,aAAe,WAChB,OAAO31D,KAAK8nB,QAAQ6tC,gBAExB31D,KAAK81D,cAAgB,WACjB,OAAO91D,KAAK8nB,QAAQguC,iBAExB91D,KAAKkvE,gBAAkB,WACnB,OAAOlvE,KAAKuQ,UAAYvQ,KAAK60B,YAEjC70B,KAAKivE,mBAAqB,WACtB,OAAO/nE,KAAKC,IAAI,EAAGD,KAAKyF,OAAO3M,KAAKuQ,UAAYvQ,KAAKugF,MAAMC,gBAAkBxgF,KAAK60B,YAAc,IAEpG70B,KAAKovE,YAAc,SAAS3iD,GACxBzsB,KAAK8nB,QAAQ2tC,aAAahpC,EAAMzsB,KAAK60B,aAGzC70B,KAAKwvE,YAAc,SAAShjD,EAAQk5D,GACX,iBAAVl5D,IACPA,EAAS,CAACC,IAAKD,EAAQG,OAAQ,IAEnC,IAAI3lB,EAAMhH,KAAK41B,aAAaumD,iBAAiB3vD,GACzCuV,EAAI/hC,KAAKugF,MAAMC,eAAiBxgF,KAAK60B,WACrC/R,EAAS9b,EAAI8iB,IAAMiY,GAAK2jD,GAAa,GAGzC,OADA1lF,KAAK8nB,QAAQ2tC,aAAa3yC,GACnBA,GAGX9iB,KAAK2lF,MAAQ,EACb3lF,KAAK4lF,WAAa,SAASC,EAAWC,GAClC,IAAIpkF,EAAI,EACJC,EAAI3B,KAAK2lF,MACTI,EAAQ,GAERjzC,EAAQ,SAASrjB,EAAGu2D,EAAOC,GAC3B,OAAOA,GAAM/+E,KAAK8R,IAAIyW,EAAI,EAAG,GAAK,GAAKu2D,GAG3C,IAAKtkF,EAAI,EAAGA,EAAIC,IAAKD,EACjBqkF,EAAMjkF,KAAKgxC,EAAKpxC,EAAI1B,KAAK2lF,MAAOE,EAAWC,EAAUD,IAEzD,OAAOE,GAEX/lF,KAAKqvE,aAAe,SAAS3nC,EAAM4nC,EAAQC,EAASruE,GAChD,IAAI8F,EAAMhH,KAAK41B,aAAaumD,iBAAiB,CAAC1vD,IAAKib,EAAM/a,OAAQ,IAC7D7J,EAAS9b,EAAI8iB,IACbwlD,IACAxsD,GAAU9iB,KAAKugF,MAAMC,eAAiB,GAE1C,IAAI0F,EAAgBlmF,KAAKuQ,UACzBvQ,KAAK8nB,QAAQ2tC,aAAa3yC,IACV,IAAZysD,GACAvvE,KAAKqlE,iBAAiB6gB,EAAehlF,IAG7ClB,KAAKqlE,iBAAmB,SAASwgB,EAAW3kF,GACxC,IAAI4kF,EAAU9lF,KAAKuQ,UACnB,GAAKvQ,KAAK2iF,gBAAV,CAEA,IAAIn/D,EAAQxjB,KAEZ,GAAI6lF,GAAaC,EAAjB,CAGA,GAAI9lF,KAAKogF,iBAAkB,CACvB,IAAI+F,EAAWnmF,KAAKogF,iBAAiB2F,MACrC,GAAII,EAAS3lF,SACTqlF,EAAYM,EAAS,GACjBN,GAAaC,GACb,OAIZ,IAAIC,EAAQviE,EAAMoiE,WAAWC,EAAWC,GACxC9lF,KAAKogF,iBAAmB,CAAC57E,KAAMqhF,EAAW/+B,GAAIg/B,EAASC,MAAOA,GAE9DjwD,cAAc91B,KAAKomF,QAEnB5iE,EAAMsE,QAAQ2tC,aAAaswB,EAAMh7D,SACjCvH,EAAMsE,QAAQ0tC,WAAaswB,EAC3B9lF,KAAKomF,OAASrwD,YAAY,WAClBgwD,EAAMvlF,QACNgjB,EAAMsE,QAAQ2tC,aAAaswB,EAAMh7D,SACjCvH,EAAMsE,QAAQ0tC,WAAaswB,GACT,MAAXA,GACPtiE,EAAMsE,QAAQ0tC,YAAc,EAC5BhyC,EAAMsE,QAAQ2tC,aAAaqwB,GAC3BA,EAAU,OAEVtiE,EAAM4iE,OAAStwD,cAActS,EAAM4iE,QACnC5iE,EAAM48D,iBAAmB,KACzBl/E,GAAYA,MAEjB,OAEPlB,KAAK0pE,UAAY,SAASn5D,GAClBvQ,KAAKuQ,YAAcA,IACnBvQ,KAAK6gF,MAAMz9D,SAASpjB,KAAKmhF,eACzBnhF,KAAKuQ,UAAYA,IAGzBvQ,KAAK2pE,UAAY,SAASn5D,GAClBxQ,KAAKwQ,aAAeA,IACpBxQ,KAAKwQ,WAAaA,GACtBxQ,KAAK6gF,MAAMz9D,SAASpjB,KAAKyhF,kBAE7BzhF,KAAKqmF,SAAW,SAASviF,EAAGgqB,GACxB9tB,KAAK8nB,QAAQ2tC,aAAa3nC,GAC1B9tB,KAAK8nB,QAAQ+tC,cAAc/nC,IAE/B9tB,KAAKmwB,SAAW,SAAS/R,EAAQC,GAC7BA,GAAUre,KAAK8nB,QAAQ2tC,aAAaz1D,KAAK8nB,QAAQ6tC,eAAiBt3C,GAClED,GAAUpe,KAAK8nB,QAAQ+tC,cAAc71D,KAAK8nB,QAAQguC,gBAAkB13C,IAExEpe,KAAKgwB,eAAiB,SAAS5R,EAAQC,GACnC,OAAIA,EAAS,GAAKre,KAAK8nB,QAAQ6tC,gBAAkB,EAAI31D,KAAKqgF,aAAav2D,MAEnEzL,EAAS,GAAKre,KAAK8nB,QAAQ6tC,eAAiB31D,KAAKugF,MAAMC,eACrDxgF,KAAK80B,YAAY6rD,WAAa,EAAI3gF,KAAKqgF,aAAan2D,SAEtD9L,EAAS,GAAKpe,KAAK8nB,QAAQguC,iBAAmB,EAAI91D,KAAKqgF,aAAazwE,OAEpEwO,EAAS,GAAKpe,KAAK8nB,QAAQguC,gBAAkB91D,KAAKugF,MAAME,cACtDzgF,KAAK80B,YAAYxlB,OAAS,EAAItP,KAAKqgF,aAAaz1D,YADtD,MAKJ5qB,KAAKoyB,yBAA2B,SAAStuB,EAAGgqB,GACxC,IAAIw4D,EAAYtmF,KAAKqqB,SAASR,wBAE1BuoB,EAAUtuC,EAAI9D,KAAKwQ,WAAa81E,EAAU12E,KAAO5P,KAAK61E,SACtD/yD,EAASsvB,EAAUpyC,KAAK+0B,eACxBtI,EAAMvlB,KAAKyF,OAAOmhB,EAAI9tB,KAAKuQ,UAAY+1E,EAAUx8D,KAAO9pB,KAAK60B,YAC7DsV,EAAMjjC,KAAKqrC,MAAMzvB,GAErB,MAAO,CAAC2J,IAAKA,EAAKE,OAAQwd,EAAKuhB,KAAM5oC,EAASqnB,EAAM,EAAI,GAAK,EAAGiI,QAAUA,IAG9EpyC,KAAK6tB,wBAA0B,SAAS/pB,EAAGgqB,GACvC,IAAIw4D,EAAYtmF,KAAKqqB,SAASR,wBAC1BuoB,EAAUtuC,EAAI9D,KAAKwQ,WAAa81E,EAAU12E,KAAO5P,KAAK61E,SAEtD1rC,EAAMjjC,KAAKqrC,MAAMH,EAAUpyC,KAAK+0B,gBAEhCtI,GAAOqB,EAAI9tB,KAAKuQ,UAAY+1E,EAAUx8D,KAAO9pB,KAAK60B,WAEtD,OAAO70B,KAAK8nB,QAAQgpB,yBAAyBrkB,EAAKvlB,KAAKC,IAAIgjC,EAAK,GAAIiI,IAExEpyC,KAAKumF,wBAA0B,SAAS95D,EAAKE,GACzC,IAAI25D,EAAYtmF,KAAKqqB,SAASR,wBAC1B7iB,EAAMhH,KAAK8nB,QAAQqlB,yBAAyB1gB,EAAKE,GAEjD7oB,EAAI9D,KAAK61E,UAAY71E,KAAK8nB,QAAQwqB,aAAavK,UAAU/gC,EAAIylB,IAAKA,GAC/DzsB,KAAK8nB,QAAQwqB,aAAapI,WAAWljC,EAAI2lB,QACzCzlB,KAAKqrC,MAAMvrC,EAAI2lB,OAAS3sB,KAAK+0B,iBAEhCjH,EAAI9mB,EAAIylB,IAAMzsB,KAAK60B,WAEvB,MAAO,CACH2xD,MAAOF,EAAU12E,KAAO9L,EAAI9D,KAAKwQ,WACjCi2E,MAAOH,EAAUx8D,IAAMgE,EAAI9tB,KAAKuQ,YAGxCvQ,KAAKmpE,eAAiB,WAClBzlD,EAAIjW,YAAYzN,KAAK4pB,UAAW,cAEpC5pB,KAAKqpE,cAAgB,WACjB3lD,EAAIhW,eAAe1N,KAAK4pB,UAAW,cAEvC5pB,KAAKuuE,gBAAkB,SAAS5+D,GACvB3P,KAAKojF,eACNpjF,KAAKojF,aAAe,CAChBsD,qBAAsB1mF,KAAKipB,sBAC3B5a,QAASrO,KAAKmkE,SAAS71D,MAAMD,UAGrCrO,KAAKipB,uBAAwB,EAC7BvF,EAAIjW,YAAYzN,KAAKmkE,SAAU,mBAC/BnkE,KAAKmkE,SAAS71D,MAAMD,QAAU,GAC9BrO,KAAKkpB,yBAETlpB,KAAKwuE,mBAAqB,SAAStqD,GAC/BlkB,KAAKkpB,yBAETlpB,KAAKyuE,gBAAkB,WACdzuE,KAAKojF,eAGV1/D,EAAIhW,eAAe1N,KAAKmkE,SAAU,mBAClCnkE,KAAKipB,sBAAwBjpB,KAAKojF,aAAasD,qBAC/C1mF,KAAKmkE,SAAS71D,MAAMD,QAAUrO,KAAKojF,aAAa/0E,QAChDrO,KAAKojF,aAAe,OAExBpjF,KAAKmoE,SAAW,SAASC,EAAOjiD,GAC5B,IAAI3C,EAAQxjB,KAIZ,GAHAA,KAAK2mF,SAAWve,EAChB5kD,EAAMmW,eAAe,cAAc,CAACyuC,MAAMA,IAErCA,GAAyB,iBAATA,EAIjB1pC,EAAU0pC,OAJ0B,CACpC,IAAInmE,EAAammE,GAASpoE,KAAKk7B,SAASktC,MAAMpsC,aAC9C4C,EAAOL,WAAW,CAAC,QAASt8B,GAAay8B,GAK7C,SAASA,EAAUt+B,GACf,GAAIojB,EAAMmjE,UAAYve,EAClB,OAAOjiD,GAAMA,IACjB,IAAK/lB,IAAWA,EAAOwmF,SACnB,MAAM,IAAIjrD,MAAM,wBAA0BysC,EAAQ,6BACtD1kD,EAAItV,gBACAhO,EAAOiO,QACPjO,EAAOwmF,SACPpjE,EAAMoG,UAAUuT,eAGhB3Z,EAAM4kD,OACN1kD,EAAIhW,eAAe8V,EAAMoG,UAAWpG,EAAM4kD,MAAMwe,UAEpD,IAAIhR,EAAU,YAAax1E,EAASA,EAAOw1E,QACrC,YAAcpyD,EAAM4kD,OAAS,IAAM,EAAI5kD,EAAMqyD,SAC/CryD,EAAMqyD,UAAYD,GAAWpyD,EAAMqyD,UACnCryD,EAAMmzD,WAAWf,GACrBpyD,EAAMqjE,OAASzmF,EAAOwmF,SAEtBpjE,EAAM4kD,MAAQhoE,EACdsjB,EAAIjW,YAAY+V,EAAMoG,UAAWxpB,EAAOwmF,UACxCljE,EAAI9V,YAAY4V,EAAMoG,UAAW,WAAYxpB,EAAO0mF,QAChDtjE,EAAM+8D,QACN/8D,EAAM+8D,MAAMjxE,MAAQ,EACpBkU,EAAMw+D,oBAGVx+D,EAAMmW,eAAe,cAAe,CAACyuC,MAAMhoE,IAC3C+lB,GAAMA,MAGdnmB,KAAKqoE,SAAW,WACZ,OAAOroE,KAAK2mF,UAEhB3mF,KAAKkuB,SAAW,SAAS5f,EAAOR,GAC5B4V,EAAI9V,YAAY5N,KAAK4pB,UAAWtb,GAAmB,IAAZR,IAE3C9N,KAAK8uB,WAAa,SAASxgB,GACvBoV,EAAIhW,eAAe1N,KAAK4pB,UAAWtb,IAGvCtO,KAAK+2B,eAAiB,SAASzoB,GACvBtO,KAAKqqB,SAAS/b,MAAMke,QAAUle,IAC9BtO,KAAKqqB,SAAS/b,MAAMke,OAASle,IAErCtO,KAAK+mF,eAAiB,SAAS5uD,GAC3Bn4B,KAAKqqB,SAAS/b,MAAMke,OAAS2L,GAEjCn4B,KAAKoxB,QAAU,WACXpxB,KAAK8/E,WAAW1uD,UAChBpxB,KAAK41B,aAAaxE,aAGvB5vB,KAAKi+E,EAAgBn+E,WAGxBs9B,EAAO9C,cAAc2jD,EAAgBn+E,UAAW,WAAY,CACxD0wE,eAAgB,CAACh2C,cAAc,GAC/BwL,eAAgB,CACZz9B,IAAK,SAASrB,GACN1I,KAAK8/E,WAAWh2C,kBAAkBphC,IAClC1I,KAAK6gF,MAAMz9D,SAASpjB,KAAKqhF,cAEjCrlD,cAAc,GAElBqwC,gBAAiB,CACbtiE,IAAK,WAAa/J,KAAK2hF,sBACvB3lD,cAAc,GAElBi2C,kBAAmB,CACfloE,IAAK,WAAa/J,KAAK2hF,sBACvB3lD,aAAc,IAElBk2C,YAAa,CACTnoE,IAAK,SAASse,GACQ,iBAAPA,IACProB,KAAK0iF,mBAAqBr6D,GAC9BroB,KAAKyiF,mBAAqBp6D,EAC1BroB,KAAK2hF,sBAET73E,IAAK,WACD,OAAO9J,KAAKyiF,kBAAoBziF,KAAK0iF,qBAG7CpQ,WAAY,CACRvoE,IAAK,SAASgnB,GACV/wB,KAAKgzB,QAAQ1kB,MAAMmB,QAAUshB,EAAO,QAAU,OAC9C/wB,KAAK6gF,MAAMz9D,SAASpjB,KAAK+gF,aACzB/gF,KAAK2/E,kBAET3jD,cAAc,GAElBm2C,gBAAiB,CACbpoE,IAAK,SAASgnB,GACVrN,EAAI9V,YAAY5N,KAAKgzB,QAAS,wBAAyBjC,IAE3DiL,cAAc,GAElBo2C,gBAAiB,CACbroE,IAAK,SAASgnB,GAAO/wB,KAAK0xB,aAAak7C,mBAAmB77C,IAC1DiL,cAAc,GAElBq2C,gBAAiB,CACbtoE,IAAK,SAASgnB,GACV/wB,KAAK0xB,aAAaukD,mBAAmBllD,GACrC/wB,KAAK6gF,MAAMz9D,SAASpjB,KAAKkhF,gBAE7BllD,cAAc,GAElBu2C,oBAAqB,CACjBxoE,IAAK,SAASgnB,GACN/wB,KAAK8/E,WAAW5T,uBAAuBn7C,IACvC/wB,KAAK6gF,MAAMz9D,SAASpjB,KAAKqhF,cAEjCrlD,cAAc,GAElB+1C,oBAAqB,CACjBhoE,IAAK,SAAS0hE,GACV,IAAKzrE,KAAK+iF,qBAIN,OAHA/iF,KAAK+iF,qBAAuBr/D,EAAIzY,cAAc,OAC9CjL,KAAK+iF,qBAAqBv1E,UAAY,8BACtCxN,KAAKgzB,QAAQzkB,YAAYvO,KAAK+iF,sBAIlC/iF,KAAK+iF,qBAAqBz0E,MAAMmB,QAAUg8D,EAAkB,GAAK,OAC7DzrE,KAAK41B,aAAao7C,WAClBhxE,KAAK8iF,8BAEb9mD,cAAc,EACdtzB,OAAO,GAEXmpE,wBAAyB,CACrB9nE,IAAK,SAASse,GACLroB,KAAKwjF,0BAA6BxjF,KAAKigF,cACxCjgF,KAAK6gF,MAAMz9D,SAASpjB,KAAKmhF,gBAEjCnlD,cAAc,GAElB81C,wBAAyB,CACrB/nE,IAAK,SAASse,GACLroB,KAAK4jF,0BAA6B5jF,KAAKkgF,UACxClgF,KAAK6gF,MAAMz9D,SAASpjB,KAAKmhF,gBAEjCnlD,cAAc,GAElBw2C,SAAW,CACPzoE,IAAK,SAASo/B,GACS,iBAARA,IACPA,GAAc,MAClBnpC,KAAK4pB,UAAUtb,MAAMkkE,SAAWrpC,EAChCnpC,KAAK8hF,kBAET9lD,aAAc,IAElBy2C,WAAY,CACR1oE,IAAK,SAASpF,GACV3E,KAAK4pB,UAAUtb,MAAMmkE,WAAa9tE,EAClC3E,KAAK8hF,mBAGbpP,SAAU,CACN3oE,IAAK,SAASse,GACVroB,KAAK6nE,eAGb8K,SAAU,CACN5oE,IAAK,SAASse,GACVroB,KAAK6nE,eAGbmf,eAAgB,CACZj9E,IAAK,SAASse,GACVroB,KAAK6nE,cAET7rC,aAAc,GAElB42C,cAAe,CACX7oE,IAAK,SAASse,GACVA,GAAOA,GAAO,EACVroB,KAAK+jF,gBAAkB17D,IAE3BroB,KAAK+jF,eAAiB17D,EACtBroB,KAAK6gF,MAAMz9D,SAASpjB,KAAKmhF,iBAE7BnlD,aAAc,EACdT,YAAY,GAEhBs3C,iBAAkB,CACd9oE,IAAK,SAASse,GACVroB,KAAK0xB,aAAaikD,cAAgBttD,EAClCroB,KAAK6gF,MAAMz9D,SAASpjB,KAAKkhF,iBAGjC9Y,MAAO,CACHr+D,IAAK,SAASse,GAAOroB,KAAKmoE,SAAS9/C,IACnCve,IAAK,WAAa,OAAO9J,KAAK2mF,UAAY3mF,KAAKooE,OAC/CpsC,aAAc,mBACdT,YAAY,KAIpB54B,EAAQ88E,gBAAkBA,IAG1Bp8E,IAAIlD,OAAO,2BAA2B,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,wBAAwB,cAAe,SAAS0B,EAAUc,EAASvC,GACnK,aAEA,IAAI4R,EAAMnQ,EAAS,cACfy6B,EAAMz6B,EAAS,cACf63B,EAAe73B,EAAS,wBAAwB63B,aAChDkF,EAAS/8B,EAAS,aAEtB,SAASolF,EAAYC,EAAWtkF,GAC5B,IAAIy6B,EAASz6B,EAAIixB,IAAwByI,EAAI7C,WAAWytD,GACxD,IACI,OAAO,IAAIC,KAAK,CAAC9pD,GAAS,CAAC,KAAQ,2BACrC,MAAOjhB,GACL,IAAIgrE,EAAcnnF,OAAOmnF,aAAennF,OAAOonF,mBAAqBpnF,OAAOqnF,eACvEC,EAAc,IAAIH,EAEtB,OADAG,EAAY3wC,OAAOvZ,GACZkqD,EAAYC,QAAQ,2BAInC,SAASxlC,EAAaklC,EAAWtkF,GAC7B,IAAI6kF,EAAOR,EAAYC,EAAWtkF,GAC9B8kF,EAAMznF,OAAOynF,KAAOznF,OAAO0nF,UAC3BC,EAAUF,EAAIG,gBAAgBJ,GAClC,OAAO,IAAIK,OAAOF,GAGtB,IAAIG,EAAe,SAASC,EAAoBplF,EAAKqlF,EAAWf,EAAWgB,GAOvE,GANAloF,KAAKmoF,gBAAkBnoF,KAAKmoF,gBAAgBhjF,KAAKnF,MACjDA,KAAKooF,eAAiBpoF,KAAKooF,eAAejjF,KAAKnF,MAC/CA,KAAKqoF,UAAYroF,KAAKqoF,UAAUljF,KAAKnF,MACjC6B,EAASymF,YAAczmF,EAAS0mF,QAChC1mF,EAAS0mF,MAAQ1mF,EAASymF,WAE1B1pD,EAAO90B,IAAI,cAAgBjI,EAAS0mF,MACpCrB,EAAYA,GAAatoD,EAAOb,UAAUn7B,EAAIC,GAAI,cAC/C,CACH,IAAI2lF,EAAgBxoF,KAAKyoF,eACzBvB,EAAYA,GAAasB,EAAc3mF,EAAS0mF,MAAM,uBAAwB,KAAM,MAEpF,IAAIG,EAAO,GACXV,EAAmB9/E,QAAQ,SAAS/E,GAChCulF,EAAKvlF,GAAMqlF,EAAc3mF,EAAS0mF,MAAMplF,EAAI,KAAM,KAAKT,QAAQ,kBAAmB,OAI1F1C,KAAKunD,QAAUvF,EAAaklC,EAAWtkF,GACnCslF,GACAloF,KAAKk5B,KAAK,gBAAiBgvD,GAE/BloF,KAAKunD,QAAQ5mC,YAAY,CACrBkc,MAAO,EACP6rD,KAAOA,EACPtoF,OAASwC,EAAIC,GACbolF,UAAYA,IAGhBjoF,KAAK2oF,WAAa,EAClB3oF,KAAK4oF,UAAY,GAEjB5oF,KAAKunD,QAAQshC,UAAY7oF,KAAKqoF,YAGlC,WAEIr2E,EAAIF,UAAU9R,KAAM05B,GAEpB15B,KAAKqoF,UAAY,SAASjsE,GACtB,IAAIsf,EAAMtf,EAAE6E,KACZ,OAAQya,EAAIhgB,MACR,IAAK,QACD1b,KAAKuyB,QAAQmJ,EAAI/2B,KAAM,CAACsc,KAAMya,EAAIza,OAClC,MACJ,IAAK,OACD,IAAI/f,EAAWlB,KAAK4oF,UAAUltD,EAAI74B,IAC9B3B,IACAA,EAASw6B,EAAIza,aACNjhB,KAAK4oF,UAAUltD,EAAI74B,KAE9B,MACJ,IAAK,QACD7C,KAAKy7B,YAAYC,EAAIza,MACrB,MACJ,IAAK,MACDhhB,OAAOY,SAAWA,QAAQ+oD,KAAO/oD,QAAQ+oD,IAAIhpD,MAAMC,QAAS66B,EAAIza,MAChE,QAIZjhB,KAAKy7B,YAAc,SAASqtD,GACxB7oF,OAAOY,SAAWA,QAAQC,OAASD,QAAQC,MAAMgoF,IAGrD9oF,KAAKyoF,eAAiB,SAASrvD,GAC3B,OAAOkD,EAAI7C,WAAWL,IAG1Bp5B,KAAKs1D,UAAY,WACbt1D,KAAKuyB,QAAQ,YAAa,IAC1BvyB,KAAK+oF,WAAa,KAClB/oF,KAAKunD,QAAQ+N,YACbt1D,KAAKunD,QAAU,KACXvnD,KAAK0zE,MACL1zE,KAAK0zE,KAAKh5C,IAAI,SAAU16B,KAAKooF,gBACjCpoF,KAAK0zE,KAAO,MAGhB1zE,KAAKk5B,KAAO,SAAS8vD,EAAKzjF,GACtBvF,KAAKunD,QAAQ5mC,YAAY,CAAC6hB,QAASwmD,EAAKzjF,KAAMA,KAGlDvF,KAAKwB,KAAO,SAASwnF,EAAKzjF,EAAMrE,GAC5B,GAAIA,EAAU,CACV,IAAI2B,EAAK7C,KAAK2oF,aACd3oF,KAAK4oF,UAAU/lF,GAAM3B,EACrBqE,EAAKzD,KAAKe,GAEd7C,KAAKk5B,KAAK8vD,EAAKzjF,IAGnBvF,KAAKipF,KAAO,SAASntE,EAAOmF,GACxB,IACIjhB,KAAKunD,QAAQ5mC,YAAY,CAAC7E,MAAOA,EAAOmF,KAAM,CAACA,KAAMA,EAAKA,QAE9D,MAAMioE,GACFroF,QAAQC,MAAMooF,EAAG9zC,SAIzBp1C,KAAKmpF,iBAAmB,SAASp8E,GACzB/M,KAAK0zE,MACL1zE,KAAKs1D,YAETt1D,KAAK0zE,KAAO3mE,EACZ/M,KAAKwB,KAAK,WAAY,CAACuL,EAAI+3C,aAC3B/3C,EAAIkb,GAAG,SAAUjoB,KAAKooF,iBAG1BpoF,KAAKooF,eAAiB,SAAS//C,GACtBroC,KAAK+oF,aACN/oF,KAAK+oF,WAAa,GAClBvpE,WAAWxf,KAAKmoF,gBAAiB,IAEjB,UAAhB9/C,EAAMnD,OACNllC,KAAK+oF,WAAWjnF,KAAKumC,EAAMvhC,MAAOuhC,EAAMC,OAExCtoC,KAAK+oF,WAAWjnF,KAAKumC,EAAMvhC,MAAOuhC,EAAMxd,MAGhD7qB,KAAKmoF,gBAAkB,WACnB,IAAIiB,EAAIppF,KAAK+oF,WACRK,IACLppF,KAAK+oF,WAAa,KACdK,EAAE5oF,OAAS,IAAM4oF,EAAE5oF,OAASR,KAAK0zE,KAAKxhD,aAAe,EACrDlyB,KAAKwB,KAAK,WAAY,CAACxB,KAAK0zE,KAAK5uB,aAEjC9kD,KAAKipF,KAAK,SAAU,CAAChoE,KAAMmoE,QAGpC5nF,KAAKumF,EAAazmF,WAGrB,IAAI+nF,EAAiB,SAASrB,EAAoBplF,EAAKqlF,GACnDjoF,KAAKmoF,gBAAkBnoF,KAAKmoF,gBAAgBhjF,KAAKnF,MACjDA,KAAKooF,eAAiBpoF,KAAKooF,eAAejjF,KAAKnF,MAC/CA,KAAK2oF,WAAa,EAClB3oF,KAAK4oF,UAAY,GACjB5oF,KAAKspF,cAAgB,GAErB,IAAIC,EAAO,KACPC,GAAW,EACXC,EAASpoF,OAAO6I,OAAOwvB,GACvBlW,EAAQxjB,KAEZA,KAAKunD,QAAU,GACfvnD,KAAKunD,QAAQ+N,UAAY,aACzBt1D,KAAKunD,QAAQ5mC,YAAc,SAASvE,GAChCoH,EAAM8lE,cAAcxnF,KAAKsa,GACrBmtE,IACIC,EACAhqE,WAAWkqE,GAEXA,MAGZ1pF,KAAK2pF,YAAc,SAASthE,GAAOmhE,EAAWnhE,GAE9C,IAAIqhE,EAAc,WACd,IAAIhuD,EAAMlY,EAAM8lE,cAAcv+D,QAC1B2Q,EAAI8G,QACJ+mD,EAAK7tD,EAAI8G,SAAS5hC,MAAM2oF,EAAM7tD,EAAIn2B,MAC7Bm2B,EAAI5f,OACT2tE,EAAOl3D,QAAQmJ,EAAI5f,MAAO4f,EAAIza,OAGtCwoE,EAAO9oE,YAAc,SAAS+a,GAC1BlY,EAAM6kE,UAAU,CAACpnE,KAAMya,KAE3B+tD,EAAOvoF,SAAW,SAAS+f,EAAM0nE,GAC7B3oF,KAAK2gB,YAAY,CAACjF,KAAM,OAAQ7Y,GAAI8lF,EAAY1nE,KAAMA,KAE1DwoE,EAAOR,KAAO,SAAStkF,EAAMsc,GACzBjhB,KAAK2gB,YAAY,CAACjF,KAAM,QAAS/W,KAAMA,EAAMsc,KAAMA,KAGvD2d,EAAOL,WAAW,CAAC,SAAU37B,GAAM,SAASgnF,GACxCL,EAAO,IAAIK,EAAK3B,GAAWwB,GAC3B,MAAOjmE,EAAM8lE,cAAc9oF,OACvBkpF,OAIZL,EAAe/nF,UAAYymF,EAAazmF,UAExCqB,EAAQ0mF,eAAiBA,EACzB1mF,EAAQolF,aAAeA,EACvBplF,EAAQq/C,aAAeA,IAKvB3+C,IAAIlD,OAAO,kBAAkB,CAAC,UAAU,UAAU,SAAS,YAAY,wBAAwB,eAAgB,SAAS0B,EAAUc,EAASvC,GAC3I,aAEA,IAAIkrC,EAAQzpC,EAAS,WAAWypC,MAC5B5R,EAAe73B,EAAS,uBAAuB63B,aAC/C1nB,EAAMnQ,EAAS,aAEfgoF,EAAc,SAAS/hE,EAAStnB,EAAQwG,EAAK8iF,EAAQC,EAAWC,GAChE,IAAIxmE,EAAQxjB,KACZA,KAAKQ,OAASA,EACdR,KAAK8nB,QAAUA,EACf9nB,KAAK+M,IAAM+a,EAAQylB,cACnBvtC,KAAK+pF,UAAYA,EACjB/pF,KAAKgqF,YAAcA,EACnBhqF,KAAKiqF,UAAYjqF,KAAKkqF,SAAS/kF,KAAKnF,MACpCA,KAAK+M,IAAIkb,GAAG,SAAUjoB,KAAKiqF,WAC3BjqF,KAAKmqF,QAAUL,EAEf9pF,KAAK2mE,gBAAkB,WACnBnnD,WAAW,WACPgE,EAAMikD,oBAIdznE,KAAKqyB,KAAOrrB,EACZ,IAAIojF,EAAYtiE,EAAQ6pC,iBAAiBkiB,YAAc/rD,EAAQ6pC,iBAAiB04B,YAAc,CAAC7pF,QAAS,GACxGR,KAAKsqF,gBAAkBF,EAAU5pF,OACjCR,KAAKuqF,QAELziE,EAAQhC,UAAUmC,GAAG,eAAgBjoB,KAAK2mE,mBAG9C,WAEI30D,EAAIF,UAAU9R,KAAM05B,GACpB15B,KAAKuqF,MAAQ,WACT,IAAI/mE,EAAQxjB,KACR+M,EAAM/M,KAAK+M,IACX+a,EAAU9nB,KAAK8nB,QAEnB9nB,KAAKwqF,gBAAkB1iE,EAAQhC,UAAUitB,SACrCjrB,EAAQhC,UAAU0H,mBAClB1F,EAAQhC,UAAUutB,gBAEtBrzC,KAAKgH,IAAM+F,EAAI2gC,aAAa1tC,KAAKqyB,KAAK5F,IAAKzsB,KAAKqyB,KAAK1F,QACrD,IAAI3lB,EAAMhH,KAAKgH,IACfA,EAAIu9C,cAAe,EACnBv9C,EAAIk7B,SACJl7B,EAAI4sD,SAAW9rC,EAAQ4N,UAAU,IAAI4V,EAAMtkC,EAAIylB,IAAKzlB,EAAI2lB,OAAQ3lB,EAAIylB,IAAKzlB,EAAI2lB,OAAS3sB,KAAKQ,QAASR,KAAK+pF,UAAW,MAAM,GAC1H/pF,KAAK8pF,OAAS,GACd9pF,KAAKmqF,QAAQjiF,QAAQ,SAASu3D,GAC1B,IAAI7yC,EAAS7f,EAAI2gC,aAAa+xB,EAAMhzC,IAAKgzC,EAAM9yC,QAC/CC,EAAO23B,cAAe,EACtB33B,EAAOsV,SACP1e,EAAMsmE,OAAOhoF,KAAK8qB,KAEtB9E,EAAQovC,eAAc,IAE1Bl3D,KAAKyqF,iBAAmB,WACpB,IAAIzqF,KAAK0qF,aAAT,CACA,IAAI5iE,EAAU9nB,KAAK8nB,QACftE,EAAQxjB,KACZA,KAAK0qF,cAAe,EACpB1qF,KAAK8pF,OAAO5hF,QAAQ,SAAS0kB,GACzBA,EAAOgnC,SAAW9rC,EAAQ4N,UAAU,IAAI4V,EAAM1e,EAAOH,IAAKG,EAAOD,OAAQC,EAAOH,IAAKG,EAAOD,OAAOnJ,EAAMhjB,QAASgjB,EAAMwmE,YAAa,MAAM,OAGnJhqF,KAAK2qF,iBAAmB,WACpB,GAAK3qF,KAAK0qF,aAAV,CACA1qF,KAAK0qF,cAAe,EACpB,IAAK,IAAIhpF,EAAI,EAAGA,EAAI1B,KAAK8pF,OAAOtpF,OAAQkB,IACpC1B,KAAK8nB,QAAQoO,aAAal2B,KAAK8pF,OAAOpoF,GAAGkyD,YAGjD5zD,KAAKkqF,SAAW,SAAS7hD,GACrB,GAAIroC,KAAK+sD,UACL,OAAO/sD,KAAK4qF,cAAcviD,GAE9B,IAAI3f,EAAQ2f,EACZ,GAAI3f,EAAM5hB,MAAM2lB,MAAQ/D,EAAMmC,IAAI4B,KAC9B/D,EAAM5hB,MAAM2lB,MAAQzsB,KAAKgH,IAAIylB,IAAjC,CACAzsB,KAAK+sD,WAAY,EACjB,IAAI89B,EAA8B,WAAjBxiD,EAAMnD,OAAsBxc,EAAMmC,IAAI8B,OAASjE,EAAM5hB,MAAM6lB,OAASjE,EAAM5hB,MAAM6lB,OAASjE,EAAMmC,IAAI8B,OAChHm+D,EAAcpiE,EAAM5hB,MAAM6lB,QAAU3sB,KAAKgH,IAAI2lB,QAAUjE,EAAM5hB,MAAM6lB,QAAU3sB,KAAKgH,IAAI2lB,OAAS3sB,KAAKQ,OAAS,EAC7GuqF,EAAoBriE,EAAM5hB,MAAM6lB,OAAS3sB,KAAKgH,IAAI2lB,OAOtD,GALA3sB,KAAK4qF,cAAcviD,GAEfyiD,IACA9qF,KAAKQ,QAAUqqF,GAEfC,IAAgB9qF,KAAK8nB,QAAQspC,UAC7B,GAAqB,WAAjB/oB,EAAMnD,OACN,IAAK,IAAIxjC,EAAI1B,KAAK8pF,OAAOtpF,OAAS,EAAGkB,GAAK,EAAGA,IAAK,CAC9C,IAAIg+D,EAAW1/D,KAAK8pF,OAAOpoF,GACvBspF,EAAS,CAACv+D,IAAKizC,EAASjzC,IAAKE,OAAQ+yC,EAAS/yC,OAASo+D,GAC3D/qF,KAAK+M,IAAI63C,kBAAkBomC,EAAQ3iD,EAAMC,YAE1C,GAAqB,WAAjBD,EAAMnD,OACb,IAASxjC,EAAI1B,KAAK8pF,OAAOtpF,OAAS,EAAGkB,GAAK,EAAGA,IAAK,CAC1Cg+D,EAAW1/D,KAAK8pF,OAAOpoF,GACvBspF,EAAS,CAACv+D,IAAKizC,EAASjzC,IAAKE,OAAQ+yC,EAAS/yC,OAASo+D,GAC3D/qF,KAAK+M,IAAIxF,OAAO,IAAI+jC,EAAM0/C,EAAOv+D,IAAKu+D,EAAOr+D,OAAQq+D,EAAOv+D,IAAKu+D,EAAOr+D,OAASk+D,IAK7F7qF,KAAK+sD,WAAY,EACjB/sD,KAAKirF,kBAGTjrF,KAAK4qF,cAAgB,SAASviD,GAC1BroC,KAAKgH,IAAIohC,SAASC,GAClB,IAAK,IAAI3mC,EAAI1B,KAAK8pF,OAAOtpF,OAAQkB,KAC7B1B,KAAK8pF,OAAOpoF,GAAG0mC,SAASC,GAC5BroC,KAAKirF,iBAGTjrF,KAAKirF,cAAgB,WACjB,IAAIjrF,KAAK+sD,UAAT,CAEA,IAAIvpC,EAAQxjB,KACR8nB,EAAU9nB,KAAK8nB,QACfojE,EAAe,SAASlkF,EAAKwG,GAC7Bsa,EAAQoO,aAAalvB,EAAI4sD,UACzB5sD,EAAI4sD,SAAW9rC,EAAQ4N,UAAU,IAAI4V,EAAMtkC,EAAIylB,IAAKzlB,EAAI2lB,OAAQ3lB,EAAIylB,IAAKzlB,EAAI2lB,OAAOnJ,EAAMhjB,QAASgN,EAAW,MAAM,IAExH09E,EAAalrF,KAAKgH,IAAKhH,KAAK+pF,WAC5B,IAAK,IAAIroF,EAAI1B,KAAK8pF,OAAOtpF,OAAQkB,KAC7BwpF,EAAalrF,KAAK8pF,OAAOpoF,GAAI1B,KAAKgqF,eAG1ChqF,KAAKynE,eAAiB,SAAS3rD,GAC3B,IAAI9b,KAAK+sD,WAAc/sD,KAAK8nB,QAA5B,CACA,IAAI9gB,EAAMhH,KAAK8nB,QAAQhC,UAAUioB,YAC7B/mC,EAAIylB,MAAQzsB,KAAKgH,IAAIylB,KAAOzlB,EAAI2lB,QAAU3sB,KAAKgH,IAAI2lB,QAAU3lB,EAAI2lB,QAAU3sB,KAAKgH,IAAI2lB,OAAS3sB,KAAKQ,QAClGR,KAAKyqF,mBACLzqF,KAAKupB,MAAM,cAAezN,KAE1B9b,KAAK2qF,mBACL3qF,KAAKupB,MAAM,cAAezN,MAGlC9b,KAAKkiC,OAAS,WACVliC,KAAK8nB,QAAQoO,aAAal2B,KAAKgH,KAAOhH,KAAKgH,IAAI4sD,UAC/C5zD,KAAK2qF,mBACL3qF,KAAK+M,IAAIkP,oBAAoB,SAAUjc,KAAKiqF,WAC5CjqF,KAAK8nB,QAAQhC,UAAU7J,oBAAoB,eAAgBjc,KAAK2mE,iBAChE3mE,KAAK8nB,QAAQovC,eAAc,GAC3Bl3D,KAAK8nB,QAAU,MAEnB9nB,KAAKmjB,OAAS,WACV,IAA8B,IAA1BnjB,KAAKsqF,gBAAT,CAIA,IAFA,IAAIx4B,EAAc9xD,KAAK8nB,QAAQ6pC,iBAC3Bw5B,GAAiBr5B,EAAY+hB,YAAc/hB,EAAYu4B,YAAY7pF,OAASR,KAAKsqF,gBAC5E5oF,EAAI,EAAGA,EAAIypF,EAAezpF,IAC/BowD,EAAYvpC,MAAK,GAEjBvoB,KAAKwqF,iBACLxqF,KAAK8nB,QAAQhC,UAAUqtB,SAASnzC,KAAKwqF,qBAE9ChpF,KAAKqoF,EAAYvoF,WAGpBqB,EAAQknF,YAAcA,IAGtBxmF,IAAIlD,OAAO,iCAAiC,CAAC,UAAU,UAAU,SAAS,gBAAgB,qBAAsB,SAAS0B,EAAUc,EAASvC,GAE5I,IAAI0b,EAAQja,EAAS,gBACjBwZ,EAAYxZ,EAAS,oBACzB,SAASupF,EAAYhgD,EAAIC,GACrB,OAAOD,EAAG3e,KAAO4e,EAAG5e,KAAO2e,EAAGze,QAAU0e,EAAG1e,OAG/C,SAASnB,EAAYpP,GACjB,IAAIyQ,EAAKzQ,EAAEoN,SACP6hE,EAAMx+D,EAAGnQ,OACTqO,EAAQ8B,EAAGlQ,SACX2uE,EAAOz+D,EAAGpQ,QACV8uE,EAAQnvE,EAAEmT,cACV3S,EAASR,EAAEI,YAKf,GAHI8uE,GAAQjwE,EAAU3B,QAClBkD,EAASiQ,EAAGjQ,QAEZR,EAAEkP,OAAOkC,mBAA+B,GAAV5Q,EAC9BR,EAAEkP,OAAOlB,UAAUd,cAAclN,EAAEoN,eAIvC,GAAK8hE,GAASD,GAAQE,GAMtB,GAAe,IAAX3uE,EAAJ,CAGA,IAiBI4uE,EAjBAlgE,EAASlP,EAAEkP,OACXxF,EAAYwF,EAAOxF,UACnB2lE,EAAgBngE,EAAOkC,kBACvBxmB,EAAMoV,EAAE2Q,sBACRP,EAAS1G,EAAUioB,YACnBjhB,EAAc1Q,EAAE0Q,eAAkBhH,EAAUN,WAAa4lE,EAAYpkF,EAAKwlB,GAE1Ek/D,EAAStvE,EAAEtY,EAAG6nF,EAASvvE,EAAE0R,EACzB89D,EAAmB,SAASxvE,GAC5BsvE,EAAStvE,EAAEqB,QACXkuE,EAASvvE,EAAEsB,SAGXoK,EAAUwD,EAAOxD,QACjB+jE,EAAevgE,EAAOtC,SAASoJ,yBAAyBs5D,EAAQC,GAChEG,EAAeD,EAGnB,GAAIvgE,EAAO84C,cAAc2nB,iBACjBT,GAAQD,GAAOE,GAASF,EACxBG,EAAgBzgE,EAAQ,QAAU,MAC7BsgE,GAAO//D,EAAO0gE,sBACnBR,EAAgB,cAEpB,GAAID,IAAUF,GAEV,GADAG,EAAgB,OACXC,GAAiB1gE,EAClB,YACGsgE,GAAO//D,EAAO0gE,sBACrBR,EAAgB,SAQxB,GAJIA,GAAiBnwE,EAAU3B,OAASmT,EAAGpQ,SACvC6O,EAAO84C,cAAcjkC,oBAGJ,OAAjBqrD,EAAwB,CACxB,IAAKC,GAAiB3+D,EAClB,OAEJ,IAAK2+D,EAAe,CAChB,IAAI/iE,EAAQ5C,EAAU2P,kBACtBnK,EAAO2gE,mBAAmBvjE,GAG9B,IAAIwjE,EAAWpmE,EAAUstB,UAAUuX,aAAa3jD,GAGhDskB,EAAO8B,kBACP9B,EAAOs/C,wBAAyB,EAE5B7/C,IACAmhE,EAAW,KACXxjE,EAAQ5C,EAAUmtB,OAAO,IAAMvqB,EAC/B4C,EAAO6gE,sBAAsBzjE,IAEjC4C,EAAO2O,KAAK,UAAW,WACnB,IAAImyD,EAAStmE,EAAU2P,kBAEnBy2D,GAAYE,EAAO5mE,WAAa4lE,EAAYc,EAAS1/D,OAAQ4/D,EAAO5/D,QACpE1G,EAAU2kC,eAAe2hC,EAAO5/D,SAE5BzB,EACAjF,EAAU2kC,eAAe/hC,EAAM8D,QACxB9D,IACP4C,EAAO6gE,sBAAsBzjE,GAC7B5C,EAAUwtB,SAAS5qB,IAEvB5C,EAAUwtB,SAAS84C,IAEvB9gE,EAAO8B,kBACP9B,EAAOs/C,wBAAyB,SAGjC,GAAqB,SAAjB4gB,EAA0B,CAGjC,IAAIhqC,EAFJplC,EAAEgU,OACF9E,EAAOs/C,wBAAyB,EAEhC,IAAIyhB,EAAU,GACVC,EAAc,WACd,IAAIC,EAAYjhE,EAAOtC,SAASoJ,yBAAyBs5D,EAAQC,GAC7Dn/D,EAAS1E,EAAQgpB,yBAAyBy7C,EAAU9/D,IAAK8/D,EAAU5/D,OAAQ4/D,EAAUn6C,SAErFg5C,EAAYU,EAAcS,IAAcnB,EAAY5+D,EAAQ1G,EAAU0nB,QAE1Es+C,EAAeS,EAEfjhE,EAAO8B,kBACP9B,EAAOxF,UAAUuH,eAAeb,GAChClB,EAAOtC,SAASsF,uBAEhBhD,EAAOkhE,uBAAuBH,GAC9BA,EAAUvmE,EAAU2mE,sBAAsBX,EAAcD,GACpDvgE,EAAO84C,cAAc/4C,iBAAqC,GAAlBghE,EAAQ7rF,QAAe6rF,EAAQ,GAAG7mE,YAC1E6mE,EAAQ,GAAK/gE,EAAO84C,cAAc/4C,gBAAgB0hB,SACtDs/C,EAAQnkF,QAAQojB,EAAO2gE,mBAAoB3gE,GAC3CA,EAAOohE,yBACPphE,EAAO8B,oBAEX9B,EAAO8B,kBACHq+D,IAAkBF,EAClBzlE,EAAUutB,iBACFo4C,GAAiBF,IACzB/pC,EAAe17B,EAAU2P,kBACzBnK,EAAO2gE,mBAAmBzqC,IAG1Bz2B,EACA8gE,EAAe/jE,EAAQqlB,yBAAyBrnB,EAAU0nB,MAE1D1nB,EAAUuH,eAAermB,GAC7BskB,EAAO8B,kBAEP0+D,EAAe,CAACr/D,KAAM,EAAGE,QAAS,GAElC,IAAIggE,EAAsB,SAASvwE,GAC/B0Z,cAAc/B,GACdzI,EAAOkhE,uBAAuBH,GACzBA,EAAQ7rF,SACT6rF,EAAU,CAACvmE,EAAU2P,oBACzBnK,EAAO8B,kBACHo0B,IACAl2B,EAAO6gE,sBAAsB3qC,GAC7B17B,EAAUutB,cAAcmO,IAE5B,IAAK,IAAI9/C,EAAI,EAAGA,EAAI2qF,EAAQ7rF,OAAQkB,IAChCokB,EAAUwtB,SAAS+4C,EAAQ3qF,IAC/B4pB,EAAOs/C,wBAAyB,EAChCt/C,EAAO84C,cAAc/4C,gBAAkB,KACvCC,EAAO8B,mBAGPw/D,EAAsBN,EAE1BxwE,EAAMkB,QAAQsO,EAAO1B,UAAWgiE,EAAkBe,GAClD,IAAI54D,EAAUgC,YAAY,WAAY62D,KAAyB,IAE/D,OAAOxwE,EAAEE,wBAlJM,IAAXM,GAAgBR,EAAEkP,OAAOkC,mBACzBpR,EAAEkP,OAAOw4C,sBAsJrBnhE,EAAQ6oB,YAAcA,IAItBnoB,IAAIlD,OAAO,qCAAqC,CAAC,UAAU,UAAU,SAAS,6BAA8B,SAAS0B,EAAUc,EAASvC,GACxIuC,EAAQohE,gBAAkB,CAAC,CACvBp/D,KAAM,iBACNpB,KAAM,SAAS+nB,GAAUA,EAAOuhE,iBAAiB,IACjDluB,QAAS,CAAC79C,IAAK,cAAe6/C,IAAK,eACnCG,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,iBACNpB,KAAM,SAAS+nB,GAAUA,EAAOuhE,gBAAgB,IAChDluB,QAAS,CAAC79C,IAAK,gBAAiB6/C,IAAK,iBACrCG,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,4BACNpB,KAAM,SAAS+nB,GAAUA,EAAOuhE,iBAAiB,GAAG,IACpDluB,QAAS,CAAC79C,IAAK,oBAAqB6/C,IAAK,qBACzCG,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,4BACNpB,KAAM,SAAS+nB,GAAUA,EAAOuhE,gBAAgB,GAAG,IACnDluB,QAAS,CAAC79C,IAAK,sBAAuB6/C,IAAK,uBAC3CG,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,mBACNpB,KAAM,SAAS+nB,GAAUA,EAAOwhE,YAAY,IAC5CnuB,QAAS,CAAC79C,IAAK,gBAAiB6/C,IAAK,iBACrCG,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,kBACNpB,KAAM,SAAS+nB,GAAUA,EAAOwhE,WAAW,IAC3CnuB,QAAS,CAAC79C,IAAK,iBAAkB6/C,IAAK,kBACtCG,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,mBACNpB,KAAM,SAAS+nB,GAAUA,EAAOwhE,YAAY,GAAG,IAC/CnuB,QAAS,CAAC79C,IAAK,sBAAuB6/C,IAAK,uBAC3CG,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,kBACNpB,KAAM,SAAS+nB,GAAUA,EAAOwhE,WAAW,GAAG,IAC9CnuB,QAAS,CAAC79C,IAAK,uBAAwB6/C,IAAK,wBAC5CG,eAAgB,SAChBz3C,UAAU,GACX,CACC1kB,KAAM,iBACNpB,KAAM,SAAS+nB,GAAUA,EAAO0uB,YAAY+yC,kBAC5CpuB,QAAS,CAAC79C,IAAK,aAAc6/C,IAAK,cAClCt3C,UAAU,GACX,CACC1kB,KAAM,eACNpB,KAAM,SAAS+nB,GAAUA,EAAO0hE,gBAChCruB,QAAS,CAAC79C,IAAK,aAAc6/C,IAAK,cAClCG,eAAgB,UACjB,CACCn8D,KAAM,UACNpB,KAAM,SAAS+nB,GAAUA,EAAOmyC,WAChCkB,QAAS,CAAC79C,IAAK,aAAc6/C,IAAK,cAClCG,eAAgB,SAChBz3C,UAAU,IAEd1mB,EAAQsqF,oBAAsB,CAAC,CAC3BtoF,KAAM,kBACNg6D,QAAS,MACTp7D,KAAM,SAAS+nB,GAAUA,EAAOw4C,uBAChChD,eAAgB,SAChBz3C,UAAU,EACV62C,YAAa,SAAS50C,GAAS,OAAOA,GAAUA,EAAOkC,qBAG3D,IAAI8wC,EAAcz8D,EAAS,4BAA4By8D,YACvD37D,EAAQkjE,gBAAkB,IAAIvH,EAAY37D,EAAQsqF,uBAIlD5pF,IAAIlD,OAAO,mBAAmB,CAAC,UAAU,UAAU,SAAS,iBAAiB,YAAY,gBAAgB,iCAAiC,gBAAgB,eAAe,qCAAqC,aAAa,mBAAmB,aAAa,cAAe,SAAS0B,EAAUc,EAASvC,GAEtS,IAAI+pD,EAAYtoD,EAAS,gBAAgBsoD,UACrC7e,EAAQzpC,EAAS,WAAWypC,MAC5BgC,EAAYzrC,EAAS,eAAeyrC,UACpC9hB,EAAc3pB,EAAS,gCAAgC2pB,YACvD1P,EAAQja,EAAS,eACjB8hB,EAAO9hB,EAAS,cAChB4/B,EAAW5/B,EAAS,oCACxBc,EAAQ8+B,SAAWA,EAASsiC,gBAAgBr+D,OAAO+7B,EAASwrD,qBAC5D,IAAInwB,EAASj7D,EAAS,YAAYi7D,OAC9BxrB,EAAS,IAAIwrB,EAEjB,SAASI,EAAKp1C,EAASk1C,EAAQt6B,GAI3B,OAHA4O,EAAOpW,SAASwhC,MAAO,EACvBprB,EAAOpW,SAAS8hC,OAASA,EACzB1rB,EAAOpW,SAASkjC,WAAoB,GAAR17B,EACrB4O,EAAO4rB,KAAKp1C,GAEvB,IAAImoC,EAAcpuD,EAAS,kBAAkBouD,aAC7C,WACIjwD,KAAKktF,oBAAsB,WACvB,OAAOltF,KAAKu8E,qBAEjB/6E,KAAKyuD,EAAY3uD,WACpB,WACItB,KAAKizC,OAAS,KACdjzC,KAAKozC,UAAY,KACjBpzC,KAAKszC,SAAW,SAAS5qB,EAAOykE,GAC5B,GAAKzkE,EAAL,CAGA,IAAK1oB,KAAKwtB,mBAAyC,IAApBxtB,KAAKgzC,WAAkB,CAClD,IAAIk5C,EAAWlsF,KAAKy1B,kBAGpB,GAFAz1B,KAAKozC,UAAU9rC,IAAI4kF,GACnBlsF,KAAKozC,UAAU9rC,IAAIohB,GACiB,GAAhC1oB,KAAKozC,UAAUH,OAAOzyC,OAEtB,OADAR,KAAKozC,UAAUyX,YACRsiC,GAAsBntF,KAAKm2B,kBAAkBzN,GAExD1oB,KAAKozC,UAAUyX,YACf7qD,KAAKozC,UAAU9rC,IAAI4kF,GACnBlsF,KAAKotF,YAAYlB,GAGhBxjE,EAAM8D,SACP9D,EAAM8D,OAAS9D,EAAMmC,KAEzB,IAAIzjB,EAAUpH,KAAKozC,UAAU9rC,IAAIohB,GAcjC,OAZA1oB,KAAKotF,YAAY1kE,GAEbthB,EAAQ5G,QACRR,KAAKqtF,eAAejmF,GAEpBpH,KAAKgzC,WAAa,IAAMhzC,KAAKwtB,oBAC7BxtB,KAAKuyB,QAAQ,eACbvyB,KAAKwtB,mBAAoB,EACzBxtB,KAAK8nB,QAAQyoC,aAAc,EAC3BvwD,KAAKozC,UAAUnR,OAAOjiC,KAAK8nB,UAGxBqlE,GAAsBntF,KAAKm2B,kBAAkBzN,KAGxD1oB,KAAKqzC,cAAgB,SAAS3qB,GAC1BA,EAAQA,GAAS1oB,KAAKizC,OAAO,GAC7B,IAAI7rC,EAAUpH,KAAKozC,UAAUyX,YACzBzjD,EAAQ5G,QACRR,KAAKqtF,eAAejmF,GAExBshB,GAAS1oB,KAAKm2B,kBAAkBzN,IAEpC1oB,KAAKyqD,eAAiB,SAASzjD,GAC3B,IAAII,EAAUpH,KAAKozC,UAAUqX,eAAezjD,GAC5C,GAAII,EAEA,OADApH,KAAKqtF,eAAejmF,GACbA,EAAQ,IAGvBpH,KAAKstF,uBAAyB,WAC1B,IAAIlmF,EAAUpH,KAAKozC,UAAU6C,QACzB7uC,EAAQ5G,OACRR,KAAKqtF,eAAejmF,GAChBpH,KAAKizC,OAAO,IAChBjzC,KAAKm2B,kBAAkBn2B,KAAKizC,OAAO,KAG3CjzC,KAAKotF,YAAc,SAAS1kE,GACxB1oB,KAAKgzC,WAAahzC,KAAKozC,UAAUH,OAAOzyC,OACxCR,KAAKizC,OAAOiD,QAAQxtB,GACpB1oB,KAAKuyB,QAAQ,WAAY,CAAC7J,MAAOA,KAGrC1oB,KAAKqtF,eAAiB,SAASjmF,GAE3B,GADApH,KAAKgzC,WAAahzC,KAAKozC,UAAUH,OAAOzyC,OACjB,GAAnBR,KAAKgzC,YAAmBhzC,KAAKwtB,kBAAmB,CAChD,IAAI+/D,EAAYvtF,KAAKozC,UAAUH,OAAOzY,MACtCpzB,EAAQtF,KAAKyrF,GACbvtF,KAAKgzC,WAAa,EAGtB,IAAK,IAAItxC,EAAI0F,EAAQ5G,OAAQkB,KAAO,CAChC,IAAIoD,EAAQ9E,KAAKizC,OAAO/wC,QAAQkF,EAAQ1F,IACxC1B,KAAKizC,OAAOxsC,OAAO3B,EAAO,GAG9B9E,KAAKuyB,QAAQ,cAAe,CAAC0gB,OAAQ7rC,IAEb,IAApBpH,KAAKgzC,YAAoBhzC,KAAKwtB,oBAC9BxtB,KAAKwtB,mBAAoB,EACzBxtB,KAAKuyB,QAAQ,gBACbvyB,KAAK8nB,QAAQyoC,aAAc,EAC3BvwD,KAAKozC,UAAUlR,OAAOliC,KAAK8nB,UAG/BylE,EAAYA,GAAavtF,KAAKizC,OAAO,GACjCs6C,IAAcA,EAAU5hD,QAAQ3rC,KAAKyoB,aACrCzoB,KAAKm2B,kBAAkBo3D,IAE/BvtF,KAAKwtF,eAAiB,WACdxtF,KAAKozC,YAGTpzC,KAAKozC,UAAY,IAAI+W,EACrBnqD,KAAKizC,OAAS,GACdjzC,KAAKgzC,WAAa,IAEtBhzC,KAAKmhE,aAAe,WAChB,OAAOnhE,KAAKgzC,WAAahzC,KAAKozC,UAAUH,OAAOvtC,SAAW,CAAC1F,KAAKyoB,aAGpEzoB,KAAK+sF,eAAiB,WAClB,GAAI/sF,KAAKgzC,WAAa,EAAG,CACrB,IAAIC,EAASjzC,KAAKozC,UAAUH,OACxBs6C,EAAYt6C,EAAOA,EAAOzyC,OAAS,GACnCkoB,EAAQ4iB,EAAMuB,WAAWoG,EAAO,GAAGnsC,MAAOymF,EAAU1iE,KAExD7qB,KAAKqzC,gBACLrzC,KAAK4lB,kBAAkB8C,EAAO6kE,EAAU/gE,QAAU+gE,EAAUzmF,WACzD,CACC4hB,EAAQ1oB,KAAKyoB,WAAjB,IACI6lB,EAActuC,KAAKsuC,cACnB/C,EAAW7iB,EAAM5hB,MAAM2lB,IACvBgf,EAAS/iB,EAAMmC,IAAI4B,IACvB,GAAI8e,GAAYE,EAAQ,CACpB,GAAI6C,EACA,IAAIxnC,EAAQ4hB,EAAMmC,IAAKA,EAAMnC,EAAM5hB,WAE/BA,EAAQ4hB,EAAM5hB,MAAO+jB,EAAMnC,EAAMmC,IAIzC,OAFA7qB,KAAKszC,SAAShI,EAAMuB,WAAWhiB,EAAKA,SACpC7qB,KAAKszC,SAAShI,EAAMuB,WAAW/lC,EAAOA,IAI1C,IAAIulF,EAAU,GACV7jE,EAAIxoB,KAAKsvB,aAAaic,GAAU,GACpC/iB,EAAE1hB,MAAM6lB,OAASjE,EAAM5hB,MAAM6lB,OAC7B0/D,EAAQvqF,KAAK0mB,GAEb,IAAK,IAAI9mB,EAAI6pC,EAAW,EAAG7pC,EAAI+pC,EAAQ/pC,IACnC2qF,EAAQvqF,KAAK9B,KAAKsvB,aAAa5tB,GAAG,IAEtC8mB,EAAIxoB,KAAKsvB,aAAamc,GAAQ,GAC9BjjB,EAAEqC,IAAI8B,OAASjE,EAAMmC,IAAI8B,OACzB0/D,EAAQvqF,KAAK0mB,GAEb6jE,EAAQnkF,QAAQlI,KAAKszC,SAAUtzC,QAGvCA,KAAKytF,qBAAuB,WACxB,GAAIztF,KAAKgzC,WAAa,EAAG,CACrB,IAAIC,EAASjzC,KAAKozC,UAAUH,OACxBs6C,EAAYt6C,EAAOA,EAAOzyC,OAAS,GACnCkoB,EAAQ4iB,EAAMuB,WAAWoG,EAAO,GAAGnsC,MAAOymF,EAAU1iE,KAExD7qB,KAAKqzC,gBACLrzC,KAAK4lB,kBAAkB8C,EAAO6kE,EAAU/gE,QAAU+gE,EAAUzmF,WACzD,CACH,IAAI0lB,EAASxsB,KAAK8nB,QAAQqlB,yBAAyBntC,KAAKytC,eACpD7gB,EAAS5sB,KAAK8nB,QAAQqlB,yBAAyBntC,KAAK2tC,iBAEpD0+C,EAAUrsF,KAAKysF,sBAAsBjgE,EAAQI,GACjDy/D,EAAQnkF,QAAQlI,KAAKszC,SAAUtzC,QAGvCA,KAAKysF,sBAAwB,SAASX,EAAcD,EAAc6B,GAC9D,IAAIrB,EAAU,GAEVsB,EAAa7B,EAAan/D,OAASk/D,EAAal/D,OACpD,GAAIghE,EACA,IAAIniD,EAAcsgD,EAAan/D,OAC3B+e,EAAYmgD,EAAal/D,OACzBihE,EAAe9B,EAAa15C,QAC5By7C,EAAahC,EAAaz5C,aAE1B5G,EAAcqgD,EAAal/D,OAC3B+e,EAAYogD,EAAan/D,OACzBihE,EAAe/B,EAAaz5C,QAC5By7C,EAAa/B,EAAa15C,QAGlC,IAAI07C,EAAahC,EAAar/D,IAAMo/D,EAAap/D,IACjD,GAAIqhE,EACA,IAAIviD,EAAWugD,EAAar/D,IACxBgf,EAASogD,EAAap/D,SAEtB8e,EAAWsgD,EAAap/D,IACxBgf,EAASqgD,EAAar/D,IAG1B+e,EAAc,IACdA,EAAc,GACdD,EAAW,IACXA,EAAW,GAEXA,GAAYE,IACZiiD,GAAoB,GAExB,IAAK,IAAIjhE,EAAM8e,EAAU9e,GAAOgf,EAAQhf,IAAO,CAC3C,IAAI/D,EAAQ4iB,EAAMuB,WACd7sC,KAAK8nB,QAAQgpB,yBAAyBrkB,EAAK+e,EAAaoiD,GACxD5tF,KAAK8nB,QAAQgpB,yBAAyBrkB,EAAKif,EAAWmiD,IAE1D,GAAInlE,EAAMlD,UAAW,CACjB,GAAIuoE,GAAU3C,EAAY1iE,EAAMmC,IAAKkjE,GACjC,MACJ,IAAIA,EAASrlE,EAAMmC,IAEvBnC,EAAM8D,OAASmhE,EAAajlE,EAAM5hB,MAAQ4hB,EAAMmC,IAChDwhE,EAAQvqF,KAAK4mB,GAMjB,GAHIolE,GACAzB,EAAQ1qE,WAEP+rE,EAAmB,CACpB,IAAI7iE,EAAMwhE,EAAQ7rF,OAAS,EAC3B,MAAO6rF,EAAQxhE,GAAKrF,WAAaqF,EAAM,EACnCA,IACJ,GAAIA,EAAM,EAAG,CACT,IAAI/jB,EAAQ,EACZ,MAAOulF,EAAQvlF,GAAO0e,UAClB1e,IAER,IAAK,IAAIpF,EAAImpB,EAAKnpB,GAAKoF,EAAOpF,IACtB2qF,EAAQ3qF,GAAG8jB,WACX6mE,EAAQ5lF,OAAO/E,EAAG,GAI9B,OAAO2qF,IAEZ7qF,KAAK8rC,EAAUhsC,WAClB,IAAI0iE,EAASniE,EAAS,YAAYmiE,OA4blC,SAASonB,EAAYhgD,EAAIC,GACrB,OAAOD,EAAG3e,KAAO4e,EAAG5e,KAAO2e,EAAGze,QAAU0e,EAAG1e,OAqC/C,SAASqhE,EAAY1iE,GACbA,EAAO2iE,8BAEX3iE,EAAO8hE,YAAc9hE,EAAO8hE,YAAYjoF,KAAKmmB,GAC7CA,EAAO+hE,eAAiB/hE,EAAO+hE,eAAeloF,KAAKmmB,GACnDA,EAAO4iE,eAAiB5iE,EAAO4iE,eAAe/oF,KAAKmmB,GACnDA,EAAO6iE,gBAAkB7iE,EAAO6iE,gBAAgBhpF,KAAKmmB,GACrDA,EAAO2iE,4BAA8BtrF,EAAQyrF,gBAAgBjpF,KAAKmmB,GAClEA,EAAO+iE,wBAA0B/iE,EAAO+iE,wBAAwBlpF,KAAKmmB,GAErEA,EAAO2iE,4BAA4B3iE,GACnCA,EAAOrD,GAAG,gBAAiBqD,EAAO2iE,6BAElC3iE,EAAOrD,GAAG,YAAauD,GACvBF,EAAOmW,SAAS+8B,YAAY/8B,EAASsiC,iBAErCuqB,EAAsBhjE,IAG1B,SAASgjE,EAAsBhjE,GAC3B,IAAIhe,EAAKge,EAAOlB,UAAUjB,aACtBolE,GAAY,EAehB,SAAS38B,EAAMx1C,GACPmyE,IACAjjE,EAAOtC,SAAS+9D,eAAe,IAC/BwH,GAAY,GAjBpBzyE,EAAMN,YAAYlO,EAAI,UAAW,SAAS8O,GACtC,IAAIoyE,EAAuB,IAAbpyE,EAAElD,WAAmBkD,EAAEK,SAAWL,EAAEO,UAAYP,EAAEwD,SAC5D0L,EAAO0gE,qBAAuBwC,EACzBD,IACDjjE,EAAOtC,SAAS+9D,eAAe,aAC/BwH,GAAY,GAETA,GACP38B,MAIR91C,EAAMN,YAAYlO,EAAI,QAASskD,GAC/B91C,EAAMN,YAAYlO,EAAI,OAAQskD,IApgBlC,WACI5xD,KAAK0sF,uBAAyB,WAC1B1sF,KAAKgpB,SAASugD,eACdvpE,KAAKgpB,SAASwhD,qBAElBxqE,KAAKisF,mBAAqB,SAAS79D,GAC1BA,EAAc5B,SACf4B,EAAc5B,OAAS4B,EAAcvD,KAEzC,IAAIvc,EAAQtO,KAAK21B,oBAKjB,OAJAvH,EAAcslC,OAAS1zD,KAAK8nB,QAAQ4N,UAAUtH,EAAe,gBAAiB9f,GAE9EtO,KAAK8nB,QAAQy0D,kBAAkBz6E,KAAKssB,GACpCpuB,KAAK8nB,QAAQ2mE,qBAAuBzuF,KAAK8nB,QAAQy0D,kBAAkB/7E,OAC5D4tB,GAEXpuB,KAAKmsF,sBAAwB,SAASzjE,GAClC,GAAKA,EAAMgrC,OAAX,CAEA1zD,KAAK8nB,QAAQoO,aAAaxN,EAAMgrC,QAChC,IAAI5uD,EAAQ9E,KAAK8nB,QAAQy0D,kBAAkBr6E,QAAQwmB,IACrC,GAAV5jB,GACA9E,KAAK8nB,QAAQy0D,kBAAkB91E,OAAO3B,EAAO,GACjD9E,KAAK8nB,QAAQ2mE,qBAAuBzuF,KAAK8nB,QAAQy0D,kBAAkB/7E,SAGvER,KAAKwsF,uBAAyB,SAASv5C,GAEnC,IADA,IAAIy7C,EAAa1uF,KAAK8nB,QAAQy0D,kBACrB76E,EAAIuxC,EAAOzyC,OAAQkB,KAAO,CAC/B,IAAIgnB,EAAQuqB,EAAOvxC,GACnB,GAAKgnB,EAAMgrC,OAAX,CAEA1zD,KAAK8nB,QAAQoO,aAAaxN,EAAMgrC,QAChC,IAAI5uD,EAAQ4pF,EAAWxsF,QAAQwmB,IACjB,GAAV5jB,GACA4pF,EAAWjoF,OAAO3B,EAAO,IAEjC9E,KAAK8nB,QAAQ2mE,qBAAuBC,EAAWluF,QAGnDR,KAAKotF,YAAc,SAAShxE,GACxBpc,KAAKisF,mBAAmB7vE,EAAEsM,OAC1B1oB,KAAKgpB,SAASugD,eACdvpE,KAAKgpB,SAASwhD,qBAGlBxqE,KAAKqtF,eAAiB,SAASjxE,GAC3Bpc,KAAKwsF,uBAAuBpwE,EAAE62B,QAC9BjzC,KAAKgpB,SAASugD,eACdvpE,KAAKgpB,SAASwhD,qBAGlBxqE,KAAKkuF,eAAiB,SAAS9xE,GACvBpc,KAAKwtB,oBAETxtB,KAAKwtB,mBAAoB,EAEzBxtB,KAAKkuB,SAAS,mBACdluB,KAAKqkE,WAAWxiC,mBAAmBJ,EAASokC,iBAC5C7lE,KAAKyhC,SAASlW,kBAAkB,OAAQvrB,KAAK2uF,oBAE7C3uF,KAAKgpB,SAASugD,eACdvpE,KAAKgpB,SAASwhD,sBAGlBxqE,KAAKmuF,gBAAkB,SAAS/xE,GACxBpc,KAAK8nB,QAAQkyB,YAAY40C,gBAE7B5uF,KAAKwtB,mBAAoB,EAEzBxtB,KAAK8uB,WAAW,mBAChB9uB,KAAKqkE,WAAW1iC,sBAAsBF,EAASokC,iBAE/C7lE,KAAKyhC,SAASlH,qBAAqB,OAAQv6B,KAAK2uF,oBAChD3uF,KAAKgpB,SAASugD,eACdvpE,KAAKgpB,SAASwhD,oBACdxqE,KAAKupB,MAAM,qBAGfvpB,KAAK2uF,mBAAqB,SAASvyE,GAC/B,IAAIomB,EAAUpmB,EAAEomB,QACZlX,EAASlP,EAAEkP,OACf,GAAKA,EAAO0uB,YAAZ,CAEA,GAAKxX,EAAQ0+B,kBAI2B,WAA7B1+B,EAAQ0+B,kBACfz7D,EAAS6lB,EAAOujE,iBAAiBrsD,EAASpmB,EAAE7W,MACR,eAA7Bi9B,EAAQ0+B,kBACfz7D,EAAS6lB,EAAOujE,iBAAiBrsD,EAASpmB,EAAE7W,MAAM,GACd,UAA7Bi9B,EAAQ0+B,mBACf51C,EAAOw4C,sBACPr+D,EAAS+8B,EAAQj/B,KAAK+nB,EAAQlP,EAAE7W,MAAQ,KAExCE,EAAS+8B,EAAQ0+B,kBAAkB51C,EAAQlP,EAAE7W,MAAQ,QAZzB,CAC5B,IAAIE,EAAS+8B,EAAQj/B,KAAK+nB,EAAQlP,EAAE7W,MAAQ,IAC5C+lB,EAAO0uB,YAAY1G,SAAShoB,EAAO0uB,YAAYvkB,mBAC/CnK,EAAO0uB,YAAYszC,yBAWvB,OAAO7nF,IAEXzF,KAAK6uF,iBAAmB,SAAS7F,EAAKzjF,EAAMw2B,GACxC,IAAI/7B,KAAK4qE,uBAAT,CAEA,IAMInlE,EANAqpF,EAAY/yD,GAAWA,EAAQ+yD,UAC/BC,EAAsB,GAAXhzD,GAAmBA,GAAWA,EAAQgzD,SACjDjnE,EAAU9nB,KAAK8nB,QACfhC,EAAY9lB,KAAK8lB,UACjBstB,EAAYttB,EAAUstB,UACtBH,GAAU67C,EAAYhpE,EAAYstB,GAAWH,OAGjD,IAAKA,EAAOzyC,OACR,OAAOwoF,EAAIzlF,KAAOylF,EAAIzlF,KAAKvD,KAAMuF,GAAQ,IAAMyjF,EAAIhpF,KAAMuF,GAAQ,IAErE,IAAIypF,EAAMlpE,EAAU+T,eACpB/T,EAAU+T,eAAiB,GAE3B,IAAIuyD,EAAS,IAAI9+C,EAAUxlB,GAC3B9nB,KAAK4qE,wBAAyB,EAC9B,IAAK,IAAIlpE,EAAIuxC,EAAOzyC,OAAQkB,KAAM,CAC9B,GAAIqtF,EACA,MAAOrtF,EAAI,GAAKuxC,EAAOvxC,GAAGoF,MAAM2lB,KAAOwmB,EAAOvxC,EAAI,GAAGmpB,IAAI4B,IACrD/qB,IAER0qF,EAAOj2D,kBAAkB8c,EAAOvxC,IAChC0qF,EAAOtnF,MAAQpD,EACf1B,KAAK8lB,UAAYgC,EAAQhC,UAAYsmE,EACrC,IAAI6C,EAAYjG,EAAIzlF,KAAOylF,EAAIzlF,KAAKvD,KAAMuF,GAAQ,IAAMyjF,EAAIhpF,KAAMuF,GAAQ,IACrEE,QAAwBrE,IAAd6tF,IACXxpF,EAASwpF,GACb7C,EAAO32D,gBAAgBwd,EAAOvxC,IAElC0qF,EAAOlqD,SAEPliC,KAAK8lB,UAAYgC,EAAQhC,UAAYA,EACrC9lB,KAAK4qE,wBAAyB,EAC9B9kD,EAAU+T,eAAiBm1D,EAC3BlpE,EAAUwnE,yBAEV,IAAI4B,EAAOlvF,KAAKgpB,SAASo3D,iBAMzB,OALApgF,KAAKynE,iBACLznE,KAAK4nE,oBACDsnB,GAAQA,EAAK1qF,MAAQ0qF,EAAKpoC,IAC1B9mD,KAAKgpB,SAASq8C,iBAAiB6pB,EAAK1qF,MAEjCiB,IAEXzF,KAAK8jE,oBAAsB,WAClB9jE,KAAKwtB,oBAAqBxtB,KAAK4qE,wBAEpC5qE,KAAKg6C,YAAY3G,iBAGrBrzC,KAAK2qE,gBAAkB,WACnB,IAAIzmD,EAAO,GACX,GAAIlkB,KAAKwtB,oBAAsBxtB,KAAK4qE,uBAAwB,CAGxD,IAFA,IAAI33B,EAASjzC,KAAKg6C,YAAY5G,UAAUH,OACpCk8C,EAAM,GACDztF,EAAI,EAAGA,EAAIuxC,EAAOzyC,OAAQkB,IAC/BytF,EAAIrtF,KAAK9B,KAAK8nB,QAAQ8O,aAAaqc,EAAOvxC,KAE9C,IAAI0tF,EAAKpvF,KAAK8nB,QAAQylB,cAAcyX,sBACpC9gC,EAAOirE,EAAI3sF,KAAK4sF,GACZlrE,EAAK1jB,SAAW2uF,EAAI3uF,OAAS,GAAK4uF,EAAG5uF,SACrC0jB,EAAO,SACHlkB,KAAK8lB,UAAUN,YACvBtB,EAAOlkB,KAAK8nB,QAAQ8O,aAAa52B,KAAKktB,sBAE1C,OAAOhJ,GAGXlkB,KAAKquF,wBAA0B,SAASjyE,EAAGwQ,GACvC,GAAI5sB,KAAKwtB,oBAAsBxtB,KAAK4qE,uBAAwB,CACxD,IAAIliD,EAAQ1oB,KAAKg6C,YAAY/G,OAAO,GACpC,GAAIjzC,KAAKg6C,YAAYx0B,WAAaoH,GAAU5sB,KAAKg6C,YAAYptB,OACzD,OACJ,IAAI5lB,EAAM4lB,GAAU5sB,KAAKg6C,YAAYptB,OAC/BlE,EAAM8D,QAAU9D,EAAM5hB,MAAQ4hB,EAAMmC,IAAMnC,EAAM5hB,MAChD4hB,EAAM8D,OACRxlB,EAAIylB,KAAOG,EAAOH,KACfzsB,KAAK8nB,QAAQw8B,wBAAwBt9C,EAAIylB,IAAKzlB,EAAI2lB,QAAQA,QAAUC,EAAOD,QAC9E3sB,KAAKg6C,YAAY3G,cAAcrzC,KAAKg6C,YAAYvkB,qBAG5Dz1B,KAAKy9D,QAAU,SAAST,EAAQjhC,EAASszD,GAGrC,GAFAtzD,EAAUA,GAAW,GACrBA,EAAQihC,OAASA,GAAUjhC,EAAQihC,YACb57D,GAAlB26B,EAAQihC,OAAqB,CAC7B,IAAIt0C,EAAQ1oB,KAAK8lB,UAAUN,UACrBxlB,KAAK8lB,UAAUqJ,eACfnvB,KAAK8lB,UAAU2C,WACrBsT,EAAQihC,OAASh9D,KAAK8nB,QAAQ8O,aAAalO,GAE/C1oB,KAAKskE,QAAQv6D,IAAIgyB,GAEjB,IAAIkX,EAASjzC,KAAKskE,QAAQ7G,QAAQz9D,KAAK8nB,SACvC,IAAKmrB,EAAOzyC,OACR,OAAO,EAEXR,KAAKotB,iBAAmB,EACxB,IAAItH,EAAY9lB,KAAKg6C,YAEhBq1C,GACDvpE,EAAUutB,cAAcJ,EAAO,IAEnC,IAAK,IAAIvxC,EAAIuxC,EAAOzyC,OAAQkB,KACxBokB,EAAUwtB,SAASL,EAAOvxC,IAAI,GAMlC,OALIgnB,GAAS5C,EAAUstB,UAAUuX,aAAajiC,EAAM5hB,QAChDgf,EAAUwtB,SAAS5qB,GAAO,GAE9B1oB,KAAKotB,iBAAmB,EAEjB6lB,EAAOzyC,QAElBR,KAAK6sF,gBAAkB,SAASnqD,EAAK4sD,GACjC,IAAI5mE,EAAQ1oB,KAAK8lB,UAAU2P,kBACvB6Y,EAAc5lB,EAAM8D,QAAU9D,EAAMmC,IAEpC0kE,EAAavvF,KAAK8nB,QAAQqlB,yBAAyBzkB,EAAM8D,QACzDxsB,KAAK8lB,UAAUgoB,iBACfyhD,EAAW5iE,OAAS3sB,KAAK8lB,UAAUgoB,gBAEvC,IAAIN,EAAOxtC,KAAK8nB,QAAQgpB,yBAAyBy+C,EAAW9iE,IAAMiW,EAAK6sD,EAAW5iE,QAElF,GAAKjE,EAAMlD,UAIHoH,EAAS4gB,OAHb,IAAIq+C,EAAe7rF,KAAK8nB,QAAQqlB,yBAAyBmB,EAAc5lB,EAAMmC,IAAMnC,EAAM5hB,OACrF8lB,EAAS5sB,KAAK8nB,QAAQgpB,yBAAyB+6C,EAAap/D,IAAMiW,EAAKmpD,EAAal/D,QAK5F,GAAI2hB,EAAa,CACb,IAAI+hC,EAAW/kC,EAAMuB,WAAWW,EAAM5gB,GACtCyjD,EAAS7jD,OAAS6jD,EAASvpE,UACxB,CACCupE,EAAW/kC,EAAMuB,WAAWjgB,EAAQ4gB,GACxC6iC,EAAS7jD,OAAS6jD,EAASxlD,IAI/B,GADAwlD,EAASz9B,cAAgB28C,EAAW5iE,OAC/B3sB,KAAK8lB,UAAU0H,mBAGhB,GAAI8hE,EACA,IAAIE,EAAW9mE,EAAM8D,YAHzBxsB,KAAK8lB,UAAUwtB,SAAS5qB,GAM5B1oB,KAAK8lB,UAAUwtB,SAAS+8B,GACpBmf,GACAxvF,KAAK8lB,UAAU2kC,eAAe+kC,IAEtCxvF,KAAKujE,oBAAsB,SAAS7gC,GAKhC,IAJA,IAAI5a,EAAU9nB,KAAK8nB,QACfmmD,EAAMnmD,EAAQkyB,YACdlc,EAAMmwC,EAAIh7B,OAELvxC,EAAIo8B,EAAIt9B,OAAQkB,KAAO,CAC5B,IAAIgnB,EAAQoV,EAAIp8B,GAChB,GAAIgnB,EAAMlD,UAAW,CACjB,IAAIqgB,EAAM/d,EAAQqH,aAAazG,EAAM5hB,MAAM2lB,IAAK/D,EAAM5hB,MAAM6lB,QAC5DjE,EAAM5hB,MAAM2lB,IAAMoZ,EAAI/+B,MAAM2lB,IAC5B/D,EAAM5hB,MAAM6lB,OAASkZ,EAAI/+B,MAAM6lB,OAC/BjE,EAAMmC,IAAI4B,IAAMoZ,EAAIhb,IAAI4B,IACxB/D,EAAMmC,IAAI8B,OAASkZ,EAAIhb,IAAI8B,QAGnCshD,EAAIqf,yBAEJ,IAAImC,EAAQ,GACZ,IAAS/tF,EAAIo8B,EAAIt9B,OAAQkB,KAAO,CACxBgnB,EAAQoV,EAAIp8B,GAChB+tF,EAAMv5C,QAAQpuB,EAAQ8O,aAAalO,IAGnCga,EAAM,EACN+sD,EAAMv5C,QAAQu5C,EAAMj1D,OAEpBi1D,EAAM3tF,KAAK2tF,EAAM1kE,SAErB,IAASrpB,EAAIo8B,EAAIt9B,OAAQkB,KAAO,CACxBgnB,EAAQoV,EAAIp8B,GACZmkC,EAAMnd,EAAMqkB,QAChBjlB,EAAQplB,QAAQgmB,EAAO+mE,EAAM/tF,IAC7BgnB,EAAM5hB,MAAM2lB,IAAMoZ,EAAI/+B,MAAM2lB,IAC5B/D,EAAM5hB,MAAM6lB,OAASkZ,EAAI/+B,MAAM6lB,SAGvC3sB,KAAK8sF,WAAa,SAASpqD,EAAK4sD,EAAMI,GAClC,IAAI5nE,EAAU9nB,KAAK8nB,QACfmmD,EAAMnmD,EAAQkyB,YAEdtxB,EAAQulD,EAAIx4C,kBAChB,IAAI/M,EAAMlD,YACNkD,EAAQZ,EAAQqH,aAAazG,EAAM5hB,MAAM2lB,IAAK/D,EAAM5hB,MAAM6lB,QAC1DjE,EAAM8D,QAAiB,GAARkW,EAAYha,EAAM5hB,MAAQ4hB,EAAMmC,IAC/C7qB,KAAKg6C,YAAY1G,SAAS5qB,IACtBgnE,GAJR,CAOA,IAAI1yB,EAASl1C,EAAQ8O,aAAalO,GAE9B2nD,EAAWnT,EAAKp1C,EAASk1C,EAAQt6B,GACjC2tC,IACAA,EAAS7jD,QAAiB,GAARkW,EAAY2tC,EAASvpE,MAAQupE,EAASxlD,IACxD7qB,KAAKotB,iBAAmB,EACxBptB,KAAK8nB,QAAQqlC,OAAOkjB,GACpBrwE,KAAKg6C,YAAY1G,SAAS+8B,GAC1BrwE,KAAKotB,iBAAmB,EACxBptB,KAAKgpB,SAASsF,qBAAqB,KAAM,KAEzCghE,GACAtvF,KAAKg6C,YAAYyQ,eAAe/hC,EAAM8D,UAE9CxsB,KAAKgtF,aAAe,WAChB,IAAIllE,EAAU9nB,KAAK8nB,QACfmmD,EAAMnmD,EAAQkyB,YACd/G,EAASg7B,EAAIh7B,OACbxmB,GAAO,EACPkjE,EAAgB18C,EAAOxqC,OAAO,SAAS+f,GACvC,GAAIA,EAAEgE,OAAOC,KAAOA,EAChB,OAAO,EACXA,EAAMjE,EAAEgE,OAAOC,MAGnB,GAAKwmB,EAAOzyC,QAAUmvF,EAAcnvF,QAAUyyC,EAAOzyC,OAAS,EAyBvD,CACHmvF,EAAcznF,QAAQ,SAASsgB,GAC3BylD,EAAIxjB,eAAejiC,EAAEgE,UAGzB,IAAIojE,EAAS,EACTC,EAAWzvC,IACX0vC,EAAe78C,EAAOzqC,IAAI,SAASggB,GACnC,IAAIsjB,EAAItjB,EAAEgE,OACNkb,EAAO5f,EAAQoZ,QAAQ4K,EAAErf,KACzBsjE,EAAcroD,EAAKlhB,OAAOslB,EAAEnf,QAAQ2kB,OAAO,OAQ/C,OAPoB,GAAhBy+C,IACAA,EAAc,GAEdjkD,EAAEnf,OAASijE,IACXA,EAAS9jD,EAAEnf,QACXojE,EAAcF,IACdA,EAAWE,GACRA,IAEX98C,EAAO/qC,QAAQ,SAASsgB,EAAG9mB,GACvB,IAAIoqC,EAAItjB,EAAEgE,OACN7qB,EAAIiuF,EAAS9jD,EAAEnf,OACfq+C,EAAI8kB,EAAapuF,GAAKmuF,EACtBluF,EAAIqpE,EACJljD,EAAQzgB,OAAOykC,EAAGnoB,EAAK/B,aAAa,IAAKjgB,EAAIqpE,IAE7CljD,EAAQvgB,OAAO,IAAI+jC,EAAMQ,EAAErf,IAAKqf,EAAEnf,OAAQmf,EAAErf,IAAKqf,EAAEnf,OAAShrB,EAAIqpE,IAEpExiD,EAAE1hB,MAAM6lB,OAASnE,EAAEqC,IAAI8B,OAASijE,EAChCpnE,EAAE1hB,MAAM2lB,IAAMjE,EAAEqC,IAAI4B,IAAMqf,EAAErf,IAC5BjE,EAAEgE,OAAShE,EAAEqC,MAEjBojD,EAAI93C,kBAAkB8c,EAAO,IAC7BjzC,KAAKgpB,SAASugD,eACdvpE,KAAKgpB,SAASwhD,wBA5D+C,CAC7D,IAAI9hD,EAAQ1oB,KAAK8lB,UAAU2C,WACvBunE,EAAKtnE,EAAM5hB,MAAM2lB,IAAKwjE,EAAKvnE,EAAMmC,IAAI4B,IACrCyjE,EAAaF,GAAMC,EACvB,GAAIC,EAAY,CACZ,IACIxoD,EADAvgC,EAAMnH,KAAK8nB,QAAQoK,YAEvB,GACIwV,EAAO1nC,KAAK8nB,QAAQoZ,QAAQ+uD,SACvB,OAAOxsF,KAAKikC,MAAWuoD,EAAK9oF,GACrC,GACIugC,EAAO1nC,KAAK8nB,QAAQoZ,QAAQ8uD,SACvB,OAAOvsF,KAAKikC,MAAWsoD,EAAK,GAEjCA,EAAK,IAAGA,EAAK,GACbC,GAAM9oF,IAAK8oF,EAAK9oF,EAAM,GAE9B,IAAImhC,EAAQtoC,KAAK8nB,QAAQg+B,gBAAgBkqC,EAAIC,GAC7C3nD,EAAQtoC,KAAKmwF,aAAa7nD,EAAO4nD,GACjClwF,KAAK8nB,QAAQzgB,OAAO,CAAColB,IAAKujE,EAAIrjE,OAAQ,GAAI2b,EAAM9lC,KAAK,MAAQ,MACxD0tF,IACDxnE,EAAM5hB,MAAM6lB,OAAS,EACrBjE,EAAMmC,IAAI8B,OAAS2b,EAAMA,EAAM9nC,OAAS,GAAGA,QAE/CR,KAAK8lB,UAAU6C,SAASD,KAwChC1oB,KAAKmwF,aAAe,SAAS7nD,EAAO8nD,GAChC,IACIC,EAAQC,EAAOC,EADfC,GAAgB,EAAMC,GAAiB,EAG3C,OAAOnoD,EAAM9/B,IAAI,SAASk/B,GACtB,IAAI/J,EAAI+J,EAAKhkC,MAAM,2BACnB,OAAKi6B,EAGS,MAAV0yD,GACAA,EAAS1yD,EAAE,GAAGn9B,OACd8vF,EAAQ3yD,EAAE,GAAGn9B,OACb+vF,EAAO5yD,EAAE,GAAGn9B,OACLm9B,IAGP0yD,EAASC,EAAQC,GAAQ5yD,EAAE,GAAGn9B,OAASm9B,EAAE,GAAGn9B,OAASm9B,EAAE,GAAGn9B,SAC1DiwF,GAAiB,GACjBJ,GAAU1yD,EAAE,GAAGn9B,SACfgwF,GAAgB,GAEhBH,EAAS1yD,EAAE,GAAGn9B,SACd6vF,EAAS1yD,EAAE,GAAGn9B,QACd8vF,EAAQ3yD,EAAE,GAAGn9B,SACb8vF,EAAQ3yD,EAAE,GAAGn9B,QACb+vF,EAAO5yD,EAAE,GAAGn9B,SACZ+vF,EAAO5yD,EAAE,GAAGn9B,QAETm9B,GArBI,CAAC+J,KAsBbl/B,IAAI4nF,EAAYM,EACfF,EAAgBC,EAAiBE,EAAaD,EAAYE,GAE9D,SAAS3vC,EAAOv0C,GACZ,OAAOiX,EAAK/B,aAAa,IAAKlV,GAGlC,SAASgkF,EAAU/yD,GACf,OAAQA,EAAE,GAAYsjB,EAAOovC,GAAU1yD,EAAE,GACnCsjB,EAAOqvC,EAAQ3yD,EAAE,GAAGn9B,OAAS+vF,GAC7B5yD,EAAE,GAAGj7B,QAAQ,aAAc,OAFlBi7B,EAAE,GAIrB,SAASgzD,EAAWhzD,GAChB,OAAQA,EAAE,GAAYsjB,EAAOovC,EAASC,EAAQ3yD,EAAE,GAAGn9B,QAAUm9B,EAAE,GACzDsjB,EAAOsvC,EAAM,KACb5yD,EAAE,GAAGj7B,QAAQ,aAAc,OAFlBi7B,EAAE,GAIrB,SAASizD,EAAQjzD,GACb,OAAQA,EAAE,GAAYsjB,EAAOovC,GAAU1yD,EAAE,GACnCsjB,EAAOsvC,GACP5yD,EAAE,GAAGj7B,QAAQ,aAAc,OAFlBi7B,EAAE,OAK1Bn8B,KAAKwiE,EAAO1iE,WAMfqB,EAAQyrF,gBAAkB,SAAShyE,GAC/B,IAAI0L,EAAU1L,EAAE0L,QACZA,IAAYA,EAAQkyB,cACpBlyB,EAAQy0D,kBAAoB,GAC5Bz0D,EAAQhC,UAAU0nE,iBAClB1lE,EAAQkyB,YAAclyB,EAAQhC,WAElC9lB,KAAKg6C,YAAclyB,GAAWA,EAAQkyB,YAEtC,IAAIgsB,EAAa5pD,EAAE4pD,WACfA,IACAA,EAAWhsB,YAAYtf,IAAI,WAAY16B,KAAKotF,aAC5CpnB,EAAWhsB,YAAYtf,IAAI,cAAe16B,KAAKqtF,gBAC/CrnB,EAAWhsB,YAAYtf,IAAI,cAAe16B,KAAKkuF,gBAC/CloB,EAAWhsB,YAAYtf,IAAI,eAAgB16B,KAAKmuF,iBAChDnoB,EAAWhsB,YAAYxM,KAAK9S,IAAI,SAAU16B,KAAKquF,yBAC/CroB,EAAWhsB,YAAYptB,OAAO8N,IAAI,SAAU16B,KAAKquF,0BAGjDvmE,IACAA,EAAQkyB,YAAY/xB,GAAG,WAAYjoB,KAAKotF,aACxCtlE,EAAQkyB,YAAY/xB,GAAG,cAAejoB,KAAKqtF,gBAC3CvlE,EAAQkyB,YAAY/xB,GAAG,cAAejoB,KAAKkuF,gBAC3CpmE,EAAQkyB,YAAY/xB,GAAG,eAAgBjoB,KAAKmuF,iBAC5CrmE,EAAQkyB,YAAYxM,KAAKvlB,GAAG,SAAUjoB,KAAKquF,yBAC3CvmE,EAAQkyB,YAAYptB,OAAO3E,GAAG,SAAUjoB,KAAKquF,0BAG7CvmE,GAAW9nB,KAAKwtB,mBAAqB1F,EAAQhC,UAAU0H,oBACnD1F,EAAQhC,UAAU0H,kBAClBxtB,KAAKkuF,iBAELluF,KAAKmuF,oBA+CjBxrF,EAAQqrF,YAAcA,EAGtBnsF,EAAS,YAAYi6B,cAAckoC,EAAO1iE,UAAW,SAAU,CAC3DuvF,kBAAmB,CACf9mF,IAAK,SAASse,GACV2lE,EAAYhuF,MACRqoB,GACAroB,KAAKioB,GAAG,gBAAiBjoB,KAAKiuF,6BAC9BjuF,KAAKioB,GAAG,YAAauD,KAErBxrB,KAAK06B,IAAI,gBAAiB16B,KAAKiuF,6BAC/BjuF,KAAK06B,IAAI,YAAalP,KAG9B9iB,OAAO,GAEXooF,kBAAmB,CACf/mF,IAAK,SAASse,GACVroB,KAAKgsF,oBAAsB3jE,GAE/B3f,OAAO,OAQfrF,IAAIlD,OAAO,6BAA6B,CAAC,UAAU,UAAU,SAAS,aAAc,SAAS0B,EAAUc,EAASvC,GAChH,aAEA,IAAIkrC,EAAQzpC,EAAS,eAAeypC,MAEhCylD,EAAWpuF,EAAQouF,SAAW,cAElC,WAEI/wF,KAAKgxF,mBAAqB,KAC1BhxF,KAAKixF,kBAAoB,KACzBjxF,KAAKmuD,cAAgB,SAASrmC,EAASgrD,EAAWrmD,GAC9C,IAAIib,EAAO5f,EAAQoZ,QAAQzU,GAC3B,OAAIzsB,KAAKgxF,mBAAmBvtF,KAAKikC,GACtB,QACM,gBAAborC,GACO9yE,KAAKixF,mBACLjxF,KAAKixF,kBAAkBxtF,KAAKikC,GAC5B,MACJ,IAGX1nC,KAAKouD,mBAAqB,SAAStmC,EAASgrD,EAAWrmD,GACnD,OAAO,MAGXzsB,KAAKkxF,iBAAmB,SAASppE,EAAS2E,EAAKE,GAC3C,IAAIwR,EAAK,KACLuJ,EAAO5f,EAAQoZ,QAAQzU,GACvB0kE,EAAazpD,EAAK4J,OAAOnT,GAC7B,IAAmB,GAAfgzD,EAAJ,CAGA,IAAI3lD,EAAc7e,GAAU+a,EAAKlnC,OAC7ByxB,EAASnK,EAAQoK,YACjBqZ,EAAW9e,EACXgf,EAAShf,EAEb,QAASA,EAAMwF,EAAQ,CACnB,IAAIuY,EAAQ1iB,EAAQoZ,QAAQzU,GAAK6kB,OAAOnT,GAExC,IAAc,GAAVqM,EAAJ,CAGA,GAAIA,GAAS2mD,EACT,MAEJ1lD,EAAShf,GAGb,GAAIgf,EAASF,EAAU,CACnB,IAAIG,EAAY5jB,EAAQoZ,QAAQuK,GAAQjrC,OACxC,OAAO,IAAI8qC,EAAMC,EAAUC,EAAaC,EAAQC,MAIxD1rC,KAAKoxF,oBAAsB,SAAStpE,EAASk1B,EAASvwB,EAAKE,EAAQgjC,GAC/D,IAAI7oD,EAAQ,CAAC2lB,IAAKA,EAAKE,OAAQA,EAAS,GACpC9B,EAAM/C,EAAQ2nC,oBAAoBzS,EAASl2C,EAAO6oD,GACtD,GAAK9kC,EAAL,CAGA,IAAImkC,EAAKlnC,EAAQgZ,YAAYjW,EAAI4B,KAQjC,OAPU,MAANuiC,IACAA,EAAKlnC,EAAQqmC,cAActjC,EAAI4B,MAEzB,SAANuiC,GAAiBnkC,EAAI4B,IAAM3lB,EAAM2lB,MACjC5B,EAAI4B,MACJ5B,EAAI8B,OAAS7E,EAAQoZ,QAAQrW,EAAI4B,KAAKjsB,QAEnC8qC,EAAMuB,WAAW/lC,EAAO+jB,KAGnC7qB,KAAKqxF,oBAAsB,SAASvpE,EAASk1B,EAASvwB,EAAKE,EAAQgjC,GAC/D,IAAI9kC,EAAM,CAAC4B,IAAKA,EAAKE,OAAQA,GACzB7lB,EAAQghB,EAAQwzB,oBAAoB0B,EAASnyB,GAEjD,GAAK/jB,EAML,OAHAA,EAAM6lB,SACN9B,EAAI8B,SAEI2e,EAAMuB,WAAW/lC,EAAO+jB,MAErCrpB,KAAKuvF,EAASzvF,aAIjB+B,IAAIlD,OAAO,qBAAqB,CAAC,UAAU,UAAU,SAAS,eAAgB,SAAS0B,EAAUc,EAASvC,GAC1G,aAEAuC,EAAQmkF,QAAS,EACjBnkF,EAAQikF,SAAW,SACnBjkF,EAAQ0L,QAAU,s0EAyHlB,IAAIqV,EAAM7hB,EAAS,cACnB6hB,EAAItV,gBAAgBzL,EAAQ0L,QAAS1L,EAAQikF,YAG7CvjF,IAAIlD,OAAO,mBAAmB,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,aAAc,SAAS0B,EAAUc,EAASvC,GAClI,aAEUyB,EAAS,aAAnB,IACI6hB,EAAM7hB,EAAS,aACPA,EAAS,WAAWypC,MAGhC,SAASgmD,EAAYxpE,GACjB9nB,KAAK8nB,QAAUA,EACf9nB,KAAK8nB,QAAQypE,cAAgBvxF,KAC7BA,KAAK8nB,QAAQszC,aAAep7D,KAAKo7D,aACjCp7D,KAAK8nB,QAAQu0C,uBAAyBr8D,KAAKq8D,uBAC3Cr8D,KAAKwxF,eAAiBxxF,KAAKwxF,eAAersF,KAAKnF,MAC/CA,KAAKyxF,cAAgBzxF,KAAKyxF,cAActsF,KAAKnF,MAC7CA,KAAK0xF,eAAiB1xF,KAAK0xF,eAAevsF,KAAKnF,MAC/CA,KAAK8nB,QAAQ6pE,gBAAkB,GAC/B3xF,KAAK4xF,gBAAkB5xF,KAAK4xF,gBAAgBzsF,KAAKnF,MAEjDA,KAAK8nB,QAAQG,GAAG,SAAUjoB,KAAKwxF,gBAC/BxxF,KAAK8nB,QAAQG,GAAG,aAAcjoB,KAAK6xF,cACnC7xF,KAAK8nB,QAAQG,GAAG,eAAgBjoB,KAAK4xF,kBAGzC,WACI5xF,KAAKo7D,aAAe,SAAS3uC,GACzB,IAAIsV,EAKJ,OAHIA,EADA/hC,KAAKyyC,aACDzyC,KAAKyyC,YAAYhmB,IAAQzsB,KAAKyyC,YAAYhmB,GAAKysB,UAE/C,EACHl5C,KAAK+oC,cAAiB/oC,KAAKipC,UAAUxc,GAG/BzsB,KAAKipC,UAAUxc,GAAKjsB,OAAS,EAAIuhC,EAFjC,EAAIA,GAMnB/hC,KAAKq8D,uBAAyB,WAC1B,IAAID,EAAa,EAKjB,OAJAp8D,KAAKyyC,YAAYvqC,QAAQ,SAASkuD,GAC1BA,GAAKA,EAAEld,WAAakd,EAAE07B,SACtB11B,GAAchG,EAAEld,YAEjBkjB,GAGXp8D,KAAK4xF,gBAAkB,SAASx1E,GAC5Bpc,KAAKiiC,OAAO7lB,EAAEkP,SAGlBtrB,KAAKiiC,OAAS,SAAS3W,GACfA,GAAWA,EAAOimE,eAAiBjmE,EAAOimE,eAAiBvxF,MAC3DsrB,EAAOimE,cAAcrvD,SAErBliC,KAAKsrB,QAAUA,IAGnBtrB,KAAKkiC,SACLliC,KAAKsrB,OAASA,EAEVA,IACAA,EAAOimE,cAAgBvxF,KACvBsrB,EAAOtC,SAASf,GAAG,eAAgBjoB,KAAK0xF,gBACxCpmE,EAAOtC,SAASf,GAAG,cAAejoB,KAAKyxF,kBAG/CzxF,KAAKkiC,OAAS,SAAS9lB,GACnB,IAAIkP,EAAStrB,KAAKsrB,OAClB,GAAKA,EAAL,CAGAtrB,KAAKsrB,OAAS,KACdA,EAAOimE,cAAgB,KAEvBjmE,EAAOtC,SAAS0R,IAAI,eAAgB16B,KAAK0xF,gBACzCpmE,EAAOtC,SAAS0R,IAAI,cAAe16B,KAAKyxF,eACxC,IAAIh/C,EAAczyC,KAAK8nB,QAAQ2qB,YAC/BA,GAAeA,EAAYvqC,QAAQ,SAASkuD,GACpCA,GAAKA,EAAE9oD,IAAM8oD,EAAE9oD,GAAGyD,aAClBqlD,EAAE27B,aAAc,EAChB37B,EAAE9oD,GAAGyD,WAAWb,YAAYkmD,EAAE9oD,SAK1CtN,KAAK6xF,aAAe,SAASz1E,EAAG0L,GAC5B,IAAI2qB,EAAc3qB,EAAQ2qB,YAC1B,GAAKA,GAAgBr2B,EAAE8oB,OAAvB,CAMA,IAJA,IAAIxE,EAAOtkB,EAAE6E,KACTna,EAAQ45B,EAAK55B,MAAM2lB,IACnB5B,EAAM6V,EAAK7V,IAAI4B,IACfuE,EAAmB,OAAZ5U,EAAE8oB,OACJxjC,EAAIoF,EAAQ,EAAGpF,EAAImpB,EAAKnpB,IACzB+wC,EAAY/wC,KACZ+wC,EAAY/wC,GAAGowF,OAAS9gE,GAE5ByhB,EAAY5nB,KACRmG,EACKyhB,EAAY3rC,GAGb2rC,EAAY5nB,GAAKinE,OAAS9gE,EAF1ByhB,EAAY3rC,GAAS2rC,EAAY5nB,IAIjC4nB,EAAY3rC,IAAU2rC,EAAY5nB,KAClC4nB,EAAY3rC,QAAS1F,GACzBqxC,EAAY5nB,GAAKinE,OAAS9gE,MAKtChxB,KAAKwxF,eAAiB,SAASnpD,GAC3B,IAAIoK,EAAczyC,KAAK8nB,QAAQ2qB,YAC/B,GAAKA,EAAL,CAEA,IAAIlH,EAAWlD,EAAMvhC,MAAM2lB,IACvBkY,EAAM0D,EAAMxd,IAAI4B,IAAM8e,EAE1B,GAAY,IAAR5G,QACG,GAAoB,UAAhB0D,EAAMnD,OAAoB,CACjC,IAAI99B,EAAUqrC,EAAYhsC,OAAO8kC,EAAW,EAAG5G,GAC/Cv9B,EAAQc,QAAQ,SAASkuD,GACrBA,GAAKp2D,KAAKgyF,iBAAiB57B,IAC5Bp2D,MACHA,KAAKiyF,kBACF,CACH,IAAI1sF,EAAO,IAAId,MAAMkgC,GACrBp/B,EAAK2wC,QAAQ3K,EAAU,GACvBkH,EAAYhsC,OAAO7F,MAAM6xC,EAAaltC,GACtCvF,KAAKiyF,iBAIbjyF,KAAKiyF,YAAc,WACf,IAAIx/C,EAAczyC,KAAK8nB,QAAQ2qB,YAC/B,GAAKA,EAAL,CACA,IAAIy/C,GAAY,EAChBz/C,EAAYvqC,QAAQ,SAASkuD,EAAG10D,GAC5B,GAAI00D,EAAG,CACH87B,GAAY,EACZ97B,EAAE3pC,IAAM/qB,EACR,MAAO00D,EAAE+7B,WACL/7B,EAAE+7B,WAAW1lE,IAAM/qB,EACnB00D,EAAIA,EAAE+7B,cAIdD,IACAlyF,KAAK8nB,QAAQ2qB,YAAc,QAGnCzyC,KAAKoyF,cAAgB,SAASh8B,GACrBp2D,KAAK8nB,QAAQ2qB,cACdzyC,KAAK8nB,QAAQ2qB,YAAc,IAAIhuC,MAAMzE,KAAK8nB,QAAQoK,cAEtD,IAAImI,EAAMr6B,KAAK8nB,QAAQ2qB,YAAY2jB,EAAE3pC,KACjC4N,IACA+7B,EAAE+7B,WAAa93D,EACXA,EAAI/sB,IAAM+sB,EAAI/sB,GAAGyD,aACjBspB,EAAI/sB,GAAGyD,WAAWb,YAAYmqB,EAAI/sB,IAClC+sB,EAAI03D,aAAc,IAI1B/xF,KAAK8nB,QAAQ2qB,YAAY2jB,EAAE3pC,KAAO2pC,EAElCA,EAAEtuC,QAAU9nB,KAAK8nB,QAEjB,IAAIkB,EAAWhpB,KAAKsrB,OAAOtC,SACvBotC,EAAExlC,OAASwlC,EAAE9oD,KACb8oD,EAAE9oD,GAAKoW,EAAIzY,cAAc,OACzBmrD,EAAE9oD,GAAGwD,UAAYslD,EAAExlC,MAEnBwlC,EAAE9oD,KACFoW,EAAIjW,YAAY2oD,EAAE9oD,GAAI,2BACtB8oD,EAAE9oD,GAAGgB,MAAMqB,SAAW,WACtBymD,EAAE9oD,GAAGgB,MAAM+jF,OAAS,EACpBrpE,EAASY,UAAUrb,YAAY6nD,EAAE9oD,IACjC8oD,EAAE27B,aAAc,GAGf37B,EAAEk8B,cACHl8B,EAAE9oD,GAAGgB,MAAM+jF,OAAS,GAEH,MAAjBj8B,EAAEm8B,cACFn8B,EAAEm8B,YAAcn8B,EAAE9oD,GAAG4jB,cAEP,MAAdklC,EAAEld,WACFkd,EAAEld,SAAWkd,EAAEm8B,YAAcvpE,EAAS8L,YAAYD,YAGtD,IAAI6L,EAAO1gC,KAAK8nB,QAAQ6Y,UAAUy1B,EAAE3pC,IAAK,GAEzC,GADA2pC,EAAEo8B,MAAQ9xD,EACNA,EAAM,CACN,IAAI+R,EAAczyC,KAAK8nB,QAAQ2qB,YAC3B2jB,EAAE3pC,KAAOiU,EAAK7V,IAAI4B,KAAQgmB,EAAY/R,EAAK55B,MAAM2lB,KAGjD2pC,EAAE07B,QAAS,EAFXr/C,EAAY/R,EAAK55B,MAAM2lB,KAAO2pC,EAUtC,OALAp2D,KAAK8nB,QAAQyB,MAAM,aAAc,CAACtI,KAAK,CAACna,MAAM,CAAC2lB,IAAK2pC,EAAE3pC,QAEtDzsB,KAAKiyF,cACLjyF,KAAKyxF,cAAc,KAAMzoE,GACzBhpB,KAAKyyF,gBAAgBr8B,GACdA,GAGXp2D,KAAKgyF,iBAAmB,SAAS57B,GAK7B,GAJAA,EAAE27B,aAAc,EAChB37B,EAAEtuC,QAAU,KACRsuC,EAAE9oD,IAAM8oD,EAAE9oD,GAAGyD,YACbqlD,EAAE9oD,GAAGyD,WAAWb,YAAYkmD,EAAE9oD,IAC9B8oD,EAAE9qC,QAAU8qC,EAAE9qC,OAAO8F,QAAS,IAC9BglC,EAAE9qC,OAAO8F,UACX,MAAMhV,IACR,GAAIpc,KAAK8nB,QAAQ2qB,YAAa,CAC1B,IAAIigD,EAAK1yF,KAAK8nB,QAAQ2qB,YAAY2jB,EAAE3pC,KACpC,GAAIimE,GAAMt8B,EACNp2D,KAAK8nB,QAAQ2qB,YAAY2jB,EAAE3pC,KAAO2pC,EAAE+7B,WAChC/7B,EAAE+7B,YACFnyF,KAAKyyF,gBAAgBr8B,EAAE+7B,iBAE3B,MAAOO,EAAI,CACP,GAAIA,EAAGP,YAAc/7B,EAAG,CACpBs8B,EAAGP,WAAa/7B,EAAE+7B,WAClB,MAEJO,EAAKA,EAAGP,YAIpBnyF,KAAK8nB,QAAQyB,MAAM,aAAc,CAACtI,KAAK,CAACna,MAAM,CAAC2lB,IAAK2pC,EAAE3pC,QACtDzsB,KAAKiyF,eAGTjyF,KAAK2yF,gBAAkB,SAASlmE,GAC5B,IAAIgmB,EAAczyC,KAAK8nB,QAAQ2qB,YAC3B2jB,EAAI3jB,GAAeA,EAAYhmB,GAC/BmrB,EAAO,GACX,MAAOwe,EACHxe,EAAK91C,KAAKs0D,GACVA,EAAIA,EAAE+7B,WAEV,OAAOv6C,GAGX53C,KAAKyyF,gBAAkB,SAASr8B,GAC5Bp2D,KAAK8nB,QAAQ6pE,gBAAgB7vF,KAAKs0D,GAClCp2D,KAAKsrB,QAAUtrB,KAAKsrB,OAAOtC,SAAS6+C,cAGxC7nE,KAAK0xF,eAAiB,SAASt1E,EAAG4M,GAC9B,IAAI4pE,EAAiB5yF,KAAK8nB,QAAQ6pE,gBAC9B/yD,EAAS5V,EAAS8L,YAEtB,GAAK89D,GAAmBA,EAAepyF,OAAvC,CAEA,IADA,IAAIgH,EAAM44C,IACD1+C,EAAI,EAAGA,EAAIkxF,EAAepyF,OAAQkB,IAAK,CAC5C,IAAI00D,EAAIw8B,EAAelxF,GACvB,GAAK00D,GAAMA,EAAE9oD,IACT8oD,EAAEtuC,SAAW9nB,KAAK8nB,QAAtB,CACA,IAAKsuC,EAAE27B,YAAa,CAChB,GAAI/xF,KAAK8nB,QAAQ2qB,YAAY2jB,EAAE3pC,MAAQ2pC,EACnC,SACJA,EAAE27B,aAAc,EAChB/oE,EAASY,UAAUrb,YAAY6nD,EAAE9oD,IAGrC8oD,EAAEr0B,EAAIq0B,EAAE9oD,GAAG4jB,aAENklC,EAAEy8B,aACHz8B,EAAEA,EAAIA,EAAE9oD,GAAG0C,YACXomD,EAAEF,YAAchvD,KAAK6uE,KAAK3f,EAAEA,EAAIx3B,EAAO7J,iBAG3C,IAAImkB,EAAWkd,EAAEr0B,EAAInD,EAAO/J,WACxBuhC,EAAE08B,YACF55C,GAAYl5C,KAAK8nB,QAAQuzC,gBAAgBjF,EAAE3pC,KACvCysB,EAAW,IACXA,EAAW,IAEfkd,EAAEld,UAAYA,IACdkd,EAAEld,SAAWA,EACTkd,EAAE3pC,IAAMjlB,IACRA,EAAM4uD,EAAE3pC,OAGhBjlB,GAAO44C,MACPpgD,KAAK8nB,QAAQyB,MAAM,aAAc,CAACtI,KAAK,CAACna,MAAM,CAAC2lB,IAAKjlB,MACpDxH,KAAK8nB,QAAQuuC,gBAAkB,MAEnCr2D,KAAK8nB,QAAQ6pE,gBAAkB,KAGnC3xF,KAAKyxF,cAAgB,SAASr1E,EAAG4M,GAC7B,IAAI4V,EAAS5V,EAAS8L,YAClB2d,EAAczyC,KAAK8nB,QAAQ2qB,YAC/B,GAAKA,EAAL,CAEA,IAAIuV,EAAQ9gD,KAAKM,IAAIxH,KAAK2sC,SAAU/N,EAAO+N,UACvCnrB,EAAOta,KAAKC,IAAInH,KAAK4sC,QAAShO,EAAOgO,QAAS6F,EAAYjyC,QAE9D,MAAOwnD,EAAQ,IAAMvV,EAAYuV,GAC7BA,IAEJhoD,KAAK2sC,SAAW/N,EAAO+N,SACvB3sC,KAAK4sC,QAAUhO,EAAOgO,QAEtB5jB,EAAS4M,aAAagJ,OAASA,EAC/B,IAAK,IAAIl9B,EAAIsmD,EAAOtmD,GAAK8f,EAAM9f,IAAK,CAChC,IAAI00D,EAAI3jB,EAAY/wC,GACpB,GAAK00D,GAAMA,EAAE9oD,GACb,GAAI8oD,EAAE07B,OACF17B,EAAE9oD,GAAGgB,MAAMwb,KAAO,KAAOssC,EAAEm8B,aAAe,GAAK,SADnD,CAIKn8B,EAAE27B,cACH37B,EAAE27B,aAAc,EAChB/oE,EAASY,UAAUrb,YAAY6nD,EAAE9oD,KAErC,IAAIwc,EAAMd,EAAS4M,aAAaumD,iBAAiB,CAAC1vD,IAAK/qB,EAAGirB,OAAO,IAAI,GAAM7C,IACtEssC,EAAE08B,YACHhpE,GAAO8U,EAAO/J,WAAa70B,KAAK8nB,QAAQuzC,gBAAgBjF,EAAE3pC,MAC9D2pC,EAAE9oD,GAAGgB,MAAMwb,IAAMA,EAAM8U,EAAO9b,OAAS,KAEvC,IAAIlT,EAAOwmD,EAAEk8B,YAAc,EAAItpE,EAAS0rD,YACnCte,EAAEy8B,aACHjjF,GAAQoZ,EAASxY,YACrB4lD,EAAE9oD,GAAGgB,MAAMsB,KAAOA,EAAO,KAErBwmD,EAAE28B,WAAa38B,EAAEF,cACjBE,EAAE9oD,GAAGgB,MAAMiB,SAAWqvB,EAAOtvB,MAAQ,EAAIsvB,EAAOg3C,QAAU,MAG1Dxf,EAAEy8B,WACFz8B,EAAE9oD,GAAGgB,MAAMsc,MAAQ5B,EAASm3D,UAAUhvD,WAAa,KAEnDilC,EAAE9oD,GAAGgB,MAAMsc,MAAQ,SAKhCppB,KAAK8vF,EAAYhwF,WAGpBqB,EAAQ2uF,YAAcA,IAItBjuF,IAAIlD,OAAO,uBAAuB,CAAC,UAAU,UAAU,SAAS,mBAAmB,cAAc,aAAc,SAAS0B,EAAUc,EAASvC,GAC3I,aACA,IAAIkxF,EAAczvF,EAAS,mBAAmByvF,YAC1C5tE,EAAM7hB,EAAS,cACfypC,EAAQzpC,EAAS,YAAYypC,MAEjC,SAAS0nD,EAAa1uF,EAAO04D,EAAQi2B,GACjC,IAAIjrC,EAAQ,EACRxmC,EAAOld,EAAM9D,OAAS,EAE1B,MAAOwnD,GAASxmC,EAAM,CAClB,IAAIwvC,EAAOhJ,EAAQxmC,GAAS,EACxBoH,EAAIqqE,EAAWj2B,EAAQ14D,EAAM0sD,IACjC,GAAIpoC,EAAI,EACJo/B,EAAQgJ,EAAM,MACb,MAAIpoC,EAAI,GAGT,OAAOooC,EAFPxvC,EAAOwvC,EAAM,GAIrB,QAAShJ,EAAQ,GAGrB,SAASkrC,EAAgBprE,EAAS2E,EAAKiW,GACnC,IAAIyxB,EAAcrsC,EAAQssC,iBAAiBlL,KAAK5d,EAAMH,eACtD,GAAKgpB,EAAY3zD,OAAjB,CAGA,IAAIkB,EAAIsxF,EAAa7+B,EAAa,CAAC1nC,IAAKA,EAAKE,QAAS,GAAI2e,EAAMH,eAC5DzpC,EAAI,IACJA,GAAKA,EAAI,GAETA,GAAKyyD,EAAY3zD,OACjBkB,EAAIghC,EAAM,EAAI,EAAIyxB,EAAY3zD,OAAS,EAC5B,IAANkB,GAAWghC,EAAM,IACtBhhC,EAAIyyD,EAAY3zD,OAAS,GAE7B,IAAIsxB,EAAaqiC,EAAYzyD,GAC7B,GAAKowB,GAAe4Q,EAApB,CAGA,GAAI5Q,EAAWrF,MAAQA,EAAK,CACxB,GACIqF,EAAaqiC,EAAYzyD,GAAKghC,SACzB5Q,GAAcA,EAAWrF,MAAQA,GAC1C,IAAKqF,EACD,OAAOqiC,EAAY5xD,QAI3B,IAAI4wF,EAAU,GACd1mE,EAAMqF,EAAWrF,IACjB,GACI0mE,EAAQzwD,EAAM,EAAI,UAAY,QAAQ5Q,GACtCA,EAAaqiC,EAAYzyD,GAAKghC,SACzB5Q,GAAcA,EAAWrF,KAAOA,GACzC,OAAO0mE,EAAQ3yF,QAAU2yF,IAG7BxwF,EAAQk+D,gBAAkB,SAASv1C,EAAQoX,GACvC,IAAI5a,EAAUwD,EAAOxD,QAChBA,EAAQypE,gBACTzpE,EAAQypE,cAAgB,IAAID,EAAYxpE,GACxCA,EAAQypE,cAActvD,OAAO3W,IAGjC,IAAItkB,EAAMskB,EAAOwvB,oBACbruB,EAAMzlB,EAAIylB,IACV2mE,EAAYtrE,EAAQypE,cAAcoB,gBAAgBlmE,GAAKhkB,OAAO,SAAS2tD,GACvE,MAAiB,eAAVA,EAAE16C,OACV,GACC03E,EACAA,EAAUhiE,UAEV3E,GAAOiW,EAEX,IACI2wD,EADAl/B,EAAc++B,EAAgBprE,EAAS2E,EAAKiW,GAEhD,GAAIyxB,EAAa,CACb,IAAIriC,EAAaqiC,EAAY,GAC7BntD,EAAI2lB,QAAUmF,EAAW9qB,KAAmC,iBAArB8qB,EAAWnF,OAC5CmF,EAAW9qB,IAAIq2D,GACfvrC,EAAWnF,SAAW,EAC5B3lB,EAAIylB,IAAMqF,EAAWrF,IACrB4mE,EAAa/nE,EAAOtC,SAAS0I,aAAaK,aAAa/qB,EAAIylB,SACxD,IAAI2mE,EACP,OAEAC,EAAa,CACTnvE,KAAM,CAAC,eACP1W,UAAW,UAGnB8d,EAAOxD,QAAQqlC,OAAOnmD,EAAIylB,KAC1BnB,EAAOxF,UAAUuH,eAAermB,GAEhC,IAAIovD,EAAI,CACJ3pC,IAAKzlB,EAAIylB,IACTomE,YAAY,EACZP,aAAa,EACbhlF,GAAIoW,EAAIzY,cAAc,OACtByQ,KAAM,eAENpO,EAAK8oD,EAAE9oD,GAAGiB,YAAYmV,EAAIzY,cAAc,QACxCqoF,EAAQl9B,EAAE9oD,GAAGiB,YAAYmV,EAAIzY,cAAc,QAC/CqoF,EAAM9lF,UAAY,sBAAwB6lF,EAAW7lF,UAErD,IAAIoC,EAAO0b,EAAOtC,SAAS4M,aACtBumD,iBAAiBn1E,GAAK4I,KAC3B0jF,EAAMhlF,MAAMsB,KAAOA,EAAO0b,EAAOtC,SAAS0rD,YAAc,EAAI,KAE5Dte,EAAE9oD,GAAGE,UAAY,uBACjBF,EAAGE,UAAY,gBAAkB6lF,EAAW7lF,UAC5CF,EAAGwD,UAAYuiF,EAAWnvE,KAAK1hB,KAAK,QAEpC8K,EAAGiB,YAAYmV,EAAIzY,cAAc,QAEjC,IAAIy2B,EAAK,SAASnI,EAAGzZ,EAAQ3G,GACzB,GAAe,IAAX2G,IAA+B,QAAd3G,GAAqC,WAAdA,GAExC,OADAi9C,EAAEhlC,UACK,CAACoR,QAAS,SAIzB4zB,EAAEhlC,QAAU,WACJ9F,EAAO84C,cAAcrxC,iBAEzBzH,EAAO+4C,WAAW1iC,sBAAsBD,GACxC5Z,EAAQypE,cAAcS,iBAAiB57B,GACvC9qC,EAAOoP,IAAI,kBAAmB07B,EAAEhlC,SAChC9F,EAAOoP,IAAI,gBAAiB07B,EAAEhlC,SAC9B9F,EAAOoP,IAAI,UAAW07B,EAAEhlC,SACxB9F,EAAOoP,IAAI,SAAU07B,EAAEhlC,WAG3B9F,EAAO+4C,WAAWxiC,mBAAmBH,GACrCpW,EAAOrD,GAAG,kBAAmBmuC,EAAEhlC,SAC/B9F,EAAOrD,GAAG,gBAAiBmuC,EAAEhlC,SAC7B9F,EAAOrD,GAAG,UAAWmuC,EAAEhlC,SACvB9F,EAAOrD,GAAG,SAAUmuC,EAAEhlC,SAEtB9F,EAAOxD,QAAQypE,cAAca,cAAch8B,GAE3CA,EAAE9oD,GAAGimF,YAAcjoE,EAAOlG,MAAMjgB,KAAKmmB,GAErCA,EAAOtC,SAASsF,qBAAqB,KAAM,GAAK,CAACpE,OAAQksC,EAAE9oD,GAAG4jB,gBAIlExN,EAAItV,gBAAgB,u3BAiCjB,MAIH/K,IAAIlD,OAAO,UAAU,CAAC,UAAU,UAAU,SAAS,yBAAyB,cAAc,gBAAgB,aAAa,mBAAmB,kBAAkB,uBAAuB,2BAA2B,4BAA4B,kBAAkB,mBAAmB,6BAA6B,qBAAqB,uBAAuB,cAAe,SAAS0B,EAAUc,EAASvC,GACnY,aAEAyB,EAAS,wBAET,IAAI6hB,EAAM7hB,EAAS,aACfia,EAAQja,EAAS,eAEjBmiE,EAASniE,EAAS,YAAYmiE,OAC9B/T,EAAcpuD,EAAS,kBAAkBouD,YACzC8iB,EAAclxE,EAAS,iBAAiBkxE,YACxCygB,EAAW3xF,EAAS,sBAAsB49E,gBAC9C59E,EAAS,0BACTA,EAAS,2BACTA,EAAS,iBACTA,EAAS,kBACTA,EAAS,4BACTA,EAAS,oBACTA,EAAS,sBAETc,EAAQi8B,OAAS/8B,EAAS,YAC1Bc,EAAQd,SAAWA,EAGfc,EAAQxC,OAAS,UACrBwC,EAAQ8wF,KAAO,SAASnmF,GACpB,GAAiB,iBAANA,EAAgB,CACvB,IAAIomF,EAAMpmF,EAEV,GADAA,EAAKtC,SAAS2oF,eAAeD,IACxBpmF,EACD,MAAM,IAAIquB,MAAM,4BAA8B+3D,GAGtD,GAAIpmF,GAAMA,EAAGsmF,KAAOtmF,EAAGsmF,IAAItoE,kBAAkB04C,EACzC,OAAO12D,EAAGsmF,IAAItoE,OAElB,IAAI5iB,EAAQ,GACZ,GAAI4E,GAAM,kBAAkB7J,KAAK6J,EAAGumF,SAAU,CAC1C,IAAIC,EAAUxmF,EACd5E,EAAQorF,EAAQprF,MAChB4E,EAAKoW,EAAIzY,cAAc,OACvB6oF,EAAQ/iF,WAAWC,aAAa1D,EAAIwmF,QAC7BxmF,IACP5E,EAAQgb,EAAItS,aAAa9D,GACzBA,EAAGwD,UAAY,IAGnB,IAAI/D,EAAMpK,EAAQoxF,kBAAkBrrF,GAEhC4iB,EAAS,IAAI04C,EAAO,IAAIwvB,EAASlmF,IACrCge,EAAOo5C,WAAW33D,GAElB,IAAI6mF,EAAM,CACN5oF,SAAU+B,EACVue,OAAQA,EACR48C,SAAU58C,EAAO28C,OAAO9iE,KAAKmmB,EAAQ,OASzC,OAPIwoE,IAASF,EAAIzvB,SAAW2vB,GAC5Bh4E,EAAMN,YAAYvb,OAAQ,SAAU2zF,EAAI1rB,UACxC58C,EAAOrD,GAAG,UAAW,WACjBnM,EAAME,eAAe/b,OAAQ,SAAU2zF,EAAI1rB,UAC3C0rB,EAAItoE,OAAO1B,UAAUgqE,IAAM,OAE/BtoE,EAAO1B,UAAUgqE,IAAMtoE,EAAOsoE,IAAMA,EAC7BtoE,GAEX3oB,EAAQoxF,kBAAoB,SAAS7vE,EAAMm0B,GACvC,IAAItrC,EAAM,IAAIkjD,EAAY/rC,EAAMm0B,GAEhC,OADAtrC,EAAI2kD,eAAe,IAAIqhB,GAChBhmE,GAEXpK,EAAQstD,YAAcA,EACtBttD,EAAQowE,YAAcA,EACtBpwE,EAAQqxF,QAAU,UAEN,WACI3wF,IAAIxB,SAAS,CAAC,WAAY,SAAS8E,GAO/B,IAAK,IAAIqF,KANLrF,IACAA,EAAEi4B,OAAO/B,MAAK,GACdl2B,EAAExG,OAASkD,IAAIlD,QAEdF,OAAOoD,MACRpD,OAAOoD,IAAMsD,GACDA,EAAOA,EAAEP,eAAe4F,KACpC/L,OAAOoD,IAAI2I,GAAOrF,EAAEqF,MAThC,GAaZ5L,EAAOuC,QAAU1C,OAAOoD,IAAIxB,SAAS,Y,qBC/ynBrCzB,EAAOuC,QAAU,WAChB,MAAM,IAAIg5B,MAAM,oC,4HCEIs4D,EAArB,6D,+DAEI,EAAAC,SAAW,CACPrvF,OAAQ,GACRsvF,SAAU,GACVhwB,SAAU,GACViwB,OAAQ,EACRlwE,KAAM,GACNmwE,IAAK,GACLC,MAAO,GACPC,SAAU,GACV9wE,MAAO,KACP+wE,GAAI,EACJ/nE,IAAK,EACL9nB,KAAM,GACN8vF,QAAS,EACTC,GAAI,GACJptF,IAAK,GACLqtF,SAAU,GACVC,SAAU,GACVC,KAAM,GACNhyF,GAAI,GAER,EAAAiyF,SAAuB,GAEvB,EAAAC,YAAc,EACd,EAAAC,QAAU,EACV,EAAA93B,KAAO,CACH+3B,OAAQ,GACRC,KAAM,GACNC,OAAO,GAEX,EAAAC,MAAQ,CACJF,KAAM,GACNG,WAAY,GACZF,OAAO,EACPR,SAAU,GACVW,cAAe,GACfC,gBAAiB,IAGrB,EAAAC,WAAa,GAGb,EAAAC,YAAc,GAEd,EAAAC,cAAe,EAEf,EAAAC,SAAU,EAGV,EAAAC,SAAU,EACV,EAAAC,WAAa,GACb,EAAAC,YAAc,GACd,EAAAC,eAAgB,EAChB,EAAAC,iBAAkB,EAvDtB,uFA2DQh2F,KAAK+1F,eAAgB,MA3D7B,GAAwC,QAAnB9B,EAAU,gBAD9B,eAAU,CAACgC,WAAY,MACHhC,GAAA,U,mBCHrB5wF,IAAIlD,OAAO,eAAe,CAAC,UAAU,UAAU,SAAS,cAAc,wBAAwB,eAAe,YAAY,aAAa,4BAA4B,gBAAgB,cAAc,cAAe,SAAS0B,EAAUc,EAASvC,GAC3O,aACA,IAAI4R,EAAMnQ,EAAS,aACf63B,EAAe73B,EAAS,uBAAuB63B,aAC/C/V,EAAO9hB,EAAS,cAChBypC,EAAQzpC,EAAS,WAAWypC,MAC5BiY,EAAS1hD,EAAS,YAAY0hD,OAC9B+a,EAAcz8D,EAAS,2BAA2By8D,YAClD9qB,EAAY3xC,EAAS,eAAe2xC,UACpCrI,EAAgBG,EAAMH,cAEtB+qD,EAAiB,WACjBl2F,KAAKm2F,WAAa,GAClBn2F,KAAKo2F,eAAiB,KAG1B,WACIpkF,EAAIF,UAAU9R,KAAM05B,GAEpB15B,KAAK2/C,aAAe,WAChB,SAAS02C,EAAa3xF,EAAK60B,EAAG6b,GAE1B,OADA1wC,EAAMA,EAAI8hB,OAAO,GACb,QAAQ/iB,KAAKiB,KAAS0wC,EAAMkhD,eACrB,CAAC,CAACC,UAAWxnF,SAASrK,EAAK,MAC/B,CAAC,CAACwf,KAAMxf,IAEnB,SAASkU,EAAOstB,GACZ,MAAO,YAAcA,EAAK,WA4E9B,OA1EAgwD,EAAet2C,WAAa,IAAIpM,EAAU,CACtC1sC,MAAO,CACH,CAAC7C,MAAO,IAAKywC,QAAS,SAASrsB,EAAKgQ,EAAO+c,GACvC,OAAIA,EAAM50C,QAAU40C,EAAM,GAAGohD,UACzBphD,EAAM,GAAGohD,UAAW,EACpBphD,EAAM,GAAGqhD,WAAarhD,EAAM,GACrB,CAACA,EAAM,KAEX,MAEX,CAACnxC,MAAO,MAAOywC,QAAS,SAASrsB,EAAKgQ,EAAO+c,GACzC,IAAIlP,EAAK7d,EAAI,GAeb,MAdU,KAAN6d,GAAakP,EAAM50C,OACnB6nB,EAAM6d,GACuB,GAAvB,OAAOhkC,QAAQgkC,GACrB7d,EAAM6d,EACCkP,EAAMkhD,iBACH,KAANpwD,EACA7d,EAAM,KACK,KAAN6d,EACL7d,EAAM,MACuB,GAAxB,QAAQnmB,QAAQgkC,KACrB7d,EAAM,CAACquE,WAAYxwD,EAAIywD,MAAOzwD,EAAK,OAIpC,CAAC7d,KAEZ,CAACpkB,MAAO,IAAKywC,QAAS,SAASrsB,EAAKgQ,EAAO+c,GACvC,MAAO,CAACA,EAAM50C,OAAS40C,EAAMrqB,QAAU1C,KAE3C,CAACpkB,MAAO,gBAAiBywC,QAAS2hD,GAClC,CAACpyF,MAAO,mBAAoBywC,QAAS,SAAShwC,EAAK2zB,EAAO+c,GACtD,IAAI3lB,EAAI4mE,EAAa3xF,EAAI8hB,OAAO,GAAI6R,EAAO+c,GAE3C,OADAA,EAAMc,QAAQzmB,EAAE,IACTA,GACRsmB,KAAM,cACT,CAAC9xC,MAAO,KAAMswC,MAAO,UAAW0B,OAAO,IAE3C2gD,WAAY,CACR,CAAC3yF,MAAO,MAAQ2U,EAAO,OAAS,OAAQ87B,QAAS,SAASrsB,EAAKgQ,EAAO+c,GAClEA,EAAM,GAAGyhD,QAAUxuE,EAAI9lB,MAAM,GAAI,GAAGH,MAAM,MAC3C2zC,KAAM,SACT,CAAC9xC,MAAO,KAAO2U,EAAO,KAAO,UAAYA,EAAO,KAAO,eACtD87B,QAAS,SAASrsB,EAAKgQ,EAAO+c,GAC3B,IAAI75B,EAAK65B,EAAM,GAOf,OANA75B,EAAGu7E,UAAYzuE,EAEfA,EAAMroB,KAAK+0C,WAAWxxC,KAAK8kB,GAC3B9M,EAAGw7E,MAAQ1uE,EAAI,GACf9M,EAAGy7E,IAAM3uE,EAAI,GACb9M,EAAG04B,KAAO5rB,EAAI,GACP,IACR0tB,KAAM,SACT,CAAC9xC,MAAO,IAAM2U,EAAO,KAAO,KAAM87B,QAAS,SAASrsB,EAAKgQ,EAAO+c,GAE5D,OADAA,EAAM,GAAG6hD,KAAO5uE,EAAI5hB,OAAO,GAAI,GACxB,IACRsvC,KAAM,SACT,CAAC9xC,MAAO,MAAOywC,QAAS,SAASrsB,EAAKgQ,EAAO+c,GACrCA,EAAM,KACNA,EAAM,GAAGohD,UAAW,IACzBzgD,KAAM,SACT,CAAC9xC,MAAO,uBAAwBswC,MAAO,GAAIwB,KAAM,UAErDmhD,aAAc,CACV,CAACjzF,MAAO,KAAO2U,EAAO,KAAO,MAAO27B,MAAO,SAC3C,CAACtwC,MAAO,GAAIywC,QAAS,SAASrsB,EAAKgQ,EAAO+c,GACtCA,EAAMkhD,gBAAiB,GACxBvgD,KAAM,YAGjBmgD,EAAe50F,UAAUq+C,aAAe,WACpC,OAAOu2C,EAAet2C,YAEnBs2C,EAAet2C,YAG1B5/C,KAAKm3F,kBAAoB,SAASzyF,EAAKixC,GACnC,OAAO31C,KAAK2/C,eAAejK,cAAchxC,EAAKixC,GAAYR,OAAO3sC,IAAI,SAAS1E,GAC1E,OAAOA,EAAE4E,OAAS5E,KAI1B9D,KAAKo3F,iBAAmB,SAAS9rE,EAAQ3mB,GACrC,GAAI,aAAalB,KAAKkB,GAAO,CACzB,IAAIjD,EAAIiD,EAAK6hB,OAAO,GACpB,OAAQxmB,KAAKq3F,UAAU1yF,EAAK,GAAK,OAAS,IAAIjD,GAElD,GAAI,QAAQ+B,KAAKkB,GACb,OAAQ3E,KAAKq3F,UAAUC,IAAM,IAAI3yF,GAIrC,GAFAA,EAAOA,EAAKjC,QAAQ,OAAQ,IAEvB4oB,EAAL,CAEA,IAAI+N,EAAI/N,EAAOxD,QACf,OAAOnjB,GACH,IAAK,eACD,IAAI6jB,EAAI6Q,EAAElK,eACd,IAAK,YACL,IAAK,gBACD,OAAOkK,EAAEzC,aAAapO,GAC1B,IAAK,eACD,OAAO6Q,EAAE6H,QAAQ5V,EAAOwvB,oBAAoBruB,KAChD,IAAK,YACD,OAAO4M,EAAE6H,QAAQ5V,EAAOwvB,oBAAoBruB,IAAM,GACtD,IAAK,aACD,OAAOnB,EAAOwvB,oBAAoBnuB,OACtC,IAAK,cACD,OAAOrB,EAAOwvB,oBAAoBruB,IAAM,EAC5C,IAAK,YACD,OAAO4M,EAAEknB,iBAAmB,MAAQ,KACxC,IAAK,WACD,OAAOlnB,EAAEsX,aACb,IAAK,WACL,IAAK,WACD,MAAO,GACX,IAAK,WACD,MAAO,SAGnB3wC,KAAKq3F,UAAY,GACjBr3F,KAAKu3F,iBAAmB,SAASjsE,EAAQksE,GACrC,OAAIx3F,KAAKq3F,UAAUjxF,eAAeoxF,GACvBx3F,KAAKq3F,UAAUG,GAASlsE,EAAQksE,IAAY,GAChDx3F,KAAKo3F,iBAAiB9rE,EAAQksE,IAAY,IAErDx3F,KAAKy3F,YAAc,SAAS/yF,EAAKwhC,EAAI5a,GACjC,IAAI2oB,EAAO/N,EAAG+N,MAAQ,GAClB9V,EAAK+H,EAAG6wD,MACZ54D,EAAK,IAAI36B,OAAO26B,EAAI8V,EAAKvxC,QAAQ,QAAS,KAC1C,IAAIg1F,EAAY13F,KAAKm3F,kBAAkBjxD,EAAG8wD,IAAK,gBAC3CxzE,EAAQxjB,KACR23F,EAAYjzF,EAAIhC,QAAQy7B,EAAI,WAC5B3a,EAAM6zE,UAAUC,GAAK/2F,UAGrB,IAFA,IAAIq3F,EAAWp0E,EAAMq0E,iBAAiBH,EAAWpsE,GAC7CwsE,EAAc,IACTp2F,EAAK,EAAGA,EAAIk2F,EAASp3F,OAAQkB,IAAK,CACvC,IAAIwkC,EAAK0xD,EAASl2F,GAClB,GAAiB,iBAANwkC,EAEP,GADA0xD,EAASl2F,GAAK,GACVwkC,EAAGwwD,YAAcxwD,EAAGywD,MAAO,CAC3B,IAAI5gD,EAAO6hD,EAASl2F,EAAI,GACpBq0C,GAAuB,iBAARA,IACM,KAAjB7P,EAAGwwD,WACHkB,EAASl2F,GAAKq0C,EAAK,GAAGlY,cAEtB+5D,EAASl2F,GAAKq0C,EAAK,GAAGr9B,cAC1Bk/E,EAASl2F,EAAI,GAAKq0C,EAAKvvB,OAAO,SAE3B0f,EAAGwwD,aACVoB,EAAc5xD,EAAGwwD,gBAEC,KAAfoB,EACPF,EAASl2F,GAAKwkC,EAAGrI,cACK,KAAfi6D,IACPF,EAASl2F,GAAKwkC,EAAGxtB,eAGzB,OAAOk/E,EAASp1F,KAAK,MAGzB,OADAxC,KAAKq3F,UAAUC,GAAK,KACbK,GAGX33F,KAAK63F,iBAAmB,SAASE,EAASzsE,GAEtC,IADA,IAAI7lB,EAAS,GACJ/D,EAAI,EAAGA,EAAIq2F,EAAQv3F,OAAQkB,IAAK,CACrC,IAAIwkC,EAAK6xD,EAAQr2F,GACjB,GAAiB,iBAANwkC,EACPzgC,EAAO3D,KAAKokC,OACT,IAAiB,iBAANA,EACd,SACG,GAAIA,EAAGopD,KACV0I,EAAS9xD,OACN,IAAIA,EAAGiR,UAAYz1C,EACtB,SACG,GAAIwkC,EAAGhiB,KAAM,CAChB,IAAIxb,EAAQ1I,KAAKu3F,iBAAiBjsE,EAAQ4a,EAAGhiB,MACzCxb,GAASw9B,EAAG4wD,YACZpuF,EAAQ1I,KAAKy3F,YAAY/uF,EAAOw9B,IACpCA,EAAGiR,UAAYz1C,EACI,MAAfwkC,EAAGswD,SACC9tF,IACAjD,EAAO3D,KAAK4G,GACZsvF,EAAS9xD,IAGTx9B,EACAw9B,EAAGopD,KAAOppD,EAAGuwD,WAEbuB,EAAS9xD,QAEM,MAAhBA,EAAGqwD,UACV9wF,EAAO3D,KAAKokC,GACY,MAAjBA,EAAGwwD,YACVjxF,EAAO3D,KAAKokC,KAGpB,SAAS8xD,EAAS9xD,GACd,IAAI+xD,EAAKF,EAAQ71F,QAAQgkC,EAAIxkC,EAAI,IACtB,GAAPu2F,IACAv2F,EAAIu2F,GAEZ,OAAOxyF,GAGXzF,KAAKk4F,0BAA4B,SAAS5sE,EAAQ6sE,GAC9C,IAAI3rE,EAASlB,EAAOwvB,oBAChBpT,EAAOpc,EAAOxD,QAAQoZ,QAAQ1U,EAAOC,KACrC2rE,EAAY9sE,EAAOxD,QAAQi0B,eAC3B6b,EAAelwB,EAAKhkC,MAAM,QAAQ,GAElC8oB,EAAOG,OAASirC,EAAap3D,SAC7Bo3D,EAAeA,EAAar1D,MAAM,EAAGiqB,EAAOG,SAEhDwrE,EAAcA,EAAYz1F,QAAQ,MAAO,IACzC,IAAIyyC,EAASn1C,KAAKm3F,kBAAkBgB,GACpChjD,EAASn1C,KAAK63F,iBAAiB1iD,EAAQ7pB,GACvC6pB,EAASA,EAAO3sC,IAAI,SAAS1E,GACzB,MAAS,MAALA,EACOA,EAAI8zD,EACC,iBAAL9zD,EACAA,EAAEpB,QAAQ,MAAO01F,GACrBt0F,IAEX,IAAIu0F,EAAW,GACfljD,EAAOjtC,QAAQ,SAAS4jC,EAAGpqC,GACvB,GAAgB,iBAALoqC,EAAX,CAEA,IAAIjpC,EAAKipC,EAAEyqD,UACPh7E,EAAK88E,EAASx1F,GAMlB,GALK0Y,IACDA,EAAK88E,EAASx1F,GAAM,GACpB0Y,EAAGzW,MAAQjC,EACX0Y,EAAG7S,MAAQ,KAEQ,IAAnB6S,EAAGrZ,QAAQ4pC,GAAf,CAEAvwB,EAAGzZ,KAAKgqC,GACR,IAAImsD,EAAK9iD,EAAOjzC,QAAQ4pC,EAAGpqC,EAAI,GAC/B,IAAY,IAARu2F,EAAJ,CAGA,IAAIvvF,EAAQysC,EAAO5yC,MAAMb,EAAI,EAAGu2F,GAC5BK,EAAW5vF,EAAME,KAAK,SAAS6mB,GAAI,MAAoB,kBAANA,IACjD6oE,IAAa/8E,EAAG7S,MAChB6S,EAAG7S,MAAQA,GACJA,EAAMlI,QAAY+a,EAAG7S,OAA6B,kBAAb6S,EAAG7S,QAC/C6S,EAAG7S,MAAQA,EAAMlG,KAAK,UAG9B61F,EAASnwF,QAAQ,SAASqT,GAAKA,EAAG/a,OAAS,IAC3C,IAAI+3F,EAAY,GAChB,SAASC,EAAUnwE,GAEf,IADA,IAAIpG,EAAO,GACFvgB,EAAI,EAAGA,EAAI2mB,EAAI7nB,OAAQkB,IAAK,CACjC,IAAIoqC,EAAIzjB,EAAI3mB,GACZ,GAAgB,iBAALoqC,EAAe,CACtB,GAAIysD,EAAUzsD,EAAEyqD,WACZ,SACJ,IAAI/4D,EAAInV,EAAIpf,YAAY6iC,EAAGpqC,EAAI,GAC/BoqC,EAAI7pB,EAAKub,IAAM,CAAC+4D,UAAWzqD,EAAEyqD,WAEjCt0E,EAAKvgB,GAAKoqC,EAEd,OAAO7pB,EAEX,IAAK,IAAIvgB,EAAI,EAAGA,EAAIyzC,EAAO30C,OAAQkB,IAAK,CACpC,IAAIoqC,EAAIqJ,EAAOzzC,GACf,GAAgB,iBAALoqC,EAAX,CAEA,IAAIjpC,EAAKipC,EAAEyqD,UACP0B,EAAK9iD,EAAOjzC,QAAQ4pC,EAAGpqC,EAAI,GAC/B,GAAI62F,EAAU11F,GACN01F,EAAU11F,KAAQipC,IAClBysD,EAAU11F,GAAM,UAFxB,CAMA,IAAI0Y,EAAK88E,EAASx1F,GACd41F,EAAyB,iBAAZl9E,EAAG7S,MAAoB,CAAC6S,EAAG7S,OAAS8vF,EAAUj9E,EAAG7S,OAClE+vF,EAAIviD,QAAQx0C,EAAI,EAAGwF,KAAKC,IAAI,EAAG8wF,EAAKv2F,IACpC+2F,EAAI32F,KAAKgqC,GACTysD,EAAU11F,GAAMipC,EAChBqJ,EAAO1uC,OAAO7F,MAAMu0C,EAAQsjD,IAEL,IAAnBl9E,EAAGrZ,QAAQ4pC,IACXvwB,EAAGzZ,KAAKgqC,KAEhB,IAAIrf,EAAM,EAAGE,EAAS,EAClBzI,EAAO,GACXixB,EAAOjtC,QAAQ,SAASunB,GACpB,GAAiB,kBAANA,EAAgB,CACvB,IAAI6Y,EAAQ7Y,EAAErtB,MAAM,MAChBkmC,EAAM9nC,OAAS,GACfmsB,EAAS2b,EAAMA,EAAM9nC,OAAS,GAAGA,OACjCisB,GAAO6b,EAAM9nC,OAAS,GAEtBmsB,GAAU8C,EAAEjvB,OAChB0jB,GAAQuL,OAEHA,EAAE3oB,MAGH2oB,EAAE5E,IAAM,CAAC4B,IAAKA,EAAKE,OAAQA,GAF3B8C,EAAE3oB,MAAQ,CAAC2lB,IAAKA,EAAKE,OAAQA,KAKzC,IAAIjE,EAAQ4C,EAAO4B,oBACfrC,EAAMS,EAAOxD,QAAQplB,QAAQgmB,EAAOxE,GAEpCw0E,EAAiB,IAAIC,EAAertE,GACpCstE,EAActtE,EAAOs/C,wBAA0Bt/C,EAAOxF,UAAUhhB,MACpE4zF,EAAeG,YAAYR,EAAU3vE,EAAM5hB,MAAO+jB,EAAK+tE,IAG3D54F,KAAK84F,cAAgB,SAASxtE,EAAQ6sE,GAClC,IAAI7vF,EAAOtI,KACX,GAAIsrB,EAAOs/C,uBACP,OAAOtiE,EAAK4vF,0BAA0B5sE,EAAQ6sE,GAElD7sE,EAAOujE,iBAAiB,WACpBvmF,EAAK4vF,0BAA0B5sE,EAAQ6sE,IACxC,KAAM,CAACrJ,WAAW,IAEjBxjE,EAAOotE,gBACPptE,EAAOotE,eAAeK,WAG9B/4F,KAAKg5F,UAAY,SAAS1tE,GACtB,IAAI82B,EAAQ92B,EAAOxD,QAAQm0B,MAAMkH,KAAO,GAExC,GADAf,EAAQA,EAAMhgD,MAAM,KAAKo4B,MACX,SAAV4nB,GAA8B,QAAVA,EAAiB,CACvB,QAAVA,GAAoB92B,EAAOxD,QAAQm0B,MAAMg9C,YACzC72C,EAAQ,QACZ,IAAIx5B,EAAI0C,EAAOwvB,oBACXziB,EAAQ/M,EAAOxD,QAAQqgC,SAASv/B,EAAE6D,KACjB,kBAAV4L,IACPA,EAAQA,EAAM,IAEdA,EAAM3R,YACuB,OAAzB2R,EAAM3R,UAAU,EAAG,GACnB07B,EAAQ,aACsB,QAAzB/pB,EAAM3R,UAAU,EAAG,GACxB07B,EAAQ,MACsB,QAAzB/pB,EAAM3R,UAAU,EAAG,KACxB07B,EAAQ,QAIpB,OAAOA,GAGXpiD,KAAKk5F,gBAAkB,SAAS5tE,GAC5B,IAAI82B,EAAQpiD,KAAKg5F,UAAU1tE,GACvB6tE,EAAS,CAAC/2C,GACV+zC,EAAan2F,KAAKm2F,WAKtB,OAJIA,EAAW/zC,IAAU+zC,EAAW/zC,GAAOg3C,eACvCD,EAAOr3F,KAAKlB,MAAMu4F,EAAQhD,EAAW/zC,GAAOg3C,eAEhDD,EAAOr3F,KAAK,KACLq3F,GAGXn5F,KAAKq5F,cAAgB,SAAS/tE,EAAQyQ,GAClC,IAAIzzB,EAAOtI,KACPyF,EAAS6lB,EAAOujE,iBAAiB,WACjC,OAAOvmF,EAAKgxF,0BAA0BhuE,EAAQyQ,IAC/C,KAAM,CAAC+yD,WAAW,IAGrB,OAFIrpF,GAAU6lB,EAAOotE,gBACjBptE,EAAOotE,eAAeK,UACnBtzF,GAGXzF,KAAKs5F,0BAA4B,SAAShuE,EAAQyQ,GAC9C,IAMIg8D,EANAvrE,EAASlB,EAAOwvB,oBAChBpT,EAAOpc,EAAOxD,QAAQoZ,QAAQ1U,EAAOC,KACrCs0B,EAASrZ,EAAKhhB,UAAU,EAAG8F,EAAOG,QAClCq0B,EAAQtZ,EAAKlhB,OAAOgG,EAAOG,QAE3BwpE,EAAan2F,KAAKm2F,WAQtB,OANAn2F,KAAKk5F,gBAAgB5tE,GAAQ1iB,KAAK,SAASw5C,GACvC,IAAIm3C,EAAWpD,EAAW/zC,GAG1B,OAFIm3C,IACAxB,EAAU/3F,KAAKw5F,oBAAoBD,EAAUx4C,EAAQC,MAChD+2C,GACV/3F,QACE+3F,OAEDh8D,IAAWA,EAAQ09D,UAEvBnuE,EAAOxD,QAAQ/a,IAAI2zC,aAAal0B,EAAOC,IACnCD,EAAOG,OAASorE,EAAQ2B,cAAcl5F,OACtCgsB,EAAOG,OAASorE,EAAQ4B,aAAan5F,QAGzCR,KAAKq3F,UAAUuC,IAAM7B,EAAQ8B,YAC7B75F,KAAKq3F,UAAUyC,IAAM/B,EAAQgC,WAC7B/5F,KAAKk4F,0BAA0B5sE,EAAQysE,EAAQrY,SAE/C1/E,KAAKq3F,UAAUuC,IAAM55F,KAAKq3F,UAAUyC,IAAM,MACnC,KAGX95F,KAAKw5F,oBAAsB,SAASQ,EAAaj5C,EAAQC,GACrD,IAAK,IAAIt/C,EAAIs4F,EAAYx5F,OAAQkB,KAAM,CACnC,IAAI23B,EAAI2gE,EAAYt4F,GACpB,KAAI23B,EAAE4gE,SAAY5gE,EAAE4gE,QAAQx2F,KAAKs9C,QAE7B1nB,EAAE6gE,OAAU7gE,EAAE6gE,MAAMz2F,KAAKu9C,MAExB3nB,EAAE4gE,SAAY5gE,EAAE6gE,QAOrB,OAJA7gE,EAAEwgE,YAAcxgE,EAAE4gE,QAAU5gE,EAAE4gE,QAAQ12F,KAAKw9C,GAAU,CAAC,IACtD1nB,EAAE0gE,WAAa1gE,EAAE6gE,MAAQ7gE,EAAE6gE,MAAM32F,KAAKy9C,GAAS,CAAC,IAChD3nB,EAAEqgE,cAAgBrgE,EAAE8gE,UAAY9gE,EAAE8gE,UAAU52F,KAAKw9C,GAAQ,GAAK,GAC9D1nB,EAAEsgE,aAAetgE,EAAE+gE,aAAe/gE,EAAE+gE,aAAa72F,KAAKy9C,GAAO,GAAK,GAC3D3nB,IAIfr5B,KAAKm2F,WAAa,GAClBn2F,KAAKo2F,eAAiB,GACtBp2F,KAAKq6F,SAAW,SAASd,EAAUn3C,GAC/B,IAAI+zC,EAAan2F,KAAKm2F,WAClBC,EAAiBp2F,KAAKo2F,eACtB9tF,EAAOtI,KAKX,SAASs6F,EAAWzmE,GAIhB,OAHIA,IAAQ,uBAAuBpwB,KAAKowB,KACpCA,EAAM,MAAQA,EAAM,KAEjBA,GAAO,GAElB,SAAS0mE,EAAcp8D,EAAI44D,EAAOr8C,GAY9B,OAXAvc,EAAKm8D,EAAWn8D,GAChB44D,EAAQuD,EAAWvD,GACfr8C,GACAvc,EAAK44D,EAAQ54D,EACTA,GAA2B,KAArBA,EAAGA,EAAG39B,OAAS,KACrB29B,GAAU,OAEdA,GAAU44D,EACN54D,GAAe,KAATA,EAAG,KACTA,EAAK,IAAMA,IAEZ,IAAI36B,OAAO26B,GAGtB,SAASq8D,EAAWnhE,GACXA,EAAE+oB,QACH/oB,EAAE+oB,MAAQA,GAAS,KACvBA,EAAQ/oB,EAAE+oB,MACL+zC,EAAW/zC,KACZ+zC,EAAW/zC,GAAS,GACpBg0C,EAAeh0C,GAAS,IAG5B,IAAI55C,EAAM4tF,EAAeh0C,GACzB,GAAI/oB,EAAE10B,KAAM,CACR,IAAI01B,EAAM7xB,EAAI6wB,EAAE10B,MACZ01B,GACA/xB,EAAKmyF,WAAWpgE,GACpB7xB,EAAI6wB,EAAE10B,MAAQ00B,EAElB88D,EAAW/zC,GAAOtgD,KAAKu3B,GAEnBA,EAAEqhE,aAAerhE,EAAEshE,WACdthE,EAAE09D,OAAS,MAAMtzF,KAAK41B,EAAEqhE,cACzBrhE,EAAE09D,MAAQ,OACd19D,EAAEshE,QAAUh3E,EAAKlB,aAAa4W,EAAEqhE,cAG/BrhE,EAAEshE,SAAYthE,EAAE09D,OAAU19D,EAAEuhE,YAAevhE,EAAEwhE,YAGlDxhE,EAAE4gE,QAAUM,EAAclhE,EAAEshE,QAASthE,EAAE09D,OAAO,GAC9C19D,EAAE8gE,UAAY,IAAI32F,OAAO61B,EAAEshE,QAAS,IAAI,GAExCthE,EAAE6gE,MAAQK,EAAclhE,EAAEuhE,WAAYvhE,EAAEwhE,UAAU,GAClDxhE,EAAE+gE,aAAe,IAAI52F,OAAO61B,EAAEuhE,WAAY,IAAI,IAvD7CrB,IACDA,EAAW,IAyDXA,GAAYA,EAAS7Z,QACrB8a,EAAWjB,GACN90F,MAAMoD,QAAQ0xF,IACnBA,EAASrxF,QAAQsyF,GAErBx6F,KAAKuyB,QAAQ,mBAAoB,CAAC6vB,MAAOA,KAE7CpiD,KAAKy6F,WAAa,SAASlB,EAAUn3C,GACjC,IAAI+zC,EAAan2F,KAAKm2F,WAClBC,EAAiBp2F,KAAKo2F,eAE1B,SAAS0E,EAAczhE,GACnB,IAAI0hE,EAAU3E,EAAe/8D,EAAE+oB,OAAOA,GACtC,GAAI24C,GAAWA,EAAQ1hE,EAAE10B,MAAO,QACrBo2F,EAAQ1hE,EAAE10B,MACjB,IAAI6D,EAAM2tF,EAAW98D,EAAE+oB,OAAOA,GAC1B1gD,EAAI8G,GAAOA,EAAItG,QAAQm3B,GACvB33B,GAAK,GACL8G,EAAI/B,OAAO/E,EAAG,IAGtB63F,EAAS7Z,QACTob,EAAcvB,GACT90F,MAAMoD,QAAQ0xF,IACnBA,EAASrxF,QAAQ4yF,IAEzB96F,KAAKg7F,iBAAmB,SAASt2F,GAC7BA,EAAMA,EAAIhC,QAAQ,MAAO,IACzB,IAEIi7B,EAFAia,EAAO,GAAImgD,EAAU,GACrB55D,EAAK,uDAET,MAAOR,EAAIQ,EAAG56B,KAAKmB,GAAM,CACrB,GAAIi5B,EAAE,GACF,IACIo6D,EAAUkD,KAAKC,MAAMv9D,EAAE,IACvBia,EAAK91C,KAAKi2F,GACZ,MAAO37E,IACX,GAAIuhB,EAAE,GACJo6D,EAAQrY,QAAU/hD,EAAE,GAAGj7B,QAAQ,QAAS,IACxCk1C,EAAK91C,KAAKi2F,GACVA,EAAU,OACP,CACH,IAAI/rF,EAAM2xB,EAAE,GAAItV,EAAMsV,EAAE,GACxB,GAAW,SAAP3xB,EAAgB,CAChB,IAAImvF,EAAU,0BACdpD,EAAQhB,MAAQoE,EAAQ53F,KAAK8kB,GAAK,GAClC0vE,EAAQ4C,QAAUQ,EAAQ53F,KAAK8kB,GAAK,GACpC0vE,EAAQ6C,WAAaO,EAAQ53F,KAAK8kB,GAAK,GACvC0vE,EAAQ8C,SAAWM,EAAQ53F,KAAK8kB,GAAK,OACvB,WAAPrc,GACP+rF,EAAQ2C,WAAaryE,EAAI3kB,MAAM,QAAQ,GAClCq0F,EAAQpzF,OACTozF,EAAQpzF,KAAO0jB,IAEnB0vE,EAAQ/rF,GAAOqc,GAI3B,OAAOuvB,GAEX53C,KAAKo7F,iBAAmB,SAASz2F,EAAM2mB,GACnC,IACIysE,EADA5B,EAAan2F,KAAKo2F,eAQtB,OANAp2F,KAAKk5F,gBAAgB5tE,GAAQ1iB,KAAK,SAASw5C,GACvC,IAAIm3C,EAAWpD,EAAW/zC,GAG1B,OAFIm3C,IACAxB,EAAUwB,EAAS50F,MACdozF,GACV/3F,MACI+3F,KAGZv2F,KAAK00F,EAAe50F,WAGvB,IAAIq3F,EAAiB,SAASrtE,GAC1B,GAAIA,EAAOotE,eACP,OAAOptE,EAAOotE,eAClBptE,EAAOotE,eAAiB14F,KACxBA,KAAKwjD,UAAYxjD,KAAKooC,SAASjjC,KAAKnF,MACpCA,KAAKq7F,mBAAqB13E,EAAKL,YAAYtjB,KAAK4wE,kBAAkBzrE,KAAKnF,OAAOojB,SAC9EpjB,KAAKs7F,iBAAmBt7F,KAAKu7F,gBAAgBp2F,KAAKnF,MAClDA,KAAKw7F,aAAex7F,KAAKy7F,YAAYt2F,KAAKnF,MAC1CA,KAAKiiC,OAAO3W,KAEhB,WACItrB,KAAKiiC,OAAS,SAAS3W,GACnBtrB,KAAK8E,MAAQ,EACb9E,KAAKizC,OAAS,GACdjzC,KAAKq4F,SAAW,GAChBr4F,KAAK07F,cAAgB,KACrB17F,KAAK27F,gBAAkB,KAEvB37F,KAAKsrB,OAASA,EACdtrB,KAAKsrB,OAAOrD,GAAG,SAAUjoB,KAAKwjD,WAC9BxjD,KAAKsrB,OAAOrD,GAAG,kBAAmBjoB,KAAKq7F,oBACvCr7F,KAAKsrB,OAAOrD,GAAG,gBAAiBjoB,KAAKs7F,kBACrCt7F,KAAKsrB,OAAOmW,SAASxZ,GAAG,YAAajoB,KAAKw7F,cAC1Cx7F,KAAKsrB,OAAO+4C,WAAWxiC,mBAAmB7hC,KAAK6lE,kBAEnD7lE,KAAKkiC,OAAS,WACVliC,KAAKq4F,SAASnwF,QAAQlI,KAAK47F,qBAAsB57F,MACjDA,KAAKizC,OAAS,KACdjzC,KAAKq4F,SAAW,KAChBr4F,KAAK27F,gBAAkB,KACvB37F,KAAKsrB,OAAOtP,eAAe,SAAUhc,KAAKwjD,WAC1CxjD,KAAKsrB,OAAOtP,eAAe,kBAAmBhc,KAAKq7F,oBACnDr7F,KAAKsrB,OAAOtP,eAAe,gBAAiBhc,KAAKs7F,kBACjDt7F,KAAKsrB,OAAOmW,SAASzlB,eAAe,YAAahc,KAAKw7F,cACtDx7F,KAAKsrB,OAAO+4C,WAAW1iC,sBAAsB3hC,KAAK6lE,iBAClD7lE,KAAKsrB,OAAOotE,eAAiB,KAC7B14F,KAAKsrB,OAAS,MAGlBtrB,KAAKooC,SAAW,SAASC,GACrB,IACIwzD,EAA8B,KAAnBxzD,EAAMnD,OAAO,GACxBp+B,EAAQuhC,EAAMvhC,MACd+jB,EAAMwd,EAAMxd,IACZ0gB,EAAWzkC,EAAM2lB,IACjBgf,EAAS5gB,EAAI4B,IACbq+B,EAAUrf,EAASF,EACnBgW,EAAU12B,EAAI8B,OAAS7lB,EAAM6lB,OAMjC,GAJIkvE,IACA/wC,GAAWA,EACXvJ,GAAWA,IAEVvhD,KAAK87F,WAAaD,EAAU,CAC7B,IAAItgF,EAAKvb,KAAK27F,gBACVI,EAAiBxgF,IAAOA,EAAG3S,KAAK,SAAS4f,GACzC,OAAO2iB,EAAc3iB,EAAE1hB,MAAOA,IAAU,GAAKqkC,EAAc3iB,EAAEqC,IAAKA,IAAQ,IAE9E,GAAIkxE,EACA,OAAO/7F,KAAKkiC,SAGpB,IADA,IAAI+Q,EAASjzC,KAAKizC,OACTvxC,EAAI,EAAGA,EAAIuxC,EAAOzyC,OAAQkB,IAAK,CACpC,IAAI8mB,EAAIyqB,EAAOvxC,GACX8mB,EAAEqC,IAAI4B,IAAM3lB,EAAM2lB,MAGlBovE,GAAY1wD,EAAcrkC,EAAO0hB,EAAE1hB,OAAS,GAAKqkC,EAActgB,EAAKrC,EAAEqC,KAAO,GAC7E7qB,KAAKg8F,YAAYxzE,GACjB9mB,MAIA8mB,EAAE1hB,MAAM2lB,KAAO8e,GAAY/iB,EAAE1hB,MAAM6lB,OAAS7lB,EAAM6lB,SAClDnE,EAAE1hB,MAAM6lB,QAAU40B,GAClB/4B,EAAEqC,IAAI4B,KAAO8e,GAAY/iB,EAAEqC,IAAI8B,QAAU7lB,EAAM6lB,SAC/CnE,EAAEqC,IAAI8B,QAAU40B,GAChB/4B,EAAE1hB,MAAM2lB,KAAO8e,IACf/iB,EAAE1hB,MAAM2lB,KAAOq+B,GACftiC,EAAEqC,IAAI4B,KAAO8e,IACb/iB,EAAEqC,IAAI4B,KAAOq+B,GAEb3f,EAAc3iB,EAAE1hB,MAAO0hB,EAAEqC,KAAO,GAChC7qB,KAAKg8F,YAAYxzE,KAEpByqB,EAAOzyC,QACRR,KAAKkiC,UAEbliC,KAAKi8F,mBAAqB,WACtB,IAAI1gF,EAAKvb,KAAK27F,gBACd,GAAKpgF,GAAOA,EAAG2gF,gBAAf,CAEAl8F,KAAK87F,WAAY,EAGjB,IAFA,IAAIh0E,EAAU9nB,KAAKsrB,OAAOxD,QACtB5D,EAAO4D,EAAQ8O,aAAarb,EAAG4gF,gBAC1Bz6F,EAAI6Z,EAAG/a,OAAQkB,KAAM,CAC1B,IAAIgnB,EAAQnN,EAAG7Z,GACf,GAAKgnB,EAAM0zE,OAAX,CAEA,IAAIpF,EAAMr0F,EAAQ05F,eAAe5E,YAAYvzE,EAAMwE,EAAM/nB,UACzDmnB,EAAQplB,QAAQgmB,EAAOsuE,IAE3Bh3F,KAAK87F,WAAY,IAErB97F,KAAKy7F,YAAc,SAASr/E,GACpBA,EAAEomB,UAAYpmB,EAAEomB,QAAQnZ,UACxBrpB,KAAKi8F,sBAEbj8F,KAAK4wE,kBAAoB,WACrB,GAAK5wE,KAAKsrB,OAAV,CAKA,IAHA,IAAIkiB,EAAOxtC,KAAKsrB,OAAOxF,UAAU0nB,KAC7B5gB,EAAS5sB,KAAKsrB,OAAOxF,UAAU8G,OAC/BpH,EAAUxlB,KAAKsrB,OAAOxF,UAAUN,UAC3B9jB,EAAI1B,KAAKizC,OAAOzyC,OAAQkB,KAC7B,IAAI1B,KAAKizC,OAAOvxC,GAAG06F,OAAnB,CAEA,IAAIE,EAAet8F,KAAKizC,OAAOvxC,GAAG2tB,SAASme,EAAK/gB,IAAK+gB,EAAK7gB,QACtD4vE,EAAiB/2E,GAAWxlB,KAAKizC,OAAOvxC,GAAG2tB,SAASzC,EAAOH,IAAKG,EAAOD,QAC3E,GAAI2vE,GAAgBC,EAChB,OAERv8F,KAAKkiC,WAETliC,KAAKu7F,gBAAkB,WACnBv7F,KAAKkiC,UAETliC,KAAK+4F,QAAU,SAASr2D,GACpB,IAAIv7B,EAAMnH,KAAKq4F,SAAS73F,OACpBsE,EAAQ9E,KAAK8E,OAAS49B,GAAO,GACjC59B,EAAQoC,KAAKM,IAAIN,KAAKC,IAAIrC,EAAO,GAAIqC,GACjCrC,GAASqC,IACTrC,EAAQ,GACZ9E,KAAKw8F,cAAc13F,GACL,IAAVA,GACA9E,KAAKkiC,UAEbliC,KAAKw8F,cAAgB,SAAS13F,GAC1B9E,KAAK07F,cAAgB,KACrB,IAAIngF,EAAKvb,KAAKq4F,SAASr4F,KAAK8E,OAK5B,GAJIyW,GACAvb,KAAKy8F,kBAAkBlhF,GAC3Bvb,KAAK8E,MAAQA,EACbyW,EAAKvb,KAAKq4F,SAASr4F,KAAK8E,OACnByW,GAAOA,EAAG/a,OAAf,CAIA,GADAR,KAAK27F,gBAAkBpgF,EAClBvb,KAAKsrB,OAAOs/C,uBAWb5qE,KAAKsrB,OAAOxF,UAAU6C,SAASpN,EAAG4gF,oBAXG,CACrC,IAAIluB,EAAMjuE,KAAKsrB,OAAO0uB,YACtBi0B,EAAI56B,cAAc93B,EAAG4gF,eAAepvD,SACpC,IAAK,IAAIrrC,EAAI6Z,EAAG/a,OAAQkB,KAChB6Z,EAAG2gF,iBAAmB3gF,EAAG7Z,GAAG06F,QAEhCnuB,EAAI36B,SAAS/3B,EAAG7Z,GAAGqrC,SAAS,GAE5BkhC,EAAIh7B,OAAO,IACXg7B,EAAI36B,SAAS26B,EAAIh7B,OAAO,GAAGlG,SAKnC/sC,KAAKsrB,OAAO+4C,WAAWxiC,mBAAmB7hC,KAAK6lE,mBAEnD7lE,KAAK64F,YAAc,SAASR,EAAUvxF,EAAO+jB,GAGzC,GAFK7qB,KAAK07F,gBACN17F,KAAK07F,cAAgB,KACpBrD,EAAS,GAAI,CACd,IAAIvsD,EAAIR,EAAMuB,WAAWhiB,EAAKA,GAC9B6xE,EAAa5wD,EAAEhlC,MAAOA,GACtB41F,EAAa5wD,EAAEjhB,IAAK/jB,GACpBuxF,EAAS,GAAK,CAACvsD,GACfusD,EAAS,GAAGvzF,MAAQ,EAGxB,IAAIpD,EAAI1B,KAAK8E,MACT2zF,EAAM,CAAC/2F,EAAI,EAAG,GACduxC,EAASjzC,KAAKizC,OAClBolD,EAASnwF,QAAQ,SAASqT,EAAIzW,GAG1B,IAFA,IAAI63F,EAAO38F,KAAK07F,cAAc52F,IAAUyW,EAE/B7Z,EAAI6Z,EAAG/a,OAAQkB,KAAM,CAC1B,IAAIoqC,EAAIvwB,EAAG7Z,GACPgnB,EAAQ4iB,EAAMuB,WAAWf,EAAEhlC,MAAOglC,EAAEjhB,KAAOihB,EAAEhlC,OACjD81F,EAAUl0E,EAAM5hB,MAAOA,GACvB81F,EAAUl0E,EAAMmC,IAAK/jB,GACrB4hB,EAAM/nB,SAAWmrC,EACjBpjB,EAAMm0E,QAAUF,EAChB1pD,EAAOnxC,KAAK4mB,GACRi0E,GAAQphF,EACRohF,EAAKzmD,QAAQxtB,GAEbi0E,EAAKj7F,GAAKgnB,EACVojB,EAAEgrD,WACFpuE,EAAM0zE,QAAS,EACfO,EAAKT,iBAAkB,GACfS,EAAKR,iBACbQ,EAAKR,eAAiBzzE,GAEzBi0E,EAAKR,iBACNQ,EAAKT,iBAAkB,GACvBS,IAASphF,IACTk9E,EAAI32F,KAAK66F,GACT38F,KAAK07F,cAAc52F,GAAS63F,GAEhC38F,KAAKy8F,kBAAkBE,IACxB38F,MAECy4F,EAAIj4F,OAAS,IACTR,KAAKq4F,SAAS73F,QACdi4F,EAAI32F,KAAK22F,EAAIhyF,OAAO,EAAG,GAAG,IAC9BzG,KAAKq4F,SAAS5xF,OAAO7F,MAAMZ,KAAKq4F,SAAUI,KAIlDz4F,KAAKy8F,kBAAoB,SAASlhF,GAC9B,IAAIuM,EAAU9nB,KAAKsrB,OAAOxD,QAC1BvM,EAAGrT,QAAQ,SAASwgB,GACVA,EAAMkrC,WACRlrC,EAAMkrC,SAAW9rC,EAAQ4N,UAAUhN,EAAO,qBAAsB,YAG5E1oB,KAAK47F,qBAAuB,SAASrgF,GACjC,IAAIuM,EAAU9nB,KAAKsrB,OAAOxD,QAC1BvM,EAAGrT,QAAQ,SAASwgB,GAChBZ,EAAQoO,aAAaxN,EAAMkrC,UAC3BlrC,EAAMkrC,SAAW,QAGzB5zD,KAAKg8F,YAAc,SAAStzE,GACxB,IAAIhnB,EAAIgnB,EAAMm0E,QAAQ36F,QAAQwmB,GAC9BA,EAAMm0E,QAAQp2F,OAAO/E,EAAG,GACxBA,EAAI1B,KAAKizC,OAAO/wC,QAAQwmB,GACxB1oB,KAAKizC,OAAOxsC,OAAO/E,EAAG,GACtB1B,KAAKsrB,OAAOxD,QAAQoO,aAAaxN,EAAMkrC,UAClClrC,EAAMm0E,QAAQr8F,SACfkB,EAAI1B,KAAKq4F,SAASn2F,QAAQwmB,EAAMm0E,UACtB,GAANn7F,GACA1B,KAAKq4F,SAAS5xF,OAAO/E,EAAG,GACvB1B,KAAKq4F,SAAS73F,QACfR,KAAKkiC,WAIjBliC,KAAK6lE,gBAAkB,IAAIvH,EAC3Bt+D,KAAK6lE,gBAAgBjG,SAAS,CAC1B,IAAO,SAASk9B,GACRn6F,EAAQ05F,gBAAkB15F,EAAQ05F,eAAehD,cAAcyD,IAInEA,EAAGpE,eAAeK,QAAQ,IAE9B,YAAa,SAAS+D,GAClBA,EAAGpE,eAAeK,SAAS,IAE/B,IAAO,SAAS+D,GACZA,EAAGpE,eAAex2D,UAEtB,OAAU,SAAS46D,GACf,OAAO,OAGhBt7F,KAAKm3F,EAAer3F,WAIvB,IAAIy7F,EAAgB,GACpBA,EAAc30D,SAAWmb,EAAOjiD,UAAU8mC,SAC1C20D,EAAclsE,YAAc,SAASpE,EAAKE,GACtC3sB,KAAKgH,IAAIylB,IAAMA,EACfzsB,KAAKgH,IAAI2lB,OAASA,GAEtBowE,EAAct0C,OAAS,SAASzhD,EAAKqhC,EAAOkc,GACxCvkD,KAAKukD,aAAeA,EACpBvkD,KAAKgH,IAAMA,EACXhH,KAAKooC,SAASC,IAGlB,IAAIu0D,EAAY,SAAS74C,EAAOkU,GACX,GAAblU,EAAMt3B,MACNs3B,EAAMp3B,QAAUsrC,EAAKtrC,QACzBo3B,EAAMt3B,KAAOwrC,EAAKxrC,KAGlBiwE,EAAe,SAAS34C,EAAOj9C,GAC3Bi9C,EAAMt3B,KAAO3lB,EAAM2lB,MACnBs3B,EAAMp3B,QAAU7lB,EAAM6lB,QAC1Bo3B,EAAMt3B,KAAO3lB,EAAM2lB,KAIvB5qB,EAAS,aAAauM,gBAAgB,uMAStCzL,EAAQ05F,eAAiB,IAAInG,EAG7B,IAAIlyB,EAASniE,EAAS,YAAYmiE,QAClC,WACIhkE,KAAK84F,cAAgB,SAASpZ,EAAS3jD,GACnC,OAAOp5B,EAAQ05F,eAAevD,cAAc94F,KAAM0/E,EAAS3jD,IAE/D/7B,KAAKg9F,cAAgB,SAASjhE,GAC1B,OAAOp5B,EAAQ05F,eAAehD,cAAcr5F,KAAM+7B,MAEvDv6B,KAAKwiE,EAAO1iE,aAIf+B,IAAIlD,OAAO,yBAAyB,CAAC,UAAU,UAAU,SAAS,uBAAuB,aAAa,YAAY,gBAAgB,eAAe,eAAgB,SAAS0B,EAAUc,EAASvC,GAC7L,aAEA,IAAIozF,EAAW3xF,EAAS,uBAAuB49E,gBAC3Czb,EAASniE,EAAS,aAAamiE,OAC/B14B,EAAQzpC,EAAS,YAAYypC,MAC7BxvB,EAAQja,EAAS,gBACjB8hB,EAAO9hB,EAAS,eAChB6hB,EAAM7hB,EAAS,cAEfo7F,EAAoB,SAAS3vF,GAC7B,IAAI0b,EAAW,IAAIwqE,EAASlmF,GAE5B0b,EAAS8gD,UAAY,EAErB,IAAIx+C,EAAS,IAAI04C,EAAOh7C,GAUxB,OARAsC,EAAOkgD,wBAAuB,GAC9BlgD,EAAO8gD,oBAAmB,GAC1B9gD,EAAOtC,SAAS65D,eAAc,GAC9Bv3D,EAAOtC,SAAS2iD,wBAAuB,GAEvCrgD,EAAO84C,cAAc84B,iBAAmB,EACxC5xE,EAAOu9C,sBAAuB,EAEvBv9C,GAGP6xE,EAAW,SAASpsF,GACpB,IAAIzD,EAAKoW,EAAIzY,cAAc,OACvBmyF,EAAQ,IAAIH,EAAkB3vF,GAE9ByD,GACAA,EAAWxC,YAAYjB,GAC3BA,EAAGgB,MAAMmB,QAAU,OACnB2tF,EAAMp0E,SAAS02D,QAAQpxE,MAAMke,OAAS,UACtC4wE,EAAMp0E,SAASkF,SAAS,oBAExBkvE,EAAMriE,UAAU,uBAAuB,GACvCqiE,EAAMriE,UAAU,YAAa,KAE7B,IAsBIsiE,EAtBAC,EAAO,aAEXF,EAAMh4E,MAAQk4E,EACdF,EAAMn0B,YAAa,EAEnBm0B,EAAMp0E,SAAS4M,aAAaimD,aAAeyhB,EAC3CF,EAAMp0E,SAAS4M,aAAa9mB,QAAQR,MAAM+V,QAAU,EAEpD+4E,EAAMp0E,SAAS8gD,UAAY,EAC3BszB,EAAMp0E,SAASC,uBAAwB,EAEvCm0E,EAAM5xB,wBAAuB,GAC7B4xB,EAAMt1E,QAAQisC,UAAU,IACxBqpC,EAAMt1E,QAAQksC,iBAAiB3L,MAAQ,uBAEvC+0C,EAAMn1E,GAAG,YAAa,SAAS7L,GAC3B,IAAIpV,EAAMoV,EAAE2Q,sBACZqwE,EAAMt3E,UAAUuH,eAAermB,GAC/Bu2F,EAAgBz2F,MAAM2lB,IAAM8wE,EAAgB1yE,IAAI4B,IAAMzlB,EAAIylB,IAC1DrQ,EAAEgU,SAIN,IAAIotE,EAAc,IAAIlyD,GAAO,EAAE,GAAG,EAAE8U,KAChCm9C,EAAkB,IAAIjyD,GAAO,EAAE,GAAG,EAAE8U,KACxCm9C,EAAgB16F,GAAKu6F,EAAMt1E,QAAQ4N,UAAU6nE,EAAiB,kBAAmB,YACjFH,EAAMK,iBAAmB,SAASp1E,GACzBA,EAEMm1E,EAAY36F,KACnBu6F,EAAMt1E,QAAQoO,aAAasnE,EAAY36F,IACvC26F,EAAY36F,GAAK,MAHjB26F,EAAY36F,GAAKu6F,EAAMt1E,QAAQ4N,UAAU8nE,EAAa,iBAAkB,aAMhFJ,EAAMK,kBAAiB,GACvBL,EAAMn1E,GAAG,YAAa,SAAS7L,GAC3B,GAAKihF,GAIL,GAAIA,EAAev5F,GAAKsY,EAAEtY,GAAKu5F,EAAevvE,GAAK1R,EAAE0R,EAArD,CAGAuvE,EAAiBjhF,EACjBihF,EAAe9sF,UAAY6sF,EAAMp0E,SAASzY,UAC1C,IAAIkc,EAAM4wE,EAAetwE,sBAAsBN,IAC3C+wE,EAAY12F,MAAM2lB,KAAOA,IACpB+wE,EAAY36F,IACbu6F,EAAMM,OAAOjxE,GACjBkxE,EAAelxE,UAZf4wE,EAAiBjhF,IAezBghF,EAAMp0E,SAASf,GAAG,eAAgB,WAC9B,GAAIo1E,IAA4C,GAA1BG,EAAY12F,MAAM2lB,IAAW,CAC/C4wE,EAAehrE,KAAO,KACtB,IAAI5F,EAAM4wE,EAAetwE,sBAAsBN,IAC1C+wE,EAAY36F,IACbu6F,EAAMM,OAAOjxE,GACjBkxE,EAAelxE,GAAK,MAG5B2wE,EAAMp0E,SAASf,GAAG,cAAe,WAC7B,IAAIwE,EAAM2wE,EAAMQ,SACZnuE,EAAI2tE,EAAMp0E,SAAS82D,WACnBrlC,EAAWhrB,EAAE3gB,QAAQsqE,WAAW3sD,EAAMgD,EAAEmP,OAAO+N,UAC/C8N,GAAYhrB,EAAEouE,eAEdpuE,EAAEouE,cACFn6E,EAAIhW,eAAe+hB,EAAEouE,aAAc,gBACvCpuE,EAAEouE,aAAepjD,EACbA,GACA/2B,EAAIjW,YAAYgtC,EAAU,mBAElC,IAAIqjD,EAAkB,WAAaH,GAAgB,IAC/CA,EAAiB,SAASlxE,EAAKsxE,GAC3BtxE,IAAQ+wE,EAAY12F,MAAM2lB,MAC1B+wE,EAAY12F,MAAM2lB,IAAM+wE,EAAY3yE,IAAI4B,IAAMA,EACzCsxE,GACDX,EAAMt1E,QAAQyB,MAAM,oBACxB6zE,EAAM7zE,MAAM,uBAGpB6zE,EAAMY,cAAgB,WAClB,OAAOR,EAAY12F,MAAM2lB,KAG7B3Q,EAAMN,YAAY4hF,EAAMxzE,UAAW,WAAYk0E,GAC/CV,EAAMn1E,GAAG,OAAQ61E,GACjBV,EAAMn1E,GAAG,kBAAmB61E,GAE5BV,EAAMt1E,QAAQ/a,IAAImlB,UAAY,WAC1B,OAAOkrE,EAAMn8E,KAAKzgB,QAEtB48F,EAAMt1E,QAAQ/a,IAAIm0B,QAAU,SAASx/B,GACjC,IAAIuf,EAAOm8E,EAAMn8E,KAAKvf,GACtB,MAAmB,iBAARuf,EACAA,EACHA,GAAQA,EAAKvY,OAAU,IAGnC,IAAIioD,EAAcysC,EAAMt1E,QAAQ6oC,YA4HhC,OA3HAA,EAAY/I,aAAe,SAASn7B,GAChC,IAAIxL,EAAOm8E,EAAMn8E,KAAKwL,GAClB0oB,EAAS,GACb,IAAKl0B,EACD,OAAOk0B,EACQ,iBAARl0B,IACPA,EAAO,CAACvY,MAAOuY,IACdA,EAAKg9E,UACNh9E,EAAKg9E,QAAUh9E,EAAKvY,OAASuY,EAAKtc,MAItC,IAFA,IACIsvC,EAAMrrB,EADNpH,GAAQ,EAEH9f,EAAI,EAAGA,EAAIuf,EAAKg9E,QAAQz9F,OAAQkB,IACrCknB,EAAI3H,EAAKg9E,QAAQv8F,GACjBuyC,EAAOhzB,EAAKi9E,UAAa,GAAKx8F,EAAK,EAAI,EACnC8f,IAASyyB,GACTkB,EAAOrzC,KAAK,CAAC4Z,KAAMuF,EAAKzT,YAAoBymC,EAAO,uBAAyB,IAAKvrC,MAAOkgB,IACxFpH,EAAOyyB,GAEPkB,EAAOA,EAAO30C,OAAS,GAAGkI,OAASkgB,EAI3C,GAAI3H,EAAKiiC,KAAM,CACX,IAAIi7C,EAAOf,EAAMp0E,SAASu3D,MAAME,cAAgB2c,EAAMp0E,SAAS8L,YAAYC,eACvEqpE,EAAWn9E,EAAKiiC,KAChBk7C,EAAS59F,OAASygB,EAAKg9E,QAAQz9F,OAAS29F,EAAO,IAC/CC,EAAWA,EAAS53E,OAAO,EAAG23E,EAAOl9E,EAAKg9E,QAAQz9F,OAAS,GAAK,KAEpE20C,EAAOrzC,KAAK,CAAC4Z,KAAM,mBAAoBhT,MAAO01F,IAElD,OAAOjpD,GAEXwb,EAAYzI,gBAAkBo1C,EAC9B3sC,EAAY7pD,MAAQw2F,EAEpBF,EAAMt1E,QAAQkuC,cAAgB,WAC1B,OAAOh2D,KAAKk2D,YAAc,GAG9BknC,EAAMhwE,gBAAkBgzB,IACxBg9C,EAAM9sE,QAAS,EACf8sE,EAAMiB,WAAY,EAClBjB,EAAMkB,YAAa,EAEnBlB,EAAMn8E,KAAO,GACbm8E,EAAMn2E,QAAU,SAAS2wB,GACrBwlD,EAAMv4C,SAASlhC,EAAK/B,aAAa,KAAMg2B,EAAKp3C,SAAU,GACtD48F,EAAMn8E,KAAO22B,GAAQ,GACrBwlD,EAAMM,OAAO,IAEjBN,EAAMl2E,QAAU,SAASuF,GACrB,OAAO2wE,EAAMn8E,KAAKwL,IAGtB2wE,EAAMQ,OAAS,WACX,OAAOL,EAAgBz2F,MAAM2lB,KAEjC2wE,EAAMM,OAAS,SAASh2D,GACpBA,EAAOxgC,KAAKC,IAAInH,KAAKs+F,WAAa,GAAK,EAAGp3F,KAAKM,IAAIxH,KAAKihB,KAAKzgB,OAAQknC,IACjE61D,EAAgBz2F,MAAM2lB,KAAOib,IAC7B01D,EAAMt3E,UAAUsC,iBAChBm1E,EAAgBz2F,MAAM2lB,IAAM8wE,EAAgB1yE,IAAI4B,IAAMib,GAAQ,EAC9D01D,EAAMt1E,QAAQyB,MAAM,oBACpB6zE,EAAM/uD,aAAa3G,GAAQ,EAAG,GAC1B01D,EAAM9sE,QACN8sE,EAAM7qE,QAAQ,YAI1B6qE,EAAMn1E,GAAG,kBAAmB,WACpBm1E,EAAM9sE,QACN8sE,EAAMM,OAAON,EAAMt3E,UAAU0nB,KAAK/gB,KACtC2wE,EAAMp0E,SAASsF,yBAGnB8uE,EAAMpsE,KAAO,WACThxB,KAAK4pB,UAAUtb,MAAMmB,QAAU,OAC/BzP,KAAKuyB,QAAQ,QACb6qE,EAAM9sE,QAAS,GAEnB8sE,EAAMrsE,KAAO,SAAS/pB,EAAK6tB,EAAY0pE,GACnC,IAAIjxF,EAAKtN,KAAK4pB,UACV40E,EAAev+F,OAAOmzB,YACtB8iC,EAAcj2D,OAAOizB,WACrBlK,EAAWhpB,KAAKgpB,SAChBy1E,EAAOz1E,EAAS8gD,UAAYj1C,EAAa,IACzC/K,EAAM9iB,EAAI8iB,IAAM9pB,KAAK0+F,YACrBC,EAAe70E,EAAM00E,EAAe,IAAMD,EAC1CI,GAAgB70E,EAAM+K,EAAa4pE,EAAOD,GAC1Cx1E,EAAS07D,gBAAkB56D,EAAM,EAAI9pB,KAAK0+F,YAC1CpxF,EAAGgB,MAAMwb,IAAM,GACfxc,EAAGgB,MAAM4b,OAASs0E,EAAe10E,EAAM,KACvCszE,EAAMiB,WAAY,IAElBv0E,GAAO+K,EACP7L,EAAS07D,gBAAkB8Z,EAAe10E,EAAM,GAAM+K,EACtDvnB,EAAGgB,MAAMwb,IAAMA,EAAM,KACrBxc,EAAGgB,MAAM4b,OAAS,GAClBkzE,EAAMiB,WAAY,GAGtB/wF,EAAGgB,MAAMmB,QAAU,GACnBzP,KAAKgpB,SAAS82D,WAAWtH,sBAEzB,IAAI5oE,EAAO5I,EAAI4I,KACXA,EAAOtC,EAAG0C,YAAckmD,IACxBtmD,EAAOsmD,EAAc5oD,EAAG0C,aAE5B1C,EAAGgB,MAAMsB,KAAOA,EAAO,KAEvB5P,KAAKuyB,QAAQ,QACb8qE,EAAiB,KACjBD,EAAM9sE,QAAS,GAGnB8sE,EAAMwB,kBAAoB,WACtB,OAAO5+F,KAAK0+F,YAAc1+F,KAAKgpB,SAAS6sD,SAAW71E,KAAK6+F,YAG5DzB,EAAMyB,WAAa,EACnBzB,EAAMsB,YAAc,EAEbtB,GAGX15E,EAAItV,gBAAgB,u4BA0CpBzL,EAAQw6F,SAAWA,IAInB95F,IAAIlD,OAAO,wBAAwB,CAAC,UAAU,UAAU,UAAW,SAAS0B,EAAUc,EAASvC,GAC/F,aAEAuC,EAAQm8F,WAAa,SAASx6F,EAAOy6F,EAAI79F,GACrC,IAAI89F,EAAY,EACZC,EAAW36F,EAAM9D,OACJ,IAAby+F,GACA/9F,IACJ,IAAK,IAAIQ,EAAI,EAAGA,EAAIu9F,EAAUv9F,IAC1Bq9F,EAAGz6F,EAAM5C,GAAI,SAAS+D,EAAQqjF,GAC1BkW,IACIA,IAAcC,GACd/9F,EAASuE,EAAQqjF,MAKjC,IAAIoW,EAAW,gCAEfv8F,EAAQw8F,4BAA8B,SAASj7E,EAAMld,EAAK/C,GACtDA,EAAQA,GAASi7F,EAEjB,IADA,IAAI/P,EAAM,GACDztF,EAAIsF,EAAI,EAAGtF,GAAK,EAAGA,IAAK,CAC7B,IAAIuC,EAAMR,KAAKygB,EAAKxiB,IAGhB,MAFAytF,EAAIrtF,KAAKoiB,EAAKxiB,IAItB,OAAOytF,EAAIxtE,UAAUnf,KAAK,KAG9BG,EAAQy8F,4BAA8B,SAASl7E,EAAMld,EAAK/C,GACtDA,EAAQA,GAASi7F,EAEjB,IADA,IAAI/P,EAAM,GACDztF,EAAIsF,EAAKtF,EAAIwiB,EAAK1jB,OAAQkB,IAAK,CACpC,IAAIuC,EAAMR,KAAKygB,EAAKxiB,IAGhB,MAFAytF,EAAIrtF,KAAKoiB,EAAKxiB,IAItB,OAAOytF,GAGXxsF,EAAQ08F,oBAAsB,SAAU/zE,GACpC,IAEIgrB,EAFAtvC,EAAMskB,EAAOwvB,oBACbpT,EAAOpc,EAAOxD,QAAQoZ,QAAQl6B,EAAIylB,KAUtC,OARAnB,EAAOg0E,WAAWp3F,QAAQ,SAASq3F,GAC3BA,EAAUC,mBACVD,EAAUC,kBAAkBt3F,QAAQ,SAASu3F,IACpCnpD,GAAUmpD,IACXnpD,EAASt2C,KAAKm/F,4BAA4Bz3D,EAAM1gC,EAAI2lB,OAAQ8yE,KAClEt6F,KAAKnF,QAEbmF,KAAKnF,OACAs2C,GAAUt2C,KAAKm/F,4BAA4Bz3D,EAAM1gC,EAAI2lB,WAKhEtpB,IAAIlD,OAAO,mBAAmB,CAAC,UAAU,UAAU,SAAS,4BAA4B,yBAAyB,wBAAwB,gBAAgB,eAAe,cAAc,gBAAiB,SAAS0B,EAAUc,EAASvC,GACnO,aAEA,IAAIk+D,EAAcz8D,EAAS,2BAA2By8D,YAClD6+B,EAAWt7F,EAAS,wBAAwBs7F,SAC5CuC,EAAO79F,EAAS,uBAEhB8hB,GADQ9hB,EAAS,eACVA,EAAS,eAChB6hB,EAAM7hB,EAAS,aACfw6F,EAAiBx6F,EAAS,cAAcw6F,eAExCsD,EAAe,WACf3/F,KAAK4/F,YAAa,EAClB5/F,KAAKs+F,YAAa,EAClBt+F,KAAK6/F,YAAa,EAClB7/F,KAAK8/F,oBAAsB,EAC3B9/F,KAAK6lE,gBAAkB,IAAIvH,EAC3Bt+D,KAAK6lE,gBAAgBjG,SAAS5/D,KAAKyhC,UAEnCzhC,KAAK+/F,aAAe//F,KAAK+/F,aAAa56F,KAAKnF,MAC3CA,KAAKooF,eAAiBpoF,KAAKooF,eAAejjF,KAAKnF,MAC/CA,KAAKggG,kBAAoBhgG,KAAKggG,kBAAkB76F,KAAKnF,MACrDA,KAAKigG,mBAAqBjgG,KAAKigG,mBAAmB96F,KAAKnF,MAEvDA,KAAKkgG,YAAcv8E,EAAKL,YAAY,WAChCtjB,KAAKmgG,mBAAkB,IACzBh7F,KAAKnF,OAEPA,KAAKogG,aAAez8E,EAAKL,YAAYtjB,KAAKqgG,iBAAiBl7F,KAAKnF,MAAO,MAG3E,WAEIA,KAAKywB,MAAQ,WAUT,OATAzwB,KAAKo9F,MAAQ,IAAID,EAASnyF,SAAS8E,MAAQ9E,SAASkC,iBACpDlN,KAAKo9F,MAAMn1E,GAAG,QAAS,SAAS7L,GAC5Bpc,KAAKsgG,cACLlkF,EAAEgU,QACJjrB,KAAKnF,OACPA,KAAKo9F,MAAMh4E,MAAQplB,KAAKsrB,OAAOlG,MAAMjgB,KAAKnF,KAAKsrB,QAC/CtrB,KAAKo9F,MAAMn1E,GAAG,OAAQjoB,KAAKogG,aAAaj7F,KAAK,KAAM,OACnDnF,KAAKo9F,MAAMn1E,GAAG,SAAUjoB,KAAKogG,aAAaj7F,KAAK,KAAM,OACrDnF,KAAKo9F,MAAMn1E,GAAG,oBAAqBjoB,KAAKogG,aAAaj7F,KAAK,KAAM,OACzDnF,KAAKo9F,OAGhBp9F,KAAKugG,SAAW,WACZ,OAAOvgG,KAAKo9F,OAASp9F,KAAKywB,SAG9BzwB,KAAKwgG,UAAY,SAASl1E,EAAQgrB,EAAQmqD,GACjCzgG,KAAKo9F,OACNp9F,KAAKywB,QAEhBzwB,KAAKo9F,MAAMkB,WAAat+F,KAAKs+F,WAEtBt+F,KAAKo9F,MAAMn2E,QAAQjnB,KAAK0gG,YAAYC,UAEpCr1E,EAAO+4C,WAAWxiC,mBAAmB7hC,KAAK6lE,iBAE1C,IAAI78C,EAAWsC,EAAOtC,SAEtB,GADAhpB,KAAKo9F,MAAMM,OAAO19F,KAAKs+F,WAAa,GAAK,GACpCmC,EAeMA,IAAsBnqD,GAC7Bt2C,KAAKkiC,aAhBe,CACpBliC,KAAKo9F,MAAMj1B,SAAS78C,EAAO+8C,YAC3BroE,KAAKo9F,MAAM70B,YAAYj9C,EAAOg9C,eAE9B,IAAIzzC,EAAa7L,EAAS8L,YAAYD,WAElC7tB,EAAMgiB,EAAS4M,aAAaumD,iBAAiBn8E,KAAKsC,MAAM,GAC5D0E,EAAI4I,MAAQ5P,KAAKo9F,MAAMwB,oBAEvB,IAAIj1E,EAAO2B,EAAO1B,UAAUC,wBAC5B7iB,EAAI8iB,KAAOH,EAAKG,IAAMd,EAAS8L,YAAYhS,OAC3C9b,EAAI4I,MAAQ+Z,EAAK/Z,KAAO0b,EAAOtC,SAASxY,WACxCxJ,EAAI4I,MAAQoZ,EAAS0rD,YAErB10E,KAAKo9F,MAAMrsE,KAAK/pB,EAAK6tB,KAM7B70B,KAAKkiC,OAAS,WACVliC,KAAKsrB,OAAO+4C,WAAW1iC,sBAAsB3hC,KAAK6lE,iBAClD7lE,KAAKsrB,OAAOoP,IAAI,kBAAmB16B,KAAKooF,gBACxCpoF,KAAKsrB,OAAOoP,IAAI,OAAQ16B,KAAK+/F,cAC7B//F,KAAKsrB,OAAOoP,IAAI,YAAa16B,KAAKggG,mBAClChgG,KAAKsrB,OAAOoP,IAAI,aAAc16B,KAAKigG,oBACnCjgG,KAAKkgG,YAAY/8E,SACjBnjB,KAAK4gG,iBAEL5gG,KAAK8/F,qBAAuB,EACxB9/F,KAAKo9F,OAASp9F,KAAKo9F,MAAM9sE,QACzBtwB,KAAKo9F,MAAMpsE,OAEXhxB,KAAKsC,MACLtC,KAAKsC,KAAK4/B,SACdliC,KAAK6gG,WAAY,EACjB7gG,KAAK0gG,YAAc1gG,KAAKsC,KAAO,MAGnCtC,KAAKooF,eAAiB,SAAShsE,GAC3B,IAAIoQ,EAASxsB,KAAKsrB,OAAOxF,UAAU0nB,MAC/BhhB,EAAOC,KAAOzsB,KAAKsC,KAAKmqB,KAAOD,EAAOG,OAAS3sB,KAAKsC,KAAKqqB,SACzD3sB,KAAKkiC,SAELliC,KAAK6gG,UACL7gG,KAAKkgG,YAAY98E,WAEjBpjB,KAAKkiC,UAGbliC,KAAK+/F,aAAe,SAAS3jF,GACzB,IAAI9O,EAAKtC,SAASga,cACdd,EAAOlkB,KAAKsrB,OAAOlB,UAAUjB,aAC7B23E,EAAc1kF,EAAE2kF,eAAiB/gG,KAAKghG,aAAehhG,KAAKghG,YAAY3xE,SAASjT,EAAE2kF,eACjFn3E,EAAY5pB,KAAKo9F,OAASp9F,KAAKo9F,MAAMxzE,UACrCtc,GAAM4W,GAAQ5W,EAAGyD,YAAc6Y,GAAck3E,GAC1CxzF,GAAMtN,KAAKghG,aAAe5kF,EAAE2kF,eAAiB78E,GAEhDlkB,KAAKkiC,UAIbliC,KAAKggG,kBAAoB,SAAS5jF,GAC9Bpc,KAAKkiC,UAGTliC,KAAKigG,mBAAqB,SAAS7jF,GAC/Bpc,KAAKkiC,UAGTliC,KAAKihG,KAAO,SAASC,GACjB,IAAIz0E,EAAMzsB,KAAKo9F,MAAMQ,SACjBz2F,EAAMnH,KAAKo9F,MAAMt1E,QAAQoK,YAAc,EAE3C,OAAOgvE,GACH,IAAK,KAAMz0E,EAAMA,GAAO,EAAItlB,EAAMslB,EAAM,EAAG,MAC3C,IAAK,OAAQA,EAAMA,GAAOtlB,GAAO,EAAIslB,EAAM,EAAG,MAC9C,IAAK,QAASA,EAAM,EAAG,MACvB,IAAK,MAAOA,EAAMtlB,EAAK,MAG3BnH,KAAKo9F,MAAMM,OAAOjxE,IAGtBzsB,KAAKsgG,YAAc,SAASr/E,EAAM8a,GAG9B,GAFK9a,IACDA,EAAOjhB,KAAKo9F,MAAMl2E,QAAQlnB,KAAKo9F,MAAMQ,YACpC38E,EACD,OAAO,EAEX,GAAIA,EAAKs+E,WAAat+E,EAAKs+E,UAAUe,YACjCr/E,EAAKs+E,UAAUe,YAAYtgG,KAAKsrB,OAAQrK,OACrC,CACH,GAAIjhB,KAAK0gG,YAAYS,WAEjB,IADA,IACgBz4E,EADZuqB,EAASjzC,KAAKsrB,OAAOxF,UAAUq7C,eAC1Bz/D,EAAI,EAAUgnB,EAAQuqB,EAAOvxC,GAAIA,IACtCgnB,EAAM5hB,MAAM6lB,QAAU3sB,KAAK0gG,YAAYS,WAAW3gG,OAClDR,KAAKsrB,OAAOxD,QAAQvgB,OAAOmhB,GAG/BzH,EAAK82E,QACLsE,EAAevD,cAAc94F,KAAKsrB,OAAQrK,EAAK82E,SAE/C/3F,KAAKsrB,OAAO7E,YAAY,eAAgBxF,EAAKvY,OAASuY,GAE9DjhB,KAAKkiC,UAITliC,KAAKyhC,SAAW,CACZ,GAAM,SAASnW,GAAUA,EAAOi0E,UAAU0B,KAAK,OAC/C,KAAQ,SAAS31E,GAAUA,EAAOi0E,UAAU0B,KAAK,SACjD,oBAAqB,SAAS31E,GAAUA,EAAOi0E,UAAU0B,KAAK,UAC9D,qBAAsB,SAAS31E,GAAUA,EAAOi0E,UAAU0B,KAAK,QAE/D,IAAO,SAAS31E,GAAUA,EAAOi0E,UAAUr9D,UAC3C,OAAU,SAAS5W,GAAU,OAAOA,EAAOi0E,UAAUe,eACrD,eAAgB,SAASh1E,GAAUA,EAAOi0E,UAAUe,YAAY,KAAM,CAACc,cAAc,KACrF,IAAO,SAAS91E,GACZ,IAAI7lB,EAAS6lB,EAAOi0E,UAAUe,cAC9B,GAAK76F,GAAW6lB,EAAOotE,eAGnB,OAAOjzF,EAFP6lB,EAAOi0E,UAAU0B,KAAK,SAK9B,OAAU,SAAS31E,GAAUA,EAAOi0E,UAAUnC,MAAM76B,cACpD,SAAY,SAASj3C,GAAUA,EAAOi0E,UAAUnC,MAAMh7B,iBAG1DpiE,KAAKqhG,kBAAoB,SAAS/1E,EAAQpqB,GACtC,IAAI4mB,EAAUwD,EAAOy8C,aACjB/gE,EAAMskB,EAAOwvB,oBAEbxE,EAASopD,EAAKL,oBAAoB/zE,GAEtCtrB,KAAKsC,KAAOwlB,EAAQ/a,IAAI2gC,aAAa1mC,EAAIylB,IAAKzlB,EAAI2lB,OAAS2pB,EAAO91C,QAClER,KAAKsC,KAAKiiD,cAAe,EAEzB,IAAI1hC,EAAU,GACVy+E,EAAQh2E,EAAOg0E,WAAW9+F,OAY9B,OAXA8qB,EAAOg0E,WAAWp3F,QAAQ,SAASq3F,EAAW79F,GAC1C69F,EAAUx8C,eAAez3B,EAAQxD,EAAS9gB,EAAKsvC,EAAQ,SAASwyC,EAAKyY,IAC5DzY,GAAOyY,IACR1+E,EAAUA,EAAQnd,OAAO67F,IAC7BrgG,EAAS,KAAM,CACXo1C,OAAQopD,EAAKL,oBAAoB/zE,GACjCzI,QAASA,EACT2+E,SAAuB,MAAVF,SAIlB,GAGXthG,KAAKyhG,UAAY,SAASn2E,GAClBtrB,KAAKsrB,QACLtrB,KAAKkiC,SAETliC,KAAK6gG,WAAY,EAEjB7gG,KAAKsrB,OAASA,EACVA,EAAOi0E,WAAav/F,OAChBsrB,EAAOi0E,WACPj0E,EAAOi0E,UAAUr9D,SACrB5W,EAAOi0E,UAAYv/F,MAGvBsrB,EAAOrD,GAAG,kBAAmBjoB,KAAKooF,gBAClC98D,EAAOrD,GAAG,OAAQjoB,KAAK+/F,cACvBz0E,EAAOrD,GAAG,YAAajoB,KAAKggG,mBAC5B10E,EAAOrD,GAAG,aAAcjoB,KAAKigG,oBAE7BjgG,KAAKmgG,qBAGTngG,KAAKmgG,kBAAoB,SAASM,GAC9B,GAAIA,GAAqBzgG,KAAKsC,MAAQtC,KAAK0gG,YAAa,CACpD,IAAI15F,EAAMhH,KAAKsrB,OAAOwvB,oBAClBxE,EAASt2C,KAAKsrB,OAAOxD,QAAQ8O,aAAa,CAAC9vB,MAAO9G,KAAKsC,KAAMuoB,IAAK7jB,IACtE,GAAIsvC,GAAUt2C,KAAK0gG,YAAYS,WAC3B,OAEJ,OADAnhG,KAAK0gG,YAAYgB,UAAUprD,GACtBt2C,KAAK0gG,YAAYC,SAASngG,OAES,GAApCR,KAAK0gG,YAAYC,SAASngG,QAC3BR,KAAK0gG,YAAYC,SAAS,GAAGj4F,OAAS4tC,GACrCt2C,KAAK0gG,YAAYC,SAAS,GAAG5I,aAEjC/3F,KAAKwgG,UAAUxgG,KAAKsrB,OAAQgrB,EAAQmqD,GADzBzgG,KAAKkiC,SAJLliC,KAAKkiC,SAQpB,IAAIwxD,EAAM1zF,KAAK8/F,oBACf9/F,KAAKqhG,kBAAkBrhG,KAAKsrB,OAAQ,SAASw9D,EAAKyY,GAC9C,IAAII,EAAmB,WACnB,GAAKJ,EAAQC,SACb,OAAOxhG,KAAKkiC,UACd/8B,KAAKnF,MAEHs2C,EAASirD,EAAQjrD,OACjBzzB,EAAU0+E,GAAWA,EAAQ1+E,QAEjC,IAAKA,IAAYA,EAAQriB,OACrB,OAAOmhG,IACX,GAAuC,IAAnCrrD,EAAOp0C,QAAQq/F,EAAQjrD,SAAiBo9C,GAAO1zF,KAAK8/F,oBAAxD,CAGA9/F,KAAK0gG,YAAc,IAAIkB,EAAa/+E,GAEhC7iB,KAAK6/F,aACL7/F,KAAK0gG,YAAYb,YAAa,GAElC7/F,KAAK0gG,YAAYgB,UAAUprD,GAC3B,IAAIqqD,EAAW3gG,KAAK0gG,YAAYC,SAChC,OAAKA,EAASngG,SAES,GAAnBmgG,EAASngG,QAAemgG,EAAS,GAAGj4F,OAAS4tC,GAAWqqD,EAAS,GAAG5I,SAEpE/3F,KAAK4/F,YAAiC,GAAnBe,EAASngG,QAAe+gG,EAAQC,SAC5CxhG,KAAKsgG,YAAYK,EAAS,SAErC3gG,KAAKwgG,UAAUxgG,KAAKsrB,OAAQgrB,EAAQmqD,GANzBkB,MAObx8F,KAAKnF,QAGXA,KAAKmgC,kBAAoB,WACrBngC,KAAKsrB,OAAO84C,cAAcjkC,qBAG9BngC,KAAKqgG,iBAAmB,WACpB,IAAIjD,EAAQp9F,KAAKo9F,MACbt/D,EAAMs/D,EAAMn8E,KACZw5B,EAAW3c,IAAQA,EAAIs/D,EAAMY,kBAAoBlgE,EAAIs/D,EAAMQ,WAC3D7wF,EAAM,KACV,OAAK0tC,GAAaz6C,KAAKsrB,QAAWtrB,KAAKo9F,MAAM9sE,QAE7CtwB,KAAKsrB,OAAOg0E,WAAW12F,KAAK,SAAS22F,GAGjC,OAFIA,EAAUsC,gBACV90F,EAAMwyF,EAAUsC,cAAcpnD,IAC3B1tC,IAENA,IACDA,EAAM0tC,GAEQ,iBAAP1tC,IACPA,EAAM,CAAC+0F,QAAS/0F,IACfA,IAASA,EAAIg1F,SAAWh1F,EAAI+0F,cAEjC9hG,KAAKgiG,eAAej1F,GADT/M,KAAK4gG,kBAZL5gG,KAAK4gG,kBAgBpB5gG,KAAKgiG,eAAiB,SAASz9F,GACtBvE,KAAKghG,cACNhhG,KAAKghG,YAAct9E,EAAIzY,cAAc,OACrCjL,KAAKghG,YAAYxzF,UAAY,8BAC7BxN,KAAKghG,YAAY1yF,MAAM2zF,OAAS,EAChCjiG,KAAKghG,YAAY1yF,MAAM4zF,cAAgB,OACvCliG,KAAKghG,YAAYmB,UAAY,EAC7BniG,KAAKghG,YAAYoB,OAASpiG,KAAK+/F,aAAa56F,KAAKnF,MACjDA,KAAKghG,YAAYqB,QAAUriG,KAAKsiG,eAAen9F,KAAKnF,OAGxD,IAAIghG,EAAchhG,KAAKghG,YACnBz8F,EAAKw9F,QACLf,EAAYlwF,UAAYvM,EAAKw9F,QACtBx9F,EAAKu9F,UACZd,EAAY7vF,YAAc5M,EAAKu9F,SAG9Bd,EAAYjwF,YACb/F,SAAS8E,KAAKvB,YAAYyyF,GAC9B,IAAI5D,EAAQp9F,KAAKo9F,MACbzzE,EAAOyzE,EAAMxzE,UAAUC,wBAC3Bm3E,EAAY1yF,MAAMwb,IAAMszE,EAAMxzE,UAAUtb,MAAMwb,IAC9Ck3E,EAAY1yF,MAAM4b,OAASkzE,EAAMxzE,UAAUtb,MAAM4b,OAE7CjqB,OAAOizB,WAAavJ,EAAKiB,MAAQ,KACjCo2E,EAAY1yF,MAAMsc,MAAQ3qB,OAAOizB,WAAavJ,EAAK/Z,KAAO,KAC1DoxF,EAAY1yF,MAAMsB,KAAO,KAEzBoxF,EAAY1yF,MAAMsB,KAAQ+Z,EAAKiB,MAAQ,EAAK,KAC5Co2E,EAAY1yF,MAAMsc,MAAQ,IAE9Bo2E,EAAY1yF,MAAMmB,QAAU,SAGhCzP,KAAK4gG,eAAiB,WAElB,GADA5gG,KAAKogG,aAAaj9E,SACbnjB,KAAKghG,YAAV,CACA,IAAI1zF,EAAKtN,KAAKghG,YACThhG,KAAKsrB,OAAOvG,aAAe/Z,SAASga,eAAiB1X,GACtDtN,KAAKsrB,OAAOlG,QAChBplB,KAAKghG,YAAc,KACf1zF,EAAGyD,YACHzD,EAAGyD,WAAWb,YAAY5C,KAGlCtN,KAAKsiG,eAAiB,SAASlmF,GAC3B,IAAIzV,EAAIyV,EAAE/W,OACV,MAAOsB,GAAKA,GAAK3G,KAAKghG,YAAa,CAC/B,GAAkB,KAAdr6F,EAAE47F,UAAmB57F,EAAEiI,KAAM,CAC7BjI,EAAEgI,IAAM,aACRhI,EAAEtB,OAAS,SACX,MAEJsB,EAAIA,EAAEoK,eAIfvP,KAAKm+F,EAAar+F,WAErBq+F,EAAa6C,aAAe,CACxB79F,KAAM,oBACNpB,KAAM,SAAS+nB,GACNA,EAAOi0E,YACRj0E,EAAOi0E,UAAY,IAAII,GAC3Br0E,EAAOi0E,UAAUK,YAAa,EAC9Bt0E,EAAOi0E,UAAUjB,YAAa,EAC9BhzE,EAAOi0E,UAAUkC,UAAUn2E,GAC3BA,EAAOi0E,UAAUp/D,qBAErBw+B,QAAS,yCAGb,IAAIijC,EAAe,SAASt9F,EAAO68F,GAC/BnhG,KAAK89B,IAAMx5B,EACXtE,KAAK2gG,SAAWr8F,EAChBtE,KAAKmhG,WAAaA,GAAc,GAChCnhG,KAAK6/F,YAAa,IAEtB,WACI7/F,KAAK0hG,UAAY,SAASh9F,GACtB,GAAIA,EAAIlE,OAASR,KAAKmhG,YAAsD,IAAxCz8F,EAAIuE,YAAYjJ,KAAKmhG,WAAY,GACjE,IAAIt+E,EAAU7iB,KAAK2gG,cAEf99E,EAAU7iB,KAAK89B,IAEvB99B,KAAKmhG,WAAaz8F,EAClBme,EAAU7iB,KAAKyiG,kBAAkB5/E,EAAS7iB,KAAKmhG,YAC/Ct+E,EAAUA,EAAQqmC,KAAK,SAASviD,EAAGwiD,GAC/B,OAAOA,EAAE02C,WAAal5F,EAAEk5F,YAAc12C,EAAElG,MAAQt8C,EAAEs8C,QAEtD,IAAIuiB,EAAO,KACX3iD,EAAUA,EAAQpa,OAAO,SAASlE,GAC9B,IAAI05F,EAAU15F,EAAKwzF,SAAWxzF,EAAK05F,SAAW15F,EAAKmE,MACnD,OAAIu1F,IAAYz4B,IAChBA,EAAOy4B,GACA,KAGXj+F,KAAK2gG,SAAW99E,GAEpB7iB,KAAKyiG,kBAAoB,SAASC,EAAO1lC,GACrC,IAAIukC,EAAU,GACVoB,EAAQ3lC,EAAOn/B,cACf+kE,EAAQ5lC,EAAOtkD,cACnBmqF,EAAM,IAAK,IAAWt+F,EAAP7C,EAAI,EAAS6C,EAAOm+F,EAAMhhG,GAAIA,IAAK,CAC9C,IAAIu8F,EAAU15F,EAAKmE,OAASnE,EAAK05F,SAAW15F,EAAKwzF,QACjD,GAAKkG,EAAL,CACA,IAGIn5F,EAAOmqB,EAHPlrB,GAAa,EACbm6F,EAAY,EACZ4E,EAAU,EAGd,GAAI9iG,KAAK6/F,YACL,GAAI7iC,IAAWihC,EAAQz3E,OAAO,EAAGw2C,EAAOx8D,QACpC,SAASqiG,OAEb,IAAK,IAAIrlE,EAAI,EAAGA,EAAIw/B,EAAOx8D,OAAQg9B,IAAK,CACpC,IAAIy6D,EAAKgG,EAAQ/7F,QAAQ0gG,EAAMplE,GAAIz5B,EAAY,GAC3Cg/F,EAAK9E,EAAQ/7F,QAAQygG,EAAMnlE,GAAIz5B,EAAY,GAE/C,GADAe,EAASmzF,GAAM,IAAO8K,EAAK,GAAK9K,EAAK8K,GAAM9K,EAAW8K,EAClDj+F,EAAQ,EACR,SAAS+9F,EACb5zE,EAAWnqB,EAAQf,EAAY,EAC3BkrB,EAAW,KACQ,IAAflrB,IACA++F,GAAW,IACfA,GAAW7zE,GAEfivE,GAAyB,GAAKp5F,EAC9Bf,EAAYe,EAGpBP,EAAK25F,UAAYA,EACjB35F,EAAKs7F,WAAaiD,EAAU,EAAI,EAChCv+F,EAAK0+C,OAAS1+C,EAAK0+C,OAAS,GAAK6/C,EACjCvB,EAAQz/F,KAAKyC,IAEjB,OAAOg9F,KAEZ//F,KAAKogG,EAAatgG,WAErBqB,EAAQg9F,aAAeA,EACvBh9F,EAAQi/F,aAAeA,IAIvBv+F,IAAIlD,OAAO,kCAAkC,CAAC,UAAU,UAAU,SAAS,aAAc,SAAS0B,EAAUc,EAASvC,GACjH,IAAIkrC,EAAQzpC,EAAS,YAAYypC,MAE7ByJ,EAAa,iDAEjB,SAASiuD,EAAaj2F,EAAK/F,GACvB,IAAIi8F,EAAal2F,EAAI6pB,aAAa0U,EAAMuB,WAAW,CAACpgB,IAAK,EAAGE,OAAO,GAAI3lB,IACvE,OAAOi8F,EAAW7gG,MAAM2yC,GAAYv0C,OAAS,EAEjD,SAAS0iG,EAAan2F,EAAK/F,GACvB,IAAIm8F,EAAYH,EAAaj2F,EAAK/F,GAC9ByoF,EAAQ1iF,EAAI+3C,WAAW1iD,MAAM2yC,GAC7BquD,EAAa/hG,OAAO6I,OAAO,MAE3Bm5F,EAAc5T,EAAM0T,GAaxB,OAXA1T,EAAMvnF,QAAQ,SAAS86C,EAAMiH,GACzB,GAAKjH,GAAQA,IAASqgD,EAAtB,CAEA,IAAIp0E,EAAW/nB,KAAKgC,IAAIi6F,EAAYl5C,GAChChH,EAAQwsC,EAAMjvF,OAASyuB,EACvBm0E,EAAWpgD,GACXogD,EAAWpgD,GAAQ97C,KAAKC,IAAI87C,EAAOmgD,EAAWpgD,IAE9CogD,EAAWpgD,GAAQC,KAGpBmgD,EAGXzgG,EAAQogD,eAAiB,SAASz3B,EAAQxD,EAAS9gB,EAAKsvC,EAAQp1C,GAC5D,IAAIoiG,EAAYJ,EAAap7E,EAAS9gB,EAAKsvC,GACvCw+C,EAAWzzF,OAAO4I,KAAKq5F,GAC3BpiG,EAAS,KAAM4zF,EAAStsF,IAAI,SAASw6C,GACjC,MAAO,CACHi7C,QAASj7C,EACTt6C,MAAOs6C,EACPC,MAAOqgD,EAAUtgD,GACjBE,KAAM,eAMtB7/C,IAAIlD,OAAO,yBAAyB,CAAC,UAAU,UAAU,SAAS,eAAe,mBAAmB,aAAa,eAAe,wBAAwB,kCAAkC,aAAa,cAAe,SAAS0B,EAAUc,EAASvC,GAClP,aAEA,IAAIi8F,EAAiBx6F,EAAS,eAAew6F,eACzCsD,EAAe99F,EAAS,mBAAmB89F,aAC3C/gE,EAAS/8B,EAAS,aAClB8hB,EAAO9hB,EAAS,eAChB69F,EAAO79F,EAAS,wBAEhB0hG,EAAgB1hG,EAAS,kCACzB2hG,EAAmB,CACnBzgD,eAAgB,SAASz3B,EAAQxD,EAAS9gB,EAAKsvC,EAAQp1C,GACnD,GAAI4mB,EAAQm0B,MAAMsjD,UACd,OAAOz3E,EAAQm0B,MAAMsjD,UAAUx8C,eAAez3B,EAAQxD,EAAS9gB,EAAKsvC,EAAQp1C,GAEhF,IAAIm3B,EAAQ/M,EAAOxD,QAAQqgC,SAASnhD,EAAIylB,KACpCi0E,EAAc54E,EAAQm0B,MAAM8G,eAAe1qB,EAAOvQ,EAAS9gB,EAAKsvC,GACpEp1C,EAAS,KAAMw/F,KAInB+C,EAAmB,CACnB1gD,eAAgB,SAASz3B,EAAQxD,EAAS9gB,EAAKsvC,EAAQp1C,GACnD,IAAIi1F,EAAakG,EAAelG,WAC5BuK,EAAc,GAClBrE,EAAenD,gBAAgB5tE,GAAQpjB,QAAQ,SAASk6C,GAEpD,IADA,IAAIm3C,EAAWpD,EAAW/zC,IAAU,GAC3B1gD,EAAI63F,EAAS/4F,OAAQkB,KAAM,CAChC,IAAI23B,EAAIkgE,EAAS73F,GACbu8F,EAAU5kE,EAAE10B,MAAQ00B,EAAEqhE,WACrBuD,GAELyC,EAAY5+F,KAAK,CACbm8F,QAASA,EACTlG,QAAS1+D,EAAEqmD,QACXx8B,KAAM7pB,EAAEqhE,aAAerhE,EAAE10B,KAAO00B,EAAEqhE,WAAa,KAAY,UAC3Dh/E,KAAM,cAGf1b,MACHkB,EAAS,KAAMw/F,IAEnBmB,cAAe,SAASt9F,GACH,WAAbA,EAAKmX,MAAsBnX,EAAKw9F,UAChCx9F,EAAKw9F,QAAU,CACX,MAAOp+E,EAAKjB,WAAWne,EAAK05F,SAAU,OAAQ,YAC9Ct6E,EAAKjB,WAAWne,EAAKwzF,UACvBv1F,KAAK,OAKf88F,EAAa,CAACmE,EAAkBF,EAAeC,GACnD7gG,EAAQ+gG,cAAgB,SAASr7E,GAC7Bi3E,EAAW9+F,OAAS,EAChB6nB,GAAKi3E,EAAWx9F,KAAKlB,MAAM0+F,EAAYj3E,IAE/C1lB,EAAQghG,aAAe,SAASpE,GAC5BD,EAAWx9F,KAAKy9F,IAEpB58F,EAAQ4gG,cAAgBA,EACxB5gG,EAAQ6gG,iBAAmBA,EAC3B7gG,EAAQ8gG,iBAAmBA,EAE3B,IAAIzG,EAAgB,CAChBr4F,KAAM,gBACNpB,KAAM,SAAS+nB,GACX,OAAO+wE,EAAehD,cAAc/tE,IAExCqzC,QAAS,OAGTqI,EAAe,SAAS5qD,EAAGkP,GAC3Bs4E,EAAoBt4E,EAAOxD,QAAQm0B,QAGnC2nD,EAAsB,SAASvrD,GAC/B,IAAIx1C,EAAKw1C,EAAK8K,IACTk5C,EAAewH,QAChBxH,EAAewH,MAAQ,IAC3BC,EAAgBjhG,GACZw1C,EAAK0rD,OACL1rD,EAAK0rD,MAAM77F,QAAQ07F,IAGvBE,EAAkB,SAASjhG,GAC3B,GAAKA,IAAMw5F,EAAewH,MAAMhhG,GAAhC,CAEA,IAAImhG,EAAkBnhG,EAAGH,QAAQ,OAAQ,YACzC25F,EAAewH,MAAMhhG,GAAM,GAC3B+7B,EAAOL,WAAWylE,EAAiB,SAASrmE,GACpCA,IACA0+D,EAAewH,MAAMhhG,GAAM86B,GACtBA,EAAE47D,UAAY57D,EAAEw6D,cACjBx6D,EAAE47D,SAAW8C,EAAerB,iBAAiBr9D,EAAEw6D,cACnDkE,EAAehC,SAAS18D,EAAE47D,UAAY,GAAI57D,EAAEykB,OACxCzkB,EAAEy7D,gBACFiD,EAAelG,WAAWx4D,EAAEykB,OAAOg3C,cAAgBz7D,EAAEy7D,cACrDz7D,EAAEy7D,cAAclxF,QAAQ,SAASpE,GAC7BggG,EAAgB,YAAchgG,WAO9CmgG,EAAqB,SAAS7nF,GAC9B,IAAIkP,EAASlP,EAAEkP,OACX44E,EAAe54E,EAAOi0E,WAAaj0E,EAAOi0E,UAAUsB,UACxD,GAAuB,cAAnBzkF,EAAEomB,QAAQ79B,KACNu/F,IAAiBxE,EAAKL,oBAAoB/zE,IAC1CA,EAAOi0E,UAAUr9D,cAEpB,GAAuB,iBAAnB9lB,EAAEomB,QAAQ79B,KAAyB,CACxC,IAAI2xC,EAASopD,EAAKL,oBAAoB/zE,GAClCgrB,IAAW4tD,IACN54E,EAAOi0E,YACRj0E,EAAOi0E,UAAY,IAAII,GAE3Br0E,EAAOi0E,UAAUK,YAAa,EAC9Bt0E,EAAOi0E,UAAUkC,UAAUn2E,MAKnC04C,EAASniE,EAAS,aAAamiE,OACnCniE,EAAS,aAAai6B,cAAckoC,EAAO1iE,UAAW,SAAU,CAC5D6iG,0BAA2B,CACvBp6F,IAAK,SAASse,GACNA,GACKroB,KAAKs/F,aACNt/F,KAAKs/F,WAAa76F,MAAMoD,QAAQwgB,GAAMA,EAAKi3E,GAC/Ct/F,KAAKyhC,SAASo9B,WAAW8gC,EAAa6C,eAEtCxiG,KAAKyhC,SAASq9B,cAAc6gC,EAAa6C,eAGjD95F,OAAO,GAEX07F,yBAA0B,CACtBr6F,IAAK,SAASse,GACNA,GACKroB,KAAKs/F,aACNt/F,KAAKs/F,WAAa76F,MAAMoD,QAAQwgB,GAAMA,EAAKi3E,GAC/Ct/F,KAAKyhC,SAASxZ,GAAG,YAAag8E,IAE9BjkG,KAAKyhC,SAASzlB,eAAe,YAAaioF,IAGlDv7F,OAAO,GAEX27F,eAAgB,CACZt6F,IAAK,SAASse,GACNA,GACAroB,KAAKyhC,SAASo9B,WAAWm+B,GACzBh9F,KAAKioB,GAAG,aAAc++C,GACtBA,EAAa,KAAMhnE,QAEnBA,KAAKyhC,SAASq9B,cAAck+B,GAC5Bh9F,KAAK06B,IAAI,aAAcssC,KAG/Bt+D,OAAO,OAIC,WACIrF,IAAIxB,SAAS,CAAC,0BAA2B,cAD7C,I,oCC95DhB,IAAIyiG,EAAW,EAAQ,QACnBC,EAAW,EAAQ,QACnBC,EAAqB,EAAQ,QAC7BC,EAAqB,EAAQ,QAC7BC,EAAW,EAAQ,QACnBC,EAAiB,EAAQ,QACzBC,EAAa,EAAQ,QACrBC,EAAQ,EAAQ,QAChBC,EAAO59F,KAAKM,IACZu9F,EAAQ,GAAGjjG,KACXkjG,EAAS,QACTC,EAAS,SACTC,EAAa,YACbC,EAAa,WAGbC,GAAcP,EAAM,WAAcrhG,OAAO2hG,EAAY,OAGzD,EAAQ,OAAR,CAAyB,QAAS,EAAG,SAAUE,EAASC,EAAOrgD,EAAQsgD,GACrE,IAAIC,EAkDJ,OAxCEA,EAR6B,KAA7B,OAAOR,GAAQ,QAAQ,IACe,GAAtC,OAAOA,GAAQ,QAAS,GAAGC,IACQ,GAAnC,KAAKD,GAAQ,WAAWC,IACW,GAAnC,IAAID,GAAQ,YAAYC,IACxB,IAAID,GAAQ,QAAQC,GAAU,GAC9B,GAAGD,GAAQ,MAAMC,GAGD,SAAUQ,EAAWnsC,GACnC,IAAI53C,EAAS/d,OAAO3D,MACpB,QAAkBoB,IAAdqkG,GAAqC,IAAVnsC,EAAa,MAAO,GAEnD,IAAKgrC,EAASmB,GAAY,OAAOxgD,EAAOzjD,KAAKkgB,EAAQ+jF,EAAWnsC,GAChE,IASI51D,EAAOK,EAAW2hG,EATlBprB,EAAS,GACTqrB,GAASF,EAAUvhG,WAAa,IAAM,KAC7BuhG,EAAUthG,UAAY,IAAM,KAC5BshG,EAAUjmD,QAAU,IAAM,KAC1BimD,EAAUphG,OAAS,IAAM,IAClCuhG,EAAgB,EAChBC,OAAuBzkG,IAAVk4D,EAAsB6rC,EAAa7rC,IAAU,EAE1DwsC,EAAgB,IAAItiG,OAAOiiG,EAAU5gG,OAAQ8gG,EAAQ,KAEzD,MAAOjiG,EAAQkhG,EAAWpjG,KAAKskG,EAAepkF,GAAS,CAErD,GADA3d,EAAY+hG,EAAcZ,GACtBnhG,EAAY6hG,IACdtrB,EAAOx4E,KAAK4f,EAAOnf,MAAMqjG,EAAeliG,EAAMoB,QAC1CpB,EAAMuhG,GAAU,GAAKvhG,EAAMoB,MAAQ4c,EAAOujF,IAASF,EAAMnkG,MAAM05E,EAAQ52E,EAAMnB,MAAM,IACvFmjG,EAAahiG,EAAM,GAAGuhG,GACtBW,EAAgB7hG,EACZu2E,EAAO2qB,IAAWY,GAAY,MAEhCC,EAAcZ,KAAgBxhG,EAAMoB,OAAOghG,EAAcZ,KAK/D,OAHIU,IAAkBlkF,EAAOujF,IACvBS,GAAeI,EAAcriG,KAAK,KAAK62E,EAAOx4E,KAAK,IAClDw4E,EAAOx4E,KAAK4f,EAAOnf,MAAMqjG,IACzBtrB,EAAO2qB,GAAUY,EAAavrB,EAAO/3E,MAAM,EAAGsjG,GAAcvrB,GAG5D,IAAI0qB,QAAQ5jG,EAAW,GAAG6jG,GACnB,SAAUQ,EAAWnsC,GACnC,YAAqBl4D,IAAdqkG,GAAqC,IAAVnsC,EAAc,GAAKrU,EAAOzjD,KAAKxB,KAAMylG,EAAWnsC,IAGpErU,EAGX,CAGL,SAAewgD,EAAWnsC,GACxB,IAAIysC,EAAIV,EAAQrlG,MACZgmG,OAAwB5kG,GAAbqkG,OAAyBrkG,EAAYqkG,EAAUH,GAC9D,YAAoBlkG,IAAb4kG,EACHA,EAASxkG,KAAKikG,EAAWM,EAAGzsC,GAC5BksC,EAAchkG,KAAKmC,OAAOoiG,GAAIN,EAAWnsC,IAO/C,SAAU2sC,EAAQ3sC,GAChB,IAAI4sC,EAAMX,EAAgBC,EAAeS,EAAQjmG,KAAMs5D,EAAOksC,IAAkBvgD,GAChF,GAAIihD,EAAIC,KAAM,OAAOD,EAAIx9F,MAEzB,IAAI09F,EAAK7B,EAAS0B,GACdxiE,EAAI9/B,OAAO3D,MACXk/C,EAAIslD,EAAmB4B,EAAI5iG,QAE3B6iG,EAAkBD,EAAG5mD,QACrBmmD,GAASS,EAAGliG,WAAa,IAAM,KACtBkiG,EAAGjiG,UAAY,IAAM,KACrBiiG,EAAG5mD,QAAU,IAAM,KACnB4lD,EAAa,IAAM,KAI5BY,EAAW,IAAI9mD,EAAEkmD,EAAagB,EAAK,OAASA,EAAGvhG,OAAS,IAAK8gG,GAC7DW,OAAgBllG,IAAVk4D,EAAsB6rC,EAAa7rC,IAAU,EACvD,GAAY,IAARgtC,EAAW,MAAO,GACtB,GAAiB,IAAb7iE,EAAEjjC,OAAc,OAAuC,OAAhCmkG,EAAeqB,EAAUviE,GAAc,CAACA,GAAK,GACxE,IAAIqI,EAAI,EACJs9C,EAAI,EACJmd,EAAI,GACR,MAAOnd,EAAI3lD,EAAEjjC,OAAQ,CACnBwlG,EAASjiG,UAAYqhG,EAAahc,EAAI,EACtC,IACIhtE,EADAoqF,EAAI7B,EAAeqB,EAAUZ,EAAa3hE,EAAIA,EAAElhC,MAAM6mF,IAE1D,GACQ,OAANod,IACCpqF,EAAI0oF,EAAKJ,EAASsB,EAASjiG,WAAaqhG,EAAa,EAAIhc,IAAK3lD,EAAEjjC,WAAasrC,EAE9Es9C,EAAIqb,EAAmBhhE,EAAG2lD,EAAGid,OACxB,CAEL,GADAE,EAAEzkG,KAAK2hC,EAAElhC,MAAMupC,EAAGs9C,IACdmd,EAAE/lG,SAAW8lG,EAAK,OAAOC,EAC7B,IAAK,IAAI7kG,EAAI,EAAGA,GAAK8kG,EAAEhmG,OAAS,EAAGkB,IAEjC,GADA6kG,EAAEzkG,KAAK0kG,EAAE9kG,IACL6kG,EAAE/lG,SAAW8lG,EAAK,OAAOC,EAE/Bnd,EAAIt9C,EAAI1vB,GAIZ,OADAmqF,EAAEzkG,KAAK2hC,EAAElhC,MAAMupC,IACRy6D,O,6JC5HQE,EAArB,6D,+DACI,EAAAC,UAAgB,CACZrS,IAAK,GACLxvF,OAAQ,GACRvC,KAAM,GACNgyF,MAAO,GACPC,SAAU,IANlB,iFAUgBF,GAAW,WACfA,GACA,EAAA1tF,EAAMmD,IAAN,UAAa9J,KAAK2mG,QAAQhuE,IAA1B,yBAA8C07D,EAA9C,SACKuS,KAAK,SAAAV,GACiB,QAAfA,EAAIjlF,KAAKnd,GACT,EAAK4iG,UAAU7hG,OAASqhG,EAAIjlF,KAAKpc,OACjC,EAAK6hG,UAAUnS,SAAW2R,EAAIjlF,KAAKszE,UAEnC,EAAKoS,QAAQE,OAAO,aAG3BC,MAAM,SAAAhmG,GACC,EAAK6lG,QAAQI,WAAW,EAAKjmG,OAtBrD,gCA2Bc+D,GAAc,WAChBA,GACA,EAAA8B,EAAMmD,IAAN,UAAa9J,KAAK2mG,QAAQhuE,IAA1B,uBAA4C9zB,IACvC+hG,KAAK,SAAAV,GACF,EAAKQ,UAAUpkG,KAAO4jG,EAAIjlF,OAE7B6lF,MAAM,SAAAhmG,GACC,EAAK6lG,QAAQI,WAAW,EAAKjmG,OAlCrD,iCAuCY,WACJ,EAAA6F,EAAMmD,IAAN,UAAa9J,KAAK2mG,QAAQhuE,IAA1B,eACKiuE,KAAK,SAAAV,GACF,EAAKQ,UAAUrS,IAAM6R,EAAIjlF,OAE5B6lF,MAAM,SAAAhmG,GACK,EAAK6lG,QAAQI,WAAW,EAAKjmG,OA7CrD,mCAiDc,WACFd,KAAKk0F,SAASC,UACd,EAAAxtF,EAAMqgG,IAAN,UAAahnG,KAAK2mG,QAAQhuE,IAA1B,gBAA6C,CACzC,OAAU34B,KAAKk0F,SAASrvF,OACxB,KAAQ7E,KAAKk0F,SAASC,WAErByS,KAAK,SAAAV,GACF,EAAKQ,UAAUpS,MAAQ4R,EAAIjlF,KAAKqzE,MAChC,EAAKQ,SAAW,EAAK6R,QAAQjhG,OAAO,EAAKovF,SAAUoR,EAAIjlF,KAAK8yC,aAC7D+yC,MAAM,SAAAhmG,GACD,EAAK6lG,QAAQI,WAAW,EAAKjmG,SA3DrD,GAA0C,eAAO,SAA5B2lG,EAAY,gBADhC,eAAU,CAACxQ,WAAY,MACHwQ,GAAA,U,qBCNrBpjG,IAAIlD,OAAO,uCAAuC,CAAC,UAAU,UAAU,SAAS,cAAc,iCAAkC,SAAS0B,EAAUc,EAASvC,GAC5J,aAEA,IAAI4R,EAAMnQ,EAAS,cACfs0C,EAAqBt0C,EAAS,0BAA0Bs0C,mBAExD8wD,EAA2B,WAC3BjnG,KAAKo2C,OAAS,CACV,MAAU,CAAE,CACR7B,MAAQ,kBACRtwC,MAAQ,eAEZgjG,EAAyBC,aACzB,CACIlzD,aAAe,cACfI,iBAAiB,MAK7BpiC,EAAIR,SAASy1F,EAA0B9wD,GAEvC8wD,EAAyBC,WAAa,SAASpgG,GAC3C,MAAO,CACHytC,MAAQ,+BACRtwC,MAAQ,kCAIhBgjG,EAAyBE,aAAe,SAASrgG,GAC7C,MAAO,CACHytC,MAAQ,cACRtwC,MAAQ,gBACR8xC,KAAQjvC,IAIhBmgG,EAAyBG,WAAa,SAAUtgG,GAC5C,MAAO,CACHytC,MAAQ,cACRtwC,MAAQ,SACR8xC,KAAQjvC,IAKhBnE,EAAQskG,yBAA2BA,IAInC5jG,IAAIlD,OAAO,iCAAiC,CAAC,UAAU,UAAU,SAAS,cAAc,eAAe,uCAAuC,iCAAkC,SAAS0B,EAAUc,EAASvC,GAE5M,IAAI4R,EAAMnQ,EAAS,cAEfolG,GADOplG,EAAS,eACWA,EAAS,iCAAiColG,0BACrE9wD,EAAqBt0C,EAAS,0BAA0Bs0C,mBAExDkxD,EAAsB,WAEtB,IAAIC,EAAwB,mmGACxBC,EAAW,sYACXC,EAAW,8HAEXC,EAAgBznG,KAAKy3C,oBAAoB,CACzC,mBAAoB8vD,EACpB,QAAWD,EACX,SAAY,yEACZ,oBAAqBE,GACtB,cAAc,GAGjB,SAAS9lF,EAAOyyB,GACZ,IAAIrtC,EAAQqtC,EAAKrtC,MACb4gG,EAAYvzD,EAAKv7B,OACrB,MAAO,CACH27B,MAAO,eACPtwC,MAAO6C,EACPivC,KAAM,CACF,CAACxB,MAAO,2BAA4BtwC,MAAOyjG,GAC3C,CAACnzD,MAAO,aAAcwB,KAAM,QAAS9xC,MAAO6C,GAC5C,CAACktC,aAAc,YAK3Bh0C,KAAKo2C,OAAS,CACV,MAAU,CAAE,CACR7B,MAAQ,UAAWtwC,MAAQ,gBAE/Byd,EAAO,CAAC5a,MAAO,IAAK8R,OAAQ,sBAC5B8I,EAAO,CAAC5a,MAAO,IAAK8R,OAAQ,sBAC5BquF,EAAyBE,aAAa,aACtC,CACI5yD,MAAQ,UACRtwC,MAAQ,OACR8xC,KAAO,WACR,CACCxB,MAAQ,mBACRtwC,MAAQ,+DACT,CACCswC,MAAQ,mBACRtwC,MAAQ,mDACT,CACCswC,MAAQkzD,EACRxjG,MAAQ,+BACT,CACCswC,MAAQ,iBACRtwC,MAAQ,kCACT,CACCswC,MAAQ,mBACRtwC,MAAQ,WACT,CACCswC,MAAQ,mBACRtwC,MAAQ,+DACT,CACCswC,MAAQ,eACRtwC,MAAQ,SACT,CACCswC,MAAQ,eACRtwC,MAAQ,SACT,CACCswC,MAAQ,OACRtwC,MAAQ,SAEZ,QAAY,CACR,CAACswC,MAAQ,UAAWtwC,MAAQ,SAAU8xC,KAAO,SAC7C,CAAC/B,aAAe,aAIxBh0C,KAAKy2C,WAAWwwD,EAA0B,OAAQ,CAAEA,EAAyBG,WAAW,WACxFpnG,KAAKi3C,kBAGTjlC,EAAIR,SAAS61F,EAAqBlxD,GAElCxzC,EAAQ0kG,oBAAsBA,IAG9BhkG,IAAIlD,OAAO,iBAAiB,CAAC,UAAU,UAAU,SAAS,cAAc,gBAAgB,kCAAmC,SAAS0B,EAAUc,EAASvC,GAEvJ,IAAI4R,EAAMnQ,EAAS,cACfmuD,EAAWnuD,EAAS,gBAAgB49C,KACpC4nD,EAAsBxlG,EAAS,2BAA2BwlG,oBAE1D5nD,EAAO,WACPz/C,KAAK02C,eAAiB2wD,EACtBrnG,KAAK0iD,WAAa1iD,KAAK0/C,mBAE3B1tC,EAAIR,SAASiuC,EAAMuQ,GAEnB,WACIhwD,KAAKm8C,iBAAmB,CAAC,KAAM,KAC/Bn8C,KAAK+/C,aAAe,CAACj5C,MAAO,KAAM+jB,IAAK,MAEvC7qB,KAAKmjD,IAAM,kBACZ3hD,KAAKi+C,EAAKn+C,WAEbqB,EAAQ88C,KAAOA,K,kCC9Jf,IAAIkoD,EAAS,WAAa,IAAIC,EAAI5nG,KAAS6nG,EAAGD,EAAIE,eAAmBC,EAAGH,EAAIpkF,MAAMukF,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACC,YAAY,CAAC,MAAQ,OAAO,OAAS,YAC3IC,EAAkB,GCKtB,qEACE,OAAF,gBADA,4BAGA,gBACA,GACE,KAAF,SACE,MAAF,CACI,MAAJ,CACM,KAAN,OACM,UAAN,IAGE,KARF,WASI,MAAJ,CACM,OAAN,KACM,cAAN,KAGE,MAAF,CACI,MADJ,SACA,GACA,wBACQ,KAAR,sBAGI,MAAJ,YACM,KAAN,iCAEI,KAAJ,YACM,KAAN,6CAGE,QA3BF,WA4BI,IAAJ,OACI,EAAJ,QACI,EAAJ,QACI,IAAJ,4BACI,KAAJ,gBACI,IAAJ,GACM,eAAN,oBACQ,EAAR,oCAGI,EAAJ,eACI,EAAJ,YACM,2BAAN,EACM,0BAAN,IAEI,EAAJ,oBACI,EAAJ,gBACI,EAAJ,4BACI,EAAJ,uCACI,EAAJ,4BACI,EAAJ,uBACI,EAAJ,uBACM,IAAN,eACM,EAAN,iBACM,EAAN,oBC9Dga,I,YCO5ZjqE,EAAY,eACd,EACA2pE,EACAM,GACA,EACA,KACA,KACA,MAIa,OAAAjqE,E,8BCjBf,IAAIkqE,EAAW,EAAQ,QACnBC,EAAM,EAAQ,QACdC,EAAQ,EAAQ,OAAR,CAAkB,SAC9BhoG,EAAOuC,QAAU,SAAU0lG,GACzB,IAAI/D,EACJ,OAAO4D,EAASG,UAAmCjnG,KAA1BkjG,EAAW+D,EAAGD,MAA0B9D,EAAsB,UAAX6D,EAAIE,M,mBCNlFhlG,IAAIlD,OAAO,eAAe,CAAC,UAAU,UAAU,SAAS,cAAc,wBAAwB,eAAe,YAAY,aAAa,4BAA4B,gBAAgB,cAAc,cAAe,SAAS0B,EAAUc,EAASvC,GAC3O,aACA,IAAI4R,EAAMnQ,EAAS,aACf63B,EAAe73B,EAAS,uBAAuB63B,aAC/C/V,EAAO9hB,EAAS,cAChBypC,EAAQzpC,EAAS,WAAWypC,MAC5BiY,EAAS1hD,EAAS,YAAY0hD,OAC9B+a,EAAcz8D,EAAS,2BAA2By8D,YAClD9qB,EAAY3xC,EAAS,eAAe2xC,UACpCrI,EAAgBG,EAAMH,cAEtB+qD,EAAiB,WACjBl2F,KAAKm2F,WAAa,GAClBn2F,KAAKo2F,eAAiB,KAG1B,WACIpkF,EAAIF,UAAU9R,KAAM05B,GAEpB15B,KAAK2/C,aAAe,WAChB,SAAS02C,EAAa3xF,EAAK60B,EAAG6b,GAE1B,OADA1wC,EAAMA,EAAI8hB,OAAO,GACb,QAAQ/iB,KAAKiB,KAAS0wC,EAAMkhD,eACrB,CAAC,CAACC,UAAWxnF,SAASrK,EAAK,MAC/B,CAAC,CAACwf,KAAMxf,IAEnB,SAASkU,EAAOstB,GACZ,MAAO,YAAcA,EAAK,WA4E9B,OA1EAgwD,EAAet2C,WAAa,IAAIpM,EAAU,CACtC1sC,MAAO,CACH,CAAC7C,MAAO,IAAKywC,QAAS,SAASrsB,EAAKgQ,EAAO+c,GACvC,OAAIA,EAAM50C,QAAU40C,EAAM,GAAGohD,UACzBphD,EAAM,GAAGohD,UAAW,EACpBphD,EAAM,GAAGqhD,WAAarhD,EAAM,GACrB,CAACA,EAAM,KAEX,MAEX,CAACnxC,MAAO,MAAOywC,QAAS,SAASrsB,EAAKgQ,EAAO+c,GACzC,IAAIlP,EAAK7d,EAAI,GAeb,MAdU,KAAN6d,GAAakP,EAAM50C,OACnB6nB,EAAM6d,GACuB,GAAvB,OAAOhkC,QAAQgkC,GACrB7d,EAAM6d,EACCkP,EAAMkhD,iBACH,KAANpwD,EACA7d,EAAM,KACK,KAAN6d,EACL7d,EAAM,MACuB,GAAxB,QAAQnmB,QAAQgkC,KACrB7d,EAAM,CAACquE,WAAYxwD,EAAIywD,MAAOzwD,EAAK,OAIpC,CAAC7d,KAEZ,CAACpkB,MAAO,IAAKywC,QAAS,SAASrsB,EAAKgQ,EAAO+c,GACvC,MAAO,CAACA,EAAM50C,OAAS40C,EAAMrqB,QAAU1C,KAE3C,CAACpkB,MAAO,gBAAiBywC,QAAS2hD,GAClC,CAACpyF,MAAO,mBAAoBywC,QAAS,SAAShwC,EAAK2zB,EAAO+c,GACtD,IAAI3lB,EAAI4mE,EAAa3xF,EAAI8hB,OAAO,GAAI6R,EAAO+c,GAE3C,OADAA,EAAMc,QAAQzmB,EAAE,IACTA,GACRsmB,KAAM,cACT,CAAC9xC,MAAO,KAAMswC,MAAO,UAAW0B,OAAO,IAE3C2gD,WAAY,CACR,CAAC3yF,MAAO,MAAQ2U,EAAO,OAAS,OAAQ87B,QAAS,SAASrsB,EAAKgQ,EAAO+c,GAClEA,EAAM,GAAGyhD,QAAUxuE,EAAI9lB,MAAM,GAAI,GAAGH,MAAM,MAC3C2zC,KAAM,SACT,CAAC9xC,MAAO,KAAO2U,EAAO,KAAO,UAAYA,EAAO,KAAO,eACtD87B,QAAS,SAASrsB,EAAKgQ,EAAO+c,GAC3B,IAAI75B,EAAK65B,EAAM,GAOf,OANA75B,EAAGu7E,UAAYzuE,EAEfA,EAAMroB,KAAK+0C,WAAWxxC,KAAK8kB,GAC3B9M,EAAGw7E,MAAQ1uE,EAAI,GACf9M,EAAGy7E,IAAM3uE,EAAI,GACb9M,EAAG04B,KAAO5rB,EAAI,GACP,IACR0tB,KAAM,SACT,CAAC9xC,MAAO,IAAM2U,EAAO,KAAO,KAAM87B,QAAS,SAASrsB,EAAKgQ,EAAO+c,GAE5D,OADAA,EAAM,GAAG6hD,KAAO5uE,EAAI5hB,OAAO,GAAI,GACxB,IACRsvC,KAAM,SACT,CAAC9xC,MAAO,MAAOywC,QAAS,SAASrsB,EAAKgQ,EAAO+c,GACrCA,EAAM,KACNA,EAAM,GAAGohD,UAAW,IACzBzgD,KAAM,SACT,CAAC9xC,MAAO,uBAAwBswC,MAAO,GAAIwB,KAAM,UAErDmhD,aAAc,CACV,CAACjzF,MAAO,KAAO2U,EAAO,KAAO,MAAO27B,MAAO,SAC3C,CAACtwC,MAAO,GAAIywC,QAAS,SAASrsB,EAAKgQ,EAAO+c,GACtCA,EAAMkhD,gBAAiB,GACxBvgD,KAAM,YAGjBmgD,EAAe50F,UAAUq+C,aAAe,WACpC,OAAOu2C,EAAet2C,YAEnBs2C,EAAet2C,YAG1B5/C,KAAKm3F,kBAAoB,SAASzyF,EAAKixC,GACnC,OAAO31C,KAAK2/C,eAAejK,cAAchxC,EAAKixC,GAAYR,OAAO3sC,IAAI,SAAS1E,GAC1E,OAAOA,EAAE4E,OAAS5E,KAI1B9D,KAAKo3F,iBAAmB,SAAS9rE,EAAQ3mB,GACrC,GAAI,aAAalB,KAAKkB,GAAO,CACzB,IAAIjD,EAAIiD,EAAK6hB,OAAO,GACpB,OAAQxmB,KAAKq3F,UAAU1yF,EAAK,GAAK,OAAS,IAAIjD,GAElD,GAAI,QAAQ+B,KAAKkB,GACb,OAAQ3E,KAAKq3F,UAAUC,IAAM,IAAI3yF,GAIrC,GAFAA,EAAOA,EAAKjC,QAAQ,OAAQ,IAEvB4oB,EAAL,CAEA,IAAI+N,EAAI/N,EAAOxD,QACf,OAAOnjB,GACH,IAAK,eACD,IAAI6jB,EAAI6Q,EAAElK,eACd,IAAK,YACL,IAAK,gBACD,OAAOkK,EAAEzC,aAAapO,GAC1B,IAAK,eACD,OAAO6Q,EAAE6H,QAAQ5V,EAAOwvB,oBAAoBruB,KAChD,IAAK,YACD,OAAO4M,EAAE6H,QAAQ5V,EAAOwvB,oBAAoBruB,IAAM,GACtD,IAAK,aACD,OAAOnB,EAAOwvB,oBAAoBnuB,OACtC,IAAK,cACD,OAAOrB,EAAOwvB,oBAAoBruB,IAAM,EAC5C,IAAK,YACD,OAAO4M,EAAEknB,iBAAmB,MAAQ,KACxC,IAAK,WACD,OAAOlnB,EAAEsX,aACb,IAAK,WACL,IAAK,WACD,MAAO,GACX,IAAK,WACD,MAAO,SAGnB3wC,KAAKq3F,UAAY,GACjBr3F,KAAKu3F,iBAAmB,SAASjsE,EAAQksE,GACrC,OAAIx3F,KAAKq3F,UAAUjxF,eAAeoxF,GACvBx3F,KAAKq3F,UAAUG,GAASlsE,EAAQksE,IAAY,GAChDx3F,KAAKo3F,iBAAiB9rE,EAAQksE,IAAY,IAErDx3F,KAAKy3F,YAAc,SAAS/yF,EAAKwhC,EAAI5a,GACjC,IAAI2oB,EAAO/N,EAAG+N,MAAQ,GAClB9V,EAAK+H,EAAG6wD,MACZ54D,EAAK,IAAI36B,OAAO26B,EAAI8V,EAAKvxC,QAAQ,QAAS,KAC1C,IAAIg1F,EAAY13F,KAAKm3F,kBAAkBjxD,EAAG8wD,IAAK,gBAC3CxzE,EAAQxjB,KACR23F,EAAYjzF,EAAIhC,QAAQy7B,EAAI,WAC5B3a,EAAM6zE,UAAUC,GAAK/2F,UAGrB,IAFA,IAAIq3F,EAAWp0E,EAAMq0E,iBAAiBH,EAAWpsE,GAC7CwsE,EAAc,IACTp2F,EAAK,EAAGA,EAAIk2F,EAASp3F,OAAQkB,IAAK,CACvC,IAAIwkC,EAAK0xD,EAASl2F,GAClB,GAAiB,iBAANwkC,EAEP,GADA0xD,EAASl2F,GAAK,GACVwkC,EAAGwwD,YAAcxwD,EAAGywD,MAAO,CAC3B,IAAI5gD,EAAO6hD,EAASl2F,EAAI,GACpBq0C,GAAuB,iBAARA,IACM,KAAjB7P,EAAGwwD,WACHkB,EAASl2F,GAAKq0C,EAAK,GAAGlY,cAEtB+5D,EAASl2F,GAAKq0C,EAAK,GAAGr9B,cAC1Bk/E,EAASl2F,EAAI,GAAKq0C,EAAKvvB,OAAO,SAE3B0f,EAAGwwD,aACVoB,EAAc5xD,EAAGwwD,gBAEC,KAAfoB,EACPF,EAASl2F,GAAKwkC,EAAGrI,cACK,KAAfi6D,IACPF,EAASl2F,GAAKwkC,EAAGxtB,eAGzB,OAAOk/E,EAASp1F,KAAK,MAGzB,OADAxC,KAAKq3F,UAAUC,GAAK,KACbK,GAGX33F,KAAK63F,iBAAmB,SAASE,EAASzsE,GAEtC,IADA,IAAI7lB,EAAS,GACJ/D,EAAI,EAAGA,EAAIq2F,EAAQv3F,OAAQkB,IAAK,CACrC,IAAIwkC,EAAK6xD,EAAQr2F,GACjB,GAAiB,iBAANwkC,EACPzgC,EAAO3D,KAAKokC,OACT,IAAiB,iBAANA,EACd,SACG,GAAIA,EAAGopD,KACV0I,EAAS9xD,OACN,IAAIA,EAAGiR,UAAYz1C,EACtB,SACG,GAAIwkC,EAAGhiB,KAAM,CAChB,IAAIxb,EAAQ1I,KAAKu3F,iBAAiBjsE,EAAQ4a,EAAGhiB,MACzCxb,GAASw9B,EAAG4wD,YACZpuF,EAAQ1I,KAAKy3F,YAAY/uF,EAAOw9B,IACpCA,EAAGiR,UAAYz1C,EACI,MAAfwkC,EAAGswD,SACC9tF,IACAjD,EAAO3D,KAAK4G,GACZsvF,EAAS9xD,IAGTx9B,EACAw9B,EAAGopD,KAAOppD,EAAGuwD,WAEbuB,EAAS9xD,QAEM,MAAhBA,EAAGqwD,UACV9wF,EAAO3D,KAAKokC,GACY,MAAjBA,EAAGwwD,YACVjxF,EAAO3D,KAAKokC,KAGpB,SAAS8xD,EAAS9xD,GACd,IAAI+xD,EAAKF,EAAQ71F,QAAQgkC,EAAIxkC,EAAI,IACtB,GAAPu2F,IACAv2F,EAAIu2F,GAEZ,OAAOxyF,GAGXzF,KAAKk4F,0BAA4B,SAAS5sE,EAAQ6sE,GAC9C,IAAI3rE,EAASlB,EAAOwvB,oBAChBpT,EAAOpc,EAAOxD,QAAQoZ,QAAQ1U,EAAOC,KACrC2rE,EAAY9sE,EAAOxD,QAAQi0B,eAC3B6b,EAAelwB,EAAKhkC,MAAM,QAAQ,GAElC8oB,EAAOG,OAASirC,EAAap3D,SAC7Bo3D,EAAeA,EAAar1D,MAAM,EAAGiqB,EAAOG,SAEhDwrE,EAAcA,EAAYz1F,QAAQ,MAAO,IACzC,IAAIyyC,EAASn1C,KAAKm3F,kBAAkBgB,GACpChjD,EAASn1C,KAAK63F,iBAAiB1iD,EAAQ7pB,GACvC6pB,EAASA,EAAO3sC,IAAI,SAAS1E,GACzB,MAAS,MAALA,EACOA,EAAI8zD,EACC,iBAAL9zD,EACAA,EAAEpB,QAAQ,MAAO01F,GACrBt0F,IAEX,IAAIu0F,EAAW,GACfljD,EAAOjtC,QAAQ,SAAS4jC,EAAGpqC,GACvB,GAAgB,iBAALoqC,EAAX,CAEA,IAAIjpC,EAAKipC,EAAEyqD,UACPh7E,EAAK88E,EAASx1F,GAMlB,GALK0Y,IACDA,EAAK88E,EAASx1F,GAAM,GACpB0Y,EAAGzW,MAAQjC,EACX0Y,EAAG7S,MAAQ,KAEQ,IAAnB6S,EAAGrZ,QAAQ4pC,GAAf,CAEAvwB,EAAGzZ,KAAKgqC,GACR,IAAImsD,EAAK9iD,EAAOjzC,QAAQ4pC,EAAGpqC,EAAI,GAC/B,IAAY,IAARu2F,EAAJ,CAGA,IAAIvvF,EAAQysC,EAAO5yC,MAAMb,EAAI,EAAGu2F,GAC5BK,EAAW5vF,EAAME,KAAK,SAAS6mB,GAAI,MAAoB,kBAANA,IACjD6oE,IAAa/8E,EAAG7S,MAChB6S,EAAG7S,MAAQA,GACJA,EAAMlI,QAAY+a,EAAG7S,OAA6B,kBAAb6S,EAAG7S,QAC/C6S,EAAG7S,MAAQA,EAAMlG,KAAK,UAG9B61F,EAASnwF,QAAQ,SAASqT,GAAKA,EAAG/a,OAAS,IAC3C,IAAI+3F,EAAY,GAChB,SAASC,EAAUnwE,GAEf,IADA,IAAIpG,EAAO,GACFvgB,EAAI,EAAGA,EAAI2mB,EAAI7nB,OAAQkB,IAAK,CACjC,IAAIoqC,EAAIzjB,EAAI3mB,GACZ,GAAgB,iBAALoqC,EAAe,CACtB,GAAIysD,EAAUzsD,EAAEyqD,WACZ,SACJ,IAAI/4D,EAAInV,EAAIpf,YAAY6iC,EAAGpqC,EAAI,GAC/BoqC,EAAI7pB,EAAKub,IAAM,CAAC+4D,UAAWzqD,EAAEyqD,WAEjCt0E,EAAKvgB,GAAKoqC,EAEd,OAAO7pB,EAEX,IAAK,IAAIvgB,EAAI,EAAGA,EAAIyzC,EAAO30C,OAAQkB,IAAK,CACpC,IAAIoqC,EAAIqJ,EAAOzzC,GACf,GAAgB,iBAALoqC,EAAX,CAEA,IAAIjpC,EAAKipC,EAAEyqD,UACP0B,EAAK9iD,EAAOjzC,QAAQ4pC,EAAGpqC,EAAI,GAC/B,GAAI62F,EAAU11F,GACN01F,EAAU11F,KAAQipC,IAClBysD,EAAU11F,GAAM,UAFxB,CAMA,IAAI0Y,EAAK88E,EAASx1F,GACd41F,EAAyB,iBAAZl9E,EAAG7S,MAAoB,CAAC6S,EAAG7S,OAAS8vF,EAAUj9E,EAAG7S,OAClE+vF,EAAIviD,QAAQx0C,EAAI,EAAGwF,KAAKC,IAAI,EAAG8wF,EAAKv2F,IACpC+2F,EAAI32F,KAAKgqC,GACTysD,EAAU11F,GAAMipC,EAChBqJ,EAAO1uC,OAAO7F,MAAMu0C,EAAQsjD,IAEL,IAAnBl9E,EAAGrZ,QAAQ4pC,IACXvwB,EAAGzZ,KAAKgqC,KAEhB,IAAIrf,EAAM,EAAGE,EAAS,EAClBzI,EAAO,GACXixB,EAAOjtC,QAAQ,SAASunB,GACpB,GAAiB,kBAANA,EAAgB,CACvB,IAAI6Y,EAAQ7Y,EAAErtB,MAAM,MAChBkmC,EAAM9nC,OAAS,GACfmsB,EAAS2b,EAAMA,EAAM9nC,OAAS,GAAGA,OACjCisB,GAAO6b,EAAM9nC,OAAS,GAEtBmsB,GAAU8C,EAAEjvB,OAChB0jB,GAAQuL,OAEHA,EAAE3oB,MAGH2oB,EAAE5E,IAAM,CAAC4B,IAAKA,EAAKE,OAAQA,GAF3B8C,EAAE3oB,MAAQ,CAAC2lB,IAAKA,EAAKE,OAAQA,KAKzC,IAAIjE,EAAQ4C,EAAO4B,oBACfrC,EAAMS,EAAOxD,QAAQplB,QAAQgmB,EAAOxE,GAEpCw0E,EAAiB,IAAIC,EAAertE,GACpCstE,EAActtE,EAAOs/C,wBAA0Bt/C,EAAOxF,UAAUhhB,MACpE4zF,EAAeG,YAAYR,EAAU3vE,EAAM5hB,MAAO+jB,EAAK+tE,IAG3D54F,KAAK84F,cAAgB,SAASxtE,EAAQ6sE,GAClC,IAAI7vF,EAAOtI,KACX,GAAIsrB,EAAOs/C,uBACP,OAAOtiE,EAAK4vF,0BAA0B5sE,EAAQ6sE,GAElD7sE,EAAOujE,iBAAiB,WACpBvmF,EAAK4vF,0BAA0B5sE,EAAQ6sE,IACxC,KAAM,CAACrJ,WAAW,IAEjBxjE,EAAOotE,gBACPptE,EAAOotE,eAAeK,WAG9B/4F,KAAKg5F,UAAY,SAAS1tE,GACtB,IAAI82B,EAAQ92B,EAAOxD,QAAQm0B,MAAMkH,KAAO,GAExC,GADAf,EAAQA,EAAMhgD,MAAM,KAAKo4B,MACX,SAAV4nB,GAA8B,QAAVA,EAAiB,CACvB,QAAVA,GAAoB92B,EAAOxD,QAAQm0B,MAAMg9C,YACzC72C,EAAQ,QACZ,IAAIx5B,EAAI0C,EAAOwvB,oBACXziB,EAAQ/M,EAAOxD,QAAQqgC,SAASv/B,EAAE6D,KACjB,kBAAV4L,IACPA,EAAQA,EAAM,IAEdA,EAAM3R,YACuB,OAAzB2R,EAAM3R,UAAU,EAAG,GACnB07B,EAAQ,aACsB,QAAzB/pB,EAAM3R,UAAU,EAAG,GACxB07B,EAAQ,MACsB,QAAzB/pB,EAAM3R,UAAU,EAAG,KACxB07B,EAAQ,QAIpB,OAAOA,GAGXpiD,KAAKk5F,gBAAkB,SAAS5tE,GAC5B,IAAI82B,EAAQpiD,KAAKg5F,UAAU1tE,GACvB6tE,EAAS,CAAC/2C,GACV+zC,EAAan2F,KAAKm2F,WAKtB,OAJIA,EAAW/zC,IAAU+zC,EAAW/zC,GAAOg3C,eACvCD,EAAOr3F,KAAKlB,MAAMu4F,EAAQhD,EAAW/zC,GAAOg3C,eAEhDD,EAAOr3F,KAAK,KACLq3F,GAGXn5F,KAAKq5F,cAAgB,SAAS/tE,EAAQyQ,GAClC,IAAIzzB,EAAOtI,KACPyF,EAAS6lB,EAAOujE,iBAAiB,WACjC,OAAOvmF,EAAKgxF,0BAA0BhuE,EAAQyQ,IAC/C,KAAM,CAAC+yD,WAAW,IAGrB,OAFIrpF,GAAU6lB,EAAOotE,gBACjBptE,EAAOotE,eAAeK,UACnBtzF,GAGXzF,KAAKs5F,0BAA4B,SAAShuE,EAAQyQ,GAC9C,IAMIg8D,EANAvrE,EAASlB,EAAOwvB,oBAChBpT,EAAOpc,EAAOxD,QAAQoZ,QAAQ1U,EAAOC,KACrCs0B,EAASrZ,EAAKhhB,UAAU,EAAG8F,EAAOG,QAClCq0B,EAAQtZ,EAAKlhB,OAAOgG,EAAOG,QAE3BwpE,EAAan2F,KAAKm2F,WAQtB,OANAn2F,KAAKk5F,gBAAgB5tE,GAAQ1iB,KAAK,SAASw5C,GACvC,IAAIm3C,EAAWpD,EAAW/zC,GAG1B,OAFIm3C,IACAxB,EAAU/3F,KAAKw5F,oBAAoBD,EAAUx4C,EAAQC,MAChD+2C,GACV/3F,QACE+3F,OAEDh8D,IAAWA,EAAQ09D,UAEvBnuE,EAAOxD,QAAQ/a,IAAI2zC,aAAal0B,EAAOC,IACnCD,EAAOG,OAASorE,EAAQ2B,cAAcl5F,OACtCgsB,EAAOG,OAASorE,EAAQ4B,aAAan5F,QAGzCR,KAAKq3F,UAAUuC,IAAM7B,EAAQ8B,YAC7B75F,KAAKq3F,UAAUyC,IAAM/B,EAAQgC,WAC7B/5F,KAAKk4F,0BAA0B5sE,EAAQysE,EAAQrY,SAE/C1/E,KAAKq3F,UAAUuC,IAAM55F,KAAKq3F,UAAUyC,IAAM,MACnC,KAGX95F,KAAKw5F,oBAAsB,SAASQ,EAAaj5C,EAAQC,GACrD,IAAK,IAAIt/C,EAAIs4F,EAAYx5F,OAAQkB,KAAM,CACnC,IAAI23B,EAAI2gE,EAAYt4F,GACpB,KAAI23B,EAAE4gE,SAAY5gE,EAAE4gE,QAAQx2F,KAAKs9C,QAE7B1nB,EAAE6gE,OAAU7gE,EAAE6gE,MAAMz2F,KAAKu9C,MAExB3nB,EAAE4gE,SAAY5gE,EAAE6gE,QAOrB,OAJA7gE,EAAEwgE,YAAcxgE,EAAE4gE,QAAU5gE,EAAE4gE,QAAQ12F,KAAKw9C,GAAU,CAAC,IACtD1nB,EAAE0gE,WAAa1gE,EAAE6gE,MAAQ7gE,EAAE6gE,MAAM32F,KAAKy9C,GAAS,CAAC,IAChD3nB,EAAEqgE,cAAgBrgE,EAAE8gE,UAAY9gE,EAAE8gE,UAAU52F,KAAKw9C,GAAQ,GAAK,GAC9D1nB,EAAEsgE,aAAetgE,EAAE+gE,aAAe/gE,EAAE+gE,aAAa72F,KAAKy9C,GAAO,GAAK,GAC3D3nB,IAIfr5B,KAAKm2F,WAAa,GAClBn2F,KAAKo2F,eAAiB,GACtBp2F,KAAKq6F,SAAW,SAASd,EAAUn3C,GAC/B,IAAI+zC,EAAan2F,KAAKm2F,WAClBC,EAAiBp2F,KAAKo2F,eACtB9tF,EAAOtI,KAKX,SAASs6F,EAAWzmE,GAIhB,OAHIA,IAAQ,uBAAuBpwB,KAAKowB,KACpCA,EAAM,MAAQA,EAAM,KAEjBA,GAAO,GAElB,SAAS0mE,EAAcp8D,EAAI44D,EAAOr8C,GAY9B,OAXAvc,EAAKm8D,EAAWn8D,GAChB44D,EAAQuD,EAAWvD,GACfr8C,GACAvc,EAAK44D,EAAQ54D,EACTA,GAA2B,KAArBA,EAAGA,EAAG39B,OAAS,KACrB29B,GAAU,OAEdA,GAAU44D,EACN54D,GAAe,KAATA,EAAG,KACTA,EAAK,IAAMA,IAEZ,IAAI36B,OAAO26B,GAGtB,SAASq8D,EAAWnhE,GACXA,EAAE+oB,QACH/oB,EAAE+oB,MAAQA,GAAS,KACvBA,EAAQ/oB,EAAE+oB,MACL+zC,EAAW/zC,KACZ+zC,EAAW/zC,GAAS,GACpBg0C,EAAeh0C,GAAS,IAG5B,IAAI55C,EAAM4tF,EAAeh0C,GACzB,GAAI/oB,EAAE10B,KAAM,CACR,IAAI01B,EAAM7xB,EAAI6wB,EAAE10B,MACZ01B,GACA/xB,EAAKmyF,WAAWpgE,GACpB7xB,EAAI6wB,EAAE10B,MAAQ00B,EAElB88D,EAAW/zC,GAAOtgD,KAAKu3B,GAEnBA,EAAEqhE,aAAerhE,EAAEshE,WACdthE,EAAE09D,OAAS,MAAMtzF,KAAK41B,EAAEqhE,cACzBrhE,EAAE09D,MAAQ,OACd19D,EAAEshE,QAAUh3E,EAAKlB,aAAa4W,EAAEqhE,cAG/BrhE,EAAEshE,SAAYthE,EAAE09D,OAAU19D,EAAEuhE,YAAevhE,EAAEwhE,YAGlDxhE,EAAE4gE,QAAUM,EAAclhE,EAAEshE,QAASthE,EAAE09D,OAAO,GAC9C19D,EAAE8gE,UAAY,IAAI32F,OAAO61B,EAAEshE,QAAS,IAAI,GAExCthE,EAAE6gE,MAAQK,EAAclhE,EAAEuhE,WAAYvhE,EAAEwhE,UAAU,GAClDxhE,EAAE+gE,aAAe,IAAI52F,OAAO61B,EAAEuhE,WAAY,IAAI,IAvD7CrB,IACDA,EAAW,IAyDXA,GAAYA,EAAS7Z,QACrB8a,EAAWjB,GACN90F,MAAMoD,QAAQ0xF,IACnBA,EAASrxF,QAAQsyF,GAErBx6F,KAAKuyB,QAAQ,mBAAoB,CAAC6vB,MAAOA,KAE7CpiD,KAAKy6F,WAAa,SAASlB,EAAUn3C,GACjC,IAAI+zC,EAAan2F,KAAKm2F,WAClBC,EAAiBp2F,KAAKo2F,eAE1B,SAAS0E,EAAczhE,GACnB,IAAI0hE,EAAU3E,EAAe/8D,EAAE+oB,OAAOA,GACtC,GAAI24C,GAAWA,EAAQ1hE,EAAE10B,MAAO,QACrBo2F,EAAQ1hE,EAAE10B,MACjB,IAAI6D,EAAM2tF,EAAW98D,EAAE+oB,OAAOA,GAC1B1gD,EAAI8G,GAAOA,EAAItG,QAAQm3B,GACvB33B,GAAK,GACL8G,EAAI/B,OAAO/E,EAAG,IAGtB63F,EAAS7Z,QACTob,EAAcvB,GACT90F,MAAMoD,QAAQ0xF,IACnBA,EAASrxF,QAAQ4yF,IAEzB96F,KAAKg7F,iBAAmB,SAASt2F,GAC7BA,EAAMA,EAAIhC,QAAQ,MAAO,IACzB,IAEIi7B,EAFAia,EAAO,GAAImgD,EAAU,GACrB55D,EAAK,uDAET,MAAOR,EAAIQ,EAAG56B,KAAKmB,GAAM,CACrB,GAAIi5B,EAAE,GACF,IACIo6D,EAAUkD,KAAKC,MAAMv9D,EAAE,IACvBia,EAAK91C,KAAKi2F,GACZ,MAAO37E,IACX,GAAIuhB,EAAE,GACJo6D,EAAQrY,QAAU/hD,EAAE,GAAGj7B,QAAQ,QAAS,IACxCk1C,EAAK91C,KAAKi2F,GACVA,EAAU,OACP,CACH,IAAI/rF,EAAM2xB,EAAE,GAAItV,EAAMsV,EAAE,GACxB,GAAW,SAAP3xB,EAAgB,CAChB,IAAImvF,EAAU,0BACdpD,EAAQhB,MAAQoE,EAAQ53F,KAAK8kB,GAAK,GAClC0vE,EAAQ4C,QAAUQ,EAAQ53F,KAAK8kB,GAAK,GACpC0vE,EAAQ6C,WAAaO,EAAQ53F,KAAK8kB,GAAK,GACvC0vE,EAAQ8C,SAAWM,EAAQ53F,KAAK8kB,GAAK,OACvB,WAAPrc,GACP+rF,EAAQ2C,WAAaryE,EAAI3kB,MAAM,QAAQ,GAClCq0F,EAAQpzF,OACTozF,EAAQpzF,KAAO0jB,IAEnB0vE,EAAQ/rF,GAAOqc,GAI3B,OAAOuvB,GAEX53C,KAAKo7F,iBAAmB,SAASz2F,EAAM2mB,GACnC,IACIysE,EADA5B,EAAan2F,KAAKo2F,eAQtB,OANAp2F,KAAKk5F,gBAAgB5tE,GAAQ1iB,KAAK,SAASw5C,GACvC,IAAIm3C,EAAWpD,EAAW/zC,GAG1B,OAFIm3C,IACAxB,EAAUwB,EAAS50F,MACdozF,GACV/3F,MACI+3F,KAGZv2F,KAAK00F,EAAe50F,WAGvB,IAAIq3F,EAAiB,SAASrtE,GAC1B,GAAIA,EAAOotE,eACP,OAAOptE,EAAOotE,eAClBptE,EAAOotE,eAAiB14F,KACxBA,KAAKwjD,UAAYxjD,KAAKooC,SAASjjC,KAAKnF,MACpCA,KAAKq7F,mBAAqB13E,EAAKL,YAAYtjB,KAAK4wE,kBAAkBzrE,KAAKnF,OAAOojB,SAC9EpjB,KAAKs7F,iBAAmBt7F,KAAKu7F,gBAAgBp2F,KAAKnF,MAClDA,KAAKw7F,aAAex7F,KAAKy7F,YAAYt2F,KAAKnF,MAC1CA,KAAKiiC,OAAO3W,KAEhB,WACItrB,KAAKiiC,OAAS,SAAS3W,GACnBtrB,KAAK8E,MAAQ,EACb9E,KAAKizC,OAAS,GACdjzC,KAAKq4F,SAAW,GAChBr4F,KAAK07F,cAAgB,KACrB17F,KAAK27F,gBAAkB,KAEvB37F,KAAKsrB,OAASA,EACdtrB,KAAKsrB,OAAOrD,GAAG,SAAUjoB,KAAKwjD,WAC9BxjD,KAAKsrB,OAAOrD,GAAG,kBAAmBjoB,KAAKq7F,oBACvCr7F,KAAKsrB,OAAOrD,GAAG,gBAAiBjoB,KAAKs7F,kBACrCt7F,KAAKsrB,OAAOmW,SAASxZ,GAAG,YAAajoB,KAAKw7F,cAC1Cx7F,KAAKsrB,OAAO+4C,WAAWxiC,mBAAmB7hC,KAAK6lE,kBAEnD7lE,KAAKkiC,OAAS,WACVliC,KAAKq4F,SAASnwF,QAAQlI,KAAK47F,qBAAsB57F,MACjDA,KAAKizC,OAAS,KACdjzC,KAAKq4F,SAAW,KAChBr4F,KAAK27F,gBAAkB,KACvB37F,KAAKsrB,OAAOtP,eAAe,SAAUhc,KAAKwjD,WAC1CxjD,KAAKsrB,OAAOtP,eAAe,kBAAmBhc,KAAKq7F,oBACnDr7F,KAAKsrB,OAAOtP,eAAe,gBAAiBhc,KAAKs7F,kBACjDt7F,KAAKsrB,OAAOmW,SAASzlB,eAAe,YAAahc,KAAKw7F,cACtDx7F,KAAKsrB,OAAO+4C,WAAW1iC,sBAAsB3hC,KAAK6lE,iBAClD7lE,KAAKsrB,OAAOotE,eAAiB,KAC7B14F,KAAKsrB,OAAS,MAGlBtrB,KAAKooC,SAAW,SAASC,GACrB,IACIwzD,EAA8B,KAAnBxzD,EAAMnD,OAAO,GACxBp+B,EAAQuhC,EAAMvhC,MACd+jB,EAAMwd,EAAMxd,IACZ0gB,EAAWzkC,EAAM2lB,IACjBgf,EAAS5gB,EAAI4B,IACbq+B,EAAUrf,EAASF,EACnBgW,EAAU12B,EAAI8B,OAAS7lB,EAAM6lB,OAMjC,GAJIkvE,IACA/wC,GAAWA,EACXvJ,GAAWA,IAEVvhD,KAAK87F,WAAaD,EAAU,CAC7B,IAAItgF,EAAKvb,KAAK27F,gBACVI,EAAiBxgF,IAAOA,EAAG3S,KAAK,SAAS4f,GACzC,OAAO2iB,EAAc3iB,EAAE1hB,MAAOA,IAAU,GAAKqkC,EAAc3iB,EAAEqC,IAAKA,IAAQ,IAE9E,GAAIkxE,EACA,OAAO/7F,KAAKkiC,SAGpB,IADA,IAAI+Q,EAASjzC,KAAKizC,OACTvxC,EAAI,EAAGA,EAAIuxC,EAAOzyC,OAAQkB,IAAK,CACpC,IAAI8mB,EAAIyqB,EAAOvxC,GACX8mB,EAAEqC,IAAI4B,IAAM3lB,EAAM2lB,MAGlBovE,GAAY1wD,EAAcrkC,EAAO0hB,EAAE1hB,OAAS,GAAKqkC,EAActgB,EAAKrC,EAAEqC,KAAO,GAC7E7qB,KAAKg8F,YAAYxzE,GACjB9mB,MAIA8mB,EAAE1hB,MAAM2lB,KAAO8e,GAAY/iB,EAAE1hB,MAAM6lB,OAAS7lB,EAAM6lB,SAClDnE,EAAE1hB,MAAM6lB,QAAU40B,GAClB/4B,EAAEqC,IAAI4B,KAAO8e,GAAY/iB,EAAEqC,IAAI8B,QAAU7lB,EAAM6lB,SAC/CnE,EAAEqC,IAAI8B,QAAU40B,GAChB/4B,EAAE1hB,MAAM2lB,KAAO8e,IACf/iB,EAAE1hB,MAAM2lB,KAAOq+B,GACftiC,EAAEqC,IAAI4B,KAAO8e,IACb/iB,EAAEqC,IAAI4B,KAAOq+B,GAEb3f,EAAc3iB,EAAE1hB,MAAO0hB,EAAEqC,KAAO,GAChC7qB,KAAKg8F,YAAYxzE,KAEpByqB,EAAOzyC,QACRR,KAAKkiC,UAEbliC,KAAKi8F,mBAAqB,WACtB,IAAI1gF,EAAKvb,KAAK27F,gBACd,GAAKpgF,GAAOA,EAAG2gF,gBAAf,CAEAl8F,KAAK87F,WAAY,EAGjB,IAFA,IAAIh0E,EAAU9nB,KAAKsrB,OAAOxD,QACtB5D,EAAO4D,EAAQ8O,aAAarb,EAAG4gF,gBAC1Bz6F,EAAI6Z,EAAG/a,OAAQkB,KAAM,CAC1B,IAAIgnB,EAAQnN,EAAG7Z,GACf,GAAKgnB,EAAM0zE,OAAX,CAEA,IAAIpF,EAAMr0F,EAAQ05F,eAAe5E,YAAYvzE,EAAMwE,EAAM/nB,UACzDmnB,EAAQplB,QAAQgmB,EAAOsuE,IAE3Bh3F,KAAK87F,WAAY,IAErB97F,KAAKy7F,YAAc,SAASr/E,GACpBA,EAAEomB,UAAYpmB,EAAEomB,QAAQnZ,UACxBrpB,KAAKi8F,sBAEbj8F,KAAK4wE,kBAAoB,WACrB,GAAK5wE,KAAKsrB,OAAV,CAKA,IAHA,IAAIkiB,EAAOxtC,KAAKsrB,OAAOxF,UAAU0nB,KAC7B5gB,EAAS5sB,KAAKsrB,OAAOxF,UAAU8G,OAC/BpH,EAAUxlB,KAAKsrB,OAAOxF,UAAUN,UAC3B9jB,EAAI1B,KAAKizC,OAAOzyC,OAAQkB,KAC7B,IAAI1B,KAAKizC,OAAOvxC,GAAG06F,OAAnB,CAEA,IAAIE,EAAet8F,KAAKizC,OAAOvxC,GAAG2tB,SAASme,EAAK/gB,IAAK+gB,EAAK7gB,QACtD4vE,EAAiB/2E,GAAWxlB,KAAKizC,OAAOvxC,GAAG2tB,SAASzC,EAAOH,IAAKG,EAAOD,QAC3E,GAAI2vE,GAAgBC,EAChB,OAERv8F,KAAKkiC,WAETliC,KAAKu7F,gBAAkB,WACnBv7F,KAAKkiC,UAETliC,KAAK+4F,QAAU,SAASr2D,GACpB,IAAIv7B,EAAMnH,KAAKq4F,SAAS73F,OACpBsE,EAAQ9E,KAAK8E,OAAS49B,GAAO,GACjC59B,EAAQoC,KAAKM,IAAIN,KAAKC,IAAIrC,EAAO,GAAIqC,GACjCrC,GAASqC,IACTrC,EAAQ,GACZ9E,KAAKw8F,cAAc13F,GACL,IAAVA,GACA9E,KAAKkiC,UAEbliC,KAAKw8F,cAAgB,SAAS13F,GAC1B9E,KAAK07F,cAAgB,KACrB,IAAIngF,EAAKvb,KAAKq4F,SAASr4F,KAAK8E,OAK5B,GAJIyW,GACAvb,KAAKy8F,kBAAkBlhF,GAC3Bvb,KAAK8E,MAAQA,EACbyW,EAAKvb,KAAKq4F,SAASr4F,KAAK8E,OACnByW,GAAOA,EAAG/a,OAAf,CAIA,GADAR,KAAK27F,gBAAkBpgF,EAClBvb,KAAKsrB,OAAOs/C,uBAWb5qE,KAAKsrB,OAAOxF,UAAU6C,SAASpN,EAAG4gF,oBAXG,CACrC,IAAIluB,EAAMjuE,KAAKsrB,OAAO0uB,YACtBi0B,EAAI56B,cAAc93B,EAAG4gF,eAAepvD,SACpC,IAAK,IAAIrrC,EAAI6Z,EAAG/a,OAAQkB,KAChB6Z,EAAG2gF,iBAAmB3gF,EAAG7Z,GAAG06F,QAEhCnuB,EAAI36B,SAAS/3B,EAAG7Z,GAAGqrC,SAAS,GAE5BkhC,EAAIh7B,OAAO,IACXg7B,EAAI36B,SAAS26B,EAAIh7B,OAAO,GAAGlG,SAKnC/sC,KAAKsrB,OAAO+4C,WAAWxiC,mBAAmB7hC,KAAK6lE,mBAEnD7lE,KAAK64F,YAAc,SAASR,EAAUvxF,EAAO+jB,GAGzC,GAFK7qB,KAAK07F,gBACN17F,KAAK07F,cAAgB,KACpBrD,EAAS,GAAI,CACd,IAAIvsD,EAAIR,EAAMuB,WAAWhiB,EAAKA,GAC9B6xE,EAAa5wD,EAAEhlC,MAAOA,GACtB41F,EAAa5wD,EAAEjhB,IAAK/jB,GACpBuxF,EAAS,GAAK,CAACvsD,GACfusD,EAAS,GAAGvzF,MAAQ,EAGxB,IAAIpD,EAAI1B,KAAK8E,MACT2zF,EAAM,CAAC/2F,EAAI,EAAG,GACduxC,EAASjzC,KAAKizC,OAClBolD,EAASnwF,QAAQ,SAASqT,EAAIzW,GAG1B,IAFA,IAAI63F,EAAO38F,KAAK07F,cAAc52F,IAAUyW,EAE/B7Z,EAAI6Z,EAAG/a,OAAQkB,KAAM,CAC1B,IAAIoqC,EAAIvwB,EAAG7Z,GACPgnB,EAAQ4iB,EAAMuB,WAAWf,EAAEhlC,MAAOglC,EAAEjhB,KAAOihB,EAAEhlC,OACjD81F,EAAUl0E,EAAM5hB,MAAOA,GACvB81F,EAAUl0E,EAAMmC,IAAK/jB,GACrB4hB,EAAM/nB,SAAWmrC,EACjBpjB,EAAMm0E,QAAUF,EAChB1pD,EAAOnxC,KAAK4mB,GACRi0E,GAAQphF,EACRohF,EAAKzmD,QAAQxtB,GAEbi0E,EAAKj7F,GAAKgnB,EACVojB,EAAEgrD,WACFpuE,EAAM0zE,QAAS,EACfO,EAAKT,iBAAkB,GACfS,EAAKR,iBACbQ,EAAKR,eAAiBzzE,GAEzBi0E,EAAKR,iBACNQ,EAAKT,iBAAkB,GACvBS,IAASphF,IACTk9E,EAAI32F,KAAK66F,GACT38F,KAAK07F,cAAc52F,GAAS63F,GAEhC38F,KAAKy8F,kBAAkBE,IACxB38F,MAECy4F,EAAIj4F,OAAS,IACTR,KAAKq4F,SAAS73F,QACdi4F,EAAI32F,KAAK22F,EAAIhyF,OAAO,EAAG,GAAG,IAC9BzG,KAAKq4F,SAAS5xF,OAAO7F,MAAMZ,KAAKq4F,SAAUI,KAIlDz4F,KAAKy8F,kBAAoB,SAASlhF,GAC9B,IAAIuM,EAAU9nB,KAAKsrB,OAAOxD,QAC1BvM,EAAGrT,QAAQ,SAASwgB,GACVA,EAAMkrC,WACRlrC,EAAMkrC,SAAW9rC,EAAQ4N,UAAUhN,EAAO,qBAAsB,YAG5E1oB,KAAK47F,qBAAuB,SAASrgF,GACjC,IAAIuM,EAAU9nB,KAAKsrB,OAAOxD,QAC1BvM,EAAGrT,QAAQ,SAASwgB,GAChBZ,EAAQoO,aAAaxN,EAAMkrC,UAC3BlrC,EAAMkrC,SAAW,QAGzB5zD,KAAKg8F,YAAc,SAAStzE,GACxB,IAAIhnB,EAAIgnB,EAAMm0E,QAAQ36F,QAAQwmB,GAC9BA,EAAMm0E,QAAQp2F,OAAO/E,EAAG,GACxBA,EAAI1B,KAAKizC,OAAO/wC,QAAQwmB,GACxB1oB,KAAKizC,OAAOxsC,OAAO/E,EAAG,GACtB1B,KAAKsrB,OAAOxD,QAAQoO,aAAaxN,EAAMkrC,UAClClrC,EAAMm0E,QAAQr8F,SACfkB,EAAI1B,KAAKq4F,SAASn2F,QAAQwmB,EAAMm0E,UACtB,GAANn7F,GACA1B,KAAKq4F,SAAS5xF,OAAO/E,EAAG,GACvB1B,KAAKq4F,SAAS73F,QACfR,KAAKkiC,WAIjBliC,KAAK6lE,gBAAkB,IAAIvH,EAC3Bt+D,KAAK6lE,gBAAgBjG,SAAS,CAC1B,IAAO,SAASk9B,GACRn6F,EAAQ05F,gBAAkB15F,EAAQ05F,eAAehD,cAAcyD,IAInEA,EAAGpE,eAAeK,QAAQ,IAE9B,YAAa,SAAS+D,GAClBA,EAAGpE,eAAeK,SAAS,IAE/B,IAAO,SAAS+D,GACZA,EAAGpE,eAAex2D,UAEtB,OAAU,SAAS46D,GACf,OAAO,OAGhBt7F,KAAKm3F,EAAer3F,WAIvB,IAAIy7F,EAAgB,GACpBA,EAAc30D,SAAWmb,EAAOjiD,UAAU8mC,SAC1C20D,EAAclsE,YAAc,SAASpE,EAAKE,GACtC3sB,KAAKgH,IAAIylB,IAAMA,EACfzsB,KAAKgH,IAAI2lB,OAASA,GAEtBowE,EAAct0C,OAAS,SAASzhD,EAAKqhC,EAAOkc,GACxCvkD,KAAKukD,aAAeA,EACpBvkD,KAAKgH,IAAMA,EACXhH,KAAKooC,SAASC,IAGlB,IAAIu0D,EAAY,SAAS74C,EAAOkU,GACX,GAAblU,EAAMt3B,MACNs3B,EAAMp3B,QAAUsrC,EAAKtrC,QACzBo3B,EAAMt3B,KAAOwrC,EAAKxrC,KAGlBiwE,EAAe,SAAS34C,EAAOj9C,GAC3Bi9C,EAAMt3B,KAAO3lB,EAAM2lB,MACnBs3B,EAAMp3B,QAAU7lB,EAAM6lB,QAC1Bo3B,EAAMt3B,KAAO3lB,EAAM2lB,KAIvB5qB,EAAS,aAAauM,gBAAgB,uMAStCzL,EAAQ05F,eAAiB,IAAInG,EAG7B,IAAIlyB,EAASniE,EAAS,YAAYmiE,QAClC,WACIhkE,KAAK84F,cAAgB,SAASpZ,EAAS3jD,GACnC,OAAOp5B,EAAQ05F,eAAevD,cAAc94F,KAAM0/E,EAAS3jD,IAE/D/7B,KAAKg9F,cAAgB,SAASjhE,GAC1B,OAAOp5B,EAAQ05F,eAAehD,cAAcr5F,KAAM+7B,MAEvDv6B,KAAKwiE,EAAO1iE,aAIf+B,IAAIlD,OAAO,gBAAgB,CAAC,UAAU,UAAU,SAAS,4BAA4B,aAAa,eAAe,YAAY,YAAY,YAAY,WAAW,YAAY,QAAQ,UAAU,aAAa,cAAe,SAAS0B,EAAUc,EAASvC,GACtP,aACA,IAIIkoG,EAAOC,EAJPjqC,EAAcz8D,EAAS,6BAA6By8D,YACpD0F,EAASniE,EAAS,cAAcmiE,OAChCq4B,EAAiBx6F,EAAS,gBAAgBw6F,eAC1C/wD,EAAQzpC,EAAS,aAAaypC,MAElC,SAASk9D,KAETA,EAAelnG,UAAY,CACvBmnG,aAAc,SAASn9E,GACnBtrB,KAAKqD,IAAMioB,EACXtrB,KAAK86D,YAAcxvC,EAAOxD,QAAQi0B,eAC7BusD,IACDA,EAAQroG,OAAOqoG,OACnB,IAAII,EAAYJ,EAAMI,WAAaJ,EAAMK,QAAQ,aACjDD,EAAUE,YAAY,cAAe5oG,KAAK86D,aAC1C96D,KAAK6oG,QAAU,KACf7oG,KAAK6oG,QAAU7oG,KAAK8oG,aAExB57E,kBAAmB,WACf,IAAIxE,EAAQ1oB,KAAKqD,IAAI6pB,oBACjBngB,EAAM/M,KAAKqD,IAAIykB,QAAQ/a,IAC3B,MAAO,CACHjG,MAAOiG,EAAIm6C,gBAAgBx+B,EAAM5hB,OACjC+jB,IAAK9d,EAAIm6C,gBAAgBx+B,EAAMmC,OAGvCk+E,gBAAiB,SAASjiG,EAAO+jB,GAC7B,IAAI9d,EAAM/M,KAAKqD,IAAIykB,QAAQ/a,IAC3B/M,KAAKqD,IAAIyiB,UAAU6C,SAAS,CACxB7hB,MAAOiG,EAAIi6C,gBAAgBlgD,GAC3B+jB,IAAK9d,EAAIi6C,gBAAgBn8B,MAGjCm+E,oBAAqB,WACjB,IAAI3lG,EAAMrD,KAAKqD,IACXopB,EAAMppB,EAAIy3C,oBAAoBruB,IAC9Bw8E,EAAa5lG,EAAIykB,QAAQoZ,QAAQzU,GAAKjsB,OACtCsE,EAAQzB,EAAIykB,QAAQ/a,IAAIm6C,gBAAgB,CAACz6B,IAAKA,EAAKE,OAAQ,IAC/D,MAAO,CACH7lB,MAAOhC,EACP+lB,IAAK/lB,EAAQmkG,IAGrBC,YAAa,WACT,IAAIliG,EAAMhH,KAAKqD,IAAIy3C,oBACnB,OAAO96C,KAAKqD,IAAIykB,QAAQ/a,IAAIm6C,gBAAgBlgD,IAEhDmiG,YAAa,SAASrkG,GAClB,IAAIkC,EAAMhH,KAAKqD,IAAIykB,QAAQ/a,IAAIi6C,gBAAgBliD,GAC/C9E,KAAKqD,IAAIyiB,UAAUuH,eAAermB,IAEtCoiG,eAAgB,WACZ,IAAI38E,EAAMzsB,KAAKqD,IAAIy3C,oBAAoBruB,IACvC,OAAOzsB,KAAKqD,IAAIykB,QAAQoZ,QAAQzU,IAEpC48E,eAAgB,SAAS3gG,EAAO5B,EAAO+jB,EAAKy+E,GAC7B,MAAPz+E,IACAA,EAAe,MAAT/jB,EAAgB9G,KAAKupG,aAAa/oG,OAASsG,GACxC,MAATA,IACAA,EAAQ,GAEZ,IAAIwkB,EAAStrB,KAAKqD,IACd0J,EAAMue,EAAOxD,QAAQ/a,IACrB2b,EAAQ4iB,EAAMuB,WAAW9/B,EAAIi6C,gBAAgBlgD,GAAQiG,EAAIi6C,gBAAgBn8B,IAC7ES,EAAOxD,QAAQvgB,OAAOmhB,GAEtBA,EAAMmC,IAAMnC,EAAM5hB,MAElB4B,EAAQ1I,KAAKwpG,gBAAgB9gG,GAC7B2zF,EAAevD,cAAcxtE,EAAQ5iB,IAEzC6gG,WAAY,WACR,OAAOvpG,KAAKqD,IAAIyhD,YAEpBgkD,UAAW,WACP,GAAI9oG,KAAK6oG,QACL,OAAO7oG,KAAK6oG,QAChB,IAAIY,EAASzpG,KAAKqD,IAAIykB,QAAQ+sC,QAAQzyD,MAAM,KAAKo4B,MACjD,GAAc,QAAVivE,GAA8B,OAAVA,EAAiB,CACrC,IAAIj9E,EAASxsB,KAAKqD,IAAIy3C,oBAClBziB,EAAQr4B,KAAKqD,IAAIykB,QAAQqgC,SAAS37B,EAAOC,KACzB,iBAAT4L,IACPA,EAAQA,EAAM,IACdA,IACAA,EAAQA,EAAMj2B,MAAM,KAChBi2B,EAAM73B,OAAS,EACfipG,EAASpxE,EAAM,GACA,OAAVoxE,IACLA,EAAS,SAGrB,OAAOA,GAEXC,eAAgB,WACZ,IAAIhB,EAAYJ,EAAMI,WAAaJ,EAAMK,QAAQ,aACjD,OAAQ3oG,KAAK8oG,aACX,IAAK,MAAO,MAAO,MACnB,IAAK,MACL,IAAK,MACH,MAAO,MACT,IAAK,OACH,IAAIa,EAAUjB,EAAUkB,YAAY,WAGpC,OAFKD,IACDA,GAAqF,GAA3E3pG,KAAKqD,IAAIykB,QAAQ29B,SAAS,EAAE,GAAGjjD,KAAK,IAAI8uC,OAAO,wBAAgC,QAAS,QAC/Fq4D,EACT,QACE,IAAItxD,EAAOr4C,KAAKqD,IAAIykB,QAAQm0B,MAC5B,OAAO5D,EAAKwxD,aAAexxD,EAAKwxD,YAAYF,SAAW,UAG/D3oC,OAAQ,SAAS8oC,GACb,OAAO9oC,OAAO8oC,IAElBj4C,aAAc,WACV,OAAO7xD,KAAKqD,IAAIykB,QAAQ8O,gBAE5BmzE,YAAa,WACT,MAAO,IAEXP,gBAAiB,SAAS9gG,GACtB,IAAIpG,EAAO,IACP0nG,EAAW,EACXC,EAAW,KACX1uF,EAAK+sF,EAAM4B,UAAY5B,EAAMK,QAAQ,YACrCD,EAAYJ,EAAMI,WAAaJ,EAAMK,QAAQ,aAC7CwB,EAAWzB,EAAU0B,cAAc,QACnCC,EAAiB,CACjBxN,QAAS,SAAS57E,GACd,IAAI+wC,EAAQjjD,SAASkS,EAAK+wC,MAAO,IAC7Bs4C,EAAmB,IAAVt4C,EACTs4C,EACAt4C,IAAUg4C,EAEVh4C,GAAS1vD,EAEb,IAAIknD,EAAcvoC,EAAKuoC,YACnBA,IACAA,EAAcjuC,EAAGgvF,YAAY/gD,EAAa6gD,IAG9C,IAAI5kG,EAAS,KAAOusD,GAASxI,EAAc,IAAMA,EAAc,IAAM,IAMrE,OAJI8gD,IACAL,EAAW,CAAChpF,EAAKna,MAAOrB,IAGrBA,GAEXmT,OAAQ,SAASstB,GACb,MAAU,KAANA,EAAkB,MACZ,MAANA,EAAmB,OAChBA,IAMf,GAFAx9B,EAAQ6S,EAAGgvF,YAAY7hG,EAAO2hG,GAE1BF,EAAS9S,UAAU,0BAA4B,WAAW5zF,KAAKiF,GAC/DA,GAAS,YACN,GAAIuhG,EAAU,CACjB,IAAIO,EAASlC,EAAMmC,MAAQnC,EAAMmC,MAAMD,OAASlC,EAAMK,QAAQ,SAC9DjgG,EAAQ8hG,EAAOE,iBAAiBhiG,EAAO,OAAQuhG,EAAS,GAAIA,EAAS,IAGzE,OAAOvhG,IAKf,IAAIiiG,EAAS,CACTC,oBAAqB,CAAC,IAAO,aAAc,IAAO,SAClDC,mBAAoB,CAAC,IAAO,SAAU,IAAO,UAC7CC,kBAAmB,CAAC,IAAO,SAAU,IAAO,gBAC5CC,cAAe,CAAC,IAAO,aAAc,IAAO,SAC5CC,gBAAiB,YACjBC,gBAAiB,WACjBC,eAAgB,CAAC,IAAO,YAAa,IAAO,UAC5CC,eAAgB,CAAC,IAAO,kBAAmB,IAAO,gBAClDC,WAAY,CAAC,IAAO,YAAa,IAAO,gBACxCC,yBAA0B,CAAC,IAAO,kBAAmB,IAAO,gBAC5DC,sBAAuB,UACvBC,sBAAuB,YACvBC,uBAAwB,SACxBC,uBAAwB,WACxBC,uBAAwB,CAAC,IAAO,iBAAkB,IAAO,gBACzDC,uBAAwB,CAAC,IAAO,mBAAoB,IAAO,kBAC3DC,iBAAkB,CAAC,IAAO,kBAAmB,IAAO,gBACpDC,qBAAsB,CAAC,IAAO,kBAAmB,IAAO,gBACxDC,kBAAmB,CAAC,IAAO,kBAAmB,IAAO,gBAErDC,uBAAwB,CAAC,IAAO,eAAgB,IAAO,UACvDC,6BAA8B,MAC9BC,uBAAwB,CAAC,IAAO,eAAgB,IAAO,iBAGvDC,EAAc,IAAI1D,EAmCtB,IAAK,IAAIhmE,KAlCT7/B,EAAQ8+B,SAAW,IAAI68B,EACvB37D,EAAQwpG,gBAAkB,SAASA,EAAgB7gF,GAC/C,IACI4gF,EAAYzD,aAAan9E,GACzB,IAAI8gF,EAAU9D,EAAM8D,SAAW9D,EAAMK,QAAQ,WAE7C,GAAmB,gCAAf3oG,KAAKklC,OAA0C,CAC/C,IAAK5Z,EAAOxF,UAAUN,UAClB,OAAO,EACX,IAAIxe,EAAMskB,EAAOxF,UAAU0nB,KACvB+G,EAAQjpB,EAAOxD,QAAQgxB,WAAW9xC,EAAIylB,IAAKzlB,EAAI2lB,QACnD,GAAI4nB,GAAS,UAAU9wC,KAAK8wC,EAAM74B,MAC9B,OAAO,EAGf,GAAmB,0BAAf1b,KAAKklC,OACL,OAAO1lB,WAAW,WACd4sF,EAAQC,IAAI,yBAA0BH,IACvC,GAGP,IAAIzmG,EAAS2mG,EAAQC,IAAIrsG,KAAKklC,OAAQgnE,GACxC,MAAM9vF,GACJ,IAAKksF,EAED,OADAgE,EAAKH,EAAgBhnG,KAAKnF,KAAMsrB,KACzB,EAEXA,EAAOiH,QAAQ,eAA4B,iBAALnW,EAAgBA,EAAIA,EAAEof,SAC5D36B,QAAQ+oD,IAAIxtC,GACZ3W,GAAS,EAEb,OAAOA,GAGSklG,EAChBhoG,EAAQ8+B,SAASo9B,WAAW,CACxBl6D,KAAM,SAAW69B,EACjB0C,OAAQ1C,EACRm8B,QAASgsC,EAAOnoE,GAChBj/B,KAAMZ,EAAQwpG,gBACdjrC,kBAAmB,YAI3Bv+D,EAAQ4pG,eAAiB,SAASjhF,EAAQohD,GAClCA,EACAphD,EAAO+4C,WAAWxiC,mBAAmBl/B,EAAQ8+B,UAE7CnW,EAAO+4C,WAAW1iC,sBAAsBh/B,EAAQ8+B,WAIxD9+B,EAAQ6pG,gBAAkB,SAASn0D,GAC/B,IAAKA,EAAM,OAAO,EAClB,GAAIA,EAAKwxD,YAAa,OAAO,EAC7B,IAAIhnG,EAAKw1C,EAAK8K,KAAO9K,EACrB,MAAO,yDAAyD50C,KAAKZ,IAGzEF,EAAQu9D,YAAc,SAAS50C,EAAQkX,GACnC,GAAI,kDAAkD/+B,KAAK++B,GACvD,OAAO,EACX,IAAI6V,EAAO/sB,EAAOxD,QAAQm0B,MACtBwwD,EAAc9pG,EAAQ6pG,gBAAgBn0D,GAC1C,GAAIo0D,GAAep0D,EAAK6J,OACpB,IACIgqD,EAAYzD,aAAan9E,GACrB,SAAS7nB,KAAKyoG,EAAYpD,eAC1B2D,GAAc,GACpB,MAAMrwF,IAEZ,OAAOqwF,GAGX,IAAIzlC,EAAe,SAAS5qD,EAAG/W,GAC3B,IAAIimB,EAASjmB,EACb,GAAKimB,EAAL,CAEA,IAAIohD,EAAU/pE,EAAQ6pG,gBAAgBlhF,EAAOxD,QAAQm0B,QAC/B,IAAlB7/B,EAAEswF,cACFhgC,GAAU,GACVA,GACA4/B,IACJ3pG,EAAQ4pG,eAAejhF,EAAQohD,KAG/B4/B,EAAO,SAASnmF,GACQ,iBAAboiF,GACP1mG,EAAS,cAAc08B,WAAWgqE,EAAW,WACzCA,EAAY,KACZpiF,GAAMA,OAKlBxjB,EAAQ6lG,eAAiBA,EACzB3mG,EAAS,cAAci6B,cAAckoC,EAAO1iE,UAAW,SAAU,CAC7DorG,YAAa,CACT3iG,IAAK,SAASse,GACVroB,KAAKqoB,EAAM,KAAO,kBAAkB,aAAc2+C,GAClDA,EAAa,CAAC0lC,cAAerkF,GAAMroB,OAEvC0I,OAAO,KAIf/F,EAAQgqG,QAAU,SAASvwF,GACP,iBAALA,EACRmsF,EAAYnsF,EAEZksF,EAAQlsF,KAGC,WACI/Y,IAAIxB,SAAS,CAAC,iBAAkB,cADpC,I,mBCnsChBwB,IAAIlD,OAAO,kBAAkB,CAAC,UAAU,UAAU,SAAS,eAAgB,SAAS0B,EAAUc,EAASvC,GAEvGuC,EAAQmkF,QAAS,EACjBnkF,EAAQikF,SAAW,YACnBjkF,EAAQ0L,QAAU,wrDAiFlB,IAAIqV,EAAM7hB,EAAS,cACnB6hB,EAAItV,gBAAgBzL,EAAQ0L,QAAS1L,EAAQikF,a,sIClFxBgmB,EAArB,6D,+DACI,EAAAC,YAAc,CACV,CACI/C,MAAO,KACP99F,IAAK,SACLsD,MAAO,OAEX,CACIw6F,MAAO,OACP99F,IAAK,QACLsD,MAAO,OAEX,CACIw6F,MAAO,OACP99F,IAAK,QACL2lB,SAAS,GAEb,CACIm4E,MAAO,WACP99F,IAAK,MACL2lB,SAAS,GAEb,CACIm4E,MAAO,OACP99F,IAAK,aACLsD,MAAO,QAGf,EAAAw9F,aAAe,CACXzY,IAAK,CACD,CACI0Y,UAAU,EACVvxE,QAAS,WACTm/D,QAAS,WAGjB91F,OAAQ,CACJ,CACIkoG,UAAU,EACVvxE,QAAS,UACTm/D,QAAS,WAGjBxG,SAAU,CACN,CACI4Y,UAAU,EACVvxE,QAAS,WACTm/D,QAAS,WAGjBrG,MAAO,CACH,CACIyY,UAAU,EACVvxE,QAAS,WACTm/D,QAAS,WAGjBnG,GAAI,CACA,CACIuY,UAAU,EACVvxE,QAAS,SACTm/D,QAAS,WAGjBh2F,KAAM,CACF,CACIooG,UAAU,EACVvxE,QAAS,SACTm/D,QAAS,SAGjBz2E,KAAM,CACF,CACI6oF,UAAU,EACVvxE,QAAS,WACTm/D,QAAS,SAGjBpG,SAAU,CACN,CACIwY,UAAU,EACVvxE,QAAS,UACTm/D,QAAS,WAGjBvG,OAAQ,CAAC2Y,UAAU,EAAMrxF,KAAM,SAAU8f,QAAS,SAAUm/D,QAAS,WAEzE,EAAAqS,YAAc,CACVC,aADU,SACGC,GACT,OAAOA,GAAQA,EAAK3iG,UAAY4B,KAAKC,MAAQ,QAzFzD,iFA8FQpM,KAAKk0F,SAAWl0F,KAAK2mG,QAAQwG,SAASntG,KAAKk0F,YA9FnD,qCAiGmB5oE,EAAaxD,EAAc9gB,EAAUsvC,EAAap1C,GAC7DA,EAAS,KAAMlB,KAAK80F,SAAStsF,IAAI,SAAUw6C,GACvC,MAAO,CACHi7C,QAASj7C,EAAKoqD,GACd1kG,MAAOs6C,EAAKoqD,GACZlqD,KAAMF,EAAKE,WAtG3B,mCA4GQ,EAAQ,QACR,EAAQ,YA7GhB,GAA0C,eAAO,SAA5B0pD,EAAY,gBADhC,eAAU,CAAC3W,WAAY,MACH2W,GAAA","file":"js/chunk-69b69a97.c676adee.js","sourcesContent":["/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of Ajax.org B.V. nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\n/**\n * Define a module along with a payload\n * @param module a name for the payload\n * @param payload a function to call with (acequire, exports, module) params\n */\n\n(function() {\n\nvar ACE_NAMESPACE = \"ace\";\n\nvar global = (function() { return this; })();\nif (!global && typeof window != \"undefined\") global = window; // strict mode\n\n\nif (!ACE_NAMESPACE && typeof acequirejs !== \"undefined\")\n return;\n\n\nvar define = function(module, deps, payload) {\n if (typeof module !== \"string\") {\n if (define.original)\n define.original.apply(this, arguments);\n else {\n console.error(\"dropping module because define wasn\\'t a string.\");\n console.trace();\n }\n return;\n }\n if (arguments.length == 2)\n payload = deps;\n if (!define.modules[module]) {\n define.payloads[module] = payload;\n define.modules[module] = null;\n }\n};\n\ndefine.modules = {};\ndefine.payloads = {};\n\n/**\n * Get at functionality define()ed using the function above\n */\nvar _acequire = function(parentId, module, callback) {\n if (typeof module === \"string\") {\n var payload = lookup(parentId, module);\n if (payload != undefined) {\n callback && callback();\n return payload;\n }\n } else if (Object.prototype.toString.call(module) === \"[object Array]\") {\n var params = [];\n for (var i = 0, l = module.length; i < l; ++i) {\n var dep = lookup(parentId, module[i]);\n if (dep == undefined && acequire.original)\n return;\n params.push(dep);\n }\n return callback && callback.apply(null, params) || true;\n }\n};\n\nvar acequire = function(module, callback) {\n var packagedModule = _acequire(\"\", module, callback);\n if (packagedModule == undefined && acequire.original)\n return acequire.original.apply(this, arguments);\n return packagedModule;\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n // normalize plugin acequires\n if (moduleName.indexOf(\"!\") !== -1) {\n var chunks = moduleName.split(\"!\");\n return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n }\n // normalize relative acequires\n if (moduleName.charAt(0) == \".\") {\n var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n moduleName = base + \"/\" + moduleName;\n\n while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n var previous = moduleName;\n moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n }\n }\n return moduleName;\n};\n\n/**\n * Internal function to lookup moduleNames and resolve them by calling the\n * definition function if needed.\n */\nvar lookup = function(parentId, moduleName) {\n moduleName = normalizeModule(parentId, moduleName);\n\n var module = define.modules[moduleName];\n if (!module) {\n module = define.payloads[moduleName];\n if (typeof module === 'function') {\n var exports = {};\n var mod = {\n id: moduleName,\n uri: '',\n exports: exports,\n packaged: true\n };\n\n var req = function(module, callback) {\n return _acequire(moduleName, module, callback);\n };\n\n var returnValue = module(req, exports, mod);\n exports = returnValue || mod.exports;\n define.modules[moduleName] = exports;\n delete define.payloads[moduleName];\n }\n module = define.modules[moduleName] = exports || module;\n }\n return module;\n};\n\nfunction exportAce(ns) {\n var root = global;\n if (ns) {\n if (!global[ns])\n global[ns] = {};\n root = global[ns];\n }\n\n if (!root.define || !root.define.packaged) {\n define.original = root.define;\n root.define = define;\n root.define.packaged = true;\n }\n\n if (!root.acequire || !root.acequire.packaged) {\n acequire.original = root.acequire;\n root.acequire = acequire;\n root.acequire.packaged = true;\n }\n}\n\nexportAce(ACE_NAMESPACE);\n\n})();\n\nace.define(\"ace/lib/regexp\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\n var real = {\n exec: RegExp.prototype.exec,\n test: RegExp.prototype.test,\n match: String.prototype.match,\n replace: String.prototype.replace,\n split: String.prototype.split\n },\n compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n compliantLastIndexIncrement = function () {\n var x = /^/g;\n real.test.call(x, \"\");\n return !x.lastIndex;\n }();\n\n if (compliantLastIndexIncrement && compliantExecNpcg)\n return;\n RegExp.prototype.exec = function (str) {\n var match = real.exec.apply(this, arguments),\n name, r2;\n if ( typeof(str) == 'string' && match) {\n if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n real.replace.call(str.slice(match.index), r2, function () {\n for (var i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined)\n match[i] = undefined;\n }\n });\n }\n if (this._xregexp && this._xregexp.captureNames) {\n for (var i = 1; i < match.length; i++) {\n name = this._xregexp.captureNames[i - 1];\n if (name)\n match[name] = match[i];\n }\n }\n if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n this.lastIndex--;\n }\n return match;\n };\n if (!compliantLastIndexIncrement) {\n RegExp.prototype.test = function (str) {\n var match = real.exec.call(this, str);\n if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n this.lastIndex--;\n return !!match;\n };\n }\n\n function getNativeFlags (regex) {\n return (regex.global ? \"g\" : \"\") +\n (regex.ignoreCase ? \"i\" : \"\") +\n (regex.multiline ? \"m\" : \"\") +\n (regex.extended ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n (regex.sticky ? \"y\" : \"\");\n }\n\n function indexOf (array, item, from) {\n if (Array.prototype.indexOf) // Use the native array method if available\n return array.indexOf(item, from);\n for (var i = from || 0; i < array.length; i++) {\n if (array[i] === item)\n return i;\n }\n return -1;\n }\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n Function.prototype.bind = function bind(that) { // .length is 1\n var target = this;\n if (typeof target != \"function\") {\n throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n }\n var args = slice.call(arguments, 1); // for normal call\n var bound = function () {\n\n if (this instanceof bound) {\n\n var result = target.apply(\n this,\n args.concat(slice.call(arguments))\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n\n } else {\n return target.apply(\n that,\n args.concat(slice.call(arguments))\n );\n\n }\n\n };\n if(target.prototype) {\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n return bound;\n };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n if(function() { // test IE < 9 to splice bug - see issue #138\n function makeArray(l) {\n var a = new Array(l+2);\n a[0] = a[1] = 0;\n return a;\n }\n var array = [], lengthBefore;\n \n array.splice.apply(array, makeArray(20));\n array.splice.apply(array, makeArray(26));\n\n lengthBefore = array.length; //46\n array.splice(5, 0, \"XXX\"); // add one element\n\n lengthBefore + 1 == array.length\n\n if (lengthBefore + 1 == array.length) {\n return true;// has right splice implementation without bugs\n }\n }()) {//IE 6/7\n var array_splice = Array.prototype.splice;\n Array.prototype.splice = function(start, deleteCount) {\n if (!arguments.length) {\n return [];\n } else {\n return array_splice.apply(this, [\n start === void 0 ? 0 : start,\n deleteCount === void 0 ? (this.length - start) : deleteCount\n ].concat(slice.call(arguments, 2)))\n }\n };\n } else {//IE8\n Array.prototype.splice = function(pos, removeCount){\n var length = this.length;\n if (pos > 0) {\n if (pos > length)\n pos = length;\n } else if (pos == void 0) {\n pos = 0;\n } else if (pos < 0) {\n pos = Math.max(length + pos, 0);\n }\n\n if (!(pos+removeCount < length))\n removeCount = length - pos;\n\n var removed = this.slice(pos, pos+removeCount);\n var insert = slice.call(arguments, 2);\n var add = insert.length; \n if (pos === length) {\n if (add) {\n this.push.apply(this, insert);\n }\n } else {\n var remove = Math.min(removeCount, length - pos);\n var tailOldPos = pos + remove;\n var tailNewPos = tailOldPos + add - remove;\n var tailCount = length - tailOldPos;\n var lengthAfterRemove = length - remove;\n\n if (tailNewPos < tailOldPos) { // case A\n for (var i = 0; i < tailCount; ++i) {\n this[tailNewPos+i] = this[tailOldPos+i];\n }\n } else if (tailNewPos > tailOldPos) { // case B\n for (i = tailCount; i--; ) {\n this[tailNewPos+i] = this[tailOldPos+i];\n }\n } // else, add == remove (nothing to do)\n\n if (add && pos === lengthAfterRemove) {\n this.length = lengthAfterRemove; // truncate array\n this.push.apply(this, insert);\n } else {\n this.length = lengthAfterRemove + add; // reserves space\n for (i = 0; i < add; ++i) {\n this[pos+i] = insert[i];\n }\n }\n }\n return removed;\n };\n }\n}\nif (!Array.isArray) {\n Array.isArray = function isArray(obj) {\n return _toString(obj) == \"[object Array]\";\n };\n}\nvar boxedString = Object(\"a\"),\n splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n thisp = arguments[1],\n i = -1,\n length = self.length >>> 0;\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(); // TODO message\n }\n\n while (++i < length) {\n if (i in self) {\n fun.call(thisp, self[i], i, object);\n }\n }\n };\n}\nif (!Array.prototype.map) {\n Array.prototype.map = function map(fun /*, thisp*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n result = Array(length),\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self)\n result[i] = fun.call(thisp, self[i], i, object);\n }\n return result;\n };\n}\nif (!Array.prototype.filter) {\n Array.prototype.filter = function filter(fun /*, thisp */) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n result = [],\n value,\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self) {\n value = self[i];\n if (fun.call(thisp, value, i, object)) {\n result.push(value);\n }\n }\n }\n return result;\n };\n}\nif (!Array.prototype.every) {\n Array.prototype.every = function every(fun /*, thisp */) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self && !fun.call(thisp, self[i], i, object)) {\n return false;\n }\n }\n return true;\n };\n}\nif (!Array.prototype.some) {\n Array.prototype.some = function some(fun /*, thisp */) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self && fun.call(thisp, self[i], i, object)) {\n return true;\n }\n }\n return false;\n };\n}\nif (!Array.prototype.reduce) {\n Array.prototype.reduce = function reduce(fun /*, initial*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0;\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n if (!length && arguments.length == 1) {\n throw new TypeError(\"reduce of empty array with no initial value\");\n }\n\n var i = 0;\n var result;\n if (arguments.length >= 2) {\n result = arguments[1];\n } else {\n do {\n if (i in self) {\n result = self[i++];\n break;\n }\n if (++i >= length) {\n throw new TypeError(\"reduce of empty array with no initial value\");\n }\n } while (true);\n }\n\n for (; i < length; i++) {\n if (i in self) {\n result = fun.call(void 0, result, self[i], i, object);\n }\n }\n\n return result;\n };\n}\nif (!Array.prototype.reduceRight) {\n Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0;\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n if (!length && arguments.length == 1) {\n throw new TypeError(\"reduceRight of empty array with no initial value\");\n }\n\n var result, i = length - 1;\n if (arguments.length >= 2) {\n result = arguments[1];\n } else {\n do {\n if (i in self) {\n result = self[i--];\n break;\n }\n if (--i < 0) {\n throw new TypeError(\"reduceRight of empty array with no initial value\");\n }\n } while (true);\n }\n\n do {\n if (i in this) {\n result = fun.call(void 0, result, self[i], i, object);\n }\n } while (i--);\n\n return result;\n };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n var self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n toObject(this),\n length = self.length >>> 0;\n\n if (!length) {\n return -1;\n }\n\n var i = 0;\n if (arguments.length > 1) {\n i = toInteger(arguments[1]);\n }\n i = i >= 0 ? i : Math.max(0, length + i);\n for (; i < length; i++) {\n if (i in self && self[i] === sought) {\n return i;\n }\n }\n return -1;\n };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n var self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n toObject(this),\n length = self.length >>> 0;\n\n if (!length) {\n return -1;\n }\n var i = length - 1;\n if (arguments.length > 1) {\n i = Math.min(i, toInteger(arguments[1]));\n }\n i = i >= 0 ? i : length - Math.abs(i);\n for (; i >= 0; i--) {\n if (i in self && sought === self[i]) {\n return i;\n }\n }\n return -1;\n };\n}\nif (!Object.getPrototypeOf) {\n Object.getPrototypeOf = function getPrototypeOf(object) {\n return object.__proto__ || (\n object.constructor ?\n object.constructor.prototype :\n prototypeOfObject\n );\n };\n}\nif (!Object.getOwnPropertyDescriptor) {\n var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n \"non-object: \";\n Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n throw new TypeError(ERR_NON_OBJECT + object);\n if (!owns(object, property))\n return;\n\n var descriptor, getter, setter;\n descriptor = { enumerable: true, configurable: true };\n if (supportsAccessors) {\n var prototype = object.__proto__;\n object.__proto__ = prototypeOfObject;\n\n var getter = lookupGetter(object, property);\n var setter = lookupSetter(object, property);\n object.__proto__ = prototype;\n\n if (getter || setter) {\n if (getter) descriptor.get = getter;\n if (setter) descriptor.set = setter;\n return descriptor;\n }\n }\n descriptor.value = object[property];\n return descriptor;\n };\n}\nif (!Object.getOwnPropertyNames) {\n Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n return Object.keys(object);\n };\n}\nif (!Object.create) {\n var createEmpty;\n if (Object.prototype.__proto__ === null) {\n createEmpty = function () {\n return { \"__proto__\": null };\n };\n } else {\n createEmpty = function () {\n var empty = {};\n for (var i in empty)\n empty[i] = null;\n empty.constructor =\n empty.hasOwnProperty =\n empty.propertyIsEnumerable =\n empty.isPrototypeOf =\n empty.toLocaleString =\n empty.toString =\n empty.valueOf =\n empty.__proto__ = null;\n return empty;\n }\n }\n\n Object.create = function create(prototype, properties) {\n var object;\n if (prototype === null) {\n object = createEmpty();\n } else {\n if (typeof prototype != \"object\")\n throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n var Type = function () {};\n Type.prototype = prototype;\n object = new Type();\n object.__proto__ = prototype;\n }\n if (properties !== void 0)\n Object.defineProperties(object, properties);\n return object;\n };\n}\n\nfunction doesDefinePropertyWork(object) {\n try {\n Object.defineProperty(object, \"sentinel\", {});\n return \"sentinel\" in object;\n } catch (exception) {\n }\n}\nif (Object.defineProperty) {\n var definePropertyWorksOnObject = doesDefinePropertyWork({});\n var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n doesDefinePropertyWork(document.createElement(\"div\"));\n if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n var definePropertyFallback = Object.defineProperty;\n }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n \"on this javascript engine\";\n\n Object.defineProperty = function defineProperty(object, property, descriptor) {\n if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n if (definePropertyFallback) {\n try {\n return definePropertyFallback.call(Object, object, property, descriptor);\n } catch (exception) {\n }\n }\n if (owns(descriptor, \"value\")) {\n\n if (supportsAccessors && (lookupGetter(object, property) ||\n lookupSetter(object, property)))\n {\n var prototype = object.__proto__;\n object.__proto__ = prototypeOfObject;\n delete object[property];\n object[property] = descriptor.value;\n object.__proto__ = prototype;\n } else {\n object[property] = descriptor.value;\n }\n } else {\n if (!supportsAccessors)\n throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n if (owns(descriptor, \"get\"))\n defineGetter(object, property, descriptor.get);\n if (owns(descriptor, \"set\"))\n defineSetter(object, property, descriptor.set);\n }\n\n return object;\n };\n}\nif (!Object.defineProperties) {\n Object.defineProperties = function defineProperties(object, properties) {\n for (var property in properties) {\n if (owns(properties, property))\n Object.defineProperty(object, property, properties[property]);\n }\n return object;\n };\n}\nif (!Object.seal) {\n Object.seal = function seal(object) {\n return object;\n };\n}\nif (!Object.freeze) {\n Object.freeze = function freeze(object) {\n return object;\n };\n}\ntry {\n Object.freeze(function () {});\n} catch (exception) {\n Object.freeze = (function freeze(freezeObject) {\n return function freeze(object) {\n if (typeof object == \"function\") {\n return object;\n } else {\n return freezeObject(object);\n }\n };\n })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n Object.preventExtensions = function preventExtensions(object) {\n return object;\n };\n}\nif (!Object.isSealed) {\n Object.isSealed = function isSealed(object) {\n return false;\n };\n}\nif (!Object.isFrozen) {\n Object.isFrozen = function isFrozen(object) {\n return false;\n };\n}\nif (!Object.isExtensible) {\n Object.isExtensible = function isExtensible(object) {\n if (Object(object) === object) {\n throw new TypeError(); // TODO message\n }\n var name = '';\n while (owns(object, name)) {\n name += '?';\n }\n object[name] = true;\n var returnValue = owns(object, name);\n delete object[name];\n return returnValue;\n };\n}\nif (!Object.keys) {\n var hasDontEnumBug = true,\n dontEnums = [\n \"toString\",\n \"toLocaleString\",\n \"valueOf\",\n \"hasOwnProperty\",\n \"isPrototypeOf\",\n \"propertyIsEnumerable\",\n \"constructor\"\n ],\n dontEnumsLength = dontEnums.length;\n\n for (var key in {\"toString\": null}) {\n hasDontEnumBug = false;\n }\n\n Object.keys = function keys(object) {\n\n if (\n (typeof object != \"object\" && typeof object != \"function\") ||\n object === null\n ) {\n throw new TypeError(\"Object.keys called on a non-object\");\n }\n\n var keys = [];\n for (var name in object) {\n if (owns(object, name)) {\n keys.push(name);\n }\n }\n\n if (hasDontEnumBug) {\n for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n var dontEnum = dontEnums[i];\n if (owns(object, dontEnum)) {\n keys.push(dontEnum);\n }\n }\n }\n return keys;\n };\n\n}\nif (!Date.now) {\n Date.now = function now() {\n return new Date().getTime();\n };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n ws = \"[\" + ws + \"]\";\n var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n trimEndRegexp = new RegExp(ws + ws + \"*$\");\n String.prototype.trim = function trim() {\n return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n };\n}\n\nfunction toInteger(n) {\n n = +n;\n if (n !== n) { // isNaN\n n = 0;\n } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n n = (n > 0 || -1) * Math.floor(Math.abs(n));\n }\n return n;\n}\n\nfunction isPrimitive(input) {\n var type = typeof input;\n return (\n input === null ||\n type === \"undefined\" ||\n type === \"boolean\" ||\n type === \"number\" ||\n type === \"string\"\n );\n}\n\nfunction toPrimitive(input) {\n var val, valueOf, toString;\n if (isPrimitive(input)) {\n return input;\n }\n valueOf = input.valueOf;\n if (typeof valueOf === \"function\") {\n val = valueOf.call(input);\n if (isPrimitive(val)) {\n return val;\n }\n }\n toString = input.toString;\n if (typeof toString === \"function\") {\n val = toString.call(input);\n if (isPrimitive(val)) {\n return val;\n }\n }\n throw new TypeError();\n}\nvar toObject = function (o) {\n if (o == null) { // this matches both null and undefined\n throw new TypeError(\"can't convert \"+o+\" to object\");\n }\n return Object(o);\n};\n\n});\n\nace.define(\"ace/lib/fixoldbrowsers\",[\"require\",\"exports\",\"module\",\"ace/lib/regexp\",\"ace/lib/es5-shim\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./regexp\");\nacequire(\"./es5-shim\");\n\n});\n\nace.define(\"ace/lib/dom\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nexports.getDocumentHead = function(doc) {\n if (!doc)\n doc = document;\n return doc.head || doc.getElementsByTagName(\"head\")[0] || doc.documentElement;\n};\n\nexports.createElement = function(tag, ns) {\n return document.createElementNS ?\n document.createElementNS(ns || XHTML_NS, tag) :\n document.createElement(tag);\n};\n\nexports.hasCssClass = function(el, name) {\n var classes = (el.className + \"\").split(/\\s+/g);\n return classes.indexOf(name) !== -1;\n};\nexports.addCssClass = function(el, name) {\n if (!exports.hasCssClass(el, name)) {\n el.className += \" \" + name;\n }\n};\nexports.removeCssClass = function(el, name) {\n var classes = el.className.split(/\\s+/g);\n while (true) {\n var index = classes.indexOf(name);\n if (index == -1) {\n break;\n }\n classes.splice(index, 1);\n }\n el.className = classes.join(\" \");\n};\n\nexports.toggleCssClass = function(el, name) {\n var classes = el.className.split(/\\s+/g), add = true;\n while (true) {\n var index = classes.indexOf(name);\n if (index == -1) {\n break;\n }\n add = false;\n classes.splice(index, 1);\n }\n if (add)\n classes.push(name);\n\n el.className = classes.join(\" \");\n return add;\n};\nexports.setCssClass = function(node, className, include) {\n if (include) {\n exports.addCssClass(node, className);\n } else {\n exports.removeCssClass(node, className);\n }\n};\n\nexports.hasCssString = function(id, doc) {\n var index = 0, sheets;\n doc = doc || document;\n\n if (doc.createStyleSheet && (sheets = doc.styleSheets)) {\n while (index < sheets.length)\n if (sheets[index++].owningElement.id === id) return true;\n } else if ((sheets = doc.getElementsByTagName(\"style\"))) {\n while (index < sheets.length)\n if (sheets[index++].id === id) return true;\n }\n\n return false;\n};\n\nexports.importCssString = function importCssString(cssText, id, doc) {\n doc = doc || document;\n if (id && exports.hasCssString(id, doc))\n return null;\n \n var style;\n \n if (id)\n cssText += \"\\n/*# sourceURL=ace/css/\" + id + \" */\";\n \n if (doc.createStyleSheet) {\n style = doc.createStyleSheet();\n style.cssText = cssText;\n if (id)\n style.owningElement.id = id;\n } else {\n style = exports.createElement(\"style\");\n style.appendChild(doc.createTextNode(cssText));\n if (id)\n style.id = id;\n\n exports.getDocumentHead(doc).appendChild(style);\n }\n};\n\nexports.importCssStylsheet = function(uri, doc) {\n if (doc.createStyleSheet) {\n doc.createStyleSheet(uri);\n } else {\n var link = exports.createElement('link');\n link.rel = 'stylesheet';\n link.href = uri;\n\n exports.getDocumentHead(doc).appendChild(link);\n }\n};\n\nexports.getInnerWidth = function(element) {\n return (\n parseInt(exports.computedStyle(element, \"paddingLeft\"), 10) +\n parseInt(exports.computedStyle(element, \"paddingRight\"), 10) + \n element.clientWidth\n );\n};\n\nexports.getInnerHeight = function(element) {\n return (\n parseInt(exports.computedStyle(element, \"paddingTop\"), 10) +\n parseInt(exports.computedStyle(element, \"paddingBottom\"), 10) +\n element.clientHeight\n );\n};\n\nexports.scrollbarWidth = function(document) {\n var inner = exports.createElement(\"ace_inner\");\n inner.style.width = \"100%\";\n inner.style.minWidth = \"0px\";\n inner.style.height = \"200px\";\n inner.style.display = \"block\";\n\n var outer = exports.createElement(\"ace_outer\");\n var style = outer.style;\n\n style.position = \"absolute\";\n style.left = \"-10000px\";\n style.overflow = \"hidden\";\n style.width = \"200px\";\n style.minWidth = \"0px\";\n style.height = \"150px\";\n style.display = \"block\";\n\n outer.appendChild(inner);\n\n var body = document.documentElement;\n body.appendChild(outer);\n\n var noScrollbar = inner.offsetWidth;\n\n style.overflow = \"scroll\";\n var withScrollbar = inner.offsetWidth;\n\n if (noScrollbar == withScrollbar) {\n withScrollbar = outer.clientWidth;\n }\n\n body.removeChild(outer);\n\n return noScrollbar-withScrollbar;\n};\n\nif (typeof document == \"undefined\") {\n exports.importCssString = function() {};\n return;\n}\n\nif (window.pageYOffset !== undefined) {\n exports.getPageScrollTop = function() {\n return window.pageYOffset;\n };\n\n exports.getPageScrollLeft = function() {\n return window.pageXOffset;\n };\n}\nelse {\n exports.getPageScrollTop = function() {\n return document.body.scrollTop;\n };\n\n exports.getPageScrollLeft = function() {\n return document.body.scrollLeft;\n };\n}\n\nif (window.getComputedStyle)\n exports.computedStyle = function(element, style) {\n if (style)\n return (window.getComputedStyle(element, \"\") || {})[style] || \"\";\n return window.getComputedStyle(element, \"\") || {};\n };\nelse\n exports.computedStyle = function(element, style) {\n if (style)\n return element.currentStyle[style];\n return element.currentStyle;\n };\nexports.setInnerHtml = function(el, innerHtml) {\n var element = el.cloneNode(false);//document.createElement(\"div\");\n element.innerHTML = innerHtml;\n el.parentNode.replaceChild(element, el);\n return element;\n};\n\nif (\"textContent\" in document.documentElement) {\n exports.setInnerText = function(el, innerText) {\n el.textContent = innerText;\n };\n\n exports.getInnerText = function(el) {\n return el.textContent;\n };\n}\nelse {\n exports.setInnerText = function(el, innerText) {\n el.innerText = innerText;\n };\n\n exports.getInnerText = function(el) {\n return el.innerText;\n };\n}\n\nexports.getParentWindow = function(document) {\n return document.defaultView || document.parentWindow;\n};\n\n});\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, superCtor) {\n ctor.super_ = superCtor;\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n};\n\nexports.mixin = function(obj, mixin) {\n for (var key in mixin) {\n obj[key] = mixin[key];\n }\n return obj;\n};\n\nexports.implement = function(proto, mixin) {\n exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/keys\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./fixoldbrowsers\");\n\nvar oop = acequire(\"./oop\");\nvar Keys = (function() {\n var ret = {\n MODIFIER_KEYS: {\n 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'\n },\n\n KEY_MODS: {\n \"ctrl\": 1, \"alt\": 2, \"option\" : 2, \"shift\": 4,\n \"super\": 8, \"meta\": 8, \"command\": 8, \"cmd\": 8\n },\n\n FUNCTION_KEYS : {\n 8 : \"Backspace\",\n 9 : \"Tab\",\n 13 : \"Return\",\n 19 : \"Pause\",\n 27 : \"Esc\",\n 32 : \"Space\",\n 33 : \"PageUp\",\n 34 : \"PageDown\",\n 35 : \"End\",\n 36 : \"Home\",\n 37 : \"Left\",\n 38 : \"Up\",\n 39 : \"Right\",\n 40 : \"Down\",\n 44 : \"Print\",\n 45 : \"Insert\",\n 46 : \"Delete\",\n 96 : \"Numpad0\",\n 97 : \"Numpad1\",\n 98 : \"Numpad2\",\n 99 : \"Numpad3\",\n 100: \"Numpad4\",\n 101: \"Numpad5\",\n 102: \"Numpad6\",\n 103: \"Numpad7\",\n 104: \"Numpad8\",\n 105: \"Numpad9\",\n '-13': \"NumpadEnter\",\n 112: \"F1\",\n 113: \"F2\",\n 114: \"F3\",\n 115: \"F4\",\n 116: \"F5\",\n 117: \"F6\",\n 118: \"F7\",\n 119: \"F8\",\n 120: \"F9\",\n 121: \"F10\",\n 122: \"F11\",\n 123: \"F12\",\n 144: \"Numlock\",\n 145: \"Scrolllock\"\n },\n\n PRINTABLE_KEYS: {\n 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5',\n 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a',\n 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h',\n 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o',\n 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v',\n 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.',\n 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`',\n 219: '[', 220: '\\\\',221: ']', 222: \"'\", 111: '/', 106: '*'\n }\n };\n var name, i;\n for (i in ret.FUNCTION_KEYS) {\n name = ret.FUNCTION_KEYS[i].toLowerCase();\n ret[name] = parseInt(i, 10);\n }\n for (i in ret.PRINTABLE_KEYS) {\n name = ret.PRINTABLE_KEYS[i].toLowerCase();\n ret[name] = parseInt(i, 10);\n }\n oop.mixin(ret, ret.MODIFIER_KEYS);\n oop.mixin(ret, ret.PRINTABLE_KEYS);\n oop.mixin(ret, ret.FUNCTION_KEYS);\n ret.enter = ret[\"return\"];\n ret.escape = ret.esc;\n ret.del = ret[\"delete\"];\n ret[173] = '-';\n \n (function() {\n var mods = [\"cmd\", \"ctrl\", \"alt\", \"shift\"];\n for (var i = Math.pow(2, mods.length); i--;) { \n ret.KEY_MODS[i] = mods.filter(function(x) {\n return i & ret.KEY_MODS[x];\n }).join(\"-\") + \"-\";\n }\n })();\n\n ret.KEY_MODS[0] = \"\";\n ret.KEY_MODS[-1] = \"input-\";\n\n return ret;\n})();\noop.mixin(exports, Keys);\n\nexports.keyCodeToString = function(keyCode) {\n var keyString = Keys[keyCode];\n if (typeof keyString != \"string\")\n keyString = String.fromCharCode(keyCode);\n return keyString.toLowerCase();\n};\n\n});\n\nace.define(\"ace/lib/useragent\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nexports.OS = {\n LINUX: \"LINUX\",\n MAC: \"MAC\",\n WINDOWS: \"WINDOWS\"\n};\nexports.getOS = function() {\n if (exports.isMac) {\n return exports.OS.MAC;\n } else if (exports.isLinux) {\n return exports.OS.LINUX;\n } else {\n return exports.OS.WINDOWS;\n }\n};\nif (typeof navigator != \"object\")\n return;\n\nvar os = (navigator.platform.match(/mac|win|linux/i) || [\"other\"])[0].toLowerCase();\nvar ua = navigator.userAgent;\nexports.isWin = (os == \"win\");\nexports.isMac = (os == \"mac\");\nexports.isLinux = (os == \"linux\");\nexports.isIE = \n (navigator.appName == \"Microsoft Internet Explorer\" || navigator.appName.indexOf(\"MSAppHost\") >= 0)\n ? parseFloat((ua.match(/(?:MSIE |Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1])\n : parseFloat((ua.match(/(?:Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1]); // for ie\n \nexports.isOldIE = exports.isIE && exports.isIE < 9;\nexports.isGecko = exports.isMozilla = (window.Controllers || window.controllers) && window.navigator.product === \"Gecko\";\nexports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv:(\\d+)/)||[])[1], 10) < 4;\nexports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == \"[object Opera]\";\nexports.isWebKit = parseFloat(ua.split(\"WebKit/\")[1]) || undefined;\n\nexports.isChrome = parseFloat(ua.split(\" Chrome/\")[1]) || undefined;\n\nexports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\nexports.isIPad = ua.indexOf(\"iPad\") >= 0;\n\nexports.isChromeOS = ua.indexOf(\" CrOS \") >= 0;\n\nexports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream;\n\nif (exports.isIOS) exports.isMac = true;\n\n});\n\nace.define(\"ace/lib/event\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar keys = acequire(\"./keys\");\nvar useragent = acequire(\"./useragent\");\n\nvar pressedKeys = null;\nvar ts = 0;\n\nexports.addListener = function(elem, type, callback) {\n if (elem.addEventListener) {\n return elem.addEventListener(type, callback, false);\n }\n if (elem.attachEvent) {\n var wrapper = function() {\n callback.call(elem, window.event);\n };\n callback._wrapper = wrapper;\n elem.attachEvent(\"on\" + type, wrapper);\n }\n};\n\nexports.removeListener = function(elem, type, callback) {\n if (elem.removeEventListener) {\n return elem.removeEventListener(type, callback, false);\n }\n if (elem.detachEvent) {\n elem.detachEvent(\"on\" + type, callback._wrapper || callback);\n }\n};\nexports.stopEvent = function(e) {\n exports.stopPropagation(e);\n exports.preventDefault(e);\n return false;\n};\n\nexports.stopPropagation = function(e) {\n if (e.stopPropagation)\n e.stopPropagation();\n else\n e.cancelBubble = true;\n};\n\nexports.preventDefault = function(e) {\n if (e.preventDefault)\n e.preventDefault();\n else\n e.returnValue = false;\n};\nexports.getButton = function(e) {\n if (e.type == \"dblclick\")\n return 0;\n if (e.type == \"contextmenu\" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))\n return 2;\n if (e.preventDefault) {\n return e.button;\n }\n else {\n return {1:0, 2:2, 4:1}[e.button];\n }\n};\n\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\n function onMouseUp(e) {\n eventHandler && eventHandler(e);\n releaseCaptureHandler && releaseCaptureHandler(e);\n\n exports.removeListener(document, \"mousemove\", eventHandler, true);\n exports.removeListener(document, \"mouseup\", onMouseUp, true);\n exports.removeListener(document, \"dragstart\", onMouseUp, true);\n }\n\n exports.addListener(document, \"mousemove\", eventHandler, true);\n exports.addListener(document, \"mouseup\", onMouseUp, true);\n exports.addListener(document, \"dragstart\", onMouseUp, true);\n \n return onMouseUp;\n};\n\nexports.addTouchMoveListener = function (el, callback) {\n var startx, starty;\n exports.addListener(el, \"touchstart\", function (e) {\n var touches = e.touches;\n var touchObj = touches[0];\n startx = touchObj.clientX;\n starty = touchObj.clientY;\n });\n exports.addListener(el, \"touchmove\", function (e) {\n var touches = e.touches;\n if (touches.length > 1) return;\n\n var touchObj = touches[0];\n\n e.wheelX = startx - touchObj.clientX;\n e.wheelY = starty - touchObj.clientY;\n\n startx = touchObj.clientX;\n starty = touchObj.clientY;\n\n callback(e);\n });\n};\n\nexports.addMouseWheelListener = function(el, callback) {\n if (\"onmousewheel\" in el) {\n exports.addListener(el, \"mousewheel\", function(e) {\n var factor = 8;\n if (e.wheelDeltaX !== undefined) {\n e.wheelX = -e.wheelDeltaX / factor;\n e.wheelY = -e.wheelDeltaY / factor;\n } else {\n e.wheelX = 0;\n e.wheelY = -e.wheelDelta / factor;\n }\n callback(e);\n });\n } else if (\"onwheel\" in el) {\n exports.addListener(el, \"wheel\", function(e) {\n var factor = 0.35;\n switch (e.deltaMode) {\n case e.DOM_DELTA_PIXEL:\n e.wheelX = e.deltaX * factor || 0;\n e.wheelY = e.deltaY * factor || 0;\n break;\n case e.DOM_DELTA_LINE:\n case e.DOM_DELTA_PAGE:\n e.wheelX = (e.deltaX || 0) * 5;\n e.wheelY = (e.deltaY || 0) * 5;\n break;\n }\n \n callback(e);\n });\n } else {\n exports.addListener(el, \"DOMMouseScroll\", function(e) {\n if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\n e.wheelX = (e.detail || 0) * 5;\n e.wheelY = 0;\n } else {\n e.wheelX = 0;\n e.wheelY = (e.detail || 0) * 5;\n }\n callback(e);\n });\n }\n};\n\nexports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName) {\n var clicks = 0;\n var startX, startY, timer; \n var eventNames = {\n 2: \"dblclick\",\n 3: \"tripleclick\",\n 4: \"quadclick\"\n };\n\n function onMousedown(e) {\n if (exports.getButton(e) !== 0) {\n clicks = 0;\n } else if (e.detail > 1) {\n clicks++;\n if (clicks > 4)\n clicks = 1;\n } else {\n clicks = 1;\n }\n if (useragent.isIE) {\n var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n if (!timer || isNewClick)\n clicks = 1;\n if (timer)\n clearTimeout(timer);\n timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600);\n\n if (clicks == 1) {\n startX = e.clientX;\n startY = e.clientY;\n }\n }\n \n e._clicks = clicks;\n\n eventHandler[callbackName](\"mousedown\", e);\n\n if (clicks > 4)\n clicks = 0;\n else if (clicks > 1)\n return eventHandler[callbackName](eventNames[clicks], e);\n }\n function onDblclick(e) {\n clicks = 2;\n if (timer)\n clearTimeout(timer);\n timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600);\n eventHandler[callbackName](\"mousedown\", e);\n eventHandler[callbackName](eventNames[clicks], e);\n }\n if (!Array.isArray(elements))\n elements = [elements];\n elements.forEach(function(el) {\n exports.addListener(el, \"mousedown\", onMousedown);\n if (useragent.isOldIE)\n exports.addListener(el, \"dblclick\", onDblclick);\n });\n};\n\nvar getModifierHash = useragent.isMac && useragent.isOpera && !(\"KeyboardEvent\" in window)\n ? function(e) {\n return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);\n }\n : function(e) {\n return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\n };\n\nexports.getModifierString = function(e) {\n return keys.KEY_MODS[getModifierHash(e)];\n};\n\nfunction normalizeCommandKeys(callback, e, keyCode) {\n var hashId = getModifierHash(e);\n\n if (!useragent.isMac && pressedKeys) {\n if (e.getModifierState && (e.getModifierState(\"OS\") || e.getModifierState(\"Win\")))\n hashId |= 8;\n if (pressedKeys.altGr) {\n if ((3 & hashId) != 3)\n pressedKeys.altGr = 0;\n else\n return;\n }\n if (keyCode === 18 || keyCode === 17) {\n var location = \"location\" in e ? e.location : e.keyLocation;\n if (keyCode === 17 && location === 1) {\n if (pressedKeys[keyCode] == 1)\n ts = e.timeStamp;\n } else if (keyCode === 18 && hashId === 3 && location === 2) {\n var dt = e.timeStamp - ts;\n if (dt < 50)\n pressedKeys.altGr = true;\n }\n }\n }\n \n if (keyCode in keys.MODIFIER_KEYS) {\n keyCode = -1;\n }\n if (hashId & 8 && (keyCode >= 91 && keyCode <= 93)) {\n keyCode = -1;\n }\n \n if (!hashId && keyCode === 13) {\n var location = \"location\" in e ? e.location : e.keyLocation;\n if (location === 3) {\n callback(e, hashId, -keyCode);\n if (e.defaultPrevented)\n return;\n }\n }\n \n if (useragent.isChromeOS && hashId & 8) {\n callback(e, hashId, keyCode);\n if (e.defaultPrevented)\n return;\n else\n hashId &= ~8;\n }\n if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\n return false;\n }\n \n return callback(e, hashId, keyCode);\n}\n\n\nexports.addCommandKeyListener = function(el, callback) {\n var addListener = exports.addListener;\n if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n var lastKeyDownKeyCode = null;\n addListener(el, \"keydown\", function(e) {\n lastKeyDownKeyCode = e.keyCode;\n });\n addListener(el, \"keypress\", function(e) {\n return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n });\n } else {\n var lastDefaultPrevented = null;\n\n addListener(el, \"keydown\", function(e) {\n pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1;\n var result = normalizeCommandKeys(callback, e, e.keyCode);\n lastDefaultPrevented = e.defaultPrevented;\n return result;\n });\n\n addListener(el, \"keypress\", function(e) {\n if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {\n exports.stopEvent(e);\n lastDefaultPrevented = null;\n }\n });\n\n addListener(el, \"keyup\", function(e) {\n pressedKeys[e.keyCode] = null;\n });\n\n if (!pressedKeys) {\n resetPressedKeys();\n addListener(window, \"focus\", resetPressedKeys);\n }\n }\n};\nfunction resetPressedKeys() {\n pressedKeys = Object.create(null);\n}\n\nif (typeof window == \"object\" && window.postMessage && !useragent.isOldIE) {\n var postMessageId = 1;\n exports.nextTick = function(callback, win) {\n win = win || window;\n var messageName = \"zero-timeout-message-\" + postMessageId;\n exports.addListener(win, \"message\", function listener(e) {\n if (e.data == messageName) {\n exports.stopPropagation(e);\n exports.removeListener(win, \"message\", listener);\n callback();\n }\n });\n win.postMessage(messageName, \"*\");\n };\n}\n\n\nexports.nextFrame = typeof window == \"object\" && (window.requestAnimationFrame\n || window.mozRequestAnimationFrame\n || window.webkitRequestAnimationFrame\n || window.msRequestAnimationFrame\n || window.oRequestAnimationFrame);\n\nif (exports.nextFrame)\n exports.nextFrame = exports.nextFrame.bind(window);\nelse\n exports.nextFrame = function(callback) {\n setTimeout(callback, 17);\n };\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n var result = '';\n while (count > 0) {\n if (count & 1)\n result += string;\n\n if (count >>= 1)\n string += string;\n }\n return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n var copy = {};\n for (var key in obj) {\n copy[key] = obj[key];\n }\n return copy;\n};\n\nexports.copyArray = function(array){\n var copy = [];\n for (var i=0, l=array.length; i PLACEHOLDER.length)\n data = data.substr(9);\n else if (data.substr(0, 4) == PLACEHOLDER.substr(0, 4))\n data = data.substr(4, data.length - PLACEHOLDER.length + 1);\n else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n if (data == PLACEHOLDER.charAt(0)) {\n } else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n\n if (data)\n host.onTextInput(data);\n }\n if (copied) {\n copied = false;\n }\n if (afterContextMenu)\n afterContextMenu = false;\n };\n var onInput = function(e) {\n if (inComposition)\n return;\n var data = text.value;\n sendText(data);\n resetValue();\n };\n\n var handleClipboardData = function(e, data, forceIEMime) {\n var clipboardData = e.clipboardData || window.clipboardData;\n if (!clipboardData || BROKEN_SETDATA)\n return;\n var mime = USE_IE_MIME_TYPE || forceIEMime ? \"Text\" : \"text/plain\";\n try {\n if (data) {\n return clipboardData.setData(mime, data) !== false;\n } else {\n return clipboardData.getData(mime);\n }\n } catch(e) {\n if (!forceIEMime)\n return handleClipboardData(e, data, true);\n }\n };\n\n var doCopy = function(e, isCut) {\n var data = host.getCopyText();\n if (!data)\n return event.preventDefault(e);\n\n if (handleClipboardData(e, data)) {\n if (useragent.isIOS) {\n cut = isCut;\n text.value = \"\\n aa\" + data + \"a a\\n\";\n text.setSelectionRange(4, 4 + data.length);\n copied = {\n value: data\n };\n }\n isCut ? host.onCut() : host.onCopy();\n if (!useragent.isIOS) event.preventDefault(e);\n } else {\n copied = true;\n text.value = data;\n text.select();\n setTimeout(function(){\n copied = false;\n resetValue();\n resetSelection();\n isCut ? host.onCut() : host.onCopy();\n });\n }\n };\n\n var onCut = function(e) {\n doCopy(e, true);\n };\n\n var onCopy = function(e) {\n doCopy(e, false);\n };\n\n var onPaste = function(e) {\n var data = handleClipboardData(e);\n if (typeof data == \"string\") {\n if (data)\n host.onPaste(data, e);\n if (useragent.isIE)\n setTimeout(resetSelection);\n event.preventDefault(e);\n }\n else {\n text.value = \"\";\n pasted = true;\n }\n };\n\n event.addCommandKeyListener(text, host.onCommandKey.bind(host));\n\n event.addListener(text, \"select\", onSelect);\n\n event.addListener(text, \"input\", onInput);\n\n event.addListener(text, \"cut\", onCut);\n event.addListener(text, \"copy\", onCopy);\n event.addListener(text, \"paste\", onPaste);\n var onCompositionStart = function(e) {\n if (inComposition || !host.onCompositionStart || host.$readOnly)\n return;\n inComposition = {};\n inComposition.canUndo = host.session.$undoManager;\n host.onCompositionStart();\n setTimeout(onCompositionUpdate, 0);\n host.on(\"mousedown\", onCompositionEnd);\n if (inComposition.canUndo && !host.selection.isEmpty()) {\n host.insert(\"\");\n host.session.markUndoGroup();\n host.selection.clearSelection();\n }\n host.session.markUndoGroup();\n };\n\n var onCompositionUpdate = function() {\n if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n return;\n var val = text.value.replace(/\\x01/g, \"\");\n if (inComposition.lastValue === val) return;\n\n host.onCompositionUpdate(val);\n if (inComposition.lastValue)\n host.undo();\n if (inComposition.canUndo)\n inComposition.lastValue = val;\n if (inComposition.lastValue) {\n var r = host.selection.getRange();\n host.insert(inComposition.lastValue);\n host.session.markUndoGroup();\n inComposition.range = host.selection.getRange();\n host.selection.setRange(r);\n host.selection.clearSelection();\n }\n };\n\n var onCompositionEnd = function(e) {\n if (!host.onCompositionEnd || host.$readOnly) return;\n var c = inComposition;\n inComposition = false;\n var timer = setTimeout(function() {\n timer = null;\n var str = text.value.replace(/\\x01/g, \"\");\n if (inComposition)\n return;\n else if (str == c.lastValue)\n resetValue();\n else if (!c.lastValue && str) {\n resetValue();\n sendText(str);\n }\n });\n inputHandler = function compositionInputHandler(str) {\n if (timer)\n clearTimeout(timer);\n str = str.replace(/\\x01/g, \"\");\n if (str == c.lastValue)\n return \"\";\n if (c.lastValue && timer)\n host.undo();\n return str;\n };\n host.onCompositionEnd();\n host.removeListener(\"mousedown\", onCompositionEnd);\n if (e.type == \"compositionend\" && c.range) {\n host.selection.setRange(c.range);\n }\n var needsOnInput =\n (!!useragent.isChrome && useragent.isChrome >= 53) ||\n (!!useragent.isWebKit && useragent.isWebKit >= 603);\n\n if (needsOnInput) {\n onInput();\n }\n };\n\n\n\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\n\n event.addListener(text, \"compositionstart\", onCompositionStart);\n if (useragent.isGecko) {\n event.addListener(text, \"text\", function(){syncComposition.schedule();});\n } else {\n event.addListener(text, \"keyup\", function(){syncComposition.schedule();});\n event.addListener(text, \"keydown\", function(){syncComposition.schedule();});\n }\n event.addListener(text, \"compositionend\", onCompositionEnd);\n\n this.getElement = function() {\n return text;\n };\n\n this.setReadOnly = function(readOnly) {\n text.readOnly = readOnly;\n };\n\n this.onContextMenu = function(e) {\n afterContextMenu = true;\n resetSelection(host.selection.isEmpty());\n host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n this.moveToMouse(e, true);\n };\n\n this.moveToMouse = function(e, bringToFront) {\n if (!tempStyle)\n tempStyle = text.style.cssText;\n text.style.cssText = (bringToFront ? \"z-index:100000;\" : \"\")\n + \"height:\" + text.style.height + \";\"\n + (useragent.isIE ? \"opacity:0.1;\" : \"\");\n\n var rect = host.container.getBoundingClientRect();\n var style = dom.computedStyle(host.container);\n var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\n var maxTop = rect.bottom - top - text.clientHeight -2;\n var move = function(e) {\n text.style.left = e.clientX - left - 2 + \"px\";\n text.style.top = Math.min(e.clientY - top - 2, maxTop) + \"px\";\n };\n move(e);\n\n if (e.type != \"mousedown\")\n return;\n\n if (host.renderer.$keepTextAreaAtCursor)\n host.renderer.$keepTextAreaAtCursor = null;\n\n clearTimeout(closeTimeout);\n if (useragent.isWin)\n event.capture(host.container, move, onContextMenuClose);\n };\n\n this.onContextMenuClose = onContextMenuClose;\n var closeTimeout;\n function onContextMenuClose() {\n clearTimeout(closeTimeout);\n closeTimeout = setTimeout(function () {\n if (tempStyle) {\n text.style.cssText = tempStyle;\n tempStyle = '';\n }\n if (host.renderer.$keepTextAreaAtCursor == null) {\n host.renderer.$keepTextAreaAtCursor = true;\n host.renderer.$moveTextAreaToCursor();\n }\n }, 0);\n }\n\n var onContextMenu = function(e) {\n host.textInput.onContextMenu(e);\n onContextMenuClose();\n };\n event.addListener(text, \"mouseup\", onContextMenu);\n event.addListener(text, \"mousedown\", function(e) {\n e.preventDefault();\n onContextMenuClose();\n });\n event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu);\n event.addListener(text, \"contextmenu\", onContextMenu);\n\n if (useragent.isIOS) {\n var typingResetTimeout = null;\n var typing = false;\n\n parentNode.addEventListener(\"keydown\", function (e) {\n if (typingResetTimeout) clearTimeout(typingResetTimeout);\n typing = true;\n });\n\n parentNode.addEventListener(\"keyup\", function (e) {\n typingResetTimeout = setTimeout(function () {\n typing = false;\n }, 100);\n });\n var detectArrowKeys = function(e) {\n if (document.activeElement !== text) return;\n if (typing) return;\n\n if (cut) {\n return setTimeout(function () {\n cut = false;\n }, 100);\n }\n var selectionStart = text.selectionStart;\n var selectionEnd = text.selectionEnd;\n text.setSelectionRange(4, 5);\n if (selectionStart == selectionEnd) {\n switch (selectionStart) {\n case 0: host.onCommandKey(null, 0, KEYS.up); break;\n case 1: host.onCommandKey(null, 0, KEYS.home); break;\n case 2: host.onCommandKey(null, MODS.option, KEYS.left); break;\n case 4: host.onCommandKey(null, 0, KEYS.left); break;\n case 5: host.onCommandKey(null, 0, KEYS.right); break;\n case 7: host.onCommandKey(null, MODS.option, KEYS.right); break;\n case 8: host.onCommandKey(null, 0, KEYS.end); break;\n case 9: host.onCommandKey(null, 0, KEYS.down); break;\n }\n } else {\n switch (selectionEnd) {\n case 6: host.onCommandKey(null, MODS.shift, KEYS.right); break;\n case 7: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.right); break;\n case 8: host.onCommandKey(null, MODS.shift, KEYS.end); break;\n case 9: host.onCommandKey(null, MODS.shift, KEYS.down); break;\n }\n switch (selectionStart) {\n case 0: host.onCommandKey(null, MODS.shift, KEYS.up); break;\n case 1: host.onCommandKey(null, MODS.shift, KEYS.home); break;\n case 2: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.left); break;\n case 3: host.onCommandKey(null, MODS.shift, KEYS.left); break;\n }\n }\n };\n document.addEventListener(\"selectionchange\", detectArrowKeys);\n host.on(\"destroy\", function() {\n document.removeEventListener(\"selectionchange\", detectArrowKeys);\n });\n }\n};\n\nexports.TextInput = TextInput;\n});\n\nace.define(\"ace/keyboard/textinput\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/keyboard/textinput_ios\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar BROKEN_SETDATA = useragent.isChrome < 18;\nvar USE_IE_MIME_TYPE = useragent.isIE;\n\nvar TextInputIOS = acequire(\"./textinput_ios\").TextInput;\nvar TextInput = function(parentNode, host) {\n if (useragent.isIOS)\n return TextInputIOS.call(this, parentNode, host);\n\n var text = dom.createElement(\"textarea\");\n text.className = \"ace_text-input\";\n\n text.setAttribute(\"wrap\", \"off\");\n text.setAttribute(\"autocorrect\", \"off\");\n text.setAttribute(\"autocapitalize\", \"off\");\n text.setAttribute(\"spellcheck\", false);\n\n text.style.opacity = \"0\";\n parentNode.insertBefore(text, parentNode.firstChild);\n\n var PLACEHOLDER = \"\\u2028\\u2028\";\n\n var copied = false;\n var pasted = false;\n var inComposition = false;\n var tempStyle = '';\n var isSelectionEmpty = true;\n try { var isFocused = document.activeElement === text; } catch(e) {}\n \n event.addListener(text, \"blur\", function(e) {\n host.onBlur(e);\n isFocused = false;\n });\n event.addListener(text, \"focus\", function(e) {\n isFocused = true;\n host.onFocus(e);\n resetSelection();\n });\n this.focus = function() {\n if (tempStyle) return text.focus();\n var top = text.style.top;\n text.style.position = \"fixed\";\n text.style.top = \"0px\";\n text.focus();\n setTimeout(function() {\n text.style.position = \"\";\n if (text.style.top == \"0px\")\n text.style.top = top;\n }, 0);\n };\n this.blur = function() {\n text.blur();\n };\n this.isFocused = function() {\n return isFocused;\n };\n var syncSelection = lang.delayedCall(function() {\n isFocused && resetSelection(isSelectionEmpty);\n });\n var syncValue = lang.delayedCall(function() {\n if (!inComposition) {\n text.value = PLACEHOLDER;\n isFocused && resetSelection();\n }\n });\n\n function resetSelection(isEmpty) {\n if (inComposition)\n return;\n inComposition = true;\n \n if (inputHandler) {\n var selectionStart = 0;\n var selectionEnd = isEmpty ? 0 : text.value.length - 1;\n } else {\n var selectionStart = isEmpty ? 2 : 1;\n var selectionEnd = 2;\n }\n try {\n text.setSelectionRange(selectionStart, selectionEnd);\n } catch(e){}\n \n inComposition = false;\n }\n\n function resetValue() {\n if (inComposition)\n return;\n text.value = PLACEHOLDER;\n if (useragent.isWebKit)\n syncValue.schedule();\n }\n\n useragent.isWebKit || host.addEventListener('changeSelection', function() {\n if (host.selection.isEmpty() != isSelectionEmpty) {\n isSelectionEmpty = !isSelectionEmpty;\n syncSelection.schedule();\n }\n });\n\n resetValue();\n if (isFocused)\n host.onFocus();\n\n\n var isAllSelected = function(text) {\n return text.selectionStart === 0 && text.selectionEnd === text.value.length;\n };\n\n var onSelect = function(e) {\n if (copied) {\n copied = false;\n } else if (isAllSelected(text)) {\n host.selectAll();\n resetSelection();\n } else if (inputHandler) {\n resetSelection(host.selection.isEmpty());\n }\n };\n\n var inputHandler = null;\n this.setInputHandler = function(cb) {inputHandler = cb;};\n this.getInputHandler = function() {return inputHandler;};\n var afterContextMenu = false;\n \n var sendText = function(data) {\n if (inputHandler) {\n data = inputHandler(data);\n inputHandler = null;\n }\n if (pasted) {\n resetSelection();\n if (data)\n host.onPaste(data);\n pasted = false;\n } else if (data == PLACEHOLDER.charAt(0)) {\n if (afterContextMenu)\n host.execCommand(\"del\", {source: \"ace\"});\n else // some versions of android do not fire keydown when pressing backspace\n host.execCommand(\"backspace\", {source: \"ace\"});\n } else {\n if (data.substring(0, 2) == PLACEHOLDER)\n data = data.substr(2);\n else if (data.charAt(0) == PLACEHOLDER.charAt(0))\n data = data.substr(1);\n else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n \n if (data)\n host.onTextInput(data);\n }\n if (afterContextMenu)\n afterContextMenu = false;\n };\n var onInput = function(e) {\n if (inComposition)\n return;\n var data = text.value;\n sendText(data);\n resetValue();\n };\n \n var handleClipboardData = function(e, data, forceIEMime) {\n var clipboardData = e.clipboardData || window.clipboardData;\n if (!clipboardData || BROKEN_SETDATA)\n return;\n var mime = USE_IE_MIME_TYPE || forceIEMime ? \"Text\" : \"text/plain\";\n try {\n if (data) {\n return clipboardData.setData(mime, data) !== false;\n } else {\n return clipboardData.getData(mime);\n }\n } catch(e) {\n if (!forceIEMime)\n return handleClipboardData(e, data, true);\n }\n };\n\n var doCopy = function(e, isCut) {\n var data = host.getCopyText();\n if (!data)\n return event.preventDefault(e);\n\n if (handleClipboardData(e, data)) {\n isCut ? host.onCut() : host.onCopy();\n event.preventDefault(e);\n } else {\n copied = true;\n text.value = data;\n text.select();\n setTimeout(function(){\n copied = false;\n resetValue();\n resetSelection();\n isCut ? host.onCut() : host.onCopy();\n });\n }\n };\n \n var onCut = function(e) {\n doCopy(e, true);\n };\n \n var onCopy = function(e) {\n doCopy(e, false);\n };\n \n var onPaste = function(e) {\n var data = handleClipboardData(e);\n if (typeof data == \"string\") {\n if (data)\n host.onPaste(data, e);\n if (useragent.isIE)\n setTimeout(resetSelection);\n event.preventDefault(e);\n }\n else {\n text.value = \"\";\n pasted = true;\n }\n };\n\n event.addCommandKeyListener(text, host.onCommandKey.bind(host));\n\n event.addListener(text, \"select\", onSelect);\n\n event.addListener(text, \"input\", onInput);\n\n event.addListener(text, \"cut\", onCut);\n event.addListener(text, \"copy\", onCopy);\n event.addListener(text, \"paste\", onPaste);\n if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)) {\n event.addListener(parentNode, \"keydown\", function(e) {\n if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)\n return;\n\n switch (e.keyCode) {\n case 67:\n onCopy(e);\n break;\n case 86:\n onPaste(e);\n break;\n case 88:\n onCut(e);\n break;\n }\n });\n }\n var onCompositionStart = function(e) {\n if (inComposition || !host.onCompositionStart || host.$readOnly) \n return;\n inComposition = {};\n inComposition.canUndo = host.session.$undoManager;\n host.onCompositionStart();\n setTimeout(onCompositionUpdate, 0);\n host.on(\"mousedown\", onCompositionEnd);\n if (inComposition.canUndo && !host.selection.isEmpty()) {\n host.insert(\"\");\n host.session.markUndoGroup();\n host.selection.clearSelection();\n }\n host.session.markUndoGroup();\n };\n\n var onCompositionUpdate = function() {\n if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n return;\n var val = text.value.replace(/\\u2028/g, \"\");\n if (inComposition.lastValue === val) return;\n \n host.onCompositionUpdate(val);\n if (inComposition.lastValue)\n host.undo();\n if (inComposition.canUndo)\n inComposition.lastValue = val;\n if (inComposition.lastValue) {\n var r = host.selection.getRange();\n host.insert(inComposition.lastValue);\n host.session.markUndoGroup();\n inComposition.range = host.selection.getRange();\n host.selection.setRange(r);\n host.selection.clearSelection();\n }\n };\n\n var onCompositionEnd = function(e) {\n if (!host.onCompositionEnd || host.$readOnly) return;\n var c = inComposition;\n inComposition = false;\n var timer = setTimeout(function() {\n timer = null;\n var str = text.value.replace(/\\u2028/g, \"\");\n if (inComposition)\n return;\n else if (str == c.lastValue)\n resetValue();\n else if (!c.lastValue && str) {\n resetValue();\n sendText(str);\n }\n });\n inputHandler = function compositionInputHandler(str) {\n if (timer)\n clearTimeout(timer);\n str = str.replace(/\\u2028/g, \"\");\n if (str == c.lastValue)\n return \"\";\n if (c.lastValue && timer)\n host.undo();\n return str;\n };\n host.onCompositionEnd();\n host.removeListener(\"mousedown\", onCompositionEnd);\n if (e.type == \"compositionend\" && c.range) {\n host.selection.setRange(c.range);\n }\n var needsOnInput =\n (!!useragent.isChrome && useragent.isChrome >= 53) ||\n (!!useragent.isWebKit && useragent.isWebKit >= 603);\n\n if (needsOnInput) {\n onInput();\n }\n };\n \n \n\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\n\n event.addListener(text, \"compositionstart\", onCompositionStart);\n if (useragent.isGecko) {\n event.addListener(text, \"text\", function(){syncComposition.schedule();});\n } else {\n event.addListener(text, \"keyup\", function(){syncComposition.schedule();});\n event.addListener(text, \"keydown\", function(){syncComposition.schedule();});\n }\n event.addListener(text, \"compositionend\", onCompositionEnd);\n\n this.getElement = function() {\n return text;\n };\n\n this.setReadOnly = function(readOnly) {\n text.readOnly = readOnly;\n };\n\n this.onContextMenu = function(e) {\n afterContextMenu = true;\n resetSelection(host.selection.isEmpty());\n host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n this.moveToMouse(e, true);\n };\n \n this.moveToMouse = function(e, bringToFront) {\n if (!tempStyle)\n tempStyle = text.style.cssText;\n text.style.cssText = (bringToFront ? \"z-index:100000;\" : \"\")\n + \"height:\" + text.style.height + \";\"\n + (useragent.isIE ? \"opacity:0.1;\" : \"\");\n\n var rect = host.container.getBoundingClientRect();\n var style = dom.computedStyle(host.container);\n var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\n var maxTop = rect.bottom - top - text.clientHeight -2;\n var move = function(e) {\n text.style.left = e.clientX - left - 2 + \"px\";\n text.style.top = Math.min(e.clientY - top - 2, maxTop) + \"px\";\n }; \n move(e);\n\n if (e.type != \"mousedown\")\n return;\n\n if (host.renderer.$keepTextAreaAtCursor)\n host.renderer.$keepTextAreaAtCursor = null;\n\n clearTimeout(closeTimeout);\n if (useragent.isWin)\n event.capture(host.container, move, onContextMenuClose);\n };\n\n this.onContextMenuClose = onContextMenuClose;\n var closeTimeout;\n function onContextMenuClose() {\n clearTimeout(closeTimeout);\n closeTimeout = setTimeout(function () {\n if (tempStyle) {\n text.style.cssText = tempStyle;\n tempStyle = '';\n }\n if (host.renderer.$keepTextAreaAtCursor == null) {\n host.renderer.$keepTextAreaAtCursor = true;\n host.renderer.$moveTextAreaToCursor();\n }\n }, 0);\n }\n\n var onContextMenu = function(e) {\n host.textInput.onContextMenu(e);\n onContextMenuClose();\n };\n event.addListener(text, \"mouseup\", onContextMenu);\n event.addListener(text, \"mousedown\", function(e) {\n e.preventDefault();\n onContextMenuClose();\n });\n event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu);\n event.addListener(text, \"contextmenu\", onContextMenu);\n};\n\nexports.TextInput = TextInput;\n});\n\nace.define(\"ace/mouse/default_handlers\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\n\nvar DRAG_OFFSET = 0; // pixels\nvar SCROLL_COOLDOWN_T = 250; // milliseconds\n\nfunction DefaultHandlers(mouseHandler) {\n mouseHandler.$clickSelection = null;\n\n var editor = mouseHandler.editor;\n editor.setDefaultHandler(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n editor.setDefaultHandler(\"dblclick\", this.onDoubleClick.bind(mouseHandler));\n editor.setDefaultHandler(\"tripleclick\", this.onTripleClick.bind(mouseHandler));\n editor.setDefaultHandler(\"quadclick\", this.onQuadClick.bind(mouseHandler));\n editor.setDefaultHandler(\"mousewheel\", this.onMouseWheel.bind(mouseHandler));\n editor.setDefaultHandler(\"touchmove\", this.onTouchMove.bind(mouseHandler));\n\n var exports = [\"select\", \"startSelect\", \"selectEnd\", \"selectAllEnd\", \"selectByWordsEnd\",\n \"selectByLinesEnd\", \"dragWait\", \"dragWaitEnd\", \"focusWait\"];\n\n exports.forEach(function(x) {\n mouseHandler[x] = this[x];\n }, this);\n\n mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, \"getLineRange\");\n mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, \"getWordRange\");\n}\n\n(function() {\n\n this.onMouseDown = function(ev) {\n var inSelection = ev.inSelection();\n var pos = ev.getDocumentPosition();\n this.mousedownEvent = ev;\n var editor = this.editor;\n\n var button = ev.getButton();\n if (button !== 0) {\n var selectionRange = editor.getSelectionRange();\n var selectionEmpty = selectionRange.isEmpty();\n editor.$blockScrolling++;\n if (selectionEmpty || button == 1)\n editor.selection.moveToPosition(pos);\n editor.$blockScrolling--;\n if (button == 2) {\n editor.textInput.onContextMenu(ev.domEvent);\n if (!useragent.isMozilla)\n ev.preventDefault();\n }\n return;\n }\n\n this.mousedownEvent.time = Date.now();\n if (inSelection && !editor.isFocused()) {\n editor.focus();\n if (this.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) {\n this.setState(\"focusWait\");\n this.captureMouse(ev);\n return;\n }\n }\n\n this.captureMouse(ev);\n this.startSelect(pos, ev.domEvent._clicks > 1);\n return ev.preventDefault();\n };\n\n this.startSelect = function(pos, waitForClickSelection) {\n pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n var editor = this.editor;\n editor.$blockScrolling++;\n if (this.mousedownEvent.getShiftKey())\n editor.selection.selectToPosition(pos);\n else if (!waitForClickSelection)\n editor.selection.moveToPosition(pos);\n if (!waitForClickSelection)\n this.select();\n if (editor.renderer.scroller.setCapture) {\n editor.renderer.scroller.setCapture();\n }\n editor.setStyle(\"ace_selecting\");\n this.setState(\"select\");\n editor.$blockScrolling--;\n };\n\n this.select = function() {\n var anchor, editor = this.editor;\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n editor.$blockScrolling++;\n if (this.$clickSelection) {\n var cmp = this.$clickSelection.comparePoint(cursor);\n\n if (cmp == -1) {\n anchor = this.$clickSelection.end;\n } else if (cmp == 1) {\n anchor = this.$clickSelection.start;\n } else {\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n cursor = orientedRange.cursor;\n anchor = orientedRange.anchor;\n }\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n }\n editor.selection.selectToPosition(cursor);\n editor.$blockScrolling--;\n editor.renderer.scrollCursorIntoView();\n };\n\n this.extendSelectionBy = function(unitName) {\n var anchor, editor = this.editor;\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n var range = editor.selection[unitName](cursor.row, cursor.column);\n editor.$blockScrolling++;\n if (this.$clickSelection) {\n var cmpStart = this.$clickSelection.comparePoint(range.start);\n var cmpEnd = this.$clickSelection.comparePoint(range.end);\n\n if (cmpStart == -1 && cmpEnd <= 0) {\n anchor = this.$clickSelection.end;\n if (range.end.row != cursor.row || range.end.column != cursor.column)\n cursor = range.start;\n } else if (cmpEnd == 1 && cmpStart >= 0) {\n anchor = this.$clickSelection.start;\n if (range.start.row != cursor.row || range.start.column != cursor.column)\n cursor = range.end;\n } else if (cmpStart == -1 && cmpEnd == 1) {\n cursor = range.end;\n anchor = range.start;\n } else {\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n cursor = orientedRange.cursor;\n anchor = orientedRange.anchor;\n }\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n }\n editor.selection.selectToPosition(cursor);\n editor.$blockScrolling--;\n editor.renderer.scrollCursorIntoView();\n };\n\n this.selectEnd =\n this.selectAllEnd =\n this.selectByWordsEnd =\n this.selectByLinesEnd = function() {\n this.$clickSelection = null;\n this.editor.unsetStyle(\"ace_selecting\");\n if (this.editor.renderer.scroller.releaseCapture) {\n this.editor.renderer.scroller.releaseCapture();\n }\n };\n\n this.focusWait = function() {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n var time = Date.now();\n\n if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout)\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n };\n\n this.onDoubleClick = function(ev) {\n var pos = ev.getDocumentPosition();\n var editor = this.editor;\n var session = editor.session;\n\n var range = session.getBracketRange(pos);\n if (range) {\n if (range.isEmpty()) {\n range.start.column--;\n range.end.column++;\n }\n this.setState(\"select\");\n } else {\n range = editor.selection.getWordRange(pos.row, pos.column);\n this.setState(\"selectByWords\");\n }\n this.$clickSelection = range;\n this.select();\n };\n\n this.onTripleClick = function(ev) {\n var pos = ev.getDocumentPosition();\n var editor = this.editor;\n\n this.setState(\"selectByLines\");\n var range = editor.getSelectionRange();\n if (range.isMultiLine() && range.contains(pos.row, pos.column)) {\n this.$clickSelection = editor.selection.getLineRange(range.start.row);\n this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end;\n } else {\n this.$clickSelection = editor.selection.getLineRange(pos.row);\n }\n this.select();\n };\n\n this.onQuadClick = function(ev) {\n var editor = this.editor;\n\n editor.selectAll();\n this.$clickSelection = editor.getSelectionRange();\n this.setState(\"selectAll\");\n };\n\n this.onMouseWheel = function(ev) {\n if (ev.getAccelKey())\n return;\n if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {\n ev.wheelX = ev.wheelY;\n ev.wheelY = 0;\n }\n \n var editor = this.editor;\n\n if (!this.$lastScroll)\n this.$lastScroll = { t: 0, vx: 0, vy: 0, allowed: 0 };\n\n var prevScroll = this.$lastScroll;\n var t = ev.domEvent.timeStamp;\n var dt = t - prevScroll.t;\n var vx = ev.wheelX / dt;\n var vy = ev.wheelY / dt;\n if (dt < SCROLL_COOLDOWN_T) {\n vx = (vx + prevScroll.vx) / 2;\n vy = (vy + prevScroll.vy) / 2;\n }\n\n var direction = Math.abs(vx / vy);\n\n var canScroll = false;\n if (direction >= 1 && editor.renderer.isScrollableBy(ev.wheelX * ev.speed, 0))\n canScroll = true;\n if (direction <= 1 && editor.renderer.isScrollableBy(0, ev.wheelY * ev.speed))\n canScroll = true;\n\n if (canScroll) {\n prevScroll.allowed = t;\n } else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) {\n var isSlower = Math.abs(vx) <= 1.1 * Math.abs(prevScroll.vx)\n && Math.abs(vy) <= 1.1 * Math.abs(prevScroll.vy);\n if (isSlower) {\n canScroll = true;\n prevScroll.allowed = t;\n }\n else {\n prevScroll.allowed = 0;\n }\n }\n\n prevScroll.t = t;\n prevScroll.vx = vx;\n prevScroll.vy = vy;\n\n if (canScroll) {\n editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n return ev.stop();\n }\n };\n\n this.onTouchMove = function(ev) {\n this.editor._emit(\"mousewheel\", ev);\n };\n\n}).call(DefaultHandlers.prototype);\n\nexports.DefaultHandlers = DefaultHandlers;\n\nfunction calcDistance(ax, ay, bx, by) {\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nfunction calcRangeOrientation(range, cursor) {\n if (range.start.row == range.end.row)\n var cmp = 2 * cursor.column - range.start.column - range.end.column;\n else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)\n var cmp = cursor.column - 4;\n else\n var cmp = 2 * cursor.row - range.start.row - range.end.row;\n\n if (cmp < 0)\n return {cursor: range.start, anchor: range.end};\n else\n return {cursor: range.end, anchor: range.start};\n}\n\n});\n\nace.define(\"ace/tooltip\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nfunction Tooltip (parentNode) {\n this.isOpen = false;\n this.$element = null;\n this.$parentNode = parentNode;\n}\n\n(function() {\n this.$init = function() {\n this.$element = dom.createElement(\"div\");\n this.$element.className = \"ace_tooltip\";\n this.$element.style.display = \"none\";\n this.$parentNode.appendChild(this.$element);\n return this.$element;\n };\n this.getElement = function() {\n return this.$element || this.$init();\n };\n this.setText = function(text) {\n dom.setInnerText(this.getElement(), text);\n };\n this.setHtml = function(html) {\n this.getElement().innerHTML = html;\n };\n this.setPosition = function(x, y) {\n this.getElement().style.left = x + \"px\";\n this.getElement().style.top = y + \"px\";\n };\n this.setClassName = function(className) {\n dom.addCssClass(this.getElement(), className);\n };\n this.show = function(text, x, y) {\n if (text != null)\n this.setText(text);\n if (x != null && y != null)\n this.setPosition(x, y);\n if (!this.isOpen) {\n this.getElement().style.display = \"block\";\n this.isOpen = true;\n }\n };\n\n this.hide = function() {\n if (this.isOpen) {\n this.getElement().style.display = \"none\";\n this.isOpen = false;\n }\n };\n this.getHeight = function() {\n return this.getElement().offsetHeight;\n };\n this.getWidth = function() {\n return this.getElement().offsetWidth;\n };\n\n this.destroy = function() {\n this.isOpen = false;\n if (this.$element && this.$element.parentNode) {\n this.$element.parentNode.removeChild(this.$element);\n }\n };\n\n}).call(Tooltip.prototype);\n\nexports.Tooltip = Tooltip;\n});\n\nace.define(\"ace/mouse/default_gutter_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/event\",\"ace/tooltip\"], function(acequire, exports, module) {\n\"use strict\";\nvar dom = acequire(\"../lib/dom\");\nvar oop = acequire(\"../lib/oop\");\nvar event = acequire(\"../lib/event\");\nvar Tooltip = acequire(\"../tooltip\").Tooltip;\n\nfunction GutterHandler(mouseHandler) {\n var editor = mouseHandler.editor;\n var gutter = editor.renderer.$gutterLayer;\n var tooltip = new GutterTooltip(editor.container);\n\n mouseHandler.editor.setDefaultHandler(\"guttermousedown\", function(e) {\n if (!editor.isFocused() || e.getButton() != 0)\n return;\n var gutterRegion = gutter.getRegion(e);\n\n if (gutterRegion == \"foldWidgets\")\n return;\n\n var row = e.getDocumentPosition().row;\n var selection = editor.session.selection;\n\n if (e.getShiftKey())\n selection.selectTo(row, 0);\n else {\n if (e.domEvent.detail == 2) {\n editor.selectAll();\n return e.preventDefault();\n }\n mouseHandler.$clickSelection = editor.selection.getLineRange(row);\n }\n mouseHandler.setState(\"selectByLines\");\n mouseHandler.captureMouse(e);\n return e.preventDefault();\n });\n\n\n var tooltipTimeout, mouseEvent, tooltipAnnotation;\n\n function showTooltip() {\n var row = mouseEvent.getDocumentPosition().row;\n var annotation = gutter.$annotations[row];\n if (!annotation)\n return hideTooltip();\n\n var maxRow = editor.session.getLength();\n if (row == maxRow) {\n var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row;\n var pos = mouseEvent.$pos;\n if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))\n return hideTooltip();\n }\n\n if (tooltipAnnotation == annotation)\n return;\n tooltipAnnotation = annotation.text.join(\"
\");\n\n tooltip.setHtml(tooltipAnnotation);\n tooltip.show();\n editor._signal(\"showGutterTooltip\", tooltip);\n editor.on(\"mousewheel\", hideTooltip);\n\n if (mouseHandler.$tooltipFollowsMouse) {\n moveTooltip(mouseEvent);\n } else {\n var gutterElement = mouseEvent.domEvent.target;\n var rect = gutterElement.getBoundingClientRect();\n var style = tooltip.getElement().style;\n style.left = rect.right + \"px\";\n style.top = rect.bottom + \"px\";\n }\n }\n\n function hideTooltip() {\n if (tooltipTimeout)\n tooltipTimeout = clearTimeout(tooltipTimeout);\n if (tooltipAnnotation) {\n tooltip.hide();\n tooltipAnnotation = null;\n editor._signal(\"hideGutterTooltip\", tooltip);\n editor.removeEventListener(\"mousewheel\", hideTooltip);\n }\n }\n\n function moveTooltip(e) {\n tooltip.setPosition(e.x, e.y);\n }\n\n mouseHandler.editor.setDefaultHandler(\"guttermousemove\", function(e) {\n var target = e.domEvent.target || e.domEvent.srcElement;\n if (dom.hasCssClass(target, \"ace_fold-widget\"))\n return hideTooltip();\n\n if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)\n moveTooltip(e);\n\n mouseEvent = e;\n if (tooltipTimeout)\n return;\n tooltipTimeout = setTimeout(function() {\n tooltipTimeout = null;\n if (mouseEvent && !mouseHandler.isMousePressed)\n showTooltip();\n else\n hideTooltip();\n }, 50);\n });\n\n event.addListener(editor.renderer.$gutter, \"mouseout\", function(e) {\n mouseEvent = null;\n if (!tooltipAnnotation || tooltipTimeout)\n return;\n\n tooltipTimeout = setTimeout(function() {\n tooltipTimeout = null;\n hideTooltip();\n }, 50);\n });\n \n editor.on(\"changeSession\", hideTooltip);\n}\n\nfunction GutterTooltip(parentNode) {\n Tooltip.call(this, parentNode);\n}\n\noop.inherits(GutterTooltip, Tooltip);\n\n(function(){\n this.setPosition = function(x, y) {\n var windowWidth = window.innerWidth || document.documentElement.clientWidth;\n var windowHeight = window.innerHeight || document.documentElement.clientHeight;\n var width = this.getWidth();\n var height = this.getHeight();\n x += 15;\n y += 15;\n if (x + width > windowWidth) {\n x -= (x + width) - windowWidth;\n }\n if (y + height > windowHeight) {\n y -= 20 + height;\n }\n Tooltip.prototype.setPosition.call(this, x, y);\n };\n\n}).call(GutterTooltip.prototype);\n\n\n\nexports.GutterHandler = GutterHandler;\n\n});\n\nace.define(\"ace/mouse/mouse_event\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nvar MouseEvent = exports.MouseEvent = function(domEvent, editor) {\n this.domEvent = domEvent;\n this.editor = editor;\n \n this.x = this.clientX = domEvent.clientX;\n this.y = this.clientY = domEvent.clientY;\n\n this.$pos = null;\n this.$inSelection = null;\n \n this.propagationStopped = false;\n this.defaultPrevented = false;\n};\n\n(function() { \n \n this.stopPropagation = function() {\n event.stopPropagation(this.domEvent);\n this.propagationStopped = true;\n };\n \n this.preventDefault = function() {\n event.preventDefault(this.domEvent);\n this.defaultPrevented = true;\n };\n \n this.stop = function() {\n this.stopPropagation();\n this.preventDefault();\n };\n this.getDocumentPosition = function() {\n if (this.$pos)\n return this.$pos;\n \n this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY);\n return this.$pos;\n };\n this.inSelection = function() {\n if (this.$inSelection !== null)\n return this.$inSelection;\n \n var editor = this.editor;\n \n\n var selectionRange = editor.getSelectionRange();\n if (selectionRange.isEmpty())\n this.$inSelection = false;\n else {\n var pos = this.getDocumentPosition();\n this.$inSelection = selectionRange.contains(pos.row, pos.column);\n }\n\n return this.$inSelection;\n };\n this.getButton = function() {\n return event.getButton(this.domEvent);\n };\n this.getShiftKey = function() {\n return this.domEvent.shiftKey;\n };\n \n this.getAccelKey = useragent.isMac\n ? function() { return this.domEvent.metaKey; }\n : function() { return this.domEvent.ctrlKey; };\n \n}).call(MouseEvent.prototype);\n\n});\n\nace.define(\"ace/mouse/dragdrop_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\n\nvar AUTOSCROLL_DELAY = 200;\nvar SCROLL_CURSOR_DELAY = 200;\nvar SCROLL_CURSOR_HYSTERESIS = 5;\n\nfunction DragdropHandler(mouseHandler) {\n\n var editor = mouseHandler.editor;\n\n var blankImage = dom.createElement(\"img\");\n blankImage.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n if (useragent.isOpera)\n blankImage.style.cssText = \"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\";\n\n var exports = [\"dragWait\", \"dragWaitEnd\", \"startDrag\", \"dragReadyEnd\", \"onMouseDrag\"];\n\n exports.forEach(function(x) {\n mouseHandler[x] = this[x];\n }, this);\n editor.addEventListener(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n\n\n var mouseTarget = editor.container;\n var dragSelectionMarker, x, y;\n var timerId, range;\n var dragCursor, counter = 0;\n var dragOperation;\n var isInternal;\n var autoScrollStartTime;\n var cursorMovedTime;\n var cursorPointOnCaretMoved;\n\n this.onDragStart = function(e) {\n if (this.cancelDrag || !mouseTarget.draggable) {\n var self = this;\n setTimeout(function(){\n self.startSelect();\n self.captureMouse(e);\n }, 0);\n return e.preventDefault();\n }\n range = editor.getSelectionRange();\n\n var dataTransfer = e.dataTransfer;\n dataTransfer.effectAllowed = editor.getReadOnly() ? \"copy\" : \"copyMove\";\n if (useragent.isOpera) {\n editor.container.appendChild(blankImage);\n blankImage.scrollTop = 0;\n }\n dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);\n if (useragent.isOpera) {\n editor.container.removeChild(blankImage);\n }\n dataTransfer.clearData();\n dataTransfer.setData(\"Text\", editor.session.getTextRange());\n\n isInternal = true;\n this.setState(\"drag\");\n };\n\n this.onDragEnd = function(e) {\n mouseTarget.draggable = false;\n isInternal = false;\n this.setState(null);\n if (!editor.getReadOnly()) {\n var dropEffect = e.dataTransfer.dropEffect;\n if (!dragOperation && dropEffect == \"move\")\n editor.session.remove(editor.getSelectionRange());\n editor.renderer.$cursorLayer.setBlinking(true);\n }\n this.editor.unsetStyle(\"ace_dragging\");\n this.editor.renderer.setCursorStyle(\"\");\n };\n\n this.onDragEnter = function(e) {\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n return;\n x = e.clientX;\n y = e.clientY;\n if (!dragSelectionMarker)\n addDragMarker();\n counter++;\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n return event.preventDefault(e);\n };\n\n this.onDragOver = function(e) {\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n return;\n x = e.clientX;\n y = e.clientY;\n if (!dragSelectionMarker) {\n addDragMarker();\n counter++;\n }\n if (onMouseMoveTimer !== null)\n onMouseMoveTimer = null;\n\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n return event.preventDefault(e);\n };\n\n this.onDragLeave = function(e) {\n counter--;\n if (counter <= 0 && dragSelectionMarker) {\n clearDragMarker();\n dragOperation = null;\n return event.preventDefault(e);\n }\n };\n\n this.onDrop = function(e) {\n if (!dragCursor)\n return;\n var dataTransfer = e.dataTransfer;\n if (isInternal) {\n switch (dragOperation) {\n case \"move\":\n if (range.contains(dragCursor.row, dragCursor.column)) {\n range = {\n start: dragCursor,\n end: dragCursor\n };\n } else {\n range = editor.moveText(range, dragCursor);\n }\n break;\n case \"copy\":\n range = editor.moveText(range, dragCursor, true);\n break;\n }\n } else {\n var dropData = dataTransfer.getData('Text');\n range = {\n start: dragCursor,\n end: editor.session.insert(dragCursor, dropData)\n };\n editor.focus();\n dragOperation = null;\n }\n clearDragMarker();\n return event.preventDefault(e);\n };\n\n event.addListener(mouseTarget, \"dragstart\", this.onDragStart.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragend\", this.onDragEnd.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragenter\", this.onDragEnter.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragover\", this.onDragOver.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragleave\", this.onDragLeave.bind(mouseHandler));\n event.addListener(mouseTarget, \"drop\", this.onDrop.bind(mouseHandler));\n\n function scrollCursorIntoView(cursor, prevCursor) {\n var now = Date.now();\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\n var hMovement = !prevCursor || cursor.column != prevCursor.column;\n if (!cursorMovedTime || vMovement || hMovement) {\n editor.$blockScrolling += 1;\n editor.moveCursorToPosition(cursor);\n editor.$blockScrolling -= 1;\n cursorMovedTime = now;\n cursorPointOnCaretMoved = {x: x, y: y};\n } else {\n var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\n if (distance > SCROLL_CURSOR_HYSTERESIS) {\n cursorMovedTime = null;\n } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\n editor.renderer.scrollCursorIntoView();\n cursorMovedTime = null;\n }\n }\n }\n\n function autoScroll(cursor, prevCursor) {\n var now = Date.now();\n var lineHeight = editor.renderer.layerConfig.lineHeight;\n var characterWidth = editor.renderer.layerConfig.characterWidth;\n var editorRect = editor.renderer.scroller.getBoundingClientRect();\n var offsets = {\n x: {\n left: x - editorRect.left,\n right: editorRect.right - x\n },\n y: {\n top: y - editorRect.top,\n bottom: editorRect.bottom - y\n }\n };\n var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\n var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\n var scrollCursor = {row: cursor.row, column: cursor.column};\n if (nearestXOffset / characterWidth <= 2) {\n scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\n }\n if (nearestYOffset / lineHeight <= 1) {\n scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\n }\n var vScroll = cursor.row != scrollCursor.row;\n var hScroll = cursor.column != scrollCursor.column;\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\n if (vScroll || (hScroll && !vMovement)) {\n if (!autoScrollStartTime)\n autoScrollStartTime = now;\n else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\n editor.renderer.scrollCursorIntoView(scrollCursor);\n } else {\n autoScrollStartTime = null;\n }\n }\n\n function onDragInterval() {\n var prevCursor = dragCursor;\n dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n scrollCursorIntoView(dragCursor, prevCursor);\n autoScroll(dragCursor, prevCursor);\n }\n\n function addDragMarker() {\n range = editor.selection.toOrientedRange();\n dragSelectionMarker = editor.session.addMarker(range, \"ace_selection\", editor.getSelectionStyle());\n editor.clearSelection();\n if (editor.isFocused())\n editor.renderer.$cursorLayer.setBlinking(false);\n clearInterval(timerId);\n onDragInterval();\n timerId = setInterval(onDragInterval, 20);\n counter = 0;\n event.addListener(document, \"mousemove\", onMouseMove);\n }\n\n function clearDragMarker() {\n clearInterval(timerId);\n editor.session.removeMarker(dragSelectionMarker);\n dragSelectionMarker = null;\n editor.$blockScrolling += 1;\n editor.selection.fromOrientedRange(range);\n editor.$blockScrolling -= 1;\n if (editor.isFocused() && !isInternal)\n editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());\n range = null;\n dragCursor = null;\n counter = 0;\n autoScrollStartTime = null;\n cursorMovedTime = null;\n event.removeListener(document, \"mousemove\", onMouseMove);\n }\n var onMouseMoveTimer = null;\n function onMouseMove() {\n if (onMouseMoveTimer == null) {\n onMouseMoveTimer = setTimeout(function() {\n if (onMouseMoveTimer != null && dragSelectionMarker)\n clearDragMarker();\n }, 20);\n }\n }\n\n function canAccept(dataTransfer) {\n var types = dataTransfer.types;\n return !types || Array.prototype.some.call(types, function(type) {\n return type == 'text/plain' || type == 'Text';\n });\n }\n\n function getDropEffect(e) {\n var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];\n var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];\n\n var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;\n var effectAllowed = \"uninitialized\";\n try {\n effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();\n } catch (e) {}\n var dropEffect = \"none\";\n\n if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"copy\";\n else if (moveAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"move\";\n else if (copyAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"copy\";\n\n return dropEffect;\n }\n}\n\n(function() {\n\n this.dragWait = function() {\n var interval = Date.now() - this.mousedownEvent.time;\n if (interval > this.editor.getDragDelay())\n this.startDrag();\n };\n\n this.dragWaitEnd = function() {\n var target = this.editor.container;\n target.draggable = false;\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n this.selectEnd();\n };\n\n this.dragReadyEnd = function(e) {\n this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());\n this.editor.unsetStyle(\"ace_dragging\");\n this.editor.renderer.setCursorStyle(\"\");\n this.dragWaitEnd();\n };\n\n this.startDrag = function(){\n this.cancelDrag = false;\n var editor = this.editor;\n var target = editor.container;\n target.draggable = true;\n editor.renderer.$cursorLayer.setBlinking(false);\n editor.setStyle(\"ace_dragging\");\n var cursorStyle = useragent.isWin ? \"default\" : \"move\";\n editor.renderer.setCursorStyle(cursorStyle);\n this.setState(\"dragReady\");\n };\n\n this.onMouseDrag = function(e) {\n var target = this.editor.container;\n if (useragent.isIE && this.state == \"dragReady\") {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n if (distance > 3)\n target.dragDrop();\n }\n if (this.state === \"dragWait\") {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n if (distance > 0) {\n target.draggable = false;\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n }\n }\n };\n\n this.onMouseDown = function(e) {\n if (!this.$dragEnabled)\n return;\n this.mousedownEvent = e;\n var editor = this.editor;\n\n var inSelection = e.inSelection();\n var button = e.getButton();\n var clickCount = e.domEvent.detail || 1;\n if (clickCount === 1 && button === 0 && inSelection) {\n if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))\n return;\n this.mousedownEvent.time = Date.now();\n var eventTarget = e.domEvent.target || e.domEvent.srcElement;\n if (\"unselectable\" in eventTarget)\n eventTarget.unselectable = \"on\";\n if (editor.getDragDelay()) {\n if (useragent.isWebKit) {\n this.cancelDrag = true;\n var mouseTarget = editor.container;\n mouseTarget.draggable = true;\n }\n this.setState(\"dragWait\");\n } else {\n this.startDrag();\n }\n this.captureMouse(e, this.onMouseDrag.bind(this));\n e.defaultPrevented = true;\n }\n };\n\n}).call(DragdropHandler.prototype);\n\n\nfunction calcDistance(ax, ay, bx, by) {\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nexports.DragdropHandler = DragdropHandler;\n\n});\n\nace.define(\"ace/lib/net\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\nvar dom = acequire(\"./dom\");\n\nexports.get = function (url, callback) {\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n callback(xhr.responseText);\n }\n };\n xhr.send(null);\n};\n\nexports.loadScript = function(path, callback) {\n var head = dom.getDocumentHead();\n var s = document.createElement('script');\n\n s.src = path;\n head.appendChild(s);\n\n s.onload = s.onreadystatechange = function(_, isAbort) {\n if (isAbort || !s.readyState || s.readyState == \"loaded\" || s.readyState == \"complete\") {\n s = s.onload = s.onreadystatechange = null;\n if (!isAbort)\n callback();\n }\n };\n};\nexports.qualifyURL = function(url) {\n var a = document.createElement('a');\n a.href = url;\n return a.href;\n};\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n this._eventRegistry || (this._eventRegistry = {});\n this._defaultHandlers || (this._defaultHandlers = {});\n\n var listeners = this._eventRegistry[eventName] || [];\n var defaultHandler = this._defaultHandlers[eventName];\n if (!listeners.length && !defaultHandler)\n return;\n\n if (typeof e != \"object\" || !e)\n e = {};\n\n if (!e.type)\n e.type = eventName;\n if (!e.stopPropagation)\n e.stopPropagation = stopPropagation;\n if (!e.preventDefault)\n e.preventDefault = preventDefault;\n\n listeners = listeners.slice();\n for (var i=0; i 1)\n base = parts[parts.length - 2];\n var path = options[component + \"Path\"];\n if (path == null) {\n path = options.basePath;\n } else if (sep == \"/\") {\n component = sep = \"\";\n }\n if (path && path.slice(-1) != \"/\")\n path += \"/\";\n return path + component + sep + base + this.get(\"suffix\");\n};\n\nexports.setModuleUrl = function(name, subst) {\n return options.$moduleUrls[name] = subst;\n};\n\nexports.$loading = {};\nexports.loadModule = function(moduleName, onLoad) {\n var module, moduleType;\n if (Array.isArray(moduleName)) {\n moduleType = moduleName[0];\n moduleName = moduleName[1];\n }\n\n try {\n module = acequire(moduleName);\n } catch (e) {}\n if (module && !exports.$loading[moduleName])\n return onLoad && onLoad(module);\n\n if (!exports.$loading[moduleName])\n exports.$loading[moduleName] = [];\n\n exports.$loading[moduleName].push(onLoad);\n\n if (exports.$loading[moduleName].length > 1)\n return;\n\n var afterLoad = function() {\n acequire([moduleName], function(module) {\n exports._emit(\"load.module\", {name: moduleName, module: module});\n var listeners = exports.$loading[moduleName];\n exports.$loading[moduleName] = null;\n listeners.forEach(function(onLoad) {\n onLoad && onLoad(module);\n });\n });\n };\n\n if (!exports.get(\"packaged\"))\n return afterLoad();\n net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n};\ninit(true);function init(packaged) {\n\n if (!global || !global.document)\n return;\n \n options.packaged = packaged || acequire.packaged || module.packaged || (global.define && define.packaged);\n\n var scriptOptions = {};\n var scriptUrl = \"\";\n var currentScript = (document.currentScript || document._currentScript ); // native or polyfill\n var currentDocument = currentScript && currentScript.ownerDocument || document;\n \n var scripts = currentDocument.getElementsByTagName(\"script\");\n for (var i=0; i 0){\n\t\t\tif (action == 0x10){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = 1;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t} else {\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tcond = impTab[newState][6];\n\t\tif (cond){\n\t\t\tif(condPos == -1){\n\t\t\t\tcondPos = ix;\n\t\t\t}\n\t\t}else{\n\t\t\tif (condPos > -1){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = newLevel;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tif (charTypes[ix] == B){\n\t\t\tlevels[ix] = 0;\n\t\t}\n\t\thiLevel |= newLevel;\n\t}\n\tif (hasUBAT_S){\n\t\tfor(i = 0; i < len; i++){\n\t\t\tif(charTypes[i] == S){\n\t\t\t\tlevels[i] = dir;\n\t\t\t\tfor(var j = i - 1; j >= 0; j--){\n\t\t\t\t\tif(charTypes[j] == WS){\n\t\t\t\t\t\tlevels[j] = dir;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction _invertLevel(lev, levels, _array) {\n\tif (hiLevel < lev){\n\t\treturn;\n\t}\n\tif (lev == 1 && dir == RTL && !hasUBAT_B){\n\t\t_array.reverse();\n\t\treturn;\n\t}\n\tvar len = _array.length, start = 0, end, lo, hi, tmp;\n\twhile(start < len){\n\t\tif (levels[start] >= lev){\n\t\t\tend = start + 1;\n\t\twhile(end < len && levels[end] >= lev){\n\t\t\tend++;\n\t\t}\n\t\tfor(lo = start, hi = end - 1 ; lo < hi; lo++, hi--){\n\t\t\ttmp = _array[lo];\n\t\t\t_array[lo] = _array[hi];\n\t\t\t_array[hi] = tmp;\n\t\t}\n\t\tstart = end;\n\t}\n\tstart++;\n\t}\n}\n\nfunction _getCharClass(chars, types, classes, ix) {\n\tvar cType = types[ix], wType, nType, len, i;\n\tswitch(cType){\n\t\tcase L:\n\t\tcase R:\n\t\t\tlastArabic = false;\n\t\tcase ON:\n\t\tcase AN:\n\t\t\treturn cType;\n\t\tcase EN:\n\t\t\treturn lastArabic ? AN : EN;\n\t\tcase AL:\n\t\t\tlastArabic = true;\n\t\t\thasUBAT_AL = true;\n\t\t\treturn R;\n\t\tcase WS:\n\t\t\treturn ON;\n\t\tcase CS:\n\t\t\tif (ix < 1 || (ix + 1) >= types.length ||\n\t\t\t\t((wType = classes[ix - 1]) != EN && wType != AN) ||\n\t\t\t\t((nType = types[ix + 1]) != EN && nType != AN)){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\tif (lastArabic){nType = AN;}\n\t\t\treturn nType == wType ? nType : ON;\n\t\tcase ES:\n\t\t\twType = ix > 0 ? classes[ix - 1] : B;\n\t\t\tif (wType == EN && (ix + 1) < types.length && types[ix + 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase ET:\n\t\t\tif (ix > 0 && classes[ix - 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\tif (lastArabic){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\ti = ix + 1;\n\t\t\tlen = types.length;\n\t\t\twhile (i < len && types[i] == ET){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len && types[i] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase NSM:\n\t\t\tlen = types.length;\n\t\t\ti = ix + 1;\n\t\t\twhile (i < len && types[i] == NSM){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len){\n\t\t\t\tvar c = chars[ix], rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E;\n\n\t\t\t\twType = types[i];\n\t\t\t\tif (rtlCandidate && (wType == R || wType == AL)){\n\t\t\t\t\treturn R;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ix < 1 || (wType = types[ix - 1]) == B){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\treturn classes[ix - 1];\n\t\tcase B:\n\t\t\tlastArabic = false;\n\t\t\thasUBAT_B = true;\n\t\t\treturn dir;\n\t\tcase S:\n\t\t\thasUBAT_S = true;\n\t\t\treturn ON;\n\t\tcase LRE:\n\t\tcase RLE:\n\t\tcase LRO:\n\t\tcase RLO:\n\t\tcase PDF:\n\t\t\tlastArabic = false;\n\t\tcase BN:\n\t\t\treturn ON;\n\t}\n}\n\nfunction _getCharacterType( ch ) {\n\tvar uc = ch.charCodeAt(0), hi = uc >> 8;\n\n\tif (hi == 0) {\n\t\treturn ((uc > 0x00BF) ? L : UnicodeTBL00[uc]);\n\t} else if (hi == 5) {\n\t\treturn (/[\\u0591-\\u05f4]/.test(ch) ? R : L);\n\t} else if (hi == 6) {\n\t\tif (/[\\u0610-\\u061a\\u064b-\\u065f\\u06d6-\\u06e4\\u06e7-\\u06ed]/.test(ch))\n\t\t\treturn NSM;\n\t\telse if (/[\\u0660-\\u0669\\u066b-\\u066c]/.test(ch))\n\t\t\treturn AN;\n\t\telse if (uc == 0x066A)\n\t\t\treturn ET;\n\t\telse if (/[\\u06f0-\\u06f9]/.test(ch))\n\t\t\treturn EN;\n\t\telse\n\t\t\treturn AL;\n\t} else if (hi == 0x20 && uc <= 0x205F) {\n\t\treturn UnicodeTBL20[uc & 0xFF];\n\t} else if (hi == 0xFE) {\n\t\treturn (uc >= 0xFE70 ? AL : ON);\n\t}\n\treturn ON;\n}\n\nfunction _isArabicDiacritics( ch ) {\n\treturn (ch >= '\\u064b' && ch <= '\\u0655');\n}\nexports.L = L;\nexports.R = R;\nexports.EN = EN;\nexports.ON_R = 3;\nexports.AN = 4;\nexports.R_H = 5;\nexports.B = 6;\n\nexports.DOT = \"\\xB7\";\nexports.doBidiReorder = function(text, textCharTypes, isRtl) {\n\tif (text.length < 2)\n\t\treturn {};\n\n\tvar chars = text.split(\"\"), logicalFromVisual = new Array(chars.length),\n\t\tbidiLevels = new Array(chars.length), levels = [];\n\n\tdir = isRtl ? RTL : LTR;\n\n\t_computeLevels(chars, levels, chars.length, textCharTypes);\n\n\tfor (var i = 0; i < logicalFromVisual.length; logicalFromVisual[i] = i, i++);\n\n\t_invertLevel(2, levels, logicalFromVisual);\n\t_invertLevel(1, levels, logicalFromVisual);\n\n\tfor (var i = 0; i < logicalFromVisual.length - 1; i++) { //fix levels to reflect character width\n\t\tif (textCharTypes[i] === AN) {\n\t\t\tlevels[i] = exports.AN;\n\t\t} else if (levels[i] === R && ((textCharTypes[i] > AL && textCharTypes[i] < LRE)\n\t\t\t|| textCharTypes[i] === ON || textCharTypes[i] === BN)) {\n\t\t\tlevels[i] = exports.ON_R;\n\t\t} else if ((i > 0 && chars[i - 1] === '\\u0644') && /\\u0622|\\u0623|\\u0625|\\u0627/.test(chars[i])) {\n\t\t\tlevels[i - 1] = levels[i] = exports.R_H;\n\t\t\ti++;\n\t\t}\n\t}\n\tif (chars[chars.length - 1] === exports.DOT)\n\t\tlevels[chars.length - 1] = exports.B;\n\n\tfor (var i = 0; i < logicalFromVisual.length; i++) {\n\t\tbidiLevels[i] = levels[logicalFromVisual[i]];\n\t}\n\n\treturn {'logicalFromVisual': logicalFromVisual, 'bidiLevels': bidiLevels};\n};\nexports.hasBidiCharacters = function(text, textCharTypes){\n\tvar ret = false;\n\tfor (var i = 0; i < text.length; i++){\n\t\ttextCharTypes[i] = _getCharacterType(text.charAt(i));\n\t\tif (!ret && (textCharTypes[i] == R || textCharTypes[i] == AL))\n\t\t\tret = true;\n\t}\n\treturn ret;\n};\nexports.getVisualFromLogicalIdx = function(logIdx, rowMap) {\n\tfor (var i = 0; i < rowMap.logicalFromVisual.length; i++) {\n\t\tif (rowMap.logicalFromVisual[i] == logIdx)\n\t\t\treturn i;\n\t}\n\treturn 0;\n};\n\n});\n\nace.define(\"ace/bidihandler\",[\"require\",\"exports\",\"module\",\"ace/lib/bidiutil\",\"ace/lib/lang\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar bidiUtil = acequire(\"./lib/bidiutil\");\nvar lang = acequire(\"./lib/lang\");\nvar useragent = acequire(\"./lib/useragent\");\nvar bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\nvar BidiHandler = function(session) {\n this.session = session;\n this.bidiMap = {};\n this.currentRow = null;\n this.bidiUtil = bidiUtil;\n this.charWidths = [];\n this.EOL = \"\\xAC\";\n this.showInvisibles = true;\n this.isRtlDir = false;\n this.line = \"\";\n this.wrapIndent = 0;\n this.isLastRow = false;\n this.EOF = \"\\xB6\";\n this.seenBidi = false;\n};\n\n(function() {\n this.isBidiRow = function(screenRow, docRow, splitIndex) {\n if (!this.seenBidi)\n return false;\n if (screenRow !== this.currentRow) {\n this.currentRow = screenRow;\n this.updateRowLine(docRow, splitIndex);\n this.updateBidiMap();\n }\n return this.bidiMap.bidiLevels;\n };\n\n this.onChange = function(delta) {\n if (!this.seenBidi) {\n if (delta.action == \"insert\" && bidiRE.test(delta.lines.join(\"\\n\"))) {\n this.seenBidi = true;\n this.currentRow = null;\n }\n }\n else {\n this.currentRow = null;\n }\n };\n\n this.getDocumentRow = function() {\n var docRow = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var index = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n if (index >= 0)\n docRow = this.session.$docRowCache[index];\n }\n\n return docRow;\n };\n\n this.getSplitIndex = function() {\n var splitIndex = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var currentIndex, prevIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n while (this.currentRow - splitIndex > 0) {\n currentIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow - splitIndex - 1);\n if (currentIndex !== prevIndex)\n break;\n\n prevIndex = currentIndex;\n splitIndex++;\n }\n }\n\n return splitIndex;\n };\n\n this.updateRowLine = function(docRow, splitIndex) {\n if (docRow === undefined)\n docRow = this.getDocumentRow();\n\n this.wrapIndent = 0;\n this.isLastRow = (docRow === this.session.getLength() - 1);\n this.line = this.session.getLine(docRow);\n if (this.session.$useWrapMode) {\n var splits = this.session.$wrapData[docRow];\n if (splits) {\n if (splitIndex === undefined)\n splitIndex = this.getSplitIndex();\n\n if(splitIndex > 0 && splits.length) {\n this.wrapIndent = splits.indent;\n this.line = (splitIndex < splits.length) ?\n this.line.substring(splits[splitIndex - 1], splits[splits.length - 1]) :\n this.line.substring(splits[splits.length - 1]);\n } else {\n this.line = this.line.substring(0, splits[splitIndex]);\n }\n }\n }\n var session = this.session, shift = 0, size;\n this.line = this.line.replace(/\\t|[\\u1100-\\u2029, \\u202F-\\uFFE6]/g, function(ch, i){\n if (ch === '\\t' || session.isFullWidth(ch.charCodeAt(0))) {\n size = (ch === '\\t') ? session.getScreenTabSize(i + shift) : 2;\n shift += size - 1;\n return lang.stringRepeat(bidiUtil.DOT, size);\n }\n return ch;\n });\n };\n\n this.updateBidiMap = function() {\n var textCharTypes = [], endOfLine = this.isLastRow ? this.EOF : this.EOL;\n var line = this.line + (this.showInvisibles ? endOfLine : bidiUtil.DOT);\n if (bidiUtil.hasBidiCharacters(line, textCharTypes)) {\n this.bidiMap = bidiUtil.doBidiReorder(line, textCharTypes, this.isRtlDir);\n } else {\n this.bidiMap = {};\n }\n };\n this.markAsDirty = function() {\n this.currentRow = null;\n };\n this.updateCharacterWidths = function(fontMetrics) {\n if (!this.seenBidi)\n return;\n if (this.characterWidth === fontMetrics.$characterSize.width)\n return;\n\n var characterWidth = this.characterWidth = fontMetrics.$characterSize.width;\n var bidiCharWidth = fontMetrics.$measureCharWidth(\"\\u05d4\");\n\n this.charWidths[bidiUtil.L] = this.charWidths[bidiUtil.EN] = this.charWidths[bidiUtil.ON_R] = characterWidth;\n this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] = bidiCharWidth;\n this.charWidths[bidiUtil.R_H] = useragent.isChrome ? bidiCharWidth : bidiCharWidth * 0.45;\n this.charWidths[bidiUtil.B] = 0;\n\n this.currentRow = null;\n };\n\n this.getShowInvisibles = function() {\n return this.showInvisibles;\n };\n\n this.setShowInvisibles = function(showInvisibles) {\n this.showInvisibles = showInvisibles;\n this.currentRow = null;\n };\n\n this.setEolChar = function(eolChar) {\n this.EOL = eolChar;\n };\n\n this.setTextDir = function(isRtlDir) {\n this.isRtlDir = isRtlDir;\n };\n this.getPosLeft = function(col) {\n col -= this.wrapIndent;\n var visualIdx = bidiUtil.getVisualFromLogicalIdx(col > 0 ? col - 1 : 0, this.bidiMap),\n levels = this.bidiMap.bidiLevels, left = 0;\n\n if (col === 0 && levels[visualIdx] % 2 !== 0)\n visualIdx++;\n\n for (var i = 0; i < visualIdx; i++) {\n left += this.charWidths[levels[i]];\n }\n\n if (col !== 0 && levels[visualIdx] % 2 === 0)\n left += this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent)\n left += this.wrapIndent * this.charWidths[bidiUtil.L];\n\n return left;\n };\n this.getSelections = function(startCol, endCol) {\n var map = this.bidiMap, levels = map.bidiLevels, level, offset = this.wrapIndent * this.charWidths[bidiUtil.L], selections = [],\n selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent,\n isSelected = false, isSelectedPrev = false, selectionStart = 0;\n\n for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) {\n logIdx = map.logicalFromVisual[visIdx];\n level = levels[visIdx];\n isSelected = (logIdx >= selColMin) && (logIdx < selColMax);\n if (isSelected && !isSelectedPrev) {\n selectionStart = offset;\n } else if (!isSelected && isSelectedPrev) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n offset += this.charWidths[level];\n isSelectedPrev = isSelected;\n }\n\n if (isSelected && (visIdx === levels.length)) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n\n return selections;\n };\n this.offsetToCol = function(posX) {\n var logicalIdx = 0, posX = Math.max(posX, 0),\n offset = 0, visualIdx = 0, levels = this.bidiMap.bidiLevels,\n charWidth = this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent) {\n posX -= this.wrapIndent * this.charWidths[bidiUtil.L];\n }\n\n while(posX > offset + charWidth/2) {\n offset += charWidth;\n if(visualIdx === levels.length - 1) {\n charWidth = 0;\n break;\n }\n charWidth = this.charWidths[levels[++visualIdx]];\n }\n\n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && (levels[visualIdx] % 2 === 0)){\n if(posX < offset)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n\n } else if (visualIdx > 0 && (levels[visualIdx - 1] % 2 === 0) && (levels[visualIdx] % 2 !== 0)){\n logicalIdx = 1 + ((posX > offset) ? this.bidiMap.logicalFromVisual[visualIdx]\n : this.bidiMap.logicalFromVisual[visualIdx - 1]);\n\n } else if ((this.isRtlDir && visualIdx === levels.length - 1 && charWidth === 0 && (levels[visualIdx - 1] % 2 === 0))\n || (!this.isRtlDir && visualIdx === 0 && (levels[visualIdx] % 2 !== 0))){\n logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx];\n } else {\n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && charWidth !== 0)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n }\n\n return (logicalIdx + this.wrapIndent);\n };\n\n}).call(BidiHandler.prototype);\n\nexports.BidiHandler = BidiHandler;\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n this.start = {\n row: startRow,\n column: startColumn\n };\n\n this.end = {\n row: endRow,\n column: endColumn\n };\n};\n\n(function() {\n this.isEqual = function(range) {\n return this.start.row === range.start.row &&\n this.end.row === range.end.row &&\n this.start.column === range.start.column &&\n this.end.column === range.end.column;\n };\n this.toString = function() {\n return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n };\n\n this.contains = function(row, column) {\n return this.compare(row, column) == 0;\n };\n this.compareRange = function(range) {\n var cmp,\n end = range.end,\n start = range.start;\n\n cmp = this.compare(end.row, end.column);\n if (cmp == 1) {\n cmp = this.compare(start.row, start.column);\n if (cmp == 1) {\n return 2;\n } else if (cmp == 0) {\n return 1;\n } else {\n return 0;\n }\n } else if (cmp == -1) {\n return -2;\n } else {\n cmp = this.compare(start.row, start.column);\n if (cmp == -1) {\n return -1;\n } else if (cmp == 1) {\n return 42;\n } else {\n return 0;\n }\n }\n };\n this.comparePoint = function(p) {\n return this.compare(p.row, p.column);\n };\n this.containsRange = function(range) {\n return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n };\n this.intersects = function(range) {\n var cmp = this.compareRange(range);\n return (cmp == -1 || cmp == 0 || cmp == 1);\n };\n this.isEnd = function(row, column) {\n return this.end.row == row && this.end.column == column;\n };\n this.isStart = function(row, column) {\n return this.start.row == row && this.start.column == column;\n };\n this.setStart = function(row, column) {\n if (typeof row == \"object\") {\n this.start.column = row.column;\n this.start.row = row.row;\n } else {\n this.start.row = row;\n this.start.column = column;\n }\n };\n this.setEnd = function(row, column) {\n if (typeof row == \"object\") {\n this.end.column = row.column;\n this.end.row = row.row;\n } else {\n this.end.row = row;\n this.end.column = column;\n }\n };\n this.inside = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isEnd(row, column) || this.isStart(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.insideStart = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isEnd(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.insideEnd = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isStart(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.compare = function(row, column) {\n if (!this.isMultiLine()) {\n if (row === this.start.row) {\n return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n }\n }\n\n if (row < this.start.row)\n return -1;\n\n if (row > this.end.row)\n return 1;\n\n if (this.start.row === row)\n return column >= this.start.column ? 0 : -1;\n\n if (this.end.row === row)\n return column <= this.end.column ? 0 : 1;\n\n return 0;\n };\n this.compareStart = function(row, column) {\n if (this.start.row == row && this.start.column == column) {\n return -1;\n } else {\n return this.compare(row, column);\n }\n };\n this.compareEnd = function(row, column) {\n if (this.end.row == row && this.end.column == column) {\n return 1;\n } else {\n return this.compare(row, column);\n }\n };\n this.compareInside = function(row, column) {\n if (this.end.row == row && this.end.column == column) {\n return 1;\n } else if (this.start.row == row && this.start.column == column) {\n return -1;\n } else {\n return this.compare(row, column);\n }\n };\n this.clipRows = function(firstRow, lastRow) {\n if (this.end.row > lastRow)\n var end = {row: lastRow + 1, column: 0};\n else if (this.end.row < firstRow)\n var end = {row: firstRow, column: 0};\n\n if (this.start.row > lastRow)\n var start = {row: lastRow + 1, column: 0};\n else if (this.start.row < firstRow)\n var start = {row: firstRow, column: 0};\n\n return Range.fromPoints(start || this.start, end || this.end);\n };\n this.extend = function(row, column) {\n var cmp = this.compare(row, column);\n\n if (cmp == 0)\n return this;\n else if (cmp == -1)\n var start = {row: row, column: column};\n else\n var end = {row: row, column: column};\n\n return Range.fromPoints(start || this.start, end || this.end);\n };\n\n this.isEmpty = function() {\n return (this.start.row === this.end.row && this.start.column === this.end.column);\n };\n this.isMultiLine = function() {\n return (this.start.row !== this.end.row);\n };\n this.clone = function() {\n return Range.fromPoints(this.start, this.end);\n };\n this.collapseRows = function() {\n if (this.end.column == 0)\n return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0);\n else\n return new Range(this.start.row, 0, this.end.row, 0);\n };\n this.toScreenRange = function(session) {\n var screenPosStart = session.documentToScreenPosition(this.start);\n var screenPosEnd = session.documentToScreenPosition(this.end);\n\n return new Range(\n screenPosStart.row, screenPosStart.column,\n screenPosEnd.row, screenPosEnd.column\n );\n };\n this.moveBy = function(row, column) {\n this.start.row += row;\n this.start.column += column;\n this.end.row += row;\n this.end.column += column;\n };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/selection\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar lang = acequire(\"./lib/lang\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Range = acequire(\"./range\").Range;\nvar Selection = function(session) {\n this.session = session;\n this.doc = session.getDocument();\n\n this.clearSelection();\n this.lead = this.selectionLead = this.doc.createAnchor(0, 0);\n this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);\n\n var self = this;\n this.lead.on(\"change\", function(e) {\n self._emit(\"changeCursor\");\n if (!self.$isEmpty)\n self._emit(\"changeSelection\");\n if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n self.$desiredColumn = null;\n });\n\n this.selectionAnchor.on(\"change\", function() {\n if (!self.$isEmpty)\n self._emit(\"changeSelection\");\n });\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.isEmpty = function() {\n return (this.$isEmpty || (\n this.anchor.row == this.lead.row &&\n this.anchor.column == this.lead.column\n ));\n };\n this.isMultiLine = function() {\n if (this.isEmpty()) {\n return false;\n }\n\n return this.getRange().isMultiLine();\n };\n this.getCursor = function() {\n return this.lead.getPosition();\n };\n this.setSelectionAnchor = function(row, column) {\n this.anchor.setPosition(row, column);\n\n if (this.$isEmpty) {\n this.$isEmpty = false;\n this._emit(\"changeSelection\");\n }\n };\n this.getSelectionAnchor = function() {\n if (this.$isEmpty)\n return this.getSelectionLead();\n else\n return this.anchor.getPosition();\n };\n this.getSelectionLead = function() {\n return this.lead.getPosition();\n };\n this.shiftSelection = function(columns) {\n if (this.$isEmpty) {\n this.moveCursorTo(this.lead.row, this.lead.column + columns);\n return;\n }\n\n var anchor = this.getSelectionAnchor();\n var lead = this.getSelectionLead();\n\n var isBackwards = this.isBackwards();\n\n if (!isBackwards || anchor.column !== 0)\n this.setSelectionAnchor(anchor.row, anchor.column + columns);\n\n if (isBackwards || lead.column !== 0) {\n this.$moveSelection(function() {\n this.moveCursorTo(lead.row, lead.column + columns);\n });\n }\n };\n this.isBackwards = function() {\n var anchor = this.anchor;\n var lead = this.lead;\n return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\n };\n this.getRange = function() {\n var anchor = this.anchor;\n var lead = this.lead;\n\n if (this.isEmpty())\n return Range.fromPoints(lead, lead);\n\n if (this.isBackwards()) {\n return Range.fromPoints(lead, anchor);\n }\n else {\n return Range.fromPoints(anchor, lead);\n }\n };\n this.clearSelection = function() {\n if (!this.$isEmpty) {\n this.$isEmpty = true;\n this._emit(\"changeSelection\");\n }\n };\n this.selectAll = function() {\n var lastRow = this.doc.getLength() - 1;\n this.setSelectionAnchor(0, 0);\n this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);\n };\n this.setRange =\n this.setSelectionRange = function(range, reverse) {\n if (reverse) {\n this.setSelectionAnchor(range.end.row, range.end.column);\n this.selectTo(range.start.row, range.start.column);\n } else {\n this.setSelectionAnchor(range.start.row, range.start.column);\n this.selectTo(range.end.row, range.end.column);\n }\n if (this.getRange().isEmpty())\n this.$isEmpty = true;\n this.$desiredColumn = null;\n };\n\n this.$moveSelection = function(mover) {\n var lead = this.lead;\n if (this.$isEmpty)\n this.setSelectionAnchor(lead.row, lead.column);\n\n mover.call(this);\n };\n this.selectTo = function(row, column) {\n this.$moveSelection(function() {\n this.moveCursorTo(row, column);\n });\n };\n this.selectToPosition = function(pos) {\n this.$moveSelection(function() {\n this.moveCursorToPosition(pos);\n });\n };\n this.moveTo = function(row, column) {\n this.clearSelection();\n this.moveCursorTo(row, column);\n };\n this.moveToPosition = function(pos) {\n this.clearSelection();\n this.moveCursorToPosition(pos);\n };\n this.selectUp = function() {\n this.$moveSelection(this.moveCursorUp);\n };\n this.selectDown = function() {\n this.$moveSelection(this.moveCursorDown);\n };\n this.selectRight = function() {\n this.$moveSelection(this.moveCursorRight);\n };\n this.selectLeft = function() {\n this.$moveSelection(this.moveCursorLeft);\n };\n this.selectLineStart = function() {\n this.$moveSelection(this.moveCursorLineStart);\n };\n this.selectLineEnd = function() {\n this.$moveSelection(this.moveCursorLineEnd);\n };\n this.selectFileEnd = function() {\n this.$moveSelection(this.moveCursorFileEnd);\n };\n this.selectFileStart = function() {\n this.$moveSelection(this.moveCursorFileStart);\n };\n this.selectWordRight = function() {\n this.$moveSelection(this.moveCursorWordRight);\n };\n this.selectWordLeft = function() {\n this.$moveSelection(this.moveCursorWordLeft);\n };\n this.getWordRange = function(row, column) {\n if (typeof column == \"undefined\") {\n var cursor = row || this.lead;\n row = cursor.row;\n column = cursor.column;\n }\n return this.session.getWordRange(row, column);\n };\n this.selectWord = function() {\n this.setSelectionRange(this.getWordRange());\n };\n this.selectAWord = function() {\n var cursor = this.getCursor();\n var range = this.session.getAWordRange(cursor.row, cursor.column);\n this.setSelectionRange(range);\n };\n\n this.getLineRange = function(row, excludeLastChar) {\n var rowStart = typeof row == \"number\" ? row : this.lead.row;\n var rowEnd;\n\n var foldLine = this.session.getFoldLine(rowStart);\n if (foldLine) {\n rowStart = foldLine.start.row;\n rowEnd = foldLine.end.row;\n } else {\n rowEnd = rowStart;\n }\n if (excludeLastChar === true)\n return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\n else\n return new Range(rowStart, 0, rowEnd + 1, 0);\n };\n this.selectLine = function() {\n this.setSelectionRange(this.getLineRange());\n };\n this.moveCursorUp = function() {\n this.moveCursorBy(-1, 0);\n };\n this.moveCursorDown = function() {\n this.moveCursorBy(1, 0);\n };\n this.wouldMoveIntoSoftTab = function(cursor, tabSize, direction) {\n var start = cursor.column;\n var end = cursor.column + tabSize;\n\n if (direction < 0) {\n start = cursor.column - tabSize;\n end = cursor.column;\n }\n return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(\" \").length-1 == tabSize;\n };\n this.moveCursorLeft = function() {\n var cursor = this.lead.getPosition(),\n fold;\n\n if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {\n this.moveCursorTo(fold.start.row, fold.start.column);\n } else if (cursor.column === 0) {\n if (cursor.row > 0) {\n this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length);\n }\n }\n else {\n var tabSize = this.session.getTabSize();\n if (this.wouldMoveIntoSoftTab(cursor, tabSize, -1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, -tabSize);\n } else {\n this.moveCursorBy(0, -1);\n }\n }\n };\n this.moveCursorRight = function() {\n var cursor = this.lead.getPosition(),\n fold;\n if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {\n this.moveCursorTo(fold.end.row, fold.end.column);\n }\n else if (this.lead.column == this.doc.getLine(this.lead.row).length) {\n if (this.lead.row < this.doc.getLength() - 1) {\n this.moveCursorTo(this.lead.row + 1, 0);\n }\n }\n else {\n var tabSize = this.session.getTabSize();\n var cursor = this.lead;\n if (this.wouldMoveIntoSoftTab(cursor, tabSize, 1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, tabSize);\n } else {\n this.moveCursorBy(0, 1);\n }\n }\n };\n this.moveCursorLineStart = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var screenRow = this.session.documentToScreenRow(row, column);\n var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0);\n var beforeCursor = this.session.getDisplayLine(\n row, null, firstColumnPosition.row,\n firstColumnPosition.column\n );\n\n var leadingSpace = beforeCursor.match(/^\\s*/);\n if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart)\n firstColumnPosition.column += leadingSpace[0].length;\n this.moveCursorToPosition(firstColumnPosition);\n };\n this.moveCursorLineEnd = function() {\n var lead = this.lead;\n var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column);\n if (this.lead.column == lineEnd.column) {\n var line = this.session.getLine(lineEnd.row);\n if (lineEnd.column == line.length) {\n var textEnd = line.search(/\\s+$/);\n if (textEnd > 0)\n lineEnd.column = textEnd;\n }\n }\n\n this.moveCursorTo(lineEnd.row, lineEnd.column);\n };\n this.moveCursorFileEnd = function() {\n var row = this.doc.getLength() - 1;\n var column = this.doc.getLine(row).length;\n this.moveCursorTo(row, column);\n };\n this.moveCursorFileStart = function() {\n this.moveCursorTo(0, 0);\n };\n this.moveCursorLongWordRight = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var line = this.doc.getLine(row);\n var rightOfCursor = line.substring(column);\n\n var match;\n this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold) {\n this.moveCursorTo(fold.end.row, fold.end.column);\n return;\n }\n if (match = this.session.nonTokenRe.exec(rightOfCursor)) {\n column += this.session.nonTokenRe.lastIndex;\n this.session.nonTokenRe.lastIndex = 0;\n rightOfCursor = line.substring(column);\n }\n if (column >= line.length) {\n this.moveCursorTo(row, line.length);\n this.moveCursorRight();\n if (row < this.doc.getLength() - 1)\n this.moveCursorWordRight();\n return;\n }\n if (match = this.session.tokenRe.exec(rightOfCursor)) {\n column += this.session.tokenRe.lastIndex;\n this.session.tokenRe.lastIndex = 0;\n }\n\n this.moveCursorTo(row, column);\n };\n this.moveCursorLongWordLeft = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var fold;\n if (fold = this.session.getFoldAt(row, column, -1)) {\n this.moveCursorTo(fold.start.row, fold.start.column);\n return;\n }\n\n var str = this.session.getFoldStringAt(row, column, -1);\n if (str == null) {\n str = this.doc.getLine(row).substring(0, column);\n }\n\n var leftOfCursor = lang.stringReverse(str);\n var match;\n this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n if (match = this.session.nonTokenRe.exec(leftOfCursor)) {\n column -= this.session.nonTokenRe.lastIndex;\n leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\n this.session.nonTokenRe.lastIndex = 0;\n }\n if (column <= 0) {\n this.moveCursorTo(row, 0);\n this.moveCursorLeft();\n if (row > 0)\n this.moveCursorWordLeft();\n return;\n }\n if (match = this.session.tokenRe.exec(leftOfCursor)) {\n column -= this.session.tokenRe.lastIndex;\n this.session.tokenRe.lastIndex = 0;\n }\n\n this.moveCursorTo(row, column);\n };\n\n this.$shortWordEndIndex = function(rightOfCursor) {\n var match, index = 0, ch;\n var whitespaceRe = /\\s/;\n var tokenRe = this.session.tokenRe;\n\n tokenRe.lastIndex = 0;\n if (match = this.session.tokenRe.exec(rightOfCursor)) {\n index = this.session.tokenRe.lastIndex;\n } else {\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n index ++;\n\n if (index < 1) {\n tokenRe.lastIndex = 0;\n while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n tokenRe.lastIndex = 0;\n index ++;\n if (whitespaceRe.test(ch)) {\n if (index > 2) {\n index--;\n break;\n } else {\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n index ++;\n if (index > 2)\n break;\n }\n }\n }\n }\n }\n tokenRe.lastIndex = 0;\n\n return index;\n };\n\n this.moveCursorShortWordRight = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var line = this.doc.getLine(row);\n var rightOfCursor = line.substring(column);\n\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold)\n return this.moveCursorTo(fold.end.row, fold.end.column);\n\n if (column == line.length) {\n var l = this.doc.getLength();\n do {\n row++;\n rightOfCursor = this.doc.getLine(row);\n } while (row < l && /^\\s*$/.test(rightOfCursor));\n\n if (!/^\\s+/.test(rightOfCursor))\n rightOfCursor = \"\";\n column = 0;\n }\n\n var index = this.$shortWordEndIndex(rightOfCursor);\n\n this.moveCursorTo(row, column + index);\n };\n\n this.moveCursorShortWordLeft = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n\n var fold;\n if (fold = this.session.getFoldAt(row, column, -1))\n return this.moveCursorTo(fold.start.row, fold.start.column);\n\n var line = this.session.getLine(row).substring(0, column);\n if (column === 0) {\n do {\n row--;\n line = this.doc.getLine(row);\n } while (row > 0 && /^\\s*$/.test(line));\n\n column = line.length;\n if (!/\\s+$/.test(line))\n line = \"\";\n }\n\n var leftOfCursor = lang.stringReverse(line);\n var index = this.$shortWordEndIndex(leftOfCursor);\n\n return this.moveCursorTo(row, column - index);\n };\n\n this.moveCursorWordRight = function() {\n if (this.session.$selectLongWords)\n this.moveCursorLongWordRight();\n else\n this.moveCursorShortWordRight();\n };\n\n this.moveCursorWordLeft = function() {\n if (this.session.$selectLongWords)\n this.moveCursorLongWordLeft();\n else\n this.moveCursorShortWordLeft();\n };\n this.moveCursorBy = function(rows, chars) {\n var screenPos = this.session.documentToScreenPosition(\n this.lead.row,\n this.lead.column\n );\n\n var offsetX;\n\n if (chars === 0) {\n if (rows !== 0) {\n if (this.session.$bidiHandler.isBidiRow(screenPos.row, this.lead.row)) {\n offsetX = this.session.$bidiHandler.getPosLeft(screenPos.column);\n screenPos.column = Math.round(offsetX / this.session.$bidiHandler.charWidths[0]);\n } else {\n offsetX = screenPos.column * this.session.$bidiHandler.charWidths[0];\n }\n }\n\n if (this.$desiredColumn)\n screenPos.column = this.$desiredColumn;\n else\n this.$desiredColumn = screenPos.column;\n }\n\n var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column, offsetX);\n \n if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {\n if (this.session.lineWidgets && this.session.lineWidgets[docPos.row]) {\n if (docPos.row > 0 || rows > 0)\n docPos.row++;\n }\n }\n this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);\n };\n this.moveCursorToPosition = function(position) {\n this.moveCursorTo(position.row, position.column);\n };\n this.moveCursorTo = function(row, column, keepDesiredColumn) {\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold) {\n row = fold.start.row;\n column = fold.start.column;\n }\n\n this.$keepDesiredColumnOnChange = true;\n var line = this.session.getLine(row);\n if (/[\\uDC00-\\uDFFF]/.test(line.charAt(column)) && line.charAt(column - 1)) {\n if (this.lead.row == row && this.lead.column == column + 1)\n column = column - 1;\n else\n column = column + 1;\n }\n this.lead.setPosition(row, column);\n this.$keepDesiredColumnOnChange = false;\n\n if (!keepDesiredColumn)\n this.$desiredColumn = null;\n };\n this.moveCursorToScreen = function(row, column, keepDesiredColumn) {\n var pos = this.session.screenToDocumentPosition(row, column);\n this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);\n };\n this.detach = function() {\n this.lead.detach();\n this.anchor.detach();\n this.session = this.doc = null;\n };\n\n this.fromOrientedRange = function(range) {\n this.setSelectionRange(range, range.cursor == range.start);\n this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\n };\n\n this.toOrientedRange = function(range) {\n var r = this.getRange();\n if (range) {\n range.start.column = r.start.column;\n range.start.row = r.start.row;\n range.end.column = r.end.column;\n range.end.row = r.end.row;\n } else {\n range = r;\n }\n\n range.cursor = this.isBackwards() ? range.start : range.end;\n range.desiredColumn = this.$desiredColumn;\n return range;\n };\n this.getRangeOfMovements = function(func) {\n var start = this.getCursor();\n try {\n func(this);\n var end = this.getCursor();\n return Range.fromPoints(start,end);\n } catch(e) {\n return Range.fromPoints(start,start);\n } finally {\n this.moveCursorToPosition(start);\n }\n };\n\n this.toJSON = function() {\n if (this.rangeCount) {\n var data = this.ranges.map(function(r) {\n var r1 = r.clone();\n r1.isBackwards = r.cursor == r.start;\n return r1;\n });\n } else {\n var data = this.getRange();\n data.isBackwards = this.isBackwards();\n }\n return data;\n };\n\n this.fromJSON = function(data) {\n if (data.start == undefined) {\n if (this.rangeList) {\n this.toSingleRange(data[0]);\n for (var i = data.length; i--; ) {\n var r = Range.fromPoints(data[i].start, data[i].end);\n if (data[i].isBackwards)\n r.cursor = r.start;\n this.addRange(r, true);\n }\n return;\n } else\n data = data[0];\n }\n if (this.rangeList)\n this.toSingleRange(data);\n this.setSelectionRange(data, data.isBackwards);\n };\n\n this.isEqual = function(data) {\n if ((data.length || this.rangeCount) && data.length != this.rangeCount)\n return false;\n if (!data.length || !this.ranges)\n return this.getRange().isEqual(data);\n\n for (var i = this.ranges.length; i--; ) {\n if (!this.ranges[i].isEqual(data[i]))\n return false;\n }\n return true;\n };\n\n}).call(Selection.prototype);\n\nexports.Selection = Selection;\n});\n\nace.define(\"ace/tokenizer\",[\"require\",\"exports\",\"module\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar config = acequire(\"./config\");\nvar MAX_TOKEN_COUNT = 2000;\nvar Tokenizer = function(rules) {\n this.states = rules;\n\n this.regExps = {};\n this.matchMappings = {};\n for (var key in this.states) {\n var state = this.states[key];\n var ruleRegExps = [];\n var matchTotal = 0;\n var mapping = this.matchMappings[key] = {defaultToken: \"text\"};\n var flag = \"g\";\n\n var splitterRurles = [];\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n if (rule.defaultToken)\n mapping.defaultToken = rule.defaultToken;\n if (rule.caseInsensitive)\n flag = \"gi\";\n if (rule.regex == null)\n continue;\n\n if (rule.regex instanceof RegExp)\n rule.regex = rule.regex.toString().slice(1, -1);\n var adjustedregex = rule.regex;\n var matchcount = new RegExp(\"(?:(\" + adjustedregex + \")|(.))\").exec(\"a\").length - 2;\n if (Array.isArray(rule.token)) {\n if (rule.token.length == 1 || matchcount == 1) {\n rule.token = rule.token[0];\n } else if (matchcount - 1 != rule.token.length) {\n this.reportError(\"number of classes and regexp groups doesn't match\", { \n rule: rule,\n groupCount: matchcount - 1\n });\n rule.token = rule.token[0];\n } else {\n rule.tokenArray = rule.token;\n rule.token = null;\n rule.onMatch = this.$arrayTokens;\n }\n } else if (typeof rule.token == \"function\" && !rule.onMatch) {\n if (matchcount > 1)\n rule.onMatch = this.$applyToken;\n else\n rule.onMatch = rule.token;\n }\n\n if (matchcount > 1) {\n if (/\\\\\\d/.test(rule.regex)) {\n adjustedregex = rule.regex.replace(/\\\\([0-9]+)/g, function(match, digit) {\n return \"\\\\\" + (parseInt(digit, 10) + matchTotal + 1);\n });\n } else {\n matchcount = 1;\n adjustedregex = this.removeCapturingGroups(rule.regex);\n }\n if (!rule.splitRegex && typeof rule.token != \"string\")\n splitterRurles.push(rule); // flag will be known only at the very end\n }\n\n mapping[matchTotal] = i;\n matchTotal += matchcount;\n\n ruleRegExps.push(adjustedregex);\n if (!rule.onMatch)\n rule.onMatch = null;\n }\n \n if (!ruleRegExps.length) {\n mapping[0] = 0;\n ruleRegExps.push(\"$\");\n }\n \n splitterRurles.forEach(function(rule) {\n rule.splitRegex = this.createSplitterRegexp(rule.regex, flag);\n }, this);\n\n this.regExps[key] = new RegExp(\"(\" + ruleRegExps.join(\")|(\") + \")|($)\", flag);\n }\n};\n\n(function() {\n this.$setMaxTokenCount = function(m) {\n MAX_TOKEN_COUNT = m | 0;\n };\n \n this.$applyToken = function(str) {\n var values = this.splitRegex.exec(str).slice(1);\n var types = this.token.apply(this, values);\n if (typeof types === \"string\")\n return [{type: types, value: str}];\n\n var tokens = [];\n for (var i = 0, l = types.length; i < l; i++) {\n if (values[i])\n tokens[tokens.length] = {\n type: types[i],\n value: values[i]\n };\n }\n return tokens;\n };\n\n this.$arrayTokens = function(str) {\n if (!str)\n return [];\n var values = this.splitRegex.exec(str);\n if (!values)\n return \"text\";\n var tokens = [];\n var types = this.tokenArray;\n for (var i = 0, l = types.length; i < l; i++) {\n if (values[i + 1])\n tokens[tokens.length] = {\n type: types[i],\n value: values[i + 1]\n };\n }\n return tokens;\n };\n\n this.removeCapturingGroups = function(src) {\n var r = src.replace(\n /\\[(?:\\\\.|[^\\]])*?\\]|\\\\.|\\(\\?[:=!]|(\\()/g,\n function(x, y) {return y ? \"(?:\" : x;}\n );\n return r;\n };\n\n this.createSplitterRegexp = function(src, flag) {\n if (src.indexOf(\"(?=\") != -1) {\n var stack = 0;\n var inChClass = false;\n var lastCapture = {};\n src.replace(/(\\\\.)|(\\((?:\\?[=!])?)|(\\))|([\\[\\]])/g, function(\n m, esc, parenOpen, parenClose, square, index\n ) {\n if (inChClass) {\n inChClass = square != \"]\";\n } else if (square) {\n inChClass = true;\n } else if (parenClose) {\n if (stack == lastCapture.stack) {\n lastCapture.end = index+1;\n lastCapture.stack = -1;\n }\n stack--;\n } else if (parenOpen) {\n stack++;\n if (parenOpen.length != 1) {\n lastCapture.stack = stack;\n lastCapture.start = index;\n }\n }\n return m;\n });\n\n if (lastCapture.end != null && /^\\)*$/.test(src.substr(lastCapture.end)))\n src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end);\n }\n if (src.charAt(0) != \"^\") src = \"^\" + src;\n if (src.charAt(src.length - 1) != \"$\") src += \"$\";\n \n return new RegExp(src, (flag||\"\").replace(\"g\", \"\"));\n };\n this.getLineTokens = function(line, startState) {\n if (startState && typeof startState != \"string\") {\n var stack = startState.slice(0);\n startState = stack[0];\n if (startState === \"#tmp\") {\n stack.shift();\n startState = stack.shift();\n }\n } else\n var stack = [];\n\n var currentState = startState || \"start\";\n var state = this.states[currentState];\n if (!state) {\n currentState = \"start\";\n state = this.states[currentState];\n }\n var mapping = this.matchMappings[currentState];\n var re = this.regExps[currentState];\n re.lastIndex = 0;\n\n var match, tokens = [];\n var lastIndex = 0;\n var matchAttempts = 0;\n\n var token = {type: null, value: \"\"};\n\n while (match = re.exec(line)) {\n var type = mapping.defaultToken;\n var rule = null;\n var value = match[0];\n var index = re.lastIndex;\n\n if (index - value.length > lastIndex) {\n var skipped = line.substring(lastIndex, index - value.length);\n if (token.type == type) {\n token.value += skipped;\n } else {\n if (token.type)\n tokens.push(token);\n token = {type: type, value: skipped};\n }\n }\n\n for (var i = 0; i < match.length-2; i++) {\n if (match[i + 1] === undefined)\n continue;\n\n rule = state[mapping[i]];\n\n if (rule.onMatch)\n type = rule.onMatch(value, currentState, stack, line);\n else\n type = rule.token;\n\n if (rule.next) {\n if (typeof rule.next == \"string\") {\n currentState = rule.next;\n } else {\n currentState = rule.next(currentState, stack);\n }\n \n state = this.states[currentState];\n if (!state) {\n this.reportError(\"state doesn't exist\", currentState);\n currentState = \"start\";\n state = this.states[currentState];\n }\n mapping = this.matchMappings[currentState];\n lastIndex = index;\n re = this.regExps[currentState];\n re.lastIndex = index;\n }\n if (rule.consumeLineEnd)\n lastIndex = index;\n break;\n }\n\n if (value) {\n if (typeof type === \"string\") {\n if ((!rule || rule.merge !== false) && token.type === type) {\n token.value += value;\n } else {\n if (token.type)\n tokens.push(token);\n token = {type: type, value: value};\n }\n } else if (type) {\n if (token.type)\n tokens.push(token);\n token = {type: null, value: \"\"};\n for (var i = 0; i < type.length; i++)\n tokens.push(type[i]);\n }\n }\n\n if (lastIndex == line.length)\n break;\n\n lastIndex = index;\n\n if (matchAttempts++ > MAX_TOKEN_COUNT) {\n if (matchAttempts > 2 * line.length) {\n this.reportError(\"infinite loop with in ace tokenizer\", {\n startState: startState,\n line: line\n });\n }\n while (lastIndex < line.length) {\n if (token.type)\n tokens.push(token);\n token = {\n value: line.substring(lastIndex, lastIndex += 2000),\n type: \"overflow\"\n };\n }\n currentState = \"start\";\n stack = [];\n break;\n }\n }\n\n if (token.type)\n tokens.push(token);\n \n if (stack.length > 1) {\n if (stack[0] !== currentState)\n stack.unshift(\"#tmp\", currentState);\n }\n return {\n tokens : tokens,\n state : stack.length ? stack : currentState\n };\n };\n \n this.reportError = config.reportError;\n \n}).call(Tokenizer.prototype);\n\nexports.Tokenizer = Tokenizer;\n});\n\nace.define(\"ace/mode/text_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"../lib/lang\");\n\nvar TextHighlightRules = function() {\n\n this.$rules = {\n \"start\" : [{\n token : \"empty_line\",\n regex : '^$'\n }, {\n defaultToken : \"text\"\n }]\n };\n};\n\n(function() {\n\n this.addRules = function(rules, prefix) {\n if (!prefix) {\n for (var key in rules)\n this.$rules[key] = rules[key];\n return;\n }\n for (var key in rules) {\n var state = rules[key];\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n if (rule.next || rule.onMatch) {\n if (typeof rule.next == \"string\") {\n if (rule.next.indexOf(prefix) !== 0)\n rule.next = prefix + rule.next;\n }\n if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n rule.nextState = prefix + rule.nextState;\n }\n }\n this.$rules[prefix + key] = state;\n }\n };\n\n this.getRules = function() {\n return this.$rules;\n };\n\n this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) {\n var embedRules = typeof HighlightRules == \"function\"\n ? new HighlightRules().getRules()\n : HighlightRules;\n if (states) {\n for (var i = 0; i < states.length; i++)\n states[i] = prefix + states[i];\n } else {\n states = [];\n for (var key in embedRules)\n states.push(prefix + key);\n }\n\n this.addRules(embedRules, prefix);\n\n if (escapeRules) {\n var addRules = Array.prototype[append ? \"push\" : \"unshift\"];\n for (var i = 0; i < states.length; i++)\n addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));\n }\n\n if (!this.$embeds)\n this.$embeds = [];\n this.$embeds.push(prefix);\n };\n\n this.getEmbeds = function() {\n return this.$embeds;\n };\n\n var pushState = function(currentState, stack) {\n if (currentState != \"start\" || stack.length)\n stack.unshift(this.nextState, currentState);\n return this.nextState;\n };\n var popState = function(currentState, stack) {\n stack.shift();\n return stack.shift() || \"start\";\n };\n\n this.normalizeRules = function() {\n var id = 0;\n var rules = this.$rules;\n function processState(key) {\n var state = rules[key];\n state.processed = true;\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n var toInsert = null;\n if (Array.isArray(rule)) {\n toInsert = rule;\n rule = {};\n }\n if (!rule.regex && rule.start) {\n rule.regex = rule.start;\n if (!rule.next)\n rule.next = [];\n rule.next.push({\n defaultToken: rule.token\n }, {\n token: rule.token + \".end\",\n regex: rule.end || rule.start,\n next: \"pop\"\n });\n rule.token = rule.token + \".start\";\n rule.push = true;\n }\n var next = rule.next || rule.push;\n if (next && Array.isArray(next)) {\n var stateName = rule.stateName;\n if (!stateName) {\n stateName = rule.token;\n if (typeof stateName != \"string\")\n stateName = stateName[0] || \"\";\n if (rules[stateName])\n stateName += id++;\n }\n rules[stateName] = next;\n rule.next = stateName;\n processState(stateName);\n } else if (next == \"pop\") {\n rule.next = popState;\n }\n\n if (rule.push) {\n rule.nextState = rule.next || rule.push;\n rule.next = pushState;\n delete rule.push;\n }\n\n if (rule.rules) {\n for (var r in rule.rules) {\n if (rules[r]) {\n if (rules[r].push)\n rules[r].push.apply(rules[r], rule.rules[r]);\n } else {\n rules[r] = rule.rules[r];\n }\n }\n }\n var includeName = typeof rule == \"string\" ? rule : rule.include;\n if (includeName) {\n if (Array.isArray(includeName))\n toInsert = includeName.map(function(x) { return rules[x]; });\n else\n toInsert = rules[includeName];\n }\n\n if (toInsert) {\n var args = [i, 1].concat(toInsert);\n if (rule.noEscape)\n args = args.filter(function(x) {return !x.next;});\n state.splice.apply(state, args);\n i--;\n }\n \n if (rule.keywordMap) {\n rule.token = this.createKeywordMapper(\n rule.keywordMap, rule.defaultToken || \"text\", rule.caseInsensitive\n );\n delete rule.defaultToken;\n }\n }\n }\n Object.keys(rules).forEach(processState, this);\n };\n\n this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {\n var keywords = Object.create(null);\n Object.keys(map).forEach(function(className) {\n var a = map[className];\n if (ignoreCase)\n a = a.toLowerCase();\n var list = a.split(splitChar || \"|\");\n for (var i = list.length; i--; )\n keywords[list[i]] = className;\n });\n if (Object.getPrototypeOf(keywords)) {\n keywords.__proto__ = null;\n }\n this.$keywordList = Object.keys(keywords);\n map = null;\n return ignoreCase\n ? function(value) {return keywords[value.toLowerCase()] || defaultToken; }\n : function(value) {return keywords[value] || defaultToken; };\n };\n\n this.getKeywords = function() {\n return this.$keywords;\n };\n\n}).call(TextHighlightRules.prototype);\n\nexports.TextHighlightRules = TextHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Behaviour = function() {\n this.$behaviours = {};\n};\n\n(function () {\n\n this.add = function (name, action, callback) {\n switch (undefined) {\n case this.$behaviours:\n this.$behaviours = {};\n case this.$behaviours[name]:\n this.$behaviours[name] = {};\n }\n this.$behaviours[name][action] = callback;\n };\n \n this.addBehaviours = function (behaviours) {\n for (var key in behaviours) {\n for (var action in behaviours[key]) {\n this.add(key, action, behaviours[key][action]);\n }\n }\n };\n \n this.remove = function (name) {\n if (this.$behaviours && this.$behaviours[name]) {\n delete this.$behaviours[name];\n }\n };\n \n this.inherit = function (mode, filter) {\n if (typeof mode === \"function\") {\n var behaviours = new mode().getBehaviours(filter);\n } else {\n var behaviours = mode.getBehaviours(filter);\n }\n this.addBehaviours(behaviours);\n };\n \n this.getBehaviours = function (filter) {\n if (!filter) {\n return this.$behaviours;\n } else {\n var ret = {};\n for (var i = 0; i < filter.length; i++) {\n if (this.$behaviours[filter[i]]) {\n ret[filter[i]] = this.$behaviours[filter[i]];\n }\n }\n return ret;\n }\n };\n\n}).call(Behaviour.prototype);\n\nexports.Behaviour = Behaviour;\n});\n\nace.define(\"ace/token_iterator\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"./range\").Range;\nvar TokenIterator = function(session, initialRow, initialColumn) {\n this.$session = session;\n this.$row = initialRow;\n this.$rowTokens = session.getTokens(initialRow);\n\n var token = session.getTokenAt(initialRow, initialColumn);\n this.$tokenIndex = token ? token.index : -1;\n};\n\n(function() { \n this.stepBackward = function() {\n this.$tokenIndex -= 1;\n \n while (this.$tokenIndex < 0) {\n this.$row -= 1;\n if (this.$row < 0) {\n this.$row = 0;\n return null;\n }\n \n this.$rowTokens = this.$session.getTokens(this.$row);\n this.$tokenIndex = this.$rowTokens.length - 1;\n }\n \n return this.$rowTokens[this.$tokenIndex];\n }; \n this.stepForward = function() {\n this.$tokenIndex += 1;\n var rowCount;\n while (this.$tokenIndex >= this.$rowTokens.length) {\n this.$row += 1;\n if (!rowCount)\n rowCount = this.$session.getLength();\n if (this.$row >= rowCount) {\n this.$row = rowCount - 1;\n return null;\n }\n\n this.$rowTokens = this.$session.getTokens(this.$row);\n this.$tokenIndex = 0;\n }\n \n return this.$rowTokens[this.$tokenIndex];\n }; \n this.getCurrentToken = function () {\n return this.$rowTokens[this.$tokenIndex];\n }; \n this.getCurrentTokenRow = function () {\n return this.$row;\n }; \n this.getCurrentTokenColumn = function() {\n var rowTokens = this.$rowTokens;\n var tokenIndex = this.$tokenIndex;\n var column = rowTokens[tokenIndex].start;\n if (column !== undefined)\n return column;\n \n column = 0;\n while (tokenIndex > 0) {\n tokenIndex -= 1;\n column += rowTokens[tokenIndex].value.length;\n }\n \n return column; \n };\n this.getCurrentTokenPosition = function() {\n return {row: this.$row, column: this.getCurrentTokenColumn()};\n };\n this.getCurrentTokenRange = function() {\n var token = this.$rowTokens[this.$tokenIndex];\n var column = this.getCurrentTokenColumn();\n return new Range(this.$row, column, this.$row, column + token.value.length);\n };\n\n}).call(TokenIterator.prototype);\n\nexports.TokenIterator = TokenIterator;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../../lib/oop\");\nvar Behaviour = acequire(\"../behaviour\").Behaviour;\nvar TokenIterator = acequire(\"../../token_iterator\").TokenIterator;\nvar lang = acequire(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar defaultQuotes = {'\"' : '\"', \"'\" : \"'\"};\n\nvar initContext = function(editor) {\n var id = -1;\n if (editor.multiSelect) {\n id = editor.selection.index;\n if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n contextCache = {rangeCount: editor.multiSelect.rangeCount};\n }\n if (contextCache[id])\n return context = contextCache[id];\n context = contextCache[id] = {\n autoInsertedBrackets: 0,\n autoInsertedRow: -1,\n autoInsertedLineEnd: \"\",\n maybeInsertedBrackets: 0,\n maybeInsertedRow: -1,\n maybeInsertedLineStart: \"\",\n maybeInsertedLineEnd: \"\"\n };\n};\n\nvar getWrapped = function(selection, selected, opening, closing) {\n var rowDiff = selection.end.row - selection.start.row;\n return {\n text: opening + selected + closing,\n selection: [\n 0,\n selection.start.column + 1,\n rowDiff,\n selection.end.column + (rowDiff ? 0 : 1)\n ]\n };\n};\n\nvar CstyleBehaviour = function(options) {\n this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (text == '{') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '{', '}');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options && options.braces) {\n CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n return {\n text: '{}',\n selection: [1, 1]\n };\n } else {\n CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n return {\n text: '{',\n selection: [1, 1]\n };\n }\n }\n } else if (text == '}') {\n initContext(editor);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == '}') {\n var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n } else if (text == \"\\n\" || text == \"\\r\\n\") {\n initContext(editor);\n var closing = \"\";\n if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n CstyleBehaviour.clearMaybeInsertedClosing();\n }\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar === '}') {\n var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n if (!openBracePos)\n return null;\n var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n } else if (closing) {\n var next_indent = this.$getIndent(line);\n } else {\n CstyleBehaviour.clearMaybeInsertedClosing();\n return;\n }\n var indent = next_indent + session.getTabString();\n\n return {\n text: '\\n' + indent + '\\n' + next_indent + closing,\n selection: [1, indent.length, 1, indent.length]\n };\n } else {\n CstyleBehaviour.clearMaybeInsertedClosing();\n }\n });\n\n this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '{') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.end.column, range.end.column + 1);\n if (rightChar == '}') {\n range.end.column++;\n return range;\n } else {\n context.maybeInsertedBrackets--;\n }\n }\n });\n\n this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n if (text == '(') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '(', ')');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n return {\n text: '()',\n selection: [1, 1]\n };\n }\n } else if (text == ')') {\n initContext(editor);\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == ')') {\n var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n }\n });\n\n this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '(') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == ')') {\n range.end.column++;\n return range;\n }\n }\n });\n\n this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n if (text == '[') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '[', ']');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n return {\n text: '[]',\n selection: [1, 1]\n };\n }\n } else if (text == ']') {\n initContext(editor);\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == ']') {\n var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n }\n });\n\n this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '[') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == ']') {\n range.end.column++;\n return range;\n }\n }\n });\n\n this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n var quotes = session.$mode.$quotes || defaultQuotes;\n if (text.length == 1 && quotes[text]) {\n if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1)\n return;\n initContext(editor);\n var quote = text;\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && (selected.length != 1 || !quotes[selected]) && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, quote, quote);\n } else if (!selected) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var leftChar = line.substring(cursor.column-1, cursor.column);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n\n var token = session.getTokenAt(cursor.row, cursor.column);\n var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n return null;\n\n var stringBefore = token && /string|escape/.test(token.type);\n var stringAfter = !rightToken || /string|escape/.test(rightToken.type);\n\n var pair;\n if (rightChar == quote) {\n pair = stringBefore !== stringAfter;\n if (pair && /string\\.end/.test(rightToken.type))\n pair = false;\n } else {\n if (stringBefore && !stringAfter)\n return null; // wrap string with different quote\n if (stringBefore && stringAfter)\n return null; // do not pair quotes inside strings\n var wordRe = session.$mode.tokenRe;\n wordRe.lastIndex = 0;\n var isWordBefore = wordRe.test(leftChar);\n wordRe.lastIndex = 0;\n var isWordAfter = wordRe.test(leftChar);\n if (isWordBefore || isWordAfter)\n return null; // before or after alphanumeric\n if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n return null; // there is rightChar and it isn't closing\n pair = true;\n }\n return {\n text: pair ? quote + quote : \"\",\n selection: [1,1]\n };\n }\n }\n });\n\n this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == selected) {\n range.end.column++;\n return range;\n }\n }\n });\n\n};\n\n\nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n var cursor = editor.getCursorPosition();\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n return false;\n }\n iterator.stepForward();\n return iterator.getCurrentTokenRow() !== cursor.row ||\n this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n context.autoInsertedBrackets = 0;\n context.autoInsertedRow = cursor.row;\n context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (!this.isMaybeInsertedClosing(cursor, line))\n context.maybeInsertedBrackets = 0;\n context.maybeInsertedRow = cursor.row;\n context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n context.maybeInsertedLineEnd = line.substr(cursor.column);\n context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n return context.autoInsertedBrackets > 0 &&\n cursor.row === context.autoInsertedRow &&\n bracket === context.autoInsertedLineEnd[0] &&\n line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n return context.maybeInsertedBrackets > 0 &&\n cursor.row === context.maybeInsertedRow &&\n line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n if (context) {\n context.maybeInsertedBrackets = 0;\n context.maybeInsertedRow = -1;\n }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/unicode\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nexports.packages = {};\n\naddUnicodePackage({\n L: \"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n Ll: \"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A\",\n Lu: \"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A\",\n Lt: \"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\",\n Lm: \"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\",\n Lo: \"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n M: \"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26\",\n Mn: \"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26\",\n Mc: \"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC\",\n Me: \"0488048906DE20DD-20E020E2-20E4A670-A672\",\n N: \"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n Nd: \"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n Nl: \"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\",\n No: \"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\",\n P: \"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65\",\n Pd: \"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\",\n Ps: \"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\",\n Pe: \"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\",\n Pi: \"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\",\n Pf: \"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\",\n Pc: \"005F203F20402054FE33FE34FE4D-FE4FFF3F\",\n Po: \"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65\",\n S: \"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD\",\n Sm: \"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC\",\n Sc: \"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\",\n Sk: \"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\",\n So: \"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD\",\n Z: \"002000A01680180E2000-200A20282029202F205F3000\",\n Zs: \"002000A01680180E2000-200A202F205F3000\",\n Zl: \"2028\",\n Zp: \"2029\",\n C: \"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF\",\n Cc: \"0000-001F007F-009F\",\n Cf: \"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\",\n Co: \"E000-F8FF\",\n Cs: \"D800-DFFF\",\n Cn: \"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF\"\n});\n\nfunction addUnicodePackage (pack) {\n var codePoint = /\\w{4}/g;\n for (var name in pack)\n exports.packages[name] = pack[name].replace(codePoint, \"\\\\u$&\");\n}\n\n});\n\nace.define(\"ace/mode/text\",[\"require\",\"exports\",\"module\",\"ace/tokenizer\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour/cstyle\",\"ace/unicode\",\"ace/lib/lang\",\"ace/token_iterator\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Tokenizer = acequire(\"../tokenizer\").Tokenizer;\nvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\nvar CstyleBehaviour = acequire(\"./behaviour/cstyle\").CstyleBehaviour;\nvar unicode = acequire(\"../unicode\");\nvar lang = acequire(\"../lib/lang\");\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\nvar Range = acequire(\"../range\").Range;\n\nvar Mode = function() {\n this.HighlightRules = TextHighlightRules;\n};\n\n(function() {\n this.$defaultBehaviour = new CstyleBehaviour();\n\n this.tokenRe = new RegExp(\"^[\"\n + unicode.packages.L\n + unicode.packages.Mn + unicode.packages.Mc\n + unicode.packages.Nd\n + unicode.packages.Pc + \"\\\\$_]+\", \"g\"\n );\n\n this.nonTokenRe = new RegExp(\"^(?:[^\"\n + unicode.packages.L\n + unicode.packages.Mn + unicode.packages.Mc\n + unicode.packages.Nd\n + unicode.packages.Pc + \"\\\\$_]|\\\\s])+\", \"g\"\n );\n\n this.getTokenizer = function() {\n if (!this.$tokenizer) {\n this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig);\n this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());\n }\n return this.$tokenizer;\n };\n\n this.lineCommentStart = \"\";\n this.blockComment = \"\";\n\n this.toggleCommentLines = function(state, session, startRow, endRow) {\n var doc = session.doc;\n\n var ignoreBlankLines = true;\n var shouldRemove = true;\n var minIndent = Infinity;\n var tabSize = session.getTabSize();\n var insertAtTabStop = false;\n\n if (!this.lineCommentStart) {\n if (!this.blockComment)\n return false;\n var lineCommentStart = this.blockComment.start;\n var lineCommentEnd = this.blockComment.end;\n var regexpStart = new RegExp(\"^(\\\\s*)(?:\" + lang.escapeRegExp(lineCommentStart) + \")\");\n var regexpEnd = new RegExp(\"(?:\" + lang.escapeRegExp(lineCommentEnd) + \")\\\\s*$\");\n\n var comment = function(line, i) {\n if (testRemove(line, i))\n return;\n if (!ignoreBlankLines || /\\S/.test(line)) {\n doc.insertInLine({row: i, column: line.length}, lineCommentEnd);\n doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n }\n };\n\n var uncomment = function(line, i) {\n var m;\n if (m = line.match(regexpEnd))\n doc.removeInLine(i, line.length - m[0].length, line.length);\n if (m = line.match(regexpStart))\n doc.removeInLine(i, m[1].length, m[0].length);\n };\n\n var testRemove = function(line, row) {\n if (regexpStart.test(line))\n return true;\n var tokens = session.getTokens(row);\n for (var i = 0; i < tokens.length; i++) {\n if (tokens[i].type === \"comment\")\n return true;\n }\n };\n } else {\n if (Array.isArray(this.lineCommentStart)) {\n var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join(\"|\");\n var lineCommentStart = this.lineCommentStart[0];\n } else {\n var regexpStart = lang.escapeRegExp(this.lineCommentStart);\n var lineCommentStart = this.lineCommentStart;\n }\n regexpStart = new RegExp(\"^(\\\\s*)(?:\" + regexpStart + \") ?\");\n \n insertAtTabStop = session.getUseSoftTabs();\n\n var uncomment = function(line, i) {\n var m = line.match(regexpStart);\n if (!m) return;\n var start = m[1].length, end = m[0].length;\n if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == \" \")\n end--;\n doc.removeInLine(i, start, end);\n };\n var commentWithSpace = lineCommentStart + \" \";\n var comment = function(line, i) {\n if (!ignoreBlankLines || /\\S/.test(line)) {\n if (shouldInsertSpace(line, minIndent, minIndent))\n doc.insertInLine({row: i, column: minIndent}, commentWithSpace);\n else\n doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n }\n };\n var testRemove = function(line, i) {\n return regexpStart.test(line);\n };\n \n var shouldInsertSpace = function(line, before, after) {\n var spaces = 0;\n while (before-- && line.charAt(before) == \" \")\n spaces++;\n if (spaces % tabSize != 0)\n return false;\n var spaces = 0;\n while (line.charAt(after++) == \" \")\n spaces++;\n if (tabSize > 2)\n return spaces % tabSize != tabSize - 1;\n else\n return spaces % tabSize == 0;\n return true;\n };\n }\n\n function iter(fun) {\n for (var i = startRow; i <= endRow; i++)\n fun(doc.getLine(i), i);\n }\n\n\n var minEmptyLength = Infinity;\n iter(function(line, i) {\n var indent = line.search(/\\S/);\n if (indent !== -1) {\n if (indent < minIndent)\n minIndent = indent;\n if (shouldRemove && !testRemove(line, i))\n shouldRemove = false;\n } else if (minEmptyLength > line.length) {\n minEmptyLength = line.length;\n }\n });\n\n if (minIndent == Infinity) {\n minIndent = minEmptyLength;\n ignoreBlankLines = false;\n shouldRemove = false;\n }\n\n if (insertAtTabStop && minIndent % tabSize != 0)\n minIndent = Math.floor(minIndent / tabSize) * tabSize;\n\n iter(shouldRemove ? uncomment : comment);\n };\n\n this.toggleBlockComment = function(state, session, range, cursor) {\n var comment = this.blockComment;\n if (!comment)\n return;\n if (!comment.start && comment[0])\n comment = comment[0];\n\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n var token = iterator.getCurrentToken();\n\n var sel = session.selection;\n var initialRange = session.selection.toOrientedRange();\n var startRow, colDiff;\n\n if (token && /comment/.test(token.type)) {\n var startRange, endRange;\n while (token && /comment/.test(token.type)) {\n var i = token.value.indexOf(comment.start);\n if (i != -1) {\n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn() + i;\n startRange = new Range(row, column, row, column + comment.start.length);\n break;\n }\n token = iterator.stepBackward();\n }\n\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n var token = iterator.getCurrentToken();\n while (token && /comment/.test(token.type)) {\n var i = token.value.indexOf(comment.end);\n if (i != -1) {\n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn() + i;\n endRange = new Range(row, column, row, column + comment.end.length);\n break;\n }\n token = iterator.stepForward();\n }\n if (endRange)\n session.remove(endRange);\n if (startRange) {\n session.remove(startRange);\n startRow = startRange.start.row;\n colDiff = -comment.start.length;\n }\n } else {\n colDiff = comment.start.length;\n startRow = range.start.row;\n session.insert(range.end, comment.end);\n session.insert(range.start, comment.start);\n }\n if (initialRange.start.row == startRow)\n initialRange.start.column += colDiff;\n if (initialRange.end.row == startRow)\n initialRange.end.column += colDiff;\n session.selection.fromOrientedRange(initialRange);\n };\n\n this.getNextLineIndent = function(state, line, tab) {\n return this.$getIndent(line);\n };\n\n this.checkOutdent = function(state, line, input) {\n return false;\n };\n\n this.autoOutdent = function(state, doc, row) {\n };\n\n this.$getIndent = function(line) {\n return line.match(/^\\s*/)[0];\n };\n\n this.createWorker = function(session) {\n return null;\n };\n\n this.createModeDelegates = function (mapping) {\n this.$embeds = [];\n this.$modes = {};\n for (var i in mapping) {\n if (mapping[i]) {\n this.$embeds.push(i);\n this.$modes[i] = new mapping[i]();\n }\n }\n\n var delegations = [\"toggleBlockComment\", \"toggleCommentLines\", \"getNextLineIndent\", \n \"checkOutdent\", \"autoOutdent\", \"transformAction\", \"getCompletions\"];\n\n for (var i = 0; i < delegations.length; i++) {\n (function(scope) {\n var functionName = delegations[i];\n var defaultHandler = scope[functionName];\n scope[delegations[i]] = function() {\n return this.$delegator(functionName, arguments, defaultHandler);\n };\n }(this));\n }\n };\n\n this.$delegator = function(method, args, defaultHandler) {\n var state = args[0];\n if (typeof state != \"string\")\n state = state[0];\n for (var i = 0; i < this.$embeds.length; i++) {\n if (!this.$modes[this.$embeds[i]]) continue;\n\n var split = state.split(this.$embeds[i]);\n if (!split[0] && split[1]) {\n args[0] = split[1];\n var mode = this.$modes[this.$embeds[i]];\n return mode[method].apply(mode, args);\n }\n }\n var ret = defaultHandler.apply(this, args);\n return defaultHandler ? ret : undefined;\n };\n\n this.transformAction = function(state, action, editor, session, param) {\n if (this.$behaviour) {\n var behaviours = this.$behaviour.getBehaviours();\n for (var key in behaviours) {\n if (behaviours[key][action]) {\n var ret = behaviours[key][action].apply(this, arguments);\n if (ret) {\n return ret;\n }\n }\n }\n }\n };\n \n this.getKeywords = function(append) {\n if (!this.completionKeywords) {\n var rules = this.$tokenizer.rules;\n var completionKeywords = [];\n for (var rule in rules) {\n var ruleItr = rules[rule];\n for (var r = 0, l = ruleItr.length; r < l; r++) {\n if (typeof ruleItr[r].token === \"string\") {\n if (/keyword|support|storage/.test(ruleItr[r].token))\n completionKeywords.push(ruleItr[r].regex);\n }\n else if (typeof ruleItr[r].token === \"object\") {\n for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { \n if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\n var rule = ruleItr[r].regex.match(/\\(.+?\\)/g)[a];\n completionKeywords.push(rule.substr(1, rule.length - 2));\n }\n }\n }\n }\n }\n this.completionKeywords = completionKeywords;\n }\n if (!append)\n return this.$keywordList;\n return completionKeywords.concat(this.$keywordList || []);\n };\n \n this.$createKeywordList = function() {\n if (!this.$highlightRules)\n this.getTokenizer();\n return this.$keywordList = this.$highlightRules.$keywordList || [];\n };\n\n this.getCompletions = function(state, session, pos, prefix) {\n var keywords = this.$keywordList || this.$createKeywordList();\n return keywords.map(function(word) {\n return {\n name: word,\n value: word,\n score: 0,\n meta: \"keyword\"\n };\n });\n };\n\n this.$id = \"ace/mode/text\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nfunction throwDeltaError(delta, errorText){\n console.log(\"Invalid Delta:\", delta);\n throw \"Invalid Delta: \" + errorText;\n}\n\nfunction positionInDocument(docLines, position) {\n return position.row >= 0 && position.row < docLines.length &&\n position.column >= 0 && position.column <= docLines[position.row].length;\n}\n\nfunction validateDelta(docLines, delta) {\n if (delta.action != \"insert\" && delta.action != \"remove\")\n throwDeltaError(delta, \"delta.action must be 'insert' or 'remove'\");\n if (!(delta.lines instanceof Array))\n throwDeltaError(delta, \"delta.lines must be an Array\");\n if (!delta.start || !delta.end)\n throwDeltaError(delta, \"delta.start/end must be an present\");\n var start = delta.start;\n if (!positionInDocument(docLines, delta.start))\n throwDeltaError(delta, \"delta.start must be contained in document\");\n var end = delta.end;\n if (delta.action == \"remove\" && !positionInDocument(docLines, end))\n throwDeltaError(delta, \"delta.end must contained in document for 'remove' actions\");\n var numRangeRows = end.row - start.row;\n var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));\n if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)\n throwDeltaError(delta, \"delta.range must match delta lines\");\n}\n\nexports.applyDelta = function(docLines, delta, doNotValidate) {\n \n var row = delta.start.row;\n var startColumn = delta.start.column;\n var line = docLines[row] || \"\";\n switch (delta.action) {\n case \"insert\":\n var lines = delta.lines;\n if (lines.length === 1) {\n docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);\n } else {\n var args = [row, 1].concat(delta.lines);\n docLines.splice.apply(docLines, args);\n docLines[row] = line.substring(0, startColumn) + docLines[row];\n docLines[row + delta.lines.length - 1] += line.substring(startColumn);\n }\n break;\n case \"remove\":\n var endColumn = delta.end.column;\n var endRow = delta.end.row;\n if (row === endRow) {\n docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);\n } else {\n docLines.splice(\n row, endRow - row + 1,\n line.substring(0, startColumn) + docLines[endRow].substring(endColumn)\n );\n }\n break;\n }\n};\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n this.$onChange = this.onChange.bind(this);\n this.attach(doc);\n \n if (typeof column == \"undefined\")\n this.setPosition(row.row, row.column);\n else\n this.setPosition(row, column);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.getPosition = function() {\n return this.$clipPositionToDocument(this.row, this.column);\n };\n this.getDocument = function() {\n return this.document;\n };\n this.$insertRight = false;\n this.onChange = function(delta) {\n if (delta.start.row == delta.end.row && delta.start.row != this.row)\n return;\n\n if (delta.start.row > this.row)\n return;\n \n var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);\n this.setPosition(point.row, point.column, true);\n };\n \n function $pointsInOrder(point1, point2, equalPointsInOrder) {\n var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;\n return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);\n }\n \n function $getTransformedPoint(delta, point, moveIfEqual) {\n var deltaIsInsert = delta.action == \"insert\";\n var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);\n var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);\n var deltaStart = delta.start;\n var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.\n if ($pointsInOrder(point, deltaStart, moveIfEqual)) {\n return {\n row: point.row,\n column: point.column\n };\n }\n if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {\n return {\n row: point.row + deltaRowShift,\n column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)\n };\n }\n \n return {\n row: deltaStart.row,\n column: deltaStart.column\n };\n }\n this.setPosition = function(row, column, noClip) {\n var pos;\n if (noClip) {\n pos = {\n row: row,\n column: column\n };\n } else {\n pos = this.$clipPositionToDocument(row, column);\n }\n\n if (this.row == pos.row && this.column == pos.column)\n return;\n\n var old = {\n row: this.row,\n column: this.column\n };\n\n this.row = pos.row;\n this.column = pos.column;\n this._signal(\"change\", {\n old: old,\n value: pos\n });\n };\n this.detach = function() {\n this.document.removeEventListener(\"change\", this.$onChange);\n };\n this.attach = function(doc) {\n this.document = doc || this.document;\n this.document.on(\"change\", this.$onChange);\n };\n this.$clipPositionToDocument = function(row, column) {\n var pos = {};\n\n if (row >= this.document.getLength()) {\n pos.row = Math.max(0, this.document.getLength() - 1);\n pos.column = this.document.getLine(pos.row).length;\n }\n else if (row < 0) {\n pos.row = 0;\n pos.column = 0;\n }\n else {\n pos.row = row;\n pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n }\n\n if (column < 0)\n pos.column = 0;\n\n return pos;\n };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar applyDelta = acequire(\"./apply_delta\").applyDelta;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Range = acequire(\"./range\").Range;\nvar Anchor = acequire(\"./anchor\").Anchor;\n\nvar Document = function(textOrLines) {\n this.$lines = [\"\"];\n if (textOrLines.length === 0) {\n this.$lines = [\"\"];\n } else if (Array.isArray(textOrLines)) {\n this.insertMergedLines({row: 0, column: 0}, textOrLines);\n } else {\n this.insert({row: 0, column:0}, textOrLines);\n }\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setValue = function(text) {\n var len = this.getLength() - 1;\n this.remove(new Range(0, 0, len, this.getLine(len).length));\n this.insert({row: 0, column: 0}, text);\n };\n this.getValue = function() {\n return this.getAllLines().join(this.getNewLineCharacter());\n };\n this.createAnchor = function(row, column) {\n return new Anchor(this, row, column);\n };\n if (\"aaa\".split(/a/).length === 0) {\n this.$split = function(text) {\n return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n };\n } else {\n this.$split = function(text) {\n return text.split(/\\r\\n|\\r|\\n/);\n };\n }\n\n\n this.$detectNewLine = function(text) {\n var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n this.$autoNewLine = match ? match[1] : \"\\n\";\n this._signal(\"changeNewLineMode\");\n };\n this.getNewLineCharacter = function() {\n switch (this.$newLineMode) {\n case \"windows\":\n return \"\\r\\n\";\n case \"unix\":\n return \"\\n\";\n default:\n return this.$autoNewLine || \"\\n\";\n }\n };\n\n this.$autoNewLine = \"\";\n this.$newLineMode = \"auto\";\n this.setNewLineMode = function(newLineMode) {\n if (this.$newLineMode === newLineMode)\n return;\n\n this.$newLineMode = newLineMode;\n this._signal(\"changeNewLineMode\");\n };\n this.getNewLineMode = function() {\n return this.$newLineMode;\n };\n this.isNewLine = function(text) {\n return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n };\n this.getLine = function(row) {\n return this.$lines[row] || \"\";\n };\n this.getLines = function(firstRow, lastRow) {\n return this.$lines.slice(firstRow, lastRow + 1);\n };\n this.getAllLines = function() {\n return this.getLines(0, this.getLength());\n };\n this.getLength = function() {\n return this.$lines.length;\n };\n this.getTextRange = function(range) {\n return this.getLinesForRange(range).join(this.getNewLineCharacter());\n };\n this.getLinesForRange = function(range) {\n var lines;\n if (range.start.row === range.end.row) {\n lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];\n } else {\n lines = this.getLines(range.start.row, range.end.row);\n lines[0] = (lines[0] || \"\").substring(range.start.column);\n var l = lines.length - 1;\n if (range.end.row - range.start.row == l)\n lines[l] = lines[l].substring(0, range.end.column);\n }\n return lines;\n };\n this.insertLines = function(row, lines) {\n console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\");\n return this.insertFullLines(row, lines);\n };\n this.removeLines = function(firstRow, lastRow) {\n console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\");\n return this.removeFullLines(firstRow, lastRow);\n };\n this.insertNewLine = function(position) {\n console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\");\n return this.insertMergedLines(position, [\"\", \"\"]);\n };\n this.insert = function(position, text) {\n if (this.getLength() <= 1)\n this.$detectNewLine(text);\n \n return this.insertMergedLines(position, this.$split(text));\n };\n this.insertInLine = function(position, text) {\n var start = this.clippedPos(position.row, position.column);\n var end = this.pos(position.row, position.column + text.length);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: [text]\n }, true);\n \n return this.clonePos(end);\n };\n \n this.clippedPos = function(row, column) {\n var length = this.getLength();\n if (row === undefined) {\n row = length;\n } else if (row < 0) {\n row = 0;\n } else if (row >= length) {\n row = length - 1;\n column = undefined;\n }\n var line = this.getLine(row);\n if (column == undefined)\n column = line.length;\n column = Math.min(Math.max(column, 0), line.length);\n return {row: row, column: column};\n };\n \n this.clonePos = function(pos) {\n return {row: pos.row, column: pos.column};\n };\n \n this.pos = function(row, column) {\n return {row: row, column: column};\n };\n \n this.$clipPosition = function(position) {\n var length = this.getLength();\n if (position.row >= length) {\n position.row = Math.max(0, length - 1);\n position.column = this.getLine(length - 1).length;\n } else {\n position.row = Math.max(0, position.row);\n position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);\n }\n return position;\n };\n this.insertFullLines = function(row, lines) {\n row = Math.min(Math.max(row, 0), this.getLength());\n var column = 0;\n if (row < this.getLength()) {\n lines = lines.concat([\"\"]);\n column = 0;\n } else {\n lines = [\"\"].concat(lines);\n row--;\n column = this.$lines[row].length;\n }\n this.insertMergedLines({row: row, column: column}, lines);\n }; \n this.insertMergedLines = function(position, lines) {\n var start = this.clippedPos(position.row, position.column);\n var end = {\n row: start.row + lines.length - 1,\n column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length\n };\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: lines\n });\n \n return this.clonePos(end);\n };\n this.remove = function(range) {\n var start = this.clippedPos(range.start.row, range.start.column);\n var end = this.clippedPos(range.end.row, range.end.column);\n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n });\n return this.clonePos(start);\n };\n this.removeInLine = function(row, startColumn, endColumn) {\n var start = this.clippedPos(row, startColumn);\n var end = this.clippedPos(row, endColumn);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n }, true);\n \n return this.clonePos(start);\n };\n this.removeFullLines = function(firstRow, lastRow) {\n firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);\n lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);\n var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;\n var deleteLastNewLine = lastRow < this.getLength() - 1;\n var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow );\n var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 );\n var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow );\n var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); \n var range = new Range(startRow, startCol, endRow, endCol);\n var deletedLines = this.$lines.slice(firstRow, lastRow + 1);\n \n this.applyDelta({\n start: range.start,\n end: range.end,\n action: \"remove\",\n lines: this.getLinesForRange(range)\n });\n return deletedLines;\n };\n this.removeNewLine = function(row) {\n if (row < this.getLength() - 1 && row >= 0) {\n this.applyDelta({\n start: this.pos(row, this.getLine(row).length),\n end: this.pos(row + 1, 0),\n action: \"remove\",\n lines: [\"\", \"\"]\n });\n }\n };\n this.replace = function(range, text) {\n if (!(range instanceof Range))\n range = Range.fromPoints(range.start, range.end);\n if (text.length === 0 && range.isEmpty())\n return range.start;\n if (text == this.getTextRange(range))\n return range.end;\n\n this.remove(range);\n var end;\n if (text) {\n end = this.insert(range.start, text);\n }\n else {\n end = range.start;\n }\n \n return end;\n };\n this.applyDeltas = function(deltas) {\n for (var i=0; i=0; i--) {\n this.revertDelta(deltas[i]);\n }\n };\n this.applyDelta = function(delta, doNotValidate) {\n var isInsert = delta.action == \"insert\";\n if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]\n : !Range.comparePoints(delta.start, delta.end)) {\n return;\n }\n \n if (isInsert && delta.lines.length > 20000)\n this.$splitAndapplyLargeDelta(delta, 20000);\n applyDelta(this.$lines, delta, doNotValidate);\n this._signal(\"change\", delta);\n };\n \n this.$splitAndapplyLargeDelta = function(delta, MAX) {\n var lines = delta.lines;\n var l = lines.length;\n var row = delta.start.row; \n var column = delta.start.column;\n var from = 0, to = 0;\n do {\n from = to;\n to += MAX - 1;\n var chunk = lines.slice(from, to);\n if (to > l) {\n delta.lines = chunk;\n delta.start.row = row + from;\n delta.start.column = column;\n break;\n }\n chunk.push(\"\");\n this.applyDelta({\n start: this.pos(row + from, column),\n end: this.pos(row + to, column = 0),\n action: delta.action,\n lines: chunk\n }, true);\n } while(true);\n };\n this.revertDelta = function(delta) {\n this.applyDelta({\n start: this.clonePos(delta.start),\n end: this.clonePos(delta.end),\n action: (delta.action == \"insert\" ? \"remove\" : \"insert\"),\n lines: delta.lines.slice()\n });\n };\n this.indexToPosition = function(index, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n for (var i = startRow || 0, l = lines.length; i < l; i++) {\n index -= lines[i].length + newlineLength;\n if (index < 0)\n return {row: i, column: index + lines[i].length + newlineLength};\n }\n return {row: l-1, column: lines[l-1].length};\n };\n this.positionToIndex = function(pos, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n var index = 0;\n var row = Math.min(pos.row, lines.length);\n for (var i = startRow || 0; i < row; ++i)\n index += lines[i].length + newlineLength;\n\n return index + pos.column;\n };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/background_tokenizer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\nvar BackgroundTokenizer = function(tokenizer, editor) {\n this.running = false;\n this.lines = [];\n this.states = [];\n this.currentLine = 0;\n this.tokenizer = tokenizer;\n\n var self = this;\n\n this.$worker = function() {\n if (!self.running) { return; }\n\n var workerStart = new Date();\n var currentLine = self.currentLine;\n var endLine = -1;\n var doc = self.doc;\n\n var startLine = currentLine;\n while (self.lines[currentLine])\n currentLine++;\n \n var len = doc.getLength();\n var processedLines = 0;\n self.running = false;\n while (currentLine < len) {\n self.$tokenizeRow(currentLine);\n endLine = currentLine;\n do {\n currentLine++;\n } while (self.lines[currentLine]);\n processedLines ++;\n if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) { \n self.running = setTimeout(self.$worker, 20);\n break;\n }\n }\n self.currentLine = currentLine;\n \n if (endLine == -1)\n endLine = currentLine;\n\n if (startLine <= endLine)\n self.fireUpdateEvent(startLine, endLine);\n };\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n this.setTokenizer = function(tokenizer) {\n this.tokenizer = tokenizer;\n this.lines = [];\n this.states = [];\n\n this.start(0);\n };\n this.setDocument = function(doc) {\n this.doc = doc;\n this.lines = [];\n this.states = [];\n\n this.stop();\n };\n this.fireUpdateEvent = function(firstRow, lastRow) {\n var data = {\n first: firstRow,\n last: lastRow\n };\n this._signal(\"update\", {data: data});\n };\n this.start = function(startRow) {\n this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength());\n this.lines.splice(this.currentLine, this.lines.length);\n this.states.splice(this.currentLine, this.states.length);\n\n this.stop();\n this.running = setTimeout(this.$worker, 700);\n };\n \n this.scheduleStart = function() {\n if (!this.running)\n this.running = setTimeout(this.$worker, 700);\n };\n\n this.$updateOnChange = function(delta) {\n var startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n this.lines[startRow] = null;\n } else if (delta.action == \"remove\") {\n this.lines.splice(startRow, len + 1, null);\n this.states.splice(startRow, len + 1, null);\n } else {\n var args = Array(len + 1);\n args.unshift(startRow, 1);\n this.lines.splice.apply(this.lines, args);\n this.states.splice.apply(this.states, args);\n }\n\n this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());\n\n this.stop();\n };\n this.stop = function() {\n if (this.running)\n clearTimeout(this.running);\n this.running = false;\n };\n this.getTokens = function(row) {\n return this.lines[row] || this.$tokenizeRow(row);\n };\n this.getState = function(row) {\n if (this.currentLine == row)\n this.$tokenizeRow(row);\n return this.states[row] || \"start\";\n };\n\n this.$tokenizeRow = function(row) {\n var line = this.doc.getLine(row);\n var state = this.states[row - 1];\n\n var data = this.tokenizer.getLineTokens(line, state, row);\n\n if (this.states[row] + \"\" !== data.state + \"\") {\n this.states[row] = data.state;\n this.lines[row + 1] = null;\n if (this.currentLine > row + 1)\n this.currentLine = row + 1;\n } else if (this.currentLine == row) {\n this.currentLine = row + 1;\n }\n\n return this.lines[row] = data.tokens;\n };\n\n}).call(BackgroundTokenizer.prototype);\n\nexports.BackgroundTokenizer = BackgroundTokenizer;\n});\n\nace.define(\"ace/search_highlight\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"./lib/lang\");\nvar oop = acequire(\"./lib/oop\");\nvar Range = acequire(\"./range\").Range;\n\nvar SearchHighlight = function(regExp, clazz, type) {\n this.setRegexp(regExp);\n this.clazz = clazz;\n this.type = type || \"text\";\n};\n\n(function() {\n this.MAX_RANGES = 500;\n \n this.setRegexp = function(regExp) {\n if (this.regExp+\"\" == regExp+\"\")\n return;\n this.regExp = regExp;\n this.cache = [];\n };\n\n this.update = function(html, markerLayer, session, config) {\n if (!this.regExp)\n return;\n var start = config.firstRow, end = config.lastRow;\n\n for (var i = start; i <= end; i++) {\n var ranges = this.cache[i];\n if (ranges == null) {\n ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);\n if (ranges.length > this.MAX_RANGES)\n ranges = ranges.slice(0, this.MAX_RANGES);\n ranges = ranges.map(function(match) {\n return new Range(i, match.offset, i, match.offset + match.length);\n });\n this.cache[i] = ranges.length ? ranges : \"\";\n }\n\n for (var j = ranges.length; j --; ) {\n markerLayer.drawSingleLineMarker(\n html, ranges[j].toScreenRange(session), this.clazz, config);\n }\n }\n };\n\n}).call(SearchHighlight.prototype);\n\nexports.SearchHighlight = SearchHighlight;\n});\n\nace.define(\"ace/edit_session/fold_line\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nfunction FoldLine(foldData, folds) {\n this.foldData = foldData;\n if (Array.isArray(folds)) {\n this.folds = folds;\n } else {\n folds = this.folds = [ folds ];\n }\n\n var last = folds[folds.length - 1];\n this.range = new Range(folds[0].start.row, folds[0].start.column,\n last.end.row, last.end.column);\n this.start = this.range.start;\n this.end = this.range.end;\n\n this.folds.forEach(function(fold) {\n fold.setFoldLine(this);\n }, this);\n}\n\n(function() {\n this.shiftRow = function(shift) {\n this.start.row += shift;\n this.end.row += shift;\n this.folds.forEach(function(fold) {\n fold.start.row += shift;\n fold.end.row += shift;\n });\n };\n\n this.addFold = function(fold) {\n if (fold.sameRow) {\n if (fold.start.row < this.startRow || fold.endRow > this.endRow) {\n throw new Error(\"Can't add a fold to this FoldLine as it has no connection\");\n }\n this.folds.push(fold);\n this.folds.sort(function(a, b) {\n return -a.range.compareEnd(b.start.row, b.start.column);\n });\n if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {\n this.end.row = fold.end.row;\n this.end.column = fold.end.column;\n } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {\n this.start.row = fold.start.row;\n this.start.column = fold.start.column;\n }\n } else if (fold.start.row == this.end.row) {\n this.folds.push(fold);\n this.end.row = fold.end.row;\n this.end.column = fold.end.column;\n } else if (fold.end.row == this.start.row) {\n this.folds.unshift(fold);\n this.start.row = fold.start.row;\n this.start.column = fold.start.column;\n } else {\n throw new Error(\"Trying to add fold to FoldRow that doesn't have a matching row\");\n }\n fold.foldLine = this;\n };\n\n this.containsRow = function(row) {\n return row >= this.start.row && row <= this.end.row;\n };\n\n this.walk = function(callback, endRow, endColumn) {\n var lastEnd = 0,\n folds = this.folds,\n fold,\n cmp, stop, isNewRow = true;\n\n if (endRow == null) {\n endRow = this.end.row;\n endColumn = this.end.column;\n }\n\n for (var i = 0; i < folds.length; i++) {\n fold = folds[i];\n\n cmp = fold.range.compareStart(endRow, endColumn);\n if (cmp == -1) {\n callback(null, endRow, endColumn, lastEnd, isNewRow);\n return;\n }\n\n stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow);\n stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd);\n if (stop || cmp === 0) {\n return;\n }\n isNewRow = !fold.sameRow;\n lastEnd = fold.end.column;\n }\n callback(null, endRow, endColumn, lastEnd, isNewRow);\n };\n\n this.getNextFoldTo = function(row, column) {\n var fold, cmp;\n for (var i = 0; i < this.folds.length; i++) {\n fold = this.folds[i];\n cmp = fold.range.compareEnd(row, column);\n if (cmp == -1) {\n return {\n fold: fold,\n kind: \"after\"\n };\n } else if (cmp === 0) {\n return {\n fold: fold,\n kind: \"inside\"\n };\n }\n }\n return null;\n };\n\n this.addRemoveChars = function(row, column, len) {\n var ret = this.getNextFoldTo(row, column),\n fold, folds;\n if (ret) {\n fold = ret.fold;\n if (ret.kind == \"inside\"\n && fold.start.column != column\n && fold.start.row != row)\n {\n window.console && window.console.log(row, column, fold);\n } else if (fold.start.row == row) {\n folds = this.folds;\n var i = folds.indexOf(fold);\n if (i === 0) {\n this.start.column += len;\n }\n for (i; i < folds.length; i++) {\n fold = folds[i];\n fold.start.column += len;\n if (!fold.sameRow) {\n return;\n }\n fold.end.column += len;\n }\n this.end.column += len;\n }\n }\n };\n\n this.split = function(row, column) {\n var pos = this.getNextFoldTo(row, column);\n \n if (!pos || pos.kind == \"inside\")\n return null;\n \n var fold = pos.fold;\n var folds = this.folds;\n var foldData = this.foldData;\n \n var i = folds.indexOf(fold);\n var foldBefore = folds[i - 1];\n this.end.row = foldBefore.end.row;\n this.end.column = foldBefore.end.column;\n folds = folds.splice(i, folds.length - i);\n\n var newFoldLine = new FoldLine(foldData, folds);\n foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);\n return newFoldLine;\n };\n\n this.merge = function(foldLineNext) {\n var folds = foldLineNext.folds;\n for (var i = 0; i < folds.length; i++) {\n this.addFold(folds[i]);\n }\n var foldData = this.foldData;\n foldData.splice(foldData.indexOf(foldLineNext), 1);\n };\n\n this.toString = function() {\n var ret = [this.range.toString() + \": [\" ];\n\n this.folds.forEach(function(fold) {\n ret.push(\" \" + fold.toString());\n });\n ret.push(\"]\");\n return ret.join(\"\\n\");\n };\n\n this.idxToPosition = function(idx) {\n var lastFoldEndColumn = 0;\n\n for (var i = 0; i < this.folds.length; i++) {\n var fold = this.folds[i];\n\n idx -= fold.start.column - lastFoldEndColumn;\n if (idx < 0) {\n return {\n row: fold.start.row,\n column: fold.start.column + idx\n };\n }\n\n idx -= fold.placeholder.length;\n if (idx < 0) {\n return fold.start;\n }\n\n lastFoldEndColumn = fold.end.column;\n }\n\n return {\n row: this.end.row,\n column: this.end.column + idx\n };\n };\n}).call(FoldLine.prototype);\n\nexports.FoldLine = FoldLine;\n});\n\nace.define(\"ace/range_list\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\nvar Range = acequire(\"./range\").Range;\nvar comparePoints = Range.comparePoints;\n\nvar RangeList = function() {\n this.ranges = [];\n};\n\n(function() {\n this.comparePoints = comparePoints;\n\n this.pointIndex = function(pos, excludeEdges, startIndex) {\n var list = this.ranges;\n\n for (var i = startIndex || 0; i < list.length; i++) {\n var range = list[i];\n var cmpEnd = comparePoints(pos, range.end);\n if (cmpEnd > 0)\n continue;\n var cmpStart = comparePoints(pos, range.start);\n if (cmpEnd === 0)\n return excludeEdges && cmpStart !== 0 ? -i-2 : i;\n if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))\n return i;\n\n return -i-1;\n }\n return -i - 1;\n };\n\n this.add = function(range) {\n var excludeEdges = !range.isEmpty();\n var startIndex = this.pointIndex(range.start, excludeEdges);\n if (startIndex < 0)\n startIndex = -startIndex - 1;\n\n var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\n\n if (endIndex < 0)\n endIndex = -endIndex - 1;\n else\n endIndex++;\n return this.ranges.splice(startIndex, endIndex - startIndex, range);\n };\n\n this.addList = function(list) {\n var removed = [];\n for (var i = list.length; i--; ) {\n removed.push.apply(removed, this.add(list[i]));\n }\n return removed;\n };\n\n this.substractPoint = function(pos) {\n var i = this.pointIndex(pos);\n\n if (i >= 0)\n return this.ranges.splice(i, 1);\n };\n this.merge = function() {\n var removed = [];\n var list = this.ranges;\n \n list = list.sort(function(a, b) {\n return comparePoints(a.start, b.start);\n });\n \n var next = list[0], range;\n for (var i = 1; i < list.length; i++) {\n range = next;\n next = list[i];\n var cmp = comparePoints(range.end, next.start);\n if (cmp < 0)\n continue;\n\n if (cmp == 0 && !range.isEmpty() && !next.isEmpty())\n continue;\n\n if (comparePoints(range.end, next.end) < 0) {\n range.end.row = next.end.row;\n range.end.column = next.end.column;\n }\n\n list.splice(i, 1);\n removed.push(next);\n next = range;\n i--;\n }\n \n this.ranges = list;\n\n return removed;\n };\n\n this.contains = function(row, column) {\n return this.pointIndex({row: row, column: column}) >= 0;\n };\n\n this.containsPoint = function(pos) {\n return this.pointIndex(pos) >= 0;\n };\n\n this.rangeAtPoint = function(pos) {\n var i = this.pointIndex(pos);\n if (i >= 0)\n return this.ranges[i];\n };\n\n\n this.clipRows = function(startRow, endRow) {\n var list = this.ranges;\n if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow)\n return [];\n\n var startIndex = this.pointIndex({row: startRow, column: 0});\n if (startIndex < 0)\n startIndex = -startIndex - 1;\n var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex);\n if (endIndex < 0)\n endIndex = -endIndex - 1;\n\n var clipped = [];\n for (var i = startIndex; i < endIndex; i++) {\n clipped.push(list[i]);\n }\n return clipped;\n };\n\n this.removeAll = function() {\n return this.ranges.splice(0, this.ranges.length);\n };\n\n this.attach = function(session) {\n if (this.session)\n this.detach();\n\n this.session = session;\n this.onChange = this.$onChange.bind(this);\n\n this.session.on('change', this.onChange);\n };\n\n this.detach = function() {\n if (!this.session)\n return;\n this.session.removeListener('change', this.onChange);\n this.session = null;\n };\n\n this.$onChange = function(delta) {\n if (delta.action == \"insert\"){\n var start = delta.start;\n var end = delta.end;\n } else {\n var end = delta.start;\n var start = delta.end;\n }\n var startRow = start.row;\n var endRow = end.row;\n var lineDif = endRow - startRow;\n\n var colDiff = -start.column + end.column;\n var ranges = this.ranges;\n\n for (var i = 0, n = ranges.length; i < n; i++) {\n var r = ranges[i];\n if (r.end.row < startRow)\n continue;\n if (r.start.row > startRow)\n break;\n\n if (r.start.row == startRow && r.start.column >= start.column ) {\n if (r.start.column == start.column && this.$insertRight) {\n } else {\n r.start.column += colDiff;\n r.start.row += lineDif;\n }\n }\n if (r.end.row == startRow && r.end.column >= start.column) {\n if (r.end.column == start.column && this.$insertRight) {\n continue;\n }\n if (r.end.column == start.column && colDiff > 0 && i < n - 1) { \n if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\n r.end.column -= colDiff;\n }\n r.end.column += colDiff;\n r.end.row += lineDif;\n }\n }\n\n if (lineDif != 0 && i < n) {\n for (; i < n; i++) {\n var r = ranges[i];\n r.start.row += lineDif;\n r.end.row += lineDif;\n }\n }\n };\n\n}).call(RangeList.prototype);\n\nexports.RangeList = RangeList;\n});\n\nace.define(\"ace/edit_session/fold\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/range_list\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar RangeList = acequire(\"../range_list\").RangeList;\nvar oop = acequire(\"../lib/oop\");\nvar Fold = exports.Fold = function(range, placeholder) {\n this.foldLine = null;\n this.placeholder = placeholder;\n this.range = range;\n this.start = range.start;\n this.end = range.end;\n\n this.sameRow = range.start.row == range.end.row;\n this.subFolds = this.ranges = [];\n};\n\noop.inherits(Fold, RangeList);\n\n(function() {\n\n this.toString = function() {\n return '\"' + this.placeholder + '\" ' + this.range.toString();\n };\n\n this.setFoldLine = function(foldLine) {\n this.foldLine = foldLine;\n this.subFolds.forEach(function(fold) {\n fold.setFoldLine(foldLine);\n });\n };\n\n this.clone = function() {\n var range = this.range.clone();\n var fold = new Fold(range, this.placeholder);\n this.subFolds.forEach(function(subFold) {\n fold.subFolds.push(subFold.clone());\n });\n fold.collapseChildren = this.collapseChildren;\n return fold;\n };\n\n this.addSubFold = function(fold) {\n if (this.range.isEqual(fold))\n return;\n\n if (!this.range.containsRange(fold))\n throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n consumeRange(fold, this.start);\n\n var row = fold.start.row, column = fold.start.column;\n for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\n cmp = this.subFolds[i].range.compare(row, column);\n if (cmp != 1)\n break;\n }\n var afterStart = this.subFolds[i];\n\n if (cmp == 0)\n return afterStart.addSubFold(fold);\n var row = fold.range.end.row, column = fold.range.end.column;\n for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\n cmp = this.subFolds[j].range.compare(row, column);\n if (cmp != 1)\n break;\n }\n var afterEnd = this.subFolds[j];\n\n if (cmp == 0)\n throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n\n var consumedFolds = this.subFolds.splice(i, j - i, fold);\n fold.setFoldLine(this.foldLine);\n\n return fold;\n };\n \n this.restoreRange = function(range) {\n return restoreRange(range, this.start);\n };\n\n}).call(Fold.prototype);\n\nfunction consumePoint(point, anchor) {\n point.row -= anchor.row;\n if (point.row == 0)\n point.column -= anchor.column;\n}\nfunction consumeRange(range, anchor) {\n consumePoint(range.start, anchor);\n consumePoint(range.end, anchor);\n}\nfunction restorePoint(point, anchor) {\n if (point.row == 0)\n point.column += anchor.column;\n point.row += anchor.row;\n}\nfunction restoreRange(range, anchor) {\n restorePoint(range.start, anchor);\n restorePoint(range.end, anchor);\n}\n\n});\n\nace.define(\"ace/edit_session/folding\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/edit_session/fold_line\",\"ace/edit_session/fold\",\"ace/token_iterator\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar FoldLine = acequire(\"./fold_line\").FoldLine;\nvar Fold = acequire(\"./fold\").Fold;\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\n\nfunction Folding() {\n this.getFoldAt = function(row, column, side) {\n var foldLine = this.getFoldLine(row);\n if (!foldLine)\n return null;\n\n var folds = foldLine.folds;\n for (var i = 0; i < folds.length; i++) {\n var fold = folds[i];\n if (fold.range.contains(row, column)) {\n if (side == 1 && fold.range.isEnd(row, column)) {\n continue;\n } else if (side == -1 && fold.range.isStart(row, column)) {\n continue;\n }\n return fold;\n }\n }\n };\n this.getFoldsInRange = function(range) {\n var start = range.start;\n var end = range.end;\n var foldLines = this.$foldData;\n var foundFolds = [];\n\n start.column += 1;\n end.column -= 1;\n\n for (var i = 0; i < foldLines.length; i++) {\n var cmp = foldLines[i].range.compareRange(range);\n if (cmp == 2) {\n continue;\n }\n else if (cmp == -2) {\n break;\n }\n\n var folds = foldLines[i].folds;\n for (var j = 0; j < folds.length; j++) {\n var fold = folds[j];\n cmp = fold.range.compareRange(range);\n if (cmp == -2) {\n break;\n } else if (cmp == 2) {\n continue;\n } else\n if (cmp == 42) {\n break;\n }\n foundFolds.push(fold);\n }\n }\n start.column -= 1;\n end.column += 1;\n\n return foundFolds;\n };\n\n this.getFoldsInRangeList = function(ranges) {\n if (Array.isArray(ranges)) {\n var folds = [];\n ranges.forEach(function(range) {\n folds = folds.concat(this.getFoldsInRange(range));\n }, this);\n } else {\n var folds = this.getFoldsInRange(ranges);\n }\n return folds;\n };\n this.getAllFolds = function() {\n var folds = [];\n var foldLines = this.$foldData;\n \n for (var i = 0; i < foldLines.length; i++)\n for (var j = 0; j < foldLines[i].folds.length; j++)\n folds.push(foldLines[i].folds[j]);\n\n return folds;\n };\n this.getFoldStringAt = function(row, column, trim, foldLine) {\n foldLine = foldLine || this.getFoldLine(row);\n if (!foldLine)\n return null;\n\n var lastFold = {\n end: { column: 0 }\n };\n var str, fold;\n for (var i = 0; i < foldLine.folds.length; i++) {\n fold = foldLine.folds[i];\n var cmp = fold.range.compareEnd(row, column);\n if (cmp == -1) {\n str = this\n .getLine(fold.start.row)\n .substring(lastFold.end.column, fold.start.column);\n break;\n }\n else if (cmp === 0) {\n return null;\n }\n lastFold = fold;\n }\n if (!str)\n str = this.getLine(fold.start.row).substring(lastFold.end.column);\n\n if (trim == -1)\n return str.substring(0, column - lastFold.end.column);\n else if (trim == 1)\n return str.substring(column - lastFold.end.column);\n else\n return str;\n };\n\n this.getFoldLine = function(docRow, startFoldLine) {\n var foldData = this.$foldData;\n var i = 0;\n if (startFoldLine)\n i = foldData.indexOf(startFoldLine);\n if (i == -1)\n i = 0;\n for (i; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\n return foldLine;\n } else if (foldLine.end.row > docRow) {\n return null;\n }\n }\n return null;\n };\n this.getNextFoldLine = function(docRow, startFoldLine) {\n var foldData = this.$foldData;\n var i = 0;\n if (startFoldLine)\n i = foldData.indexOf(startFoldLine);\n if (i == -1)\n i = 0;\n for (i; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (foldLine.end.row >= docRow) {\n return foldLine;\n }\n }\n return null;\n };\n\n this.getFoldedRowCount = function(first, last) {\n var foldData = this.$foldData, rowCount = last-first+1;\n for (var i = 0; i < foldData.length; i++) {\n var foldLine = foldData[i],\n end = foldLine.end.row,\n start = foldLine.start.row;\n if (end >= last) {\n if (start < last) {\n if (start >= first)\n rowCount -= last-start;\n else\n rowCount = 0; // in one fold\n }\n break;\n } else if (end >= first){\n if (start >= first) // fold inside range\n rowCount -= end-start;\n else\n rowCount -= end-first+1;\n }\n }\n return rowCount;\n };\n\n this.$addFoldLine = function(foldLine) {\n this.$foldData.push(foldLine);\n this.$foldData.sort(function(a, b) {\n return a.start.row - b.start.row;\n });\n return foldLine;\n };\n this.addFold = function(placeholder, range) {\n var foldData = this.$foldData;\n var added = false;\n var fold;\n \n if (placeholder instanceof Fold)\n fold = placeholder;\n else {\n fold = new Fold(range, placeholder);\n fold.collapseChildren = range.collapseChildren;\n }\n this.$clipRangeToDocument(fold.range);\n\n var startRow = fold.start.row;\n var startColumn = fold.start.column;\n var endRow = fold.end.row;\n var endColumn = fold.end.column;\n if (!(startRow < endRow || \n startRow == endRow && startColumn <= endColumn - 2))\n throw new Error(\"The range has to be at least 2 characters width\");\n\n var startFold = this.getFoldAt(startRow, startColumn, 1);\n var endFold = this.getFoldAt(endRow, endColumn, -1);\n if (startFold && endFold == startFold)\n return startFold.addSubFold(fold);\n\n if (startFold && !startFold.range.isStart(startRow, startColumn))\n this.removeFold(startFold);\n \n if (endFold && !endFold.range.isEnd(endRow, endColumn))\n this.removeFold(endFold);\n var folds = this.getFoldsInRange(fold.range);\n if (folds.length > 0) {\n this.removeFolds(folds);\n folds.forEach(function(subFold) {\n fold.addSubFold(subFold);\n });\n }\n\n for (var i = 0; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (endRow == foldLine.start.row) {\n foldLine.addFold(fold);\n added = true;\n break;\n } else if (startRow == foldLine.end.row) {\n foldLine.addFold(fold);\n added = true;\n if (!fold.sameRow) {\n var foldLineNext = foldData[i + 1];\n if (foldLineNext && foldLineNext.start.row == endRow) {\n foldLine.merge(foldLineNext);\n break;\n }\n }\n break;\n } else if (endRow <= foldLine.start.row) {\n break;\n }\n }\n\n if (!added)\n foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\n\n if (this.$useWrapMode)\n this.$updateWrapData(foldLine.start.row, foldLine.start.row);\n else\n this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\n this.$modified = true;\n this._signal(\"changeFold\", { data: fold, action: \"add\" });\n\n return fold;\n };\n\n this.addFolds = function(folds) {\n folds.forEach(function(fold) {\n this.addFold(fold);\n }, this);\n };\n\n this.removeFold = function(fold) {\n var foldLine = fold.foldLine;\n var startRow = foldLine.start.row;\n var endRow = foldLine.end.row;\n\n var foldLines = this.$foldData;\n var folds = foldLine.folds;\n if (folds.length == 1) {\n foldLines.splice(foldLines.indexOf(foldLine), 1);\n } else\n if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {\n folds.pop();\n foldLine.end.row = folds[folds.length - 1].end.row;\n foldLine.end.column = folds[folds.length - 1].end.column;\n } else\n if (foldLine.range.isStart(fold.start.row, fold.start.column)) {\n folds.shift();\n foldLine.start.row = folds[0].start.row;\n foldLine.start.column = folds[0].start.column;\n } else\n if (fold.sameRow) {\n folds.splice(folds.indexOf(fold), 1);\n } else\n {\n var newFoldLine = foldLine.split(fold.start.row, fold.start.column);\n folds = newFoldLine.folds;\n folds.shift();\n newFoldLine.start.row = folds[0].start.row;\n newFoldLine.start.column = folds[0].start.column;\n }\n\n if (!this.$updating) {\n if (this.$useWrapMode)\n this.$updateWrapData(startRow, endRow);\n else\n this.$updateRowLengthCache(startRow, endRow);\n }\n this.$modified = true;\n this._signal(\"changeFold\", { data: fold, action: \"remove\" });\n };\n\n this.removeFolds = function(folds) {\n var cloneFolds = [];\n for (var i = 0; i < folds.length; i++) {\n cloneFolds.push(folds[i]);\n }\n\n cloneFolds.forEach(function(fold) {\n this.removeFold(fold);\n }, this);\n this.$modified = true;\n };\n\n this.expandFold = function(fold) {\n this.removeFold(fold);\n fold.subFolds.forEach(function(subFold) {\n fold.restoreRange(subFold);\n this.addFold(subFold);\n }, this);\n if (fold.collapseChildren > 0) {\n this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1);\n }\n fold.subFolds = [];\n };\n\n this.expandFolds = function(folds) {\n folds.forEach(function(fold) {\n this.expandFold(fold);\n }, this);\n };\n\n this.unfold = function(location, expandInner) {\n var range, folds;\n if (location == null) {\n range = new Range(0, 0, this.getLength(), 0);\n expandInner = true;\n } else if (typeof location == \"number\")\n range = new Range(location, 0, location, this.getLine(location).length);\n else if (\"row\" in location)\n range = Range.fromPoints(location, location);\n else\n range = location;\n \n folds = this.getFoldsInRangeList(range);\n if (expandInner) {\n this.removeFolds(folds);\n } else {\n var subFolds = folds;\n while (subFolds.length) {\n this.expandFolds(subFolds);\n subFolds = this.getFoldsInRangeList(range);\n }\n }\n if (folds.length)\n return folds;\n };\n this.isRowFolded = function(docRow, startFoldRow) {\n return !!this.getFoldLine(docRow, startFoldRow);\n };\n\n this.getRowFoldEnd = function(docRow, startFoldRow) {\n var foldLine = this.getFoldLine(docRow, startFoldRow);\n return foldLine ? foldLine.end.row : docRow;\n };\n\n this.getRowFoldStart = function(docRow, startFoldRow) {\n var foldLine = this.getFoldLine(docRow, startFoldRow);\n return foldLine ? foldLine.start.row : docRow;\n };\n\n this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\n if (startRow == null)\n startRow = foldLine.start.row;\n if (startColumn == null)\n startColumn = 0;\n if (endRow == null)\n endRow = foldLine.end.row;\n if (endColumn == null)\n endColumn = this.getLine(endRow).length;\n var doc = this.doc;\n var textLine = \"\";\n\n foldLine.walk(function(placeholder, row, column, lastColumn) {\n if (row < startRow)\n return;\n if (row == startRow) {\n if (column < startColumn)\n return;\n lastColumn = Math.max(startColumn, lastColumn);\n }\n\n if (placeholder != null) {\n textLine += placeholder;\n } else {\n textLine += doc.getLine(row).substring(lastColumn, column);\n }\n }, endRow, endColumn);\n return textLine;\n };\n\n this.getDisplayLine = function(row, endColumn, startRow, startColumn) {\n var foldLine = this.getFoldLine(row);\n\n if (!foldLine) {\n var line;\n line = this.doc.getLine(row);\n return line.substring(startColumn || 0, endColumn || line.length);\n } else {\n return this.getFoldDisplayLine(\n foldLine, row, endColumn, startRow, startColumn);\n }\n };\n\n this.$cloneFoldData = function() {\n var fd = [];\n fd = this.$foldData.map(function(foldLine) {\n var folds = foldLine.folds.map(function(fold) {\n return fold.clone();\n });\n return new FoldLine(fd, folds);\n });\n\n return fd;\n };\n\n this.toggleFold = function(tryToUnfold) {\n var selection = this.selection;\n var range = selection.getRange();\n var fold;\n var bracketPos;\n\n if (range.isEmpty()) {\n var cursor = range.start;\n fold = this.getFoldAt(cursor.row, cursor.column);\n\n if (fold) {\n this.expandFold(fold);\n return;\n } else if (bracketPos = this.findMatchingBracket(cursor)) {\n if (range.comparePoint(bracketPos) == 1) {\n range.end = bracketPos;\n } else {\n range.start = bracketPos;\n range.start.column++;\n range.end.column--;\n }\n } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {\n if (range.comparePoint(bracketPos) == 1)\n range.end = bracketPos;\n else\n range.start = bracketPos;\n\n range.start.column++;\n } else {\n range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\n }\n } else {\n var folds = this.getFoldsInRange(range);\n if (tryToUnfold && folds.length) {\n this.expandFolds(folds);\n return;\n } else if (folds.length == 1 ) {\n fold = folds[0];\n }\n }\n\n if (!fold)\n fold = this.getFoldAt(range.start.row, range.start.column);\n\n if (fold && fold.range.toString() == range.toString()) {\n this.expandFold(fold);\n return;\n }\n\n var placeholder = \"...\";\n if (!range.isMultiLine()) {\n placeholder = this.getTextRange(range);\n if (placeholder.length < 4)\n return;\n placeholder = placeholder.trim().substring(0, 2) + \"..\";\n }\n\n this.addFold(placeholder, range);\n };\n\n this.getCommentFoldRange = function(row, column, dir) {\n var iterator = new TokenIterator(this, row, column);\n var token = iterator.getCurrentToken();\n var type = token.type;\n if (token && /^comment|string/.test(type)) {\n type = type.match(/comment|string/)[0];\n if (type == \"comment\")\n type += \"|doc-start\";\n var re = new RegExp(type);\n var range = new Range();\n if (dir != 1) {\n do {\n token = iterator.stepBackward();\n } while (token && re.test(token.type));\n iterator.stepForward();\n }\n \n range.start.row = iterator.getCurrentTokenRow();\n range.start.column = iterator.getCurrentTokenColumn() + 2;\n\n iterator = new TokenIterator(this, row, column);\n \n if (dir != -1) {\n var lastRow = -1;\n do {\n token = iterator.stepForward();\n if (lastRow == -1) {\n var state = this.getState(iterator.$row);\n if (!re.test(state))\n lastRow = iterator.$row;\n } else if (iterator.$row > lastRow) {\n break;\n }\n } while (token && re.test(token.type));\n token = iterator.stepBackward();\n } else\n token = iterator.getCurrentToken();\n\n range.end.row = iterator.getCurrentTokenRow();\n range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2;\n return range;\n }\n };\n\n this.foldAll = function(startRow, endRow, depth) {\n if (depth == undefined)\n depth = 100000; // JSON.stringify doesn't hanle Infinity\n var foldWidgets = this.foldWidgets;\n if (!foldWidgets)\n return; // mode doesn't support folding\n endRow = endRow || this.getLength();\n startRow = startRow || 0;\n for (var row = startRow; row < endRow; row++) {\n if (foldWidgets[row] == null)\n foldWidgets[row] = this.getFoldWidget(row);\n if (foldWidgets[row] != \"start\")\n continue;\n\n var range = this.getFoldWidgetRange(row);\n if (range && range.isMultiLine()\n && range.end.row <= endRow\n && range.start.row >= startRow\n ) {\n row = range.end.row;\n try {\n var fold = this.addFold(\"...\", range);\n if (fold)\n fold.collapseChildren = depth;\n } catch(e) {}\n }\n }\n };\n this.$foldStyles = {\n \"manual\": 1,\n \"markbegin\": 1,\n \"markbeginend\": 1\n };\n this.$foldStyle = \"markbegin\";\n this.setFoldStyle = function(style) {\n if (!this.$foldStyles[style])\n throw new Error(\"invalid fold style: \" + style + \"[\" + Object.keys(this.$foldStyles).join(\", \") + \"]\");\n \n if (this.$foldStyle == style)\n return;\n\n this.$foldStyle = style;\n \n if (style == \"manual\")\n this.unfold();\n var mode = this.$foldMode;\n this.$setFolding(null);\n this.$setFolding(mode);\n };\n\n this.$setFolding = function(foldMode) {\n if (this.$foldMode == foldMode)\n return;\n \n this.$foldMode = foldMode;\n \n this.off('change', this.$updateFoldWidgets);\n this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n this._signal(\"changeAnnotation\");\n \n if (!foldMode || this.$foldStyle == \"manual\") {\n this.foldWidgets = null;\n return;\n }\n \n this.foldWidgets = [];\n this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);\n this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);\n \n this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);\n this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this);\n this.on('change', this.$updateFoldWidgets);\n this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n };\n\n this.getParentFoldRangeData = function (row, ignoreCurrent) {\n var fw = this.foldWidgets;\n if (!fw || (ignoreCurrent && fw[row]))\n return {};\n\n var i = row - 1, firstRange;\n while (i >= 0) {\n var c = fw[i];\n if (c == null)\n c = fw[i] = this.getFoldWidget(i);\n\n if (c == \"start\") {\n var range = this.getFoldWidgetRange(i);\n if (!firstRange)\n firstRange = range;\n if (range && range.end.row >= row)\n break;\n }\n i--;\n }\n\n return {\n range: i !== -1 && range,\n firstRange: firstRange\n };\n };\n\n this.onFoldWidgetClick = function(row, e) {\n e = e.domEvent;\n var options = {\n children: e.shiftKey,\n all: e.ctrlKey || e.metaKey,\n siblings: e.altKey\n };\n \n var range = this.$toggleFoldWidget(row, options);\n if (!range) {\n var el = (e.target || e.srcElement);\n if (el && /ace_fold-widget/.test(el.className))\n el.className += \" ace_invalid\";\n }\n };\n \n this.$toggleFoldWidget = function(row, options) {\n if (!this.getFoldWidget)\n return;\n var type = this.getFoldWidget(row);\n var line = this.getLine(row);\n\n var dir = type === \"end\" ? -1 : 1;\n var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir);\n\n if (fold) {\n if (options.children || options.all)\n this.removeFold(fold);\n else\n this.expandFold(fold);\n return fold;\n }\n\n var range = this.getFoldWidgetRange(row, true);\n if (range && !range.isMultiLine()) {\n fold = this.getFoldAt(range.start.row, range.start.column, 1);\n if (fold && range.isEqual(fold.range)) {\n this.removeFold(fold);\n return fold;\n }\n }\n \n if (options.siblings) {\n var data = this.getParentFoldRangeData(row);\n if (data.range) {\n var startRow = data.range.start.row + 1;\n var endRow = data.range.end.row;\n }\n this.foldAll(startRow, endRow, options.all ? 10000 : 0);\n } else if (options.children) {\n endRow = range ? range.end.row : this.getLength();\n this.foldAll(row + 1, endRow, options.all ? 10000 : 0);\n } else if (range) {\n if (options.all) \n range.collapseChildren = 10000;\n this.addFold(\"...\", range);\n }\n \n return range;\n };\n \n \n \n this.toggleFoldWidget = function(toggleParent) {\n var row = this.selection.getCursor().row;\n row = this.getRowFoldStart(row);\n var range = this.$toggleFoldWidget(row, {});\n \n if (range)\n return;\n var data = this.getParentFoldRangeData(row, true);\n range = data.range || data.firstRange;\n \n if (range) {\n row = range.start.row;\n var fold = this.getFoldAt(row, this.getLine(row).length, 1);\n\n if (fold) {\n this.removeFold(fold);\n } else {\n this.addFold(\"...\", range);\n }\n }\n };\n\n this.updateFoldWidgets = function(delta) {\n var firstRow = delta.start.row;\n var len = delta.end.row - firstRow;\n\n if (len === 0) {\n this.foldWidgets[firstRow] = null;\n } else if (delta.action == 'remove') {\n this.foldWidgets.splice(firstRow, len + 1, null);\n } else {\n var args = Array(len + 1);\n args.unshift(firstRow, 1);\n this.foldWidgets.splice.apply(this.foldWidgets, args);\n }\n };\n this.tokenizerUpdateFoldWidgets = function(e) {\n var rows = e.data;\n if (rows.first != rows.last) {\n if (this.foldWidgets.length > rows.first)\n this.foldWidgets.splice(rows.first, this.foldWidgets.length);\n }\n };\n}\n\nexports.Folding = Folding;\n\n});\n\nace.define(\"ace/edit_session/bracket_match\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\nvar Range = acequire(\"../range\").Range;\n\n\nfunction BracketMatch() {\n\n this.findMatchingBracket = function(position, chr) {\n if (position.column == 0) return null;\n\n var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);\n if (charBeforeCursor == \"\") return null;\n\n var match = charBeforeCursor.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match)\n return null;\n\n if (match[1])\n return this.$findClosingBracket(match[1], position);\n else\n return this.$findOpeningBracket(match[2], position);\n };\n \n this.getBracketRange = function(pos) {\n var line = this.getLine(pos.row);\n var before = true, range;\n\n var chr = line.charAt(pos.column-1);\n var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match) {\n chr = line.charAt(pos.column);\n pos = {row: pos.row, column: pos.column + 1};\n match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n before = false;\n }\n if (!match)\n return null;\n\n if (match[1]) {\n var bracketPos = this.$findClosingBracket(match[1], pos);\n if (!bracketPos)\n return null;\n range = Range.fromPoints(pos, bracketPos);\n if (!before) {\n range.end.column++;\n range.start.column--;\n }\n range.cursor = range.end;\n } else {\n var bracketPos = this.$findOpeningBracket(match[2], pos);\n if (!bracketPos)\n return null;\n range = Range.fromPoints(bracketPos, pos);\n if (!before) {\n range.start.column++;\n range.end.column--;\n }\n range.cursor = range.start;\n }\n \n return range;\n };\n\n this.$brackets = {\n \")\": \"(\",\n \"(\": \")\",\n \"]\": \"[\",\n \"[\": \"]\",\n \"{\": \"}\",\n \"}\": \"{\"\n };\n\n this.$findOpeningBracket = function(bracket, position, typeRe) {\n var openBracket = this.$brackets[bracket];\n var depth = 1;\n\n var iterator = new TokenIterator(this, position.row, position.column);\n var token = iterator.getCurrentToken();\n if (!token)\n token = iterator.stepForward();\n if (!token)\n return;\n \n if (!typeRe){\n typeRe = new RegExp(\n \"(\\\\.?\" +\n token.type.replace(\".\", \"\\\\.\").replace(\"rparen\", \".paren\")\n .replace(/\\b(?:end)\\b/, \"(?:start|begin|end)\")\n + \")+\"\n );\n }\n var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;\n var value = token.value;\n \n while (true) {\n \n while (valueIndex >= 0) {\n var chr = value.charAt(valueIndex);\n if (chr == openBracket) {\n depth -= 1;\n if (depth == 0) {\n return {row: iterator.getCurrentTokenRow(),\n column: valueIndex + iterator.getCurrentTokenColumn()};\n }\n }\n else if (chr == bracket) {\n depth += 1;\n }\n valueIndex -= 1;\n }\n do {\n token = iterator.stepBackward();\n } while (token && !typeRe.test(token.type));\n\n if (token == null)\n break;\n \n value = token.value;\n valueIndex = value.length - 1;\n }\n \n return null;\n };\n\n this.$findClosingBracket = function(bracket, position, typeRe) {\n var closingBracket = this.$brackets[bracket];\n var depth = 1;\n\n var iterator = new TokenIterator(this, position.row, position.column);\n var token = iterator.getCurrentToken();\n if (!token)\n token = iterator.stepForward();\n if (!token)\n return;\n\n if (!typeRe){\n typeRe = new RegExp(\n \"(\\\\.?\" +\n token.type.replace(\".\", \"\\\\.\").replace(\"lparen\", \".paren\")\n .replace(/\\b(?:start|begin)\\b/, \"(?:start|begin|end)\")\n + \")+\"\n );\n }\n var valueIndex = position.column - iterator.getCurrentTokenColumn();\n\n while (true) {\n\n var value = token.value;\n var valueLength = value.length;\n while (valueIndex < valueLength) {\n var chr = value.charAt(valueIndex);\n if (chr == closingBracket) {\n depth -= 1;\n if (depth == 0) {\n return {row: iterator.getCurrentTokenRow(),\n column: valueIndex + iterator.getCurrentTokenColumn()};\n }\n }\n else if (chr == bracket) {\n depth += 1;\n }\n valueIndex += 1;\n }\n do {\n token = iterator.stepForward();\n } while (token && !typeRe.test(token.type));\n\n if (token == null)\n break;\n\n valueIndex = 0;\n }\n \n return null;\n };\n}\nexports.BracketMatch = BracketMatch;\n\n});\n\nace.define(\"ace/edit_session\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/bidihandler\",\"ace/config\",\"ace/lib/event_emitter\",\"ace/selection\",\"ace/mode/text\",\"ace/range\",\"ace/document\",\"ace/background_tokenizer\",\"ace/search_highlight\",\"ace/edit_session/folding\",\"ace/edit_session/bracket_match\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar lang = acequire(\"./lib/lang\");\nvar BidiHandler = acequire(\"./bidihandler\").BidiHandler;\nvar config = acequire(\"./config\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Selection = acequire(\"./selection\").Selection;\nvar TextMode = acequire(\"./mode/text\").Mode;\nvar Range = acequire(\"./range\").Range;\nvar Document = acequire(\"./document\").Document;\nvar BackgroundTokenizer = acequire(\"./background_tokenizer\").BackgroundTokenizer;\nvar SearchHighlight = acequire(\"./search_highlight\").SearchHighlight;\n\nvar EditSession = function(text, mode) {\n this.$breakpoints = [];\n this.$decorations = [];\n this.$frontMarkers = {};\n this.$backMarkers = {};\n this.$markerId = 1;\n this.$undoSelect = true;\n\n this.$foldData = [];\n this.id = \"session\" + (++EditSession.$uid);\n this.$foldData.toString = function() {\n return this.join(\"\\n\");\n };\n this.on(\"changeFold\", this.onChangeFold.bind(this));\n this.$onChange = this.onChange.bind(this);\n\n if (typeof text != \"object\" || !text.getLine)\n text = new Document(text);\n\n this.$bidiHandler = new BidiHandler(this);\n this.setDocument(text);\n this.selection = new Selection(this);\n\n config.resetOptions(this);\n this.setMode(mode);\n config._signal(\"session\", this);\n};\n\n\nEditSession.$uid = 0;\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setDocument = function(doc) {\n if (this.doc)\n this.doc.removeListener(\"change\", this.$onChange);\n\n this.doc = doc;\n doc.on(\"change\", this.$onChange);\n\n if (this.bgTokenizer)\n this.bgTokenizer.setDocument(this.getDocument());\n\n this.resetCaches();\n };\n this.getDocument = function() {\n return this.doc;\n };\n this.$resetRowCache = function(docRow) {\n if (!docRow) {\n this.$docRowCache = [];\n this.$screenRowCache = [];\n return;\n }\n var l = this.$docRowCache.length;\n var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\n if (l > i) {\n this.$docRowCache.splice(i, l);\n this.$screenRowCache.splice(i, l);\n }\n };\n\n this.$getRowCacheIndex = function(cacheArray, val) {\n var low = 0;\n var hi = cacheArray.length - 1;\n\n while (low <= hi) {\n var mid = (low + hi) >> 1;\n var c = cacheArray[mid];\n\n if (val > c)\n low = mid + 1;\n else if (val < c)\n hi = mid - 1;\n else\n return mid;\n }\n\n return low -1;\n };\n\n this.resetCaches = function() {\n this.$modified = true;\n this.$wrapData = [];\n this.$rowLengthCache = [];\n this.$resetRowCache(0);\n if (this.bgTokenizer)\n this.bgTokenizer.start(0);\n };\n\n this.onChangeFold = function(e) {\n var fold = e.data;\n this.$resetRowCache(fold.start.row);\n };\n\n this.onChange = function(delta) {\n this.$modified = true;\n this.$bidiHandler.onChange(delta);\n this.$resetRowCache(delta.start.row);\n\n var removedFolds = this.$updateInternalDataOnChange(delta);\n if (!this.$fromUndo && this.$undoManager && !delta.ignore) {\n this.$deltasDoc.push(delta);\n if (removedFolds && removedFolds.length != 0) {\n this.$deltasFold.push({\n action: \"removeFolds\",\n folds: removedFolds\n });\n }\n\n this.$informUndoManager.schedule();\n }\n\n this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);\n this._signal(\"change\", delta);\n };\n this.setValue = function(text) {\n this.doc.setValue(text);\n this.selection.moveTo(0, 0);\n\n this.$resetRowCache(0);\n this.$deltas = [];\n this.$deltasDoc = [];\n this.$deltasFold = [];\n this.setUndoManager(this.$undoManager);\n this.getUndoManager().reset();\n };\n this.getValue =\n this.toString = function() {\n return this.doc.getValue();\n };\n this.getSelection = function() {\n return this.selection;\n };\n this.getState = function(row) {\n return this.bgTokenizer.getState(row);\n };\n this.getTokens = function(row) {\n return this.bgTokenizer.getTokens(row);\n };\n this.getTokenAt = function(row, column) {\n var tokens = this.bgTokenizer.getTokens(row);\n var token, c = 0;\n if (column == null) {\n var i = tokens.length - 1;\n c = this.getLine(row).length;\n } else {\n for (var i = 0; i < tokens.length; i++) {\n c += tokens[i].value.length;\n if (c >= column)\n break;\n }\n }\n token = tokens[i];\n if (!token)\n return null;\n token.index = i;\n token.start = c - token.value.length;\n return token;\n };\n this.setUndoManager = function(undoManager) {\n this.$undoManager = undoManager;\n this.$deltas = [];\n this.$deltasDoc = [];\n this.$deltasFold = [];\n\n if (this.$informUndoManager)\n this.$informUndoManager.cancel();\n\n if (undoManager) {\n var self = this;\n\n this.$syncInformUndoManager = function() {\n self.$informUndoManager.cancel();\n\n if (self.$deltasFold.length) {\n self.$deltas.push({\n group: \"fold\",\n deltas: self.$deltasFold\n });\n self.$deltasFold = [];\n }\n\n if (self.$deltasDoc.length) {\n self.$deltas.push({\n group: \"doc\",\n deltas: self.$deltasDoc\n });\n self.$deltasDoc = [];\n }\n\n if (self.$deltas.length > 0) {\n undoManager.execute({\n action: \"aceupdate\",\n args: [self.$deltas, self],\n merge: self.mergeUndoDeltas\n });\n }\n self.mergeUndoDeltas = false;\n self.$deltas = [];\n };\n this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n }\n };\n this.markUndoGroup = function() {\n if (this.$syncInformUndoManager)\n this.$syncInformUndoManager();\n };\n \n this.$defaultUndoManager = {\n undo: function() {},\n redo: function() {},\n reset: function() {}\n };\n this.getUndoManager = function() {\n return this.$undoManager || this.$defaultUndoManager;\n };\n this.getTabString = function() {\n if (this.getUseSoftTabs()) {\n return lang.stringRepeat(\" \", this.getTabSize());\n } else {\n return \"\\t\";\n }\n };\n this.setUseSoftTabs = function(val) {\n this.setOption(\"useSoftTabs\", val);\n };\n this.getUseSoftTabs = function() {\n return this.$useSoftTabs && !this.$mode.$indentWithTabs;\n };\n this.setTabSize = function(tabSize) {\n this.setOption(\"tabSize\", tabSize);\n };\n this.getTabSize = function() {\n return this.$tabSize;\n };\n this.isTabStop = function(position) {\n return this.$useSoftTabs && (position.column % this.$tabSize === 0);\n };\n this.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) {\n this.setOption(\"navigateWithinSoftTabs\", navigateWithinSoftTabs);\n };\n this.getNavigateWithinSoftTabs = function() {\n return this.$navigateWithinSoftTabs;\n };\n\n this.$overwrite = false;\n this.setOverwrite = function(overwrite) {\n this.setOption(\"overwrite\", overwrite);\n };\n this.getOverwrite = function() {\n return this.$overwrite;\n };\n this.toggleOverwrite = function() {\n this.setOverwrite(!this.$overwrite);\n };\n this.addGutterDecoration = function(row, className) {\n if (!this.$decorations[row])\n this.$decorations[row] = \"\";\n this.$decorations[row] += \" \" + className;\n this._signal(\"changeBreakpoint\", {});\n };\n this.removeGutterDecoration = function(row, className) {\n this.$decorations[row] = (this.$decorations[row] || \"\").replace(\" \" + className, \"\");\n this._signal(\"changeBreakpoint\", {});\n };\n this.getBreakpoints = function() {\n return this.$breakpoints;\n };\n this.setBreakpoints = function(rows) {\n this.$breakpoints = [];\n for (var i=0; i 0)\n inToken = !!line.charAt(column - 1).match(this.tokenRe);\n\n if (!inToken)\n inToken = !!line.charAt(column).match(this.tokenRe);\n\n if (inToken)\n var re = this.tokenRe;\n else if (/^\\s+$/.test(line.slice(column-1, column+1)))\n var re = /\\s/;\n else\n var re = this.nonTokenRe;\n\n var start = column;\n if (start > 0) {\n do {\n start--;\n }\n while (start >= 0 && line.charAt(start).match(re));\n start++;\n }\n\n var end = column;\n while (end < line.length && line.charAt(end).match(re)) {\n end++;\n }\n\n return new Range(row, start, row, end);\n };\n this.getAWordRange = function(row, column) {\n var wordRange = this.getWordRange(row, column);\n var line = this.getLine(wordRange.end.row);\n\n while (line.charAt(wordRange.end.column).match(/[ \\t]/)) {\n wordRange.end.column += 1;\n }\n return wordRange;\n };\n this.setNewLineMode = function(newLineMode) {\n this.doc.setNewLineMode(newLineMode);\n };\n this.getNewLineMode = function() {\n return this.doc.getNewLineMode();\n };\n this.setUseWorker = function(useWorker) { this.setOption(\"useWorker\", useWorker); };\n this.getUseWorker = function() { return this.$useWorker; };\n this.onReloadTokenizer = function(e) {\n var rows = e.data;\n this.bgTokenizer.start(rows.first);\n this._signal(\"tokenizerUpdate\", e);\n };\n\n this.$modes = {};\n this.$mode = null;\n this.$modeId = null;\n this.setMode = function(mode, cb) {\n if (mode && typeof mode === \"object\") {\n if (mode.getTokenizer)\n return this.$onChangeMode(mode);\n var options = mode;\n var path = options.path;\n } else {\n path = mode || \"ace/mode/text\";\n }\n if (!this.$modes[\"ace/mode/text\"])\n this.$modes[\"ace/mode/text\"] = new TextMode();\n\n if (this.$modes[path] && !options) {\n this.$onChangeMode(this.$modes[path]);\n cb && cb();\n return;\n }\n this.$modeId = path;\n config.loadModule([\"mode\", path], function(m) {\n if (this.$modeId !== path)\n return cb && cb();\n if (this.$modes[path] && !options) {\n this.$onChangeMode(this.$modes[path]);\n } else if (m && m.Mode) {\n m = new m.Mode(options);\n if (!options) {\n this.$modes[path] = m;\n m.$id = path;\n }\n this.$onChangeMode(m);\n }\n cb && cb();\n }.bind(this));\n if (!this.$mode)\n this.$onChangeMode(this.$modes[\"ace/mode/text\"], true);\n };\n\n this.$onChangeMode = function(mode, $isPlaceholder) {\n if (!$isPlaceholder)\n this.$modeId = mode.$id;\n if (this.$mode === mode) \n return;\n\n this.$mode = mode;\n\n this.$stopWorker();\n\n if (this.$useWorker)\n this.$startWorker();\n\n var tokenizer = mode.getTokenizer();\n\n if(tokenizer.addEventListener !== undefined) {\n var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n tokenizer.addEventListener(\"update\", onReloadTokenizer);\n }\n\n if (!this.bgTokenizer) {\n this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n var _self = this;\n this.bgTokenizer.addEventListener(\"update\", function(e) {\n _self._signal(\"tokenizerUpdate\", e);\n });\n } else {\n this.bgTokenizer.setTokenizer(tokenizer);\n }\n\n this.bgTokenizer.setDocument(this.getDocument());\n\n this.tokenRe = mode.tokenRe;\n this.nonTokenRe = mode.nonTokenRe;\n\n \n if (!$isPlaceholder) {\n if (mode.attachToSession)\n mode.attachToSession(this);\n this.$options.wrapMethod.set.call(this, this.$wrapMethod);\n this.$setFolding(mode.foldingRules);\n this.bgTokenizer.start(0);\n this._emit(\"changeMode\");\n }\n };\n\n this.$stopWorker = function() {\n if (this.$worker) {\n this.$worker.terminate();\n this.$worker = null;\n }\n };\n\n this.$startWorker = function() {\n try {\n this.$worker = this.$mode.createWorker(this);\n } catch (e) {\n config.warn(\"Could not load worker\", e);\n this.$worker = null;\n }\n };\n this.getMode = function() {\n return this.$mode;\n };\n\n this.$scrollTop = 0;\n this.setScrollTop = function(scrollTop) {\n if (this.$scrollTop === scrollTop || isNaN(scrollTop))\n return;\n\n this.$scrollTop = scrollTop;\n this._signal(\"changeScrollTop\", scrollTop);\n };\n this.getScrollTop = function() {\n return this.$scrollTop;\n };\n\n this.$scrollLeft = 0;\n this.setScrollLeft = function(scrollLeft) {\n if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))\n return;\n\n this.$scrollLeft = scrollLeft;\n this._signal(\"changeScrollLeft\", scrollLeft);\n };\n this.getScrollLeft = function() {\n return this.$scrollLeft;\n };\n this.getScreenWidth = function() {\n this.$computeWidth();\n if (this.lineWidgets) \n return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);\n return this.screenWidth;\n };\n \n this.getLineWidgetMaxWidth = function() {\n if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;\n var width = 0;\n this.lineWidgets.forEach(function(w) {\n if (w && w.screenWidth > width)\n width = w.screenWidth;\n });\n return this.lineWidgetWidth = width;\n };\n\n this.$computeWidth = function(force) {\n if (this.$modified || force) {\n this.$modified = false;\n\n if (this.$useWrapMode)\n return this.screenWidth = this.$wrapLimit;\n\n var lines = this.doc.getAllLines();\n var cache = this.$rowLengthCache;\n var longestScreenLine = 0;\n var foldIndex = 0;\n var foldLine = this.$foldData[foldIndex];\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n var len = lines.length;\n\n for (var i = 0; i < len; i++) {\n if (i > foldStart) {\n i = foldLine.end.row + 1;\n if (i >= len)\n break;\n foldLine = this.$foldData[foldIndex++];\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n\n if (cache[i] == null)\n cache[i] = this.$getStringScreenWidth(lines[i])[0];\n\n if (cache[i] > longestScreenLine)\n longestScreenLine = cache[i];\n }\n this.screenWidth = longestScreenLine;\n }\n };\n this.getLine = function(row) {\n return this.doc.getLine(row);\n };\n this.getLines = function(firstRow, lastRow) {\n return this.doc.getLines(firstRow, lastRow);\n };\n this.getLength = function() {\n return this.doc.getLength();\n };\n this.getTextRange = function(range) {\n return this.doc.getTextRange(range || this.selection.getRange());\n };\n this.insert = function(position, text) {\n return this.doc.insert(position, text);\n };\n this.remove = function(range) {\n return this.doc.remove(range);\n };\n this.removeFullLines = function(firstRow, lastRow){\n return this.doc.removeFullLines(firstRow, lastRow);\n };\n this.undoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n var lastUndoRange = null;\n for (var i = deltas.length - 1; i != -1; i--) {\n var delta = deltas[i];\n if (delta.group == \"doc\") {\n this.doc.revertDeltas(delta.deltas);\n lastUndoRange =\n this.$getUndoSelection(delta.deltas, true, lastUndoRange);\n } else {\n delta.deltas.forEach(function(foldDelta) {\n this.addFolds(foldDelta.folds);\n }, this);\n }\n }\n this.$fromUndo = false;\n lastUndoRange &&\n this.$undoSelect &&\n !dontSelect &&\n this.selection.setSelectionRange(lastUndoRange);\n return lastUndoRange;\n };\n this.redoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n var lastUndoRange = null;\n for (var i = 0; i < deltas.length; i++) {\n var delta = deltas[i];\n if (delta.group == \"doc\") {\n this.doc.applyDeltas(delta.deltas);\n lastUndoRange =\n this.$getUndoSelection(delta.deltas, false, lastUndoRange);\n }\n }\n this.$fromUndo = false;\n lastUndoRange &&\n this.$undoSelect &&\n !dontSelect &&\n this.selection.setSelectionRange(lastUndoRange);\n return lastUndoRange;\n };\n this.setUndoSelect = function(enable) {\n this.$undoSelect = enable;\n };\n\n this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {\n function isInsert(delta) {\n return isUndo ? delta.action !== \"insert\" : delta.action === \"insert\";\n }\n\n var delta = deltas[0];\n var range, point;\n var lastDeltaIsInsert = false;\n if (isInsert(delta)) {\n range = Range.fromPoints(delta.start, delta.end);\n lastDeltaIsInsert = true;\n } else {\n range = Range.fromPoints(delta.start, delta.start);\n lastDeltaIsInsert = false;\n }\n\n for (var i = 1; i < deltas.length; i++) {\n delta = deltas[i];\n if (isInsert(delta)) {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range.setStart(point);\n }\n point = delta.end;\n if (range.compare(point.row, point.column) == 1) {\n range.setEnd(point);\n }\n lastDeltaIsInsert = true;\n } else {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range = Range.fromPoints(delta.start, delta.start);\n }\n lastDeltaIsInsert = false;\n }\n }\n if (lastUndoRange != null) {\n if (Range.comparePoints(lastUndoRange.start, range.start) === 0) {\n lastUndoRange.start.column += range.end.column - range.start.column;\n lastUndoRange.end.column += range.end.column - range.start.column;\n }\n\n var cmp = lastUndoRange.compareRange(range);\n if (cmp == 1) {\n range.setStart(lastUndoRange.start);\n } else if (cmp == -1) {\n range.setEnd(lastUndoRange.end);\n }\n }\n\n return range;\n };\n this.replace = function(range, text) {\n return this.doc.replace(range, text);\n };\n this.moveText = function(fromRange, toPosition, copy) {\n var text = this.getTextRange(fromRange);\n var folds = this.getFoldsInRange(fromRange);\n\n var toRange = Range.fromPoints(toPosition, toPosition);\n if (!copy) {\n this.remove(fromRange);\n var rowDiff = fromRange.start.row - fromRange.end.row;\n var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;\n if (collDiff) {\n if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)\n toRange.start.column += collDiff;\n if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)\n toRange.end.column += collDiff;\n }\n if (rowDiff && toRange.start.row >= fromRange.end.row) {\n toRange.start.row += rowDiff;\n toRange.end.row += rowDiff;\n }\n }\n\n toRange.end = this.insert(toRange.start, text);\n if (folds.length) {\n var oldStart = fromRange.start;\n var newStart = toRange.start;\n var rowDiff = newStart.row - oldStart.row;\n var collDiff = newStart.column - oldStart.column;\n this.addFolds(folds.map(function(x) {\n x = x.clone();\n if (x.start.row == oldStart.row)\n x.start.column += collDiff;\n if (x.end.row == oldStart.row)\n x.end.column += collDiff;\n x.start.row += rowDiff;\n x.end.row += rowDiff;\n return x;\n }));\n }\n\n return toRange;\n };\n this.indentRows = function(startRow, endRow, indentString) {\n indentString = indentString.replace(/\\t/g, this.getTabString());\n for (var row=startRow; row<=endRow; row++)\n this.doc.insertInLine({row: row, column: 0}, indentString);\n };\n this.outdentRows = function (range) {\n var rowRange = range.collapseRows();\n var deleteRange = new Range(0, 0, 0, 0);\n var size = this.getTabSize();\n\n for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {\n var line = this.getLine(i);\n\n deleteRange.start.row = i;\n deleteRange.end.row = i;\n for (var j = 0; j < size; ++j)\n if (line.charAt(j) != ' ')\n break;\n if (j < size && line.charAt(j) == '\\t') {\n deleteRange.start.column = j;\n deleteRange.end.column = j + 1;\n } else {\n deleteRange.start.column = 0;\n deleteRange.end.column = j;\n }\n this.remove(deleteRange);\n }\n };\n\n this.$moveLines = function(firstRow, lastRow, dir) {\n firstRow = this.getRowFoldStart(firstRow);\n lastRow = this.getRowFoldEnd(lastRow);\n if (dir < 0) {\n var row = this.getRowFoldStart(firstRow + dir);\n if (row < 0) return 0;\n var diff = row-firstRow;\n } else if (dir > 0) {\n var row = this.getRowFoldEnd(lastRow + dir);\n if (row > this.doc.getLength()-1) return 0;\n var diff = row-lastRow;\n } else {\n firstRow = this.$clipRowToDocument(firstRow);\n lastRow = this.$clipRowToDocument(lastRow);\n var diff = lastRow - firstRow + 1;\n }\n\n var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE);\n var folds = this.getFoldsInRange(range).map(function(x){\n x = x.clone();\n x.start.row += diff;\n x.end.row += diff;\n return x;\n });\n \n var lines = dir == 0\n ? this.doc.getLines(firstRow, lastRow)\n : this.doc.removeFullLines(firstRow, lastRow);\n this.doc.insertFullLines(firstRow+diff, lines);\n folds.length && this.addFolds(folds);\n return diff;\n };\n this.moveLinesUp = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, -1);\n };\n this.moveLinesDown = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, 1);\n };\n this.duplicateLines = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, 0);\n };\n\n\n this.$clipRowToDocument = function(row) {\n return Math.max(0, Math.min(row, this.doc.getLength()-1));\n };\n\n this.$clipColumnToRow = function(row, column) {\n if (column < 0)\n return 0;\n return Math.min(this.doc.getLine(row).length, column);\n };\n\n\n this.$clipPositionToDocument = function(row, column) {\n column = Math.max(0, column);\n\n if (row < 0) {\n row = 0;\n column = 0;\n } else {\n var len = this.doc.getLength();\n if (row >= len) {\n row = len - 1;\n column = this.doc.getLine(len-1).length;\n } else {\n column = Math.min(this.doc.getLine(row).length, column);\n }\n }\n\n return {\n row: row,\n column: column\n };\n };\n\n this.$clipRangeToDocument = function(range) {\n if (range.start.row < 0) {\n range.start.row = 0;\n range.start.column = 0;\n } else {\n range.start.column = this.$clipColumnToRow(\n range.start.row,\n range.start.column\n );\n }\n\n var len = this.doc.getLength() - 1;\n if (range.end.row > len) {\n range.end.row = len;\n range.end.column = this.doc.getLine(len).length;\n } else {\n range.end.column = this.$clipColumnToRow(\n range.end.row,\n range.end.column\n );\n }\n return range;\n };\n this.$wrapLimit = 80;\n this.$useWrapMode = false;\n this.$wrapLimitRange = {\n min : null,\n max : null\n };\n this.setUseWrapMode = function(useWrapMode) {\n if (useWrapMode != this.$useWrapMode) {\n this.$useWrapMode = useWrapMode;\n this.$modified = true;\n this.$resetRowCache(0);\n if (useWrapMode) {\n var len = this.getLength();\n this.$wrapData = Array(len);\n this.$updateWrapData(0, len - 1);\n }\n\n this._signal(\"changeWrapMode\");\n }\n };\n this.getUseWrapMode = function() {\n return this.$useWrapMode;\n };\n this.setWrapLimitRange = function(min, max) {\n if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {\n this.$wrapLimitRange = { min: min, max: max };\n this.$modified = true;\n this.$bidiHandler.markAsDirty();\n if (this.$useWrapMode)\n this._signal(\"changeWrapMode\");\n }\n };\n this.adjustWrapLimit = function(desiredLimit, $printMargin) {\n var limits = this.$wrapLimitRange;\n if (limits.max < 0)\n limits = {min: $printMargin, max: $printMargin};\n var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max);\n if (wrapLimit != this.$wrapLimit && wrapLimit > 1) {\n this.$wrapLimit = wrapLimit;\n this.$modified = true;\n if (this.$useWrapMode) {\n this.$updateWrapData(0, this.getLength() - 1);\n this.$resetRowCache(0);\n this._signal(\"changeWrapLimit\");\n }\n return true;\n }\n return false;\n };\n\n this.$constrainWrapLimit = function(wrapLimit, min, max) {\n if (min)\n wrapLimit = Math.max(min, wrapLimit);\n\n if (max)\n wrapLimit = Math.min(max, wrapLimit);\n\n return wrapLimit;\n };\n this.getWrapLimit = function() {\n return this.$wrapLimit;\n };\n this.setWrapLimit = function (limit) {\n this.setWrapLimitRange(limit, limit);\n };\n this.getWrapLimitRange = function() {\n return {\n min : this.$wrapLimitRange.min,\n max : this.$wrapLimitRange.max\n };\n };\n\n this.$updateInternalDataOnChange = function(delta) {\n var useWrapMode = this.$useWrapMode;\n var action = delta.action;\n var start = delta.start;\n var end = delta.end;\n var firstRow = start.row;\n var lastRow = end.row;\n var len = lastRow - firstRow;\n var removedFolds = null;\n \n this.$updating = true;\n if (len != 0) {\n if (action === \"remove\") {\n this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(firstRow, len);\n\n var foldLines = this.$foldData;\n removedFolds = this.getFoldsInRange(delta);\n this.removeFolds(removedFolds);\n\n var foldLine = this.getFoldLine(end.row);\n var idx = 0;\n if (foldLine) {\n foldLine.addRemoveChars(end.row, end.column, start.column - end.column);\n foldLine.shiftRow(-len);\n\n var foldLineBefore = this.getFoldLine(firstRow);\n if (foldLineBefore && foldLineBefore !== foldLine) {\n foldLineBefore.merge(foldLine);\n foldLine = foldLineBefore;\n }\n idx = foldLines.indexOf(foldLine) + 1;\n }\n\n for (idx; idx < foldLines.length; idx++) {\n var foldLine = foldLines[idx];\n if (foldLine.start.row >= end.row) {\n foldLine.shiftRow(-len);\n }\n }\n\n lastRow = firstRow;\n } else {\n var args = Array(len);\n args.unshift(firstRow, 0);\n var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache;\n arr.splice.apply(arr, args);\n var foldLines = this.$foldData;\n var foldLine = this.getFoldLine(firstRow);\n var idx = 0;\n if (foldLine) {\n var cmp = foldLine.range.compareInside(start.row, start.column);\n if (cmp == 0) {\n foldLine = foldLine.split(start.row, start.column);\n if (foldLine) {\n foldLine.shiftRow(len);\n foldLine.addRemoveChars(lastRow, 0, end.column - start.column);\n }\n } else\n if (cmp == -1) {\n foldLine.addRemoveChars(firstRow, 0, end.column - start.column);\n foldLine.shiftRow(len);\n }\n idx = foldLines.indexOf(foldLine) + 1;\n }\n\n for (idx; idx < foldLines.length; idx++) {\n var foldLine = foldLines[idx];\n if (foldLine.start.row >= firstRow) {\n foldLine.shiftRow(len);\n }\n }\n }\n } else {\n len = Math.abs(delta.start.column - delta.end.column);\n if (action === \"remove\") {\n removedFolds = this.getFoldsInRange(delta);\n this.removeFolds(removedFolds);\n\n len = -len;\n }\n var foldLine = this.getFoldLine(firstRow);\n if (foldLine) {\n foldLine.addRemoveChars(firstRow, start.column, len);\n }\n }\n\n if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {\n console.error(\"doc.getLength() and $wrapData.length have to be the same!\");\n }\n this.$updating = false;\n\n if (useWrapMode)\n this.$updateWrapData(firstRow, lastRow);\n else\n this.$updateRowLengthCache(firstRow, lastRow);\n\n return removedFolds;\n };\n\n this.$updateRowLengthCache = function(firstRow, lastRow, b) {\n this.$rowLengthCache[firstRow] = null;\n this.$rowLengthCache[lastRow] = null;\n };\n\n this.$updateWrapData = function(firstRow, lastRow) {\n var lines = this.doc.getAllLines();\n var tabSize = this.getTabSize();\n var wrapData = this.$wrapData;\n var wrapLimit = this.$wrapLimit;\n var tokens;\n var foldLine;\n\n var row = firstRow;\n lastRow = Math.min(lastRow, lines.length - 1);\n while (row <= lastRow) {\n foldLine = this.getFoldLine(row, foldLine);\n if (!foldLine) {\n tokens = this.$getDisplayTokens(lines[row]);\n wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n row ++;\n } else {\n tokens = [];\n foldLine.walk(function(placeholder, row, column, lastColumn) {\n var walkTokens;\n if (placeholder != null) {\n walkTokens = this.$getDisplayTokens(\n placeholder, tokens.length);\n walkTokens[0] = PLACEHOLDER_START;\n for (var i = 1; i < walkTokens.length; i++) {\n walkTokens[i] = PLACEHOLDER_BODY;\n }\n } else {\n walkTokens = this.$getDisplayTokens(\n lines[row].substring(lastColumn, column),\n tokens.length);\n }\n tokens = tokens.concat(walkTokens);\n }.bind(this),\n foldLine.end.row,\n lines[foldLine.end.row].length + 1\n );\n\n wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n row = foldLine.end.row + 1;\n }\n }\n };\n var CHAR = 1,\n CHAR_EXT = 2,\n PLACEHOLDER_START = 3,\n PLACEHOLDER_BODY = 4,\n PUNCTUATION = 9,\n SPACE = 10,\n TAB = 11,\n TAB_SPACE = 12;\n\n\n this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) {\n if (tokens.length == 0) {\n return [];\n }\n\n var splits = [];\n var displayLength = tokens.length;\n var lastSplit = 0, lastDocSplit = 0;\n\n var isCode = this.$wrapAsCode;\n\n var indentedSoftWrap = this.$indentedSoftWrap;\n var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8)\n || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2);\n\n function getWrapIndent() {\n var indentation = 0;\n if (maxIndent === 0)\n return indentation;\n if (indentedSoftWrap) {\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (token == SPACE)\n indentation += 1;\n else if (token == TAB)\n indentation += tabSize;\n else if (token == TAB_SPACE)\n continue;\n else\n break;\n }\n }\n if (isCode && indentedSoftWrap !== false)\n indentation += tabSize;\n return Math.min(indentation, maxIndent);\n }\n function addSplit(screenPos) {\n var displayed = tokens.slice(lastSplit, screenPos);\n var len = displayed.length;\n displayed.join(\"\")\n .replace(/12/g, function() {\n len -= 1;\n })\n .replace(/2/g, function() {\n len -= 1;\n });\n\n if (!splits.length) {\n indent = getWrapIndent();\n splits.indent = indent;\n }\n lastDocSplit += len;\n splits.push(lastDocSplit);\n lastSplit = screenPos;\n }\n var indent = 0;\n while (displayLength - lastSplit > wrapLimit - indent) {\n var split = lastSplit + wrapLimit - indent;\n if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {\n addSplit(split);\n continue;\n }\n if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) {\n for (split; split != lastSplit - 1; split--) {\n if (tokens[split] == PLACEHOLDER_START) {\n break;\n }\n }\n if (split > lastSplit) {\n addSplit(split);\n continue;\n }\n split = lastSplit + wrapLimit;\n for (split; split < tokens.length; split++) {\n if (tokens[split] != PLACEHOLDER_BODY) {\n break;\n }\n }\n if (split == tokens.length) {\n break; // Breaks the while-loop.\n }\n addSplit(split);\n continue;\n }\n var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1);\n while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n split --;\n }\n if (isCode) {\n while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n split --;\n }\n while (split > minSplit && tokens[split] == PUNCTUATION) {\n split --;\n }\n } else {\n while (split > minSplit && tokens[split] < SPACE) {\n split --;\n }\n }\n if (split > minSplit) {\n addSplit(++split);\n continue;\n }\n split = lastSplit + wrapLimit;\n if (tokens[split] == CHAR_EXT)\n split--;\n addSplit(split - indent);\n }\n return splits;\n };\n this.$getDisplayTokens = function(str, offset) {\n var arr = [];\n var tabSize;\n offset = offset || 0;\n\n for (var i = 0; i < str.length; i++) {\n var c = str.charCodeAt(i);\n if (c == 9) {\n tabSize = this.getScreenTabSize(arr.length + offset);\n arr.push(TAB);\n for (var n = 1; n < tabSize; n++) {\n arr.push(TAB_SPACE);\n }\n }\n else if (c == 32) {\n arr.push(SPACE);\n } else if((c > 39 && c < 48) || (c > 57 && c < 64)) {\n arr.push(PUNCTUATION);\n }\n else if (c >= 0x1100 && isFullWidth(c)) {\n arr.push(CHAR, CHAR_EXT);\n } else {\n arr.push(CHAR);\n }\n }\n return arr;\n };\n this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n if (maxScreenColumn == 0)\n return [0, 0];\n if (maxScreenColumn == null)\n maxScreenColumn = Infinity;\n screenColumn = screenColumn || 0;\n\n var c, column;\n for (column = 0; column < str.length; column++) {\n c = str.charCodeAt(column);\n if (c == 9) {\n screenColumn += this.getScreenTabSize(screenColumn);\n }\n else if (c >= 0x1100 && isFullWidth(c)) {\n screenColumn += 2;\n } else {\n screenColumn += 1;\n }\n if (screenColumn > maxScreenColumn) {\n break;\n }\n }\n\n return [screenColumn, column];\n };\n\n this.lineWidgets = null;\n this.getRowLength = function(row) {\n if (this.lineWidgets)\n var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n else \n h = 0;\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1 + h;\n } else {\n return this.$wrapData[row].length + 1 + h;\n }\n };\n this.getRowLineCount = function(row) {\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1;\n } else {\n return this.$wrapData[row].length + 1;\n }\n };\n\n this.getRowWrapIndent = function(screenRow) {\n if (this.$useWrapMode) {\n var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n var splits = this.$wrapData[pos.row];\n return splits.length && splits[0] < pos.column ? splits.indent : 0;\n } else {\n return 0;\n }\n };\n this.getScreenLastRowColumn = function(screenRow) {\n var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n return this.documentToScreenColumn(pos.row, pos.column);\n };\n this.getDocumentLastRowColumn = function(docRow, docColumn) {\n var screenRow = this.documentToScreenRow(docRow, docColumn);\n return this.getScreenLastRowColumn(screenRow);\n };\n this.getDocumentLastRowColumnPosition = function(docRow, docColumn) {\n var screenRow = this.documentToScreenRow(docRow, docColumn);\n return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);\n };\n this.getRowSplitData = function(row) {\n if (!this.$useWrapMode) {\n return undefined;\n } else {\n return this.$wrapData[row];\n }\n };\n this.getScreenTabSize = function(screenColumn) {\n return this.$tabSize - screenColumn % this.$tabSize;\n };\n\n\n this.screenToDocumentRow = function(screenRow, screenColumn) {\n return this.screenToDocumentPosition(screenRow, screenColumn).row;\n };\n\n\n this.screenToDocumentColumn = function(screenRow, screenColumn) {\n return this.screenToDocumentPosition(screenRow, screenColumn).column;\n };\n this.screenToDocumentPosition = function(screenRow, screenColumn, offsetX) {\n if (screenRow < 0)\n return {row: 0, column: 0};\n\n var line;\n var docRow = 0;\n var docColumn = 0;\n var column;\n var row = 0;\n var rowLength = 0;\n\n var rowCache = this.$screenRowCache;\n var i = this.$getRowCacheIndex(rowCache, screenRow);\n var l = rowCache.length;\n if (l && i >= 0) {\n var row = rowCache[i];\n var docRow = this.$docRowCache[i];\n var doCache = screenRow > rowCache[l - 1];\n } else {\n var doCache = !l;\n }\n\n var maxRow = this.getLength() - 1;\n var foldLine = this.getNextFoldLine(docRow);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (row <= screenRow) {\n rowLength = this.getRowLength(docRow);\n if (row + rowLength > screenRow || docRow >= maxRow) {\n break;\n } else {\n row += rowLength;\n docRow++;\n if (docRow > foldStart) {\n docRow = foldLine.end.row+1;\n foldLine = this.getNextFoldLine(docRow, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n }\n\n if (doCache) {\n this.$docRowCache.push(docRow);\n this.$screenRowCache.push(row);\n }\n }\n\n if (foldLine && foldLine.start.row <= docRow) {\n line = this.getFoldDisplayLine(foldLine);\n docRow = foldLine.start.row;\n } else if (row + rowLength <= screenRow || docRow > maxRow) {\n return {\n row: maxRow,\n column: this.getLine(maxRow).length\n };\n } else {\n line = this.getLine(docRow);\n foldLine = null;\n }\n var wrapIndent = 0, splitIndex = Math.floor(screenRow - row);\n if (this.$useWrapMode) {\n var splits = this.$wrapData[docRow];\n if (splits) {\n column = splits[splitIndex];\n if(splitIndex > 0 && splits.length) {\n wrapIndent = splits.indent;\n docColumn = splits[splitIndex - 1] || splits[splits.length - 1];\n line = line.substring(docColumn);\n }\n }\n }\n\n if (offsetX !== undefined && this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex))\n screenColumn = this.$bidiHandler.offsetToCol(offsetX);\n\n docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1];\n if (this.$useWrapMode && docColumn >= column)\n docColumn = column - 1;\n\n if (foldLine)\n return foldLine.idxToPosition(docColumn);\n\n return {row: docRow, column: docColumn};\n };\n this.documentToScreenPosition = function(docRow, docColumn) {\n if (typeof docColumn === \"undefined\")\n var pos = this.$clipPositionToDocument(docRow.row, docRow.column);\n else\n pos = this.$clipPositionToDocument(docRow, docColumn);\n\n docRow = pos.row;\n docColumn = pos.column;\n\n var screenRow = 0;\n var foldStartRow = null;\n var fold = null;\n fold = this.getFoldAt(docRow, docColumn, 1);\n if (fold) {\n docRow = fold.start.row;\n docColumn = fold.start.column;\n }\n\n var rowEnd, row = 0;\n\n\n var rowCache = this.$docRowCache;\n var i = this.$getRowCacheIndex(rowCache, docRow);\n var l = rowCache.length;\n if (l && i >= 0) {\n var row = rowCache[i];\n var screenRow = this.$screenRowCache[i];\n var doCache = docRow > rowCache[l - 1];\n } else {\n var doCache = !l;\n }\n\n var foldLine = this.getNextFoldLine(row);\n var foldStart = foldLine ?foldLine.start.row :Infinity;\n\n while (row < docRow) {\n if (row >= foldStart) {\n rowEnd = foldLine.end.row + 1;\n if (rowEnd > docRow)\n break;\n foldLine = this.getNextFoldLine(rowEnd, foldLine);\n foldStart = foldLine ?foldLine.start.row :Infinity;\n }\n else {\n rowEnd = row + 1;\n }\n\n screenRow += this.getRowLength(row);\n row = rowEnd;\n\n if (doCache) {\n this.$docRowCache.push(row);\n this.$screenRowCache.push(screenRow);\n }\n }\n var textLine = \"\";\n if (foldLine && row >= foldStart) {\n textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);\n foldStartRow = foldLine.start.row;\n } else {\n textLine = this.getLine(docRow).substring(0, docColumn);\n foldStartRow = docRow;\n }\n var wrapIndent = 0;\n if (this.$useWrapMode) {\n var wrapRow = this.$wrapData[foldStartRow];\n if (wrapRow) {\n var screenRowOffset = 0;\n while (textLine.length >= wrapRow[screenRowOffset]) {\n screenRow ++;\n screenRowOffset++;\n }\n textLine = textLine.substring(\n wrapRow[screenRowOffset - 1] || 0, textLine.length\n );\n wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0;\n }\n }\n\n return {\n row: screenRow,\n column: wrapIndent + this.$getStringScreenWidth(textLine)[0]\n };\n };\n this.documentToScreenColumn = function(row, docColumn) {\n return this.documentToScreenPosition(row, docColumn).column;\n };\n this.documentToScreenRow = function(docRow, docColumn) {\n return this.documentToScreenPosition(docRow, docColumn).row;\n };\n this.getScreenLength = function() {\n var screenRows = 0;\n var fold = null;\n if (!this.$useWrapMode) {\n screenRows = this.getLength();\n var foldData = this.$foldData;\n for (var i = 0; i < foldData.length; i++) {\n fold = foldData[i];\n screenRows -= fold.end.row - fold.start.row;\n }\n } else {\n var lastRow = this.$wrapData.length;\n var row = 0, i = 0;\n var fold = this.$foldData[i++];\n var foldStart = fold ? fold.start.row :Infinity;\n\n while (row < lastRow) {\n var splits = this.$wrapData[row];\n screenRows += splits ? splits.length + 1 : 1;\n row ++;\n if (row > foldStart) {\n row = fold.end.row+1;\n fold = this.$foldData[i++];\n foldStart = fold ?fold.start.row :Infinity;\n }\n }\n }\n if (this.lineWidgets)\n screenRows += this.$getWidgetScreenLength();\n\n return screenRows;\n };\n this.$setFontMetrics = function(fm) {\n if (!this.$enableVarChar) return;\n this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n if (maxScreenColumn === 0)\n return [0, 0];\n if (!maxScreenColumn)\n maxScreenColumn = Infinity;\n screenColumn = screenColumn || 0;\n \n var c, column;\n for (column = 0; column < str.length; column++) {\n c = str.charAt(column);\n if (c === \"\\t\") {\n screenColumn += this.getScreenTabSize(screenColumn);\n } else {\n screenColumn += fm.getCharacterWidth(c);\n }\n if (screenColumn > maxScreenColumn) {\n break;\n }\n }\n \n return [screenColumn, column];\n };\n };\n \n this.destroy = function() {\n if (this.bgTokenizer) {\n this.bgTokenizer.setDocument(null);\n this.bgTokenizer = null;\n }\n this.$stopWorker();\n };\n\n this.isFullWidth = isFullWidth;\n function isFullWidth(c) {\n if (c < 0x1100)\n return false;\n return c >= 0x1100 && c <= 0x115F ||\n c >= 0x11A3 && c <= 0x11A7 ||\n c >= 0x11FA && c <= 0x11FF ||\n c >= 0x2329 && c <= 0x232A ||\n c >= 0x2E80 && c <= 0x2E99 ||\n c >= 0x2E9B && c <= 0x2EF3 ||\n c >= 0x2F00 && c <= 0x2FD5 ||\n c >= 0x2FF0 && c <= 0x2FFB ||\n c >= 0x3000 && c <= 0x303E ||\n c >= 0x3041 && c <= 0x3096 ||\n c >= 0x3099 && c <= 0x30FF ||\n c >= 0x3105 && c <= 0x312D ||\n c >= 0x3131 && c <= 0x318E ||\n c >= 0x3190 && c <= 0x31BA ||\n c >= 0x31C0 && c <= 0x31E3 ||\n c >= 0x31F0 && c <= 0x321E ||\n c >= 0x3220 && c <= 0x3247 ||\n c >= 0x3250 && c <= 0x32FE ||\n c >= 0x3300 && c <= 0x4DBF ||\n c >= 0x4E00 && c <= 0xA48C ||\n c >= 0xA490 && c <= 0xA4C6 ||\n c >= 0xA960 && c <= 0xA97C ||\n c >= 0xAC00 && c <= 0xD7A3 ||\n c >= 0xD7B0 && c <= 0xD7C6 ||\n c >= 0xD7CB && c <= 0xD7FB ||\n c >= 0xF900 && c <= 0xFAFF ||\n c >= 0xFE10 && c <= 0xFE19 ||\n c >= 0xFE30 && c <= 0xFE52 ||\n c >= 0xFE54 && c <= 0xFE66 ||\n c >= 0xFE68 && c <= 0xFE6B ||\n c >= 0xFF01 && c <= 0xFF60 ||\n c >= 0xFFE0 && c <= 0xFFE6;\n }\n\n}).call(EditSession.prototype);\n\nacequire(\"./edit_session/folding\").Folding.call(EditSession.prototype);\nacequire(\"./edit_session/bracket_match\").BracketMatch.call(EditSession.prototype);\n\n\nconfig.defineOptions(EditSession.prototype, \"session\", {\n wrap: {\n set: function(value) {\n if (!value || value == \"off\")\n value = false;\n else if (value == \"free\")\n value = true;\n else if (value == \"printMargin\")\n value = -1;\n else if (typeof value == \"string\")\n value = parseInt(value, 10) || false;\n\n if (this.$wrap == value)\n return;\n this.$wrap = value;\n if (!value) {\n this.setUseWrapMode(false);\n } else {\n var col = typeof value == \"number\" ? value : null;\n this.setWrapLimitRange(col, col);\n this.setUseWrapMode(true);\n }\n },\n get: function() {\n if (this.getUseWrapMode()) {\n if (this.$wrap == -1)\n return \"printMargin\";\n if (!this.getWrapLimitRange().min)\n return \"free\";\n return this.$wrap;\n }\n return \"off\";\n },\n handlesSet: true\n }, \n wrapMethod: {\n set: function(val) {\n val = val == \"auto\"\n ? this.$mode.type != \"text\"\n : val != \"text\";\n if (val != this.$wrapAsCode) {\n this.$wrapAsCode = val;\n if (this.$useWrapMode) {\n this.$modified = true;\n this.$resetRowCache(0);\n this.$updateWrapData(0, this.getLength() - 1);\n }\n }\n },\n initialValue: \"auto\"\n },\n indentedSoftWrap: { initialValue: true },\n firstLineNumber: {\n set: function() {this._signal(\"changeBreakpoint\");},\n initialValue: 1\n },\n useWorker: {\n set: function(useWorker) {\n this.$useWorker = useWorker;\n\n this.$stopWorker();\n if (useWorker)\n this.$startWorker();\n },\n initialValue: true\n },\n useSoftTabs: {initialValue: true},\n tabSize: {\n set: function(tabSize) {\n if (isNaN(tabSize) || this.$tabSize === tabSize) return;\n\n this.$modified = true;\n this.$rowLengthCache = [];\n this.$tabSize = tabSize;\n this._signal(\"changeTabSize\");\n },\n initialValue: 4,\n handlesSet: true\n },\n navigateWithinSoftTabs: {initialValue: false},\n overwrite: {\n set: function(val) {this._signal(\"changeOverwrite\");},\n initialValue: false\n },\n newLineMode: {\n set: function(val) {this.doc.setNewLineMode(val);},\n get: function() {return this.doc.getNewLineMode();},\n handlesSet: true\n },\n mode: {\n set: function(val) { this.setMode(val); },\n get: function() { return this.$modeId; }\n }\n});\n\nexports.EditSession = EditSession;\n});\n\nace.define(\"ace/search\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"./lib/lang\");\nvar oop = acequire(\"./lib/oop\");\nvar Range = acequire(\"./range\").Range;\n\nvar Search = function() {\n this.$options = {};\n};\n\n(function() {\n this.set = function(options) {\n oop.mixin(this.$options, options);\n return this;\n };\n this.getOptions = function() {\n return lang.copyObject(this.$options);\n };\n this.setOptions = function(options) {\n this.$options = options;\n };\n this.find = function(session) {\n var options = this.$options;\n var iterator = this.$matchIterator(session, options);\n if (!iterator)\n return false;\n\n var firstRange = null;\n iterator.forEach(function(sr, sc, er, ec) {\n firstRange = new Range(sr, sc, er, ec);\n if (sc == ec && options.start && options.start.start\n && options.skipCurrent != false && firstRange.isEqual(options.start)\n ) {\n firstRange = null;\n return false;\n }\n\n return true;\n });\n\n return firstRange;\n };\n this.findAll = function(session) {\n var options = this.$options;\n if (!options.needle)\n return [];\n this.$assembleRegExp(options);\n\n var range = options.range;\n var lines = range\n ? session.getLines(range.start.row, range.end.row)\n : session.doc.getAllLines();\n\n var ranges = [];\n var re = options.re;\n if (options.$isMultiLine) {\n var len = re.length;\n var maxRow = lines.length - len;\n var prevRange;\n outer: for (var row = re.offset || 0; row <= maxRow; row++) {\n for (var j = 0; j < len; j++)\n if (lines[row + j].search(re[j]) == -1)\n continue outer;\n \n var startLine = lines[row];\n var line = lines[row + len - 1];\n var startIndex = startLine.length - startLine.match(re[0])[0].length;\n var endIndex = line.match(re[len - 1])[0].length;\n \n if (prevRange && prevRange.end.row === row &&\n prevRange.end.column > startIndex\n ) {\n continue;\n }\n ranges.push(prevRange = new Range(\n row, startIndex, row + len - 1, endIndex\n ));\n if (len > 2)\n row = row + len - 2;\n }\n } else {\n for (var i = 0; i < lines.length; i++) {\n var matches = lang.getMatchOffsets(lines[i], re);\n for (var j = 0; j < matches.length; j++) {\n var match = matches[j];\n ranges.push(new Range(i, match.offset, i, match.offset + match.length));\n }\n }\n }\n\n if (range) {\n var startColumn = range.start.column;\n var endColumn = range.start.column;\n var i = 0, j = ranges.length - 1;\n while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row)\n i++;\n\n while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row)\n j--;\n \n ranges = ranges.slice(i, j + 1);\n for (i = 0, j = ranges.length; i < j; i++) {\n ranges[i].start.row += range.start.row;\n ranges[i].end.row += range.start.row;\n }\n }\n\n return ranges;\n };\n this.replace = function(input, replacement) {\n var options = this.$options;\n\n var re = this.$assembleRegExp(options);\n if (options.$isMultiLine)\n return replacement;\n\n if (!re)\n return;\n\n var match = re.exec(input);\n if (!match || match[0].length != input.length)\n return null;\n \n replacement = input.replace(re, replacement);\n if (options.preserveCase) {\n replacement = replacement.split(\"\");\n for (var i = Math.min(input.length, input.length); i--; ) {\n var ch = input[i];\n if (ch && ch.toLowerCase() != ch)\n replacement[i] = replacement[i].toUpperCase();\n else\n replacement[i] = replacement[i].toLowerCase();\n }\n replacement = replacement.join(\"\");\n }\n \n return replacement;\n };\n\n this.$assembleRegExp = function(options, $disableFakeMultiline) {\n if (options.needle instanceof RegExp)\n return options.re = options.needle;\n\n var needle = options.needle;\n\n if (!options.needle)\n return options.re = false;\n\n if (!options.regExp)\n needle = lang.escapeRegExp(needle);\n\n if (options.wholeWord)\n needle = addWordBoundary(needle, options);\n\n var modifier = options.caseSensitive ? \"gm\" : \"gmi\";\n\n options.$isMultiLine = !$disableFakeMultiline && /[\\n\\r]/.test(needle);\n if (options.$isMultiLine)\n return options.re = this.$assembleMultilineRegExp(needle, modifier);\n\n try {\n var re = new RegExp(needle, modifier);\n } catch(e) {\n re = false;\n }\n return options.re = re;\n };\n\n this.$assembleMultilineRegExp = function(needle, modifier) {\n var parts = needle.replace(/\\r\\n|\\r|\\n/g, \"$\\n^\").split(\"\\n\");\n var re = [];\n for (var i = 0; i < parts.length; i++) try {\n re.push(new RegExp(parts[i], modifier));\n } catch(e) {\n return false;\n }\n return re;\n };\n\n this.$matchIterator = function(session, options) {\n var re = this.$assembleRegExp(options);\n if (!re)\n return false;\n var backwards = options.backwards == true;\n var skipCurrent = options.skipCurrent != false;\n\n var range = options.range;\n var start = options.start;\n if (!start)\n start = range ? range[backwards ? \"end\" : \"start\"] : session.selection.getRange();\n \n if (start.start)\n start = start[skipCurrent != backwards ? \"end\" : \"start\"];\n\n var firstRow = range ? range.start.row : 0;\n var lastRow = range ? range.end.row : session.getLength() - 1;\n\n if (backwards) {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row--; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n };\n }\n else {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row = row + 1; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n };\n }\n \n if (options.$isMultiLine) {\n var len = re.length;\n var forEachInLine = function(row, offset, callback) {\n var startRow = backwards ? row - len + 1 : row;\n if (startRow < 0) return;\n var line = session.getLine(startRow);\n var startIndex = line.search(re[0]);\n if (!backwards && startIndex < offset || startIndex === -1) return;\n for (var i = 1; i < len; i++) {\n line = session.getLine(startRow + i);\n if (line.search(re[i]) == -1)\n return;\n }\n var endIndex = line.match(re[len - 1])[0].length;\n if (backwards && endIndex > offset) return;\n if (callback(startRow, startIndex, startRow + len - 1, endIndex))\n return true;\n };\n }\n else if (backwards) {\n var forEachInLine = function(row, endIndex, callback) {\n var line = session.getLine(row);\n var matches = [];\n var m, last = 0;\n re.lastIndex = 0;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (!length) {\n if (last >= line.length) break;\n re.lastIndex = last += 1;\n }\n if (m.index + length > endIndex)\n break;\n matches.push(m.index, length);\n }\n for (var i = matches.length - 1; i >= 0; i -= 2) {\n var column = matches[i - 1];\n var length = matches[i];\n if (callback(row, column, row, column + length))\n return true;\n }\n };\n }\n else {\n var forEachInLine = function(row, startIndex, callback) {\n var line = session.getLine(row);\n var m;\n var last = startIndex;\n re.lastIndex = startIndex;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (callback(row, last, row,last + length))\n return true;\n if (!length) {\n re.lastIndex = last += 1;\n if (last >= line.length) return false;\n }\n }\n };\n }\n return {forEach: forEach};\n };\n\n}).call(Search.prototype);\n\nfunction addWordBoundary(needle, options) {\n function wordBoundary(c) {\n if (/\\w/.test(c) || options.regExp) return \"\\\\b\";\n return \"\";\n }\n return wordBoundary(needle[0]) + needle\n + wordBoundary(needle[needle.length - 1]);\n}\n\nexports.Search = Search;\n});\n\nace.define(\"ace/keyboard/hash_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar keyUtil = acequire(\"../lib/keys\");\nvar useragent = acequire(\"../lib/useragent\");\nvar KEY_MODS = keyUtil.KEY_MODS;\n\nfunction HashHandler(config, platform) {\n this.platform = platform || (useragent.isMac ? \"mac\" : \"win\");\n this.commands = {};\n this.commandKeyBinding = {};\n this.addCommands(config);\n this.$singleCommand = true;\n}\n\nfunction MultiHashHandler(config, platform) {\n HashHandler.call(this, config, platform);\n this.$singleCommand = false;\n}\n\nMultiHashHandler.prototype = HashHandler.prototype;\n\n(function() {\n \n\n this.addCommand = function(command) {\n if (this.commands[command.name])\n this.removeCommand(command);\n\n this.commands[command.name] = command;\n\n if (command.bindKey)\n this._buildKeyHash(command);\n };\n\n this.removeCommand = function(command, keepCommand) {\n var name = command && (typeof command === 'string' ? command : command.name);\n command = this.commands[name];\n if (!keepCommand)\n delete this.commands[name];\n var ckb = this.commandKeyBinding;\n for (var keyId in ckb) {\n var cmdGroup = ckb[keyId];\n if (cmdGroup == command) {\n delete ckb[keyId];\n } else if (Array.isArray(cmdGroup)) {\n var i = cmdGroup.indexOf(command);\n if (i != -1) {\n cmdGroup.splice(i, 1);\n if (cmdGroup.length == 1)\n ckb[keyId] = cmdGroup[0];\n }\n }\n }\n };\n\n this.bindKey = function(key, command, position) {\n if (typeof key == \"object\" && key) {\n if (position == undefined)\n position = key.position;\n key = key[this.platform];\n }\n if (!key)\n return;\n if (typeof command == \"function\")\n return this.addCommand({exec: command, bindKey: key, name: command.name || key});\n \n key.split(\"|\").forEach(function(keyPart) {\n var chain = \"\";\n if (keyPart.indexOf(\" \") != -1) {\n var parts = keyPart.split(/\\s+/);\n keyPart = parts.pop();\n parts.forEach(function(keyPart) {\n var binding = this.parseKeys(keyPart);\n var id = KEY_MODS[binding.hashId] + binding.key;\n chain += (chain ? \" \" : \"\") + id;\n this._addCommandToBinding(chain, \"chainKeys\");\n }, this);\n chain += \" \";\n }\n var binding = this.parseKeys(keyPart);\n var id = KEY_MODS[binding.hashId] + binding.key;\n this._addCommandToBinding(chain + id, command, position);\n }, this);\n };\n \n function getPosition(command) {\n return typeof command == \"object\" && command.bindKey\n && command.bindKey.position\n || (command.isDefault ? -100 : 0);\n }\n this._addCommandToBinding = function(keyId, command, position) {\n var ckb = this.commandKeyBinding, i;\n if (!command) {\n delete ckb[keyId];\n } else if (!ckb[keyId] || this.$singleCommand) {\n ckb[keyId] = command;\n } else {\n if (!Array.isArray(ckb[keyId])) {\n ckb[keyId] = [ckb[keyId]];\n } else if ((i = ckb[keyId].indexOf(command)) != -1) {\n ckb[keyId].splice(i, 1);\n }\n\n if (typeof position != \"number\") {\n position = getPosition(command);\n }\n\n var commands = ckb[keyId];\n for (i = 0; i < commands.length; i++) {\n var other = commands[i];\n var otherPos = getPosition(other);\n if (otherPos > position)\n break;\n }\n commands.splice(i, 0, command);\n }\n };\n\n this.addCommands = function(commands) {\n commands && Object.keys(commands).forEach(function(name) {\n var command = commands[name];\n if (!command)\n return;\n \n if (typeof command === \"string\")\n return this.bindKey(command, name);\n\n if (typeof command === \"function\")\n command = { exec: command };\n\n if (typeof command !== \"object\")\n return;\n\n if (!command.name)\n command.name = name;\n\n this.addCommand(command);\n }, this);\n };\n\n this.removeCommands = function(commands) {\n Object.keys(commands).forEach(function(name) {\n this.removeCommand(commands[name]);\n }, this);\n };\n\n this.bindKeys = function(keyList) {\n Object.keys(keyList).forEach(function(key) {\n this.bindKey(key, keyList[key]);\n }, this);\n };\n\n this._buildKeyHash = function(command) {\n this.bindKey(command.bindKey, command);\n };\n this.parseKeys = function(keys) {\n var parts = keys.toLowerCase().split(/[\\-\\+]([\\-\\+])?/).filter(function(x){return x;});\n var key = parts.pop();\n\n var keyCode = keyUtil[key];\n if (keyUtil.FUNCTION_KEYS[keyCode])\n key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();\n else if (!parts.length)\n return {key: key, hashId: -1};\n else if (parts.length == 1 && parts[0] == \"shift\")\n return {key: key.toUpperCase(), hashId: -1};\n\n var hashId = 0;\n for (var i = parts.length; i--;) {\n var modifier = keyUtil.KEY_MODS[parts[i]];\n if (modifier == null) {\n if (typeof console != \"undefined\")\n console.error(\"invalid modifier \" + parts[i] + \" in \" + keys);\n return false;\n }\n hashId |= modifier;\n }\n return {key: key, hashId: hashId};\n };\n\n this.findKeyCommand = function findKeyCommand(hashId, keyString) {\n var key = KEY_MODS[hashId] + keyString;\n return this.commandKeyBinding[key];\n };\n\n this.handleKeyboard = function(data, hashId, keyString, keyCode) {\n if (keyCode < 0) return;\n var key = KEY_MODS[hashId] + keyString;\n var command = this.commandKeyBinding[key];\n if (data.$keyChain) {\n data.$keyChain += \" \" + key;\n command = this.commandKeyBinding[data.$keyChain] || command;\n }\n \n if (command) {\n if (command == \"chainKeys\" || command[command.length - 1] == \"chainKeys\") {\n data.$keyChain = data.$keyChain || key;\n return {command: \"null\"};\n }\n }\n \n if (data.$keyChain) {\n if ((!hashId || hashId == 4) && keyString.length == 1)\n data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input\n else if (hashId == -1 || keyCode > 0)\n data.$keyChain = \"\"; // reset keyChain\n }\n return {command: command};\n };\n \n this.getStatusText = function(editor, data) {\n return data.$keyChain || \"\";\n };\n\n}).call(HashHandler.prototype);\n\nexports.HashHandler = HashHandler;\nexports.MultiHashHandler = MultiHashHandler;\n});\n\nace.define(\"ace/commands/command_manager\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/keyboard/hash_handler\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar MultiHashHandler = acequire(\"../keyboard/hash_handler\").MultiHashHandler;\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar CommandManager = function(platform, commands) {\n MultiHashHandler.call(this, commands, platform);\n this.byName = this.commands;\n this.setDefaultHandler(\"exec\", function(e) {\n return e.command.exec(e.editor, e.args || {});\n });\n};\n\noop.inherits(CommandManager, MultiHashHandler);\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.exec = function(command, editor, args) {\n if (Array.isArray(command)) {\n for (var i = command.length; i--; ) {\n if (this.exec(command[i], editor, args)) return true;\n }\n return false;\n }\n\n if (typeof command === \"string\")\n command = this.commands[command];\n\n if (!command)\n return false;\n\n if (editor && editor.$readOnly && !command.readOnly)\n return false;\n\n if (command.isAvailable && !command.isAvailable(editor))\n return false;\n\n var e = {editor: editor, command: command, args: args};\n e.returnValue = this._emit(\"exec\", e);\n this._signal(\"afterExec\", e);\n\n return e.returnValue === false ? false : true;\n };\n\n this.toggleRecording = function(editor) {\n if (this.$inReplay)\n return;\n\n editor && editor._emit(\"changeStatus\");\n if (this.recording) {\n this.macro.pop();\n this.removeEventListener(\"exec\", this.$addCommandToMacro);\n\n if (!this.macro.length)\n this.macro = this.oldMacro;\n\n return this.recording = false;\n }\n if (!this.$addCommandToMacro) {\n this.$addCommandToMacro = function(e) {\n this.macro.push([e.command, e.args]);\n }.bind(this);\n }\n\n this.oldMacro = this.macro;\n this.macro = [];\n this.on(\"exec\", this.$addCommandToMacro);\n return this.recording = true;\n };\n\n this.replay = function(editor) {\n if (this.$inReplay || !this.macro)\n return;\n\n if (this.recording)\n return this.toggleRecording(editor);\n\n try {\n this.$inReplay = true;\n this.macro.forEach(function(x) {\n if (typeof x == \"string\")\n this.exec(x, editor);\n else\n this.exec(x[0], editor, x[1]);\n }, this);\n } finally {\n this.$inReplay = false;\n }\n };\n\n this.trimMacro = function(m) {\n return m.map(function(x){\n if (typeof x[0] != \"string\")\n x[0] = x[0].name;\n if (!x[1])\n x = x[0];\n return x;\n });\n };\n\n}).call(CommandManager.prototype);\n\nexports.CommandManager = CommandManager;\n\n});\n\nace.define(\"ace/commands/default_commands\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/config\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"../lib/lang\");\nvar config = acequire(\"../config\");\nvar Range = acequire(\"../range\").Range;\n\nfunction bindKey(win, mac) {\n return {win: win, mac: mac};\n}\nexports.commands = [{\n name: \"showSettingsMenu\",\n bindKey: bindKey(\"Ctrl-,\", \"Command-,\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/settings_menu\", function(module) {\n module.init(editor);\n editor.showSettingsMenu();\n });\n },\n readOnly: true\n}, {\n name: \"goToNextError\",\n bindKey: bindKey(\"Alt-E\", \"F4\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/error_marker\", function(module) {\n module.showErrorMarker(editor, 1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"goToPreviousError\",\n bindKey: bindKey(\"Alt-Shift-E\", \"Shift-F4\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/error_marker\", function(module) {\n module.showErrorMarker(editor, -1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selectall\",\n bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n exec: function(editor) { editor.selectAll(); },\n readOnly: true\n}, {\n name: \"centerselection\",\n bindKey: bindKey(null, \"Ctrl-L\"),\n exec: function(editor) { editor.centerSelection(); },\n readOnly: true\n}, {\n name: \"gotoline\",\n bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n exec: function(editor) {\n var line = parseInt(prompt(\"Enter line number:\"), 10);\n if (!isNaN(line)) {\n editor.gotoLine(line);\n }\n },\n readOnly: true\n}, {\n name: \"fold\",\n bindKey: bindKey(\"Alt-L|Ctrl-F1\", \"Command-Alt-L|Command-F1\"),\n exec: function(editor) { editor.session.toggleFold(false); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"unfold\",\n bindKey: bindKey(\"Alt-Shift-L|Ctrl-Shift-F1\", \"Command-Alt-Shift-L|Command-Shift-F1\"),\n exec: function(editor) { editor.session.toggleFold(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleFoldWidget\",\n bindKey: bindKey(\"F2\", \"F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleParentFoldWidget\",\n bindKey: bindKey(\"Alt-F2\", \"Alt-F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldall\",\n bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n exec: function(editor) { editor.session.foldAll(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldOther\",\n bindKey: bindKey(\"Alt-0\", \"Command-Option-0\"),\n exec: function(editor) { \n editor.session.foldAll();\n editor.session.unfold(editor.selection.getAllRanges());\n },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"unfoldall\",\n bindKey: bindKey(\"Alt-Shift-0\", \"Command-Option-Shift-0\"),\n exec: function(editor) { editor.session.unfold(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"findnext\",\n bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n exec: function(editor) { editor.findNext(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"findprevious\",\n bindKey: bindKey(\"Ctrl-Shift-K\", \"Command-Shift-G\"),\n exec: function(editor) { editor.findPrevious(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"selectOrFindNext\",\n bindKey: bindKey(\"Alt-K\", \"Ctrl-G\"),\n exec: function(editor) {\n if (editor.selection.isEmpty())\n editor.selection.selectWord();\n else\n editor.findNext(); \n },\n readOnly: true\n}, {\n name: \"selectOrFindPrevious\",\n bindKey: bindKey(\"Alt-Shift-K\", \"Ctrl-Shift-G\"),\n exec: function(editor) { \n if (editor.selection.isEmpty())\n editor.selection.selectWord();\n else\n editor.findPrevious();\n },\n readOnly: true\n}, {\n name: \"find\",\n bindKey: bindKey(\"Ctrl-F\", \"Command-F\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor);});\n },\n readOnly: true\n}, {\n name: \"overwrite\",\n bindKey: \"Insert\",\n exec: function(editor) { editor.toggleOverwrite(); },\n readOnly: true\n}, {\n name: \"selecttostart\",\n bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-Shift-Home|Command-Shift-Up\"),\n exec: function(editor) { editor.getSelection().selectFileStart(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"gotostart\",\n bindKey: bindKey(\"Ctrl-Home\", \"Command-Home|Command-Up\"),\n exec: function(editor) { editor.navigateFileStart(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"selectup\",\n bindKey: bindKey(\"Shift-Up\", \"Shift-Up|Ctrl-Shift-P\"),\n exec: function(editor) { editor.getSelection().selectUp(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golineup\",\n bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n exec: function(editor, args) { editor.navigateUp(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttoend\",\n bindKey: bindKey(\"Ctrl-Shift-End\", \"Command-Shift-End|Command-Shift-Down\"),\n exec: function(editor) { editor.getSelection().selectFileEnd(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"gotoend\",\n bindKey: bindKey(\"Ctrl-End\", \"Command-End|Command-Down\"),\n exec: function(editor) { editor.navigateFileEnd(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"selectdown\",\n bindKey: bindKey(\"Shift-Down\", \"Shift-Down|Ctrl-Shift-N\"),\n exec: function(editor) { editor.getSelection().selectDown(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golinedown\",\n bindKey: bindKey(\"Down\", \"Down|Ctrl-N\"),\n exec: function(editor, args) { editor.navigateDown(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectwordleft\",\n bindKey: bindKey(\"Ctrl-Shift-Left\", \"Option-Shift-Left\"),\n exec: function(editor) { editor.getSelection().selectWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotowordleft\",\n bindKey: bindKey(\"Ctrl-Left\", \"Option-Left\"),\n exec: function(editor) { editor.navigateWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttolinestart\",\n bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left|Ctrl-Shift-A\"),\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolinestart\",\n bindKey: bindKey(\"Alt-Left|Home\", \"Command-Left|Home|Ctrl-A\"),\n exec: function(editor) { editor.navigateLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectleft\",\n bindKey: bindKey(\"Shift-Left\", \"Shift-Left|Ctrl-Shift-B\"),\n exec: function(editor) { editor.getSelection().selectLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoleft\",\n bindKey: bindKey(\"Left\", \"Left|Ctrl-B\"),\n exec: function(editor, args) { editor.navigateLeft(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectwordright\",\n bindKey: bindKey(\"Ctrl-Shift-Right\", \"Option-Shift-Right\"),\n exec: function(editor) { editor.getSelection().selectWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotowordright\",\n bindKey: bindKey(\"Ctrl-Right\", \"Option-Right\"),\n exec: function(editor) { editor.navigateWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttolineend\",\n bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right|Shift-End|Ctrl-Shift-E\"),\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolineend\",\n bindKey: bindKey(\"Alt-Right|End\", \"Command-Right|End|Ctrl-E\"),\n exec: function(editor) { editor.navigateLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectright\",\n bindKey: bindKey(\"Shift-Right\", \"Shift-Right\"),\n exec: function(editor) { editor.getSelection().selectRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoright\",\n bindKey: bindKey(\"Right\", \"Right|Ctrl-F\"),\n exec: function(editor, args) { editor.navigateRight(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectpagedown\",\n bindKey: \"Shift-PageDown\",\n exec: function(editor) { editor.selectPageDown(); },\n readOnly: true\n}, {\n name: \"pagedown\",\n bindKey: bindKey(null, \"Option-PageDown\"),\n exec: function(editor) { editor.scrollPageDown(); },\n readOnly: true\n}, {\n name: \"gotopagedown\",\n bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n exec: function(editor) { editor.gotoPageDown(); },\n readOnly: true\n}, {\n name: \"selectpageup\",\n bindKey: \"Shift-PageUp\",\n exec: function(editor) { editor.selectPageUp(); },\n readOnly: true\n}, {\n name: \"pageup\",\n bindKey: bindKey(null, \"Option-PageUp\"),\n exec: function(editor) { editor.scrollPageUp(); },\n readOnly: true\n}, {\n name: \"gotopageup\",\n bindKey: \"PageUp\",\n exec: function(editor) { editor.gotoPageUp(); },\n readOnly: true\n}, {\n name: \"scrollup\",\n bindKey: bindKey(\"Ctrl-Up\", null),\n exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\n readOnly: true\n}, {\n name: \"scrolldown\",\n bindKey: bindKey(\"Ctrl-Down\", null),\n exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\n readOnly: true\n}, {\n name: \"selectlinestart\",\n bindKey: \"Shift-Home\",\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectlineend\",\n bindKey: \"Shift-End\",\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"togglerecording\",\n bindKey: bindKey(\"Ctrl-Alt-E\", \"Command-Option-E\"),\n exec: function(editor) { editor.commands.toggleRecording(editor); },\n readOnly: true\n}, {\n name: \"replaymacro\",\n bindKey: bindKey(\"Ctrl-Shift-E\", \"Command-Shift-E\"),\n exec: function(editor) { editor.commands.replay(editor); },\n readOnly: true\n}, {\n name: \"jumptomatching\",\n bindKey: bindKey(\"Ctrl-P\", \"Ctrl-P\"),\n exec: function(editor) { editor.jumpToMatching(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selecttomatching\",\n bindKey: bindKey(\"Ctrl-Shift-P\", \"Ctrl-Shift-P\"),\n exec: function(editor) { editor.jumpToMatching(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"expandToMatching\",\n bindKey: bindKey(\"Ctrl-Shift-M\", \"Ctrl-Shift-M\"),\n exec: function(editor) { editor.jumpToMatching(true, true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"passKeysToBrowser\",\n bindKey: bindKey(null, null),\n exec: function() {},\n passEvent: true,\n readOnly: true\n}, {\n name: \"copy\",\n exec: function(editor) {\n },\n readOnly: true\n},\n{\n name: \"cut\",\n exec: function(editor) {\n var range = editor.getSelectionRange();\n editor._emit(\"cut\", range);\n\n if (!editor.selection.isEmpty()) {\n editor.session.remove(range);\n editor.clearSelection();\n }\n },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"paste\",\n exec: function(editor, args) {\n editor.$handlePaste(args);\n },\n scrollIntoView: \"cursor\"\n}, {\n name: \"removeline\",\n bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n exec: function(editor) { editor.removeLines(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"duplicateSelection\",\n bindKey: bindKey(\"Ctrl-Shift-D\", \"Command-Shift-D\"),\n exec: function(editor) { editor.duplicateSelection(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"sortlines\",\n bindKey: bindKey(\"Ctrl-Alt-S\", \"Command-Alt-S\"),\n exec: function(editor) { editor.sortLines(); },\n scrollIntoView: \"selection\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"togglecomment\",\n bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n exec: function(editor) { editor.toggleCommentLines(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"toggleBlockComment\",\n bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n exec: function(editor) { editor.toggleBlockComment(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"modifyNumberUp\",\n bindKey: bindKey(\"Ctrl-Shift-Up\", \"Alt-Shift-Up\"),\n exec: function(editor) { editor.modifyNumber(1); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"modifyNumberDown\",\n bindKey: bindKey(\"Ctrl-Shift-Down\", \"Alt-Shift-Down\"),\n exec: function(editor) { editor.modifyNumber(-1); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"replace\",\n bindKey: bindKey(\"Ctrl-H\", \"Command-Option-F\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor, true);});\n }\n}, {\n name: \"undo\",\n bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n exec: function(editor) { editor.undo(); }\n}, {\n name: \"redo\",\n bindKey: bindKey(\"Ctrl-Shift-Z|Ctrl-Y\", \"Command-Shift-Z|Command-Y\"),\n exec: function(editor) { editor.redo(); }\n}, {\n name: \"copylinesup\",\n bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n exec: function(editor) { editor.copyLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesup\",\n bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n exec: function(editor) { editor.moveLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"copylinesdown\",\n bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n exec: function(editor) { editor.copyLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesdown\",\n bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n exec: function(editor) { editor.moveLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"del\",\n bindKey: bindKey(\"Delete\", \"Delete|Ctrl-D|Shift-Delete\"),\n exec: function(editor) { editor.remove(\"right\"); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"backspace\",\n bindKey: bindKey(\n \"Shift-Backspace|Backspace\",\n \"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\"\n ),\n exec: function(editor) { editor.remove(\"left\"); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"cut_or_delete\",\n bindKey: bindKey(\"Shift-Delete\", null),\n exec: function(editor) { \n if (editor.selection.isEmpty()) {\n editor.remove(\"left\");\n } else {\n return false;\n }\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolinestart\",\n bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n exec: function(editor) { editor.removeToLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineend\",\n bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K|Command-Delete\"),\n exec: function(editor) { editor.removeToLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolinestarthard\",\n bindKey: bindKey(\"Ctrl-Shift-Backspace\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.start.column = 0;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineendhard\",\n bindKey: bindKey(\"Ctrl-Shift-Delete\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.end.column = Number.MAX_VALUE;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordleft\",\n bindKey: bindKey(\"Ctrl-Backspace\", \"Alt-Backspace|Ctrl-Alt-Backspace\"),\n exec: function(editor) { editor.removeWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordright\",\n bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n exec: function(editor) { editor.removeWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"outdent\",\n bindKey: bindKey(\"Shift-Tab\", \"Shift-Tab\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"indent\",\n bindKey: bindKey(\"Tab\", \"Tab\"),\n exec: function(editor) { editor.indent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockoutdent\",\n bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockindent\",\n bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n exec: function(editor) { editor.blockIndent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"insertstring\",\n exec: function(editor, str) { editor.insert(str); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"inserttext\",\n exec: function(editor, args) {\n editor.insert(lang.stringRepeat(args.text || \"\", args.times || 1));\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"splitline\",\n bindKey: bindKey(null, \"Ctrl-O\"),\n exec: function(editor) { editor.splitLine(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"transposeletters\",\n bindKey: bindKey(\"Alt-Shift-X\", \"Ctrl-T\"),\n exec: function(editor) { editor.transposeLetters(); },\n multiSelectAction: function(editor) {editor.transposeSelections(1); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"touppercase\",\n bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n exec: function(editor) { editor.toUpperCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"tolowercase\",\n bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n exec: function(editor) { editor.toLowerCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"expandtoline\",\n bindKey: bindKey(\"Ctrl-Shift-L\", \"Command-Shift-L\"),\n exec: function(editor) {\n var range = editor.selection.getRange();\n\n range.start.column = range.end.column = 0;\n range.end.row++;\n editor.selection.setRange(range, false);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"joinlines\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n var isBackwards = editor.selection.isBackwards();\n var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();\n var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();\n var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length;\n var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());\n var selectedCount = selectedText.replace(/\\n\\s*/, \" \").length;\n var insertLine = editor.session.doc.getLine(selectionStart.row);\n\n for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {\n var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));\n if (curLine.length !== 0) {\n curLine = \" \" + curLine;\n }\n insertLine += curLine;\n }\n\n if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {\n insertLine += editor.session.doc.getNewLineCharacter();\n }\n\n editor.clearSelection();\n editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);\n\n if (selectedCount > 0) {\n editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);\n editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);\n } else {\n firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;\n editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);\n }\n },\n multiSelectAction: \"forEach\",\n readOnly: true\n}, {\n name: \"invertSelection\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n var endRow = editor.session.doc.getLength() - 1;\n var endCol = editor.session.doc.getLine(endRow).length;\n var ranges = editor.selection.rangeList.ranges;\n var newRanges = [];\n if (ranges.length < 1) {\n ranges = [editor.selection.getRange()];\n }\n\n for (var i = 0; i < ranges.length; i++) {\n if (i == (ranges.length - 1)) {\n if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {\n newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));\n }\n }\n\n if (i === 0) {\n if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {\n newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));\n }\n } else {\n newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));\n }\n }\n\n editor.exitMultiSelectMode();\n editor.clearSelection();\n\n for(var i = 0; i < newRanges.length; i++) {\n editor.selection.addRange(newRanges[i], false);\n }\n },\n readOnly: true,\n scrollIntoView: \"none\"\n}];\n\n});\n\nace.define(\"ace/editor\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/keyboard/textinput\",\"ace/mouse/mouse_handler\",\"ace/mouse/fold_handler\",\"ace/keyboard/keybinding\",\"ace/edit_session\",\"ace/search\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/commands/command_manager\",\"ace/commands/default_commands\",\"ace/config\",\"ace/token_iterator\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./lib/fixoldbrowsers\");\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar lang = acequire(\"./lib/lang\");\nvar useragent = acequire(\"./lib/useragent\");\nvar TextInput = acequire(\"./keyboard/textinput\").TextInput;\nvar MouseHandler = acequire(\"./mouse/mouse_handler\").MouseHandler;\nvar FoldHandler = acequire(\"./mouse/fold_handler\").FoldHandler;\nvar KeyBinding = acequire(\"./keyboard/keybinding\").KeyBinding;\nvar EditSession = acequire(\"./edit_session\").EditSession;\nvar Search = acequire(\"./search\").Search;\nvar Range = acequire(\"./range\").Range;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar CommandManager = acequire(\"./commands/command_manager\").CommandManager;\nvar defaultCommands = acequire(\"./commands/default_commands\").commands;\nvar config = acequire(\"./config\");\nvar TokenIterator = acequire(\"./token_iterator\").TokenIterator;\nvar Editor = function(renderer, session) {\n var container = renderer.getContainerElement();\n this.container = container;\n this.renderer = renderer;\n this.id = \"editor\" + (++Editor.$uid);\n\n this.commands = new CommandManager(useragent.isMac ? \"mac\" : \"win\", defaultCommands);\n if (typeof document == \"object\") {\n this.textInput = new TextInput(renderer.getTextAreaContainer(), this);\n this.renderer.textarea = this.textInput.getElement();\n this.$mouseHandler = new MouseHandler(this);\n new FoldHandler(this);\n }\n\n this.keyBinding = new KeyBinding(this);\n\n this.$blockScrolling = 0;\n this.$search = new Search().set({\n wrap: true\n });\n\n this.$historyTracker = this.$historyTracker.bind(this);\n this.commands.on(\"exec\", this.$historyTracker);\n\n this.$initOperationListeners();\n \n this._$emitInputEvent = lang.delayedCall(function() {\n this._signal(\"input\", {});\n if (this.session && this.session.bgTokenizer)\n this.session.bgTokenizer.scheduleStart();\n }.bind(this));\n \n this.on(\"change\", function(_, _self) {\n _self._$emitInputEvent.schedule(31);\n });\n\n this.setSession(session || new EditSession(\"\"));\n config.resetOptions(this);\n config._signal(\"editor\", this);\n};\n\nEditor.$uid = 0;\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.$initOperationListeners = function() {\n function last(a) {return a[a.length - 1];}\n\n this.selections = [];\n this.commands.on(\"exec\", this.startOperation.bind(this), true);\n this.commands.on(\"afterExec\", this.endOperation.bind(this), true);\n\n this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this));\n\n this.on(\"change\", function() {\n this.curOp || this.startOperation();\n this.curOp.docChanged = true;\n }.bind(this), true);\n\n this.on(\"changeSelection\", function() {\n this.curOp || this.startOperation();\n this.curOp.selectionChanged = true;\n }.bind(this), true);\n };\n\n this.curOp = null;\n this.prevOp = {};\n this.startOperation = function(commadEvent) {\n if (this.curOp) {\n if (!commadEvent || this.curOp.command)\n return;\n this.prevOp = this.curOp;\n }\n if (!commadEvent) {\n this.previousCommand = null;\n commadEvent = {};\n }\n\n this.$opResetTimer.schedule();\n this.curOp = {\n command: commadEvent.command || {},\n args: commadEvent.args,\n scrollTop: this.renderer.scrollTop\n };\n if (this.curOp.command.name && this.curOp.command.scrollIntoView !== undefined)\n this.$blockScrolling++;\n };\n\n this.endOperation = function(e) {\n if (this.curOp) {\n if (e && e.returnValue === false)\n return this.curOp = null;\n this._signal(\"beforeEndOperation\");\n var command = this.curOp.command;\n if (command.name && this.$blockScrolling > 0)\n this.$blockScrolling--;\n var scrollIntoView = command && command.scrollIntoView;\n if (scrollIntoView) {\n switch (scrollIntoView) {\n case \"center-animate\":\n scrollIntoView = \"animate\";\n case \"center\":\n this.renderer.scrollCursorIntoView(null, 0.5);\n break;\n case \"animate\":\n case \"cursor\":\n this.renderer.scrollCursorIntoView();\n break;\n case \"selectionPart\":\n var range = this.selection.getRange();\n var config = this.renderer.layerConfig;\n if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) {\n this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead);\n }\n break;\n default:\n break;\n }\n if (scrollIntoView == \"animate\")\n this.renderer.animateScrolling(this.curOp.scrollTop);\n }\n \n this.prevOp = this.curOp;\n this.curOp = null;\n }\n };\n this.$mergeableCommands = [\"backspace\", \"del\", \"insertstring\"];\n this.$historyTracker = function(e) {\n if (!this.$mergeUndoDeltas)\n return;\n\n var prev = this.prevOp;\n var mergeableCommands = this.$mergeableCommands;\n var shouldMerge = prev.command && (e.command.name == prev.command.name);\n if (e.command.name == \"insertstring\") {\n var text = e.args;\n if (this.mergeNextCommand === undefined)\n this.mergeNextCommand = true;\n\n shouldMerge = shouldMerge\n && this.mergeNextCommand // previous command allows to coalesce with\n && (!/\\s/.test(text) || /\\s/.test(prev.args)); // previous insertion was of same type\n\n this.mergeNextCommand = true;\n } else {\n shouldMerge = shouldMerge\n && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable\n }\n\n if (\n this.$mergeUndoDeltas != \"always\"\n && Date.now() - this.sequenceStartTime > 2000\n ) {\n shouldMerge = false; // the sequence is too long\n }\n\n if (shouldMerge)\n this.session.mergeUndoDeltas = true;\n else if (mergeableCommands.indexOf(e.command.name) !== -1)\n this.sequenceStartTime = Date.now();\n };\n this.setKeyboardHandler = function(keyboardHandler, cb) {\n if (keyboardHandler && typeof keyboardHandler === \"string\") {\n this.$keybindingId = keyboardHandler;\n var _self = this;\n config.loadModule([\"keybinding\", keyboardHandler], function(module) {\n if (_self.$keybindingId == keyboardHandler)\n _self.keyBinding.setKeyboardHandler(module && module.handler);\n cb && cb();\n });\n } else {\n this.$keybindingId = null;\n this.keyBinding.setKeyboardHandler(keyboardHandler);\n cb && cb();\n }\n };\n this.getKeyboardHandler = function() {\n return this.keyBinding.getKeyboardHandler();\n };\n this.setSession = function(session) {\n if (this.session == session)\n return;\n if (this.curOp) this.endOperation();\n this.curOp = {};\n\n var oldSession = this.session;\n if (oldSession) {\n this.session.off(\"change\", this.$onDocumentChange);\n this.session.off(\"changeMode\", this.$onChangeMode);\n this.session.off(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n this.session.off(\"changeTabSize\", this.$onChangeTabSize);\n this.session.off(\"changeWrapLimit\", this.$onChangeWrapLimit);\n this.session.off(\"changeWrapMode\", this.$onChangeWrapMode);\n this.session.off(\"changeFold\", this.$onChangeFold);\n this.session.off(\"changeFrontMarker\", this.$onChangeFrontMarker);\n this.session.off(\"changeBackMarker\", this.$onChangeBackMarker);\n this.session.off(\"changeBreakpoint\", this.$onChangeBreakpoint);\n this.session.off(\"changeAnnotation\", this.$onChangeAnnotation);\n this.session.off(\"changeOverwrite\", this.$onCursorChange);\n this.session.off(\"changeScrollTop\", this.$onScrollTopChange);\n this.session.off(\"changeScrollLeft\", this.$onScrollLeftChange);\n\n var selection = this.session.getSelection();\n selection.off(\"changeCursor\", this.$onCursorChange);\n selection.off(\"changeSelection\", this.$onSelectionChange);\n }\n\n this.session = session;\n if (session) {\n this.$onDocumentChange = this.onDocumentChange.bind(this);\n session.on(\"change\", this.$onDocumentChange);\n this.renderer.setSession(session);\n \n this.$onChangeMode = this.onChangeMode.bind(this);\n session.on(\"changeMode\", this.$onChangeMode);\n \n this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n session.on(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n \n this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);\n session.on(\"changeTabSize\", this.$onChangeTabSize);\n \n this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n session.on(\"changeWrapLimit\", this.$onChangeWrapLimit);\n \n this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n session.on(\"changeWrapMode\", this.$onChangeWrapMode);\n \n this.$onChangeFold = this.onChangeFold.bind(this);\n session.on(\"changeFold\", this.$onChangeFold);\n \n this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n this.session.on(\"changeFrontMarker\", this.$onChangeFrontMarker);\n \n this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n this.session.on(\"changeBackMarker\", this.$onChangeBackMarker);\n \n this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n this.session.on(\"changeBreakpoint\", this.$onChangeBreakpoint);\n \n this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n this.session.on(\"changeAnnotation\", this.$onChangeAnnotation);\n \n this.$onCursorChange = this.onCursorChange.bind(this);\n this.session.on(\"changeOverwrite\", this.$onCursorChange);\n \n this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n this.session.on(\"changeScrollTop\", this.$onScrollTopChange);\n \n this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n this.session.on(\"changeScrollLeft\", this.$onScrollLeftChange);\n \n this.selection = session.getSelection();\n this.selection.on(\"changeCursor\", this.$onCursorChange);\n \n this.$onSelectionChange = this.onSelectionChange.bind(this);\n this.selection.on(\"changeSelection\", this.$onSelectionChange);\n \n this.onChangeMode();\n \n this.$blockScrolling += 1;\n this.onCursorChange();\n this.$blockScrolling -= 1;\n \n this.onScrollTopChange();\n this.onScrollLeftChange();\n this.onSelectionChange();\n this.onChangeFrontMarker();\n this.onChangeBackMarker();\n this.onChangeBreakpoint();\n this.onChangeAnnotation();\n this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\n this.renderer.updateFull();\n } else {\n this.selection = null;\n this.renderer.setSession(session);\n }\n\n this._signal(\"changeSession\", {\n session: session,\n oldSession: oldSession\n });\n \n this.curOp = null;\n \n oldSession && oldSession._signal(\"changeEditor\", {oldEditor: this});\n session && session._signal(\"changeEditor\", {editor: this});\n\n if (session && session.bgTokenizer)\n session.bgTokenizer.scheduleStart();\n };\n this.getSession = function() {\n return this.session;\n };\n this.setValue = function(val, cursorPos) {\n this.session.doc.setValue(val);\n\n if (!cursorPos)\n this.selectAll();\n else if (cursorPos == 1)\n this.navigateFileEnd();\n else if (cursorPos == -1)\n this.navigateFileStart();\n\n return val;\n };\n this.getValue = function() {\n return this.session.getValue();\n };\n this.getSelection = function() {\n return this.selection;\n };\n this.resize = function(force) {\n this.renderer.onResize(force);\n };\n this.setTheme = function(theme, cb) {\n this.renderer.setTheme(theme, cb);\n };\n this.getTheme = function() {\n return this.renderer.getTheme();\n };\n this.setStyle = function(style) {\n this.renderer.setStyle(style);\n };\n this.unsetStyle = function(style) {\n this.renderer.unsetStyle(style);\n };\n this.getFontSize = function () {\n return this.getOption(\"fontSize\") ||\n dom.computedStyle(this.container, \"fontSize\");\n };\n this.setFontSize = function(size) {\n this.setOption(\"fontSize\", size);\n };\n\n this.$highlightBrackets = function() {\n if (this.session.$bracketHighlight) {\n this.session.removeMarker(this.session.$bracketHighlight);\n this.session.$bracketHighlight = null;\n }\n\n if (this.$highlightPending) {\n return;\n }\n var self = this;\n this.$highlightPending = true;\n setTimeout(function() {\n self.$highlightPending = false;\n var session = self.session;\n if (!session || !session.bgTokenizer) return;\n var pos = session.findMatchingBracket(self.getCursorPosition());\n if (pos) {\n var range = new Range(pos.row, pos.column, pos.row, pos.column + 1);\n } else if (session.$mode.getMatching) {\n var range = session.$mode.getMatching(self.session);\n }\n if (range)\n session.$bracketHighlight = session.addMarker(range, \"ace_bracket\", \"text\");\n }, 50);\n };\n this.$highlightTags = function() {\n if (this.$highlightTagPending)\n return;\n var self = this;\n this.$highlightTagPending = true;\n setTimeout(function() {\n self.$highlightTagPending = false;\n \n var session = self.session;\n if (!session || !session.bgTokenizer) return;\n \n var pos = self.getCursorPosition();\n var iterator = new TokenIterator(self.session, pos.row, pos.column);\n var token = iterator.getCurrentToken();\n \n if (!token || !/\\b(?:tag-open|tag-name)/.test(token.type)) {\n session.removeMarker(session.$tagHighlight);\n session.$tagHighlight = null;\n return;\n }\n \n if (token.type.indexOf(\"tag-open\") != -1) {\n token = iterator.stepForward();\n if (!token)\n return;\n }\n \n var tag = token.value;\n var depth = 0;\n var prevToken = iterator.stepBackward();\n \n if (prevToken.value == '<'){\n do {\n prevToken = token;\n token = iterator.stepForward();\n \n if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n if (prevToken.value === '<'){\n depth++;\n } else if (prevToken.value === '= 0);\n } else {\n do {\n token = prevToken;\n prevToken = iterator.stepBackward();\n \n if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n if (prevToken.value === '<') {\n depth++;\n } else if (prevToken.value === ' 1))\n highlight = false;\n }\n\n if (session.$highlightLineMarker && !highlight) {\n session.removeMarker(session.$highlightLineMarker.id);\n session.$highlightLineMarker = null;\n } else if (!session.$highlightLineMarker && highlight) {\n var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);\n range.id = session.addMarker(range, \"ace_active-line\", \"screenLine\");\n session.$highlightLineMarker = range;\n } else if (highlight) {\n session.$highlightLineMarker.start.row = highlight.row;\n session.$highlightLineMarker.end.row = highlight.row;\n session.$highlightLineMarker.start.column = highlight.column;\n session._signal(\"changeBackMarker\");\n }\n };\n\n this.onSelectionChange = function(e) {\n var session = this.session;\n\n if (session.$selectionMarker) {\n session.removeMarker(session.$selectionMarker);\n }\n session.$selectionMarker = null;\n\n if (!this.selection.isEmpty()) {\n var range = this.selection.getRange();\n var style = this.getSelectionStyle();\n session.$selectionMarker = session.addMarker(range, \"ace_selection\", style);\n } else {\n this.$updateHighlightActiveLine();\n }\n\n var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();\n this.session.highlight(re);\n\n this._signal(\"changeSelection\");\n };\n\n this.$getSelectionHighLightRegexp = function() {\n var session = this.session;\n\n var selection = this.getSelectionRange();\n if (selection.isEmpty() || selection.isMultiLine())\n return;\n\n var startOuter = selection.start.column - 1;\n var endOuter = selection.end.column + 1;\n var line = session.getLine(selection.start.row);\n var lineCols = line.length;\n var needle = line.substring(Math.max(startOuter, 0),\n Math.min(endOuter, lineCols));\n if ((startOuter >= 0 && /^[\\w\\d]/.test(needle)) ||\n (endOuter <= lineCols && /[\\w\\d]$/.test(needle)))\n return;\n\n needle = line.substring(selection.start.column, selection.end.column);\n if (!/^[\\w\\d]+$/.test(needle))\n return;\n\n var re = this.$search.$assembleRegExp({\n wholeWord: true,\n caseSensitive: true,\n needle: needle\n });\n\n return re;\n };\n\n\n this.onChangeFrontMarker = function() {\n this.renderer.updateFrontMarkers();\n };\n\n this.onChangeBackMarker = function() {\n this.renderer.updateBackMarkers();\n };\n\n\n this.onChangeBreakpoint = function() {\n this.renderer.updateBreakpoints();\n };\n\n this.onChangeAnnotation = function() {\n this.renderer.setAnnotations(this.session.getAnnotations());\n };\n\n\n this.onChangeMode = function(e) {\n this.renderer.updateText();\n this._emit(\"changeMode\", e);\n };\n\n\n this.onChangeWrapLimit = function() {\n this.renderer.updateFull();\n };\n\n this.onChangeWrapMode = function() {\n this.renderer.onResize(true);\n };\n\n\n this.onChangeFold = function() {\n this.$updateHighlightActiveLine();\n this.renderer.updateFull();\n };\n this.getSelectedText = function() {\n return this.session.getTextRange(this.getSelectionRange());\n };\n this.getCopyText = function() {\n var text = this.getSelectedText();\n this._signal(\"copy\", text);\n return text;\n };\n this.onCopy = function() {\n this.commands.exec(\"copy\", this);\n };\n this.onCut = function() {\n this.commands.exec(\"cut\", this);\n };\n this.onPaste = function(text, event) {\n var e = {text: text, event: event};\n this.commands.exec(\"paste\", this, e);\n };\n \n this.$handlePaste = function(e) {\n if (typeof e == \"string\") \n e = {text: e};\n this._signal(\"paste\", e);\n var text = e.text;\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\n this.insert(text);\n } else {\n var lines = text.split(/\\r\\n|\\r|\\n/);\n var ranges = this.selection.rangeList.ranges;\n \n if (lines.length > ranges.length || lines.length < 2 || !lines[1])\n return this.commands.exec(\"insertstring\", this, text);\n \n for (var i = ranges.length; i--;) {\n var range = ranges[i];\n if (!range.isEmpty())\n this.session.remove(range);\n \n this.session.insert(range.start, lines[i]);\n }\n }\n };\n\n this.execCommand = function(command, args) {\n return this.commands.exec(command, this, args);\n };\n this.insert = function(text, pasted) {\n var session = this.session;\n var mode = session.getMode();\n var cursor = this.getCursorPosition();\n\n if (this.getBehavioursEnabled() && !pasted) {\n var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);\n if (transform) {\n if (text !== transform.text) {\n this.session.mergeUndoDeltas = false;\n this.$mergeNextCommand = false;\n }\n text = transform.text;\n\n }\n }\n \n if (text == \"\\t\")\n text = this.session.getTabString();\n if (!this.selection.isEmpty()) {\n var range = this.getSelectionRange();\n cursor = this.session.remove(range);\n this.clearSelection();\n }\n else if (this.session.getOverwrite() && text.indexOf(\"\\n\") == -1) {\n var range = new Range.fromPoints(cursor, cursor);\n range.end.column += text.length;\n this.session.remove(range);\n }\n\n if (text == \"\\n\" || text == \"\\r\\n\") {\n var line = session.getLine(cursor.row);\n if (cursor.column > line.search(/\\S|$/)) {\n var d = line.substr(cursor.column).search(/\\S|$/);\n session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d);\n }\n }\n this.clearSelection();\n\n var start = cursor.column;\n var lineState = session.getState(cursor.row);\n var line = session.getLine(cursor.row);\n var shouldOutdent = mode.checkOutdent(lineState, line, text);\n var end = session.insert(cursor, text);\n\n if (transform && transform.selection) {\n if (transform.selection.length == 2) { // Transform relative to the current column\n this.selection.setSelectionRange(\n new Range(cursor.row, start + transform.selection[0],\n cursor.row, start + transform.selection[1]));\n } else { // Transform relative to the current row.\n this.selection.setSelectionRange(\n new Range(cursor.row + transform.selection[0],\n transform.selection[1],\n cursor.row + transform.selection[2],\n transform.selection[3]));\n }\n }\n\n if (session.getDocument().isNewLine(text)) {\n var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\n\n session.insert({row: cursor.row+1, column: 0}, lineIndent);\n }\n if (shouldOutdent)\n mode.autoOutdent(lineState, session, cursor.row);\n };\n\n this.onTextInput = function(text) {\n this.keyBinding.onTextInput(text);\n };\n\n this.onCommandKey = function(e, hashId, keyCode) {\n this.keyBinding.onCommandKey(e, hashId, keyCode);\n };\n this.setOverwrite = function(overwrite) {\n this.session.setOverwrite(overwrite);\n };\n this.getOverwrite = function() {\n return this.session.getOverwrite();\n };\n this.toggleOverwrite = function() {\n this.session.toggleOverwrite();\n };\n this.setScrollSpeed = function(speed) {\n this.setOption(\"scrollSpeed\", speed);\n };\n this.getScrollSpeed = function() {\n return this.getOption(\"scrollSpeed\");\n };\n this.setDragDelay = function(dragDelay) {\n this.setOption(\"dragDelay\", dragDelay);\n };\n this.getDragDelay = function() {\n return this.getOption(\"dragDelay\");\n };\n this.setSelectionStyle = function(val) {\n this.setOption(\"selectionStyle\", val);\n };\n this.getSelectionStyle = function() {\n return this.getOption(\"selectionStyle\");\n };\n this.setHighlightActiveLine = function(shouldHighlight) {\n this.setOption(\"highlightActiveLine\", shouldHighlight);\n };\n this.getHighlightActiveLine = function() {\n return this.getOption(\"highlightActiveLine\");\n };\n this.setHighlightGutterLine = function(shouldHighlight) {\n this.setOption(\"highlightGutterLine\", shouldHighlight);\n };\n\n this.getHighlightGutterLine = function() {\n return this.getOption(\"highlightGutterLine\");\n };\n this.setHighlightSelectedWord = function(shouldHighlight) {\n this.setOption(\"highlightSelectedWord\", shouldHighlight);\n };\n this.getHighlightSelectedWord = function() {\n return this.$highlightSelectedWord;\n };\n\n this.setAnimatedScroll = function(shouldAnimate){\n this.renderer.setAnimatedScroll(shouldAnimate);\n };\n\n this.getAnimatedScroll = function(){\n return this.renderer.getAnimatedScroll();\n };\n this.setShowInvisibles = function(showInvisibles) {\n this.renderer.setShowInvisibles(showInvisibles);\n };\n this.getShowInvisibles = function() {\n return this.renderer.getShowInvisibles();\n };\n\n this.setDisplayIndentGuides = function(display) {\n this.renderer.setDisplayIndentGuides(display);\n };\n\n this.getDisplayIndentGuides = function() {\n return this.renderer.getDisplayIndentGuides();\n };\n this.setShowPrintMargin = function(showPrintMargin) {\n this.renderer.setShowPrintMargin(showPrintMargin);\n };\n this.getShowPrintMargin = function() {\n return this.renderer.getShowPrintMargin();\n };\n this.setPrintMarginColumn = function(showPrintMargin) {\n this.renderer.setPrintMarginColumn(showPrintMargin);\n };\n this.getPrintMarginColumn = function() {\n return this.renderer.getPrintMarginColumn();\n };\n this.setReadOnly = function(readOnly) {\n this.setOption(\"readOnly\", readOnly);\n };\n this.getReadOnly = function() {\n return this.getOption(\"readOnly\");\n };\n this.setBehavioursEnabled = function (enabled) {\n this.setOption(\"behavioursEnabled\", enabled);\n };\n this.getBehavioursEnabled = function () {\n return this.getOption(\"behavioursEnabled\");\n };\n this.setWrapBehavioursEnabled = function (enabled) {\n this.setOption(\"wrapBehavioursEnabled\", enabled);\n };\n this.getWrapBehavioursEnabled = function () {\n return this.getOption(\"wrapBehavioursEnabled\");\n };\n this.setShowFoldWidgets = function(show) {\n this.setOption(\"showFoldWidgets\", show);\n\n };\n this.getShowFoldWidgets = function() {\n return this.getOption(\"showFoldWidgets\");\n };\n\n this.setFadeFoldWidgets = function(fade) {\n this.setOption(\"fadeFoldWidgets\", fade);\n };\n\n this.getFadeFoldWidgets = function() {\n return this.getOption(\"fadeFoldWidgets\");\n };\n this.remove = function(dir) {\n if (this.selection.isEmpty()){\n if (dir == \"left\")\n this.selection.selectLeft();\n else\n this.selection.selectRight();\n }\n\n var range = this.getSelectionRange();\n if (this.getBehavioursEnabled()) {\n var session = this.session;\n var state = session.getState(range.start.row);\n var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\n\n if (range.end.column === 0) {\n var text = session.getTextRange(range);\n if (text[text.length - 1] == \"\\n\") {\n var line = session.getLine(range.end.row);\n if (/^\\s+$/.test(line)) {\n range.end.column = line.length;\n }\n }\n }\n if (new_range)\n range = new_range;\n }\n\n this.session.remove(range);\n this.clearSelection();\n };\n this.removeWordRight = function() {\n if (this.selection.isEmpty())\n this.selection.selectWordRight();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeWordLeft = function() {\n if (this.selection.isEmpty())\n this.selection.selectWordLeft();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeToLineStart = function() {\n if (this.selection.isEmpty())\n this.selection.selectLineStart();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeToLineEnd = function() {\n if (this.selection.isEmpty())\n this.selection.selectLineEnd();\n\n var range = this.getSelectionRange();\n if (range.start.column == range.end.column && range.start.row == range.end.row) {\n range.end.column = 0;\n range.end.row++;\n }\n\n this.session.remove(range);\n this.clearSelection();\n };\n this.splitLine = function() {\n if (!this.selection.isEmpty()) {\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n }\n\n var cursor = this.getCursorPosition();\n this.insert(\"\\n\");\n this.moveCursorToPosition(cursor);\n };\n this.transposeLetters = function() {\n if (!this.selection.isEmpty()) {\n return;\n }\n\n var cursor = this.getCursorPosition();\n var column = cursor.column;\n if (column === 0)\n return;\n\n var line = this.session.getLine(cursor.row);\n var swap, range;\n if (column < line.length) {\n swap = line.charAt(column) + line.charAt(column-1);\n range = new Range(cursor.row, column-1, cursor.row, column+1);\n }\n else {\n swap = line.charAt(column-1) + line.charAt(column-2);\n range = new Range(cursor.row, column-2, cursor.row, column);\n }\n this.session.replace(range, swap);\n this.session.selection.moveToPosition(range.end);\n };\n this.toLowerCase = function() {\n var originalRange = this.getSelectionRange();\n if (this.selection.isEmpty()) {\n this.selection.selectWord();\n }\n\n var range = this.getSelectionRange();\n var text = this.session.getTextRange(range);\n this.session.replace(range, text.toLowerCase());\n this.selection.setSelectionRange(originalRange);\n };\n this.toUpperCase = function() {\n var originalRange = this.getSelectionRange();\n if (this.selection.isEmpty()) {\n this.selection.selectWord();\n }\n\n var range = this.getSelectionRange();\n var text = this.session.getTextRange(range);\n this.session.replace(range, text.toUpperCase());\n this.selection.setSelectionRange(originalRange);\n };\n this.indent = function() {\n var session = this.session;\n var range = this.getSelectionRange();\n\n if (range.start.row < range.end.row) {\n var rows = this.$getSelectedRows();\n session.indentRows(rows.first, rows.last, \"\\t\");\n return;\n } else if (range.start.column < range.end.column) {\n var text = session.getTextRange(range);\n if (!/^\\s+$/.test(text)) {\n var rows = this.$getSelectedRows();\n session.indentRows(rows.first, rows.last, \"\\t\");\n return;\n }\n }\n \n var line = session.getLine(range.start.row);\n var position = range.start;\n var size = session.getTabSize();\n var column = session.documentToScreenColumn(position.row, position.column);\n\n if (this.session.getUseSoftTabs()) {\n var count = (size - column % size);\n var indentString = lang.stringRepeat(\" \", count);\n } else {\n var count = column % size;\n while (line[range.start.column - 1] == \" \" && count) {\n range.start.column--;\n count--;\n }\n this.selection.setSelectionRange(range);\n indentString = \"\\t\";\n }\n return this.insert(indentString);\n };\n this.blockIndent = function() {\n var rows = this.$getSelectedRows();\n this.session.indentRows(rows.first, rows.last, \"\\t\");\n };\n this.blockOutdent = function() {\n var selection = this.session.getSelection();\n this.session.outdentRows(selection.getRange());\n };\n this.sortLines = function() {\n var rows = this.$getSelectedRows();\n var session = this.session;\n\n var lines = [];\n for (var i = rows.first; i <= rows.last; i++)\n lines.push(session.getLine(i));\n\n lines.sort(function(a, b) {\n if (a.toLowerCase() < b.toLowerCase()) return -1;\n if (a.toLowerCase() > b.toLowerCase()) return 1;\n return 0;\n });\n\n var deleteRange = new Range(0, 0, 0, 0);\n for (var i = rows.first; i <= rows.last; i++) {\n var line = session.getLine(i);\n deleteRange.start.row = i;\n deleteRange.end.row = i;\n deleteRange.end.column = line.length;\n session.replace(deleteRange, lines[i-rows.first]);\n }\n };\n this.toggleCommentLines = function() {\n var state = this.session.getState(this.getCursorPosition().row);\n var rows = this.$getSelectedRows();\n this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);\n };\n\n this.toggleBlockComment = function() {\n var cursor = this.getCursorPosition();\n var state = this.session.getState(cursor.row);\n var range = this.getSelectionRange();\n this.session.getMode().toggleBlockComment(state, this.session, range, cursor);\n };\n this.getNumberAt = function(row, column) {\n var _numberRx = /[\\-]?[0-9]+(?:\\.[0-9]+)?/g;\n _numberRx.lastIndex = 0;\n\n var s = this.session.getLine(row);\n while (_numberRx.lastIndex < column) {\n var m = _numberRx.exec(s);\n if(m.index <= column && m.index+m[0].length >= column){\n var number = {\n value: m[0],\n start: m.index,\n end: m.index+m[0].length\n };\n return number;\n }\n }\n return null;\n };\n this.modifyNumber = function(amount) {\n var row = this.selection.getCursor().row;\n var column = this.selection.getCursor().column;\n var charRange = new Range(row, column-1, row, column);\n\n var c = this.session.getTextRange(charRange);\n if (!isNaN(parseFloat(c)) && isFinite(c)) {\n var nr = this.getNumberAt(row, column);\n if (nr) {\n var fp = nr.value.indexOf(\".\") >= 0 ? nr.start + nr.value.indexOf(\".\") + 1 : nr.end;\n var decimals = nr.start + nr.value.length - fp;\n\n var t = parseFloat(nr.value);\n t *= Math.pow(10, decimals);\n\n\n if(fp !== nr.end && column < fp){\n amount *= Math.pow(10, nr.end - column - 1);\n } else {\n amount *= Math.pow(10, nr.end - column);\n }\n\n t += amount;\n t /= Math.pow(10, decimals);\n var nnr = t.toFixed(decimals);\n var replaceRange = new Range(row, nr.start, row, nr.end);\n this.session.replace(replaceRange, nnr);\n this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));\n\n }\n }\n };\n this.removeLines = function() {\n var rows = this.$getSelectedRows();\n this.session.removeFullLines(rows.first, rows.last);\n this.clearSelection();\n };\n\n this.duplicateSelection = function() {\n var sel = this.selection;\n var doc = this.session;\n var range = sel.getRange();\n var reverse = sel.isBackwards();\n if (range.isEmpty()) {\n var row = range.start.row;\n doc.duplicateLines(row, row);\n } else {\n var point = reverse ? range.start : range.end;\n var endPoint = doc.insert(point, doc.getTextRange(range), false);\n range.start = point;\n range.end = endPoint;\n\n sel.setSelectionRange(range, reverse);\n }\n };\n this.moveLinesDown = function() {\n this.$moveLines(1, false);\n };\n this.moveLinesUp = function() {\n this.$moveLines(-1, false);\n };\n this.moveText = function(range, toPosition, copy) {\n return this.session.moveText(range, toPosition, copy);\n };\n this.copyLinesUp = function() {\n this.$moveLines(-1, true);\n };\n this.copyLinesDown = function() {\n this.$moveLines(1, true);\n };\n this.$moveLines = function(dir, copy) {\n var rows, moved;\n var selection = this.selection;\n if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {\n var range = selection.toOrientedRange();\n rows = this.$getSelectedRows(range);\n moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir);\n if (copy && dir == -1) moved = 0;\n range.moveBy(moved, 0);\n selection.fromOrientedRange(range);\n } else {\n var ranges = selection.rangeList.ranges;\n selection.rangeList.detach(this.session);\n this.inVirtualSelectionMode = true;\n \n var diff = 0;\n var totalDiff = 0;\n var l = ranges.length;\n for (var i = 0; i < l; i++) {\n var rangeIndex = i;\n ranges[i].moveBy(diff, 0);\n rows = this.$getSelectedRows(ranges[i]);\n var first = rows.first;\n var last = rows.last;\n while (++i < l) {\n if (totalDiff) ranges[i].moveBy(totalDiff, 0);\n var subRows = this.$getSelectedRows(ranges[i]);\n if (copy && subRows.first != last)\n break;\n else if (!copy && subRows.first > last + 1)\n break;\n last = subRows.last;\n }\n i--;\n diff = this.session.$moveLines(first, last, copy ? 0 : dir);\n if (copy && dir == -1) rangeIndex = i + 1;\n while (rangeIndex <= i) {\n ranges[rangeIndex].moveBy(diff, 0);\n rangeIndex++;\n }\n if (!copy) diff = 0;\n totalDiff += diff;\n }\n \n selection.fromOrientedRange(selection.ranges[0]);\n selection.rangeList.attach(this.session);\n this.inVirtualSelectionMode = false;\n }\n };\n this.$getSelectedRows = function(range) {\n range = (range || this.getSelectionRange()).collapseRows();\n\n return {\n first: this.session.getRowFoldStart(range.start.row),\n last: this.session.getRowFoldEnd(range.end.row)\n };\n };\n\n this.onCompositionStart = function(text) {\n this.renderer.showComposition(this.getCursorPosition());\n };\n\n this.onCompositionUpdate = function(text) {\n this.renderer.setCompositionText(text);\n };\n\n this.onCompositionEnd = function() {\n this.renderer.hideComposition();\n };\n this.getFirstVisibleRow = function() {\n return this.renderer.getFirstVisibleRow();\n };\n this.getLastVisibleRow = function() {\n return this.renderer.getLastVisibleRow();\n };\n this.isRowVisible = function(row) {\n return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\n };\n this.isRowFullyVisible = function(row) {\n return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\n };\n this.$getVisibleRowCount = function() {\n return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\n };\n\n this.$moveByPage = function(dir, select) {\n var renderer = this.renderer;\n var config = this.renderer.layerConfig;\n var rows = dir * Math.floor(config.height / config.lineHeight);\n\n this.$blockScrolling++;\n if (select === true) {\n this.selection.$moveSelection(function(){\n this.moveCursorBy(rows, 0);\n });\n } else if (select === false) {\n this.selection.moveCursorBy(rows, 0);\n this.selection.clearSelection();\n }\n this.$blockScrolling--;\n\n var scrollTop = renderer.scrollTop;\n\n renderer.scrollBy(0, rows * config.lineHeight);\n if (select != null)\n renderer.scrollCursorIntoView(null, 0.5);\n\n renderer.animateScrolling(scrollTop);\n };\n this.selectPageDown = function() {\n this.$moveByPage(1, true);\n };\n this.selectPageUp = function() {\n this.$moveByPage(-1, true);\n };\n this.gotoPageDown = function() {\n this.$moveByPage(1, false);\n };\n this.gotoPageUp = function() {\n this.$moveByPage(-1, false);\n };\n this.scrollPageDown = function() {\n this.$moveByPage(1);\n };\n this.scrollPageUp = function() {\n this.$moveByPage(-1);\n };\n this.scrollToRow = function(row) {\n this.renderer.scrollToRow(row);\n };\n this.scrollToLine = function(line, center, animate, callback) {\n this.renderer.scrollToLine(line, center, animate, callback);\n };\n this.centerSelection = function() {\n var range = this.getSelectionRange();\n var pos = {\n row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\n column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\n };\n this.renderer.alignCursor(pos, 0.5);\n };\n this.getCursorPosition = function() {\n return this.selection.getCursor();\n };\n this.getCursorPositionScreen = function() {\n return this.session.documentToScreenPosition(this.getCursorPosition());\n };\n this.getSelectionRange = function() {\n return this.selection.getRange();\n };\n this.selectAll = function() {\n this.$blockScrolling += 1;\n this.selection.selectAll();\n this.$blockScrolling -= 1;\n };\n this.clearSelection = function() {\n this.selection.clearSelection();\n };\n this.moveCursorTo = function(row, column) {\n this.selection.moveCursorTo(row, column);\n };\n this.moveCursorToPosition = function(pos) {\n this.selection.moveCursorToPosition(pos);\n };\n this.jumpToMatching = function(select, expand) {\n var cursor = this.getCursorPosition();\n var iterator = new TokenIterator(this.session, cursor.row, cursor.column);\n var prevToken = iterator.getCurrentToken();\n var token = prevToken || iterator.stepForward();\n\n if (!token) return;\n var matchType;\n var found = false;\n var depth = {};\n var i = cursor.column - token.start;\n var bracketType;\n var brackets = {\n \")\": \"(\",\n \"(\": \"(\",\n \"]\": \"[\",\n \"[\": \"[\",\n \"{\": \"{\",\n \"}\": \"{\"\n };\n \n do {\n if (token.value.match(/[{}()\\[\\]]/g)) {\n for (; i < token.value.length && !found; i++) {\n if (!brackets[token.value[i]]) {\n continue;\n }\n\n bracketType = brackets[token.value[i]] + '.' + token.type.replace(\"rparen\", \"lparen\");\n\n if (isNaN(depth[bracketType])) {\n depth[bracketType] = 0;\n }\n\n switch (token.value[i]) {\n case '(':\n case '[':\n case '{':\n depth[bracketType]++;\n break;\n case ')':\n case ']':\n case '}':\n depth[bracketType]--;\n\n if (depth[bracketType] === -1) {\n matchType = 'bracket';\n found = true;\n }\n break;\n }\n }\n }\n else if (token && token.type.indexOf('tag-name') !== -1) {\n if (isNaN(depth[token.value])) {\n depth[token.value] = 0;\n }\n \n if (prevToken.value === '<') {\n depth[token.value]++;\n }\n else if (prevToken.value === '= 0; --i) {\n if(this.$tryReplace(ranges[i], replacement)) {\n replaced++;\n }\n }\n\n this.selection.setSelectionRange(selection);\n this.$blockScrolling -= 1;\n\n return replaced;\n };\n\n this.$tryReplace = function(range, replacement) {\n var input = this.session.getTextRange(range);\n replacement = this.$search.replace(input, replacement);\n if (replacement !== null) {\n range.end = this.session.replace(range, replacement);\n return range;\n } else {\n return null;\n }\n };\n this.getLastSearchOptions = function() {\n return this.$search.getOptions();\n };\n this.find = function(needle, options, animate) {\n if (!options)\n options = {};\n\n if (typeof needle == \"string\" || needle instanceof RegExp)\n options.needle = needle;\n else if (typeof needle == \"object\")\n oop.mixin(options, needle);\n\n var range = this.selection.getRange();\n if (options.needle == null) {\n needle = this.session.getTextRange(range)\n || this.$search.$options.needle;\n if (!needle) {\n range = this.session.getWordRange(range.start.row, range.start.column);\n needle = this.session.getTextRange(range);\n }\n this.$search.set({needle: needle});\n }\n\n this.$search.set(options);\n if (!options.start)\n this.$search.set({start: range});\n\n var newRange = this.$search.find(this.session);\n if (options.preventScroll)\n return newRange;\n if (newRange) {\n this.revealRange(newRange, animate);\n return newRange;\n }\n if (options.backwards)\n range.start = range.end;\n else\n range.end = range.start;\n this.selection.setRange(range);\n };\n this.findNext = function(options, animate) {\n this.find({skipCurrent: true, backwards: false}, options, animate);\n };\n this.findPrevious = function(options, animate) {\n this.find(options, {skipCurrent: true, backwards: true}, animate);\n };\n\n this.revealRange = function(range, animate) {\n this.$blockScrolling += 1;\n this.session.unfold(range);\n this.selection.setSelectionRange(range);\n this.$blockScrolling -= 1;\n\n var scrollTop = this.renderer.scrollTop;\n this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\n if (animate !== false)\n this.renderer.animateScrolling(scrollTop);\n };\n this.undo = function() {\n this.$blockScrolling++;\n this.session.getUndoManager().undo();\n this.$blockScrolling--;\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.redo = function() {\n this.$blockScrolling++;\n this.session.getUndoManager().redo();\n this.$blockScrolling--;\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.destroy = function() {\n this.renderer.destroy();\n this._signal(\"destroy\", this);\n if (this.session) {\n this.session.destroy();\n }\n };\n this.setAutoScrollEditorIntoView = function(enable) {\n if (!enable)\n return;\n var rect;\n var self = this;\n var shouldScroll = false;\n if (!this.$scrollAnchor)\n this.$scrollAnchor = document.createElement(\"div\");\n var scrollAnchor = this.$scrollAnchor;\n scrollAnchor.style.cssText = \"position:absolute\";\n this.container.insertBefore(scrollAnchor, this.container.firstChild);\n var onChangeSelection = this.on(\"changeSelection\", function() {\n shouldScroll = true;\n });\n var onBeforeRender = this.renderer.on(\"beforeRender\", function() {\n if (shouldScroll)\n rect = self.renderer.container.getBoundingClientRect();\n });\n var onAfterRender = this.renderer.on(\"afterRender\", function() {\n if (shouldScroll && rect && (self.isFocused()\n || self.searchBox && self.searchBox.isFocused())\n ) {\n var renderer = self.renderer;\n var pos = renderer.$cursorLayer.$pixelPos;\n var config = renderer.layerConfig;\n var top = pos.top - config.offset;\n if (pos.top >= 0 && top + rect.top < 0) {\n shouldScroll = true;\n } else if (pos.top < config.height &&\n pos.top + rect.top + config.lineHeight > window.innerHeight) {\n shouldScroll = false;\n } else {\n shouldScroll = null;\n }\n if (shouldScroll != null) {\n scrollAnchor.style.top = top + \"px\";\n scrollAnchor.style.left = pos.left + \"px\";\n scrollAnchor.style.height = config.lineHeight + \"px\";\n scrollAnchor.scrollIntoView(shouldScroll);\n }\n shouldScroll = rect = null;\n }\n });\n this.setAutoScrollEditorIntoView = function(enable) {\n if (enable)\n return;\n delete this.setAutoScrollEditorIntoView;\n this.off(\"changeSelection\", onChangeSelection);\n this.renderer.off(\"afterRender\", onAfterRender);\n this.renderer.off(\"beforeRender\", onBeforeRender);\n };\n };\n\n\n this.$resetCursorStyle = function() {\n var style = this.$cursorStyle || \"ace\";\n var cursorLayer = this.renderer.$cursorLayer;\n if (!cursorLayer)\n return;\n cursorLayer.setSmoothBlinking(/smooth/.test(style));\n cursorLayer.isBlinking = !this.$readOnly && style != \"wide\";\n dom.setCssClass(cursorLayer.element, \"ace_slim-cursors\", /slim/.test(style));\n };\n\n}).call(Editor.prototype);\n\n\n\nconfig.defineOptions(Editor.prototype, \"editor\", {\n selectionStyle: {\n set: function(style) {\n this.onSelectionChange();\n this._signal(\"changeSelectionStyle\", {data: style});\n },\n initialValue: \"line\"\n },\n highlightActiveLine: {\n set: function() {this.$updateHighlightActiveLine();},\n initialValue: true\n },\n highlightSelectedWord: {\n set: function(shouldHighlight) {this.$onSelectionChange();},\n initialValue: true\n },\n readOnly: {\n set: function(readOnly) {\n this.$resetCursorStyle(); \n },\n initialValue: false\n },\n cursorStyle: {\n set: function(val) { this.$resetCursorStyle(); },\n values: [\"ace\", \"slim\", \"smooth\", \"wide\"],\n initialValue: \"ace\"\n },\n mergeUndoDeltas: {\n values: [false, true, \"always\"],\n initialValue: true\n },\n behavioursEnabled: {initialValue: true},\n wrapBehavioursEnabled: {initialValue: true},\n autoScrollEditorIntoView: {\n set: function(val) {this.setAutoScrollEditorIntoView(val);}\n },\n keyboardHandler: {\n set: function(val) { this.setKeyboardHandler(val); },\n get: function() { return this.keybindingId; },\n handlesSet: true\n },\n\n hScrollBarAlwaysVisible: \"renderer\",\n vScrollBarAlwaysVisible: \"renderer\",\n highlightGutterLine: \"renderer\",\n animatedScroll: \"renderer\",\n showInvisibles: \"renderer\",\n showPrintMargin: \"renderer\",\n printMarginColumn: \"renderer\",\n printMargin: \"renderer\",\n fadeFoldWidgets: \"renderer\",\n showFoldWidgets: \"renderer\",\n showLineNumbers: \"renderer\",\n showGutter: \"renderer\",\n displayIndentGuides: \"renderer\",\n fontSize: \"renderer\",\n fontFamily: \"renderer\",\n maxLines: \"renderer\",\n minLines: \"renderer\",\n scrollPastEnd: \"renderer\",\n fixedWidthGutter: \"renderer\",\n theme: \"renderer\",\n\n scrollSpeed: \"$mouseHandler\",\n dragDelay: \"$mouseHandler\",\n dragEnabled: \"$mouseHandler\",\n focusTimout: \"$mouseHandler\",\n tooltipFollowsMouse: \"$mouseHandler\",\n\n firstLineNumber: \"session\",\n overwrite: \"session\",\n newLineMode: \"session\",\n useWorker: \"session\",\n useSoftTabs: \"session\",\n tabSize: \"session\",\n wrap: \"session\",\n indentedSoftWrap: \"session\",\n foldStyle: \"session\",\n mode: \"session\"\n});\n\nexports.Editor = Editor;\n});\n\nace.define(\"ace/undomanager\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nvar UndoManager = function() {\n this.reset();\n};\n\n(function() {\n this.execute = function(options) {\n var deltaSets = options.args[0];\n this.$doc = options.args[1];\n if (options.merge && this.hasUndo()){\n this.dirtyCounter--;\n deltaSets = this.$undoStack.pop().concat(deltaSets);\n }\n this.$undoStack.push(deltaSets);\n this.$redoStack = [];\n if (this.dirtyCounter < 0) {\n this.dirtyCounter = NaN;\n }\n this.dirtyCounter++;\n };\n this.undo = function(dontSelect) {\n var deltaSets = this.$undoStack.pop();\n var undoSelectionRange = null;\n if (deltaSets) {\n undoSelectionRange = this.$doc.undoChanges(deltaSets, dontSelect);\n this.$redoStack.push(deltaSets);\n this.dirtyCounter--;\n }\n\n return undoSelectionRange;\n };\n this.redo = function(dontSelect) {\n var deltaSets = this.$redoStack.pop();\n var redoSelectionRange = null;\n if (deltaSets) {\n redoSelectionRange =\n this.$doc.redoChanges(this.$deserializeDeltas(deltaSets), dontSelect);\n this.$undoStack.push(deltaSets);\n this.dirtyCounter++;\n }\n return redoSelectionRange;\n };\n this.reset = function() {\n this.$undoStack = [];\n this.$redoStack = [];\n this.dirtyCounter = 0;\n };\n this.hasUndo = function() {\n return this.$undoStack.length > 0;\n };\n this.hasRedo = function() {\n return this.$redoStack.length > 0;\n };\n this.markClean = function() {\n this.dirtyCounter = 0;\n };\n this.isClean = function() {\n return this.dirtyCounter === 0;\n };\n this.$serializeDeltas = function(deltaSets) {\n return cloneDeltaSetsObj(deltaSets, $serializeDelta);\n };\n this.$deserializeDeltas = function(deltaSets) {\n return cloneDeltaSetsObj(deltaSets, $deserializeDelta);\n };\n \n function $serializeDelta(delta){\n return {\n action: delta.action,\n start: delta.start,\n end: delta.end,\n lines: delta.lines.length == 1 ? null : delta.lines,\n text: delta.lines.length == 1 ? delta.lines[0] : null\n };\n }\n \n function $deserializeDelta(delta) {\n return {\n action: delta.action,\n start: delta.start,\n end: delta.end,\n lines: delta.lines || [delta.text]\n };\n }\n \n function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) {\n var deltaSets_new = new Array(deltaSets_old.length);\n for (var i = 0; i < deltaSets_old.length; i++) {\n var deltaSet_old = deltaSets_old[i];\n var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)};\n \n for (var j = 0; j < deltaSet_old.deltas.length; j++) {\n var delta_old = deltaSet_old.deltas[j];\n deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old);\n }\n \n deltaSets_new[i] = deltaSet_new;\n }\n return deltaSets_new;\n }\n \n}).call(UndoManager.prototype);\n\nexports.UndoManager = UndoManager;\n});\n\nace.define(\"ace/layer/gutter\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar oop = acequire(\"../lib/oop\");\nvar lang = acequire(\"../lib/lang\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar Gutter = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_gutter-layer\";\n parentEl.appendChild(this.element);\n this.setShowFoldWidgets(this.$showFoldWidgets);\n \n this.gutterWidth = 0;\n\n this.$annotations = [];\n this.$updateAnnotations = this.$updateAnnotations.bind(this);\n\n this.$cells = [];\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.setSession = function(session) {\n if (this.session)\n this.session.removeEventListener(\"change\", this.$updateAnnotations);\n this.session = session;\n if (session)\n session.on(\"change\", this.$updateAnnotations);\n };\n\n this.addGutterDecoration = function(row, className){\n if (window.console)\n console.warn && console.warn(\"deprecated use session.addGutterDecoration\");\n this.session.addGutterDecoration(row, className);\n };\n\n this.removeGutterDecoration = function(row, className){\n if (window.console)\n console.warn && console.warn(\"deprecated use session.removeGutterDecoration\");\n this.session.removeGutterDecoration(row, className);\n };\n\n this.setAnnotations = function(annotations) {\n this.$annotations = [];\n for (var i = 0; i < annotations.length; i++) {\n var annotation = annotations[i];\n var row = annotation.row;\n var rowInfo = this.$annotations[row];\n if (!rowInfo)\n rowInfo = this.$annotations[row] = {text: []};\n \n var annoText = annotation.text;\n annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || \"\";\n\n if (rowInfo.text.indexOf(annoText) === -1)\n rowInfo.text.push(annoText);\n\n var type = annotation.type;\n if (type == \"error\")\n rowInfo.className = \" ace_error\";\n else if (type == \"warning\" && rowInfo.className != \" ace_error\")\n rowInfo.className = \" ace_warning\";\n else if (type == \"info\" && (!rowInfo.className))\n rowInfo.className = \" ace_info\";\n }\n };\n\n this.$updateAnnotations = function (delta) {\n if (!this.$annotations.length)\n return;\n var firstRow = delta.start.row;\n var len = delta.end.row - firstRow;\n if (len === 0) {\n } else if (delta.action == 'remove') {\n this.$annotations.splice(firstRow, len + 1, null);\n } else {\n var args = new Array(len + 1);\n args.unshift(firstRow, 1);\n this.$annotations.splice.apply(this.$annotations, args);\n }\n };\n\n this.update = function(config) {\n var session = this.session;\n var firstRow = config.firstRow;\n var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar\n session.getLength() - 1);\n var fold = session.getNextFoldLine(firstRow);\n var foldStart = fold ? fold.start.row : Infinity;\n var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\n var breakpoints = session.$breakpoints;\n var decorations = session.$decorations;\n var firstLineNumber = session.$firstLineNumber;\n var lastLineNumber = 0;\n \n var gutterRenderer = session.gutterRenderer || this.$renderer;\n\n var cell = null;\n var index = -1;\n var row = firstRow;\n while (true) {\n if (row > foldStart) {\n row = fold.end.row + 1;\n fold = session.getNextFoldLine(row, fold);\n foldStart = fold ? fold.start.row : Infinity;\n }\n if (row > lastRow) {\n while (this.$cells.length > index + 1) {\n cell = this.$cells.pop();\n this.element.removeChild(cell.element);\n }\n break;\n }\n\n cell = this.$cells[++index];\n if (!cell) {\n cell = {element: null, textNode: null, foldWidget: null};\n cell.element = dom.createElement(\"div\");\n cell.textNode = document.createTextNode('');\n cell.element.appendChild(cell.textNode);\n this.element.appendChild(cell.element);\n this.$cells[index] = cell;\n }\n\n var className = \"ace_gutter-cell \";\n if (breakpoints[row])\n className += breakpoints[row];\n if (decorations[row])\n className += decorations[row];\n if (this.$annotations[row])\n className += this.$annotations[row].className;\n if (cell.element.className != className)\n cell.element.className = className;\n\n var height = session.getRowLength(row) * config.lineHeight + \"px\";\n if (height != cell.element.style.height)\n cell.element.style.height = height;\n\n if (foldWidgets) {\n var c = foldWidgets[row];\n if (c == null)\n c = foldWidgets[row] = session.getFoldWidget(row);\n }\n\n if (c) {\n if (!cell.foldWidget) {\n cell.foldWidget = dom.createElement(\"span\");\n cell.element.appendChild(cell.foldWidget);\n }\n var className = \"ace_fold-widget ace_\" + c;\n if (c == \"start\" && row == foldStart && row < fold.end.row)\n className += \" ace_closed\";\n else\n className += \" ace_open\";\n if (cell.foldWidget.className != className)\n cell.foldWidget.className = className;\n\n var height = config.lineHeight + \"px\";\n if (cell.foldWidget.style.height != height)\n cell.foldWidget.style.height = height;\n } else {\n if (cell.foldWidget) {\n cell.element.removeChild(cell.foldWidget);\n cell.foldWidget = null;\n }\n }\n \n var text = lastLineNumber = gutterRenderer\n ? gutterRenderer.getText(session, row)\n : row + firstLineNumber;\n if (text !== cell.textNode.data)\n cell.textNode.data = text;\n\n row++;\n }\n\n this.element.style.height = config.minHeight + \"px\";\n\n if (this.$fixedWidth || session.$useWrapMode)\n lastLineNumber = session.getLength() + firstLineNumber;\n\n var gutterWidth = gutterRenderer \n ? gutterRenderer.getWidth(session, lastLineNumber, config)\n : lastLineNumber.toString().length * config.characterWidth;\n \n var padding = this.$padding || this.$computePadding();\n gutterWidth += padding.left + padding.right;\n if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\n this.gutterWidth = gutterWidth;\n this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n this._emit(\"changeGutterWidth\", gutterWidth);\n }\n };\n\n this.$fixedWidth = false;\n \n this.$showLineNumbers = true;\n this.$renderer = \"\";\n this.setShowLineNumbers = function(show) {\n this.$renderer = !show && {\n getWidth: function() {return \"\";},\n getText: function() {return \"\";}\n };\n };\n \n this.getShowLineNumbers = function() {\n return this.$showLineNumbers;\n };\n \n this.$showFoldWidgets = true;\n this.setShowFoldWidgets = function(show) {\n if (show)\n dom.addCssClass(this.element, \"ace_folding-enabled\");\n else\n dom.removeCssClass(this.element, \"ace_folding-enabled\");\n\n this.$showFoldWidgets = show;\n this.$padding = null;\n };\n \n this.getShowFoldWidgets = function() {\n return this.$showFoldWidgets;\n };\n\n this.$computePadding = function() {\n if (!this.element.firstChild)\n return {left: 0, right: 0};\n var style = dom.computedStyle(this.element.firstChild);\n this.$padding = {};\n this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;\n this.$padding.right = parseInt(style.paddingRight) || 0;\n return this.$padding;\n };\n\n this.getRegion = function(point) {\n var padding = this.$padding || this.$computePadding();\n var rect = this.element.getBoundingClientRect();\n if (point.x < padding.left + rect.left)\n return \"markers\";\n if (this.$showFoldWidgets && point.x > rect.right - padding.right)\n return \"foldWidgets\";\n };\n\n}).call(Gutter.prototype);\n\nexports.Gutter = Gutter;\n\n});\n\nace.define(\"ace/layer/marker\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar dom = acequire(\"../lib/dom\");\n\nvar Marker = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_marker-layer\";\n parentEl.appendChild(this.element);\n};\n\n(function() {\n\n this.$padding = 0;\n\n this.setPadding = function(padding) {\n this.$padding = padding;\n };\n this.setSession = function(session) {\n this.session = session;\n };\n \n this.setMarkers = function(markers) {\n this.markers = markers;\n };\n\n this.update = function(config) {\n if (!config) return;\n\n this.config = config;\n\n\n var html = [];\n for (var key in this.markers) {\n var marker = this.markers[key];\n\n if (!marker.range) {\n marker.update(html, this, this.session, config);\n continue;\n }\n\n var range = marker.range.clipRows(config.firstRow, config.lastRow);\n if (range.isEmpty()) continue;\n\n range = range.toScreenRange(this.session);\n if (marker.renderer) {\n var top = this.$getTop(range.start.row, config);\n var left = this.$padding + (this.session.$bidiHandler.isBidiRow(range.start.row)\n ? this.session.$bidiHandler.getPosLeft(range.start.column)\n : range.start.column * config.characterWidth);\n marker.renderer(html, range, left, top, config);\n } else if (marker.type == \"fullLine\") {\n this.drawFullLineMarker(html, range, marker.clazz, config);\n } else if (marker.type == \"screenLine\") {\n this.drawScreenLineMarker(html, range, marker.clazz, config);\n } else if (range.isMultiLine()) {\n if (marker.type == \"text\")\n this.drawTextMarker(html, range, marker.clazz, config);\n else\n this.drawMultiLineMarker(html, range, marker.clazz, config);\n } else {\n if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\n this.drawBidiSingleLineMarker(html, range, marker.clazz + \" ace_start\" + \" ace_br15\", config);\n } else {\n this.drawSingleLineMarker(html, range, marker.clazz + \" ace_start\" + \" ace_br15\", config);\n }\n }\n }\n this.element.innerHTML = html.join(\"\");\n };\n\n this.$getTop = function(row, layerConfig) {\n return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n };\n\n function getBorderClass(tl, tr, br, bl) {\n return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0);\n }\n this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {\n var session = this.session;\n var start = range.start.row;\n var end = range.end.row;\n var row = start;\n var prev = 0; \n var curr = 0;\n var next = session.getScreenLastRowColumn(row);\n var clazzModified = null;\n var lineRange = new Range(row, range.start.column, row, curr);\n for (; row <= end; row++) {\n lineRange.start.row = lineRange.end.row = row;\n lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row);\n lineRange.end.column = next;\n prev = curr;\n curr = next;\n next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column;\n clazzModified = clazz + (row == start ? \" ace_start\" : \"\") + \" ace_br\"\n + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end);\n\n if (this.session.$bidiHandler.isBidiRow(row)) {\n this.drawBidiSingleLineMarker(stringBuilder, lineRange, clazzModified,\n layerConfig, row == end ? 0 : 1, extraStyle);\n } else {\n this.drawSingleLineMarker(stringBuilder, lineRange, clazzModified,\n layerConfig, row == end ? 0 : 1, extraStyle);\n }\n }\n };\n this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var padding = this.$padding;\n var height, top, left;\n extraStyle = extraStyle || \"\";\n if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\n var range1 = range.clone();\n range1.end.row = range1.start.row;\n range1.end.column = this.session.getLine(range1.start.row).length;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br1 ace_start\", config, null, extraStyle);\n } else {\n height = config.lineHeight;\n top = this.$getTop(range.start.row, config);\n left = padding + range.start.column * config.characterWidth;\n stringBuilder.push(\n \"
\"\n );\n }\n if (this.session.$bidiHandler.isBidiRow(range.end.row)) {\n var range1 = range.clone();\n range1.start.row = range1.end.row;\n range1.start.column = 0;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br12\", config, null, extraStyle);\n } else {\n var width = range.end.column * config.characterWidth;\n height = config.lineHeight;\n top = this.$getTop(range.end.row, config);\n stringBuilder.push(\n \"
\"\n );\n }\n height = (range.end.row - range.start.row - 1) * config.lineHeight;\n if (height <= 0)\n return;\n top = this.$getTop(range.start.row + 1, config);\n \n var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8);\n\n stringBuilder.push(\n \"
\"\n );\n };\n this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n var height = config.lineHeight;\n var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;\n\n var top = this.$getTop(range.start.row, config);\n var left = this.$padding + range.start.column * config.characterWidth;\n\n stringBuilder.push(\n \"
\"\n );\n };\n this.drawBidiSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n var height = config.lineHeight, top = this.$getTop(range.start.row, config), padding = this.$padding;\n var selections = this.session.$bidiHandler.getSelections(range.start.column, range.end.column);\n\n selections.forEach(function(selection) {\n stringBuilder.push(\n \"
\"\n );\n });\n };\n\n this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var top = this.$getTop(range.start.row, config);\n var height = config.lineHeight;\n if (range.start.row != range.end.row)\n height += this.$getTop(range.end.row, config) - top;\n\n stringBuilder.push(\n \"
\"\n );\n };\n \n this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var top = this.$getTop(range.start.row, config);\n var height = config.lineHeight;\n\n stringBuilder.push(\n \"
\"\n );\n };\n\n}).call(Marker.prototype);\n\nexports.Marker = Marker;\n\n});\n\nace.define(\"ace/layer/text\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar useragent = acequire(\"../lib/useragent\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar Text = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_text-layer\";\n parentEl.appendChild(this.element);\n this.$updateEolChar = this.$updateEolChar.bind(this);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.EOF_CHAR = \"\\xB6\";\n this.EOL_CHAR_LF = \"\\xAC\";\n this.EOL_CHAR_CRLF = \"\\xa4\";\n this.EOL_CHAR = this.EOL_CHAR_LF;\n this.TAB_CHAR = \"\\u2014\"; //\"\\u21E5\";\n this.SPACE_CHAR = \"\\xB7\";\n this.$padding = 0;\n\n this.$updateEolChar = function() {\n var EOL_CHAR = this.session.doc.getNewLineCharacter() == \"\\n\"\n ? this.EOL_CHAR_LF\n : this.EOL_CHAR_CRLF;\n if (this.EOL_CHAR != EOL_CHAR) {\n this.EOL_CHAR = EOL_CHAR;\n return true;\n }\n };\n\n this.setPadding = function(padding) {\n this.$padding = padding;\n this.element.style.padding = \"0 \" + padding + \"px\";\n };\n\n this.getLineHeight = function() {\n return this.$fontMetrics.$characterSize.height || 0;\n };\n\n this.getCharacterWidth = function() {\n return this.$fontMetrics.$characterSize.width || 0;\n };\n \n this.$setFontMetrics = function(measure) {\n this.$fontMetrics = measure;\n this.$fontMetrics.on(\"changeCharacterSize\", function(e) {\n this._signal(\"changeCharacterSize\", e);\n }.bind(this));\n this.$pollSizeChanges();\n };\n\n this.checkForSizeChanges = function() {\n this.$fontMetrics.checkForSizeChanges();\n };\n this.$pollSizeChanges = function() {\n return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();\n };\n this.setSession = function(session) {\n this.session = session;\n if (session)\n this.$computeTabString();\n };\n\n this.showInvisibles = false;\n this.setShowInvisibles = function(showInvisibles) {\n if (this.showInvisibles == showInvisibles)\n return false;\n\n this.showInvisibles = showInvisibles;\n this.$computeTabString();\n return true;\n };\n\n this.displayIndentGuides = true;\n this.setDisplayIndentGuides = function(display) {\n if (this.displayIndentGuides == display)\n return false;\n\n this.displayIndentGuides = display;\n this.$computeTabString();\n return true;\n };\n\n this.$tabStrings = [];\n this.onChangeTabSize =\n this.$computeTabString = function() {\n var tabSize = this.session.getTabSize();\n this.tabSize = tabSize;\n var tabStr = this.$tabStrings = [0];\n for (var i = 1; i < tabSize + 1; i++) {\n if (this.showInvisibles) {\n tabStr.push(\"\"\n + lang.stringRepeat(this.TAB_CHAR, i)\n + \"\");\n } else {\n tabStr.push(lang.stringRepeat(\" \", i));\n }\n }\n if (this.displayIndentGuides) {\n this.$indentGuideRe = /\\s\\S| \\t|\\t |\\s$/;\n var className = \"ace_indent-guide\";\n var spaceClass = \"\";\n var tabClass = \"\";\n if (this.showInvisibles) {\n className += \" ace_invisible\";\n spaceClass = \" ace_invisible_space\";\n tabClass = \" ace_invisible_tab\";\n var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);\n var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize);\n } else{\n var spaceContent = lang.stringRepeat(\" \", this.tabSize);\n var tabContent = spaceContent;\n }\n\n this.$tabStrings[\" \"] = \"\" + spaceContent + \"\";\n this.$tabStrings[\"\\t\"] = \"\" + tabContent + \"\";\n }\n };\n\n this.updateLines = function(config, firstRow, lastRow) {\n if (this.config.lastRow != config.lastRow ||\n this.config.firstRow != config.firstRow) {\n this.scrollLines(config);\n }\n this.config = config;\n\n var first = Math.max(firstRow, config.firstRow);\n var last = Math.min(lastRow, config.lastRow);\n\n var lineElements = this.element.childNodes;\n var lineElementsIdx = 0;\n\n for (var row = config.firstRow; row < first; row++) {\n var foldLine = this.session.getFoldLine(row);\n if (foldLine) {\n if (foldLine.containsRow(first)) {\n first = foldLine.start.row;\n break;\n } else {\n row = foldLine.end.row;\n }\n }\n lineElementsIdx ++;\n }\n\n var row = first;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row :Infinity;\n }\n if (row > last)\n break;\n\n var lineElement = lineElements[lineElementsIdx++];\n if (lineElement) {\n var html = [];\n this.$renderLine(\n html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false\n );\n lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n lineElement.innerHTML = html.join(\"\");\n }\n row++;\n }\n };\n\n this.scrollLines = function(config) {\n var oldConfig = this.config;\n this.config = config;\n\n if (!oldConfig || oldConfig.lastRow < config.firstRow)\n return this.update(config);\n\n if (config.lastRow < oldConfig.firstRow)\n return this.update(config);\n\n var el = this.element;\n if (oldConfig.firstRow < config.firstRow)\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n el.removeChild(el.firstChild);\n\n if (oldConfig.lastRow > config.lastRow)\n for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n el.removeChild(el.lastChild);\n\n if (config.firstRow < oldConfig.firstRow) {\n var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);\n if (el.firstChild)\n el.insertBefore(fragment, el.firstChild);\n else\n el.appendChild(fragment);\n }\n\n if (config.lastRow > oldConfig.lastRow) {\n var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);\n el.appendChild(fragment);\n }\n };\n\n this.$renderLinesFragment = function(config, firstRow, lastRow) {\n var fragment = this.element.ownerDocument.createDocumentFragment();\n var row = firstRow;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n if (row > lastRow)\n break;\n\n var container = dom.createElement(\"div\");\n\n var html = [];\n this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n container.innerHTML = html.join(\"\");\n if (this.$useLineGroups()) {\n container.className = 'ace_line_group';\n fragment.appendChild(container);\n container.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n\n } else {\n while(container.firstChild)\n fragment.appendChild(container.firstChild);\n }\n\n row++;\n }\n return fragment;\n };\n\n this.update = function(config) {\n this.config = config;\n\n var html = [];\n var firstRow = config.firstRow, lastRow = config.lastRow;\n\n var row = firstRow;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row :Infinity;\n }\n if (row > lastRow)\n break;\n\n if (this.$useLineGroups())\n html.push(\"
\");\n\n this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n\n if (this.$useLineGroups())\n html.push(\"
\"); // end the line group\n\n row++;\n }\n this.element.innerHTML = html.join(\"\");\n };\n\n this.$textToken = {\n \"text\": true,\n \"rparen\": true,\n \"lparen\": true\n };\n\n this.$renderToken = function(stringBuilder, screenColumn, token, value) {\n var self = this;\n var replaceReg = /\\t|&|<|>|( +)|([\\x00-\\x1f\\x80-\\xa0\\xad\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF\\uFFF9-\\uFFFC])|[\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3000-\\u303E\\u3041-\\u3096\\u3099-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u3190-\\u31BA\\u31C0-\\u31E3\\u31F0-\\u321E\\u3220-\\u3247\\u3250-\\u32FE\\u3300-\\u4DBF\\u4E00-\\uA48C\\uA490-\\uA4C6\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF60\\uFFE0-\\uFFE6]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n var replaceFunc = function(c, a, b, tabIdx, idx4) {\n if (a) {\n return self.showInvisibles\n ? \"\" + lang.stringRepeat(self.SPACE_CHAR, c.length) + \"\"\n : c;\n } else if (c == \"&\") {\n return \"&\";\n } else if (c == \"<\") {\n return \"<\";\n } else if (c == \">\") {\n return \">\";\n } else if (c == \"\\t\") {\n var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);\n screenColumn += tabSize - 1;\n return self.$tabStrings[tabSize];\n } else if (c == \"\\u3000\") {\n var classToUse = self.showInvisibles ? \"ace_cjk ace_invisible ace_invisible_space\" : \"ace_cjk\";\n var space = self.showInvisibles ? self.SPACE_CHAR : \"\";\n screenColumn += 1;\n return \"\" + space + \"\";\n } else if (b) {\n return \"\" + self.SPACE_CHAR + \"\";\n } else {\n screenColumn += 1;\n return \"\" + c + \"\";\n }\n };\n\n var output = value.replace(replaceReg, replaceFunc);\n\n if (!this.$textToken[token.type]) {\n var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n var style = \"\";\n if (token.type == \"fold\")\n style = \" style='width:\" + (token.value.length * this.config.characterWidth) + \"px;' \";\n stringBuilder.push(\"\", output, \"\");\n }\n else {\n stringBuilder.push(output);\n }\n return screenColumn + value.length;\n };\n\n this.renderIndentGuide = function(stringBuilder, value, max) {\n var cols = value.search(this.$indentGuideRe);\n if (cols <= 0 || cols >= max)\n return value;\n if (value[0] == \" \") {\n cols -= cols % this.tabSize;\n stringBuilder.push(lang.stringRepeat(this.$tabStrings[\" \"], cols/this.tabSize));\n return value.substr(cols);\n } else if (value[0] == \"\\t\") {\n stringBuilder.push(lang.stringRepeat(this.$tabStrings[\"\\t\"], cols));\n return value.substr(cols);\n }\n return value;\n };\n\n this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {\n var chars = 0;\n var split = 0;\n var splitChars = splits[0];\n var screenColumn = 0;\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n var value = token.value;\n if (i == 0 && this.displayIndentGuides) {\n chars = value.length;\n value = this.renderIndentGuide(stringBuilder, value, splitChars);\n if (!value)\n continue;\n chars -= value.length;\n }\n\n if (chars + value.length < splitChars) {\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n chars += value.length;\n } else {\n while (chars + value.length >= splitChars) {\n screenColumn = this.$renderToken(\n stringBuilder, screenColumn,\n token, value.substring(0, splitChars - chars)\n );\n value = value.substring(splitChars - chars);\n chars = splitChars;\n\n if (!onlyContents) {\n stringBuilder.push(\"\",\n \"
\"\n );\n }\n\n stringBuilder.push(lang.stringRepeat(\"\\xa0\", splits.indent));\n\n split ++;\n screenColumn = 0;\n splitChars = splits[split] || Number.MAX_VALUE;\n }\n if (value.length != 0) {\n chars += value.length;\n screenColumn = this.$renderToken(\n stringBuilder, screenColumn, token, value\n );\n }\n }\n }\n };\n\n this.$renderSimpleLine = function(stringBuilder, tokens) {\n var screenColumn = 0;\n var token = tokens[0];\n var value = token.value;\n if (this.displayIndentGuides)\n value = this.renderIndentGuide(stringBuilder, value);\n if (value)\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n for (var i = 1; i < tokens.length; i++) {\n token = tokens[i];\n value = token.value;\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n }\n };\n this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {\n if (!foldLine && foldLine != false)\n foldLine = this.session.getFoldLine(row);\n\n if (foldLine)\n var tokens = this.$getFoldLineTokens(row, foldLine);\n else\n var tokens = this.session.getTokens(row);\n\n\n if (!onlyContents) {\n stringBuilder.push(\n \"
\"\n );\n }\n\n if (tokens.length) {\n var splits = this.session.getRowSplitData(row);\n if (splits && splits.length)\n this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);\n else\n this.$renderSimpleLine(stringBuilder, tokens);\n }\n\n if (this.showInvisibles) {\n if (foldLine)\n row = foldLine.end.row;\n\n stringBuilder.push(\n \"\",\n row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,\n \"\"\n );\n }\n if (!onlyContents)\n stringBuilder.push(\"
\");\n };\n\n this.$getFoldLineTokens = function(row, foldLine) {\n var session = this.session;\n var renderTokens = [];\n\n function addTokens(tokens, from, to) {\n var idx = 0, col = 0;\n while ((col + tokens[idx].value.length) < from) {\n col += tokens[idx].value.length;\n idx++;\n\n if (idx == tokens.length)\n return;\n }\n if (col != from) {\n var value = tokens[idx].value.substring(from - col);\n if (value.length > (to - from))\n value = value.substring(0, to - from);\n\n renderTokens.push({\n type: tokens[idx].type,\n value: value\n });\n\n col = from + value.length;\n idx += 1;\n }\n\n while (col < to && idx < tokens.length) {\n var value = tokens[idx].value;\n if (value.length + col > to) {\n renderTokens.push({\n type: tokens[idx].type,\n value: value.substring(0, to - col)\n });\n } else\n renderTokens.push(tokens[idx]);\n col += value.length;\n idx += 1;\n }\n }\n\n var tokens = session.getTokens(row);\n foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\n if (placeholder != null) {\n renderTokens.push({\n type: \"fold\",\n value: placeholder\n });\n } else {\n if (isNewRow)\n tokens = session.getTokens(row);\n\n if (tokens.length)\n addTokens(tokens, lastColumn, column);\n }\n }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\n\n return renderTokens;\n };\n\n this.$useLineGroups = function() {\n return this.session.getUseWrapMode();\n };\n\n this.destroy = function() {\n clearInterval(this.$pollSizeChangesTimer);\n if (this.$measureNode)\n this.$measureNode.parentNode.removeChild(this.$measureNode);\n delete this.$measureNode;\n };\n\n}).call(Text.prototype);\n\nexports.Text = Text;\n\n});\n\nace.define(\"ace/layer/cursor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar isIE8;\n\nvar Cursor = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_cursor-layer\";\n parentEl.appendChild(this.element);\n \n if (isIE8 === undefined)\n isIE8 = !(\"opacity\" in this.element.style);\n\n this.isVisible = false;\n this.isBlinking = true;\n this.blinkInterval = 1000;\n this.smoothBlinking = false;\n\n this.cursors = [];\n this.cursor = this.addCursor();\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.$updateCursors = (isIE8\n ? this.$updateVisibility\n : this.$updateOpacity).bind(this);\n};\n\n(function() {\n \n this.$updateVisibility = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.visibility = val ? \"\" : \"hidden\";\n };\n this.$updateOpacity = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.opacity = val ? \"\" : \"0\";\n };\n \n\n this.$padding = 0;\n this.setPadding = function(padding) {\n this.$padding = padding;\n };\n\n this.setSession = function(session) {\n this.session = session;\n };\n\n this.setBlinking = function(blinking) {\n if (blinking != this.isBlinking){\n this.isBlinking = blinking;\n this.restartTimer();\n }\n };\n\n this.setBlinkInterval = function(blinkInterval) {\n if (blinkInterval != this.blinkInterval){\n this.blinkInterval = blinkInterval;\n this.restartTimer();\n }\n };\n\n this.setSmoothBlinking = function(smoothBlinking) {\n if (smoothBlinking != this.smoothBlinking && !isIE8) {\n this.smoothBlinking = smoothBlinking;\n dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n this.$updateCursors(true);\n this.$updateCursors = (this.$updateOpacity).bind(this);\n this.restartTimer();\n }\n };\n\n this.addCursor = function() {\n var el = dom.createElement(\"div\");\n el.className = \"ace_cursor\";\n this.element.appendChild(el);\n this.cursors.push(el);\n return el;\n };\n\n this.removeCursor = function() {\n if (this.cursors.length > 1) {\n var el = this.cursors.pop();\n el.parentNode.removeChild(el);\n return el;\n }\n };\n\n this.hideCursor = function() {\n this.isVisible = false;\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.showCursor = function() {\n this.isVisible = true;\n dom.removeCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.restartTimer = function() {\n var update = this.$updateCursors;\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n if (this.smoothBlinking) {\n dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n }\n \n update(true);\n\n if (!this.isBlinking || !this.blinkInterval || !this.isVisible)\n return;\n\n if (this.smoothBlinking) {\n setTimeout(function(){\n dom.addCssClass(this.element, \"ace_smooth-blinking\");\n }.bind(this));\n }\n \n var blink = function(){\n this.timeoutId = setTimeout(function() {\n update(false);\n }, 0.6 * this.blinkInterval);\n }.bind(this);\n\n this.intervalId = setInterval(function() {\n update(true);\n blink();\n }, this.blinkInterval);\n\n blink();\n };\n\n this.getPixelPosition = function(position, onScreen) {\n if (!this.config || !this.session)\n return {left : 0, top : 0};\n\n if (!position)\n position = this.session.selection.getCursor();\n var pos = this.session.documentToScreenPosition(position);\n var cursorLeft = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, position.row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : pos.column * this.config.characterWidth);\n\n var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *\n this.config.lineHeight;\n\n return {left : cursorLeft, top : cursorTop};\n };\n\n this.update = function(config) {\n this.config = config;\n\n var selections = this.session.$selectionMarkers;\n var i = 0, cursorIndex = 0;\n\n if (selections === undefined || selections.length === 0){\n selections = [{cursor: null}];\n }\n\n for (var i = 0, n = selections.length; i < n; i++) {\n var pixelPos = this.getPixelPosition(selections[i].cursor, true);\n if ((pixelPos.top > config.height + config.offset ||\n pixelPos.top < 0) && i > 1) {\n continue;\n }\n\n var style = (this.cursors[cursorIndex++] || this.addCursor()).style;\n \n if (!this.drawCursor) {\n style.left = pixelPos.left + \"px\";\n style.top = pixelPos.top + \"px\";\n style.width = config.characterWidth + \"px\";\n style.height = config.lineHeight + \"px\";\n } else {\n this.drawCursor(style, pixelPos, config, selections[i], this.session);\n }\n }\n while (this.cursors.length > cursorIndex)\n this.removeCursor();\n\n var overwrite = this.session.getOverwrite();\n this.$setOverwrite(overwrite);\n this.$pixelPos = pixelPos;\n this.restartTimer();\n };\n \n this.drawCursor = null;\n\n this.$setOverwrite = function(overwrite) {\n if (overwrite != this.overwrite) {\n this.overwrite = overwrite;\n if (overwrite)\n dom.addCssClass(this.element, \"ace_overwrite-cursors\");\n else\n dom.removeCssClass(this.element, \"ace_overwrite-cursors\");\n }\n };\n\n this.destroy = function() {\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n };\n\n}).call(Cursor.prototype);\n\nexports.Cursor = Cursor;\n\n});\n\nace.define(\"ace/scrollbar\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar event = acequire(\"./lib/event\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar MAX_SCROLL_H = 0x8000;\nvar ScrollBar = function(parent) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_scrollbar ace_scrollbar\" + this.classSuffix;\n\n this.inner = dom.createElement(\"div\");\n this.inner.className = \"ace_scrollbar-inner\";\n this.element.appendChild(this.inner);\n\n parent.appendChild(this.element);\n\n this.setVisible(false);\n this.skipEvent = false;\n\n event.addListener(this.element, \"scroll\", this.onScroll.bind(this));\n event.addListener(this.element, \"mousedown\", event.preventDefault);\n};\n\n(function() {\n oop.implement(this, EventEmitter);\n\n this.setVisible = function(isVisible) {\n this.element.style.display = isVisible ? \"\" : \"none\";\n this.isVisible = isVisible;\n this.coeff = 1;\n };\n}).call(ScrollBar.prototype);\nvar VScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollTop = 0;\n this.scrollHeight = 0;\n renderer.$scrollbarWidth = \n this.width = dom.scrollbarWidth(parent.ownerDocument);\n this.inner.style.width =\n this.element.style.width = (this.width || 15) + 5 + \"px\";\n this.$minWidth = 0;\n};\n\noop.inherits(VScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-v';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollTop = this.element.scrollTop;\n if (this.coeff != 1) {\n var h = this.element.clientHeight / this.scrollHeight;\n this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h);\n }\n this._emit(\"scroll\", {data: this.scrollTop});\n }\n this.skipEvent = false;\n };\n this.getWidth = function() {\n return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0);\n };\n this.setHeight = function(height) {\n this.element.style.height = height + \"px\";\n };\n this.setInnerHeight =\n this.setScrollHeight = function(height) {\n this.scrollHeight = height;\n if (height > MAX_SCROLL_H) {\n this.coeff = MAX_SCROLL_H / height;\n height = MAX_SCROLL_H;\n } else if (this.coeff != 1) {\n this.coeff = 1;\n }\n this.inner.style.height = height + \"px\";\n };\n this.setScrollTop = function(scrollTop) {\n if (this.scrollTop != scrollTop) {\n this.skipEvent = true;\n this.scrollTop = scrollTop;\n this.element.scrollTop = scrollTop * this.coeff;\n }\n };\n\n}).call(VScrollBar.prototype);\nvar HScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollLeft = 0;\n this.height = renderer.$scrollbarWidth;\n this.inner.style.height =\n this.element.style.height = (this.height || 15) + 5 + \"px\";\n};\n\noop.inherits(HScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-h';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollLeft = this.element.scrollLeft;\n this._emit(\"scroll\", {data: this.scrollLeft});\n }\n this.skipEvent = false;\n };\n this.getHeight = function() {\n return this.isVisible ? this.height : 0;\n };\n this.setWidth = function(width) {\n this.element.style.width = width + \"px\";\n };\n this.setInnerWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollLeft = function(scrollLeft) {\n if (this.scrollLeft != scrollLeft) {\n this.skipEvent = true;\n this.scrollLeft = this.element.scrollLeft = scrollLeft;\n }\n };\n\n}).call(HScrollBar.prototype);\n\n\nexports.ScrollBar = VScrollBar; // backward compatibility\nexports.ScrollBarV = VScrollBar; // backward compatibility\nexports.ScrollBarH = HScrollBar; // backward compatibility\n\nexports.VScrollBar = VScrollBar;\nexports.HScrollBar = HScrollBar;\n});\n\nace.define(\"ace/renderloop\",[\"require\",\"exports\",\"module\",\"ace/lib/event\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"./lib/event\");\n\n\nvar RenderLoop = function(onRender, win) {\n this.onRender = onRender;\n this.pending = false;\n this.changes = 0;\n this.window = win || window;\n};\n\n(function() {\n\n\n this.schedule = function(change) {\n this.changes = this.changes | change;\n if (!this.pending && this.changes) {\n this.pending = true;\n var _self = this;\n event.nextFrame(function() {\n _self.pending = false;\n var changes;\n while (changes = _self.changes) {\n _self.changes = 0;\n _self.onRender(changes);\n }\n }, this.window);\n }\n };\n\n}).call(RenderLoop.prototype);\n\nexports.RenderLoop = RenderLoop;\n});\n\nace.define(\"ace/layer/font_metrics\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\nvar oop = acequire(\"../lib/oop\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar useragent = acequire(\"../lib/useragent\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar CHAR_COUNT = 0;\n\nvar FontMetrics = exports.FontMetrics = function(parentEl) {\n this.el = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.el.style, true);\n \n this.$main = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$main.style);\n \n this.$measureNode = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$measureNode.style);\n \n \n this.el.appendChild(this.$main);\n this.el.appendChild(this.$measureNode);\n parentEl.appendChild(this.el);\n \n if (!CHAR_COUNT)\n this.$testFractionalRect();\n this.$measureNode.innerHTML = lang.stringRepeat(\"X\", CHAR_COUNT);\n \n this.$characterSize = {width: 0, height: 0};\n this.checkForSizeChanges();\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n \n this.$characterSize = {width: 0, height: 0};\n \n this.$testFractionalRect = function() {\n var el = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(el.style);\n el.style.width = \"0.2px\";\n document.documentElement.appendChild(el);\n var w = el.getBoundingClientRect().width;\n if (w > 0 && w < 1)\n CHAR_COUNT = 50;\n else\n CHAR_COUNT = 100;\n el.parentNode.removeChild(el);\n };\n \n this.$setMeasureNodeStyles = function(style, isRoot) {\n style.width = style.height = \"auto\";\n style.left = style.top = \"0px\";\n style.visibility = \"hidden\";\n style.position = \"absolute\";\n style.whiteSpace = \"pre\";\n\n if (useragent.isIE < 8) {\n style[\"font-family\"] = \"inherit\";\n } else {\n style.font = \"inherit\";\n }\n style.overflow = isRoot ? \"hidden\" : \"visible\";\n };\n\n this.checkForSizeChanges = function() {\n var size = this.$measureSizes();\n if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\n this.$measureNode.style.fontWeight = \"bold\";\n var boldSize = this.$measureSizes();\n this.$measureNode.style.fontWeight = \"\";\n this.$characterSize = size;\n this.charSizes = Object.create(null);\n this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\n this._emit(\"changeCharacterSize\", {data: size});\n }\n };\n\n this.$pollSizeChanges = function() {\n if (this.$pollSizeChangesTimer)\n return this.$pollSizeChangesTimer;\n var self = this;\n return this.$pollSizeChangesTimer = setInterval(function() {\n self.checkForSizeChanges();\n }, 500);\n };\n \n this.setPolling = function(val) {\n if (val) {\n this.$pollSizeChanges();\n } else if (this.$pollSizeChangesTimer) {\n clearInterval(this.$pollSizeChangesTimer);\n this.$pollSizeChangesTimer = 0;\n }\n };\n\n this.$measureSizes = function() {\n if (CHAR_COUNT === 50) {\n var rect = null;\n try { \n rect = this.$measureNode.getBoundingClientRect();\n } catch(e) {\n rect = {width: 0, height:0 };\n }\n var size = {\n height: rect.height,\n width: rect.width / CHAR_COUNT\n };\n } else {\n var size = {\n height: this.$measureNode.clientHeight,\n width: this.$measureNode.clientWidth / CHAR_COUNT\n };\n }\n if (size.width === 0 || size.height === 0)\n return null;\n return size;\n };\n\n this.$measureCharWidth = function(ch) {\n this.$main.innerHTML = lang.stringRepeat(ch, CHAR_COUNT);\n var rect = this.$main.getBoundingClientRect();\n return rect.width / CHAR_COUNT;\n };\n \n this.getCharacterWidth = function(ch) {\n var w = this.charSizes[ch];\n if (w === undefined) {\n w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width;\n }\n return w;\n };\n\n this.destroy = function() {\n clearInterval(this.$pollSizeChangesTimer);\n if (this.el && this.el.parentNode)\n this.el.parentNode.removeChild(this.el);\n };\n\n}).call(FontMetrics.prototype);\n\n});\n\nace.define(\"ace/virtual_renderer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/config\",\"ace/lib/useragent\",\"ace/layer/gutter\",\"ace/layer/marker\",\"ace/layer/text\",\"ace/layer/cursor\",\"ace/scrollbar\",\"ace/scrollbar\",\"ace/renderloop\",\"ace/layer/font_metrics\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar config = acequire(\"./config\");\nvar useragent = acequire(\"./lib/useragent\");\nvar GutterLayer = acequire(\"./layer/gutter\").Gutter;\nvar MarkerLayer = acequire(\"./layer/marker\").Marker;\nvar TextLayer = acequire(\"./layer/text\").Text;\nvar CursorLayer = acequire(\"./layer/cursor\").Cursor;\nvar HScrollBar = acequire(\"./scrollbar\").HScrollBar;\nvar VScrollBar = acequire(\"./scrollbar\").VScrollBar;\nvar RenderLoop = acequire(\"./renderloop\").RenderLoop;\nvar FontMetrics = acequire(\"./layer/font_metrics\").FontMetrics;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar editorCss = \".ace_editor {\\\nposition: relative;\\\noverflow: hidden;\\\nfont: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\ndirection: ltr;\\\ntext-align: left;\\\n-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\\n}\\\n.ace_scroller {\\\nposition: absolute;\\\noverflow: hidden;\\\ntop: 0;\\\nbottom: 0;\\\nbackground-color: inherit;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\ncursor: text;\\\n}\\\n.ace_content {\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmin-width: 100%;\\\n}\\\n.ace_dragging .ace_scroller:before{\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\nbottom: 0;\\\ncontent: '';\\\nbackground: rgba(250, 250, 250, 0.01);\\\nz-index: 1000;\\\n}\\\n.ace_dragging.ace_dark .ace_scroller:before{\\\nbackground: rgba(0, 0, 0, 0.01);\\\n}\\\n.ace_selecting, .ace_selecting * {\\\ncursor: text !important;\\\n}\\\n.ace_gutter {\\\nposition: absolute;\\\noverflow : hidden;\\\nwidth: auto;\\\ntop: 0;\\\nbottom: 0;\\\nleft: 0;\\\ncursor: default;\\\nz-index: 4;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\n}\\\n.ace_gutter-active-line {\\\nposition: absolute;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_scroller.ace_scroll-left {\\\nbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\n}\\\n.ace_gutter-cell {\\\npadding-left: 19px;\\\npadding-right: 6px;\\\nbackground-repeat: no-repeat;\\\n}\\\n.ace_gutter-cell.ace_error {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_warning {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_dark .ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_scrollbar {\\\nposition: absolute;\\\nright: 0;\\\nbottom: 0;\\\nz-index: 6;\\\n}\\\n.ace_scrollbar-inner {\\\nposition: absolute;\\\ncursor: text;\\\nleft: 0;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-v{\\\noverflow-x: hidden;\\\noverflow-y: scroll;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-h {\\\noverflow-x: scroll;\\\noverflow-y: hidden;\\\nleft: 0;\\\n}\\\n.ace_print-margin {\\\nposition: absolute;\\\nheight: 100%;\\\n}\\\n.ace_text-input {\\\nposition: absolute;\\\nz-index: 0;\\\nwidth: 0.5em;\\\nheight: 1em;\\\nopacity: 0;\\\nbackground: transparent;\\\n-moz-appearance: none;\\\nappearance: none;\\\nborder: none;\\\nresize: none;\\\noutline: none;\\\noverflow: hidden;\\\nfont: inherit;\\\npadding: 0 1px;\\\nmargin: 0 -1px;\\\ntext-indent: -1em;\\\n-ms-user-select: text;\\\n-moz-user-select: text;\\\n-webkit-user-select: text;\\\nuser-select: text;\\\nwhite-space: pre!important;\\\n}\\\n.ace_text-input.ace_composition {\\\nbackground: inherit;\\\ncolor: inherit;\\\nz-index: 1000;\\\nopacity: 1;\\\ntext-indent: 0;\\\n}\\\n.ace_layer {\\\nz-index: 1;\\\nposition: absolute;\\\noverflow: hidden;\\\nword-wrap: normal;\\\nwhite-space: pre;\\\nheight: 100%;\\\nwidth: 100%;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\npointer-events: none;\\\n}\\\n.ace_gutter-layer {\\\nposition: relative;\\\nwidth: auto;\\\ntext-align: right;\\\npointer-events: auto;\\\n}\\\n.ace_text-layer {\\\nfont: inherit !important;\\\n}\\\n.ace_cjk {\\\ndisplay: inline-block;\\\ntext-align: center;\\\n}\\\n.ace_cursor-layer {\\\nz-index: 4;\\\n}\\\n.ace_cursor {\\\nz-index: 4;\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nborder-left: 2px solid;\\\ntransform: translatez(0);\\\n}\\\n.ace_multiselect .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_slim-cursors .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_overwrite-cursors .ace_cursor {\\\nborder-left-width: 0;\\\nborder-bottom: 1px solid;\\\n}\\\n.ace_hidden-cursors .ace_cursor {\\\nopacity: 0.2;\\\n}\\\n.ace_smooth-blinking .ace_cursor {\\\n-webkit-transition: opacity 0.18s;\\\ntransition: opacity 0.18s;\\\n}\\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\nposition: absolute;\\\nz-index: 3;\\\n}\\\n.ace_marker-layer .ace_selection {\\\nposition: absolute;\\\nz-index: 5;\\\n}\\\n.ace_marker-layer .ace_bracket {\\\nposition: absolute;\\\nz-index: 6;\\\n}\\\n.ace_marker-layer .ace_active-line {\\\nposition: absolute;\\\nz-index: 2;\\\n}\\\n.ace_marker-layer .ace_selected-word {\\\nposition: absolute;\\\nz-index: 4;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\n}\\\n.ace_line .ace_fold {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ndisplay: inline-block;\\\nheight: 11px;\\\nmargin-top: -2px;\\\nvertical-align: middle;\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\\\");\\\nbackground-repeat: no-repeat, repeat-x;\\\nbackground-position: center center, top left;\\\ncolor: transparent;\\\nborder: 1px solid black;\\\nborder-radius: 2px;\\\ncursor: pointer;\\\npointer-events: auto;\\\n}\\\n.ace_dark .ace_fold {\\\n}\\\n.ace_fold:hover{\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_tooltip {\\\nbackground-color: #FFF;\\\nbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\\\nbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\nborder: 1px solid gray;\\\nborder-radius: 1px;\\\nbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\ncolor: black;\\\nmax-width: 100%;\\\npadding: 3px 4px;\\\nposition: fixed;\\\nz-index: 999999;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ncursor: default;\\\nwhite-space: pre;\\\nword-wrap: break-word;\\\nline-height: normal;\\\nfont-style: normal;\\\nfont-weight: normal;\\\nletter-spacing: normal;\\\npointer-events: none;\\\n}\\\n.ace_folding-enabled > .ace_gutter-cell {\\\npadding-right: 13px;\\\n}\\\n.ace_fold-widget {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmargin: 0 -12px 0 1px;\\\ndisplay: none;\\\nwidth: 11px;\\\nvertical-align: top;\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: center;\\\nborder-radius: 3px;\\\nborder: 1px solid transparent;\\\ncursor: pointer;\\\n}\\\n.ace_folding-enabled .ace_fold-widget {\\\ndisplay: inline-block; \\\n}\\\n.ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\\\");\\\n}\\\n.ace_fold-widget:hover {\\\nborder: 1px solid rgba(0, 0, 0, 0.3);\\\nbackground-color: rgba(255, 255, 255, 0.2);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\n}\\\n.ace_fold-widget:active {\\\nborder: 1px solid rgba(0, 0, 0, 0.4);\\\nbackground-color: rgba(0, 0, 0, 0.05);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\n}\\\n.ace_dark .ace_fold-widget {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget:hover {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\nbackground-color: rgba(255, 255, 255, 0.1);\\\n}\\\n.ace_dark .ace_fold-widget:active {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n}\\\n.ace_fold-widget.ace_invalid {\\\nbackground-color: #FFB4B4;\\\nborder-color: #DE5555;\\\n}\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\n-webkit-transition: opacity 0.4s ease 0.05s;\\\ntransition: opacity 0.4s ease 0.05s;\\\nopacity: 0;\\\n}\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\n-webkit-transition: opacity 0.05s ease 0.05s;\\\ntransition: opacity 0.05s ease 0.05s;\\\nopacity:1;\\\n}\\\n.ace_underline {\\\ntext-decoration: underline;\\\n}\\\n.ace_bold {\\\nfont-weight: bold;\\\n}\\\n.ace_nobold .ace_bold {\\\nfont-weight: normal;\\\n}\\\n.ace_italic {\\\nfont-style: italic;\\\n}\\\n.ace_error-marker {\\\nbackground-color: rgba(255, 0, 0,0.2);\\\nposition: absolute;\\\nz-index: 9;\\\n}\\\n.ace_highlight-marker {\\\nbackground-color: rgba(255, 255, 0,0.2);\\\nposition: absolute;\\\nz-index: 8;\\\n}\\\n.ace_br1 {border-top-left-radius : 3px;}\\\n.ace_br2 {border-top-right-radius : 3px;}\\\n.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\\\n.ace_br4 {border-bottom-right-radius: 3px;}\\\n.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\\\n.ace_br8 {border-bottom-left-radius : 3px;}\\\n.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_text-input-ios {\\\nposition: absolute !important;\\\ntop: -100000px !important;\\\nleft: -100000px !important;\\\n}\\\n\";\n\ndom.importCssString(editorCss, \"ace_editor.css\");\n\nvar VirtualRenderer = function(container, theme) {\n var _self = this;\n\n this.container = container || dom.createElement(\"div\");\n this.$keepTextAreaAtCursor = !useragent.isOldIE;\n\n dom.addCssClass(this.container, \"ace_editor\");\n\n this.setTheme(theme);\n\n this.$gutter = dom.createElement(\"div\");\n this.$gutter.className = \"ace_gutter\";\n this.container.appendChild(this.$gutter);\n this.$gutter.setAttribute(\"aria-hidden\", true);\n\n this.scroller = dom.createElement(\"div\");\n this.scroller.className = \"ace_scroller\";\n this.container.appendChild(this.scroller);\n\n this.content = dom.createElement(\"div\");\n this.content.className = \"ace_content\";\n this.scroller.appendChild(this.content);\n\n this.$gutterLayer = new GutterLayer(this.$gutter);\n this.$gutterLayer.on(\"changeGutterWidth\", this.onGutterResize.bind(this));\n\n this.$markerBack = new MarkerLayer(this.content);\n\n var textLayer = this.$textLayer = new TextLayer(this.content);\n this.canvas = textLayer.element;\n\n this.$markerFront = new MarkerLayer(this.content);\n\n this.$cursorLayer = new CursorLayer(this.content);\n this.$horizScroll = false;\n this.$vScroll = false;\n\n this.scrollBar = \n this.scrollBarV = new VScrollBar(this.container, this);\n this.scrollBarH = new HScrollBar(this.container, this);\n this.scrollBarV.addEventListener(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n });\n this.scrollBarH.addEventListener(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n });\n\n this.scrollTop = 0;\n this.scrollLeft = 0;\n\n this.cursorPos = {\n row : 0,\n column : 0\n };\n\n this.$fontMetrics = new FontMetrics(this.container);\n this.$textLayer.$setFontMetrics(this.$fontMetrics);\n this.$textLayer.addEventListener(\"changeCharacterSize\", function(e) {\n _self.updateCharacterSize();\n _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);\n _self._signal(\"changeCharacterSize\", e);\n });\n\n this.$size = {\n width: 0,\n height: 0,\n scrollerHeight: 0,\n scrollerWidth: 0,\n $dirty: true\n };\n\n this.layerConfig = {\n width : 1,\n padding : 0,\n firstRow : 0,\n firstRowScreen: 0,\n lastRow : 0,\n lineHeight : 0,\n characterWidth : 0,\n minHeight : 1,\n maxHeight : 1,\n offset : 0,\n height : 1,\n gutterOffset: 1\n };\n \n this.scrollMargin = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n v: 0,\n h: 0\n };\n\n this.$loop = new RenderLoop(\n this.$renderChanges.bind(this),\n this.container.ownerDocument.defaultView\n );\n this.$loop.schedule(this.CHANGE_FULL);\n\n this.updateCharacterSize();\n this.setPadding(4);\n config.resetOptions(this);\n config._emit(\"renderer\", this);\n};\n\n(function() {\n\n this.CHANGE_CURSOR = 1;\n this.CHANGE_MARKER = 2;\n this.CHANGE_GUTTER = 4;\n this.CHANGE_SCROLL = 8;\n this.CHANGE_LINES = 16;\n this.CHANGE_TEXT = 32;\n this.CHANGE_SIZE = 64;\n this.CHANGE_MARKER_BACK = 128;\n this.CHANGE_MARKER_FRONT = 256;\n this.CHANGE_FULL = 512;\n this.CHANGE_H_SCROLL = 1024;\n\n oop.implement(this, EventEmitter);\n\n this.updateCharacterSize = function() {\n if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\n this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\n this.setStyle(\"ace_nobold\", !this.$allowBoldFonts);\n }\n\n this.layerConfig.characterWidth =\n this.characterWidth = this.$textLayer.getCharacterWidth();\n this.layerConfig.lineHeight =\n this.lineHeight = this.$textLayer.getLineHeight();\n this.$updatePrintMargin();\n };\n this.setSession = function(session) {\n if (this.session)\n this.session.doc.off(\"changeNewLineMode\", this.onChangeNewLineMode);\n \n this.session = session;\n if (session && this.scrollMargin.top && session.getScrollTop() <= 0)\n session.setScrollTop(-this.scrollMargin.top);\n\n this.$cursorLayer.setSession(session);\n this.$markerBack.setSession(session);\n this.$markerFront.setSession(session);\n this.$gutterLayer.setSession(session);\n this.$textLayer.setSession(session);\n if (!session)\n return;\n \n this.$loop.schedule(this.CHANGE_FULL);\n this.session.$setFontMetrics(this.$fontMetrics);\n this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null;\n \n this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this);\n this.onChangeNewLineMode();\n this.session.doc.on(\"changeNewLineMode\", this.onChangeNewLineMode);\n };\n this.updateLines = function(firstRow, lastRow, force) {\n if (lastRow === undefined)\n lastRow = Infinity;\n\n if (!this.$changedLines) {\n this.$changedLines = {\n firstRow: firstRow,\n lastRow: lastRow\n };\n }\n else {\n if (this.$changedLines.firstRow > firstRow)\n this.$changedLines.firstRow = firstRow;\n\n if (this.$changedLines.lastRow < lastRow)\n this.$changedLines.lastRow = lastRow;\n }\n if (this.$changedLines.lastRow < this.layerConfig.firstRow) {\n if (force)\n this.$changedLines.lastRow = this.layerConfig.lastRow;\n else\n return;\n }\n if (this.$changedLines.firstRow > this.layerConfig.lastRow)\n return;\n this.$loop.schedule(this.CHANGE_LINES);\n };\n\n this.onChangeNewLineMode = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n this.$textLayer.$updateEolChar();\n this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR);\n };\n \n this.onChangeTabSize = function() {\n this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);\n this.$textLayer.onChangeTabSize();\n };\n this.updateText = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n };\n this.updateFull = function(force) {\n if (force)\n this.$renderChanges(this.CHANGE_FULL, true);\n else\n this.$loop.schedule(this.CHANGE_FULL);\n };\n this.updateFontSize = function() {\n this.$textLayer.checkForSizeChanges();\n };\n\n this.$changes = 0;\n this.$updateSizeAsync = function() {\n if (this.$loop.pending)\n this.$size.$dirty = true;\n else\n this.onResize();\n };\n this.onResize = function(force, gutterWidth, width, height) {\n if (this.resizing > 2)\n return;\n else if (this.resizing > 0)\n this.resizing++;\n else\n this.resizing = force ? 1 : 0;\n var el = this.container;\n if (!height)\n height = el.clientHeight || el.scrollHeight;\n if (!width)\n width = el.clientWidth || el.scrollWidth;\n var changes = this.$updateCachedSize(force, gutterWidth, width, height);\n\n \n if (!this.$size.scrollerHeight || (!width && !height))\n return this.resizing = 0;\n\n if (force)\n this.$gutterLayer.$padding = null;\n\n if (force)\n this.$renderChanges(changes | this.$changes, true);\n else\n this.$loop.schedule(changes | this.$changes);\n\n if (this.resizing)\n this.resizing = 0;\n this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null;\n };\n \n this.$updateCachedSize = function(force, gutterWidth, width, height) {\n height -= (this.$extraHeight || 0);\n var changes = 0;\n var size = this.$size;\n var oldSize = {\n width: size.width,\n height: size.height,\n scrollerHeight: size.scrollerHeight,\n scrollerWidth: size.scrollerWidth\n };\n if (height && (force || size.height != height)) {\n size.height = height;\n changes |= this.CHANGE_SIZE;\n\n size.scrollerHeight = size.height;\n if (this.$horizScroll)\n size.scrollerHeight -= this.scrollBarH.getHeight();\n this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n changes = changes | this.CHANGE_SCROLL;\n }\n\n if (width && (force || size.width != width)) {\n changes |= this.CHANGE_SIZE;\n size.width = width;\n \n if (gutterWidth == null)\n gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n \n this.gutterWidth = gutterWidth;\n \n this.scrollBarH.element.style.left = \n this.scroller.style.left = gutterWidth + \"px\";\n size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth()); \n \n this.scrollBarH.element.style.right = \n this.scroller.style.right = this.scrollBarV.getWidth() + \"px\";\n this.scroller.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\n changes |= this.CHANGE_FULL;\n }\n \n size.$dirty = !width || !height;\n\n if (changes)\n this._signal(\"resize\", oldSize);\n\n return changes;\n };\n\n this.onGutterResize = function() {\n var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n if (gutterWidth != this.gutterWidth)\n this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\n\n if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else if (this.$size.$dirty) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else {\n this.$computeLayerConfig();\n this.$loop.schedule(this.CHANGE_MARKER);\n }\n };\n this.adjustWrapLimit = function() {\n var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n var limit = Math.floor(availableWidth / this.characterWidth);\n return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\n };\n this.setAnimatedScroll = function(shouldAnimate){\n this.setOption(\"animatedScroll\", shouldAnimate);\n };\n this.getAnimatedScroll = function() {\n return this.$animatedScroll;\n };\n this.setShowInvisibles = function(showInvisibles) {\n this.setOption(\"showInvisibles\", showInvisibles);\n this.session.$bidiHandler.setShowInvisibles(showInvisibles);\n };\n this.getShowInvisibles = function() {\n return this.getOption(\"showInvisibles\");\n };\n this.getDisplayIndentGuides = function() {\n return this.getOption(\"displayIndentGuides\");\n };\n\n this.setDisplayIndentGuides = function(display) {\n this.setOption(\"displayIndentGuides\", display);\n };\n this.setShowPrintMargin = function(showPrintMargin) {\n this.setOption(\"showPrintMargin\", showPrintMargin);\n };\n this.getShowPrintMargin = function() {\n return this.getOption(\"showPrintMargin\");\n };\n this.setPrintMarginColumn = function(showPrintMargin) {\n this.setOption(\"printMarginColumn\", showPrintMargin);\n };\n this.getPrintMarginColumn = function() {\n return this.getOption(\"printMarginColumn\");\n };\n this.getShowGutter = function(){\n return this.getOption(\"showGutter\");\n };\n this.setShowGutter = function(show){\n return this.setOption(\"showGutter\", show);\n };\n\n this.getFadeFoldWidgets = function(){\n return this.getOption(\"fadeFoldWidgets\");\n };\n\n this.setFadeFoldWidgets = function(show) {\n this.setOption(\"fadeFoldWidgets\", show);\n };\n\n this.setHighlightGutterLine = function(shouldHighlight) {\n this.setOption(\"highlightGutterLine\", shouldHighlight);\n };\n\n this.getHighlightGutterLine = function() {\n return this.getOption(\"highlightGutterLine\");\n };\n\n this.$updateGutterLineHighlight = function() {\n var pos = this.$cursorLayer.$pixelPos;\n var height = this.layerConfig.lineHeight;\n if (this.session.getUseWrapMode()) {\n var cursor = this.session.selection.getCursor();\n cursor.column = 0;\n pos = this.$cursorLayer.getPixelPosition(cursor, true);\n height *= this.session.getRowLength(cursor.row);\n }\n this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + \"px\";\n this.$gutterLineHighlight.style.height = height + \"px\";\n };\n\n this.$updatePrintMargin = function() {\n if (!this.$showPrintMargin && !this.$printMarginEl)\n return;\n\n if (!this.$printMarginEl) {\n var containerEl = dom.createElement(\"div\");\n containerEl.className = \"ace_layer ace_print-margin-layer\";\n this.$printMarginEl = dom.createElement(\"div\");\n this.$printMarginEl.className = \"ace_print-margin\";\n containerEl.appendChild(this.$printMarginEl);\n this.content.insertBefore(containerEl, this.content.firstChild);\n }\n\n var style = this.$printMarginEl.style;\n style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + \"px\";\n style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n \n if (this.session && this.session.$wrap == -1)\n this.adjustWrapLimit();\n };\n this.getContainerElement = function() {\n return this.container;\n };\n this.getMouseEventTarget = function() {\n return this.scroller;\n };\n this.getTextAreaContainer = function() {\n return this.container;\n };\n this.$moveTextAreaToCursor = function() {\n if (!this.$keepTextAreaAtCursor)\n return;\n var config = this.layerConfig;\n var posTop = this.$cursorLayer.$pixelPos.top;\n var posLeft = this.$cursorLayer.$pixelPos.left;\n posTop -= config.offset;\n\n var style = this.textarea.style;\n var h = this.lineHeight;\n if (posTop < 0 || posTop > config.height - h) {\n style.top = style.left = \"0\";\n return;\n }\n\n var w = this.characterWidth;\n if (this.$composition) {\n var val = this.textarea.value.replace(/^\\x01+/, \"\");\n w *= (this.session.$getStringScreenWidth(val)[0]+2);\n h += 2;\n }\n posLeft -= this.scrollLeft;\n if (posLeft > this.$size.scrollerWidth - w)\n posLeft = this.$size.scrollerWidth - w;\n\n posLeft += this.gutterWidth;\n style.height = h + \"px\";\n style.width = w + \"px\";\n style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + \"px\";\n style.top = Math.min(posTop, this.$size.height - h) + \"px\";\n };\n this.getFirstVisibleRow = function() {\n return this.layerConfig.firstRow;\n };\n this.getFirstFullyVisibleRow = function() {\n return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\n };\n this.getLastFullyVisibleRow = function() {\n var config = this.layerConfig;\n var lastRow = config.lastRow;\n var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight;\n if (top - this.session.getScrollTop() > config.height - config.lineHeight)\n return lastRow - 1;\n return lastRow;\n };\n this.getLastVisibleRow = function() {\n return this.layerConfig.lastRow;\n };\n\n this.$padding = null;\n this.setPadding = function(padding) {\n this.$padding = padding;\n this.$textLayer.setPadding(padding);\n this.$cursorLayer.setPadding(padding);\n this.$markerFront.setPadding(padding);\n this.$markerBack.setPadding(padding);\n this.$loop.schedule(this.CHANGE_FULL);\n this.$updatePrintMargin();\n };\n \n this.setScrollMargin = function(top, bottom, left, right) {\n var sm = this.scrollMargin;\n sm.top = top|0;\n sm.bottom = bottom|0;\n sm.right = right|0;\n sm.left = left|0;\n sm.v = sm.top + sm.bottom;\n sm.h = sm.left + sm.right;\n if (sm.top && this.scrollTop <= 0 && this.session)\n this.session.setScrollTop(-sm.top);\n this.updateFull();\n };\n this.getHScrollBarAlwaysVisible = function() {\n return this.$hScrollBarAlwaysVisible;\n };\n this.setHScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"hScrollBarAlwaysVisible\", alwaysVisible);\n };\n this.getVScrollBarAlwaysVisible = function() {\n return this.$vScrollBarAlwaysVisible;\n };\n this.setVScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"vScrollBarAlwaysVisible\", alwaysVisible);\n };\n\n this.$updateScrollBarV = function() {\n var scrollHeight = this.layerConfig.maxHeight;\n var scrollerHeight = this.$size.scrollerHeight;\n if (!this.$maxLines && this.$scrollPastEnd) {\n scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd;\n if (this.scrollTop > scrollHeight - scrollerHeight) {\n scrollHeight = this.scrollTop + scrollerHeight;\n this.scrollBarV.scrollTop = null;\n }\n }\n this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v);\n this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);\n };\n this.$updateScrollBarH = function() {\n this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);\n this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);\n };\n \n this.$frozen = false;\n this.freeze = function() {\n this.$frozen = true;\n };\n \n this.unfreeze = function() {\n this.$frozen = false;\n };\n\n this.$renderChanges = function(changes, force) {\n if (this.$changes) {\n changes |= this.$changes;\n this.$changes = 0;\n }\n if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) {\n this.$changes |= changes;\n return; \n } \n if (this.$size.$dirty) {\n this.$changes |= changes;\n return this.onResize(true);\n }\n if (!this.lineHeight) {\n this.$textLayer.checkForSizeChanges();\n }\n \n this._signal(\"beforeRender\");\n\n if (this.session && this.session.$bidiHandler)\n this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);\n\n var config = this.layerConfig;\n if (changes & this.CHANGE_FULL ||\n changes & this.CHANGE_SIZE ||\n changes & this.CHANGE_TEXT ||\n changes & this.CHANGE_LINES ||\n changes & this.CHANGE_SCROLL ||\n changes & this.CHANGE_H_SCROLL\n ) {\n changes |= this.$computeLayerConfig();\n if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {\n var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;\n if (st > 0) {\n this.scrollTop = st;\n changes = changes | this.CHANGE_SCROLL;\n changes |= this.$computeLayerConfig();\n }\n }\n config = this.layerConfig;\n this.$updateScrollBarV();\n if (changes & this.CHANGE_H_SCROLL)\n this.$updateScrollBarH();\n this.$gutterLayer.element.style.marginTop = (-config.offset) + \"px\";\n this.content.style.marginTop = (-config.offset) + \"px\";\n this.content.style.width = config.width + 2 * this.$padding + \"px\";\n this.content.style.height = config.minHeight + \"px\";\n }\n if (changes & this.CHANGE_H_SCROLL) {\n this.content.style.marginLeft = -this.scrollLeft + \"px\";\n this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n }\n if (changes & this.CHANGE_FULL) {\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n this._signal(\"afterRender\");\n return;\n }\n if (changes & this.CHANGE_SCROLL) {\n if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n this.$textLayer.update(config);\n else\n this.$textLayer.scrollLines(config);\n\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n this.$moveTextAreaToCursor();\n this._signal(\"afterRender\");\n return;\n }\n\n if (changes & this.CHANGE_TEXT) {\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_LINES) {\n if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n\n if (changes & this.CHANGE_CURSOR) {\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n this.$markerFront.update(config);\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n this.$markerBack.update(config);\n }\n\n this._signal(\"afterRender\");\n };\n\n \n this.$autosize = function() {\n var height = this.session.getScreenLength() * this.lineHeight;\n var maxHeight = this.$maxLines * this.lineHeight;\n var desiredHeight = Math.min(maxHeight,\n Math.max((this.$minLines || 1) * this.lineHeight, height)\n ) + this.scrollMargin.v + (this.$extraHeight || 0);\n if (this.$horizScroll)\n desiredHeight += this.scrollBarH.getHeight();\n if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight)\n desiredHeight = this.$maxPixelHeight;\n var vScroll = height > maxHeight;\n \n if (desiredHeight != this.desiredHeight ||\n this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\n if (vScroll != this.$vScroll) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n \n var w = this.container.clientWidth;\n this.container.style.height = desiredHeight + \"px\";\n this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\n this.desiredHeight = desiredHeight;\n \n this._signal(\"autosize\");\n }\n };\n \n this.$computeLayerConfig = function() {\n var session = this.session;\n var size = this.$size;\n \n var hideScrollbars = size.height <= 2 * this.lineHeight;\n var screenLines = this.session.getScreenLength();\n var maxHeight = screenLines * this.lineHeight;\n\n var longestLine = this.$getLongestLine();\n \n var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||\n size.scrollerWidth - longestLine - 2 * this.$padding < 0);\n\n var hScrollChanged = this.$horizScroll !== horizScroll;\n if (hScrollChanged) {\n this.$horizScroll = horizScroll;\n this.scrollBarH.setVisible(horizScroll);\n }\n var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine\n if (this.$maxLines && this.lineHeight > 1)\n this.$autosize();\n\n var offset = this.scrollTop % this.lineHeight;\n var minHeight = size.scrollerHeight + this.lineHeight;\n \n var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd\n ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n : 0;\n maxHeight += scrollPastEnd;\n \n var sm = this.scrollMargin;\n this.session.setScrollTop(Math.max(-sm.top,\n Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom)));\n\n this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, \n longestLine + 2 * this.$padding - size.scrollerWidth + sm.right)));\n \n var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top);\n var vScrollChanged = vScrollBefore !== vScroll;\n if (vScrollChanged) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n\n var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n var lastRow = firstRow + lineCount;\n var firstRowScreen, firstRowHeight;\n var lineHeight = this.lineHeight;\n firstRow = session.screenToDocumentRow(firstRow, 0);\n var foldLine = session.getFoldLine(firstRow);\n if (foldLine) {\n firstRow = foldLine.start.row;\n }\n\n firstRowScreen = session.documentToScreenRow(firstRow, 0);\n firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n\n lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\n minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\n firstRowHeight;\n\n offset = this.scrollTop - firstRowScreen * lineHeight;\n\n var changes = 0;\n if (this.layerConfig.width != longestLine) \n changes = this.CHANGE_H_SCROLL;\n if (hScrollChanged || vScrollChanged) {\n changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);\n this._signal(\"scrollbarVisibilityChanged\");\n if (vScrollChanged)\n longestLine = this.$getLongestLine();\n }\n \n this.layerConfig = {\n width : longestLine,\n padding : this.$padding,\n firstRow : firstRow,\n firstRowScreen: firstRowScreen,\n lastRow : lastRow,\n lineHeight : lineHeight,\n characterWidth : this.characterWidth,\n minHeight : minHeight,\n maxHeight : maxHeight,\n offset : offset,\n gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0,\n height : this.$size.scrollerHeight\n };\n\n return changes;\n };\n\n this.$updateLines = function() {\n if (!this.$changedLines) return;\n var firstRow = this.$changedLines.firstRow;\n var lastRow = this.$changedLines.lastRow;\n this.$changedLines = null;\n\n var layerConfig = this.layerConfig;\n\n if (firstRow > layerConfig.lastRow + 1) { return; }\n if (lastRow < layerConfig.firstRow) { return; }\n if (lastRow === Infinity) {\n if (this.$showGutter)\n this.$gutterLayer.update(layerConfig);\n this.$textLayer.update(layerConfig);\n return;\n }\n this.$textLayer.updateLines(layerConfig, firstRow, lastRow);\n return true;\n };\n\n this.$getLongestLine = function() {\n var charCount = this.session.getScreenWidth();\n if (this.showInvisibles && !this.session.$useWrapMode)\n charCount += 1;\n\n return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));\n };\n this.updateFrontMarkers = function() {\n this.$markerFront.setMarkers(this.session.getMarkers(true));\n this.$loop.schedule(this.CHANGE_MARKER_FRONT);\n };\n this.updateBackMarkers = function() {\n this.$markerBack.setMarkers(this.session.getMarkers());\n this.$loop.schedule(this.CHANGE_MARKER_BACK);\n };\n this.addGutterDecoration = function(row, className){\n this.$gutterLayer.addGutterDecoration(row, className);\n };\n this.removeGutterDecoration = function(row, className){\n this.$gutterLayer.removeGutterDecoration(row, className);\n };\n this.updateBreakpoints = function(rows) {\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.setAnnotations = function(annotations) {\n this.$gutterLayer.setAnnotations(annotations);\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.updateCursor = function() {\n this.$loop.schedule(this.CHANGE_CURSOR);\n };\n this.hideCursor = function() {\n this.$cursorLayer.hideCursor();\n };\n this.showCursor = function() {\n this.$cursorLayer.showCursor();\n };\n\n this.scrollSelectionIntoView = function(anchor, lead, offset) {\n this.scrollCursorIntoView(anchor, offset);\n this.scrollCursorIntoView(lead, offset);\n };\n this.scrollCursorIntoView = function(cursor, offset, $viewMargin) {\n if (this.$size.scrollerHeight === 0)\n return;\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n\n var left = pos.left;\n var top = pos.top;\n \n var topMargin = $viewMargin && $viewMargin.top || 0;\n var bottomMargin = $viewMargin && $viewMargin.bottom || 0;\n \n var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;\n \n if (scrollTop + topMargin > top) {\n if (offset && scrollTop + topMargin > top + this.lineHeight)\n top -= offset * this.$size.scrollerHeight;\n if (top === 0)\n top = -this.scrollMargin.top;\n this.session.setScrollTop(top);\n } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) {\n if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight)\n top += offset * this.$size.scrollerHeight;\n this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight);\n }\n\n var scrollLeft = this.scrollLeft;\n\n if (scrollLeft > left) {\n if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n left = -this.scrollMargin.left;\n this.session.setScrollLeft(left);\n } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\n this.session.setScrollLeft(0);\n }\n };\n this.getScrollTop = function() {\n return this.session.getScrollTop();\n };\n this.getScrollLeft = function() {\n return this.session.getScrollLeft();\n };\n this.getScrollTopRow = function() {\n return this.scrollTop / this.lineHeight;\n };\n this.getScrollBottomRow = function() {\n return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\n };\n this.scrollToRow = function(row) {\n this.session.setScrollTop(row * this.lineHeight);\n };\n\n this.alignCursor = function(cursor, alignment) {\n if (typeof cursor == \"number\")\n cursor = {row: cursor, column: 0};\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n var h = this.$size.scrollerHeight - this.lineHeight;\n var offset = pos.top - h * (alignment || 0);\n\n this.session.setScrollTop(offset);\n return offset;\n };\n\n this.STEPS = 8;\n this.$calcSteps = function(fromValue, toValue){\n var i = 0;\n var l = this.STEPS;\n var steps = [];\n\n var func = function(t, x_min, dx) {\n return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n };\n\n for (i = 0; i < l; ++i)\n steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n\n return steps;\n };\n this.scrollToLine = function(line, center, animate, callback) {\n var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\n var offset = pos.top;\n if (center)\n offset -= this.$size.scrollerHeight / 2;\n\n var initialScroll = this.scrollTop;\n this.session.setScrollTop(offset);\n if (animate !== false)\n this.animateScrolling(initialScroll, callback);\n };\n\n this.animateScrolling = function(fromValue, callback) {\n var toValue = this.scrollTop;\n if (!this.$animatedScroll)\n return;\n var _self = this;\n \n if (fromValue == toValue)\n return;\n \n if (this.$scrollAnimation) {\n var oldSteps = this.$scrollAnimation.steps;\n if (oldSteps.length) {\n fromValue = oldSteps[0];\n if (fromValue == toValue)\n return;\n }\n }\n \n var steps = _self.$calcSteps(fromValue, toValue);\n this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\n\n clearInterval(this.$timer);\n\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n this.$timer = setInterval(function() {\n if (steps.length) {\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n } else if (toValue != null) {\n _self.session.$scrollTop = -1;\n _self.session.setScrollTop(toValue);\n toValue = null;\n } else {\n _self.$timer = clearInterval(_self.$timer);\n _self.$scrollAnimation = null;\n callback && callback();\n }\n }, 10);\n };\n this.scrollToY = function(scrollTop) {\n if (this.scrollTop !== scrollTop) {\n this.$loop.schedule(this.CHANGE_SCROLL);\n this.scrollTop = scrollTop;\n }\n };\n this.scrollToX = function(scrollLeft) {\n if (this.scrollLeft !== scrollLeft)\n this.scrollLeft = scrollLeft;\n this.$loop.schedule(this.CHANGE_H_SCROLL);\n };\n this.scrollTo = function(x, y) {\n this.session.setScrollTop(y);\n this.session.setScrollLeft(y);\n };\n this.scrollBy = function(deltaX, deltaY) {\n deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n };\n this.isScrollableBy = function(deltaX, deltaY) {\n if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\n return true;\n if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\n - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)\n return true;\n if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\n return true;\n if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\n - this.layerConfig.width < -1 + this.scrollMargin.right)\n return true;\n };\n\n this.pixelToScreenCoordinates = function(x, y) {\n var canvasPos = this.scroller.getBoundingClientRect();\n\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n var offset = offsetX / this.characterWidth;\n var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n var col = Math.round(offset);\n\n return {row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX};\n };\n\n this.screenToTextCoordinates = function(x, y) {\n var canvasPos = this.scroller.getBoundingClientRect();\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n\n var col = Math.round(offsetX / this.characterWidth);\n\n var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight;\n\n return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX);\n };\n this.textToScreenCoordinates = function(row, column) {\n var canvasPos = this.scroller.getBoundingClientRect();\n var pos = this.session.documentToScreenPosition(row, column);\n\n var x = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : Math.round(pos.column * this.characterWidth));\n\n var y = pos.row * this.lineHeight;\n\n return {\n pageX: canvasPos.left + x - this.scrollLeft,\n pageY: canvasPos.top + y - this.scrollTop\n };\n };\n this.visualizeFocus = function() {\n dom.addCssClass(this.container, \"ace_focus\");\n };\n this.visualizeBlur = function() {\n dom.removeCssClass(this.container, \"ace_focus\");\n };\n this.showComposition = function(position) {\n if (!this.$composition)\n this.$composition = {\n keepTextAreaAtCursor: this.$keepTextAreaAtCursor,\n cssText: this.textarea.style.cssText\n };\n\n this.$keepTextAreaAtCursor = true;\n dom.addCssClass(this.textarea, \"ace_composition\");\n this.textarea.style.cssText = \"\";\n this.$moveTextAreaToCursor();\n };\n this.setCompositionText = function(text) {\n this.$moveTextAreaToCursor();\n };\n this.hideComposition = function() {\n if (!this.$composition)\n return;\n\n dom.removeCssClass(this.textarea, \"ace_composition\");\n this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;\n this.textarea.style.cssText = this.$composition.cssText;\n this.$composition = null;\n };\n this.setTheme = function(theme, cb) {\n var _self = this;\n this.$themeId = theme;\n _self._dispatchEvent('themeChange',{theme:theme});\n\n if (!theme || typeof theme == \"string\") {\n var moduleName = theme || this.$options.theme.initialValue;\n config.loadModule([\"theme\", moduleName], afterLoad);\n } else {\n afterLoad(theme);\n }\n\n function afterLoad(module) {\n if (_self.$themeId != theme)\n return cb && cb();\n if (!module || !module.cssClass)\n throw new Error(\"couldn't load module \" + theme + \" or it didn't call define\");\n dom.importCssString(\n module.cssText,\n module.cssClass,\n _self.container.ownerDocument\n );\n\n if (_self.theme)\n dom.removeCssClass(_self.container, _self.theme.cssClass);\n\n var padding = \"padding\" in module ? module.padding \n : \"padding\" in (_self.theme || {}) ? 4 : _self.$padding;\n if (_self.$padding && padding != _self.$padding)\n _self.setPadding(padding);\n _self.$theme = module.cssClass;\n\n _self.theme = module;\n dom.addCssClass(_self.container, module.cssClass);\n dom.setCssClass(_self.container, \"ace_dark\", module.isDark);\n if (_self.$size) {\n _self.$size.width = 0;\n _self.$updateSizeAsync();\n }\n\n _self._dispatchEvent('themeLoaded', {theme:module});\n cb && cb();\n }\n };\n this.getTheme = function() {\n return this.$themeId;\n };\n this.setStyle = function(style, include) {\n dom.setCssClass(this.container, style, include !== false);\n };\n this.unsetStyle = function(style) {\n dom.removeCssClass(this.container, style);\n };\n \n this.setCursorStyle = function(style) {\n if (this.scroller.style.cursor != style)\n this.scroller.style.cursor = style;\n };\n this.setMouseCursor = function(cursorStyle) {\n this.scroller.style.cursor = cursorStyle;\n };\n this.destroy = function() {\n this.$textLayer.destroy();\n this.$cursorLayer.destroy();\n };\n\n}).call(VirtualRenderer.prototype);\n\n\nconfig.defineOptions(VirtualRenderer.prototype, \"renderer\", {\n animatedScroll: {initialValue: false},\n showInvisibles: {\n set: function(value) {\n if (this.$textLayer.setShowInvisibles(value))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: false\n },\n showPrintMargin: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: true\n },\n printMarginColumn: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: 80\n },\n printMargin: {\n set: function(val) {\n if (typeof val == \"number\")\n this.$printMarginColumn = val;\n this.$showPrintMargin = !!val;\n this.$updatePrintMargin();\n },\n get: function() {\n return this.$showPrintMargin && this.$printMarginColumn; \n }\n },\n showGutter: {\n set: function(show){\n this.$gutter.style.display = show ? \"block\" : \"none\";\n this.$loop.schedule(this.CHANGE_FULL);\n this.onGutterResize();\n },\n initialValue: true\n },\n fadeFoldWidgets: {\n set: function(show) {\n dom.setCssClass(this.$gutter, \"ace_fade-fold-widgets\", show);\n },\n initialValue: false\n },\n showFoldWidgets: {\n set: function(show) {this.$gutterLayer.setShowFoldWidgets(show);},\n initialValue: true\n },\n showLineNumbers: {\n set: function(show) {\n this.$gutterLayer.setShowLineNumbers(show);\n this.$loop.schedule(this.CHANGE_GUTTER);\n },\n initialValue: true\n },\n displayIndentGuides: {\n set: function(show) {\n if (this.$textLayer.setDisplayIndentGuides(show))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: true\n },\n highlightGutterLine: {\n set: function(shouldHighlight) {\n if (!this.$gutterLineHighlight) {\n this.$gutterLineHighlight = dom.createElement(\"div\");\n this.$gutterLineHighlight.className = \"ace_gutter-active-line\";\n this.$gutter.appendChild(this.$gutterLineHighlight);\n return;\n }\n\n this.$gutterLineHighlight.style.display = shouldHighlight ? \"\" : \"none\";\n if (this.$cursorLayer.$pixelPos)\n this.$updateGutterLineHighlight();\n },\n initialValue: false,\n value: true\n },\n hScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n vScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n fontSize: {\n set: function(size) {\n if (typeof size == \"number\")\n size = size + \"px\";\n this.container.style.fontSize = size;\n this.updateFontSize();\n },\n initialValue: 12\n },\n fontFamily: {\n set: function(name) {\n this.container.style.fontFamily = name;\n this.updateFontSize();\n }\n },\n maxLines: {\n set: function(val) {\n this.updateFull();\n }\n },\n minLines: {\n set: function(val) {\n this.updateFull();\n }\n },\n maxPixelHeight: {\n set: function(val) {\n this.updateFull();\n },\n initialValue: 0\n },\n scrollPastEnd: {\n set: function(val) {\n val = +val || 0;\n if (this.$scrollPastEnd == val)\n return;\n this.$scrollPastEnd = val;\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: 0,\n handlesSet: true\n },\n fixedWidthGutter: {\n set: function(val) {\n this.$gutterLayer.$fixedWidth = !!val;\n this.$loop.schedule(this.CHANGE_GUTTER);\n }\n },\n theme: {\n set: function(val) { this.setTheme(val); },\n get: function() { return this.$themeId || this.theme; },\n initialValue: \"./theme/textmate\",\n handlesSet: true\n }\n});\n\nexports.VirtualRenderer = VirtualRenderer;\n});\n\nace.define(\"ace/worker/worker_client\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/event_emitter\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar net = acequire(\"../lib/net\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\nvar config = acequire(\"../config\");\n\nfunction $workerBlob(workerUrl, mod) {\n var script = mod.src;\"importScripts('\" + net.qualifyURL(workerUrl) + \"');\";\n try {\n return new Blob([script], {\"type\": \"application/javascript\"});\n } catch (e) { // Backwards-compatibility\n var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n var blobBuilder = new BlobBuilder();\n blobBuilder.append(script);\n return blobBuilder.getBlob(\"application/javascript\");\n }\n}\n\nfunction createWorker(workerUrl, mod) {\n var blob = $workerBlob(workerUrl, mod);\n var URL = window.URL || window.webkitURL;\n var blobURL = URL.createObjectURL(blob);\n return new Worker(blobURL);\n}\n\nvar WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) {\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.onMessage = this.onMessage.bind(this);\n if (acequire.nameToUrl && !acequire.toUrl)\n acequire.toUrl = acequire.nameToUrl;\n \n if (config.get(\"packaged\") || !acequire.toUrl) {\n workerUrl = workerUrl || config.moduleUrl(mod.id, \"worker\");\n } else {\n var normalizePath = this.$normalizePath;\n workerUrl = workerUrl || normalizePath(acequire.toUrl(\"ace/worker/worker.js\", null, \"_\"));\n\n var tlns = {};\n topLevelNamespaces.forEach(function(ns) {\n tlns[ns] = normalizePath(acequire.toUrl(ns, null, \"_\").replace(/(\\.js)?(\\?.*)?$/, \"\"));\n });\n }\n\n this.$worker = createWorker(workerUrl, mod);\n if (importScripts) {\n this.send(\"importScripts\", importScripts);\n }\n this.$worker.postMessage({\n init : true,\n tlns : tlns,\n module : mod.id,\n classname : classname\n });\n\n this.callbackId = 1;\n this.callbacks = {};\n\n this.$worker.onmessage = this.onMessage;\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.onMessage = function(e) {\n var msg = e.data;\n switch (msg.type) {\n case \"event\":\n this._signal(msg.name, {data: msg.data});\n break;\n case \"call\":\n var callback = this.callbacks[msg.id];\n if (callback) {\n callback(msg.data);\n delete this.callbacks[msg.id];\n }\n break;\n case \"error\":\n this.reportError(msg.data);\n break;\n case \"log\":\n window.console && console.log && console.log.apply(console, msg.data);\n break;\n }\n };\n \n this.reportError = function(err) {\n window.console && console.error && console.error(err);\n };\n\n this.$normalizePath = function(path) {\n return net.qualifyURL(path);\n };\n\n this.terminate = function() {\n this._signal(\"terminate\", {});\n this.deltaQueue = null;\n this.$worker.terminate();\n this.$worker = null;\n if (this.$doc)\n this.$doc.off(\"change\", this.changeListener);\n this.$doc = null;\n };\n\n this.send = function(cmd, args) {\n this.$worker.postMessage({command: cmd, args: args});\n };\n\n this.call = function(cmd, args, callback) {\n if (callback) {\n var id = this.callbackId++;\n this.callbacks[id] = callback;\n args.push(id);\n }\n this.send(cmd, args);\n };\n\n this.emit = function(event, data) {\n try {\n this.$worker.postMessage({event: event, data: {data: data.data}});\n }\n catch(ex) {\n console.error(ex.stack);\n }\n };\n\n this.attachToDocument = function(doc) {\n if (this.$doc)\n this.terminate();\n\n this.$doc = doc;\n this.call(\"setValue\", [doc.getValue()]);\n doc.on(\"change\", this.changeListener);\n };\n\n this.changeListener = function(delta) {\n if (!this.deltaQueue) {\n this.deltaQueue = [];\n setTimeout(this.$sendDeltaQueue, 0);\n }\n if (delta.action == \"insert\")\n this.deltaQueue.push(delta.start, delta.lines);\n else\n this.deltaQueue.push(delta.start, delta.end);\n };\n\n this.$sendDeltaQueue = function() {\n var q = this.deltaQueue;\n if (!q) return;\n this.deltaQueue = null;\n if (q.length > 50 && q.length > this.$doc.getLength() >> 1) {\n this.call(\"setValue\", [this.$doc.getValue()]);\n } else\n this.emit(\"change\", {data: q});\n };\n\n}).call(WorkerClient.prototype);\n\n\nvar UIWorkerClient = function(topLevelNamespaces, mod, classname) {\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.callbackId = 1;\n this.callbacks = {};\n this.messageBuffer = [];\n\n var main = null;\n var emitSync = false;\n var sender = Object.create(EventEmitter);\n var _self = this;\n\n this.$worker = {};\n this.$worker.terminate = function() {};\n this.$worker.postMessage = function(e) {\n _self.messageBuffer.push(e);\n if (main) {\n if (emitSync)\n setTimeout(processNext);\n else\n processNext();\n }\n };\n this.setEmitSync = function(val) { emitSync = val; };\n\n var processNext = function() {\n var msg = _self.messageBuffer.shift();\n if (msg.command)\n main[msg.command].apply(main, msg.args);\n else if (msg.event)\n sender._signal(msg.event, msg.data);\n };\n\n sender.postMessage = function(msg) {\n _self.onMessage({data: msg});\n };\n sender.callback = function(data, callbackId) {\n this.postMessage({type: \"call\", id: callbackId, data: data});\n };\n sender.emit = function(name, data) {\n this.postMessage({type: \"event\", name: name, data: data});\n };\n\n config.loadModule([\"worker\", mod], function(Main) {\n main = new Main[classname](sender);\n while (_self.messageBuffer.length)\n processNext();\n });\n};\n\nUIWorkerClient.prototype = WorkerClient.prototype;\n\nexports.UIWorkerClient = UIWorkerClient;\nexports.WorkerClient = WorkerClient;\nexports.createWorker = createWorker;\n\n\n});\n\nace.define(\"ace/placeholder\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"./range\").Range;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar oop = acequire(\"./lib/oop\");\n\nvar PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {\n var _self = this;\n this.length = length;\n this.session = session;\n this.doc = session.getDocument();\n this.mainClass = mainClass;\n this.othersClass = othersClass;\n this.$onUpdate = this.onUpdate.bind(this);\n this.doc.on(\"change\", this.$onUpdate);\n this.$others = others;\n \n this.$onCursorChange = function() {\n setTimeout(function() {\n _self.onCursorChange();\n });\n };\n \n this.$pos = pos;\n var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};\n this.$undoStackDepth = undoStack.length;\n this.setup();\n\n session.selection.on(\"changeCursor\", this.$onCursorChange);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setup = function() {\n var _self = this;\n var doc = this.doc;\n var session = this.session;\n \n this.selectionBefore = session.selection.toJSON();\n if (session.selection.inMultiSelectMode)\n session.selection.toSingleRange();\n\n this.pos = doc.createAnchor(this.$pos.row, this.$pos.column);\n var pos = this.pos;\n pos.$insertRight = true;\n pos.detach();\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n this.others = [];\n this.$others.forEach(function(other) {\n var anchor = doc.createAnchor(other.row, other.column);\n anchor.$insertRight = true;\n anchor.detach();\n _self.others.push(anchor);\n });\n session.setUndoSelect(false);\n };\n this.showOtherMarkers = function() {\n if (this.othersActive) return;\n var session = this.session;\n var _self = this;\n this.othersActive = true;\n this.others.forEach(function(anchor) {\n anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);\n });\n };\n this.hideOtherMarkers = function() {\n if (!this.othersActive) return;\n this.othersActive = false;\n for (var i = 0; i < this.others.length; i++) {\n this.session.removeMarker(this.others[i].markerId);\n }\n };\n this.onUpdate = function(delta) {\n if (this.$updating)\n return this.updateAnchors(delta);\n \n var range = delta;\n if (range.start.row !== range.end.row) return;\n if (range.start.row !== this.pos.row) return;\n this.$updating = true;\n var lengthDiff = delta.action === \"insert\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1;\n var distanceFromStart = range.start.column - this.pos.column;\n \n this.updateAnchors(delta);\n \n if (inMainRange)\n this.length += lengthDiff;\n\n if (inMainRange && !this.session.$fromUndo) {\n if (delta.action === 'insert') {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n this.doc.insertMergedLines(newPos, delta.lines);\n }\n } else if (delta.action === 'remove') {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n }\n }\n }\n \n this.$updating = false;\n this.updateMarkers();\n };\n \n this.updateAnchors = function(delta) {\n this.pos.onChange(delta);\n for (var i = this.others.length; i--;)\n this.others[i].onChange(delta);\n this.updateMarkers();\n };\n \n this.updateMarkers = function() {\n if (this.$updating)\n return;\n var _self = this;\n var session = this.session;\n var updateMarker = function(pos, className) {\n session.removeMarker(pos.markerId);\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false);\n };\n updateMarker(this.pos, this.mainClass);\n for (var i = this.others.length; i--;)\n updateMarker(this.others[i], this.othersClass);\n };\n\n this.onCursorChange = function(event) {\n if (this.$updating || !this.session) return;\n var pos = this.session.selection.getCursor();\n if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {\n this.showOtherMarkers();\n this._emit(\"cursorEnter\", event);\n } else {\n this.hideOtherMarkers();\n this._emit(\"cursorLeave\", event);\n }\n }; \n this.detach = function() {\n this.session.removeMarker(this.pos && this.pos.markerId);\n this.hideOtherMarkers();\n this.doc.removeEventListener(\"change\", this.$onUpdate);\n this.session.selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n this.session.setUndoSelect(true);\n this.session = null;\n };\n this.cancel = function() {\n if (this.$undoStackDepth === -1)\n return;\n var undoManager = this.session.getUndoManager();\n var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;\n for (var i = 0; i < undosRequired; i++) {\n undoManager.undo(true);\n }\n if (this.selectionBefore)\n this.session.selection.fromJSON(this.selectionBefore);\n };\n}).call(PlaceHolder.prototype);\n\n\nexports.PlaceHolder = PlaceHolder;\n});\n\nace.define(\"ace/mouse/multi_select_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\n\nfunction onMouseDown(e) {\n var ev = e.domEvent;\n var alt = ev.altKey;\n var shift = ev.shiftKey;\n var ctrl = ev.ctrlKey;\n var accel = e.getAccelKey();\n var button = e.getButton();\n \n if (ctrl && useragent.isMac)\n button = ev.button;\n\n if (e.editor.inMultiSelectMode && button == 2) {\n e.editor.textInput.onContextMenu(e.domEvent);\n return;\n }\n \n if (!ctrl && !alt && !accel) {\n if (button === 0 && e.editor.inMultiSelectMode)\n e.editor.exitMultiSelectMode();\n return;\n }\n \n if (button !== 0)\n return;\n\n var editor = e.editor;\n var selection = editor.selection;\n var isMultiSelect = editor.inMultiSelectMode;\n var pos = e.getDocumentPosition();\n var cursor = selection.getCursor();\n var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));\n\n var mouseX = e.x, mouseY = e.y;\n var onMouseSelection = function(e) {\n mouseX = e.clientX;\n mouseY = e.clientY;\n };\n \n var session = editor.session;\n var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var screenCursor = screenAnchor;\n \n var selectionMode;\n if (editor.$mouseHandler.$enableJumpToDef) {\n if (ctrl && alt || accel && alt)\n selectionMode = shift ? \"block\" : \"add\";\n else if (alt && editor.$blockSelectEnabled)\n selectionMode = \"block\";\n } else {\n if (accel && !alt) {\n selectionMode = \"add\";\n if (!isMultiSelect && shift)\n return;\n } else if (alt && editor.$blockSelectEnabled) {\n selectionMode = \"block\";\n }\n }\n \n if (selectionMode && useragent.isMac && ev.ctrlKey) {\n editor.$mouseHandler.cancelContextMenu();\n }\n\n if (selectionMode == \"add\") {\n if (!isMultiSelect && inSelection)\n return; // dragging\n\n if (!isMultiSelect) {\n var range = selection.toOrientedRange();\n editor.addSelectionMarker(range);\n }\n\n var oldRange = selection.rangeList.rangeAtPoint(pos);\n \n \n editor.$blockScrolling++;\n editor.inVirtualSelectionMode = true;\n \n if (shift) {\n oldRange = null;\n range = selection.ranges[0] || range;\n editor.removeSelectionMarker(range);\n }\n editor.once(\"mouseup\", function() {\n var tmpSel = selection.toOrientedRange();\n\n if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))\n selection.substractPoint(tmpSel.cursor);\n else {\n if (shift) {\n selection.substractPoint(range.cursor);\n } else if (range) {\n editor.removeSelectionMarker(range);\n selection.addRange(range);\n }\n selection.addRange(tmpSel);\n }\n editor.$blockScrolling--;\n editor.inVirtualSelectionMode = false;\n });\n\n } else if (selectionMode == \"block\") {\n e.stop();\n editor.inVirtualSelectionMode = true; \n var initialRange;\n var rectSel = [];\n var blockSelect = function() {\n var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX);\n\n if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))\n return;\n screenCursor = newCursor;\n \n editor.$blockScrolling++;\n editor.selection.moveToPosition(cursor);\n editor.renderer.scrollCursorIntoView();\n\n editor.removeSelectionMarkers(rectSel);\n rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\n if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())\n rectSel[0] = editor.$mouseHandler.$clickSelection.clone();\n rectSel.forEach(editor.addSelectionMarker, editor);\n editor.updateSelectionMarkers();\n editor.$blockScrolling--;\n };\n editor.$blockScrolling++;\n if (isMultiSelect && !accel) {\n selection.toSingleRange();\n } else if (!isMultiSelect && accel) {\n initialRange = selection.toOrientedRange();\n editor.addSelectionMarker(initialRange);\n }\n \n if (shift)\n screenAnchor = session.documentToScreenPosition(selection.lead); \n else\n selection.moveToPosition(pos);\n editor.$blockScrolling--;\n \n screenCursor = {row: -1, column: -1};\n\n var onMouseSelectionEnd = function(e) {\n clearInterval(timerId);\n editor.removeSelectionMarkers(rectSel);\n if (!rectSel.length)\n rectSel = [selection.toOrientedRange()];\n editor.$blockScrolling++;\n if (initialRange) {\n editor.removeSelectionMarker(initialRange);\n selection.toSingleRange(initialRange);\n }\n for (var i = 0; i < rectSel.length; i++)\n selection.addRange(rectSel[i]);\n editor.inVirtualSelectionMode = false;\n editor.$mouseHandler.$clickSelection = null;\n editor.$blockScrolling--;\n };\n\n var onSelectionInterval = blockSelect;\n\n event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\n var timerId = setInterval(function() {onSelectionInterval();}, 20);\n\n return e.preventDefault();\n }\n}\n\n\nexports.onMouseDown = onMouseDown;\n\n});\n\nace.define(\"ace/commands/multi_select_commands\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\"], function(acequire, exports, module) {\nexports.defaultCommands = [{\n name: \"addCursorAbove\",\n exec: function(editor) { editor.selectMoreLines(-1); },\n bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelow\",\n exec: function(editor) { editor.selectMoreLines(1); },\n bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorAboveSkipCurrent\",\n exec: function(editor) { editor.selectMoreLines(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelowSkipCurrent\",\n exec: function(editor) { editor.selectMoreLines(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreBefore\",\n exec: function(editor) { editor.selectMore(-1); },\n bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreAfter\",\n exec: function(editor) { editor.selectMore(1); },\n bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextBefore\",\n exec: function(editor) { editor.selectMore(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextAfter\",\n exec: function(editor) { editor.selectMore(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"splitIntoLines\",\n exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n readOnly: true\n}, {\n name: \"alignCursors\",\n exec: function(editor) { editor.alignCursors(); },\n bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"},\n scrollIntoView: \"cursor\"\n}, {\n name: \"findAll\",\n exec: function(editor) { editor.findAll(); },\n bindKey: {win: \"Ctrl-Alt-K\", mac: \"Ctrl-Alt-G\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}];\nexports.multiSelectCommands = [{\n name: \"singleSelection\",\n bindKey: \"esc\",\n exec: function(editor) { editor.exitMultiSelectMode(); },\n scrollIntoView: \"cursor\",\n readOnly: true,\n isAvailable: function(editor) {return editor && editor.inMultiSelectMode;}\n}];\n\nvar HashHandler = acequire(\"../keyboard/hash_handler\").HashHandler;\nexports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\n\n});\n\nace.define(\"ace/multi_select\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/range\",\"ace/selection\",\"ace/mouse/multi_select_handler\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/commands/multi_select_commands\",\"ace/search\",\"ace/edit_session\",\"ace/editor\",\"ace/config\"], function(acequire, exports, module) {\n\nvar RangeList = acequire(\"./range_list\").RangeList;\nvar Range = acequire(\"./range\").Range;\nvar Selection = acequire(\"./selection\").Selection;\nvar onMouseDown = acequire(\"./mouse/multi_select_handler\").onMouseDown;\nvar event = acequire(\"./lib/event\");\nvar lang = acequire(\"./lib/lang\");\nvar commands = acequire(\"./commands/multi_select_commands\");\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\nvar Search = acequire(\"./search\").Search;\nvar search = new Search();\n\nfunction find(session, needle, dir) {\n search.$options.wrap = true;\n search.$options.needle = needle;\n search.$options.backwards = dir == -1;\n return search.find(session);\n}\nvar EditSession = acequire(\"./edit_session\").EditSession;\n(function() {\n this.getSelectionMarkers = function() {\n return this.$selectionMarkers;\n };\n}).call(EditSession.prototype);\n(function() {\n this.ranges = null;\n this.rangeList = null;\n this.addRange = function(range, $blockChangeEvents) {\n if (!range)\n return;\n\n if (!this.inMultiSelectMode && this.rangeCount === 0) {\n var oldRange = this.toOrientedRange();\n this.rangeList.add(oldRange);\n this.rangeList.add(range);\n if (this.rangeList.ranges.length != 2) {\n this.rangeList.removeAll();\n return $blockChangeEvents || this.fromOrientedRange(range);\n }\n this.rangeList.removeAll();\n this.rangeList.add(oldRange);\n this.$onAddRange(oldRange);\n }\n\n if (!range.cursor)\n range.cursor = range.end;\n\n var removed = this.rangeList.add(range);\n\n this.$onAddRange(range);\n\n if (removed.length)\n this.$onRemoveRange(removed);\n\n if (this.rangeCount > 1 && !this.inMultiSelectMode) {\n this._signal(\"multiSelect\");\n this.inMultiSelectMode = true;\n this.session.$undoSelect = false;\n this.rangeList.attach(this.session);\n }\n\n return $blockChangeEvents || this.fromOrientedRange(range);\n };\n\n this.toSingleRange = function(range) {\n range = range || this.ranges[0];\n var removed = this.rangeList.removeAll();\n if (removed.length)\n this.$onRemoveRange(removed);\n\n range && this.fromOrientedRange(range);\n };\n this.substractPoint = function(pos) {\n var removed = this.rangeList.substractPoint(pos);\n if (removed) {\n this.$onRemoveRange(removed);\n return removed[0];\n }\n };\n this.mergeOverlappingRanges = function() {\n var removed = this.rangeList.merge();\n if (removed.length)\n this.$onRemoveRange(removed);\n else if(this.ranges[0])\n this.fromOrientedRange(this.ranges[0]);\n };\n\n this.$onAddRange = function(range) {\n this.rangeCount = this.rangeList.ranges.length;\n this.ranges.unshift(range);\n this._signal(\"addRange\", {range: range});\n };\n\n this.$onRemoveRange = function(removed) {\n this.rangeCount = this.rangeList.ranges.length;\n if (this.rangeCount == 1 && this.inMultiSelectMode) {\n var lastRange = this.rangeList.ranges.pop();\n removed.push(lastRange);\n this.rangeCount = 0;\n }\n\n for (var i = removed.length; i--; ) {\n var index = this.ranges.indexOf(removed[i]);\n this.ranges.splice(index, 1);\n }\n\n this._signal(\"removeRange\", {ranges: removed});\n\n if (this.rangeCount === 0 && this.inMultiSelectMode) {\n this.inMultiSelectMode = false;\n this._signal(\"singleSelect\");\n this.session.$undoSelect = true;\n this.rangeList.detach(this.session);\n }\n\n lastRange = lastRange || this.ranges[0];\n if (lastRange && !lastRange.isEqual(this.getRange()))\n this.fromOrientedRange(lastRange);\n };\n this.$initRangeList = function() {\n if (this.rangeList)\n return;\n\n this.rangeList = new RangeList();\n this.ranges = [];\n this.rangeCount = 0;\n };\n this.getAllRanges = function() {\n return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\n };\n\n this.splitIntoLines = function () {\n if (this.rangeCount > 1) {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n } else {\n var range = this.getRange();\n var isBackwards = this.isBackwards();\n var startRow = range.start.row;\n var endRow = range.end.row;\n if (startRow == endRow) {\n if (isBackwards)\n var start = range.end, end = range.start;\n else\n var start = range.start, end = range.end;\n \n this.addRange(Range.fromPoints(end, end));\n this.addRange(Range.fromPoints(start, start));\n return;\n }\n\n var rectSel = [];\n var r = this.getLineRange(startRow, true);\n r.start.column = range.start.column;\n rectSel.push(r);\n\n for (var i = startRow + 1; i < endRow; i++)\n rectSel.push(this.getLineRange(i, true));\n\n r = this.getLineRange(endRow, true);\n r.end.column = range.end.column;\n rectSel.push(r);\n\n rectSel.forEach(this.addRange, this);\n }\n };\n this.toggleBlockSelection = function () {\n if (this.rangeCount > 1) {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n } else {\n var cursor = this.session.documentToScreenPosition(this.selectionLead);\n var anchor = this.session.documentToScreenPosition(this.selectionAnchor);\n\n var rectSel = this.rectangularRangeBlock(cursor, anchor);\n rectSel.forEach(this.addRange, this);\n }\n };\n this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\n var rectSel = [];\n\n var xBackwards = screenCursor.column < screenAnchor.column;\n if (xBackwards) {\n var startColumn = screenCursor.column;\n var endColumn = screenAnchor.column;\n var startOffsetX = screenCursor.offsetX;\n var endOffsetX = screenAnchor.offsetX;\n } else {\n var startColumn = screenAnchor.column;\n var endColumn = screenCursor.column;\n var startOffsetX = screenAnchor.offsetX;\n var endOffsetX = screenCursor.offsetX;\n }\n\n var yBackwards = screenCursor.row < screenAnchor.row;\n if (yBackwards) {\n var startRow = screenCursor.row;\n var endRow = screenAnchor.row;\n } else {\n var startRow = screenAnchor.row;\n var endRow = screenCursor.row;\n }\n\n if (startColumn < 0)\n startColumn = 0;\n if (startRow < 0)\n startRow = 0;\n\n if (startRow == endRow)\n includeEmptyLines = true;\n\n for (var row = startRow; row <= endRow; row++) {\n var range = Range.fromPoints(\n this.session.screenToDocumentPosition(row, startColumn, startOffsetX),\n this.session.screenToDocumentPosition(row, endColumn, endOffsetX)\n );\n if (range.isEmpty()) {\n if (docEnd && isSamePoint(range.end, docEnd))\n break;\n var docEnd = range.end;\n }\n range.cursor = xBackwards ? range.start : range.end;\n rectSel.push(range);\n }\n\n if (yBackwards)\n rectSel.reverse();\n\n if (!includeEmptyLines) {\n var end = rectSel.length - 1;\n while (rectSel[end].isEmpty() && end > 0)\n end--;\n if (end > 0) {\n var start = 0;\n while (rectSel[start].isEmpty())\n start++;\n }\n for (var i = end; i >= start; i--) {\n if (rectSel[i].isEmpty())\n rectSel.splice(i, 1);\n }\n }\n\n return rectSel;\n };\n}).call(Selection.prototype);\nvar Editor = acequire(\"./editor\").Editor;\n(function() {\n this.updateSelectionMarkers = function() {\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n this.addSelectionMarker = function(orientedRange) {\n if (!orientedRange.cursor)\n orientedRange.cursor = orientedRange.end;\n\n var style = this.getSelectionStyle();\n orientedRange.marker = this.session.addMarker(orientedRange, \"ace_selection\", style);\n\n this.session.$selectionMarkers.push(orientedRange);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n return orientedRange;\n };\n this.removeSelectionMarker = function(range) {\n if (!range.marker)\n return;\n this.session.removeMarker(range.marker);\n var index = this.session.$selectionMarkers.indexOf(range);\n if (index != -1)\n this.session.$selectionMarkers.splice(index, 1);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n };\n\n this.removeSelectionMarkers = function(ranges) {\n var markerList = this.session.$selectionMarkers;\n for (var i = ranges.length; i--; ) {\n var range = ranges[i];\n if (!range.marker)\n continue;\n this.session.removeMarker(range.marker);\n var index = markerList.indexOf(range);\n if (index != -1)\n markerList.splice(index, 1);\n }\n this.session.selectionMarkerCount = markerList.length;\n };\n\n this.$onAddRange = function(e) {\n this.addSelectionMarker(e.range);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onRemoveRange = function(e) {\n this.removeSelectionMarkers(e.ranges);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onMultiSelect = function(e) {\n if (this.inMultiSelectMode)\n return;\n this.inMultiSelectMode = true;\n\n this.setStyle(\"ace_multiselect\");\n this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\n this.commands.setDefaultHandler(\"exec\", this.$onMultiSelectExec);\n\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onSingleSelect = function(e) {\n if (this.session.multiSelect.inVirtualMode)\n return;\n this.inMultiSelectMode = false;\n\n this.unsetStyle(\"ace_multiselect\");\n this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\n\n this.commands.removeDefaultHandler(\"exec\", this.$onMultiSelectExec);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n this._emit(\"changeSelection\");\n };\n\n this.$onMultiSelectExec = function(e) {\n var command = e.command;\n var editor = e.editor;\n if (!editor.multiSelect)\n return;\n if (!command.multiSelectAction) {\n var result = command.exec(editor, e.args || {});\n editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\n editor.multiSelect.mergeOverlappingRanges();\n } else if (command.multiSelectAction == \"forEach\") {\n result = editor.forEachSelection(command, e.args);\n } else if (command.multiSelectAction == \"forEachLine\") {\n result = editor.forEachSelection(command, e.args, true);\n } else if (command.multiSelectAction == \"single\") {\n editor.exitMultiSelectMode();\n result = command.exec(editor, e.args || {});\n } else {\n result = command.multiSelectAction(editor, e.args || {});\n }\n return result;\n }; \n this.forEachSelection = function(cmd, args, options) {\n if (this.inVirtualSelectionMode)\n return;\n var keepOrder = options && options.keepOrder;\n var $byLines = options == true || options && options.$byLines;\n var session = this.session;\n var selection = this.selection;\n var rangeList = selection.rangeList;\n var ranges = (keepOrder ? selection : rangeList).ranges;\n var result;\n \n if (!ranges.length)\n return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n \n var reg = selection._eventRegistry;\n selection._eventRegistry = {};\n\n var tmpSel = new Selection(session);\n this.inVirtualSelectionMode = true;\n for (var i = ranges.length; i--;) {\n if ($byLines) {\n while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)\n i--;\n }\n tmpSel.fromOrientedRange(ranges[i]);\n tmpSel.index = i;\n this.selection = session.selection = tmpSel;\n var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n if (!result && cmdResult !== undefined)\n result = cmdResult;\n tmpSel.toOrientedRange(ranges[i]);\n }\n tmpSel.detach();\n\n this.selection = session.selection = selection;\n this.inVirtualSelectionMode = false;\n selection._eventRegistry = reg;\n selection.mergeOverlappingRanges();\n \n var anim = this.renderer.$scrollAnimation;\n this.onCursorChange();\n this.onSelectionChange();\n if (anim && anim.from == anim.to)\n this.renderer.animateScrolling(anim.from);\n \n return result;\n };\n this.exitMultiSelectMode = function() {\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\n return;\n this.multiSelect.toSingleRange();\n };\n\n this.getSelectedText = function() {\n var text = \"\";\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var ranges = this.multiSelect.rangeList.ranges;\n var buf = [];\n for (var i = 0; i < ranges.length; i++) {\n buf.push(this.session.getTextRange(ranges[i]));\n }\n var nl = this.session.getDocument().getNewLineCharacter();\n text = buf.join(nl);\n if (text.length == (buf.length - 1) * nl.length)\n text = \"\";\n } else if (!this.selection.isEmpty()) {\n text = this.session.getTextRange(this.getSelectionRange());\n }\n return text;\n };\n \n this.$checkMultiselectChange = function(e, anchor) {\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var range = this.multiSelect.ranges[0];\n if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)\n return;\n var pos = anchor == this.multiSelect.anchor\n ? range.cursor == range.start ? range.end : range.start\n : range.cursor;\n if (pos.row != anchor.row \n || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)\n this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());\n }\n };\n this.findAll = function(needle, options, additive) {\n options = options || {};\n options.needle = needle || options.needle;\n if (options.needle == undefined) {\n var range = this.selection.isEmpty()\n ? this.selection.getWordRange()\n : this.selection.getRange();\n options.needle = this.session.getTextRange(range);\n } \n this.$search.set(options);\n \n var ranges = this.$search.findAll(this.session);\n if (!ranges.length)\n return 0;\n\n this.$blockScrolling += 1;\n var selection = this.multiSelect;\n\n if (!additive)\n selection.toSingleRange(ranges[0]);\n\n for (var i = ranges.length; i--; )\n selection.addRange(ranges[i], true);\n if (range && selection.rangeList.rangeAtPoint(range.start))\n selection.addRange(range, true);\n \n this.$blockScrolling -= 1;\n\n return ranges.length;\n };\n this.selectMoreLines = function(dir, skip) {\n var range = this.selection.toOrientedRange();\n var isBackwards = range.cursor == range.end;\n\n var screenLead = this.session.documentToScreenPosition(range.cursor);\n if (this.selection.$desiredColumn)\n screenLead.column = this.selection.$desiredColumn;\n\n var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\n\n if (!range.isEmpty()) {\n var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\n var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\n } else {\n var anchor = lead;\n }\n\n if (isBackwards) {\n var newRange = Range.fromPoints(lead, anchor);\n newRange.cursor = newRange.start;\n } else {\n var newRange = Range.fromPoints(anchor, lead);\n newRange.cursor = newRange.end;\n }\n\n newRange.desiredColumn = screenLead.column;\n if (!this.selection.inMultiSelectMode) {\n this.selection.addRange(range);\n } else {\n if (skip)\n var toRemove = range.cursor;\n }\n\n this.selection.addRange(newRange);\n if (toRemove)\n this.selection.substractPoint(toRemove);\n };\n this.transposeSelections = function(dir) {\n var session = this.session;\n var sel = session.multiSelect;\n var all = sel.ranges;\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n if (range.isEmpty()) {\n var tmp = session.getWordRange(range.start.row, range.start.column);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n range.end.row = tmp.end.row;\n range.end.column = tmp.end.column;\n }\n }\n sel.mergeOverlappingRanges();\n\n var words = [];\n for (var i = all.length; i--; ) {\n var range = all[i];\n words.unshift(session.getTextRange(range));\n }\n\n if (dir < 0)\n words.unshift(words.pop());\n else\n words.push(words.shift());\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n var tmp = range.clone();\n session.replace(range, words[i]);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n }\n };\n this.selectMore = function(dir, skip, stopAtFirst) {\n var session = this.session;\n var sel = session.multiSelect;\n\n var range = sel.toOrientedRange();\n if (range.isEmpty()) {\n range = session.getWordRange(range.start.row, range.start.column);\n range.cursor = dir == -1 ? range.start : range.end;\n this.multiSelect.addRange(range);\n if (stopAtFirst)\n return;\n }\n var needle = session.getTextRange(range);\n\n var newRange = find(session, needle, dir);\n if (newRange) {\n newRange.cursor = dir == -1 ? newRange.start : newRange.end;\n this.$blockScrolling += 1;\n this.session.unfold(newRange);\n this.multiSelect.addRange(newRange);\n this.$blockScrolling -= 1;\n this.renderer.scrollCursorIntoView(null, 0.5);\n }\n if (skip)\n this.multiSelect.substractPoint(range.cursor);\n };\n this.alignCursors = function() {\n var session = this.session;\n var sel = session.multiSelect;\n var ranges = sel.ranges;\n var row = -1;\n var sameRowRanges = ranges.filter(function(r) {\n if (r.cursor.row == row)\n return true;\n row = r.cursor.row;\n });\n \n if (!ranges.length || sameRowRanges.length == ranges.length - 1) {\n var range = this.selection.getRange();\n var fr = range.start.row, lr = range.end.row;\n var guessRange = fr == lr;\n if (guessRange) {\n var max = this.session.getLength();\n var line;\n do {\n line = this.session.getLine(lr);\n } while (/[=:]/.test(line) && ++lr < max);\n do {\n line = this.session.getLine(fr);\n } while (/[=:]/.test(line) && --fr > 0);\n \n if (fr < 0) fr = 0;\n if (lr >= max) lr = max - 1;\n }\n var lines = this.session.removeFullLines(fr, lr);\n lines = this.$reAlignText(lines, guessRange);\n this.session.insert({row: fr, column: 0}, lines.join(\"\\n\") + \"\\n\");\n if (!guessRange) {\n range.start.column = 0;\n range.end.column = lines[lines.length - 1].length;\n }\n this.selection.setRange(range);\n } else {\n sameRowRanges.forEach(function(r) {\n sel.substractPoint(r.cursor);\n });\n\n var maxCol = 0;\n var minSpace = Infinity;\n var spaceOffsets = ranges.map(function(r) {\n var p = r.cursor;\n var line = session.getLine(p.row);\n var spaceOffset = line.substr(p.column).search(/\\S/g);\n if (spaceOffset == -1)\n spaceOffset = 0;\n\n if (p.column > maxCol)\n maxCol = p.column;\n if (spaceOffset < minSpace)\n minSpace = spaceOffset;\n return spaceOffset;\n });\n ranges.forEach(function(r, i) {\n var p = r.cursor;\n var l = maxCol - p.column;\n var d = spaceOffsets[i] - minSpace;\n if (l > d)\n session.insert(p, lang.stringRepeat(\" \", l - d));\n else\n session.remove(new Range(p.row, p.column, p.row, p.column - l + d));\n\n r.start.column = r.end.column = maxCol;\n r.start.row = r.end.row = p.row;\n r.cursor = r.end;\n });\n sel.fromOrientedRange(ranges[0]);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n }\n };\n\n this.$reAlignText = function(lines, forceLeft) {\n var isLeftAligned = true, isRightAligned = true;\n var startW, textW, endW;\n\n return lines.map(function(line) {\n var m = line.match(/(\\s*)(.*?)(\\s*)([=:].*)/);\n if (!m)\n return [line];\n\n if (startW == null) {\n startW = m[1].length;\n textW = m[2].length;\n endW = m[3].length;\n return m;\n }\n\n if (startW + textW + endW != m[1].length + m[2].length + m[3].length)\n isRightAligned = false;\n if (startW != m[1].length)\n isLeftAligned = false;\n\n if (startW > m[1].length)\n startW = m[1].length;\n if (textW < m[2].length)\n textW = m[2].length;\n if (endW > m[3].length)\n endW = m[3].length;\n\n return m;\n }).map(forceLeft ? alignLeft :\n isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);\n\n function spaces(n) {\n return lang.stringRepeat(\" \", n);\n }\n\n function alignLeft(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(textW - m[2].length + endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n function alignRight(m) {\n return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2]\n + spaces(endW, \" \")\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n function unAlign(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n };\n}).call(Editor.prototype);\n\n\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\nexports.onSessionChange = function(e) {\n var session = e.session;\n if (session && !session.multiSelect) {\n session.$selectionMarkers = [];\n session.selection.$initRangeList();\n session.multiSelect = session.selection;\n }\n this.multiSelect = session && session.multiSelect;\n\n var oldSession = e.oldSession;\n if (oldSession) {\n oldSession.multiSelect.off(\"addRange\", this.$onAddRange);\n oldSession.multiSelect.off(\"removeRange\", this.$onRemoveRange);\n oldSession.multiSelect.off(\"multiSelect\", this.$onMultiSelect);\n oldSession.multiSelect.off(\"singleSelect\", this.$onSingleSelect);\n oldSession.multiSelect.lead.off(\"change\", this.$checkMultiselectChange);\n oldSession.multiSelect.anchor.off(\"change\", this.$checkMultiselectChange);\n }\n\n if (session) {\n session.multiSelect.on(\"addRange\", this.$onAddRange);\n session.multiSelect.on(\"removeRange\", this.$onRemoveRange);\n session.multiSelect.on(\"multiSelect\", this.$onMultiSelect);\n session.multiSelect.on(\"singleSelect\", this.$onSingleSelect);\n session.multiSelect.lead.on(\"change\", this.$checkMultiselectChange);\n session.multiSelect.anchor.on(\"change\", this.$checkMultiselectChange);\n }\n\n if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) {\n if (session.selection.inMultiSelectMode)\n this.$onMultiSelect();\n else\n this.$onSingleSelect();\n }\n};\nfunction MultiSelect(editor) {\n if (editor.$multiselectOnSessionChange)\n return;\n editor.$onAddRange = editor.$onAddRange.bind(editor);\n editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);\n editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);\n editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);\n editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);\n editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor);\n\n editor.$multiselectOnSessionChange(editor);\n editor.on(\"changeSession\", editor.$multiselectOnSessionChange);\n\n editor.on(\"mousedown\", onMouseDown);\n editor.commands.addCommands(commands.defaultCommands);\n\n addAltCursorListeners(editor);\n}\n\nfunction addAltCursorListeners(editor){\n var el = editor.textInput.getElement();\n var altCursor = false;\n event.addListener(el, \"keydown\", function(e) {\n var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey);\n if (editor.$blockSelectEnabled && altDown) {\n if (!altCursor) {\n editor.renderer.setMouseCursor(\"crosshair\");\n altCursor = true;\n }\n } else if (altCursor) {\n reset();\n }\n });\n\n event.addListener(el, \"keyup\", reset);\n event.addListener(el, \"blur\", reset);\n function reset(e) {\n if (altCursor) {\n editor.renderer.setMouseCursor(\"\");\n altCursor = false;\n }\n }\n}\n\nexports.MultiSelect = MultiSelect;\n\n\nacequire(\"./config\").defineOptions(Editor.prototype, \"editor\", {\n enableMultiselect: {\n set: function(val) {\n MultiSelect(this);\n if (val) {\n this.on(\"changeSession\", this.$multiselectOnSessionChange);\n this.on(\"mousedown\", onMouseDown);\n } else {\n this.off(\"changeSession\", this.$multiselectOnSessionChange);\n this.off(\"mousedown\", onMouseDown);\n }\n },\n value: true\n },\n enableBlockSelect: {\n set: function(val) {\n this.$blockSelectEnabled = val;\n },\n value: true\n }\n});\n\n\n\n});\n\nace.define(\"ace/mode/folding/fold_mode\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n this.foldingStartMarker = null;\n this.foldingStopMarker = null;\n this.getFoldWidget = function(session, foldStyle, row) {\n var line = session.getLine(row);\n if (this.foldingStartMarker.test(line))\n return \"start\";\n if (foldStyle == \"markbeginend\"\n && this.foldingStopMarker\n && this.foldingStopMarker.test(line))\n return \"end\";\n return \"\";\n };\n\n this.getFoldWidgetRange = function(session, foldStyle, row) {\n return null;\n };\n\n this.indentationBlock = function(session, row, column) {\n var re = /\\S/;\n var line = session.getLine(row);\n var startLevel = line.search(re);\n if (startLevel == -1)\n return;\n\n var startColumn = column || line.length;\n var maxRow = session.getLength();\n var startRow = row;\n var endRow = row;\n\n while (++row < maxRow) {\n var level = session.getLine(row).search(re);\n\n if (level == -1)\n continue;\n\n if (level <= startLevel)\n break;\n\n endRow = row;\n }\n\n if (endRow > startRow) {\n var endColumn = session.getLine(endRow).length;\n return new Range(startRow, startColumn, endRow, endColumn);\n }\n };\n\n this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n var start = {row: row, column: column + 1};\n var end = session.$findClosingBracket(bracket, start, typeRe);\n if (!end)\n return;\n\n var fw = session.foldWidgets[end.row];\n if (fw == null)\n fw = session.getFoldWidget(end.row);\n\n if (fw == \"start\" && end.row > start.row) {\n end.row --;\n end.column = session.getLine(end.row).length;\n }\n return Range.fromPoints(start, end);\n };\n\n this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\n var end = {row: row, column: column};\n var start = session.$findOpeningBracket(bracket, end);\n\n if (!start)\n return;\n\n start.column++;\n end.column--;\n\n return Range.fromPoints(start, end);\n };\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = \".ace-tm .ace_gutter {\\\nbackground: #f0f0f0;\\\ncolor: #333;\\\n}\\\n.ace-tm .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-tm .ace_fold {\\\nbackground-color: #6B72E6;\\\n}\\\n.ace-tm {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-tm .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-tm .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-tm .ace_storage,\\\n.ace-tm .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-tm .ace_constant {\\\ncolor: rgb(197, 6, 11);\\\n}\\\n.ace-tm .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-tm .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-tm .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_invalid {\\\nbackground-color: rgba(255, 0, 0, 0.1);\\\ncolor: red;\\\n}\\\n.ace-tm .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-tm .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_support.ace_type,\\\n.ace-tm .ace_support.ace_class {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-tm .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-tm .ace_string {\\\ncolor: rgb(3, 106, 7);\\\n}\\\n.ace-tm .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-tm .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-tm .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-tm .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-tm .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-tm .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-tm .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-tm .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-tm .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-tm .ace_meta.ace_tag {\\\ncolor:rgb(0, 22, 142);\\\n}\\\n.ace-tm .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-tm .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-tm.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\n}\\\n.ace-tm .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-tm .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-tm .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-tm .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-tm .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-tm .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-tm .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = acequire(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n\nace.define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar Range = acequire(\"./range\").Range;\n\n\nfunction LineWidgets(session) {\n this.session = session;\n this.session.widgetManager = this;\n this.session.getRowLength = this.getRowLength;\n this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\n this.updateOnChange = this.updateOnChange.bind(this);\n this.renderWidgets = this.renderWidgets.bind(this);\n this.measureWidgets = this.measureWidgets.bind(this);\n this.session._changedWidgets = [];\n this.$onChangeEditor = this.$onChangeEditor.bind(this);\n \n this.session.on(\"change\", this.updateOnChange);\n this.session.on(\"changeFold\", this.updateOnFold);\n this.session.on(\"changeEditor\", this.$onChangeEditor);\n}\n\n(function() {\n this.getRowLength = function(row) {\n var h;\n if (this.lineWidgets)\n h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n else \n h = 0;\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1 + h;\n } else {\n return this.$wrapData[row].length + 1 + h;\n }\n };\n\n this.$getWidgetScreenLength = function() {\n var screenRows = 0;\n this.lineWidgets.forEach(function(w){\n if (w && w.rowCount && !w.hidden)\n screenRows += w.rowCount;\n });\n return screenRows;\n }; \n \n this.$onChangeEditor = function(e) {\n this.attach(e.editor);\n };\n \n this.attach = function(editor) {\n if (editor && editor.widgetManager && editor.widgetManager != this)\n editor.widgetManager.detach();\n\n if (this.editor == editor)\n return;\n\n this.detach();\n this.editor = editor;\n \n if (editor) {\n editor.widgetManager = this;\n editor.renderer.on(\"beforeRender\", this.measureWidgets);\n editor.renderer.on(\"afterRender\", this.renderWidgets);\n }\n };\n this.detach = function(e) {\n var editor = this.editor;\n if (!editor)\n return;\n \n this.editor = null;\n editor.widgetManager = null;\n \n editor.renderer.off(\"beforeRender\", this.measureWidgets);\n editor.renderer.off(\"afterRender\", this.renderWidgets);\n var lineWidgets = this.session.lineWidgets;\n lineWidgets && lineWidgets.forEach(function(w) {\n if (w && w.el && w.el.parentNode) {\n w._inDocument = false;\n w.el.parentNode.removeChild(w.el);\n }\n });\n };\n\n this.updateOnFold = function(e, session) {\n var lineWidgets = session.lineWidgets;\n if (!lineWidgets || !e.action)\n return;\n var fold = e.data;\n var start = fold.start.row;\n var end = fold.end.row;\n var hide = e.action == \"add\";\n for (var i = start + 1; i < end; i++) {\n if (lineWidgets[i])\n lineWidgets[i].hidden = hide;\n }\n if (lineWidgets[end]) {\n if (hide) {\n if (!lineWidgets[start])\n lineWidgets[start] = lineWidgets[end];\n else\n lineWidgets[end].hidden = hide;\n } else {\n if (lineWidgets[start] == lineWidgets[end])\n lineWidgets[start] = undefined;\n lineWidgets[end].hidden = hide;\n }\n }\n };\n \n this.updateOnChange = function(delta) {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n \n var startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n } else if (delta.action == 'remove') {\n var removed = lineWidgets.splice(startRow + 1, len);\n removed.forEach(function(w) {\n w && this.removeLineWidget(w);\n }, this);\n this.$updateRows();\n } else {\n var args = new Array(len);\n args.unshift(startRow, 0);\n lineWidgets.splice.apply(lineWidgets, args);\n this.$updateRows();\n }\n };\n \n this.$updateRows = function() {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n var noWidgets = true;\n lineWidgets.forEach(function(w, i) {\n if (w) {\n noWidgets = false;\n w.row = i;\n while (w.$oldWidget) {\n w.$oldWidget.row = i;\n w = w.$oldWidget;\n }\n }\n });\n if (noWidgets)\n this.session.lineWidgets = null;\n };\n\n this.addLineWidget = function(w) {\n if (!this.session.lineWidgets)\n this.session.lineWidgets = new Array(this.session.getLength());\n \n var old = this.session.lineWidgets[w.row];\n if (old) {\n w.$oldWidget = old;\n if (old.el && old.el.parentNode) {\n old.el.parentNode.removeChild(old.el);\n old._inDocument = false;\n }\n }\n \n this.session.lineWidgets[w.row] = w;\n \n w.session = this.session;\n \n var renderer = this.editor.renderer;\n if (w.html && !w.el) {\n w.el = dom.createElement(\"div\");\n w.el.innerHTML = w.html;\n }\n if (w.el) {\n dom.addCssClass(w.el, \"ace_lineWidgetContainer\");\n w.el.style.position = \"absolute\";\n w.el.style.zIndex = 5;\n renderer.container.appendChild(w.el);\n w._inDocument = true;\n }\n \n if (!w.coverGutter) {\n w.el.style.zIndex = 3;\n }\n if (w.pixelHeight == null) {\n w.pixelHeight = w.el.offsetHeight;\n }\n if (w.rowCount == null) {\n w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;\n }\n \n var fold = this.session.getFoldAt(w.row, 0);\n w.$fold = fold;\n if (fold) {\n var lineWidgets = this.session.lineWidgets;\n if (w.row == fold.end.row && !lineWidgets[fold.start.row])\n lineWidgets[fold.start.row] = w;\n else\n w.hidden = true;\n }\n \n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n \n this.$updateRows();\n this.renderWidgets(null, renderer);\n this.onWidgetChanged(w);\n return w;\n };\n \n this.removeLineWidget = function(w) {\n w._inDocument = false;\n w.session = null;\n if (w.el && w.el.parentNode)\n w.el.parentNode.removeChild(w.el);\n if (w.editor && w.editor.destroy) try {\n w.editor.destroy();\n } catch(e){}\n if (this.session.lineWidgets) {\n var w1 = this.session.lineWidgets[w.row];\n if (w1 == w) {\n this.session.lineWidgets[w.row] = w.$oldWidget;\n if (w.$oldWidget)\n this.onWidgetChanged(w.$oldWidget);\n } else {\n while (w1) {\n if (w1.$oldWidget == w) {\n w1.$oldWidget = w.$oldWidget;\n break;\n }\n w1 = w1.$oldWidget;\n }\n }\n }\n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n this.$updateRows();\n };\n \n this.getWidgetsAtRow = function(row) {\n var lineWidgets = this.session.lineWidgets;\n var w = lineWidgets && lineWidgets[row];\n var list = [];\n while (w) {\n list.push(w);\n w = w.$oldWidget;\n }\n return list;\n };\n \n this.onWidgetChanged = function(w) {\n this.session._changedWidgets.push(w);\n this.editor && this.editor.renderer.updateFull();\n };\n \n this.measureWidgets = function(e, renderer) {\n var changedWidgets = this.session._changedWidgets;\n var config = renderer.layerConfig;\n \n if (!changedWidgets || !changedWidgets.length) return;\n var min = Infinity;\n for (var i = 0; i < changedWidgets.length; i++) {\n var w = changedWidgets[i];\n if (!w || !w.el) continue;\n if (w.session != this.session) continue;\n if (!w._inDocument) {\n if (this.session.lineWidgets[w.row] != w)\n continue;\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n \n w.h = w.el.offsetHeight;\n \n if (!w.fixedWidth) {\n w.w = w.el.offsetWidth;\n w.screenWidth = Math.ceil(w.w / config.characterWidth);\n }\n \n var rowCount = w.h / config.lineHeight;\n if (w.coverLine) {\n rowCount -= this.session.getRowLineCount(w.row);\n if (rowCount < 0)\n rowCount = 0;\n }\n if (w.rowCount != rowCount) {\n w.rowCount = rowCount;\n if (w.row < min)\n min = w.row;\n }\n }\n if (min != Infinity) {\n this.session._emit(\"changeFold\", {data:{start:{row: min}}});\n this.session.lineWidgetWidth = null;\n }\n this.session._changedWidgets = [];\n };\n \n this.renderWidgets = function(e, renderer) {\n var config = renderer.layerConfig;\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets)\n return;\n var first = Math.min(this.firstRow, config.firstRow);\n var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length);\n \n while (first > 0 && !lineWidgets[first])\n first--;\n \n this.firstRow = config.firstRow;\n this.lastRow = config.lastRow;\n\n renderer.$cursorLayer.config = config;\n for (var i = first; i <= last; i++) {\n var w = lineWidgets[i];\n if (!w || !w.el) continue;\n if (w.hidden) {\n w.el.style.top = -100 - (w.pixelHeight || 0) + \"px\";\n continue;\n }\n if (!w._inDocument) {\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top;\n if (!w.coverLine)\n top += config.lineHeight * this.session.getRowLineCount(w.row);\n w.el.style.top = top - config.offset + \"px\";\n \n var left = w.coverGutter ? 0 : renderer.gutterWidth;\n if (!w.fixedWidth)\n left -= renderer.scrollLeft;\n w.el.style.left = left + \"px\";\n \n if (w.fullWidth && w.screenWidth) {\n w.el.style.minWidth = config.width + 2 * config.padding + \"px\";\n }\n \n if (w.fixedWidth) {\n w.el.style.right = renderer.scrollBar.getWidth() + \"px\";\n } else {\n w.el.style.right = \"\";\n }\n }\n };\n \n}).call(LineWidgets.prototype);\n\n\nexports.LineWidgets = LineWidgets;\n\n});\n\nace.define(\"ace/ext/error_marker\",[\"require\",\"exports\",\"module\",\"ace/line_widgets\",\"ace/lib/dom\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\nvar LineWidgets = acequire(\"../line_widgets\").LineWidgets;\nvar dom = acequire(\"../lib/dom\");\nvar Range = acequire(\"../range\").Range;\n\nfunction binarySearch(array, needle, comparator) {\n var first = 0;\n var last = array.length - 1;\n\n while (first <= last) {\n var mid = (first + last) >> 1;\n var c = comparator(needle, array[mid]);\n if (c > 0)\n first = mid + 1;\n else if (c < 0)\n last = mid - 1;\n else\n return mid;\n }\n return -(first + 1);\n}\n\nfunction findAnnotations(session, row, dir) {\n var annotations = session.getAnnotations().sort(Range.comparePoints);\n if (!annotations.length)\n return;\n \n var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints);\n if (i < 0)\n i = -i - 1;\n \n if (i >= annotations.length)\n i = dir > 0 ? 0 : annotations.length - 1;\n else if (i === 0 && dir < 0)\n i = annotations.length - 1;\n \n var annotation = annotations[i];\n if (!annotation || !dir)\n return;\n\n if (annotation.row === row) {\n do {\n annotation = annotations[i += dir];\n } while (annotation && annotation.row === row);\n if (!annotation)\n return annotations.slice();\n }\n \n \n var matched = [];\n row = annotation.row;\n do {\n matched[dir < 0 ? \"unshift\" : \"push\"](annotation);\n annotation = annotations[i += dir];\n } while (annotation && annotation.row == row);\n return matched.length && matched;\n}\n\nexports.showErrorMarker = function(editor, dir) {\n var session = editor.session;\n if (!session.widgetManager) {\n session.widgetManager = new LineWidgets(session);\n session.widgetManager.attach(editor);\n }\n \n var pos = editor.getCursorPosition();\n var row = pos.row;\n var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) {\n return w.type == \"errorMarker\";\n })[0];\n if (oldWidget) {\n oldWidget.destroy();\n } else {\n row -= dir;\n }\n var annotations = findAnnotations(session, row, dir);\n var gutterAnno;\n if (annotations) {\n var annotation = annotations[0];\n pos.column = (annotation.pos && typeof annotation.column != \"number\"\n ? annotation.pos.sc\n : annotation.column) || 0;\n pos.row = annotation.row;\n gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row];\n } else if (oldWidget) {\n return;\n } else {\n gutterAnno = {\n text: [\"Looks good!\"],\n className: \"ace_ok\"\n };\n }\n editor.session.unfold(pos.row);\n editor.selection.moveToPosition(pos);\n \n var w = {\n row: pos.row, \n fixedWidth: true,\n coverGutter: true,\n el: dom.createElement(\"div\"),\n type: \"errorMarker\"\n };\n var el = w.el.appendChild(dom.createElement(\"div\"));\n var arrow = w.el.appendChild(dom.createElement(\"div\"));\n arrow.className = \"error_widget_arrow \" + gutterAnno.className;\n \n var left = editor.renderer.$cursorLayer\n .getPixelPosition(pos).left;\n arrow.style.left = left + editor.renderer.gutterWidth - 5 + \"px\";\n \n w.el.className = \"error_widget_wrapper\";\n el.className = \"error_widget \" + gutterAnno.className;\n el.innerHTML = gutterAnno.text.join(\"
\");\n \n el.appendChild(dom.createElement(\"div\"));\n \n var kb = function(_, hashId, keyString) {\n if (hashId === 0 && (keyString === \"esc\" || keyString === \"return\")) {\n w.destroy();\n return {command: \"null\"};\n }\n };\n \n w.destroy = function() {\n if (editor.$mouseHandler.isMousePressed)\n return;\n editor.keyBinding.removeKeyboardHandler(kb);\n session.widgetManager.removeLineWidget(w);\n editor.off(\"changeSelection\", w.destroy);\n editor.off(\"changeSession\", w.destroy);\n editor.off(\"mouseup\", w.destroy);\n editor.off(\"change\", w.destroy);\n };\n \n editor.keyBinding.addKeyboardHandler(kb);\n editor.on(\"changeSelection\", w.destroy);\n editor.on(\"changeSession\", w.destroy);\n editor.on(\"mouseup\", w.destroy);\n editor.on(\"change\", w.destroy);\n \n editor.session.widgetManager.addLineWidget(w);\n \n w.el.onmousedown = editor.focus.bind(editor);\n \n editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight});\n};\n\n\ndom.importCssString(\"\\\n .error_widget_wrapper {\\\n background: inherit;\\\n color: inherit;\\\n border:none\\\n }\\\n .error_widget {\\\n border-top: solid 2px;\\\n border-bottom: solid 2px;\\\n margin: 5px 0;\\\n padding: 10px 40px;\\\n white-space: pre-wrap;\\\n }\\\n .error_widget.ace_error, .error_widget_arrow.ace_error{\\\n border-color: #ff5a5a\\\n }\\\n .error_widget.ace_warning, .error_widget_arrow.ace_warning{\\\n border-color: #F1D817\\\n }\\\n .error_widget.ace_info, .error_widget_arrow.ace_info{\\\n border-color: #5a5a5a\\\n }\\\n .error_widget.ace_ok, .error_widget_arrow.ace_ok{\\\n border-color: #5aaa5a\\\n }\\\n .error_widget_arrow {\\\n position: absolute;\\\n border: solid 5px;\\\n border-top-color: transparent!important;\\\n border-right-color: transparent!important;\\\n border-left-color: transparent!important;\\\n top: -5px;\\\n }\\\n\", \"\");\n\n});\n\nace.define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/editor\",\"ace/edit_session\",\"ace/undomanager\",\"ace/virtual_renderer\",\"ace/worker/worker_client\",\"ace/keyboard/hash_handler\",\"ace/placeholder\",\"ace/multi_select\",\"ace/mode/folding/fold_mode\",\"ace/theme/textmate\",\"ace/ext/error_marker\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./lib/fixoldbrowsers\");\n\nvar dom = acequire(\"./lib/dom\");\nvar event = acequire(\"./lib/event\");\n\nvar Editor = acequire(\"./editor\").Editor;\nvar EditSession = acequire(\"./edit_session\").EditSession;\nvar UndoManager = acequire(\"./undomanager\").UndoManager;\nvar Renderer = acequire(\"./virtual_renderer\").VirtualRenderer;\nacequire(\"./worker/worker_client\");\nacequire(\"./keyboard/hash_handler\");\nacequire(\"./placeholder\");\nacequire(\"./multi_select\");\nacequire(\"./mode/folding/fold_mode\");\nacequire(\"./theme/textmate\");\nacequire(\"./ext/error_marker\");\n\nexports.config = acequire(\"./config\");\nexports.acequire = acequire;\n\nif (typeof define === \"function\")\n exports.define = define;\nexports.edit = function(el) {\n if (typeof el == \"string\") {\n var _id = el;\n el = document.getElementById(_id);\n if (!el)\n throw new Error(\"ace.edit can't find div #\" + _id);\n }\n\n if (el && el.env && el.env.editor instanceof Editor)\n return el.env.editor;\n\n var value = \"\";\n if (el && /input|textarea/i.test(el.tagName)) {\n var oldNode = el;\n value = oldNode.value;\n el = dom.createElement(\"pre\");\n oldNode.parentNode.replaceChild(el, oldNode);\n } else if (el) {\n value = dom.getInnerText(el);\n el.innerHTML = \"\";\n }\n\n var doc = exports.createEditSession(value);\n\n var editor = new Editor(new Renderer(el));\n editor.setSession(doc);\n\n var env = {\n document: doc,\n editor: editor,\n onResize: editor.resize.bind(editor, null)\n };\n if (oldNode) env.textarea = oldNode;\n event.addListener(window, \"resize\", env.onResize);\n editor.on(\"destroy\", function() {\n event.removeListener(window, \"resize\", env.onResize);\n env.editor.container.env = null; // prevent memory leak on old ie\n });\n editor.container.env = editor.env = env;\n return editor;\n};\nexports.createEditSession = function(text, mode) {\n var doc = new EditSession(text, mode);\n doc.setUndoManager(new UndoManager());\n return doc;\n};\nexports.EditSession = EditSession;\nexports.UndoManager = UndoManager;\nexports.version = \"1.2.9\";\n});\n (function() {\n ace.acequire([\"ace/ace\"], function(a) {\n if (a) {\n a.config.init(true);\n a.define = ace.define;\n }\n if (!window.ace)\n window.ace = a;\n for (var key in a) if (a.hasOwnProperty(key))\n window.ace[key] = a[key];\n });\n })();\n \nmodule.exports = window.ace.acequire(\"ace/ace\");","module.exports = function() {\n\tthrow new Error(\"define cannot be used indirect\");\n};\n","import {Component, Vue} from \"vue-property-decorator\";\n\n@Component({components: {}})\nexport default class att_mixins extends Vue {\n $config: any;\n formItem = {\n source: '',\n database: '',\n textarea: '',\n backup: 1,\n text: '',\n idc: '',\n table: '',\n assigned: '',\n delay: null,\n tp: 0,\n row: 1,\n name: '',\n isquery: 2,\n ip: '',\n add: '',\n username: '',\n password: '',\n port: '',\n id: 0\n };\n wordList: Array = [];\n\n page_number = 1;\n current = 1;\n find = {\n picker: [],\n user: '',\n valve: false\n };\n query = {\n user: '',\n department: '',\n valve: false,\n username: '',\n computer_room: '',\n connection_name: ''\n };\n\n table_data = [];\n\n //order\n testResults = [] as any;\n // order button disable\n validate_gen = true;\n // spin loading\n loading = false;\n\n // own-space\n is_open = false;\n group_list = [];\n group_props = [];\n edit_password = false;\n savePassLoading = false; // 保存更改密码loading按钮状态\n\n\n cancel_password() {\n this.edit_password = false\n }\n}\n","ace.define(\"ace/snippets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/lib/lang\",\"ace/range\",\"ace/anchor\",\"ace/keyboard/hash_handler\",\"ace/tokenizer\",\"ace/lib/dom\",\"ace/editor\"], function(acequire, exports, module) {\n\"use strict\";\nvar oop = acequire(\"./lib/oop\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar lang = acequire(\"./lib/lang\");\nvar Range = acequire(\"./range\").Range;\nvar Anchor = acequire(\"./anchor\").Anchor;\nvar HashHandler = acequire(\"./keyboard/hash_handler\").HashHandler;\nvar Tokenizer = acequire(\"./tokenizer\").Tokenizer;\nvar comparePoints = Range.comparePoints;\n\nvar SnippetManager = function() {\n this.snippetMap = {};\n this.snippetNameMap = {};\n};\n\n(function() {\n oop.implement(this, EventEmitter);\n \n this.getTokenizer = function() {\n function TabstopToken(str, _, stack) {\n str = str.substr(1);\n if (/^\\d+$/.test(str) && !stack.inFormatString)\n return [{tabstopId: parseInt(str, 10)}];\n return [{text: str}];\n }\n function escape(ch) {\n return \"(?:[^\\\\\\\\\" + ch + \"]|\\\\\\\\.)\";\n }\n SnippetManager.$tokenizer = new Tokenizer({\n start: [\n {regex: /:/, onMatch: function(val, state, stack) {\n if (stack.length && stack[0].expectIf) {\n stack[0].expectIf = false;\n stack[0].elseBranch = stack[0];\n return [stack[0]];\n }\n return \":\";\n }},\n {regex: /\\\\./, onMatch: function(val, state, stack) {\n var ch = val[1];\n if (ch == \"}\" && stack.length) {\n val = ch;\n }else if (\"`$\\\\\".indexOf(ch) != -1) {\n val = ch;\n } else if (stack.inFormatString) {\n if (ch == \"n\")\n val = \"\\n\";\n else if (ch == \"t\")\n val = \"\\n\";\n else if (\"ulULE\".indexOf(ch) != -1) {\n val = {changeCase: ch, local: ch > \"a\"};\n }\n }\n\n return [val];\n }},\n {regex: /}/, onMatch: function(val, state, stack) {\n return [stack.length ? stack.shift() : val];\n }},\n {regex: /\\$(?:\\d+|\\w+)/, onMatch: TabstopToken},\n {regex: /\\$\\{[\\dA-Z_a-z]+/, onMatch: function(str, state, stack) {\n var t = TabstopToken(str.substr(1), state, stack);\n stack.unshift(t[0]);\n return t;\n }, next: \"snippetVar\"},\n {regex: /\\n/, token: \"newline\", merge: false}\n ],\n snippetVar: [\n {regex: \"\\\\|\" + escape(\"\\\\|\") + \"*\\\\|\", onMatch: function(val, state, stack) {\n stack[0].choices = val.slice(1, -1).split(\",\");\n }, next: \"start\"},\n {regex: \"/(\" + escape(\"/\") + \"+)/(?:(\" + escape(\"/\") + \"*)/)(\\\\w*):?\",\n onMatch: function(val, state, stack) {\n var ts = stack[0];\n ts.fmtString = val;\n\n val = this.splitRegex.exec(val);\n ts.guard = val[1];\n ts.fmt = val[2];\n ts.flag = val[3];\n return \"\";\n }, next: \"start\"},\n {regex: \"`\" + escape(\"`\") + \"*`\", onMatch: function(val, state, stack) {\n stack[0].code = val.splice(1, -1);\n return \"\";\n }, next: \"start\"},\n {regex: \"\\\\?\", onMatch: function(val, state, stack) {\n if (stack[0])\n stack[0].expectIf = true;\n }, next: \"start\"},\n {regex: \"([^:}\\\\\\\\]|\\\\\\\\.)*:?\", token: \"\", next: \"start\"}\n ],\n formatString: [\n {regex: \"/(\" + escape(\"/\") + \"+)/\", token: \"regex\"},\n {regex: \"\", onMatch: function(val, state, stack) {\n stack.inFormatString = true;\n }, next: \"start\"}\n ]\n });\n SnippetManager.prototype.getTokenizer = function() {\n return SnippetManager.$tokenizer;\n };\n return SnippetManager.$tokenizer;\n };\n\n this.tokenizeTmSnippet = function(str, startState) {\n return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) {\n return x.value || x;\n });\n };\n\n this.$getDefaultValue = function(editor, name) {\n if (/^[A-Z]\\d+$/.test(name)) {\n var i = name.substr(1);\n return (this.variables[name[0] + \"__\"] || {})[i];\n }\n if (/^\\d+$/.test(name)) {\n return (this.variables.__ || {})[name];\n }\n name = name.replace(/^TM_/, \"\");\n\n if (!editor)\n return;\n var s = editor.session;\n switch(name) {\n case \"CURRENT_WORD\":\n var r = s.getWordRange();\n case \"SELECTION\":\n case \"SELECTED_TEXT\":\n return s.getTextRange(r);\n case \"CURRENT_LINE\":\n return s.getLine(editor.getCursorPosition().row);\n case \"PREV_LINE\": // not possible in textmate\n return s.getLine(editor.getCursorPosition().row - 1);\n case \"LINE_INDEX\":\n return editor.getCursorPosition().column;\n case \"LINE_NUMBER\":\n return editor.getCursorPosition().row + 1;\n case \"SOFT_TABS\":\n return s.getUseSoftTabs() ? \"YES\" : \"NO\";\n case \"TAB_SIZE\":\n return s.getTabSize();\n case \"FILENAME\":\n case \"FILEPATH\":\n return \"\";\n case \"FULLNAME\":\n return \"Ace\";\n }\n };\n this.variables = {};\n this.getVariableValue = function(editor, varName) {\n if (this.variables.hasOwnProperty(varName))\n return this.variables[varName](editor, varName) || \"\";\n return this.$getDefaultValue(editor, varName) || \"\";\n };\n this.tmStrFormat = function(str, ch, editor) {\n var flag = ch.flag || \"\";\n var re = ch.guard;\n re = new RegExp(re, flag.replace(/[^gi]/, \"\"));\n var fmtTokens = this.tokenizeTmSnippet(ch.fmt, \"formatString\");\n var _self = this;\n var formatted = str.replace(re, function() {\n _self.variables.__ = arguments;\n var fmtParts = _self.resolveVariables(fmtTokens, editor);\n var gChangeCase = \"E\";\n for (var i = 0; i < fmtParts.length; i++) {\n var ch = fmtParts[i];\n if (typeof ch == \"object\") {\n fmtParts[i] = \"\";\n if (ch.changeCase && ch.local) {\n var next = fmtParts[i + 1];\n if (next && typeof next == \"string\") {\n if (ch.changeCase == \"u\")\n fmtParts[i] = next[0].toUpperCase();\n else\n fmtParts[i] = next[0].toLowerCase();\n fmtParts[i + 1] = next.substr(1);\n }\n } else if (ch.changeCase) {\n gChangeCase = ch.changeCase;\n }\n } else if (gChangeCase == \"U\") {\n fmtParts[i] = ch.toUpperCase();\n } else if (gChangeCase == \"L\") {\n fmtParts[i] = ch.toLowerCase();\n }\n }\n return fmtParts.join(\"\");\n });\n this.variables.__ = null;\n return formatted;\n };\n\n this.resolveVariables = function(snippet, editor) {\n var result = [];\n for (var i = 0; i < snippet.length; i++) {\n var ch = snippet[i];\n if (typeof ch == \"string\") {\n result.push(ch);\n } else if (typeof ch != \"object\") {\n continue;\n } else if (ch.skip) {\n gotoNext(ch);\n } else if (ch.processed < i) {\n continue;\n } else if (ch.text) {\n var value = this.getVariableValue(editor, ch.text);\n if (value && ch.fmtString)\n value = this.tmStrFormat(value, ch);\n ch.processed = i;\n if (ch.expectIf == null) {\n if (value) {\n result.push(value);\n gotoNext(ch);\n }\n } else {\n if (value) {\n ch.skip = ch.elseBranch;\n } else\n gotoNext(ch);\n }\n } else if (ch.tabstopId != null) {\n result.push(ch);\n } else if (ch.changeCase != null) {\n result.push(ch);\n }\n }\n function gotoNext(ch) {\n var i1 = snippet.indexOf(ch, i + 1);\n if (i1 != -1)\n i = i1;\n }\n return result;\n };\n\n this.insertSnippetForSelection = function(editor, snippetText) {\n var cursor = editor.getCursorPosition();\n var line = editor.session.getLine(cursor.row);\n var tabString = editor.session.getTabString();\n var indentString = line.match(/^\\s*/)[0];\n \n if (cursor.column < indentString.length)\n indentString = indentString.slice(0, cursor.column);\n\n snippetText = snippetText.replace(/\\r/g, \"\");\n var tokens = this.tokenizeTmSnippet(snippetText);\n tokens = this.resolveVariables(tokens, editor);\n tokens = tokens.map(function(x) {\n if (x == \"\\n\")\n return x + indentString;\n if (typeof x == \"string\")\n return x.replace(/\\t/g, tabString);\n return x;\n });\n var tabstops = [];\n tokens.forEach(function(p, i) {\n if (typeof p != \"object\")\n return;\n var id = p.tabstopId;\n var ts = tabstops[id];\n if (!ts) {\n ts = tabstops[id] = [];\n ts.index = id;\n ts.value = \"\";\n }\n if (ts.indexOf(p) !== -1)\n return;\n ts.push(p);\n var i1 = tokens.indexOf(p, i + 1);\n if (i1 === -1)\n return;\n\n var value = tokens.slice(i + 1, i1);\n var isNested = value.some(function(t) {return typeof t === \"object\";});\n if (isNested && !ts.value) {\n ts.value = value;\n } else if (value.length && (!ts.value || typeof ts.value !== \"string\")) {\n ts.value = value.join(\"\");\n }\n });\n tabstops.forEach(function(ts) {ts.length = 0;});\n var expanding = {};\n function copyValue(val) {\n var copy = [];\n for (var i = 0; i < val.length; i++) {\n var p = val[i];\n if (typeof p == \"object\") {\n if (expanding[p.tabstopId])\n continue;\n var j = val.lastIndexOf(p, i - 1);\n p = copy[j] || {tabstopId: p.tabstopId};\n }\n copy[i] = p;\n }\n return copy;\n }\n for (var i = 0; i < tokens.length; i++) {\n var p = tokens[i];\n if (typeof p != \"object\")\n continue;\n var id = p.tabstopId;\n var i1 = tokens.indexOf(p, i + 1);\n if (expanding[id]) {\n if (expanding[id] === p)\n expanding[id] = null;\n continue;\n }\n \n var ts = tabstops[id];\n var arg = typeof ts.value == \"string\" ? [ts.value] : copyValue(ts.value);\n arg.unshift(i + 1, Math.max(0, i1 - i));\n arg.push(p);\n expanding[id] = p;\n tokens.splice.apply(tokens, arg);\n\n if (ts.indexOf(p) === -1)\n ts.push(p);\n }\n var row = 0, column = 0;\n var text = \"\";\n tokens.forEach(function(t) {\n if (typeof t === \"string\") {\n var lines = t.split(\"\\n\");\n if (lines.length > 1){\n column = lines[lines.length - 1].length;\n row += lines.length - 1;\n } else\n column += t.length;\n text += t;\n } else {\n if (!t.start)\n t.start = {row: row, column: column};\n else\n t.end = {row: row, column: column};\n }\n });\n var range = editor.getSelectionRange();\n var end = editor.session.replace(range, text);\n\n var tabstopManager = new TabstopManager(editor);\n var selectionId = editor.inVirtualSelectionMode && editor.selection.index;\n tabstopManager.addTabstops(tabstops, range.start, end, selectionId);\n };\n \n this.insertSnippet = function(editor, snippetText) {\n var self = this;\n if (editor.inVirtualSelectionMode)\n return self.insertSnippetForSelection(editor, snippetText);\n \n editor.forEachSelection(function() {\n self.insertSnippetForSelection(editor, snippetText);\n }, null, {keepOrder: true});\n \n if (editor.tabstopManager)\n editor.tabstopManager.tabNext();\n };\n\n this.$getScope = function(editor) {\n var scope = editor.session.$mode.$id || \"\";\n scope = scope.split(\"/\").pop();\n if (scope === \"html\" || scope === \"php\") {\n if (scope === \"php\" && !editor.session.$mode.inlinePhp) \n scope = \"html\";\n var c = editor.getCursorPosition();\n var state = editor.session.getState(c.row);\n if (typeof state === \"object\") {\n state = state[0];\n }\n if (state.substring) {\n if (state.substring(0, 3) == \"js-\")\n scope = \"javascript\";\n else if (state.substring(0, 4) == \"css-\")\n scope = \"css\";\n else if (state.substring(0, 4) == \"php-\")\n scope = \"php\";\n }\n }\n \n return scope;\n };\n\n this.getActiveScopes = function(editor) {\n var scope = this.$getScope(editor);\n var scopes = [scope];\n var snippetMap = this.snippetMap;\n if (snippetMap[scope] && snippetMap[scope].includeScopes) {\n scopes.push.apply(scopes, snippetMap[scope].includeScopes);\n }\n scopes.push(\"_\");\n return scopes;\n };\n\n this.expandWithTab = function(editor, options) {\n var self = this;\n var result = editor.forEachSelection(function() {\n return self.expandSnippetForSelection(editor, options);\n }, null, {keepOrder: true});\n if (result && editor.tabstopManager)\n editor.tabstopManager.tabNext();\n return result;\n };\n \n this.expandSnippetForSelection = function(editor, options) {\n var cursor = editor.getCursorPosition();\n var line = editor.session.getLine(cursor.row);\n var before = line.substring(0, cursor.column);\n var after = line.substr(cursor.column);\n\n var snippetMap = this.snippetMap;\n var snippet;\n this.getActiveScopes(editor).some(function(scope) {\n var snippets = snippetMap[scope];\n if (snippets)\n snippet = this.findMatchingSnippet(snippets, before, after);\n return !!snippet;\n }, this);\n if (!snippet)\n return false;\n if (options && options.dryRun)\n return true;\n editor.session.doc.removeInLine(cursor.row,\n cursor.column - snippet.replaceBefore.length,\n cursor.column + snippet.replaceAfter.length\n );\n\n this.variables.M__ = snippet.matchBefore;\n this.variables.T__ = snippet.matchAfter;\n this.insertSnippetForSelection(editor, snippet.content);\n\n this.variables.M__ = this.variables.T__ = null;\n return true;\n };\n\n this.findMatchingSnippet = function(snippetList, before, after) {\n for (var i = snippetList.length; i--;) {\n var s = snippetList[i];\n if (s.startRe && !s.startRe.test(before))\n continue;\n if (s.endRe && !s.endRe.test(after))\n continue;\n if (!s.startRe && !s.endRe)\n continue;\n\n s.matchBefore = s.startRe ? s.startRe.exec(before) : [\"\"];\n s.matchAfter = s.endRe ? s.endRe.exec(after) : [\"\"];\n s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : \"\";\n s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : \"\";\n return s;\n }\n };\n\n this.snippetMap = {};\n this.snippetNameMap = {};\n this.register = function(snippets, scope) {\n var snippetMap = this.snippetMap;\n var snippetNameMap = this.snippetNameMap;\n var self = this;\n \n if (!snippets) \n snippets = [];\n \n function wrapRegexp(src) {\n if (src && !/^\\^?\\(.*\\)\\$?$|^\\\\b$/.test(src))\n src = \"(?:\" + src + \")\";\n\n return src || \"\";\n }\n function guardedRegexp(re, guard, opening) {\n re = wrapRegexp(re);\n guard = wrapRegexp(guard);\n if (opening) {\n re = guard + re;\n if (re && re[re.length - 1] != \"$\")\n re = re + \"$\";\n } else {\n re = re + guard;\n if (re && re[0] != \"^\")\n re = \"^\" + re;\n }\n return new RegExp(re);\n }\n\n function addSnippet(s) {\n if (!s.scope)\n s.scope = scope || \"_\";\n scope = s.scope;\n if (!snippetMap[scope]) {\n snippetMap[scope] = [];\n snippetNameMap[scope] = {};\n }\n\n var map = snippetNameMap[scope];\n if (s.name) {\n var old = map[s.name];\n if (old)\n self.unregister(old);\n map[s.name] = s;\n }\n snippetMap[scope].push(s);\n\n if (s.tabTrigger && !s.trigger) {\n if (!s.guard && /^\\w/.test(s.tabTrigger))\n s.guard = \"\\\\b\";\n s.trigger = lang.escapeRegExp(s.tabTrigger);\n }\n \n if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard)\n return;\n \n s.startRe = guardedRegexp(s.trigger, s.guard, true);\n s.triggerRe = new RegExp(s.trigger, \"\", true);\n\n s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true);\n s.endTriggerRe = new RegExp(s.endTrigger, \"\", true);\n }\n\n if (snippets && snippets.content)\n addSnippet(snippets);\n else if (Array.isArray(snippets))\n snippets.forEach(addSnippet);\n \n this._signal(\"registerSnippets\", {scope: scope});\n };\n this.unregister = function(snippets, scope) {\n var snippetMap = this.snippetMap;\n var snippetNameMap = this.snippetNameMap;\n\n function removeSnippet(s) {\n var nameMap = snippetNameMap[s.scope||scope];\n if (nameMap && nameMap[s.name]) {\n delete nameMap[s.name];\n var map = snippetMap[s.scope||scope];\n var i = map && map.indexOf(s);\n if (i >= 0)\n map.splice(i, 1);\n }\n }\n if (snippets.content)\n removeSnippet(snippets);\n else if (Array.isArray(snippets))\n snippets.forEach(removeSnippet);\n };\n this.parseSnippetFile = function(str) {\n str = str.replace(/\\r/g, \"\");\n var list = [], snippet = {};\n var re = /^#.*|^({[\\s\\S]*})\\s*$|^(\\S+) (.*)$|^((?:\\n*\\t.*)+)/gm;\n var m;\n while (m = re.exec(str)) {\n if (m[1]) {\n try {\n snippet = JSON.parse(m[1]);\n list.push(snippet);\n } catch (e) {}\n } if (m[4]) {\n snippet.content = m[4].replace(/^\\t/gm, \"\");\n list.push(snippet);\n snippet = {};\n } else {\n var key = m[2], val = m[3];\n if (key == \"regex\") {\n var guardRe = /\\/((?:[^\\/\\\\]|\\\\.)*)|$/g;\n snippet.guard = guardRe.exec(val)[1];\n snippet.trigger = guardRe.exec(val)[1];\n snippet.endTrigger = guardRe.exec(val)[1];\n snippet.endGuard = guardRe.exec(val)[1];\n } else if (key == \"snippet\") {\n snippet.tabTrigger = val.match(/^\\S*/)[0];\n if (!snippet.name)\n snippet.name = val;\n } else {\n snippet[key] = val;\n }\n }\n }\n return list;\n };\n this.getSnippetByName = function(name, editor) {\n var snippetMap = this.snippetNameMap;\n var snippet;\n this.getActiveScopes(editor).some(function(scope) {\n var snippets = snippetMap[scope];\n if (snippets)\n snippet = snippets[name];\n return !!snippet;\n }, this);\n return snippet;\n };\n\n}).call(SnippetManager.prototype);\n\n\nvar TabstopManager = function(editor) {\n if (editor.tabstopManager)\n return editor.tabstopManager;\n editor.tabstopManager = this;\n this.$onChange = this.onChange.bind(this);\n this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule;\n this.$onChangeSession = this.onChangeSession.bind(this);\n this.$onAfterExec = this.onAfterExec.bind(this);\n this.attach(editor);\n};\n(function() {\n this.attach = function(editor) {\n this.index = 0;\n this.ranges = [];\n this.tabstops = [];\n this.$openTabstops = null;\n this.selectedTabstop = null;\n\n this.editor = editor;\n this.editor.on(\"change\", this.$onChange);\n this.editor.on(\"changeSelection\", this.$onChangeSelection);\n this.editor.on(\"changeSession\", this.$onChangeSession);\n this.editor.commands.on(\"afterExec\", this.$onAfterExec);\n this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n };\n this.detach = function() {\n this.tabstops.forEach(this.removeTabstopMarkers, this);\n this.ranges = null;\n this.tabstops = null;\n this.selectedTabstop = null;\n this.editor.removeListener(\"change\", this.$onChange);\n this.editor.removeListener(\"changeSelection\", this.$onChangeSelection);\n this.editor.removeListener(\"changeSession\", this.$onChangeSession);\n this.editor.commands.removeListener(\"afterExec\", this.$onAfterExec);\n this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);\n this.editor.tabstopManager = null;\n this.editor = null;\n };\n\n this.onChange = function(delta) {\n var changeRange = delta;\n var isRemove = delta.action[0] == \"r\";\n var start = delta.start;\n var end = delta.end;\n var startRow = start.row;\n var endRow = end.row;\n var lineDif = endRow - startRow;\n var colDiff = end.column - start.column;\n\n if (isRemove) {\n lineDif = -lineDif;\n colDiff = -colDiff;\n }\n if (!this.$inChange && isRemove) {\n var ts = this.selectedTabstop;\n var changedOutside = ts && !ts.some(function(r) {\n return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0;\n });\n if (changedOutside)\n return this.detach();\n }\n var ranges = this.ranges;\n for (var i = 0; i < ranges.length; i++) {\n var r = ranges[i];\n if (r.end.row < start.row)\n continue;\n\n if (isRemove && comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) {\n this.removeRange(r);\n i--;\n continue;\n }\n\n if (r.start.row == startRow && r.start.column > start.column)\n r.start.column += colDiff;\n if (r.end.row == startRow && r.end.column >= start.column)\n r.end.column += colDiff;\n if (r.start.row >= startRow)\n r.start.row += lineDif;\n if (r.end.row >= startRow)\n r.end.row += lineDif;\n\n if (comparePoints(r.start, r.end) > 0)\n this.removeRange(r);\n }\n if (!ranges.length)\n this.detach();\n };\n this.updateLinkedFields = function() {\n var ts = this.selectedTabstop;\n if (!ts || !ts.hasLinkedRanges)\n return;\n this.$inChange = true;\n var session = this.editor.session;\n var text = session.getTextRange(ts.firstNonLinked);\n for (var i = ts.length; i--;) {\n var range = ts[i];\n if (!range.linked)\n continue;\n var fmt = exports.snippetManager.tmStrFormat(text, range.original);\n session.replace(range, fmt);\n }\n this.$inChange = false;\n };\n this.onAfterExec = function(e) {\n if (e.command && !e.command.readOnly)\n this.updateLinkedFields();\n };\n this.onChangeSelection = function() {\n if (!this.editor)\n return;\n var lead = this.editor.selection.lead;\n var anchor = this.editor.selection.anchor;\n var isEmpty = this.editor.selection.isEmpty();\n for (var i = this.ranges.length; i--;) {\n if (this.ranges[i].linked)\n continue;\n var containsLead = this.ranges[i].contains(lead.row, lead.column);\n var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column);\n if (containsLead && containsAnchor)\n return;\n }\n this.detach();\n };\n this.onChangeSession = function() {\n this.detach();\n };\n this.tabNext = function(dir) {\n var max = this.tabstops.length;\n var index = this.index + (dir || 1);\n index = Math.min(Math.max(index, 1), max);\n if (index == max)\n index = 0;\n this.selectTabstop(index);\n if (index === 0)\n this.detach();\n };\n this.selectTabstop = function(index) {\n this.$openTabstops = null;\n var ts = this.tabstops[this.index];\n if (ts)\n this.addTabstopMarkers(ts);\n this.index = index;\n ts = this.tabstops[this.index];\n if (!ts || !ts.length)\n return;\n \n this.selectedTabstop = ts;\n if (!this.editor.inVirtualSelectionMode) { \n var sel = this.editor.multiSelect;\n sel.toSingleRange(ts.firstNonLinked.clone());\n for (var i = ts.length; i--;) {\n if (ts.hasLinkedRanges && ts[i].linked)\n continue;\n sel.addRange(ts[i].clone(), true);\n }\n if (sel.ranges[0])\n sel.addRange(sel.ranges[0].clone());\n } else {\n this.editor.selection.setRange(ts.firstNonLinked);\n }\n \n this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n };\n this.addTabstops = function(tabstops, start, end) {\n if (!this.$openTabstops)\n this.$openTabstops = [];\n if (!tabstops[0]) {\n var p = Range.fromPoints(end, end);\n moveRelative(p.start, start);\n moveRelative(p.end, start);\n tabstops[0] = [p];\n tabstops[0].index = 0;\n }\n\n var i = this.index;\n var arg = [i + 1, 0];\n var ranges = this.ranges;\n tabstops.forEach(function(ts, index) {\n var dest = this.$openTabstops[index] || ts;\n \n for (var i = ts.length; i--;) {\n var p = ts[i];\n var range = Range.fromPoints(p.start, p.end || p.start);\n movePoint(range.start, start);\n movePoint(range.end, start);\n range.original = p;\n range.tabstop = dest;\n ranges.push(range);\n if (dest != ts)\n dest.unshift(range);\n else\n dest[i] = range;\n if (p.fmtString) {\n range.linked = true;\n dest.hasLinkedRanges = true;\n } else if (!dest.firstNonLinked)\n dest.firstNonLinked = range;\n }\n if (!dest.firstNonLinked)\n dest.hasLinkedRanges = false;\n if (dest === ts) {\n arg.push(dest);\n this.$openTabstops[index] = dest;\n }\n this.addTabstopMarkers(dest);\n }, this);\n \n if (arg.length > 2) {\n if (this.tabstops.length)\n arg.push(arg.splice(2, 1)[0]);\n this.tabstops.splice.apply(this.tabstops, arg);\n }\n };\n\n this.addTabstopMarkers = function(ts) {\n var session = this.editor.session;\n ts.forEach(function(range) {\n if (!range.markerId)\n range.markerId = session.addMarker(range, \"ace_snippet-marker\", \"text\");\n });\n };\n this.removeTabstopMarkers = function(ts) {\n var session = this.editor.session;\n ts.forEach(function(range) {\n session.removeMarker(range.markerId);\n range.markerId = null;\n });\n };\n this.removeRange = function(range) {\n var i = range.tabstop.indexOf(range);\n range.tabstop.splice(i, 1);\n i = this.ranges.indexOf(range);\n this.ranges.splice(i, 1);\n this.editor.session.removeMarker(range.markerId);\n if (!range.tabstop.length) {\n i = this.tabstops.indexOf(range.tabstop);\n if (i != -1)\n this.tabstops.splice(i, 1);\n if (!this.tabstops.length)\n this.detach();\n }\n };\n\n this.keyboardHandler = new HashHandler();\n this.keyboardHandler.bindKeys({\n \"Tab\": function(ed) {\n if (exports.snippetManager && exports.snippetManager.expandWithTab(ed)) {\n return;\n }\n\n ed.tabstopManager.tabNext(1);\n },\n \"Shift-Tab\": function(ed) {\n ed.tabstopManager.tabNext(-1);\n },\n \"Esc\": function(ed) {\n ed.tabstopManager.detach();\n },\n \"Return\": function(ed) {\n return false;\n }\n });\n}).call(TabstopManager.prototype);\n\n\n\nvar changeTracker = {};\nchangeTracker.onChange = Anchor.prototype.onChange;\nchangeTracker.setPosition = function(row, column) {\n this.pos.row = row;\n this.pos.column = column;\n};\nchangeTracker.update = function(pos, delta, $insertRight) {\n this.$insertRight = $insertRight;\n this.pos = pos; \n this.onChange(delta);\n};\n\nvar movePoint = function(point, diff) {\n if (point.row == 0)\n point.column += diff.column;\n point.row += diff.row;\n};\n\nvar moveRelative = function(point, start) {\n if (point.row == start.row)\n point.column -= start.column;\n point.row -= start.row;\n};\n\n\nacequire(\"./lib/dom\").importCssString(\"\\\n.ace_snippet-marker {\\\n -moz-box-sizing: border-box;\\\n box-sizing: border-box;\\\n background: rgba(194, 193, 208, 0.09);\\\n border: 1px dotted rgba(211, 208, 235, 0.62);\\\n position: absolute;\\\n}\");\n\nexports.snippetManager = new SnippetManager();\n\n\nvar Editor = acequire(\"./editor\").Editor;\n(function() {\n this.insertSnippet = function(content, options) {\n return exports.snippetManager.insertSnippet(this, content, options);\n };\n this.expandSnippet = function(options) {\n return exports.snippetManager.expandWithTab(this, options);\n };\n}).call(Editor.prototype);\n\n});\n\nace.define(\"ace/autocomplete/popup\",[\"require\",\"exports\",\"module\",\"ace/virtual_renderer\",\"ace/editor\",\"ace/range\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Renderer = acequire(\"../virtual_renderer\").VirtualRenderer;\nvar Editor = acequire(\"../editor\").Editor;\nvar Range = acequire(\"../range\").Range;\nvar event = acequire(\"../lib/event\");\nvar lang = acequire(\"../lib/lang\");\nvar dom = acequire(\"../lib/dom\");\n\nvar $singleLineEditor = function(el) {\n var renderer = new Renderer(el);\n\n renderer.$maxLines = 4;\n\n var editor = new Editor(renderer);\n\n editor.setHighlightActiveLine(false);\n editor.setShowPrintMargin(false);\n editor.renderer.setShowGutter(false);\n editor.renderer.setHighlightGutterLine(false);\n\n editor.$mouseHandler.$focusWaitTimout = 0;\n editor.$highlightTagPending = true;\n\n return editor;\n};\n\nvar AcePopup = function(parentNode) {\n var el = dom.createElement(\"div\");\n var popup = new $singleLineEditor(el);\n\n if (parentNode)\n parentNode.appendChild(el);\n el.style.display = \"none\";\n popup.renderer.content.style.cursor = \"default\";\n popup.renderer.setStyle(\"ace_autocomplete\");\n\n popup.setOption(\"displayIndentGuides\", false);\n popup.setOption(\"dragDelay\", 150);\n\n var noop = function(){};\n\n popup.focus = noop;\n popup.$isFocused = true;\n\n popup.renderer.$cursorLayer.restartTimer = noop;\n popup.renderer.$cursorLayer.element.style.opacity = 0;\n\n popup.renderer.$maxLines = 8;\n popup.renderer.$keepTextAreaAtCursor = false;\n\n popup.setHighlightActiveLine(false);\n popup.session.highlight(\"\");\n popup.session.$searchHighlight.clazz = \"ace_highlight-marker\";\n\n popup.on(\"mousedown\", function(e) {\n var pos = e.getDocumentPosition();\n popup.selection.moveToPosition(pos);\n selectionMarker.start.row = selectionMarker.end.row = pos.row;\n e.stop();\n });\n\n var lastMouseEvent;\n var hoverMarker = new Range(-1,0,-1,Infinity);\n var selectionMarker = new Range(-1,0,-1,Infinity);\n selectionMarker.id = popup.session.addMarker(selectionMarker, \"ace_active-line\", \"fullLine\");\n popup.setSelectOnHover = function(val) {\n if (!val) {\n hoverMarker.id = popup.session.addMarker(hoverMarker, \"ace_line-hover\", \"fullLine\");\n } else if (hoverMarker.id) {\n popup.session.removeMarker(hoverMarker.id);\n hoverMarker.id = null;\n }\n };\n popup.setSelectOnHover(false);\n popup.on(\"mousemove\", function(e) {\n if (!lastMouseEvent) {\n lastMouseEvent = e;\n return;\n }\n if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) {\n return;\n }\n lastMouseEvent = e;\n lastMouseEvent.scrollTop = popup.renderer.scrollTop;\n var row = lastMouseEvent.getDocumentPosition().row;\n if (hoverMarker.start.row != row) {\n if (!hoverMarker.id)\n popup.setRow(row);\n setHoverMarker(row);\n }\n });\n popup.renderer.on(\"beforeRender\", function() {\n if (lastMouseEvent && hoverMarker.start.row != -1) {\n lastMouseEvent.$pos = null;\n var row = lastMouseEvent.getDocumentPosition().row;\n if (!hoverMarker.id)\n popup.setRow(row);\n setHoverMarker(row, true);\n }\n });\n popup.renderer.on(\"afterRender\", function() {\n var row = popup.getRow();\n var t = popup.renderer.$textLayer;\n var selected = t.element.childNodes[row - t.config.firstRow];\n if (selected == t.selectedNode)\n return;\n if (t.selectedNode)\n dom.removeCssClass(t.selectedNode, \"ace_selected\");\n t.selectedNode = selected;\n if (selected)\n dom.addCssClass(selected, \"ace_selected\");\n });\n var hideHoverMarker = function() { setHoverMarker(-1); };\n var setHoverMarker = function(row, suppressRedraw) {\n if (row !== hoverMarker.start.row) {\n hoverMarker.start.row = hoverMarker.end.row = row;\n if (!suppressRedraw)\n popup.session._emit(\"changeBackMarker\");\n popup._emit(\"changeHoverMarker\");\n }\n };\n popup.getHoveredRow = function() {\n return hoverMarker.start.row;\n };\n\n event.addListener(popup.container, \"mouseout\", hideHoverMarker);\n popup.on(\"hide\", hideHoverMarker);\n popup.on(\"changeSelection\", hideHoverMarker);\n\n popup.session.doc.getLength = function() {\n return popup.data.length;\n };\n popup.session.doc.getLine = function(i) {\n var data = popup.data[i];\n if (typeof data == \"string\")\n return data;\n return (data && data.value) || \"\";\n };\n\n var bgTokenizer = popup.session.bgTokenizer;\n bgTokenizer.$tokenizeRow = function(row) {\n var data = popup.data[row];\n var tokens = [];\n if (!data)\n return tokens;\n if (typeof data == \"string\")\n data = {value: data};\n if (!data.caption)\n data.caption = data.value || data.name;\n\n var last = -1;\n var flag, c;\n for (var i = 0; i < data.caption.length; i++) {\n c = data.caption[i];\n flag = data.matchMask & (1 << i) ? 1 : 0;\n if (last !== flag) {\n tokens.push({type: data.className || \"\" + ( flag ? \"completion-highlight\" : \"\"), value: c});\n last = flag;\n } else {\n tokens[tokens.length - 1].value += c;\n }\n }\n\n if (data.meta) {\n var maxW = popup.renderer.$size.scrollerWidth / popup.renderer.layerConfig.characterWidth;\n var metaData = data.meta;\n if (metaData.length + data.caption.length > maxW - 2) {\n metaData = metaData.substr(0, maxW - data.caption.length - 3) + \"\\u2026\";\n }\n tokens.push({type: \"rightAlignedText\", value: metaData});\n }\n return tokens;\n };\n bgTokenizer.$updateOnChange = noop;\n bgTokenizer.start = noop;\n\n popup.session.$computeWidth = function() {\n return this.screenWidth = 0;\n };\n\n popup.$blockScrolling = Infinity;\n popup.isOpen = false;\n popup.isTopdown = false;\n popup.autoSelect = true;\n\n popup.data = [];\n popup.setData = function(list) {\n popup.setValue(lang.stringRepeat(\"\\n\", list.length), -1);\n popup.data = list || [];\n popup.setRow(0);\n };\n popup.getData = function(row) {\n return popup.data[row];\n };\n\n popup.getRow = function() {\n return selectionMarker.start.row;\n };\n popup.setRow = function(line) {\n line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length, line));\n if (selectionMarker.start.row != line) {\n popup.selection.clearSelection();\n selectionMarker.start.row = selectionMarker.end.row = line || 0;\n popup.session._emit(\"changeBackMarker\");\n popup.moveCursorTo(line || 0, 0);\n if (popup.isOpen)\n popup._signal(\"select\");\n }\n };\n\n popup.on(\"changeSelection\", function() {\n if (popup.isOpen)\n popup.setRow(popup.selection.lead.row);\n popup.renderer.scrollCursorIntoView();\n });\n\n popup.hide = function() {\n this.container.style.display = \"none\";\n this._signal(\"hide\");\n popup.isOpen = false;\n };\n popup.show = function(pos, lineHeight, topdownOnly) {\n var el = this.container;\n var screenHeight = window.innerHeight;\n var screenWidth = window.innerWidth;\n var renderer = this.renderer;\n var maxH = renderer.$maxLines * lineHeight * 1.4;\n var top = pos.top + this.$borderSize;\n var allowTopdown = top > screenHeight / 2 && !topdownOnly;\n if (allowTopdown && top + lineHeight + maxH > screenHeight) {\n renderer.$maxPixelHeight = top - 2 * this.$borderSize;\n el.style.top = \"\";\n el.style.bottom = screenHeight - top + \"px\";\n popup.isTopdown = false;\n } else {\n top += lineHeight;\n renderer.$maxPixelHeight = screenHeight - top - 0.2 * lineHeight;\n el.style.top = top + \"px\";\n el.style.bottom = \"\";\n popup.isTopdown = true;\n }\n\n el.style.display = \"\";\n this.renderer.$textLayer.checkForSizeChanges();\n\n var left = pos.left;\n if (left + el.offsetWidth > screenWidth)\n left = screenWidth - el.offsetWidth;\n\n el.style.left = left + \"px\";\n\n this._signal(\"show\");\n lastMouseEvent = null;\n popup.isOpen = true;\n };\n\n popup.getTextLeftOffset = function() {\n return this.$borderSize + this.renderer.$padding + this.$imageSize;\n };\n\n popup.$imageSize = 0;\n popup.$borderSize = 1;\n\n return popup;\n};\n\ndom.importCssString(\"\\\n.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\\\n background-color: #CAD6FA;\\\n z-index: 1;\\\n}\\\n.ace_editor.ace_autocomplete .ace_line-hover {\\\n border: 1px solid #abbffe;\\\n margin-top: -1px;\\\n background: rgba(233,233,253,0.4);\\\n}\\\n.ace_editor.ace_autocomplete .ace_line-hover {\\\n position: absolute;\\\n z-index: 2;\\\n}\\\n.ace_editor.ace_autocomplete .ace_scroller {\\\n background: none;\\\n border: none;\\\n box-shadow: none;\\\n}\\\n.ace_rightAlignedText {\\\n color: gray;\\\n display: inline-block;\\\n position: absolute;\\\n right: 4px;\\\n text-align: right;\\\n z-index: -1;\\\n}\\\n.ace_editor.ace_autocomplete .ace_completion-highlight{\\\n color: #000;\\\n text-shadow: 0 0 0.01em;\\\n}\\\n.ace_editor.ace_autocomplete {\\\n width: 280px;\\\n z-index: 200000;\\\n background: #fbfbfb;\\\n color: #444;\\\n border: 1px lightgray solid;\\\n position: fixed;\\\n box-shadow: 2px 3px 5px rgba(0,0,0,.2);\\\n line-height: 1.4;\\\n}\");\n\nexports.AcePopup = AcePopup;\n\n});\n\nace.define(\"ace/autocomplete/util\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.parForEach = function(array, fn, callback) {\n var completed = 0;\n var arLength = array.length;\n if (arLength === 0)\n callback();\n for (var i = 0; i < arLength; i++) {\n fn(array[i], function(result, err) {\n completed++;\n if (completed === arLength)\n callback(result, err);\n });\n }\n};\n\nvar ID_REGEX = /[a-zA-Z_0-9\\$\\-\\u00A2-\\uFFFF]/;\n\nexports.retrievePrecedingIdentifier = function(text, pos, regex) {\n regex = regex || ID_REGEX;\n var buf = [];\n for (var i = pos-1; i >= 0; i--) {\n if (regex.test(text[i]))\n buf.push(text[i]);\n else\n break;\n }\n return buf.reverse().join(\"\");\n};\n\nexports.retrieveFollowingIdentifier = function(text, pos, regex) {\n regex = regex || ID_REGEX;\n var buf = [];\n for (var i = pos; i < text.length; i++) {\n if (regex.test(text[i]))\n buf.push(text[i]);\n else\n break;\n }\n return buf;\n};\n\nexports.getCompletionPrefix = function (editor) {\n var pos = editor.getCursorPosition();\n var line = editor.session.getLine(pos.row);\n var prefix;\n editor.completers.forEach(function(completer) {\n if (completer.identifierRegexps) {\n completer.identifierRegexps.forEach(function(identifierRegex) {\n if (!prefix && identifierRegex)\n prefix = this.retrievePrecedingIdentifier(line, pos.column, identifierRegex);\n }.bind(this));\n }\n }.bind(this));\n return prefix || this.retrievePrecedingIdentifier(line, pos.column);\n};\n\n});\n\nace.define(\"ace/autocomplete\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\",\"ace/autocomplete/popup\",\"ace/autocomplete/util\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/lib/dom\",\"ace/snippets\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar HashHandler = acequire(\"./keyboard/hash_handler\").HashHandler;\nvar AcePopup = acequire(\"./autocomplete/popup\").AcePopup;\nvar util = acequire(\"./autocomplete/util\");\nvar event = acequire(\"./lib/event\");\nvar lang = acequire(\"./lib/lang\");\nvar dom = acequire(\"./lib/dom\");\nvar snippetManager = acequire(\"./snippets\").snippetManager;\n\nvar Autocomplete = function() {\n this.autoInsert = false;\n this.autoSelect = true;\n this.exactMatch = false;\n this.gatherCompletionsId = 0;\n this.keyboardHandler = new HashHandler();\n this.keyboardHandler.bindKeys(this.commands);\n\n this.blurListener = this.blurListener.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.mousedownListener = this.mousedownListener.bind(this);\n this.mousewheelListener = this.mousewheelListener.bind(this);\n\n this.changeTimer = lang.delayedCall(function() {\n this.updateCompletions(true);\n }.bind(this));\n\n this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50);\n};\n\n(function() {\n\n this.$init = function() {\n this.popup = new AcePopup(document.body || document.documentElement);\n this.popup.on(\"click\", function(e) {\n this.insertMatch();\n e.stop();\n }.bind(this));\n this.popup.focus = this.editor.focus.bind(this.editor);\n this.popup.on(\"show\", this.tooltipTimer.bind(null, null));\n this.popup.on(\"select\", this.tooltipTimer.bind(null, null));\n this.popup.on(\"changeHoverMarker\", this.tooltipTimer.bind(null, null));\n return this.popup;\n };\n\n this.getPopup = function() {\n return this.popup || this.$init();\n };\n\n this.openPopup = function(editor, prefix, keepPopupPosition) {\n if (!this.popup)\n this.$init();\n\n\tthis.popup.autoSelect = this.autoSelect;\n\n this.popup.setData(this.completions.filtered);\n\n editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n \n var renderer = editor.renderer;\n this.popup.setRow(this.autoSelect ? 0 : -1);\n if (!keepPopupPosition) {\n this.popup.setTheme(editor.getTheme());\n this.popup.setFontSize(editor.getFontSize());\n\n var lineHeight = renderer.layerConfig.lineHeight;\n\n var pos = renderer.$cursorLayer.getPixelPosition(this.base, true);\n pos.left -= this.popup.getTextLeftOffset();\n\n var rect = editor.container.getBoundingClientRect();\n pos.top += rect.top - renderer.layerConfig.offset;\n pos.left += rect.left - editor.renderer.scrollLeft;\n pos.left += renderer.gutterWidth;\n\n this.popup.show(pos, lineHeight);\n } else if (keepPopupPosition && !prefix) {\n this.detach();\n }\n };\n\n this.detach = function() {\n this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);\n this.editor.off(\"changeSelection\", this.changeListener);\n this.editor.off(\"blur\", this.blurListener);\n this.editor.off(\"mousedown\", this.mousedownListener);\n this.editor.off(\"mousewheel\", this.mousewheelListener);\n this.changeTimer.cancel();\n this.hideDocTooltip();\n\n this.gatherCompletionsId += 1;\n if (this.popup && this.popup.isOpen)\n this.popup.hide();\n\n if (this.base)\n this.base.detach();\n this.activated = false;\n this.completions = this.base = null;\n };\n\n this.changeListener = function(e) {\n var cursor = this.editor.selection.lead;\n if (cursor.row != this.base.row || cursor.column < this.base.column) {\n this.detach();\n }\n if (this.activated)\n this.changeTimer.schedule();\n else\n this.detach();\n };\n\n this.blurListener = function(e) {\n var el = document.activeElement;\n var text = this.editor.textInput.getElement();\n var fromTooltip = e.relatedTarget && this.tooltipNode && this.tooltipNode.contains(e.relatedTarget);\n var container = this.popup && this.popup.container;\n if (el != text && el.parentNode != container && !fromTooltip\n && el != this.tooltipNode && e.relatedTarget != text\n ) {\n this.detach();\n }\n };\n\n this.mousedownListener = function(e) {\n this.detach();\n };\n\n this.mousewheelListener = function(e) {\n this.detach();\n };\n\n this.goTo = function(where) {\n var row = this.popup.getRow();\n var max = this.popup.session.getLength() - 1;\n\n switch(where) {\n case \"up\": row = row <= 0 ? max : row - 1; break;\n case \"down\": row = row >= max ? -1 : row + 1; break;\n case \"start\": row = 0; break;\n case \"end\": row = max; break;\n }\n\n this.popup.setRow(row);\n };\n\n this.insertMatch = function(data, options) {\n if (!data)\n data = this.popup.getData(this.popup.getRow());\n if (!data)\n return false;\n\n if (data.completer && data.completer.insertMatch) {\n data.completer.insertMatch(this.editor, data);\n } else {\n if (this.completions.filterText) {\n var ranges = this.editor.selection.getAllRanges();\n for (var i = 0, range; range = ranges[i]; i++) {\n range.start.column -= this.completions.filterText.length;\n this.editor.session.remove(range);\n }\n }\n if (data.snippet)\n snippetManager.insertSnippet(this.editor, data.snippet);\n else\n this.editor.execCommand(\"insertstring\", data.value || data);\n }\n this.detach();\n };\n\n\n this.commands = {\n \"Up\": function(editor) { editor.completer.goTo(\"up\"); },\n \"Down\": function(editor) { editor.completer.goTo(\"down\"); },\n \"Ctrl-Up|Ctrl-Home\": function(editor) { editor.completer.goTo(\"start\"); },\n \"Ctrl-Down|Ctrl-End\": function(editor) { editor.completer.goTo(\"end\"); },\n\n \"Esc\": function(editor) { editor.completer.detach(); },\n \"Return\": function(editor) { return editor.completer.insertMatch(); },\n \"Shift-Return\": function(editor) { editor.completer.insertMatch(null, {deleteSuffix: true}); },\n \"Tab\": function(editor) {\n var result = editor.completer.insertMatch();\n if (!result && !editor.tabstopManager)\n editor.completer.goTo(\"down\");\n else\n return result;\n },\n\n \"PageUp\": function(editor) { editor.completer.popup.gotoPageUp(); },\n \"PageDown\": function(editor) { editor.completer.popup.gotoPageDown(); }\n };\n\n this.gatherCompletions = function(editor, callback) {\n var session = editor.getSession();\n var pos = editor.getCursorPosition();\n\n var prefix = util.getCompletionPrefix(editor);\n\n this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length);\n this.base.$insertRight = true;\n\n var matches = [];\n var total = editor.completers.length;\n editor.completers.forEach(function(completer, i) {\n completer.getCompletions(editor, session, pos, prefix, function(err, results) {\n if (!err && results)\n matches = matches.concat(results);\n callback(null, {\n prefix: util.getCompletionPrefix(editor),\n matches: matches,\n finished: (--total === 0)\n });\n });\n });\n return true;\n };\n\n this.showPopup = function(editor) {\n if (this.editor)\n this.detach();\n\n this.activated = true;\n\n this.editor = editor;\n if (editor.completer != this) {\n if (editor.completer)\n editor.completer.detach();\n editor.completer = this;\n }\n\n editor.on(\"changeSelection\", this.changeListener);\n editor.on(\"blur\", this.blurListener);\n editor.on(\"mousedown\", this.mousedownListener);\n editor.on(\"mousewheel\", this.mousewheelListener);\n\n this.updateCompletions();\n };\n\n this.updateCompletions = function(keepPopupPosition) {\n if (keepPopupPosition && this.base && this.completions) {\n var pos = this.editor.getCursorPosition();\n var prefix = this.editor.session.getTextRange({start: this.base, end: pos});\n if (prefix == this.completions.filterText)\n return;\n this.completions.setFilter(prefix);\n if (!this.completions.filtered.length)\n return this.detach();\n if (this.completions.filtered.length == 1\n && this.completions.filtered[0].value == prefix\n && !this.completions.filtered[0].snippet)\n return this.detach();\n this.openPopup(this.editor, prefix, keepPopupPosition);\n return;\n }\n var _id = this.gatherCompletionsId;\n this.gatherCompletions(this.editor, function(err, results) {\n var detachIfFinished = function() {\n if (!results.finished) return;\n return this.detach();\n }.bind(this);\n\n var prefix = results.prefix;\n var matches = results && results.matches;\n\n if (!matches || !matches.length)\n return detachIfFinished();\n if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId)\n return;\n\n this.completions = new FilteredList(matches);\n\n if (this.exactMatch)\n this.completions.exactMatch = true;\n\n this.completions.setFilter(prefix);\n var filtered = this.completions.filtered;\n if (!filtered.length)\n return detachIfFinished();\n if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet)\n return detachIfFinished();\n if (this.autoInsert && filtered.length == 1 && results.finished)\n return this.insertMatch(filtered[0]);\n\n this.openPopup(this.editor, prefix, keepPopupPosition);\n }.bind(this));\n };\n\n this.cancelContextMenu = function() {\n this.editor.$mouseHandler.cancelContextMenu();\n };\n\n this.updateDocTooltip = function() {\n var popup = this.popup;\n var all = popup.data;\n var selected = all && (all[popup.getHoveredRow()] || all[popup.getRow()]);\n var doc = null;\n if (!selected || !this.editor || !this.popup.isOpen)\n return this.hideDocTooltip();\n this.editor.completers.some(function(completer) {\n if (completer.getDocTooltip)\n doc = completer.getDocTooltip(selected);\n return doc;\n });\n if (!doc)\n doc = selected;\n\n if (typeof doc == \"string\")\n doc = {docText: doc};\n if (!doc || !(doc.docHTML || doc.docText))\n return this.hideDocTooltip();\n this.showDocTooltip(doc);\n };\n\n this.showDocTooltip = function(item) {\n if (!this.tooltipNode) {\n this.tooltipNode = dom.createElement(\"div\");\n this.tooltipNode.className = \"ace_tooltip ace_doc-tooltip\";\n this.tooltipNode.style.margin = 0;\n this.tooltipNode.style.pointerEvents = \"auto\";\n this.tooltipNode.tabIndex = -1;\n this.tooltipNode.onblur = this.blurListener.bind(this);\n this.tooltipNode.onclick = this.onTooltipClick.bind(this);\n }\n\n var tooltipNode = this.tooltipNode;\n if (item.docHTML) {\n tooltipNode.innerHTML = item.docHTML;\n } else if (item.docText) {\n tooltipNode.textContent = item.docText;\n }\n\n if (!tooltipNode.parentNode)\n document.body.appendChild(tooltipNode);\n var popup = this.popup;\n var rect = popup.container.getBoundingClientRect();\n tooltipNode.style.top = popup.container.style.top;\n tooltipNode.style.bottom = popup.container.style.bottom;\n\n if (window.innerWidth - rect.right < 320) {\n tooltipNode.style.right = window.innerWidth - rect.left + \"px\";\n tooltipNode.style.left = \"\";\n } else {\n tooltipNode.style.left = (rect.right + 1) + \"px\";\n tooltipNode.style.right = \"\";\n }\n tooltipNode.style.display = \"block\";\n };\n\n this.hideDocTooltip = function() {\n this.tooltipTimer.cancel();\n if (!this.tooltipNode) return;\n var el = this.tooltipNode;\n if (!this.editor.isFocused() && document.activeElement == el)\n this.editor.focus();\n this.tooltipNode = null;\n if (el.parentNode)\n el.parentNode.removeChild(el);\n };\n\n this.onTooltipClick = function(e) {\n var a = e.target;\n while (a && a != this.tooltipNode) {\n if (a.nodeName == \"A\" && a.href) {\n a.rel = \"noreferrer\";\n a.target = \"_blank\";\n break;\n }\n a = a.parentNode;\n }\n };\n\n}).call(Autocomplete.prototype);\n\nAutocomplete.startCommand = {\n name: \"startAutocomplete\",\n exec: function(editor) {\n if (!editor.completer)\n editor.completer = new Autocomplete();\n editor.completer.autoInsert = false;\n editor.completer.autoSelect = true;\n editor.completer.showPopup(editor);\n editor.completer.cancelContextMenu();\n },\n bindKey: \"Ctrl-Space|Ctrl-Shift-Space|Alt-Space\"\n};\n\nvar FilteredList = function(array, filterText) {\n this.all = array;\n this.filtered = array;\n this.filterText = filterText || \"\";\n this.exactMatch = false;\n};\n(function(){\n this.setFilter = function(str) {\n if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0)\n var matches = this.filtered;\n else\n var matches = this.all;\n\n this.filterText = str;\n matches = this.filterCompletions(matches, this.filterText);\n matches = matches.sort(function(a, b) {\n return b.exactMatch - a.exactMatch || b.score - a.score;\n });\n var prev = null;\n matches = matches.filter(function(item){\n var caption = item.snippet || item.caption || item.value;\n if (caption === prev) return false;\n prev = caption;\n return true;\n });\n\n this.filtered = matches;\n };\n this.filterCompletions = function(items, needle) {\n var results = [];\n var upper = needle.toUpperCase();\n var lower = needle.toLowerCase();\n loop: for (var i = 0, item; item = items[i]; i++) {\n var caption = item.value || item.caption || item.snippet;\n if (!caption) continue;\n var lastIndex = -1;\n var matchMask = 0;\n var penalty = 0;\n var index, distance;\n\n if (this.exactMatch) {\n if (needle !== caption.substr(0, needle.length))\n continue loop;\n }else{\n for (var j = 0; j < needle.length; j++) {\n var i1 = caption.indexOf(lower[j], lastIndex + 1);\n var i2 = caption.indexOf(upper[j], lastIndex + 1);\n index = (i1 >= 0) ? ((i2 < 0 || i1 < i2) ? i1 : i2) : i2;\n if (index < 0)\n continue loop;\n distance = index - lastIndex - 1;\n if (distance > 0) {\n if (lastIndex === -1)\n penalty += 10;\n penalty += distance;\n }\n matchMask = matchMask | (1 << index);\n lastIndex = index;\n }\n }\n item.matchMask = matchMask;\n item.exactMatch = penalty ? 0 : 1;\n item.score = (item.score || 0) - penalty;\n results.push(item);\n }\n return results;\n };\n}).call(FilteredList.prototype);\n\nexports.Autocomplete = Autocomplete;\nexports.FilteredList = FilteredList;\n\n});\n\nace.define(\"ace/autocomplete/text_completer\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n var Range = acequire(\"../range\").Range;\n \n var splitRegex = /[^a-zA-Z_0-9\\$\\-\\u00C0-\\u1FFF\\u2C00-\\uD7FF\\w]+/;\n\n function getWordIndex(doc, pos) {\n var textBefore = doc.getTextRange(Range.fromPoints({row: 0, column:0}, pos));\n return textBefore.split(splitRegex).length - 1;\n }\n function wordDistance(doc, pos) {\n var prefixPos = getWordIndex(doc, pos);\n var words = doc.getValue().split(splitRegex);\n var wordScores = Object.create(null);\n \n var currentWord = words[prefixPos];\n\n words.forEach(function(word, idx) {\n if (!word || word === currentWord) return;\n\n var distance = Math.abs(prefixPos - idx);\n var score = words.length - distance;\n if (wordScores[word]) {\n wordScores[word] = Math.max(score, wordScores[word]);\n } else {\n wordScores[word] = score;\n }\n });\n return wordScores;\n }\n\n exports.getCompletions = function(editor, session, pos, prefix, callback) {\n var wordScore = wordDistance(session, pos, prefix);\n var wordList = Object.keys(wordScore);\n callback(null, wordList.map(function(word) {\n return {\n caption: word,\n value: word,\n score: wordScore[word],\n meta: \"local\"\n };\n }));\n };\n});\n\nace.define(\"ace/ext/language_tools\",[\"require\",\"exports\",\"module\",\"ace/snippets\",\"ace/autocomplete\",\"ace/config\",\"ace/lib/lang\",\"ace/autocomplete/util\",\"ace/autocomplete/text_completer\",\"ace/editor\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar snippetManager = acequire(\"../snippets\").snippetManager;\nvar Autocomplete = acequire(\"../autocomplete\").Autocomplete;\nvar config = acequire(\"../config\");\nvar lang = acequire(\"../lib/lang\");\nvar util = acequire(\"../autocomplete/util\");\n\nvar textCompleter = acequire(\"../autocomplete/text_completer\");\nvar keyWordCompleter = {\n getCompletions: function(editor, session, pos, prefix, callback) {\n if (session.$mode.completer) {\n return session.$mode.completer.getCompletions(editor, session, pos, prefix, callback);\n }\n var state = editor.session.getState(pos.row);\n var completions = session.$mode.getCompletions(state, session, pos, prefix);\n callback(null, completions);\n }\n};\n\nvar snippetCompleter = {\n getCompletions: function(editor, session, pos, prefix, callback) {\n var snippetMap = snippetManager.snippetMap;\n var completions = [];\n snippetManager.getActiveScopes(editor).forEach(function(scope) {\n var snippets = snippetMap[scope] || [];\n for (var i = snippets.length; i--;) {\n var s = snippets[i];\n var caption = s.name || s.tabTrigger;\n if (!caption)\n continue;\n completions.push({\n caption: caption,\n snippet: s.content,\n meta: s.tabTrigger && !s.name ? s.tabTrigger + \"\\u21E5 \" : \"snippet\",\n type: \"snippet\"\n });\n }\n }, this);\n callback(null, completions);\n },\n getDocTooltip: function(item) {\n if (item.type == \"snippet\" && !item.docHTML) {\n item.docHTML = [\n \"\", lang.escapeHTML(item.caption), \"\", \"
\",\n lang.escapeHTML(item.snippet)\n ].join(\"\");\n }\n }\n};\n\nvar completers = [snippetCompleter, textCompleter, keyWordCompleter];\nexports.setCompleters = function(val) {\n completers.length = 0;\n if (val) completers.push.apply(completers, val);\n};\nexports.addCompleter = function(completer) {\n completers.push(completer);\n};\nexports.textCompleter = textCompleter;\nexports.keyWordCompleter = keyWordCompleter;\nexports.snippetCompleter = snippetCompleter;\n\nvar expandSnippet = {\n name: \"expandSnippet\",\n exec: function(editor) {\n return snippetManager.expandWithTab(editor);\n },\n bindKey: \"Tab\"\n};\n\nvar onChangeMode = function(e, editor) {\n loadSnippetsForMode(editor.session.$mode);\n};\n\nvar loadSnippetsForMode = function(mode) {\n var id = mode.$id;\n if (!snippetManager.files)\n snippetManager.files = {};\n loadSnippetFile(id);\n if (mode.modes)\n mode.modes.forEach(loadSnippetsForMode);\n};\n\nvar loadSnippetFile = function(id) {\n if (!id || snippetManager.files[id])\n return;\n var snippetFilePath = id.replace(\"mode\", \"snippets\");\n snippetManager.files[id] = {};\n config.loadModule(snippetFilePath, function(m) {\n if (m) {\n snippetManager.files[id] = m;\n if (!m.snippets && m.snippetText)\n m.snippets = snippetManager.parseSnippetFile(m.snippetText);\n snippetManager.register(m.snippets || [], m.scope);\n if (m.includeScopes) {\n snippetManager.snippetMap[m.scope].includeScopes = m.includeScopes;\n m.includeScopes.forEach(function(x) {\n loadSnippetFile(\"ace/mode/\" + x);\n });\n }\n }\n });\n};\n\nvar doLiveAutocomplete = function(e) {\n var editor = e.editor;\n var hasCompleter = editor.completer && editor.completer.activated;\n if (e.command.name === \"backspace\") {\n if (hasCompleter && !util.getCompletionPrefix(editor))\n editor.completer.detach();\n }\n else if (e.command.name === \"insertstring\") {\n var prefix = util.getCompletionPrefix(editor);\n if (prefix && !hasCompleter) {\n if (!editor.completer) {\n editor.completer = new Autocomplete();\n }\n editor.completer.autoInsert = false;\n editor.completer.showPopup(editor);\n }\n }\n};\n\nvar Editor = acequire(\"../editor\").Editor;\nacequire(\"../config\").defineOptions(Editor.prototype, \"editor\", {\n enableBasicAutocompletion: {\n set: function(val) {\n if (val) {\n if (!this.completers)\n this.completers = Array.isArray(val)? val: completers;\n this.commands.addCommand(Autocomplete.startCommand);\n } else {\n this.commands.removeCommand(Autocomplete.startCommand);\n }\n },\n value: false\n },\n enableLiveAutocompletion: {\n set: function(val) {\n if (val) {\n if (!this.completers)\n this.completers = Array.isArray(val)? val: completers;\n this.commands.on('afterExec', doLiveAutocomplete);\n } else {\n this.commands.removeListener('afterExec', doLiveAutocomplete);\n }\n },\n value: false\n },\n enableSnippets: {\n set: function(val) {\n if (val) {\n this.commands.addCommand(expandSnippet);\n this.on(\"changeMode\", onChangeMode);\n onChangeMode(null, this);\n } else {\n this.commands.removeCommand(expandSnippet);\n this.off(\"changeMode\", onChangeMode);\n }\n },\n value: false\n }\n});\n});\n (function() {\n ace.acequire([\"ace/ext/language_tools\"], function() {});\n })();\n ","'use strict';\n\nvar isRegExp = require('./_is-regexp');\nvar anObject = require('./_an-object');\nvar speciesConstructor = require('./_species-constructor');\nvar advanceStringIndex = require('./_advance-string-index');\nvar toLength = require('./_to-length');\nvar callRegExpExec = require('./_regexp-exec-abstract');\nvar regexpExec = require('./_regexp-exec');\nvar fails = require('./_fails');\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\nvar MAX_UINT32 = 0xffffffff;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return $split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy[LAST_INDEX];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n };\n } else {\n internalSplit = $split;\n }\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = defined(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n});\n","import {Component, Mixins} from \"vue-property-decorator\";\nimport att_mixins from \"@/mixins/att\";\nimport axios from \"axios\";\nimport att from \"@/mixins/att\";\n\n@Component({components: {}})\nexport default class fetch_mixins extends Mixins(att) {\n fetchData:any = {\n idc: [],\n source: [],\n base: [],\n table: [],\n assigned: []\n };\n\n\n fetchSource(idc: string) {\n if (idc) {\n axios.get(`${this.$config.url}/fetch/source/${idc}/dml`)\n .then(res => {\n if (res.data.x === 'dml') {\n this.fetchData.source = res.data.source;\n this.fetchData.assigned = res.data.assigned\n } else {\n this.$config.notice('非法劫持参数!')\n }\n })\n .catch(error => {\n this.$config.err_notice(this,error)\n })\n }\n }\n\n fetchBase(source: string) {\n if (source) {\n axios.get(`${this.$config.url}/fetch/base/${source}`)\n .then(res => {\n this.fetchData.base = res.data;\n })\n .catch(error => {\n this.$config.err_notice(this,error)\n })\n }\n }\n\n fetchIDC() {\n axios.get(`${this.$config.url}/fetch/idc`)\n .then(res => {\n this.fetchData.idc = res.data;\n })\n .catch(error => {\n this.$config.err_notice(this,error)\n })\n }\n\n fetchTable() {\n if (this.formItem.database) {\n axios.put(`${this.$config.url}/fetch/table`, {\n 'source': this.formItem.source,\n 'base': this.formItem.database\n })\n .then(res => {\n this.fetchData.table = res.data.table;\n this.wordList = this.$config.concat(this.wordList, res.data.highlight);\n }).catch(error => {\n this.$config.err_notice(this,error)\n })\n }\n }\n}\n","ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n this.$rules = {\n \"start\" : [ {\n token : \"comment.doc.tag\",\n regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n }, \n DocCommentHighlightRules.getTagRule(),\n {\n defaultToken : \"comment.doc\",\n caseInsensitive: true\n }]\n };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n return {\n token : \"comment.doc.tag.storage.type\",\n regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n };\n};\n\nDocCommentHighlightRules.getStartRule = function(start) {\n return {\n token : \"comment.doc\", // doc comment\n regex : \"\\\\/\\\\*(?=\\\\*)\",\n next : start\n };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n return {\n token : \"comment.doc\", // closing comment\n regex : \"\\\\*\\\\/\",\n next : start\n };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/mysql_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(acequire, exports, module) {\n\nvar oop = acequire(\"../lib/oop\");\nvar lang = acequire(\"../lib/lang\");\nvar DocCommentHighlightRules = acequire(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\n\nvar MysqlHighlightRules = function() {\n\n var mySqlKeywords = /*sql*/ \"alter|and|as|asc|between|count|create|delete|desc|distinct|drop|from|having|in|insert|into|is|join|like|not|on|or|order|select|set|table|union|update|values|where\" + \"|accessible|action|add|after|algorithm|all|analyze|asensitive|at|authors|auto_increment|autocommit|avg|avg_row_length|before|binary|binlog|both|btree|cache|call|cascade|cascaded|case|catalog_name|chain|change|changed|character|check|checkpoint|checksum|class_origin|client_statistics|close|coalesce|code|collate|collation|collations|column|columns|comment|commit|committed|completion|concurrent|condition|connection|consistent|constraint|contains|continue|contributors|convert|cross|current_date|current_time|current_timestamp|current_user|cursor|data|database|databases|day_hour|day_microsecond|day_minute|day_second|deallocate|dec|declare|default|delay_key_write|delayed|delimiter|des_key_file|describe|deterministic|dev_pop|dev_samp|deviance|directory|disable|discard|distinctrow|div|dual|dumpfile|each|elseif|enable|enclosed|end|ends|engine|engines|enum|errors|escape|escaped|even|event|events|every|execute|exists|exit|explain|extended|fast|fetch|field|fields|first|flush|for|force|foreign|found_rows|full|fulltext|function|general|global|grant|grants|group|groupby_concat|handler|hash|help|high_priority|hosts|hour_microsecond|hour_minute|hour_second|if|ignore|ignore_server_ids|import|index|index_statistics|infile|inner|innodb|inout|insensitive|insert_method|install|interval|invoker|isolation|iterate|key|keys|kill|language|last|leading|leave|left|level|limit|linear|lines|list|load|local|localtime|localtimestamp|lock|logs|low_priority|master|master_heartbeat_period|master_ssl_verify_server_cert|masters|match|max|max_rows|maxvalue|message_text|middleint|migrate|min|min_rows|minute_microsecond|minute_second|mod|mode|modifies|modify|mutex|mysql_errno|natural|next|no|no_write_to_binlog|offline|offset|one|online|open|optimize|option|optionally|out|outer|outfile|pack_keys|parser|partition|partitions|password|phase|plugin|plugins|prepare|preserve|prev|primary|privileges|procedure|processlist|profile|profiles|purge|query|quick|range|read|read_write|reads|real|rebuild|recover|references|regexp|relaylog|release|remove|rename|reorganize|repair|repeatable|replace|acequire|resignal|restrict|resume|return|returns|revoke|right|rlike|rollback|rollup|row|row_format|rtree|savepoint|schedule|schema|schema_name|schemas|second_microsecond|security|sensitive|separator|serializable|server|session|share|show|signal|slave|slow|smallint|snapshot|soname|spatial|specific|sql|sql_big_result|sql_buffer_result|sql_cache|sql_calc_found_rows|sql_no_cache|sql_small_result|sqlexception|sqlstate|sqlwarning|ssl|start|starting|starts|status|std|stddev|stddev_pop|stddev_samp|storage|straight_join|subclass_origin|sum|suspend|table_name|table_statistics|tables|tablespace|temporary|terminated|to|trailing|transaction|trigger|triggers|truncate|uncommitted|undo|uninstall|unique|unlock|upgrade|usage|use|use_frm|user|user_resources|user_statistics|using|utc_date|utc_time|utc_timestamp|value|variables|varying|view|views|warnings|when|while|with|work|write|xa|xor|year_month|zerofill|begin|do|then|else|loop|repeat\";\n var builtins = \"by|bool|boolean|bit|blob|decimal|double|enum|float|long|longblob|longtext|medium|mediumblob|mediumint|mediumtext|time|timestamp|tinyblob|tinyint|tinytext|text|bigint|int|int1|int2|int3|int4|int8|integer|float|float4|float8|double|char|varbinary|varchar|varcharacter|precision|date|datetime|year|unsigned|signed|numeric|ucase|lcase|mid|len|round|rank|now|format|coalesce|ifnull|isnull|nvl\";\n var variable = \"charset|clear|connect|edit|ego|exit|go|help|nopager|notee|nowarning|pager|print|prompt|quit|rehash|source|status|system|tee\";\n\n var keywordMapper = this.createKeywordMapper({\n \"support.function\": builtins,\n \"keyword\": mySqlKeywords,\n \"constant\": \"false|true|null|unknown|date|time|timestamp|ODBCdotTable|zerolessFloat\",\n \"variable.language\": variable\n }, \"identifier\", true);\n\n \n function string(rule) {\n var start = rule.start;\n var escapeSeq = rule.escape;\n return {\n token: \"string.start\",\n regex: start,\n next: [\n {token: \"constant.language.escape\", regex: escapeSeq},\n {token: \"string.end\", next: \"start\", regex: start},\n {defaultToken: \"string\"}\n ]\n };\n }\n\n this.$rules = {\n \"start\" : [ {\n token : \"comment\", regex : \"(?:-- |#).*$\"\n }, \n string({start: '\"', escape: /\\\\[0'\"bnrtZ\\\\%_]?/}),\n string({start: \"'\", escape: /\\\\[0'\"bnrtZ\\\\%_]?/}),\n DocCommentHighlightRules.getStartRule(\"doc-start\"),\n {\n token : \"comment\", // multi line comment\n regex : /\\/\\*/,\n next : \"comment\"\n }, {\n token : \"constant.numeric\", // hex\n regex : /0[xX][0-9a-fA-F]+|[xX]'[0-9a-fA-F]+'|0[bB][01]+|[bB]'[01]+'/\n }, {\n token : \"constant.numeric\", // float\n regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n }, {\n token : keywordMapper,\n regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n }, {\n token : \"constant.class\",\n regex : \"@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n }, {\n token : \"constant.buildin\",\n regex : \"`[^`]*`\"\n }, {\n token : \"keyword.operator\",\n regex : \"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|%|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\"\n }, {\n token : \"paren.lparen\",\n regex : \"[\\\\(]\"\n }, {\n token : \"paren.rparen\",\n regex : \"[\\\\)]\"\n }, {\n token : \"text\",\n regex : \"\\\\s+\"\n } ],\n \"comment\" : [\n {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n {defaultToken : \"comment\"}\n ]\n };\n\n this.embedRules(DocCommentHighlightRules, \"doc-\", [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n this.normalizeRules();\n};\n\noop.inherits(MysqlHighlightRules, TextHighlightRules);\n\nexports.MysqlHighlightRules = MysqlHighlightRules;\n});\n\nace.define(\"ace/mode/mysql\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/mysql_highlight_rules\"], function(acequire, exports, module) {\n\nvar oop = acequire(\"../lib/oop\");\nvar TextMode = acequire(\"../mode/text\").Mode;\nvar MysqlHighlightRules = acequire(\"./mysql_highlight_rules\").MysqlHighlightRules;\n\nvar Mode = function() {\n this.HighlightRules = MysqlHighlightRules;\n this.$behaviour = this.$defaultBehaviour;\n};\noop.inherits(Mode, TextMode);\n\n(function() { \n this.lineCommentStart = [\"--\", \"#\"]; // todo space\n this.blockComment = {start: \"/*\", end: \"*/\"};\n\n this.$id = \"ace/mode/mysql\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticStyle:{\"width\":\"100%\",\"height\":\"200px\"}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./editor.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./editor.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./editor.vue?vue&type=template&id=33987406&\"\nimport script from \"./editor.vue?vue&type=script&lang=js&\"\nexport * from \"./editor.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","ace.define(\"ace/snippets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/lib/lang\",\"ace/range\",\"ace/anchor\",\"ace/keyboard/hash_handler\",\"ace/tokenizer\",\"ace/lib/dom\",\"ace/editor\"], function(acequire, exports, module) {\n\"use strict\";\nvar oop = acequire(\"./lib/oop\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar lang = acequire(\"./lib/lang\");\nvar Range = acequire(\"./range\").Range;\nvar Anchor = acequire(\"./anchor\").Anchor;\nvar HashHandler = acequire(\"./keyboard/hash_handler\").HashHandler;\nvar Tokenizer = acequire(\"./tokenizer\").Tokenizer;\nvar comparePoints = Range.comparePoints;\n\nvar SnippetManager = function() {\n this.snippetMap = {};\n this.snippetNameMap = {};\n};\n\n(function() {\n oop.implement(this, EventEmitter);\n \n this.getTokenizer = function() {\n function TabstopToken(str, _, stack) {\n str = str.substr(1);\n if (/^\\d+$/.test(str) && !stack.inFormatString)\n return [{tabstopId: parseInt(str, 10)}];\n return [{text: str}];\n }\n function escape(ch) {\n return \"(?:[^\\\\\\\\\" + ch + \"]|\\\\\\\\.)\";\n }\n SnippetManager.$tokenizer = new Tokenizer({\n start: [\n {regex: /:/, onMatch: function(val, state, stack) {\n if (stack.length && stack[0].expectIf) {\n stack[0].expectIf = false;\n stack[0].elseBranch = stack[0];\n return [stack[0]];\n }\n return \":\";\n }},\n {regex: /\\\\./, onMatch: function(val, state, stack) {\n var ch = val[1];\n if (ch == \"}\" && stack.length) {\n val = ch;\n }else if (\"`$\\\\\".indexOf(ch) != -1) {\n val = ch;\n } else if (stack.inFormatString) {\n if (ch == \"n\")\n val = \"\\n\";\n else if (ch == \"t\")\n val = \"\\n\";\n else if (\"ulULE\".indexOf(ch) != -1) {\n val = {changeCase: ch, local: ch > \"a\"};\n }\n }\n\n return [val];\n }},\n {regex: /}/, onMatch: function(val, state, stack) {\n return [stack.length ? stack.shift() : val];\n }},\n {regex: /\\$(?:\\d+|\\w+)/, onMatch: TabstopToken},\n {regex: /\\$\\{[\\dA-Z_a-z]+/, onMatch: function(str, state, stack) {\n var t = TabstopToken(str.substr(1), state, stack);\n stack.unshift(t[0]);\n return t;\n }, next: \"snippetVar\"},\n {regex: /\\n/, token: \"newline\", merge: false}\n ],\n snippetVar: [\n {regex: \"\\\\|\" + escape(\"\\\\|\") + \"*\\\\|\", onMatch: function(val, state, stack) {\n stack[0].choices = val.slice(1, -1).split(\",\");\n }, next: \"start\"},\n {regex: \"/(\" + escape(\"/\") + \"+)/(?:(\" + escape(\"/\") + \"*)/)(\\\\w*):?\",\n onMatch: function(val, state, stack) {\n var ts = stack[0];\n ts.fmtString = val;\n\n val = this.splitRegex.exec(val);\n ts.guard = val[1];\n ts.fmt = val[2];\n ts.flag = val[3];\n return \"\";\n }, next: \"start\"},\n {regex: \"`\" + escape(\"`\") + \"*`\", onMatch: function(val, state, stack) {\n stack[0].code = val.splice(1, -1);\n return \"\";\n }, next: \"start\"},\n {regex: \"\\\\?\", onMatch: function(val, state, stack) {\n if (stack[0])\n stack[0].expectIf = true;\n }, next: \"start\"},\n {regex: \"([^:}\\\\\\\\]|\\\\\\\\.)*:?\", token: \"\", next: \"start\"}\n ],\n formatString: [\n {regex: \"/(\" + escape(\"/\") + \"+)/\", token: \"regex\"},\n {regex: \"\", onMatch: function(val, state, stack) {\n stack.inFormatString = true;\n }, next: \"start\"}\n ]\n });\n SnippetManager.prototype.getTokenizer = function() {\n return SnippetManager.$tokenizer;\n };\n return SnippetManager.$tokenizer;\n };\n\n this.tokenizeTmSnippet = function(str, startState) {\n return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) {\n return x.value || x;\n });\n };\n\n this.$getDefaultValue = function(editor, name) {\n if (/^[A-Z]\\d+$/.test(name)) {\n var i = name.substr(1);\n return (this.variables[name[0] + \"__\"] || {})[i];\n }\n if (/^\\d+$/.test(name)) {\n return (this.variables.__ || {})[name];\n }\n name = name.replace(/^TM_/, \"\");\n\n if (!editor)\n return;\n var s = editor.session;\n switch(name) {\n case \"CURRENT_WORD\":\n var r = s.getWordRange();\n case \"SELECTION\":\n case \"SELECTED_TEXT\":\n return s.getTextRange(r);\n case \"CURRENT_LINE\":\n return s.getLine(editor.getCursorPosition().row);\n case \"PREV_LINE\": // not possible in textmate\n return s.getLine(editor.getCursorPosition().row - 1);\n case \"LINE_INDEX\":\n return editor.getCursorPosition().column;\n case \"LINE_NUMBER\":\n return editor.getCursorPosition().row + 1;\n case \"SOFT_TABS\":\n return s.getUseSoftTabs() ? \"YES\" : \"NO\";\n case \"TAB_SIZE\":\n return s.getTabSize();\n case \"FILENAME\":\n case \"FILEPATH\":\n return \"\";\n case \"FULLNAME\":\n return \"Ace\";\n }\n };\n this.variables = {};\n this.getVariableValue = function(editor, varName) {\n if (this.variables.hasOwnProperty(varName))\n return this.variables[varName](editor, varName) || \"\";\n return this.$getDefaultValue(editor, varName) || \"\";\n };\n this.tmStrFormat = function(str, ch, editor) {\n var flag = ch.flag || \"\";\n var re = ch.guard;\n re = new RegExp(re, flag.replace(/[^gi]/, \"\"));\n var fmtTokens = this.tokenizeTmSnippet(ch.fmt, \"formatString\");\n var _self = this;\n var formatted = str.replace(re, function() {\n _self.variables.__ = arguments;\n var fmtParts = _self.resolveVariables(fmtTokens, editor);\n var gChangeCase = \"E\";\n for (var i = 0; i < fmtParts.length; i++) {\n var ch = fmtParts[i];\n if (typeof ch == \"object\") {\n fmtParts[i] = \"\";\n if (ch.changeCase && ch.local) {\n var next = fmtParts[i + 1];\n if (next && typeof next == \"string\") {\n if (ch.changeCase == \"u\")\n fmtParts[i] = next[0].toUpperCase();\n else\n fmtParts[i] = next[0].toLowerCase();\n fmtParts[i + 1] = next.substr(1);\n }\n } else if (ch.changeCase) {\n gChangeCase = ch.changeCase;\n }\n } else if (gChangeCase == \"U\") {\n fmtParts[i] = ch.toUpperCase();\n } else if (gChangeCase == \"L\") {\n fmtParts[i] = ch.toLowerCase();\n }\n }\n return fmtParts.join(\"\");\n });\n this.variables.__ = null;\n return formatted;\n };\n\n this.resolveVariables = function(snippet, editor) {\n var result = [];\n for (var i = 0; i < snippet.length; i++) {\n var ch = snippet[i];\n if (typeof ch == \"string\") {\n result.push(ch);\n } else if (typeof ch != \"object\") {\n continue;\n } else if (ch.skip) {\n gotoNext(ch);\n } else if (ch.processed < i) {\n continue;\n } else if (ch.text) {\n var value = this.getVariableValue(editor, ch.text);\n if (value && ch.fmtString)\n value = this.tmStrFormat(value, ch);\n ch.processed = i;\n if (ch.expectIf == null) {\n if (value) {\n result.push(value);\n gotoNext(ch);\n }\n } else {\n if (value) {\n ch.skip = ch.elseBranch;\n } else\n gotoNext(ch);\n }\n } else if (ch.tabstopId != null) {\n result.push(ch);\n } else if (ch.changeCase != null) {\n result.push(ch);\n }\n }\n function gotoNext(ch) {\n var i1 = snippet.indexOf(ch, i + 1);\n if (i1 != -1)\n i = i1;\n }\n return result;\n };\n\n this.insertSnippetForSelection = function(editor, snippetText) {\n var cursor = editor.getCursorPosition();\n var line = editor.session.getLine(cursor.row);\n var tabString = editor.session.getTabString();\n var indentString = line.match(/^\\s*/)[0];\n \n if (cursor.column < indentString.length)\n indentString = indentString.slice(0, cursor.column);\n\n snippetText = snippetText.replace(/\\r/g, \"\");\n var tokens = this.tokenizeTmSnippet(snippetText);\n tokens = this.resolveVariables(tokens, editor);\n tokens = tokens.map(function(x) {\n if (x == \"\\n\")\n return x + indentString;\n if (typeof x == \"string\")\n return x.replace(/\\t/g, tabString);\n return x;\n });\n var tabstops = [];\n tokens.forEach(function(p, i) {\n if (typeof p != \"object\")\n return;\n var id = p.tabstopId;\n var ts = tabstops[id];\n if (!ts) {\n ts = tabstops[id] = [];\n ts.index = id;\n ts.value = \"\";\n }\n if (ts.indexOf(p) !== -1)\n return;\n ts.push(p);\n var i1 = tokens.indexOf(p, i + 1);\n if (i1 === -1)\n return;\n\n var value = tokens.slice(i + 1, i1);\n var isNested = value.some(function(t) {return typeof t === \"object\";});\n if (isNested && !ts.value) {\n ts.value = value;\n } else if (value.length && (!ts.value || typeof ts.value !== \"string\")) {\n ts.value = value.join(\"\");\n }\n });\n tabstops.forEach(function(ts) {ts.length = 0;});\n var expanding = {};\n function copyValue(val) {\n var copy = [];\n for (var i = 0; i < val.length; i++) {\n var p = val[i];\n if (typeof p == \"object\") {\n if (expanding[p.tabstopId])\n continue;\n var j = val.lastIndexOf(p, i - 1);\n p = copy[j] || {tabstopId: p.tabstopId};\n }\n copy[i] = p;\n }\n return copy;\n }\n for (var i = 0; i < tokens.length; i++) {\n var p = tokens[i];\n if (typeof p != \"object\")\n continue;\n var id = p.tabstopId;\n var i1 = tokens.indexOf(p, i + 1);\n if (expanding[id]) {\n if (expanding[id] === p)\n expanding[id] = null;\n continue;\n }\n \n var ts = tabstops[id];\n var arg = typeof ts.value == \"string\" ? [ts.value] : copyValue(ts.value);\n arg.unshift(i + 1, Math.max(0, i1 - i));\n arg.push(p);\n expanding[id] = p;\n tokens.splice.apply(tokens, arg);\n\n if (ts.indexOf(p) === -1)\n ts.push(p);\n }\n var row = 0, column = 0;\n var text = \"\";\n tokens.forEach(function(t) {\n if (typeof t === \"string\") {\n var lines = t.split(\"\\n\");\n if (lines.length > 1){\n column = lines[lines.length - 1].length;\n row += lines.length - 1;\n } else\n column += t.length;\n text += t;\n } else {\n if (!t.start)\n t.start = {row: row, column: column};\n else\n t.end = {row: row, column: column};\n }\n });\n var range = editor.getSelectionRange();\n var end = editor.session.replace(range, text);\n\n var tabstopManager = new TabstopManager(editor);\n var selectionId = editor.inVirtualSelectionMode && editor.selection.index;\n tabstopManager.addTabstops(tabstops, range.start, end, selectionId);\n };\n \n this.insertSnippet = function(editor, snippetText) {\n var self = this;\n if (editor.inVirtualSelectionMode)\n return self.insertSnippetForSelection(editor, snippetText);\n \n editor.forEachSelection(function() {\n self.insertSnippetForSelection(editor, snippetText);\n }, null, {keepOrder: true});\n \n if (editor.tabstopManager)\n editor.tabstopManager.tabNext();\n };\n\n this.$getScope = function(editor) {\n var scope = editor.session.$mode.$id || \"\";\n scope = scope.split(\"/\").pop();\n if (scope === \"html\" || scope === \"php\") {\n if (scope === \"php\" && !editor.session.$mode.inlinePhp) \n scope = \"html\";\n var c = editor.getCursorPosition();\n var state = editor.session.getState(c.row);\n if (typeof state === \"object\") {\n state = state[0];\n }\n if (state.substring) {\n if (state.substring(0, 3) == \"js-\")\n scope = \"javascript\";\n else if (state.substring(0, 4) == \"css-\")\n scope = \"css\";\n else if (state.substring(0, 4) == \"php-\")\n scope = \"php\";\n }\n }\n \n return scope;\n };\n\n this.getActiveScopes = function(editor) {\n var scope = this.$getScope(editor);\n var scopes = [scope];\n var snippetMap = this.snippetMap;\n if (snippetMap[scope] && snippetMap[scope].includeScopes) {\n scopes.push.apply(scopes, snippetMap[scope].includeScopes);\n }\n scopes.push(\"_\");\n return scopes;\n };\n\n this.expandWithTab = function(editor, options) {\n var self = this;\n var result = editor.forEachSelection(function() {\n return self.expandSnippetForSelection(editor, options);\n }, null, {keepOrder: true});\n if (result && editor.tabstopManager)\n editor.tabstopManager.tabNext();\n return result;\n };\n \n this.expandSnippetForSelection = function(editor, options) {\n var cursor = editor.getCursorPosition();\n var line = editor.session.getLine(cursor.row);\n var before = line.substring(0, cursor.column);\n var after = line.substr(cursor.column);\n\n var snippetMap = this.snippetMap;\n var snippet;\n this.getActiveScopes(editor).some(function(scope) {\n var snippets = snippetMap[scope];\n if (snippets)\n snippet = this.findMatchingSnippet(snippets, before, after);\n return !!snippet;\n }, this);\n if (!snippet)\n return false;\n if (options && options.dryRun)\n return true;\n editor.session.doc.removeInLine(cursor.row,\n cursor.column - snippet.replaceBefore.length,\n cursor.column + snippet.replaceAfter.length\n );\n\n this.variables.M__ = snippet.matchBefore;\n this.variables.T__ = snippet.matchAfter;\n this.insertSnippetForSelection(editor, snippet.content);\n\n this.variables.M__ = this.variables.T__ = null;\n return true;\n };\n\n this.findMatchingSnippet = function(snippetList, before, after) {\n for (var i = snippetList.length; i--;) {\n var s = snippetList[i];\n if (s.startRe && !s.startRe.test(before))\n continue;\n if (s.endRe && !s.endRe.test(after))\n continue;\n if (!s.startRe && !s.endRe)\n continue;\n\n s.matchBefore = s.startRe ? s.startRe.exec(before) : [\"\"];\n s.matchAfter = s.endRe ? s.endRe.exec(after) : [\"\"];\n s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : \"\";\n s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : \"\";\n return s;\n }\n };\n\n this.snippetMap = {};\n this.snippetNameMap = {};\n this.register = function(snippets, scope) {\n var snippetMap = this.snippetMap;\n var snippetNameMap = this.snippetNameMap;\n var self = this;\n \n if (!snippets) \n snippets = [];\n \n function wrapRegexp(src) {\n if (src && !/^\\^?\\(.*\\)\\$?$|^\\\\b$/.test(src))\n src = \"(?:\" + src + \")\";\n\n return src || \"\";\n }\n function guardedRegexp(re, guard, opening) {\n re = wrapRegexp(re);\n guard = wrapRegexp(guard);\n if (opening) {\n re = guard + re;\n if (re && re[re.length - 1] != \"$\")\n re = re + \"$\";\n } else {\n re = re + guard;\n if (re && re[0] != \"^\")\n re = \"^\" + re;\n }\n return new RegExp(re);\n }\n\n function addSnippet(s) {\n if (!s.scope)\n s.scope = scope || \"_\";\n scope = s.scope;\n if (!snippetMap[scope]) {\n snippetMap[scope] = [];\n snippetNameMap[scope] = {};\n }\n\n var map = snippetNameMap[scope];\n if (s.name) {\n var old = map[s.name];\n if (old)\n self.unregister(old);\n map[s.name] = s;\n }\n snippetMap[scope].push(s);\n\n if (s.tabTrigger && !s.trigger) {\n if (!s.guard && /^\\w/.test(s.tabTrigger))\n s.guard = \"\\\\b\";\n s.trigger = lang.escapeRegExp(s.tabTrigger);\n }\n \n if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard)\n return;\n \n s.startRe = guardedRegexp(s.trigger, s.guard, true);\n s.triggerRe = new RegExp(s.trigger, \"\", true);\n\n s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true);\n s.endTriggerRe = new RegExp(s.endTrigger, \"\", true);\n }\n\n if (snippets && snippets.content)\n addSnippet(snippets);\n else if (Array.isArray(snippets))\n snippets.forEach(addSnippet);\n \n this._signal(\"registerSnippets\", {scope: scope});\n };\n this.unregister = function(snippets, scope) {\n var snippetMap = this.snippetMap;\n var snippetNameMap = this.snippetNameMap;\n\n function removeSnippet(s) {\n var nameMap = snippetNameMap[s.scope||scope];\n if (nameMap && nameMap[s.name]) {\n delete nameMap[s.name];\n var map = snippetMap[s.scope||scope];\n var i = map && map.indexOf(s);\n if (i >= 0)\n map.splice(i, 1);\n }\n }\n if (snippets.content)\n removeSnippet(snippets);\n else if (Array.isArray(snippets))\n snippets.forEach(removeSnippet);\n };\n this.parseSnippetFile = function(str) {\n str = str.replace(/\\r/g, \"\");\n var list = [], snippet = {};\n var re = /^#.*|^({[\\s\\S]*})\\s*$|^(\\S+) (.*)$|^((?:\\n*\\t.*)+)/gm;\n var m;\n while (m = re.exec(str)) {\n if (m[1]) {\n try {\n snippet = JSON.parse(m[1]);\n list.push(snippet);\n } catch (e) {}\n } if (m[4]) {\n snippet.content = m[4].replace(/^\\t/gm, \"\");\n list.push(snippet);\n snippet = {};\n } else {\n var key = m[2], val = m[3];\n if (key == \"regex\") {\n var guardRe = /\\/((?:[^\\/\\\\]|\\\\.)*)|$/g;\n snippet.guard = guardRe.exec(val)[1];\n snippet.trigger = guardRe.exec(val)[1];\n snippet.endTrigger = guardRe.exec(val)[1];\n snippet.endGuard = guardRe.exec(val)[1];\n } else if (key == \"snippet\") {\n snippet.tabTrigger = val.match(/^\\S*/)[0];\n if (!snippet.name)\n snippet.name = val;\n } else {\n snippet[key] = val;\n }\n }\n }\n return list;\n };\n this.getSnippetByName = function(name, editor) {\n var snippetMap = this.snippetNameMap;\n var snippet;\n this.getActiveScopes(editor).some(function(scope) {\n var snippets = snippetMap[scope];\n if (snippets)\n snippet = snippets[name];\n return !!snippet;\n }, this);\n return snippet;\n };\n\n}).call(SnippetManager.prototype);\n\n\nvar TabstopManager = function(editor) {\n if (editor.tabstopManager)\n return editor.tabstopManager;\n editor.tabstopManager = this;\n this.$onChange = this.onChange.bind(this);\n this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule;\n this.$onChangeSession = this.onChangeSession.bind(this);\n this.$onAfterExec = this.onAfterExec.bind(this);\n this.attach(editor);\n};\n(function() {\n this.attach = function(editor) {\n this.index = 0;\n this.ranges = [];\n this.tabstops = [];\n this.$openTabstops = null;\n this.selectedTabstop = null;\n\n this.editor = editor;\n this.editor.on(\"change\", this.$onChange);\n this.editor.on(\"changeSelection\", this.$onChangeSelection);\n this.editor.on(\"changeSession\", this.$onChangeSession);\n this.editor.commands.on(\"afterExec\", this.$onAfterExec);\n this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n };\n this.detach = function() {\n this.tabstops.forEach(this.removeTabstopMarkers, this);\n this.ranges = null;\n this.tabstops = null;\n this.selectedTabstop = null;\n this.editor.removeListener(\"change\", this.$onChange);\n this.editor.removeListener(\"changeSelection\", this.$onChangeSelection);\n this.editor.removeListener(\"changeSession\", this.$onChangeSession);\n this.editor.commands.removeListener(\"afterExec\", this.$onAfterExec);\n this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);\n this.editor.tabstopManager = null;\n this.editor = null;\n };\n\n this.onChange = function(delta) {\n var changeRange = delta;\n var isRemove = delta.action[0] == \"r\";\n var start = delta.start;\n var end = delta.end;\n var startRow = start.row;\n var endRow = end.row;\n var lineDif = endRow - startRow;\n var colDiff = end.column - start.column;\n\n if (isRemove) {\n lineDif = -lineDif;\n colDiff = -colDiff;\n }\n if (!this.$inChange && isRemove) {\n var ts = this.selectedTabstop;\n var changedOutside = ts && !ts.some(function(r) {\n return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0;\n });\n if (changedOutside)\n return this.detach();\n }\n var ranges = this.ranges;\n for (var i = 0; i < ranges.length; i++) {\n var r = ranges[i];\n if (r.end.row < start.row)\n continue;\n\n if (isRemove && comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) {\n this.removeRange(r);\n i--;\n continue;\n }\n\n if (r.start.row == startRow && r.start.column > start.column)\n r.start.column += colDiff;\n if (r.end.row == startRow && r.end.column >= start.column)\n r.end.column += colDiff;\n if (r.start.row >= startRow)\n r.start.row += lineDif;\n if (r.end.row >= startRow)\n r.end.row += lineDif;\n\n if (comparePoints(r.start, r.end) > 0)\n this.removeRange(r);\n }\n if (!ranges.length)\n this.detach();\n };\n this.updateLinkedFields = function() {\n var ts = this.selectedTabstop;\n if (!ts || !ts.hasLinkedRanges)\n return;\n this.$inChange = true;\n var session = this.editor.session;\n var text = session.getTextRange(ts.firstNonLinked);\n for (var i = ts.length; i--;) {\n var range = ts[i];\n if (!range.linked)\n continue;\n var fmt = exports.snippetManager.tmStrFormat(text, range.original);\n session.replace(range, fmt);\n }\n this.$inChange = false;\n };\n this.onAfterExec = function(e) {\n if (e.command && !e.command.readOnly)\n this.updateLinkedFields();\n };\n this.onChangeSelection = function() {\n if (!this.editor)\n return;\n var lead = this.editor.selection.lead;\n var anchor = this.editor.selection.anchor;\n var isEmpty = this.editor.selection.isEmpty();\n for (var i = this.ranges.length; i--;) {\n if (this.ranges[i].linked)\n continue;\n var containsLead = this.ranges[i].contains(lead.row, lead.column);\n var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column);\n if (containsLead && containsAnchor)\n return;\n }\n this.detach();\n };\n this.onChangeSession = function() {\n this.detach();\n };\n this.tabNext = function(dir) {\n var max = this.tabstops.length;\n var index = this.index + (dir || 1);\n index = Math.min(Math.max(index, 1), max);\n if (index == max)\n index = 0;\n this.selectTabstop(index);\n if (index === 0)\n this.detach();\n };\n this.selectTabstop = function(index) {\n this.$openTabstops = null;\n var ts = this.tabstops[this.index];\n if (ts)\n this.addTabstopMarkers(ts);\n this.index = index;\n ts = this.tabstops[this.index];\n if (!ts || !ts.length)\n return;\n \n this.selectedTabstop = ts;\n if (!this.editor.inVirtualSelectionMode) { \n var sel = this.editor.multiSelect;\n sel.toSingleRange(ts.firstNonLinked.clone());\n for (var i = ts.length; i--;) {\n if (ts.hasLinkedRanges && ts[i].linked)\n continue;\n sel.addRange(ts[i].clone(), true);\n }\n if (sel.ranges[0])\n sel.addRange(sel.ranges[0].clone());\n } else {\n this.editor.selection.setRange(ts.firstNonLinked);\n }\n \n this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n };\n this.addTabstops = function(tabstops, start, end) {\n if (!this.$openTabstops)\n this.$openTabstops = [];\n if (!tabstops[0]) {\n var p = Range.fromPoints(end, end);\n moveRelative(p.start, start);\n moveRelative(p.end, start);\n tabstops[0] = [p];\n tabstops[0].index = 0;\n }\n\n var i = this.index;\n var arg = [i + 1, 0];\n var ranges = this.ranges;\n tabstops.forEach(function(ts, index) {\n var dest = this.$openTabstops[index] || ts;\n \n for (var i = ts.length; i--;) {\n var p = ts[i];\n var range = Range.fromPoints(p.start, p.end || p.start);\n movePoint(range.start, start);\n movePoint(range.end, start);\n range.original = p;\n range.tabstop = dest;\n ranges.push(range);\n if (dest != ts)\n dest.unshift(range);\n else\n dest[i] = range;\n if (p.fmtString) {\n range.linked = true;\n dest.hasLinkedRanges = true;\n } else if (!dest.firstNonLinked)\n dest.firstNonLinked = range;\n }\n if (!dest.firstNonLinked)\n dest.hasLinkedRanges = false;\n if (dest === ts) {\n arg.push(dest);\n this.$openTabstops[index] = dest;\n }\n this.addTabstopMarkers(dest);\n }, this);\n \n if (arg.length > 2) {\n if (this.tabstops.length)\n arg.push(arg.splice(2, 1)[0]);\n this.tabstops.splice.apply(this.tabstops, arg);\n }\n };\n\n this.addTabstopMarkers = function(ts) {\n var session = this.editor.session;\n ts.forEach(function(range) {\n if (!range.markerId)\n range.markerId = session.addMarker(range, \"ace_snippet-marker\", \"text\");\n });\n };\n this.removeTabstopMarkers = function(ts) {\n var session = this.editor.session;\n ts.forEach(function(range) {\n session.removeMarker(range.markerId);\n range.markerId = null;\n });\n };\n this.removeRange = function(range) {\n var i = range.tabstop.indexOf(range);\n range.tabstop.splice(i, 1);\n i = this.ranges.indexOf(range);\n this.ranges.splice(i, 1);\n this.editor.session.removeMarker(range.markerId);\n if (!range.tabstop.length) {\n i = this.tabstops.indexOf(range.tabstop);\n if (i != -1)\n this.tabstops.splice(i, 1);\n if (!this.tabstops.length)\n this.detach();\n }\n };\n\n this.keyboardHandler = new HashHandler();\n this.keyboardHandler.bindKeys({\n \"Tab\": function(ed) {\n if (exports.snippetManager && exports.snippetManager.expandWithTab(ed)) {\n return;\n }\n\n ed.tabstopManager.tabNext(1);\n },\n \"Shift-Tab\": function(ed) {\n ed.tabstopManager.tabNext(-1);\n },\n \"Esc\": function(ed) {\n ed.tabstopManager.detach();\n },\n \"Return\": function(ed) {\n return false;\n }\n });\n}).call(TabstopManager.prototype);\n\n\n\nvar changeTracker = {};\nchangeTracker.onChange = Anchor.prototype.onChange;\nchangeTracker.setPosition = function(row, column) {\n this.pos.row = row;\n this.pos.column = column;\n};\nchangeTracker.update = function(pos, delta, $insertRight) {\n this.$insertRight = $insertRight;\n this.pos = pos; \n this.onChange(delta);\n};\n\nvar movePoint = function(point, diff) {\n if (point.row == 0)\n point.column += diff.column;\n point.row += diff.row;\n};\n\nvar moveRelative = function(point, start) {\n if (point.row == start.row)\n point.column -= start.column;\n point.row -= start.row;\n};\n\n\nacequire(\"./lib/dom\").importCssString(\"\\\n.ace_snippet-marker {\\\n -moz-box-sizing: border-box;\\\n box-sizing: border-box;\\\n background: rgba(194, 193, 208, 0.09);\\\n border: 1px dotted rgba(211, 208, 235, 0.62);\\\n position: absolute;\\\n}\");\n\nexports.snippetManager = new SnippetManager();\n\n\nvar Editor = acequire(\"./editor\").Editor;\n(function() {\n this.insertSnippet = function(content, options) {\n return exports.snippetManager.insertSnippet(this, content, options);\n };\n this.expandSnippet = function(options) {\n return exports.snippetManager.expandWithTab(this, options);\n };\n}).call(Editor.prototype);\n\n});\n\nace.define(\"ace/ext/emmet\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\",\"ace/editor\",\"ace/snippets\",\"ace/range\",\"resources\",\"resources\",\"tabStops\",\"resources\",\"utils\",\"actions\",\"ace/config\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\nvar HashHandler = acequire(\"ace/keyboard/hash_handler\").HashHandler;\nvar Editor = acequire(\"ace/editor\").Editor;\nvar snippetManager = acequire(\"ace/snippets\").snippetManager;\nvar Range = acequire(\"ace/range\").Range;\nvar emmet, emmetPath;\nfunction AceEmmetEditor() {}\n\nAceEmmetEditor.prototype = {\n setupContext: function(editor) {\n this.ace = editor;\n this.indentation = editor.session.getTabString();\n if (!emmet)\n emmet = window.emmet;\n var resources = emmet.resources || emmet.require(\"resources\");\n resources.setVariable(\"indentation\", this.indentation);\n this.$syntax = null;\n this.$syntax = this.getSyntax();\n },\n getSelectionRange: function() {\n var range = this.ace.getSelectionRange();\n var doc = this.ace.session.doc;\n return {\n start: doc.positionToIndex(range.start),\n end: doc.positionToIndex(range.end)\n };\n },\n createSelection: function(start, end) {\n var doc = this.ace.session.doc;\n this.ace.selection.setRange({\n start: doc.indexToPosition(start),\n end: doc.indexToPosition(end)\n });\n },\n getCurrentLineRange: function() {\n var ace = this.ace;\n var row = ace.getCursorPosition().row;\n var lineLength = ace.session.getLine(row).length;\n var index = ace.session.doc.positionToIndex({row: row, column: 0});\n return {\n start: index,\n end: index + lineLength\n };\n },\n getCaretPos: function(){\n var pos = this.ace.getCursorPosition();\n return this.ace.session.doc.positionToIndex(pos);\n },\n setCaretPos: function(index){\n var pos = this.ace.session.doc.indexToPosition(index);\n this.ace.selection.moveToPosition(pos);\n },\n getCurrentLine: function() {\n var row = this.ace.getCursorPosition().row;\n return this.ace.session.getLine(row);\n },\n replaceContent: function(value, start, end, noIndent) {\n if (end == null)\n end = start == null ? this.getContent().length : start;\n if (start == null)\n start = 0; \n \n var editor = this.ace;\n var doc = editor.session.doc;\n var range = Range.fromPoints(doc.indexToPosition(start), doc.indexToPosition(end));\n editor.session.remove(range);\n \n range.end = range.start;\n \n value = this.$updateTabstops(value);\n snippetManager.insertSnippet(editor, value);\n },\n getContent: function(){\n return this.ace.getValue();\n },\n getSyntax: function() {\n if (this.$syntax)\n return this.$syntax;\n var syntax = this.ace.session.$modeId.split(\"/\").pop();\n if (syntax == \"html\" || syntax == \"php\") {\n var cursor = this.ace.getCursorPosition();\n var state = this.ace.session.getState(cursor.row);\n if (typeof state != \"string\")\n state = state[0];\n if (state) {\n state = state.split(\"-\");\n if (state.length > 1)\n syntax = state[0];\n else if (syntax == \"php\")\n syntax = \"html\";\n }\n }\n return syntax;\n },\n getProfileName: function() {\n var resources = emmet.resources || emmet.require(\"resources\");\n switch (this.getSyntax()) {\n case \"css\": return \"css\";\n case \"xml\":\n case \"xsl\":\n return \"xml\";\n case \"html\":\n var profile = resources.getVariable(\"profile\");\n if (!profile)\n profile = this.ace.session.getLines(0,2).join(\"\").search(/]+XHTML/i) != -1 ? \"xhtml\": \"html\";\n return profile;\n default:\n var mode = this.ace.session.$mode;\n return mode.emmetConfig && mode.emmetConfig.profile || \"xhtml\";\n }\n },\n prompt: function(title) {\n return prompt(title);\n },\n getSelection: function() {\n return this.ace.session.getTextRange();\n },\n getFilePath: function() {\n return \"\";\n },\n $updateTabstops: function(value) {\n var base = 1000;\n var zeroBase = 0;\n var lastZero = null;\n var ts = emmet.tabStops || emmet.require('tabStops');\n var resources = emmet.resources || emmet.require(\"resources\");\n var settings = resources.getVocabulary(\"user\");\n var tabstopOptions = {\n tabstop: function(data) {\n var group = parseInt(data.group, 10);\n var isZero = group === 0;\n if (isZero)\n group = ++zeroBase;\n else\n group += base;\n\n var placeholder = data.placeholder;\n if (placeholder) {\n placeholder = ts.processText(placeholder, tabstopOptions);\n }\n\n var result = '${' + group + (placeholder ? ':' + placeholder : '') + '}';\n\n if (isZero) {\n lastZero = [data.start, result];\n }\n\n return result;\n },\n escape: function(ch) {\n if (ch == '$') return '\\\\$';\n if (ch == '\\\\') return '\\\\\\\\';\n return ch;\n }\n };\n\n value = ts.processText(value, tabstopOptions);\n\n if (settings.variables['insert_final_tabstop'] && !/\\$\\{0\\}$/.test(value)) {\n value += '${0}';\n } else if (lastZero) {\n var common = emmet.utils ? emmet.utils.common : emmet.require('utils');\n value = common.replaceSubstring(value, '${0}', lastZero[0], lastZero[1]);\n }\n \n return value;\n }\n};\n\n\nvar keymap = {\n expand_abbreviation: {\"mac\": \"ctrl+alt+e\", \"win\": \"alt+e\"},\n match_pair_outward: {\"mac\": \"ctrl+d\", \"win\": \"ctrl+,\"},\n match_pair_inward: {\"mac\": \"ctrl+j\", \"win\": \"ctrl+shift+0\"},\n matching_pair: {\"mac\": \"ctrl+alt+j\", \"win\": \"alt+j\"},\n next_edit_point: \"alt+right\",\n prev_edit_point: \"alt+left\",\n toggle_comment: {\"mac\": \"command+/\", \"win\": \"ctrl+/\"},\n split_join_tag: {\"mac\": \"shift+command+'\", \"win\": \"shift+ctrl+`\"},\n remove_tag: {\"mac\": \"command+'\", \"win\": \"shift+ctrl+;\"},\n evaluate_math_expression: {\"mac\": \"shift+command+y\", \"win\": \"shift+ctrl+y\"},\n increment_number_by_1: \"ctrl+up\",\n decrement_number_by_1: \"ctrl+down\",\n increment_number_by_01: \"alt+up\",\n decrement_number_by_01: \"alt+down\",\n increment_number_by_10: {\"mac\": \"alt+command+up\", \"win\": \"shift+alt+up\"},\n decrement_number_by_10: {\"mac\": \"alt+command+down\", \"win\": \"shift+alt+down\"},\n select_next_item: {\"mac\": \"shift+command+.\", \"win\": \"shift+ctrl+.\"},\n select_previous_item: {\"mac\": \"shift+command+,\", \"win\": \"shift+ctrl+,\"},\n reflect_css_value: {\"mac\": \"shift+command+r\", \"win\": \"shift+ctrl+r\"},\n\n encode_decode_data_url: {\"mac\": \"shift+ctrl+d\", \"win\": \"ctrl+'\"},\n expand_abbreviation_with_tab: \"Tab\",\n wrap_with_abbreviation: {\"mac\": \"shift+ctrl+a\", \"win\": \"shift+ctrl+a\"}\n};\n\nvar editorProxy = new AceEmmetEditor();\nexports.commands = new HashHandler();\nexports.runEmmetCommand = function runEmmetCommand(editor) {\n try {\n editorProxy.setupContext(editor);\n var actions = emmet.actions || emmet.require(\"actions\");\n \n if (this.action == \"expand_abbreviation_with_tab\") {\n if (!editor.selection.isEmpty())\n return false;\n var pos = editor.selection.lead;\n var token = editor.session.getTokenAt(pos.row, pos.column);\n if (token && /\\btag\\b/.test(token.type))\n return false;\n }\n \n if (this.action == \"wrap_with_abbreviation\") {\n return setTimeout(function() {\n actions.run(\"wrap_with_abbreviation\", editorProxy);\n }, 0);\n }\n \n var result = actions.run(this.action, editorProxy);\n } catch(e) {\n if (!emmet) {\n load(runEmmetCommand.bind(this, editor));\n return true;\n }\n editor._signal(\"changeStatus\", typeof e == \"string\" ? e : e.message);\n console.log(e);\n result = false;\n }\n return result;\n};\n\nfor (var command in keymap) {\n exports.commands.addCommand({\n name: \"emmet:\" + command,\n action: command,\n bindKey: keymap[command],\n exec: exports.runEmmetCommand,\n multiSelectAction: \"forEach\"\n });\n}\n\nexports.updateCommands = function(editor, enabled) {\n if (enabled) {\n editor.keyBinding.addKeyboardHandler(exports.commands);\n } else {\n editor.keyBinding.removeKeyboardHandler(exports.commands);\n }\n};\n\nexports.isSupportedMode = function(mode) {\n if (!mode) return false;\n if (mode.emmetConfig) return true;\n var id = mode.$id || mode;\n return /css|less|scss|sass|stylus|html|php|twig|ejs|handlebars/.test(id);\n};\n\nexports.isAvailable = function(editor, command) {\n if (/(evaluate_math_expression|expand_abbreviation)$/.test(command))\n return true;\n var mode = editor.session.$mode;\n var isSupported = exports.isSupportedMode(mode);\n if (isSupported && mode.$modes) {\n try {\n editorProxy.setupContext(editor);\n if (/js|php/.test(editorProxy.getSyntax()))\n isSupported = false;\n } catch(e) {}\n }\n return isSupported;\n};\n\nvar onChangeMode = function(e, target) {\n var editor = target;\n if (!editor)\n return;\n var enabled = exports.isSupportedMode(editor.session.$mode);\n if (e.enableEmmet === false)\n enabled = false;\n if (enabled)\n load();\n exports.updateCommands(editor, enabled);\n};\n\nvar load = function(cb) {\n if (typeof emmetPath == \"string\") {\n acequire(\"ace/config\").loadModule(emmetPath, function() {\n emmetPath = null;\n cb && cb();\n });\n }\n};\n\nexports.AceEmmetEditor = AceEmmetEditor;\nacequire(\"ace/config\").defineOptions(Editor.prototype, \"editor\", {\n enableEmmet: {\n set: function(val) {\n this[val ? \"on\" : \"removeListener\"](\"changeMode\", onChangeMode);\n onChangeMode({enableEmmet: !!val}, this);\n },\n value: true\n }\n});\n\nexports.setCore = function(e) {\n if (typeof e == \"string\")\n emmetPath = e;\n else\n emmet = e;\n};\n});\n (function() {\n ace.acequire([\"ace/ext/emmet\"], function() {});\n })();\n ","ace.define(\"ace/theme/xcode\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-xcode\";\nexports.cssText = \"\\\n.ace-xcode .ace_gutter {\\\nbackground: #e8e8e8;\\\ncolor: #333\\\n}\\\n.ace-xcode .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8\\\n}\\\n.ace-xcode {\\\nbackground-color: #FFFFFF;\\\ncolor: #000000\\\n}\\\n.ace-xcode .ace_cursor {\\\ncolor: #000000\\\n}\\\n.ace-xcode .ace_marker-layer .ace_selection {\\\nbackground: #B5D5FF\\\n}\\\n.ace-xcode.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #FFFFFF;\\\n}\\\n.ace-xcode .ace_marker-layer .ace_step {\\\nbackground: rgb(198, 219, 174)\\\n}\\\n.ace-xcode .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #BFBFBF\\\n}\\\n.ace-xcode .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.071)\\\n}\\\n.ace-xcode .ace_gutter-active-line {\\\nbackground-color: rgba(0, 0, 0, 0.071)\\\n}\\\n.ace-xcode .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #B5D5FF\\\n}\\\n.ace-xcode .ace_constant.ace_language,\\\n.ace-xcode .ace_keyword,\\\n.ace-xcode .ace_meta,\\\n.ace-xcode .ace_variable.ace_language {\\\ncolor: #C800A4\\\n}\\\n.ace-xcode .ace_invisible {\\\ncolor: #BFBFBF\\\n}\\\n.ace-xcode .ace_constant.ace_character,\\\n.ace-xcode .ace_constant.ace_other {\\\ncolor: #275A5E\\\n}\\\n.ace-xcode .ace_constant.ace_numeric {\\\ncolor: #3A00DC\\\n}\\\n.ace-xcode .ace_entity.ace_other.ace_attribute-name,\\\n.ace-xcode .ace_support.ace_constant,\\\n.ace-xcode .ace_support.ace_function {\\\ncolor: #450084\\\n}\\\n.ace-xcode .ace_fold {\\\nbackground-color: #C800A4;\\\nborder-color: #000000\\\n}\\\n.ace-xcode .ace_entity.ace_name.ace_tag,\\\n.ace-xcode .ace_support.ace_class,\\\n.ace-xcode .ace_support.ace_type {\\\ncolor: #790EAD\\\n}\\\n.ace-xcode .ace_storage {\\\ncolor: #C900A4\\\n}\\\n.ace-xcode .ace_string {\\\ncolor: #DF0002\\\n}\\\n.ace-xcode .ace_comment {\\\ncolor: #008E00\\\n}\\\n.ace-xcode .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y\\\n}\";\n\nvar dom = acequire(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n","import {Component, Mixins} from \"vue-property-decorator\";\nimport att_mixins from \"@/mixins/att\";\nimport att from \"@/mixins/att\";\n@Component({components: {}})\nexport default class order_mixins extends Mixins(att) {\n testColumns = [\n {\n title: '阶段',\n key: 'Status',\n width: '150'\n },\n {\n title: '错误等级',\n key: 'Level',\n width: '100'\n },\n {\n title: '错误信息',\n key: 'Error',\n tooltip: true,\n },\n {\n title: '当前检查的sql',\n key: 'SQL',\n tooltip: true\n },\n {\n title: '影响行数',\n key: 'AffectRows',\n width: '120'\n }\n ];\n ruleValidate = {\n idc: [\n {\n required: true,\n message: '环境地址不得为空',\n trigger: 'change'\n }\n ],\n source: [\n {\n required: true,\n message: '连接名不得为空',\n trigger: 'change'\n }\n ],\n database: [\n {\n required: true,\n message: '数据库名不得为空',\n trigger: 'change'\n }\n ],\n table: [\n {\n required: true,\n message: '数据表名不得为空',\n trigger: 'change'\n }\n ],\n tp: [\n {\n required: true,\n message: '类型不得为空',\n trigger: 'change'\n }\n ],\n name: [\n {\n required: true,\n message: '名称不得为空',\n trigger: 'blur'\n }\n ],\n text: [\n {\n required: true,\n message: '提交说明不得为空',\n trigger: 'blur'\n }\n ],\n assigned: [\n {\n required: true,\n message: '审核人不得为空',\n trigger: 'change'\n }\n ],\n backup: {required: true, type: 'number', message: '备份不得为空', trigger: 'change'}\n };\n invalidDate = {\n disabledDate(date: number) {\n return date && date.valueOf() < Date.now() - 86400000\n }\n };\n\n clearForm() {\n this.formItem = this.$config.clearObj(this.formItem)\n }\n\n setCompletions(editor: any, session: any, pos: any, prefix: any, callback: (arg0: null, arg1: { caption: any; value: any; meta: any; }[]) => void) {\n callback(null, this.wordList.map(function (word:any) {\n return {\n caption: word.vl,\n value: word.vl,\n meta: word.meta\n }\n }))\n }\n\n editorInit() {\n require('brace/mode/mysql');\n require('brace/theme/xcode')\n }\n}\n"],"sourceRoot":""}