{"version":3,"sources":["../custom/jquery/jquery.js","../custom/jquery/jquery-ui.js","../custom/datatables/jquery.dataTables.js","../custom/datatables/dataTables.bootstrap.js","../custom/datatables/dataTables.fixedHeader.js","../custom/datatables/dataTables.colReorder.js","../custom/dataTables.rowReorder.js","../custom/moment/moment.js","../custom/moment/locale/de.js","../custom/Chart.js","../custom/jquery.contextMenu.js","../custom/bootstrap-sass/bootstrap.js","../custom/typeahead.js/bloodhound.js","../custom/typeahead.js/typeahead.jquery.js","../custom/UUID.js","webpack:///webpack/bootstrap","webpack:///src/plugins/modules/dialog.js","webpack:///src/plugins/modules/fileBrowser.js","webpack:///src/lang/en.js","webpack:///src/plugins/modules/_colorPicker.js","webpack:///src/plugins/submenu/fontColor.js","webpack:///src/plugins/submenu/hiliteColor.js","webpack:///src/plugins/submenu/template.js","webpack:///src/plugins/modules/_selectMenu.js","webpack:///src/plugins/modules/_anchor.js","webpack:///src/plugins/dialog/link.js","webpack:///src/plugins/dialog/image.js","webpack:///src/plugins/dialog/video.js","webpack:///src/plugins/dialog/audio.js","webpack:///src/plugins/dialog/math.js","webpack:///src/plugins/index.js","webpack:///src/plugins/command/blockquote.js","webpack:///src/plugins/submenu/align.js","webpack:///src/plugins/submenu/font.js","webpack:///src/plugins/submenu/fontSize.js","webpack:///src/plugins/submenu/horizontalRule.js","webpack:///src/plugins/submenu/list.js","webpack:///src/plugins/submenu/table.js","webpack:///src/plugins/submenu/formatBlock.js","webpack:///src/plugins/submenu/lineHeight.js","webpack:///src/plugins/submenu/paragraphStyle.js","webpack:///src/plugins/submenu/textStyle.js","webpack:///src/plugins/fileBrowser/imageGallery.js","webpack:///src/assets/defaultIcons.js","webpack:///src/lib/util.js","webpack:///src/lib/constructor.js","webpack:///src/lib/context.js","webpack:///src/plugins/modules/_notice.js","webpack:///src/suneditor.js","webpack:///src/lib/core.js","webpack:///src/lib/history.js","webpack:///src/suneditor_build.js","webpack:///src/plugins/modules/component.js","webpack:///src/plugins/modules/resizing.js","webpack:///src/plugins/modules/fileManager.js","../../node_modules/suneditor/src/lang/de.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","global","factory","window","this","noGlobal","dialog","add","core","context","kind","updateModal","_closeSignal","dialog_div","util","createElement","className","dialog_back","style","display","dialog_area","appendChild","modalArea","back","modal","addEventListener","_onMouseDown_dialog","_onClick_dialog","element","relative","e","test","target","getAttribute","plugins","close","open","update","modalForm","_bindClose","_d","removeEventListener","keyCode","options","popupDisplay","position","focusElement","on","focus","init","SUNEDITOR_MODULES","writable","configurable","document","w","Error","fileBrowser","_xmlHttp","_loading","area","header","tagArea","body","list","tagElements","items","selectedTags","selectorHandler","contextPlugin","columnSize","browser_div","content","innerHTML","set_browser","querySelector","titleArea","onClickTag","onClickFile","_onMouseDown_browser","_onClick_browser","lang","dialogBox","icons","cancel","stopPropagation","pluginName","fileBrowserContext","pluginContext","listClassName","listClass","hasClass","textContent","title","_drawFileList","url","fileBrowserPlugin","abort","showBrowserLoading","closeBrowserLoading","browserHeader","xmlHttp","getXMLHttpRequest","onreadystatechange","_callBackGet","_w","keys","length","setRequestHeader","send","readyState","status","res","JSON","parse","responseText","result","_drawListItem","nullMessage","message","maxHeight","innerHeight","offsetHeight","err","errorMessage","_tags","len","splitSize","Math","round","drawItemHandler","itemTemplateHandler","tagsHTML","listHTML","columns","item","tags","tag","split","map","v","trim","tLen","indexOf","push","querySelectorAll","isAnchor","tagName","selectTag","sTagIndex","splice","removeClass","addClass","filter","some","preventDefault","listEl","command","parentNode","code","toolbar","default","save","font","formats","fontSize","bold","underline","italic","strike","subscript","superscript","removeFormat","fontColor","hiliteColor","indent","outdent","align","alignLeft","alignRight","alignCenter","alignJustify","orderList","unorderList","horizontalRule","hr_solid","hr_dotted","hr_dashed","table","link","math","image","video","audio","fullScreen","showBlocks","codeView","undo","redo","preview","print","tag_p","tag_div","tag_h","tag_blockquote","tag_pre","template","lineHeight","paragraphStyle","textStyle","imageGallery","dir_ltr","dir_rtl","mention","linkBox","text","newWindowCheck","downloadLinkCheck","bookmark","mathBox","inputLabel","fontSizeLabel","previewLabel","imageBox","file","altText","videoBox","audioBox","browser","search","caption","submitButton","revertButton","proportion","basic","left","right","center","width","height","size","ratio","controller","edit","unlink","remove","insertRowAbove","insertRowBelow","deleteRow","insertColumnBefore","insertColumnAfter","deleteColumn","fixedColumnWidth","resize100","resize75","resize50","resize25","autoSize","mirrorHorizontal","mirrorVertical","rotateLeft","rotateRight","maxSize","minSize","tableHeader","mergeCells","splitCells","HorizontalSplit","VerticalSplit","menu","spaced","bordered","neon","translucent","shadow","SUNEDITOR_LANG","colorPicker","colorListHTML","_colorInput","_defaultColor","_styleProperty","_currentColor","_colorList","createColorList","_makeColorList","makeColor","option","colorList","colorArr","color","checked","erase","node","fillColor","getColorInNode","isHexColor","rgb2hex","toLowerCase","setInputText","colorName2hex","setCurrentColor","hexColorStr","borderColor","findColor","styleProperty","isWysiwygDiv","nodeType","str","rgb","rgbMatch","match","parseInt","toString","slice","colorName","temp","colors","getComputedStyle","a","removeItem","substr","targetElement","addModule","previewEl","colorInput","listDiv","setSubmenu","onChangeInput","submit","pickup","initMenuTarget","colorArea","contextPicker","contextFontColor","wwComputedStyle","getSelectionNode","applyColor","nodeChange","submenuOff","newNode","contextHiliteColor","backgroundColor","selectedIndex","templateDiv","templateList","templates","html","setContents","selectMenu","caller","callerContext","setForm","createList","listContext","form","menus","initEvent","forms","index","clickMethod","callerName","onMousedown_list","onMouseMove_list","onClick_list","moveItem","num","selectIndex","getItem","positionHandler","visibility","anchor","setDialogForm","host","location","origin","pathname","replace","relList","linkRel","defaultRel","linkRelDefault","protocol","download","rel","anchorPlugin","urlInput","linkDefaultRel","currentRel","linkAnchor","linkValue","_change","check_new_window","check_bookmark","anchorText","downloadCheck","bookmarkButton","relButton","relPreview","onClick_relButton","onClick_relList","onChange_newWindowCheck","onChange_downloadCheck","onChangeAnchorText","onChangeUrlInput","onKeyDownUrlInput","onFocusUrlInput","onBlurUrlInput","onClick_bookmarkButton","contextAnchor","href","selfPathBookmark","lastIndexOf","getSelection","linkTargetNewWindow","setRel","setLinkPreview","setHeaderBookmark","path","_closeRelMenu","toggleRelList","show","rtl","offsetLeft","offsetWidth","top","offsetTop","contains","cmd","current","toggleClass","join","relAttr","relListEl","rels","checkedRel","createHeaderList","contextList","urlValue","headers","getListChildren","wysiwyg","nodeName","valueRegExp","RegExp","h","_setMenuListPosition","id","random","contextLink","linkProtocol","noPrefix","linkNoPrefix","reservedProtocol","sameProtocol","setCtx","updateAnchor","displayText","notText","setAttribute","removeAttribute","children","createAnchor","oA","_relMerge","_relDelete","_linkAnchor","anchorCtx","link_dialog","setDialog","link_controller","setController_LinkButton","linkController","onClick_linkController","link_btn","delete","currentControllerName","showLoading","textNode","childNodes","setRange","selectedFormats","getSelectedElements","oFormat","insertNode","closeLoading","history","active","controllerArray","call_controller","controllersOff","selectionATag","editLink","linkBtn","setControllerPosition","controllersOn","sc","getChildElement","ec","component","resizing","fileManager","contextImage","_infoList","_infoIndex","_uploadFileLength","sizeUnit","_imageSizeUnit","_linkElement","_altText","_align","_floatClassRegExp","_v_src","_linkValue","svgDefaultSize","base64RenderIndex","_element","_cover","_container","inputX","inputY","_element_w","_element_h","_element_l","_element_t","_defaultSizeX","_defaultSizeY","_origin_w","imageWidth","_origin_h","imageHeight","_proportionChecked","_resizing","imageResizing","_resizeDotHide","imageHeightShow","_rotation","imageRotation","_alignHide","imageAlignShow","_onlyPercentage","imageSizeOnlyPercentage","_ratio","_ratioX","_ratioY","_captionShow","_captionChecked","_caption","captionCheckEl","image_dialog","imgInputFile","imgUrlFile","previewSrc","openTab","_removeSelectedFiles","_onLinkPreview","_fileInputChange","imageGalleryButton","_openGallery","setInputSize","setRatio","sizeRevert","imageFileInput","imageAccept","imageMultipleFile","imageUrlInput","imageGalleryUrl","image_gallery","onlyPercentage","onlyPercentDisplay","heightDisplay","revert","textDecoration","callPlugin","_setUrlInput","alt","src","fileTags","select","onModifyMode","call_controller_resize","destroy","imageEl","imageContainer","getParentElement","isMediaComponent","dataIndex","focusEl","previousElementSibling","nextElementSibling","emptyDiv","removeItemAllParents","focusEdge","deleteInfo","functions","onImageUpload","tabName","tabContent","tabLinks","getElementsByClassName","imagePlugin","update_image","files","submitAction","onRender_imgUrl","error","fileList","fileSize","type","limitSize","imageUploadSizeLimit","infoSize","imagesInfo","onImageUploadError","noticeOpen","info","inputWidth","inputHeight","isUpdate","onImageUploadBefore","data","Array","isArray","register","upload","response","imageUploadUrl","filesLen","formData","FormData","append","imageUploadHeader","callBack_imgUpload","setup_reader","imageUploadHandler","update_src","create_image","wFileReader","FileReader","filesStack","reader","onload","updateElement","onRender_imgBase64","readAsDataURL","updateMethod","createMethod","pop","onRender_link","imgTag","xy","_module_setInputSize","_module_setRatio","checkFileInfo","modifyHandler","openModify","format","getFormatElement","textAlign","float","checkInfo","resetFileInfo","resetInfo","_resize_plugin","oImg","cloneNode","cover","set_cover","container","set_container","create_caption","applySize","setAlign","_image_create_onload","insertComponent","setInfo","mediaAutoSelect","selectComponent","line","appendFormatTag","openController","notHistoryPush","changeSize","isNewContainer","x","isNumber","y","modifiedCaption","isNewAnchor","insertBefore","imageElement","newEl","removeChild","existElement","isRangeFormatElement","isNotCheckingNode","replaceChild","isListCell","refer","removeEmptyNode","isFormatElement","splitElement","htmlRemoveWhiteSpace","previousSibling","__updateTags","_rotateVertical","resetTransform","setTransformSize","getNumber","setTimeout","userSize","notOpen","_module_setModifyInputSize","setPercentSize","setSize","setAutoSize","_module_sizeRevert","notResetPercentage","direction","onlyW","cancelPercentAttr","_module_saveCurrentSize","marginTop","maxWidth","setOriginSize","originSize","heightPercentage","setCaptionPosition","minWidth","contextVideo","_videoSizeUnit","_youtubeQuery","youtubeQuery","_videoRatio","videoRatio","_defaultRatio","videoWidth","videoHeight","videoResizing","videoHeightShow","videoRotation","videoAlignShow","videoSizeOnlyPercentage","video_dialog","videoInputFile","videoUrlFile","videoRatioOption","setVideoRatio","videoFileInput","videoAccept","videoMultipleFile","videoUrlInput","ratioList","videoRatioList","ratioDisplay","videoRatioShow","onlyWidthDisplay","_setTagAttrs","attrs","videoTagAttrs","hasOwn","createVideoTag","videoTag","_setIframeAttrs","frameBorder","allowFullscreen","videoIframeAttrs","createIframeTag","iframeTag","frame","onVideoUpload","disabled","setVideoRatioSelect","placeholder","videoPlugin","setup_url","videoUploadSizeLimit","videosInfo","onVideoUploadError","onVideoUploadBefore","videoUploadUrl","videoUploadHeader","callBack_videoUpload","videoUploadHandler","create_video","DOMParser","parseFromString","splitUrl","endsWith","oFrame","isYoutube","isVimeo","newTag","inputUpdate","_module_getSizeX","_module_getSizeY","isPercent","changed","_update_videoCover","prevFrame","figcaption","console","warn","ratioSelected","ratioOptions","selected","onlyH","paddingBottom","dataSize","contextAudio","targetSelect","audioWidth","audioHeight","audio_dialog","audioInputFile","audioUrlFile","audio_controller","setController","onClick_controller","audioFileInput","audioAccept","audioMultipleFile","audioUrlInput","_createAudioTag","oAudio","cssText","audioTagAttrs","isComponent","onAudioUpload","updateCover","setupUrl","audioUploadSizeLimit","audiosInfo","onAudioUploadError","onAudioUploadBefore","audioUploadUrl","audioUploadHeader","callBack_upload","audioUploadHandler","create_audio","prevElement","selectionTag","onControllerOff","previewElement","fontSizeElement","defaultFontSize","_mathExp","math_dialog","isIE","_renderMathExp","math_controller","setController_MathButton","mathController","onClick_mathController","mathFontSize","f","math_btn","managedTags","method","katex","dom","createRange","createContextualFragment","_renderer","HTMLDecoder","exp","renderToString","throwOnError","displayMode","contextMath","mathExp","katexEl","HTMLEncoder","containerEl","empty","createTextNode","zeroWidthSpace","nextSibling","mathTag","mathBtn","blockquote","targetButton","action","currentBlockquote","detachRangeFormatElement","applyRangeFormatElement","_itemMenu","_alignList","currentAlign","defaultDir","justify","align_justify","align_left","align_right","align_center","listUl","alignItems","charAt","toUpperCase","alignContext","firstElementChild","changeElement","alignList","exchangeDir","dir","leftBtn","rightBtn","lp","parentElement","rp","selectedFormsts","setStyle","effectNode","targetText","targetTooltip","_fontList","currentFont","fontList","tooltip","fontFamily","selectFont","changeTxt","hasFocus","fontContext","_sizeList","currentSize","sizeList","unit","fontSizeUnit","_convertFontSize","fontSizeContext","currentHR","horizontalRulePick","hrItems","class","appendHr","hrTemp","oNode","_list","currentList","bullets","list_bullets","number","list_number","button","icon","isList","editList","selectedCells","detach","range","getRange","getSelectedElementsAndComponents","getRange_addLine","sortByDepth","firstSel","lastSel","topEl","bottomEl","isCollapsed","collapsed","originRange","startContainer","so","endContainer","onlyZeroWidthSpace","startOffset","endOffset","eo","afterRange","isRemove","getRangeFormatElement","topElParent","bottomElParent","mergeTop","mergeBottom","firstList","lastList","topNumber","bottomNumber","passComponent","newCell","fTag","isCell","next","originParent","nextParent","parentTag","siblingTag","rangeTag","_isIgnoreNodeChange","copyFormatAttributes","isHR","outerHTML","fChildren","getElementDepth","j","currentFormat","rangeArr","tempList","_detachNested","cells","first","last","originList","sibling","cLen","newList","getPositionIndex","mergeSameTags","edge","getEdgeChildNodes","cc","editInsideList","cellsLen","el","lastCell","innerList","prev","nodePath","sl","_insiedList","getNodeFromPath","insertPrev","getNodePath","firstChild","slPath","lastElementChild","mergeNestedTags","contextTable","_tdElement","_trElement","_trElements","_tableXY","_maxWidth","_fixedColumn","_rtl","cellControllerTop","tableCellControllerPosition","resizeText","headerButton","mergeButton","splitButton","splitMenu","maxText","minText","_physical_cellCnt","_logical_cellCnt","_rowCnt","_rowIndex","_physical_cellIndex","_logical_cellIndex","_current_colSpan","_current_rowSpan","expansion","reduction","tablePicker","tableHighlight","tableUnHighlight","tableDisplay","tableController","setController_table","resizeButton","columnFixedButton","resizeDiv","setController_tableEditor","insertRowAboveButton","insertRowBelowButton","onMouseMove_tablePicker","appendTable","onClick_tableController","tableResize","fixed_column_width","table_header","insert_row_above","insert_row_below","delete_row","merge_cell","insert_column_left","insert_column_right","delete_column","split_cell","oTable","createCells","tableHTML","firstTd","reset_table_picker","cnt","returnElement","cell","cellsHTML","ceil","offsetX","offsetY","highlight","unHighlight","tablePlugin","_removeEvents","_selectedTable","_toggleEditor","_shift","_selectedCells","_ref","_fixedCell","_selectedCell","_fixedCellName","call_controller_tableEdit","tdElement","tableElement","tableLayout","setTableStyle","setPositionControllerTop","setPositionControllerDiv","reset","setCellInfo","rows","cellIndex","cellCnt","colSpan","rowIndex","rowSpan","rowSpanArr","spanIndex","cs","rs","logcalIndex","arr","row","concat","sort","b","editTable","isRow","tableAttr","positionCell","editRow","removeCells","firstRow","rightCell","editCell","positionResetElement","up","originRowIndex","sign","spanCells","spanCell","shift","insertRow","passCell","removeCell","removeSpanArr","insertIndex","applySpan","cellColSpan","removeIndex","getOverlapRangeAtIndex","removeFirst","removeEnd","rLen","getArrayIndex","rowSpanCell","_closeSplitMenu","openSplitMenu","removeDocEvent","addDocEvent","vertical","currentCell","currentRow","currentColSpan","floor","currentRowSpan","newRowSpan","nextRowIndex","nextRow","nextCells","newRow","physicalIndex","ref","mergeCell","emptyRowFirst","emptyRowLast","ce","re","mergeHTML","ch","rowIndexFirst","rowIndexLast","removeRows","setActiveButton","toggleHeader","styles","span","sizeIcon","fixedCell","selectedCell","_bindOnSelect","_bindOffSelect","_bindOffShift","enabled","_offCellMultiSelect","_initBind","_wd","_onCellMultiSelect","_antiBlur","_setMultiCells","startCell","endCell","findSelectedCell","_i","newCs","newCe","newRs","newRe","onTableCellMultiSelect","formatBlock","_formatList","pickUp","lang_toolbar","defaultFormats","formatList","formatTitle","formatContext","rangeElement","firstPath","lastPath","rlist","detachList","modifiedFormsts","freeElement","before","inner","isComp","isSameAttributes","newFormat","lineHeights","lineHeightContext","_classList","menuLang","defaultList","_class","paragraphStyles","defaultStyle","paragraphList","_styleList","styleList","textStyles","styleButtonList","selectionNode","btn","checkStyles","classes","classList","removeNodes","imageGalleryHeader","drawItems","setImage","srcName","thumbnail","fileName","code_view","line_height","paragraph_style","text_style","arrow_down","font_color","highlight_color","horizontal_rule","show_blocks","modify","auto_size","rotate_left","rotate_right","mirror_horizontal","mirror_vertical","line_break","alert_outline","more_text","more_paragraph","more_plus","more_horizontal","more_vertical","attachment","magic_stick","empty_file","isIE_Edge","isOSX_IOS","isChromium","isResizeObserverSupported","_propertiesInit","navigator","userAgent","appVersion","platform","chrome","ResizeObserver","_allowedEmptyNodeList","_HTMLConvertor","contents","'","String","fromCharCode","zeroWidthRegExp","onlyZeroWidthRegExp","fontValueMap","ActiveXObject","XMLHttpRequest","e1","getValues","obj","camelToKebabCase","param","letter","kebabToCamelCase","elementName","_hasOwn","getIncludePath","nameArray","extension","pathList","regExp","extRegExp","getElementsByTagName","editorTag","getPageStyle","doc","sheets","styleSheets","rules","cssRules","getIframeDocument","iframe","wDocument","contentWindow","contentDocument","getAttributesToString","exceptAttrs","attributes","attrString","getByteLength","encoder","encodeURIComponent","cr","cl","unescape","TextEncoder","encode","isNonEditable","isTextStyleElement","isInputElement","isClosureRangeFormatElement","isFreeFormatElement","isClosureFreeFormatElement","isUneditableComponent","validation","getFreeFormatElement","getClosureFreeFormatElement","copyTagAttributes","originEl","copyEl","blacklist","copyStyles","getArrayItem","array","multi","arrayIncludes","idx","nextIdx","prevIdx","_newOffsets","finds","tempText","previous","reverse","offsets","nodes","style_a","style_b","compStyle","class_a","class_b","reg","compClass","isEmptyLine","isSpanWithoutAttr","isTable","isBreak","isMedia","isFigures","maxDec","toFixed","recursionFunc","getListChildNodes","depth","compareElements","aNode","bNode","ancestor","aIndex","bIndex","query","check","attr","childList","lastChild","getOffset","wysiwygFrame","offsetElement","offsetParent","scrollTop","aStart","aEnd","bStart","bEnd","overlap","txt","newElement","styleName","isImportantDisabled","hasAttribute","setDisabledButtons","buttonList","important","stopParent","parent","detachNestedList","baseNode","all","rNode","_deleteNestedList","cNodes","rChildren","baseParent","liSibling","liParent","child","offset","bp","suffixIndex","splitText","after","depthEl","pElement","nodePathArray","onlyText","inst","nodePathLen","apply","Number","valueOf","depthIndex","cDepth","spliceDepth","childs","childLength","nLen","addOffset","textOffset","tempL","notRemoveNode","forceDelete","_notTextNode","htmlCompress","des","_isExcludeSelectionElement","_isMaintainedNode","_isSizeNode","_disallowedTags","createTagsWhitelist","createTagsBlacklist","_consistencyCheckOfHTML","documentFragment","htmlCheckWhitelistRegExp","htmlCheckBlacklistRegExp","classNameFilter","removeTags","emptyTags","wrongList","withoutFormatCells","wrongTags","nrtag","fel","checkTags","cellChildren","tp","_setDefaultOptionStyle","optionStyle","minHeight","editor","styleArr","_setIframeDocument","head","_setIframeCssTags","_editableClass","linkNames","iframeCSSFileName","wRegExp","tagString","CSSFileName","styleTag","_initOptions","top_div","tool_bar","_createToolBar","toolbarShadow","pluginCallButtons","_checkKatexMath","arrow","sticky_dummy","editor_div","initElements","_initElements","bottomBar","wysiwyg_div","placeholder_span","textarea","resizing_bar","resizingBar","navigation","char_wrapper","charWrapper","char_counter","charCounter","loading_box","line_breaker","line_breaker_t","line_breaker_b","resize_back","toolbarContainer","resizingBarContainer","_checkCodeMirror","constructed","_top","_relative","_toolBar","_toolbarShadow","_menuTray","_editorArea","_wysiwygArea","_codeArea","_placeholder","_resizingBar","_navigation","_charWrapper","_charCounter","_lineBreaker","_lineBreaker_t","_lineBreaker_b","_resizeBack","_stickyDummy","_arrow","_responsiveButtons","responsiveButtons","codeMirror","cmOptions","htmlMode","lineNumbers","lineWrapping","reduce","viewportMargin","Infinity","cm","fromTextArea","wrapper","codeMirrorEditor","katexOptions","_setOptions","mergeOptions","originOptions","originElement","editorArea","isNewToolbarContainer","isNewToolbar","topArea","callButtons","topDiv","toolBar","toolBarArrow","_editorStyles","toolbarWidth","wysiwygDiv","iframeAttributes","overflow","charCounterLabel","charLabel","maxCharCount","char_max","innerText","_plugins","pluginsValues","_defaultLang","allowedClassNames","historyStackDelayTime","frameAttrbutes","defaultTag","textTags","sub","sup","_default","_new","_textTagsMap","_defaultCommand","__allowedScriptTag","tagsBlacklist","_defaultTagsWhitelist","_editorTagsWhitelist","addTagsWhitelist","_setWhitelist","pasteTagsBlacklist","pasteTagsWhitelist","attributesWhitelist","attributesBlacklist","lineAttrReset","_printClass","stickyToolbar","undefined","hideToolbar","fullScreenOffset","fullPage","previewTemplate","printTemplate","showPathLabel","resizeEnable","charCounterType","clientWidth","clientHeight","tabDisable","shortcutsDisable","shortcutsHint","callBackSave","_icons","__listCommonStyle","whitelist","_defaultButtons","addShift","indentKey","indentIcon","_createModuleGroup","oDiv","oUl","_createButton","buttonClass","dataCommand","dataDisplay","_disabled","oLi","oButton","label","separator_vertical","_buttonTray","stringify","defaultButtonList","moduleElement","buttonElement","moreLayer","buttonGroupLoop","more","moreContainer","moreCommand","buttonGroup","moreButton","div","ul","matched","custom","li","sv","enterDiv","unshift","tool_cover","_Context","cons","loading","lineBreaker","lineBreaker_t","lineBreaker_b","resizeBackground","tool","notice","notice_div","notice_span","notice_button","onClick_cancel","init_options","idOrElement","_init_options","val","getElementById","_Constructor","ownerDocument","defaultView","_util","_parser","_prevRtl","_editorHeight","_editorHeightPadding","_listCamel","_listKebab","_ww","_shadowRoot","_shadowRootControllerEventTarget","_notice","initPlugins","_targetPlugins","submenu","_submenuName","_bindedSubmenuOff","_bindedContainerOff","submenuActiveButton","containerActiveButton","currentControllerTarget","currentFileComponentInfo","codeViewDisabledButtons","resizingDisabledButtons","_moreLayerActiveButton","_htmlCheckWhitelistRegExp","_htmlCheckBlacklistRegExp","_disallowedTextTagsRegExp","editorTagsWhitelistRegExp","editorTagsBlacklistRegExp","pasteTagsWhitelistRegExp","pasteTagsBlacklistRegExp","isDisabled","isReadOnly","_attributesWhitelistRegExp","_attributesWhitelistRegExp_all_data","_attributesBlacklistRegExp","_attributesTagsWhitelist","_attributesTagsBlacklist","_bindControllersOff","_isInline","_isBalloon","_isBalloonAlways","_inlineToolbarAttr","isShow","_notHideToolbar","_sticky","_lineBreakerButton","_componentsInfoInit","_componentsInfoReset","activePlugins","managedTagsInfo","_charTypeHTML","_fileInfoPluginsCheck","_fileInfoPluginsReset","_fileManager","queryString","pluginRegExp","pluginMap","commandMap","_commandMapStyles","STRONG","U","EM","DEL","_styleCommandMap","_cleanStyleRegExp","_variable","isChanged","isCodeView","isFullScreen","innerHeight_fullScreen","resizeClientY","tabSize","codeIndent","minResizingSize","currentNodes","currentNodesMap","_range","_selectionNode","_originCssText","_bodyOverflow","_editorAreaOriginCssText","_wysiwygOriginCssText","_codeOriginCssText","_fullScreenAttrs","sticky","balloon","inline","_lineBreakComp","_lineBreakDir","_formatAttrsTemp","_saveButtonStates","allCommandButtons","currentButtons","_recoverButtonStates","oldButton","callBackFunction","_target","moduleArray","moduleName","getGlobalScrollOffset","scrollLeft","submenuOn","submenuName","_setMenuPosition","moreLayerOff","containerOn","containerName","_containerName","containerOff","toolbarW","toolbarOffset","event","_getEditorOffsets","menuW","elementW","rtlW","rtlL","overLeft","offsetEl","bt","toolbarTop","menuHeight","menuHeight_bottom","menuTop","insTop","menuHeight_top","arg","arguments","getFileComponent","showController","referEl","topMargin","controllerW","referElW","allow","overSize","execCommand","showDefaultUI","nativeFocus","__focus","_editorRange","currentNode","commonAncestorContainer","br","_applyTagEffects","_toggleToolbarBalloon","fileComponentInfo","blur","startCon","startOff","endCon","endOff","setStart","setEnd","selection","removeAllRanges","addRange","_rangeInfo","removeRange","_setKeyEffect","_createDefaultRange","focusNode","rangeCount","getRangeAt","anchorNode","anchorOffset","focusOffset","compareValue","rightDir","_selectionVoid","op","activeEl","activeElement","extentNode","firstFormat","comm","_resetRangeToTextNode","tempCon","tempOffset","tempChild","onlyBreak","emptyText","commonCon","lineNodes","startLine","endLine","startIdx","endIdx","onlyTable","startRangeEl","endRangeEl","sameRange","removeDuplicate","myComponent","selectedLines","isEdgePoint","nodeValue","_isEdgeFormat","formatNode","currentFormatEl","oFormatName","checkCharCount","notSelect","removeNode","formatEl","depthFormat","plugin","_setComponentLineBreaker","t_style","b_style","resizeContainer","componentTop","wScroll","_checkDuplicateNode","_dupleCheck","oStyles","duple","afterNode","originAfter","tempAfterNode","insertListCell","tempParentNode","freeFormat","isFormats","isEdge","prevContainer","sameParent","subList","formatRange","removedTag","oldParent","rangeCon","fNode","chList","dupleNodes","cItem","_setIntoFreeFormat","previousText","nextText","newRange","zeroWidth","oNodeChildren","lastONode","isStartEdge","isEndEdge","startPrevEl","endNextEl","beforeNode","startIndex","endIndex","startNode","endNode","_nodeRemoveListItem","substringData","endUl","startLi","rc","rangeLines","linesLoop","nested","fEl","lEl","standTag","beforeTag","parentDepth","listParent","lineArr","removeItems","nextLine","nextList","removeArray","splitRange","newRangeElement","firstNode","lastNode","rangeEl","insertedNew","moveComplete","appendNode","insNode","originNode","insChildren","originNext","detachRange","lineIndex","insNext","innerChildren","rangeParent","rangeRight","childEdge","listFirst","listLast","lastIndex","styleArray","removeNodeArray","strictRemove","isRemoveNode","isRemoveFormat","k","newNodeName","sNode","checkCnt","checkAttrs","ckeckClasses","classReg","styleCheck","classCheck","start","end","styleRegExp","classRegExp","removeNodeRegExp","wBoolean","Boolean","_removeCheck","checkNode","vNode","tagRemove","originStyle","originClasses","oneLine","endLength","isRemoveAnchor","isSizeNode","_getMaintainedNode","_util_getMaintainedNode","_util_isMaintainedNode","_resetCommonListCell","_nodeChange_oneLine","_setCommonListStyle","appliedCommonList","_nodeChange_endLine","_nodeChange_middleLine","_nodeChange_startLine","elStyles","ek","elKeys","removeProperty","sel","appliedEl","childStyle","elStyle","fontWeight","fontStyle","cKeys","_stripRemoveNode","_isRemove","newInnerNode","parentCon","sameTag","z","nNodeArray","pNode","isSameNode","pCurrent","startPass","endPass","checkCss","coverNode","prevNode","prevAnchorNode","childNode","anchors","aChildren","aLen","ancestorAnchorNode","afterAnchorNode","textNode_s","textNode_e","endConReset","newStartOffset","startPath","mergeEndCon","newEndOffset","endPath","newOffsets","_endContainer","passNode","cloneChild","isTopNode","tempNode","newCssText","newClass","noneChange","actionCall","layer","_showToolbarBalloon","_showToolbarInline","commandHandler","toggleCodeView","toggleFullScreen","toggleDisplayBlocks","setDir","getContents","nodesMap","marginDir","margin","_resourcesStateChange","_setCodeDataToEditor","_hideToolbar","_resetCachingButton","_setEditorDataToCodeView","scrollHeight","refresh","_checkPlaceholder","code_html","_getCodeView","parseDocument","headChildren","convertContentsForEditor","editableClasses","codeContents","convertHTMLForCodeView","codeValue","_setCodeView","_var","wasToolbarHidden","_codeViewAutoHeight","onScroll_window","zIndex","_iframeAutoHeight","hide","contentsHTML","printDocument","wDoc","arrts","write","links","linkHTML","documentMode","StyleMedia","windowObject","mimeType","changeDir","marginRight","marginLeft","convertValue","_resetComponents","setIframeContents","ctx","__scriptTagRegExp","onlyContents","cleanHTML","renderHTML","editableEls","getFullContents","_makeLine","requireFormat","__disallowedTagNameRegExp","textArray","_allowHTMLComments","_tagConvertor","_deleteDisallowedTags","__disallowedTagsRegExp","to","sizeNum","from","pxSize","_cleanStyle","face","allowedStyle","_cleanTags","lowLevelCheck","bAttr","wAttr","_editFormat","tempTree","_convertListCell","domTree","_isFormatData","_classNameFilter","textCompList","initMethod","__allowedScriptRegExp","comp","returnHTML","brReg","isFormat","brChar","indentSize","elementRegTest","elementIndent","lineBR","nodeRegTest","tagIndent","XMLSerializer","serializeToString","listener","useCapture","_charCount","inputText","countType","nextCharCount","getCharLength","_setCharCount","over","count","getCharCount","slicePosition","_callCounterBlink","resetResponsiveToolbar","responsiveSize","_responsiveButtonSize","responsiveWidth","_responsiveCurrentSize","setToolbarButtons","_checkComponents","getDoc","setValue","getValue","ignoredList","OUTDENT","INDENT","_init","reload","_initHTML","getPropertyValue","sPrefix","ShadowRoot","shadowRoot","disallowTextTags","allowTextTags","getRegList","str2","defaultAttr","regEndStr","_wAttr","tagsAttr","allAttr","_bAttr","_cachingButtons","managedClass","filePluginRegExp","change","delayTime","pushDelay","stackIndex","stack","setContentsFromStack","pushStack","delay","time","clearTimeout","go","getCurrentIndex","ignoreChangeEvent","_destroy","_history","_onChange_historyStack","_iframeAuto","_initWysiwygArea","onChange","__callResizeFunction","resizeObserverEntry","borderBoxSize","blockSize","contentRect","onResizeEditor","_setDefaultFormat","formatName","fileComponent","_setOptionsInit","_getConstructed","_editorInit","_addEvent","_offStickyToolbar","onResize_window","_resizeObserver","observe","_toolbarObserver","contextEl","_IEisComposing","_lineBreakerBind","_cursorMoveKeyCode","_directionKeyCode","_nonTextKeyCode","_historyIgnoreKeyCode","_onButtonsCheck","_frontZeroWidthReg","_keyCodeShortcut","65","66","83","85","73","89","90","219","221","_shortcutCommand","keyStr","classOnCheck","commandMapNodes","_buttonsEventHandler","onClick_toolbar","onMouseDown_wysiwyg","onMouseDown","tableCell","onClick_wysiwyg","onClick","detail","prevLi","_balloonDelay","_showToolbarBalloonDelay","rangeObj","isDirTop","rects","getClientRects","globalScroll","editorWidth","stickyTop","editorLeft","nodeOffset","bottom","noText","arrowMargin","toolbarHeight","iframeRects","_setToolbarOffset","editorParent","absoluteLeft","overRight","resetTop","space","_getPageBottomSpace","documentElement","arrow_left","showInline","onInput_wysiwyg","onInput","_isUneditableNode","isFront","siblingKey","siblingNode","_isUneditableNode_getSibling","selectNode","_onShortcutKey","onKeyDown_wysiwyg","shiftKey","ctrl","ctrlKey","metaKey","altKey","onKeyDown","selectRange","fileComponentName","_hardDelete","defaultFormat","con","prevLast","ignoreZWS","nextEl","lines","fc","lc","moveCell","endChild","tabText","textRange","freeFormatEl","enterHTML","formatEndEdge","formatStartEdge","innerNode","newListCell","selectionFormat","wSelection","insertHTML","wOffset","focusNext","brPrev","brNext","focusBR","isMultiLine","innerRange","tempEl","compContext","nbsp","onKeyUp_wysiwyg","oFormatTag","isComposing","frontZeroWidthCnt","substring","onKeyUp","onScroll_wysiwyg","onScroll","onFocus_wysiwyg","onFocus","onBlur_wysiwyg","onBlur","onMouseDown_resizingBar","clientY","_resize_editor","closureFunc","resizeInterval","isToolbarHidden","editorHeight","scrollY","editorTop","inlineOffset","_onStickyToolbar","scroll","sCell","eCell","sIsCell","eIsCell","sComp","eComp","onPaste_wysiwyg","clipboardData","_dataTransferAction","_setClipboardComponent","setData","onCopy_wysiwyg","onCopy","onSave_wysiwyg","onSave","onCut_wysiwyg","onCut","onDrop_wysiwyg","dataTransfer","_setDropLocationSelection","rangeOffset","caretRangeFromPoint","clientX","plainText","cleanData","getData","tempDiv","tempRange","_setClipboardData","MSData","onPaste","onDrop","insertImage","onMouseMove_wysiwyg","lineBreakerStyle","ctxEl","pageY","_onMouseDown_lineBreak","_onLineBreak","eventWysiwyg","entries","passive","_setResponsiveToolbar","_removeEvent","unobserve","sizeArray","buttonsObj","onSetToolbarButtons","newToolbar","newContext","setOptions","_options","setDefaultStyle","newStyles","noticeClose","getContext","getText","getImagesInfo","getFilesInfo","notCleaningData","rangeSelection","checkHTML","firstCon","appendContents","readOnly","setOption","disable","enable","topAreaStyle","SUNEDITOR","suneditor","_resizeClientX","_resizeClientY","_resize_w","_resize_h","_resize_direction","_move_path","_isChange","alignIcons","resize_div_container","setController_resize","resizeDot","resizeDisplay","resize_button","setController_button","resize_handles","resizeHandles","resizeButtonGroup","rotationButtons","percentageButtons","alignMenu","alignMenuList","alignButton","autoSizeButton","captionButton","onMouseDown_resize_handle","onClick_resizeButton","resize_container","pluginObj","percentageRotation","xUnit","yUnit","dec","xValue","yValue","contextResizing","isVertical","abs","displayX","displayY","resizeDotShow","rotations","pButtons","naturalWidth","naturalHeight","_closeAlignMenu","openAlignMenu","currentContext","currentModule","percentY","percentage","_setTransForm","slope","deg","alignValue","captionText","transform","transformOrigin","transOrigin","offsetW","offsetH","transW","transH","translate","closureFunc_bind","resizing_element_bind","cancel_controller_resize","resizing_element","resultW","resultH","wh","padding","limit","_checkMediaComponent","uploadUrl","uploadHeader","callBack","errorCallBack","filePlugin","_callBackUpload","tagNames","uploadEventHandler","fileManagerPlugin","infoList","setFileInfo","infoUpdate","currentTags","infoIndex","plguin","state","scrollIntoView"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtlTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjxkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC32dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1oBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrsBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACv8HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrzWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC92DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACz0EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACr5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACngDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;aCpBE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GA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O,SAAU,KAAM,EAAGjW,MAIvEK,EAAQ4e,UAAY,GACpB5e,EAAQ6e,WAAa,IAsB7B,YAlBwB,IAAbjf,IACFF,EAAO+C,mBACRvE,OAAOC,eAAeuB,EAAQ,oBAAqB,CAC/CtB,YAAY,EACZsE,UAAU,EACVC,cAAc,EACdlE,MAAO,KAIfP,OAAOC,eAAeuB,EAAO+C,kBAAmB,cAAe,CAC3DrE,YAAY,EACZsE,UAAU,EACVC,cAAc,EACdlE,MAAOigB,KAIRA,GA1TqD,iBAAnBnhB,EAAOD,QAC5CC,EAAOD,QAAUkC,EAAOoD,SACpBnD,EAAQD,GAAQ,GAChB,SAAUqD,GACN,IAAKA,EAAED,SACH,MAAM,IAAIE,MAAM,8CAEpB,OAAOrD,EAAQoD,IAGvBpD,EAAQD;;ACpBhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"libs.js","sourcesContent":["/*!\n * jQuery JavaScript Library v2.2.4\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-05-20T17:23Z\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Support: Firefox 18+\n// Can't be in strict mode, several libs including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n//\"use strict\";\nvar arr = [];\n\nvar document = window.document;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n\tversion = \"2.2.4\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = jQuery.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type( obj ) === \"function\";\n\t},\n\n\tisArray: Array.isArray,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\tvar realStringObj = obj && obj.toString();\n\t\treturn !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Not plain objects:\n\t\t// - Any object or value whose internal [[Class]] property is not \"[object Object]\"\n\t\t// - DOM nodes\n\t\t// - window\n\t\tif ( jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Not own constructor property must be Object\n\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call( obj, \"constructor\" ) &&\n\t\t\t\t!hasOwn.call( obj.constructor.prototype || {}, \"isPrototypeOf\" ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\n\t\t// Support: Android<4.0, iOS<6 (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tvar script,\n\t\t\tindirect = eval;\n\n\t\tcode = jQuery.trim( code );\n\n\t\tif ( code ) {\n\n\t\t\t// If the code includes a valid, prologue position\n\t\t\t// strict mode pragma, execute code by injecting a\n\t\t\t// script tag into the document.\n\t\t\tif ( code.indexOf( \"use strict\" ) === 1 ) {\n\t\t\t\tscript = document.createElement( \"script\" );\n\t\t\t\tscript.text = code;\n\t\t\t\tdocument.head.appendChild( script ).parentNode.removeChild( script );\n\t\t\t} else {\n\n\t\t\t\t// Otherwise, avoid the DOM node creation, insertion\n\t\t\t\t// and removal by using an indirect global eval\n\n\t\t\t\tindirect( code );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE9-11+\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android<4.1\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\n// JSHint would error on this code due to the Symbol not being defined in ES5.\n// Defining this global in .jshintrc would create a danger of using the global\n// unguarded in another place, it seems safer to just disable JSHint for these\n// three lines.\n/* jshint ignore: start */\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n/* jshint ignore: end */\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: iOS 8.2 (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.2.1\n * http://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2015-10-17\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, nidselect, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rescape, \"\\\\$&\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\tnidselect = ridentifier.test( nid ) ? \"#\" + nid : \"[id='\" + nid + \"']\";\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = nidselect + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( (parent = document.defaultView) && parent.top !== parent ) {\n\t\t// Support: IE 11\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( document.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\treturn m ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = \"\" +\n\t\t\t\t\"\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( (oldCache = uniqueCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: ) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([\\w-]+)\\s*\\/?>(?:<\\/\\1>|)$/ );\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t} );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tlen = this.length,\n\t\t\tret = [],\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\t// Support: Blackberry 4.6\n\t\t\t\t\t// gEBID returns nodes no longer in the document (#6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && ( pos ?\n\t\t\t\t\tpos.index( cur ) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnotwhite = ( /\\S+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( jQuery.isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && jQuery.type( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ) ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis === promise ? newDefer.promise() : this,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add( function() {\n\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 ||\n\t\t\t\t( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred.\n\t\t\t// If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// Add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) )\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n} );\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n} );\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called\n\t\t// after the browser event has already occurred.\n\t\t// Support: IE9-10 only\n\t\t// Older IE sometimes signals \"interactive\" too soon\n\t\tif ( document.readyState === \"complete\" ||\n\t\t\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\twindow.setTimeout( jQuery.ready );\n\n\t\t} else {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed );\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Kick off the DOM ready check even if the user does not\njQuery.ready.promise();\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlen ? fn( elems[ 0 ], key ) : emptyGet;\n};\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\t/* jshint -W018 */\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tregister: function( owner, initial ) {\n\t\tvar value = initial || {};\n\n\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t// use plain assignment\n\t\tif ( owner.nodeType ) {\n\t\t\towner[ this.expando ] = value;\n\n\t\t// Otherwise secure it in a non-enumerable, non-writable property\n\t\t// configurability must be true to allow the property to be\n\t\t// deleted with the delete operator\n\t\t} else {\n\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\tvalue: value,\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: true\n\t\t\t} );\n\t\t}\n\t\treturn owner[ this.expando ];\n\t},\n\tcache: function( owner ) {\n\n\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t// but we should not, see #8335.\n\t\t// Always return an empty object.\n\t\tif ( !acceptData( owner ) ) {\n\t\t\treturn {};\n\t\t}\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ data ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ prop ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\t\t\towner[ this.expando ] && owner[ this.expando ][ key ];\n\t},\n\taccess: function( owner, key, value ) {\n\t\tvar stored;\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\tstored = this.get( owner, key );\n\n\t\t\treturn stored !== undefined ?\n\t\t\t\tstored : this.get( owner, jQuery.camelCase( key ) );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i, name, camel,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === undefined ) {\n\t\t\tthis.register( owner );\n\n\t\t} else {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\n\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = key.concat( key.map( jQuery.camelCase ) );\n\t\t\t} else {\n\t\t\t\tcamel = jQuery.camelCase( key );\n\n\t\t\t\t// Try the string as a key before any manipulation\n\t\t\t\tif ( key in cache ) {\n\t\t\t\t\tname = [ key, camel ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\t\tname = camel;\n\t\t\t\t\tname = name in cache ?\n\t\t\t\t\t\t[ name ] : ( name.match( rnotwhite ) || [] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti = name.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ name[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <= 35-45+\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://code.google.com/p/chromium/issues/detail?id=378607\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data, camelKey;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key as-is\n\t\t\t\tdata = dataUser.get( elem, key ) ||\n\n\t\t\t\t\t// Try to find dashed key if it exists (gh-2779)\n\t\t\t\t\t// This is for 2.2.x only\n\t\t\t\t\tdataUser.get( elem, key.replace( rmultiDash, \"-$&\" ).toLowerCase() );\n\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\tcamelKey = jQuery.camelCase( key );\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key camelized\n\t\t\t\tdata = dataUser.get( elem, camelKey );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, camelKey, undefined );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tcamelKey = jQuery.camelCase( key );\n\t\t\tthis.each( function() {\n\n\t\t\t\t// First, attempt to store a copy or reference of any\n\t\t\t\t// data that might've been store with a camelCased key.\n\t\t\t\tvar data = dataUser.get( this, camelKey );\n\n\t\t\t\t// For HTML5 data-* attribute interop, we have to\n\t\t\t\t// store property names with dashes in a camelCase form.\n\t\t\t\t// This might not apply to all properties...*\n\t\t\t\tdataUser.set( this, camelKey, value );\n\n\t\t\t\t// *... In the case of properties that might _actually_\n\t\t\t\t// have dashes, we need to also store a copy of that\n\t\t\t\t// unchanged property.\n\t\t\t\tif ( key.indexOf( \"-\" ) > -1 && data !== undefined ) {\n\t\t\t\t\tdataUser.set( this, key, value );\n\t\t\t\t}\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHidden = function( elem, el ) {\n\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" ||\n\t\t\t!jQuery.contains( elem.ownerDocument, elem );\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted,\n\t\tscale = 1,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() { return tween.cur(); } :\n\t\t\tfunction() { return jQuery.css( elem, prop, \"\" ); },\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\tdo {\n\n\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\tscale = scale || \".5\";\n\n\t\t\t// Adjust and apply\n\t\t\tinitialInUnit = initialInUnit / scale;\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t// Break the loop if scale is unchanged or perfect, or if we've just had enough.\n\t\t} while (\n\t\t\tscale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations\n\t\t);\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([\\w:-]+)/ );\n\nvar rscriptType = ( /^$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE9\n\toption: [ 1, \"\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting or other required elements.\n\tthead: [ 1, \"\", \"
\" ],\n\tcol: [ 2, \"\", \"
\" ],\n\ttr: [ 2, \"\", \"
\" ],\n\ttd: [ 3, \"\", \"
\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE9-11+\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret = typeof context.getElementsByTagName !== \"undefined\" ?\n\t\t\tcontext.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== \"undefined\" ?\n\t\t\t\tcontext.querySelectorAll( tag || \"*\" ) :\n\t\t\t[];\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], ret ) :\n\t\tret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android<4.1, PhantomJS<2\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android<4.1, PhantomJS<2\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0-4.3, Safari<=5.1\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Safari<=5.1, Android<4.2\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<=11+\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE9\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Support (at least): Chrome, IE9\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG instance trees (#13180)\n\t\t//\n\t\t// Support: Firefox<=42+\n\t\t// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)\n\t\tif ( delegateCount && cur.nodeType &&\n\t\t\t( event.type !== \"click\" || isNaN( event.button ) || event.button < 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== \"click\" ) ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matches } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: ( \"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase \" +\n\t\t\"metaKey relatedTarget shiftKey target timeStamp view which\" ).split( \" \" ),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split( \" \" ),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: ( \"button buttons clientX clientY offsetX offsetY pageX pageY \" +\n\t\t\t\"screenX screenY toElement\" ).split( \" \" ),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX +\n\t\t\t\t\t( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -\n\t\t\t\t\t( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY +\n\t\t\t\t\t( doc && doc.scrollTop || body && body.scrollTop || 0 ) -\n\t\t\t\t\t( doc && doc.clientTop || body && body.clientTop || 0 );\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: Cordova 2.5 (WebKit) (#13255)\n\t\t// All events should have a target; Cordova deviceready doesn't\n\t\tif ( !event.target ) {\n\t\t\tevent.target = document;\n\t\t}\n\n\t\t// Support: Safari 6.0+, Chrome<28\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android<4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://code.google.com/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi,\n\n\t// Support: IE 10-11, Edge 10240+\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /\\s*$/g;\n\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName( \"tbody\" )[ 0 ] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement( \"tbody\" ) ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tisFunction = jQuery.isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( isFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( isFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android<4.1, PhantomJS<2\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjQuery.globalEval( node.textContent.replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <= 35-45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <= 35-45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\n\t// Keep domManip exposed until 3.0 (gh-2225)\n\tdomManip: domManip,\n\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: QtWebKit\n\t\t\t// .get() because push.apply(_, arraylike) throws\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\n\n\nvar iframe,\n\telemdisplay = {\n\n\t\t// Support: Firefox\n\t\t// We have to pre-define these values for FF (#10227)\n\t\tHTML: \"block\",\n\t\tBODY: \"block\"\n\t};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n\t\tdisplay = jQuery.css( elem[ 0 ], \"display\" );\n\n\t// We don't have any data stored on the element,\n\t// so use \"detach\" method as fast way to get rid of the element\n\telem.detach();\n\n\treturn display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe || jQuery( \"';\n } else {\n context._linkValue = this.textContent = !value ? '' : (protocol && value.indexOf('://') === -1 && value.indexOf('#') !== 0) ? protocol + value : value.indexOf('://') === -1 ? '/' + value : value;\n }\n },\n\n _setTagAttrs: function (element) {\n element.setAttribute('controls', true);\n\n const attrs = this.options.videoTagAttrs;\n if (!attrs) return;\n\n for (let key in attrs) {\n if (!this.util.hasOwn(attrs, key)) continue;\n element.setAttribute(key, attrs[key]);\n }\n },\n\n createVideoTag: function () {\n const videoTag = this.util.createElement('VIDEO');\n this.plugins.video._setTagAttrs.call(this, videoTag);\n return videoTag;\n },\n\n _setIframeAttrs: function (element) {\n element.frameBorder = '0';\n element.allowFullscreen = true;\n\n const attrs = this.options.videoIframeAttrs;\n if (!attrs) return;\n\n for (let key in attrs) {\n if (!this.util.hasOwn(attrs, key)) continue;\n element.setAttribute(key, attrs[key]);\n }\n },\n\n createIframeTag: function () {\n const iframeTag = this.util.createElement('IFRAME');\n this.plugins.video._setIframeAttrs.call(this, iframeTag);\n return iframeTag;\n },\n\n /**\n * @Override @Required fileManager\n */\n fileTags: ['iframe', 'video'],\n\n /**\n * @Override core, resizing, fileManager\n * @description It is called from core.selectComponent.\n * @param {Element} element Target element\n */\n select: function (element) {\n this.plugins.video.onModifyMode.call(this, element, this.plugins.resizing.call_controller_resize.call(this, element, 'video'));\n },\n\n /**\n * @Override fileManager, resizing\n */\n destroy: function (element) {\n const frame = element || this.context.video._element;\n const container = this.context.video._container;\n const dataIndex = frame.getAttribute('data-index') * 1;\n let focusEl = (container.previousElementSibling || container.nextElementSibling);\n\n const emptyDiv = container.parentNode;\n this.util.removeItem(container);\n this.plugins.video.init.call(this);\n this.controllersOff();\n\n if (emptyDiv !== this.context.element.wysiwyg) this.util.removeItemAllParents(emptyDiv, function (current) { return current.childNodes.length === 0; }, null);\n\n // focus\n this.focusEdge(focusEl);\n\n // event\n this.plugins.fileManager.deleteInfo.call(this, 'video', dataIndex, this.functions.onVideoUpload);\n\n // history stack\n this.history.push(false);\n },\n\n /**\n * @Required @Override dialog\n */\n on: function (update) {\n const contextVideo = this.context.video;\n\n if (!update) {\n contextVideo.inputX.value = contextVideo._origin_w = this.options.videoWidth === contextVideo._defaultSizeX ? '' : this.options.videoWidth;\n contextVideo.inputY.value = contextVideo._origin_h = this.options.videoHeight === contextVideo._defaultSizeY ? '' : this.options.videoHeight;\n contextVideo.proportion.disabled = true;\n if (contextVideo.videoInputFile && this.options.videoMultipleFile) contextVideo.videoInputFile.setAttribute('multiple', 'multiple');\n } else {\n if (contextVideo.videoInputFile && this.options.videoMultipleFile) contextVideo.videoInputFile.removeAttribute('multiple');\n }\n\n if (contextVideo._resizing) {\n this.plugins.video.setVideoRatioSelect.call(this, contextVideo._origin_h || contextVideo._defaultRatio);\n }\n },\n\n /**\n * @Required @Override dialog\n */\n open: function () {\n this.plugins.dialog.open.call(this, 'video', 'video' === this.currentControllerName);\n },\n \n setVideoRatio: function (e) {\n const contextVideo = this.context.video;\n const value = e.target.options[e.target.selectedIndex].value;\n\n contextVideo._defaultSizeY = contextVideo._videoRatio = !value ? contextVideo._defaultSizeY : (value * 100) + '%';\n contextVideo.inputY.placeholder = !value ? '' : (value * 100) + '%';\n contextVideo.inputY.value = '';\n },\n\n /**\n * @Override resizing\n * @param {String} xy 'x': width, 'y': height\n * @param {KeyboardEvent} e Event object\n */\n setInputSize: function (xy, e) {\n if (e && e.keyCode === 32) {\n e.preventDefault();\n return;\n }\n\n const contextVideo = this.context.video;\n this.plugins.resizing._module_setInputSize.call(this, contextVideo, xy);\n\n if (xy === 'y') {\n this.plugins.video.setVideoRatioSelect.call(this, e.target.value || contextVideo._defaultRatio);\n }\n },\n\n /**\n * @Override resizing\n */\n setRatio: function () {\n this.plugins.resizing._module_setRatio.call(this, this.context.video);\n },\n\n submit: function (e) {\n const contextVideo = this.context.video;\n const videoPlugin = this.plugins.video;\n\n e.preventDefault();\n e.stopPropagation();\n\n contextVideo._align = contextVideo.modal.querySelector('input[name=\"suneditor_video_radio\"]:checked').value;\n\n try {\n if (contextVideo.videoInputFile && contextVideo.videoInputFile.files.length > 0) {\n this.showLoading();\n videoPlugin.submitAction.call(this, this.context.video.videoInputFile.files);\n } else if (contextVideo.videoUrlFile && contextVideo._linkValue.length > 0) {\n this.showLoading();\n videoPlugin.setup_url.call(this, contextVideo._linkValue);\n }\n } catch (error) {\n this.closeLoading();\n throw Error('[SUNEDITOR.video.submit.fail] cause : \"' + error.message + '\"');\n } finally {\n this.plugins.dialog.close.call(this);\n }\n\n return false;\n },\n\n submitAction: function (fileList) {\n if (fileList.length === 0) return;\n\n let fileSize = 0;\n let files = [];\n for (let i = 0, len = fileList.length; i < len; i++) {\n if (/video/i.test(fileList[i].type)) {\n files.push(fileList[i]);\n fileSize += fileList[i].size;\n }\n }\n\n const limitSize = this.options.videoUploadSizeLimit;\n if (limitSize > 0) {\n let infoSize = 0;\n const videosInfo = this.context.video._infoList;\n for (let i = 0, len = videosInfo.length; i < len; i++) {\n infoSize += videosInfo[i].size * 1;\n }\n\n if ((fileSize + infoSize) > limitSize) {\n this.closeLoading();\n const err = '[SUNEDITOR.videoUpload.fail] Size of uploadable total videos: ' + (limitSize/1000) + 'KB';\n if (typeof this.functions.onVideoUploadError !== 'function' || this.functions.onVideoUploadError(err, { 'limitSize': limitSize, 'currentSize': infoSize, 'uploadSize': fileSize }, this)) {\n this.functions.noticeOpen(err);\n }\n return;\n }\n }\n\n const contextVideo = this.context.video;\n contextVideo._uploadFileLength = files.length;\n\n const info = {\n inputWidth: contextVideo.inputX.value,\n inputHeight: contextVideo.inputY.value,\n align: contextVideo._align,\n isUpdate: this.context.dialog.updateModal,\n element: contextVideo._element\n };\n\n if (typeof this.functions.onVideoUploadBefore === 'function') {\n const result = this.functions.onVideoUploadBefore(files, info, this, function (data) {\n if (data && this._w.Array.isArray(data.result)) {\n this.plugins.video.register.call(this, info, data);\n } else {\n this.plugins.video.upload.call(this, info, data);\n }\n }.bind(this));\n\n if (typeof result === 'undefined') return;\n if (!result) {\n this.closeLoading();\n return;\n }\n if (typeof result === 'object' && result.length > 0) files = result;\n }\n\n this.plugins.video.upload.call(this, info, files);\n },\n\n error: function (message, response) {\n this.closeLoading();\n if (typeof this.functions.onVideoUploadError !== 'function' || this.functions.onVideoUploadError(message, response, this)) {\n this.functions.noticeOpen(message);\n throw Error('[SUNEDITOR.plugin.video.error] response: ' + message);\n }\n },\n\n upload: function (info, files) {\n if (!files) {\n this.closeLoading();\n return;\n }\n if (typeof files === 'string') {\n this.plugins.video.error.call(this, files, null);\n return;\n }\n\n const videoUploadUrl = this.options.videoUploadUrl;\n const filesLen = this.context.dialog.updateModal ? 1 : files.length;\n\n // server upload\n if (typeof videoUploadUrl === 'string' && videoUploadUrl.length > 0) {\n const formData = new FormData();\n for (let i = 0; i < filesLen; i++) {\n formData.append('file-' + i, files[i]);\n }\n this.plugins.fileManager.upload.call(this, videoUploadUrl, this.options.videoUploadHeader, formData, this.plugins.video.callBack_videoUpload.bind(this, info), this.functions.onVideoUploadError);\n } else {\n throw Error('[SUNEDITOR.videoUpload.fail] cause : There is no \"videoUploadUrl\" option.');\n }\n },\n\n callBack_videoUpload: function (info, xmlHttp) {\n if (typeof this.functions.videoUploadHandler === 'function') {\n this.functions.videoUploadHandler(xmlHttp, info, this);\n } else {\n const response = JSON.parse(xmlHttp.responseText);\n if (response.errorMessage) {\n this.plugins.video.error.call(this, response.errorMessage, response);\n } else {\n this.plugins.video.register.call(this, info, response);\n }\n }\n },\n\n register: function (info, response) {\n const fileList = response.result;\n const videoTag = this.plugins.video.createVideoTag.call(this);\n\n for (let i = 0, len = fileList.length, file; i < len; i++) {\n file = { name: fileList[i].name, size: fileList[i].size };\n this.plugins.video.create_video.call(this, (info.isUpdate ? info.element : videoTag.cloneNode(false)), fileList[i].url, info.inputWidth, info.inputHeight, info.align, file, info.isUpdate);\n }\n\n this.closeLoading();\n },\n\n setup_url: function (url) {\n try {\n const contextVideo = this.context.video;\n if (!url) url = contextVideo._linkValue;\n if (!url) return false;\n\n /** iframe source */\n if (/^$/.test(url)) {\n const oIframe = (new this._w.DOMParser()).parseFromString(url, 'text/html').querySelector('iframe');\n url = oIframe.src;\n if (url.length === 0) return false;\n }\n \n /** youtube */\n if (/youtu\\.?be/.test(url)) {\n if (!/^http/.test(url)) url = 'https://' + url;\n url = url.replace('watch?v=', '');\n if (!/^\\/\\/.+\\/embed\\//.test(url)) {\n url = url.replace(url.match(/\\/\\/.+\\//)[0], '//www.youtube.com/embed/').replace('&', '?&');\n }\n\n if (contextVideo._youtubeQuery.length > 0) {\n if (/\\?/.test(url)) {\n const splitUrl = url.split('?');\n url = splitUrl[0] + '?' + contextVideo._youtubeQuery + '&' + splitUrl[1];\n } else {\n url += '?' + contextVideo._youtubeQuery;\n }\n }\n } else if (/vimeo\\.com/.test(url)) {\n if (url.endsWith('/')) {\n url = url.slice(0, -1);\n }\n url = 'https://player.vimeo.com/video/' + url.slice(url.lastIndexOf('/') + 1);\n }\n\n this.plugins.video.create_video.call(this, this.plugins.video[(!/embed|iframe|player|\\/e\\/|\\.php|\\.html?/.test(url) && !/vimeo\\.com/.test(url) ? \"createVideoTag\" : \"createIframeTag\")].call(this), url, contextVideo.inputX.value, contextVideo.inputY.value, contextVideo._align, null, this.context.dialog.updateModal);\n } catch (error) {\n throw Error('[SUNEDITOR.video.upload.fail] cause : \"' + error.message + '\"');\n } finally {\n this.closeLoading();\n }\n },\n\n create_video: function (oFrame, src, width, height, align, file, isUpdate) {\n this.context.resizing._resize_plugin = 'video';\n const contextVideo = this.context.video;\n \n let cover = null;\n let container = null;\n let init = false;\n\n /** update */\n if (isUpdate) {\n oFrame = contextVideo._element;\n if (oFrame.src !== src) {\n init = true;\n const isYoutube = /youtu\\.?be/.test(src);\n const isVimeo = /vimeo\\.com/.test(src);\n if ((isYoutube || isVimeo) && !/^iframe$/i.test(oFrame.nodeName)) {\n const newTag = this.plugins.video.createIframeTag.call(this);\n newTag.src = src;\n oFrame.parentNode.replaceChild(newTag, oFrame);\n contextVideo._element = oFrame = newTag;\n } else if (!isYoutube && !isVimeo && !/^videoo$/i.test(oFrame.nodeName)) {\n const newTag = this.plugins.video.createVideoTag.call(this);\n newTag.src = src;\n oFrame.parentNode.replaceChild(newTag, oFrame);\n contextVideo._element = oFrame = newTag;\n } else {\n oFrame.src = src;\n }\n }\n container = contextVideo._container;\n cover = this.util.getParentElement(oFrame, 'FIGURE');\n }\n /** create */\n else {\n init = true;\n oFrame.src = src;\n contextVideo._element = oFrame;\n cover = this.plugins.component.set_cover.call(this, oFrame);\n container = this.plugins.component.set_container.call(this, cover, 'se-video-container');\n }\n\n /** rendering */\n contextVideo._cover = cover;\n contextVideo._container = container;\n\n const inputUpdate = (this.plugins.resizing._module_getSizeX.call(this, contextVideo) !== (width || contextVideo._defaultSizeX)) || (this.plugins.resizing._module_getSizeY.call(this, contextVideo) !== (height || contextVideo._videoRatio));\n const changeSize = !isUpdate || inputUpdate;\n\n if (contextVideo._resizing) {\n this.context.video._proportionChecked = contextVideo.proportion.checked;\n oFrame.setAttribute('data-proportion', contextVideo._proportionChecked);\n }\n\n // size\n let isPercent = false;\n if (changeSize) {\n isPercent = this.plugins.video.applySize.call(this);\n }\n\n // align\n if (!(isPercent && align === 'center')) {\n this.plugins.video.setAlign.call(this, null, oFrame, cover, container);\n }\n\n let changed = true;\n if (!isUpdate) {\n changed = this.insertComponent(container, false, true, !this.options.mediaAutoSelect);\n if (!this.options.mediaAutoSelect) {\n const line = this.appendFormatTag(container, null);\n if (line) this.setRange(line, 0, line, 0);\n }\n } else if (contextVideo._resizing && this.context.resizing._rotateVertical && changeSize) {\n this.plugins.resizing.setTransformSize.call(this, oFrame, null, null);\n }\n\n if (changed) {\n if (init) {\n this.plugins.fileManager.setInfo.call(this, 'video', oFrame, this.functions.onVideoUpload, file, true);\n }\n if (isUpdate) {\n this.selectComponent(oFrame, 'video');\n // history stack\n this.history.push(false);\n }\n }\n\n this.context.resizing._resize_plugin = '';\n },\n\n _update_videoCover: function (oFrame) {\n if (!oFrame) return;\n\n const contextVideo = this.context.video;\n \n if (/^video$/i.test(oFrame.nodeName)) this.plugins.video._setTagAttrs.call(this, oFrame);\n else this.plugins.video._setIframeAttrs.call(this, oFrame);\n \n let existElement = (this.util.isRangeFormatElement(oFrame.parentNode) || this.util.isWysiwygDiv(oFrame.parentNode)) ? \n oFrame : this.util.getFormatElement(oFrame) || oFrame;\n\n const prevFrame = oFrame;\n contextVideo._element = oFrame = oFrame.cloneNode(true);\n const cover = contextVideo._cover = this.plugins.component.set_cover.call(this, oFrame);\n const container = contextVideo._container = this.plugins.component.set_container.call(this, cover, 'se-video-container');\n\n try {\n const figcaption = existElement.querySelector('figcaption');\n let caption = null;\n if (!!figcaption) {\n caption = this.util.createElement('DIV');\n caption.innerHTML = figcaption.innerHTML;\n this.util.removeItem(figcaption);\n }\n\n // size\n const size = (oFrame.getAttribute('data-size') || oFrame.getAttribute('data-origin') || '').split(',');\n this.plugins.video.applySize.call(this, (size[0] || prevFrame.style.width || prevFrame.width || ''), (size[1] || prevFrame.style.height || prevFrame.height || ''));\n\n // align\n const format = this.util.getFormatElement(prevFrame);\n if (format) contextVideo._align = format.style.textAlign || format.style.float;\n this.plugins.video.setAlign.call(this, null, oFrame, cover, container);\n\n if (this.util.getParentElement(prevFrame, this.util.isNotCheckingNode)) {\n prevFrame.parentNode.replaceChild(container, prevFrame);\n } else if (this.util.isListCell(existElement)) {\n const refer = this.util.getParentElement(prevFrame, function (current) { return current.parentNode === existElement; });\n existElement.insertBefore(container, refer);\n this.util.removeItem(prevFrame);\n this.util.removeEmptyNode(refer, null, true);\n } else if (this.util.isFormatElement(existElement)) {\n const refer = this.util.getParentElement(prevFrame, function (current) { return current.parentNode === existElement; });\n existElement = this.util.splitElement(existElement, refer);\n existElement.parentNode.insertBefore(container, existElement);\n this.util.removeItem(prevFrame);\n this.util.removeEmptyNode(existElement, null, true);\n if (existElement.children.length === 0) existElement.innerHTML = this.util.htmlRemoveWhiteSpace(existElement.innerHTML);\n } else {\n existElement.parentNode.replaceChild(container, existElement);\n }\n\n if (!!caption) existElement.parentNode.insertBefore(caption, container.nextElementSibling);\n } catch (error) {\n console.warn('[SUNEDITOR.video.error] Maybe the video tag is nested.', error);\n }\n\n this.plugins.fileManager.setInfo.call(this, 'video', oFrame, this.functions.onVideoUpload, null, true);\n this.plugins.video.init.call(this);\n },\n\n /**\n * @Required @Override fileManager, resizing\n */\n onModifyMode: function (element, size) {\n const contextVideo = this.context.video;\n contextVideo._element = element;\n contextVideo._cover = this.util.getParentElement(element, 'FIGURE');\n contextVideo._container = this.util.getParentElement(element, this.util.isMediaComponent);\n contextVideo._align = element.style.float || element.getAttribute('data-align') || 'none';\n element.style.float = '';\n\n if (size) {\n contextVideo._element_w = size.w;\n contextVideo._element_h = size.h;\n contextVideo._element_t = size.t;\n contextVideo._element_l = size.l;\n }\n\n let origin = contextVideo._element.getAttribute('data-size') || contextVideo._element.getAttribute('data-origin');\n let w, h;\n if (origin) {\n origin = origin.split(',');\n w = origin[0];\n h = origin[1];\n } else if (size) {\n w = size.w;\n h = size.h;\n }\n\n contextVideo._origin_w = w || element.style.width || element.width || '';\n contextVideo._origin_h = h || element.style.height || element.height || '';\n },\n\n /**\n * @Required @Override fileManager, resizing\n */\n openModify: function (notOpen) {\n const contextVideo = this.context.video;\n\n if (contextVideo.videoUrlFile) contextVideo._linkValue = contextVideo.preview.textContent = contextVideo.videoUrlFile.value = (contextVideo._element.src || (contextVideo._element.querySelector('source') || '').src || '');\n (contextVideo.modal.querySelector('input[name=\"suneditor_video_radio\"][value=\"' + contextVideo._align + '\"]') || contextVideo.modal.querySelector('input[name=\"suneditor_video_radio\"][value=\"none\"]')).checked = true;\n\n if (contextVideo._resizing) {\n this.plugins.resizing._module_setModifyInputSize.call(this, contextVideo, this.plugins.video);\n \n const y = contextVideo._videoRatio = this.plugins.resizing._module_getSizeY.call(this, contextVideo);\n const ratioSelected = this.plugins.video.setVideoRatioSelect.call(this, y);\n if (!ratioSelected) contextVideo.inputY.value = contextVideo._onlyPercentage ? this.util.getNumber(y, 2) : y;\n }\n\n if (!notOpen) this.plugins.dialog.open.call(this, 'video', true);\n },\n \n setVideoRatioSelect: function (value) {\n let ratioSelected = false;\n const contextVideo = this.context.video;\n const ratioOptions = contextVideo.videoRatioOption.options;\n\n if (/%$/.test(value) || contextVideo._onlyPercentage) value = (this.util.getNumber(value, 2) / 100) + '';\n else if (!this.util.isNumber(value) || (value * 1) >= 1) value = '';\n\n contextVideo.inputY.placeholder = '';\n for (let i = 0, len = ratioOptions.length; i < len; i++) {\n if (ratioOptions[i].value === value) {\n ratioSelected = ratioOptions[i].selected = true;\n contextVideo.inputY.placeholder = !value ? '' : (value * 100) + '%';\n }\n else ratioOptions[i].selected = false;\n }\n\n return ratioSelected;\n },\n\n /**\n * @Override fileManager\n */\n checkFileInfo: function () {\n this.plugins.fileManager.checkInfo.call(this, 'video', ['iframe', 'video'], this.functions.onVideoUpload, this.plugins.video._update_videoCover.bind(this), true);\n },\n\n /**\n * @Override fileManager\n */\n resetFileInfo: function () {\n this.plugins.fileManager.resetInfo.call(this, 'video', this.functions.onVideoUpload);\n },\n\n /**\n * @Override fileManager\n */\n applySize: function (w, h) {\n const contextVideo = this.context.video;\n\n if (!w) w = contextVideo.inputX.value || this.options.videoWidth;\n if (!h) h = contextVideo.inputY.value || this.options.videoHeight;\n \n if (contextVideo._onlyPercentage || /%$/.test(w) || !w) {\n this.plugins.video.setPercentSize.call(this, (w || '100%'), (h || (/%$/.test(contextVideo._videoRatio) ? contextVideo._videoRatio : contextVideo._defaultRatio)));\n return true;\n } else if ((!w || w === 'auto') && (!h || h === 'auto')) {\n this.plugins.video.setAutoSize.call(this);\n } else {\n this.plugins.video.setSize.call(this, w, (h || contextVideo._videoRatio || contextVideo._defaultRatio), false);\n }\n\n return false;\n },\n\n /**\n * @Override resizing\n */\n sizeRevert: function () {\n this.plugins.resizing._module_sizeRevert.call(this, this.context.video);\n },\n\n /**\n * @Override resizing\n */\n setSize: function (w, h, notResetPercentage, direction) {\n const contextVideo = this.context.video;\n const onlyW = /^(rw|lw)$/.test(direction);\n const onlyH = /^(th|bh)$/.test(direction);\n\n if (!onlyH) w = this.util.getNumber(w, 0);\n if (!onlyW) h = this.util.isNumber(h) ? h + contextVideo.sizeUnit : !h ? '' : h;\n w = w ? w + contextVideo.sizeUnit : '';\n\n if (!onlyH) contextVideo._element.style.width = w;\n if (!onlyW) contextVideo._cover.style.paddingBottom = contextVideo._cover.style.height = h;\n\n if (!onlyH && !/%$/.test(w)) {\n contextVideo._cover.style.width = w;\n contextVideo._container.style.width = '';\n }\n\n if (!onlyW && !/%$/.test(h)) {\n contextVideo._element.style.height = h;\n } else {\n contextVideo._element.style.height = '';\n }\n\n if (!notResetPercentage) contextVideo._element.removeAttribute('data-percentage');\n\n // save current size\n this.plugins.resizing._module_saveCurrentSize.call(this, contextVideo);\n },\n\n /**\n * @Override resizing\n */\n setAutoSize: function () {\n this.plugins.video.setPercentSize.call(this, 100, this.context.video._defaultRatio);\n },\n\n /**\n * @Override resizing\n */\n setOriginSize: function (dataSize) {\n const contextVideo = this.context.video;\n contextVideo._element.removeAttribute('data-percentage');\n\n this.plugins.resizing.resetTransform.call(this, contextVideo._element);\n this.plugins.video.cancelPercentAttr.call(this);\n\n const originSize = ((dataSize ? contextVideo._element.getAttribute('data-size') : '') || contextVideo._element.getAttribute('data-origin') || '').split(',');\n \n if (originSize) {\n const w = originSize[0];\n const h = originSize[1];\n\n if (contextVideo._onlyPercentage || (/%$/.test(w) && (/%$/.test(h) || !/\\d/.test(h)))) {\n this.plugins.video.setPercentSize.call(this, w, h);\n } else {\n this.plugins.video.setSize.call(this, w, h);\n }\n\n // save current size\n this.plugins.resizing._module_saveCurrentSize.call(this, contextVideo);\n }\n },\n\n /**\n * @Override resizing\n */\n setPercentSize: function (w, h) {\n const contextVideo = this.context.video;\n h = !!h && !/%$/.test(h) && !this.util.getNumber(h, 0) ? this.util.isNumber(h) ? h + '%' : h : this.util.isNumber(h) ? h + contextVideo.sizeUnit : (h || contextVideo._defaultRatio);\n\n contextVideo._container.style.width = this.util.isNumber(w) ? w + '%' : w;\n contextVideo._container.style.height = '';\n contextVideo._cover.style.width = '100%';\n contextVideo._cover.style.height = h;\n contextVideo._cover.style.paddingBottom = h;\n contextVideo._element.style.width = '100%';\n contextVideo._element.style.height = '100%';\n contextVideo._element.style.maxWidth = '';\n\n if (contextVideo._align === 'center') this.plugins.video.setAlign.call(this, null, null, null, null);\n contextVideo._element.setAttribute('data-percentage', w + ',' + h);\n\n // save current size\n this.plugins.resizing._module_saveCurrentSize.call(this, contextVideo);\n },\n\n /**\n * @Override resizing\n */\n cancelPercentAttr: function () {\n const contextVideo = this.context.video;\n \n contextVideo._cover.style.width = '';\n contextVideo._cover.style.height = '';\n contextVideo._cover.style.paddingBottom = '';\n contextVideo._container.style.width = '';\n contextVideo._container.style.height = '';\n\n this.util.removeClass(contextVideo._container, this.context.video._floatClassRegExp);\n this.util.addClass(contextVideo._container, '__se__float-' + contextVideo._align);\n\n if (contextVideo._align === 'center') this.plugins.video.setAlign.call(this, null, null, null, null);\n },\n\n /**\n * @Override resizing\n */\n setAlign: function (align, element, cover, container) {\n const contextVideo = this.context.video;\n \n if (!align) align = contextVideo._align;\n if (!element) element = contextVideo._element;\n if (!cover) cover = contextVideo._cover;\n if (!container) container = contextVideo._container;\n\n if (/%$/.test(element.style.width) && align === 'center') {\n container.style.minWidth = '100%';\n cover.style.width = container.style.width;\n cover.style.height = cover.style.height;\n cover.style.paddingBottom = !/%$/.test(cover.style.height) ? cover.style.height : this.util.getNumber((this.util.getNumber(cover.style.height, 2) / 100) * this.util.getNumber(cover.style.width, 2), 2) + '%';\n } else {\n container.style.minWidth = '';\n cover.style.width = this.context.resizing._rotateVertical ? (element.style.height || element.offsetHeight) : (element.style.width || '100%');\n cover.style.paddingBottom = cover.style.height;\n }\n\n if (!this.util.hasClass(container, '__se__float-' + align)) {\n this.util.removeClass(container, contextVideo._floatClassRegExp);\n this.util.addClass(container, '__se__float-' + align);\n }\n \n element.setAttribute('data-align', align);\n },\n\n /**\n * @Override dialog\n */\n init: function () {\n const contextVideo = this.context.video;\n if (contextVideo.videoInputFile) contextVideo.videoInputFile.value = '';\n if (contextVideo.videoUrlFile) contextVideo._linkValue = contextVideo.preview.textContent = contextVideo.videoUrlFile.value = '';\n if (contextVideo.videoInputFile && contextVideo.videoUrlFile) {\n contextVideo.videoUrlFile.removeAttribute('disabled');\n contextVideo.preview.style.textDecoration = '';\n }\n\n contextVideo._origin_w = this.options.videoWidth;\n contextVideo._origin_h = this.options.videoHeight;\n contextVideo.modal.querySelector('input[name=\"suneditor_video_radio\"][value=\"none\"]').checked = true;\n \n if (contextVideo._resizing) {\n contextVideo.inputX.value = this.options.videoWidth === contextVideo._defaultSizeX ? '' : this.options.videoWidth;\n contextVideo.inputY.value = this.options.videoHeight === contextVideo._defaultSizeY ? '' : this.options.videoHeight;\n contextVideo.proportion.checked = true;\n contextVideo.proportion.disabled = true;\n this.plugins.video.setVideoRatioSelect.call(this, contextVideo._defaultRatio);\n }\n }\n};\n","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nimport dialog from '../modules/dialog';\nimport component from '../modules/component';\nimport fileManager from '../modules/fileManager';\n\nexport default {\n name: 'audio',\n display: 'dialog',\n add: function (core) {\n core.addModule([dialog, component, fileManager]);\n\n const context = core.context;\n const contextAudio = context.audio = {\n _infoList: [], // @Override fileManager\n _infoIndex: 0, // @Override fileManager\n _uploadFileLength: 0, // @Override fileManager\n focusElement: null, // @Override dialog // This element has focus when the dialog is opened.\n targetSelect: null,\n _origin_w: core.options.audioWidth,\n _origin_h: core.options.audioHeight,\n _linkValue: '',\n // @require @Override component\n _element: null,\n _cover: null,\n _container: null,\n };\n\n /** dialog */\n let audio_dialog = this.setDialog(core);\n contextAudio.modal = audio_dialog;\n contextAudio.audioInputFile = audio_dialog.querySelector('._se_audio_files');\n contextAudio.audioUrlFile = audio_dialog.querySelector('.se-input-url');\n contextAudio.focusElement = contextAudio.audioInputFile || contextAudio.audioUrlFile;\n contextAudio.preview = audio_dialog.querySelector('.se-link-preview');\n\n /** controller */\n let audio_controller = this.setController(core);\n contextAudio.controller = audio_controller;\n\n /** add event listeners */\n audio_dialog.querySelector('form').addEventListener('submit', this.submit.bind(core));\n if (contextAudio.audioInputFile) audio_dialog.querySelector('.se-dialog-files-edge-button').addEventListener('click', this._removeSelectedFiles.bind(contextAudio.audioInputFile, contextAudio.audioUrlFile, contextAudio.preview));\n if (contextAudio.audioInputFile && contextAudio.audioUrlFile) contextAudio.audioInputFile.addEventListener('change', this._fileInputChange.bind(contextAudio));\n audio_controller.addEventListener('click', this.onClick_controller.bind(core));\n if (contextAudio.audioUrlFile) contextAudio.audioUrlFile.addEventListener('input', this._onLinkPreview.bind(contextAudio.preview, contextAudio, core.options.linkProtocol));\n\n /** append html */\n context.dialog.modal.appendChild(audio_dialog);\n\n /** append controller */\n context.element.relative.appendChild(audio_controller);\n\n /** empty memory */\n audio_dialog = null, audio_controller = null;\n },\n\n /** HTML - dialog */\n setDialog: function (core) {\n const option = core.options;\n const lang = core.lang;\n const dialog = core.util.createElement('DIV');\n\n dialog.className = 'se-dialog-content';\n dialog.style.display = 'none';\n let html = '' +\n '
' +\n '
' +\n '' +\n '' + lang.dialogBox.audioBox.title + '' +\n '
' +\n '
';\n\n if (option.audioFileInput) {\n html += '' +\n '
' +\n '' +\n '
' +\n '' +\n '' +\n '
' +\n '
';\n }\n \n if (option.audioUrlInput) {\n html += '' +\n '
' +\n '' +\n '' +\n '' +\n '
';\n }\n \n html += '' +\n '
' +\n '
' +\n '' +\n '
' +\n '
';\n\n dialog.innerHTML = html;\n\n return dialog;\n },\n\n /** HTML - controller */\n setController: function (core) {\n const lang = core.lang;\n const icons = core.icons;\n const link_btn = core.util.createElement('DIV');\n\n link_btn.className = 'se-controller se-controller-link';\n link_btn.innerHTML = '' +\n '
' +\n '';\n\n return link_btn;\n },\n\n // Disable url input when uploading files\n _fileInputChange: function () {\n if (!this.audioInputFile.value) {\n this.audioUrlFile.removeAttribute('disabled');\n this.preview.style.textDecoration = '';\n } else {\n this.audioUrlFile.setAttribute('disabled', true);\n this.preview.style.textDecoration = 'line-through';\n }\n },\n\n // Disable url input when uploading files\n _removeSelectedFiles: function (urlInput, preview) {\n this.value = '';\n if (urlInput) {\n urlInput.removeAttribute('disabled');\n preview.style.textDecoration = '';\n }\n },\n\n // create new audio tag\n _createAudioTag: function () {\n const oAudio = this.util.createElement('AUDIO');\n this.plugins.audio._setTagAttrs.call(this, oAudio);\n\n const w = this.context.audio._origin_w;\n const h = this.context.audio._origin_h;\n oAudio.setAttribute('origin-size', w + ',' + h);\n oAudio.style.cssText = (w ? ('width:' + w + '; ') : '') + (h ? ('height:' + h + ';') : '');\n\n return oAudio;\n },\n\n _setTagAttrs: function (element) {\n element.setAttribute('controls', true);\n\n const attrs = this.options.audioTagAttrs;\n if (!attrs) return;\n\n for (let key in attrs) {\n if (!this.util.hasOwn(attrs, key)) continue;\n element.setAttribute(key, attrs[key]);\n }\n },\n\n _onLinkPreview: function (context, protocol, e) {\n const value = e.target.value.trim();\n context._linkValue = this.textContent = !value ? '' : (protocol && value.indexOf('://') === -1 && value.indexOf('#') !== 0) ? protocol + value : value.indexOf('://') === -1 ? '/' + value : value;\n },\n\n /**\n * @Required @Override fileManager\n */\n fileTags: ['audio'],\n\n /**\n * @Override core, fileManager, resizing\n * @description It is called from core.selectComponent.\n * @param {Element} element Target element\n */\n select: function (element) {\n this.plugins.audio.onModifyMode.call(this, element);\n },\n\n /**\n * @Override fileManager, resizing \n */\n destroy: function (element) {\n element = element || this.context.audio._element;\n const container = this.util.getParentElement(element, this.util.isComponent) || element;\n const dataIndex = element.getAttribute('data-index') * 1;\n const focusEl = (container.previousElementSibling || container.nextElementSibling);\n\n const emptyDiv = container.parentNode;\n this.util.removeItem(container);\n this.plugins.audio.init.call(this);\n this.controllersOff();\n\n if (emptyDiv !== this.context.element.wysiwyg) this.util.removeItemAllParents(emptyDiv, function (current) { return current.childNodes.length === 0; }, null);\n\n // focus\n this.focusEdge(focusEl);\n\n // fileManager event\n this.plugins.fileManager.deleteInfo.call(this, 'audio', dataIndex, this.functions.onAudioUpload);\n\n // history stack\n this.history.push(false);\n },\n\n /**\n * @Override fileManager\n */\n checkFileInfo: function () {\n this.plugins.fileManager.checkInfo.call(this, 'audio', ['audio'], this.functions.onAudioUpload, this.plugins.audio.updateCover.bind(this), false);\n },\n\n /**\n * @Override fileManager\n */\n resetFileInfo: function () {\n this.plugins.fileManager.resetInfo.call(this, 'audio', this.functions.onAudioUpload);\n },\n\n /**\n * @Required @Override dialog\n */\n on: function (update) {\n const contextAudio = this.context.audio;\n\n if (!update) {\n this.plugins.audio.init.call(this);\n if (contextAudio.audioInputFile && this.options.audioMultipleFile) contextAudio.audioInputFile.setAttribute('multiple', 'multiple');\n } else if (contextAudio._element) {\n this.context.dialog.updateModal = true;\n contextAudio._linkValue = contextAudio.preview.textContent = contextAudio.audioUrlFile.value = contextAudio._element.src;\n if (contextAudio.audioInputFile && this.options.audioMultipleFile) contextAudio.audioInputFile.removeAttribute('multiple');\n } else {\n if (contextAudio.audioInputFile && this.options.audioMultipleFile) contextAudio.audioInputFile.removeAttribute('multiple');\n }\n },\n\n /**\n * @Required @Override dialog\n */\n open: function () {\n this.plugins.dialog.open.call(this, 'audio', 'audio' === this.currentControllerName);\n },\n\n submit: function (e) {\n const contextAudio = this.context.audio;\n\n e.preventDefault();\n e.stopPropagation();\n\n try {\n if (contextAudio.audioInputFile && contextAudio.audioInputFile.files.length > 0) {\n this.showLoading();\n this.plugins.audio.submitAction.call(this, contextAudio.audioInputFile.files);\n } else if (contextAudio.audioUrlFile && contextAudio._linkValue.length > 0) {\n this.showLoading();\n this.plugins.audio.setupUrl.call(this, contextAudio._linkValue);\n }\n } catch (error) {\n this.closeLoading();\n throw Error('[SUNEDITOR.audio.submit.fail] cause : \"' + error.message + '\"');\n } finally {\n this.plugins.dialog.close.call(this);\n }\n\n return false;\n },\n\n submitAction: function (fileList) {\n if (fileList.length === 0) return;\n\n let fileSize = 0;\n let files = [];\n for (let i = 0, len = fileList.length; i < len; i++) {\n if (/audio/i.test(fileList[i].type)) {\n files.push(fileList[i]);\n fileSize += fileList[i].size;\n }\n }\n\n const limitSize = this.options.audioUploadSizeLimit;\n if (limitSize > 0) {\n let infoSize = 0;\n const audiosInfo = this.context.audio._infoList;\n for (let i = 0, len = audiosInfo.length; i < len; i++) {\n infoSize += audiosInfo[i].size * 1;\n }\n\n if ((fileSize + infoSize) > limitSize) {\n this.closeLoading();\n const err = '[SUNEDITOR.audioUpload.fail] Size of uploadable total audios: ' + (limitSize/1000) + 'KB';\n if (typeof this.functions.onAudioUploadError !== 'function' || this.functions.onAudioUploadError(err, { 'limitSize': limitSize, 'currentSize': infoSize, 'uploadSize': fileSize }, this)) {\n this.functions.noticeOpen(err);\n }\n return;\n }\n }\n\n const contextAudio = this.context.audio;\n contextAudio._uploadFileLength = files.length;\n\n const info = {\n isUpdate: this.context.dialog.updateModal,\n element: contextAudio._element\n };\n\n if (typeof this.functions.onAudioUploadBefore === 'function') {\n const result = this.functions.onAudioUploadBefore(files, info, this, function (data) {\n if (data && this._w.Array.isArray(data.result)) {\n this.plugins.audio.register.call(this, info, data);\n } else {\n this.plugins.audio.upload.call(this, info, data);\n }\n }.bind(this));\n\n if (typeof result === 'undefined') return;\n if (!result) {\n this.closeLoading();\n return;\n }\n if (typeof result === 'object' && result.length > 0) files = result;\n }\n\n this.plugins.audio.upload.call(this, info, files);\n },\n\n error: function (message, response) {\n this.closeLoading();\n if (typeof this.functions.onAudioUploadError !== 'function' || this.functions.onAudioUploadError(message, response, this)) {\n this.functions.noticeOpen(message);\n throw Error('[SUNEDITOR.plugin.audio.exception] response: ' + message);\n }\n },\n\n upload: function (info, files) {\n if (!files) {\n this.closeLoading();\n return;\n }\n if (typeof files === 'string') {\n this.plugins.audio.error.call(this, files, null);\n return;\n }\n\n const audioUploadUrl = this.options.audioUploadUrl;\n const filesLen = this.context.dialog.updateModal ? 1 : files.length;\n\n // create formData\n const formData = new FormData();\n for (let i = 0; i < filesLen; i++) {\n formData.append('file-' + i, files[i]);\n }\n\n // server upload\n this.plugins.fileManager.upload.call(this, audioUploadUrl, this.options.audioUploadHeader, formData, this.plugins.audio.callBack_upload.bind(this, info), this.functions.onAudioUploadError);\n },\n\n callBack_upload: function (info, xmlHttp) {\n if (typeof this.functions.audioUploadHandler === 'function') {\n this.functions.audioUploadHandler(xmlHttp, info, this);\n } else {\n const response = JSON.parse(xmlHttp.responseText);\n if (response.errorMessage) {\n this.plugins.audio.error.call(this, response.errorMessage, response);\n } else {\n this.plugins.audio.register.call(this, info, response);\n }\n }\n },\n\n register: function (info, response) {\n const fileList = response.result;\n\n for (let i = 0, len = fileList.length, file, oAudio; i < len; i++) {\n if (info.isUpdate) oAudio = info.element;\n else oAudio = this.plugins.audio._createAudioTag.call(this);\n\n file = { name: fileList[i].name, size: fileList[i].size };\n this.plugins.audio.create_audio.call(this, oAudio, fileList[i].url, file, info.isUpdate);\n }\n\n this.closeLoading();\n },\n\n setupUrl: function (src) {\n try {\n if (src.length === 0) return false;\n this.plugins.audio.create_audio.call(this, this.plugins.audio._createAudioTag.call(this), src, null, this.context.dialog.updateModal);\n } catch (error) {\n throw Error('[SUNEDITOR.audio.audio.fail] cause : \"' + error.message + '\"');\n } finally {\n this.closeLoading();\n }\n },\n\n create_audio: function (element, src, file, isUpdate) {\n const contextAudio = this.context.audio;\n \n // create new tag\n if (!isUpdate) {\n element.src = src;\n const cover = this.plugins.component.set_cover.call(this, element);\n const container = this.plugins.component.set_container.call(this, cover, '');\n if (!this.insertComponent(container, false, true, !this.options.mediaAutoSelect)) {\n this.focus();\n return;\n }\n if (!this.options.mediaAutoSelect) {\n const line = this.appendFormatTag(container, null);\n if (line) this.setRange(line, 0, line, 0);\n }\n } // update\n else {\n if (contextAudio._element) element = contextAudio._element;\n if (element && element.src !== src) {\n element.src = src;\n this.selectComponent(element, 'audio');\n } else {\n this.selectComponent(element, 'audio');\n return;\n }\n }\n\n this.plugins.fileManager.setInfo.call(this, 'audio', element, this.functions.onAudioUpload, file, false);\n if (isUpdate) this.history.push(false);\n },\n\n updateCover: function (element) {\n const contextAudio = this.context.audio;\n this.plugins.audio._setTagAttrs.call(this, element);\n \n // find component element\n let existElement = (this.util.isRangeFormatElement(element.parentNode) || this.util.isWysiwygDiv(element.parentNode)) ? \n element : this.util.getFormatElement(element) || element;\n\n // clone element\n const prevElement = element;\n contextAudio._element = element = element.cloneNode(false);\n const cover = this.plugins.component.set_cover.call(this, element);\n const container = this.plugins.component.set_container.call(this, cover, 'se-audio-container');\n\n try {\n if (this.util.getParentElement(prevElement, this.util.isNotCheckingNode)) {\n prevElement.parentNode.replaceChild(container, prevElement);\n } else if (this.util.isListCell(existElement)) {\n const refer = this.util.getParentElement(prevElement, function (current) { return current.parentNode === existElement; });\n existElement.insertBefore(container, refer);\n this.util.removeItem(prevElement);\n this.util.removeEmptyNode(refer, null, true);\n } else if (this.util.isFormatElement(existElement)) {\n const refer = this.util.getParentElement(prevElement, function (current) { return current.parentNode === existElement; });\n existElement = this.util.splitElement(existElement, refer);\n existElement.parentNode.insertBefore(container, existElement);\n this.util.removeItem(prevElement);\n this.util.removeEmptyNode(existElement, null, true);\n if (existElement.children.length === 0) existElement.innerHTML = this.util.htmlRemoveWhiteSpace(existElement.innerHTML);\n } else {\n existElement.parentNode.replaceChild(container, existElement);\n }\n } catch (error) {\n console.warn('[SUNEDITOR.audio.error] Maybe the audio tag is nested.', error);\n }\n\n this.plugins.fileManager.setInfo.call(this, 'audio', element, this.functions.onAudioUpload, null, false);\n this.plugins.audio.init.call(this);\n },\n\n /**\n * @Required @Override fileManager, resizing\n */\n onModifyMode: function (selectionTag) {\n const contextAudio = this.context.audio;\n \n this.setControllerPosition(contextAudio.controller, selectionTag, 'bottom', {left: 0, top: 0});\n this.controllersOn(contextAudio.controller, selectionTag, this.plugins.audio.onControllerOff.bind(this, selectionTag), 'audio');\n\n this.util.addClass(selectionTag, 'active');\n contextAudio._element = selectionTag;\n contextAudio._cover = this.util.getParentElement(selectionTag, 'FIGURE');\n contextAudio._container = this.util.getParentElement(selectionTag, this.util.isComponent);\n },\n\n /**\n * @Required @Override fileManager, resizing\n */\n openModify: function (notOpen) {\n if (this.context.audio.audioUrlFile) {\n const contextAudio = this.context.audio;\n contextAudio._linkValue = contextAudio.preview.textContent = contextAudio.audioUrlFile.value = contextAudio._element.src;\n }\n if (!notOpen) this.plugins.dialog.open.call(this, 'audio', true);\n },\n\n onClick_controller: function (e) {\n e.stopPropagation();\n\n const command = e.target.getAttribute('data-command');\n if (!command) return;\n\n e.preventDefault();\n\n if (/update/.test(command)) {\n this.plugins.audio.openModify.call(this, false);\n }\n else { /** delete */\n this.plugins.audio.destroy.call(this, this.context.audio._element);\n }\n\n this.controllersOff();\n },\n\n onControllerOff: function (selectionTag) {\n this.util.removeClass(selectionTag, 'active');\n this.context.audio.controller.style.display = 'none';\n },\n\n /**\n * @Required @Override dialog\n */\n init: function () {\n if (this.context.dialog.updateModal) return;\n const contextAudio = this.context.audio;\n\n if (contextAudio.audioInputFile) contextAudio.audioInputFile.value = '';\n if (contextAudio.audioUrlFile) contextAudio._linkValue = contextAudio.preview.textContent = contextAudio.audioUrlFile.value = '';\n if (contextAudio.audioInputFile && contextAudio.audioUrlFile) {\n contextAudio.audioUrlFile.removeAttribute('disabled');\n contextAudio.preview.style.textDecoration = '';\n }\n\n contextAudio._element = null;\n }\n};","'use strict';\n\nimport dialog from '../modules/dialog';\n\nconst KATEX_WEBSITE = \"https://katex.org/docs/supported.html\";\n\nexport default {\n name: 'math',\n display: 'dialog',\n add: function (core) {\n core.addModule([dialog]);\n\n const context = core.context;\n context.math = {\n focusElement: null, // @Override dialog // This element has focus when the dialog is opened.\n previewElement: null,\n fontSizeElement: null,\n defaultFontSize: '',\n _mathExp: null\n };\n\n /** math dialog */\n let math_dialog = this.setDialog(core);\n context.math.modal = math_dialog;\n context.math.focusElement = math_dialog.querySelector('.se-math-exp');\n context.math.previewElement = math_dialog.querySelector('.se-math-preview');\n context.math.fontSizeElement = math_dialog.querySelector('.se-math-size');\n context.math.focusElement.addEventListener(core.util.isIE ? 'textinput' : 'input', this._renderMathExp.bind(core, context.math), false);\n context.math.fontSizeElement.addEventListener('change', function (e) { this.fontSize = e.target.value; }.bind(context.math.previewElement.style), false);\n\n /** math controller */\n let math_controller = this.setController_MathButton(core);\n context.math.mathController = math_controller;\n context.math._mathExp = null;\n\n /** add event listeners */\n math_dialog.querySelector('form').addEventListener('submit', this.submit.bind(core), false);\n math_controller.addEventListener('click', this.onClick_mathController.bind(core));\n context.math.previewElement.style.fontSize = context.math.defaultFontSize;\n\n /** append html */\n context.dialog.modal.appendChild(math_dialog);\n context.element.relative.appendChild(math_controller);\n\n /** empty memory */\n math_dialog = null, math_controller = null;\n },\n\n /** dialog */\n setDialog: function (core) {\n const lang = core.lang;\n const dialog = core.util.createElement('DIV');\n const fontSize = core.options.mathFontSize;\n let defaultFontSize = fontSize[0].value;\n\n dialog.className = 'se-dialog-content';\n dialog.style.display = 'none';\n let html = '' +\n '
' +\n '
' +\n '' +\n '' + lang.dialogBox.mathBox.title + '' +\n '
' +\n '
' +\n '
' +\n '' +\n '' +\n '
' +\n '
' +\n '' +\n '' +\n '
' +\n '
' +\n '' +\n '

' +\n '
' +\n '
' +\n '
' +\n '' +\n '
' +\n '
';\n\n core.context.math.defaultFontSize = defaultFontSize;\n dialog.innerHTML = html;\n return dialog;\n },\n\n /** modify controller button */\n setController_MathButton: function (core) {\n const lang = core.lang;\n const math_btn = core.util.createElement('DIV');\n\n math_btn.className = 'se-controller se-controller-link';\n math_btn.innerHTML = '' +\n '
' +\n '' +\n '';\n\n return math_btn;\n },\n\n /**\n * @Required @Override dialog\n */\n open: function () {\n this.plugins.dialog.open.call(this, 'math', 'math' === this.currentControllerName);\n },\n\n /**\n * @Override core - managedTagsInfo\n */\n managedTags: function () {\n return {\n className: 'katex',\n method: function (element) {\n if (!element.getAttribute('data-exp') || !this.options.katex) return;\n const dom = this._d.createRange().createContextualFragment(this.plugins.math._renderer.call(this, this.util.HTMLDecoder(element.getAttribute('data-exp'))));\n element.innerHTML = dom.querySelector('.katex').innerHTML;\n element.setAttribute('contenteditable', false);\n }\n };\n },\n\n _renderer: function (exp) {\n let result = '';\n try {\n this.util.removeClass(this.context.math.focusElement, 'se-error');\n result = this.options.katex.src.renderToString(exp, {throwOnError: true, displayMode: true});\n } catch(error) {\n this.util.addClass(this.context.math.focusElement, 'se-error');\n result = 'Katex syntax error. (Refer KaTeX)';\n console.warn('[SUNEDITOR.math.Katex.error] ', error);\n }\n return result;\n },\n\n _renderMathExp: function (contextMath, e) {\n contextMath.previewElement.innerHTML = this.plugins.math._renderer.call(this, e.target.value);\n },\n\n submit: function (e) {\n this.showLoading();\n\n e.preventDefault();\n e.stopPropagation();\n\n const submitAction = function () {\n if (this.context.math.focusElement.value.trim().length === 0) return false;\n\n const contextMath = this.context.math;\n const mathExp = contextMath.focusElement.value;\n const katexEl = contextMath.previewElement.querySelector('.katex');\n\n if (!katexEl) return false;\n katexEl.className = '__se__katex ' + katexEl.className;\n katexEl.setAttribute('contenteditable', false);\n katexEl.setAttribute('data-exp', this.util.HTMLEncoder(mathExp));\n katexEl.setAttribute('data-font-size', contextMath.fontSizeElement.value);\n katexEl.style.fontSize = contextMath.fontSizeElement.value;\n\n if (!this.context.dialog.updateModal) {\n const selectedFormats = this.getSelectedElements();\n\n if (selectedFormats.length > 1) {\n const oFormat = this.util.createElement(selectedFormats[0].nodeName);\n oFormat.appendChild(katexEl);\n if (!this.insertNode(oFormat, null, true)) return false;\n } else {\n if (!this.insertNode(katexEl, null, true)) return false;\n }\n\n const empty = this.util.createTextNode(this.util.zeroWidthSpace);\n katexEl.parentNode.insertBefore(empty, katexEl.nextSibling);\n this.setRange(katexEl, 0, katexEl, 1);\n } else {\n const containerEl = this.util.getParentElement(contextMath._mathExp, '.katex');\n containerEl.parentNode.replaceChild(katexEl, containerEl);\n this.setRange(katexEl, 0, katexEl, 1);\n }\n\n contextMath.focusElement.value = '';\n contextMath.fontSizeElement.value = '1em';\n contextMath.previewElement.style.fontSize = '1em';\n contextMath.previewElement.innerHTML = '';\n\n return true;\n }.bind(this);\n\n try {\n if (submitAction()) {\n this.plugins.dialog.close.call(this);\n // history stack\n this.history.push(false);\n }\n } catch (e) {\n this.plugins.dialog.close.call(this);\n } finally {\n this.closeLoading();\n }\n\n return false;\n },\n\n active: function (element) {\n if (!element) {\n if (this.controllerArray.indexOf(this.context.math.mathController) > -1) {\n this.controllersOff();\n }\n } else if (element.getAttribute('data-exp')) {\n if (this.controllerArray.indexOf(this.context.math.mathController) < 0) {\n this.setRange(element, 0, element, 1);\n this.plugins.math.call_controller.call(this, element);\n }\n return true;\n }\n\n return false;\n },\n\n on: function (update) {\n if (!update) {\n this.plugins.math.init.call(this);\n } else {\n const contextMath = this.context.math;\n if (contextMath._mathExp) {\n const exp = this.util.HTMLDecoder(contextMath._mathExp.getAttribute('data-exp'));\n const fontSize = contextMath._mathExp.getAttribute('data-font-size') || '1em';\n this.context.dialog.updateModal = true;\n contextMath.focusElement.value = exp;\n contextMath.fontSizeElement.value = fontSize;\n contextMath.previewElement.innerHTML = this.plugins.math._renderer.call(this, exp);\n contextMath.previewElement.style.fontSize = fontSize;\n }\n }\n },\n\n call_controller: function (mathTag) {\n this.context.math._mathExp = mathTag;\n const mathBtn = this.context.math.mathController;\n\n this.setControllerPosition(mathBtn, mathTag, 'bottom', {left: 0, top: 0});\n this.controllersOn(mathBtn, mathTag, 'math');\n },\n\n onClick_mathController: function (e) {\n e.stopPropagation();\n\n const command = e.target.getAttribute('data-command') || e.target.parentNode.getAttribute('data-command');\n if (!command) return;\n\n e.preventDefault();\n\n if (/update/.test(command)) {\n this.context.math.focusElement.value = this.util.HTMLDecoder(this.context.math._mathExp.getAttribute('data-exp'));\n this.plugins.dialog.open.call(this, 'math', true);\n } else {\n /** delete */\n this.util.removeItem(this.context.math._mathExp);\n this.context.math._mathExp = null;\n this.focus();\n\n // history stack\n this.history.push(false);\n }\n\n this.controllersOff();\n },\n\n init: function () {\n const contextMath = this.context.math;\n contextMath.mathController.style.display = 'none';\n contextMath._mathExp = null;\n contextMath.focusElement.value = '';\n contextMath.previewElement.innerHTML = '';\n }\n};\n","'use strict';\n\n// command\nimport blockquote from './command/blockquote';\n\n// submenu\nimport align from './submenu/align';\nimport font from './submenu/font';\nimport fontSize from './submenu/fontSize';\nimport fontColor from './submenu/fontColor';\nimport hiliteColor from './submenu/hiliteColor';\nimport horizontalRule from './submenu/horizontalRule';\nimport list from './submenu/list';\nimport table from './submenu/table';\nimport formatBlock from './submenu/formatBlock';\nimport lineHeight from './submenu/lineHeight';\nimport template from './submenu/template';\nimport paragraphStyle from './submenu/paragraphStyle';\nimport textStyle from './submenu/textStyle';\n\n// dialog\nimport link from './dialog/link';\nimport image from './dialog/image';\nimport video from './dialog/video';\nimport audio from './dialog/audio';\nimport math from './dialog/math';\n\n// file browser\nimport imageGallery from './fileBrowser/imageGallery';\n\nexport { blockquote, align, font, fontSize, fontColor, hiliteColor, horizontalRule, list, table, formatBlock, lineHeight, template, paragraphStyle, textStyle, link, image, video, audio, math, imageGallery };\nexport default { blockquote, align, font, fontSize, fontColor, hiliteColor, horizontalRule, list, table, formatBlock, lineHeight, template, paragraphStyle, textStyle, link, image, video, audio, math, imageGallery };\n","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nexport default {\n name: 'blockquote',\n display: 'command',\n add: function (core, targetElement) {\n const context = core.context;\n context.blockquote = {\n targetButton: targetElement,\n tag: core.util.createElement('BLOCKQUOTE')\n };\n },\n\n /**\n * @Override core\n */\n active: function (element) {\n if (!element) {\n this.util.removeClass(this.context.blockquote.targetButton, 'active');\n } else if (/blockquote/i.test(element.nodeName)) {\n this.util.addClass(this.context.blockquote.targetButton, 'active');\n return true;\n }\n \n return false;\n },\n\n /**\n * @Override core\n */\n action: function () {\n const currentBlockquote = this.util.getParentElement(this.getSelectionNode(), 'blockquote');\n\n if (currentBlockquote) {\n this.detachRangeFormatElement(currentBlockquote, null, null, false, false);\n } else {\n this.applyRangeFormatElement(this.context.blockquote.tag.cloneNode(false));\n }\n }\n};","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nexport default {\n name: 'align',\n display: 'submenu',\n add: function (core, targetElement) {\n const icons = core.icons;\n const context = core.context;\n context.align = {\n targetButton: targetElement,\n _itemMenu: null,\n _alignList: null,\n currentAlign: '',\n defaultDir: core.options.rtl ? 'right' : 'left',\n icons: {\n justify: icons.align_justify,\n left: icons.align_left,\n right: icons.align_right,\n center: icons.align_center\n }\n };\n\n /** set submenu */\n let listDiv = this.setSubmenu(core);\n let listUl = context.align._itemMenu = listDiv.querySelector('ul');\n\n /** add event listeners */\n listUl.addEventListener('click', this.pickup.bind(core));\n context.align._alignList = listUl.querySelectorAll('li button');\n\n /** append target button menu */\n core.initMenuTarget(this.name, targetElement, listDiv);\n\n /** empty memory */\n listDiv = null, listUl = null;\n },\n\n setSubmenu: function (core) {\n const lang = core.lang;\n const icons = core.icons;\n const listDiv = core.util.createElement('DIV');\n const alignItems = core.options.alignItems;\n\n let html = '';\n for (let i = 0, item, text; i < alignItems.length; i++) {\n item = alignItems[i];\n text = lang.toolbar['align' + item.charAt(0).toUpperCase() + item.slice(1)];\n html += '
  • ' +\n '' +\n '
  • ';\n }\n\n listDiv.className = 'se-submenu se-list-layer se-list-align';\n listDiv.innerHTML = '' +\n '
    ' +\n '
      ' +\n html +\n '
    ' +\n '
    ';\n\n return listDiv;\n },\n\n /**\n * @Override core\n */\n active: function (element) {\n const alignContext = this.context.align;\n const targetButton = alignContext.targetButton;\n const target = targetButton.firstElementChild;\n\n if (!element) {\n this.util.changeElement(target, alignContext.icons[alignContext.defaultDir]);\n targetButton.removeAttribute('data-focus');\n } else if (this.util.isFormatElement(element)) {\n const textAlign = element.style.textAlign;\n if (textAlign) {\n this.util.changeElement(target, alignContext.icons[textAlign] || alignContext.icons[alignContext.defaultDir]);\n targetButton.setAttribute('data-focus', textAlign);\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * @Override submenu\n */\n on: function () {\n const alignContext = this.context.align;\n const alignList = alignContext._alignList;\n const currentAlign = alignContext.targetButton.getAttribute('data-focus') || alignContext.defaultDir;\n\n if (currentAlign !== alignContext.currentAlign) {\n for (let i = 0, len = alignList.length; i < len; i++) {\n if (currentAlign === alignList[i].getAttribute('data-value')) {\n this.util.addClass(alignList[i], 'active');\n } else {\n this.util.removeClass(alignList[i], 'active');\n }\n }\n\n alignContext.currentAlign = currentAlign;\n }\n },\n\n exchangeDir: function () {\n const dir = this.options.rtl ? 'right' : 'left';\n if (!this.context.align || this.context.align.defaultDir === dir) return;\n\n this.context.align.defaultDir = dir;\n let menu = this.context.align._itemMenu;\n let leftBtn = menu.querySelector('[data-value=\"left\"]');\n let rightBtn = menu.querySelector('[data-value=\"right\"]');\n if (leftBtn && rightBtn) {\n const lp = leftBtn.parentElement;\n const rp = rightBtn.parentElement;\n lp.appendChild(rightBtn);\n rp.appendChild(leftBtn);\n }\n },\n\n pickup: function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n let target = e.target;\n let value = null;\n\n while (!value && !/UL/i.test(target.tagName)) {\n value = target.getAttribute('data-value');\n target = target.parentNode;\n }\n\n if (!value) return;\n\n const defaultDir = this.context.align.defaultDir;\n const selectedFormsts = this.getSelectedElements();\n for (let i = 0, len = selectedFormsts.length; i < len; i++) {\n this.util.setStyle(selectedFormsts[i], 'textAlign', (value === defaultDir ? '' : value));\n }\n\n this.effectNode = null;\n this.submenuOff();\n this.focus();\n \n // history stack\n this.history.push(false);\n }\n};\n","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nexport default {\n name: 'font',\n display: 'submenu',\n add: function (core, targetElement) {\n const context = core.context;\n context.font = {\n targetText: targetElement.querySelector('.txt'),\n targetTooltip: targetElement.parentNode.querySelector('.se-tooltip-text'),\n _fontList: null,\n currentFont: ''\n };\n\n /** set submenu */\n let listDiv = this.setSubmenu(core);\n\n /** add event listeners */\n listDiv.querySelector('.se-list-inner').addEventListener('click', this.pickup.bind(core));\n\n context.font._fontList = listDiv.querySelectorAll('ul li button');\n\n /** append target button menu */\n core.initMenuTarget(this.name, targetElement, listDiv);\n\n /** empty memory */\n listDiv = null;\n },\n\n setSubmenu: function (core) {\n const lang = core.lang;\n const listDiv = core.util.createElement('DIV');\n\n listDiv.className = 'se-submenu se-list-layer se-list-font-family';\n\n let font, text, i, len;\n let fontList = core.options.font;\n\n let list = '
    ' +\n '
      ' +\n '
    • ';\n for (i = 0, len = fontList.length; i < len; i++) {\n font = fontList[i];\n text = font.split(',')[0];\n list += '
    • ';\n }\n list += '
    ';\n listDiv.innerHTML = list;\n\n return listDiv;\n },\n\n /**\n * @Override core\n */\n active: function (element) {\n const target = this.context.font.targetText;\n const tooltip = this.context.font.targetTooltip;\n\n if (!element) {\n const font = this.hasFocus ? this.wwComputedStyle.fontFamily : this.lang.toolbar.font;\n this.util.changeTxt(target, font);\n this.util.changeTxt(tooltip, this.hasFocus ? this.lang.toolbar.font + (font ? ' (' + font + ')' : '') : font);\n } else if (element.style && element.style.fontFamily.length > 0) {\n const selectFont = element.style.fontFamily.replace(/[\"']/g,'');\n this.util.changeTxt(target, selectFont);\n this.util.changeTxt(tooltip, this.lang.toolbar.font + ' (' + selectFont + ')');\n return true;\n }\n\n return false;\n },\n\n /**\n * @Override submenu\n */\n on: function () {\n const fontContext = this.context.font;\n const fontList = fontContext._fontList;\n const currentFont = fontContext.targetText.textContent;\n\n if (currentFont !== fontContext.currentFont) {\n for (let i = 0, len = fontList.length; i < len; i++) {\n if (currentFont === fontList[i].getAttribute('data-value')) {\n this.util.addClass(fontList[i], 'active');\n } else {\n this.util.removeClass(fontList[i], 'active');\n }\n }\n\n fontContext.currentFont = currentFont;\n }\n },\n\n pickup: function (e) {\n if (!/^BUTTON$/i.test(e.target.tagName)) return false;\n\n e.preventDefault();\n e.stopPropagation();\n\n const value = e.target.getAttribute('data-value');\n\n if (value) {\n const newNode = this.util.createElement('SPAN');\n newNode.style.fontFamily = value;\n this.nodeChange(newNode, ['font-family'], null, null);\n } else {\n this.nodeChange(null, ['font-family'], ['span'], true);\n }\n \n this.submenuOff();\n }\n};\n","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nexport default {\n name: 'fontSize',\n display: 'submenu',\n add: function (core, targetElement) {\n const context = core.context;\n context.fontSize = {\n targetText: targetElement.querySelector('.txt'),\n _sizeList: null,\n currentSize: ''\n };\n\n /** set submenu */\n let listDiv = this.setSubmenu(core);\n let listUl = listDiv.querySelector('ul');\n\n /** add event listeners */\n listUl.addEventListener('click', this.pickup.bind(core));\n context.fontSize._sizeList = listUl.querySelectorAll('li button');\n\n /** append target button menu */\n core.initMenuTarget(this.name, targetElement, listDiv);\n\n /** empty memory */\n listDiv = null, listUl = null;\n },\n\n setSubmenu: function (core) {\n const option = core.options;\n const lang = core.lang;\n const listDiv = core.util.createElement('DIV');\n\n listDiv.className = 'se-submenu se-list-layer se-list-font-size';\n\n const sizeList = !option.fontSize ? [8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72] : option.fontSize;\n\n let list = '
    ' +\n '
      ' +\n '
    • ';\n for (let i = 0, unit = option.fontSizeUnit, len = sizeList.length, size; i < len; i++) {\n size = sizeList[i];\n list += '
    • ';\n }\n list += '
    ';\n\n listDiv.innerHTML = list;\n\n return listDiv;\n },\n\n /**\n * @Override core\n */\n active: function (element) {\n if (!element) {\n this.util.changeTxt(this.context.fontSize.targetText, this.hasFocus ? this._convertFontSize.call(this, this.options.fontSizeUnit, this.wwComputedStyle.fontSize) : this.lang.toolbar.fontSize);\n } else if (element.style && element.style.fontSize.length > 0) {\n this.util.changeTxt(this.context.fontSize.targetText, this._convertFontSize.call(this, this.options.fontSizeUnit, element.style.fontSize));\n return true;\n }\n\n return false;\n },\n\n /**\n * @Override submenu\n */\n on: function () {\n const fontSizeContext = this.context.fontSize;\n const sizeList = fontSizeContext._sizeList;\n const currentSize = fontSizeContext.targetText.textContent;\n\n if (currentSize !== fontSizeContext.currentSize) {\n for (let i = 0, len = sizeList.length; i < len; i++) {\n if (currentSize === sizeList[i].getAttribute('data-value')) {\n this.util.addClass(sizeList[i], 'active');\n } else {\n this.util.removeClass(sizeList[i], 'active');\n }\n }\n\n fontSizeContext.currentSize = currentSize;\n }\n },\n\n pickup: function (e) {\n if (!/^BUTTON$/i.test(e.target.tagName)) return false;\n \n e.preventDefault();\n e.stopPropagation();\n\n const value = e.target.getAttribute('data-value');\n\n if (value) {\n const newNode = this.util.createElement('SPAN');\n newNode.style.fontSize = value;\n this.nodeChange(newNode, ['font-size'], null, null);\n } else {\n this.nodeChange(null, ['font-size'], ['span'], true);\n }\n\n this.submenuOff();\n }\n};\n","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nexport default {\n name: 'horizontalRule',\n display: 'submenu',\n add: function (core, targetElement) {\n core.context.horizontalRule = {\n currentHR: null,\n };\n\n /** set submenu */\n let listDiv = this.setSubmenu(core);\n\n /** add event listeners */\n listDiv.querySelector('ul').addEventListener('click', this.horizontalRulePick.bind(core));\n\n /** append target button menu */\n core.initMenuTarget(this.name, targetElement, listDiv);\n\n /** empty memory */\n listDiv = null;\n },\n\n setSubmenu: function (core) {\n const lang = core.lang;\n const listDiv = core.util.createElement('DIV');\n const items = core.options.hrItems || [{name: lang.toolbar.hr_solid, class: '__se__solid'}, {name: lang.toolbar.hr_dashed, class: '__se__dashed'}, {name: lang.toolbar.hr_dotted, class: '__se__dotted'}];\n \n let list = '';\n for (let i = 0, len = items.length; i < len; i++) {\n list += '
  • ' +\n '' +\n '
  • ';\n }\n \n listDiv.className = 'se-submenu se-list-layer se-list-line';\n listDiv.innerHTML = '' +\n '
    ' +\n '
      ' +\n list +\n '
    ' +\n '
    ';\n\n return listDiv;\n },\n\n active: function (element) {\n if (!element) {\n if (this.util.hasClass(this.context.horizontalRule.currentHR, 'on')) {\n this.controllersOff();\n }\n } else if (/HR/i.test(element.nodeName)) {\n this.context.horizontalRule.currentHR = element;\n if (!this.util.hasClass(element, 'on')) {\n this.util.addClass(element, 'on');\n this.controllersOn('hr', this.util.removeClass.bind(this.util, element, 'on'));\n }\n return true;\n }\n\n return false;\n },\n\n appendHr: function (hrTemp) {\n this.focus();\n return this.insertComponent(hrTemp.cloneNode(false), false, true, false);\n },\n\n horizontalRulePick: function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n let target = e.target;\n let command = target.getAttribute('data-command');\n \n while (!command && !/UL/i.test(target.tagName)) {\n target = target.parentNode;\n command = target.getAttribute('data-command');\n }\n\n if (!command) return;\n\n const oNode = this.plugins.horizontalRule.appendHr.call(this, target.firstElementChild);\n if (oNode) {\n this.setRange(oNode, 0, oNode, 0);\n this.submenuOff();\n }\n }\n};\n","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nexport default {\n name: 'list',\n display: 'submenu',\n add: function (core, targetElement) {\n const context = core.context;\n context.list = {\n targetButton: targetElement,\n _list: null,\n currentList: '',\n icons: {\n bullets: core.icons.list_bullets,\n number: core.icons.list_number\n }\n };\n\n /** set submenu */\n let listDiv = this.setSubmenu(core);\n let listUl = listDiv.querySelector('ul');\n\n /** add event listeners */\n listUl.addEventListener('click', this.pickup.bind(core));\n context.list._list = listUl.querySelectorAll('li button');\n\n /** append target button menu */\n core.initMenuTarget(this.name, targetElement, listDiv);\n\n /** empty memory */\n listDiv = null, listUl = null;\n },\n\n setSubmenu: function (core) {\n const lang = core.lang;\n const listDiv = core.util.createElement('DIV');\n\n listDiv.className = 'se-submenu se-list-layer';\n listDiv.innerHTML = '' +\n '
    ' +\n '
      ' +\n '
    • ' +\n '
    • ' +\n '
    ' +\n '
    ';\n\n return listDiv;\n },\n\n /**\n * @Override core\n */\n active: function (element) {\n const button = this.context.list.targetButton;\n const icon = button.firstElementChild;\n const util = this.util;\n\n if (util.isList(element)) {\n const nodeName = element.nodeName;\n button.setAttribute('data-focus', nodeName);\n util.addClass(button, 'active');\n if (/UL/i.test(nodeName)) {\n util.changeElement(icon, this.context.list.icons.bullets);\n } else {\n util.changeElement(icon, this.context.list.icons.number);\n }\n \n return true;\n } else {\n button.removeAttribute('data-focus');\n util.changeElement(icon, this.context.list.icons.number);\n util.removeClass(button, 'active');\n }\n\n return false;\n },\n\n /**\n * @Override submenu\n */\n on: function () {\n const listContext = this.context.list;\n const list = listContext._list;\n const currentList = listContext.targetButton.getAttribute('data-focus') || '';\n\n if (currentList !== listContext.currentList) {\n for (let i = 0, len = list.length; i < len; i++) {\n if (currentList === list[i].getAttribute('data-command')) {\n this.util.addClass(list[i], 'active');\n } else {\n this.util.removeClass(list[i], 'active');\n }\n }\n\n listContext.currentList = currentList;\n }\n },\n\n editList: function (command, selectedCells, detach) {\n let range = this.getRange();\n let selectedFormats = !selectedCells ? this.getSelectedElementsAndComponents(false) : selectedCells;\n\n if (selectedFormats.length === 0) {\n if (selectedCells) return;\n range = this.getRange_addLine(range, null);\n selectedFormats = this.getSelectedElementsAndComponents(false);\n if (selectedFormats.length === 0) return;\n }\n \n const util = this.util;\n util.sortByDepth(selectedFormats, true);\n\n // merge\n let firstSel = selectedFormats[0];\n let lastSel = selectedFormats[selectedFormats.length - 1];\n let topEl = (util.isListCell(firstSel) || util.isComponent(firstSel)) && !firstSel.previousElementSibling ? firstSel.parentNode.previousElementSibling : firstSel.previousElementSibling;\n let bottomEl = (util.isListCell(lastSel) || util.isComponent(lastSel)) && !lastSel.nextElementSibling ? lastSel.parentNode.nextElementSibling : lastSel.nextElementSibling;\n\n const isCollapsed = range.collapsed;\n const originRange = {\n sc: range.startContainer,\n so: (range.startContainer === range.endContainer && util.onlyZeroWidthSpace(range.startContainer) && range.startOffset === 0 && range.endOffset === 1) ? range.endOffset : range.startOffset,\n ec: range.endContainer,\n eo: range.endOffset\n };\n let afterRange = null;\n let isRemove = true;\n\n for (let i = 0, len = selectedFormats.length; i < len; i++) {\n if (!util.isList(util.getRangeFormatElement(selectedFormats[i], function (current) {\n return this.getRangeFormatElement(current) && current !== selectedFormats[i];\n }.bind(util)))) {\n isRemove = false;\n break;\n }\n }\n\n if (isRemove && (!topEl || (firstSel.tagName !== topEl.tagName || command !== topEl.tagName.toUpperCase())) && (!bottomEl || (lastSel.tagName !== bottomEl.tagName || command !== bottomEl.tagName.toUpperCase()))) {\n if (detach) {\n for (let i = 0, len = selectedFormats.length; i < len; i++) {\n for (let j = i - 1; j >= 0; j--) {\n if (selectedFormats[j].contains(selectedFormats[i])) {\n selectedFormats.splice(i, 1);\n i--; len--;\n break;\n }\n }\n }\n }\n\n const currentFormat = util.getRangeFormatElement(firstSel);\n const cancel = currentFormat && currentFormat.tagName === command;\n let rangeArr, tempList;\n const passComponent = function (current) {\n return !this.isComponent(current);\n }.bind(util);\n \n if (!cancel) tempList = util.createElement(command);\n\n for (let i = 0, len = selectedFormats.length, r, o; i < len; i++) {\n o = util.getRangeFormatElement(selectedFormats[i], passComponent);\n if (!o || !util.isList(o)) continue;\n\n if (!r) {\n r = o;\n rangeArr = {r: r, f: [util.getParentElement(selectedFormats[i], 'LI')]};\n } else {\n if (r !== o) {\n if (detach && util.isListCell(o.parentNode)) {\n this.plugins.list._detachNested.call(this, rangeArr.f);\n } else {\n afterRange = this.detachRangeFormatElement(rangeArr.f[0].parentNode, rangeArr.f, tempList, false, true);\n }\n \n o = selectedFormats[i].parentNode;\n if (!cancel) tempList = util.createElement(command);\n \n r = o;\n rangeArr = {r: r, f: [util.getParentElement(selectedFormats[i], 'LI')]};\n } else {\n rangeArr.f.push(util.getParentElement(selectedFormats[i], 'LI'));\n }\n }\n \n if (i === len - 1) {\n if (detach && util.isListCell(o.parentNode)) {\n this.plugins.list._detachNested.call(this, rangeArr.f);\n } else {\n afterRange = this.detachRangeFormatElement(rangeArr.f[0].parentNode, rangeArr.f, tempList, false, true);\n }\n }\n }\n } else {\n const topElParent = topEl ? topEl.parentNode : topEl;\n const bottomElParent = bottomEl ? bottomEl.parentNode : bottomEl;\n topEl = topElParent && !util.isWysiwygDiv(topElParent) && topElParent.nodeName === command ? topElParent : topEl;\n bottomEl = bottomElParent && !util.isWysiwygDiv(bottomElParent) && bottomElParent.nodeName === command ? bottomElParent : bottomEl;\n\n const mergeTop = topEl && topEl.tagName === command;\n const mergeBottom = bottomEl && bottomEl.tagName === command;\n \n let list = mergeTop ? topEl : util.createElement(command);\n let firstList = null;\n let lastList = null;\n let topNumber = null;\n let bottomNumber = null;\n\n const passComponent = function (current) {\n return !this.isComponent(current) && !this.isList(current);\n }.bind(util);\n \n for (let i = 0, len = selectedFormats.length, newCell, fTag, isCell, next, originParent, nextParent, parentTag, siblingTag, rangeTag; i < len; i++) {\n fTag = selectedFormats[i];\n if (fTag.childNodes.length === 0 && !util._isIgnoreNodeChange(fTag)) {\n util.removeItem(fTag);\n continue;\n }\n next = selectedFormats[i + 1];\n originParent = fTag.parentNode;\n nextParent = next ? next.parentNode : null;\n isCell = util.isListCell(fTag);\n rangeTag = util.isRangeFormatElement(originParent) ? originParent : null;\n parentTag = isCell && !util.isWysiwygDiv(originParent) ? originParent.parentNode : originParent;\n siblingTag = isCell && !util.isWysiwygDiv(originParent) ? (!next || util.isListCell(parentTag)) ? originParent : originParent.nextSibling : fTag.nextSibling;\n\n newCell = util.createElement('LI');\n util.copyFormatAttributes(newCell, fTag);\n\n if (i === 0 && originRange.sc === fTag) {\n originRange.sc = newCell;\n }\n if (i === len - 1 && originRange.ec === fTag) {\n originRange.ec = newCell;\n }\n\n if (util.isComponent(fTag)) {\n const isHR = /^HR$/i.test(fTag.nodeName);\n if (!isHR) newCell.innerHTML = '
    ';\n newCell.innerHTML += fTag.outerHTML;\n if (isHR) newCell.innerHTML += '
    ';\n } else {\n const fChildren = fTag.childNodes;\n while (fChildren[0]) {\n newCell.appendChild(fChildren[0]);\n }\n }\n list.appendChild(newCell);\n\n if (!next) lastList = list;\n if (!next || parentTag !== nextParent || util.isRangeFormatElement(siblingTag)) {\n if (!firstList) firstList = list;\n if ((!mergeTop || !next || parentTag !== nextParent) && !(next && util.isList(nextParent) && nextParent === originParent)) {\n if (list.parentNode !== parentTag) parentTag.insertBefore(list, siblingTag);\n }\n }\n\n util.removeItem(fTag);\n if (mergeTop && topNumber === null) topNumber = list.children.length - 1;\n if (next && (util.getRangeFormatElement(nextParent, passComponent) !== util.getRangeFormatElement(originParent, passComponent) || (util.isList(nextParent) && util.isList(originParent) && util.getElementDepth(nextParent) !== util.getElementDepth(originParent)))) {\n list = util.createElement(command);\n }\n\n if (rangeTag && rangeTag.children.length === 0) util.removeItem(rangeTag);\n }\n\n if (topNumber) {\n firstList = firstList.children[topNumber];\n }\n\n if (mergeBottom) {\n bottomNumber = list.children.length - 1;\n list.innerHTML += bottomEl.innerHTML;\n lastList = list.children[bottomNumber];\n util.removeItem(bottomEl);\n }\n }\n \n this.effectNode = null;\n return !isCollapsed ? originRange : afterRange;\n },\n\n _detachNested: function (cells) {\n const first = cells[0];\n const last = cells[cells.length - 1];\n const next = last.nextElementSibling;\n const originList = first.parentNode;\n const sibling = originList.parentNode.nextElementSibling;\n const parentNode = originList.parentNode.parentNode;\n\n for (let c = 0, cLen = cells.length; c < cLen; c++) {\n parentNode.insertBefore(cells[c], sibling);\n }\n\n if (next && originList.children.length > 0) {\n const newList = originList.cloneNode(false);\n const children = originList.childNodes;\n const index = this.util.getPositionIndex(next);\n while (children[index]) {\n newList.appendChild(children[index]);\n }\n last.appendChild(newList);\n }\n\n if (originList.children.length === 0) this.util.removeItem(originList);\n this.util.mergeSameTags(parentNode);\n\n const edge = this.util.getEdgeChildNodes(first, last);\n\n return {\n cc: first.parentNode,\n sc: edge.sc,\n ec: edge.ec\n };\n },\n\n editInsideList: function (remove, selectedCells) {\n selectedCells = !selectedCells ? this.getSelectedElements().filter(function (el) { return this.isListCell(el); }.bind(this.util)) : selectedCells;\n const cellsLen = selectedCells.length;\n if (cellsLen === 0 || (!remove && (!this.util.isListCell(selectedCells[0].previousElementSibling) && !this.util.isListCell(selectedCells[cellsLen - 1].nextElementSibling)))) {\n return {\n sc: selectedCells[0],\n so: 0,\n ec: selectedCells[cellsLen - 1],\n eo: 1\n };\n }\n\n let originList = selectedCells[0].parentNode;\n let lastCell = selectedCells[cellsLen - 1];\n let range = null;\n\n if (remove) {\n if (originList !== lastCell.parentNode && this.util.isList(lastCell.parentNode.parentNode) && lastCell.nextElementSibling) {\n lastCell = lastCell.nextElementSibling;\n while (lastCell) {\n selectedCells.push(lastCell);\n lastCell = lastCell.nextElementSibling;\n }\n }\n range = this.plugins.list.editList.call(this, originList.nodeName.toUpperCase(), selectedCells, true);\n } else {\n let innerList = this.util.createElement(originList.nodeName);\n let prev = selectedCells[0].previousElementSibling;\n let next = lastCell.nextElementSibling;\n const nodePath = { s: null, e: null, sl: originList, el: originList };\n\n for (let i = 0, len = cellsLen, c; i < len; i++) {\n c = selectedCells[i];\n if (c.parentNode !== originList) {\n this.plugins.list._insiedList.call(this, originList, innerList, prev, next, nodePath);\n originList = c.parentNode;\n innerList = this.util.createElement(originList.nodeName);\n }\n \n prev = c.previousElementSibling;\n next = c.nextElementSibling;\n innerList.appendChild(c);\n }\n \n this.plugins.list._insiedList.call(this, originList, innerList, prev, next, nodePath);\n\n const sc = this.util.getNodeFromPath(nodePath.s, nodePath.sl);\n const ec = this.util.getNodeFromPath(nodePath.e, nodePath.el);\n range = {\n sc: sc,\n so: 0,\n ec: ec,\n eo: ec.textContent.length\n };\n }\n\n return range;\n },\n\n _insiedList: function (originList, innerList, prev, next, nodePath) {\n let insertPrev = false;\n\n if (prev && innerList.tagName === prev.tagName) {\n const children = innerList.children;\n while (children[0]) {\n prev.appendChild(children[0]);\n }\n\n innerList = prev;\n insertPrev = true;\n }\n\n if (next && innerList.tagName === next.tagName) {\n const children = next.children;\n while (children[0]) {\n innerList.appendChild(children[0]);\n }\n\n const temp = next.nextElementSibling;\n next.parentNode.removeChild(next);\n next = temp;\n }\n\n if (!insertPrev) {\n if (this.util.isListCell(prev)) {\n originList = prev;\n next = null;\n }\n\n originList.insertBefore(innerList, next);\n\n if (!nodePath.s) {\n nodePath.s = this.util.getNodePath(innerList.firstElementChild.firstChild, originList, null);\n nodePath.sl = originList;\n }\n\n const slPath = originList.contains(nodePath.sl) ? this.util.getNodePath(nodePath.sl, originList) : null;\n nodePath.e = this.util.getNodePath(innerList.lastElementChild.firstChild, originList, null);\n nodePath.el = originList;\n\n this.util.mergeSameTags(originList, [nodePath.s, nodePath.e, slPath], false);\n this.util.mergeNestedTags(originList);\n if (slPath) nodePath.sl = this.util.getNodeFromPath(slPath, originList);\n }\n\n return innerList;\n },\n\n pickup: function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n let target = e.target;\n let command = '';\n\n while (!command && !/^UL$/i.test(target.tagName)) {\n command = target.getAttribute('data-command');\n target = target.parentNode;\n }\n\n if (!command) return;\n\n const range = this.plugins.list.editList.call(this, command, null, false);\n if (range) this.setRange(range.sc, range.so, range.ec, range.eo);\n\n this.submenuOff();\n\n // history stack\n this.history.push(false);\n }\n};\n","/*\r\n * wysiwyg web editor\r\n *\r\n * suneditor.js\r\n * Copyright 2017 JiHong Lee.\r\n * MIT license.\r\n */\r\n'use strict';\r\n\r\nexport default {\r\n name: 'table',\r\n display: 'submenu',\r\n add: function (core, targetElement) {\r\n const context = core.context;\r\n let contextTable = context.table = {\r\n _element: null,\r\n _tdElement: null,\r\n _trElement: null,\r\n _trElements: null,\r\n _tableXY: [],\r\n _maxWidth: true,\r\n _fixedColumn: false,\r\n _rtl: core.options.rtl,\r\n cellControllerTop: core.options.tableCellControllerPosition === 'top',\r\n resizeText: null,\r\n headerButton: null,\r\n mergeButton: null,\r\n splitButton: null,\r\n splitMenu: null,\r\n maxText: core.lang.controller.maxSize,\r\n minText: core.lang.controller.minSize,\r\n _physical_cellCnt: 0,\r\n _logical_cellCnt: 0,\r\n _rowCnt: 0,\r\n _rowIndex: 0,\r\n _physical_cellIndex: 0,\r\n _logical_cellIndex: 0,\r\n _current_colSpan: 0,\r\n _current_rowSpan: 0,\r\n icons: {\r\n expansion: core.icons.expansion,\r\n reduction: core.icons.reduction\r\n }\r\n };\r\n\r\n /** set submenu */\r\n let listDiv = this.setSubmenu(core);\r\n let tablePicker = listDiv.querySelector('.se-controller-table-picker');\r\n\r\n contextTable.tableHighlight = listDiv.querySelector('.se-table-size-highlighted');\r\n contextTable.tableUnHighlight = listDiv.querySelector('.se-table-size-unhighlighted');\r\n contextTable.tableDisplay = listDiv.querySelector('.se-table-size-display');\r\n if (core.options.rtl) contextTable.tableHighlight.style.left = (10 * 18 - 13) + 'px';\r\n\r\n /** set table controller */\r\n let tableController = this.setController_table(core);\r\n contextTable.tableController = tableController;\r\n contextTable.resizeButton = tableController.querySelector('._se_table_resize');\r\n contextTable.resizeText = tableController.querySelector('._se_table_resize > span > span');\r\n contextTable.columnFixedButton = tableController.querySelector('._se_table_fixed_column');\r\n contextTable.headerButton = tableController.querySelector('._se_table_header');\r\n\r\n /** set resizing */\r\n let resizeDiv = this.setController_tableEditor(core, contextTable.cellControllerTop);\r\n contextTable.resizeDiv = resizeDiv;\r\n contextTable.splitMenu = resizeDiv.querySelector('.se-btn-group-sub');\r\n contextTable.mergeButton = resizeDiv.querySelector('._se_table_merge_button');\r\n contextTable.splitButton = resizeDiv.querySelector('._se_table_split_button');\r\n contextTable.insertRowAboveButton = resizeDiv.querySelector('._se_table_insert_row_a');\r\n contextTable.insertRowBelowButton = resizeDiv.querySelector('._se_table_insert_row_b');\r\n \r\n /** add event listeners */\r\n tablePicker.addEventListener('mousemove', this.onMouseMove_tablePicker.bind(core, contextTable));\r\n tablePicker.addEventListener('click', this.appendTable.bind(core));\r\n resizeDiv.addEventListener('click', this.onClick_tableController.bind(core));\r\n tableController.addEventListener('click', this.onClick_tableController.bind(core));\r\n\r\n /** append target button menu */\r\n core.initMenuTarget(this.name, targetElement, listDiv);\r\n\r\n /** append controller */\r\n context.element.relative.appendChild(resizeDiv);\r\n context.element.relative.appendChild(tableController);\r\n\r\n /** empty memory */\r\n listDiv = null, tablePicker = null, resizeDiv = null, tableController = null, contextTable = null;\r\n },\r\n\r\n setSubmenu: function (core) {\r\n const listDiv = core.util.createElement('DIV');\r\n listDiv.className = 'se-submenu se-selector-table';\r\n listDiv.innerHTML = '' +\r\n '
    ' +\r\n '
    ' +\r\n '
    ' +\r\n '
    ' +\r\n '
    ' +\r\n '
    1 x 1
    ';\r\n\r\n return listDiv;\r\n },\r\n\r\n setController_table: function (core) {\r\n const lang = core.lang;\r\n const icons = core.icons;\r\n const tableResize = core.util.createElement('DIV');\r\n\r\n tableResize.className = 'se-controller se-controller-table';\r\n tableResize.innerHTML = '' +\r\n '
    ' +\r\n '
    ' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
    ' +\r\n '
    ';\r\n\r\n return tableResize;\r\n },\r\n\r\n setController_tableEditor: function (core, cellControllerTop) {\r\n const lang = core.lang;\r\n const icons = core.icons;\r\n const tableResize = core.util.createElement('DIV');\r\n\r\n tableResize.className = 'se-controller se-controller-table-cell';\r\n tableResize.innerHTML = (cellControllerTop ? '' : '
    ') +\r\n '
    ' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
    ' +\r\n '
    ' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
    ' +\r\n '
    ' +\r\n '
      ' +\r\n '
    • ' + \r\n lang.controller.VerticalSplit + '
    • ' +\r\n '
    • ' + \r\n lang.controller.HorizontalSplit + '
    • ' +\r\n '
    ' +\r\n '
    ' +\r\n '
    ' +\r\n '
    ';\r\n\r\n return tableResize;\r\n },\r\n\r\n appendTable: function () {\r\n const oTable = this.util.createElement('TABLE');\r\n const createCells = this.plugins.table.createCells;\r\n\r\n const x = this.context.table._tableXY[0];\r\n let y = this.context.table._tableXY[1];\r\n let tableHTML = '';\r\n while (y > 0) {\r\n tableHTML += '' + createCells.call(this, 'td', x) + '';\r\n --y;\r\n }\r\n tableHTML += '';\r\n oTable.innerHTML = tableHTML;\r\n\r\n const changed = this.insertComponent(oTable, false, true, false);\r\n \r\n if (changed) {\r\n const firstTd = oTable.querySelector('td div');\r\n this.setRange(firstTd, 0, firstTd, 0);\r\n this.plugins.table.reset_table_picker.call(this);\r\n }\r\n },\r\n\r\n createCells: function (nodeName, cnt, returnElement) {\r\n nodeName = nodeName.toLowerCase();\r\n\r\n if (!returnElement) {\r\n let cellsHTML = '';\r\n while (cnt > 0) {\r\n cellsHTML += '<' +nodeName + '>

    ';\r\n cnt--;\r\n }\r\n return cellsHTML;\r\n } else {\r\n const cell = this.util.createElement(nodeName);\r\n cell.innerHTML = '

    ';\r\n return cell;\r\n }\r\n },\r\n\r\n onMouseMove_tablePicker: function (contextTable, e) {\r\n e.stopPropagation();\r\n\r\n let x = this._w.Math.ceil(e.offsetX / 18);\r\n let y = this._w.Math.ceil(e.offsetY / 18);\r\n x = x < 1 ? 1 : x;\r\n y = y < 1 ? 1 : y;\r\n \r\n if (contextTable._rtl) {\r\n contextTable.tableHighlight.style.left = (x * 18 - 13) + 'px';\r\n x = 11 - x;\r\n }\r\n \r\n contextTable.tableHighlight.style.width = x + 'em';\r\n contextTable.tableHighlight.style.height = y + 'em';\r\n\r\n // let x_u = x < 5 ? 5 : (x > 9 ? 10 : x + 1);\r\n // let y_u = y < 5 ? 5 : (y > 9 ? 10 : y + 1);\r\n // contextTable.tableUnHighlight.style.width = x_u + 'em';\r\n // contextTable.tableUnHighlight.style.height = y_u + 'em';\r\n\r\n this.util.changeTxt(contextTable.tableDisplay, x + ' x ' + y);\r\n contextTable._tableXY = [x, y];\r\n },\r\n\r\n reset_table_picker: function () {\r\n if (!this.context.table.tableHighlight) return;\r\n\r\n const highlight = this.context.table.tableHighlight.style;\r\n const unHighlight = this.context.table.tableUnHighlight.style;\r\n\r\n highlight.width = '1em';\r\n highlight.height = '1em';\r\n unHighlight.width = '10em';\r\n unHighlight.height = '10em';\r\n\r\n this.util.changeTxt(this.context.table.tableDisplay, '1 x 1');\r\n this.submenuOff();\r\n },\r\n\r\n init: function () {\r\n const contextTable = this.context.table;\r\n const tablePlugin = this.plugins.table;\r\n\r\n tablePlugin._removeEvents.call(this);\r\n\r\n if (tablePlugin._selectedTable) {\r\n const selectedCells = tablePlugin._selectedTable.querySelectorAll('.se-table-selected-cell');\r\n for (let i = 0, len = selectedCells.length; i < len; i++) {\r\n this.util.removeClass(selectedCells[i], 'se-table-selected-cell');\r\n }\r\n }\r\n\r\n tablePlugin._toggleEditor.call(this, true);\r\n\r\n contextTable._element = null;\r\n contextTable._tdElement = null;\r\n contextTable._trElement = null;\r\n contextTable._trElements = null;\r\n contextTable._tableXY = [];\r\n contextTable._maxWidth = true;\r\n contextTable._fixedColumn = false;\r\n contextTable._physical_cellCnt = 0;\r\n contextTable._logical_cellCnt = 0;\r\n contextTable._rowCnt = 0;\r\n contextTable._rowIndex = 0;\r\n contextTable._physical_cellIndex = 0;\r\n contextTable._logical_cellIndex = 0;\r\n contextTable._current_colSpan = 0;\r\n contextTable._current_rowSpan = 0;\r\n\r\n tablePlugin._shift = false;\r\n tablePlugin._selectedCells = null;\r\n tablePlugin._selectedTable = null;\r\n tablePlugin._ref = null;\r\n\r\n tablePlugin._fixedCell = null;\r\n tablePlugin._selectedCell = null;\r\n tablePlugin._fixedCellName = null;\r\n },\r\n\r\n /** table edit controller */\r\n call_controller_tableEdit: function (tdElement) {\r\n const tablePlugin = this.plugins.table;\r\n const contextTable = this.context.table;\r\n\r\n if (!this.getSelection().isCollapsed && !tablePlugin._selectedCell) {\r\n this.controllersOff();\r\n this.util.removeClass(tdElement, 'se-table-selected-cell');\r\n return;\r\n }\r\n\r\n const tableElement = contextTable._element || this.plugins.table._selectedTable || this.util.getParentElement(tdElement, 'TABLE');\r\n contextTable._maxWidth = this.util.hasClass(tableElement, 'se-table-size-100') || tableElement.style.width === '100%' || (!tableElement.style.width && !this.util.hasClass(tableElement, 'se-table-size-auto'));\r\n contextTable._fixedColumn = this.util.hasClass(tableElement, 'se-table-layout-fixed') || tableElement.style.tableLayout === 'fixed';\r\n tablePlugin.setTableStyle.call(this, contextTable._maxWidth ? 'width|column' : 'width');\r\n \r\n tablePlugin.setPositionControllerTop.call(this, tableElement);\r\n tablePlugin.setPositionControllerDiv.call(this, tdElement, tablePlugin._shift);\r\n \r\n if (!tablePlugin._shift) this.controllersOn(contextTable.resizeDiv, contextTable.tableController, tablePlugin.init.bind(this), tdElement, 'table');\r\n },\r\n\r\n setPositionControllerTop: function (tableElement) {\r\n this.setControllerPosition(this.context.table.tableController, tableElement, 'top', {left: 0, top: 0});\r\n },\r\n\r\n setPositionControllerDiv: function (tdElement, reset) {\r\n const contextTable = this.context.table;\r\n const resizeDiv = contextTable.resizeDiv;\r\n \r\n this.plugins.table.setCellInfo.call(this, tdElement, reset);\r\n \r\n if (contextTable.cellControllerTop) {\r\n this.setControllerPosition(resizeDiv, contextTable._element, 'top', {left: contextTable.tableController.offsetWidth, top: 0});\r\n } else {\r\n this.setControllerPosition(resizeDiv, tdElement, 'bottom', {left: 0, top: 0});\r\n }\r\n },\r\n\r\n setCellInfo: function (tdElement, reset) {\r\n const contextTable = this.context.table;\r\n const table = contextTable._element = this.plugins.table._selectedTable || this.util.getParentElement(tdElement, 'TABLE');\r\n\r\n if (/THEAD/i.test(table.firstElementChild.nodeName)) {\r\n this.util.addClass(contextTable.headerButton, 'active');\r\n } else {\r\n this.util.removeClass(contextTable.headerButton, 'active');\r\n }\r\n\r\n if (reset || contextTable._physical_cellCnt === 0) {\r\n if (contextTable._tdElement !== tdElement) {\r\n contextTable._tdElement = tdElement;\r\n contextTable._trElement = tdElement.parentNode;\r\n }\r\n\r\n const rows = contextTable._trElements = table.rows;\r\n const cellIndex = tdElement.cellIndex;\r\n\r\n let cellCnt = 0;\r\n for (let i = 0, cells = rows[0].cells, len = rows[0].cells.length; i < len; i++) {\r\n cellCnt += cells[i].colSpan;\r\n }\r\n\r\n // row cnt, row index\r\n const rowIndex = contextTable._rowIndex = contextTable._trElement.rowIndex;\r\n contextTable._rowCnt = rows.length;\r\n\r\n // cell cnt, physical cell index\r\n contextTable._physical_cellCnt = contextTable._trElement.cells.length;\r\n contextTable._logical_cellCnt = cellCnt;\r\n contextTable._physical_cellIndex = cellIndex;\r\n\r\n // span\r\n contextTable._current_colSpan = contextTable._tdElement.colSpan - 1;\r\n contextTable._current_rowSpan - contextTable._trElement.cells[cellIndex].rowSpan - 1;\r\n\r\n // find logcal cell index\r\n let rowSpanArr = [];\r\n let spanIndex = [];\r\n for (let i = 0, cells, colSpan; i <= rowIndex; i++) {\r\n cells = rows[i].cells;\r\n colSpan = 0;\r\n for (let c = 0, cLen = cells.length, cell, cs, rs, logcalIndex; c < cLen; c++) {\r\n cell = cells[c];\r\n cs = cell.colSpan - 1;\r\n rs = cell.rowSpan - 1;\r\n logcalIndex = c + colSpan;\r\n\r\n if (spanIndex.length > 0) {\r\n for (let r = 0, arr; r < spanIndex.length; r++) {\r\n arr = spanIndex[r];\r\n if (arr.row > i) continue;\r\n if (logcalIndex >= arr.index) {\r\n colSpan += arr.cs;\r\n logcalIndex += arr.cs;\r\n arr.rs -= 1;\r\n arr.row = i + 1;\r\n if (arr.rs < 1) {\r\n spanIndex.splice(r, 1);\r\n r--;\r\n } \r\n } else if (c === cLen - 1) {\r\n arr.rs -= 1;\r\n arr.row = i + 1;\r\n if (arr.rs < 1) {\r\n spanIndex.splice(r, 1);\r\n r--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // logcal cell index\r\n if (i === rowIndex && c === cellIndex) {\r\n contextTable._logical_cellIndex = logcalIndex;\r\n break;\r\n }\r\n\r\n if (rs > 0) {\r\n rowSpanArr.push({\r\n index: logcalIndex,\r\n cs: cs + 1,\r\n rs: rs,\r\n row: -1\r\n });\r\n }\r\n \r\n colSpan += cs;\r\n }\r\n\r\n spanIndex = spanIndex.concat(rowSpanArr).sort(function (a, b) {return a.index - b.index;});\r\n rowSpanArr = [];\r\n }\r\n\r\n rowSpanArr = null;\r\n spanIndex = null;\r\n }\r\n },\r\n\r\n editTable: function (type, option) {\r\n const tablePlugin = this.plugins.table;\r\n const contextTable = this.context.table;\r\n const table = contextTable._element;\r\n const isRow = type === 'row';\r\n\r\n if (isRow) {\r\n const tableAttr = contextTable._trElement.parentNode;\r\n if (/^THEAD$/i.test(tableAttr.nodeName)) {\r\n if (option === 'up') {\r\n return;\r\n } else if (!tableAttr.nextElementSibling || !/^TBODY$/i.test(tableAttr.nextElementSibling.nodeName)) {\r\n table.innerHTML += '' + tablePlugin.createCells.call(this, 'td', contextTable._logical_cellCnt, false) + '';\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // multi\r\n if (tablePlugin._ref) {\r\n const positionCell = contextTable._tdElement;\r\n const selectedCells = tablePlugin._selectedCells;\r\n // multi - row\r\n if (isRow) {\r\n // remove row\r\n if (!option) {\r\n let row = selectedCells[0].parentNode;\r\n const removeCells = [selectedCells[0]];\r\n\r\n for (let i = 1, len = selectedCells.length, cell; i < len; i++) {\r\n cell = selectedCells[i];\r\n if (row !== cell.parentNode) {\r\n removeCells.push(cell);\r\n row = cell.parentNode;\r\n }\r\n }\r\n\r\n for (let i = 0, len = removeCells.length; i < len; i++) {\r\n tablePlugin.setCellInfo.call(this, removeCells[i], true);\r\n tablePlugin.editRow.call(this, option);\r\n }\r\n } else { // edit row\r\n tablePlugin.setCellInfo.call(this, option === 'up' ? selectedCells[0] : selectedCells[selectedCells.length - 1], true);\r\n tablePlugin.editRow.call(this, option, positionCell);\r\n }\r\n } else { // multi - cell\r\n const firstRow = selectedCells[0].parentNode;\r\n // remove cell\r\n if (!option) {\r\n const removeCells = [selectedCells[0]];\r\n \r\n for (let i = 1, len = selectedCells.length, cell; i < len; i++) {\r\n cell = selectedCells[i];\r\n if (firstRow === cell.parentNode) {\r\n removeCells.push(cell);\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n for (let i = 0, len = removeCells.length; i < len; i++) {\r\n tablePlugin.setCellInfo.call(this, removeCells[i], true);\r\n tablePlugin.editCell.call(this, option);\r\n }\r\n } else { // edit cell\r\n let rightCell = null;\r\n\r\n for (let i = 0, len = selectedCells.length - 1; i < len; i++) {\r\n if (firstRow !== selectedCells[i + 1].parentNode) {\r\n rightCell = selectedCells[i];\r\n break;\r\n }\r\n }\r\n\r\n tablePlugin.setCellInfo.call(this, option === 'left' ? selectedCells[0] : rightCell || selectedCells[0], true);\r\n tablePlugin.editCell.call(this, option, positionCell);\r\n }\r\n }\r\n\r\n if (!option) tablePlugin.init.call(this);\r\n } // one\r\n else {\r\n tablePlugin[isRow ? 'editRow' : 'editCell'].call(this, option);\r\n }\r\n\r\n // after remove\r\n if (!option) {\r\n const children = table.children;\r\n for (let i = 0; i < children.length; i++) {\r\n if (children[i].children.length === 0) {\r\n this.util.removeItem(children[i]);\r\n i--;\r\n }\r\n }\r\n\r\n if (table.children.length === 0) this.util.removeItem(table);\r\n }\r\n },\r\n\r\n editRow: function (option, positionResetElement) {\r\n const contextTable = this.context.table;\r\n const remove = !option;\r\n\r\n const up = option === 'up';\r\n const originRowIndex = contextTable._rowIndex;\r\n const rowIndex = remove || up ? originRowIndex : originRowIndex + contextTable._current_rowSpan + 1;\r\n const sign = remove ? -1 : 1;\r\n \r\n const rows = contextTable._trElements;\r\n let cellCnt = contextTable._logical_cellCnt;\r\n\r\n for (let i = 0, len = originRowIndex + (remove ? -1 : 0), cell; i <= len; i++) {\r\n cell = rows[i].cells;\r\n if (cell.length === 0) return;\r\n \r\n for (let c = 0, cLen = cell.length, rs, cs; c < cLen; c++) {\r\n rs = cell[c].rowSpan;\r\n cs = cell[c].colSpan;\r\n if (rs < 2 && cs < 2) continue;\r\n\r\n if (rs + i > rowIndex && rowIndex > i) {\r\n cell[c].rowSpan = rs + sign;\r\n cellCnt -= cs;\r\n }\r\n }\r\n }\r\n\r\n if (remove) {\r\n const next = rows[originRowIndex + 1];\r\n if (next) {\r\n const spanCells = [];\r\n let cells = rows[originRowIndex].cells;\r\n let colSpan = 0;\r\n\r\n for (let i = 0, len = cells.length, cell, logcalIndex; i < len; i++) {\r\n cell = cells[i];\r\n logcalIndex = i + colSpan;\r\n colSpan += cell.colSpan - 1;\r\n\r\n if (cell.rowSpan > 1) {\r\n cell.rowSpan -= 1;\r\n spanCells.push({cell: cell.cloneNode(false), index: logcalIndex});\r\n }\r\n }\r\n\r\n if (spanCells.length > 0) {\r\n let spanCell = spanCells.shift();\r\n cells = next.cells;\r\n colSpan = 0;\r\n\r\n for (let i = 0, len = cells.length, cell, logcalIndex; i < len; i++) {\r\n cell = cells[i];\r\n logcalIndex = i + colSpan;\r\n colSpan += cell.colSpan - 1;\r\n \r\n if (logcalIndex >= spanCell.index) {\r\n i--, colSpan--;\r\n colSpan += spanCell.cell.colSpan - 1;\r\n next.insertBefore(spanCell.cell, cell);\r\n spanCell = spanCells.shift();\r\n if (!spanCell) break;\r\n }\r\n }\r\n\r\n if (spanCell) {\r\n next.appendChild(spanCell.cell);\r\n for (let i = 0, len = spanCells.length; i < len; i++) {\r\n next.appendChild(spanCells[i].cell);\r\n }\r\n }\r\n }\r\n }\r\n\r\n contextTable._element.deleteRow(rowIndex);\r\n } else {\r\n const newRow = contextTable._element.insertRow(rowIndex);\r\n newRow.innerHTML = this.plugins.table.createCells.call(this, 'td', cellCnt, false);\r\n }\r\n\r\n if (!remove) {\r\n this.plugins.table.setPositionControllerDiv.call(this, positionResetElement || contextTable._tdElement, true);\r\n } else {\r\n this.controllersOff();\r\n }\r\n },\r\n\r\n editCell: function (option, positionResetElement) {\r\n const contextTable = this.context.table;\r\n const util = this.util;\r\n const remove = !option;\r\n\r\n const left = option === 'left';\r\n const colSpan = contextTable._current_colSpan;\r\n const cellIndex = remove || left ? contextTable._logical_cellIndex : contextTable._logical_cellIndex + colSpan + 1;\r\n\r\n const rows = contextTable._trElements;\r\n let rowSpanArr = [];\r\n let spanIndex = [];\r\n let passCell = 0;\r\n const removeCell = [];\r\n const removeSpanArr = [];\r\n\r\n for (let i = 0, len = contextTable._rowCnt, row, insertIndex, cells, newCell, applySpan, cellColSpan; i < len; i++) {\r\n row = rows[i];\r\n insertIndex = cellIndex;\r\n applySpan = false;\r\n cells = row.cells;\r\n cellColSpan = 0;\r\n\r\n for (let c = 0, cell, cLen = cells.length, rs, cs, removeIndex; c < cLen; c++) {\r\n cell = cells[c];\r\n if (!cell) break;\r\n\r\n rs = cell.rowSpan - 1;\r\n cs = cell.colSpan - 1;\r\n\r\n if (!remove) {\r\n if (c >= insertIndex) break;\r\n if (cs > 0) {\r\n if (passCell < 1 && cs + c >= insertIndex) {\r\n cell.colSpan += 1;\r\n insertIndex = null;\r\n passCell = rs + 1;\r\n break;\r\n }\r\n\r\n insertIndex -= cs;\r\n }\r\n\r\n if (!applySpan) {\r\n for (let r = 0, arr; r < spanIndex.length; r++) {\r\n arr = spanIndex[r];\r\n insertIndex -= arr.cs;\r\n arr.rs -= 1;\r\n if (arr.rs < 1) {\r\n spanIndex.splice(r, 1);\r\n r--;\r\n } \r\n }\r\n applySpan = true;\r\n }\r\n } else {\r\n removeIndex = c + cellColSpan;\r\n\r\n if (spanIndex.length > 0) {\r\n const lastCell = !cells[c + 1];\r\n for (let r = 0, arr; r < spanIndex.length; r++) {\r\n arr = spanIndex[r];\r\n if (arr.row > i) continue;\r\n\r\n if (removeIndex >= arr.index) {\r\n cellColSpan += arr.cs;\r\n removeIndex = c + cellColSpan;\r\n arr.rs -= 1;\r\n arr.row = i + 1;\r\n if (arr.rs < 1) {\r\n spanIndex.splice(r, 1);\r\n r--;\r\n } \r\n } else if (lastCell) {\r\n arr.rs -= 1;\r\n arr.row = i + 1;\r\n if (arr.rs < 1) {\r\n spanIndex.splice(r, 1);\r\n r--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (rs > 0) {\r\n rowSpanArr.push({\r\n rs: rs,\r\n cs: cs + 1,\r\n index: removeIndex,\r\n row: -1\r\n });\r\n }\r\n\r\n if (removeIndex >= insertIndex && removeIndex + cs <= insertIndex + colSpan) {\r\n removeCell.push(cell);\r\n } else if (removeIndex <= insertIndex + colSpan && removeIndex + cs >= insertIndex) {\r\n cell.colSpan -= util.getOverlapRangeAtIndex(cellIndex, cellIndex + colSpan, removeIndex, removeIndex + cs); \r\n } else if (rs > 0 && (removeIndex < insertIndex || removeIndex + cs > insertIndex + colSpan)) {\r\n removeSpanArr.push({\r\n cell: cell,\r\n i: i,\r\n rs: i + rs\r\n });\r\n }\r\n\r\n cellColSpan += cs;\r\n }\r\n }\r\n\r\n spanIndex = spanIndex.concat(rowSpanArr).sort(function (a, b) {return a.index - b.index;});\r\n rowSpanArr = [];\r\n\r\n if (!remove) {\r\n if (passCell > 0) {\r\n passCell -= 1;\r\n continue;\r\n }\r\n\r\n if (insertIndex !== null && cells.length > 0) {\r\n newCell = this.plugins.table.createCells.call(this, cells[0].nodeName, 0, true);\r\n newCell = row.insertBefore(newCell, cells[insertIndex]);\r\n }\r\n }\r\n }\r\n\r\n if (remove) {\r\n let removeFirst, removeEnd;\r\n for (let r = 0, rLen = removeCell.length, row; r < rLen; r++) {\r\n row = removeCell[r].parentNode;\r\n util.removeItem(removeCell[r]);\r\n if (row.cells.length === 0) {\r\n if (!removeFirst) removeFirst = util.getArrayIndex(rows, row);\r\n removeEnd = util.getArrayIndex(rows, row);\r\n util.removeItem(row);\r\n }\r\n }\r\n\r\n for (let c = 0, cLen = removeSpanArr.length, rowSpanCell; c < cLen; c++) {\r\n rowSpanCell = removeSpanArr[c];\r\n rowSpanCell.cell.rowSpan = util.getOverlapRangeAtIndex(removeFirst, removeEnd, rowSpanCell.i, rowSpanCell.rs);\r\n }\r\n\r\n this.controllersOff();\r\n } else {\r\n this.plugins.table.setPositionControllerDiv.call(this, positionResetElement || contextTable._tdElement, true);\r\n }\r\n },\r\n\r\n _closeSplitMenu: null,\r\n openSplitMenu: function () {\r\n this.util.addClass(this.context.table.splitButton, 'on');\r\n this.context.table.splitMenu.style.display = 'inline-table';\r\n\r\n this.plugins.table._closeSplitMenu = function () {\r\n this.util.removeClass(this.context.table.splitButton, 'on');\r\n this.context.table.splitMenu.style.display = 'none';\r\n this.removeDocEvent('click', this.plugins.table._closeSplitMenu);\r\n this.plugins.table._closeSplitMenu = null;\r\n }.bind(this);\r\n\r\n this.addDocEvent('click', this.plugins.table._closeSplitMenu);\r\n },\r\n\r\n splitCells: function (direction) {\r\n const util = this.util;\r\n const vertical = direction === 'vertical';\r\n const contextTable = this.context.table;\r\n const currentCell = contextTable._tdElement;\r\n const rows = contextTable._trElements;\r\n const currentRow = contextTable._trElement;\r\n const index = contextTable._logical_cellIndex;\r\n const rowIndex = contextTable._rowIndex;\r\n const newCell = this.plugins.table.createCells.call(this, currentCell.nodeName, 0, true);\r\n\r\n // vertical\r\n if (vertical) {\r\n const currentColSpan = currentCell.colSpan;\r\n newCell.rowSpan = currentCell.rowSpan;\r\n\r\n // colspan > 1\r\n if (currentColSpan > 1) {\r\n newCell.colSpan = this._w.Math.floor(currentColSpan/2);\r\n currentCell.colSpan = currentColSpan - newCell.colSpan;\r\n currentRow.insertBefore(newCell, currentCell.nextElementSibling);\r\n } else { // colspan - 1\r\n let rowSpanArr = [];\r\n let spanIndex = [];\r\n\r\n for (let i = 0, len = contextTable._rowCnt, cells, colSpan; i < len; i++) {\r\n cells = rows[i].cells;\r\n colSpan = 0;\r\n for (let c = 0, cLen = cells.length, cell, cs, rs, logcalIndex; c < cLen; c++) {\r\n cell = cells[c];\r\n cs = cell.colSpan - 1;\r\n rs = cell.rowSpan - 1;\r\n logcalIndex = c + colSpan;\r\n\r\n if (spanIndex.length > 0) {\r\n for (let r = 0, arr; r < spanIndex.length; r++) {\r\n arr = spanIndex[r];\r\n if (arr.row > i) continue;\r\n if (logcalIndex >= arr.index) {\r\n colSpan += arr.cs;\r\n logcalIndex += arr.cs;\r\n arr.rs -= 1;\r\n arr.row = i + 1;\r\n if (arr.rs < 1) {\r\n spanIndex.splice(r, 1);\r\n r--;\r\n } \r\n } else if (c === cLen - 1) {\r\n arr.rs -= 1;\r\n arr.row = i + 1;\r\n if (arr.rs < 1) {\r\n spanIndex.splice(r, 1);\r\n r--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (logcalIndex <= index && rs > 0) {\r\n rowSpanArr.push({\r\n index: logcalIndex,\r\n cs: cs + 1,\r\n rs: rs,\r\n row: -1\r\n });\r\n }\r\n\r\n if (cell !== currentCell && logcalIndex <= index && logcalIndex + cs >= index + currentColSpan - 1) {\r\n cell.colSpan += 1;\r\n break;\r\n }\r\n\r\n if (logcalIndex > index) break;\r\n \r\n colSpan += cs;\r\n }\r\n\r\n spanIndex = spanIndex.concat(rowSpanArr).sort(function (a, b) {return a.index - b.index;});\r\n rowSpanArr = [];\r\n }\r\n\r\n currentRow.insertBefore(newCell, currentCell.nextElementSibling);\r\n }\r\n } else { // horizontal\r\n const currentRowSpan = currentCell.rowSpan;\r\n newCell.colSpan = currentCell.colSpan;\r\n\r\n // rowspan > 1\r\n if (currentRowSpan > 1) {\r\n newCell.rowSpan = this._w.Math.floor(currentRowSpan/2);\r\n const newRowSpan = currentRowSpan - newCell.rowSpan;\r\n\r\n const rowSpanArr = [];\r\n const nextRowIndex = util.getArrayIndex(rows, currentRow) + newRowSpan;\r\n\r\n for (let i = 0, cells, colSpan; i < nextRowIndex; i++) {\r\n cells = rows[i].cells;\r\n colSpan = 0;\r\n for (let c = 0, cLen = cells.length, cell, cs, logcalIndex; c < cLen; c++) {\r\n logcalIndex = c + colSpan;\r\n if (logcalIndex >= index) break;\r\n\r\n cell = cells[c];\r\n cs = cell.rowSpan - 1;\r\n if (cs > 0 && cs + i >= nextRowIndex && logcalIndex < index) {\r\n rowSpanArr.push({\r\n index: logcalIndex,\r\n cs: cell.colSpan\r\n });\r\n }\r\n colSpan += cell.colSpan - 1;\r\n }\r\n }\r\n\r\n const nextRow = rows[nextRowIndex];\r\n const nextCells = nextRow.cells;\r\n let rs = rowSpanArr.shift();\r\n\r\n for (let c = 0, cLen = nextCells.length, colSpan = 0, cell, cs, logcalIndex, insertIndex; c < cLen; c++) {\r\n logcalIndex = c + colSpan;\r\n cell = nextCells[c];\r\n cs = cell.colSpan - 1;\r\n insertIndex = logcalIndex + cs + 1;\r\n\r\n if (rs && insertIndex >= rs.index) {\r\n colSpan += rs.cs;\r\n insertIndex += rs.cs;\r\n rs = rowSpanArr.shift();\r\n }\r\n \r\n if (insertIndex >= index || c === cLen - 1) {\r\n nextRow.insertBefore(newCell, cell.nextElementSibling);\r\n break;\r\n }\r\n\r\n colSpan += cs;\r\n }\r\n\r\n currentCell.rowSpan = newRowSpan;\r\n } else { // rowspan - 1\r\n newCell.rowSpan = currentCell.rowSpan;\r\n const newRow = util.createElement('TR');\r\n newRow.appendChild(newCell);\r\n\r\n for (let i = 0, cells; i < rowIndex; i++) {\r\n cells = rows[i].cells;\r\n if (cells.length === 0) return;\r\n\r\n for (let c = 0, cLen = cells.length; c < cLen; c++) {\r\n if (i + cells[c].rowSpan - 1 >= rowIndex) {\r\n cells[c].rowSpan += 1;\r\n }\r\n }\r\n }\r\n\r\n const physicalIndex = contextTable._physical_cellIndex;\r\n const cells = currentRow.cells;\r\n\r\n for (let c = 0, cLen = cells.length; c < cLen; c++) {\r\n if (c === physicalIndex) continue; \r\n cells[c].rowSpan += 1; \r\n }\r\n\r\n currentRow.parentNode.insertBefore(newRow, currentRow.nextElementSibling);\r\n }\r\n }\r\n\r\n this.focusEdge(currentCell);\r\n this.plugins.table.setPositionControllerDiv.call(this, currentCell, true);\r\n },\r\n\r\n mergeCells: function () {\r\n const tablePlugin = this.plugins.table;\r\n const contextTable = this.context.table;\r\n const util = this.util;\r\n\r\n const ref = tablePlugin._ref;\r\n const selectedCells = tablePlugin._selectedCells;\r\n const mergeCell = selectedCells[0];\r\n \r\n let emptyRowFirst = null;\r\n let emptyRowLast = null;\r\n let cs = (ref.ce - ref.cs) + 1;\r\n let rs = (ref.re - ref.rs) + 1;\r\n let mergeHTML = '';\r\n let row = null;\r\n\r\n for (let i = 1, len = selectedCells.length, cell, ch; i < len; i++) {\r\n cell = selectedCells[i];\r\n if (row !== cell.parentNode) row = cell.parentNode;\r\n\r\n ch = cell.children;\r\n for (let c = 0, cLen = ch.length; c < cLen; c++) {\r\n if (util.isFormatElement(ch[c]) && util.onlyZeroWidthSpace(ch[c].textContent)) {\r\n util.removeItem(ch[c]);\r\n } \r\n }\r\n\r\n mergeHTML += cell.innerHTML;\r\n util.removeItem(cell);\r\n\r\n if (row.cells.length === 0) {\r\n if (!emptyRowFirst) emptyRowFirst = row;\r\n else emptyRowLast = row;\r\n rs -= 1;\r\n }\r\n }\r\n\r\n if (emptyRowFirst) {\r\n const rows = contextTable._trElements;\r\n const rowIndexFirst = util.getArrayIndex(rows, emptyRowFirst);\r\n const rowIndexLast = util.getArrayIndex(rows, emptyRowLast || emptyRowFirst);\r\n const removeRows = [];\r\n \r\n for (let i = 0, cells; i <= rowIndexLast; i++) {\r\n cells = rows[i].cells;\r\n if (cells.length === 0) {\r\n removeRows.push(rows[i]);\r\n continue;\r\n }\r\n \r\n for (let c = 0, cLen = cells.length, cell, rs; c < cLen; c++) {\r\n cell = cells[c];\r\n rs = cell.rowSpan - 1;\r\n if (rs > 0 && i + rs >= rowIndexFirst) {\r\n cell.rowSpan -= util.getOverlapRangeAtIndex(rowIndexFirst, rowIndexLast, i, i + rs);\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0, len = removeRows.length; i < len; i++) {\r\n util.removeItem(removeRows[i]);\r\n }\r\n }\r\n\r\n mergeCell.innerHTML += mergeHTML;\r\n mergeCell.colSpan = cs;\r\n mergeCell.rowSpan = rs;\r\n\r\n this.controllersOff();\r\n tablePlugin.setActiveButton.call(this, true, false);\r\n tablePlugin.call_controller_tableEdit.call(this, mergeCell);\r\n\r\n util.addClass(mergeCell, 'se-table-selected-cell');\r\n this.focusEdge(mergeCell);\r\n },\r\n\r\n toggleHeader: function () {\r\n const util = this.util;\r\n const headerButton = this.context.table.headerButton;\r\n const active = util.hasClass(headerButton, 'active');\r\n const table = this.context.table._element;\r\n\r\n if (!active) {\r\n const header = util.createElement('THEAD');\r\n header.innerHTML = '' + this.plugins.table.createCells.call(this, 'th', this.context.table._logical_cellCnt, false) + '';\r\n table.insertBefore(header, table.firstElementChild);\r\n } else {\r\n util.removeItem(table.querySelector('thead'));\r\n }\r\n\r\n util.toggleClass(headerButton, 'active');\r\n\r\n if (/TH/i.test(this.context.table._tdElement.nodeName)) {\r\n this.controllersOff();\r\n } else {\r\n this.plugins.table.setPositionControllerDiv.call(this, this.context.table._tdElement, false);\r\n }\r\n },\r\n\r\n setTableStyle: function (styles) {\r\n const contextTable = this.context.table;\r\n const tableElement = contextTable._element;\r\n let icon, span, sizeIcon, text;\r\n\r\n if (styles.indexOf('width') > -1) {\r\n icon = contextTable.resizeButton.firstElementChild;\r\n span = contextTable.resizeText;\r\n\r\n if (!contextTable._maxWidth) {\r\n sizeIcon = contextTable.icons.expansion;\r\n text = contextTable.maxText;\r\n contextTable.columnFixedButton.style.display = 'none';\r\n this.util.removeClass(tableElement, 'se-table-size-100');\r\n this.util.addClass(tableElement, 'se-table-size-auto');\r\n } else {\r\n sizeIcon = contextTable.icons.reduction;\r\n text = contextTable.minText;\r\n contextTable.columnFixedButton.style.display = 'block';\r\n this.util.removeClass(tableElement, 'se-table-size-auto');\r\n this.util.addClass(tableElement, 'se-table-size-100');\r\n }\r\n \r\n this.util.changeElement(icon, sizeIcon);\r\n this.util.changeTxt(span, text);\r\n }\r\n\r\n if (styles.indexOf('column') > -1) {\r\n if (!contextTable._fixedColumn) {\r\n this.util.removeClass(tableElement, 'se-table-layout-fixed');\r\n this.util.addClass(tableElement, 'se-table-layout-auto');\r\n this.util.removeClass(contextTable.columnFixedButton, 'active');\r\n } else {\r\n this.util.removeClass(tableElement, 'se-table-layout-auto');\r\n this.util.addClass(tableElement, 'se-table-layout-fixed');\r\n this.util.addClass(contextTable.columnFixedButton, 'active');\r\n }\r\n \r\n }\r\n },\r\n\r\n setActiveButton: function (fixedCell, selectedCell) {\r\n const contextTable = this.context.table;\r\n\r\n if (/^TH$/i.test(fixedCell.nodeName)) {\r\n contextTable.insertRowAboveButton.setAttribute('disabled', true);\r\n contextTable.insertRowBelowButton.setAttribute('disabled', true);\r\n } else {\r\n contextTable.insertRowAboveButton.removeAttribute('disabled');\r\n contextTable.insertRowBelowButton.removeAttribute('disabled');\r\n }\r\n\r\n if (!selectedCell || fixedCell === selectedCell) {\r\n contextTable.splitButton.removeAttribute('disabled');\r\n contextTable.mergeButton.setAttribute('disabled', true);\r\n } else {\r\n contextTable.splitButton.setAttribute('disabled', true);\r\n contextTable.mergeButton.removeAttribute('disabled');\r\n }\r\n },\r\n\r\n // multi selecte\r\n _bindOnSelect: null,\r\n _bindOffSelect: null,\r\n _bindOffShift: null,\r\n _selectedCells: null,\r\n _shift: false,\r\n _fixedCell: null,\r\n _fixedCellName: null,\r\n _selectedCell: null,\r\n _selectedTable: null,\r\n _ref: null,\r\n _toggleEditor: function (enabled) {\r\n this.context.element.wysiwyg.setAttribute('contenteditable', enabled);\r\n if (enabled) this.util.removeClass(this.context.element.wysiwyg, 'se-disabled');\r\n else this.util.addClass(this.context.element.wysiwyg, 'se-disabled');\r\n },\r\n\r\n _offCellMultiSelect: function (e) {\r\n e.stopPropagation();\r\n const tablePlugin = this.plugins.table;\r\n\r\n if (!tablePlugin._shift) {\r\n tablePlugin._removeEvents.call(this);\r\n tablePlugin._toggleEditor.call(this, true);\r\n } else if (tablePlugin._initBind) {\r\n this._wd.removeEventListener('touchmove', tablePlugin._initBind);\r\n tablePlugin._initBind = null;\r\n }\r\n\r\n if (!tablePlugin._fixedCell || !tablePlugin._selectedTable) return;\r\n \r\n tablePlugin.setActiveButton.call(this, tablePlugin._fixedCell, tablePlugin._selectedCell);\r\n tablePlugin.call_controller_tableEdit.call(this, tablePlugin._selectedCell || tablePlugin._fixedCell);\r\n\r\n tablePlugin._selectedCells = tablePlugin._selectedTable.querySelectorAll('.se-table-selected-cell');\r\n if (tablePlugin._selectedCell && tablePlugin._fixedCell) this.focusEdge(tablePlugin._selectedCell);\r\n\r\n if (!tablePlugin._shift) {\r\n tablePlugin._fixedCell = null;\r\n tablePlugin._selectedCell = null;\r\n tablePlugin._fixedCellName = null;\r\n }\r\n },\r\n\r\n _onCellMultiSelect: function (e) {\r\n this._antiBlur = true;\r\n const tablePlugin = this.plugins.table;\r\n const target = this.util.getParentElement(e.target, this.util.isCell);\r\n\r\n if (tablePlugin._shift) {\r\n if (target === tablePlugin._fixedCell) tablePlugin._toggleEditor.call(this, true);\r\n else tablePlugin._toggleEditor.call(this, false);\r\n } else if (!tablePlugin._ref) {\r\n if (target === tablePlugin._fixedCell) return;\r\n else tablePlugin._toggleEditor.call(this, false);\r\n }\r\n\r\n if (!target || target === tablePlugin._selectedCell || tablePlugin._fixedCellName !== target.nodeName || \r\n tablePlugin._selectedTable !== this.util.getParentElement(target, 'TABLE')) {\r\n return;\r\n }\r\n\r\n tablePlugin._selectedCell = target;\r\n tablePlugin._setMultiCells.call(this, tablePlugin._fixedCell, target);\r\n },\r\n\r\n _setMultiCells: function (startCell, endCell) {\r\n const tablePlugin = this.plugins.table;\r\n const rows = tablePlugin._selectedTable.rows;\r\n const util = this.util;\r\n\r\n const selectedCells = tablePlugin._selectedTable.querySelectorAll('.se-table-selected-cell');\r\n for (let i = 0, len = selectedCells.length; i < len; i++) {\r\n util.removeClass(selectedCells[i], 'se-table-selected-cell');\r\n }\r\n\r\n if (startCell === endCell) {\r\n util.addClass(startCell, 'se-table-selected-cell');\r\n if (!tablePlugin._shift) return;\r\n }\r\n\r\n let findSelectedCell = true;\r\n let spanIndex = [];\r\n let rowSpanArr = [];\r\n const ref = tablePlugin._ref = {_i: 0, cs: null, ce: null, rs: null, re: null};\r\n\r\n for (let i = 0, len = rows.length, cells, colSpan; i < len; i++) {\r\n cells = rows[i].cells;\r\n colSpan = 0;\r\n\r\n for (let c = 0, cLen = cells.length, cell, logcalIndex, cs, rs; c < cLen; c++) {\r\n cell = cells[c];\r\n cs = cell.colSpan - 1;\r\n rs = cell.rowSpan - 1;\r\n logcalIndex = c + colSpan;\r\n\r\n if (spanIndex.length > 0) {\r\n for (let r = 0, arr; r < spanIndex.length; r++) {\r\n arr = spanIndex[r];\r\n if (arr.row > i) continue;\r\n if (logcalIndex >= arr.index) {\r\n colSpan += arr.cs;\r\n logcalIndex += arr.cs;\r\n arr.rs -= 1;\r\n arr.row = i + 1;\r\n if (arr.rs < 1) {\r\n spanIndex.splice(r, 1);\r\n r--;\r\n }\r\n } else if (c === cLen - 1) {\r\n arr.rs -= 1;\r\n arr.row = i + 1;\r\n if (arr.rs < 1) {\r\n spanIndex.splice(r, 1);\r\n r--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (findSelectedCell) {\r\n if (cell === startCell || cell === endCell) {\r\n ref.cs = ref.cs !== null && ref.cs < logcalIndex ? ref.cs : logcalIndex;\r\n ref.ce = ref.ce !== null && ref.ce > logcalIndex + cs ? ref.ce : logcalIndex + cs;\r\n ref.rs = ref.rs !== null && ref.rs < i ? ref.rs : i;\r\n ref.re = ref.re !== null && ref.re > i + rs ? ref.re : i + rs;\r\n ref._i += 1;\r\n }\r\n \r\n if (ref._i === 2) {\r\n findSelectedCell = false;\r\n spanIndex = [];\r\n rowSpanArr = [];\r\n i = -1;\r\n break;\r\n }\r\n } else if (util.getOverlapRangeAtIndex(ref.cs, ref.ce, logcalIndex, logcalIndex + cs) && util.getOverlapRangeAtIndex(ref.rs, ref.re, i, i + rs)) {\r\n const newCs = ref.cs < logcalIndex ? ref.cs : logcalIndex;\r\n const newCe = ref.ce > logcalIndex + cs ? ref.ce : logcalIndex + cs;\r\n const newRs = ref.rs < i ? ref.rs : i;\r\n const newRe = ref.re > i + rs ? ref.re : i + rs;\r\n\r\n if (ref.cs !== newCs || ref.ce !== newCe || ref.rs !== newRs || ref.re !== newRe) {\r\n ref.cs = newCs;\r\n ref.ce = newCe;\r\n ref.rs = newRs;\r\n ref.re = newRe;\r\n i = -1;\r\n\r\n spanIndex = [];\r\n rowSpanArr = [];\r\n break;\r\n }\r\n\r\n util.addClass(cell, 'se-table-selected-cell');\r\n }\r\n\r\n if (rs > 0) {\r\n rowSpanArr.push({\r\n index: logcalIndex,\r\n cs: cs + 1,\r\n rs: rs,\r\n row: -1\r\n });\r\n }\r\n\r\n colSpan += cell.colSpan - 1;\r\n }\r\n\r\n spanIndex = spanIndex.concat(rowSpanArr).sort(function (a, b) {return a.index - b.index;});\r\n rowSpanArr = [];\r\n }\r\n },\r\n\r\n _removeEvents: function () {\r\n const tablePlugin = this.plugins.table;\r\n\r\n if (tablePlugin._initBind) {\r\n this._wd.removeEventListener('touchmove', tablePlugin._initBind);\r\n tablePlugin._initBind = null;\r\n }\r\n\r\n if (tablePlugin._bindOnSelect) {\r\n this._wd.removeEventListener('mousedown', tablePlugin._bindOnSelect);\r\n this._wd.removeEventListener('mousemove', tablePlugin._bindOnSelect);\r\n tablePlugin._bindOnSelect = null;\r\n }\r\n\r\n if (tablePlugin._bindOffSelect) {\r\n this._wd.removeEventListener('mouseup', tablePlugin._bindOffSelect);\r\n tablePlugin._bindOffSelect = null;\r\n }\r\n\r\n if (tablePlugin._bindOffShift) {\r\n this._wd.removeEventListener('keyup', tablePlugin._bindOffShift);\r\n tablePlugin._bindOffShift = null;\r\n }\r\n },\r\n\r\n _initBind: null,\r\n onTableCellMultiSelect: function (tdElement, shift) {\r\n const tablePlugin = this.plugins.table;\r\n\r\n tablePlugin._removeEvents.call(this);\r\n this.controllersOff();\r\n\r\n tablePlugin._shift = shift;\r\n tablePlugin._fixedCell = tdElement;\r\n tablePlugin._fixedCellName = tdElement.nodeName;\r\n tablePlugin._selectedTable = this.util.getParentElement(tdElement, 'TABLE');\r\n\r\n const selectedCells = tablePlugin._selectedTable.querySelectorAll('.se-table-selected-cell');\r\n for (let i = 0, len = selectedCells.length; i < len; i++) {\r\n this.util.removeClass(selectedCells[i], 'se-table-selected-cell');\r\n }\r\n\r\n this.util.addClass(tdElement, 'se-table-selected-cell');\r\n \r\n tablePlugin._bindOnSelect = tablePlugin._onCellMultiSelect.bind(this);\r\n tablePlugin._bindOffSelect = tablePlugin._offCellMultiSelect.bind(this);\r\n\r\n if (!shift) {\r\n this._wd.addEventListener('mousemove', tablePlugin._bindOnSelect, false);\r\n } else {\r\n tablePlugin._bindOffShift = function () {\r\n this.controllersOn(this.context.table.resizeDiv, this.context.table.tableController, this.plugins.table.init.bind(this), tdElement, 'table');\r\n if (!tablePlugin._ref) this.controllersOff();\r\n }.bind(this);\r\n\r\n this._wd.addEventListener('keyup', tablePlugin._bindOffShift, false);\r\n this._wd.addEventListener('mousedown', tablePlugin._bindOnSelect, false);\r\n }\r\n\r\n this._wd.addEventListener('mouseup', tablePlugin._bindOffSelect, false);\r\n tablePlugin._initBind = tablePlugin.init.bind(this);\r\n this._wd.addEventListener('touchmove', tablePlugin._initBind, false);\r\n },\r\n\r\n onClick_tableController: function (e) {\r\n e.stopPropagation();\r\n const target = e.target.getAttribute('data-command') ? e.target : e.target.parentNode;\r\n\r\n if (target.getAttribute('disabled')) return;\r\n\r\n const command = target.getAttribute('data-command');\r\n const value = target.getAttribute('data-value');\r\n const option = target.getAttribute('data-option');\r\n const tablePlugin = this.plugins.table;\r\n \r\n if (typeof tablePlugin._closeSplitMenu === 'function') {\r\n tablePlugin._closeSplitMenu();\r\n if (command === 'onsplit') return;\r\n }\r\n\r\n if (!command) return;\r\n\r\n e.preventDefault();\r\n const contextTable = this.context.table;\r\n\r\n switch (command) {\r\n case 'insert':\r\n case 'delete':\r\n tablePlugin.editTable.call(this, value, option);\r\n break;\r\n case 'header':\r\n tablePlugin.toggleHeader.call(this);\r\n break;\r\n case 'onsplit':\r\n tablePlugin.openSplitMenu.call(this);\r\n break;\r\n case 'split':\r\n tablePlugin.splitCells.call(this, value);\r\n break;\r\n case 'merge':\r\n tablePlugin.mergeCells.call(this);\r\n break;\r\n case 'resize':\r\n contextTable._maxWidth = !contextTable._maxWidth;\r\n tablePlugin.setTableStyle.call(this, 'width');\r\n tablePlugin.setPositionControllerTop.call(this, contextTable._element);\r\n tablePlugin.setPositionControllerDiv.call(this, contextTable._tdElement, tablePlugin._shift);\r\n break;\r\n case 'layout':\r\n contextTable._fixedColumn = !contextTable._fixedColumn;\r\n tablePlugin.setTableStyle.call(this, 'column');\r\n tablePlugin.setPositionControllerTop.call(this, contextTable._element);\r\n tablePlugin.setPositionControllerDiv.call(this, contextTable._tdElement, tablePlugin._shift);\r\n break;\r\n case 'remove':\r\n const emptyDiv = contextTable._element.parentNode;\r\n this.util.removeItem(contextTable._element);\r\n this.controllersOff();\r\n\r\n if (emptyDiv !== this.context.element.wysiwyg) this.util.removeItemAllParents(emptyDiv, function (current) { return current.childNodes.length === 0; }, null);\r\n this.focus();\r\n }\r\n\r\n // history stack\r\n this.history.push(false);\r\n }\r\n};\r\n","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nexport default {\n name: 'formatBlock',\n display: 'submenu',\n add: function (core, targetElement) {\n const context = core.context;\n context.formatBlock = {\n targetText: targetElement.querySelector('.txt'),\n targetTooltip: targetElement.parentNode.querySelector('.se-tooltip-text'),\n _formatList: null,\n currentFormat: ''\n };\n\n /** set submenu */\n let listDiv = this.setSubmenu(core);\n\n /** add event listeners */\n listDiv.querySelector('ul').addEventListener('click', this.pickUp.bind(core));\n context.formatBlock._formatList = listDiv.querySelectorAll('li button');\n\n /** append target button menu */\n core.initMenuTarget(this.name, targetElement, listDiv);\n\n /** empty memory */\n listDiv = null;\n },\n\n setSubmenu: function (core) {\n const option = core.options;\n const lang_toolbar = core.lang.toolbar;\n const listDiv = core.util.createElement('DIV');\n listDiv.className = 'se-submenu se-list-layer se-list-format';\n\n const defaultFormats = ['p', 'div', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n const formatList = !option.formats || option.formats.length === 0 ? defaultFormats : option.formats;\n\n let list = '
      ';\n for (let i = 0, len = formatList.length, format, tagName, command, name, h, attrs, className; i < len; i++) {\n format = formatList[i];\n \n if (typeof format === 'string' && defaultFormats.indexOf(format) > -1) {\n tagName = format.toLowerCase();\n command = tagName === 'blockquote' ? 'range' : tagName === 'pre' ? 'free' : 'replace';\n h = /^h/.test(tagName) ? tagName.match(/\\d+/)[0] : '';\n name = lang_toolbar['tag_' + (h ? 'h' : tagName)] + h;\n className = '';\n attrs = '';\n } else {\n tagName = format.tag.toLowerCase();\n command = format.command;\n name = format.name || tagName;\n className = format.class;\n attrs = className ? ' class=\"' + className + '\"' : '';\n }\n\n list += '
    • ' +\n '
    • ';\n }\n list += '
    ';\n\n listDiv.innerHTML = list;\n\n return listDiv;\n },\n\n /**\n * @Override core\n */\n active: function (element) {\n let formatTitle = this.lang.toolbar.formats;\n const target = this.context.formatBlock.targetText;\n\n if (!element) {\n this.util.changeTxt(target, formatTitle);\n } else if (this.util.isFormatElement(element)) {\n const formatContext = this.context.formatBlock;\n const formatList = formatContext._formatList;\n const nodeName = element.nodeName.toLowerCase();\n const className = (element.className.match(/(\\s|^)__se__format__[^\\s]+/) || [''])[0].trim();\n\n for (let i = 0, len = formatList.length, f; i < len; i++) {\n f = formatList[i];\n if (nodeName === f.getAttribute('data-value') && className === f.getAttribute('data-class')) {\n formatTitle = f.title;\n break;\n }\n }\n\n this.util.changeTxt(target, formatTitle);\n target.setAttribute('data-value', nodeName);\n target.setAttribute('data-class', className);\n\n return true;\n }\n\n return false;\n },\n\n /**\n * @Override submenu\n */\n on: function () {\n const formatContext = this.context.formatBlock;\n const formatList = formatContext._formatList;\n const target = formatContext.targetText;\n const currentFormat = (target.getAttribute('data-value') || '') + (target.getAttribute('data-class') || '');\n\n if (currentFormat !== formatContext.currentFormat) {\n for (let i = 0, len = formatList.length, f; i < len; i++) {\n f = formatList[i];\n if (currentFormat === f.getAttribute('data-value') + f.getAttribute('data-class')) {\n this.util.addClass(f, 'active');\n } else {\n this.util.removeClass(f, 'active');\n }\n }\n\n formatContext.currentFormat = currentFormat;\n }\n },\n\n pickUp: function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n let target = e.target;\n let command = null, value = null, tag = null, className = '';\n \n while (!command && !/UL/i.test(target.tagName)) {\n command = target.getAttribute('data-command');\n value = target.getAttribute('data-value');\n className = target.getAttribute('data-class');\n if (command) {\n tag = target.firstChild;\n break;\n }\n target = target.parentNode;\n }\n\n if (!command) return;\n\n // blockquote\n if (command === 'range') {\n const rangeElement = tag.cloneNode(false);\n this.applyRangeFormatElement(rangeElement);\n }\n // free, replace\n else {\n let range = this.getRange();\n let selectedFormsts = this.getSelectedElementsAndComponents(false);\n\n if (selectedFormsts.length === 0) {\n range = this.getRange_addLine(range, null);\n selectedFormsts = this.getSelectedElementsAndComponents(false);\n if (selectedFormsts.length === 0) return;\n }\n\n const startOffset = range.startOffset;\n const endOffset = range.endOffset;\n\n const util = this.util;\n let first = selectedFormsts[0];\n let last = selectedFormsts[selectedFormsts.length - 1];\n const firstPath = util.getNodePath(range.startContainer, first, null, null);\n const lastPath = util.getNodePath(range.endContainer, last, null, null);\n \n // remove selected list\n const rlist = this.detachList(selectedFormsts, false);\n if (rlist.sc) first = rlist.sc;\n if (rlist.ec) last = rlist.ec;\n\n // change format tag\n this.setRange(util.getNodeFromPath(firstPath, first), startOffset, util.getNodeFromPath(lastPath, last), endOffset);\n const modifiedFormsts = this.getSelectedElementsAndComponents(false);\n\n // free format\n if (command === 'free') {\n const len = modifiedFormsts.length - 1;\n let parentNode = modifiedFormsts[len].parentNode;\n let freeElement = tag.cloneNode(false);\n const focusElement = freeElement;\n \n for (let i = len, f, html, before, next, inner, isComp, first = true; i >= 0; i--) {\n f = modifiedFormsts[i];\n if (f === (!modifiedFormsts[i + 1] ? null : modifiedFormsts[i + 1].parentNode)) continue;\n \n isComp = util.isComponent(f);\n html = isComp ? '' : f.innerHTML.replace(/(?!>)\\s+(?=<)|\\n/g, ' ');\n before = util.getParentElement(f, function (current) {\n return current.parentNode === parentNode;\n });\n \n if (parentNode !== f.parentNode || isComp) {\n if (util.isFormatElement(parentNode)) {\n parentNode.parentNode.insertBefore(freeElement, parentNode.nextSibling);\n parentNode = parentNode.parentNode;\n } else {\n parentNode.insertBefore(freeElement, before ? before.nextSibling : null);\n parentNode = f.parentNode;\n }\n\n next = freeElement.nextSibling;\n if (next && freeElement.nodeName === next.nodeName && util.isSameAttributes(freeElement, next)) {\n freeElement.innerHTML += '
    ' + next.innerHTML;\n util.removeItem(next);\n }\n\n freeElement = tag.cloneNode(false);\n first = true;\n }\n \n inner = freeElement.innerHTML;\n freeElement.innerHTML = ((first || !html || !inner || /
    $/i.test(html)) ? html : html + '
    ') + inner;\n\n if (i === 0) {\n parentNode.insertBefore(freeElement, f);\n next = f.nextSibling;\n if (next && freeElement.nodeName === next.nodeName && util.isSameAttributes(freeElement, next)) {\n freeElement.innerHTML += '
    ' + next.innerHTML;\n util.removeItem(next);\n }\n\n const prev = freeElement.previousSibling;\n if (prev && freeElement.nodeName === prev.nodeName && util.isSameAttributes(freeElement, prev)) {\n prev.innerHTML += '
    ' + freeElement.innerHTML;\n util.removeItem(freeElement);\n }\n }\n\n if (!isComp) util.removeItem(f);\n if (!!html) first = false;\n }\n \n this.setRange(focusElement, 0, focusElement, 0);\n }\n // replace format\n else {\n for (let i = 0, len = modifiedFormsts.length, node, newFormat; i < len; i++) {\n node = modifiedFormsts[i];\n \n if ((node.nodeName.toLowerCase() !== value.toLowerCase() || (node.className.match(/(\\s|^)__se__format__[^\\s]+/) || [''])[0].trim() !== className) && !util.isComponent(node)) {\n newFormat = tag.cloneNode(false);\n util.copyFormatAttributes(newFormat, node);\n newFormat.innerHTML = node.innerHTML;\n \n node.parentNode.replaceChild(newFormat, node);\n }\n \n if (i === 0) first = newFormat || node;\n if (i === len - 1) last = newFormat || node;\n newFormat = null;\n }\n \n this.setRange(util.getNodeFromPath(firstPath, first), startOffset, util.getNodeFromPath(lastPath, last), endOffset);\n }\n\n // history stack\n this.history.push(false);\n }\n\n this.submenuOff();\n }\n};\n","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 20197 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nexport default {\n name: 'lineHeight',\n display: 'submenu',\n add: function (core, targetElement) {\n const context = core.context;\n context.lineHeight = {\n _sizeList: null,\n currentSize: -1\n };\n\n /** set submenu */\n let listDiv = this.setSubmenu(core);\n let listUl = listDiv.querySelector('ul');\n\n /** add event listeners */\n listUl.addEventListener('click', this.pickup.bind(core));\n\n context.lineHeight._sizeList = listUl.querySelectorAll('li button');\n\n /** append target button menu */\n core.initMenuTarget(this.name, targetElement, listDiv);\n\n /** empty memory */\n listDiv = null, listUl = null;\n },\n\n setSubmenu: function (core) {\n const option = core.options;\n const lang = core.lang;\n const listDiv = core.util.createElement('DIV');\n\n listDiv.className = 'se-submenu se-list-layer';\n\n const sizeList = !option.lineHeights ? [\n {text: '1', value: 1},\n {text: '1.15', value: 1.15},\n {text: '1.5', value: 1.5},\n {text: '2', value: 2}\n ] : option.lineHeights;\n\n let list = '
    ' +\n '
      ' +\n '
    • ';\n for (let i = 0, len = sizeList.length, size; i < len; i++) {\n size = sizeList[i];\n list += '
    • ';\n }\n list += '
    ';\n\n listDiv.innerHTML = list;\n\n return listDiv;\n },\n\n /**\n * @Override submenu\n */\n on: function () {\n const lineHeightContext = this.context.lineHeight;\n const sizeList = lineHeightContext._sizeList;\n const format = this.util.getFormatElement(this.getSelectionNode());\n const currentSize = !format ? '' : format.style.lineHeight + '';\n\n if (currentSize !== lineHeightContext.currentSize) {\n for (let i = 0, len = sizeList.length; i < len; i++) {\n if (currentSize === sizeList[i].getAttribute('data-value')) {\n this.util.addClass(sizeList[i], 'active');\n } else {\n this.util.removeClass(sizeList[i], 'active');\n }\n }\n\n lineHeightContext.currentSize = currentSize;\n }\n },\n\n pickup: function (e) {\n if (!/^BUTTON$/i.test(e.target.tagName)) return false;\n \n e.preventDefault();\n e.stopPropagation();\n\n const value = e.target.getAttribute('data-value') || '';\n const formats = this.getSelectedElements();\n\n for (let i = 0, len = formats.length; i < len; i++) {\n formats[i].style.lineHeight = value;\n }\n\n this.submenuOff();\n\n // history stack\n this.history.push(false);\n }\n};\n","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nexport default {\n name: 'paragraphStyle',\n display: 'submenu',\n add: function (core, targetElement) {\n const context = core.context;\n context.paragraphStyle = {\n _classList: null\n };\n\n /** set submenu */\n let listDiv = this.setSubmenu(core);\n\n /** add event listeners */\n listDiv.querySelector('ul').addEventListener('click', this.pickUp.bind(core));\n\n context.paragraphStyle._classList = listDiv.querySelectorAll('li button');\n\n /** append target button menu */\n core.initMenuTarget(this.name, targetElement, listDiv);\n\n /** empty memory */\n listDiv = null;\n },\n\n setSubmenu: function (core) {\n const option = core.options;\n const listDiv = core.util.createElement('DIV');\n listDiv.className = 'se-submenu se-list-layer se-list-format';\n\n const menuLang = core.lang.menu;\n const defaultList = {\n spaced: {\n name: menuLang.spaced,\n class: '__se__p-spaced',\n _class: ''\n },\n bordered: {\n name: menuLang.bordered,\n class: '__se__p-bordered',\n _class: ''\n },\n neon: {\n name: menuLang.neon,\n class: '__se__p-neon',\n _class: ''\n }\n };\n const paragraphStyles = !option.paragraphStyles || option.paragraphStyles.length === 0 ? ['spaced', 'bordered', 'neon'] : option.paragraphStyles;\n\n let list = '
      ';\n for (let i = 0, len = paragraphStyles.length, p, name, attrs, _class; i < len; i++) {\n p = paragraphStyles[i];\n\n if (typeof p === 'string') {\n const defaultStyle = defaultList[p.toLowerCase()];\n if (!defaultStyle) continue;\n p = defaultStyle;\n }\n\n name = p.name;\n attrs = p.class ? ' class=\"' + p.class + '\"' : '';\n _class = p._class;\n\n list += '
    • ' +\n '
    ' +\n '';\n }\n list += '';\n\n listDiv.innerHTML = list;\n\n return listDiv;\n },\n\n /**\n * @Override submenu\n */\n on: function () {\n const paragraphContext = this.context.paragraphStyle;\n const paragraphList = paragraphContext._classList;\n const currentFormat = this.util.getFormatElement(this.getSelectionNode());\n\n for (let i = 0, len = paragraphList.length; i < len; i++) {\n if (this.util.hasClass(currentFormat, paragraphList[i].getAttribute('data-value'))) {\n this.util.addClass(paragraphList[i], 'active');\n } else {\n this.util.removeClass(paragraphList[i], 'active');\n }\n }\n },\n\n pickUp: function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n let target = e.target;\n let value = null;\n \n while (!/^UL$/i.test(target.tagName)) {\n value = target.getAttribute('data-value');\n if (value) break;\n target = target.parentNode;\n }\n\n if (!value) return;\n\n let selectedFormsts = this.getSelectedElements();\n if (selectedFormsts.length === 0) {\n this.getRange_addLine(this.getRange(), null);\n selectedFormsts = this.getSelectedElements();\n if (selectedFormsts.length === 0) return;\n }\n\n // change format class\n const toggleClass = this.util.hasClass(target, 'active') ? this.util.removeClass.bind(this.util) : this.util.addClass.bind(this.util);\n for (let i = 0, len = selectedFormsts.length; i < len; i++) {\n toggleClass(selectedFormsts[i], value);\n }\n\n this.submenuOff();\n\n // history stack\n this.history.push(false);\n }\n};\n","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nexport default {\n name: 'textStyle',\n display: 'submenu',\n add: function (core, targetElement) {\n const context = core.context;\n context.textStyle = {\n _styleList: null\n };\n\n /** set submenu */\n let listDiv = this.setSubmenu(core);\n let listUl = listDiv.querySelector('ul');\n\n /** add event listeners */\n listUl.addEventListener('click', this.pickup.bind(core));\n\n context.textStyle._styleList = listDiv.querySelectorAll('li button');\n\n /** append target button menu */\n core.initMenuTarget(this.name, targetElement, listDiv);\n\n /** empty memory */\n listDiv = null, listUl = null;\n },\n\n setSubmenu: function (core) {\n const option = core.options;\n const listDiv = core.util.createElement('DIV');\n listDiv.className = 'se-submenu se-list-layer se-list-format';\n\n const defaultList = {\n code: {\n name: core.lang.menu.code,\n class: '__se__t-code',\n tag: 'code',\n },\n translucent: {\n name: core.lang.menu.translucent,\n style: 'opacity: 0.5;',\n tag: 'span',\n },\n shadow: {\n name: core.lang.menu.shadow,\n class: '__se__t-shadow',\n tag: 'span',\n }\n };\n const styleList = !option.textStyles ? core._w.Object.keys(defaultList) : option.textStyles;\n\n let list = '
      ';\n for (let i = 0, len = styleList.length, t, tag, name, attrs, command, value, _class; i < len; i++) {\n t = styleList[i];\n attrs = '', value = '', command = [];\n\n if (typeof t === 'string') {\n const defaultStyle = defaultList[t.toLowerCase()];\n if (!defaultStyle) continue;\n t = defaultStyle;\n }\n\n name = t.name;\n tag = t.tag || 'span';\n _class = t._class;\n\n if (t.style) {\n attrs += ' style=\"' + t.style + '\"';\n value += t.style.replace(/:[^;]+(;|$)\\s*/g, ',');\n command.push('style');\n }\n if (t.class) {\n attrs += ' class=\"' + t.class + '\"';\n value += '.' + t.class.trim().replace(/\\s+/g, ',.');\n command.push('class');\n }\n\n value = value.replace(/,$/, '');\n\n list += '
    • ' +\n '
    • ';\n }\n list += '
    ';\n\n listDiv.innerHTML = list;\n\n return listDiv;\n },\n\n /**\n * @Override submenu\n */\n on: function () {\n const util = this.util;\n const textStyleContext = this.context.textStyle;\n const styleButtonList = textStyleContext._styleList;\n const selectionNode = this.getSelectionNode();\n\n for (let i = 0, len = styleButtonList.length, btn, data, active; i < len; i++) {\n btn = styleButtonList[i];\n data = btn.getAttribute('data-value').split(',');\n \n for (let v = 0, node, value; v < data.length; v++) {\n node = selectionNode;\n active = false;\n \n while (node && !util.isFormatElement(node) && !util.isComponent(node)) {\n if (node.nodeName.toLowerCase() === btn.getAttribute('data-command').toLowerCase()) {\n value = data[v];\n if (/^\\./.test(value) ? util.hasClass(node, value.replace(/^\\./, '')) : !!node.style[value]) {\n active = true;\n break;\n }\n }\n node = node.parentNode;\n }\n\n if (!active) break;\n }\n\n active ? util.addClass(btn, 'active') : util.removeClass(btn, 'active');\n }\n\n },\n\n pickup: function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n let target = e.target;\n let command = null, tag = null;\n \n while (!command && !/UL/i.test(target.tagName)) {\n command = target.getAttribute('data-command');\n if (command) {\n tag = target.firstChild;\n break;\n }\n target = target.parentNode;\n }\n\n if (!command) return;\n\n const checkStyles = tag.style.cssText.replace(/:.+(;|$)/g, ',').split(',');\n checkStyles.pop();\n\n const classes = tag.classList;\n for (let i = 0, len = classes.length; i < len; i++) {\n checkStyles.push('.' + classes[i]);\n }\n\n const newNode = this.util.hasClass(target, 'active') ? null : tag.cloneNode(false);\n const removeNodes = newNode ? null : [tag.nodeName];\n this.nodeChange(newNode, checkStyles, removeNodes, true);\n\n this.submenuOff();\n }\n};\n","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nimport fileBrowser from '../modules/fileBrowser';\n\nexport default {\n name: 'imageGallery',\n /**\n * @description Constructor\n * @param {Object} core Core object \n */\n add: function (core) {\n core.addModule([fileBrowser]);\n\n const context = core.context;\n context.imageGallery = {\n title: core.lang.toolbar.imageGallery, // @Required @Override fileBrowser - File browser window title.\n url: core.options.imageGalleryUrl, // @Required @Override fileBrowser - File server url.\n header: core.options.imageGalleryHeader, // @Required @Override fileBrowser - File server http header.\n listClass: 'se-image-list', // @Required @Override fileBrowser - Class name of list div.\n itemTemplateHandler: this.drawItems, // @Required @Override fileBrowser - Function that defines the HTML of an file item.\n selectorHandler: this.setImage.bind(core), // @Required @Override fileBrowser - Function that action when item click.\n columnSize: 4 // @Option @Override fileBrowser - Number of \"div.se-file-item-column\" to be created (default: 4)\n };\n },\n \n /**\n * @Required @Override fileBrowser\n * @description Open a file browser.\n * @param {Function|null} selectorHandler When the function comes as an argument value, it substitutes \"context.selectorHandler\".\n */\n open: function (selectorHandler) {\n this.plugins.fileBrowser.open.call(this, 'imageGallery', selectorHandler);\n },\n\n /**\n * @Required @Override fileBrowser\n * @description Define the HTML of the item to be put in \"div.se-file-item-column\".\n * Format: [\n * { src: \"image src\", name: \"name(@option)\", alt: \"image alt(@option)\", tag: \"tag name(@option)\" }\n * ]\n * @param {Object} item Item of the response data's array\n */\n drawItems: function (item) {\n const srcName = item.src.split('/').pop();\n return '
    \"'' +\n '
    ' +\n '
    ' + (item.name || srcName) + '
    ' +\n '
    ';\n },\n\n setImage: function (target, fileName) {\n this.callPlugin('image', function () {\n const file = {name: fileName, size: 0};\n this.plugins.image.create_image.call(this, target.getAttribute('data-value'), null, this.context.image._origin_w, this.context.image._origin_h, 'none', file, target.alt);\n }.bind(this), null);\n }\n};","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2020 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nexport default {\n // rtl icon\n rtl: {\n italic: '',\n indent: '',\n outdent: '',\n list_bullets: '',\n list_number: '',\n link: '',\n unlink: ''\n },\n // common, ltr icon\n redo: '',\n undo: '',\n bold: '',\n underline: '',\n italic: '',\n strike: '',\n subscript: '',\n superscript: '',\n erase: '',\n indent: '',\n outdent: '',\n expansion: '',\n reduction: '',\n code_view: '',\n preview: '',\n print: '',\n template: '',\n line_height: '',\n paragraph_style: '',\n text_style: '',\n save: '',\n blockquote: '',\n arrow_down: '',\n align_justify: '',\n align_left: '',\n align_right: '',\n align_center: '',\n font_color: '',\n highlight_color:'',\n list_bullets: '',\n list_number: '',\n table: '',\n horizontal_rule: '',\n show_blocks: '',\n cancel: '',\n image: '',\n video: '',\n link: '',\n math: '',\n unlink: '',\n table_header: '',\n merge_cell: '',\n split_cell: '',\n caption: '',\n edit: '',\n delete: '',\n modify: '',\n revert: '',\n auto_size: '',\n insert_row_below: '',\n insert_row_above: '',\n insert_column_left: '',\n insert_column_right: '',\n delete_row: '',\n delete_column: '',\n fixed_column_width: '',\n rotate_left: '',\n rotate_right: '',\n mirror_horizontal: '',\n mirror_vertical: '',\n checked: '',\n line_break: '',\n audio: '',\n image_gallery: '',\n bookmark: '',\n download: '',\n dir_ltr: '',\n dir_rtl: '',\n // Error\n alert_outline: '',\n // More icons\n more_text: '',\n more_paragraph: '',\n more_plus: '',\n more_horizontal: '',\n more_vertical: '',\n // Not currently used\n attachment: '',\n map: '',\n magic_stick: '',\n empty_file: ''\n};\n","/*\r\n * wysiwyg web editor\r\n *\r\n * suneditor.js\r\n * Copyright 2017 JiHong Lee.\r\n * MIT license.\r\n */\r\n'use strict';\r\n\r\n/**\r\n * @description utility function\r\n */\r\nconst util = {\r\n _d: null,\r\n _w: null,\r\n isIE: null,\r\n isIE_Edge: null,\r\n isOSX_IOS: null,\r\n isChromium: null,\r\n isResizeObserverSupported: null, \r\n _propertiesInit: function () {\r\n if (this._d) return;\r\n this._d = document;\r\n this._w = window;\r\n this.isIE = navigator.userAgent.indexOf('Trident') > -1;\r\n this.isIE_Edge = (navigator.userAgent.indexOf('Trident') > -1) || (navigator.appVersion.indexOf('Edge') > -1);\r\n this.isOSX_IOS = /(Mac|iPhone|iPod|iPad)/.test(navigator.platform);\r\n this.isChromium = !!window.chrome;\r\n this.isResizeObserverSupported = (typeof ResizeObserver === 'function');\r\n },\r\n\r\n _allowedEmptyNodeList: '.se-component, pre, blockquote, hr, li, table, img, iframe, video, audio, canvas',\r\n\r\n /**\r\n * @description HTML Reserved Word Converter.\r\n * @param {String} contents \r\n * @returns {String} HTML string\r\n * @private\r\n */\r\n _HTMLConvertor: function (contents) {\r\n const ec = {'&': '&', '\\u00A0': ' ', '\\'': ''', '\"': '"', '<': '<', '>': '>'};\r\n return contents.replace(/&|\\u00A0|'|\"|<|>/g, function (m) {\r\n return (typeof ec[m] === 'string') ? ec[m] : m;\r\n });\r\n },\r\n\r\n /**\r\n * @description Unicode Character 'ZERO WIDTH SPACE' (\\u200B)\r\n */\r\n zeroWidthSpace: String.fromCharCode(8203),\r\n\r\n /**\r\n * @description Regular expression to find 'zero width space' (/\\u200B/g)\r\n */\r\n zeroWidthRegExp: new RegExp(String.fromCharCode(8203), 'g'),\r\n\r\n /**\r\n * @description Regular expression to find only 'zero width space' (/^\\u200B+$/)\r\n */\r\n onlyZeroWidthRegExp: new RegExp('^' + String.fromCharCode(8203) + '+$'),\r\n\r\n fontValueMap: {\r\n 'xx-small': 1,\r\n 'x-small': 2,\r\n 'small': 3,\r\n 'medium': 4,\r\n 'large': 5,\r\n 'x-large': 6,\r\n 'xx-large': 7\r\n },\r\n\r\n /**\r\n * @description A method that checks If the text is blank or to see if it contains 'ZERO WIDTH SPACE' or empty (util.zeroWidthSpace)\r\n * @param {String|Node} text String value or Node\r\n * @returns {Boolean}\r\n */\r\n onlyZeroWidthSpace: function (text) {\r\n if (text === null || text === undefined) return false;\r\n if (typeof text !== 'string') text = text.textContent;\r\n return text === '' || this.onlyZeroWidthRegExp.test(text);\r\n },\r\n\r\n /**\r\n * @description Gets XMLHttpRequest object\r\n * @returns {XMLHttpRequest|ActiveXObject}\r\n */\r\n getXMLHttpRequest: function () {\r\n /** IE */\r\n if (this._w.ActiveXObject) {\r\n try {\r\n return new ActiveXObject('Msxml2.XMLHTTP');\r\n } catch (e) {\r\n try {\r\n return new ActiveXObject('Microsoft.XMLHTTP');\r\n } catch (e1) {\r\n return null;\r\n }\r\n }\r\n }\r\n /** netscape */\r\n else if (this._w.XMLHttpRequest) {\r\n return new XMLHttpRequest();\r\n }\r\n /** fail */\r\n else {\r\n return null;\r\n }\r\n },\r\n\r\n /**\r\n * @description Object.values\r\n * @param {Object|null} obj Object parameter.\r\n * @returns {Array}\r\n */\r\n getValues: function (obj) {\r\n return !obj ? [] : this._w.Object.keys(obj).map(function (i) {\r\n return obj[i];\r\n });\r\n },\r\n\r\n /**\r\n * @description Convert the CamelCase To the KebabCase.\r\n * @param {String|Array} param [Camel string]\r\n * @returns {String|Array}\r\n */\r\n camelToKebabCase: function (param) {\r\n if (typeof param === 'string') {\r\n return param.replace(/[A-Z]/g, function (letter) { return \"-\" + letter.toLowerCase(); });\r\n } else {\r\n return param.map(function(str) { return util.camelToKebabCase(str); });\r\n }\r\n },\r\n\r\n /**\r\n * @description Convert the KebabCase To the CamelCase.\r\n * @param {String|Array} param [KebabCase string]\r\n * @returns {String|Array}\r\n */\r\n kebabToCamelCase: function (param) {\r\n if (typeof param === 'string') {\r\n return param.replace(/-[a-zA-Z]/g, function (letter) { return letter.replace('-', '').toUpperCase(); });\r\n } else {\r\n return param.map(function(str) { return util.camelToKebabCase(str); });\r\n }\r\n },\r\n\r\n /**\r\n * @description Create Element node\r\n * @param {String} elementName Element name\r\n * @returns {Element}\r\n */\r\n createElement: function (elementName) {\r\n return this._d.createElement(elementName);\r\n },\r\n\r\n /**\r\n * @description Create text node\r\n * @param {String} text text contents\r\n * @returns {Node}\r\n */\r\n createTextNode: function (text) {\r\n return this._d.createTextNode(text || '');\r\n },\r\n\r\n /**\r\n * @description The editor checks tags by string.\r\n * If there is \"<\" or \">\" in the attribute of tag, HTML is broken when checking the tag.\r\n * When using an attribute with \"<\" or \">\", use \"HTMLEncoder\" to save. (ex: math(katex))\r\n * @param {String} contents HTML or Text string\r\n * @returns {String}\r\n */\r\n HTMLEncoder: function (contents) {\r\n const ec = {'<': '$lt;', '>': '$gt;'};\r\n return contents.replace(/<|>/g, function (m) {\r\n return (typeof ec[m] === 'string') ? ec[m] : m;\r\n });\r\n },\r\n\r\n /**\r\n * @description The editor checks tags by string.\r\n * If there is \"<\" or \">\" in the attribute of tag, HTML is broken when checking the tag.\r\n * Decoder of data stored as \"HTMLEncoder\" (ex: math(katex))\r\n * @param {String} contents HTML or Text string\r\n * @returns {String}\r\n */\r\n HTMLDecoder: function (contents) {\r\n const ec = {'$lt;': '<', '$gt;': '>'};\r\n return contents.replace(/\\$lt;|\\$gt;/g, function (m) {\r\n return (typeof ec[m] === 'string') ? ec[m] : m;\r\n });\r\n },\r\n\r\n /**\r\n * @description This method run Object.prototype.hasOwnProperty.call(obj, key)\r\n * @param {Object} obj Object\r\n * @param {String} key obj.key\r\n * @returns {Boolean}\r\n */\r\n hasOwn: function (obj, key) {\r\n return this._hasOwn.call(obj, key);\r\n },\r\n _hasOwn: Object.prototype.hasOwnProperty,\r\n\r\n /**\r\n * @deprecated\r\n * @description Get the the tag path of the arguments value\r\n * If not found, return the first found value\r\n * @param {Array} nameArray File name array\r\n * @param {String} extension js, css\r\n * @returns {String}\r\n */\r\n getIncludePath: function (nameArray, extension) {\r\n let path = '';\r\n const pathList = [];\r\n const tagName = extension === 'js' ? 'script' : 'link';\r\n const src = extension === 'js' ? 'src' : 'href';\r\n \r\n let fileName = '(?:';\r\n for (let i = 0, len = nameArray.length; i < len; i++) {\r\n fileName += nameArray[i] + (i < len - 1 ? '|' : ')');\r\n }\r\n\r\n const regExp = new this._w.RegExp('(^|.*[\\\\/])' + fileName + '(\\\\.[^\\\\/]+)?\\.' + extension + '(?:\\\\?.*|;.*)?$', 'i');\r\n const extRegExp = new this._w.RegExp('.+\\\\.' + extension + '(?:\\\\?.*|;.*)?$', 'i');\r\n \r\n for (let c = this._d.getElementsByTagName(tagName), i = 0; i < c.length; i++) {\r\n if (extRegExp.test(c[i][src])) {\r\n pathList.push(c[i]);\r\n }\r\n }\r\n\r\n for (let i = 0; i < pathList.length; i++) {\r\n let editorTag = pathList[i][src].match(regExp);\r\n if (editorTag) {\r\n path = editorTag[0];\r\n break;\r\n }\r\n }\r\n\r\n if (path === '') path = pathList.length > 0 ? pathList[0][src] : '';\r\n\r\n -1 === path.indexOf(':/') && '//' !== path.slice(0, 2) && (path = 0 === path.indexOf('/') ? location.href.match(/^.*?:\\/\\/[^\\/]*/)[0] + path : location.href.match(/^[^\\?]*\\/(?:)/)[0] + path);\r\n\r\n if (!path) throw '[SUNEDITOR.util.getIncludePath.fail] The SUNEDITOR installation path could not be automatically detected. (name: +' + name + ', extension: ' + extension + ')';\r\n\r\n return path;\r\n },\r\n\r\n /**\r\n * @deprecated\r\n * @description Returns the CSS text that has been applied to the current page.\r\n * @param {Document|null} doc To get the CSS text of an document(core._wd). If null get the current document.\r\n * @returns {String} Styles string\r\n */\r\n getPageStyle: function (doc) {\r\n let cssText = '';\r\n const sheets = (doc || this._d).styleSheets;\r\n \r\n for (let i = 0, len = sheets.length, rules; i < len; i++) {\r\n try {\r\n rules = sheets[i].cssRules;\r\n } catch (e) {\r\n continue;\r\n }\r\n \r\n if (rules) {\r\n for (let c = 0, cLen = rules.length; c < cLen; c++) {\r\n cssText += rules[c].cssText;\r\n }\r\n }\r\n }\r\n\r\n return cssText;\r\n },\r\n\r\n /**\r\n * @description Get the argument iframe's document object\r\n * @param {Element} iframe Iframe element (context.element.wysiwygFrame)\r\n * @returns {Document}\r\n */\r\n getIframeDocument: function (iframe) {\r\n let wDocument = iframe.contentWindow || iframe.contentDocument;\r\n if (wDocument.document) wDocument = wDocument.document;\r\n return wDocument;\r\n },\r\n\r\n /**\r\n * @description Get attributes of argument element to string ('class=\"---\" name=\"---\" ')\r\n * @param {Element} element Element object\r\n * @param {Array|null} exceptAttrs Array of attribute names to exclude from the result\r\n * @returns {String}\r\n */\r\n getAttributesToString: function (element, exceptAttrs) {\r\n if (!element.attributes) return '';\r\n\r\n const attrs = element.attributes;\r\n let attrString = '';\r\n\r\n for (let i = 0, len = attrs.length; i < len; i++) {\r\n if (exceptAttrs && exceptAttrs.indexOf(attrs[i].name) > -1) continue;\r\n attrString += attrs[i].name + '=\"' + attrs[i].value + '\" ';\r\n }\r\n\r\n return attrString;\r\n },\r\n\r\n /**\r\n * @descriptionGets Get the length in bytes of a string.\r\n * referencing code: \"https://github.com/shaan1974/myrdin/blob/master/expressions/string.js#L11\"\r\n * @param {String} text String text\r\n * @returns {Number}\r\n */\r\n getByteLength: function(text) {\r\n if (!text || !text.toString) return 0;\r\n text = text.toString();\r\n\r\n const encoder = this._w.encodeURIComponent;\r\n let cr, cl;\r\n if (this.isIE_Edge) {\r\n cl = this._w.unescape(encoder(text)).length;\r\n cr = 0;\r\n\r\n if (encoder(text).match(/(%0A|%0D)/gi) !== null) {\r\n cr = encoder(text).match(/(%0A|%0D)/gi).length;\r\n }\r\n\r\n return cl + cr;\r\n } else {\r\n cl = (new this._w.TextEncoder('utf-8').encode(text)).length;\r\n cr = 0;\r\n\r\n if (encoder(text).match(/(%0A|%0D)/gi) !== null) {\r\n cr = encoder(text).match(/(%0A|%0D)/gi).length;\r\n }\r\n\r\n return cl + cr;\r\n }\r\n },\r\n\r\n /**\r\n * @description It is judged whether it is the edit region top div element or iframe's body tag.\r\n * @param {Node} element The node to check\r\n * @returns {Boolean}\r\n */\r\n isWysiwygDiv: function (element) {\r\n return element && element.nodeType === 1 && (this.hasClass(element, 'se-wrapper-wysiwyg') || /^BODY$/i.test(element.nodeName));\r\n },\r\n\r\n /**\r\n * @description It is judged whether it is the contenteditable property is false.\r\n * @param {Node} element The node to check\r\n * @returns {Boolean}\r\n */\r\n isNonEditable: function (element) {\r\n return element && element.nodeType === 1 && element.getAttribute('contenteditable') === 'false';\r\n },\r\n\r\n /**\r\n * @description It is judged whether it is a node related to the text style.\r\n * (strong|span|font|b|var|i|em|u|ins|s|strike|del|sub|sup|mark|a|label|code)\r\n * @param {Node} element The node to check\r\n * @returns {Boolean}\r\n */\r\n isTextStyleElement: function (element) {\r\n return element && element.nodeType !== 3 && /^(strong|span|font|b|var|i|em|u|ins|s|strike|del|sub|sup|mark|a|label|code|summary)$/i.test(element.nodeName);\r\n },\r\n\r\n /**\r\n * @description It is judged whether it is the input element (INPUT, TEXTAREA)\r\n * @param {Node} element The node to check\r\n * @returns \r\n */\r\n isInputElement: function (element) {\r\n return element && element.nodeType === 1 && /^(INPUT|TEXTAREA)$/i.test(element.nodeName);\r\n },\r\n\r\n /**\r\n * @description It is judged whether it is the format element (P, DIV, H[1-6], PRE, LI | class=\"__se__format__replace_xxx\")\r\n * Format element also contain \"free format Element\"\r\n * @param {Node} element The node to check\r\n * @returns {Boolean}\r\n */\r\n isFormatElement: function (element) {\r\n return element && element.nodeType === 1 && (/^(P|DIV|H[1-6]|PRE|LI|TH|TD|DETAILS)$/i.test(element.nodeName) || this.hasClass(element, '(\\\\s|^)__se__format__replace_.+(\\\\s|$)|(\\\\s|^)__se__format__free_.+(\\\\s|$)')) && !this.isComponent(element) && !this.isWysiwygDiv(element);\r\n },\r\n\r\n /**\r\n * @description It is judged whether it is the range format element. (BLOCKQUOTE, OL, UL, FIGCAPTION, TABLE, THEAD, TBODY, TR, TH, TD | class=\"__se__format__range_xxx\")\r\n * Range format element is wrap the \"format element\" and \"component\"\r\n * @param {Node} element The node to check\r\n * @returns {Boolean}\r\n */\r\n isRangeFormatElement: function (element) {\r\n return element && element.nodeType === 1 && (/^(BLOCKQUOTE|OL|UL|FIGCAPTION|TABLE|THEAD|TBODY|TR|TH|TD|DETAILS)$/i.test(element.nodeName) || this.hasClass(element, '(\\\\s|^)__se__format__range_.+(\\\\s|$)'));\r\n },\r\n\r\n /**\r\n * @description It is judged whether it is the closure range format element. (TH, TD | class=\"__se__format__range__closure_xxx\")\r\n * Closure range format elements is included in the range format element.\r\n * - Closure range format element is wrap the \"format element\" and \"component\"\r\n * ※ You cannot exit this format with the Enter key or Backspace key.\r\n * ※ Use it only in special cases. ([ex] format of table cells)\r\n * @param {Node} element The node to check\r\n * @returns {Boolean}\r\n */\r\n isClosureRangeFormatElement: function (element) {\r\n return element && element.nodeType === 1 && (/^(TH|TD)$/i.test(element.nodeName) || this.hasClass(element, '(\\\\s|^)__se__format__range__closure_.+(\\\\s|$)'));\r\n },\r\n\r\n /**\r\n * @description It is judged whether it is the free format element. (PRE | class=\"__se__format__free_xxx\")\r\n * Free format elements is included in the format element.\r\n * Free format elements's line break is \"BR\" tag.\r\n * ※ Entering the Enter key in the space on the last line ends \"Free Format\" and appends \"Format\".\r\n * @param {Node} element The node to check\r\n * @returns {Boolean}\r\n */\r\n isFreeFormatElement: function (element) {\r\n return element && element.nodeType === 1 && (/^PRE$/i.test(element.nodeName) || this.hasClass(element, '(\\\\s|^)__se__format__free_.+(\\\\s|$)')) && !this.isComponent(element) && !this.isWysiwygDiv(element);\r\n },\r\n\r\n /**\r\n * @description It is judged whether it is the closure free format element. (class=\"__se__format__free__closure_xxx\")\r\n * Closure free format elements is included in the free format element.\r\n * - Closure free format elements's line break is \"BR\" tag.\r\n * ※ You cannot exit this format with the Enter key or Backspace key.\r\n * ※ Use it only in special cases. ([ex] format of table cells)\r\n * @param {Node} element The node to check\r\n * @returns {Boolean}\r\n */\r\n isClosureFreeFormatElement: function (element) {\r\n return element && element.nodeType === 1 && this.hasClass(element, '(\\\\s|^)__se__format__free__closure_.+(\\\\s|$)');\r\n },\r\n\r\n /**\r\n * @description It is judged whether it is the component[img, iframe, video, audio, table] cover(class=\"se-component\") and table, hr\r\n * @param {Node} element The node to check\r\n * @returns {Boolean}\r\n */\r\n isComponent: function (element) {\r\n return element && (/se-component/.test(element.className) || /^(TABLE|HR)$/.test(element.nodeName));\r\n },\r\n\r\n /**\r\n * @description Checks for \"__se__uneditable\" in the class list.\r\n * Components with class \"__se__uneditable\" cannot be modified.\r\n * @param {Element} element The element to check\r\n * @returns {Boolean}\r\n */\r\n isUneditableComponent: function (element) {\r\n return element && this.hasClass(element, '__se__uneditable');\r\n },\r\n\r\n /**\r\n * @description It is judged whether it is the component [img, iframe] cover(class=\"se-component\")\r\n * @param {Node} element The node to check\r\n * @returns {Boolean}\r\n */\r\n isMediaComponent: function (element) {\r\n return element && /se-component/.test(element.className);\r\n },\r\n\r\n /**\r\n * @description It is judged whether it is the not checking node. (class=\"katex\", \"__se__tag\")\r\n * @param {Node} element The node to check\r\n * @returns {Boolean}\r\n */\r\n isNotCheckingNode: function (element) {\r\n return element && /katex|__se__tag/.test(element.className);\r\n },\r\n\r\n /**\r\n * @description If a parent node that contains an argument node finds a format node (util.isFormatElement), it returns that node.\r\n * @param {Node} element Reference node.\r\n * @param {Function|null} validation Additional validation function.\r\n * @returns {Element|null}\r\n */\r\n getFormatElement: function (element, validation) {\r\n if (!element) return null;\r\n if (!validation) {\r\n validation = function () { return true; };\r\n }\r\n\r\n while (element) {\r\n if (this.isWysiwygDiv(element)) return null;\r\n if (this.isRangeFormatElement(element)) element.firstElementChild;\r\n if (this.isFormatElement(element) && validation(element)) return element;\r\n\r\n element = element.parentNode;\r\n }\r\n \r\n return null;\r\n },\r\n\r\n /**\r\n * @description If a parent node that contains an argument node finds a format node (util.isRangeFormatElement), it returns that node.\r\n * @param {Node} element Reference node.\r\n * @param {Function|null} validation Additional validation function.\r\n * @returns {Element|null}\r\n */\r\n getRangeFormatElement: function (element, validation) {\r\n if (!element) return null;\r\n if (!validation) {\r\n validation = function () { return true; };\r\n }\r\n\r\n while (element) {\r\n if (this.isWysiwygDiv(element)) return null;\r\n if (this.isRangeFormatElement(element) && !/^(THEAD|TBODY|TR)$/i.test(element.nodeName) && validation(element)) return element;\r\n element = element.parentNode;\r\n }\r\n\r\n return null;\r\n },\r\n\r\n /**\r\n * @description If a parent node that contains an argument node finds a free format node (util.isFreeFormatElement), it returns that node.\r\n * @param {Node} element Reference node.\r\n * @param {Function|null} validation Additional validation function.\r\n * @returns {Element|null}\r\n */\r\n getFreeFormatElement: function (element, validation) {\r\n if (!element) return null;\r\n if (!validation) {\r\n validation = function () { return true; };\r\n }\r\n\r\n while (element) {\r\n if (this.isWysiwygDiv(element)) return null;\r\n if (this.isFreeFormatElement(element) && validation(element)) return element;\r\n\r\n element = element.parentNode;\r\n }\r\n \r\n return null;\r\n },\r\n\r\n /**\r\n * @description If a parent node that contains an argument node finds a closure free format node (util.isClosureFreeFormatElement), it returns that node.\r\n * @param {Node} element Reference node.\r\n * @param {Function|null} validation Additional validation function.\r\n * @returns {Element|null}\r\n */\r\n getClosureFreeFormatElement: function (element, validation) {\r\n if (!element) return null;\r\n if (!validation) {\r\n validation = function () { return true; };\r\n }\r\n\r\n while (element) {\r\n if (this.isWysiwygDiv(element)) return null;\r\n if (this.isClosureFreeFormatElement(element) && validation(element)) return element;\r\n\r\n element = element.parentNode;\r\n }\r\n \r\n return null;\r\n },\r\n\r\n /**\r\n * @description Add style and className of copyEl to originEl\r\n * @param {Element} originEl Origin element\r\n * @param {Element} copyEl Element to copy\r\n * @param {Array|null} blacklist Blacklist array(LowerCase)\r\n */\r\n copyTagAttributes: function (originEl, copyEl, blacklist) {\r\n if (copyEl.style.cssText) {\r\n const copyStyles = copyEl.style;\r\n for (let i = 0, len = copyStyles.length; i < len; i++) {\r\n originEl.style[copyStyles[i]] = copyStyles[copyStyles[i]];\r\n }\r\n }\r\n\r\n const attrs = copyEl.attributes;\r\n for (let i = 0, len = attrs.length, name; i < len; i++) {\r\n name = attrs[i].name.toLowerCase();\r\n if ((blacklist && blacklist.indexOf(name) > -1) || !attrs[i].value) originEl.removeAttribute(name);\r\n else if (name !== 'style') originEl.setAttribute(attrs[i].name, attrs[i].value);\r\n }\r\n },\r\n\r\n /**\r\n * @description Copy and apply attributes of format tag that should be maintained. (style, class) Ignore \"__se__format__\" class\r\n * @param {Element} originEl Origin element\r\n * @param {Element} copyEl Element to copy\r\n */\r\n copyFormatAttributes: function (originEl, copyEl) {\r\n copyEl = copyEl.cloneNode(false);\r\n copyEl.className = copyEl.className.replace(/(\\s|^)__se__format__[^\\s]+/g, '');\r\n this.copyTagAttributes(originEl, copyEl);\r\n },\r\n\r\n /**\r\n * @description Get the item from the array that matches the condition.\r\n * @param {Array|HTMLCollection|NodeList} array Array to get item\r\n * @param {Function|null} validation Conditional function\r\n * @param {Boolean} multi If true, returns all items that meet the criteria otherwise, returns an empty array.\r\n * If false, returns only one item that meet the criteria otherwise return null.\r\n * @returns {Array|Node|null}\r\n */\r\n getArrayItem: function (array, validation, multi) {\r\n if (!array || array.length === 0) return null;\r\n\r\n validation = validation || function () { return true; };\r\n const arr = [];\r\n \r\n for (let i = 0, len = array.length, a; i < len; i++) {\r\n a = array[i];\r\n if (validation(a)) {\r\n if (!multi) return a;\r\n else arr.push(a);\r\n }\r\n }\r\n\r\n return !multi ? null : arr;\r\n },\r\n\r\n /**\r\n * @description Check if an array contains an element \r\n * @param {Array|HTMLCollection|NodeList} array element array\r\n * @param {Node} element The element to check for\r\n * @returns {Boolean}\r\n */\r\n arrayIncludes: function(array, element) {\r\n for (let i = 0; i < array.length; i++) {\r\n if (array[i] === element) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n\r\n /**\r\n * @description Get the index of the argument value in the element array\r\n * @param {Array|HTMLCollection|NodeList} array element array\r\n * @param {Node} element The element to find index\r\n * @returns {Number}\r\n */\r\n getArrayIndex: function (array, element) {\r\n let idx = -1;\r\n for (let i = 0, len = array.length; i < len; i++) {\r\n if (array[i] === element) {\r\n idx = i;\r\n break;\r\n }\r\n }\r\n\r\n return idx;\r\n },\r\n\r\n /**\r\n * @description Get the next index of the argument value in the element array\r\n * @param {Array|HTMLCollection|NodeList} array element array\r\n * @param {Node} item The element to find index\r\n * @returns {Number}\r\n */\r\n nextIdx: function (array, item) {\r\n let idx = this.getArrayIndex(array, item);\r\n if (idx === -1) return -1;\r\n return idx + 1;\r\n },\r\n\r\n /**\r\n * @description Get the previous index of the argument value in the element array\r\n * @param {Array|HTMLCollection|NodeList} array Element array\r\n * @param {Node} item The element to find index\r\n * @returns {Number}\r\n */\r\n prevIdx: function (array, item) {\r\n let idx = this.getArrayIndex(array, item);\r\n if (idx === -1) return -1;\r\n return idx - 1;\r\n },\r\n\r\n /**\r\n * @description Returns the index compared to other sibling nodes.\r\n * @param {Node} node The Node to find index\r\n * @returns {Number}\r\n */\r\n getPositionIndex: function (node) {\r\n let idx = 0;\r\n while ((node = node.previousSibling)) {\r\n idx += 1;\r\n }\r\n return idx;\r\n },\r\n\r\n /**\r\n * @description Returns the position of the \"node\" in the \"parentNode\" in a numerical array.\r\n * ex)

    aabb

    : getNodePath(node: \"bb\", parentNode: \"

    \") -> [1, 0]\r\n * @param {Node} node The Node to find position path\r\n * @param {Node|null} parentNode Parent node. If null, wysiwyg div area\r\n * @param {Object|null} _newOffsets If you send an object of the form \"{s: 0, e: 0}\", the text nodes that are attached together are merged into one, centered on the \"node\" argument.\r\n * \"_newOffsets.s\" stores the length of the combined characters after \"node\" and \"_newOffsets.e\" stores the length of the combined characters before \"node\".\r\n * Do not use unless absolutely necessary.\r\n * @returns {Array}\r\n */\r\n getNodePath: function (node, parentNode, _newOffsets) {\r\n const path = [];\r\n let finds = true;\r\n\r\n this.getParentElement(node, function (el) {\r\n if (el === parentNode) finds = false;\r\n if (finds && !this.isWysiwygDiv(el)) {\r\n // merge text nodes\r\n if (_newOffsets && el.nodeType === 3) {\r\n let temp = null, tempText = null;\r\n _newOffsets.s = _newOffsets.e = 0;\r\n\r\n let previous = el.previousSibling;\r\n while (previous && previous.nodeType === 3) {\r\n tempText = previous.textContent.replace(this.zeroWidthRegExp, '');\r\n _newOffsets.s += tempText.length;\r\n el.textContent = tempText + el.textContent;\r\n temp = previous;\r\n previous = previous.previousSibling;\r\n this.removeItem(temp);\r\n }\r\n\r\n let next = el.nextSibling;\r\n while (next && next.nodeType === 3) {\r\n tempText = next.textContent.replace(this.zeroWidthRegExp, '');\r\n _newOffsets.e += tempText.length;\r\n el.textContent += tempText;\r\n temp = next;\r\n next = next.nextSibling;\r\n this.removeItem(temp);\r\n }\r\n }\r\n\r\n // index push\r\n path.push(el);\r\n }\r\n return false;\r\n }.bind(this));\r\n \r\n return path.map(this.getPositionIndex).reverse();\r\n },\r\n\r\n /**\r\n * @description Returns the node in the location of the path array obtained from \"util.getNodePath\".\r\n * @param {Array} offsets Position array, array obtained from \"util.getNodePath\"\r\n * @param {Node} parentNode Base parent element\r\n * @returns {Node}\r\n */\r\n getNodeFromPath: function (offsets, parentNode) {\r\n let current = parentNode;\r\n let nodes;\r\n\r\n for (let i = 0, len = offsets.length; i < len; i++) {\r\n nodes = current.childNodes;\r\n if (nodes.length === 0) break;\r\n if (nodes.length <= offsets[i]) {\r\n current = nodes[nodes.length - 1];\r\n } else {\r\n current = nodes[offsets[i]];\r\n }\r\n }\r\n\r\n return current;\r\n },\r\n\r\n /**\r\n * @description Compares the style and class for equal values.\r\n * Returns true if both are text nodes.\r\n * @param {Node} a Node to compare\r\n * @param {Node} b Node to compare\r\n * @returns {Boolean}\r\n */\r\n isSameAttributes: function (a, b) {\r\n if (a.nodeType === 3 && b.nodeType === 3) return true;\r\n if (a.nodeType === 3 || b.nodeType === 3) return false;\r\n\r\n const style_a = a.style;\r\n const style_b = b.style;\r\n let compStyle = 0;\r\n\r\n for (let i = 0, len = style_a.length; i < len; i++) {\r\n if (style_a[style_a[i]] === style_b[style_a[i]]) compStyle++;\r\n }\r\n\r\n const class_a = a.classList;\r\n const class_b = b.classList;\r\n const reg = this._w.RegExp;\r\n let compClass = 0;\r\n\r\n for (let i = 0, len = class_a.length; i < len; i++) {\r\n if (reg('(\\s|^)' + class_a[i] + '(\\s|$)').test(class_b.value)) compClass++;\r\n }\r\n\r\n return (compStyle === style_b.length && compStyle === style_a.length) && (compClass === class_b.length && compClass === class_a.length);\r\n },\r\n\r\n /**\r\n * @description Check the line element(util.isFormatElement) is empty.\r\n * @param {Element} element Format element node\r\n * @returns {Boolean}\r\n */\r\n isEmptyLine: function (element) {\r\n return !element || !element.parentNode || (!element.querySelector('IMG, IFRAME, AUDIO, VIDEO, CANVAS, TABLE') && element.children.length === 0 && this.onlyZeroWidthSpace(element.textContent));\r\n },\r\n\r\n /**\r\n * @description Check the span's attributes are empty.\r\n * @param {Element|null} element Element node\r\n * @returns {Boolean}\r\n */\r\n isSpanWithoutAttr: function (element) {\r\n return !!element && element.nodeType === 1 && /^SPAN$/i.test(element.nodeName) && !element.className && !element.style.cssText;\r\n },\r\n\r\n /**\r\n * @description Check the node is a list (ol, ul)\r\n * @param {Node|String} node The element or element name to check\r\n * @returns {Boolean}\r\n */\r\n isList: function (node) {\r\n return node && /^(OL|UL)$/i.test(typeof node === 'string' ? node : node.nodeName);\r\n },\r\n\r\n /**\r\n * @description Check the node is a list cell (li)\r\n * @param {Node|String} node The element or element name to check\r\n * @returns {Boolean}\r\n */\r\n isListCell: function (node) {\r\n return node && /^LI$/i.test(typeof node === 'string' ? node : node.nodeName);\r\n },\r\n\r\n /**\r\n * @description Check the node is a table (table, thead, tbody, tr, th, td)\r\n * @param {Node|String} node The element or element name to check\r\n * @returns {Boolean}\r\n */\r\n isTable: function (node) {\r\n return node && /^(TABLE|THEAD|TBODY|TR|TH|TD)$/i.test(typeof node === 'string' ? node : node.nodeName);\r\n },\r\n\r\n /**\r\n * @description Check the node is a table cell (td, th)\r\n * @param {Node|String} node The element or element name to check\r\n * @returns {Boolean}\r\n */\r\n isCell: function (node) {\r\n return node && /^(TD|TH)$/i.test(typeof node === 'string' ? node : node.nodeName);\r\n },\r\n\r\n /**\r\n * @description Check the node is a break node (BR)\r\n * @param {Node|String} node The element or element name to check\r\n * @returns {Boolean}\r\n */\r\n isBreak: function (node) {\r\n return node && /^BR$/i.test(typeof node === 'string' ? node : node.nodeName);\r\n },\r\n\r\n\r\n /**\r\n * @description Check the node is a anchor node (A)\r\n * @param {Node|String} node The element or element name to check\r\n * @returns {Boolean}\r\n */\r\n isAnchor: function (node) {\r\n return node && /^A$/i.test(typeof node === 'string' ? node : node.nodeName);\r\n },\r\n\r\n /**\r\n * @description Check the node is a media node (img, iframe, audio, video, canvas)\r\n * @param {Node|String} node The element or element name to check\r\n * @returns {Boolean}\r\n */\r\n isMedia: function (node) {\r\n return node && /^(IMG|IFRAME|AUDIO|VIDEO|CANVAS)$/i.test(typeof node === 'string' ? node : node.nodeName);\r\n },\r\n\r\n /**\r\n * @description Check the node is a figure tag or util.isMedia()\r\n * @param {Node|String} node The element or element name to check\r\n * @returns {Boolean}\r\n */\r\n isFigures: function (node) {\r\n return node && (this.isMedia(node) || /^(FIGURE)$/i.test(typeof node === 'string' ? node : node.nodeName));\r\n },\r\n\r\n /**\r\n * @description Checks for numeric (with decimal point).\r\n * @param {String|Number} text Text string or number\r\n * @returns {Boolean}\r\n */\r\n isNumber: function (text) {\r\n return !!text && /^-?\\d+(\\.\\d+)?$/.test(text + '');\r\n },\r\n\r\n /**\r\n * @description Get a number.\r\n * @param {String|Number} text Text string or number\r\n * @param {Number} maxDec Maximum number of decimal places (-1 : Infinity)\r\n * @returns {Number}\r\n */\r\n getNumber: function (text, maxDec) {\r\n if (!text) return 0;\r\n \r\n let number = (text + '').match(/-?\\d+(\\.\\d+)?/);\r\n if (!number || !number[0]) return 0;\r\n\r\n number = number[0];\r\n return maxDec < 0 ? number * 1 : maxDec === 0 ? this._w.Math.round(number * 1) : (number * 1).toFixed(maxDec) * 1;\r\n },\r\n\r\n /**\r\n * @description Get all \"children\" of the argument value element (Without text nodes)\r\n * @param {Element} element element to get child node\r\n * @param {Function|null} validation Conditional function\r\n * @returns {Array}\r\n */\r\n getListChildren: function (element, validation) {\r\n const children = [];\r\n if (!element || !element.children || element.children.length === 0) return children;\r\n\r\n validation = validation || function () { return true; };\r\n\r\n (function recursionFunc(current) {\r\n if (element !== current && validation(current)) {\r\n children.push(current);\r\n }\r\n\r\n if (!!current.children) {\r\n for (let i = 0, len = current.children.length; i < len; i++) {\r\n recursionFunc(current.children[i]);\r\n }\r\n }\r\n })(element);\r\n\r\n return children;\r\n },\r\n\r\n /**\r\n * @description Get all \"childNodes\" of the argument value element (Include text nodes)\r\n * @param {Node} element element to get child node\r\n * @param {Function|null} validation Conditional function\r\n * @returns {Array}\r\n */\r\n getListChildNodes: function (element, validation) {\r\n const children = [];\r\n if (!element || element.childNodes.length === 0) return children;\r\n\r\n validation = validation || function () { return true; };\r\n\r\n (function recursionFunc(current) {\r\n if (element !== current && validation(current)) {\r\n children.push(current);\r\n }\r\n\r\n for (let i = 0, len = current.childNodes.length; i < len; i++) {\r\n recursionFunc(current.childNodes[i]);\r\n }\r\n })(element);\r\n\r\n return children;\r\n },\r\n\r\n /**\r\n * @description Returns the number of parents nodes.\r\n * \"0\" when the parent node is the WYSIWYG area.\r\n * \"-1\" when the element argument is the WYSIWYG area.\r\n * @param {Node} element The element to check\r\n * @returns {Number}\r\n */\r\n getElementDepth: function (element) {\r\n if (!element || this.isWysiwygDiv(element)) return -1;\r\n\r\n let depth = 0;\r\n element = element.parentNode;\r\n\r\n while (element && !this.isWysiwygDiv(element)) {\r\n depth += 1;\r\n element = element.parentNode;\r\n }\r\n\r\n return depth;\r\n },\r\n\r\n /**\r\n * @description Compares two elements to find a common ancestor, and returns the order of the two elements.\r\n * @param {Node} a Node to compare.\r\n * @param {Node} b Node to compare.\r\n * @returns {Object} { ancesstor, a, b, result: (a > b ? 1 : a < b ? -1 : 0) };\r\n */\r\n compareElements: function (a, b) {\r\n let aNode = a, bNode = b;\r\n while (aNode && bNode && aNode.parentNode !== bNode.parentNode) {\r\n aNode = aNode.parentNode;\r\n bNode = bNode.parentNode;\r\n }\r\n\r\n if (!aNode || !bNode) return { ancestor: null, a: a, b: b, result: 0 };\r\n\r\n const children = aNode.parentNode.childNodes;\r\n const aIndex = this.getArrayIndex(children, aNode);\r\n const bIndex = this.getArrayIndex(children, bNode);\r\n\r\n return {\r\n ancestor: aNode.parentNode,\r\n a: aNode,\r\n b: bNode,\r\n result: aIndex > bIndex ? 1 : aIndex < bIndex ? -1 : 0\r\n };\r\n },\r\n\r\n /**\r\n * @description Get the parent element of the argument value.\r\n * A tag that satisfies the query condition is imported.\r\n * Returns null if not found.\r\n * @param {Node} element Reference element\r\n * @param {String|Function} query Query String (nodeName, .className, #ID, :name) or validation function.\r\n * Not use it like jquery.\r\n * Only one condition can be entered at a time.\r\n * @returns {Element|null}\r\n */\r\n getParentElement: function (element, query) {\r\n let check;\r\n\r\n if (typeof query === 'function') {\r\n check = query;\r\n } else {\r\n let attr;\r\n if (/^\\./.test(query)) {\r\n attr = 'className';\r\n query = query.split('.')[1];\r\n } else if (/^#/.test(query)) {\r\n attr = 'id';\r\n query = '^' + query.split('#')[1] + '$';\r\n } else if (/^:/.test(query)) {\r\n attr = 'name';\r\n query = '^' + query.split(':')[1] + '$';\r\n } else {\r\n attr = 'nodeName';\r\n query = '^' + query + '$';\r\n }\r\n\r\n const regExp = new this._w.RegExp(query, 'i');\r\n check = function (el) {\r\n return regExp.test(el[attr]);\r\n };\r\n }\r\n\r\n while (element && !check(element)) {\r\n if (this.isWysiwygDiv(element)) {\r\n return null;\r\n }\r\n element = element.parentNode;\r\n }\r\n\r\n return element;\r\n },\r\n\r\n /**\r\n * @description Get the child element of the argument value.\r\n * A tag that satisfies the query condition is imported.\r\n * Returns null if not found.\r\n * @param {Node} element Reference element\r\n * @param {String|Function} query Query String (nodeName, .className, #ID, :name) or validation function.\r\n * @param {Boolean} last If true returns the last node among the found child nodes. (default: first node)\r\n * Not use it like jquery.\r\n * Only one condition can be entered at a time.\r\n * @returns {Element|null}\r\n */\r\n getChildElement: function (element, query, last) {\r\n let check;\r\n\r\n if (typeof query === 'function') {\r\n check = query;\r\n } else {\r\n let attr;\r\n if (/^\\./.test(query)) {\r\n attr = 'className';\r\n query = query.split('.')[1];\r\n } else if (/^#/.test(query)) {\r\n attr = 'id';\r\n query = '^' + query.split('#')[1] + '$';\r\n } else if (/^:/.test(query)) {\r\n attr = 'name';\r\n query = '^' + query.split(':')[1] + '$';\r\n } else {\r\n attr = 'nodeName';\r\n query = '^' + (query === 'text' ? '#' + query : query) + '$';\r\n }\r\n\r\n const regExp = new this._w.RegExp(query, 'i');\r\n check = function (el) {\r\n return regExp.test(el[attr]);\r\n };\r\n }\r\n\r\n const childList = this.getListChildNodes(element, function (current) {\r\n return check(current);\r\n });\r\n\r\n return childList[last ? childList.length - 1 : 0];\r\n },\r\n\r\n /**\r\n * @description 1. The first node of all the child nodes of the \"first\" element is returned.\r\n * 2. The last node of all the child nodes of the \"last\" element is returned.\r\n * 3. When there is no \"last\" element, the first and last nodes of all the children of the \"first\" element are returned.\r\n * { sc: \"first\", ec: \"last\" }\r\n * @param {Node} first First element\r\n * @param {Node|null} last Last element\r\n * @returns {Object}\r\n */\r\n getEdgeChildNodes: function (first, last) {\r\n if (!first) return;\r\n if (!last) last = first;\r\n\r\n while (first && first.nodeType === 1 && first.childNodes.length > 0 && !this.isBreak(first)) first = first.firstChild;\r\n while (last && last.nodeType === 1 && last.childNodes.length > 0 && !this.isBreak(last)) last = last.lastChild;\r\n\r\n return {\r\n sc: first,\r\n ec: last || first\r\n };\r\n },\r\n\r\n /**\r\n * @description Returns the position of the left and top of argument. {left:0, top:0}\r\n * @param {Node} element Target node\r\n * @param {Element|null} wysiwygFrame When use iframe option, iframe object should be sent (context.element.wysiwygFrame)\r\n * @returns {Object}\r\n */\r\n getOffset: function (element, wysiwygFrame) {\r\n let offsetLeft = 0;\r\n let offsetTop = 0;\r\n let offsetElement = element.nodeType === 3 ? element.parentElement : element;\r\n const wysiwyg = this.getParentElement(element, this.isWysiwygDiv.bind(this));\r\n\r\n while (offsetElement && !this.hasClass(offsetElement, 'se-container') && offsetElement !== wysiwyg) {\r\n offsetLeft += offsetElement.offsetLeft;\r\n offsetTop += offsetElement.offsetTop;\r\n offsetElement = offsetElement.offsetParent;\r\n }\r\n\r\n const iframe = wysiwygFrame && /iframe/i.test(wysiwygFrame.nodeName);\r\n\r\n return {\r\n left: offsetLeft + (iframe ? wysiwygFrame.parentElement.offsetLeft : 0),\r\n top: (offsetTop - (wysiwyg ? wysiwyg.scrollTop : 0)) + (iframe ? wysiwygFrame.parentElement.offsetTop : 0)\r\n };\r\n },\r\n\r\n /**\r\n * @description It compares the start and end indexes of \"a\" and \"b\" and returns the number of overlapping indexes in the range.\r\n * ex) 1, 5, 4, 6 => \"2\" (4 ~ 5)\r\n * @param {Number} aStart Start index of \"a\"\r\n * @param {Number} aEnd End index of \"a\"\r\n * @param {Number} bStart Start index of \"b\"\r\n * @param {Number} bEnd Start index of \"b\"\r\n * @returns {Number}\r\n */\r\n getOverlapRangeAtIndex: function (aStart, aEnd, bStart, bEnd) {\r\n if (aStart <= bEnd ? aEnd < bStart : aEnd > bStart) return 0;\r\n\r\n const overlap = (aStart > bStart ? aStart : bStart) - (aEnd < bEnd ? aEnd : bEnd);\r\n return (overlap < 0 ? overlap * -1 : overlap) + 1;\r\n },\r\n\r\n /**\r\n * @description Set the text content value of the argument value element\r\n * @param {Node} element Element to replace text content\r\n * @param {String} txt Text to be applied\r\n */\r\n changeTxt: function (element, txt) {\r\n if (!element || !txt) return;\r\n element.textContent = txt;\r\n },\r\n\r\n /**\r\n * @description Replace element\r\n * @param {Element} element Target element\r\n * @param {String|Element} newElement String or element of the new element to apply\r\n */\r\n changeElement: function (element, newElement) {\r\n if (typeof newElement === 'string') {\r\n if (element.outerHTML) {\r\n element.outerHTML = newElement;\r\n } else {\r\n const doc = this.createElement('DIV');\r\n doc.innerHTML = newElement;\r\n newElement = doc.firstChild;\r\n element.parentNode.replaceChild(newElement, element);\r\n }\r\n } else if (newElement.nodeType === 1) {\r\n element.parentNode.replaceChild(newElement, element);\r\n }\r\n },\r\n\r\n /**\r\n * @description Set style, if all styles are deleted, the style properties are deleted.\r\n * @param {Element} element Element to set style\r\n * @param {String} styleName Style attribute name (marginLeft, textAlign...)\r\n * @param {String|Number} value Style value\r\n */\r\n setStyle: function (element, styleName, value) {\r\n element.style[styleName] = value;\r\n\r\n if (!value && !element.style.cssText) {\r\n element.removeAttribute('style');\r\n }\r\n },\r\n\r\n /**\r\n * @description Determine whether any of the matched elements are assigned the given class\r\n * @param {Element} element Elements to search class name\r\n * @param {String} className Class name to search for\r\n * @returns {Boolean}\r\n */\r\n hasClass: function (element, className) {\r\n if (!element) return;\r\n\r\n return (new this._w.RegExp(className)).test(element.className);\r\n },\r\n\r\n /**\r\n * @description Append the className value of the argument value element\r\n * @param {Element} element Elements to add class name\r\n * @param {String} className Class name to be add\r\n */\r\n addClass: function (element, className) {\r\n if (!element) return;\r\n\r\n const check = new this._w.RegExp('(\\\\s|^)' + className + '(\\\\s|$)');\r\n if (check.test(element.className)) return;\r\n\r\n element.className += (element.className.length > 0 ? ' ' : '') + className;\r\n },\r\n\r\n /**\r\n * @description Delete the className value of the argument value element\r\n * @param {Element} element Elements to remove class name\r\n * @param {String} className Class name to be remove\r\n */\r\n removeClass: function (element, className) {\r\n if (!element) return;\r\n\r\n const check = new this._w.RegExp('(\\\\s|^)' + className + '(\\\\s|$)');\r\n element.className = element.className.replace(check, ' ').trim();\r\n\r\n if (!element.className.trim()) element.removeAttribute('class');\r\n },\r\n\r\n /**\r\n * @description Argument value If there is no class name, insert it and delete the class name if it exists\r\n * @param {Element} element Elements to replace class name\r\n * @param {String} className Class name to be change\r\n * @returns {Boolean|undefined}\r\n */\r\n toggleClass: function (element, className) {\r\n if (!element) return;\r\n let result = false;\r\n\r\n const check = new this._w.RegExp('(\\\\s|^)' + className + '(\\\\s|$)');\r\n if (check.test(element.className)) {\r\n element.className = element.className.replace(check, ' ').trim();\r\n } else {\r\n element.className += ' ' + className;\r\n result = true;\r\n }\r\n\r\n if (!element.className.trim()) element.removeAttribute('class');\r\n\r\n return result;\r\n },\r\n\r\n /**\r\n * @description Checks if element can't be easily enabled\r\n * @param {Element} element Element to check for\r\n */\r\n isImportantDisabled: function (element) {\r\n return element.hasAttribute('data-important-disabled');\r\n },\r\n\r\n /**\r\n * @description In the predefined code view mode, the buttons except the executable button are changed to the 'disabled' state.\r\n * core.codeViewDisabledButtons (An array of buttons whose class name is not \"se-code-view-enabled\")\r\n * core.resizingDisabledButtons (An array of buttons whose class name is not \"se-resizing-enabled\")\r\n * @param {Boolean} disabled Disabled value\r\n * @param {Array|HTMLCollection|NodeList} buttonList Button array\r\n * @param {Boolean} important If priveleged mode should be used (Necessary to switch importantDisabled buttons)\r\n */\r\n setDisabledButtons: function (disabled, buttonList, important) {\r\n for (let i = 0, len = buttonList.length; i < len; i++) {\r\n let button = buttonList[i];\r\n if (important || !this.isImportantDisabled(button)) button.disabled = disabled;\r\n if (important) {\r\n if (disabled) { \r\n button.setAttribute('data-important-disabled', '');\r\n } else {\r\n button.removeAttribute('data-important-disabled');\r\n }\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * @description Delete argumenu value element\r\n * @param {Node} item Node to be remove\r\n */\r\n removeItem: function (item) {\r\n if (!item) return;\r\n\r\n if(typeof item.remove === 'function') item.remove();\r\n else if (item.parentNode) item.parentNode.removeChild(item);\r\n },\r\n\r\n /**\r\n * @description Delete all parent nodes that match the condition.\r\n * Returns an {sc: previousSibling, ec: nextSibling}(the deleted node reference) or null.\r\n * @param {Node} item Node to be remove\r\n * @param {Function|null} validation Validation function. default(Deleted if it only have breakLine and blanks)\r\n * @param {Element|null} stopParent Stop when the parent node reaches stopParent\r\n * @returns {Object|null} {sc: previousSibling, ec: nextSibling}\r\n */\r\n removeItemAllParents: function (item, validation, stopParent) {\r\n if (!item) return null;\r\n let cc = null;\r\n if (!validation) {\r\n validation = function (current) {\r\n if (current === stopParent || this.isComponent(current)) return false;\r\n const text = current.textContent.trim();\r\n return text.length === 0 || /^(\\n|\\u200B)+$/.test(text);\r\n }.bind(this);\r\n }\r\n\r\n (function recursionFunc (element) {\r\n if (!util.isWysiwygDiv(element)) {\r\n const parent = element.parentNode;\r\n if (parent && validation(element)) {\r\n cc = {\r\n sc: element.previousElementSibling,\r\n ec: element.nextElementSibling\r\n };\r\n util.removeItem(element);\r\n recursionFunc(parent);\r\n }\r\n }\r\n }(item));\r\n\r\n return cc;\r\n },\r\n\r\n /**\r\n * @description Detach Nested all nested lists under the \"baseNode\".\r\n * Returns a list with nested removed.\r\n * @param {Node} baseNode Element on which to base.\r\n * @param {Boolean} all If true, it also detach all nested lists of a returned list.\r\n * @returns {Element}\r\n */\r\n detachNestedList: function (baseNode, all) {\r\n const rNode = this._deleteNestedList(baseNode);\r\n let rangeElement, cNodes;\r\n\r\n if (rNode) {\r\n rangeElement = rNode.cloneNode(false);\r\n cNodes = rNode.childNodes;\r\n const index = this.getPositionIndex(baseNode);\r\n while (cNodes[index]) {\r\n rangeElement.appendChild(cNodes[index]);\r\n }\r\n } else {\r\n rangeElement = baseNode;\r\n }\r\n \r\n let rChildren;\r\n if (!all) {\r\n const depth = this.getElementDepth(baseNode) + 2;\r\n rChildren = this.getListChildren(baseNode, function (current) { return this.isListCell(current) && !current.previousElementSibling && this.getElementDepth(current) === depth; }.bind(this));\r\n } else {\r\n rChildren = this.getListChildren(rangeElement, function (current) { return this.isListCell(current) && !current.previousElementSibling; }.bind(this));\r\n }\r\n\r\n for (let i = 0, len = rChildren.length; i < len; i++) {\r\n this._deleteNestedList(rChildren[i]);\r\n }\r\n \r\n if (rNode) {\r\n rNode.parentNode.insertBefore(rangeElement, rNode.nextSibling);\r\n if (cNodes && cNodes.length === 0) this.removeItem(rNode);\r\n }\r\n\r\n return rangeElement === baseNode ? rangeElement.parentNode : rangeElement;\r\n },\r\n\r\n /**\r\n * @description Sub function of util.detachNestedList method.\r\n * @private\r\n */\r\n _deleteNestedList: function (baseNode) {\r\n const baseParent = baseNode.parentNode;\r\n let sibling = baseParent;\r\n let parent = sibling.parentNode;\r\n let liSibling, liParent, child, index, c;\r\n \r\n while (this.isListCell(parent)) {\r\n index = this.getPositionIndex(baseNode);\r\n liSibling = parent.nextElementSibling;\r\n liParent = parent.parentNode;\r\n child = sibling;\r\n while(child) {\r\n sibling = sibling.nextSibling;\r\n if (this.isList(child)) {\r\n c = child.childNodes;\r\n while (c[index]) {\r\n liParent.insertBefore(c[index], liSibling);\r\n }\r\n if (c.length === 0) this.removeItem(child);\r\n } else {\r\n liParent.appendChild(child);\r\n }\r\n child = sibling;\r\n }\r\n sibling = liParent;\r\n parent = liParent.parentNode;\r\n }\r\n\r\n if (baseParent.children.length === 0) this.removeItem(baseParent);\r\n\r\n return liParent;\r\n },\r\n\r\n /**\r\n * @description Split all tags based on \"baseNode\"\r\n * Returns the last element of the splited tag.\r\n * @param {Node} baseNode Element or text node on which to base\r\n * @param {Number|Node|null} offset Text offset of \"baseNode\" (Only valid when \"baseNode\" is a text node)\r\n * @param {Number} depth The nesting depth of the element being split. (default: 0)\r\n * @returns {Element}\r\n */\r\n splitElement: function (baseNode, offset, depth) {\r\n if (this.isWysiwygDiv(baseNode)) return baseNode;\r\n\r\n if (offset && !this.isNumber(offset)) {\r\n const children = baseNode.childNodes;\r\n let index = this.getPositionIndex(offset);\r\n const prev = baseNode.cloneNode(false);\r\n const next = baseNode.cloneNode(false);\r\n for (let i = 0, len = children.length; i < len; i++) {\r\n if (i < index) prev.appendChild(children[i]);\r\n else if (i > index) next.appendChild(children[i]);\r\n else continue;\r\n i--;\r\n len--;\r\n index--;\r\n }\r\n\r\n if (prev.childNodes.length > 0) baseNode.parentNode.insertBefore(prev, baseNode);\r\n if (next.childNodes.length > 0) baseNode.parentNode.insertBefore(next, baseNode.nextElementSibling);\r\n\r\n return baseNode;\r\n }\r\n\r\n const bp = baseNode.parentNode;\r\n let index = 0;\r\n let suffixIndex = 1;\r\n let next = true;\r\n let newEl, children, temp;\r\n if (!depth || depth < 0) depth = 0;\r\n\r\n if (baseNode.nodeType === 3) {\r\n index = this.getPositionIndex(baseNode);\r\n if (offset >= 0 && baseNode.length !== offset) {\r\n baseNode.splitText(offset);\r\n const after = this.getNodeFromPath([index + 1], bp);\r\n if (this.onlyZeroWidthSpace(after)) after.data = this.zeroWidthSpace;\r\n }\r\n } else if (baseNode.nodeType === 1) {\r\n if (offset === 0) {\r\n while (baseNode.firstChild) {\r\n baseNode = baseNode.firstChild;\r\n }\r\n if (baseNode.nodeType === 3) {\r\n const after = this.createTextNode(this.zeroWidthSpace);\r\n baseNode.parentNode.insertBefore(after, baseNode);\r\n baseNode = after;\r\n }\r\n }\r\n if (!baseNode.previousSibling) {\r\n if (this.getElementDepth(baseNode) === depth) next = false;\r\n } else {\r\n baseNode = baseNode.previousSibling;\r\n }\r\n }\r\n\r\n if (baseNode.nodeType === 1) suffixIndex = 0;\r\n let depthEl = baseNode;\r\n while (this.getElementDepth(depthEl) > depth) {\r\n index = this.getPositionIndex(depthEl) + suffixIndex;\r\n depthEl = depthEl.parentNode;\r\n\r\n temp = newEl;\r\n newEl = depthEl.cloneNode(false);\r\n children = depthEl.childNodes;\r\n\r\n if (temp) {\r\n if (this.isListCell(newEl) && this.isList(temp) && temp.firstElementChild) {\r\n newEl.innerHTML = temp.firstElementChild.innerHTML;\r\n util.removeItem(temp.firstElementChild);\r\n if (temp.children.length > 0) newEl.appendChild(temp);\r\n } else {\r\n newEl.appendChild(temp);\r\n }\r\n }\r\n\r\n while (children[index]) {\r\n newEl.appendChild(children[index]);\r\n }\r\n }\r\n\r\n if (depthEl.childNodes.length <= 1 && (!depthEl.firstChild || depthEl.firstChild.textContent.length === 0)) depthEl.innerHTML = '
    ';\r\n\r\n const pElement = depthEl.parentNode;\r\n if (next) depthEl = depthEl.nextSibling;\r\n if (!newEl) return depthEl;\r\n\r\n this.mergeSameTags(newEl, null, false);\r\n this.mergeNestedTags(newEl, function (current) { return this.isList(current); }.bind(this));\r\n \r\n if (newEl.childNodes.length > 0) pElement.insertBefore(newEl, depthEl);\r\n else newEl = depthEl;\r\n\r\n if (this.isListCell(newEl) && newEl.children && this.isList(newEl.children[0])) {\r\n newEl.insertBefore(this.createElement('BR'), newEl.children[0]);\r\n }\r\n\r\n if (bp.childNodes.length === 0) this.removeItem(bp);\r\n\r\n return newEl;\r\n },\r\n\r\n /**\r\n * @description Use with \"npdePath (util.getNodePath)\" to merge the same attributes and tags if they are present and modify the nodepath.\r\n * If \"offset\" has been changed, it will return as much \"offset\" as it has been modified.\r\n * An array containing change offsets is returned in the order of the \"nodePathArray\" array.\r\n * @param {Element} element Element\r\n * @param {Array|null} nodePathArray Array of NodePath object ([util.getNodePath(), ..])\r\n * @param {Boolean} onlyText If true, non-text nodes(!util._isIgnoreNodeChange) like 'span', 'strong'.. are ignored.\r\n * @returns {Array} [offset, ..]\r\n */\r\n mergeSameTags: function (element, nodePathArray, onlyText) {\r\n const inst = this;\r\n const nodePathLen = nodePathArray ? nodePathArray.length : 0;\r\n let offsets = null;\r\n \r\n if (nodePathLen) {\r\n offsets = this._w.Array.apply(null, new this._w.Array(nodePathLen)).map(this._w.Number.prototype.valueOf, 0);\r\n }\r\n\r\n (function recursionFunc(current, depth, depthIndex) {\r\n const children = current.childNodes;\r\n \r\n for (let i = 0, len = children.length, child, next; i < len; i++) {\r\n child = children[i];\r\n next = children[i + 1];\r\n if (!child) break;\r\n if((onlyText && inst._isIgnoreNodeChange(child)) || (!onlyText && (inst.isTable(child) || inst.isListCell(child) || (inst.isFormatElement(child) && !inst.isFreeFormatElement(child))))) {\r\n if (inst.isTable(child) || inst.isListCell(child)) {\r\n recursionFunc(child, depth + 1, i);\r\n }\r\n continue;\r\n }\r\n if (len === 1 && current.nodeName === child.nodeName && current.parentNode) {\r\n // update nodePath\r\n if (nodePathLen) {\r\n let path, c, p, cDepth, spliceDepth;\r\n for (let n = 0; n < nodePathLen; n++) {\r\n path = nodePathArray[n];\r\n if (path && path[depth] === i) {\r\n c = child, p = current, cDepth = depth, spliceDepth = true;\r\n while (cDepth >= 0) {\r\n if (inst.getArrayIndex(p.childNodes, c) !== path[cDepth]) {\r\n spliceDepth = false;\r\n break;\r\n }\r\n c = child.parentNode;\r\n p = c.parentNode;\r\n cDepth--;\r\n }\r\n if (spliceDepth) {\r\n path.splice(depth, 1);\r\n path[depth] = i;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // merge tag\r\n inst.copyTagAttributes(child, current);\r\n current.parentNode.insertBefore(child, current);\r\n inst.removeItem(current);\r\n }\r\n if (!next) {\r\n if (child.nodeType === 1) recursionFunc(child, depth + 1, i);\r\n break;\r\n }\r\n\r\n if (child.nodeName === next.nodeName && inst.isSameAttributes(child, next) && child.href === next.href) {\r\n const childs = child.childNodes;\r\n let childLength = 0;\r\n for (let n = 0, nLen = childs.length; n < nLen; n++) {\r\n if (childs[n].textContent.length > 0) childLength++;\r\n }\r\n\r\n const l = child.lastChild;\r\n const r = next.firstChild;\r\n let addOffset = 0;\r\n if (l && r) {\r\n const textOffset = l.nodeType === 3 && r.nodeType === 3;\r\n addOffset = l.textContent.length;\r\n let tempL = l.previousSibling;\r\n while(tempL && tempL.nodeType === 3) {\r\n addOffset += tempL.textContent.length;\r\n tempL = tempL.previousSibling;\r\n }\r\n\r\n if (childLength > 0 && l.nodeType === 3 && r.nodeType === 3 && (l.textContent.length > 0 || r.textContent.length > 0)) childLength--;\r\n\r\n if (nodePathLen) {\r\n let path = null;\r\n for (let n = 0; n < nodePathLen; n++) {\r\n path = nodePathArray[n];\r\n if (path && path[depth] > i) {\r\n if (depth > 0 && path[depth - 1] !== depthIndex) continue;\r\n \r\n path[depth] -= 1;\r\n if (path[depth + 1] >= 0 && path[depth] === i) {\r\n path[depth + 1] += childLength;\r\n if (textOffset) {\r\n if (l && l.nodeType === 3 && r && r.nodeType === 3) {\r\n offsets[n] += addOffset;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (child.nodeType === 3) {\r\n addOffset = child.textContent.length;\r\n child.textContent += next.textContent;\r\n if (nodePathLen) {\r\n let path = null;\r\n for (let n = 0; n < nodePathLen; n++) {\r\n path = nodePathArray[n];\r\n if (path && path[depth] > i) {\r\n if (depth > 0 && path[depth - 1] !== depthIndex) continue;\r\n \r\n path[depth] -= 1;\r\n if (path[depth + 1] >= 0 && path[depth] === i) {\r\n path[depth + 1] += childLength;\r\n offsets[n] += addOffset;\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n child.innerHTML += next.innerHTML;\r\n }\r\n \r\n inst.removeItem(next);\r\n i--;\r\n } else if (child.nodeType === 1) {\r\n recursionFunc(child, depth + 1, i);\r\n }\r\n }\r\n })(element, 0, 0);\r\n\r\n return offsets;\r\n },\r\n\r\n /**\r\n * @description Remove nested tags without other child nodes.\r\n * @param {Element} element Element object\r\n * @param {Function|String|null} validation Validation function / String(\"tag1|tag2..\") / If null, all tags are applicable.\r\n */\r\n mergeNestedTags: function (element, validation) {\r\n if (typeof validation === 'string') {\r\n validation = function (current) { return this.test(current.tagName); }.bind(new this._w.RegExp('^(' + (validation ? validation : '.+') + ')$', 'i'));\r\n } else if (typeof validation !== 'function') {\r\n validation = function () { return true; };\r\n }\r\n \r\n (function recursionFunc(current) {\r\n let children = current.children;\r\n if (children.length === 1 && children[0].nodeName === current.nodeName && validation(current)) {\r\n const temp = children[0];\r\n children = temp.children;\r\n while (children[0]) {\r\n current.appendChild(children[0]);\r\n }\r\n current.removeChild(temp);\r\n }\r\n\r\n for (let i = 0, len = current.children.length; i < len; i++) {\r\n recursionFunc(current.children[i]);\r\n }\r\n })(element);\r\n },\r\n\r\n /**\r\n * @description Delete a empty child node of argument element.\r\n * @param {Element} element Element node\r\n * @param {Node|null} notRemoveNode Do not remove node\r\n * @param {boolean} forceDelete When all child nodes are deleted, the parent node is also deleted.\r\n */\r\n removeEmptyNode: function (element, notRemoveNode, forceDelete) {\r\n const inst = this;\r\n\r\n if (notRemoveNode) {\r\n notRemoveNode = inst.getParentElement(notRemoveNode, function (current) {\r\n return element === current.parentElement;\r\n });\r\n }\r\n \r\n (function recursionFunc(current) {\r\n if (inst._notTextNode(current) || current === notRemoveNode || inst.isNonEditable(current)) return 0;\r\n if (current !== element && inst.onlyZeroWidthSpace(current.textContent) && (!current.firstChild || !inst.isBreak(current.firstChild)) && !current.querySelector(inst._allowedEmptyNodeList)) {\r\n if (current.parentNode) {\r\n current.parentNode.removeChild(current);\r\n return -1;\r\n }\r\n } else {\r\n const children = current.children;\r\n for (let i = 0, len = children.length, r = 0; i < len; i++) {\r\n if (!children[i + r] || inst.isComponent(children[i + r])) continue;\r\n r += recursionFunc(children[i + r]);\r\n }\r\n }\r\n\r\n return 0;\r\n })(element);\r\n\r\n if (element.childNodes.length === 0) {\r\n if (forceDelete) {\r\n this.removeItem(element);\r\n } else {\r\n element.innerHTML = '
    ';\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * @description Remove whitespace between tags in HTML string.\r\n * @param {String} html HTML string\r\n * @returns {String}\r\n */\r\n htmlRemoveWhiteSpace: function (html) {\r\n if (!html) return '';\r\n return html.trim().replace(/<\\/?(?!strong|span|font|b|var|i|em|u|ins|s|strike|del|sub|sup|mark|a|label|code|summary)[^>^<]+>\\s+(?=<)/ig, function (m) { return m.replace(/\\n/g, '').replace(/\\s+/, ' '); });\r\n },\r\n\r\n /**\r\n\t * @description HTML code compression\r\n\t * @param {string} html HTML string\r\n\t * @returns {string} HTML string\r\n\t */\r\n\thtmlCompress: function (html) {\r\n\t\treturn html.replace(/\\n/g, '').replace(/(>)(?:\\s+)(<)/g, '$1$2');\r\n\t},\r\n\r\n /**\r\n * @description Sort a element array by depth of element.\r\n * @param {Array} array Array object\r\n * @param {Boolean} des true: descending order / false: ascending order\r\n */\r\n sortByDepth: function (array, des) {\r\n const t = !des ? -1 : 1;\r\n const f = t * -1;\r\n\r\n array.sort(function (a, b) {\r\n if (!this.isListCell(a) || !this.isListCell(b)) return 0;\r\n a = this.getElementDepth(a);\r\n b = this.getElementDepth(b);\r\n return a > b ? t : a < b ? f : 0;\r\n }.bind(this));\r\n },\r\n\r\n _isExcludeSelectionElement: function (element) {\r\n return !/FIGCAPTION/i.test(element.nodeName) && (this.isComponent(element) || /FIGURE/i.test(element.nodeName));\r\n },\r\n\r\n /**\r\n * @description Nodes that need to be added without modification when changing text nodes\r\n * @param {Node} element Element to check\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _isIgnoreNodeChange: function (element) {\r\n return element && element.nodeType !== 3 && (this.isNonEditable(element) || !this.isTextStyleElement(element));\r\n },\r\n\r\n /**\r\n * @description Nodes that must remain undetached when changing text nodes (A, Label, Code, Span:font-size)\r\n * @param {Node|String} element Element to check\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _isMaintainedNode: function (element) {\r\n return element && element.nodeType !== 3 && /^(a|label|code|summary)$/i.test(typeof element === 'string' ? element : element.nodeName);\r\n },\r\n\r\n /**\r\n * @description Node with font-size style\r\n * @param {Node} element Element to check\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _isSizeNode: function (element) {\r\n return element && element.nodeType !== 3 && this.isTextStyleElement(element) && !!element.style.fontSize;\r\n },\r\n\r\n /**\r\n * @description Nodes without text\r\n * @param {Node} element Element to check\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _notTextNode: function (element) {\r\n return element && element.nodeType !== 3 && (this.isComponent(element) || /^(br|input|select|canvas|img|iframe|audio|video)$/i.test(typeof element === 'string' ? element : element.nodeName));\r\n },\r\n\r\n /**\r\n * @deprecated\r\n * @description Check disallowed tags\r\n * @param {Node} element Element to check\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _disallowedTags: function (element) {\r\n return /^(meta|script|link|style|[a-z]+\\:[a-z]+)$/i.test(element.nodeName);\r\n },\r\n\r\n /**\r\n * @description Create whitelist RegExp object.\r\n * Return RegExp format: new RegExp(\"<\\\\/?\\\\b(?!\" + list + \")\\\\b[^>^<]*+>\", \"gi\")\r\n * @param {String} list Tags list (\"br|p|div|pre...\")\r\n * @returns {RegExp}\r\n */\r\n createTagsWhitelist: function (list) {\r\n return new RegExp('<\\\\/?\\\\b(?!\\\\b' + (list || '').replace(/\\|/g, '\\\\b|\\\\b') + '\\\\b)[^>]*>', 'gi');\r\n },\r\n\r\n /**\r\n * @description Create blacklist RegExp object.\r\n * Return RegExp format: new RegExp(\"<\\\\/?\\\\b(?:\" + list + \")\\\\b[^>^<]*+>\", \"gi\")\r\n * @param {String} list Tags list (\"br|p|div|pre...\")\r\n * @returns {RegExp}\r\n */\r\n createTagsBlacklist: function (list) {\r\n return new RegExp('<\\\\/?\\\\b(?:\\\\b' + (list || '^').replace(/\\|/g, '\\\\b|\\\\b') + '\\\\b)[^>]*>', 'gi');\r\n },\r\n\r\n /**\r\n * @description Fix tags that do not fit the editor format.\r\n * @param {Element} documentFragment Document fragment \"DOCUMENT_FRAGMENT_NODE\" (nodeType === 11)\r\n * @param {RegExp} htmlCheckWhitelistRegExp Editor tags whitelist (core._htmlCheckWhitelistRegExp)\r\n * @param {RegExp} htmlCheckBlacklistRegExp Editor tags blacklist (core._htmlCheckBlacklistRegExp)\r\n * @param {Function} classNameFilter Class name filter function\r\n * @private\r\n */\r\n _consistencyCheckOfHTML: function (documentFragment, htmlCheckWhitelistRegExp, htmlCheckBlacklistRegExp, classNameFilter) {\r\n /**\r\n * It is can use \".children(util.getListChildren)\" to exclude text nodes, but \"documentFragment.children\" is not supported in IE.\r\n * So check the node type and exclude the text no (current.nodeType !== 1)\r\n */\r\n const removeTags = [], emptyTags = [], wrongList = [], withoutFormatCells = [];\r\n\r\n // wrong position\r\n const wrongTags = this.getListChildNodes(documentFragment, function (current) {\r\n if (current.nodeType !== 1) {\r\n if (this.isList(current.parentElement)) removeTags.push(current);\r\n return false;\r\n }\r\n\r\n // white list\r\n if (htmlCheckBlacklistRegExp.test(current.nodeName) || (!htmlCheckWhitelistRegExp.test(current.nodeName) && current.childNodes.length === 0 && this.isNotCheckingNode(current))) {\r\n removeTags.push(current);\r\n return false;\r\n }\r\n\r\n // empty tags\r\n const nrtag = !this.getParentElement(current, this.isNotCheckingNode);\r\n if ((!this.isTable(current) && !this.isListCell(current) && !this.isAnchor(current)) && (this.isFormatElement(current) || this.isRangeFormatElement(current) || this.isTextStyleElement(current)) && current.childNodes.length === 0 && nrtag) {\r\n emptyTags.push(current);\r\n return false;\r\n }\r\n\r\n // wrong list\r\n if (this.isList(current.parentNode) && !this.isList(current) && !this.isListCell(current)) {\r\n wrongList.push(current);\r\n return false;\r\n }\r\n\r\n // table cells\r\n if (this.isCell(current)) {\r\n const fel = current.firstElementChild;\r\n if (!this.isFormatElement(fel) && !this.isRangeFormatElement(fel) && !this.isComponent(fel)) {\r\n withoutFormatCells.push(current);\r\n return false;\r\n }\r\n }\r\n\r\n // class filter\r\n if (nrtag && current.className) {\r\n const className = new this._w.Array(current.classList).map(classNameFilter).join(' ').trim();\r\n if (className) current.className = className;\r\n else current.removeAttribute('class');\r\n }\r\n\r\n const result = current.parentNode !== documentFragment && nrtag &&\r\n ((this.isListCell(current) && !this.isList(current.parentNode)) ||\r\n ((this.isFormatElement(current) || this.isComponent(current)) && !this.isRangeFormatElement(current.parentNode) && !this.getParentElement(current, this.isComponent)));\r\n\r\n return result;\r\n }.bind(this));\r\n\r\n for (let i = 0, len = removeTags.length; i < len; i++) {\r\n this.removeItem(removeTags[i]);\r\n }\r\n \r\n const checkTags = [];\r\n for (let i = 0, len = wrongTags.length, t, p; i < len; i++) {\r\n t = wrongTags[i];\r\n p = t.parentNode;\r\n if (!p || !p.parentNode) continue;\r\n\r\n if (this.getParentElement(t, this.isListCell)) {\r\n const cellChildren = t.childNodes;\r\n for (let j = cellChildren.length - 1; len >= 0; j--) {\r\n p.insertBefore(t, cellChildren[j]);\r\n }\r\n checkTags.push(t);\r\n } else {\r\n p.parentNode.insertBefore(t, p);\r\n checkTags.push(p);\r\n }\r\n }\r\n\r\n for (let i = 0, len = checkTags.length, t; i < len; i++) {\r\n t = checkTags[i];\r\n if (this.onlyZeroWidthSpace(t.textContent.trim())) {\r\n this.removeItem(t);\r\n }\r\n }\r\n\r\n for (let i = 0, len = emptyTags.length; i < len; i++) {\r\n this.removeItem(emptyTags[i]);\r\n }\r\n\r\n for (let i = 0, len = wrongList.length, t, tp, children, p; i < len; i++) {\r\n t = wrongList[i];\r\n p = t.parentNode;\r\n if (!p) continue;\r\n\r\n tp = this.createElement('LI');\r\n\r\n if (this.isFormatElement(t)) {\r\n children = t.childNodes;\r\n while (children[0]) {\r\n tp.appendChild(children[0]);\r\n }\r\n p.insertBefore(tp, t);\r\n this.removeItem(t);\r\n } else {\r\n t = t.nextSibling;\r\n tp.appendChild(wrongList[i]);\r\n p.insertBefore(tp, t);\r\n }\r\n }\r\n\r\n for (let i = 0, len = withoutFormatCells.length, t, f; i < len; i++) {\r\n t = withoutFormatCells[i];\r\n f = this.createElement('DIV');\r\n f.innerHTML = (t.textContent.trim().length === 0 && t.children.length === 0) ? '
    ' : t.innerHTML;\r\n t.innerHTML = f.outerHTML;\r\n }\r\n },\r\n\r\n _setDefaultOptionStyle: function (options, defaultStyle) {\r\n let optionStyle = '';\r\n if (options.height) optionStyle += 'height:' + options.height + ';';\r\n if (options.minHeight) optionStyle += 'min-height:' + options.minHeight + ';';\r\n if (options.maxHeight) optionStyle += 'max-height:' + options.maxHeight + ';';\r\n if (options.position) optionStyle += 'position:' + options.position + ';';\r\n if (options.width) optionStyle += 'width:' + options.width + ';';\r\n if (options.minWidth) optionStyle += 'min-width:' + options.minWidth + ';';\r\n if (options.maxWidth) optionStyle += 'max-width:' + options.maxWidth + ';';\r\n\r\n let top = '', frame = '', editor = '';\r\n defaultStyle = optionStyle + defaultStyle;\r\n const styleArr = defaultStyle.split(';');\r\n for (let i = 0, len = styleArr.length, s; i < len; i++) {\r\n s = styleArr[i].trim();\r\n if (!s) continue;\r\n if (/^(min-|max-)?width\\s*:/.test(s) || /^(z-index|position)\\s*:/.test(s)) {\r\n top += s + ';';\r\n continue;\r\n }\r\n if (/^(min-|max-)?height\\s*:/.test(s)) {\r\n if (/^height/.test(s) && s.split(':')[1].trim() === 'auto') {\r\n options.height = 'auto';\r\n }\r\n frame += s + ';';\r\n continue;\r\n }\r\n editor += s + ';';\r\n }\r\n\r\n return {\r\n top: top,\r\n frame: frame,\r\n editor: editor\r\n };\r\n },\r\n\r\n _setIframeDocument: function (frame, options) {\r\n frame.setAttribute('scrolling', 'auto');\r\n frame.contentDocument.head.innerHTML = '' +\r\n '' +\r\n '' +\r\n this._setIframeCssTags(options);\r\n frame.contentDocument.body.className = options._editableClass;\r\n frame.contentDocument.body.setAttribute('contenteditable', true);\r\n },\r\n\r\n _setIframeCssTags: function (options) {\r\n const linkNames = options.iframeCSSFileName;\r\n const wRegExp = this._w.RegExp;\r\n let tagString = '';\r\n\r\n for (let f = 0, len = linkNames.length, path; f < len; f++) {\r\n path = [];\r\n\r\n if (/(^https?:\\/\\/)|(^data:text\\/css,)/.test(linkNames[f])) {\r\n path.push(linkNames[f]);\r\n } else {\r\n const CSSFileName = new wRegExp('(^|.*[\\\\/])' + linkNames[f] + '(\\\\..+)?\\\\.css(?:\\\\?.*|;.*)?$', 'i');\r\n for (let c = document.getElementsByTagName('link'), i = 0, len = c.length, styleTag; i < len; i++) {\r\n styleTag = c[i].href.match(CSSFileName);\r\n if (styleTag) path.push(styleTag[0]);\r\n }\r\n }\r\n\r\n if (!path || path.length === 0) throw '[SUNEDITOR.constructor.iframe.fail] The suneditor CSS files installation path could not be automatically detected. Please set the option property \"iframeCSSFileName\" before creating editor instances.';\r\n\r\n for (let i = 0, len = path.length; i < len; i++) {\r\n tagString += '';\r\n }\r\n }\r\n\r\n return tagString + (options.height === 'auto' ? '' : '');\r\n }\r\n};\r\n\r\nexport default util;","/*\r\n * wysiwyg web editor\r\n *\r\n * suneditor.js\r\n * Copyright 2017 JiHong Lee.\r\n * MIT license.\r\n */\r\n'use strict';\r\n\r\nimport _icons from '../assets/defaultIcons';\r\nimport _defaultLang from '../lang/en';\r\nimport util from './util';\r\n\r\nexport default {\r\n /**\r\n * @description document create\r\n * @param {Element} element Textarea\r\n * @param {Object} options Options\r\n * @returns {Object}\r\n */\r\n init: function (element, options) {\r\n if (typeof options !== 'object') options = {};\r\n\r\n const doc = document;\r\n\r\n /** --- init options --- */\r\n this._initOptions(element, options);\r\n \r\n // suneditor div\r\n const top_div = doc.createElement('DIV');\r\n top_div.className = 'sun-editor' + (options.rtl ? ' se-rtl' : '');\r\n if (element.id) top_div.id = 'suneditor_' + element.id;\r\n \r\n // relative div\r\n const relative = doc.createElement('DIV');\r\n relative.className = 'se-container';\r\n \r\n // toolbar\r\n const tool_bar = this._createToolBar(doc, options.buttonList, options.plugins, options);\r\n const toolbarShadow = tool_bar.element.cloneNode(false);\r\n toolbarShadow.className += ' se-toolbar-shadow';\r\n tool_bar.element.style.visibility = 'hidden';\r\n if (tool_bar.pluginCallButtons.math) this._checkKatexMath(options.katex);\r\n const arrow = doc.createElement('DIV');\r\n arrow.className = 'se-arrow';\r\n\r\n // sticky toolbar dummy\r\n const sticky_dummy = doc.createElement('DIV');\r\n sticky_dummy.className = 'se-toolbar-sticky-dummy';\r\n \r\n // inner editor div\r\n const editor_div = doc.createElement('DIV');\r\n editor_div.className = 'se-wrapper';\r\n\r\n /** --- init elements and create bottom bar --- */\r\n const initElements = this._initElements(options, top_div, tool_bar.element, arrow);\r\n\r\n const bottomBar = initElements.bottomBar;\r\n const wysiwyg_div = initElements.wysiwygFrame;\r\n const placeholder_span = initElements.placeholder;\r\n let textarea = initElements.codeView;\r\n\r\n // resizing bar\r\n const resizing_bar = bottomBar.resizingBar;\r\n const navigation = bottomBar.navigation;\r\n const char_wrapper = bottomBar.charWrapper;\r\n const char_counter = bottomBar.charCounter;\r\n \r\n // loading box\r\n const loading_box = doc.createElement('DIV');\r\n loading_box.className = 'se-loading-box sun-editor-common';\r\n loading_box.innerHTML = '

    ';\r\n\r\n // enter line\r\n const line_breaker = doc.createElement('DIV');\r\n line_breaker.className = 'se-line-breaker';\r\n line_breaker.innerHTML = '';\r\n const line_breaker_t = doc.createElement('DIV');\r\n line_breaker_t.className += 'se-line-breaker-component';\r\n const line_breaker_b = line_breaker_t.cloneNode(true);\r\n line_breaker_t.innerHTML = line_breaker_b.innerHTML = options.icons.line_break;\r\n \r\n // resize operation background\r\n const resize_back = doc.createElement('DIV');\r\n resize_back.className = 'se-resizing-back';\r\n\r\n // toolbar container\r\n const toolbarContainer = options.toolbarContainer;\r\n if (toolbarContainer) {\r\n toolbarContainer.appendChild(tool_bar.element);\r\n toolbarContainer.appendChild(toolbarShadow);\r\n }\r\n\r\n // resizingbar\r\n const resizingBarContainer = options.resizingBarContainer;\r\n if (resizing_bar && resizingBarContainer) resizingBarContainer.appendChild(resizing_bar);\r\n \r\n /** append html */\r\n editor_div.appendChild(textarea);\r\n if (placeholder_span) editor_div.appendChild(placeholder_span);\r\n if (!toolbarContainer) {\r\n relative.appendChild(tool_bar.element);\r\n relative.appendChild(toolbarShadow);\r\n }\r\n relative.appendChild(sticky_dummy);\r\n relative.appendChild(editor_div);\r\n relative.appendChild(resize_back);\r\n relative.appendChild(loading_box);\r\n relative.appendChild(line_breaker);\r\n relative.appendChild(line_breaker_t);\r\n relative.appendChild(line_breaker_b);\r\n if (resizing_bar && !resizingBarContainer) relative.appendChild(resizing_bar);\r\n top_div.appendChild(relative);\r\n\r\n textarea = this._checkCodeMirror(options, textarea);\r\n \r\n return {\r\n constructed: {\r\n _top: top_div,\r\n _relative: relative,\r\n _toolBar: tool_bar.element,\r\n _toolbarShadow: toolbarShadow,\r\n _menuTray: tool_bar._menuTray,\r\n _editorArea: editor_div,\r\n _wysiwygArea: wysiwyg_div,\r\n _codeArea: textarea,\r\n _placeholder: placeholder_span,\r\n _resizingBar: resizing_bar,\r\n _navigation: navigation,\r\n _charWrapper: char_wrapper,\r\n _charCounter: char_counter,\r\n _loading: loading_box,\r\n _lineBreaker: line_breaker,\r\n _lineBreaker_t: line_breaker_t,\r\n _lineBreaker_b: line_breaker_b,\r\n _resizeBack: resize_back,\r\n _stickyDummy: sticky_dummy,\r\n _arrow: arrow\r\n },\r\n options: options,\r\n plugins: tool_bar.plugins,\r\n pluginCallButtons: tool_bar.pluginCallButtons,\r\n _responsiveButtons: tool_bar.responsiveButtons\r\n };\r\n },\r\n\r\n /**\r\n * @description Check the CodeMirror option to apply the CodeMirror and return the CodeMirror element.\r\n * @param {Object} options options\r\n * @param {Element} textarea textarea element\r\n * @private\r\n */\r\n _checkCodeMirror: function (options, textarea) {\r\n if (options.codeMirror) {\r\n const cmOptions = [{\r\n mode: 'htmlmixed',\r\n htmlMode: true,\r\n lineNumbers: true,\r\n lineWrapping: true\r\n }, (options.codeMirror.options || {})].reduce(function (init, option) {\r\n for (let key in option) {\r\n if (util.hasOwn(option, key)) init[key] = option[key];\r\n }\r\n return init;\r\n }, {});\r\n\r\n if (options.height === 'auto') {\r\n cmOptions.viewportMargin = Infinity;\r\n cmOptions.height = 'auto';\r\n }\r\n \r\n const cm = options.codeMirror.src.fromTextArea(textarea, cmOptions);\r\n cm.display.wrapper.style.cssText = textarea.style.cssText;\r\n \r\n options.codeMirrorEditor = cm;\r\n textarea = cm.display.wrapper;\r\n textarea.className += ' se-wrapper-code-mirror';\r\n }\r\n\r\n return textarea;\r\n },\r\n\r\n /**\r\n * @description Check for a katex object.\r\n * @param {Object} katex katex object\r\n * @private\r\n */\r\n _checkKatexMath: function (katex) {\r\n if (!katex) throw Error('[SUNEDITOR.create.fail] To use the math button you need to add a \"katex\" object to the options.');\r\n\r\n const katexOptions = [{\r\n throwOnError: false,\r\n }, (katex.options || {})].reduce(function (init, option) {\r\n for (let key in option) {\r\n if (util.hasOwn(option, key)) init[key] = option[key];\r\n }\r\n return init;\r\n }, {});\r\n\r\n katex.options = katexOptions;\r\n },\r\n\r\n /**\r\n * @description Add or reset options\r\n * @param {Object} mergeOptions New options property\r\n * @param {Object} context Context object of core\r\n * @param {Object} originOptions Origin options\r\n * @returns {Object} pluginCallButtons\r\n * @private\r\n */\r\n _setOptions: function (mergeOptions, context, originOptions) {\r\n this._initOptions(context.element.originElement, mergeOptions);\r\n\r\n const el = context.element;\r\n const relative = el.relative;\r\n const editorArea = el.editorArea;\r\n const isNewToolbarContainer = mergeOptions.toolbarContainer && mergeOptions.toolbarContainer !== originOptions.toolbarContainer;\r\n const isNewToolbar = mergeOptions.lang !== originOptions.lang || mergeOptions.buttonList !== originOptions.buttonList || mergeOptions.mode !== originOptions.mode || isNewToolbarContainer;\r\n\r\n const tool_bar = this._createToolBar(document, (isNewToolbar ? mergeOptions.buttonList : originOptions.buttonList), mergeOptions.plugins, mergeOptions);\r\n if (tool_bar.pluginCallButtons.math) this._checkKatexMath(mergeOptions.katex);\r\n const arrow = document.createElement('DIV');\r\n arrow.className = 'se-arrow';\r\n\r\n if (isNewToolbar) {\r\n tool_bar.element.style.visibility = 'hidden';\r\n // toolbar container\r\n if (isNewToolbarContainer) {\r\n mergeOptions.toolbarContainer.appendChild(tool_bar.element);\r\n el.toolbar.parentElement.removeChild(el.toolbar);\r\n } else {\r\n el.toolbar.parentElement.replaceChild(tool_bar.element, el.toolbar);\r\n }\r\n\r\n el.toolbar = tool_bar.element;\r\n el._menuTray = tool_bar._menuTray;\r\n el._arrow = arrow;\r\n }\r\n \r\n const initElements = this._initElements(mergeOptions, el.topArea, (isNewToolbar ? tool_bar.element : el.toolbar), arrow);\r\n\r\n const bottomBar = initElements.bottomBar;\r\n const wysiwygFrame = initElements.wysiwygFrame;\r\n const placeholder_span = initElements.placeholder;\r\n let code = initElements.codeView;\r\n\r\n if (el.resizingBar) util.removeItem(el.resizingBar);\r\n if (bottomBar.resizingBar) {\r\n if (mergeOptions.resizingBarContainer && mergeOptions.resizingBarContainer !== originOptions.resizingBarContainer) {\r\n mergeOptions.resizingBarContainer.appendChild(bottomBar.resizingBar);\r\n } else {\r\n relative.appendChild(bottomBar.resizingBar);\r\n }\r\n }\r\n\r\n editorArea.innerHTML = '';\r\n editorArea.appendChild(code);\r\n if (placeholder_span) editorArea.appendChild(placeholder_span);\r\n\r\n code = this._checkCodeMirror(mergeOptions, code);\r\n \r\n el.resizingBar = bottomBar.resizingBar;\r\n el.navigation = bottomBar.navigation;\r\n el.charWrapper = bottomBar.charWrapper;\r\n el.charCounter = bottomBar.charCounter;\r\n el.wysiwygFrame = wysiwygFrame;\r\n el.code = code;\r\n el.placeholder = placeholder_span;\r\n\r\n if (mergeOptions.rtl) util.addClass(el.topArea, 'se-rtl');\r\n else util.removeClass(el.topArea, 'se-rtl');\r\n\r\n return {\r\n callButtons: tool_bar.pluginCallButtons,\r\n plugins: tool_bar.plugins,\r\n toolbar: tool_bar\r\n };\r\n },\r\n\r\n /**\r\n * @description Initialize property of suneditor elements\r\n * @param {Object} options Options\r\n * @param {Element} topDiv Suneditor top div\r\n * @param {Element} toolBar Tool bar\r\n * @param {Element} toolBarArrow Tool bar arrow (balloon editor)\r\n * @returns {Object} Bottom bar elements (resizingBar, navigation, charWrapper, charCounter)\r\n * @private\r\n */\r\n _initElements: function (options, topDiv, toolBar, toolBarArrow) {\r\n /** top div */\r\n topDiv.style.cssText = options._editorStyles.top;\r\n\r\n /** toolbar */\r\n if (/inline/i.test(options.mode)) {\r\n toolBar.className += ' se-toolbar-inline';\r\n toolBar.style.width = options.toolbarWidth;\r\n } else if (/balloon/i.test(options.mode)) {\r\n toolBar.className += ' se-toolbar-balloon';\r\n toolBar.style.width = options.toolbarWidth;\r\n toolBar.appendChild(toolBarArrow);\r\n }\r\n\r\n /** editor */\r\n // wysiwyg div or iframe\r\n const wysiwygDiv = document.createElement(!options.iframe ? 'DIV' : 'IFRAME');\r\n wysiwygDiv.className = 'se-wrapper-inner se-wrapper-wysiwyg';\r\n \r\n if (!options.iframe) {\r\n wysiwygDiv.setAttribute('contenteditable', true);\r\n wysiwygDiv.setAttribute('scrolling', 'auto');\r\n for (let key in options.iframeAttributes) {\r\n wysiwygDiv.setAttribute(key, options.iframeAttributes[key]);\r\n }\r\n wysiwygDiv.className += ' ' + options._editableClass;\r\n wysiwygDiv.style.cssText = options._editorStyles.frame + options._editorStyles.editor;\r\n wysiwygDiv.className += options.className;\r\n } else {\r\n wysiwygDiv.allowFullscreen = true;\r\n wysiwygDiv.frameBorder = 0;\r\n wysiwygDiv.style.cssText = options._editorStyles.frame;\r\n wysiwygDiv.className += options.className;\r\n }\r\n\r\n // textarea for code view\r\n const textarea = document.createElement('TEXTAREA');\r\n textarea.className = 'se-wrapper-inner se-wrapper-code' + options.className;\r\n textarea.style.cssText = options._editorStyles.frame;\r\n textarea.style.display = 'none';\r\n if (options.height === 'auto') textarea.style.overflow = 'hidden';\r\n\r\n /** resize bar */\r\n let resizingBar = null;\r\n let navigation = null;\r\n let charWrapper = null;\r\n let charCounter = null;\r\n if (options.resizingBar) {\r\n resizingBar = document.createElement('DIV');\r\n resizingBar.className = 'se-resizing-bar sun-editor-common';\r\n\r\n /** navigation */\r\n navigation = document.createElement('DIV');\r\n navigation.className = 'se-navigation sun-editor-common';\r\n resizingBar.appendChild(navigation);\r\n\r\n /** char counter */\r\n if (options.charCounter) {\r\n charWrapper = document.createElement('DIV');\r\n charWrapper.className = 'se-char-counter-wrapper';\r\n\r\n if (options.charCounterLabel) {\r\n const charLabel = document.createElement('SPAN');\r\n charLabel.className = 'se-char-label';\r\n charLabel.textContent = options.charCounterLabel;\r\n charWrapper.appendChild(charLabel);\r\n }\r\n \r\n charCounter = document.createElement('SPAN');\r\n charCounter.className = 'se-char-counter';\r\n charCounter.textContent = '0';\r\n charWrapper.appendChild(charCounter);\r\n \r\n if (options.maxCharCount > 0) {\r\n const char_max = document.createElement('SPAN');\r\n char_max.textContent = ' / ' + options.maxCharCount;\r\n charWrapper.appendChild(char_max);\r\n }\r\n\r\n resizingBar.appendChild(charWrapper);\r\n }\r\n }\r\n \r\n let placeholder = null;\r\n if (options.placeholder) {\r\n placeholder = document.createElement('SPAN');\r\n placeholder.className = 'se-placeholder';\r\n placeholder.innerText = options.placeholder;\r\n }\r\n\r\n return {\r\n bottomBar: {\r\n resizingBar: resizingBar,\r\n navigation: navigation,\r\n charWrapper: charWrapper,\r\n charCounter: charCounter\r\n },\r\n wysiwygFrame: wysiwygDiv,\r\n codeView: textarea,\r\n placeholder: placeholder\r\n };\r\n },\r\n\r\n /**\r\n * @description Initialize options\r\n * @param {Element} element Options object\r\n * @param {Object} options Options object\r\n * @private\r\n */\r\n _initOptions: function (element, options) {\r\n const plugins = {};\r\n if (options.plugins) {\r\n const _plugins = options.plugins;\r\n const pluginsValues = _plugins.length ? _plugins : Object.keys(_plugins).map(function(name) { return _plugins[name]; });\r\n for (let i = 0, len = pluginsValues.length, p; i < len; i++) {\r\n p = pluginsValues[i].default || pluginsValues[i];\r\n plugins[p.name] = p;\r\n }\r\n }\r\n options.plugins = plugins;\r\n /** Values */\r\n options.lang = options.lang || _defaultLang;\r\n options.value = typeof options.value === 'string' ? options.value : null;\r\n options.allowedClassNames = new util._w.RegExp((options.allowedClassNames && typeof options.allowedClassNames === 'string' ? options.allowedClassNames + '|' : '') + '^__se__|se-|katex');\r\n options.historyStackDelayTime = typeof options.historyStackDelayTime === 'number' ? options.historyStackDelayTime : 400;\r\n options.frameAttrbutes = options.frameAttrbutes || {};\r\n // tag style\r\n options.defaultTag = typeof options.defaultTag === 'string' && options.defaultTag.length > 0 ? options.defaultTag : 'p';\r\n const textTags = options.textTags = [{bold: 'STRONG', underline: 'U', italic: 'EM', strike: 'DEL', sub: 'SUB', sup: 'SUP'}, (options.textTags || {})].reduce(function (_default, _new) {\r\n for (let key in _new) {\r\n _default[key] = _new[key];\r\n }\r\n return _default;\r\n }, {});\r\n options._textTagsMap = {\r\n 'strong': textTags.bold.toLowerCase(),\r\n 'b': textTags.bold.toLowerCase(),\r\n 'u': textTags.underline.toLowerCase(),\r\n 'ins': textTags.underline.toLowerCase(),\r\n 'em': textTags.italic.toLowerCase(),\r\n 'i': textTags.italic.toLowerCase(),\r\n 'del': textTags.strike.toLowerCase(),\r\n 'strike': textTags.strike.toLowerCase(),\r\n 's': textTags.strike.toLowerCase(),\r\n 'sub': textTags.sub.toLowerCase(),\r\n 'sup': textTags.sup.toLowerCase()\r\n };\r\n options._defaultCommand = {\r\n bold: options.textTags.bold,\r\n underline: options.textTags.underline,\r\n italic: options.textTags.italic,\r\n strike: options.textTags.strike,\r\n subscript: options.textTags.sub,\r\n superscript: options.textTags.sup\r\n };\r\n /** Whitelist, Blacklist */\r\n options.__allowedScriptTag = options.__allowedScriptTag === true;\r\n const whitelist = 'br|p|div|pre|blockquote|h1|h2|h3|h4|h5|h6|ol|ul|li|hr|figure|figcaption|img|iframe|audio|video|source|table|thead|tbody|tr|th|td|a|b|strong|var|i|em|u|ins|s|span|strike|del|sub|sup|code|svg|path|details|summary';\r\n // tags\r\n options.tagsBlacklist = options.tagsBlacklist || '';\r\n options._defaultTagsWhitelist = (typeof options._defaultTagsWhitelist === 'string' ? options._defaultTagsWhitelist : whitelist) + (options.__allowedScriptTag ? '|script' : '');\r\n options._editorTagsWhitelist = options.addTagsWhitelist === '*' ? '*' : this._setWhitelist(options._defaultTagsWhitelist + (typeof options.addTagsWhitelist === 'string' && options.addTagsWhitelist.length > 0 ? '|' + options.addTagsWhitelist : ''), options.tagsBlacklist);\r\n // paste tags\r\n options.pasteTagsBlacklist = options.tagsBlacklist + (options.tagsBlacklist && options.pasteTagsBlacklist ? ('|' + options.pasteTagsBlacklist) : (options.pasteTagsBlacklist || ''));\r\n options.pasteTagsWhitelist = options.pasteTagsWhitelist === '*' ? '*' : this._setWhitelist(typeof options.pasteTagsWhitelist === 'string' ? options.pasteTagsWhitelist : options._editorTagsWhitelist, options.pasteTagsBlacklist);\r\n // tag attributes\r\n options.attributesWhitelist = (!options.attributesWhitelist || typeof options.attributesWhitelist !== 'object') ? null : options.attributesWhitelist;\r\n options.attributesBlacklist = (!options.attributesBlacklist || typeof options.attributesBlacklist !== 'object') ? null : options.attributesBlacklist;\r\n /** Layout */\r\n options.mode = options.mode || 'classic'; // classic, inline, balloon, balloon-always\r\n options.rtl = !!options.rtl;\r\n options.lineAttrReset = ['id'].concat((options.lineAttrReset && typeof options.lineAttrReset === 'string' ? options.lineAttrReset.toLowerCase().split('|') : []));\r\n options._editableClass = 'sun-editor-editable' + (options.rtl ? ' se-rtl' : '');\r\n options._printClass = typeof options._printClass === 'string' ? options._printClass : null;\r\n options.toolbarWidth = options.toolbarWidth ? (util.isNumber(options.toolbarWidth) ? options.toolbarWidth + 'px' : options.toolbarWidth) : 'auto';\r\n options.toolbarContainer = typeof options.toolbarContainer === 'string' ? document.querySelector(options.toolbarContainer) : options.toolbarContainer;\r\n options.stickyToolbar = (/balloon/i.test(options.mode) || !!options.toolbarContainer) ? -1 : options.stickyToolbar === undefined ? 0 : (/^\\d+/.test(options.stickyToolbar) ? util.getNumber(options.stickyToolbar, 0) : -1);\r\n options.hideToolbar = !!options.hideToolbar;\r\n options.fullScreenOffset = options.fullScreenOffset === undefined ? 0 : (/^\\d+/.test(options.fullScreenOffset) ? util.getNumber(options.fullScreenOffset, 0) : 0);\r\n options.fullPage = !!options.fullPage;\r\n options.iframe = options.fullPage || !!options.iframe;\r\n options.iframeAttributes = options.iframeAttributes || {};\r\n options.iframeCSSFileName = options.iframe ? typeof options.iframeCSSFileName === 'string' ? [options.iframeCSSFileName] : (options.iframeCSSFileName || ['suneditor']) : null;\r\n options.previewTemplate = typeof options.previewTemplate === 'string' ? options.previewTemplate : null;\r\n options.printTemplate = typeof options.printTemplate === 'string' ? options.printTemplate : null;\r\n /** CodeMirror object */\r\n options.codeMirror = options.codeMirror ? options.codeMirror.src ? options.codeMirror : {src: options.codeMirror} : null;\r\n /** katex object (Math plugin) */\r\n options.katex = options.katex ? options.katex.src ? options.katex : {src: options.katex} : null;\r\n options.mathFontSize = !!options.mathFontSize ? options.mathFontSize : [\r\n {text: '1', value: '1em'},\r\n {text: '1.5', value: '1.5em'},\r\n {text: '2', value: '2em'},\r\n {text: '2.5', value: '2.5em'}\r\n ];\r\n /** Display */\r\n options.position = typeof options.position === 'string' ? options.position : null;\r\n options.display = options.display || (element.style.display === 'none' || !element.style.display ? 'block' : element.style.display);\r\n options.popupDisplay = options.popupDisplay || 'full';\r\n /** Bottom resizing bar */\r\n options.resizingBar = options.resizingBar === undefined ? (/inline|balloon/i.test(options.mode) ? false : true) : options.resizingBar;\r\n options.showPathLabel = !options.resizingBar ? false : typeof options.showPathLabel === 'boolean' ? options.showPathLabel : true;\r\n options.resizeEnable = options.resizeEnable === undefined ? true : !!options.resizeEnable;\r\n options.resizingBarContainer = typeof options.resizingBarContainer === 'string' ? document.querySelector(options.resizingBarContainer) : options.resizingBarContainer;\r\n /** Character count */\r\n options.charCounter = options.maxCharCount > 0 ? true : typeof options.charCounter === 'boolean' ? options.charCounter : false;\r\n options.charCounterType = typeof options.charCounterType === 'string' ? options.charCounterType : 'char';\r\n options.charCounterLabel = typeof options.charCounterLabel === 'string' ? options.charCounterLabel.trim() : null;\r\n options.maxCharCount = util.isNumber(options.maxCharCount) && options.maxCharCount > -1 ? options.maxCharCount * 1 : null;\r\n /** Width size */\r\n options.width = options.width ? (util.isNumber(options.width) ? options.width + 'px' : options.width) : (element.clientWidth ? element.clientWidth + 'px' : '100%');\r\n options.minWidth = (util.isNumber(options.minWidth) ? options.minWidth + 'px' : options.minWidth) || '';\r\n options.maxWidth = (util.isNumber(options.maxWidth) ? options.maxWidth + 'px' : options.maxWidth) || '';\r\n /** Height size */\r\n options.height = options.height ? (util.isNumber(options.height) ? options.height + 'px' : options.height) : (element.clientHeight ? element.clientHeight + 'px' : 'auto');\r\n options.minHeight = (util.isNumber(options.minHeight) ? options.minHeight + 'px' : options.minHeight) || '';\r\n options.maxHeight = (util.isNumber(options.maxHeight) ? options.maxHeight + 'px' : options.maxHeight) || '';\r\n /** Editing area */\r\n options.className = (typeof options.className === 'string' && options.className.length > 0) ? ' ' + options.className : '';\r\n options.defaultStyle = typeof options.defaultStyle === 'string' ? options.defaultStyle : '';\r\n /** Defining menu items */\r\n options.font = !options.font ? ['Arial', 'Comic Sans MS', 'Courier New', 'Impact', 'Georgia', 'tahoma', 'Trebuchet MS', 'Verdana'] : options.font;\r\n options.fontSize = !options.fontSize ? null : options.fontSize;\r\n options.formats = !options.formats ? null : options.formats;\r\n options.colorList = !options.colorList ? null : options.colorList;\r\n options.lineHeights = !options.lineHeights ? null : options.lineHeights;\r\n options.paragraphStyles = !options.paragraphStyles ? null : options.paragraphStyles;\r\n options.textStyles = !options.textStyles ? null : options.textStyles;\r\n options.fontSizeUnit = typeof options.fontSizeUnit === 'string' ? (options.fontSizeUnit.trim().toLowerCase() || 'px') : 'px';\r\n options.alignItems = typeof options.alignItems === 'object' ? options.alignItems : (options.rtl ? ['right', 'center', 'left', 'justify'] : ['left', 'center', 'right', 'justify']);\r\n /** Image */\r\n options.imageResizing = options.imageResizing === undefined ? true : options.imageResizing;\r\n options.imageHeightShow = options.imageHeightShow === undefined ? true : !!options.imageHeightShow;\r\n options.imageAlignShow = options.imageAlignShow === undefined ? true : !!options.imageAlignShow;\r\n options.imageWidth = !options.imageWidth ? 'auto' : util.isNumber(options.imageWidth) ? options.imageWidth + 'px' : options.imageWidth;\r\n options.imageHeight = !options.imageHeight ? 'auto' : util.isNumber(options.imageHeight) ? options.imageHeight + 'px' : options.imageHeight;\r\n options.imageSizeOnlyPercentage = !!options.imageSizeOnlyPercentage;\r\n options._imageSizeUnit = options.imageSizeOnlyPercentage ? '%' : 'px';\r\n options.imageRotation = options.imageRotation !== undefined ? options.imageRotation : !(options.imageSizeOnlyPercentage || !options.imageHeightShow);\r\n options.imageFileInput = options.imageFileInput === undefined ? true : options.imageFileInput;\r\n options.imageUrlInput = (options.imageUrlInput === undefined || !options.imageFileInput) ? true : options.imageUrlInput;\r\n options.imageUploadHeader = options.imageUploadHeader || null;\r\n options.imageUploadUrl = typeof options.imageUploadUrl === 'string' ? options.imageUploadUrl : null;\r\n options.imageUploadSizeLimit = /\\d+/.test(options.imageUploadSizeLimit) ? util.getNumber(options.imageUploadSizeLimit, 0) : null;\r\n options.imageMultipleFile = !!options.imageMultipleFile;\r\n options.imageAccept = (typeof options.imageAccept !== 'string' || options.imageAccept.trim() === \"*\") ? 'image/*' : options.imageAccept.trim() || 'image/*';\r\n /** Image - image gallery */\r\n options.imageGalleryUrl = typeof options.imageGalleryUrl === 'string' ? options.imageGalleryUrl : null;\r\n options.imageGalleryHeader = options.imageGalleryHeader || null;\r\n /** Video */\r\n options.videoResizing = options.videoResizing === undefined ? true : options.videoResizing;\r\n options.videoHeightShow = options.videoHeightShow === undefined ? true : !!options.videoHeightShow;\r\n options.videoAlignShow = options.videoAlignShow === undefined ? true : !!options.videoAlignShow;\r\n options.videoRatioShow = options.videoRatioShow === undefined ? true : !!options.videoRatioShow;\r\n options.videoWidth = !options.videoWidth || !util.getNumber(options.videoWidth, 0) ? '' : util.isNumber(options.videoWidth) ? options.videoWidth + 'px' : options.videoWidth;\r\n options.videoHeight = !options.videoHeight || !util.getNumber(options.videoHeight, 0) ? '' : util.isNumber(options.videoHeight) ? options.videoHeight + 'px' : options.videoHeight;\r\n options.videoSizeOnlyPercentage = !!options.videoSizeOnlyPercentage;\r\n options._videoSizeUnit = options.videoSizeOnlyPercentage ? '%' : 'px';\r\n options.videoRotation = options.videoRotation !== undefined ? options.videoRotation : !(options.videoSizeOnlyPercentage || !options.videoHeightShow);\r\n options.videoRatio = (util.getNumber(options.videoRatio, 4) || 0.5625);\r\n options.videoRatioList = !options.videoRatioList ? null : options.videoRatioList;\r\n options.youtubeQuery = (options.youtubeQuery || '').replace('?', '');\r\n options.videoFileInput = !!options.videoFileInput;\r\n options.videoUrlInput = (options.videoUrlInput === undefined || !options.videoFileInput) ? true : options.videoUrlInput;\r\n options.videoUploadHeader = options.videoUploadHeader || null;\r\n options.videoUploadUrl = typeof options.videoUploadUrl === 'string' ? options.videoUploadUrl : null;\r\n options.videoUploadSizeLimit = /\\d+/.test(options.videoUploadSizeLimit) ? util.getNumber(options.videoUploadSizeLimit, 0) : null;\r\n options.videoMultipleFile = !!options.videoMultipleFile;\r\n options.videoTagAttrs = options.videoTagAttrs || null;\r\n options.videoIframeAttrs = options.videoIframeAttrs || null;\r\n options.videoAccept = (typeof options.videoAccept !== 'string' || options.videoAccept.trim() === \"*\") ? 'video/*' : options.videoAccept.trim() || 'video/*';\r\n /** Audio */\r\n options.audioWidth = !options.audioWidth ? '' : util.isNumber(options.audioWidth) ? options.audioWidth + 'px' : options.audioWidth;\r\n options.audioHeight = !options.audioHeight ? '' : util.isNumber(options.audioHeight) ? options.audioHeight + 'px' : options.audioHeight;\r\n options.audioFileInput = !!options.audioFileInput;\r\n options.audioUrlInput = (options.audioUrlInput === undefined || !options.audioFileInput) ? true : options.audioUrlInput;\r\n options.audioUploadHeader = options.audioUploadHeader || null;\r\n options.audioUploadUrl = typeof options.audioUploadUrl === 'string' ? options.audioUploadUrl : null;\r\n options.audioUploadSizeLimit = /\\d+/.test(options.audioUploadSizeLimit) ? util.getNumber(options.audioUploadSizeLimit, 0) : null;\r\n options.audioMultipleFile = !!options.audioMultipleFile;\r\n options.audioTagAttrs = options.audioTagAttrs || null;\r\n options.audioAccept = (typeof options.audioAccept !== 'string' || options.audioAccept.trim() === \"*\") ? 'audio/*' : options.audioAccept.trim() || 'audio/*';\r\n /** Table */\r\n options.tableCellControllerPosition = typeof options.tableCellControllerPosition === 'string' ? options.tableCellControllerPosition.toLowerCase() : 'cell';\r\n /** Link */\r\n options.linkTargetNewWindow = !!options.linkTargetNewWindow;\r\n options.linkProtocol = typeof options.linkProtocol === 'string' ? options.linkProtocol : null;\r\n options.linkRel = Array.isArray(options.linkRel) ? options.linkRel : [];\r\n options.linkRelDefault = options.linkRelDefault || {};\r\n /** HR */\r\n // options.hrItems = options.hrItems;\r\n /** Key actions */\r\n options.tabDisable = !!options.tabDisable;\r\n options.shortcutsDisable = Array.isArray(options.shortcutsDisable) ? options.shortcutsDisable : [];\r\n options.shortcutsHint = options.shortcutsHint === undefined ? true : !!options.shortcutsHint;\r\n /** Defining save button */\r\n options.callBackSave = !options.callBackSave ? null : options.callBackSave;\r\n /** Templates Array */\r\n options.templates = !options.templates ? null : options.templates;\r\n /** ETC */\r\n options.placeholder = typeof options.placeholder === 'string' ? options.placeholder : null;\r\n options.mediaAutoSelect = options.mediaAutoSelect === undefined ? true : !!options.mediaAutoSelect;\r\n /** Buttons */\r\n options.buttonList = !!options.buttonList ? options.buttonList : [\r\n ['undo', 'redo'],\r\n ['bold', 'underline', 'italic', 'strike', 'subscript', 'superscript'],\r\n ['removeFormat'],\r\n ['outdent', 'indent'],\r\n ['fullScreen', 'showBlocks', 'codeView'],\r\n ['preview', 'print']\r\n ];\r\n\r\n /** RTL - buttons */\r\n if (options.rtl) {\r\n options.buttonList = options.buttonList.reverse();\r\n }\r\n\r\n /** --- Define icons --- */\r\n // custom icons\r\n options.icons = (!options.icons || typeof options.icons !== 'object') ? _icons : [_icons, options.icons].reduce(function (_default, _new) {\r\n for (let key in _new) {\r\n if (util.hasOwn(_new, key)) _default[key] = _new[key];\r\n }\r\n return _default;\r\n }, {});\r\n // rtl icons\r\n options.icons = !options.rtl ? options.icons : [options.icons, options.icons.rtl].reduce(function (_default, _new) {\r\n for (let key in _new) {\r\n if (util.hasOwn(_new, key)) _default[key] = _new[key];\r\n }\r\n return _default;\r\n }, {});\r\n\r\n /** Private options */\r\n options.__listCommonStyle = options.__listCommonStyle || ['fontSize', 'color', 'fontFamily', 'fontWeight', 'fontStyle'];\r\n\r\n /** _init options */\r\n options._editorStyles = util._setDefaultOptionStyle(options, options.defaultStyle);\r\n },\r\n\r\n _setWhitelist: function (whitelist, blacklist) {\r\n if (typeof blacklist !== 'string') return whitelist;\r\n blacklist = blacklist.split('|');\r\n whitelist = whitelist.split('|');\r\n for (let i = 0, len = blacklist.length, index; i < len; i++) {\r\n index = whitelist.indexOf(blacklist[i]);\r\n if (index > -1) whitelist.splice(index, 1);\r\n }\r\n return whitelist.join('|');\r\n },\r\n\r\n /**\r\n * @description Suneditor's Default button list\r\n * @param {Object} options options\r\n * @private\r\n */\r\n _defaultButtons: function (options) {\r\n const icons = options.icons;\r\n const lang = options.lang;\r\n const cmd = util.isOSX_IOS ? '⌘' : 'CTRL';\r\n const addShift = util.isOSX_IOS ? '⇧' : '+SHIFT';\r\n const shortcutsDisable = !options.shortcutsHint ? ['bold', 'strike', 'underline', 'italic', 'undo', 'indent', 'save'] : options.shortcutsDisable;\r\n const indentKey = options.rtl ? ['[',']'] : [']','['];\r\n const indentIcon = options.rtl ? [icons.outdent, icons.indent] : [icons.indent, icons.outdent];\r\n\r\n return {\r\n /** default command */\r\n bold: ['', lang.toolbar.bold + '' + (shortcutsDisable.indexOf('bold') > -1 ? '' : cmd + '+B') + '', 'bold', '', icons.bold],\r\n underline: ['', lang.toolbar.underline + '' + (shortcutsDisable.indexOf('underline') > -1 ? '' : cmd + '+U') + '', 'underline', '', icons.underline],\r\n italic: ['', lang.toolbar.italic + '' + (shortcutsDisable.indexOf('italic') > -1 ? '' : cmd + '+I') + '', 'italic', '', icons.italic],\r\n strike: ['', lang.toolbar.strike + '' + (shortcutsDisable.indexOf('strike') > -1 ? '' : cmd + addShift + '+S') + '', 'strike', '', icons.strike],\r\n subscript: ['', lang.toolbar.subscript, 'SUB', '', icons.subscript],\r\n superscript: ['', lang.toolbar.superscript, 'SUP', '', icons.superscript],\r\n removeFormat: ['', lang.toolbar.removeFormat, 'removeFormat', '', icons.erase],\r\n indent: ['', lang.toolbar.indent + '' + (shortcutsDisable.indexOf('indent') > -1 ? '' : cmd + '+' + indentKey[0] + '') + '', 'indent', '', indentIcon[0]],\r\n outdent: ['', lang.toolbar.outdent + '' + (shortcutsDisable.indexOf('indent') > -1 ? '' : cmd + '+' + indentKey[1] + '') + '', 'outdent', '', indentIcon[1]],\r\n fullScreen: ['se-code-view-enabled se-resizing-enabled', lang.toolbar.fullScreen, 'fullScreen', '', icons.expansion],\r\n showBlocks: ['', lang.toolbar.showBlocks, 'showBlocks', '', icons.show_blocks],\r\n codeView: ['se-code-view-enabled se-resizing-enabled', lang.toolbar.codeView, 'codeView', '', icons.code_view],\r\n undo: ['', lang.toolbar.undo + '' + (shortcutsDisable.indexOf('undo') > -1 ? '' : cmd + '+Z') + '', 'undo', '', icons.undo],\r\n redo: ['', lang.toolbar.redo + '' + (shortcutsDisable.indexOf('undo') > -1 ? '' : cmd + '+Y / ' + cmd + addShift + '+Z') + '', 'redo', '', icons.redo],\r\n preview: ['se-resizing-enabled', lang.toolbar.preview, 'preview', '', icons.preview],\r\n print: ['se-resizing-enabled', lang.toolbar.print, 'print', '', icons.print],\r\n dir: ['', lang.toolbar[options.rtl ? 'dir_ltr' : 'dir_rtl'], 'dir', '', icons[options.rtl ? 'dir_ltr' : 'dir_rtl']],\r\n dir_ltr: ['', lang.toolbar.dir_ltr, 'dir_ltr', '', icons.dir_ltr],\r\n dir_rtl: ['', lang.toolbar.dir_rtl, 'dir_rtl', '', icons.dir_rtl],\r\n save: ['se-resizing-enabled', lang.toolbar.save + '' + (shortcutsDisable.indexOf('save') > -1 ? '' : cmd + '+S') + '', 'save', '', icons.save],\r\n /** plugins - command */\r\n blockquote: ['', lang.toolbar.tag_blockquote, 'blockquote', 'command', icons.blockquote],\r\n /** plugins - submenu */\r\n font: ['se-btn-select se-btn-tool-font', lang.toolbar.font, 'font', 'submenu', '' + lang.toolbar.font + '' + icons.arrow_down],\r\n formatBlock: ['se-btn-select se-btn-tool-format', lang.toolbar.formats, 'formatBlock', 'submenu', '' + lang.toolbar.formats + '' + icons.arrow_down],\r\n fontSize: ['se-btn-select se-btn-tool-size', lang.toolbar.fontSize, 'fontSize', 'submenu', '' + lang.toolbar.fontSize + '' + icons.arrow_down],\r\n fontColor: ['', lang.toolbar.fontColor, 'fontColor', 'submenu', icons.font_color],\r\n hiliteColor: ['', lang.toolbar.hiliteColor, 'hiliteColor', 'submenu', icons.highlight_color],\r\n align: ['se-btn-align', lang.toolbar.align, 'align', 'submenu', (options.rtl ? icons.align_right : icons.align_left)],\r\n list: ['', lang.toolbar.list, 'list', 'submenu', icons.list_number],\r\n horizontalRule: ['btn_line', lang.toolbar.horizontalRule, 'horizontalRule', 'submenu', icons.horizontal_rule],\r\n table: ['', lang.toolbar.table, 'table', 'submenu', icons.table],\r\n lineHeight: ['', lang.toolbar.lineHeight, 'lineHeight', 'submenu', icons.line_height],\r\n template: ['', lang.toolbar.template, 'template', 'submenu', icons.template],\r\n paragraphStyle: ['', lang.toolbar.paragraphStyle, 'paragraphStyle', 'submenu', icons.paragraph_style],\r\n textStyle: ['', lang.toolbar.textStyle, 'textStyle', 'submenu', icons.text_style],\r\n /** plugins - dialog */\r\n link: ['', lang.toolbar.link, 'link', 'dialog', icons.link],\r\n image: ['', lang.toolbar.image, 'image', 'dialog', icons.image],\r\n video: ['', lang.toolbar.video, 'video', 'dialog', icons.video],\r\n audio: ['', lang.toolbar.audio, 'audio', 'dialog', icons.audio],\r\n math: ['', lang.toolbar.math, 'math', 'dialog', icons.math],\r\n /** plugins - fileBrowser */\r\n imageGallery: ['', lang.toolbar.imageGallery, 'imageGallery', 'fileBrowser', icons.image_gallery]\r\n };\r\n },\r\n\r\n /**\r\n * @description Create a group div containing each module\r\n * @returns {Object}\r\n * @private\r\n */\r\n _createModuleGroup: function () {\r\n const oDiv = util.createElement('DIV');\r\n oDiv.className = 'se-btn-module se-btn-module-border';\r\n\r\n const oUl = util.createElement('UL');\r\n oUl.className = 'se-menu-list';\r\n oDiv.appendChild(oUl);\r\n\r\n return {\r\n 'div': oDiv,\r\n 'ul': oUl\r\n };\r\n },\r\n\r\n /**\r\n * @description Create a button element\r\n * @param {string} buttonClass className in button\r\n * @param {string} title Title in button\r\n * @param {string} dataCommand The data-command property of the button\r\n * @param {string} dataDisplay The data-display property of the button ('dialog', 'submenu', 'command')\r\n * @param {string} innerHTML Html in button\r\n * @param {string} _disabled Button disabled\r\n * @param {Object} _icons Icons\r\n * @returns {Object}\r\n * @private\r\n */\r\n _createButton: function (buttonClass, title, dataCommand, dataDisplay, innerHTML, _disabled, _icons) {\r\n const oLi = util.createElement('LI');\r\n const oButton = util.createElement('BUTTON');\r\n const label = (title || dataCommand);\r\n\r\n oButton.setAttribute('type', 'button');\r\n oButton.setAttribute('class', 'se-btn' + (buttonClass ? ' ' + buttonClass : '') + ' se-tooltip');\r\n oButton.setAttribute('data-command', dataCommand);\r\n oButton.setAttribute('data-display', dataDisplay);\r\n oButton.setAttribute('aria-label', label.replace(//, ''));\r\n oButton.setAttribute('tabindex', '-1');\r\n \r\n if (!innerHTML) innerHTML = '!';\r\n if (/^default\\./i.test(innerHTML)) {\r\n innerHTML = _icons[innerHTML.replace(/^default\\./i, '')];\r\n }\r\n if (/^text\\./i.test(innerHTML)) {\r\n innerHTML = innerHTML.replace(/^text\\./i, '');\r\n oButton.className += ' se-btn-more-text';\r\n }\r\n\r\n innerHTML += '' + label + '';\r\n\r\n if (_disabled) oButton.setAttribute('disabled', true);\r\n \r\n oButton.innerHTML = innerHTML;\r\n oLi.appendChild(oButton);\r\n\r\n return {\r\n 'li': oLi,\r\n 'button': oButton\r\n };\r\n },\r\n\r\n /**\r\n * @description Create editor HTML\r\n * @param {Array} doc document object\r\n * @param {Array} buttonList option.buttonList\r\n * @param {Object|null} plugins Plugins\r\n * @param {Array} options options\r\n * @returns {Object} { element: (Element) Toolbar element, plugins: (Array|null) Plugins Array, pluginCallButtons: (Object), responsiveButtons: (Array) }\r\n * @private\r\n */\r\n _createToolBar: function (doc, buttonList, plugins, options) {\r\n const separator_vertical = doc.createElement('DIV');\r\n separator_vertical.className = 'se-toolbar-separator-vertical';\r\n\r\n const tool_bar = doc.createElement('DIV');\r\n tool_bar.className = 'se-toolbar sun-editor-common';\r\n\r\n const _buttonTray = doc.createElement('DIV');\r\n _buttonTray.className = 'se-btn-tray';\r\n tool_bar.appendChild(_buttonTray);\r\n\r\n /** create button list */\r\n buttonList = JSON.parse(JSON.stringify(buttonList));\r\n const icons = options.icons;\r\n const defaultButtonList = this._defaultButtons(options);\r\n const pluginCallButtons = {};\r\n const responsiveButtons = [];\r\n\r\n let module = null;\r\n let button = null;\r\n let moduleElement = null;\r\n let buttonElement = null;\r\n let pluginName = '';\r\n let vertical = false;\r\n const moreLayer = util.createElement('DIV');\r\n moreLayer.className = 'se-toolbar-more-layer';\r\n\r\n buttonGroupLoop:\r\n for (let i = 0, more, moreContainer, moreCommand, buttonGroup, align; i < buttonList.length; i++) {\r\n more = false;\r\n align = '';\r\n buttonGroup = buttonList[i];\r\n moduleElement = this._createModuleGroup();\r\n\r\n // button object\r\n if (typeof buttonGroup === 'object') {\r\n // buttons loop\r\n for (let j = 0, moreButton; j < buttonGroup.length; j++) {\r\n button = buttonGroup[j];\r\n moreButton = false;\r\n\r\n if (/^\\%\\d+/.test(button) && j === 0) {\r\n buttonGroup[0] = button.replace(/[^\\d]/g, '');\r\n responsiveButtons.push(buttonGroup);\r\n buttonList.splice(i--, 1);\r\n continue buttonGroupLoop;\r\n }\r\n \r\n if (typeof button === 'object') {\r\n if (typeof button.add === 'function') {\r\n pluginName = button.name;\r\n module = defaultButtonList[pluginName];\r\n plugins[pluginName] = button;\r\n } else {\r\n pluginName = button.name;\r\n module = [button.buttonClass, button.title, button.name, button.dataDisplay, button.innerHTML, button._disabled];\r\n }\r\n } else {\r\n // align\r\n if (/^\\-/.test(button)) {\r\n align = button.substr(1);\r\n moduleElement.div.className += ' module-float-' + align;\r\n continue;\r\n }\r\n\r\n // rtl fix\r\n if (/^\\#/.test(button)) {\r\n const option = button.substr(1);\r\n if (option === 'fix') moduleElement.ul.className += ' se-menu-dir-fix';\r\n continue;\r\n }\r\n \r\n // more button\r\n if (/^\\:/.test(button)) {\r\n moreButton = true;\r\n const matched = button.match(/^\\:([^\\-]+)\\-([^\\-]+)\\-([^\\-]+)/);\r\n moreCommand = '__se__' + matched[1].trim();\r\n const title = matched[2].trim();\r\n const innerHTML = matched[3].trim();\r\n module = ['se-btn-more', title, moreCommand, 'MORE', innerHTML];\r\n }\r\n // buttons\r\n else {\r\n module = defaultButtonList[button];\r\n }\r\n\r\n pluginName = button;\r\n if (!module) {\r\n const custom = plugins[pluginName];\r\n if (!custom) throw Error('[SUNEDITOR.create.toolbar.fail] The button name of a plugin that does not exist. [' + pluginName + ']');\r\n module = [custom.buttonClass, custom.title, custom.name, custom.display, custom.innerHTML, custom._disabled];\r\n }\r\n }\r\n\r\n buttonElement = this._createButton(module[0], module[1], module[2], module[3], module[4], module[5], icons);\r\n (more ? moreContainer : moduleElement.ul).appendChild(buttonElement.li);\r\n\r\n if (plugins[pluginName]) {\r\n pluginCallButtons[pluginName] = buttonElement.button;\r\n }\r\n\r\n // more button\r\n if (moreButton) {\r\n more = true;\r\n moreContainer = util.createElement('DIV');\r\n moreContainer.className = 'se-more-layer ' + moreCommand;\r\n moreContainer.innerHTML = '
      ';\r\n moreLayer.appendChild(moreContainer);\r\n moreContainer = moreContainer.firstElementChild.firstElementChild;\r\n }\r\n }\r\n\r\n if (vertical) {\r\n const sv = separator_vertical.cloneNode(false);\r\n _buttonTray.appendChild(sv);\r\n }\r\n \r\n _buttonTray.appendChild(moduleElement.div);\r\n vertical = true;\r\n }\r\n /** line break */\r\n else if (/^\\/$/.test(buttonGroup)) {\r\n const enterDiv = doc.createElement('DIV');\r\n enterDiv.className = 'se-btn-module-enter';\r\n _buttonTray.appendChild(enterDiv);\r\n vertical = false;\r\n }\r\n }\r\n\r\n switch (_buttonTray.children.length) {\r\n case 0:\r\n _buttonTray.style.display = 'none';\r\n break;\r\n case 1:\r\n util.removeClass(_buttonTray.firstElementChild, 'se-btn-module-border');\r\n break;\r\n default:\r\n if (options.rtl) {\r\n const sv = separator_vertical.cloneNode(false);\r\n sv.style.float = _buttonTray.lastElementChild.style.float;\r\n _buttonTray.appendChild(sv);\r\n }\r\n }\r\n\r\n if (responsiveButtons.length > 0) responsiveButtons.unshift(buttonList);\r\n if (moreLayer.children.length > 0) _buttonTray.appendChild(moreLayer);\r\n\r\n // menu tray\r\n const _menuTray = doc.createElement('DIV');\r\n _menuTray.className = 'se-menu-tray';\r\n tool_bar.appendChild(_menuTray);\r\n\r\n // cover\r\n const tool_cover = doc.createElement('DIV');\r\n tool_cover.className = 'se-toolbar-cover';\r\n tool_bar.appendChild(tool_cover);\r\n\r\n if (options.hideToolbar) tool_bar.style.display = 'none';\r\n\r\n return {\r\n 'element': tool_bar,\r\n 'plugins': plugins,\r\n 'pluginCallButtons': pluginCallButtons,\r\n 'responsiveButtons': responsiveButtons,\r\n '_menuTray': _menuTray,\r\n '_buttonTray': _buttonTray\r\n };\r\n }\r\n};","/*\r\n * wysiwyg web editor\r\n *\r\n * suneditor.js\r\n * Copyright 2017 JiHong Lee.\r\n * MIT license.\r\n */\r\n'use strict';\r\n\r\n/**\r\n * @description Elements and variables you should have\r\n * @param {Element} element textarea element\r\n * @param {object} cons Toolbar element you created\r\n * @param {JSON|Object} options Inserted options\r\n * @returns {Object} {Elements, variables of the editor, option}\r\n * @private\r\n */\r\nconst _Context = function (element, cons, options) {\r\n return {\r\n element: {\r\n originElement: element,\r\n topArea: cons._top,\r\n relative: cons._relative,\r\n toolbar: cons._toolBar,\r\n _toolbarShadow: cons._toolbarShadow,\r\n _buttonTray: cons._toolBar.querySelector('.se-btn-tray'),\r\n _menuTray: cons._menuTray,\r\n resizingBar: cons._resizingBar,\r\n navigation: cons._navigation,\r\n charWrapper: cons._charWrapper,\r\n charCounter: cons._charCounter,\r\n editorArea: cons._editorArea,\r\n wysiwygFrame: cons._wysiwygArea,\r\n wysiwyg: cons._wysiwygArea, // if (options.iframe) cons._wysiwygArea.contentDocument.body\r\n code: cons._codeArea,\r\n placeholder: cons._placeholder,\r\n loading: cons._loading,\r\n lineBreaker: cons._lineBreaker,\r\n lineBreaker_t: cons._lineBreaker_t,\r\n lineBreaker_b: cons._lineBreaker_b,\r\n resizeBackground: cons._resizeBack,\r\n _stickyDummy: cons._stickyDummy,\r\n _arrow: cons._arrow\r\n },\r\n tool: {\r\n cover: cons._toolBar.querySelector('.se-toolbar-cover'),\r\n bold: cons._toolBar.querySelector('[data-command=\"bold\"]'),\r\n underline: cons._toolBar.querySelector('[data-command=\"underline\"]'),\r\n italic: cons._toolBar.querySelector('[data-command=\"italic\"]'),\r\n strike: cons._toolBar.querySelector('[data-command=\"strike\"]'),\r\n sub: cons._toolBar.querySelector('[data-command=\"SUB\"]'),\r\n sup: cons._toolBar.querySelector('[data-command=\"SUP\"]'),\r\n undo: cons._toolBar.querySelector('[data-command=\"undo\"]'),\r\n redo: cons._toolBar.querySelector('[data-command=\"redo\"]'),\r\n save: cons._toolBar.querySelector('[data-command=\"save\"]'),\r\n outdent: cons._toolBar.querySelector('[data-command=\"outdent\"]'),\r\n indent: cons._toolBar.querySelector('[data-command=\"indent\"]'),\r\n fullScreen: cons._toolBar.querySelector('[data-command=\"fullScreen\"]'),\r\n showBlocks: cons._toolBar.querySelector('[data-command=\"showBlocks\"]'),\r\n codeView: cons._toolBar.querySelector('[data-command=\"codeView\"]'),\r\n dir: cons._toolBar.querySelector('[data-command=\"dir\"]'),\r\n dir_ltr: cons._toolBar.querySelector('[data-command=\"dir_ltr\"]'),\r\n dir_rtl: cons._toolBar.querySelector('[data-command=\"dir_rtl\"]')\r\n },\r\n options: options,\r\n option: options\r\n };\r\n};\r\n\r\nexport default _Context;","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nexport default {\n name: 'notice',\n /**\n * @description Constructor\n * @param {Object} core Core object \n */\n add: function (core) {\n const context = core.context;\n context.notice = {};\n\n /** dialog */\n let notice_div = core.util.createElement('DIV');\n let notice_span = core.util.createElement('SPAN');\n let notice_button = core.util.createElement('BUTTON');\n\n notice_div.className = 'se-notice';\n notice_button.className = 'close';\n notice_button.setAttribute('aria-label', 'Close');\n notice_button.setAttribute('title', core.lang.dialogBox.close);\n notice_button.innerHTML = core.icons.cancel;\n \n notice_div.appendChild(notice_span);\n notice_div.appendChild(notice_button);\n\n context.notice.modal = notice_div;\n context.notice.message = notice_span;\n\n /** add event listeners */\n notice_button.addEventListener('click', this.onClick_cancel.bind(core));\n \n /** append html */\n context.element.editorArea.appendChild(notice_div);\n \n /** empty memory */\n notice_div = null;\n },\n\n /**\n * @description Event when clicking the cancel button\n * @param {MouseEvent} e Event object\n */\n onClick_cancel: function (e) {\n e.preventDefault();\n e.stopPropagation();\n this.plugins.notice.close.call(this);\n },\n\n /**\n * @description Open the notice panel\n * @param {String} text Notice message\n */\n open: function (text) {\n this.context.notice.message.textContent = text;\n this.context.notice.modal.style.display = 'block';\n },\n\n /**\n * @description Open the notice panel\n */\n close: function () {\n this.context.notice.modal.style.display = 'none';\n }\n};\n","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nimport core from './lib/core';\nimport util from './lib/util';\nimport _Constructor from './lib/constructor';\nimport _Context from './lib/context';\n\nexport default {\n /**\n * @description Returns the create function with preset options.\n * If the options overlap, the options of the 'create' function take precedence.\n * @param {Json} options Initialization options\n * @returns {Object}\n */\n init: function (init_options) {\n return {\n create: function (idOrElement, options) {\n return this.create(idOrElement, options, init_options);\n }.bind(this)\n };\n },\n\n /**\n * @description Create the suneditor\n * @param {String|Element} idOrElement textarea Id or textarea element\n * @param {JSON|Object} options user options\n * @returns {Object}\n */\n create: function (idOrElement, options, _init_options) {\n util._propertiesInit();\n\n if (typeof options !== 'object') options = {};\n if (_init_options) {\n options = [_init_options, options].reduce(function (init, option) {\n for (let key in option) {\n if (!util.hasOwn(option, key)) continue;\n if (key === 'plugins' && option[key] && init[key]) {\n let i = init[key], o = option[key];\n i = i.length ? i : Object.keys(i).map(function(name) { return i[name]; });\n o = o.length ? o : Object.keys(o).map(function(name) { return o[name]; });\n init[key] = (o.filter(function(val) { return i.indexOf(val) === -1; })).concat(i);\n } else {\n init[key] = option[key];\n }\n }\n return init;\n }, {});\n }\n \n const element = typeof idOrElement === 'string' ? document.getElementById(idOrElement) : idOrElement;\n\n if (!element) {\n if (typeof idOrElement === 'string') {\n throw Error('[SUNEDITOR.create.fail] The element for that id was not found (ID:\"' + idOrElement + '\")');\n }\n\n throw Error('[SUNEDITOR.create.fail] suneditor requires textarea\\'s element or id value');\n }\n\n const cons = _Constructor.init(element, options);\n\n if (cons.constructed._top.id && document.getElementById(cons.constructed._top.id)) {\n throw Error('[SUNEDITOR.create.fail] The ID of the suneditor you are trying to create already exists (ID:\"' + cons.constructed._top.id + '\")');\n }\n\n return core(_Context(element, cons.constructed, cons.options), cons.pluginCallButtons, cons.plugins, cons.options.lang, options, cons._responsiveButtons);\n }\n};\n","/*\r\n * wysiwyg web editor\r\n *\r\n * suneditor.js\r\n * Copyright 2017 JiHong Lee.\r\n * MIT license.\r\n */\r\n'use strict';\r\n\r\nimport _Constructor from './constructor';\r\nimport _Context from './context';\r\nimport _history from './history';\r\nimport _util from './util';\r\nimport _notice from '../plugins/modules/_notice';\r\n\r\n/**\r\n * @description SunEditor constuctor function.\r\n * create core object and event registration.\r\n * core, event, functions\r\n * @param {Object} context\r\n * @param {Object} pluginCallButtons\r\n * @param {Object} plugins \r\n * @param {Object} lang\r\n * @param {Object} options\r\n * @param {Object} _responsiveButtons\r\n * @returns {Object} functions Object\r\n */\r\nexport default function (context, pluginCallButtons, plugins, lang, options, _responsiveButtons) {\r\n const _d = context.element.originElement.ownerDocument || document;\r\n const _w = _d.defaultView || window;\r\n const util = _util;\r\n const icons = options.icons;\r\n\r\n /**\r\n * @description editor core object\r\n * should always bind this object when registering an event in the plug-in.\r\n */\r\n const core = {\r\n _d: _d,\r\n _w: _w,\r\n _parser: new _w.DOMParser(),\r\n _prevRtl: options.rtl,\r\n _editorHeight: 0,\r\n _editorHeightPadding: 0,\r\n _listCamel: options.__listCommonStyle,\r\n _listKebab: util.camelToKebabCase(options.__listCommonStyle),\r\n\r\n /**\r\n * @description Document object of the iframe if created as an iframe || _d\r\n * @private\r\n */\r\n _wd: null,\r\n\r\n /**\r\n * @description Window object of the iframe if created as an iframe || _w\r\n * @private\r\n */\r\n _ww: null,\r\n \r\n /**\r\n * @description Closest ShadowRoot to editor if found\r\n * @private\r\n */\r\n _shadowRoot: null,\r\n\r\n /**\r\n * @description Block controller mousedown events in \"shadowRoot\" environment\r\n * @private\r\n */\r\n _shadowRootControllerEventTarget: null,\r\n\r\n /**\r\n * @description Util object\r\n */\r\n util: util,\r\n\r\n /**\r\n * @description Functions object\r\n */\r\n functions: null,\r\n\r\n /**\r\n * @description Editor options\r\n */\r\n options: null,\r\n\r\n /**\r\n * @description Computed style of the wysiwyg area (window.getComputedStyle(context.element.wysiwyg))\r\n */\r\n wwComputedStyle: null,\r\n\r\n /**\r\n * @description Notice object\r\n */\r\n notice: _notice,\r\n\r\n /**\r\n * @description Default icons object\r\n */\r\n icons: icons,\r\n\r\n /**\r\n * @description History object for undo, redo\r\n */\r\n history: null,\r\n \r\n /**\r\n * @description Elements and user options parameters of the suneditor\r\n */\r\n context: context,\r\n\r\n /**\r\n * @description Plugin buttons\r\n */\r\n pluginCallButtons: pluginCallButtons,\r\n\r\n /**\r\n * @description Loaded plugins\r\n */\r\n plugins: plugins || {},\r\n\r\n /**\r\n * @description Whether the plugin is initialized\r\n */\r\n initPlugins: {},\r\n\r\n /**\r\n * @description Object for managing submenu elements\r\n * @private\r\n */\r\n _targetPlugins: {},\r\n\r\n /**\r\n * @description Save rendered submenus and containers\r\n * @private\r\n */\r\n _menuTray: {},\r\n\r\n /**\r\n * @description loaded language\r\n */\r\n lang: lang,\r\n\r\n /**\r\n * @description The selection node (core.getSelectionNode()) to which the effect was last applied\r\n */\r\n effectNode: null,\r\n\r\n /**\r\n * @description submenu element\r\n */\r\n submenu: null,\r\n\r\n /**\r\n * @description container element\r\n */\r\n container: null,\r\n\r\n /**\r\n * @description current subment name\r\n * @private\r\n */\r\n _submenuName: '',\r\n\r\n /**\r\n * @description binded submenuOff method\r\n * @private\r\n */\r\n _bindedSubmenuOff: null,\r\n\r\n /**\r\n * @description binded containerOff method\r\n * @private\r\n */\r\n _bindedContainerOff: null,\r\n\r\n /**\r\n * @description active button element in submenu\r\n */\r\n submenuActiveButton: null,\r\n\r\n /**\r\n * @description active button element in container\r\n */\r\n containerActiveButton: null,\r\n\r\n /**\r\n * @description The elements array to be processed unvisible when the controllersOff function is executed (resizing, link modified button, table controller)\r\n */\r\n controllerArray: [],\r\n\r\n /**\r\n * @description The name of the plugin that called the currently active controller\r\n */\r\n currentControllerName: '',\r\n\r\n /**\r\n * @description The target element of current controller\r\n */\r\n currentControllerTarget: null,\r\n\r\n /**\r\n * @description The file component object of current selected file tag (getFileComponent)\r\n */\r\n currentFileComponentInfo: null,\r\n\r\n /**\r\n * @description An array of buttons whose class name is not \"se-code-view-enabled\"\r\n */\r\n codeViewDisabledButtons: [],\r\n\r\n /**\r\n * @description An array of buttons whose class name is not \"se-resizing-enabled\"\r\n */\r\n resizingDisabledButtons: [],\r\n\r\n /**\r\n * @description active more layer element in submenu\r\n * @private\r\n */\r\n _moreLayerActiveButton: null,\r\n\r\n /**\r\n * @description Tag whitelist RegExp object used in \"_consistencyCheckOfHTML\" method\r\n * ^(options._editorTagsWhitelist)$\r\n * @private\r\n */\r\n _htmlCheckWhitelistRegExp: null,\r\n\r\n /**\r\n * @description Tag blacklist RegExp object used in \"_consistencyCheckOfHTML\" method\r\n * @private\r\n */\r\n _htmlCheckBlacklistRegExp: null,\r\n\r\n /**\r\n * @description RegExp when using check disallowd tags. (b, i, ins, strike, s)\r\n * @private\r\n */\r\n _disallowedTextTagsRegExp: null,\r\n\r\n /**\r\n * @description Editor tags whitelist (RegExp object)\r\n * util.createTagsWhitelist(options._editorTagsWhitelist)\r\n */\r\n editorTagsWhitelistRegExp: null,\r\n\r\n /**\r\n * @description Editor tags blacklist (RegExp object)\r\n * util.createTagsBlacklist(options.tagsBlacklist)\r\n */\r\n editorTagsBlacklistRegExp: null,\r\n\r\n /**\r\n * @description Tag whitelist when pasting (RegExp object)\r\n * util.createTagsWhitelist(options.pasteTagsWhitelist)\r\n */\r\n pasteTagsWhitelistRegExp: null,\r\n\r\n /**\r\n * @description Tag blacklist when pasting (RegExp object)\r\n * util.createTagsBlacklist(options.pasteTagsBlacklist)\r\n */\r\n pasteTagsBlacklistRegExp: null,\r\n\r\n /**\r\n * @description Boolean value of whether the editor has focus\r\n */\r\n hasFocus: false,\r\n\r\n /**\r\n * @description Boolean value of whether the editor is disabled\r\n */\r\n isDisabled: false,\r\n\r\n /**\r\n * @description Boolean value of whether the editor is readOnly\r\n */\r\n isReadOnly: false,\r\n\r\n /**\r\n * @description Attributes whitelist used by the cleanHTML method\r\n * @private\r\n */\r\n _attributesWhitelistRegExp: null,\r\n _attributesWhitelistRegExp_all_data: null,\r\n\r\n /**\r\n * @description Attributes blacklist used by the cleanHTML method\r\n * @private\r\n */\r\n _attributesBlacklistRegExp: null,\r\n\r\n /**\r\n * @description Attributes of tags whitelist used by the cleanHTML method\r\n * @private\r\n */\r\n _attributesTagsWhitelist: null,\r\n\r\n /**\r\n * @description Attributes of tags blacklist used by the cleanHTML method\r\n * @private\r\n */\r\n _attributesTagsBlacklist: null,\r\n\r\n /**\r\n * @description binded controllersOff method\r\n * @private\r\n */\r\n _bindControllersOff: null,\r\n\r\n /**\r\n * @description Is inline mode?\r\n * @private\r\n */\r\n _isInline: null,\r\n\r\n /**\r\n * @description Is balloon|balloon-always mode?\r\n * @private\r\n */\r\n _isBalloon: null,\r\n\r\n /**\r\n * @description Is balloon-always mode?\r\n * @private\r\n */\r\n _isBalloonAlways: null,\r\n\r\n /**\r\n * @description Required value when using inline mode to sticky toolbar\r\n * @private\r\n */\r\n _inlineToolbarAttr: {top: '', width: '', isShow: false},\r\n\r\n /**\r\n * @description Variable that controls the \"blur\" event in the editor of inline or balloon mode when the focus is moved to submenu\r\n * @private\r\n */\r\n _notHideToolbar: false,\r\n\r\n /**\r\n * @description Variable value that sticky toolbar mode\r\n * @private\r\n */\r\n _sticky: false,\r\n\r\n /**\r\n * @description Variables for controlling focus and blur events\r\n * @private\r\n */\r\n _antiBlur: false,\r\n\r\n /**\r\n * @description Component line breaker element\r\n * @private\r\n */\r\n _lineBreaker: null,\r\n _lineBreakerButton: null,\r\n\r\n /**\r\n * @description If true, (initialize, reset) all indexes of image, video information\r\n * @private\r\n */\r\n _componentsInfoInit: true,\r\n _componentsInfoReset: false,\r\n\r\n /**\r\n * @description Plugins array with \"active\" method.\r\n * \"activePlugins\" runs the \"add\" method when creating the editor.\r\n */\r\n activePlugins: null,\r\n\r\n /**\r\n * @description Information of tags that should maintain HTML structure, style, class name, etc. (In use by \"math\" plugin)\r\n * When inserting \"html\" such as paste, it is executed on the \"html\" to be inserted. (core.cleanHTML)\r\n * Basic Editor Actions:\r\n * 1. All classes not starting with \"__se__\" or \"se-\" in the editor are removed.\r\n * 2. The style of all tags except the \"span\" tag is removed from the editor.\r\n * \"managedTagsInfo\" structure ex:\r\n * managedTagsInfo: {\r\n * query: '.__se__xxx, se-xxx'\r\n * map: {\r\n * '__se__xxx': method.bind(core),\r\n * 'se-xxx': method.bind(core),\r\n * }\r\n * }\r\n * @example\r\n * Define in the following return format in the \"managedTagInfo\" function of the plugin.\r\n * managedTagInfo() => {\r\n * return {\r\n * className: 'string', // Class name to identify the tag. (\"__se__xxx\", \"se-xxx\")\r\n * // Change the html of the \"element\". (\"element\" is the element found with \"className\".)\r\n * // \"method\" is executed by binding \"core\".\r\n * method: function (element) {\r\n * // this === core\r\n * element.innerHTML = // (rendered html);\r\n * }\r\n * }\r\n * }\r\n */\r\n managedTagsInfo: null,\r\n\r\n /**\r\n * @description cashing: options.charCounterType === 'byte-html'\r\n * @private\r\n */\r\n _charTypeHTML: false,\r\n\r\n /**\r\n * @description Array of \"checkFileInfo\" functions with the core bound\r\n * (Plugins with \"checkFileInfo\" and \"resetFileInfo\" methods)\r\n * \"fileInfoPlugins\" runs the \"add\" method when creating the editor.\r\n * \"checkFileInfo\" method is always call just before the \"change\" event.\r\n * @private\r\n */\r\n _fileInfoPluginsCheck: null,\r\n\r\n /**\r\n * @description Array of \"resetFileInfo\" functions with the core bound\r\n * (Plugins with \"checkFileInfo\" and \"resetFileInfo\" methods)\r\n * \"checkFileInfo\" method is always call just before the \"functions.setOptions\" method.\r\n * @private\r\n */\r\n _fileInfoPluginsReset: null,\r\n\r\n /**\r\n * @description Variables for file component management\r\n * @private\r\n */\r\n _fileManager: {\r\n tags: null,\r\n regExp: null,\r\n queryString: null,\r\n pluginRegExp: null,\r\n pluginMap: null\r\n },\r\n\r\n /**\r\n * @description Elements that need to change text or className for each selection change\r\n * After creating the editor, \"activePlugins\" are added.\r\n * @property {Element} STRONG bold button\r\n * @property {Element} U underline button\r\n * @property {Element} EM italic button\r\n * @property {Element} DEL strike button\r\n * @property {Element} SUB subscript button\r\n * @property {Element} SUP superscript button\r\n * @property {Element} OUTDENT outdent button\r\n * @property {Element} INDENT indent button\r\n */\r\n commandMap: {},\r\n\r\n /**\r\n * @description CSS properties related to style tags \r\n * @private\r\n */\r\n _commandMapStyles: {\r\n STRONG: ['font-weight'],\r\n U: ['text-decoration'],\r\n EM: ['font-style'],\r\n DEL: ['text-decoration']\r\n },\r\n\r\n /**\r\n * @description Style button related to edit area\r\n * @property {Element} fullScreen fullScreen button element\r\n * @property {Element} showBlocks showBlocks button element\r\n * @property {Element} codeView codeView button element\r\n * @private\r\n */\r\n _styleCommandMap: null,\r\n\r\n /**\r\n * @private\r\n */\r\n _cleanStyleRegExp: {\r\n span: new _w.RegExp('\\\\s*[^-a-zA-Z](font-family|font-size|color|background-color)\\\\s*:[^;]+(?!;)*', 'ig'),\r\n format: new _w.RegExp('\\\\s*[^-a-zA-Z](text-align|margin-left|margin-right)\\\\s*:[^;]+(?!;)*', 'ig'),\r\n fontSizeUnit: new _w.RegExp('\\\\d+' + options.fontSizeUnit + '$', 'i'),\r\n },\r\n\r\n /**\r\n * @description Variables used internally in editor operation\r\n * @property {Boolean} isCodeView State of code view\r\n * @property {Boolean} isFullScreen State of full screen\r\n * @property {Number} innerHeight_fullScreen InnerHeight in editor when in full screen\r\n * @property {Number} resizeClientY Remember the vertical size of the editor before resizing the editor (Used when calculating during resize operation)\r\n * @property {Number} tabSize Indent size of tab (4)\r\n * @property {Number} codeIndent Indent size of Code view mode (2)\r\n * @property {Number} minResizingSize Minimum size of editing area when resized {Number} (.se-wrapper-inner {min-height: 65px;} || 65)\r\n * @property {Array} currentNodes An array of the current cursor's node structure\r\n * @private\r\n */\r\n _variable: {\r\n isChanged: false,\r\n isCodeView: false,\r\n isFullScreen: false,\r\n innerHeight_fullScreen: 0,\r\n resizeClientY: 0,\r\n tabSize: 4,\r\n codeIndent: 2,\r\n minResizingSize: util.getNumber((context.element.wysiwygFrame.style.minHeight || '65'), 0),\r\n currentNodes: [],\r\n currentNodesMap: [],\r\n _range: null,\r\n _selectionNode: null,\r\n _originCssText: context.element.topArea.style.cssText,\r\n _bodyOverflow: '',\r\n _editorAreaOriginCssText: '',\r\n _wysiwygOriginCssText: '',\r\n _codeOriginCssText: '',\r\n _fullScreenAttrs: {sticky: false, balloon: false, inline: false},\r\n _lineBreakComp: null,\r\n _lineBreakDir: ''\r\n },\r\n\r\n /**\r\n * @description Temp variable for set line attrs\r\n * @private\r\n */\r\n _formatAttrsTemp: null,\r\n\r\n /**\r\n * @description Save the current buttons states to \"allCommandButtons\" object\r\n * @private\r\n */\r\n _saveButtonStates: function () {\r\n if (!this.allCommandButtons) this.allCommandButtons = {};\r\n\r\n const currentButtons = this.context.element._buttonTray.querySelectorAll('.se-menu-list button[data-display]');\r\n for (let i = 0, element, command; i < currentButtons.length; i++) {\r\n element = currentButtons[i];\r\n command = element.getAttribute('data-command');\r\n\r\n this.allCommandButtons[command] = element;\r\n }\r\n },\r\n\r\n /**\r\n * @description Recover the current buttons states from \"allCommandButtons\" object\r\n * @private\r\n */\r\n _recoverButtonStates: function () {\r\n if (this.allCommandButtons) {\r\n const currentButtons = this.context.element._buttonTray.querySelectorAll('.se-menu-list button[data-display]'); \r\n for (let i = 0, button, command, oldButton; i < currentButtons.length; i++) {\r\n button = currentButtons[i]; \r\n command = button.getAttribute('data-command');\r\n\r\n oldButton = this.allCommandButtons[command];\r\n if (oldButton) {\r\n button.parentElement.replaceChild(oldButton, button);\r\n if (this.context.tool[command]) this.context.tool[command] = oldButton;\r\n }\r\n } \r\n }\r\n },\r\n\r\n /**\r\n * @description If the plugin is not added, add the plugin and call the 'add' function.\r\n * If the plugin is added call callBack function.\r\n * @param {String} pluginName The name of the plugin to call\r\n * @param {function} callBackFunction Function to be executed immediately after module call\r\n * @param {Element|null} _target Plugin target button (This is not necessary if you have a button list when creating the editor)\r\n */\r\n callPlugin: function (pluginName, callBackFunction, _target) {\r\n _target = _target || pluginCallButtons[pluginName];\r\n\r\n if (!this.plugins[pluginName]) {\r\n throw Error('[SUNEDITOR.core.callPlugin.fail] The called plugin does not exist or is in an invalid format. (pluginName:\"' + pluginName + '\")');\r\n } else if (!this.initPlugins[pluginName]) {\r\n this.plugins[pluginName].add(this, _target);\r\n this.initPlugins[pluginName] = true;\r\n } else if (typeof this._targetPlugins[pluginName] === 'object' && !!_target) {\r\n this.initMenuTarget(pluginName, _target, this._targetPlugins[pluginName]);\r\n }\r\n\r\n if (this.plugins[pluginName].active && !this.commandMap[pluginName] && !!_target) {\r\n this.commandMap[pluginName] = _target;\r\n this.activePlugins.push(pluginName);\r\n }\r\n \r\n if (typeof callBackFunction === 'function') callBackFunction();\r\n },\r\n\r\n /**\r\n * @description If the module is not added, add the module and call the 'add' function\r\n * @param {Array} moduleArray module object's Array [dialog, resizing]\r\n */\r\n addModule: function (moduleArray) {\r\n for (let i = 0, len = moduleArray.length, moduleName; i < len; i++) {\r\n moduleName = moduleArray[i].name;\r\n if (!this.plugins[moduleName]) {\r\n this.plugins[moduleName] = moduleArray[i];\r\n }\r\n if (!this.initPlugins[moduleName]) {\r\n this.initPlugins[moduleName] = true;\r\n if (typeof this.plugins[moduleName].add === 'function') this.plugins[moduleName].add(this);\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * @description Gets the current editor-relative scroll offset.\r\n * @returns {Object} {top, left}\r\n */\r\n getGlobalScrollOffset: function () {\r\n let t = 0, l = 0;\r\n let el = context.element.topArea;\r\n while (el) {\r\n t += el.scrollTop;\r\n l += el.scrollLeft;\r\n el = el.parentElement;\r\n }\r\n \r\n el = this._shadowRoot ? this._shadowRoot.host : null;\r\n while (el) {\r\n t += el.scrollTop;\r\n l += el.scrollLeft;\r\n el = el.parentElement;\r\n }\r\n\r\n return {\r\n top: t,\r\n left: l\r\n };\r\n },\r\n\r\n /**\r\n * @description Method for managing submenu element.\r\n * You must add the \"submenu\" element using the this method at custom plugin.\r\n * @param {String} pluginName Plugin name\r\n * @param {Element|null} target Target button\r\n * @param {Element} menu Submenu element\r\n */\r\n initMenuTarget: function (pluginName, target, menu) {\r\n if (!target) {\r\n this._targetPlugins[pluginName] = menu;\r\n } else {\r\n context.element._menuTray.appendChild(menu);\r\n this._targetPlugins[pluginName] = true;\r\n this._menuTray[target.getAttribute('data-command')] = menu;\r\n }\r\n },\r\n\r\n /**\r\n * @description Enable submenu\r\n * @param {Element} element Submenu's button element to call\r\n */\r\n submenuOn: function (element) {\r\n if (this._bindedSubmenuOff) this._bindedSubmenuOff();\r\n if (this._bindControllersOff) this.controllersOff();\r\n\r\n const submenuName = this._submenuName = element.getAttribute('data-command');\r\n const menu = this.submenu = this._menuTray[submenuName];\r\n this.submenuActiveButton = element;\r\n this._setMenuPosition(element, menu);\r\n \r\n this._bindedSubmenuOff = this.submenuOff.bind(this);\r\n this.addDocEvent('mousedown', this._bindedSubmenuOff, false);\r\n\r\n if (this.plugins[submenuName].on) this.plugins[submenuName].on.call(this);\r\n this._antiBlur = true;\r\n },\r\n\r\n /**\r\n * @description Disable submenu\r\n */\r\n submenuOff: function () {\r\n this.removeDocEvent('mousedown', this._bindedSubmenuOff);\r\n this._bindedSubmenuOff = null;\r\n\r\n if (this.submenu) {\r\n this._submenuName = '';\r\n this.submenu.style.display = 'none';\r\n this.submenu = null;\r\n util.removeClass(this.submenuActiveButton, 'on');\r\n this.submenuActiveButton = null;\r\n this._notHideToolbar = false;\r\n }\r\n\r\n this._antiBlur = false;\r\n },\r\n\r\n /**\r\n * @description Disable more layer\r\n */\r\n moreLayerOff: function() {\r\n if (this._moreLayerActiveButton) {\r\n const layer = context.element.toolbar.querySelector('.' + this._moreLayerActiveButton.getAttribute('data-command'));\r\n layer.style.display = 'none';\r\n util.removeClass(this._moreLayerActiveButton, 'on');\r\n this._moreLayerActiveButton = null;\r\n }\r\n },\r\n\r\n /**\r\n * @description Enable container\r\n * @param {Element} element Container's button element to call\r\n */\r\n containerOn: function (element) {\r\n if (this._bindedContainerOff) this._bindedContainerOff();\r\n\r\n const containerName = this._containerName = element.getAttribute('data-command');\r\n const menu = this.container = this._menuTray[containerName];\r\n this.containerActiveButton = element;\r\n this._setMenuPosition(element, menu);\r\n \r\n this._bindedContainerOff = this.containerOff.bind(this);\r\n this.addDocEvent('mousedown', this._bindedContainerOff, false);\r\n\r\n if (this.plugins[containerName].on) this.plugins[containerName].on.call(this);\r\n this._antiBlur = true;\r\n },\r\n\r\n /**\r\n * @description Disable container\r\n */\r\n containerOff: function () {\r\n this.removeDocEvent('mousedown', this._bindedContainerOff);\r\n this._bindedContainerOff = null;\r\n\r\n if (this.container) {\r\n this._containerName = '';\r\n this.container.style.display = 'none';\r\n this.container = null;\r\n util.removeClass(this.containerActiveButton, 'on');\r\n this.containerActiveButton = null;\r\n this._notHideToolbar = false;\r\n }\r\n\r\n this._antiBlur = false;\r\n },\r\n\r\n /**\r\n * @description Set the menu position. (submenu, container)\r\n * @param {*} element Button element\r\n * @param {*} menu Menu element\r\n * @private\r\n */\r\n _setMenuPosition: function (element, menu) {\r\n menu.style.visibility = 'hidden';\r\n menu.style.display = 'block';\r\n menu.style.height = '';\r\n util.addClass(element, 'on');\r\n\r\n const toolbar = this.context.element.toolbar;\r\n const toolbarW = toolbar.offsetWidth;\r\n const toolbarOffset = event._getEditorOffsets(context.element.toolbar);\r\n const menuW = menu.offsetWidth;\r\n const l = element.parentElement.offsetLeft + 3;\r\n\r\n // rtl\r\n if (options.rtl) {\r\n const elementW = element.offsetWidth;\r\n const rtlW = menuW > elementW ? menuW - elementW : 0;\r\n const rtlL = rtlW > 0 ? 0 : elementW - menuW;\r\n menu.style.left = (l - rtlW + rtlL) + 'px';\r\n if (toolbarOffset.left > event._getEditorOffsets(menu).left) {\r\n menu.style.left = '0px';\r\n }\r\n } else {\r\n const overLeft = toolbarW <= menuW ? 0 : toolbarW - (l + menuW);\r\n if (overLeft < 0) menu.style.left = (l + overLeft) + 'px';\r\n else menu.style.left = l + 'px';\r\n }\r\n\r\n // get element top\r\n let t = 0;\r\n let offsetEl = element;\r\n while (offsetEl && offsetEl !== toolbar) {\r\n t += offsetEl.offsetTop;\r\n offsetEl = offsetEl.offsetParent;\r\n }\r\n\r\n const bt = t;\r\n if (this._isBalloon) {\r\n t += toolbar.offsetTop + element.offsetHeight;\r\n } else {\r\n t -= element.offsetHeight;\r\n }\r\n\r\n // set menu position\r\n const toolbarTop = toolbarOffset.top;\r\n const menuHeight = menu.offsetHeight;\r\n const scrollTop = this.getGlobalScrollOffset().top;\r\n\r\n const menuHeight_bottom = _w.innerHeight - (toolbarTop - scrollTop + bt + element.parentElement.offsetHeight);\r\n if (menuHeight_bottom < menuHeight) {\r\n let menuTop = -1 * (menuHeight - bt + 3);\r\n const insTop = toolbarTop - scrollTop + menuTop;\r\n const menuHeight_top = menuHeight + (insTop < 0 ? insTop : 0);\r\n \r\n if (menuHeight_top > menuHeight_bottom) {\r\n menu.style.height = menuHeight_top + 'px';\r\n menuTop = -1 * (menuHeight_top - bt + 3);\r\n } else {\r\n menu.style.height = menuHeight_bottom + 'px';\r\n menuTop = bt + element.parentElement.offsetHeight;\r\n }\r\n\r\n menu.style.top = menuTop + 'px';\r\n } else {\r\n menu.style.top = (bt + element.parentElement.offsetHeight) + 'px';\r\n }\r\n\r\n menu.style.visibility = '';\r\n },\r\n\r\n /**\r\n * @description Show controller at editor area (controller elements, function, \"controller target element(@Required)\", \"controller name(@Required)\", etc..)\r\n * @param {*} arguments controller elements, functions..\r\n */\r\n controllersOn: function () {\r\n if (this._bindControllersOff) this._bindControllersOff();\r\n this.controllerArray = [];\r\n\r\n for (let i = 0, arg; i < arguments.length; i++) {\r\n arg = arguments[i];\r\n if (!arg) continue;\r\n \r\n if (typeof arg === 'string') {\r\n this.currentControllerName = arg;\r\n continue;\r\n }\r\n if (typeof arg === 'function') {\r\n this.controllerArray.push(arg);\r\n continue;\r\n }\r\n if (!util.hasClass(arg, 'se-controller')) {\r\n this.currentControllerTarget = arg;\r\n this.currentFileComponentInfo = this.getFileComponent(arg);\r\n continue;\r\n }\r\n if (arg.style) {\r\n arg.style.display = 'block';\r\n if (this._shadowRoot && this._shadowRootControllerEventTarget.indexOf(arg) === -1) {\r\n arg.addEventListener('mousedown', function (e) { e.preventDefault(); e.stopPropagation(); });\r\n this._shadowRootControllerEventTarget.push(arg);\r\n }\r\n }\r\n this.controllerArray.push(arg);\r\n }\r\n\r\n this._bindControllersOff = this.controllersOff.bind(this);\r\n this.addDocEvent('mousedown', this._bindControllersOff, false);\r\n this.addDocEvent('keydown', this._bindControllersOff, false);\r\n this._antiBlur = true;\r\n\r\n if (typeof functions.showController === 'function') functions.showController(this.currentControllerName, this.controllerArray, this);\r\n },\r\n\r\n /**\r\n * @description Hide controller at editor area (link button, image resize button..)\r\n * @param {KeyboardEvent|MouseEvent|null} e Event object when called from mousedown and keydown events registered in \"core.controllersOn\"\r\n */\r\n controllersOff: function (e) {\r\n this._lineBreaker.style.display = 'none';\r\n const len = this.controllerArray.length;\r\n\r\n if (e && e.target && len > 0) {\r\n for (let i = 0; i < len; i++) {\r\n if (typeof this.controllerArray[i].contains === 'function' && this.controllerArray[i].contains(e.target)) return;\r\n }\r\n }\r\n \r\n if (this._fileManager.pluginRegExp.test(this.currentControllerName) && e && e.type === 'keydown' && e.keyCode !== 27) return;\r\n context.element.lineBreaker_t.style.display = context.element.lineBreaker_b.style.display = 'none';\r\n this._variable._lineBreakComp = null;\r\n\r\n this.currentControllerName = '';\r\n this.currentControllerTarget = null;\r\n this.currentFileComponentInfo = null;\r\n this.effectNode = null;\r\n if (!this._bindControllersOff) return;\r\n\r\n this.removeDocEvent('mousedown', this._bindControllersOff);\r\n this.removeDocEvent('keydown', this._bindControllersOff);\r\n this._bindControllersOff = null;\r\n\r\n if (len > 0) {\r\n for (let i = 0; i < len; i++) {\r\n if (typeof this.controllerArray[i] === 'function') this.controllerArray[i]();\r\n else this.controllerArray[i].style.display = 'none';\r\n }\r\n\r\n this.controllerArray = [];\r\n }\r\n\r\n this._antiBlur = false;\r\n },\r\n\r\n /**\r\n * @description Specify the position of the controller.\r\n * @param {Element} controller Controller element.\r\n * @param {Element} referEl Element that is the basis of the controller's position.\r\n * @param {String} position Type of position (\"top\" | \"bottom\")\r\n * When using the \"top\" position, there should not be an arrow on the controller.\r\n * When using the \"bottom\" position there should be an arrow on the controller.\r\n * @param {Object} addOffset These are the left and top values that need to be added specially. \r\n * This argument is required. - {left: 0, top: 0}\r\n * Please enter the value based on ltr mode.\r\n * Calculated automatically in rtl mode.\r\n */\r\n setControllerPosition: function (controller, referEl, position, addOffset) {\r\n if (options.rtl) addOffset.left *= -1;\r\n\r\n const offset = util.getOffset(referEl, context.element.wysiwygFrame);\r\n controller.style.visibility = 'hidden';\r\n controller.style.display = 'block';\r\n\r\n // Height value of the arrow element is 11px\r\n const topMargin = position === 'top' ? -(controller.offsetHeight + 2) : (referEl.offsetHeight + 12);\r\n controller.style.top = (offset.top + topMargin + addOffset.top) + 'px';\r\n\r\n const l = offset.left - context.element.wysiwygFrame.scrollLeft + addOffset.left;\r\n const controllerW = controller.offsetWidth;\r\n const referElW = referEl.offsetWidth;\r\n \r\n const allow = util.hasClass(controller.firstElementChild, 'se-arrow') ? controller.firstElementChild : null;\r\n\r\n // rtl (Width value of the arrow element is 22px)\r\n if (options.rtl) {\r\n const rtlW = (controllerW > referElW) ? controllerW - referElW : 0;\r\n const rtlL = rtlW > 0 ? 0 : referElW - controllerW;\r\n controller.style.left = (l - rtlW + rtlL) + 'px';\r\n \r\n if (rtlW > 0) {\r\n if (allow) allow.style.left = ((controllerW - 14 < 10 + rtlW) ? (controllerW - 14) : (10 + rtlW)) + 'px';\r\n }\r\n \r\n const overSize = context.element.wysiwygFrame.offsetLeft - controller.offsetLeft;\r\n if (overSize > 0) {\r\n controller.style.left = '0px';\r\n if (allow) allow.style.left = overSize + 'px';\r\n }\r\n } else {\r\n controller.style.left = l + 'px';\r\n\r\n const overSize = context.element.wysiwygFrame.offsetWidth - (controller.offsetLeft + controllerW);\r\n if (overSize < 0) {\r\n controller.style.left = (controller.offsetLeft + overSize) + 'px';\r\n if (allow) allow.style.left = (20 - overSize) + 'px';\r\n } else {\r\n if (allow) allow.style.left = '20px';\r\n }\r\n }\r\n\r\n controller.style.visibility = '';\r\n },\r\n\r\n /**\r\n * @description javascript execCommand\r\n * @param {String} command javascript execCommand function property\r\n * @param {Boolean|undefined} showDefaultUI javascript execCommand function property\r\n * @param {String|undefined} value javascript execCommand function property\r\n */\r\n execCommand: function (command, showDefaultUI, value) {\r\n this._wd.execCommand(command, showDefaultUI, (command === 'formatBlock' ? '<' + value + '>' : value));\r\n // history stack\r\n this.history.push(true);\r\n },\r\n\r\n /**\r\n * @description Focus to wysiwyg area using \"native focus function\"\r\n */\r\n nativeFocus: function () {\r\n this.__focus();\r\n this._editorRange();\r\n },\r\n\r\n /**\r\n * @description Focus method\r\n * @private\r\n */\r\n __focus: function () {\r\n const caption = util.getParentElement(this.getSelectionNode(), 'figcaption');\r\n if (caption) {\r\n caption.focus();\r\n } else {\r\n context.element.wysiwyg.focus();\r\n }\r\n },\r\n\r\n /**\r\n * @description Focus to wysiwyg area\r\n */\r\n focus: function () {\r\n if (context.element.wysiwygFrame.style.display === 'none') return;\r\n\r\n if (options.iframe) {\r\n this.nativeFocus();\r\n } else {\r\n try {\r\n const range = this.getRange();\r\n if (range.startContainer === range.endContainer && util.isWysiwygDiv(range.startContainer)) {\r\n const currentNode = range.commonAncestorContainer.children[range.startOffset];\r\n if (!util.isFormatElement(currentNode) && !util.isComponent(currentNode)) {\r\n const format = util.createElement(options.defaultTag);\r\n const br = util.createElement('BR');\r\n format.appendChild(br);\r\n context.element.wysiwyg.insertBefore(format, currentNode);\r\n this.setRange(br, 0, br, 0);\r\n return;\r\n }\r\n }\r\n this.setRange(range.startContainer, range.startOffset, range.endContainer, range.endOffset);\r\n } catch (e) {\r\n this.nativeFocus();\r\n }\r\n }\r\n\r\n event._applyTagEffects();\r\n if (this._isBalloon) event._toggleToolbarBalloon();\r\n },\r\n\r\n /**\r\n * @description If \"focusEl\" is a component, then that component is selected; if it is a format element, the last text is selected\r\n * If \"focusEdge\" is null, then selected last element\r\n * @param {Element|null} focusEl Focus element\r\n */\r\n focusEdge: function (focusEl) {\r\n if (!focusEl) focusEl = context.element.wysiwyg.lastElementChild;\r\n\r\n const fileComponentInfo = this.getFileComponent(focusEl);\r\n if (fileComponentInfo) {\r\n this.selectComponent(fileComponentInfo.target, fileComponentInfo.pluginName);\r\n } else if (focusEl) {\r\n focusEl = util.getChildElement(focusEl, function (current) { return current.childNodes.length === 0 || current.nodeType === 3; }, true);\r\n if (!focusEl) this.nativeFocus();\r\n else this.setRange(focusEl, focusEl.textContent.length, focusEl, focusEl.textContent.length);\r\n } else {\r\n this.focus();\r\n }\r\n },\r\n\r\n /**\r\n * @description Focusout to wysiwyg area (.blur())\r\n */\r\n blur: function () {\r\n if (options.iframe) {\r\n context.element.wysiwygFrame.blur();\r\n } else {\r\n context.element.wysiwyg.blur();\r\n }\r\n },\r\n\r\n /**\r\n * @description Set current editor's range object and return.\r\n * @param {Node} startCon The startContainer property of the selection object.\r\n * @param {Number} startOff The startOffset property of the selection object.\r\n * @param {Node} endCon The endContainer property of the selection object.\r\n * @param {Number} endOff The endOffset property of the selection object.\r\n * @returns {Object} Range object.\r\n */\r\n setRange: function (startCon, startOff, endCon, endOff) {\r\n if (!startCon || !endCon) return;\r\n if (startOff > startCon.textContent.length) startOff = startCon.textContent.length;\r\n if (endOff > endCon.textContent.length) endOff = endCon.textContent.length;\r\n if (util.isFormatElement(startCon)) {\r\n startCon = startCon.childNodes[startOff] || startCon.childNodes[startOff - 1] || startCon;\r\n startOff = startOff > 0 ? startCon.nodeType === 1 ? 1 : startCon.textContent ? startCon.textContent.length : 0 : 0;\r\n }\r\n if (util.isFormatElement(endCon)) {\r\n endCon = endCon.childNodes[endOff] || endCon.childNodes[endOff - 1] || endCon;\r\n endOff = endOff > 0 ? endCon.nodeType === 1 ? 1 : endCon.textContent ? endCon.textContent.length : 0 : 0;\r\n }\r\n \r\n const range = this._wd.createRange();\r\n\r\n try {\r\n range.setStart(startCon, startOff);\r\n range.setEnd(endCon, endOff);\r\n } catch (error) {\r\n console.warn('[SUNEDITOR.core.focus.error] ' + error);\r\n this.nativeFocus();\r\n return;\r\n }\r\n\r\n const selection = this.getSelection();\r\n\r\n if (selection.removeAllRanges) {\r\n selection.removeAllRanges();\r\n }\r\n\r\n selection.addRange(range);\r\n this._rangeInfo(range, this.getSelection());\r\n if (options.iframe) this.__focus();\r\n\r\n return range;\r\n },\r\n\r\n /**\r\n * @description Remove range object and button effect\r\n */\r\n removeRange: function () {\r\n this._variable._range = null;\r\n this._variable._selectionNode = null;\r\n if (this.hasFocus) this.getSelection().removeAllRanges();\r\n this._setKeyEffect([]);\r\n },\r\n\r\n /**\r\n * @description Get current editor's range object\r\n * @returns {Object}\r\n */\r\n getRange: function () {\r\n const range = this._variable._range || this._createDefaultRange();\r\n const selection = this.getSelection();\r\n if (range.collapsed === selection.isCollapsed || !context.element.wysiwyg.contains(selection.focusNode)) return range;\r\n \r\n if (selection.rangeCount > 0) {\r\n this._variable._range = selection.getRangeAt(0);\r\n return this._variable._range;\r\n } else {\r\n const sc = selection.anchorNode, ec = selection.focusNode, so = selection.anchorOffset, eo = selection.focusOffset;\r\n const compareValue = util.compareElements(sc, ec);\r\n const rightDir = compareValue.ancestor && (compareValue.result === 0 ? so <= eo : compareValue.result > 1 ? true : false);\r\n return this.setRange(\r\n rightDir ? sc : ec,\r\n rightDir ? so : eo,\r\n rightDir ? ec : sc,\r\n rightDir ? eo : so\r\n );\r\n }\r\n },\r\n\r\n /**\r\n * @description If the \"range\" object is a non-editable area, add a line at the top of the editor and update the \"range\" object.\r\n * Returns a new \"range\" or argument \"range\".\r\n * @param {Object} range core.getRange()\r\n * @param {Element|null} container If there is \"container\" argument, it creates a line in front of the container.\r\n * @returns {Object} range\r\n */\r\n getRange_addLine: function (range, container) {\r\n if (this._selectionVoid(range)) {\r\n const wysiwyg = context.element.wysiwyg;\r\n const op = util.createElement(options.defaultTag);\r\n op.innerHTML = '
      ';\r\n wysiwyg.insertBefore(op, container && container !== wysiwyg ? container.nextElementSibling : wysiwyg.firstElementChild);\r\n this.setRange(op.firstElementChild, 0, op.firstElementChild, 1);\r\n range = this._variable._range;\r\n }\r\n return range;\r\n },\r\n\r\n /**\r\n * @description Get window selection obejct\r\n * @returns {Object}\r\n */\r\n getSelection: function () {\r\n const selection = this._shadowRoot && this._shadowRoot.getSelection ? this._shadowRoot.getSelection() : this._ww.getSelection();\r\n if (!this._variable._range && !context.element.wysiwyg.contains(selection.focusNode)) {\r\n selection.removeAllRanges();\r\n selection.addRange(this._createDefaultRange());\r\n }\r\n return selection;\r\n },\r\n\r\n /**\r\n * @description Get current select node\r\n * @returns {Node}\r\n */\r\n getSelectionNode: function () {\r\n if (!context.element.wysiwyg.contains(this._variable._selectionNode)) this._editorRange();\r\n if (!this._variable._selectionNode) {\r\n const selectionNode = util.getChildElement(context.element.wysiwyg.firstChild, function (current) { return current.childNodes.length === 0 || current.nodeType === 3; }, false);\r\n if (!selectionNode) {\r\n this._editorRange();\r\n } else {\r\n this._variable._selectionNode = selectionNode;\r\n return selectionNode;\r\n }\r\n }\r\n return this._variable._selectionNode;\r\n },\r\n\r\n /**\r\n * @description Saving the range object and the currently selected node of editor\r\n * @private\r\n */\r\n _editorRange: function () {\r\n const activeEl = this._wd.activeElement;\r\n if (util.isInputElement(activeEl)) {\r\n this._variable._selectionNode = activeEl;\r\n return activeEl;\r\n }\r\n\r\n const selection = this.getSelection();\r\n if (!selection) return null;\r\n let range = null;\r\n\r\n if (selection.rangeCount > 0) {\r\n range = selection.getRangeAt(0);\r\n } else {\r\n range = this._createDefaultRange();\r\n }\r\n\r\n this._rangeInfo(range, selection);\r\n },\r\n\r\n /**\r\n * @description Set \"range\" and \"selection\" info.\r\n * @param {Object} range range object.\r\n * @param {Object} selection selection object.\r\n */\r\n _rangeInfo: function (range, selection) {\r\n let selectionNode = null;\r\n this._variable._range = range;\r\n\r\n if (range.collapsed) {\r\n if (util.isWysiwygDiv(range.commonAncestorContainer)) selectionNode = range.commonAncestorContainer.children[range.startOffset] || range.commonAncestorContainer;\r\n else selectionNode = range.commonAncestorContainer;\r\n } else {\r\n selectionNode = selection.extentNode || selection.anchorNode;\r\n }\r\n\r\n this._variable._selectionNode = selectionNode;\r\n },\r\n\r\n /**\r\n * @description Return the range object of editor's first child node\r\n * @returns {Object}\r\n * @private\r\n */\r\n _createDefaultRange: function () {\r\n const wysiwyg = context.element.wysiwyg;\r\n const range = this._wd.createRange();\r\n\r\n let firstFormat = wysiwyg.firstElementChild;\r\n let focusEl = null;\r\n if (!firstFormat) {\r\n firstFormat = util.createElement(options.defaultTag);\r\n focusEl = util.createElement('BR');\r\n firstFormat.appendChild(focusEl);\r\n wysiwyg.appendChild(firstFormat);\r\n } else {\r\n focusEl = firstFormat.firstChild;\r\n if (!focusEl) {\r\n focusEl = util.createElement('BR');\r\n firstFormat.appendChild(focusEl);\r\n }\r\n }\r\n\r\n range.setStart(focusEl, 0);\r\n range.setEnd(focusEl, 0);\r\n \r\n return range;\r\n },\r\n\r\n /**\r\n * @description Returns true if there is no valid \"selection\".\r\n * @param {Object} range core.getRange()\r\n * @returns {Object} range\r\n * @private\r\n */\r\n _selectionVoid: function (range) {\r\n const comm = range.commonAncestorContainer;\r\n return (util.isWysiwygDiv(range.startContainer) && util.isWysiwygDiv(range.endContainer)) || /FIGURE/i.test(comm.nodeName) || this._fileManager.regExp.test(comm.nodeName) || util.isMediaComponent(comm);\r\n },\r\n\r\n /**\r\n * @description Reset range object to text node selected status.\r\n * @returns {Boolean} Returns false if there is no valid selection.\r\n * @private\r\n */\r\n _resetRangeToTextNode: function () {\r\n const range = this.getRange();\r\n if (this._selectionVoid(range)) return false;\r\n \r\n let startCon = range.startContainer;\r\n let startOff = range.startOffset;\r\n let endCon = range.endContainer;\r\n let endOff = range.endOffset;\r\n let tempCon, tempOffset, tempChild;\r\n\r\n if (util.isFormatElement(startCon)) {\r\n if (!startCon.childNodes[startOff]) {\r\n startCon = startCon.lastChild || startCon;\r\n startOff = startCon.textContent.length;\r\n } else {\r\n startCon = startCon.childNodes[startOff] || startCon;\r\n startOff = 0;\r\n }\r\n while (startCon && startCon.nodeType === 1 && startCon.firstChild) {\r\n startCon = startCon.firstChild || startCon;\r\n startOff = 0;\r\n }\r\n }\r\n if (util.isFormatElement(endCon)) {\r\n endCon = endCon.childNodes[endOff] || endCon.lastChild || endCon;\r\n while (endCon && endCon.nodeType === 1 && endCon.lastChild) {\r\n endCon = endCon.lastChild;\r\n }\r\n endOff = endCon.textContent.length;\r\n }\r\n\r\n // startContainer\r\n tempCon = util.isWysiwygDiv(startCon) ? context.element.wysiwyg.firstChild : startCon;\r\n tempOffset = startOff;\r\n\r\n if (util.isBreak(tempCon) || (tempCon.nodeType === 1 && tempCon.childNodes.length > 0)) {\r\n const onlyBreak = util.isBreak(tempCon);\r\n if (!onlyBreak) {\r\n while (tempCon && !util.isBreak(tempCon) && tempCon.nodeType === 1) {\r\n tempCon = tempCon.childNodes[tempOffset] || tempCon.nextElementSibling || tempCon.nextSibling;\r\n tempOffset = 0;\r\n }\r\n \r\n let format = util.getFormatElement(tempCon, null);\r\n if (format === util.getRangeFormatElement(format, null)) {\r\n format = util.createElement(util.getParentElement(tempCon, util.isCell) ? 'DIV' : options.defaultTag);\r\n tempCon.parentNode.insertBefore(format, tempCon);\r\n format.appendChild(tempCon);\r\n }\r\n }\r\n\r\n if (util.isBreak(tempCon)) {\r\n const emptyText = util.createTextNode(util.zeroWidthSpace);\r\n tempCon.parentNode.insertBefore(emptyText, tempCon);\r\n tempCon = emptyText;\r\n if (onlyBreak) {\r\n if (startCon === endCon) {\r\n endCon = tempCon;\r\n endOff = 1;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // set startContainer\r\n startCon = tempCon;\r\n startOff = tempOffset;\r\n\r\n // endContainer\r\n tempCon = util.isWysiwygDiv(endCon) ? context.element.wysiwyg.lastChild : endCon;\r\n tempOffset = endOff;\r\n\r\n if (util.isBreak(tempCon) || (tempCon.nodeType === 1 && tempCon.childNodes.length > 0)) {\r\n const onlyBreak = util.isBreak(tempCon);\r\n if (!onlyBreak) {\r\n while (tempCon && !util.isBreak(tempCon) && tempCon.nodeType === 1) {\r\n tempChild = tempCon.childNodes;\r\n if (tempChild.length === 0) break;\r\n tempCon = tempChild[tempOffset > 0 ? tempOffset - 1 : tempOffset] || !/FIGURE/i.test(tempChild[0].nodeName) ? tempChild[0] : (tempCon.previousElementSibling || tempCon.previousSibling || startCon);\r\n tempOffset = tempOffset > 0 ? tempCon.textContent.length : tempOffset;\r\n }\r\n \r\n let format = util.getFormatElement(tempCon, null);\r\n if (format === util.getRangeFormatElement(format, null)) {\r\n format = util.createElement(util.isCell(format) ? 'DIV' : options.defaultTag);\r\n tempCon.parentNode.insertBefore(format, tempCon);\r\n format.appendChild(tempCon);\r\n }\r\n }\r\n\r\n if (util.isBreak(tempCon)) {\r\n const emptyText = util.createTextNode(util.zeroWidthSpace);\r\n tempCon.parentNode.insertBefore(emptyText, tempCon);\r\n tempCon = emptyText;\r\n tempOffset = 1;\r\n if (onlyBreak && !tempCon.previousSibling) {\r\n util.removeItem(endCon);\r\n }\r\n }\r\n }\r\n\r\n // set endContainer\r\n endCon = tempCon;\r\n endOff = tempOffset;\r\n\r\n // set Range\r\n this.setRange(startCon, startOff, endCon, endOff);\r\n return true;\r\n },\r\n\r\n /**\r\n * @description Returns a \"formatElement\"(util.isFormatElement) array from the currently selected range.\r\n * @param {Function|null} validation The validation function. (Replaces the default validation function-util.isFormatElement(current))\r\n * @returns {Array}\r\n */\r\n getSelectedElements: function (validation) {\r\n if (!this._resetRangeToTextNode()) return [];\r\n let range = this.getRange();\r\n\r\n if (util.isWysiwygDiv(range.startContainer)) {\r\n const children = context.element.wysiwyg.children;\r\n if (children.length === 0) return [];\r\n this.setRange(children[0], 0, children[children.length - 1], children[children.length - 1].textContent.trim().length);\r\n range = this.getRange();\r\n }\r\n\r\n const startCon = range.startContainer;\r\n const endCon = range.endContainer;\r\n const commonCon = range.commonAncestorContainer;\r\n\r\n // get line nodes\r\n const lineNodes = util.getListChildren(commonCon, function (current) {\r\n return validation ? validation(current) : util.isFormatElement(current);\r\n });\r\n\r\n if (!util.isWysiwygDiv(commonCon) && !util.isRangeFormatElement(commonCon)) lineNodes.unshift(util.getFormatElement(commonCon, null));\r\n if (startCon === endCon || lineNodes.length === 1) return lineNodes;\r\n\r\n let startLine = util.getFormatElement(startCon, null);\r\n let endLine = util.getFormatElement(endCon, null);\r\n let startIdx = null;\r\n let endIdx = null;\r\n \r\n const onlyTable = function (current) {\r\n return util.isTable(current) ? /^TABLE$/i.test(current.nodeName) : true;\r\n };\r\n\r\n let startRangeEl = util.getRangeFormatElement(startLine, onlyTable);\r\n let endRangeEl = util.getRangeFormatElement(endLine, onlyTable);\r\n if (util.isTable(startRangeEl) && util.isListCell(startRangeEl.parentNode)) startRangeEl = startRangeEl.parentNode;\r\n if (util.isTable(endRangeEl) && util.isListCell(endRangeEl.parentNode)) endRangeEl = endRangeEl.parentNode;\r\n \r\n const sameRange = startRangeEl === endRangeEl;\r\n for (let i = 0, len = lineNodes.length, line; i < len; i++) {\r\n line = lineNodes[i];\r\n\r\n if (startLine === line || (!sameRange && line === startRangeEl)) {\r\n startIdx = i;\r\n continue;\r\n }\r\n\r\n if (endLine === line || (!sameRange && line === endRangeEl)) {\r\n endIdx = i;\r\n break;\r\n }\r\n }\r\n\r\n if (startIdx === null) startIdx = 0;\r\n if (endIdx === null) endIdx = lineNodes.length - 1;\r\n\r\n return lineNodes.slice(startIdx, endIdx + 1);\r\n },\r\n\r\n /**\r\n * @description Get format elements and components from the selected area. (P, DIV, H[1-6], OL, UL, TABLE..)\r\n * If some of the component are included in the selection, get the entire that component.\r\n * @param {Boolean} removeDuplicate If true, if there is a parent and child tag among the selected elements, the child tag is excluded.\r\n * @returns {Array}\r\n */\r\n getSelectedElementsAndComponents: function (removeDuplicate) {\r\n const commonCon = this.getRange().commonAncestorContainer;\r\n const myComponent = util.getParentElement(commonCon, util.isComponent);\r\n const selectedLines = util.isTable(commonCon) ? \r\n this.getSelectedElements(null) :\r\n this.getSelectedElements(function (current) {\r\n const component = this.getParentElement(current, this.isComponent);\r\n return (this.isFormatElement(current) && (!component || component === myComponent)) || (this.isComponent(current) && !this.getFormatElement(current));\r\n }.bind(util));\r\n \r\n if (removeDuplicate) {\r\n for (let i = 0, len = selectedLines.length; i < len; i++) {\r\n for (let j = i - 1; j >= 0; j--) {\r\n if (selectedLines[j].contains(selectedLines[i])) {\r\n selectedLines.splice(i, 1);\r\n i--; len--;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return selectedLines;\r\n },\r\n\r\n /**\r\n * @description Determine if this offset is the edge offset of container\r\n * @param {Node} container The node of the selection object. (range.startContainer..)\r\n * @param {Number} offset The offset of the selection object. (core.getRange().startOffset...)\r\n * @param {String|undefined} dir Select check point - Both edge, Front edge or End edge. (\"front\": Front edge, \"end\": End edge, undefined: Both edge)\r\n * @returns {Boolean}\r\n */\r\n isEdgePoint: function (container, offset, dir) {\r\n return (dir !== 'end' && offset === 0) || ((!dir || dir !== 'front') && !container.nodeValue && offset === 1) || ((!dir || dir === 'end') && !!container.nodeValue && offset === container.nodeValue.length);\r\n },\r\n\r\n /**\r\n * @description Check if the container and offset values are the edges of the format tag\r\n * @param {Node} container The node of the selection object. (range.startContainer..)\r\n * @param {Number} offset The offset of the selection object. (core.getRange().startOffset...)\r\n * @param {String} dir Select check point - \"front\": Front edge, \"end\": End edge, undefined: Both edge.\r\n * @returns {Array|null}\r\n * @private\r\n */\r\n _isEdgeFormat: function (node, offset, dir) {\r\n if (!this.isEdgePoint(node, offset, dir)) return false;\r\n\r\n const result = [];\r\n dir = dir === 'front' ? 'previousSibling' : 'nextSibling';\r\n while (node && !util.isFormatElement(node) && !util.isWysiwygDiv(node)) {\r\n if (!node[dir] || (util.isBreak(node[dir]) && !node[dir][dir])) {\r\n if (node.nodeType === 1) result.push(node.cloneNode(false));\r\n node = node.parentNode;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n /**\r\n * @description Show loading box\r\n */\r\n showLoading: function () {\r\n context.element.loading.style.display = 'block';\r\n },\r\n\r\n /**\r\n * @description Close loading box\r\n */\r\n closeLoading: function () {\r\n context.element.loading.style.display = 'none';\r\n },\r\n\r\n /**\r\n * @description Append format element to sibling node of argument element.\r\n * If the \"formatNodeName\" argument value is present, the tag of that argument value is inserted,\r\n * If not, the currently selected format tag is inserted.\r\n * @param {Element} element Insert as siblings of that element\r\n * @param {String|Element|null} formatNode Node name or node obejct to be inserted\r\n * @returns {Element}\r\n */\r\n appendFormatTag: function (element, formatNode) {\r\n if (!element || !element.parentNode) return null;\r\n\r\n const currentFormatEl = util.getFormatElement(this.getSelectionNode(), null);\r\n let oFormat = null;\r\n if (!util.isFormatElement(element) && util.isFreeFormatElement(currentFormatEl || element.parentNode)) {\r\n oFormat = util.createElement('BR');\r\n } else {\r\n const oFormatName = formatNode ? (typeof formatNode === 'string' ? formatNode : formatNode.nodeName) : (util.isFormatElement(currentFormatEl) && !util.isRangeFormatElement(currentFormatEl) && !util.isFreeFormatElement(currentFormatEl)) ? currentFormatEl.nodeName : options.defaultTag;\r\n oFormat = util.createElement(oFormatName);\r\n oFormat.innerHTML = '
      ';\r\n if ((formatNode && typeof formatNode !== 'string') || (!formatNode && util.isFormatElement(currentFormatEl))) {\r\n util.copyTagAttributes(oFormat, formatNode || currentFormatEl, ['id']);\r\n }\r\n }\r\n\r\n if (util.isCell(element)) element.insertBefore(oFormat, element.nextElementSibling);\r\n else element.parentNode.insertBefore(oFormat, element.nextElementSibling);\r\n\r\n return oFormat;\r\n },\r\n\r\n /**\r\n * @description The method to insert a element and return. (used elements : table, hr, image, video)\r\n * If \"element\" is \"HR\", insert and return the new line.\r\n * @param {Element} element Element to be inserted\r\n * @param {Boolean} notHistoryPush When true, it does not update the history stack and the selection object and return EdgeNodes (util.getEdgeChildNodes)\r\n * @param {Boolean} checkCharCount If true, if \"options.maxCharCount\" is exceeded when \"element\" is added, null is returned without addition.\r\n * @param {Boolean} notSelect If true, Do not automatically select the inserted component.\r\n * @returns {Element}\r\n */\r\n insertComponent: function (element, notHistoryPush, checkCharCount, notSelect) {\r\n if (this.isReadOnly || (checkCharCount && !this.checkCharCount(element, null))) {\r\n return null;\r\n }\r\n\r\n const r = this.removeNode();\r\n this.getRange_addLine(this.getRange(), r.container);\r\n let oNode = null;\r\n let selectionNode = this.getSelectionNode();\r\n let formatEl = util.getFormatElement(selectionNode, null);\r\n\r\n if (util.isListCell(formatEl)) {\r\n this.insertNode(element, selectionNode === formatEl ? null : r.container.nextSibling, false);\r\n if (!element.nextSibling) element.parentNode.appendChild(util.createElement('BR'));\r\n } else {\r\n if (this.getRange().collapsed && (r.container.nodeType === 3 || util.isBreak(r.container))) {\r\n const depthFormat = util.getParentElement(r.container, function (current) { return this.isRangeFormatElement(current); }.bind(util));\r\n oNode = util.splitElement(r.container, r.offset, !depthFormat ? 0 : util.getElementDepth(depthFormat) + 1);\r\n if (oNode) formatEl = oNode.previousSibling;\r\n }\r\n this.insertNode(element, util.isRangeFormatElement(formatEl) ? null : formatEl, false);\r\n if (formatEl && util.onlyZeroWidthSpace(formatEl)) util.removeItem(formatEl);\r\n }\r\n\r\n if (!notSelect) {\r\n this.setRange(element, 0, element, 0);\r\n \r\n const fileComponentInfo = this.getFileComponent(element);\r\n if (fileComponentInfo) {\r\n this.selectComponent(fileComponentInfo.target, fileComponentInfo.pluginName);\r\n } else if (oNode) {\r\n oNode = util.getEdgeChildNodes(oNode, null).sc || oNode;\r\n this.setRange(oNode, 0, oNode, 0);\r\n }\r\n }\r\n\r\n // history stack\r\n if (!notHistoryPush) this.history.push(1);\r\n\r\n return oNode || element;\r\n },\r\n\r\n /**\r\n * @description Gets the file component and that plugin name\r\n * return: {target, component, pluginName} | null\r\n * @param {Element} element Target element (figure tag, component div, file tag)\r\n * @returns {Object|null}\r\n */\r\n getFileComponent: function (element) {\r\n if (!this._fileManager.queryString || !element) return null;\r\n\r\n let target, pluginName;\r\n if (/^FIGURE$/i.test(element.nodeName) || /se-component/.test(element.className)) {\r\n target = element.querySelector(this._fileManager.queryString);\r\n }\r\n if (!target && element.nodeName && this._fileManager.regExp.test(element.nodeName)) {\r\n target = element;\r\n }\r\n\r\n if (target) {\r\n pluginName = this._fileManager.pluginMap[target.nodeName.toLowerCase()];\r\n if (pluginName) {\r\n return {\r\n target: target,\r\n component: util.getParentElement(target, util.isComponent),\r\n pluginName: pluginName\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n /**\r\n * @description The component(image, video) is selected and the resizing module is called.\r\n * @param {Element} element Element tag (img, iframe, video)\r\n * @param {String} pluginName Plugin name (image, video)\r\n */\r\n selectComponent: function (element, pluginName) {\r\n if (util.isUneditableComponent(util.getParentElement(element, util.isComponent)) || util.isUneditableComponent(element)) return false;\r\n if (!this.hasFocus) this.focus();\r\n const plugin = this.plugins[pluginName];\r\n if (!plugin) return;\r\n _w.setTimeout(function () {\r\n if (typeof plugin.select === 'function') this.callPlugin(pluginName, plugin.select.bind(this, element), null);\r\n this._setComponentLineBreaker(element);\r\n }.bind(this));\r\n },\r\n\r\n /**\r\n * @description Set line breaker of component\r\n * @param {Element} element Element tag (img, iframe, video)\r\n * @private\r\n */\r\n _setComponentLineBreaker: function (element) {\r\n // line breaker\r\n this._lineBreaker.style.display = 'none';\r\n const container = util.getParentElement(element, util.isComponent);\r\n const t_style = context.element.lineBreaker_t.style;\r\n const b_style = context.element.lineBreaker_b.style;\r\n const target = this.context.resizing.resizeContainer.style.display === 'block' ? this.context.resizing.resizeContainer : element;\r\n\r\n const isList = util.isListCell(container.parentNode);\r\n let componentTop, wScroll, w;\r\n // top\r\n if (isList ? !container.previousSibling : !util.isFormatElement(container.previousElementSibling)) {\r\n this._variable._lineBreakComp = container;\r\n wScroll = context.element.wysiwyg.scrollTop;\r\n componentTop = util.getOffset(element, context.element.wysiwygFrame).top + wScroll;\r\n w = (target.offsetWidth / 2) / 2;\r\n\r\n t_style.top = (componentTop - wScroll - 12) + 'px';\r\n t_style.left = (util.getOffset(target).left + w) + 'px';\r\n t_style.display = 'block';\r\n } else {\r\n t_style.display = 'none';\r\n }\r\n // bottom\r\n if (isList ? !container.nextSibling : !util.isFormatElement(container.nextElementSibling)) {\r\n if (!componentTop) {\r\n this._variable._lineBreakComp = container;\r\n wScroll = context.element.wysiwyg.scrollTop;\r\n componentTop = util.getOffset(element, context.element.wysiwygFrame).top + wScroll;\r\n w = (target.offsetWidth / 2) / 2;\r\n }\r\n\r\n b_style.top = (componentTop + target.offsetHeight - wScroll - 12) + 'px';\r\n b_style.left = (util.getOffset(target).left + target.offsetWidth - w - 24) + 'px';\r\n b_style.display = 'block';\r\n } else {\r\n b_style.display = 'none';\r\n }\r\n },\r\n\r\n _checkDuplicateNode: function (oNode, parentNode) {\r\n (function recursionFunc(current) {\r\n core._dupleCheck(current, parentNode);\r\n const childNodes = current.childNodes;\r\n for (let i = 0, len = childNodes.length; i < len; i++) {\r\n recursionFunc(childNodes[i]);\r\n }\r\n })(oNode);\r\n },\r\n\r\n _dupleCheck: function (oNode, parentNode) {\r\n if (!util.isTextStyleElement(oNode)) return;\r\n \r\n const oStyles = (oNode.style.cssText.match(/[^;]+;/g) || []).map(function(v){ return v.trim(); });\r\n const nodeName = oNode.nodeName;\r\n if (/^span$/i.test(nodeName) && oStyles.length === 0) return oNode;\r\n\r\n let duple = false;\r\n (function recursionFunc(ancestor) {\r\n if (util.isWysiwygDiv(ancestor) || !util.isTextStyleElement(ancestor)) return;\r\n if (ancestor.nodeName === nodeName) {\r\n duple = true;\r\n const styles = ancestor.style.cssText.match(/[^;]+;/g) || [];\r\n for (let i = 0, len = styles.length, j; i < len; i++) {\r\n if ((j = oStyles.indexOf(styles[i].trim())) > -1) {\r\n oStyles.splice(j, 1);\r\n }\r\n }\r\n for (let i = 0, len = ancestor.classList.length; i < len; i++) {\r\n oNode.classList.remove(ancestor.classList[i]);\r\n }\r\n }\r\n\r\n recursionFunc(ancestor.parentElement);\r\n })(parentNode);\r\n\r\n if (duple) {\r\n if (!(oNode.style.cssText = oStyles.join(' '))) {\r\n oNode.setAttribute('style', '');\r\n oNode.removeAttribute('style');\r\n }\r\n if (!oNode.attributes.length) {\r\n oNode.setAttribute('data-se-duple', 'true');\r\n }\r\n }\r\n\r\n return oNode;\r\n },\r\n\r\n /**\r\n * @description Delete selected node and insert argument value node and return.\r\n * If the \"afterNode\" exists, it is inserted after the \"afterNode\"\r\n * Inserting a text node merges with both text nodes on both sides and returns a new \"{ container, startOffset, endOffset }\".\r\n * @param {Node} oNode Element to be inserted\r\n * @param {Node|null} afterNode If the node exists, it is inserted after the node\r\n * @param {Boolean} checkCharCount If true, if \"options.maxCharCount\" is exceeded when \"element\" is added, null is returned without addition.\r\n * @returns {Object|Node|null}\r\n */\r\n insertNode: function (oNode, afterNode, checkCharCount) {\r\n if (this.isReadOnly || (checkCharCount && !this.checkCharCount(oNode, null))) {\r\n return null;\r\n }\r\n\r\n let range = this.getRange();\r\n let line = util.isListCell(range.commonAncestorContainer) ? range.commonAncestorContainer : util.getFormatElement(this.getSelectionNode(), null);\r\n let insertListCell = util.isListCell(line) && (util.isListCell(oNode) || util.isList(oNode));\r\n \r\n let parentNode, originAfter, tempAfterNode, tempParentNode = null;\r\n const freeFormat = util.isFreeFormatElement(line);\r\n const isFormats = (!freeFormat && (util.isFormatElement(oNode) || util.isRangeFormatElement(oNode))) || util.isComponent(oNode);\r\n\r\n if (insertListCell) {\r\n tempAfterNode = afterNode || util.isList(oNode) ? line.lastChild : line.nextElementSibling;\r\n tempParentNode = util.isList(oNode) ? line : (tempAfterNode || line).parentNode;\r\n }\r\n\r\n if (!afterNode && (isFormats || util.isComponent(oNode) || util.isMedia(oNode))) {\r\n const isEdge = this.isEdgePoint(range.endContainer, range.endOffset, 'end');\r\n const r = this.removeNode();\r\n const container = r.container;\r\n const prevContainer = (container === r.prevContainer && range.collapsed) ? null : r.prevContainer;\r\n\r\n if (insertListCell && prevContainer) {\r\n tempParentNode = prevContainer.nodeType === 3 ? prevContainer.parentNode : prevContainer;\r\n if (tempParentNode.contains(container)) {\r\n let sameParent = true;\r\n tempAfterNode = container;\r\n while (tempAfterNode.parentNode && tempAfterNode.parentNode !== tempParentNode) {\r\n tempAfterNode = tempAfterNode.parentNode;\r\n sameParent = false;\r\n }\r\n if (sameParent && container === prevContainer) tempAfterNode = tempAfterNode.nextSibling;\r\n } else {\r\n tempAfterNode = null;\r\n }\r\n } else if (insertListCell && util.isListCell(container) && !line.parentElement) {\r\n line = util.createElement('LI');\r\n tempParentNode.appendChild(line);\r\n container.appendChild(tempParentNode);\r\n tempAfterNode = null;\r\n } else if (container.nodeType === 3 || util.isBreak(container) || insertListCell) {\r\n const depthFormat = util.getParentElement(container, function (current) { return this.isRangeFormatElement(current) || this.isListCell(current); }.bind(util));\r\n afterNode = util.splitElement(container, r.offset, !depthFormat ? 0 : util.getElementDepth(depthFormat) + 1);\r\n if (!afterNode) {\r\n tempAfterNode = afterNode = line;\r\n } else if (insertListCell) {\r\n if (line.contains(container)) {\r\n const subList = util.isList(line.lastElementChild);\r\n let newCell = null;\r\n if (!isEdge) {\r\n newCell = line.cloneNode(false);\r\n newCell.appendChild(afterNode.textContent.trim() ? afterNode : util.createTextNode(util.zeroWidthSpace));\r\n }\r\n if (subList) {\r\n if (!newCell) {\r\n newCell = line.cloneNode(false);\r\n newCell.appendChild(util.createTextNode(util.zeroWidthSpace));\r\n }\r\n newCell.appendChild(line.lastElementChild);\r\n }\r\n if (newCell) {\r\n line.parentNode.insertBefore(newCell, line.nextElementSibling);\r\n tempAfterNode = afterNode = newCell;\r\n }\r\n }\r\n } else {\r\n afterNode = afterNode.previousSibling;\r\n }\r\n }\r\n }\r\n\r\n range = (!afterNode && !isFormats) ? this.getRange_addLine(this.getRange(), null) : this.getRange();\r\n const commonCon = range.commonAncestorContainer;\r\n const startOff = range.startOffset;\r\n const endOff = range.endOffset;\r\n const formatRange = range.startContainer === commonCon && util.isFormatElement(commonCon);\r\n const startCon = formatRange ? (commonCon.childNodes[startOff] || commonCon.childNodes[0] || range.startContainer) : range.startContainer;\r\n const endCon = formatRange ? (commonCon.childNodes[endOff] || commonCon.childNodes[commonCon.childNodes.length - 1] || range.endContainer) : range.endContainer;\r\n\r\n if (!insertListCell) {\r\n if (!afterNode) {\r\n parentNode = startCon;\r\n if (startCon.nodeType === 3) {\r\n parentNode = startCon.parentNode;\r\n }\r\n \r\n /** No Select range node */\r\n if (range.collapsed) {\r\n if (commonCon.nodeType === 3) {\r\n if (commonCon.textContent.length > endOff) afterNode = commonCon.splitText(endOff);\r\n else afterNode = commonCon.nextSibling;\r\n } else {\r\n if (!util.isBreak(parentNode)) {\r\n let c = parentNode.childNodes[startOff];\r\n const focusNode = (c && c.nodeType === 3 && util.onlyZeroWidthSpace(c) && util.isBreak(c.nextSibling)) ? c.nextSibling : c;\r\n if (focusNode) {\r\n if (!focusNode.nextSibling && util.isBreak(focusNode)) {\r\n parentNode.removeChild(focusNode);\r\n afterNode = null;\r\n } else {\r\n afterNode = (util.isBreak(focusNode) && !util.isBreak(oNode)) ? focusNode : focusNode.nextSibling;\r\n }\r\n } else {\r\n afterNode = null;\r\n }\r\n } else {\r\n afterNode = parentNode;\r\n parentNode = parentNode.parentNode;\r\n }\r\n }\r\n } else { /** Select range nodes */\r\n const isSameContainer = startCon === endCon;\r\n if (isSameContainer) {\r\n if (this.isEdgePoint(endCon, endOff)) afterNode = endCon.nextSibling;\r\n else afterNode = endCon.splitText(endOff);\r\n \r\n let removeNode = startCon;\r\n if (!this.isEdgePoint(startCon, startOff)) removeNode = startCon.splitText(startOff);\r\n \r\n parentNode.removeChild(removeNode);\r\n if (parentNode.childNodes.length === 0 && isFormats) {\r\n parentNode.innerHTML = '
      ';\r\n }\r\n }\r\n else {\r\n const removedTag = this.removeNode();\r\n const container = removedTag.container;\r\n const prevContainer = removedTag.prevContainer;\r\n\r\n if (container && container.childNodes.length === 0 && isFormats) {\r\n if (util.isFormatElement(container)) {\r\n container.innerHTML = '
      ';\r\n } else if (util.isRangeFormatElement(container)) {\r\n container.innerHTML = '<' + options.defaultTag + '>
      ';\r\n }\r\n }\r\n \r\n if (util.isListCell(container) && oNode.nodeType === 3) {\r\n parentNode = container;\r\n afterNode = null;\r\n } else if (!isFormats && prevContainer) {\r\n parentNode = prevContainer.nodeType === 3 ? prevContainer.parentNode : prevContainer;\r\n if (parentNode.contains(container)) {\r\n let sameParent = true;\r\n afterNode = container;\r\n while (afterNode.parentNode && afterNode.parentNode !== parentNode) {\r\n afterNode = afterNode.parentNode;\r\n sameParent = false;\r\n }\r\n if (sameParent && container === prevContainer) afterNode = afterNode.nextSibling;\r\n } else {\r\n afterNode = null;\r\n }\r\n } else if (util.isWysiwygDiv(container) && !util.isFormatElement(oNode)) {\r\n parentNode = container.appendChild(util.createElement(options.defaultTag));\r\n afterNode = null;\r\n } else {\r\n afterNode = isFormats ? endCon : container === prevContainer ? container.nextSibling : container;\r\n parentNode = (!afterNode || !afterNode.parentNode) ? commonCon : afterNode.parentNode;\r\n }\r\n \r\n while (afterNode && !util.isFormatElement(afterNode) && afterNode.parentNode !== commonCon) {\r\n afterNode = afterNode.parentNode;\r\n }\r\n }\r\n }\r\n } else { // has afterNode\r\n parentNode = afterNode.parentNode;\r\n afterNode = afterNode.nextSibling;\r\n originAfter = true;\r\n }\r\n }\r\n\r\n try {\r\n // set node\r\n if (!insertListCell) {\r\n if (util.isWysiwygDiv(afterNode) || parentNode === context.element.wysiwyg.parentNode) {\r\n parentNode = context.element.wysiwyg;\r\n afterNode = null;\r\n }\r\n \r\n if (util.isFormatElement(oNode) || util.isRangeFormatElement(oNode) || (!util.isListCell(parentNode) && util.isComponent(oNode))) {\r\n const oldParent = parentNode;\r\n if (util.isList(afterNode)) {\r\n parentNode = afterNode;\r\n afterNode = null;\r\n } else if (util.isListCell(afterNode)) {\r\n parentNode = afterNode.previousElementSibling || afterNode;\r\n } else if (!originAfter && !afterNode) {\r\n const r = this.removeNode();\r\n const container = r.container.nodeType === 3 ? (util.isListCell(util.getFormatElement(r.container, null)) ? r.container : (util.getFormatElement(r.container, null) || r.container.parentNode)) : r.container;\r\n const rangeCon = util.isWysiwygDiv(container) || util.isRangeFormatElement(container);\r\n parentNode = rangeCon ? container : container.parentNode;\r\n afterNode = rangeCon ? null : container.nextSibling;\r\n }\r\n \r\n if (oldParent.childNodes.length === 0 && parentNode !== oldParent) util.removeItem(oldParent);\r\n }\r\n \r\n if (isFormats && !freeFormat && !util.isRangeFormatElement(parentNode) && !util.isListCell(parentNode) && !util.isWysiwygDiv(parentNode)) {\r\n afterNode = parentNode.nextElementSibling;\r\n parentNode = parentNode.parentNode;\r\n }\r\n \r\n if (util.isWysiwygDiv(parentNode) && (oNode.nodeType === 3 || util.isBreak(oNode))) {\r\n const fNode = util.createElement(options.defaultTag);\r\n fNode.appendChild(oNode);\r\n oNode = fNode;\r\n }\r\n }\r\n\r\n // insert--\r\n if (insertListCell) {\r\n if (!tempParentNode.parentNode) {\r\n parentNode = context.element.wysiwyg;\r\n afterNode = null;\r\n } else {\r\n parentNode = tempParentNode;\r\n afterNode = tempAfterNode;\r\n }\r\n } else {\r\n afterNode = parentNode === afterNode ? parentNode.lastChild : afterNode;\r\n }\r\n\r\n if (util.isListCell(oNode) && !util.isList(parentNode)) {\r\n if (util.isListCell(parentNode)) {\r\n afterNode = parentNode.nextElementSibling;\r\n parentNode = parentNode.parentNode;\r\n } else {\r\n const ul = util.createElement('ol');\r\n parentNode.insertBefore(ul, afterNode);\r\n parentNode = ul;\r\n afterNode = null;\r\n }\r\n insertListCell = true;\r\n }\r\n\r\n this._checkDuplicateNode(oNode, parentNode);\r\n parentNode.insertBefore(oNode, afterNode);\r\n\r\n if (insertListCell) {\r\n if (util.onlyZeroWidthSpace(line.textContent.trim())) {\r\n util.removeItem(line);\r\n oNode = oNode.lastChild;\r\n } else {\r\n const chList = util.getArrayItem(line.children, util.isList);\r\n if (chList) {\r\n if (oNode !== chList) {\r\n oNode.appendChild(chList);\r\n oNode = chList.previousSibling;\r\n } else {\r\n parentNode.appendChild(oNode);\r\n oNode = parentNode;\r\n }\r\n\r\n if (util.onlyZeroWidthSpace(line.textContent.trim())) {\r\n util.removeItem(line);\r\n }\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n parentNode.appendChild(oNode);\r\n console.warn('[SUNEDITOR.insertNode.warn] ' + error);\r\n } finally {\r\n const dupleNodes = parentNode.querySelectorAll('[data-se-duple]');\r\n if (dupleNodes.length > 0) {\r\n for (let i = 0, len = dupleNodes.length, d, c, ch, parent; i < len; i++) {\r\n d = dupleNodes[i];\r\n ch = d.childNodes;\r\n parent = d.parentNode;\r\n\r\n while (ch[0]) {\r\n c = ch[0];\r\n parent.insertBefore(c, d);\r\n }\r\n\r\n if (d === oNode) oNode = c;\r\n util.removeItem(d);\r\n }\r\n }\r\n\r\n if ((util.isFormatElement(oNode) || util.isComponent(oNode)) && startCon === endCon) {\r\n const cItem = util.getFormatElement(commonCon, null);\r\n if (cItem && cItem.nodeType === 1 && util.isEmptyLine(cItem)) {\r\n util.removeItem(cItem);\r\n }\r\n }\r\n\r\n if (freeFormat && (util.isFormatElement(oNode) || util.isRangeFormatElement(oNode))) {\r\n oNode = this._setIntoFreeFormat(oNode);\r\n }\r\n\r\n if (!util.isComponent(oNode)) {\r\n let offset = 1;\r\n if (oNode.nodeType === 3) {\r\n const previous = oNode.previousSibling;\r\n const next = oNode.nextSibling;\r\n const previousText = (!previous || previous.nodeType === 1 || util.onlyZeroWidthSpace(previous)) ? '' : previous.textContent;\r\n const nextText = (!next || next.nodeType === 1 || util.onlyZeroWidthSpace(next)) ? '' : next.textContent;\r\n \r\n if (previous && previousText.length > 0) {\r\n oNode.textContent = previousText + oNode.textContent;\r\n util.removeItem(previous);\r\n }\r\n \r\n if (next && next.length > 0) {\r\n oNode.textContent += nextText;\r\n util.removeItem(next);\r\n }\r\n\r\n const newRange = {\r\n container: oNode,\r\n startOffset: previousText.length,\r\n endOffset: oNode.textContent.length - nextText.length\r\n };\r\n\r\n this.setRange(oNode, newRange.startOffset, oNode, newRange.endOffset);\r\n \r\n return newRange;\r\n } else if (!util.isBreak(oNode) && !util.isListCell(oNode) && util.isFormatElement(parentNode)) {\r\n let zeroWidth = null;\r\n if (!oNode.previousSibling || util.isBreak(oNode.previousSibling)) {\r\n zeroWidth = util.createTextNode(util.zeroWidthSpace);\r\n oNode.parentNode.insertBefore(zeroWidth, oNode);\r\n }\r\n \r\n if (!oNode.nextSibling || util.isBreak(oNode.nextSibling)) {\r\n zeroWidth = util.createTextNode(util.zeroWidthSpace);\r\n oNode.parentNode.insertBefore(zeroWidth, oNode.nextSibling);\r\n }\r\n \r\n if (util._isIgnoreNodeChange(oNode)) {\r\n oNode = oNode.nextSibling;\r\n offset = 0;\r\n }\r\n }\r\n \r\n this.setRange(oNode, offset, oNode, offset);\r\n }\r\n\r\n // history stack\r\n this.history.push(true);\r\n\r\n return oNode;\r\n }\r\n },\r\n\r\n _setIntoFreeFormat: function (oNode) {\r\n const parentNode = oNode.parentNode;\r\n let oNodeChildren, lastONode;\r\n \r\n while (util.isFormatElement(oNode) || util.isRangeFormatElement(oNode)) {\r\n oNodeChildren = oNode.childNodes;\r\n lastONode = null;\r\n \r\n while (oNodeChildren[0]) {\r\n lastONode = oNodeChildren[0];\r\n if (util.isFormatElement(lastONode) || util.isRangeFormatElement(lastONode)) {\r\n this._setIntoFreeFormat(lastONode);\r\n if (!oNode.parentNode) break;\r\n oNodeChildren = oNode.childNodes;\r\n continue;\r\n }\r\n \r\n parentNode.insertBefore(lastONode, oNode);\r\n }\r\n \r\n if (oNode.childNodes.length === 0) util.removeItem(oNode);\r\n oNode = util.createElement('BR');\r\n parentNode.insertBefore(oNode, lastONode.nextSibling);\r\n }\r\n\r\n return oNode;\r\n },\r\n\r\n /**\r\n * @description Delete the currently selected nodes and reset selection range\r\n * Returns {container: \"the last element after deletion\", offset: \"offset\", prevContainer: \"previousElementSibling Of the deleted area\"}\r\n * @returns {Object}\r\n */\r\n removeNode: function () {\r\n this._resetRangeToTextNode();\r\n\r\n const range = this.getRange();\r\n const isStartEdge = range.startOffset === 0;\r\n const isEndEdge = core.isEdgePoint(range.endContainer, range.endOffset, 'end');\r\n let prevContainer = null;\r\n let startPrevEl = null;\r\n let endNextEl = null;\r\n if (isStartEdge) {\r\n startPrevEl = util.getFormatElement(range.startContainer);\r\n prevContainer = startPrevEl.previousElementSibling;\r\n startPrevEl = startPrevEl ? prevContainer : startPrevEl;\r\n }\r\n if (isEndEdge) {\r\n endNextEl = util.getFormatElement(range.endContainer);\r\n endNextEl = endNextEl ? endNextEl.nextElementSibling : endNextEl;\r\n }\r\n\r\n let container, offset = 0;\r\n let startCon = range.startContainer;\r\n let endCon = range.endContainer;\r\n let startOff = range.startOffset;\r\n let endOff = range.endOffset;\r\n const commonCon = (range.commonAncestorContainer.nodeType === 3 && range.commonAncestorContainer.parentNode === startCon.parentNode) ? startCon.parentNode : range.commonAncestorContainer;\r\n if (commonCon === startCon && commonCon === endCon) {\r\n startCon = commonCon.children[startOff];\r\n endCon = commonCon.children[endOff];\r\n startOff = endOff = 0;\r\n }\r\n\r\n if (!startCon || !endCon) return {\r\n container: commonCon,\r\n offset: 0\r\n };\r\n\r\n if (startCon === endCon && range.collapsed) {\r\n if (startCon.textContent && util.onlyZeroWidthSpace(startCon.textContent.substr(startOff))) {\r\n return {\r\n container: startCon,\r\n offset: startOff,\r\n prevContainer: startCon && startCon.parentNode ? startCon : null\r\n };\r\n }\r\n }\r\n\r\n let beforeNode = null;\r\n let afterNode = null;\r\n\r\n const childNodes = util.getListChildNodes(commonCon, null);\r\n let startIndex = util.getArrayIndex(childNodes, startCon);\r\n let endIndex = util.getArrayIndex(childNodes, endCon);\r\n\r\n if (childNodes.length > 0 && startIndex > -1 && endIndex > -1) {\r\n for (let i = startIndex + 1, startNode = startCon; i >= 0; i--) {\r\n if (childNodes[i] === startNode.parentNode && childNodes[i].firstChild === startNode && startOff === 0) {\r\n startIndex = i;\r\n startNode = startNode.parentNode;\r\n }\r\n }\r\n \r\n for (let i = endIndex - 1, endNode = endCon; i > startIndex; i--) {\r\n if (childNodes[i] === endNode.parentNode && childNodes[i].nodeType === 1) {\r\n childNodes.splice(i, 1);\r\n endNode = endNode.parentNode;\r\n --endIndex;\r\n }\r\n }\r\n } else {\r\n if (childNodes.length === 0) {\r\n if (util.isFormatElement(commonCon) || util.isRangeFormatElement(commonCon) || util.isWysiwygDiv(commonCon) || util.isBreak(commonCon) || util.isMedia(commonCon)) {\r\n return {\r\n container: commonCon,\r\n offset: 0\r\n };\r\n } else if (commonCon.nodeType === 3) {\r\n return {\r\n container: commonCon,\r\n offset: endOff\r\n };\r\n }\r\n childNodes.push(commonCon);\r\n startCon = endCon = commonCon;\r\n } else {\r\n startCon = endCon = childNodes[0];\r\n if (util.isBreak(startCon) || util.onlyZeroWidthSpace(startCon)) {\r\n return {\r\n container: util.isMedia(commonCon) ? commonCon : startCon,\r\n offset: 0\r\n };\r\n }\r\n }\r\n\r\n startIndex = endIndex = 0;\r\n }\r\n\r\n for (let i = startIndex; i <= endIndex; i++) {\r\n const item = childNodes[i];\r\n\r\n if (item.length === 0 || (item.nodeType === 3 && item.data === undefined)) {\r\n this._nodeRemoveListItem(item);\r\n continue;\r\n }\r\n\r\n if (item === startCon) {\r\n if (startCon.nodeType === 1) {\r\n if (util.isComponent(startCon)) continue;\r\n else beforeNode = util.createTextNode(startCon.textContent);\r\n } else {\r\n if (item === endCon) {\r\n beforeNode = util.createTextNode(startCon.substringData(0, startOff) + endCon.substringData(endOff, (endCon.length - endOff)));\r\n offset = startOff;\r\n } else {\r\n beforeNode = util.createTextNode(startCon.substringData(0, startOff));\r\n }\r\n }\r\n\r\n if (beforeNode.length > 0) {\r\n startCon.data = beforeNode.data;\r\n } else {\r\n this._nodeRemoveListItem(startCon);\r\n }\r\n\r\n if (item === endCon) break;\r\n continue;\r\n }\r\n\r\n if (item === endCon) {\r\n if (endCon.nodeType === 1) {\r\n if (util.isComponent(endCon)) continue;\r\n else afterNode = util.createTextNode(endCon.textContent);\r\n } else {\r\n afterNode = util.createTextNode(endCon.substringData(endOff, (endCon.length - endOff)));\r\n }\r\n\r\n if (afterNode.length > 0) {\r\n endCon.data = afterNode.data;\r\n } else {\r\n this._nodeRemoveListItem(endCon);\r\n }\r\n\r\n continue;\r\n }\r\n\r\n this._nodeRemoveListItem(item);\r\n }\r\n\r\n const endUl = util.getParentElement(endCon, 'ul');\r\n const startLi = util.getParentElement(startCon, 'li');\r\n if (endUl && startLi && startLi.contains(endUl)) {\r\n container = endUl.previousSibling;\r\n offset = container.textContent.length;\r\n } else {\r\n container = endCon && endCon.parentNode ? endCon : startCon && startCon.parentNode ? startCon : (range.endContainer || range.startContainer);\r\n offset = (!isStartEdge && !isEndEdge) ? offset : isEndEdge ? container.textContent.length : 0;\r\n }\r\n \r\n if (!util.isWysiwygDiv(container) && container.childNodes.length === 0) {\r\n const rc = util.removeItemAllParents(container, null, null);\r\n if (rc) container = rc.sc || rc.ec || context.element.wysiwyg;\r\n }\r\n\r\n if (!util.getFormatElement(container) && !(startCon && startCon.parentNode)) {\r\n if (endNextEl) {\r\n container = endNextEl;\r\n offset = 0;\r\n } else if (startPrevEl) {\r\n container = startPrevEl;\r\n offset = 1;\r\n }\r\n }\r\n\r\n // set range\r\n this.setRange(container, offset, container, offset);\r\n // history stack\r\n this.history.push(true);\r\n\r\n return {\r\n container: container,\r\n offset: offset,\r\n prevContainer: prevContainer\r\n };\r\n },\r\n\r\n _nodeRemoveListItem: function (item) {\r\n const format = util.getFormatElement(item, null);\r\n util.removeItem(item);\r\n\r\n if(!util.isListCell(format)) return;\r\n \r\n util.removeItemAllParents(format, null, null);\r\n\r\n if (format && util.isList(format.firstChild)) {\r\n format.insertBefore(util.createTextNode(util.zeroWidthSpace), format.firstChild);\r\n }\r\n },\r\n\r\n /**\r\n * @description Appended all selected format Element to the argument element and insert\r\n * @param {Element} rangeElement Element of wrap the arguments (BLOCKQUOTE...)\r\n */\r\n applyRangeFormatElement: function (rangeElement) {\r\n this.getRange_addLine(this.getRange(), null);\r\n const rangeLines = this.getSelectedElementsAndComponents(false);\r\n if (!rangeLines || rangeLines.length === 0) return;\r\n\r\n linesLoop:\r\n for (let i = 0, len = rangeLines.length, line, nested, fEl, lEl, f, l; i < len; i++) {\r\n line = rangeLines[i];\r\n if (!util.isListCell(line)) continue;\r\n\r\n nested = line.lastElementChild;\r\n if (nested && util.isListCell(line.nextElementSibling) && rangeLines.indexOf(line.nextElementSibling) > -1) {\r\n lEl = nested.lastElementChild;\r\n if (rangeLines.indexOf(lEl) > -1) {\r\n let list = null;\r\n while ((list = lEl.lastElementChild)) {\r\n if (util.isList(list)) {\r\n if (rangeLines.indexOf(list.lastElementChild) > -1) {\r\n lEl = list.lastElementChild;\r\n } else {\r\n continue linesLoop;\r\n }\r\n }\r\n }\r\n\r\n fEl = nested.firstElementChild;\r\n f = rangeLines.indexOf(fEl);\r\n l = rangeLines.indexOf(lEl);\r\n rangeLines.splice(f, (l - f) + 1);\r\n len = rangeLines.length;\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n let last = rangeLines[rangeLines.length - 1];\r\n let standTag, beforeTag, pElement;\r\n\r\n if (util.isRangeFormatElement(last) || util.isFormatElement(last)) {\r\n standTag = last;\r\n } else {\r\n standTag = util.getRangeFormatElement(last, null) || util.getFormatElement(last, null);\r\n }\r\n\r\n if (util.isCell(standTag)) {\r\n beforeTag = null;\r\n pElement = standTag;\r\n } else {\r\n beforeTag = standTag.nextSibling;\r\n pElement = standTag.parentNode;\r\n }\r\n \r\n let parentDepth = util.getElementDepth(standTag);\r\n let listParent = null;\r\n const lineArr = [];\r\n const removeItems = function (parent, origin, before) {\r\n let cc = null;\r\n if (parent !== origin && !util.isTable(origin)) {\r\n if (origin && util.getElementDepth(parent) === util.getElementDepth(origin)) return before;\r\n cc = util.removeItemAllParents(origin, null, parent);\r\n }\r\n\r\n return cc ? cc.ec : before;\r\n };\r\n \r\n for (let i = 0, len = rangeLines.length, line, originParent, depth, before, nextLine, nextList, nested; i < len; i++) {\r\n line = rangeLines[i];\r\n originParent = line.parentNode;\r\n if (!originParent || rangeElement.contains(originParent)) continue;\r\n\r\n depth = util.getElementDepth(line);\r\n\r\n if (util.isList(originParent)) {\r\n if (listParent === null) {\r\n if (nextList) {\r\n listParent = nextList;\r\n nested = true;\r\n nextList = null;\r\n } else {\r\n listParent = originParent.cloneNode(false);\r\n }\r\n }\r\n\r\n lineArr.push(line);\r\n nextLine = rangeLines[i + 1];\r\n\r\n if (i === len - 1 || (nextLine && nextLine.parentNode !== originParent)) {\r\n // nested list\r\n if (nextLine && line.contains(nextLine.parentNode)) {\r\n nextList = nextLine.parentNode.cloneNode(false);\r\n }\r\n\r\n let list = originParent.parentNode, p;\r\n while (util.isList(list)) {\r\n p = util.createElement(list.nodeName);\r\n p.appendChild(listParent);\r\n listParent = p;\r\n list = list.parentNode;\r\n }\r\n\r\n const edge = this.detachRangeFormatElement(originParent, lineArr, null, true, true);\r\n\r\n if (parentDepth >= depth) {\r\n parentDepth = depth;\r\n pElement = edge.cc;\r\n beforeTag = removeItems(pElement, originParent, edge.ec);\r\n if (beforeTag) pElement = beforeTag.parentNode;\r\n } else if (pElement === edge.cc) {\r\n beforeTag = edge.ec;\r\n }\r\n\r\n if (pElement !== edge.cc) {\r\n before = removeItems(pElement, edge.cc, before);\r\n if (before !== undefined) beforeTag = before;\r\n else beforeTag = edge.cc;\r\n }\r\n\r\n for (let c = 0, cLen = edge.removeArray.length; c < cLen; c++) {\r\n listParent.appendChild(edge.removeArray[c]);\r\n }\r\n\r\n if (!nested) rangeElement.appendChild(listParent);\r\n if (nextList) edge.removeArray[edge.removeArray.length - 1].appendChild(nextList);\r\n listParent = null;\r\n nested = false;\r\n }\r\n } else {\r\n if (parentDepth >= depth) {\r\n parentDepth = depth;\r\n pElement = originParent;\r\n beforeTag = line.nextSibling;\r\n }\r\n \r\n rangeElement.appendChild(line);\r\n\r\n if (pElement !== originParent) {\r\n before = removeItems(pElement, originParent);\r\n if (before !== undefined) beforeTag = before;\r\n }\r\n }\r\n }\r\n\r\n this.effectNode = null;\r\n util.mergeSameTags(rangeElement, null, false);\r\n util.mergeNestedTags(rangeElement, function (current) { return this.isList(current); }.bind(util));\r\n\r\n // Nested list\r\n if (beforeTag && util.getElementDepth(beforeTag) > 0 && (util.isList(beforeTag.parentNode) || util.isList(beforeTag.parentNode.parentNode))) {\r\n const depthFormat = util.getParentElement(beforeTag, function (current) { return this.isRangeFormatElement(current) && !this.isList(current); }.bind(util));\r\n const splitRange = util.splitElement(beforeTag, null, !depthFormat ? 0 : util.getElementDepth(depthFormat) + 1);\r\n splitRange.parentNode.insertBefore(rangeElement, splitRange);\r\n } else { // basic\r\n pElement.insertBefore(rangeElement, beforeTag);\r\n removeItems(rangeElement, beforeTag);\r\n }\r\n\r\n const edge = util.getEdgeChildNodes(rangeElement.firstElementChild, rangeElement.lastElementChild);\r\n if (rangeLines.length > 1) {\r\n this.setRange(edge.sc, 0, edge.ec, edge.ec.textContent.length);\r\n } else {\r\n this.setRange(edge.ec, edge.ec.textContent.length, edge.ec, edge.ec.textContent.length);\r\n }\r\n\r\n // history stack\r\n this.history.push(false);\r\n },\r\n\r\n /**\r\n * @description The elements of the \"selectedFormats\" array are detached from the \"rangeElement\" element. (\"LI\" tags are converted to \"P\" tags)\r\n * When \"selectedFormats\" is null, all elements are detached and return {cc: parentNode, sc: nextSibling, ec: previousSibling, removeArray: [Array of removed elements]}.\r\n * @param {Element} rangeElement Range format element (PRE, BLOCKQUOTE, OL, UL...)\r\n * @param {Array|null} selectedFormats Array of format elements (P, DIV, LI...) to remove.\r\n * If null, Applies to all elements and return {cc: parentNode, sc: nextSibling, ec: previousSibling}\r\n * @param {Element|null} newRangeElement The node(rangeElement) to replace the currently wrapped node.\r\n * @param {Boolean} remove If true, deleted without detached.\r\n * @param {Boolean} notHistoryPush When true, it does not update the history stack and the selection object and return EdgeNodes (util.getEdgeChildNodes)\r\n * @returns {Object}\r\n */\r\n detachRangeFormatElement: function (rangeElement, selectedFormats, newRangeElement, remove, notHistoryPush) {\r\n const range = this.getRange();\r\n let so = range.startOffset;\r\n let eo = range.endOffset;\r\n\r\n let children = util.getListChildNodes(rangeElement, function (current) { return current.parentNode === rangeElement; });\r\n let parent = rangeElement.parentNode;\r\n let firstNode = null;\r\n let lastNode = null;\r\n let rangeEl = rangeElement.cloneNode(false);\r\n \r\n const removeArray = [];\r\n const newList = util.isList(newRangeElement);\r\n let insertedNew = false;\r\n let reset = false;\r\n let moveComplete = false;\r\n\r\n function appendNode (parent, insNode, sibling, originNode) {\r\n if (util.onlyZeroWidthSpace(insNode)) {\r\n insNode.innerHTML = util.zeroWidthSpace;\r\n so = eo = 1;\r\n }\r\n\r\n if (insNode.nodeType === 3) {\r\n parent.insertBefore(insNode, sibling);\r\n return insNode;\r\n }\r\n \r\n const insChildren = (moveComplete ? insNode : originNode).childNodes;\r\n let format = insNode.cloneNode(false);\r\n let first = null;\r\n let c = null;\r\n\r\n while (insChildren[0]) {\r\n c = insChildren[0];\r\n if (util._notTextNode(c) && !util.isBreak(c) && !util.isListCell(format)) {\r\n if (format.childNodes.length > 0) {\r\n if (!first) first = format;\r\n parent.insertBefore(format, sibling);\r\n format = insNode.cloneNode(false);\r\n }\r\n parent.insertBefore(c, sibling);\r\n if (!first) first = c;\r\n } else {\r\n format.appendChild(c);\r\n }\r\n }\r\n\r\n if (format.childNodes.length > 0) {\r\n if (util.isListCell(parent) && util.isListCell(format) && util.isList(sibling)) {\r\n if (newList) {\r\n first = sibling;\r\n while(sibling) {\r\n format.appendChild(sibling);\r\n sibling = sibling.nextSibling;\r\n }\r\n parent.parentNode.insertBefore(format, parent.nextElementSibling);\r\n } else {\r\n const originNext = originNode.nextElementSibling;\r\n const detachRange = util.detachNestedList(originNode, false);\r\n if ((rangeElement !== detachRange) || (originNext !== originNode.nextElementSibling)) {\r\n const fChildren = format.childNodes;\r\n while (fChildren[0]) {\r\n originNode.appendChild(fChildren[0]);\r\n }\r\n\r\n rangeElement = detachRange;\r\n reset = true;\r\n }\r\n }\r\n } else {\r\n parent.insertBefore(format, sibling);\r\n }\r\n\r\n if (!first) first = format;\r\n }\r\n\r\n return first;\r\n }\r\n\r\n // detach loop\r\n for (let i = 0, len = children.length, insNode, lineIndex, next; i < len; i++) {\r\n insNode = children[i];\r\n if (insNode.nodeType === 3 && util.isList(rangeEl)) continue;\r\n \r\n moveComplete = false;\r\n if (remove && i === 0) {\r\n if (!selectedFormats || selectedFormats.length === len || selectedFormats[0] === insNode) {\r\n firstNode = rangeElement.previousSibling;\r\n } else {\r\n firstNode = rangeEl;\r\n }\r\n }\r\n\r\n if (selectedFormats) lineIndex = selectedFormats.indexOf(insNode);\r\n if (selectedFormats && lineIndex === -1) {\r\n if (!rangeEl) rangeEl = rangeElement.cloneNode(false);\r\n rangeEl.appendChild(insNode);\r\n } else {\r\n if (selectedFormats) next = selectedFormats[lineIndex + 1];\r\n if (rangeEl && rangeEl.children.length > 0) {\r\n parent.insertBefore(rangeEl, rangeElement);\r\n rangeEl = null;\r\n }\r\n\r\n if (!newList && util.isListCell(insNode)) {\r\n if (next && util.getElementDepth(insNode) !== util.getElementDepth(next) && (util.isListCell(parent) || util.getArrayItem(insNode.children, util.isList, false))) {\r\n const insNext = insNode.nextElementSibling;\r\n const detachRange = util.detachNestedList(insNode, false);\r\n if ((rangeElement !== detachRange) || insNext !== insNode.nextElementSibling) {\r\n rangeElement = detachRange;\r\n reset = true;\r\n }\r\n } else {\r\n const inner = insNode;\r\n insNode = util.createElement(remove ? inner.nodeName : (util.isList(rangeElement.parentNode) || util.isListCell(rangeElement.parentNode)) ? 'LI' : util.isCell(rangeElement.parentNode) ? 'DIV' : options.defaultTag);\r\n const isCell = util.isListCell(insNode);\r\n const innerChildren = inner.childNodes;\r\n while (innerChildren[0]) {\r\n if (util.isList(innerChildren[0]) && !isCell) break;\r\n insNode.appendChild(innerChildren[0]);\r\n }\r\n util.copyFormatAttributes(insNode, inner);\r\n moveComplete = true;\r\n }\r\n } else {\r\n insNode = insNode.cloneNode(false);\r\n }\r\n\r\n if (!reset) {\r\n if (!remove) {\r\n if (newRangeElement) {\r\n if (!insertedNew) {\r\n parent.insertBefore(newRangeElement, rangeElement);\r\n insertedNew = true;\r\n }\r\n insNode = appendNode(newRangeElement, insNode, null, children[i]);\r\n } else {\r\n insNode = appendNode(parent, insNode, rangeElement, children[i]);\r\n }\r\n \r\n if (!reset) {\r\n if (selectedFormats) {\r\n lastNode = insNode;\r\n if (!firstNode) {\r\n firstNode = insNode;\r\n }\r\n } else if (!firstNode) {\r\n firstNode = lastNode = insNode;\r\n }\r\n }\r\n } else {\r\n removeArray.push(insNode);\r\n util.removeItem(children[i]);\r\n }\r\n\r\n if (reset) {\r\n reset = moveComplete = false;\r\n children = util.getListChildNodes(rangeElement, function (current) { return current.parentNode === rangeElement; });\r\n rangeEl = rangeElement.cloneNode(false);\r\n parent = rangeElement.parentNode;\r\n i = -1;\r\n len = children.length;\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const rangeParent = rangeElement.parentNode;\r\n let rangeRight = rangeElement.nextSibling;\r\n if (rangeEl && rangeEl.children.length > 0) {\r\n rangeParent.insertBefore(rangeEl, rangeRight);\r\n }\r\n \r\n if (newRangeElement) firstNode = newRangeElement.previousSibling;\r\n else if (!firstNode) firstNode = rangeElement.previousSibling;\r\n rangeRight = rangeElement.nextSibling !== rangeEl ? rangeElement.nextSibling : rangeEl ? rangeEl.nextSibling : null;\r\n\r\n if (rangeElement.children.length === 0 || rangeElement.textContent.length === 0) {\r\n util.removeItem(rangeElement);\r\n } else {\r\n util.removeEmptyNode(rangeElement, null, false);\r\n }\r\n\r\n let edge = null;\r\n if (remove) {\r\n edge = {\r\n cc: rangeParent,\r\n sc: firstNode,\r\n so: so,\r\n ec: rangeRight,\r\n eo: eo,\r\n removeArray: removeArray\r\n };\r\n } else {\r\n if (!firstNode) firstNode = lastNode;\r\n if (!lastNode) lastNode = firstNode;\r\n const childEdge = util.getEdgeChildNodes(firstNode, (lastNode.parentNode ? firstNode : lastNode));\r\n edge = {\r\n cc: (childEdge.sc || childEdge.ec).parentNode,\r\n sc: childEdge.sc,\r\n so: so,\r\n ec: childEdge.ec,\r\n eo: eo,\r\n removeArray: null\r\n };\r\n }\r\n\r\n this.effectNode = null;\r\n if (notHistoryPush) return edge;\r\n \r\n if (!remove && edge) {\r\n if (!selectedFormats) {\r\n this.setRange(edge.sc, 0, edge.sc, 0);\r\n } else {\r\n this.setRange(edge.sc, so, edge.ec, eo);\r\n }\r\n }\r\n\r\n // history stack\r\n this.history.push(false);\r\n },\r\n\r\n /**\r\n * @description \"selectedFormats\" array are detached from the list element.\r\n * The return value is applied when the first and last lines of \"selectedFormats\" are \"LI\" respectively.\r\n * @param {Array} selectedFormats Array of format elements (LI, P...) to remove.\r\n * @param {Boolean} remove If true, deleted without detached.\r\n * @returns {Object} {sc:
    • , ec:
    • }.\r\n */\r\n detachList: function (selectedFormats, remove) {\r\n let rangeArr = {};\r\n let listFirst = false;\r\n let listLast = false;\r\n let first = null;\r\n let last = null;\r\n const passComponent = function (current) { return !this.isComponent(current); }.bind(util);\r\n\r\n for (let i = 0, len = selectedFormats.length, r, o, lastIndex, isList; i < len; i++) {\r\n lastIndex = i === len - 1;\r\n o = util.getRangeFormatElement(selectedFormats[i], passComponent);\r\n isList = util.isList(o);\r\n if (!r && isList) {\r\n r = o;\r\n rangeArr = {r: r, f: [util.getParentElement(selectedFormats[i], 'LI')]};\r\n if (i === 0) listFirst = true;\r\n } else if (r && isList) {\r\n if (r !== o) {\r\n const edge = this.detachRangeFormatElement(rangeArr.f[0].parentNode, rangeArr.f, null, remove, true);\r\n o = selectedFormats[i].parentNode;\r\n if (listFirst) {\r\n first = edge.sc;\r\n listFirst = false;\r\n }\r\n if (lastIndex) last = edge.ec;\r\n\r\n if (isList) {\r\n r = o;\r\n rangeArr = {r: r, f: [util.getParentElement(selectedFormats[i], 'LI')]};\r\n if (lastIndex) listLast = true;\r\n } else {\r\n r = null;\r\n }\r\n } else {\r\n rangeArr.f.push(util.getParentElement(selectedFormats[i], 'LI'));\r\n if (lastIndex) listLast = true;\r\n }\r\n }\r\n\r\n if (lastIndex && util.isList(r)) {\r\n const edge = this.detachRangeFormatElement(rangeArr.f[0].parentNode, rangeArr.f, null, remove, true);\r\n if (listLast || len === 1) last = edge.ec;\r\n if (listFirst) first = edge.sc || last;\r\n }\r\n }\r\n\r\n return {\r\n sc: first,\r\n ec: last\r\n };\r\n },\r\n\r\n /**\r\n * @description Add, update, and delete nodes from selected text.\r\n * 1. If there is a node in the \"appendNode\" argument, a node with the same tags and attributes as \"appendNode\" is added to the selection text.\r\n * 2. If it is in the same tag, only the tag's attributes are changed without adding a tag.\r\n * 3. If the \"appendNode\" argument is null, the node of the selection is update or remove without adding a new node.\r\n * 4. The same style as the style attribute of the \"styleArray\" argument is deleted.\r\n * (Styles should be put with attribute names from css. [\"background-color\"])\r\n * 5. The same class name as the class attribute of the \"styleArray\" argument is deleted.\r\n * (The class name is preceded by \".\" [\".className\"])\r\n * 6. Use a list of styles and classes of \"appendNode\" in \"styleArray\" to avoid duplicate property values.\r\n * 7. If a node with all styles and classes removed has the same tag name as \"appendNode\" or \"removeNodeArray\", or \"appendNode\" is null, that node is deleted.\r\n * 8. Regardless of the style and class of the node, the tag with the same name as the \"removeNodeArray\" argument value is deleted.\r\n * 9. If the \"strictRemove\" argument is true, only nodes with all styles and classes removed from the nodes of \"removeNodeArray\" are removed.\r\n *10. It won't work if the parent node has the same class and same value style.\r\n * However, if there is a value in \"removeNodeArray\", it works and the text node is separated even if there is no node to replace.\r\n * @param {Element|null} appendNode The element to be added to the selection. If it is null, only delete the node.\r\n * @param {Array|null} styleArray The style or className attribute name Array to check (['font-size'], ['.className'], ['font-family', 'color', '.className']...])\r\n * @param {Array|null} removeNodeArray An array of node names to remove types from, remove all formats when \"appendNode\" is null and there is an empty array or null value. (['span'], ['strong', 'em'] ...])\r\n * @param {Boolean|null} strictRemove If true, only nodes with all styles and classes removed from the nodes of \"removeNodeArray\" are removed.\r\n */\r\n nodeChange: function (appendNode, styleArray, removeNodeArray, strictRemove) {\r\n this._resetRangeToTextNode();\r\n let range = this.getRange_addLine(this.getRange(), null);\r\n styleArray = styleArray && styleArray.length > 0 ? styleArray : false;\r\n removeNodeArray = removeNodeArray && removeNodeArray.length > 0 ? removeNodeArray : false;\r\n \r\n const isRemoveNode = !appendNode;\r\n const isRemoveFormat = isRemoveNode && !removeNodeArray && !styleArray;\r\n let startCon = range.startContainer;\r\n let startOff = range.startOffset;\r\n let endCon = range.endContainer;\r\n let endOff = range.endOffset;\r\n\r\n if ((isRemoveFormat && range.collapsed && util.isFormatElement(startCon.parentNode)) || (startCon === endCon && startCon.nodeType === 1 && util.isNonEditable(startCon))) {\r\n const format = startCon.parentNode;\r\n if (!util.isListCell(format) || !util.getValues(format.style).some(function(k) { return this._listKebab.indexOf(k) > -1; }.bind(this))) return;\r\n }\r\n\r\n if (range.collapsed && !isRemoveFormat) {\r\n if (startCon.nodeType === 1 && !util.isBreak(startCon) && !util.isComponent(startCon)) {\r\n let afterNode = null;\r\n const focusNode = startCon.childNodes[startOff];\r\n\r\n if (focusNode) {\r\n if (!focusNode.nextSibling) {\r\n afterNode = null;\r\n } else {\r\n afterNode = util.isBreak(focusNode) ? focusNode : focusNode.nextSibling;\r\n }\r\n }\r\n\r\n const zeroWidth = util.createTextNode(util.zeroWidthSpace);\r\n startCon.insertBefore(zeroWidth, afterNode);\r\n this.setRange(zeroWidth, 1, zeroWidth, 1);\r\n\r\n range = this.getRange();\r\n startCon = range.startContainer;\r\n startOff = range.startOffset;\r\n endCon = range.endContainer;\r\n endOff = range.endOffset;\r\n }\r\n }\r\n\r\n if (util.isFormatElement(startCon)) {\r\n startCon = startCon.childNodes[startOff] || startCon.firstChild;\r\n startOff = 0;\r\n }\r\n if (util.isFormatElement(endCon)) {\r\n endCon = endCon.childNodes[endOff] || endCon.lastChild;\r\n endOff = endCon.textContent.length;\r\n }\r\n\r\n if (isRemoveNode) {\r\n appendNode = util.createElement('DIV');\r\n }\r\n\r\n const wRegExp = _w.RegExp;\r\n const newNodeName = appendNode.nodeName;\r\n\r\n /* checked same style property */\r\n if (!isRemoveFormat && startCon === endCon && !removeNodeArray && appendNode) {\r\n let sNode = startCon;\r\n let checkCnt = 0;\r\n const checkAttrs = [];\r\n \r\n const checkStyles = appendNode.style;\r\n for (let i = 0, len = checkStyles.length; i < len; i++) {\r\n checkAttrs.push(checkStyles[i]);\r\n }\r\n\r\n const ckeckClasses = appendNode.classList;\r\n for (let i = 0, len = ckeckClasses.length; i < len; i++) {\r\n checkAttrs.push('.' + ckeckClasses[i]);\r\n }\r\n\r\n if (checkAttrs.length > 0) {\r\n while(!util.isFormatElement(sNode) && !util.isWysiwygDiv(sNode)) {\r\n for (let i = 0; i < checkAttrs.length; i++) {\r\n if (sNode.nodeType === 1) {\r\n const s = checkAttrs[i];\r\n const classReg = /^\\./.test(s) ? new wRegExp('\\\\s*' + s.replace(/^\\./, '') + '(\\\\s+|$)', 'ig') : false;\r\n \r\n const styleCheck = isRemoveNode ? !!sNode.style[s] : (!!sNode.style[s] && !!appendNode.style[s] && sNode.style[s] === appendNode.style[s]);\r\n const classCheck = classReg === false ? false : isRemoveNode ? !!sNode.className.match(classReg) : !!sNode.className.match(classReg) && !!appendNode.className.match(classReg);\r\n if (styleCheck || classCheck) {\r\n checkCnt++;\r\n }\r\n }\r\n }\r\n sNode = sNode.parentNode;\r\n }\r\n \r\n if (checkCnt >= checkAttrs.length) return;\r\n }\r\n }\r\n\r\n let start = {}, end = {};\r\n let newNode, styleRegExp = '', classRegExp = '', removeNodeRegExp = '';\r\n\r\n if (styleArray) {\r\n for (let i = 0, len = styleArray.length, s; i < len; i++) {\r\n s = styleArray[i];\r\n if (/^\\./.test(s)) {\r\n classRegExp += (classRegExp ? '|' : '\\\\s*(?:') + s.replace(/^\\./, '');\r\n } else {\r\n styleRegExp += (styleRegExp ? '|' : '(?:;|^|\\\\s)(?:') + s;\r\n }\r\n }\r\n\r\n if (styleRegExp) {\r\n styleRegExp += ')\\\\s*:[^;]*\\\\s*(?:;|$)';\r\n styleRegExp = new wRegExp(styleRegExp, 'ig');\r\n }\r\n\r\n if (classRegExp) {\r\n classRegExp += ')(?=\\\\s+|$)';\r\n classRegExp = new wRegExp(classRegExp, 'ig');\r\n }\r\n }\r\n\r\n if (removeNodeArray) {\r\n removeNodeRegExp = '^(?:' + removeNodeArray[0];\r\n for (let i = 1; i < removeNodeArray.length; i++) {\r\n removeNodeRegExp += '|' + removeNodeArray[i];\r\n }\r\n removeNodeRegExp += ')$';\r\n removeNodeRegExp = new wRegExp(removeNodeRegExp, 'i');\r\n }\r\n\r\n /** validation check function*/\r\n const wBoolean = _w.Boolean;\r\n const _removeCheck = {v: false};\r\n const validation = function (checkNode) {\r\n const vNode = checkNode.cloneNode(false);\r\n\r\n // all path\r\n if (vNode.nodeType === 3 || util.isBreak(vNode)) return vNode;\r\n // all remove\r\n if (isRemoveFormat) return null;\r\n\r\n // remove node check\r\n const tagRemove = (!removeNodeRegExp && isRemoveNode) || (removeNodeRegExp && removeNodeRegExp.test(vNode.nodeName));\r\n\r\n // tag remove\r\n if (tagRemove && !strictRemove) {\r\n _removeCheck.v = true;\r\n return null;\r\n }\r\n\r\n // style regexp\r\n const originStyle = vNode.style.cssText;\r\n let style = '';\r\n if (styleRegExp && originStyle.length > 0) {\r\n style = originStyle.replace(styleRegExp, '').trim();\r\n if (style !== originStyle) _removeCheck.v = true;\r\n }\r\n\r\n // class check\r\n const originClasses = vNode.className;\r\n let classes = '';\r\n if (classRegExp && originClasses.length > 0) {\r\n classes = originClasses.replace(classRegExp, '').trim();\r\n if (classes !== originClasses) _removeCheck.v = true;\r\n }\r\n\r\n // remove only\r\n if (isRemoveNode) {\r\n if ((classRegExp || !originClasses) && (styleRegExp || !originStyle) && !style && !classes && tagRemove) {\r\n _removeCheck.v = true;\r\n return null;\r\n }\r\n }\r\n\r\n // change\r\n if (style || classes || vNode.nodeName !== newNodeName || (wBoolean(styleRegExp) !== wBoolean(originStyle)) || (wBoolean(classRegExp) !== wBoolean(originClasses))) {\r\n if (styleRegExp && originStyle.length > 0) vNode.style.cssText = style;\r\n if (!vNode.style.cssText) {\r\n vNode.removeAttribute('style');\r\n }\r\n\r\n if (classRegExp && originClasses.length > 0) vNode.className = classes.trim();\r\n if (!vNode.className.trim()) {\r\n vNode.removeAttribute('class');\r\n }\r\n\r\n if (!vNode.style.cssText && !vNode.className && (vNode.nodeName === newNodeName || tagRemove)) {\r\n _removeCheck.v = true;\r\n return null;\r\n }\r\n\r\n return vNode;\r\n }\r\n\r\n _removeCheck.v = true;\r\n return null;\r\n };\r\n\r\n // get line nodes\r\n const lineNodes = this.getSelectedElements(null);\r\n range = this.getRange();\r\n startCon = range.startContainer;\r\n startOff = range.startOffset;\r\n endCon = range.endContainer;\r\n endOff = range.endOffset;\r\n\r\n if (!util.getFormatElement(startCon, null)) {\r\n startCon = util.getChildElement(lineNodes[0], function (current) { return current.nodeType === 3; }, false);\r\n startOff = 0;\r\n }\r\n\r\n if (!util.getFormatElement(endCon, null)) {\r\n endCon = util.getChildElement(lineNodes[lineNodes.length - 1], function (current) { return current.nodeType === 3; }, false);\r\n endOff = endCon.textContent.length;\r\n }\r\n\r\n \r\n const oneLine = util.getFormatElement(startCon, null) === util.getFormatElement(endCon, null);\r\n const endLength = lineNodes.length - (oneLine ? 0 : 1);\r\n\r\n // node Changes\r\n newNode = appendNode.cloneNode(false);\r\n\r\n const isRemoveAnchor = isRemoveFormat || (isRemoveNode && (function (arr) {\r\n for (let n = 0, len = arr.length; n < len; n++) {\r\n if (util._isMaintainedNode(arr[n]) || util._isSizeNode(arr[n])) return true;\r\n }\r\n return false;\r\n })(removeNodeArray));\r\n\r\n const isSizeNode = isRemoveNode || util._isSizeNode(newNode);\r\n const _getMaintainedNode = this._util_getMaintainedNode.bind(util, isRemoveAnchor, isSizeNode);\r\n const _isMaintainedNode = this._util_isMaintainedNode.bind(util, isRemoveAnchor, isSizeNode);\r\n\r\n // one line\r\n if (oneLine) {\r\n if (this._resetCommonListCell(lineNodes[0], styleArray)) range = this.setRange(startCon, startOff, endCon, endOff);\r\n\r\n const newRange = this._nodeChange_oneLine(lineNodes[0], newNode, validation, startCon, startOff, endCon, endOff, isRemoveFormat, isRemoveNode, range.collapsed, _removeCheck, _getMaintainedNode, _isMaintainedNode);\r\n start.container = newRange.startContainer;\r\n start.offset = newRange.startOffset;\r\n end.container = newRange.endContainer;\r\n end.offset = newRange.endOffset;\r\n \r\n if (start.container === end.container && util.onlyZeroWidthSpace(start.container)) {\r\n start.offset = end.offset = 1;\r\n }\r\n this._setCommonListStyle(newRange.ancestor, null);\r\n } else { // multi line \r\n let appliedCommonList = false;\r\n if (endLength > 0 && this._resetCommonListCell(lineNodes[endLength], styleArray)) appliedCommonList = true;\r\n if (this._resetCommonListCell(lineNodes[0], styleArray)) appliedCommonList = true;\r\n if (appliedCommonList) this.setRange(startCon, startOff, endCon, endOff);\r\n\r\n // end\r\n if (endLength > 0) {\r\n newNode = appendNode.cloneNode(false);\r\n end = this._nodeChange_endLine(lineNodes[endLength], newNode, validation, endCon, endOff, isRemoveFormat, isRemoveNode, _removeCheck, _getMaintainedNode, _isMaintainedNode);\r\n }\r\n\r\n // mid\r\n for (let i = endLength - 1, newRange; i > 0; i--) {\r\n this._resetCommonListCell(lineNodes[i], styleArray);\r\n newNode = appendNode.cloneNode(false);\r\n newRange = this._nodeChange_middleLine(lineNodes[i], newNode, validation, isRemoveFormat, isRemoveNode, _removeCheck, end.container);\r\n if (newRange.endContainer && newRange.ancestor.contains(newRange.endContainer)) {\r\n end.ancestor = null;\r\n end.container = newRange.endContainer;\r\n }\r\n this._setCommonListStyle(newRange.ancestor, null);\r\n }\r\n\r\n // start\r\n newNode = appendNode.cloneNode(false);\r\n start = this._nodeChange_startLine(lineNodes[0], newNode, validation, startCon, startOff, isRemoveFormat, isRemoveNode, _removeCheck, _getMaintainedNode, _isMaintainedNode, end.container);\r\n\r\n if (start.endContainer) {\r\n end.ancestor = null;\r\n end.container = start.endContainer;\r\n }\r\n\r\n if (endLength <= 0) {\r\n end = start;\r\n } else if (!end.container) {\r\n end.ancestor = null;\r\n end.container = start.container;\r\n end.offset = start.container.textContent.length;\r\n }\r\n\r\n this._setCommonListStyle(start.ancestor, null);\r\n this._setCommonListStyle(end.ancestor || util.getFormatElement(end.container), null);\r\n }\r\n\r\n // set range\r\n this.controllersOff();\r\n this.setRange(start.container, start.offset, end.container, end.offset);\r\n\r\n // history stack\r\n this.history.push(false);\r\n },\r\n\r\n /**\r\n * @description Reset common style of list cell\r\n * @param {Element} el List cell element.
    • \r\n * @param {Array|null} styleArray Style array\r\n * @private\r\n */\r\n _resetCommonListCell: function (el, styleArray) {\r\n if (!util.isListCell(el)) return;\r\n if (!styleArray) styleArray = this._listKebab;\r\n\r\n const children = util.getArrayItem((el).childNodes, function (current) { return !util.isBreak(current); }, true);\r\n const elStyles = el.style;\r\n \r\n const ec = [], ek = [], elKeys = util.getValues(elStyles);\r\n for (let i = 0, len = this._listKebab.length; i < len; i++) {\r\n if (elKeys.indexOf(this._listKebab[i]) > -1 && styleArray.indexOf(this._listKebab[i]) > -1) {\r\n ec.push(this._listCamel[i]);\r\n ek.push(this._listKebab[i]);\r\n }\r\n }\r\n\r\n if (!ec.length) return;\r\n\r\n // reset cell style---\r\n const refer = util.createElement('SPAN');\r\n for (let i = 0, len = ec.length; i < len; i++) {\r\n refer.style[ec[i]] = elStyles[ek[i]];\r\n elStyles.removeProperty(ek[i]);\r\n }\r\n\r\n let sel = refer.cloneNode(false);\r\n let r = null, appliedEl = false;\r\n for (let i = 0, len = children.length, c, s; i < len; i++) {\r\n c = children[i];\r\n if (options._textTagsMap[c.nodeName.toLowerCase()]) continue;\r\n\r\n s = util.getValues(c.style);\r\n if (s.length === 0 || (ec.some(function (k) {return s.indexOf(k) === -1;}) && s.some(function(k) {ec.indexOf(k) > -1;}))) {\r\n r = c.nextSibling;\r\n sel.appendChild(c);\r\n } else if (sel.childNodes.length > 0) {\r\n el.insertBefore(sel, r);\r\n sel = refer.cloneNode(false);\r\n r = null;\r\n appliedEl = true;\r\n }\r\n }\r\n \r\n if (sel.childNodes.length > 0) {\r\n el.insertBefore(sel, r);\r\n appliedEl = true;\r\n }\r\n if (!elStyles.length) {\r\n el.removeAttribute('style');\r\n }\r\n\r\n return appliedEl;\r\n },\r\n\r\n /**\r\n * @description If certain styles are applied to all child nodes of the list cell, the style of the list cell is also changed. (bold, color, size)\r\n * @param {Element} el List cell element.
    • \r\n * @param {Element|null} child Variable for recursive call. (\"null\" on the first call)\r\n * @private\r\n */\r\n _setCommonListStyle: function (el, child) {\r\n if (!util.isListCell(el)) return;\r\n \r\n const children = util.getArrayItem((child || el).childNodes, function (current) { return !util.isBreak(current); }, true);\r\n child = children[0];\r\n \r\n if (!child || children.length > 1 || child.nodeType !== 1) return;\r\n \r\n // set cell style---\r\n const childStyle = child.style;\r\n const elStyle = el.style;\r\n const nodeName = child.nodeName.toLowerCase();\r\n let appliedEl = false;\r\n\r\n // bold, italic\r\n if (options._textTagsMap[nodeName] === options._defaultCommand.bold.toLowerCase()) elStyle.fontWeight = 'bold';\r\n if (options._textTagsMap[nodeName] === options._defaultCommand.italic.toLowerCase()) elStyle.fontStyle = 'italic';\r\n\r\n // styles\r\n const cKeys = util.getValues(childStyle);\r\n if (cKeys.length > 0) {\r\n for (let i = 0, len = this._listCamel.length; i < len; i++) {\r\n if (cKeys.indexOf(this._listKebab[i]) > -1) {\r\n elStyle[this._listCamel[i]] = childStyle[this._listCamel[i]];\r\n childStyle.removeProperty(this._listKebab[i]);\r\n appliedEl = true;\r\n }\r\n }\r\n }\r\n\r\n this._setCommonListStyle(el, child);\r\n if (!appliedEl) return;\r\n\r\n // common style\r\n if (!childStyle.length) {\r\n const ch = child.childNodes;\r\n const p = child.parentNode;\r\n const n = child.nextSibling;\r\n while (ch.length > 0) {\r\n p.insertBefore(ch[0], n);\r\n }\r\n util.removeItem(child);\r\n }\r\n },\r\n\r\n /**\r\n * @description Strip remove node\r\n * @param {Node} removeNode The remove node\r\n * @private\r\n */\r\n _stripRemoveNode: function (removeNode) {\r\n const element = removeNode.parentNode;\r\n if (!removeNode || removeNode.nodeType === 3 || !element) return;\r\n \r\n const children = removeNode.childNodes;\r\n while (children[0]) {\r\n element.insertBefore(children[0], removeNode);\r\n }\r\n\r\n element.removeChild(removeNode);\r\n },\r\n\r\n /**\r\n * @description Return the parent maintained tag. (bind and use a util object)\r\n * @param {Element} element Element\r\n * @returns {Element}\r\n * @private\r\n */\r\n _util_getMaintainedNode: function (_isRemove, _isSizeNode, element) {\r\n if (!element || _isRemove) return null;\r\n return this.getParentElement(element, this._isMaintainedNode.bind(this)) || (!_isSizeNode ? this.getParentElement(element, this._isSizeNode.bind(this)) : null);\r\n },\r\n\r\n /**\r\n * @description Check if element is a tag that should be persisted. (bind and use a util object)\r\n * @param {Element} element Element\r\n * @returns {Element}\r\n * @private\r\n */\r\n _util_isMaintainedNode: function (_isRemove, _isSizeNode, element) {\r\n if (!element || _isRemove || element.nodeType !== 1) return false;\r\n const anchor = this._isMaintainedNode(element);\r\n return this.getParentElement(element, this._isMaintainedNode.bind(this)) ? anchor : (anchor || (!_isSizeNode ? this._isSizeNode(element) : false));\r\n },\r\n\r\n /**\r\n * @description wraps text nodes of line selected text.\r\n * @param {Element} element The node of the line that contains the selected text node.\r\n * @param {Element} newInnerNode The dom that will wrap the selected text area\r\n * @param {Function} validation Check if the node should be stripped.\r\n * @param {Node} startCon The startContainer property of the selection object.\r\n * @param {Number} startOff The startOffset property of the selection object.\r\n * @param {Node} endCon The endContainer property of the selection object.\r\n * @param {Number} endOff The endOffset property of the selection object.\r\n * @param {Boolean} isRemoveFormat Is the remove all formats command?\r\n * @param {Boolean} isRemoveNode \"newInnerNode\" is remove node?\r\n * @param {Boolean} collapsed range.collapsed\r\n * @returns {{ancestor: *, startContainer: *, startOffset: *, endContainer: *, endOffset: *}}\r\n * @private\r\n */\r\n _nodeChange_oneLine: function (element, newInnerNode, validation, startCon, startOff, endCon, endOff, isRemoveFormat, isRemoveNode, collapsed, _removeCheck, _getMaintainedNode, _isMaintainedNode) {\r\n // not add tag\r\n let parentCon = startCon.parentNode;\r\n while (!parentCon.nextSibling && !parentCon.previousSibling && !util.isFormatElement(parentCon.parentNode) && !util.isWysiwygDiv(parentCon.parentNode)) {\r\n if (parentCon.nodeName === newInnerNode.nodeName) break;\r\n parentCon = parentCon.parentNode;\r\n }\r\n\r\n if (!isRemoveNode && parentCon === endCon.parentNode && parentCon.nodeName === newInnerNode.nodeName) {\r\n if (util.onlyZeroWidthSpace(startCon.textContent.slice(0, startOff)) && util.onlyZeroWidthSpace(endCon.textContent.slice(endOff))) {\r\n const children = parentCon.childNodes;\r\n let sameTag = true;\r\n \r\n for (let i = 0, len = children.length, c, s, e, z; i < len; i++) {\r\n c = children[i];\r\n z = !util.onlyZeroWidthSpace(c);\r\n if (c === startCon) {\r\n s = true;\r\n continue;\r\n }\r\n if (c === endCon) {\r\n e = true;\r\n continue;\r\n }\r\n if ((!s && z) || (s && e && z)) {\r\n sameTag = false;\r\n break;\r\n }\r\n }\r\n \r\n if (sameTag) {\r\n util.copyTagAttributes(parentCon, newInnerNode);\r\n \r\n return {\r\n ancestor: element,\r\n startContainer: startCon,\r\n startOffset: startOff,\r\n endContainer: endCon,\r\n endOffset: endOff\r\n };\r\n }\r\n }\r\n }\r\n\r\n // add tag\r\n _removeCheck.v = false;\r\n const el = element;\r\n const nNodeArray = [newInnerNode];\r\n const pNode = element.cloneNode(false);\r\n const isSameNode = startCon === endCon;\r\n let startContainer = startCon;\r\n let startOffset = startOff;\r\n let endContainer = endCon;\r\n let endOffset = endOff;\r\n let startPass = false;\r\n let endPass = false;\r\n let pCurrent, newNode, appendNode, cssText, anchorNode;\r\n\r\n const wRegExp = _w.RegExp;\r\n function checkCss (vNode) {\r\n const regExp = new wRegExp('(?:;|^|\\\\s)(?:' + cssText + 'null)\\\\s*:[^;]*\\\\s*(?:;|$)', 'ig');\r\n let style = '';\r\n\r\n if (regExp && vNode.style.cssText.length > 0) {\r\n style = regExp.test(vNode.style.cssText);\r\n }\r\n \r\n return !style;\r\n }\r\n\r\n (function recursionFunc(current, ancestor) {\r\n const childNodes = current.childNodes;\r\n\r\n for (let i = 0, len = childNodes.length, vNode; i < len; i++) {\r\n let child = childNodes[i];\r\n if (!child) continue;\r\n let coverNode = ancestor;\r\n let cloneNode;\r\n\r\n // startContainer\r\n if (!startPass && child === startContainer) {\r\n let line = pNode;\r\n anchorNode = _getMaintainedNode(child);\r\n const prevNode = util.createTextNode(startContainer.nodeType === 1 ? '' : startContainer.substringData(0, startOffset));\r\n const textNode = util.createTextNode(startContainer.nodeType === 1 ? '' : startContainer.substringData(startOffset, \r\n isSameNode ? \r\n (endOffset >= startOffset ? endOffset - startOffset : startContainer.data.length - startOffset) : \r\n startContainer.data.length - startOffset)\r\n );\r\n\r\n if (anchorNode) {\r\n const a = _getMaintainedNode(ancestor);\r\n if (a && a.parentNode !== line) {\r\n let m = a;\r\n let p = null;\r\n while (m.parentNode !== line) {\r\n ancestor = p = m.parentNode.cloneNode(false);\r\n while(m.childNodes[0]) {\r\n p.appendChild(m.childNodes[0]);\r\n }\r\n m.appendChild(p);\r\n m = m.parentNode;\r\n }\r\n m.parentNode.appendChild(a);\r\n }\r\n anchorNode = anchorNode.cloneNode(false);\r\n }\r\n \r\n if (!util.onlyZeroWidthSpace(prevNode)) {\r\n ancestor.appendChild(prevNode);\r\n }\r\n\r\n const prevAnchorNode = _getMaintainedNode(ancestor);\r\n if (!!prevAnchorNode) anchorNode = prevAnchorNode;\r\n if (anchorNode) line = anchorNode;\r\n\r\n newNode = child;\r\n pCurrent = [];\r\n cssText = '';\r\n while (newNode !== line && newNode !== el && newNode !== null) {\r\n vNode = _isMaintainedNode(newNode) ? null : validation(newNode);\r\n if (vNode && newNode.nodeType === 1 && checkCss(newNode)) {\r\n pCurrent.push(vNode);\r\n cssText += newNode.style.cssText.substr(0, newNode.style.cssText.indexOf(':')) + '|';\r\n }\r\n newNode = newNode.parentNode;\r\n }\r\n\r\n const childNode = pCurrent.pop() || textNode;\r\n appendNode = newNode = childNode;\r\n while (pCurrent.length > 0) {\r\n newNode = pCurrent.pop();\r\n appendNode.appendChild(newNode);\r\n appendNode = newNode;\r\n }\r\n\r\n newInnerNode.appendChild(childNode);\r\n line.appendChild(newInnerNode);\r\n\r\n if (anchorNode && !_getMaintainedNode(endContainer)) {\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n pNode.appendChild(newInnerNode);\r\n nNodeArray.push(newInnerNode);\r\n }\r\n\r\n startContainer = textNode;\r\n startOffset = 0;\r\n startPass = true;\r\n\r\n if (newNode !== textNode) newNode.appendChild(startContainer);\r\n if (!isSameNode) continue;\r\n }\r\n\r\n // endContainer\r\n if (!endPass && child === endContainer) {\r\n anchorNode = _getMaintainedNode(child);\r\n const afterNode = util.createTextNode(endContainer.nodeType === 1 ? '' : endContainer.substringData(endOffset, (endContainer.length - endOffset)));\r\n const textNode = util.createTextNode(isSameNode || endContainer.nodeType === 1 ? '' : endContainer.substringData(0, endOffset));\r\n\r\n if (anchorNode) {\r\n anchorNode = anchorNode.cloneNode(false);\r\n } else if (_isMaintainedNode(newInnerNode.parentNode) && !anchorNode) {\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n pNode.appendChild(newInnerNode);\r\n nNodeArray.push(newInnerNode);\r\n }\r\n\r\n if (!util.onlyZeroWidthSpace(afterNode)) {\r\n newNode = child;\r\n cssText = '';\r\n pCurrent = [];\r\n const anchors = [];\r\n while (newNode !== pNode && newNode !== el && newNode !== null) {\r\n if (newNode.nodeType === 1 && checkCss(newNode)) {\r\n if (_isMaintainedNode(newNode)) anchors.push(newNode.cloneNode(false));\r\n else pCurrent.push(newNode.cloneNode(false));\r\n cssText += newNode.style.cssText.substr(0, newNode.style.cssText.indexOf(':')) + '|';\r\n }\r\n newNode = newNode.parentNode;\r\n }\r\n pCurrent = pCurrent.concat(anchors);\r\n\r\n cloneNode = appendNode = newNode = pCurrent.pop() || afterNode;\r\n while (pCurrent.length > 0) {\r\n newNode = pCurrent.pop();\r\n appendNode.appendChild(newNode);\r\n appendNode = newNode;\r\n }\r\n\r\n pNode.appendChild(cloneNode);\r\n newNode.textContent = afterNode.data;\r\n }\r\n\r\n if (anchorNode && cloneNode) {\r\n const afterAnchorNode = _getMaintainedNode(cloneNode);\r\n if (afterAnchorNode) {\r\n anchorNode = afterAnchorNode;\r\n }\r\n }\r\n\r\n newNode = child;\r\n pCurrent = [];\r\n cssText = '';\r\n while (newNode !== pNode && newNode !== el && newNode !== null) {\r\n vNode = _isMaintainedNode(newNode) ? null : validation(newNode);\r\n if (vNode && newNode.nodeType === 1 && checkCss(newNode)) {\r\n pCurrent.push(vNode);\r\n cssText += newNode.style.cssText.substr(0, newNode.style.cssText.indexOf(':')) + '|';\r\n }\r\n newNode = newNode.parentNode;\r\n }\r\n\r\n const childNode = pCurrent.pop() || textNode;\r\n appendNode = newNode = childNode;\r\n while (pCurrent.length > 0) {\r\n newNode = pCurrent.pop();\r\n appendNode.appendChild(newNode);\r\n appendNode = newNode;\r\n }\r\n\r\n if (anchorNode) {\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n newInnerNode.appendChild(childNode);\r\n anchorNode.insertBefore(newInnerNode, anchorNode.firstChild);\r\n pNode.appendChild(anchorNode);\r\n nNodeArray.push(newInnerNode);\r\n anchorNode = null;\r\n } else {\r\n newInnerNode.appendChild(childNode);\r\n }\r\n\r\n endContainer = textNode;\r\n endOffset = textNode.data.length;\r\n endPass = true;\r\n\r\n if (!isRemoveFormat && collapsed) {\r\n newInnerNode = textNode;\r\n textNode.textContent = util.zeroWidthSpace;\r\n }\r\n\r\n if (newNode !== textNode) newNode.appendChild(endContainer);\r\n continue;\r\n }\r\n\r\n // other\r\n if (startPass) {\r\n if (child.nodeType === 1 && !util.isBreak(child)) {\r\n if (util._isIgnoreNodeChange(child)) {\r\n pNode.appendChild(child.cloneNode(true));\r\n if (!collapsed) {\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n pNode.appendChild(newInnerNode);\r\n nNodeArray.push(newInnerNode);\r\n }\r\n } else {\r\n recursionFunc(child, child);\r\n }\r\n continue;\r\n }\r\n\r\n newNode = child;\r\n pCurrent = [];\r\n cssText = '';\r\n const anchors = [];\r\n while (newNode.parentNode !== null && newNode !== el && newNode !== newInnerNode) {\r\n vNode = endPass ? newNode.cloneNode(false) : validation(newNode);\r\n if (newNode.nodeType === 1 && !util.isBreak(child) && vNode && checkCss(newNode)) {\r\n if (_isMaintainedNode(newNode)) {\r\n if (!anchorNode) anchors.push(vNode);\r\n } else {\r\n pCurrent.push(vNode);\r\n }\r\n cssText += newNode.style.cssText.substr(0, newNode.style.cssText.indexOf(':')) + '|';\r\n }\r\n newNode = newNode.parentNode;\r\n }\r\n pCurrent = pCurrent.concat(anchors);\r\n\r\n const childNode = pCurrent.pop() || child;\r\n appendNode = newNode = childNode;\r\n while (pCurrent.length > 0) {\r\n newNode = pCurrent.pop();\r\n appendNode.appendChild(newNode);\r\n appendNode = newNode;\r\n }\r\n \r\n if (_isMaintainedNode(newInnerNode.parentNode) && !_isMaintainedNode(childNode) && !util.onlyZeroWidthSpace(newInnerNode)) {\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n pNode.appendChild(newInnerNode);\r\n nNodeArray.push(newInnerNode);\r\n }\r\n \r\n if (!endPass && !anchorNode && _isMaintainedNode(childNode)) {\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n const aChildren = childNode.childNodes;\r\n for (let a = 0, aLen = aChildren.length; a < aLen; a++) {\r\n newInnerNode.appendChild(aChildren[a]);\r\n }\r\n childNode.appendChild(newInnerNode);\r\n pNode.appendChild(childNode);\r\n nNodeArray.push(newInnerNode);\r\n if (newInnerNode.children.length > 0) ancestor = newNode;\r\n else ancestor = newInnerNode;\r\n } else if (childNode === child) {\r\n if (!endPass) ancestor = newInnerNode;\r\n else ancestor = pNode;\r\n } else if (endPass) {\r\n pNode.appendChild(childNode);\r\n ancestor = newNode;\r\n } else {\r\n newInnerNode.appendChild(childNode);\r\n ancestor = newNode;\r\n }\r\n\r\n if (anchorNode && child.nodeType === 3) {\r\n if (_getMaintainedNode(child)) {\r\n const ancestorAnchorNode = util.getParentElement(ancestor, function (current) {return this._isMaintainedNode(current.parentNode) || current.parentNode === pNode;}.bind(util));\r\n anchorNode.appendChild(ancestorAnchorNode);\r\n newInnerNode = ancestorAnchorNode.cloneNode(false);\r\n nNodeArray.push(newInnerNode);\r\n pNode.appendChild(newInnerNode);\r\n } else {\r\n anchorNode = null;\r\n }\r\n }\r\n }\r\n\r\n cloneNode = child.cloneNode(false);\r\n ancestor.appendChild(cloneNode);\r\n if (child.nodeType === 1 && !util.isBreak(child)) coverNode = cloneNode;\r\n\r\n recursionFunc(child, coverNode);\r\n }\r\n })(element, pNode);\r\n\r\n // not remove tag\r\n if (isRemoveNode && !isRemoveFormat && !_removeCheck.v) {\r\n return {\r\n ancestor: element,\r\n startContainer: startCon,\r\n startOffset: startOff,\r\n endContainer: endCon,\r\n endOffset: endOff\r\n };\r\n }\r\n\r\n isRemoveFormat = isRemoveFormat && isRemoveNode;\r\n\r\n if (isRemoveFormat) {\r\n for (let i = 0; i < nNodeArray.length; i++) {\r\n let removeNode = nNodeArray[i];\r\n let textNode, textNode_s, textNode_e;\r\n \r\n if (collapsed) {\r\n textNode = util.createTextNode(util.zeroWidthSpace);\r\n pNode.replaceChild(textNode, removeNode);\r\n } else {\r\n const rChildren = removeNode.childNodes;\r\n textNode_s = rChildren[0];\r\n while (rChildren[0]) {\r\n textNode_e = rChildren[0];\r\n pNode.insertBefore(textNode_e, removeNode);\r\n }\r\n util.removeItem(removeNode);\r\n }\r\n\r\n if (i === 0) {\r\n if (collapsed) {\r\n startContainer = endContainer = textNode;\r\n } else {\r\n startContainer = textNode_s;\r\n endContainer = textNode_e;\r\n }\r\n }\r\n }\r\n } else {\r\n if (isRemoveNode) {\r\n for (let i = 0; i < nNodeArray.length; i++) {\r\n this._stripRemoveNode(nNodeArray[i]);\r\n }\r\n }\r\n \r\n if (collapsed) {\r\n startContainer = endContainer = newInnerNode;\r\n }\r\n }\r\n\r\n util.removeEmptyNode(pNode, newInnerNode, false);\r\n\r\n if (collapsed) {\r\n startOffset = startContainer.textContent.length;\r\n endOffset = endContainer.textContent.length;\r\n }\r\n\r\n // endContainer reset\r\n const endConReset = isRemoveFormat || endContainer.textContent.length === 0;\r\n\r\n if (!util.isBreak(endContainer) && endContainer.textContent.length === 0) {\r\n util.removeItem(endContainer);\r\n endContainer = startContainer;\r\n }\r\n endOffset = endConReset ? endContainer.textContent.length : endOffset;\r\n\r\n // node change\r\n const newStartOffset = {s: 0, e: 0};\r\n const startPath = util.getNodePath(startContainer, pNode, newStartOffset);\r\n\r\n const mergeEndCon = !endContainer.parentNode;\r\n if (mergeEndCon) endContainer = startContainer;\r\n const newEndOffset = {s: 0, e: 0};\r\n const endPath = util.getNodePath(endContainer , pNode, (!mergeEndCon && !endConReset) ? newEndOffset : null);\r\n\r\n startOffset += newStartOffset.s;\r\n endOffset = (collapsed ? startOffset : mergeEndCon ? startContainer.textContent.length : endConReset ? endOffset + newStartOffset.s : endOffset + newEndOffset.s);\r\n\r\n // tag merge\r\n const newOffsets = util.mergeSameTags(pNode, [startPath, endPath], true);\r\n\r\n element.parentNode.replaceChild(pNode, element);\r\n\r\n startContainer = util.getNodeFromPath(startPath, pNode);\r\n endContainer = util.getNodeFromPath(endPath, pNode);\r\n\r\n return {\r\n ancestor: pNode,\r\n startContainer: startContainer,\r\n startOffset: startOffset + newOffsets[0],\r\n endContainer: endContainer,\r\n endOffset: endOffset + newOffsets[1]\r\n };\r\n },\r\n\r\n /**\r\n * @description wraps first line selected text.\r\n * @param {Element} element The node of the line that contains the selected text node.\r\n * @param {Element} newInnerNode The dom that will wrap the selected text area\r\n * @param {Function} validation Check if the node should be stripped.\r\n * @param {Node} startCon The startContainer property of the selection object.\r\n * @param {Number} startOff The startOffset property of the selection object.\r\n * @param {Boolean} isRemoveFormat Is the remove all formats command?\r\n * @param {Boolean} isRemoveNode \"newInnerNode\" is remove node?\r\n * @returns {null|Node} If end container is renewed, returned renewed node\r\n * @returns {Object} { ancestor, container, offset, endContainer }\r\n * @private\r\n */\r\n _nodeChange_startLine: function (element, newInnerNode, validation, startCon, startOff, isRemoveFormat, isRemoveNode, _removeCheck, _getMaintainedNode, _isMaintainedNode, _endContainer) {\r\n // not add tag\r\n let parentCon = startCon.parentNode;\r\n while (!parentCon.nextSibling && !parentCon.previousSibling && !util.isFormatElement(parentCon.parentNode) && !util.isWysiwygDiv(parentCon.parentNode)) {\r\n if (parentCon.nodeName === newInnerNode.nodeName) break;\r\n parentCon = parentCon.parentNode;\r\n }\r\n\r\n if (!isRemoveNode && parentCon.nodeName === newInnerNode.nodeName && !util.isFormatElement(parentCon) && !parentCon.nextSibling && util.onlyZeroWidthSpace(startCon.textContent.slice(0, startOff))) {\r\n let sameTag = true;\r\n let s = startCon.previousSibling;\r\n while (s) {\r\n if (!util.onlyZeroWidthSpace(s)) {\r\n sameTag = false;\r\n break;\r\n }\r\n s = s.previousSibling;\r\n }\r\n\r\n if (sameTag) {\r\n util.copyTagAttributes(parentCon, newInnerNode);\r\n \r\n return {\r\n ancestor: element,\r\n container: startCon,\r\n offset: startOff\r\n };\r\n }\r\n }\r\n\r\n // add tag\r\n _removeCheck.v = false;\r\n const el = element;\r\n const nNodeArray = [newInnerNode];\r\n const pNode = element.cloneNode(false);\r\n\r\n let container = startCon;\r\n let offset = startOff;\r\n let passNode = false;\r\n let pCurrent, newNode, appendNode, anchorNode;\r\n\r\n (function recursionFunc(current, ancestor) {\r\n const childNodes = current.childNodes;\r\n\r\n for (let i = 0, len = childNodes.length, vNode, cloneChild; i < len; i++) {\r\n const child = childNodes[i];\r\n if (!child) continue;\r\n let coverNode = ancestor;\r\n\r\n if (passNode && !util.isBreak(child)) {\r\n if (child.nodeType === 1) {\r\n if (util._isIgnoreNodeChange(child)) {\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n cloneChild = child.cloneNode(true);\r\n pNode.appendChild(cloneChild);\r\n pNode.appendChild(newInnerNode);\r\n nNodeArray.push(newInnerNode);\r\n\r\n // end container\r\n if (_endContainer && child.contains(_endContainer)) {\r\n const endPath = util.getNodePath(_endContainer, child);\r\n _endContainer = util.getNodeFromPath(endPath, cloneChild);\r\n }\r\n } else {\r\n recursionFunc(child, child);\r\n }\r\n continue;\r\n }\r\n\r\n newNode = child;\r\n pCurrent = [];\r\n const anchors = [];\r\n while (newNode.parentNode !== null && newNode !== el && newNode !== newInnerNode) {\r\n vNode = validation(newNode);\r\n if (newNode.nodeType === 1 && vNode) {\r\n if (_isMaintainedNode(newNode)) {\r\n if (!anchorNode) anchors.push(vNode);\r\n } else {\r\n pCurrent.push(vNode);\r\n }\r\n }\r\n newNode = newNode.parentNode;\r\n }\r\n pCurrent = pCurrent.concat(anchors);\r\n\r\n const isTopNode = pCurrent.length > 0;\r\n const childNode = pCurrent.pop() || child;\r\n appendNode = newNode = childNode;\r\n while (pCurrent.length > 0) {\r\n newNode = pCurrent.pop();\r\n appendNode.appendChild(newNode);\r\n appendNode = newNode;\r\n }\r\n\r\n if (_isMaintainedNode(newInnerNode.parentNode) && !_isMaintainedNode(childNode)) {\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n pNode.appendChild(newInnerNode);\r\n nNodeArray.push(newInnerNode);\r\n }\r\n \r\n if (!anchorNode && _isMaintainedNode(childNode)) {\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n const aChildren = childNode.childNodes;\r\n for (let a = 0, aLen = aChildren.length; a < aLen; a++) {\r\n newInnerNode.appendChild(aChildren[a]);\r\n }\r\n childNode.appendChild(newInnerNode);\r\n pNode.appendChild(childNode);\r\n ancestor = !_isMaintainedNode(newNode) ? newNode : newInnerNode;\r\n nNodeArray.push(newInnerNode);\r\n } else if (isTopNode) {\r\n newInnerNode.appendChild(childNode);\r\n ancestor = newNode;\r\n } else {\r\n ancestor = newInnerNode;\r\n }\r\n\r\n if (anchorNode && child.nodeType === 3) {\r\n if (_getMaintainedNode(child)) {\r\n const ancestorAnchorNode = util.getParentElement(ancestor, function (current) {return this._isMaintainedNode(current.parentNode) || current.parentNode === pNode;}.bind(util));\r\n anchorNode.appendChild(ancestorAnchorNode);\r\n newInnerNode = ancestorAnchorNode.cloneNode(false);\r\n nNodeArray.push(newInnerNode);\r\n pNode.appendChild(newInnerNode);\r\n } else {\r\n anchorNode = null;\r\n }\r\n }\r\n }\r\n\r\n // startContainer\r\n if (!passNode && child === container) {\r\n let line = pNode;\r\n anchorNode = _getMaintainedNode(child);\r\n const prevNode = util.createTextNode(container.nodeType === 1 ? '' : container.substringData(0, offset));\r\n const textNode = util.createTextNode(container.nodeType === 1 ? '' : container.substringData(offset, (container.length - offset)));\r\n\r\n if (anchorNode) {\r\n const a = _getMaintainedNode(ancestor);\r\n if (a && a.parentNode !== line) {\r\n let m = a;\r\n let p = null;\r\n while (m.parentNode !== line) {\r\n ancestor = p = m.parentNode.cloneNode(false);\r\n while(m.childNodes[0]) {\r\n p.appendChild(m.childNodes[0]);\r\n }\r\n m.appendChild(p);\r\n m = m.parentNode;\r\n }\r\n m.parentNode.appendChild(a);\r\n }\r\n anchorNode = anchorNode.cloneNode(false);\r\n }\r\n\r\n if (!util.onlyZeroWidthSpace(prevNode)) {\r\n ancestor.appendChild(prevNode);\r\n }\r\n\r\n const prevAnchorNode = _getMaintainedNode(ancestor);\r\n if (!!prevAnchorNode) anchorNode = prevAnchorNode;\r\n if (anchorNode) line = anchorNode;\r\n\r\n newNode = ancestor;\r\n pCurrent = [];\r\n while (newNode !== line && newNode !== null) {\r\n vNode = validation(newNode);\r\n if (newNode.nodeType === 1 && vNode) {\r\n pCurrent.push(vNode);\r\n }\r\n newNode = newNode.parentNode;\r\n }\r\n\r\n const childNode = pCurrent.pop() || ancestor;\r\n appendNode = newNode = childNode;\r\n while (pCurrent.length > 0) {\r\n newNode = pCurrent.pop();\r\n appendNode.appendChild(newNode);\r\n appendNode = newNode;\r\n }\r\n\r\n if (childNode !== ancestor) {\r\n newInnerNode.appendChild(childNode);\r\n ancestor = newNode;\r\n } else {\r\n ancestor = newInnerNode;\r\n }\r\n\r\n if (util.isBreak(child)) newInnerNode.appendChild(child.cloneNode(false));\r\n line.appendChild(newInnerNode);\r\n\r\n container = textNode;\r\n offset = 0;\r\n passNode = true;\r\n\r\n ancestor.appendChild(container);\r\n continue;\r\n }\r\n\r\n vNode = !passNode ? child.cloneNode(false) : validation(child);\r\n if (vNode) {\r\n ancestor.appendChild(vNode);\r\n if (child.nodeType === 1 && !util.isBreak(child)) coverNode = vNode;\r\n }\r\n\r\n recursionFunc(child, coverNode);\r\n }\r\n })(element, pNode);\r\n\r\n // not remove tag\r\n if (isRemoveNode && !isRemoveFormat && !_removeCheck.v) {\r\n return {\r\n ancestor: element,\r\n container: startCon,\r\n offset: startOff,\r\n endContainer: _endContainer\r\n };\r\n }\r\n\r\n isRemoveFormat = isRemoveFormat && isRemoveNode;\r\n\r\n if (isRemoveFormat) {\r\n for (let i = 0; i < nNodeArray.length; i++) {\r\n let removeNode = nNodeArray[i];\r\n\r\n const rChildren = removeNode.childNodes;\r\n const textNode = rChildren[0];\r\n while (rChildren[0]) {\r\n pNode.insertBefore(rChildren[0], removeNode);\r\n }\r\n util.removeItem(removeNode);\r\n\r\n if (i === 0) container = textNode;\r\n }\r\n } else if (isRemoveNode) {\r\n newInnerNode = newInnerNode.firstChild;\r\n for (let i = 0; i < nNodeArray.length; i++) {\r\n this._stripRemoveNode(nNodeArray[i]);\r\n }\r\n }\r\n\r\n if (!isRemoveFormat && pNode.childNodes.length === 0) {\r\n if (element.childNodes) {\r\n container = element.childNodes[0];\r\n } else {\r\n container = util.createTextNode(util.zeroWidthSpace);\r\n element.appendChild(container);\r\n }\r\n } else {\r\n util.removeEmptyNode(pNode, newInnerNode, false);\r\n\r\n if (util.onlyZeroWidthSpace(pNode.textContent)) {\r\n container = pNode.firstChild;\r\n offset = 0;\r\n }\r\n\r\n // node change\r\n const offsets = {s: 0, e: 0};\r\n const path = util.getNodePath(container, pNode, offsets);\r\n offset += offsets.s;\r\n\r\n // tag merge\r\n const newOffsets = util.mergeSameTags(pNode, [path], true);\r\n\r\n element.parentNode.replaceChild(pNode, element);\r\n\r\n container = util.getNodeFromPath(path, pNode);\r\n offset += newOffsets[0];\r\n }\r\n\r\n return {\r\n ancestor: pNode,\r\n container: container,\r\n offset: offset,\r\n endContainer: _endContainer\r\n };\r\n },\r\n\r\n /**\r\n * @description wraps mid lines selected text.\r\n * @param {Element} element The node of the line that contains the selected text node.\r\n * @param {Element} newInnerNode The dom that will wrap the selected text area\r\n * @param {Function} validation Check if the node should be stripped.\r\n * @param {Boolean} isRemoveFormat Is the remove all formats command?\r\n * @param {Boolean} isRemoveNode \"newInnerNode\" is remove node?\r\n * @param {Node} _endContainer Offset node of last line already modified (end.container)\r\n * @returns {Object} { ancestor, endContainer: \"If end container is renewed, returned renewed node\" }\r\n * @private\r\n */\r\n _nodeChange_middleLine: function (element, newInnerNode, validation, isRemoveFormat, isRemoveNode, _removeCheck, _endContainer) {\r\n // not add tag\r\n if (!isRemoveNode) {\r\n // end container path\r\n let endPath = null;\r\n if (_endContainer && element.contains(_endContainer)) endPath = util.getNodePath(_endContainer, element);\r\n\r\n const tempNode = element.cloneNode(true);\r\n const newNodeName = newInnerNode.nodeName;\r\n const newCssText = newInnerNode.style.cssText;\r\n const newClass = newInnerNode.className;\r\n\r\n let children = tempNode.childNodes;\r\n let i = 0, len = children.length;\r\n for (let child; i < len; i++) {\r\n child = children[i];\r\n if (child.nodeType === 3) break;\r\n if (child.nodeName === newNodeName) {\r\n child.style.cssText += newCssText;\r\n util.addClass(child, newClass);\r\n } else if (!util.isBreak(child) && util._isIgnoreNodeChange(child)) {\r\n continue;\r\n } else if (len === 1) {\r\n children = child.childNodes;\r\n len = children.length;\r\n i = -1;\r\n continue;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n if (len > 0 && i === len) {\r\n element.innerHTML = tempNode.innerHTML;\r\n return {\r\n ancestor: element,\r\n endContainer: endPath ? util.getNodeFromPath(endPath, element) : null\r\n };\r\n }\r\n }\r\n\r\n // add tag\r\n _removeCheck.v = false;\r\n const pNode = element.cloneNode(false);\r\n const nNodeArray = [newInnerNode];\r\n let noneChange = true;\r\n\r\n (function recursionFunc(current, ancestor) {\r\n const childNodes = current.childNodes;\r\n\r\n for (let i = 0, len = childNodes.length, vNode, cloneChild; i < len; i++) {\r\n let child = childNodes[i];\r\n if (!child) continue;\r\n let coverNode = ancestor;\r\n\r\n if (!util.isBreak(child) && util._isIgnoreNodeChange(child)) {\r\n if (newInnerNode.childNodes.length > 0) {\r\n pNode.appendChild(newInnerNode);\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n }\r\n \r\n cloneChild = child.cloneNode(true);\r\n pNode.appendChild(cloneChild);\r\n pNode.appendChild(newInnerNode);\r\n nNodeArray.push(newInnerNode);\r\n ancestor = newInnerNode;\r\n\r\n // end container\r\n if (_endContainer && child.contains(_endContainer)) {\r\n const endPath = util.getNodePath(_endContainer, child);\r\n _endContainer = util.getNodeFromPath(endPath, cloneChild);\r\n }\r\n\r\n continue;\r\n } else {\r\n vNode = validation(child);\r\n if (vNode) {\r\n noneChange = false;\r\n ancestor.appendChild(vNode);\r\n if (child.nodeType === 1) coverNode = vNode;\r\n }\r\n }\r\n\r\n if (!util.isBreak(child)) recursionFunc(child, coverNode);\r\n }\r\n })(element, newInnerNode);\r\n\r\n // not remove tag\r\n if (noneChange || (isRemoveNode && !isRemoveFormat && !_removeCheck.v)) return { ancestor: element, endContainer: _endContainer };\r\n\r\n pNode.appendChild(newInnerNode);\r\n\r\n if (isRemoveFormat && isRemoveNode) {\r\n for (let i = 0; i < nNodeArray.length; i++) {\r\n let removeNode = nNodeArray[i];\r\n \r\n const rChildren = removeNode.childNodes;\r\n while (rChildren[0]) {\r\n pNode.insertBefore(rChildren[0], removeNode);\r\n }\r\n util.removeItem(removeNode);\r\n }\r\n } else if (isRemoveNode) {\r\n newInnerNode = newInnerNode.firstChild;\r\n for (let i = 0; i < nNodeArray.length; i++) {\r\n this._stripRemoveNode(nNodeArray[i]);\r\n }\r\n }\r\n\r\n util.removeEmptyNode(pNode, newInnerNode, false);\r\n util.mergeSameTags(pNode, null, true);\r\n\r\n // node change\r\n element.parentNode.replaceChild(pNode, element);\r\n return { ancestor: pNode, endContainer: _endContainer };\r\n },\r\n\r\n /**\r\n * @description wraps last line selected text.\r\n * @param {Element} element The node of the line that contains the selected text node.\r\n * @param {Element} newInnerNode The dom that will wrap the selected text area\r\n * @param {Function} validation Check if the node should be stripped.\r\n * @param {Node} endCon The endContainer property of the selection object.\r\n * @param {Number} endOff The endOffset property of the selection object.\r\n * @param {Boolean} isRemoveFormat Is the remove all formats command?\r\n * @param {Boolean} isRemoveNode \"newInnerNode\" is remove node?\r\n * @returns {Object} { ancestor, container, offset }\r\n * @private\r\n */\r\n _nodeChange_endLine: function (element, newInnerNode, validation, endCon, endOff, isRemoveFormat, isRemoveNode, _removeCheck, _getMaintainedNode, _isMaintainedNode) {\r\n // not add tag\r\n let parentCon = endCon.parentNode;\r\n while (!parentCon.nextSibling && !parentCon.previousSibling && !util.isFormatElement(parentCon.parentNode) && !util.isWysiwygDiv(parentCon.parentNode)) {\r\n if (parentCon.nodeName === newInnerNode.nodeName) break;\r\n parentCon = parentCon.parentNode;\r\n }\r\n \r\n if (!isRemoveNode && parentCon.nodeName === newInnerNode.nodeName && !util.isFormatElement(parentCon) && !parentCon.previousSibling && util.onlyZeroWidthSpace(endCon.textContent.slice(endOff))) {\r\n let sameTag = true;\r\n let e = endCon.nextSibling;\r\n while (e) {\r\n if (!util.onlyZeroWidthSpace(e)) {\r\n sameTag = false;\r\n break;\r\n }\r\n e = e.nextSibling;\r\n }\r\n\r\n if (sameTag) {\r\n util.copyTagAttributes(parentCon, newInnerNode);\r\n \r\n return {\r\n ancestor: element,\r\n container: endCon,\r\n offset: endOff\r\n };\r\n }\r\n }\r\n\r\n // add tag\r\n _removeCheck.v = false;\r\n const el = element;\r\n const nNodeArray = [newInnerNode];\r\n const pNode = element.cloneNode(false);\r\n\r\n let container = endCon;\r\n let offset = endOff;\r\n let passNode = false;\r\n let pCurrent, newNode, appendNode, anchorNode;\r\n\r\n (function recursionFunc(current, ancestor) {\r\n const childNodes = current.childNodes;\r\n\r\n for (let i = childNodes.length - 1, vNode; 0 <= i; i--) {\r\n const child = childNodes[i];\r\n if (!child) continue;\r\n let coverNode = ancestor;\r\n\r\n if (passNode && !util.isBreak(child)) {\r\n if (child.nodeType === 1) {\r\n if (util._isIgnoreNodeChange(child)) {\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n const cloneChild = child.cloneNode(true);\r\n pNode.insertBefore(cloneChild, ancestor);\r\n pNode.insertBefore(newInnerNode, cloneChild);\r\n nNodeArray.push(newInnerNode);\r\n } else {\r\n recursionFunc(child, child);\r\n }\r\n continue;\r\n }\r\n\r\n newNode = child;\r\n pCurrent = [];\r\n const anchors = [];\r\n while (newNode.parentNode !== null && newNode !== el && newNode !== newInnerNode) {\r\n vNode = validation(newNode);\r\n if (vNode && newNode.nodeType === 1) {\r\n if (_isMaintainedNode(newNode)) {\r\n if (!anchorNode) anchors.push(vNode);\r\n } else {\r\n pCurrent.push(vNode);\r\n }\r\n }\r\n newNode = newNode.parentNode;\r\n }\r\n pCurrent = pCurrent.concat(anchors);\r\n\r\n const isTopNode = pCurrent.length > 0;\r\n const childNode = pCurrent.pop() || child;\r\n appendNode = newNode = childNode;\r\n while (pCurrent.length > 0) {\r\n newNode = pCurrent.pop();\r\n appendNode.appendChild(newNode);\r\n appendNode = newNode;\r\n }\r\n\r\n if (_isMaintainedNode(newInnerNode.parentNode) && !_isMaintainedNode(childNode)) {\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n pNode.insertBefore(newInnerNode, pNode.firstChild);\r\n nNodeArray.push(newInnerNode);\r\n }\r\n\r\n if (!anchorNode && _isMaintainedNode(childNode)) {\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n const aChildren = childNode.childNodes;\r\n for (let a = 0, aLen = aChildren.length; a < aLen; a++) {\r\n newInnerNode.appendChild(aChildren[a]);\r\n }\r\n childNode.appendChild(newInnerNode);\r\n pNode.insertBefore(childNode, pNode.firstChild);\r\n nNodeArray.push(newInnerNode);\r\n if (newInnerNode.children.length > 0) ancestor = newNode;\r\n else ancestor = newInnerNode;\r\n } else if (isTopNode) {\r\n newInnerNode.insertBefore(childNode, newInnerNode.firstChild);\r\n ancestor = newNode;\r\n } else {\r\n ancestor = newInnerNode;\r\n }\r\n\r\n if (anchorNode && child.nodeType === 3) {\r\n if (_getMaintainedNode(child)) {\r\n const ancestorAnchorNode = util.getParentElement(ancestor, function (current) {return this._isMaintainedNode(current.parentNode) || current.parentNode === pNode;}.bind(util));\r\n anchorNode.appendChild(ancestorAnchorNode);\r\n newInnerNode = ancestorAnchorNode.cloneNode(false);\r\n nNodeArray.push(newInnerNode);\r\n pNode.insertBefore(newInnerNode, pNode.firstChild);\r\n } else {\r\n anchorNode = null;\r\n }\r\n }\r\n }\r\n\r\n // endContainer\r\n if (!passNode && child === container) {\r\n anchorNode = _getMaintainedNode(child);\r\n const afterNode = util.createTextNode(container.nodeType === 1 ? '' : container.substringData(offset, (container.length - offset)));\r\n const textNode = util.createTextNode(container.nodeType === 1 ? '' : container.substringData(0, offset));\r\n\r\n if (anchorNode) {\r\n anchorNode = anchorNode.cloneNode(false);\r\n const a = _getMaintainedNode(ancestor);\r\n if (a && a.parentNode !== pNode) {\r\n let m = a;\r\n let p = null;\r\n while (m.parentNode !== pNode) {\r\n ancestor = p = m.parentNode.cloneNode(false);\r\n while(m.childNodes[0]) {\r\n p.appendChild(m.childNodes[0]);\r\n }\r\n m.appendChild(p);\r\n m = m.parentNode;\r\n }\r\n m.parentNode.insertBefore(a, m.parentNode.firstChild);\r\n }\r\n anchorNode = anchorNode.cloneNode(false);\r\n } else if (_isMaintainedNode(newInnerNode.parentNode) && !anchorNode) {\r\n newInnerNode = newInnerNode.cloneNode(false);\r\n pNode.appendChild(newInnerNode);\r\n nNodeArray.push(newInnerNode);\r\n }\r\n\r\n if (!util.onlyZeroWidthSpace(afterNode)) {\r\n ancestor.insertBefore(afterNode, ancestor.firstChild);\r\n }\r\n\r\n newNode = ancestor;\r\n pCurrent = [];\r\n while (newNode !== pNode && newNode !== null) {\r\n vNode = _isMaintainedNode(newNode) ? null : validation(newNode);\r\n if (vNode && newNode.nodeType === 1) {\r\n pCurrent.push(vNode);\r\n }\r\n newNode = newNode.parentNode;\r\n }\r\n\r\n const childNode = pCurrent.pop() || ancestor;\r\n appendNode = newNode = childNode;\r\n while (pCurrent.length > 0) {\r\n newNode = pCurrent.pop();\r\n appendNode.appendChild(newNode);\r\n appendNode = newNode;\r\n }\r\n\r\n if (childNode !== ancestor) {\r\n newInnerNode.insertBefore(childNode, newInnerNode.firstChild);\r\n ancestor = newNode;\r\n } else {\r\n ancestor = newInnerNode;\r\n }\r\n\r\n if (util.isBreak(child)) newInnerNode.appendChild(child.cloneNode(false));\r\n \r\n if (anchorNode) {\r\n anchorNode.insertBefore(newInnerNode, anchorNode.firstChild);\r\n pNode.insertBefore(anchorNode, pNode.firstChild);\r\n anchorNode = null;\r\n } else {\r\n pNode.insertBefore(newInnerNode, pNode.firstChild);\r\n }\r\n\r\n container = textNode;\r\n offset = textNode.data.length;\r\n passNode = true;\r\n\r\n ancestor.insertBefore(container, ancestor.firstChild);\r\n continue;\r\n }\r\n\r\n vNode = !passNode ? child.cloneNode(false) : validation(child);\r\n if (vNode) {\r\n ancestor.insertBefore(vNode, ancestor.firstChild);\r\n if (child.nodeType === 1 && !util.isBreak(child)) coverNode = vNode;\r\n }\r\n\r\n recursionFunc(child, coverNode);\r\n }\r\n })(element, pNode);\r\n\r\n // not remove tag\r\n if (isRemoveNode && !isRemoveFormat && !_removeCheck.v) {\r\n return {\r\n ancestor: element,\r\n container: endCon,\r\n offset: endOff\r\n };\r\n }\r\n\r\n isRemoveFormat = isRemoveFormat && isRemoveNode;\r\n\r\n if (isRemoveFormat) {\r\n for (let i = 0; i < nNodeArray.length; i++) {\r\n let removeNode = nNodeArray[i];\r\n \r\n const rChildren = removeNode.childNodes;\r\n let textNode = null;\r\n while (rChildren[0]) {\r\n textNode = rChildren[0];\r\n pNode.insertBefore(textNode, removeNode);\r\n }\r\n util.removeItem(removeNode);\r\n\r\n if (i === nNodeArray.length - 1) {\r\n container = textNode;\r\n offset = textNode.textContent.length;\r\n }\r\n }\r\n } else if (isRemoveNode) {\r\n newInnerNode = newInnerNode.firstChild;\r\n for (let i = 0; i < nNodeArray.length; i++) {\r\n this._stripRemoveNode(nNodeArray[i]);\r\n }\r\n }\r\n\r\n if (!isRemoveFormat && pNode.childNodes.length === 0) {\r\n if (element.childNodes) {\r\n container = element.childNodes[0];\r\n } else {\r\n container = util.createTextNode(util.zeroWidthSpace);\r\n element.appendChild(container);\r\n }\r\n } else {\r\n if (!isRemoveNode && newInnerNode.textContent.length === 0) {\r\n util.removeEmptyNode(pNode, null, false);\r\n return {\r\n ancestor: null,\r\n container: null,\r\n offset: 0\r\n };\r\n }\r\n\r\n util.removeEmptyNode(pNode, newInnerNode, false);\r\n\r\n if (util.onlyZeroWidthSpace(pNode.textContent)) {\r\n container = pNode.firstChild;\r\n offset = container.textContent.length;\r\n } else if (util.onlyZeroWidthSpace(container)) {\r\n container = newInnerNode;\r\n offset = 1;\r\n }\r\n \r\n // node change\r\n const offsets = {s: 0, e: 0};\r\n const path = util.getNodePath(container, pNode, offsets);\r\n offset += offsets.s;\r\n\r\n // tag merge\r\n const newOffsets = util.mergeSameTags(pNode, [path], true);\r\n\r\n element.parentNode.replaceChild(pNode, element);\r\n\r\n container = util.getNodeFromPath(path, pNode);\r\n offset += newOffsets[0];\r\n }\r\n\r\n return {\r\n ancestor: pNode,\r\n container: container,\r\n offset: container.nodeType === 1 && offset === 1 ? container.childNodes.length : offset\r\n };\r\n },\r\n\r\n /**\r\n * @description Run plugin calls and basic commands.\r\n * @param {String} command Command string\r\n * @param {String} display Display type string ('command', 'submenu', 'dialog', 'container')\r\n * @param {Element} target The element of command button\r\n */\r\n actionCall: function (command, display, target) {\r\n // call plugins\r\n if (display) {\r\n if (/more/i.test(display)) {\r\n if (target !== this._moreLayerActiveButton) {\r\n const layer = context.element.toolbar.querySelector('.' + command);\r\n if (layer) {\r\n if (this._moreLayerActiveButton) this.moreLayerOff();\r\n\r\n this._moreLayerActiveButton = target;\r\n layer.style.display = 'block';\r\n\r\n event._showToolbarBalloon();\r\n event._showToolbarInline();\r\n }\r\n util.addClass(target, 'on');\r\n } else {\r\n const layer = context.element.toolbar.querySelector('.' + this._moreLayerActiveButton.getAttribute('data-command'));\r\n if (layer) {\r\n this.moreLayerOff();\r\n\r\n event._showToolbarBalloon();\r\n event._showToolbarInline();\r\n } \r\n }\r\n return;\r\n }\r\n \r\n if (/container/.test(display) && (this._menuTray[command] === null || target !== this.containerActiveButton)) {\r\n this.callPlugin(command, this.containerOn.bind(this, target), target);\r\n return;\r\n } \r\n \r\n if (this.isReadOnly && util.arrayIncludes(this.resizingDisabledButtons, target)) return;\r\n if (/submenu/.test(display) && (this._menuTray[command] === null || target !== this.submenuActiveButton)) {\r\n this.callPlugin(command, this.submenuOn.bind(this, target), target);\r\n return;\r\n } else if (/dialog/.test(display)) {\r\n this.callPlugin(command, this.plugins[command].open.bind(this), target);\r\n return;\r\n } else if (/command/.test(display)) {\r\n this.callPlugin(command, this.plugins[command].action.bind(this), target);\r\n } else if (/fileBrowser/.test(display)) {\r\n this.callPlugin(command, this.plugins[command].open.bind(this, null), target);\r\n }\r\n } // default command\r\n else if (command) {\r\n this.commandHandler(target, command);\r\n }\r\n\r\n if (/submenu/.test(display)) {\r\n this.submenuOff();\r\n } else if (!/command/.test(display)) {\r\n this.submenuOff();\r\n this.containerOff();\r\n }\r\n },\r\n\r\n /**\r\n * @description Execute command of command button(All Buttons except submenu and dialog)\r\n * (selectAll, codeView, fullScreen, indent, outdent, undo, redo, removeFormat, print, preview, showBlocks, save, bold, underline, italic, strike, subscript, superscript, copy, cut, paste)\r\n * @param {Element|null} target The element of command button\r\n * @param {String} command Property of command button (data-value)\r\n */\r\n commandHandler: function (target, command) {\r\n if (core.isReadOnly && !/copy|cut|selectAll|codeView|fullScreen|print|preview|showBlocks/.test(command)) return;\r\n switch (command) {\r\n case 'copy':\r\n case 'cut':\r\n this.execCommand(command);\r\n break;\r\n case 'paste':\r\n break;\r\n case 'selectAll':\r\n this.containerOff();\r\n const wysiwyg = context.element.wysiwyg;\r\n let first = util.getChildElement(wysiwyg.firstChild, function (current) { return current.childNodes.length === 0 || current.nodeType === 3; }, false) || wysiwyg.firstChild;\r\n let last = util.getChildElement(wysiwyg.lastChild, function (current) { return current.childNodes.length === 0 || current.nodeType === 3; }, true) || wysiwyg.lastChild;\r\n if (!first || !last) return;\r\n if (util.isMedia(first)) {\r\n const info = this.getFileComponent(first);\r\n const br = util.createElement('BR');\r\n const format = util.createElement(options.defaultTag);\r\n format.appendChild(br);\r\n first = info ? info.component : first;\r\n first.parentNode.insertBefore(format, first);\r\n first = br;\r\n }\r\n if (util.isMedia(last)) {\r\n const br = util.createElement('BR');\r\n const format = util.createElement(options.defaultTag);\r\n format.appendChild(br);\r\n wysiwyg.appendChild(format);\r\n last = br;\r\n }\r\n event._showToolbarBalloon(this.setRange(first, 0, last, last.textContent.length));\r\n break;\r\n case 'codeView':\r\n this.toggleCodeView();\r\n break;\r\n case 'fullScreen':\r\n this.toggleFullScreen(target);\r\n break;\r\n case 'indent':\r\n case 'outdent':\r\n this.indent(command);\r\n break;\r\n case 'undo':\r\n this.history.undo();\r\n break;\r\n case 'redo':\r\n this.history.redo();\r\n break;\r\n case 'removeFormat':\r\n this.removeFormat();\r\n this.focus();\r\n break;\r\n case 'print':\r\n this.print();\r\n break;\r\n case 'preview':\r\n this.preview();\r\n break;\r\n case 'showBlocks':\r\n this.toggleDisplayBlocks();\r\n break;\r\n case 'dir':\r\n this.setDir(options.rtl ? 'ltr' : 'rtl');\r\n break;\r\n case 'dir_ltr':\r\n this.setDir('ltr');\r\n break;\r\n case 'dir_rtl':\r\n this.setDir('rtl');\r\n break;\r\n case 'save':\r\n if (typeof options.callBackSave === 'function') {\r\n options.callBackSave(this.getContents(false), this._variable.isChanged);\r\n } else if (this._variable.isChanged && typeof functions.save === 'function') {\r\n functions.save();\r\n } else {\r\n throw Error('[SUNEDITOR.core.commandHandler.fail] Please register call back function in creation option. (callBackSave : Function)');\r\n }\r\n\r\n this._variable.isChanged = false;\r\n if (context.tool.save) context.tool.save.setAttribute('disabled', true);\r\n break;\r\n default : // 'STRONG', 'U', 'EM', 'DEL', 'SUB', 'SUP'..\r\n command = options._defaultCommand[command.toLowerCase()] || command;\r\n if (!this.commandMap[command]) this.commandMap[command] = target;\r\n\r\n const nodesMap = this._variable.currentNodesMap;\r\n const cmd = nodesMap.indexOf(command) > -1 ? null : util.createElement(command);\r\n let removeNode = command;\r\n\r\n if (/^SUB$/i.test(command) && nodesMap.indexOf('SUP') > -1) {\r\n removeNode = 'SUP';\r\n } else if (/^SUP$/i.test(command) && nodesMap.indexOf('SUB') > -1) {\r\n removeNode = 'SUB';\r\n }\r\n\r\n this.nodeChange(cmd, this._commandMapStyles[command] || null, [removeNode], false);\r\n this.focus();\r\n }\r\n },\r\n\r\n /**\r\n * @description Remove format of the currently selected range\r\n */\r\n removeFormat: function () {\r\n this.nodeChange(null, null, null, null);\r\n },\r\n\r\n /**\r\n * @description This method implements indentation to selected range.\r\n * Setted \"margin-left\" to \"25px\" in the top \"P\" tag of the parameter node.\r\n * @param {String} command Separator (\"indent\" or \"outdent\")\r\n */\r\n indent: function (command) {\r\n const range = this.getRange();\r\n const rangeLines = this.getSelectedElements(null);\r\n const cells = [];\r\n const shift = 'indent' !== command;\r\n const marginDir = options.rtl ? 'marginRight' : 'marginLeft';\r\n let sc = range.startContainer;\r\n let ec = range.endContainer;\r\n let so = range.startOffset;\r\n let eo = range.endOffset;\r\n\r\n for (let i = 0, len = rangeLines.length, f, margin; i < len; i++) {\r\n f = rangeLines[i];\r\n if (!util.isListCell(f) || !this.plugins.list) {\r\n margin = /\\d+/.test(f.style[marginDir]) ? util.getNumber(f.style[marginDir], 0) : 0;\r\n if (shift) {\r\n margin -= 25;\r\n } else {\r\n margin += 25;\r\n }\r\n util.setStyle(f, marginDir, (margin <= 0 ? '' : margin + 'px'));\r\n } else {\r\n if (shift || f.previousElementSibling) {\r\n cells.push(f);\r\n }\r\n }\r\n }\r\n\r\n // list cells\r\n if (cells.length > 0) {\r\n this.plugins.list.editInsideList.call(this, shift, cells);\r\n }\r\n\r\n this.effectNode = null;\r\n this.setRange(sc, so, ec, eo);\r\n\r\n // history stack\r\n this.history.push(false);\r\n },\r\n\r\n /**\r\n * @description Add or remove the class name of \"body\" so that the code block is visible\r\n */\r\n toggleDisplayBlocks: function () {\r\n const wysiwyg = context.element.wysiwyg;\r\n util.toggleClass(wysiwyg, 'se-show-block');\r\n if (util.hasClass(wysiwyg, 'se-show-block')) {\r\n util.addClass(this._styleCommandMap.showBlocks, 'active');\r\n } else {\r\n util.removeClass(this._styleCommandMap.showBlocks, 'active');\r\n }\r\n this._resourcesStateChange();\r\n },\r\n\r\n /**\r\n * @description Changes to code view or wysiwyg view\r\n */\r\n toggleCodeView: function () {\r\n const isCodeView = this._variable.isCodeView;\r\n this.controllersOff();\r\n util.setDisabledButtons(!isCodeView, this.codeViewDisabledButtons);\r\n\r\n if (isCodeView) {\r\n if (!util.isNonEditable(context.element.wysiwygFrame)) this._setCodeDataToEditor();\r\n context.element.wysiwygFrame.scrollTop = 0;\r\n context.element.code.style.display = 'none';\r\n context.element.wysiwygFrame.style.display = 'block';\r\n\r\n this._variable._codeOriginCssText = this._variable._codeOriginCssText.replace(/(\\s?display(\\s+)?:(\\s+)?)[a-zA-Z]+(?=;)/, 'display: none');\r\n this._variable._wysiwygOriginCssText = this._variable._wysiwygOriginCssText.replace(/(\\s?display(\\s+)?:(\\s+)?)[a-zA-Z]+(?=;)/, 'display: block');\r\n\r\n if (options.height === 'auto' && !options.codeMirrorEditor) context.element.code.style.height = '0px';\r\n \r\n this._variable.isCodeView = false;\r\n \r\n if (!this._variable.isFullScreen) {\r\n this._notHideToolbar = false;\r\n if (/balloon|balloon-always/i.test(options.mode)) {\r\n context.element._arrow.style.display = '';\r\n this._isInline = false;\r\n this._isBalloon = true;\r\n event._hideToolbar(); \r\n }\r\n }\r\n\r\n this.nativeFocus();\r\n util.removeClass(this._styleCommandMap.codeView, 'active');\r\n\r\n // history stack\r\n if (!util.isNonEditable(context.element.wysiwygFrame)) {\r\n this.history.push(false);\r\n this.history._resetCachingButton();\r\n }\r\n } else {\r\n this._setEditorDataToCodeView();\r\n this._variable._codeOriginCssText = this._variable._codeOriginCssText.replace(/(\\s?display(\\s+)?:(\\s+)?)[a-zA-Z]+(?=;)/, 'display: block');\r\n this._variable._wysiwygOriginCssText = this._variable._wysiwygOriginCssText.replace(/(\\s?display(\\s+)?:(\\s+)?)[a-zA-Z]+(?=;)/, 'display: none');\r\n\r\n if (this._variable.isFullScreen) context.element.code.style.height = '100%';\r\n else if (options.height === 'auto' && !options.codeMirrorEditor) context.element.code.style.height = context.element.code.scrollHeight > 0 ? (context.element.code.scrollHeight + 'px') : 'auto';\r\n \r\n if (options.codeMirrorEditor) options.codeMirrorEditor.refresh();\r\n \r\n this._variable.isCodeView = true;\r\n\r\n if (!this._variable.isFullScreen) {\r\n this._notHideToolbar = true;\r\n if (this._isBalloon) {\r\n context.element._arrow.style.display = 'none';\r\n context.element.toolbar.style.left = '';\r\n this._isInline = true;\r\n this._isBalloon = false;\r\n event._showToolbarInline();\r\n }\r\n }\r\n \r\n this._variable._range = null;\r\n context.element.code.focus();\r\n util.addClass(this._styleCommandMap.codeView, 'active');\r\n }\r\n\r\n this._checkPlaceholder();\r\n if (this.isReadOnly) util.setDisabledButtons(true, this.resizingDisabledButtons);\r\n\r\n // user event\r\n if (typeof functions.toggleCodeView === 'function') functions.toggleCodeView(this._variable.isCodeView, this);\r\n },\r\n\r\n /**\r\n * @description Convert the data of the code view and put it in the WYSIWYG area.\r\n * @private\r\n */\r\n _setCodeDataToEditor: function () {\r\n const code_html = this._getCodeView();\r\n\r\n if (options.fullPage) {\r\n const parseDocument = this._parser.parseFromString(code_html, 'text/html');\r\n\r\n if (!this.options.__allowedScriptTag) {\r\n const headChildren = parseDocument.head.children;\r\n for (let i = 0, len = headChildren.length; i < len; i++) {\r\n if (/^script$/i.test(headChildren[i].tagName)) {\r\n parseDocument.head.removeChild(headChildren[i]);\r\n i--, len--;\r\n }\r\n }\r\n }\r\n\r\n let headers = parseDocument.head.innerHTML;\r\n if (!parseDocument.head.querySelector('link[rel=\"stylesheet\"]') || (this.options.height === 'auto' && !parseDocument.head.querySelector('style'))) {\r\n headers += util._setIframeCssTags(this.options);\r\n }\r\n\r\n this._wd.head.innerHTML = headers;\r\n this._wd.body.innerHTML = this.convertContentsForEditor(parseDocument.body.innerHTML);\r\n\r\n const attrs = parseDocument.body.attributes;\r\n for (let i = 0, len = attrs.length; i < len; i++) {\r\n if (attrs[i].name === 'contenteditable') continue;\r\n this._wd.body.setAttribute(attrs[i].name, attrs[i].value);\r\n }\r\n if (!util.hasClass(this._wd.body, 'sun-editor-editable')) {\r\n const editableClasses = options._editableClass.split(' ');\r\n for (let i = 0; i < editableClasses.length; i++) {\r\n util.addClass(this._wd.body, options._editableClass[i]);\r\n }\r\n }\r\n } else {\r\n context.element.wysiwyg.innerHTML = code_html.length > 0 ? this.convertContentsForEditor(code_html) : '<' + options.defaultTag + '>
      ';\r\n }\r\n },\r\n\r\n /**\r\n * @description Convert the data of the WYSIWYG area and put it in the code view area.\r\n * @private\r\n */\r\n _setEditorDataToCodeView: function () {\r\n const codeContents = this.convertHTMLForCodeView(context.element.wysiwyg, false);\r\n let codeValue = '';\r\n\r\n if (options.fullPage) {\r\n const attrs = util.getAttributesToString(this._wd.body, null);\r\n codeValue = '\\n\\n' + this._wd.head.outerHTML.replace(/>(?!\\n)/g, '>\\n') + '\\n' + codeContents + '\\n';\r\n } else {\r\n codeValue = codeContents;\r\n }\r\n\r\n context.element.code.style.display = 'block';\r\n context.element.wysiwygFrame.style.display = 'none';\r\n\r\n this._setCodeView(codeValue);\r\n },\r\n\r\n /**\r\n * @description Changes to full screen or default screen\r\n * @param {Element|null} element full screen button\r\n */\r\n toggleFullScreen: function (element) {\r\n const topArea = context.element.topArea;\r\n const toolbar = context.element.toolbar;\r\n const editorArea = context.element.editorArea;\r\n const wysiwygFrame = context.element.wysiwygFrame;\r\n const code = context.element.code;\r\n const _var = this._variable;\r\n this.controllersOff();\r\n \r\n const wasToolbarHidden = (toolbar.style.display === 'none' || (this._isInline && !this._inlineToolbarAttr.isShow));\r\n\r\n if (!_var.isFullScreen) {\r\n _var.isFullScreen = true;\r\n \r\n _var._fullScreenAttrs.inline = this._isInline;\r\n _var._fullScreenAttrs.balloon = this._isBalloon;\r\n\r\n if (this._isInline || this._isBalloon) {\r\n this._isInline = false;\r\n this._isBalloon = false;\r\n }\r\n \r\n if (!!options.toolbarContainer) context.element.relative.insertBefore(toolbar, editorArea);\r\n\r\n topArea.style.position = 'fixed';\r\n topArea.style.top = '0';\r\n topArea.style.left = '0';\r\n topArea.style.width = '100%';\r\n topArea.style.maxWidth = '100%';\r\n topArea.style.height = '100%';\r\n topArea.style.zIndex = '2147483647';\r\n\r\n if (context.element._stickyDummy.style.display !== ('none' && '')) {\r\n _var._fullScreenAttrs.sticky = true;\r\n context.element._stickyDummy.style.display = 'none';\r\n util.removeClass(toolbar, 'se-toolbar-sticky');\r\n }\r\n\r\n _var._bodyOverflow = _d.body.style.overflow;\r\n _d.body.style.overflow = 'hidden';\r\n\r\n _var._editorAreaOriginCssText = editorArea.style.cssText;\r\n _var._wysiwygOriginCssText = wysiwygFrame.style.cssText;\r\n _var._codeOriginCssText = code.style.cssText;\r\n\r\n editorArea.style.cssText = toolbar.style.cssText = '';\r\n wysiwygFrame.style.cssText = (wysiwygFrame.style.cssText.match(/\\s?display(\\s+)?:(\\s+)?[a-zA-Z]+;/) || [''])[0] + options._editorStyles.editor;\r\n code.style.cssText = (code.style.cssText.match(/\\s?display(\\s+)?:(\\s+)?[a-zA-Z]+;/) || [''])[0];\r\n toolbar.style.width = wysiwygFrame.style.height = code.style.height = '100%';\r\n toolbar.style.position = 'relative';\r\n toolbar.style.display = 'block';\r\n\r\n _var.innerHeight_fullScreen = (_w.innerHeight - toolbar.offsetHeight);\r\n editorArea.style.height = (_var.innerHeight_fullScreen - options.fullScreenOffset) + 'px';\r\n\r\n if (element) util.changeElement(element.firstElementChild, icons.reduction);\r\n\r\n if (options.iframe && options.height === 'auto') {\r\n editorArea.style.overflow = 'auto';\r\n this._iframeAutoHeight();\r\n }\r\n\r\n context.element.topArea.style.marginTop = options.fullScreenOffset + 'px';\r\n util.addClass(this._styleCommandMap.fullScreen, 'active');\r\n } else {\r\n _var.isFullScreen = false;\r\n\r\n wysiwygFrame.style.cssText = _var._wysiwygOriginCssText;\r\n code.style.cssText = _var._codeOriginCssText;\r\n toolbar.style.cssText = '';\r\n editorArea.style.cssText = _var._editorAreaOriginCssText;\r\n topArea.style.cssText = _var._originCssText;\r\n _d.body.style.overflow = _var._bodyOverflow;\r\n\r\n if (options.height === 'auto' && !options.codeMirrorEditor) event._codeViewAutoHeight();\r\n\r\n if (!!options.toolbarContainer) options.toolbarContainer.appendChild(toolbar);\r\n\r\n if (options.stickyToolbar > -1) {\r\n util.removeClass(toolbar, 'se-toolbar-sticky');\r\n }\r\n\r\n if (_var._fullScreenAttrs.sticky && !options.toolbarContainer) {\r\n _var._fullScreenAttrs.sticky = false;\r\n context.element._stickyDummy.style.display = 'block';\r\n util.addClass(toolbar, \"se-toolbar-sticky\");\r\n }\r\n\r\n this._isInline = _var._fullScreenAttrs.inline;\r\n this._isBalloon = _var._fullScreenAttrs.balloon;\r\n if (this._isInline) event._showToolbarInline();\r\n if (!!options.toolbarContainer) util.removeClass(toolbar, 'se-toolbar-balloon');\r\n\r\n event.onScroll_window();\r\n if (element) util.changeElement(element.firstElementChild, icons.expansion);\r\n\r\n context.element.topArea.style.marginTop = '';\r\n util.removeClass(this._styleCommandMap.fullScreen, 'active');\r\n }\r\n\r\n if (wasToolbarHidden) functions.toolbar.hide();\r\n\r\n // user event\r\n if (typeof functions.toggleFullScreen === 'function') functions.toggleFullScreen(this._variable.isFullScreen, this);\r\n },\r\n\r\n /**\r\n * @description Prints the current contents of the editor.\r\n */\r\n print: function () {\r\n const iframe = util.createElement('IFRAME');\r\n iframe.style.display = 'none';\r\n _d.body.appendChild(iframe);\r\n\r\n const contentsHTML = options.printTemplate ? options.printTemplate.replace(/\\{\\{\\s*contents\\s*\\}\\}/i, this.getContents(true)) : this.getContents(true);\r\n const printDocument = util.getIframeDocument(iframe);\r\n const wDoc = this._wd;\r\n\r\n if (options.iframe) {\r\n const arrts = options._printClass !== null ? 'class=\"' + options._printClass + '\"' : options.fullPage ? util.getAttributesToString(wDoc.body, ['contenteditable']) : 'class=\"' + options._editableClass + '\"';\r\n\r\n printDocument.write('' +\r\n '' +\r\n '' +\r\n wDoc.head.innerHTML +\r\n '' +\r\n '' + contentsHTML + '' +\r\n ''\r\n );\r\n } else {\r\n const links = _d.head.getElementsByTagName('link');\r\n const styles = _d.head.getElementsByTagName('style');\r\n let linkHTML = '';\r\n for (let i = 0, len = links.length; i < len; i++) {\r\n linkHTML += links[i].outerHTML;\r\n }\r\n for (let i = 0, len = styles.length; i < len; i++) {\r\n linkHTML += styles[i].outerHTML;\r\n }\r\n\r\n printDocument.write('' +\r\n '' +\r\n '' +\r\n linkHTML +\r\n '' +\r\n '' + contentsHTML + '' +\r\n ''\r\n );\r\n }\r\n\r\n this.showLoading();\r\n _w.setTimeout(function () {\r\n try {\r\n iframe.focus();\r\n // IE or Edge, Chromium\r\n if (util.isIE_Edge || util.isChromium || !!_d.documentMode || !!_w.StyleMedia) {\r\n try {\r\n iframe.contentWindow.document.execCommand('print', false, null);\r\n } catch (e) {\r\n iframe.contentWindow.print();\r\n }\r\n } else {\r\n // Other browsers\r\n iframe.contentWindow.print();\r\n }\r\n } catch (error) {\r\n throw Error('[SUNEDITOR.core.print.fail] error: ' + error);\r\n } finally {\r\n core.closeLoading();\r\n util.removeItem(iframe);\r\n }\r\n }, 1000);\r\n },\r\n\r\n /**\r\n * @description Open the preview window.\r\n */\r\n preview: function () {\r\n core.submenuOff();\r\n core.containerOff();\r\n core.controllersOff();\r\n \r\n const contentsHTML = options.previewTemplate ? options.previewTemplate.replace(/\\{\\{\\s*contents\\s*\\}\\}/i, this.getContents(true)) : this.getContents(true);\r\n const windowObject = _w.open('', '_blank');\r\n windowObject.mimeType = 'text/html';\r\n const wDoc = this._wd;\r\n\r\n if (options.iframe) {\r\n const arrts = options._printClass !== null ? 'class=\"' + options._printClass + '\"' : options.fullPage ? util.getAttributesToString(wDoc.body, ['contenteditable']) : 'class=\"' + options._editableClass + '\"';\r\n\r\n windowObject.document.write('' +\r\n '' +\r\n '' +\r\n wDoc.head.innerHTML +\r\n '' +\r\n '' +\r\n '' + contentsHTML + '' +\r\n ''\r\n );\r\n } else {\r\n const links = _d.head.getElementsByTagName('link');\r\n const styles = _d.head.getElementsByTagName('style');\r\n let linkHTML = '';\r\n for (let i = 0, len = links.length; i < len; i++) {\r\n linkHTML += links[i].outerHTML;\r\n }\r\n for (let i = 0, len = styles.length; i < len; i++) {\r\n linkHTML += styles[i].outerHTML;\r\n }\r\n \r\n windowObject.document.write('' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' + lang.toolbar.preview + '' +\r\n linkHTML +\r\n '' +\r\n '' + contentsHTML + '' +\r\n ''\r\n );\r\n }\r\n },\r\n\r\n /**\r\n * @description Set direction to \"rtl\" or \"ltr\".\r\n * @param {String} dir \"rtl\" or \"ltr\"\r\n */\r\n setDir: function (dir) {\r\n const rtl = dir === 'rtl';\r\n const changeDir = this._prevRtl !== rtl;\r\n this._prevRtl = options.rtl = rtl;\r\n\r\n if (changeDir) {\r\n // align buttons\r\n if (this.plugins.align) {\r\n this.plugins.align.exchangeDir.call(this);\r\n }\r\n // indent buttons\r\n if (context.tool.indent) util.changeElement(context.tool.indent.firstElementChild, icons.indent);\r\n if (context.tool.outdent) util.changeElement(context.tool.outdent.firstElementChild, icons.outdent);\r\n }\r\n\r\n const el = context.element;\r\n if (rtl) {\r\n util.addClass(el.topArea, 'se-rtl');\r\n util.addClass(el.wysiwygFrame, 'se-rtl');\r\n } else {\r\n util.removeClass(el.topArea, 'se-rtl');\r\n util.removeClass(el.wysiwygFrame, 'se-rtl');\r\n }\r\n\r\n const lineNodes = util.getListChildren(el.wysiwyg, function (current) {\r\n return util.isFormatElement(current) && (current.style.marginRight || current.style.marginLeft || current.style.textAlign);\r\n });\r\n\r\n for (let i = 0, len = lineNodes.length, n, l, r; i < len; i++) {\r\n n = lineNodes[i];\r\n // indent margin\r\n r = n.style.marginRight;\r\n l = n.style.marginLeft;\r\n if (r || l) {\r\n n.style.marginRight = l;\r\n n.style.marginLeft = r;\r\n }\r\n // text align\r\n r = n.style.textAlign;\r\n if (r === 'left') n.style.textAlign = 'right';\r\n else if (r === 'right') n.style.textAlign = 'left';\r\n }\r\n\r\n const tool = context.tool;\r\n if (tool.dir) {\r\n util.changeTxt(tool.dir.querySelector('.se-tooltip-text'), lang.toolbar[options.rtl ? 'dir_ltr' : 'dir_rtl']);\r\n util.changeElement(tool.dir.firstElementChild, icons[options.rtl ? 'dir_ltr' : 'dir_rtl']);\r\n }\r\n\r\n if (tool.dir_ltr) {\r\n if (rtl) util.removeClass(tool.dir_ltr, 'active');\r\n else util.addClass(tool.dir_ltr, 'active');\r\n }\r\n\r\n if (tool.dir_rtl) {\r\n if (rtl) util.addClass(tool.dir_rtl, 'active');\r\n else util.removeClass(tool.dir_rtl, 'active');\r\n }\r\n },\r\n\r\n /**\r\n * @description Sets the HTML string\r\n * @param {String|undefined} html HTML string\r\n */\r\n setContents: function (html) {\r\n this.removeRange();\r\n \r\n const convertValue = (html === null || html === undefined) ? '' : this.convertContentsForEditor(html, null, null);\r\n if (!this._variable.isCodeView) {\r\n context.element.wysiwyg.innerHTML = convertValue;\r\n this._resetComponents();\r\n // history stack\r\n this.history.push(false);\r\n } else {\r\n const value = this.convertHTMLForCodeView(convertValue, false);\r\n this._setCodeView(value);\r\n }\r\n },\r\n\r\n /**\r\n * @description Sets the contents of the iframe's head tag and body tag when using the \"iframe\" or \"fullPage\" option.\r\n * @param {Object} ctx { head: HTML string, body: HTML string}\r\n */\r\n setIframeContents: function (ctx) {\r\n if (!options.iframe) return false;\r\n if (ctx.head) this._wd.head.innerHTML = this.options.__allowedScriptTag ? ctx.head : ctx.head.replace(this.__scriptTagRegExp, '');\r\n if (ctx.body) this._wd.body.innerHTML = this.convertContentsForEditor(ctx.body);\r\n this._resetComponents();\r\n },\r\n\r\n /**\r\n * @description Gets the current contents\r\n * @param {Boolean} onlyContents Return only the contents of the body without headers when the \"fullPage\" option is true\r\n * @returns {Object}\r\n */\r\n getContents: function (onlyContents) {\r\n const contents = this.cleanHTML(context.element.wysiwyg.innerHTML, null, null);\r\n const renderHTML = util.createElement('DIV');\r\n renderHTML.innerHTML = contents;\r\n\r\n const editableEls = util.getListChildren(renderHTML, function (current) {\r\n return current.hasAttribute('contenteditable');\r\n });\r\n\r\n for (let i = 0, len = editableEls.length; i < len; i++) {\r\n editableEls[i].removeAttribute('contenteditable');\r\n }\r\n\r\n if (options.fullPage && !onlyContents) {\r\n const attrs = util.getAttributesToString(this._wd.body, ['contenteditable']);\r\n return '' + this._wd.head.outerHTML + '' + renderHTML.innerHTML + '';\r\n } else {\r\n return renderHTML.innerHTML;\r\n }\r\n },\r\n\r\n /**\r\n * @description Gets the current contents with containing parent div(div.sun-editor-editable).\r\n *
      {contents}
      \r\n * @param {Boolean} onlyContents Return only the contents of the body without headers when the \"fullPage\" option is true\r\n * @returns {String}\r\n */\r\n getFullContents: function (onlyContents) {\r\n return '
      ' + this.getContents(onlyContents) + '
      ';\r\n },\r\n\r\n /**\r\n * @description Returns HTML string according to tag type and configuration.\r\n * Use only \"cleanHTML\"\r\n * @param {Node} node Node\r\n * @param {Boolean} requireFormat If true, text nodes that do not have a format node is wrapped with the format tag.\r\n * @private\r\n */\r\n _makeLine: function (node, requireFormat) {\r\n const defaultTag = options.defaultTag;\r\n // element\r\n if (node.nodeType === 1) {\r\n if (this.__disallowedTagNameRegExp.test(node.nodeName)) return '';\r\n if (/__se__tag/.test(node.className)) return node.outerHTML;\r\n\r\n const ch = util.getListChildNodes(node, function(current) { return util.isSpanWithoutAttr(current) && !util.getParentElement(current, util.isNotCheckingNode); }) || [];\r\n for (let i = ch.length - 1; i >= 0; i--) {\r\n ch[i].outerHTML = ch[i].innerHTML;\r\n }\r\n\r\n if (!requireFormat || (util.isFormatElement(node) || util.isRangeFormatElement(node) || util.isComponent(node) || util.isMedia(node) || (util.isAnchor(node) && util.isMedia(node.firstElementChild)))) {\r\n return util.isSpanWithoutAttr(node) ? node.innerHTML : node.outerHTML;\r\n } else {\r\n return '<' + defaultTag + '>' + (util.isSpanWithoutAttr(node) ? node.innerHTML : node.outerHTML) + '';\r\n }\r\n }\r\n // text\r\n if (node.nodeType === 3) {\r\n if (!requireFormat) return util._HTMLConvertor(node.textContent);\r\n const textArray = node.textContent.split(/\\n/g);\r\n let html = '';\r\n for (let i = 0, tLen = textArray.length, text; i < tLen; i++) {\r\n text = textArray[i].trim();\r\n if (text.length > 0) html += '<' + defaultTag + '>' + util._HTMLConvertor(text) + '';\r\n }\r\n return html;\r\n }\r\n // comments\r\n if (node.nodeType === 8 && this._allowHTMLComments) {\r\n return '';\r\n }\r\n\r\n return '';\r\n },\r\n\r\n /**\r\n * @description Removes attribute values such as style and converts tags that do not conform to the \"html5\" standard.\r\n * @param {String} text \r\n * @returns {String} HTML string\r\n * @private\r\n */\r\n _tagConvertor: function (text) {\r\n if (!this._disallowedTextTagsRegExp) return text;\r\n\r\n const ec = options._textTagsMap;\r\n return text.replace(this._disallowedTextTagsRegExp, function (m, t, n, p) {\r\n return t + (typeof ec[n] === 'string' ? ec[n] : n) + (p ? ' ' + p : '');\r\n });\r\n },\r\n\r\n /**\r\n * @description Delete disallowed tags\r\n * @param {String} html HTML string\r\n * @returns {String}\r\n * @private\r\n */\r\n _deleteDisallowedTags: function (html) {\r\n\t\t\thtml = html\r\n\t\t\t\t.replace(this.__disallowedTagsRegExp, '')\r\n\t\t\t\t.replace(/<[a-z0-9]+\\:[a-z0-9]+[^>^\\/]*>[^>]*<\\/[a-z0-9]+\\:[a-z0-9]+>/gi, '');\r\n\r\n if (!/\\bfont\\b/i.test(this.options._editorTagsWhitelist)) {\r\n html = html.replace(/(<\\/?)font(\\s?)/gi, '$1span$2');\r\n }\r\n\r\n\t\t\treturn html.replace(this.editorTagsWhitelistRegExp, '').replace(this.editorTagsBlacklistRegExp, '');\r\n\t\t},\r\n\r\n _convertFontSize: function (to, size) {\r\n const math = this._w.Math;\r\n const value = size.match(/(\\d+(?:\\.\\d+)?)(.+)/);\r\n const sizeNum = value ? value[1] * 1 : util.fontValueMap[size];\r\n const from = value ? value[2] : 'rem';\r\n let pxSize = sizeNum;\r\n \r\n if (/em/.test(from)) {\r\n pxSize = math.round(sizeNum / 0.0625);\r\n } else if (from === 'pt') {\r\n pxSize = math.round(sizeNum * 1.333);\r\n } else if (from === '%') {\r\n pxSize = sizeNum / 100;\r\n }\r\n\r\n switch (to) {\r\n case 'em':\r\n case 'rem':\r\n case '%':\r\n return (pxSize * 0.0625).toFixed(2) + to;\r\n case 'pt':\r\n return math.floor(pxSize / 1.333) + to;\r\n default: // px\r\n return pxSize + to;\r\n }\r\n },\r\n\r\n _cleanStyle: function (m, v, name) {\r\n let sv = (m.match(/style\\s*=\\s*(?:\"|')[^\"']*(?:\"|')/) || [])[0];\r\n if (/span/i.test(name) && !sv && (m.match(/ 0) v.push('style=\"' + allowedStyle.join(';') + '\"');\r\n }\r\n }\r\n\r\n return v;\r\n },\r\n\r\n /**\r\n * @description Tag and tag attribute check RegExp function. (used by \"cleanHTML\" and \"convertContentsForEditor\")\r\n * @param {Boolean} lowLevelCheck Row level check\r\n * @param {String} m RegExp value\r\n * @param {String} t RegExp value\r\n * @returns {String}\r\n * @private\r\n */\r\n _cleanTags: function (lowLevelCheck, m, t) {\r\n if (/^<[a-z0-9]+\\:[a-z0-9]+/i.test(m)) return m;\r\n \r\n let v = null;\r\n const tagName = t.match(/(?!<)[a-zA-Z0-9\\-]+/)[0].toLowerCase();\r\n \r\n // blacklist\r\n const bAttr = this._attributesTagsBlacklist[tagName];\r\n m = m.replace(/\\s(?:on[a-z]+)\\s*=\\s*(\")[^\"]*\\1/ig, '');\r\n if (bAttr) m = m.replace(bAttr, '');\r\n else m = m.replace(this._attributesBlacklistRegExp, '');\r\n \r\n // whitelist\r\n const wAttr = this._attributesTagsWhitelist[tagName];\r\n if (wAttr) v = m.match(wAttr);\r\n else v = m.match(lowLevelCheck ? this._attributesWhitelistRegExp : this._attributesWhitelistRegExp_all_data);\r\n \r\n // attribute\r\n if (lowLevelCheck || tagName === 'span') {\r\n if (tagName === 'a') {\r\n const sv = m.match(/(?:(?:id|name)\\s*=\\s*(?:\"|')[^\"']*(?:\"|'))/g);\r\n if (sv) {\r\n if (!v) v = [];\r\n v.push(sv[0]);\r\n }\r\n } else if (!v || !/style=/i.test(v.toString())) {\r\n if (tagName === 'span') {\r\n v = this._cleanStyle(m, v, 'span');\r\n } else if (/^(P|DIV|H[1-6]|PRE)$/i.test(tagName)) {\r\n v = this._cleanStyle(m, v, 'format');\r\n }\r\n }\r\n } else {\r\n const sv = m.match(/style\\s*=\\s*(?:\"|')[^\"']*(?:\"|')/);\r\n if (sv && !v) v = [sv[0]];\r\n else if (sv && !v.some(function (v) { return /^style/.test(v.trim()); })) v.push(sv[0]);\r\n }\r\n\r\n // figure\r\n if (util.isFigures(tagName)) {\r\n const sv = m.match(/style\\s*=\\s*(?:\"|')[^\"']*(?:\"|')/);\r\n if (!v) v = [];\r\n if (sv) v.push(sv[0]);\r\n }\r\n\r\n if (v) {\r\n for (let i = 0, len = v.length, a; i < len; i++) {\r\n // if (lowLevelCheck && /^class=\"(?!(__se__|se-|katex))/.test(v[i].trim())) continue;\r\n a = (/^(?:href|src)\\s*=\\s*('|\"|\\s)*javascript\\s*\\:/i.test(v[i].trim()) ? '' : v[i]);\r\n t += (/^\\s/.test(a) ? '' : ' ') + a;\r\n }\r\n }\r\n\r\n return t;\r\n },\r\n\r\n /**\r\n * @description Determines if formatting is required and returns a domTree\r\n * @param {Element} dom documentFragment\r\n * @returns {Element}\r\n * @private\r\n */\r\n _editFormat: function (dom) {\r\n let value = '', f;\r\n const tempTree = dom.childNodes;\r\n \r\n for (let i = 0, len = tempTree.length, n; i < len; i++) {\r\n n = tempTree[i];\r\n if (n.nodeType === 8) {\r\n value += '';\r\n } else if (!util.isFormatElement(n) && !util.isRangeFormatElement(n) && !util.isComponent(n) && !/meta/i.test(n.nodeName)) {\r\n if (!f) f = util.createElement(options.defaultTag);\r\n f.appendChild(n);\r\n i--; len--;\r\n } else {\r\n if (f) {\r\n value += f.outerHTML;\r\n f = null;\r\n }\r\n value += n.outerHTML;\r\n }\r\n }\r\n\r\n if (f) value += f.outerHTML;\r\n\r\n return _d.createRange().createContextualFragment(value);\r\n },\r\n\r\n _convertListCell: function (domTree) {\r\n let html = '';\r\n\r\n for (let i = 0, len = domTree.length, node; i < len; i++) {\r\n node = domTree[i];\r\n if (node.nodeType === 1) {\r\n if (util.isList(node)) {\r\n html += node.innerHTML;\r\n } else if (util.isListCell(node)) {\r\n html += node.outerHTML;\r\n } else if (util.isFormatElement(node)) {\r\n html += '
    • ' +(node.innerHTML.trim() || '
      ') + '
    • ';\r\n } else if (util.isRangeFormatElement(node) && !util.isTable(node)) {\r\n html += this._convertListCell(node);\r\n } else {\r\n html += '
    • ' + node.outerHTML + '
    • ';\r\n }\r\n } else {\r\n html += '
    • ' + (node.textContent || '
      ') + '
    • ';\r\n }\r\n }\r\n\r\n return html;\r\n },\r\n\r\n _isFormatData: function (domTree) {\r\n let requireFormat = false;\r\n\r\n for (let i = 0, len = domTree.length, t; i < len; i++) {\r\n t = domTree[i];\r\n if (t.nodeType === 1 && !util.isTextStyleElement(t) && !util.isBreak(t) && !this.__disallowedTagNameRegExp.test(t.nodeName)) {\r\n requireFormat = true;\r\n break;\r\n }\r\n }\r\n\r\n return requireFormat;\r\n },\r\n\r\n /**\r\n * @description Gets the clean HTML code for editor\r\n * @param {String} html HTML string\r\n * @param {String|RegExp|null} whitelist Regular expression of allowed tags.\r\n * RegExp object is create by util.createTagsWhitelist method. (core.pasteTagsWhitelistRegExp)\r\n * @param {String|RegExp|null} blacklist Regular expression of disallowed tags.\r\n * RegExp object is create by util.createTagsBlacklist method. (core.pasteTagsBlacklistRegExp)\r\n * @returns {String}\r\n */\r\n cleanHTML: function (html, whitelist, blacklist) {\r\n html = this._deleteDisallowedTags(this._parser.parseFromString(util.htmlCompress(html), 'text/html').body.innerHTML).replace(/(<[a-zA-Z0-9\\-]+)[^>]*(?=>)/g, this._cleanTags.bind(this, true)).replace(/$/i, '');\r\n const dom = _d.createRange().createContextualFragment(html);\r\n try {\r\n util._consistencyCheckOfHTML(dom, this._htmlCheckWhitelistRegExp, this._htmlCheckBlacklistRegExp, this._classNameFilter);\r\n } catch (error) {\r\n console.warn('[SUNEDITOR.cleanHTML.consistencyCheck.fail] ' + error);\r\n }\r\n \r\n if (this.managedTagsInfo && this.managedTagsInfo.query) {\r\n const textCompList = dom.querySelectorAll(this.managedTagsInfo.query);\r\n for (let i = 0, len = textCompList.length, initMethod, classList; i < len; i++) {\r\n classList = [].slice.call(textCompList[i].classList);\r\n for (let c = 0, cLen = classList.length; c < cLen; c++) {\r\n initMethod = this.managedTagsInfo.map[classList[c]];\r\n if (initMethod) {\r\n initMethod(textCompList[i]);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n let domTree = dom.childNodes;\r\n let cleanHTML = '';\r\n const requireFormat = this._isFormatData(domTree);\r\n\r\n if(requireFormat) {\r\n domTree = this._editFormat(dom).childNodes;\r\n }\r\n\r\n for (let i = 0, len = domTree.length, t; i < len; i++) {\r\n t = domTree[i];\r\n if (this.__allowedScriptRegExp.test(t.nodeName)) {\r\n cleanHTML += t.outerHTML;\r\n continue;\r\n }\r\n cleanHTML += this._makeLine(t, requireFormat);\r\n }\r\n\r\n cleanHTML = util.htmlRemoveWhiteSpace(cleanHTML);\r\n if (!cleanHTML) {\r\n cleanHTML = html;\r\n } else {\r\n if (whitelist) cleanHTML = cleanHTML.replace(typeof whitelist === 'string' ? util.createTagsWhitelist(whitelist) : whitelist, '');\r\n if (blacklist) cleanHTML = cleanHTML.replace(typeof blacklist === 'string' ? util.createTagsBlacklist(blacklist) : blacklist, '');\r\n }\r\n\r\n return this._tagConvertor(cleanHTML);\r\n },\r\n\r\n /**\r\n * @description Converts contents into a format that can be placed in an editor\r\n * @param {String} contents contents\r\n * @returns {String}\r\n */\r\n convertContentsForEditor: function (contents) {\r\n contents = this._deleteDisallowedTags(this._parser.parseFromString(util.htmlCompress(contents), 'text/html').body.innerHTML).replace(/(<[a-zA-Z0-9\\-]+)[^>]*(?=>)/g, this._cleanTags.bind(this, true));\r\n const dom = _d.createRange().createContextualFragment(contents);\r\n\r\n try {\r\n util._consistencyCheckOfHTML(dom, this._htmlCheckWhitelistRegExp, this._htmlCheckBlacklistRegExp, this._classNameFilter);\r\n } catch (error) {\r\n console.warn('[SUNEDITOR.convertContentsForEditor.consistencyCheck.fail] ' + error);\r\n }\r\n\r\n if (this.managedTagsInfo && this.managedTagsInfo.query) {\r\n const textCompList = dom.querySelectorAll(this.managedTagsInfo.query);\r\n for (let i = 0, len = textCompList.length, initMethod, classList; i < len; i++) {\r\n classList = [].slice.call(textCompList[i].classList);\r\n for (let c = 0, cLen = classList.length; c < cLen; c++) {\r\n initMethod = this.managedTagsInfo.map[classList[c]];\r\n if (initMethod) {\r\n initMethod(textCompList[i]);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n \r\n const domTree = dom.childNodes;\r\n let cleanHTML = '', p = null;\r\n for (let i = 0, t; i < domTree.length; i++) {\r\n t = domTree[i];\r\n\r\n if (this.__allowedScriptRegExp.test(t.nodeName)) {\r\n cleanHTML += t.outerHTML;\r\n continue;\r\n }\r\n\r\n if (!util.isFormatElement(t) && !util.isRangeFormatElement(t) && !util.isComponent(t) && !util.isMedia(t) && t.nodeType !== 8 && !/__se__tag/.test(t.className)) {\r\n if (!p) p = util.createElement(options.defaultTag);\r\n p.appendChild(t);\r\n i--;\r\n if (domTree[i + 1] && !util.isFormatElement(domTree[i + 1])) {\r\n continue;\r\n } else {\r\n t = p;\r\n p = null;\r\n }\r\n }\r\n\r\n if (p) {\r\n cleanHTML += this._makeLine(p, true);\r\n p = null;\r\n }\r\n cleanHTML += this._makeLine(t, true);\r\n }\r\n if (p) cleanHTML += this._makeLine(p, true);\r\n\r\n if (cleanHTML.length === 0) return '<' + options.defaultTag + '>
      ';\r\n\r\n cleanHTML = util.htmlRemoveWhiteSpace(cleanHTML);\r\n return this._tagConvertor(cleanHTML);\r\n },\r\n\r\n /**\r\n * @description Converts wysiwyg area element into a format that can be placed in an editor of code view mode\r\n * @param {Element|String} html WYSIWYG element (context.element.wysiwyg) or HTML string.\r\n * @param {Boolean} comp If true, does not line break and indentation of tags.\r\n * @returns {String}\r\n */\r\n convertHTMLForCodeView: function (html, comp) {\r\n let returnHTML = '';\r\n const wRegExp = _w.RegExp;\r\n const brReg = new wRegExp('^(BLOCKQUOTE|PRE|TABLE|THEAD|TBODY|TR|TH|TD|OL|UL|IMG|IFRAME|VIDEO|AUDIO|FIGURE|FIGCAPTION|HR|BR|CANVAS|SELECT)$', 'i');\r\n const wDoc = typeof html === 'string' ? _d.createRange().createContextualFragment(html) : html;\r\n const isFormat = function (current) { return this.isFormatElement(current) || this.isComponent(current); }.bind(util);\r\n const brChar = comp ? '' : '\\n';\r\n\r\n let indentSize = comp ? 0 : this._variable.codeIndent * 1;\r\n indentSize = indentSize > 0 ? new _w.Array(indentSize + 1).join(' ') : '';\r\n\r\n (function recursionFunc (element, indent) {\r\n const children = element.childNodes;\r\n const elementRegTest = brReg.test(element.nodeName);\r\n const elementIndent = (elementRegTest ? indent : '');\r\n\r\n for (let i = 0, len = children.length, node, br, lineBR, nodeRegTest, tag, tagIndent; i < len; i++) {\r\n node = children[i];\r\n nodeRegTest = brReg.test(node.nodeName);\r\n br = nodeRegTest ? brChar : '';\r\n lineBR = isFormat(node) && !elementRegTest && !/^(TH|TD)$/i.test(element.nodeName) ? brChar : '';\r\n\r\n if (node.nodeType === 8) {\r\n returnHTML += '\\n' + br;\r\n continue;\r\n }\r\n if (node.nodeType === 3) {\r\n if (!util.isList(node.parentElement)) returnHTML += util._HTMLConvertor(/^\\n+$/.test(node.data) ? '' : node.data);\r\n continue;\r\n }\r\n if (node.childNodes.length === 0) {\r\n returnHTML += (/^HR$/i.test(node.nodeName) ? brChar : '') + (/^PRE$/i.test(node.parentElement.nodeName) && /^BR$/i.test(node.nodeName) ? '' : elementIndent) + node.outerHTML + br;\r\n continue;\r\n }\r\n\r\n if (!node.outerHTML) { // IE\r\n returnHTML += new _w.XMLSerializer().serializeToString(node);\r\n } else {\r\n tag = node.nodeName.toLowerCase();\r\n tagIndent = elementIndent || nodeRegTest ? indent : '';\r\n returnHTML += (lineBR || (elementRegTest ? '' : br)) + tagIndent + node.outerHTML.match(wRegExp('<' + tag + '[^>]*>', 'i'))[0] + br;\r\n recursionFunc(node, indent + indentSize, '');\r\n returnHTML += (/\\n$/.test(returnHTML) ? tagIndent : '') + '' + (lineBR || br || elementRegTest ? brChar : '' || /^(TH|TD)$/i.test(node.nodeName) ? brChar : '');\r\n }\r\n }\r\n }(wDoc, ''));\r\n\r\n return returnHTML.trim() + brChar;\r\n },\r\n\r\n /**\r\n * @description Add an event to document.\r\n * When created as an Iframe, the same event is added to the document in the Iframe.\r\n * @param {String} type Event type\r\n * @param {Function} listener Event listener\r\n * @param {Boolean} useCapture Use event capture\r\n */\r\n addDocEvent: function (type, listener, useCapture) {\r\n _d.addEventListener(type, listener, useCapture);\r\n if (options.iframe) {\r\n this._wd.addEventListener(type, listener);\r\n }\r\n },\r\n\r\n /**\r\n * @description Remove events from document.\r\n  * When created as an Iframe, the event of the document inside the Iframe is also removed.\r\n * @param {String} type Event type\r\n * @param {Function} listener Event listener\r\n */\r\n removeDocEvent: function (type, listener) {\r\n _d.removeEventListener(type, listener);\r\n if (options.iframe) {\r\n this._wd.removeEventListener(type, listener);\r\n }\r\n },\r\n\r\n /**\r\n * @description The current number of characters is counted and displayed.\r\n * @param {String} inputText Text added.\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _charCount: function (inputText) {\r\n const maxCharCount = options.maxCharCount;\r\n const countType = options.charCounterType;\r\n let nextCharCount = 0;\r\n if (!!inputText) nextCharCount = this.getCharLength(inputText, countType);\r\n\r\n this._setCharCount();\r\n\r\n if (maxCharCount > 0) {\r\n let over = false;\r\n const count = functions.getCharCount(countType);\r\n \r\n if (count > maxCharCount) {\r\n over = true;\r\n if (nextCharCount > 0) {\r\n this._editorRange();\r\n const range = this.getRange();\r\n const endOff = range.endOffset - 1;\r\n const text = this.getSelectionNode().textContent;\r\n const slicePosition = range.endOffset - (count - maxCharCount);\r\n \r\n this.getSelectionNode().textContent = text.slice(0, slicePosition < 0 ? 0 : slicePosition) + text.slice(range.endOffset, text.length);\r\n this.setRange(range.endContainer, endOff, range.endContainer, endOff);\r\n }\r\n } else if ((count + nextCharCount) > maxCharCount) {\r\n over = true;\r\n }\r\n\r\n if (over) {\r\n this._callCounterBlink();\r\n if (nextCharCount > 0) return false;\r\n }\r\n }\r\n\r\n return true;\r\n },\r\n\r\n /**\r\n * @description When \"element\" is added, if it is greater than \"options.maxCharCount\", false is returned.\r\n * @param {Node|String} element Element node or String.\r\n * @param {String|null} charCounterType charCounterType. If it is null, the options.charCounterType\r\n * @returns {Boolean}\r\n */\r\n checkCharCount: function (element, charCounterType) {\r\n if (options.maxCharCount) {\r\n const countType = charCounterType || options.charCounterType;\r\n const length = this.getCharLength((typeof element === 'string' ? element : (this._charTypeHTML && element.nodeType === 1) ? element.outerHTML : element.textContent), countType);\r\n if (length > 0 && length + functions.getCharCount(countType) > options.maxCharCount) {\r\n this._callCounterBlink();\r\n return false;\r\n }\r\n }\r\n return true;\r\n },\r\n\r\n /**\r\n * @description Get the length of the content.\r\n * Depending on the option, the length of the character is taken. (charCounterType)\r\n * @param {String} content Content to count\r\n * @param {String} charCounterType options.charCounterType\r\n * @returns {Number}\r\n */\r\n getCharLength: function (content, charCounterType) {\r\n return /byte/.test(charCounterType) ? util.getByteLength(content) : content.length;\r\n },\r\n\r\n /**\r\n * @description Reset buttons of the responsive toolbar.\r\n */\r\n resetResponsiveToolbar: function () {\r\n core.controllersOff();\r\n\r\n const responsiveSize = event._responsiveButtonSize;\r\n if (responsiveSize) {\r\n let w = 0;\r\n if ((core._isBalloon || core._isInline) && options.toolbarWidth === 'auto') {\r\n w = context.element.topArea.offsetWidth;\r\n } else {\r\n w = context.element.toolbar.offsetWidth;\r\n }\r\n\r\n let responsiveWidth = 'default';\r\n for (let i = 1, len = responsiveSize.length; i < len; i++) {\r\n if (w < responsiveSize[i]) {\r\n responsiveWidth = responsiveSize[i] + '';\r\n break;\r\n }\r\n }\r\n\r\n if (event._responsiveCurrentSize !== responsiveWidth) {\r\n event._responsiveCurrentSize = responsiveWidth;\r\n functions.setToolbarButtons(event._responsiveButtons[responsiveWidth]);\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * @description Set the char count to charCounter element textContent.\r\n * @private\r\n */\r\n _setCharCount: function () {\r\n if (context.element.charCounter) {\r\n _w.setTimeout(function () { context.element.charCounter.textContent = functions.getCharCount(options.charCounterType); });\r\n }\r\n },\r\n\r\n /**\r\n * @description The character counter blinks.\r\n * @private\r\n */\r\n _callCounterBlink: function () {\r\n const charWrapper = context.element.charWrapper;\r\n if (charWrapper && !util.hasClass(charWrapper, 'se-blink')) {\r\n util.addClass(charWrapper, 'se-blink');\r\n _w.setTimeout(function () {\r\n util.removeClass(charWrapper, 'se-blink');\r\n }, 600);\r\n }\r\n },\r\n\r\n /**\r\n * @description Check the components such as image and video and modify them according to the format.\r\n * @private\r\n */\r\n _checkComponents: function () {\r\n for (let i = 0, len = this._fileInfoPluginsCheck.length; i < len; i++) {\r\n this._fileInfoPluginsCheck[i]();\r\n }\r\n },\r\n\r\n /**\r\n * @description Initialize the information of the components.\r\n * @private\r\n */\r\n _resetComponents: function () {\r\n for (let i = 0, len = this._fileInfoPluginsReset.length; i < len; i++) {\r\n this._fileInfoPluginsReset[i]();\r\n }\r\n },\r\n\r\n /**\r\n * @description Set method in the code view area\r\n * @param {String} value HTML string\r\n * @private\r\n */\r\n _setCodeView: function (value) {\r\n if (options.codeMirrorEditor) {\r\n options.codeMirrorEditor.getDoc().setValue(value);\r\n } else {\r\n context.element.code.value = value;\r\n }\r\n },\r\n\r\n /**\r\n * @description Get method in the code view area\r\n * @private\r\n */\r\n _getCodeView: function () {\r\n return options.codeMirrorEditor ? options.codeMirrorEditor.getDoc().getValue() : context.element.code.value;\r\n },\r\n\r\n /**\r\n * @description remove class, display text.\r\n * @param {Array|null} ignoredList Igonred button list\r\n */\r\n _setKeyEffect: function (ignoredList) {\r\n const commandMap = this.commandMap;\r\n const activePlugins = this.activePlugins;\r\n\r\n for (let key in commandMap) {\r\n if (ignoredList.indexOf(key) > -1 || !util.hasOwn(commandMap, key)) continue;\r\n if (activePlugins.indexOf(key) > -1) {\r\n plugins[key].active.call(this, null);\r\n } else if (commandMap.OUTDENT && /^OUTDENT$/i.test(key)) {\r\n if (!util.isImportantDisabled(commandMap.OUTDENT)) commandMap.OUTDENT.setAttribute('disabled', true);\r\n } else if (commandMap.INDENT && /^INDENT$/i.test(key)) {\r\n if (!util.isImportantDisabled(commandMap.INDENT)) commandMap.INDENT.removeAttribute('disabled');\r\n } else {\r\n util.removeClass(commandMap[key], 'active');\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * @description Initializ core variable\r\n * @param {Boolean} reload Is relooad?\r\n * @param {String} _initHTML initial html string\r\n * @private\r\n */\r\n _init: function (reload, _initHTML) {\r\n const wRegExp = _w.RegExp;\r\n this._ww = options.iframe ? context.element.wysiwygFrame.contentWindow : _w;\r\n this._wd = _d;\r\n this._charTypeHTML = options.charCounterType === 'byte-html';\r\n this.wwComputedStyle = _w.getComputedStyle(context.element.wysiwyg);\r\n this._editorHeight = context.element.wysiwygFrame.offsetHeight;\r\n this._editorHeightPadding = util.getNumber(this.wwComputedStyle.getPropertyValue('padding-top')) + util.getNumber(this.wwComputedStyle.getPropertyValue('padding-bottom'));\r\n this._classNameFilter = function (v) {\r\n return this.test(v) ? v : '';\r\n }.bind(options.allowedClassNames);\r\n\r\n const sPrefix = (options.__allowedScriptTag ? '' : 'script|');\r\n this.__scriptTagRegExp = new wRegExp('<(script)[^>]*>([\\\\s\\\\S]*?)<\\\\/\\\\1>|]*\\\\/?>', 'gi');\r\n this.__disallowedTagsRegExp = new wRegExp('<(' + sPrefix + 'style)[^>]*>([\\\\s\\\\S]*?)<\\\\/\\\\1>|<(' + sPrefix + 'style)[^>]*\\\\/?>', 'gi');\r\n this.__disallowedTagNameRegExp = new wRegExp('^(' + sPrefix + 'meta|link|style|[a-z]+\\:[a-z]+)$', 'i');\r\n this.__allowedScriptRegExp = new wRegExp('^' + (options.__allowedScriptTag ? 'script' : '') + '$', 'i');\r\n\r\n if (!options.iframe && typeof _w.ShadowRoot === 'function') {\r\n let child = context.element.wysiwygFrame;\r\n while (child) {\r\n if (child.shadowRoot) {\r\n this._shadowRoot = child.shadowRoot;\r\n break;\r\n } else if (child instanceof _w.ShadowRoot) {\r\n this._shadowRoot = child;\r\n break;\r\n }\r\n child = child.parentNode;\r\n }\r\n if (this._shadowRoot) this._shadowRootControllerEventTarget = [];\r\n }\r\n\r\n // set disallow text nodes\r\n const disallowTextTags = _w.Object.keys(options._textTagsMap);\r\n const allowTextTags = !options.addTagsWhitelist ? [] : options.addTagsWhitelist.split('|').filter(function (v) { return /b|i|ins|s|strike/i.test(v); });\r\n for (let i = 0; i < allowTextTags.length; i++) {\r\n disallowTextTags.splice(disallowTextTags.indexOf(allowTextTags[i].toLowerCase()), 1);\r\n }\r\n this._disallowedTextTagsRegExp = disallowTextTags.length === 0 ? null : new wRegExp('(<\\\\/?)(' + disallowTextTags.join('|') + ')\\\\b\\\\s*([^>^<]+)?\\\\s*(?=>)', 'gi');\r\n\r\n // set whitelist\r\n const getRegList = function (str, str2) { return !str ? '^' : (str === '*' ? '[a-z-]+' : (!str2 ? str : (str + '|' + str2))); };\r\n // tags\r\n const defaultAttr = 'contenteditable|colspan|rowspan|target|href|download|rel|src|alt|class|type|controls|origin-size';\r\n const dataAttr = 'data-format|data-size|data-file-size|data-file-name|data-origin|data-align|data-image-link|data-rotate|data-proportion|data-percentage|data-exp|data-font-size';\r\n this._allowHTMLComments = options._editorTagsWhitelist.indexOf('//') > -1 || options._editorTagsWhitelist === '*';\r\n // html check\r\n this._htmlCheckWhitelistRegExp = new wRegExp('^(' + getRegList(options._editorTagsWhitelist.replace('|//', ''), '') + ')$', 'i');\r\n this._htmlCheckBlacklistRegExp = new wRegExp('^(' + (options.tagsBlacklist || '^') + ')$', 'i');\r\n // tags\r\n this.editorTagsWhitelistRegExp = util.createTagsWhitelist(getRegList(options._editorTagsWhitelist.replace('|//', '|'), ''));\r\n this.editorTagsBlacklistRegExp = util.createTagsBlacklist(options.tagsBlacklist.replace('|//', '|'));\r\n // paste tags\r\n this.pasteTagsWhitelistRegExp = util.createTagsWhitelist(getRegList(options.pasteTagsWhitelist, ''));\r\n this.pasteTagsBlacklistRegExp = util.createTagsBlacklist(options.pasteTagsBlacklist);\r\n // attributes\r\n const regEndStr = '\\\\s*=\\\\s*(\\\")[^\\\"]*\\\\1';\r\n const _wAttr = options.attributesWhitelist;\r\n let tagsAttr = {};\r\n let allAttr = '';\r\n if (!!_wAttr) {\r\n for (let k in _wAttr) {\r\n if (!util.hasOwn(_wAttr, k) || /^on[a-z]+$/i.test(_wAttr[k])) continue;\r\n if (k === 'all') {\r\n allAttr = getRegList(_wAttr[k], defaultAttr);\r\n } else {\r\n tagsAttr[k] = new wRegExp('\\\\s(?:' + getRegList(_wAttr[k], '') + ')' + regEndStr, 'ig');\r\n }\r\n }\r\n }\r\n \r\n this._attributesWhitelistRegExp = new wRegExp('\\\\s(?:' + (allAttr || defaultAttr + '|' + dataAttr) + ')' + regEndStr, 'ig');\r\n this._attributesWhitelistRegExp_all_data = new wRegExp('\\\\s(?:' + ((allAttr || defaultAttr) + '|data-[a-z0-9\\\\-]+') + ')' + regEndStr, 'ig');\r\n this._attributesTagsWhitelist = tagsAttr;\r\n\r\n // blacklist\r\n const _bAttr = options.attributesBlacklist;\r\n tagsAttr = {};\r\n allAttr = '';\r\n if (!!_bAttr) {\r\n for (let k in _bAttr) {\r\n if (!util.hasOwn(_bAttr, k)) continue;\r\n if (k === 'all') {\r\n allAttr = getRegList(_bAttr[k], '');\r\n } else {\r\n tagsAttr[k] = new wRegExp('\\\\s(?:' + getRegList(_bAttr[k], '') + ')' + regEndStr, 'ig');\r\n }\r\n }\r\n }\r\n\r\n this._attributesBlacklistRegExp = new wRegExp('\\\\s(?:' + (allAttr || '^') + ')' + regEndStr, 'ig');\r\n this._attributesTagsBlacklist = tagsAttr;\r\n\r\n // set modes\r\n this._isInline = /inline/i.test(options.mode);\r\n this._isBalloon = /balloon|balloon-always/i.test(options.mode);\r\n this._isBalloonAlways = /balloon-always/i.test(options.mode);\r\n\r\n // caching buttons\r\n this._cachingButtons();\r\n\r\n // file components\r\n this._fileInfoPluginsCheck = [];\r\n this._fileInfoPluginsReset = [];\r\n\r\n // text components\r\n this.managedTagsInfo = { query: '', map: {} };\r\n const managedClass = [];\r\n\r\n // Command and file plugins registration\r\n this.activePlugins = [];\r\n this._fileManager.tags = [];\r\n this._fileManager.pluginMap = {};\r\n\r\n let filePluginRegExp = [];\r\n let plugin, button;\r\n for (let key in plugins) {\r\n if (!util.hasOwn(plugins, key)) continue;\r\n plugin = plugins[key];\r\n button = pluginCallButtons[key];\r\n if ((plugin.active || plugin.action) && button) {\r\n this.callPlugin(key, null, button);\r\n }\r\n if (typeof plugin.checkFileInfo === 'function' && typeof plugin.resetFileInfo === 'function') {\r\n this.callPlugin(key, null, button);\r\n this._fileInfoPluginsCheck.push(plugin.checkFileInfo.bind(this));\r\n this._fileInfoPluginsReset.push(plugin.resetFileInfo.bind(this));\r\n }\r\n if (_w.Array.isArray(plugin.fileTags)) {\r\n const fileTags = plugin.fileTags;\r\n this.callPlugin(key, null, button);\r\n this._fileManager.tags = this._fileManager.tags.concat(fileTags);\r\n filePluginRegExp.push(key);\r\n for (let tag = 0, tLen = fileTags.length; tag < tLen; tag++) {\r\n this._fileManager.pluginMap[fileTags[tag].toLowerCase()] = key;\r\n }\r\n }\r\n if (plugin.managedTags) {\r\n const info = plugin.managedTags();\r\n managedClass.push('.' + info.className);\r\n this.managedTagsInfo.map[info.className] = info.method.bind(this);\r\n }\r\n }\r\n\r\n this.managedTagsInfo.query = managedClass.toString();\r\n this._fileManager.queryString = this._fileManager.tags.join(',');\r\n this._fileManager.regExp = new wRegExp('^(' + (this._fileManager.tags.join('|') || '^') + ')$', 'i');\r\n this._fileManager.pluginRegExp = new wRegExp('^(' + (filePluginRegExp.length === 0 ? '^' : filePluginRegExp.join('|')) + ')$', 'i');\r\n \r\n // cache editor's element\r\n this._variable._originCssText = context.element.topArea.style.cssText;\r\n this._placeholder = context.element.placeholder;\r\n this._lineBreaker = context.element.lineBreaker;\r\n this._lineBreakerButton = this._lineBreaker.querySelector('button');\r\n\r\n // Excute history function\r\n this.history = _history(this, this._onChange_historyStack.bind(this));\r\n\r\n // register notice module\r\n this.addModule([_notice]);\r\n\r\n // Init, validate\r\n if (options.iframe) {\r\n this._wd = context.element.wysiwygFrame.contentDocument;\r\n context.element.wysiwyg = this._wd.body;\r\n if (options._editorStyles.editor) context.element.wysiwyg.style.cssText = options._editorStyles.editor;\r\n if (options.height === 'auto') this._iframeAuto = this._wd.body;\r\n }\r\n \r\n this._initWysiwygArea(reload, _initHTML);\r\n },\r\n\r\n /**\r\n * @description Caching basic buttons to use\r\n * @private\r\n */\r\n _cachingButtons: function () {\r\n this.codeViewDisabledButtons = context.element._buttonTray.querySelectorAll('.se-menu-list button[data-display]:not([class~=\"se-code-view-enabled\"]):not([data-display=\"MORE\"])');\r\n this.resizingDisabledButtons = context.element._buttonTray.querySelectorAll('.se-menu-list button[data-display]:not([class~=\"se-resizing-enabled\"]):not([data-display=\"MORE\"])');\r\n\r\n const tool = context.tool;\r\n const commandMap = this.commandMap;\r\n commandMap.INDENT = tool.indent;\r\n commandMap.OUTDENT = tool.outdent;\r\n commandMap[options.textTags.bold.toUpperCase()] = tool.bold;\r\n commandMap[options.textTags.underline.toUpperCase()] = tool.underline;\r\n commandMap[options.textTags.italic.toUpperCase()] = tool.italic;\r\n commandMap[options.textTags.strike.toUpperCase()] = tool.strike;\r\n commandMap[options.textTags.sub.toUpperCase()] = tool.subscript;\r\n commandMap[options.textTags.sup.toUpperCase()] = tool.superscript;\r\n \r\n this._styleCommandMap = {\r\n fullScreen: tool.fullScreen,\r\n showBlocks: tool.showBlocks,\r\n codeView: tool.codeView\r\n };\r\n\r\n this._saveButtonStates();\r\n },\r\n\r\n /**\r\n * @description Initializ wysiwyg area (Only called from core._init)\r\n * @param {Boolean} reload Is relooad?\r\n * @param {String} _initHTML initial html string\r\n * @private\r\n */\r\n _initWysiwygArea: function (reload, _initHTML) {\r\n context.element.wysiwyg.innerHTML = reload ? _initHTML : this.convertContentsForEditor((typeof _initHTML === 'string' ? _initHTML : /^TEXTAREA$/i.test(context.element.originElement.nodeName) ? context.element.originElement.value : context.element.originElement.innerHTML) || '');\r\n },\r\n\r\n /**\r\n * @description Called when there are changes to tags in the wysiwyg region.\r\n * @private\r\n */\r\n _resourcesStateChange: function () {\r\n this._iframeAutoHeight();\r\n this._checkPlaceholder();\r\n },\r\n\r\n /**\r\n * @description Called when after execute \"history.push\"\r\n * @private\r\n */\r\n _onChange_historyStack: function () {\r\n if (this.hasFocus) event._applyTagEffects();\r\n this._variable.isChanged = true;\r\n if (context.tool.save) context.tool.save.removeAttribute('disabled');\r\n // user event\r\n if (functions.onChange) functions.onChange(this.getContents(true), this);\r\n if (context.element.toolbar.style.display === 'block') event._showToolbarBalloon();\r\n },\r\n\r\n /**\r\n * @description Modify the height value of the iframe when the height of the iframe is automatic.\r\n * @private\r\n */\r\n _iframeAutoHeight: function () {\r\n if (this._iframeAuto) {\r\n _w.setTimeout(function () { \r\n const h = core._iframeAuto.offsetHeight;\r\n context.element.wysiwygFrame.style.height = h + 'px';\r\n if (!util.isResizeObserverSupported) core.__callResizeFunction(h, null);\r\n });\r\n } else if (!util.isResizeObserverSupported) {\r\n core.__callResizeFunction(context.element.wysiwygFrame.offsetHeight, null);\r\n }\r\n },\r\n\r\n __callResizeFunction: function (h, resizeObserverEntry) {\r\n h = h === -1 ? (resizeObserverEntry.borderBoxSize && resizeObserverEntry.borderBoxSize[0] ? resizeObserverEntry.borderBoxSize[0].blockSize : (resizeObserverEntry.contentRect.height + this._editorHeightPadding)) : h;\r\n if (this._editorHeight !== h) {\r\n if (typeof functions.onResizeEditor === 'function') functions.onResizeEditor(h, this._editorHeight, core, resizeObserverEntry);\r\n this._editorHeight = h;\r\n }\r\n },\r\n\r\n /**\r\n * @description Set display property when there is placeholder.\r\n * @private\r\n */\r\n _checkPlaceholder: function () {\r\n if (this._placeholder) {\r\n if (this._variable.isCodeView) {\r\n this._placeholder.style.display = 'none';\r\n return;\r\n }\r\n\r\n const wysiwyg = context.element.wysiwyg;\r\n if (!util.onlyZeroWidthSpace(wysiwyg.textContent) || wysiwyg.querySelector(util._allowedEmptyNodeList) || (wysiwyg.innerText.match(/\\n/g) || '').length > 1) {\r\n this._placeholder.style.display = 'none';\r\n } else {\r\n this._placeholder.style.display = 'block';\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * @description If there is no default format, add a format and move \"selection\".\r\n * @param {String|null} formatName Format tag name (default: 'P')\r\n * @returns {undefined|null}\r\n * @private\r\n */\r\n _setDefaultFormat: function (formatName) {\r\n if (this._fileManager.pluginRegExp.test(this.currentControllerName)) return;\r\n\r\n const range = this.getRange();\r\n const commonCon = range.commonAncestorContainer;\r\n const startCon = range.startContainer;\r\n const rangeEl = util.getRangeFormatElement(commonCon, null);\r\n let focusNode, offset, format;\r\n\r\n const fileComponent = util.getParentElement(commonCon, util.isComponent);\r\n if (fileComponent && !util.isTable(fileComponent)) {\r\n return;\r\n } else if (commonCon.nodeType === 1 && commonCon.getAttribute('data-se-embed') === 'true') {\r\n let el = commonCon.nextElementSibling;\r\n if (!util.isFormatElement(el)) el = this.appendFormatTag(commonCon, options.defaultTag);\r\n this.setRange(el.firstChild, 0, el.firstChild, 0);\r\n return;\r\n }\r\n\r\n if ((util.isRangeFormatElement(startCon) || util.isWysiwygDiv(startCon)) && (util.isComponent(startCon.children[range.startOffset]) || util.isComponent(startCon.children[range.startOffset - 1]))) return;\r\n if (util.getParentElement(commonCon, util.isNotCheckingNode)) return null;\r\n\r\n if (rangeEl) {\r\n format = util.createElement(formatName || options.defaultTag);\r\n format.innerHTML = rangeEl.innerHTML;\r\n if (format.childNodes.length === 0) format.innerHTML = util.zeroWidthSpace;\r\n\r\n rangeEl.innerHTML = format.outerHTML;\r\n format = rangeEl.firstChild;\r\n focusNode = util.getEdgeChildNodes(format, null).sc;\r\n\r\n if (!focusNode) {\r\n focusNode = util.createTextNode(util.zeroWidthSpace);\r\n format.insertBefore(focusNode, format.firstChild);\r\n }\r\n \r\n offset = focusNode.textContent.length;\r\n this.setRange(focusNode, offset, focusNode, offset);\r\n return;\r\n }\r\n\r\n if(util.isRangeFormatElement(commonCon) && (commonCon.childNodes.length <= 1)) {\r\n let br = null;\r\n if (commonCon.childNodes.length === 1 && util.isBreak(commonCon.firstChild)) {\r\n br = commonCon.firstChild;\r\n } else {\r\n br = util.createTextNode(util.zeroWidthSpace);\r\n commonCon.appendChild(br);\r\n }\r\n\r\n this.setRange(br, 1, br, 1);\r\n return;\r\n }\r\n\r\n this.execCommand('formatBlock', false, (formatName || options.defaultTag));\r\n focusNode = util.getEdgeChildNodes(commonCon, commonCon);\r\n focusNode = focusNode ? focusNode.ec : commonCon;\r\n\r\n format = util.getFormatElement(focusNode, null);\r\n if (!format) {\r\n this.removeRange();\r\n this._editorRange();\r\n return;\r\n }\r\n \r\n if (util.isBreak(format.nextSibling)) util.removeItem(format.nextSibling);\r\n if (util.isBreak(format.previousSibling)) util.removeItem(format.previousSibling);\r\n if (util.isBreak(focusNode)) {\r\n const zeroWidth = util.createTextNode(util.zeroWidthSpace);\r\n focusNode.parentNode.insertBefore(zeroWidth, focusNode);\r\n focusNode = zeroWidth;\r\n }\r\n\r\n this.effectNode = null;\r\n this.nativeFocus();\r\n },\r\n\r\n /**\r\n * @description Initialization after \"setOptions\"\r\n * @param {Object} el context.element\r\n * @param {String} _initHTML Initial html string\r\n * @private\r\n */\r\n _setOptionsInit: function (el, _initHTML) {\r\n this.context = context = _Context(el.originElement, this._getConstructed(el), options);\r\n this._componentsInfoReset = true;\r\n this._editorInit(true, _initHTML);\r\n },\r\n\r\n /**\r\n * @description Initializ editor\r\n * @param {Boolean} reload Is relooad?\r\n * @param {String} _initHTML initial html string\r\n * @private\r\n */\r\n _editorInit: function (reload, _initHTML) {\r\n // initialize core and add event listeners\r\n this._init(reload, _initHTML);\r\n event._addEvent();\r\n this._setCharCount();\r\n event._offStickyToolbar();\r\n event.onResize_window();\r\n\r\n // toolbar visibility\r\n context.element.toolbar.style.visibility = '';\r\n // wisywig attributes\r\n const attr = options.frameAttrbutes;\r\n for (let k in attr) {\r\n context.element.wysiwyg.setAttribute(k, attr[k]);\r\n }\r\n\r\n this._checkComponents();\r\n this._componentsInfoInit = false;\r\n this._componentsInfoReset = false;\r\n\r\n this.history.reset(true);\r\n \r\n _w.setTimeout(function () {\r\n if (typeof core._resourcesStateChange !== 'function') return;\r\n\r\n // observer\r\n if (event._resizeObserver) event._resizeObserver.observe(context.element.wysiwygFrame);\r\n if (event._toolbarObserver) event._toolbarObserver.observe(context.element._toolbarShadow);\r\n // resource state\r\n core._resourcesStateChange();\r\n // user event\r\n if (typeof functions.onload === 'function') functions.onload(core, reload);\r\n });\r\n },\r\n\r\n /**\r\n * @description Create and return an object to cache the new context.\r\n * @param {Element} contextEl context.element\r\n * @returns {Object}\r\n * @private\r\n */\r\n _getConstructed: function (contextEl) {\r\n return {\r\n _top: contextEl.topArea,\r\n _relative: contextEl.relative,\r\n _toolBar: contextEl.toolbar,\r\n _toolbarShadow: contextEl._toolbarShadow,\r\n _menuTray: contextEl._menuTray,\r\n _editorArea: contextEl.editorArea,\r\n _wysiwygArea: contextEl.wysiwygFrame,\r\n _codeArea: contextEl.code,\r\n _placeholder: contextEl.placeholder,\r\n _resizingBar: contextEl.resizingBar,\r\n _navigation: contextEl.navigation,\r\n _charCounter: contextEl.charCounter,\r\n _charWrapper: contextEl.charWrapper,\r\n _loading: contextEl.loading,\r\n _lineBreaker: contextEl.lineBreaker,\r\n _lineBreaker_t: contextEl.lineBreaker_t,\r\n _lineBreaker_b: contextEl.lineBreaker_b,\r\n _resizeBack: contextEl.resizeBackground,\r\n _stickyDummy: contextEl._stickyDummy,\r\n _arrow: contextEl._arrow\r\n };\r\n }\r\n };\r\n\r\n /**\r\n * @description event function\r\n */\r\n const event = {\r\n _IEisComposing: false, // In IE, there is no \"e.isComposing\" in the key-up event.\r\n _lineBreakerBind: null,\r\n _responsiveCurrentSize: 'default',\r\n _responsiveButtonSize: null,\r\n _responsiveButtons: null,\r\n _cursorMoveKeyCode: new _w.RegExp('^(8|3[2-9]|40|46)$'),\r\n _directionKeyCode: new _w.RegExp('^(8|13|3[2-9]|40|46)$'),\r\n _nonTextKeyCode: new _w.RegExp('^(8|13|1[6-9]|20|27|3[3-9]|40|45|46|11[2-9]|12[0-3]|144|145)$'),\r\n _historyIgnoreKeyCode: new _w.RegExp('^(1[6-9]|20|27|3[3-9]|40|45|11[2-9]|12[0-3]|144|145)$'),\r\n _onButtonsCheck: new _w.RegExp('^(' + _w.Object.keys(options._textTagsMap).join('|') + ')$', 'i'),\r\n _frontZeroWidthReg: new _w.RegExp(util.zeroWidthSpace + '+', ''),\r\n _keyCodeShortcut: {\r\n 65: 'A',\r\n 66: 'B',\r\n 83: 'S',\r\n 85: 'U',\r\n 73: 'I',\r\n 89: 'Y',\r\n 90: 'Z',\r\n 219: '[',\r\n 221: ']'\r\n },\r\n\r\n _shortcutCommand: function (keyCode, shift) {\r\n let command = null;\r\n const keyStr = event._keyCodeShortcut[keyCode];\r\n\r\n switch (keyStr) {\r\n case 'A':\r\n command = 'selectAll';\r\n break;\r\n case 'B':\r\n if (options.shortcutsDisable.indexOf('bold') === -1) {\r\n command = 'bold';\r\n }\r\n break;\r\n case 'S':\r\n if (shift && options.shortcutsDisable.indexOf('strike') === -1) {\r\n command = 'strike';\r\n } else if (!shift && options.shortcutsDisable.indexOf('save') === -1) {\r\n command = 'save';\r\n }\r\n break;\r\n case 'U':\r\n if (options.shortcutsDisable.indexOf('underline') === -1) {\r\n command = 'underline';\r\n }\r\n break;\r\n case 'I':\r\n if (options.shortcutsDisable.indexOf('italic') === -1) {\r\n command = 'italic';\r\n }\r\n break;\r\n case 'Z':\r\n if (options.shortcutsDisable.indexOf('undo') === -1) {\r\n if (shift) {\r\n command = 'redo';\r\n } else {\r\n command = 'undo';\r\n }\r\n }\r\n break;\r\n case 'Y':\r\n if (options.shortcutsDisable.indexOf('undo') === -1) {\r\n command = 'redo';\r\n }\r\n break;\r\n case '[':\r\n if (options.shortcutsDisable.indexOf('indent') === -1) {\r\n command = options.rtl ? 'indent' : 'outdent';\r\n }\r\n break;\r\n case ']':\r\n if (options.shortcutsDisable.indexOf('indent') === -1) {\r\n command = options.rtl ? 'outdent' : 'indent';\r\n }\r\n break;\r\n }\r\n\r\n if (!command) return !!keyStr;\r\n\r\n core.commandHandler(core.commandMap[command], command);\r\n return true;\r\n },\r\n\r\n _applyTagEffects: function () {\r\n let selectionNode = core.getSelectionNode();\r\n if (selectionNode === core.effectNode) return;\r\n core.effectNode = selectionNode;\r\n\r\n const marginDir = options.rtl ? 'marginRight' : 'marginLeft';\r\n const commandMap = core.commandMap;\r\n const classOnCheck = event._onButtonsCheck;\r\n const commandMapNodes = [];\r\n const currentNodes = [];\r\n\r\n const activePlugins = core.activePlugins;\r\n const cLen = activePlugins.length;\r\n let nodeName = '';\r\n\r\n while (selectionNode.firstChild) {\r\n selectionNode = selectionNode.firstChild;\r\n }\r\n\r\n for (let element = selectionNode; !util.isWysiwygDiv(element); element = element.parentNode) {\r\n if (!element) break;\r\n if (element.nodeType !== 1 || util.isBreak(element)) continue;\r\n nodeName = element.nodeName.toUpperCase();\r\n currentNodes.push(nodeName);\r\n\r\n /* Active plugins */\r\n if (!core.isReadOnly) {\r\n for (let c = 0, name; c < cLen; c++) {\r\n name = activePlugins[c];\r\n if (commandMapNodes.indexOf(name) === -1 && plugins[name].active.call(core, element)) {\r\n commandMapNodes.push(name);\r\n }\r\n }\r\n }\r\n\r\n if (util.isFormatElement(element)) {\r\n /* Outdent */\r\n if (commandMapNodes.indexOf('OUTDENT') === -1 && commandMap.OUTDENT && !util.isImportantDisabled(commandMap.OUTDENT)) {\r\n if (util.isListCell(element) || (element.style[marginDir] && util.getNumber(element.style[marginDir], 0) > 0)) {\r\n commandMapNodes.push('OUTDENT');\r\n commandMap.OUTDENT.removeAttribute('disabled');\r\n }\r\n }\r\n\r\n /* Indent */\r\n if (commandMapNodes.indexOf('INDENT') === -1 && commandMap.INDENT && !util.isImportantDisabled(commandMap.INDENT)) {\r\n commandMapNodes.push('INDENT');\r\n if (util.isListCell(element) && !element.previousElementSibling) {\r\n commandMap.INDENT.setAttribute('disabled', true);\r\n } else {\r\n commandMap.INDENT.removeAttribute('disabled');\r\n }\r\n }\r\n\r\n continue;\r\n }\r\n\r\n /** default active buttons [strong, ins, em, del, sub, sup] */\r\n if (classOnCheck && classOnCheck.test(nodeName)) {\r\n commandMapNodes.push(nodeName);\r\n util.addClass(commandMap[nodeName], 'active');\r\n }\r\n }\r\n\r\n core._setKeyEffect(commandMapNodes);\r\n\r\n /** save current nodes */\r\n core._variable.currentNodes = currentNodes.reverse();\r\n core._variable.currentNodesMap = commandMapNodes;\r\n\r\n /** Displays the current node structure to resizingBar */\r\n if (options.showPathLabel) context.element.navigation.textContent = core._variable.currentNodes.join(' > ');\r\n },\r\n\r\n _buttonsEventHandler: function (e) {\r\n let target = e.target;\r\n if (core._bindControllersOff) e.stopPropagation();\r\n\r\n if (/^(input|textarea|select|option)$/i.test(target.nodeName)) {\r\n core._antiBlur = false;\r\n } else {\r\n e.preventDefault();\r\n }\r\n\r\n if (util.getParentElement(target, '.se-submenu')) {\r\n e.stopPropagation();\r\n core._notHideToolbar = true;\r\n } else {\r\n let command = target.getAttribute('data-command');\r\n let className = target.className;\r\n \r\n while (!command && !/se-menu-list/.test(className) && !/sun-editor-common/.test(className)) {\r\n target = target.parentNode;\r\n command = target.getAttribute('data-command');\r\n className = target.className;\r\n }\r\n \r\n if (command === core._submenuName || command === core._containerName) {\r\n e.stopPropagation();\r\n }\r\n }\r\n },\r\n\r\n onClick_toolbar: function (e) {\r\n let target = e.target;\r\n let display = target.getAttribute('data-display');\r\n let command = target.getAttribute('data-command');\r\n let className = target.className;\r\n core.controllersOff();\r\n\r\n while (target.parentNode && !command && !/se-menu-list/.test(className) && !/se-toolbar/.test(className)) {\r\n target = target.parentNode;\r\n command = target.getAttribute('data-command');\r\n display = target.getAttribute('data-display');\r\n className = target.className;\r\n }\r\n\r\n if (!command && !display) return;\r\n if (target.disabled) return;\r\n\r\n core.actionCall(command, display, target);\r\n },\r\n\r\n onMouseDown_wysiwyg: function (e) {\r\n if (core.isReadOnly || util.isNonEditable(context.element.wysiwyg)) return;\r\n if (util._isExcludeSelectionElement(e.target)) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n _w.setTimeout(core._editorRange.bind(core));\r\n\r\n // user event\r\n if (typeof functions.onMouseDown === 'function' && functions.onMouseDown(e, core) === false) return;\r\n \r\n const tableCell = util.getParentElement(e.target, util.isCell);\r\n if (tableCell) {\r\n const tablePlugin = core.plugins.table;\r\n if (tablePlugin && tableCell !== tablePlugin._fixedCell && !tablePlugin._shift) {\r\n core.callPlugin('table', function () {\r\n tablePlugin.onTableCellMultiSelect.call(core, tableCell, false);\r\n }, null);\r\n }\r\n }\r\n\r\n if (core._isBalloon) {\r\n event._hideToolbar();\r\n }\r\n },\r\n\r\n onClick_wysiwyg: function (e) {\r\n const targetElement = e.target;\r\n\r\n if (core.isReadOnly) {\r\n e.preventDefault();\r\n if (util.isAnchor(targetElement)){\r\n _w.open(targetElement.href, targetElement.target);\r\n }\r\n return false;\r\n }\r\n\r\n if (util.isNonEditable(context.element.wysiwyg)) return;\r\n\r\n // user event\r\n if (typeof functions.onClick === 'function' && functions.onClick(e, core) === false) return;\r\n\r\n const fileComponentInfo = core.getFileComponent(targetElement);\r\n if (fileComponentInfo) {\r\n e.preventDefault();\r\n core.selectComponent(fileComponentInfo.target, fileComponentInfo.pluginName);\r\n return;\r\n }\r\n\r\n const figcaption = util.getParentElement(targetElement, 'FIGCAPTION');\r\n if (figcaption && util.isNonEditable(figcaption)) {\r\n e.preventDefault();\r\n figcaption.focus();\r\n\r\n if (core._isInline && !core._inlineToolbarAttr.isShow) {\r\n event._showToolbarInline();\r\n\r\n const hideToolbar = function () {\r\n event._hideToolbar();\r\n figcaption.removeEventListener('blur', hideToolbar);\r\n };\r\n\r\n figcaption.addEventListener('blur', hideToolbar);\r\n }\r\n }\r\n\r\n core._editorRange();\r\n\r\n if (e.detail === 3) {\r\n let range = core.getRange();\r\n if (util.isFormatElement(range.endContainer) && range.endOffset === 0) {\r\n range = core.setRange(range.startContainer, range.startOffset, range.startContainer, range.startContainer.length);\r\n core._rangeInfo(range, core.getSelection());\r\n }\r\n }\r\n\r\n const selectionNode = core.getSelectionNode();\r\n const formatEl = util.getFormatElement(selectionNode, null);\r\n const rangeEl = util.getRangeFormatElement(selectionNode, null);\r\n if (!formatEl && !util.isNonEditable(targetElement) && !util.isList(rangeEl)) {\r\n const range = core.getRange();\r\n if (util.getFormatElement(range.startContainer) === util.getFormatElement(range.endContainer)) {\r\n if (util.isList(rangeEl)) {\r\n e.preventDefault();\r\n const oLi = util.createElement('LI');\r\n const prevLi = selectionNode.nextElementSibling;\r\n oLi.appendChild(selectionNode);\r\n rangeEl.insertBefore(oLi, prevLi);\r\n core.focus();\r\n } else if (!util.isWysiwygDiv(selectionNode) && !util.isComponent(selectionNode) && (!util.isTable(selectionNode) || util.isCell(selectionNode)) && core._setDefaultFormat(util.isRangeFormatElement(rangeEl) ? 'DIV' : options.defaultTag) !== null) {\r\n e.preventDefault();\r\n core.focus();\r\n } else {\r\n event._applyTagEffects();\r\n }\r\n }\r\n } else {\r\n event._applyTagEffects();\r\n }\r\n\r\n if (core._isBalloon) _w.setTimeout(event._toggleToolbarBalloon);\r\n },\r\n\r\n _balloonDelay: null,\r\n _showToolbarBalloonDelay: function () {\r\n if (event._balloonDelay) {\r\n _w.clearTimeout(event._balloonDelay);\r\n }\r\n\r\n event._balloonDelay = _w.setTimeout(function () {\r\n _w.clearTimeout(this._balloonDelay);\r\n this._balloonDelay = null;\r\n this._showToolbarBalloon();\r\n }.bind(event), 350);\r\n },\r\n\r\n _toggleToolbarBalloon: function () {\r\n core._editorRange();\r\n const range = core.getRange();\r\n if (core._bindControllersOff || (!core._isBalloonAlways && range.collapsed)) event._hideToolbar();\r\n else event._showToolbarBalloon(range);\r\n },\r\n\r\n _showToolbarBalloon: function (rangeObj) {\r\n if (!core._isBalloon) return;\r\n\r\n const range = rangeObj || core.getRange();\r\n const toolbar = context.element.toolbar;\r\n const topArea = context.element.topArea;\r\n const selection = core.getSelection();\r\n\r\n let isDirTop;\r\n if (core._isBalloonAlways && range.collapsed) {\r\n isDirTop = true;\r\n } else if (selection.focusNode === selection.anchorNode) {\r\n isDirTop = selection.focusOffset < selection.anchorOffset;\r\n } else {\r\n const childNodes = util.getListChildNodes(range.commonAncestorContainer, null);\r\n isDirTop = util.getArrayIndex(childNodes, selection.focusNode) < util.getArrayIndex(childNodes, selection.anchorNode);\r\n }\r\n\r\n let rects = range.getClientRects();\r\n rects = rects[isDirTop ? 0 : rects.length - 1];\r\n\r\n const globalScroll = core.getGlobalScrollOffset();\r\n let scrollLeft = globalScroll.left;\r\n let scrollTop = globalScroll.top;\r\n\r\n const editorWidth = topArea.offsetWidth;\r\n const offsets = event._getEditorOffsets(null);\r\n const stickyTop = offsets.top;\r\n const editorLeft = offsets.left;\r\n \r\n toolbar.style.top = '-10000px';\r\n toolbar.style.visibility = 'hidden';\r\n toolbar.style.display = 'block';\r\n\r\n if (!rects) {\r\n const node = core.getSelectionNode();\r\n if (util.isFormatElement(node)) {\r\n const zeroWidth = util.createTextNode(util.zeroWidthSpace);\r\n core.insertNode(zeroWidth, null, false);\r\n core.setRange(zeroWidth, 1, zeroWidth, 1);\r\n core._editorRange();\r\n rects = core.getRange().getClientRects();\r\n rects = rects[isDirTop ? 0 : rects.length - 1];\r\n }\r\n\r\n if (!rects) {\r\n const nodeOffset = util.getOffset(node, context.element.wysiwygFrame);\r\n rects = {\r\n left: nodeOffset.left,\r\n top: nodeOffset.top,\r\n right: nodeOffset.left,\r\n bottom: nodeOffset.top + node.offsetHeight,\r\n noText: true\r\n };\r\n scrollLeft = 0;\r\n scrollTop = 0;\r\n }\r\n\r\n isDirTop = true;\r\n }\r\n\r\n const arrowMargin = _w.Math.round(context.element._arrow.offsetWidth / 2);\r\n const toolbarWidth = toolbar.offsetWidth;\r\n const toolbarHeight = toolbar.offsetHeight;\r\n const iframeRects = /iframe/i.test(context.element.wysiwygFrame.nodeName) ? context.element.wysiwygFrame.getClientRects()[0] : null;\r\n if (iframeRects) {\r\n rects = {\r\n left: rects.left + iframeRects.left,\r\n top: rects.top + iframeRects.top,\r\n right: rects.right + iframeRects.right - iframeRects.width,\r\n bottom: rects.bottom + iframeRects.bottom - iframeRects.height\r\n };\r\n }\r\n \r\n event._setToolbarOffset(isDirTop, rects, toolbar, editorLeft, editorWidth, scrollLeft, scrollTop, stickyTop, arrowMargin);\r\n if (toolbarWidth !== toolbar.offsetWidth || toolbarHeight !== toolbar.offsetHeight) {\r\n event._setToolbarOffset(isDirTop, rects, toolbar, editorLeft, editorWidth, scrollLeft, scrollTop, stickyTop, arrowMargin);\r\n }\r\n\r\n if (options.toolbarContainer) {\r\n const editorParent = topArea.parentElement;\r\n\r\n let container = options.toolbarContainer;\r\n let left = container.offsetLeft;\r\n let top = container.offsetTop;\r\n\r\n while(!container.parentElement.contains(editorParent) || !/^(BODY|HTML)$/i.test(container.parentElement.nodeName)) {\r\n container = container.offsetParent;\r\n left += container.offsetLeft;\r\n top += container.offsetTop;\r\n }\r\n\r\n toolbar.style.left = (toolbar.offsetLeft - left + topArea.offsetLeft) + 'px';\r\n toolbar.style.top = (toolbar.offsetTop - top + topArea.offsetTop) + 'px';\r\n }\r\n\r\n toolbar.style.visibility = '';\r\n },\r\n\r\n _setToolbarOffset: function (isDirTop, rects, toolbar, editorLeft, editorWidth, scrollLeft, scrollTop, stickyTop, arrowMargin) {\r\n const padding = 1;\r\n const toolbarWidth = toolbar.offsetWidth;\r\n const toolbarHeight = rects.noText && !isDirTop ? 0 : toolbar.offsetHeight;\r\n\r\n const absoluteLeft = (isDirTop ? rects.left : rects.right) - editorLeft - (toolbarWidth / 2) + scrollLeft;\r\n const overRight = absoluteLeft + toolbarWidth - editorWidth;\r\n \r\n let t = (isDirTop ? rects.top - toolbarHeight - arrowMargin : rects.bottom + arrowMargin) - (rects.noText ? 0 : stickyTop) + scrollTop;\r\n let l = absoluteLeft < 0 ? padding : overRight < 0 ? absoluteLeft : absoluteLeft - overRight - padding - 1;\r\n\r\n let resetTop = false;\r\n const space = t + (isDirTop ? (event._getEditorOffsets(null).top) : (toolbar.offsetHeight - context.element.wysiwyg.offsetHeight));\r\n if (!isDirTop && space > 0 && event._getPageBottomSpace() < space) {\r\n isDirTop = true;\r\n resetTop = true;\r\n } else if (isDirTop && _d.documentElement.offsetTop > space) {\r\n isDirTop = false;\r\n resetTop = true;\r\n }\r\n\r\n if (resetTop) t = (isDirTop ? rects.top - toolbarHeight - arrowMargin : rects.bottom + arrowMargin) - (rects.noText ? 0 : stickyTop) + scrollTop;\r\n\r\n toolbar.style.left = _w.Math.floor(l) + 'px';\r\n toolbar.style.top = _w.Math.floor(t) + 'px';\r\n\r\n if (isDirTop) {\r\n util.removeClass(context.element._arrow, 'se-arrow-up');\r\n util.addClass(context.element._arrow, 'se-arrow-down');\r\n context.element._arrow.style.top = toolbarHeight + 'px';\r\n } else {\r\n util.removeClass(context.element._arrow, 'se-arrow-down');\r\n util.addClass(context.element._arrow, 'se-arrow-up');\r\n context.element._arrow.style.top = -arrowMargin + 'px';\r\n }\r\n\r\n const arrow_left = _w.Math.floor((toolbarWidth / 2) + (absoluteLeft - l));\r\n context.element._arrow.style.left = (arrow_left + arrowMargin > toolbar.offsetWidth ? toolbar.offsetWidth - arrowMargin : arrow_left < arrowMargin ? arrowMargin : arrow_left) + 'px';\r\n },\r\n\r\n _showToolbarInline: function () {\r\n if (!core._isInline) return;\r\n\r\n const toolbar = context.element.toolbar;\r\n if (options.toolbarContainer) toolbar.style.position = 'relative';\r\n else toolbar.style.position = 'absolute';\r\n \r\n toolbar.style.visibility = 'hidden';\r\n toolbar.style.display = 'block';\r\n core._inlineToolbarAttr.width = toolbar.style.width = options.toolbarWidth;\r\n core._inlineToolbarAttr.top = toolbar.style.top = (options.toolbarContainer ? 0 : (-1 - toolbar.offsetHeight)) + 'px';\r\n \r\n if (typeof functions.showInline === 'function') functions.showInline(toolbar, context, core);\r\n\r\n event.onScroll_window();\r\n core._inlineToolbarAttr.isShow = true;\r\n toolbar.style.visibility = '';\r\n },\r\n\r\n _hideToolbar: function () {\r\n if (!core._notHideToolbar && !core._variable.isFullScreen) {\r\n context.element.toolbar.style.display = 'none';\r\n core._inlineToolbarAttr.isShow = false;\r\n }\r\n },\r\n\r\n onInput_wysiwyg: function (e) {\r\n if (core.isReadOnly || core.isDisabled) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n core.history.go(core.history.getCurrentIndex());\r\n return false;\r\n }\r\n\r\n core._editorRange();\r\n\r\n const data = (e.data === null ? '' : e.data === undefined ? ' ' : e.data) || ''; \r\n if (!core._charCount(data)) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return false;\r\n }\r\n\r\n // user event\r\n if (typeof functions.onInput === 'function' && functions.onInput(e, core) === false) return;\r\n\r\n // history stack\r\n core.history.push(true);\r\n },\r\n\r\n _isUneditableNode: function (range, isFront) {\r\n const container = isFront ? range.startContainer : range.endContainer;\r\n const offset = isFront ? range.startOffset : range.endOffset;\r\n const siblingKey = isFront ? 'previousSibling' : 'nextSibling';\r\n const isElement = container.nodeType === 1;\r\n let siblingNode;\r\n\r\n if (isElement) {\r\n siblingNode = event._isUneditableNode_getSibling(container.childNodes[offset], siblingKey, container);\r\n return siblingNode && siblingNode.nodeType === 1 && siblingNode.getAttribute('contenteditable') === 'false';\r\n } else {\r\n siblingNode = event._isUneditableNode_getSibling(container, siblingKey, container);\r\n return core.isEdgePoint(container, offset, isFront ? 'front' : 'end') && (siblingNode && siblingNode.nodeType === 1 && siblingNode.getAttribute('contenteditable') === 'false');\r\n }\r\n },\r\n\r\n _isUneditableNode_getSibling: function (selectNode, siblingKey, container) {\r\n if (!selectNode) return null;\r\n let siblingNode = selectNode[siblingKey];\r\n\r\n if (!siblingNode) {\r\n siblingNode = util.getFormatElement(container);\r\n siblingNode = siblingNode ? siblingNode[siblingKey] : null;\r\n if (siblingNode && !util.isComponent(siblingNode)) siblingNode = siblingKey === 'previousSibling' ? siblingNode.firstChild : siblingNode.lastChild;\r\n else return null;\r\n }\r\n\r\n return siblingNode;\r\n },\r\n\r\n _onShortcutKey: false,\r\n onKeyDown_wysiwyg: function (e) {\r\n let selectionNode = core.getSelectionNode();\r\n if (util.isInputElement(selectionNode)) return;\r\n\r\n const keyCode = e.keyCode;\r\n const shift = e.shiftKey;\r\n const ctrl = e.ctrlKey || e.metaKey || keyCode === 91 || keyCode === 92 || keyCode === 224;\r\n const alt = e.altKey;\r\n event._IEisComposing = keyCode === 229;\r\n\r\n if (!ctrl && core.isReadOnly && !event._cursorMoveKeyCode.test(keyCode)) {\r\n e.preventDefault();\r\n return false;\r\n }\r\n\r\n core.submenuOff();\r\n\r\n if (core._isBalloon) {\r\n event._hideToolbar();\r\n }\r\n\r\n // user event\r\n if (typeof functions.onKeyDown === 'function' && functions.onKeyDown(e, core) === false) return;\r\n\r\n /** Shortcuts */\r\n if (ctrl && event._shortcutCommand(keyCode, shift)) {\r\n event._onShortcutKey = true;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return false;\r\n } else if (event._onShortcutKey) {\r\n event._onShortcutKey = false;\r\n }\r\n\r\n /** default key action */\r\n const range = core.getRange();\r\n const selectRange = !range.collapsed || range.startContainer !== range.endContainer;\r\n const fileComponentName = core._fileManager.pluginRegExp.test(core.currentControllerName) ? core.currentControllerName : '';\r\n let formatEl = util.getFormatElement(selectionNode, null) || selectionNode;\r\n let rangeEl = util.getRangeFormatElement(formatEl, null);\r\n\r\n switch (keyCode) {\r\n case 8: /** backspace key */\r\n if (!selectRange) {\r\n if (fileComponentName) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n core.plugins[fileComponentName].destroy.call(core);\r\n break;\r\n }\r\n }\r\n\r\n if (selectRange && event._hardDelete()) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n break;\r\n }\r\n\r\n if (!util.isFormatElement(formatEl) && !context.element.wysiwyg.firstElementChild && !util.isComponent(selectionNode) && core._setDefaultFormat(options.defaultTag) !== null) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return false;\r\n }\r\n\r\n if (!selectRange && !formatEl.previousElementSibling && (range.startOffset === 0 && !selectionNode.previousSibling && !util.isListCell(formatEl) && \r\n (util.isFormatElement(formatEl) && (!util.isFreeFormatElement(formatEl) || util.isClosureFreeFormatElement(formatEl))))) {\r\n // closure range\r\n if (util.isClosureRangeFormatElement(formatEl.parentNode)) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return false;\r\n }\r\n // maintain default format\r\n if (util.isWysiwygDiv(formatEl.parentNode) && formatEl.childNodes.length <= 1 && (!formatEl.firstChild || util.onlyZeroWidthSpace(formatEl.textContent))) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n if (formatEl.nodeName.toUpperCase() === options.defaultTag.toUpperCase()) {\r\n formatEl.innerHTML = '
      ';\r\n const attrs = formatEl.attributes;\r\n while (attrs[0]) {\r\n formatEl.removeAttribute(attrs[0].name);\r\n }\r\n } else {\r\n const defaultFormat = util.createElement(options.defaultTag);\r\n defaultFormat.innerHTML = '
      ';\r\n formatEl.parentElement.replaceChild(defaultFormat, formatEl);\r\n }\r\n\r\n core.nativeFocus();\r\n return false;\r\n }\r\n }\r\n\r\n // clean remove tag\r\n const startCon = range.startContainer;\r\n if (formatEl && !formatEl.previousElementSibling && range.startOffset === 0 && startCon.nodeType === 3 && !util.isFormatElement(startCon.parentNode)) {\r\n let prev = startCon.parentNode.previousSibling;\r\n const next = startCon.parentNode.nextSibling;\r\n if (!prev) {\r\n if (!next) {\r\n prev = util.createElement('BR');\r\n formatEl.appendChild(prev);\r\n } else {\r\n prev = next;\r\n }\r\n }\r\n\r\n let con = startCon;\r\n while(formatEl.contains(con) && !con.previousSibling) {\r\n con = con.parentNode;\r\n }\r\n\r\n if (!formatEl.contains(con)) {\r\n startCon.textContent = '';\r\n util.removeItemAllParents(startCon, null, formatEl);\r\n break;\r\n }\r\n }\r\n\r\n // tag[contenteditable=\"false\"]\r\n if (event._isUneditableNode(range, true)) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n break;\r\n }\r\n\r\n // format attributes\r\n if (!selectRange && core._isEdgeFormat(range.startContainer, range.startOffset, 'start')) {\r\n if (util.isFormatElement(formatEl.previousElementSibling)) {\r\n core._formatAttrsTemp = formatEl.previousElementSibling.attributes;\r\n }\r\n }\r\n\r\n // nested list\r\n const commonCon = range.commonAncestorContainer;\r\n formatEl = util.getFormatElement(range.startContainer, null);\r\n rangeEl = util.getRangeFormatElement(formatEl, null);\r\n if (rangeEl && formatEl && !util.isCell(rangeEl) && !/^FIGCAPTION$/i.test(rangeEl.nodeName)) {\r\n if (util.isListCell(formatEl) && util.isList(rangeEl) && (util.isListCell(rangeEl.parentNode) || formatEl.previousElementSibling) && (selectionNode === formatEl || (selectionNode.nodeType === 3 && (!selectionNode.previousSibling || util.isList(selectionNode.previousSibling)))) &&\r\n (util.getFormatElement(range.startContainer, null) !== util.getFormatElement(range.endContainer, null) ? rangeEl.contains(range.startContainer) : (range.startOffset === 0 && range.collapsed))) {\r\n if (range.startContainer !== range.endContainer) {\r\n e.preventDefault();\r\n\r\n core.removeNode();\r\n if (range.startContainer.nodeType === 3) {\r\n core.setRange(range.startContainer, range.startContainer.textContent.length, range.startContainer, range.startContainer.textContent.length);\r\n }\r\n // history stack\r\n core.history.push(true);\r\n } else {\r\n let prev = formatEl.previousElementSibling || rangeEl.parentNode;\r\n if (util.isListCell(prev)) {\r\n e.preventDefault();\r\n\r\n let prevLast = prev;\r\n if (!prev.contains(formatEl) && util.isListCell(prevLast) && util.isList(prevLast.lastElementChild)) {\r\n prevLast = prevLast.lastElementChild.lastElementChild;\r\n while (util.isListCell(prevLast) && util.isList(prevLast.lastElementChild)) {\r\n prevLast = prevLast.lastElementChild && prevLast.lastElementChild.lastElementChild;\r\n }\r\n prev = prevLast;\r\n }\r\n\r\n let con = prev === rangeEl.parentNode ? rangeEl.previousSibling : prev.lastChild;\r\n if (!con) {\r\n con = util.createTextNode(util.zeroWidthSpace);\r\n rangeEl.parentNode.insertBefore(con, rangeEl.parentNode.firstChild);\r\n }\r\n const offset = con.nodeType === 3 ? con.textContent.length : 1;\r\n const children = formatEl.childNodes;\r\n let after = con;\r\n let child = children[0];\r\n while ((child = children[0])) {\r\n prev.insertBefore(child, after.nextSibling);\r\n after = child;\r\n }\r\n\r\n util.removeItem(formatEl);\r\n if (rangeEl.children.length === 0) util.removeItem(rangeEl);\r\n\r\n core.setRange(con, offset, con, offset);\r\n // history stack\r\n core.history.push(true);\r\n }\r\n }\r\n \r\n break;\r\n }\r\n\r\n // detach range\r\n if (!selectRange && range.startOffset === 0) {\r\n let detach = true;\r\n let comm = commonCon;\r\n while (comm && comm !== rangeEl && !util.isWysiwygDiv(comm)) {\r\n if (comm.previousSibling) {\r\n if (comm.previousSibling.nodeType === 1 || !util.onlyZeroWidthSpace(comm.previousSibling.textContent.trim())) {\r\n detach = false;\r\n break;\r\n }\r\n }\r\n comm = comm.parentNode;\r\n }\r\n \r\n if (detach && rangeEl.parentNode) {\r\n e.preventDefault();\r\n core.detachRangeFormatElement(rangeEl, (util.isListCell(formatEl) ? [formatEl] : null), null, false, false);\r\n // history stack\r\n core.history.push(true);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // component\r\n if (!selectRange && formatEl && (range.startOffset === 0 || (selectionNode === formatEl ? !!formatEl.childNodes[range.startOffset] : false))) {\r\n const sel = selectionNode === formatEl ? formatEl.childNodes[range.startOffset] : selectionNode;\r\n const prev = formatEl.previousSibling;\r\n // select file component\r\n const ignoreZWS = (commonCon.nodeType === 3 || util.isBreak(commonCon)) && !commonCon.previousSibling && range.startOffset === 0;\r\n if (sel && !sel.previousSibling && ( (commonCon && util.isComponent(commonCon.previousSibling)) || (ignoreZWS && util.isComponent(prev)))) {\r\n const fileComponentInfo = core.getFileComponent(prev);\r\n if (fileComponentInfo) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (formatEl.textContent.length === 0) util.removeItem(formatEl);\r\n if (core.selectComponent(fileComponentInfo.target, fileComponentInfo.pluginName) === false) core.blur();\r\n } else if (util.isComponent(prev)) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n util.removeItem(prev);\r\n }\r\n break;\r\n }\r\n // delete nonEditable\r\n if (sel && util.isNonEditable(sel.previousSibling)) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n util.removeItem(sel.previousSibling);\r\n break;\r\n }\r\n }\r\n\r\n break;\r\n case 46: /** delete key */\r\n if (fileComponentName) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n core.plugins[fileComponentName].destroy.call(core);\r\n break;\r\n }\r\n\r\n if (selectRange && event._hardDelete()) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n break;\r\n }\r\n\r\n // tag[contenteditable=\"false\"]\r\n if (event._isUneditableNode(range, false)) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n break;\r\n }\r\n\r\n // component\r\n if ((util.isFormatElement(selectionNode) || selectionNode.nextSibling === null || (util.onlyZeroWidthSpace(selectionNode.nextSibling) && selectionNode.nextSibling.nextSibling === null)) && range.startOffset === selectionNode.textContent.length) {\r\n const nextEl = formatEl.nextElementSibling;\r\n if (!nextEl) break;\r\n if (util.isComponent(nextEl)) {\r\n e.preventDefault();\r\n\r\n if (util.onlyZeroWidthSpace(formatEl)) {\r\n util.removeItem(formatEl);\r\n // table component\r\n if (util.isTable(nextEl)) {\r\n let cell = util.getChildElement(nextEl, util.isCell, false);\r\n cell = cell.firstElementChild || cell;\r\n core.setRange(cell, 0, cell, 0);\r\n break;\r\n }\r\n }\r\n\r\n // select file component\r\n const fileComponentInfo = core.getFileComponent(nextEl);\r\n if (fileComponentInfo) {\r\n e.stopPropagation();\r\n if (core.selectComponent(fileComponentInfo.target, fileComponentInfo.pluginName) === false) core.blur();\r\n } else if (util.isComponent(nextEl)) {\r\n e.stopPropagation();\r\n util.removeItem(nextEl);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n if (!selectRange && (core.isEdgePoint(range.endContainer, range.endOffset) || (selectionNode === formatEl ? !!formatEl.childNodes[range.startOffset] : false))) {\r\n const sel = selectionNode === formatEl ? formatEl.childNodes[range.startOffset] || selectionNode : selectionNode;\r\n // delete nonEditable\r\n if (sel && util.isNonEditable(sel.nextSibling)) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n util.removeItem(sel.nextSibling);\r\n break;\r\n } else if (util.isComponent(sel)) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n util.removeItem(sel);\r\n break;\r\n }\r\n }\r\n\r\n // format attributes\r\n if (!selectRange && core._isEdgeFormat(range.endContainer, range.endOffset, 'end')) {\r\n if (util.isFormatElement(formatEl.nextElementSibling)) {\r\n core._formatAttrsTemp = formatEl.attributes;\r\n }\r\n }\r\n\r\n // nested list\r\n formatEl = util.getFormatElement(range.startContainer, null);\r\n rangeEl = util.getRangeFormatElement(formatEl, null);\r\n if (util.isListCell(formatEl) && util.isList(rangeEl) && (selectionNode === formatEl || (selectionNode.nodeType === 3 && (!selectionNode.nextSibling || util.isList(selectionNode.nextSibling)) &&\r\n (util.getFormatElement(range.startContainer, null) !== util.getFormatElement(range.endContainer, null) ? rangeEl.contains(range.endContainer) : (range.endOffset === selectionNode.textContent.length && range.collapsed))))) {\r\n if (range.startContainer !== range.endContainer) core.removeNode();\r\n \r\n let next = util.getArrayItem(formatEl.children, util.isList, false);\r\n next = next || formatEl.nextElementSibling || rangeEl.parentNode.nextElementSibling;\r\n if (next && (util.isList(next) || util.getArrayItem(next.children, util.isList, false))) {\r\n e.preventDefault();\r\n\r\n let con, children;\r\n if (util.isList(next)) {\r\n const child = next.firstElementChild;\r\n children = child.childNodes;\r\n con = children[0];\r\n while (children[0]) {\r\n formatEl.insertBefore(children[0], next);\r\n }\r\n util.removeItem(child);\r\n } else {\r\n con = next.firstChild;\r\n children = next.childNodes;\r\n while (children[0]) {\r\n formatEl.appendChild(children[0]);\r\n }\r\n util.removeItem(next);\r\n }\r\n core.setRange(con, 0, con, 0);\r\n // history stack\r\n core.history.push(true);\r\n }\r\n break;\r\n }\r\n\r\n break;\r\n case 9: /** tab key */\r\n if (fileComponentName || options.tabDisable) break;\r\n e.preventDefault();\r\n if (ctrl || alt || util.isWysiwygDiv(selectionNode)) break;\r\n\r\n const isEdge = (!range.collapsed || core.isEdgePoint(range.startContainer, range.startOffset)); \r\n const selectedFormats = core.getSelectedElements(null);\r\n selectionNode = core.getSelectionNode();\r\n const cells = [];\r\n let lines = [];\r\n let fc = util.isListCell(selectedFormats[0]), lc = util.isListCell(selectedFormats[selectedFormats.length - 1]);\r\n let r = {sc: range.startContainer, so: range.startOffset, ec: range.endContainer, eo: range.endOffset};\r\n for (let i = 0, len = selectedFormats.length, f; i < len; i++) {\r\n f = selectedFormats[i];\r\n if (util.isListCell(f)) {\r\n if (!f.previousElementSibling && !shift) {\r\n continue;\r\n } else {\r\n cells.push(f);\r\n }\r\n } else {\r\n lines.push(f);\r\n }\r\n }\r\n \r\n // Nested list\r\n if (cells.length > 0 && isEdge && core.plugins.list) {\r\n r = core.plugins.list.editInsideList.call(core, shift, cells);\r\n } else {\r\n // table\r\n const tableCell = util.getParentElement(selectionNode, util.isCell);\r\n if (tableCell && isEdge) {\r\n const table = util.getParentElement(tableCell, 'table');\r\n const cells = util.getListChildren(table, util.isCell);\r\n let idx = shift ? util.prevIdx(cells, tableCell) : util.nextIdx(cells, tableCell);\r\n\r\n if (idx === cells.length && !shift) idx = 0;\r\n if (idx === -1 && shift) idx = cells.length - 1;\r\n\r\n let moveCell = cells[idx];\r\n if (!moveCell) break;\r\n moveCell = moveCell.firstElementChild || moveCell;\r\n core.setRange(moveCell, 0, moveCell, 0);\r\n break;\r\n }\r\n\r\n lines = lines.concat(cells);\r\n fc = lc = null;\r\n }\r\n\r\n // Lines tab(4)\r\n if (lines.length > 0) {\r\n if (!shift) {\r\n const tabText = util.createTextNode(new _w.Array(core._variable.tabSize + 1).join('\\u00A0'));\r\n if (lines.length === 1) {\r\n const textRange = core.insertNode(tabText, null, true);\r\n if (!textRange) return false;\r\n if (!fc) {\r\n r.sc = tabText;\r\n r.so = textRange.endOffset;\r\n }\r\n if (!lc) {\r\n r.ec = tabText;\r\n r.eo = textRange.endOffset;\r\n }\r\n } else {\r\n const len = lines.length - 1;\r\n for (let i = 0, child; i <= len; i++) {\r\n child = lines[i].firstChild;\r\n if (!child) continue;\r\n \r\n if (util.isBreak(child)) {\r\n lines[i].insertBefore(tabText.cloneNode(false), child);\r\n } else {\r\n child.textContent = tabText.textContent + child.textContent;\r\n }\r\n }\r\n \r\n const firstChild = util.getChildElement(lines[0], 'text', false);\r\n const endChild = util.getChildElement(lines[len], 'text', true);\r\n if (!fc && firstChild) {\r\n r.sc = firstChild;\r\n r.so = 0;\r\n }\r\n if (!lc && endChild) {\r\n r.ec = endChild;\r\n r.eo = endChild.textContent.length;\r\n }\r\n }\r\n } else {\r\n const len = lines.length - 1;\r\n for (let i = 0, line; i <= len; i++) {\r\n line = lines[i].childNodes;\r\n for (let c = 0, cLen = line.length, child; c < cLen; c++) {\r\n child = line[c];\r\n if (!child) break;\r\n if (util.onlyZeroWidthSpace(child)) continue;\r\n \r\n if (/^\\s{1,4}$/.test(child.textContent)) {\r\n util.removeItem(child);\r\n } else if (/^\\s{1,4}/.test(child.textContent)) {\r\n child.textContent = child.textContent.replace(/^\\s{1,4}/, '');\r\n }\r\n \r\n break;\r\n }\r\n }\r\n \r\n const firstChild = util.getChildElement(lines[0], 'text', false);\r\n const endChild = util.getChildElement(lines[len], 'text', true);\r\n if (!fc && firstChild) {\r\n r.sc = firstChild;\r\n r.so = 0;\r\n }\r\n if (!lc && endChild) {\r\n r.ec = endChild;\r\n r.eo = endChild.textContent.length;\r\n }\r\n }\r\n }\r\n\r\n core.setRange(r.sc, r.so, r.ec, r.eo);\r\n // history stack\r\n core.history.push(false);\r\n \r\n break;\r\n case 13: /** enter key */\r\n const freeFormatEl = util.getFreeFormatElement(selectionNode, null);\r\n\r\n if (core._charTypeHTML) {\r\n let enterHTML = '';\r\n if ((!shift && freeFormatEl) || shift) {\r\n enterHTML = '
      ';\r\n } else {\r\n enterHTML = '<' + formatEl.nodeName + '>
      ';\r\n }\r\n\r\n if (!core.checkCharCount(enterHTML, 'byte-html')) {\r\n e.preventDefault();\r\n return false;\r\n }\r\n }\r\n\r\n if (!shift) {\r\n const formatEndEdge = core._isEdgeFormat(range.endContainer, range.endOffset, 'end');\r\n const formatStartEdge = core._isEdgeFormat(range.startContainer, range.startOffset, 'start');\r\n\r\n // add default format line\r\n if (formatEndEdge && (/^H[1-6]$/i.test(formatEl.nodeName) || /^HR$/i.test(formatEl.nodeName))) {\r\n e.preventDefault();\r\n let temp = null;\r\n const newFormat = core.appendFormatTag(formatEl, options.defaultTag);\r\n\r\n if (formatEndEdge && formatEndEdge.length > 0) {\r\n temp = formatEndEdge.pop();\r\n const innerNode = temp;\r\n while(formatEndEdge.length > 0) {\r\n temp = temp.appendChild(formatEndEdge.pop());\r\n }\r\n newFormat.appendChild(innerNode);\r\n }\r\n\r\n temp = !temp ? newFormat.firstChild : temp.appendChild(newFormat.firstChild);\r\n core.setRange(temp, 0, temp, 0);\r\n break;\r\n } else if (rangeEl && formatEl && !util.isCell(rangeEl) && !/^FIGCAPTION$/i.test(rangeEl.nodeName)) {\r\n const range = core.getRange();\r\n if(core.isEdgePoint(range.endContainer, range.endOffset) && util.isList(selectionNode.nextSibling)) {\r\n e.preventDefault();\r\n const newEl = util.createElement('LI');\r\n const br = util.createElement('BR');\r\n newEl.appendChild(br);\r\n \r\n formatEl.parentNode.insertBefore(newEl, formatEl.nextElementSibling);\r\n newEl.appendChild(selectionNode.nextSibling);\r\n \r\n core.setRange(br, 1, br, 1);\r\n break;\r\n }\r\n \r\n if ((range.commonAncestorContainer.nodeType === 3 ? !range.commonAncestorContainer.nextElementSibling : true) && util.onlyZeroWidthSpace(formatEl.innerText.trim()) && !util.isListCell(formatEl.nextElementSibling)) {\r\n e.preventDefault();\r\n let newEl = null;\r\n \r\n if (util.isListCell(rangeEl.parentNode)) {\r\n rangeEl = formatEl.parentNode.parentNode.parentNode;\r\n newEl = util.splitElement(formatEl, null, util.getElementDepth(formatEl) - 2);\r\n if (!newEl) {\r\n const newListCell = util.createElement('LI');\r\n newListCell.innerHTML = '
      ';\r\n util.copyTagAttributes(newListCell, formatEl, options.lineAttrReset);\r\n rangeEl.insertBefore(newListCell, newEl);\r\n newEl = newListCell;\r\n }\r\n } else {\r\n const newFormat = util.isCell(rangeEl.parentNode) ? 'DIV' : util.isList(rangeEl.parentNode) ? 'LI' : (util.isFormatElement(rangeEl.nextElementSibling) && !util.isRangeFormatElement(rangeEl.nextElementSibling)) ? rangeEl.nextElementSibling.nodeName : (util.isFormatElement(rangeEl.previousElementSibling) && !util.isRangeFormatElement(rangeEl.previousElementSibling)) ? rangeEl.previousElementSibling.nodeName : options.defaultTag;\r\n newEl = util.createElement(newFormat);\r\n util.copyTagAttributes(newEl, formatEl, options.lineAttrReset);\r\n const edge = core.detachRangeFormatElement(rangeEl, [formatEl], null, true, true);\r\n edge.cc.insertBefore(newEl, edge.ec);\r\n }\r\n \r\n newEl.innerHTML = '
      ';\r\n util.removeItemAllParents(formatEl, null, null);\r\n core.setRange(newEl, 1, newEl, 1);\r\n break;\r\n }\r\n }\r\n\r\n if (freeFormatEl) {\r\n e.preventDefault();\r\n const selectionFormat = selectionNode === freeFormatEl;\r\n const wSelection = core.getSelection();\r\n const children = selectionNode.childNodes, offset = wSelection.focusOffset, prev = selectionNode.previousElementSibling, next = selectionNode.nextSibling;\r\n \r\n if (!util.isClosureFreeFormatElement(freeFormatEl) && !!children && ((selectionFormat && range.collapsed && children.length - 1 <= offset + 1 && util.isBreak(children[offset]) && (!children[offset + 1] || ((!children[offset + 2] || util.onlyZeroWidthSpace(children[offset + 2].textContent)) && children[offset + 1].nodeType === 3 && util.onlyZeroWidthSpace(children[offset + 1].textContent))) && offset > 0 && util.isBreak(children[offset - 1])) ||\r\n (!selectionFormat && util.onlyZeroWidthSpace(selectionNode.textContent) && util.isBreak(prev) && (util.isBreak(prev.previousSibling) || !util.onlyZeroWidthSpace(prev.previousSibling.textContent)) && (!next || (!util.isBreak(next) && util.onlyZeroWidthSpace(next.textContent)))))) {\r\n if (selectionFormat) util.removeItem(children[offset - 1]);\r\n else util.removeItem(selectionNode);\r\n const newEl = core.appendFormatTag(freeFormatEl, (util.isFormatElement(freeFormatEl.nextElementSibling) && !util.isRangeFormatElement(freeFormatEl.nextElementSibling)) ? freeFormatEl.nextElementSibling : null);\r\n util.copyFormatAttributes(newEl, freeFormatEl);\r\n core.setRange(newEl, 1, newEl, 1);\r\n break;\r\n }\r\n \r\n if (selectionFormat) {\r\n functions.insertHTML(((range.collapsed && util.isBreak(range.startContainer.childNodes[range.startOffset - 1])) ? '
      ' : '

      '), true, false);\r\n \r\n let focusNode = wSelection.focusNode;\r\n const wOffset = wSelection.focusOffset;\r\n if (freeFormatEl === focusNode) {\r\n focusNode = focusNode.childNodes[wOffset - offset > 1 ? wOffset - 1 : wOffset];\r\n }\r\n \r\n core.setRange(focusNode, 1, focusNode, 1);\r\n } else {\r\n const focusNext = wSelection.focusNode.nextSibling;\r\n const br = util.createElement('BR');\r\n core.insertNode(br, null, false);\r\n \r\n const brPrev = br.previousSibling, brNext = br.nextSibling;\r\n if (!util.isBreak(focusNext) && !util.isBreak(brPrev) && (!brNext || util.onlyZeroWidthSpace(brNext))) {\r\n br.parentNode.insertBefore(br.cloneNode(false), br);\r\n core.setRange(br, 1, br, 1);\r\n } else {\r\n core.setRange(brNext, 0, brNext, 0);\r\n }\r\n }\r\n \r\n event._onShortcutKey = true;\r\n break;\r\n }\r\n \r\n // set format attrs - edge\r\n if (range.collapsed && (formatStartEdge || formatEndEdge)) {\r\n e.preventDefault();\r\n const focusBR = util.createElement('BR');\r\n const newFormat = util.createElement(formatEl.nodeName);\r\n util.copyTagAttributes(newFormat, formatEl, options.lineAttrReset);\r\n\r\n let child = focusBR;\r\n do {\r\n if (!util.isBreak(selectionNode) && selectionNode.nodeType === 1) {\r\n const f = selectionNode.cloneNode(false);\r\n f.appendChild(child);\r\n child = f;\r\n }\r\n selectionNode = selectionNode.parentNode;\r\n } while(formatEl !== selectionNode && formatEl.contains(selectionNode));\r\n\r\n newFormat.appendChild(child);\r\n formatEl.parentNode.insertBefore(newFormat, formatStartEdge && !formatEndEdge ? formatEl : formatEl.nextElementSibling);\r\n if (formatEndEdge) {\r\n core.setRange(focusBR, 1, focusBR, 1);\r\n }\r\n \r\n break;\r\n }\r\n \r\n if (formatEl) {\r\n e.stopPropagation();\r\n\r\n let newEl;\r\n let offset = 0;\r\n if (!range.collapsed) {\r\n const isMultiLine = util.getFormatElement(range.startContainer, null) !== util.getFormatElement(range.endContainer, null);\r\n const newFormat = formatEl.cloneNode(false);\r\n newFormat.innerHTML = '
      ';\r\n const r = core.removeNode();\r\n newEl = util.getFormatElement(r.container, null);\r\n if (!newEl) {\r\n if (util.isWysiwygDiv(r.container)) {\r\n e.preventDefault();\r\n context.element.wysiwyg.appendChild(newFormat);\r\n newEl = newFormat;\r\n util.copyTagAttributes(newEl, formatEl, options.lineAttrReset);\r\n core.setRange(newEl, offset, newEl, offset);\r\n }\r\n break;\r\n }\r\n \r\n const innerRange = util.getRangeFormatElement(r.container);\r\n newEl = newEl.contains(innerRange) ? util.getChildElement(innerRange, util.getFormatElement.bind(util)) : newEl;\r\n if (isMultiLine) {\r\n if (formatEndEdge && !formatStartEdge) {\r\n newEl.parentNode.insertBefore(newFormat, (!r.prevContainer || r.container === r.prevContainer) ? newEl.nextElementSibling : newEl);\r\n newEl = newFormat;\r\n offset = 0;\r\n } else {\r\n offset = r.offset;\r\n if (formatStartEdge) {\r\n const tempEl = newEl.parentNode.insertBefore(newFormat, newEl);\r\n if (formatEndEdge) {\r\n newEl = tempEl;\r\n offset = 0;\r\n }\r\n }\r\n }\r\n } else {\r\n if (formatEndEdge && formatStartEdge) {\r\n newEl.parentNode.insertBefore(newFormat, (r.prevContainer && r.container === r.prevContainer) ? newEl.nextElementSibling : newEl);\r\n newEl = newFormat;\r\n offset = 0;\r\n } else {\r\n newEl = util.splitElement(r.container, r.offset, util.getElementDepth(formatEl));\r\n }\r\n }\r\n } else {\r\n if (util.onlyZeroWidthSpace(formatEl)) {\r\n newEl = core.appendFormatTag(formatEl, formatEl.cloneNode(false));\r\n } else {\r\n newEl = util.splitElement(range.endContainer, range.endOffset, util.getElementDepth(formatEl));\r\n }\r\n }\r\n\r\n e.preventDefault();\r\n util.copyTagAttributes(newEl, formatEl, options.lineAttrReset);\r\n core.setRange(newEl, offset, newEl, offset);\r\n\r\n break;\r\n }\r\n }\r\n\r\n if (selectRange) break;\r\n \r\n if (rangeEl && util.getParentElement(rangeEl, 'FIGCAPTION') && util.getParentElement(rangeEl, util.isList)) {\r\n e.preventDefault();\r\n formatEl = core.appendFormatTag(formatEl, null);\r\n core.setRange(formatEl, 0, formatEl, 0);\r\n }\r\n\r\n if (fileComponentName) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const compContext = context[fileComponentName];\r\n const container = compContext._container;\r\n const sibling = container.previousElementSibling || container.nextElementSibling;\r\n\r\n let newEl = null;\r\n if (util.isListCell(container.parentNode)) {\r\n newEl = util.createElement('BR');\r\n } else {\r\n newEl = util.createElement((util.isFormatElement(sibling) && !util.isRangeFormatElement(sibling)) ? sibling.nodeName : options.defaultTag);\r\n newEl.innerHTML = '
      ';\r\n }\r\n\r\n container.parentNode.insertBefore(newEl, container);\r\n \r\n core.callPlugin(fileComponentName, function () {\r\n if (core.selectComponent(compContext._element, fileComponentName) === false) core.blur();\r\n }, null);\r\n }\r\n \r\n break;\r\n case 27:\r\n if (fileComponentName) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n core.controllersOff();\r\n return false;\r\n }\r\n break;\r\n }\r\n\r\n if (shift && keyCode === 16) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const tablePlugin = core.plugins.table;\r\n if (tablePlugin && !tablePlugin._shift && !tablePlugin._ref) {\r\n const cell = util.getParentElement(formatEl, util.isCell);\r\n if (cell) {\r\n tablePlugin.onTableCellMultiSelect.call(core, cell, true);\r\n return;\r\n }\r\n }\r\n } else if (shift && (util.isOSX_IOS ? alt : ctrl) && keyCode === 32) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const nbsp = core.insertNode(util.createTextNode('\\u00a0'));\r\n if (nbsp && nbsp.container) {\r\n core.setRange(nbsp.container, nbsp.endOffset, nbsp.container, nbsp.endOffset);\r\n return;\r\n }\r\n }\r\n\r\n if (util.isIE && !ctrl && !alt && !selectRange && !event._nonTextKeyCode.test(keyCode) && util.isBreak(range.commonAncestorContainer)) {\r\n const zeroWidth = util.createTextNode(util.zeroWidthSpace);\r\n core.insertNode(zeroWidth, null, false);\r\n core.setRange(zeroWidth, 1, zeroWidth, 1);\r\n }\r\n\r\n if (event._directionKeyCode.test(keyCode)) {\r\n core._editorRange();\r\n event._applyTagEffects();\r\n }\r\n },\r\n\r\n onKeyUp_wysiwyg: function (e) {\r\n if (event._onShortcutKey) return;\r\n\r\n core._editorRange();\r\n const keyCode = e.keyCode;\r\n const ctrl = e.ctrlKey || e.metaKey || keyCode === 91 || keyCode === 92 || keyCode === 224;\r\n const alt = e.altKey;\r\n\r\n if (core.isReadOnly) {\r\n if (!ctrl && event._cursorMoveKeyCode.test(keyCode)) event._applyTagEffects();\r\n return;\r\n }\r\n\r\n const range = core.getRange();\r\n let selectionNode = core.getSelectionNode();\r\n\r\n if (core._isBalloon && ((core._isBalloonAlways && keyCode !== 27) || !range.collapsed)) {\r\n if (core._isBalloonAlways) {\r\n if (keyCode !== 27) event._showToolbarBalloonDelay();\r\n } else {\r\n event._showToolbarBalloon();\r\n return;\r\n }\r\n }\r\n\r\n /** when format tag deleted */\r\n if (keyCode === 8 && util.isWysiwygDiv(selectionNode) && selectionNode.textContent === '' && selectionNode.children.length === 0) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n selectionNode.innerHTML = '';\r\n\r\n const oFormatTag = util.createElement(util.isFormatElement(core._variable.currentNodes[0]) ? core._variable.currentNodes[0] : options.defaultTag);\r\n oFormatTag.innerHTML = '
      ';\r\n\r\n selectionNode.appendChild(oFormatTag);\r\n core.setRange(oFormatTag, 0, oFormatTag, 0);\r\n event._applyTagEffects();\r\n\r\n core.history.push(false);\r\n return;\r\n }\r\n\r\n const formatEl = util.getFormatElement(selectionNode, null);\r\n const rangeEl = util.getRangeFormatElement(selectionNode, null);\r\n const attrs = core._formatAttrsTemp;\r\n\r\n if (attrs) {\r\n for (let i = 0, len = attrs.length; i < len; i++) {\r\n if (keyCode === 13 && /^id$/i.test(attrs[i].name)) {\r\n formatEl.removeAttribute('id');\r\n continue;\r\n }\r\n formatEl.setAttribute(attrs[i].name, attrs[i].value);\r\n }\r\n core._formatAttrsTemp = null;\r\n }\r\n\r\n if (!formatEl && range.collapsed && !util.isComponent(selectionNode) && !util.isList(selectionNode) && core._setDefaultFormat(util.isRangeFormatElement(rangeEl) ? 'DIV' : options.defaultTag) !== null) {\r\n selectionNode = core.getSelectionNode();\r\n }\r\n\r\n const textKey = !ctrl && !alt && !event._nonTextKeyCode.test(keyCode);\r\n if (textKey && selectionNode.nodeType === 3 && util.zeroWidthRegExp.test(selectionNode.textContent) && !(e.isComposing !== undefined ? e.isComposing : event._IEisComposing)) {\r\n let so = range.startOffset, eo = range.endOffset;\r\n const frontZeroWidthCnt = (selectionNode.textContent.substring(0, eo).match(event._frontZeroWidthReg) || '').length;\r\n so = range.startOffset - frontZeroWidthCnt;\r\n eo = range.endOffset - frontZeroWidthCnt;\r\n selectionNode.textContent = selectionNode.textContent.replace(util.zeroWidthRegExp, '');\r\n core.setRange(selectionNode, so < 0 ? 0 : so, selectionNode, eo < 0 ? 0 : eo);\r\n }\r\n\r\n core._charCount('');\r\n\r\n // user event\r\n if (typeof functions.onKeyUp === 'function' && functions.onKeyUp(e, core) === false) return;\r\n\r\n // history stack\r\n if (!ctrl && !alt && !event._historyIgnoreKeyCode.test(keyCode)) {\r\n core.history.push(true);\r\n }\r\n },\r\n\r\n onScroll_wysiwyg: function (e) {\r\n core.controllersOff();\r\n if (core._isBalloon) event._hideToolbar();\r\n\r\n // user event\r\n if (typeof functions.onScroll === 'function') functions.onScroll(e, core);\r\n },\r\n\r\n onFocus_wysiwyg: function (e) {\r\n if (core._antiBlur) return;\r\n core.hasFocus = true;\r\n _w.setTimeout(event._applyTagEffects);\r\n \r\n if (core._isInline) event._showToolbarInline();\r\n\r\n // user event\r\n if (typeof functions.onFocus === 'function') functions.onFocus(e, core);\r\n },\r\n\r\n onBlur_wysiwyg: function (e) {\r\n if (core._antiBlur || core._variable.isCodeView) return;\r\n core.hasFocus = false;\r\n core.effectNode = null;\r\n core.controllersOff();\r\n if (core._isInline || core._isBalloon) event._hideToolbar();\r\n\r\n core._setKeyEffect([]);\r\n\r\n core._variable.currentNodes = [];\r\n core._variable.currentNodesMap = [];\r\n if (options.showPathLabel) context.element.navigation.textContent = '';\r\n // user event\r\n if (typeof functions.onBlur === 'function') functions.onBlur(e, core,this);\r\n },\r\n\r\n onMouseDown_resizingBar: function (e) {\r\n e.stopPropagation();\r\n\r\n core.submenuOff();\r\n core.controllersOff();\r\n\r\n core._variable.resizeClientY = e.clientY;\r\n context.element.resizeBackground.style.display = 'block';\r\n\r\n function closureFunc() {\r\n context.element.resizeBackground.style.display = 'none';\r\n _d.removeEventListener('mousemove', event._resize_editor);\r\n _d.removeEventListener('mouseup', closureFunc);\r\n }\r\n\r\n _d.addEventListener('mousemove', event._resize_editor);\r\n _d.addEventListener('mouseup', closureFunc);\r\n },\r\n\r\n _resize_editor: function (e) {\r\n const resizeInterval = context.element.editorArea.offsetHeight + (e.clientY - core._variable.resizeClientY);\r\n const h = (resizeInterval < core._variable.minResizingSize ? core._variable.minResizingSize : resizeInterval);\r\n context.element.wysiwygFrame.style.height = context.element.code.style.height = h + 'px';\r\n core._variable.resizeClientY = e.clientY;\r\n if (!util.isResizeObserverSupported) core.__callResizeFunction(h, null);\r\n },\r\n\r\n onResize_window: function () {\r\n if (!util.isResizeObserverSupported) core.resetResponsiveToolbar();\r\n\r\n const toolbar = context.element.toolbar;\r\n const isToolbarHidden = (toolbar.style.display === 'none' || (core._isInline && !core._inlineToolbarAttr.isShow));\r\n if (toolbar.offsetWidth === 0 && !isToolbarHidden) return;\r\n\r\n if (context.fileBrowser && context.fileBrowser.area.style.display === 'block') {\r\n context.fileBrowser.body.style.maxHeight = (_w.innerHeight - context.fileBrowser.header.offsetHeight - 50) + 'px';\r\n }\r\n\r\n if (core.submenuActiveButton && core.submenu) {\r\n core._setMenuPosition(core.submenuActiveButton, core.submenu);\r\n }\r\n\r\n if (core._variable.isFullScreen) {\r\n core._variable.innerHeight_fullScreen += (_w.innerHeight - toolbar.offsetHeight) - core._variable.innerHeight_fullScreen;\r\n context.element.editorArea.style.height = core._variable.innerHeight_fullScreen + 'px';\r\n return;\r\n }\r\n\r\n if (core._variable.isCodeView && core._isInline) {\r\n event._showToolbarInline();\r\n return;\r\n }\r\n \r\n core._iframeAutoHeight();\r\n\r\n if (core._sticky) {\r\n toolbar.style.width = (context.element.topArea.offsetWidth - 2) + 'px';\r\n event.onScroll_window();\r\n }\r\n },\r\n\r\n onScroll_window: function () {\r\n if (core._variable.isFullScreen || context.element.toolbar.offsetWidth === 0 || options.stickyToolbar < 0) return;\r\n\r\n const element = context.element;\r\n const editorHeight = element.editorArea.offsetHeight;\r\n const y = (this.scrollY || _d.documentElement.scrollTop) + options.stickyToolbar;\r\n const editorTop = event._getEditorOffsets(options.toolbarContainer).top - (core._isInline ? element.toolbar.offsetHeight : 0);\r\n const inlineOffset = core._isInline && (y - editorTop) > 0 ? y - editorTop - context.element.toolbar.offsetHeight : 0;\r\n \r\n if (y < editorTop) {\r\n event._offStickyToolbar();\r\n }\r\n else if (y + core._variable.minResizingSize >= editorHeight + editorTop) {\r\n if (!core._sticky) event._onStickyToolbar(inlineOffset);\r\n element.toolbar.style.top = (inlineOffset + editorHeight + editorTop + options.stickyToolbar - y - core._variable.minResizingSize) + 'px';\r\n }\r\n else if (y >= editorTop) {\r\n event._onStickyToolbar(inlineOffset);\r\n }\r\n },\r\n\r\n _getEditorOffsets: function (container) {\r\n let offsetEl = container || context.element.topArea;\r\n let t = 0, l = 0, s = 0;\r\n\r\n while (offsetEl) {\r\n t += offsetEl.offsetTop;\r\n l += offsetEl.offsetLeft;\r\n s += offsetEl.scrollTop;\r\n offsetEl = offsetEl.offsetParent;\r\n }\r\n\r\n return {\r\n top: t,\r\n left: l,\r\n scroll: s\r\n };\r\n },\r\n\r\n _getPageBottomSpace: function () {\r\n return _d.documentElement.scrollHeight - (event._getEditorOffsets(null).top + context.element.topArea.offsetHeight);\r\n },\r\n\r\n _onStickyToolbar: function (inlineOffset) {\r\n const element = context.element;\r\n\r\n if (!core._isInline && !options.toolbarContainer) {\r\n element._stickyDummy.style.height = element.toolbar.offsetHeight + 'px';\r\n element._stickyDummy.style.display = 'block';\r\n }\r\n\r\n element.toolbar.style.top = (options.stickyToolbar + inlineOffset) + 'px';\r\n element.toolbar.style.width = core._isInline ? core._inlineToolbarAttr.width : element.toolbar.offsetWidth + 'px';\r\n util.addClass(element.toolbar, 'se-toolbar-sticky');\r\n core._sticky = true;\r\n },\r\n\r\n _offStickyToolbar: function () {\r\n const element = context.element;\r\n\r\n element._stickyDummy.style.display = 'none';\r\n element.toolbar.style.top = core._isInline ? core._inlineToolbarAttr.top : '';\r\n element.toolbar.style.width = core._isInline ? core._inlineToolbarAttr.width : '';\r\n element.editorArea.style.marginTop = '';\r\n\r\n util.removeClass(element.toolbar, 'se-toolbar-sticky');\r\n core._sticky = false;\r\n },\r\n\r\n _codeViewAutoHeight: function () {\r\n if (core._variable.isFullScreen) return;\r\n context.element.code.style.height = context.element.code.scrollHeight + 'px';\r\n },\r\n\r\n // FireFox - table delete, Chrome - image, video, audio\r\n _hardDelete: function () {\r\n const range = core.getRange();\r\n const sc = range.startContainer;\r\n const ec = range.endContainer;\r\n \r\n // table\r\n const sCell = util.getRangeFormatElement(sc);\r\n const eCell = util.getRangeFormatElement(ec);\r\n const sIsCell = util.isCell(sCell);\r\n const eIsCell = util.isCell(eCell);\r\n const ancestor = range.commonAncestorContainer;\r\n if (((sIsCell && !sCell.previousElementSibling && !sCell.parentElement.previousElementSibling) || (eIsCell && !eCell.nextElementSibling && !eCell.parentElement.nextElementSibling)) && sCell !== eCell) {\r\n if (!sIsCell) {\r\n util.removeItem(util.getParentElement(eCell, function(current) {return ancestor === current.parentNode;}));\r\n } else if (!eIsCell) {\r\n util.removeItem(util.getParentElement(sCell, function(current) {return ancestor === current.parentNode;}));\r\n } else {\r\n util.removeItem(util.getParentElement(sCell, function(current) {return ancestor === current.parentNode;}));\r\n core.nativeFocus();\r\n return true;\r\n }\r\n }\r\n\r\n // component\r\n const sComp = sc.nodeType === 1 ? util.getParentElement(sc, '.se-component') : null;\r\n const eComp = ec.nodeType === 1 ? util.getParentElement(ec, '.se-component') : null;\r\n if (sComp) util.removeItem(sComp);\r\n if (eComp) util.removeItem(eComp);\r\n\r\n return false;\r\n },\r\n\r\n onPaste_wysiwyg: function (e) {\r\n const clipboardData = util.isIE ? _w.clipboardData : e.clipboardData;\r\n if (!clipboardData) return true;\r\n return event._dataTransferAction('paste', e, clipboardData);\r\n },\r\n\r\n _setClipboardComponent: function (e, info, clipboardData) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n clipboardData.setData('text/html', info.component.outerHTML);\r\n },\r\n\r\n onCopy_wysiwyg: function (e) {\r\n const clipboardData = util.isIE ? _w.clipboardData : e.clipboardData;\r\n \r\n // user event\r\n if (typeof functions.onCopy === 'function' && functions.onCopy(e, clipboardData, core) === false) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return false;\r\n }\r\n\r\n const info = core.currentFileComponentInfo;\r\n if (info && !util.isIE) {\r\n event._setClipboardComponent(e, info, clipboardData);\r\n util.addClass(info.component, 'se-component-copy');\r\n // copy effect\r\n _w.setTimeout(function () {\r\n util.removeClass(info.component, 'se-component-copy');\r\n }, 150);\r\n }\r\n },\r\n\r\n onSave_wysiwyg: function (content) {\r\n // user event\r\n if (typeof functions.onSave === 'function') {\r\n functions.onSave(content, core);\r\n return;\r\n }\r\n },\r\n\r\n onCut_wysiwyg: function (e) {\r\n const clipboardData = util.isIE ? _w.clipboardData : e.clipboardData;\r\n\r\n // user event\r\n if (typeof functions.onCut === 'function' && functions.onCut(e, clipboardData, core) === false) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return false;\r\n }\r\n\r\n const info = core.currentFileComponentInfo;\r\n if (info && !util.isIE) {\r\n event._setClipboardComponent(e, info, clipboardData);\r\n util.removeItem(info.component);\r\n core.controllersOff();\r\n }\r\n\r\n _w.setTimeout(function () {\r\n // history stack\r\n core.history.push(false);\r\n });\r\n },\r\n\r\n onDrop_wysiwyg: function (e) {\r\n if (core.isReadOnly || util.isIE) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return false;\r\n }\r\n\r\n const dataTransfer = e.dataTransfer;\r\n if (!dataTransfer) return true;\r\n\r\n core.removeNode();\r\n event._setDropLocationSelection(e);\r\n return event._dataTransferAction('drop', e, dataTransfer);\r\n },\r\n\r\n _setDropLocationSelection: function (e) {\r\n if (e.rangeParent) {\r\n core.setRange(e.rangeParent, e.rangeOffset, e.rangeParent, e.rangeOffset);\r\n } else if (core._wd.caretRangeFromPoint) {\r\n const r = core._wd.caretRangeFromPoint(e.clientX, e.clientY);\r\n core.setRange(r.startContainer, r.startOffset, r.endContainer, r.endOffset);\r\n } else {\r\n const r = core.getRange();\r\n core.setRange(r.startContainer, r.startOffset, r.endContainer, r.endOffset);\r\n }\r\n },\r\n\r\n _dataTransferAction: function (type, e, data) {\r\n let plainText, cleanData;\r\n if (util.isIE) {\r\n plainText = data.getData('Text');\r\n \r\n const range = core.getRange();\r\n const tempDiv = util.createElement('DIV');\r\n const tempRange = {\r\n sc: range.startContainer,\r\n so: range.startOffset,\r\n ec: range.endContainer,\r\n eo: range.endOffset\r\n };\r\n\r\n tempDiv.setAttribute('contenteditable', true);\r\n tempDiv.style.cssText = 'position:absolute; top:0; left:0; width:1px; height:1px; overflow:hidden;';\r\n \r\n context.element.relative.appendChild(tempDiv);\r\n tempDiv.focus();\r\n\r\n _w.setTimeout(function () {\r\n cleanData = tempDiv.innerHTML;\r\n util.removeItem(tempDiv);\r\n core.setRange(tempRange.sc, tempRange.so, tempRange.ec, tempRange.eo);\r\n event._setClipboardData(type, e, plainText, cleanData, data);\r\n });\r\n\r\n return true;\r\n } else {\r\n plainText = data.getData('text/plain');\r\n cleanData = data.getData('text/html');\r\n if (event._setClipboardData(type, e, plainText, cleanData, data) === false) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return false;\r\n }\r\n }\r\n },\r\n\r\n _setClipboardData: function (type, e, plainText, cleanData, data) {\r\n // MS word, OneNode, Excel\r\n const MSData = /class=[\"']*Mso(Normal|List)/i.test(cleanData) || /content=[\"']*Word.Document/i.test(cleanData) || /content=[\"']*OneNote.File/i.test(cleanData) || /content=[\"']*Excel.Sheet/i.test(cleanData);\r\n const onlyText = !cleanData;\r\n\r\n if (!onlyText) {\r\n cleanData = cleanData.replace(/^\\r?\\n?\\r?\\n?\\x3C!--StartFragment--\\>|\\x3C!--EndFragment-->\\r?\\n?<\\/body\\>\\r?\\n?<\\/html>$/g, '');\r\n if (MSData) {\r\n cleanData = cleanData.replace(/\\n/g, ' ');\r\n plainText = plainText.replace(/\\n/g, ' ');\r\n }\r\n cleanData = core.cleanHTML(cleanData, core.pasteTagsWhitelistRegExp, core.pasteTagsBlacklistRegExp);\r\n } else {\r\n cleanData = util._HTMLConvertor(plainText).replace(/\\n/g, '
      ');\r\n }\r\n\r\n const maxCharCount = core._charCount(core._charTypeHTML ? cleanData : plainText);\r\n // user event - paste\r\n if (type === 'paste' && typeof functions.onPaste === 'function') {\r\n const value = functions.onPaste(e, cleanData, maxCharCount, core);\r\n if (value === false) {\r\n return false;\r\n } else if (typeof value === 'string') {\r\n if (!value) return false;\r\n cleanData = value;\r\n }\r\n }\r\n // user event - drop\r\n if (type === 'drop' && typeof functions.onDrop === 'function') {\r\n const value = functions.onDrop(e, cleanData, maxCharCount, core);\r\n if (value === false) {\r\n return false;\r\n } else if (typeof value === 'string') {\r\n if (!value) return false;\r\n cleanData = value;\r\n }\r\n }\r\n\r\n // files\r\n const files = data.files;\r\n if (files.length > 0 && !MSData) {\r\n if (/^image/.test(files[0].type) && core.plugins.image) {\r\n functions.insertImage(files);\r\n }\r\n return false;\r\n }\r\n\r\n if (!maxCharCount) {\r\n return false;\r\n }\r\n\r\n if (cleanData) {\r\n functions.insertHTML(cleanData, true, false);\r\n return false;\r\n }\r\n },\r\n\r\n onMouseMove_wysiwyg: function (e) {\r\n if (core.isDisabled || core.isReadOnly) return false;\r\n const component = util.getParentElement(e.target, util.isComponent);\r\n const lineBreakerStyle = core._lineBreaker.style;\r\n \r\n if (component && !core.currentControllerName) {\r\n const ctxEl = context.element;\r\n let scrollTop = 0;\r\n let el = ctxEl.wysiwyg;\r\n do {\r\n scrollTop += el.scrollTop;\r\n el = el.parentElement;\r\n } while (el && !/^(BODY|HTML)$/i.test(el.nodeName));\r\n\r\n const wScroll = ctxEl.wysiwyg.scrollTop;\r\n const offsets = event._getEditorOffsets(null);\r\n const componentTop = util.getOffset(component, ctxEl.wysiwygFrame).top + wScroll;\r\n const y = e.pageY + scrollTop + (options.iframe && !options.toolbarContainer ? ctxEl.toolbar.offsetHeight : 0);\r\n const c = componentTop + (options.iframe ? scrollTop : offsets.top);\r\n\r\n const isList = util.isListCell(component.parentNode);\r\n let dir = '', top = '';\r\n if ((isList ? !component.previousSibling : !util.isFormatElement(component.previousElementSibling)) && y < (c + 20)) {\r\n top = componentTop;\r\n dir = 't';\r\n } else if ((isList ? !component.nextSibling : !util.isFormatElement(component.nextElementSibling)) && y > (c + component.offsetHeight - 20)) {\r\n top = componentTop + component.offsetHeight;\r\n dir = 'b';\r\n } else {\r\n lineBreakerStyle.display = 'none';\r\n return;\r\n }\r\n\r\n core._variable._lineBreakComp = component;\r\n core._variable._lineBreakDir = dir;\r\n lineBreakerStyle.top = (top - wScroll) + 'px';\r\n core._lineBreakerButton.style.left = (util.getOffset(component).left + (component.offsetWidth / 2) - 15) + 'px';\r\n lineBreakerStyle.display = 'block';\r\n } // off line breaker\r\n else if (lineBreakerStyle.display !== 'none') {\r\n lineBreakerStyle.display = 'none';\r\n }\r\n },\r\n\r\n _onMouseDown_lineBreak: function (e) {\r\n e.preventDefault();\r\n },\r\n\r\n _onLineBreak: function (e) {\r\n e.preventDefault();\r\n \r\n const component = core._variable._lineBreakComp;\r\n const dir = !this ? core._variable._lineBreakDir : this;\r\n const isList = util.isListCell(component.parentNode);\r\n\r\n const format = util.createElement(isList ? 'BR' : util.isCell(component.parentNode) ? 'DIV' : options.defaultTag);\r\n if (!isList) format.innerHTML = '
      ';\r\n\r\n if (core._charTypeHTML && !core.checkCharCount(format.outerHTML, 'byte-html')) return;\r\n\r\n component.parentNode.insertBefore(format, dir === 't' ? component : component.nextSibling);\r\n core._lineBreaker.style.display = 'none';\r\n core._variable._lineBreakComp = null;\r\n\r\n const focusEl = isList ? format : format.firstChild;\r\n core.setRange(focusEl, 1, focusEl, 1);\r\n // history stack\r\n core.history.push(false);\r\n },\r\n\r\n _resizeObserver: null,\r\n _toolbarObserver: null,\r\n _addEvent: function () {\r\n const eventWysiwyg = options.iframe ? core._ww : context.element.wysiwyg;\r\n if (util.isResizeObserverSupported) {\r\n this._resizeObserver = new _w.ResizeObserver(function(entries) {\r\n core.__callResizeFunction(-1, entries[0]);\r\n });\r\n }\r\n\r\n /** toolbar event */\r\n context.element.toolbar.addEventListener('mousedown', event._buttonsEventHandler, false);\r\n context.element._menuTray.addEventListener('mousedown', event._buttonsEventHandler, false);\r\n context.element.toolbar.addEventListener('click', event.onClick_toolbar, false);\r\n /** editor area */\r\n eventWysiwyg.addEventListener('mousedown', event.onMouseDown_wysiwyg, false);\r\n eventWysiwyg.addEventListener('click', event.onClick_wysiwyg, false);\r\n eventWysiwyg.addEventListener(util.isIE ? 'textinput' : 'input', event.onInput_wysiwyg, false);\r\n eventWysiwyg.addEventListener('keydown', event.onKeyDown_wysiwyg, false);\r\n eventWysiwyg.addEventListener('keyup', event.onKeyUp_wysiwyg, false);\r\n eventWysiwyg.addEventListener('paste', event.onPaste_wysiwyg, false);\r\n eventWysiwyg.addEventListener('copy', event.onCopy_wysiwyg, false);\r\n eventWysiwyg.addEventListener('cut', event.onCut_wysiwyg, false);\r\n eventWysiwyg.addEventListener('drop', event.onDrop_wysiwyg, false);\r\n eventWysiwyg.addEventListener('scroll', event.onScroll_wysiwyg, false);\r\n eventWysiwyg.addEventListener('focus', event.onFocus_wysiwyg, false);\r\n eventWysiwyg.addEventListener('blur', event.onBlur_wysiwyg, false);\r\n\r\n /** line breaker */\r\n event._lineBreakerBind = { a: event._onLineBreak.bind(''), t: event._onLineBreak.bind('t'), b: event._onLineBreak.bind('b') };\r\n eventWysiwyg.addEventListener('mousemove', event.onMouseMove_wysiwyg, false);\r\n core._lineBreakerButton.addEventListener('mousedown', event._onMouseDown_lineBreak, false);\r\n core._lineBreakerButton.addEventListener('click', event._lineBreakerBind.a, false);\r\n context.element.lineBreaker_t.addEventListener('mousedown', event._lineBreakerBind.t, false);\r\n context.element.lineBreaker_b.addEventListener('mousedown', event._lineBreakerBind.b, false);\r\n\r\n /** Events are registered mobile. */\r\n eventWysiwyg.addEventListener('touchstart', event.onMouseDown_wysiwyg, {passive: true, useCapture: false});\r\n eventWysiwyg.addEventListener('touchend', event.onClick_wysiwyg, {passive: true, useCapture: false});\r\n \r\n /** code view area auto line */\r\n if (options.height === 'auto' && !options.codeMirrorEditor) {\r\n context.element.code.addEventListener('keydown', event._codeViewAutoHeight, false);\r\n context.element.code.addEventListener('keyup', event._codeViewAutoHeight, false);\r\n context.element.code.addEventListener('paste', event._codeViewAutoHeight, false);\r\n }\r\n\r\n /** resizingBar */\r\n if (context.element.resizingBar) {\r\n if (/\\d+/.test(options.height) && options.resizeEnable) {\r\n context.element.resizingBar.addEventListener('mousedown', event.onMouseDown_resizingBar, false);\r\n } else {\r\n util.addClass(context.element.resizingBar, 'se-resizing-none');\r\n }\r\n }\r\n \r\n /** set response toolbar */\r\n event._setResponsiveToolbar();\r\n\r\n /** responsive toolbar observer */\r\n if (util.isResizeObserverSupported) this._toolbarObserver = new _w.ResizeObserver(core.resetResponsiveToolbar);\r\n \r\n /** window event */\r\n _w.addEventListener('resize', event.onResize_window, false);\r\n if (options.stickyToolbar > -1) {\r\n _w.addEventListener('scroll', event.onScroll_window, false);\r\n }\r\n },\r\n\r\n _removeEvent: function () {\r\n const eventWysiwyg = options.iframe ? core._ww : context.element.wysiwyg;\r\n\r\n context.element.toolbar.removeEventListener('mousedown', event._buttonsEventHandler);\r\n context.element._menuTray.removeEventListener('mousedown', event._buttonsEventHandler);\r\n context.element.toolbar.removeEventListener('click', event.onClick_toolbar);\r\n\r\n eventWysiwyg.removeEventListener('mousedown', event.onMouseDown_wysiwyg);\r\n eventWysiwyg.removeEventListener('click', event.onClick_wysiwyg);\r\n eventWysiwyg.removeEventListener(util.isIE ? 'textinput' : 'input', event.onInput_wysiwyg);\r\n eventWysiwyg.removeEventListener('keydown', event.onKeyDown_wysiwyg);\r\n eventWysiwyg.removeEventListener('keyup', event.onKeyUp_wysiwyg);\r\n eventWysiwyg.removeEventListener('paste', event.onPaste_wysiwyg);\r\n eventWysiwyg.removeEventListener('copy', event.onCopy_wysiwyg);\r\n eventWysiwyg.removeEventListener('cut', event.onCut_wysiwyg);\r\n eventWysiwyg.removeEventListener('drop', event.onDrop_wysiwyg);\r\n eventWysiwyg.removeEventListener('scroll', event.onScroll_wysiwyg);\r\n\r\n eventWysiwyg.removeEventListener('mousemove', event.onMouseMove_wysiwyg);\r\n core._lineBreakerButton.removeEventListener('mousedown', event._onMouseDown_lineBreak);\r\n core._lineBreakerButton.removeEventListener('click', event._lineBreakerBind.a);\r\n context.element.lineBreaker_t.removeEventListener('mousedown', event._lineBreakerBind.t);\r\n context.element.lineBreaker_b.removeEventListener('mousedown', event._lineBreakerBind.b);\r\n event._lineBreakerBind = null;\r\n \r\n eventWysiwyg.removeEventListener('touchstart', event.onMouseDown_wysiwyg, {passive: true, useCapture: false});\r\n eventWysiwyg.removeEventListener('touchend', event.onClick_wysiwyg, {passive: true, useCapture: false});\r\n eventWysiwyg.removeEventListener('focus', event.onFocus_wysiwyg);\r\n eventWysiwyg.removeEventListener('blur', event.onBlur_wysiwyg);\r\n\r\n context.element.code.removeEventListener('keydown', event._codeViewAutoHeight);\r\n context.element.code.removeEventListener('keyup', event._codeViewAutoHeight);\r\n context.element.code.removeEventListener('paste', event._codeViewAutoHeight);\r\n \r\n if (context.element.resizingBar) {\r\n context.element.resizingBar.removeEventListener('mousedown', event.onMouseDown_resizingBar);\r\n }\r\n \r\n if (event._resizeObserver) {\r\n event._resizeObserver.unobserve(context.element.wysiwygFrame);\r\n event._resizeObserver = null;\r\n }\r\n\r\n if (event._toolbarObserver) {\r\n event._toolbarObserver.unobserve(context.element._toolbarShadow);\r\n event._toolbarObserver = null;\r\n }\r\n\r\n _w.removeEventListener('resize', event.onResize_window);\r\n _w.removeEventListener('scroll', event.onScroll_window);\r\n },\r\n\r\n _setResponsiveToolbar: function () {\r\n if (_responsiveButtons.length === 0) {\r\n _responsiveButtons = null;\r\n return;\r\n }\r\n\r\n event._responsiveCurrentSize = 'default';\r\n const sizeArray = event._responsiveButtonSize = [];\r\n const buttonsObj = event._responsiveButtons = {default: _responsiveButtons[0]};\r\n for (let i = 1, len = _responsiveButtons.length, size, buttonGroup; i < len; i++) {\r\n buttonGroup = _responsiveButtons[i];\r\n size = buttonGroup[0] * 1;\r\n sizeArray.push(size);\r\n buttonsObj[size] = buttonGroup[1];\r\n }\r\n\r\n sizeArray.sort(function (a, b) { return a - b; }).unshift('default');\r\n }\r\n };\r\n\r\n /** functions */\r\n const functions = {\r\n /**\r\n * @description Core, Util object\r\n */\r\n core: core,\r\n util: util,\r\n\r\n /**\r\n * @description Event functions\r\n * @param {Object} e Event Object\r\n * @param {Object} core Core object\r\n */\r\n onload: null,\r\n onScroll: null,\r\n onMouseDown: null,\r\n onClick: null,\r\n onInput: null,\r\n onKeyDown: null,\r\n onKeyUp: null,\r\n onCopy: null,\r\n onCut: null,\r\n onFocus: null,\r\n \r\n /**\r\n * @description Event functions\r\n * @param {Object} e Event Object\r\n * @param {Object} core Core object\r\n * @param {String} contents Current contents\r\n */\r\n onBlur: null,\r\n\r\n /**\r\n * @description Event functions\r\n * @param {String} contents Current contents\r\n * @param {Object} core Core object\r\n */\r\n onChange: null,\r\n\r\n /**\r\n * @description Event functions\r\n * @param {String} contents Current contents\r\n * @param {Object} core Core object\r\n */\r\n onSave: null,\r\n\r\n /**\r\n * @description Event functions (drop, paste)\r\n * When false is returned, the default behavior is stopped.\r\n * If the string is returned, the cleanData value is modified to the return value.\r\n * @param {Object} e Event object.\r\n * @param {String} cleanData HTML string modified for editor format.\r\n * @param {Boolean} maxChartCount option (true if max character is exceeded)\r\n * @param {Object} core Core object\r\n * @returns {Boolean|String}\r\n */\r\n onDrop: null,\r\n onPaste: null,\r\n\r\n /**\r\n * @description Called just before the inline toolbar is positioned and displayed on the screen.\r\n * @param {Element} toolbar Toolbar Element\r\n * @param {Object} context The editor's context object (editor.getContext())\r\n * @param {Object} core Core object\r\n */\r\n showInline: null,\r\n\r\n /**\r\n * @description Called just after the controller is positioned and displayed on the screen.\r\n * controller - editing elements displayed on the screen [image resizing, table editor, link editor..]]\r\n * @param {String} name The name of the plugin that called the controller\r\n * @param {Array} controllers Array of Controller elements\r\n * @param {Object} core Core object\r\n */\r\n showController: null,\r\n\r\n /**\r\n * @description An event when toggling between code view and wysiwyg view.\r\n * @param {Boolean} isCodeView Whether the current code view mode\r\n * @param {Object} core Core object\r\n */\r\n toggleCodeView: null,\r\n\r\n /**\r\n * @description An event when toggling full screen.\r\n * @param {Boolean} isFullScreen Whether the current full screen mode\r\n * @param {Object} core Core object\r\n */\r\n toggleFullScreen: null,\r\n\r\n /**\r\n * @description It replaces the default callback function of the image upload\r\n * @param {Object} response Response object\r\n * @param {Object} info Input information\r\n * - linkValue: Link url value\r\n * - linkNewWindow: Open in new window Check Value\r\n * - inputWidth: Value of width input\r\n * - inputHeight: Value of height input\r\n * - align: Align Check Value\r\n * - isUpdate: Update image if true, create image if false\r\n * - element: If isUpdate is true, the currently selected image.\r\n * @param {Object} core Core object\r\n */\r\n imageUploadHandler: null,\r\n\r\n /**\r\n * @description It replaces the default callback function of the video upload\r\n * @param xmlHttp xmlHttpRequest object\r\n * @param info Input information\r\n * - inputWidth: Value of width input\r\n * - inputHeight: Value of height input\r\n * - align: Align Check Value\r\n * - isUpdate: Update video if true, create video if false\r\n * - element: If isUpdate is true, the currently selected video.\r\n * @param core Core object\r\n */\r\n videoUploadHandler: null,\r\n\r\n /**\r\n * @description It replaces the default callback function of the audio upload\r\n * @param xmlHttp xmlHttpRequest object\r\n * @param info Input information\r\n * - isUpdate: Update audio if true, create audio if false\r\n * - element: If isUpdate is true, the currently selected audio.\r\n * @param core Core object\r\n */\r\n audioUploadHandler: null,\r\n\r\n /**\r\n * @description Called before the image is uploaded\r\n * If true is returned, the internal upload process runs normally.\r\n * If false is returned, no image upload is performed.\r\n * If new fileList are returned, replaced the previous fileList\r\n * If undefined is returned, it waits until \"uploadHandler\" is executed.\r\n * @param {Array} files Files array\r\n * @param {Object} info info: {\r\n * - linkValue: Link url value\r\n * - linkNewWindow: Open in new window Check Value\r\n * - inputWidth: Value of width input\r\n * - inputHeight: Value of height input\r\n * - align: Align Check Value\r\n * - isUpdate: Update image if true, create image if false\r\n * - element: If isUpdate is true, the currently selected image.\r\n * }\r\n * @param {Object} core Core object\r\n * @param {Function} uploadHandler If undefined is returned, it waits until \"uploadHandler\" is executed.\r\n * \"uploadHandler\" is an upload function with \"core\" and \"info\" bound.\r\n * [upload files] : uploadHandler(files or [new File(...),])\r\n * [error] : uploadHandler(\"Error message\")\r\n * [Just finish] : uploadHandler()\r\n * [directly register] : uploadHandler(response) // Same format as \"imageUploadUrl\" response\r\n * ex) {\r\n * // \"errorMessage\": \"insert error message\",\r\n * \"result\": [ { \"url\": \"...\", \"name\": \"...\", \"size\": \"999\" }, ]\r\n * }\r\n * @returns {Boolean|Array|undefined}\r\n */\r\n onImageUploadBefore: null,\r\n /**\r\n * @description Called before the video is uploaded\r\n * If true is returned, the internal upload process runs normally.\r\n * If false is returned, no video(iframe, video) upload is performed.\r\n * If new fileList are returned, replaced the previous fileList\r\n * If undefined is returned, it waits until \"uploadHandler\" is executed.\r\n * @param {Array} files Files array\r\n * @param {Object} info info: {\r\n * - inputWidth: Value of width input\r\n * - inputHeight: Value of height input\r\n * - align: Align Check Value\r\n * - isUpdate: Update video if true, create video if false\r\n * - element: If isUpdate is true, the currently selected video.\r\n * }\r\n * @param {Object} core Core object\r\n * @param {Function} uploadHandler If undefined is returned, it waits until \"uploadHandler\" is executed.\r\n * \"uploadHandler\" is an upload function with \"core\" and \"info\" bound.\r\n * [upload files] : uploadHandler(files or [new File(...),])\r\n * [error] : uploadHandler(\"Error message\")\r\n * [Just finish] : uploadHandler()\r\n * [directly register] : uploadHandler(response) // Same format as \"videoUploadUrl\" response\r\n * ex) {\r\n * // \"errorMessage\": \"insert error message\",\r\n * \"result\": [ { \"url\": \"...\", \"name\": \"...\", \"size\": \"999\" }, ]\r\n * }\r\n * @returns {Boolean|Array|undefined}\r\n */\r\n onVideoUploadBefore: null,\r\n /**\r\n * @description Called before the audio is uploaded\r\n * If true is returned, the internal upload process runs normally.\r\n * If false is returned, no audio upload is performed.\r\n * If new fileList are returned, replaced the previous fileList\r\n * If undefined is returned, it waits until \"uploadHandler\" is executed.\r\n * @param {Array} files Files array\r\n * @param {Object} info info: {\r\n * - isUpdate: Update audio if true, create audio if false\r\n * - element: If isUpdate is true, the currently selected audio.\r\n * }\r\n * @param {Object} core Core object\r\n * @param {Function} uploadHandler If undefined is returned, it waits until \"uploadHandler\" is executed.\r\n * \"uploadHandler\" is an upload function with \"core\" and \"info\" bound.\r\n * [upload files] : uploadHandler(files or [new File(...),])\r\n * [error] : uploadHandler(\"Error message\")\r\n * [Just finish] : uploadHandler()\r\n * [directly register] : uploadHandler(response) // Same format as \"audioUploadUrl\" response\r\n * ex) {\r\n * // \"errorMessage\": \"insert error message\",\r\n * \"result\": [ { \"url\": \"...\", \"name\": \"...\", \"size\": \"999\" }, ]\r\n * }\r\n * @returns {Boolean|Array|undefined}\r\n */\r\n onAudioUploadBefore: null,\r\n\r\n /**\r\n * @description Called when the image is uploaded, updated, deleted\r\n * @param {Element} targetElement Target element\r\n * @param {Number} index Uploaded index\r\n * @param {String} state Upload status ('create', 'update', 'delete')\r\n * @param {Object} info Image info object\r\n * - index: data index\r\n * - name: file name\r\n * - size: file size\r\n * - select: select function\r\n * - delete: delete function\r\n * - element: target element\r\n * - src: src attribute of tag\r\n * @param {Number} remainingFilesCount Count of remaining files to upload (0 when added as a url)\r\n * @param {Object} core Core object\r\n */\r\n onImageUpload: null,\r\n /**\r\n * @description Called when the video(iframe, video) is is uploaded, updated, deleted\r\n * -- arguments is same \"onImageUpload\" --\r\n */\r\n onVideoUpload: null,\r\n /**\r\n * @description Called when the audio is is uploaded, updated, deleted\r\n * -- arguments is same \"onImageUpload\" --\r\n */\r\n onAudioUpload: null,\r\n\r\n /**\r\n * @description Called when the image is upload failed\r\n * @param {String} errorMessage Error message\r\n * @param {Object} result Response Object\r\n * @param {Object} core Core object\r\n * @returns {Boolean}\r\n */\r\n onImageUploadError: null,\r\n /**\r\n * @description Called when the video(iframe, video) upload failed\r\n * -- arguments is same \"onImageUploadError\" --\r\n */\r\n onVideoUploadError: null,\r\n /**\r\n * @description Called when the audio upload failed\r\n * -- arguments is same \"onImageUploadError\" --\r\n */\r\n onAudioUploadError: null,\r\n\r\n /**\r\n * @description Called when the editor is resized using the bottom bar\r\n */\r\n onResizeEditor: null,\r\n\r\n /**\r\n * @description Called after the \"setToolbarButtons\" invocation.\r\n * Can be used to tweak buttons properties (useful for custom buttons)\r\n * @param {Array} buttonList Button list \r\n * @param {Object} core Core object\r\n */\r\n onSetToolbarButtons: null,\r\n\r\n /**\r\n * @description Reset the buttons on the toolbar. (Editor is not reloaded)\r\n * You cannot set a new plugin for the button.\r\n * @param {Array} buttonList Button list \r\n */\r\n setToolbarButtons: function (buttonList) {\r\n core.submenuOff();\r\n core.containerOff();\r\n core.moreLayerOff();\r\n \r\n const newToolbar = _Constructor._createToolBar(_d, buttonList, core.plugins, options);\r\n _responsiveButtons = newToolbar.responsiveButtons;\r\n event._setResponsiveToolbar();\r\n\r\n context.element.toolbar.replaceChild(newToolbar._buttonTray, context.element._buttonTray);\r\n const newContext = _Context(context.element.originElement, core._getConstructed(context.element), options);\r\n\r\n context.element = newContext.element;\r\n context.tool = newContext.tool;\r\n if (options.iframe) context.element.wysiwyg = core._wd.body;\r\n\r\n core._recoverButtonStates();\r\n core._cachingButtons();\r\n core.history._resetCachingButton();\r\n\r\n core.effectNode = null;\r\n if (core.hasFocus) event._applyTagEffects();\r\n if (core.isReadOnly) util.setDisabledButtons(true, core.resizingDisabledButtons);\r\n if (typeof functions.onSetToolbarButtons === 'function') functions.onSetToolbarButtons(newToolbar._buttonTray.querySelectorAll('button'), core);\r\n },\r\n\r\n /**\r\n * @description Add or reset option property (Editor is reloaded)\r\n * @param {Object} _options Options\r\n */\r\n setOptions: function (_options) {\r\n event._removeEvent();\r\n core._resetComponents();\r\n \r\n util.removeClass(core._styleCommandMap.showBlocks, 'active');\r\n util.removeClass(core._styleCommandMap.codeView, 'active');\r\n core._variable.isCodeView = false;\r\n core._iframeAuto = null;\r\n\r\n core.plugins = _options.plugins || core.plugins;\r\n const mergeOptions = [options, _options].reduce(function (init, option) {\r\n for (let key in option) {\r\n if (!util.hasOwn(option, key)) continue;\r\n if (key === 'plugins' && option[key] && init[key]) {\r\n let i = init[key], o = option[key];\r\n i = i.length ? i : _w.Object.keys(i).map(function(name) { return i[name]; });\r\n o = o.length ? o : _w.Object.keys(o).map(function(name) { return o[name]; });\r\n init[key] = (o.filter(function(val) { return i.indexOf(val) === -1; })).concat(i);\r\n } else {\r\n init[key] = option[key];\r\n }\r\n }\r\n return init;\r\n }, {});\r\n\r\n const el = context.element;\r\n const _initHTML = el.wysiwyg.innerHTML;\r\n\r\n // set option\r\n const cons = _Constructor._setOptions(mergeOptions, context, options);\r\n\r\n if (cons.callButtons) {\r\n pluginCallButtons = cons.callButtons;\r\n core.initPlugins = {};\r\n }\r\n\r\n if (cons.plugins) {\r\n core.plugins = plugins = cons.plugins;\r\n }\r\n\r\n // reset context\r\n if (el._menuTray.children.length === 0) this._menuTray = {};\r\n _responsiveButtons = cons.toolbar.responsiveButtons;\r\n core.options = options = mergeOptions;\r\n core.lang = lang = options.lang;\r\n\r\n if (options.iframe) {\r\n el.wysiwygFrame.addEventListener('load', function () {\r\n util._setIframeDocument(this, options);\r\n core._setOptionsInit(el, _initHTML);\r\n });\r\n }\r\n\r\n el.editorArea.appendChild(el.wysiwygFrame);\r\n\r\n if (!options.iframe) {\r\n core._setOptionsInit(el, _initHTML);\r\n }\r\n },\r\n\r\n /**\r\n * @description Set \"options.defaultStyle\" style.\r\n * Define the style of the edit area\r\n * It can also be defined with the \"setOptions\" method, but the \"setDefaultStyle\" method does not render the editor again.\r\n * @param {String} style Style string\r\n */\r\n setDefaultStyle: function (style) {\r\n const newStyles = options._editorStyles = util._setDefaultOptionStyle(options, style);\r\n const el = context.element;\r\n\r\n // top area\r\n el.topArea.style.cssText = newStyles.top;\r\n // code view\r\n el.code.style.cssText = options._editorStyles.frame;\r\n el.code.style.display = 'none';\r\n if (options.height === 'auto') {\r\n el.code.style.overflow = 'hidden';\r\n } else {\r\n el.code.style.overflow = '';\r\n }\r\n // wysiwyg frame\r\n if (!options.iframe) {\r\n el.wysiwygFrame.style.cssText = newStyles.frame + newStyles.editor;\r\n } else {\r\n el.wysiwygFrame.style.cssText = newStyles.frame;\r\n el.wysiwyg.style.cssText = newStyles.editor;\r\n }\r\n },\r\n\r\n /**\r\n * @description Open a notice area\r\n * @param {String} message Notice message\r\n */\r\n noticeOpen: function (message) {\r\n core.notice.open.call(core, message);\r\n },\r\n\r\n /**\r\n * @description Close a notice area\r\n */\r\n noticeClose: function () {\r\n core.notice.close.call(core);\r\n },\r\n\r\n /**\r\n * @description Copying the contents of the editor to the original textarea and execute onSave callback\r\n * * not working during enabled codeView mode\r\n */\r\n save: function () {\r\n const contents = core.getContents(false);\r\n context.element.originElement.value = contents;\r\n event.onSave_wysiwyg(contents, core);\r\n },\r\n\r\n /**\r\n * @description Gets the suneditor's context object. Contains settings, plugins, and cached element objects\r\n * @returns {Object}\r\n */\r\n getContext: function () {\r\n return context;\r\n },\r\n\r\n /**\r\n * @description Gets the contents of the suneditor\r\n * * not working during enabled codeView mode\r\n * @param {Boolean} onlyContents - Return only the contents of the body without headers when the \"fullPage\" option is true\r\n * @returns {String}\r\n */\r\n getContents: function (onlyContents) {\r\n return core.getContents(onlyContents);\r\n },\r\n\r\n /**\r\n * @description Gets only the text of the suneditor contents\r\n * * not working during enabled codeView mode\r\n * @returns {String}\r\n */\r\n getText: function () {\r\n return context.element.wysiwyg.textContent;\r\n },\r\n\r\n /**\r\n * @description Get the editor's number of characters or binary data size.\r\n * You can use the \"charCounterType\" option format.\r\n * @param {String|null} charCounterType options - charCounterType ('char', 'byte', 'byte-html')\r\n * If argument is no value, the currently set \"charCounterType\" option is used.\r\n * @returns {Number}\r\n */\r\n getCharCount: function (charCounterType) {\r\n charCounterType = typeof charCounterType === 'string' ? charCounterType : options.charCounterType;\r\n return core.getCharLength((core._charTypeHTML ? context.element.wysiwyg.innerHTML : context.element.wysiwyg.textContent), charCounterType);\r\n },\r\n\r\n /**\r\n * @description Gets uploaded images informations\r\n * - index: data index\r\n * - name: file name\r\n * - size: file size\r\n * - select: select function\r\n * - delete: delete function\r\n * - element: target element\r\n * - src: src attribute of tag\r\n * @returns {Array}\r\n */\r\n getImagesInfo: function () {\r\n return context.image ? context.image._infoList : [];\r\n },\r\n \r\n /**\r\n * @description Gets uploaded files(plugin using fileManager) information list.\r\n * image: [img], video: [video, iframe], audio: [audio]\r\n * When the argument value is 'image', it is the same function as \"getImagesInfo\".\r\n * - index: data index\r\n * - name: file name\r\n * - size: file size\r\n * - select: select function\r\n * - delete: delete function\r\n * - element: target element\r\n * - src: src attribute of tag\r\n * @param {String} pluginName Plugin name (image, video, audio)\r\n * @returns {Array}\r\n */\r\n getFilesInfo: function (pluginName) {\r\n return context[pluginName] ? context[pluginName]._infoList : [];\r\n },\r\n\r\n /**\r\n * @description Upload images using image plugin\r\n * @param {FileList} files FileList\r\n */\r\n insertImage: function (files) {\r\n if (!core.plugins.image || !files) return;\r\n\r\n if (!core.initPlugins.image) core.callPlugin('image', core.plugins.image.submitAction.bind(core, files), null);\r\n else core.plugins.image.submitAction.call(core, files);\r\n core.focus();\r\n },\r\n\r\n /**\r\n * @description Inserts an HTML element or HTML string or plain string at the current cursor position\r\n * @param {Element|String} html HTML Element or HTML string or plain string\r\n * @param {Boolean} notCleaningData If true, inserts the HTML string without refining it with core.cleanHTML.\r\n * @param {Boolean} checkCharCount If true, if \"options.maxCharCount\" is exceeded when \"element\" is added, null is returned without addition.\r\n * @param {Boolean} rangeSelection If true, range select the inserted node.\r\n */\r\n insertHTML: function (html, notCleaningData, checkCharCount, rangeSelection) {\r\n if (!context.element.wysiwygFrame.contains(core.getSelection().focusNode)) core.focus();\r\n\r\n if (typeof html === 'string') {\r\n if (!notCleaningData) html = core.cleanHTML(html, null, null);\r\n try {\r\n if (util.isListCell(util.getFormatElement(core.getSelectionNode(), null))) {\r\n const dom = _d.createRange().createContextualFragment(html);\r\n const domTree = dom.childNodes;\r\n if (core._isFormatData(domTree)) html = core._convertListCell(domTree);\r\n }\r\n\r\n const dom = _d.createRange().createContextualFragment(html);\r\n const domTree = dom.childNodes;\r\n\r\n if (checkCharCount) {\r\n const type = core._charTypeHTML ? 'outerHTML' : 'textContent';\r\n let checkHTML = '';\r\n for (let i = 0, len = domTree.length; i < len; i++) {\r\n checkHTML += domTree[i][type];\r\n }\r\n if (!core.checkCharCount(checkHTML, null)) return;\r\n }\r\n\r\n let c, a, t, prev, firstCon;\r\n while ((c = domTree[0])) {\r\n if (prev && prev.nodeType === 3 && a && a.nodeType === 1 && util.isBreak(c)) {\r\n prev = c;\r\n util.removeItem(c);\r\n continue;\r\n }\r\n t = core.insertNode(c, a, false);\r\n a = t.container || t;\r\n if (!firstCon) firstCon = t;\r\n prev = c;\r\n }\r\n\r\n if (prev.nodeType === 3 && a.nodeType === 1) a = prev;\r\n const offset = a.nodeType === 3 ? (t.endOffset || a.textContent.length): a.childNodes.length;\r\n if (rangeSelection) core.setRange(firstCon.container || firstCon, firstCon.startOffset || 0, a, offset);\r\n else core.setRange(a, offset, a, offset);\r\n } catch (error) {\r\n if (core.isDisabled || core.isReadOnly) return;\r\n console.warn('[SUNEDITOR.insertHTML.fail] ' + error);\r\n core.execCommand('insertHTML', false, html);\r\n }\r\n } else {\r\n if (util.isComponent(html)) {\r\n core.insertComponent(html, false, checkCharCount, false);\r\n } else {\r\n let afterNode = null;\r\n if (util.isFormatElement(html) || util.isMedia(html)) {\r\n afterNode = util.getFormatElement(core.getSelectionNode(), null);\t\r\n }\r\n core.insertNode(html, afterNode, checkCharCount);\r\n }\r\n }\r\n \r\n core.effectNode = null;\r\n core.focus();\r\n\r\n // history stack\r\n core.history.push(false);\r\n },\r\n\r\n /**\r\n * @description Change the contents of the suneditor\r\n * @param {String|undefined} contents Contents to Input\r\n */\r\n setContents: function (contents) {\r\n core.setContents(contents);\r\n },\r\n\r\n /**\r\n * @description Add contents to the suneditor\r\n * @param {String} contents Contents to Input\r\n */\r\n appendContents: function (contents) {\r\n const convertValue = core.convertContentsForEditor(contents);\r\n \r\n if (!core._variable.isCodeView) {\r\n const temp = util.createElement('DIV');\r\n temp.innerHTML = convertValue;\r\n\r\n const wysiwyg = context.element.wysiwyg;\r\n const children = temp.children;\r\n for (let i = 0, len = children.length; i < len; i++) {\r\n if (children[i]) {\r\n wysiwyg.appendChild(children[i]); \r\n }\r\n }\r\n } else {\r\n core._setCodeView(core._getCodeView() + '\\n' + core.convertHTMLForCodeView(convertValue, false));\r\n }\r\n\r\n // history stack\r\n core.history.push(false);\r\n },\r\n\r\n /**\r\n * @description Switch to or off \"ReadOnly\" mode.\r\n * @param {Boolean} value \"readOnly\" boolean value.\r\n */\r\n readOnly: function (value) {\r\n core.isReadOnly = value;\r\n \r\n util.setDisabledButtons(!!value, core.resizingDisabledButtons);\r\n\r\n if (value) {\r\n /** off menus */\r\n core.controllersOff();\r\n if (core.submenuActiveButton && core.submenuActiveButton.disabled) core.submenuOff();\r\n if (core._moreLayerActiveButton && core._moreLayerActiveButton.disabled) core.moreLayerOff();\r\n if (core.containerActiveButton && core.containerActiveButton.disabled) core.containerOff();\r\n if (core.modalForm) core.plugins.dialog.close.call(core);\r\n\r\n context.element.code.setAttribute(\"readOnly\", \"true\");\r\n util.addClass(context.element.wysiwygFrame, 'se-read-only');\r\n } else {\r\n context.element.code.removeAttribute(\"readOnly\");\r\n util.removeClass(context.element.wysiwygFrame, 'se-read-only');\r\n }\r\n\r\n if (options.codeMirrorEditor) options.codeMirrorEditor.setOption('readOnly', !!value);\r\n },\r\n\r\n /**\r\n * @description Disable the suneditor\r\n */\r\n disable: function () {\r\n this.toolbar.disable();\r\n this.wysiwyg.disable();\r\n },\r\n\r\n /**\r\n * @description Provided for backward compatibility and will be removed in 3.0.0 version\r\n */\r\n disabled: function () {\r\n this.disable();\r\n },\r\n\r\n /**\r\n * @description Enable the suneditor\r\n */\r\n enable: function () {\r\n this.toolbar.enable();\r\n this.wysiwyg.enable();\r\n },\r\n\r\n /**\r\n * @description Provided for backward compatibility and will be removed in 3.0.0 version\r\n */\r\n enabled: function () {\r\n this.enable();\r\n },\r\n\r\n /**\r\n * @description Show the suneditor\r\n */\r\n show: function () {\r\n const topAreaStyle = context.element.topArea.style;\r\n if (topAreaStyle.display === 'none') topAreaStyle.display = options.display;\r\n },\r\n\r\n /**\r\n * @description Hide the suneditor\r\n */\r\n hide: function () {\r\n context.element.topArea.style.display = 'none';\r\n },\r\n\r\n /**\r\n * @description Destroy the suneditor\r\n */\r\n destroy: function () {\r\n /** off menus */\r\n core.submenuOff();\r\n core.containerOff();\r\n core.controllersOff();\r\n if (core.notice) core.notice.close.call(core);\r\n if (core.modalForm) core.plugins.dialog.close.call(core);\r\n\r\n /** remove history */\r\n core.history._destroy();\r\n\r\n /** remove event listeners */\r\n event._removeEvent();\r\n \r\n /** remove element */\r\n util.removeItem(context.element.toolbar);\r\n util.removeItem(context.element.topArea);\r\n\r\n /** remove object reference */\r\n for (let k in core.functions) { if (util.hasOwn(core, k)) delete core.functions[k]; }\r\n for (let k in core) { if (util.hasOwn(core, k)) delete core[k]; }\r\n for (let k in event) { if (util.hasOwn(event, k)) delete event[k]; }\r\n for (let k in context) { if (util.hasOwn(context, k)) delete context[k]; }\r\n for (let k in pluginCallButtons) { if (util.hasOwn(pluginCallButtons, k)) delete pluginCallButtons[k]; }\r\n \r\n /** remove user object */\r\n for (let k in this) { if (util.hasOwn(this, k)) delete this[k]; }\r\n },\r\n\r\n /**\r\n * @description Toolbar methods\r\n */\r\n toolbar: {\r\n /**\r\n * @description Disable the toolbar\r\n */\r\n disable: function () {\r\n /** off menus */\r\n core.submenuOff();\r\n core.moreLayerOff();\r\n core.containerOff();\r\n\r\n context.tool.cover.style.display = 'block';\r\n },\r\n\r\n /**\r\n * @description Provided for backward compatibility and will be removed in 3.0.0 version\r\n */\r\n disabled: function () {\r\n this.disable();\r\n },\r\n\r\n /**\r\n * @description Enable the toolbar\r\n */\r\n enable: function () {\r\n context.tool.cover.style.display = 'none';\r\n },\r\n\r\n /**\r\n * @description Provided for backward compatibility and will be removed in 3.0.0 version\r\n */\r\n enabled: function () {\r\n this.enable();\r\n },\r\n\r\n /**\r\n * @description Show the toolbar\r\n */\r\n show: function () {\r\n if (core._isInline) {\r\n event._showToolbarInline();\r\n } else {\r\n context.element.toolbar.style.display = '';\r\n context.element._stickyDummy.style.display = '';\r\n }\r\n\r\n event.onResize_window();\r\n },\r\n\r\n /**\r\n * @description Hide the toolbar\r\n */\r\n hide: function () {\r\n if (core._isInline) {\r\n event._hideToolbar();\r\n } else {\r\n context.element.toolbar.style.display = 'none';\r\n context.element._stickyDummy.style.display = 'none';\r\n }\r\n\r\n event.onResize_window();\r\n },\r\n },\r\n\r\n /**\r\n * @description Wysiwyg methods\r\n */\r\n wysiwyg: {\r\n /**\r\n * @description Disable the wysiwyg area\r\n */\r\n disable: function () {\r\n /** off menus */\r\n core.controllersOff();\r\n if (core.modalForm) core.plugins.dialog.close.call(core);\r\n\r\n context.element.wysiwyg.setAttribute('contenteditable', false);\r\n core.isDisabled = true;\r\n\r\n if (options.codeMirrorEditor) {\r\n options.codeMirrorEditor.setOption('readOnly', true);\r\n } else {\r\n context.element.code.setAttribute('disabled', 'disabled');\r\n }\r\n },\r\n\r\n /**\r\n * @description Enable the wysiwyg area\r\n */\r\n enable: function () {\r\n context.element.wysiwyg.setAttribute('contenteditable', true);\r\n core.isDisabled = false;\r\n\r\n if (options.codeMirrorEditor) {\r\n options.codeMirrorEditor.setOption('readOnly', false);\r\n } else {\r\n context.element.code.removeAttribute('disabled');\r\n }\r\n },\r\n }\r\n };\r\n\r\n /************ Core init ************/\r\n // functions\r\n core.functions = functions;\r\n core.options = options;\r\n\r\n // Create to sibling node\r\n let contextEl = context.element;\r\n let originEl = contextEl.originElement;\r\n let topEl = contextEl.topArea;\r\n originEl.style.display = 'none';\r\n topEl.style.display = 'block';\r\n\r\n // init\r\n if (options.iframe) {\r\n contextEl.wysiwygFrame.addEventListener('load', function () {\r\n util._setIframeDocument(this, options);\r\n core._editorInit(false, options.value);\r\n options.value = null;\r\n });\r\n }\r\n\r\n // insert editor element\r\n if (typeof originEl.nextElementSibling === 'object') {\r\n originEl.parentNode.insertBefore(topEl, originEl.nextElementSibling);\r\n } else {\r\n originEl.parentNode.appendChild(topEl);\r\n }\r\n\r\n contextEl.editorArea.appendChild(contextEl.wysiwygFrame);\r\n contextEl = originEl = topEl = null;\r\n\r\n // init\r\n if (!options.iframe) {\r\n core._editorInit(false, options.value);\r\n options.value = null;\r\n }\r\n\r\n return functions;\r\n}","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2019 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\nexport default function (core, change) {\n const _w = core._w;\n const util = core.util;\n const delayTime = core.options.historyStackDelayTime;\n let editor = core.context.element;\n let undo = core.context.tool.undo;\n let redo = core.context.tool.redo;\n\n let pushDelay = null;\n let stackIndex = 0;\n let stack = [];\n\n function setContentsFromStack () {\n const item = stack[stackIndex];\n editor.wysiwyg.innerHTML = item.contents;\n\n core.setRange(util.getNodeFromPath(item.s.path, editor.wysiwyg), item.s.offset, util.getNodeFromPath(item.e.path, editor.wysiwyg), item.e.offset);\n core.focus();\n\n if (stack.length <= 1) {\n if (undo) undo.setAttribute('disabled', true);\n if (redo) redo.setAttribute('disabled', true);\n } else {\n if (stackIndex === 0) {\n if (undo) undo.setAttribute('disabled', true);\n if (redo) redo.removeAttribute('disabled');\n } else if (stackIndex === stack.length - 1) {\n if (undo) undo.removeAttribute('disabled');\n if (redo) redo.setAttribute('disabled', true);\n } else {\n if (undo) undo.removeAttribute('disabled');\n if (redo) redo.removeAttribute('disabled');\n }\n }\n\n core.controllersOff();\n core._checkComponents();\n core._setCharCount();\n core._resourcesStateChange();\n \n // onChange\n change();\n }\n\n function pushStack () {\n core._checkComponents();\n const current = editor.wysiwyg.innerHTML;\n if (!current || (!!stack[stackIndex] && current === stack[stackIndex].contents)) return;\n\n stackIndex++;\n const range = core._variable._range;\n\n if (stack.length > stackIndex) {\n stack = stack.slice(0, stackIndex);\n if (redo) redo.setAttribute('disabled', true);\n }\n\n if (!range) {\n stack[stackIndex] = {\n contents: current,\n s: { path: [0, 0], offset: [0, 0] },\n e: { path: 0, offset: 0 }\n };\n } else {\n stack[stackIndex] = {\n contents: current,\n s: {\n path: util.getNodePath(range.startContainer, null, null),\n offset: range.startOffset\n },\n e: {\n path: util.getNodePath(range.endContainer, null, null),\n offset: range.endOffset\n }\n };\n }\n\n if (stackIndex === 1 && undo) undo.removeAttribute('disabled');\n\n core._setCharCount();\n // onChange\n change();\n }\n\n return {\n /**\n * @description History stack\n */\n stack: stack,\n\n /**\n * @description Saving the current status to the history object stack\n * If \"delay\" is true, it will be saved after (options.historyStackDelayTime || 400) miliseconds\n * If the function is called again with the \"delay\" argument true before it is saved, the delay time is renewal\n * You can specify the delay time by sending a number.\n * @param {Boolean|Number} delay If true, Add stack without delay time.\n */\n push: function (delay) {\n _w.setTimeout(core._resourcesStateChange.bind(core));\n const time = typeof delay === 'number' ? (delay > 0 ? delay : 0) : (!delay ? 0 : delayTime);\n \n if (!time || pushDelay) {\n _w.clearTimeout(pushDelay);\n if (!time) {\n pushStack();\n return;\n }\n }\n\n pushDelay = _w.setTimeout(function () {\n _w.clearTimeout(pushDelay);\n pushDelay = null;\n pushStack();\n }, time);\n },\n\n /**\n * @description Undo function\n */\n undo: function () {\n if (stackIndex > 0) {\n stackIndex--;\n setContentsFromStack();\n }\n },\n\n /**\n * @description Redo function\n */\n redo: function () {\n if (stack.length - 1 > stackIndex) {\n stackIndex++;\n setContentsFromStack();\n }\n },\n\n /**\n * @description Go to the history stack for that index.\n * If \"index\" is -1, go to the last stack\n */\n go: function (index) {\n stackIndex = index < 0 ? (stack.length - 1) : index;\n setContentsFromStack();\n },\n\n /**\n * @description Get the current history stack index.\n * @returns {Number} Current Stack index\n */\n getCurrentIndex: function () {\n return stackIndex;\n },\n \n /**\n * @description Reset the history object\n */\n reset: function (ignoreChangeEvent) {\n if (undo) undo.setAttribute('disabled', true);\n if (redo) redo.setAttribute('disabled', true);\n core._variable.isChanged = false;\n if (core.context.tool.save) core.context.tool.save.setAttribute('disabled', true);\n \n stack.splice(0);\n stackIndex = 0;\n\n // pushStack\n stack[stackIndex] = {\n contents: core.getContents(true),\n s: {\n path: [0, 0],\n offset: 0\n },\n e: {\n path: [0, 0],\n offset: 0\n }\n };\n\n if (!ignoreChangeEvent) change();\n },\n\n /**\n * @description Reset the disabled state of the buttons to fit the current stack.\n * @private\n */\n _resetCachingButton: function () {\n editor = core.context.element;\n undo = core.context.tool.undo;\n redo = core.context.tool.redo;\n\n if (stackIndex === 0) {\n if (undo) undo.setAttribute('disabled', true);\n if (redo && stackIndex === stack.length - 1) redo.setAttribute('disabled', true);\n core._variable.isChanged = false;\n if (core.context.tool.save) core.context.tool.save.setAttribute('disabled', true);\n } else if (stackIndex === stack.length - 1) {\n if (redo) redo.setAttribute('disabled', true);\n }\n },\n\n /**\n * @description Remove all stacks and remove the timeout function.\n * @private\n */\n _destroy: function () {\n if (pushDelay) _w.clearTimeout(pushDelay);\n stack = null;\n }\n };\n}","'use strict';\n\nimport './assets/css/suneditor.css';\nimport './assets/css/suneditor-contents.css';\n\nimport plugins from './plugins';\nimport suneditor from './suneditor';\n\nif (!window.SUNEDITOR) {\n Object.defineProperty(window, 'SUNEDITOR', {\n enumerable: true,\n writable: false,\n configurable: false,\n value: suneditor.init({\n plugins: plugins\n })\n });\n}","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\n(function (global, factory) {\n if (typeof module === 'object' && typeof module.exports === 'object') {\n module.exports = global.document ?\n factory(global, true) :\n function (w) {\n if (!w.document) {\n throw new Error('SUNEDITOR_MODULES a window with a document');\n }\n return factory(w);\n };\n } else {\n factory(global);\n }\n}(typeof window !== 'undefined' ? window : this, function (window, noGlobal) {\n const component = {\n name: 'component',\n /**\n * @description Create a container for the resizing component and insert the element.\n * @param {Element} cover Cover element (FIGURE)\n * @param {String} className Class name of container (fixed: se-component)\n * @returns {Element} Created container element\n */\n set_container: function (cover, className) {\n const container = this.util.createElement('DIV');\n container.className = 'se-component ' + className;\n container.appendChild(cover);\n \n return container;\n },\n\n /**\n * @description Cover the target element with a FIGURE element.\n * @param {Element} element Target element\n */\n set_cover: function (element) {\n const cover = this.util.createElement('FIGURE');\n cover.appendChild(element);\n \n return cover;\n },\n\n /**\n * @description Return HTML string of caption(FIGCAPTION) element\n * @returns {String}\n */\n create_caption: function () {\n const caption = this.util.createElement('FIGCAPTION');\n caption.innerHTML = '
      ' + this.lang.dialogBox.caption + '
      ';\n return caption;\n }\n };\n\n if (typeof noGlobal === typeof undefined) {\n if (!window.SUNEDITOR_MODULES) {\n Object.defineProperty(window, 'SUNEDITOR_MODULES', {\n enumerable: true,\n writable: false,\n configurable: false,\n value: {}\n });\n }\n\n Object.defineProperty(window.SUNEDITOR_MODULES, 'component', {\n enumerable: true,\n writable: false,\n configurable: false,\n value: component\n });\n }\n\n return component;\n}));","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\n(function (global, factory) {\n if (typeof module === 'object' && typeof module.exports === 'object') {\n module.exports = global.document ?\n factory(global, true) :\n function (w) {\n if (!w.document) {\n throw new Error('SUNEDITOR_MODULES a window with a document');\n }\n return factory(w);\n };\n } else {\n factory(global);\n }\n}(typeof window !== 'undefined' ? window : this, function (window, noGlobal) {\n const resizing = {\n name: 'resizing',\n /**\n * @description Constructor\n * Require context properties when resizing module\n inputX: Element,\n inputY: Element,\n _container: null,\n _cover: null,\n _element: null,\n _element_w: 1,\n _element_h: 1,\n _element_l: 0,\n _element_t: 0,\n _defaultSizeX: 'auto',\n _defaultSizeY: 'auto',\n _origin_w: core.options.imageWidth === 'auto' ? '' : core.options.imageWidth,\n _origin_h: core.options.imageHeight === 'auto' ? '' : core.options.imageHeight,\n _proportionChecked: true,\n // -- select function --\n _resizing: core.options.imageResizing,\n _resizeDotHide: !core.options.imageHeightShow,\n _rotation: core.options.imageRotation,\n _onlyPercentage: core.options.imageSizeOnlyPercentage,\n _ratio: false,\n _ratioX: 1,\n _ratioY: 1\n _captionShow: true,\n // -- when used caption (_captionShow: true) --\n _caption: null,\n _captionChecked: false,\n captionCheckEl: null,\n * @param {Object} core Core object \n */\n add: function (core) {\n const icons = core.icons;\n const context = core.context;\n context.resizing = {\n _resizeClientX: 0,\n _resizeClientY: 0,\n _resize_plugin: '',\n _resize_w: 0,\n _resize_h: 0,\n _origin_w: 0,\n _origin_h: 0,\n _rotateVertical: false,\n _resize_direction: '',\n _move_path: null,\n _isChange: false,\n alignIcons: {\n basic: icons.align_justify,\n left: icons.align_left,\n right: icons.align_right,\n center: icons.align_center\n }\n };\n \n /** resize controller, button */\n let resize_div_container = this.setController_resize(core);\n context.resizing.resizeContainer = resize_div_container;\n \n context.resizing.resizeDiv = resize_div_container.querySelector('.se-modal-resize');\n context.resizing.resizeDot = resize_div_container.querySelector('.se-resize-dot');\n context.resizing.resizeDisplay = resize_div_container.querySelector('.se-resize-display');\n \n let resize_button = this.setController_button(core);\n context.resizing.resizeButton = resize_button;\n \n let resize_handles = context.resizing.resizeHandles = context.resizing.resizeDot.querySelectorAll('span');\n context.resizing.resizeButtonGroup = resize_button.querySelector('._se_resizing_btn_group');\n context.resizing.rotationButtons = resize_button.querySelectorAll('._se_resizing_btn_group ._se_rotation');\n context.resizing.percentageButtons = resize_button.querySelectorAll('._se_resizing_btn_group ._se_percentage');\n \n context.resizing.alignMenu = resize_button.querySelector('.se-resizing-align-list');\n context.resizing.alignMenuList = context.resizing.alignMenu.querySelectorAll('button');\n \n context.resizing.alignButton = resize_button.querySelector('._se_resizing_align_button');\n context.resizing.autoSizeButton = resize_button.querySelector('._se_resizing_btn_group ._se_auto_size');\n context.resizing.captionButton = resize_button.querySelector('._se_resizing_caption_button');\n \n /** add event listeners */\n resize_div_container.addEventListener('mousedown', function (e) { e.preventDefault(); });\n resize_handles[0].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core));\n resize_handles[1].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core));\n resize_handles[2].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core));\n resize_handles[3].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core));\n resize_handles[4].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core));\n resize_handles[5].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core));\n resize_handles[6].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core));\n resize_handles[7].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core));\n resize_button.addEventListener('click', this.onClick_resizeButton.bind(core));\n \n /** append html */\n context.element.relative.appendChild(resize_div_container);\n context.element.relative.appendChild(resize_button);\n \n /** empty memory */\n resize_div_container = null, resize_button = null, resize_handles = null;\n },\n \n /** resize controller, button (image, iframe, video) */\n setController_resize: function (core) {\n const resize_container = core.util.createElement('DIV');\n \n resize_container.className = 'se-controller se-resizing-container';\n resize_container.style.display = 'none';\n resize_container.innerHTML = '' +\n '
      ' +\n '
      ' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
      ' +\n '
      ';\n \n return resize_container;\n },\n \n setController_button: function (core) {\n const lang = core.lang;\n const icons = core.icons;\n const resize_button = core.util.createElement(\"DIV\");\n \n resize_button.className = \"se-controller se-controller-resizing\";\n resize_button.innerHTML = '' +\n '
      ' +\n '
      ' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
      ' +\n '
      ' +\n '' +\n '' +\n '' +\n '
      ' +\n '
      ' +\n '
        ' +\n '
      • ' +\n '
      • ' +\n '
      • ' +\n '
      • ' +\n '
      ' +\n '
      ' +\n '
      ' +\n '' +\n '' +\n '' +\n '' +\n '
      ';\n \n return resize_button;\n },\n \n /**\n * @description Gets the width size\n * @param {Object} contextPlugin context object of plugin (core.context[plugin])\n * @param {Element} element Target element\n * @param {Element} cover Cover element (FIGURE)\n * @param {Element} container Container element (DIV.se-component)\n * @returns {String}\n */\n _module_getSizeX: function (contextPlugin, element, cover, container) {\n if (!element) element = contextPlugin._element;\n if (!cover) cover = contextPlugin._cover;\n if (!container) container = contextPlugin._container;\n \n if (!element) return '';\n \n return !/%$/.test(element.style.width) ? element.style.width : ((container && this.util.getNumber(container.style.width, 2)) || 100) + '%';\n },\n \n /**\n * @description Gets the height size\n * @param {Object} contextPlugin context object of plugin (core.context[plugin])\n * @param {Element} element Target element\n * @param {Element} cover Cover element (FIGURE)\n * @param {Element} container Container element (DIV.se-component)\n * @returns {String}\n */\n _module_getSizeY: function (contextPlugin, element, cover, container) {\n if (!element) element = contextPlugin._element;\n if (!cover) cover = contextPlugin._cover;\n if (!container) container = contextPlugin._container;\n \n if (!container || !cover) return (element && element.style.height) || '';\n \n return this.util.getNumber(cover.style.paddingBottom, 0) > 0 && !this.context.resizing._rotateVertical ? cover.style.height : (!/%$/.test(element.style.height) || !/%$/.test(element.style.width) ? element.style.height : ((container && this.util.getNumber(container.style.height, 2)) || 100) + '%');\n },\n\n /**\n * @description Called at the \"openModify\" to put the size of the current target into the size input element.\n * @param {Object} contextPlugin context object of plugin (core.context[plugin])\n * @param {Object} pluginObj Plugin object\n */\n _module_setModifyInputSize: function (contextPlugin, pluginObj) {\n const percentageRotation = contextPlugin._onlyPercentage && this.context.resizing._rotateVertical;\n contextPlugin.proportion.checked = contextPlugin._proportionChecked = contextPlugin._element.getAttribute('data-proportion') !== 'false';\n \n let x = percentageRotation ? '' : this.plugins.resizing._module_getSizeX.call(this, contextPlugin);\n if (x === contextPlugin._defaultSizeX) x = '';\n if (contextPlugin._onlyPercentage) x = this.util.getNumber(x, 2);\n contextPlugin.inputX.value = x;\n pluginObj.setInputSize.call(this, 'x');\n \n if (!contextPlugin._onlyPercentage) {\n let y = percentageRotation ? '' : this.plugins.resizing._module_getSizeY.call(this, contextPlugin);\n if (y === contextPlugin._defaultSizeY) y = '';\n if (contextPlugin._onlyPercentage) y = this.util.getNumber(y, 2);\n contextPlugin.inputY.value = y;\n }\n \n contextPlugin.inputX.disabled = percentageRotation ? true : false;\n contextPlugin.inputY.disabled = percentageRotation ? true : false;\n contextPlugin.proportion.disabled = percentageRotation ? true : false;\n \n pluginObj.setRatio.call(this);\n },\n \n /**\n * @description It is called in \"setInputSize\" (input tag keyupEvent), \n * checks the value entered in the input tag, \n * calculates the ratio, and sets the calculated value in the input tag of the opposite size.\n * @param {Object} contextPlugin context object of plugin (core.context[plugin])\n * @param {String} xy 'x': width, 'y': height\n */\n _module_setInputSize: function (contextPlugin, xy) {\n if (contextPlugin._onlyPercentage) {\n if (xy === 'x' && contextPlugin.inputX.value > 100) contextPlugin.inputX.value = 100;\n return;\n }\n \n if (contextPlugin.proportion.checked && contextPlugin._ratio && /\\d/.test(contextPlugin.inputX.value) && /\\d/.test(contextPlugin.inputY.value)) {\n const xUnit = contextPlugin.inputX.value.replace(/\\d+|\\./g, '') || contextPlugin.sizeUnit;\n const yUnit = contextPlugin.inputY.value.replace(/\\d+|\\./g, '') || contextPlugin.sizeUnit;\n \n if (xUnit !== yUnit) return;\n \n const dec = xUnit === '%' ? 2 : 0;\n \n if (xy === 'x') {\n contextPlugin.inputY.value = this.util.getNumber(contextPlugin._ratioY * this.util.getNumber(contextPlugin.inputX.value, dec), dec) + yUnit;\n } else {\n contextPlugin.inputX.value = this.util.getNumber(contextPlugin._ratioX * this.util.getNumber(contextPlugin.inputY.value, dec), dec) + xUnit;\n }\n }\n },\n \n /**\n * @description It is called in \"setRatio\" (input and proportionCheck tags changeEvent), \n * checks the value of the input tag, calculates the ratio, and resets it in the input tag.\n * @param {Object} contextPlugin context object of plugin (core.context[plugin])\n */\n _module_setRatio: function (contextPlugin) {\n const xValue = contextPlugin.inputX.value;\n const yValue = contextPlugin.inputY.value;\n \n if (contextPlugin.proportion.checked && /\\d+/.test(xValue) && /\\d+/.test(yValue)) {\n const xUnit = xValue.replace(/\\d+|\\./g, '') || contextPlugin.sizeUnit;\n const yUnit = yValue.replace(/\\d+|\\./g, '') || contextPlugin.sizeUnit;\n \n if (xUnit !== yUnit) {\n contextPlugin._ratio = false;\n } else if (!contextPlugin._ratio) {\n const x = this.util.getNumber(xValue, 0);\n const y = this.util.getNumber(yValue, 0);\n \n contextPlugin._ratio = true;\n contextPlugin._ratioX = x / y;\n contextPlugin._ratioY = y / x;\n }\n } else {\n contextPlugin._ratio = false;\n }\n },\n \n /**\n * @description Revert size of element to origin size (plugin._origin_w, plugin._origin_h)\n * @param {Object} contextPlugin context object of plugin (core.context[plugin])\n */\n _module_sizeRevert: function (contextPlugin) {\n if (contextPlugin._onlyPercentage) {\n contextPlugin.inputX.value = contextPlugin._origin_w > 100 ? 100 : contextPlugin._origin_w;\n } else {\n contextPlugin.inputX.value = contextPlugin._origin_w;\n contextPlugin.inputY.value = contextPlugin._origin_h;\n }\n },\n \n /**\n * @description Save the size data (element.setAttribute(\"data-size\"))\n * Used at the \"setSize\" method\n * @param {Object} contextPlugin context object of plugin (core.context[plugin])\n */\n _module_saveCurrentSize: function (contextPlugin) {\n const x = this.plugins.resizing._module_getSizeX.call(this, contextPlugin);\n const y = this.plugins.resizing._module_getSizeY.call(this, contextPlugin);\n contextPlugin._element.setAttribute('data-size', x + ',' + y);\n if (!!contextPlugin._videoRatio) contextPlugin._videoRatio = y;\n },\n \n /**\n * @description Call the resizing module\n * @param {Element} targetElement Resizing target element\n * @param {string} plugin Plugin name\n * @returns {Object} Size of resizing div {w, h, t, l}\n */\n call_controller_resize: function (targetElement, plugin) {\n const contextResizing = this.context.resizing;\n const contextPlugin = this.context[plugin];\n contextResizing._resize_plugin = plugin;\n \n const resizeContainer = contextResizing.resizeContainer;\n const resizeDiv = contextResizing.resizeDiv;\n const offset = this.util.getOffset(targetElement, this.context.element.wysiwygFrame);\n \n const isVertical = contextResizing._rotateVertical = /^(90|270)$/.test(Math.abs(targetElement.getAttribute('data-rotate')).toString());\n \n const w = isVertical ? targetElement.offsetHeight : targetElement.offsetWidth;\n const h = isVertical ? targetElement.offsetWidth : targetElement.offsetHeight;\n const t = offset.top;\n const l = offset.left - this.context.element.wysiwygFrame.scrollLeft;\n \n resizeContainer.style.top = t + 'px';\n resizeContainer.style.left = l + 'px';\n resizeContainer.style.width = w + 'px';\n resizeContainer.style.height = h + 'px';\n \n resizeDiv.style.top = '0px';\n resizeDiv.style.left = '0px';\n resizeDiv.style.width = w + 'px';\n resizeDiv.style.height = h + 'px';\n \n let align = targetElement.getAttribute('data-align') || 'basic';\n align = align === 'none' ? 'basic' : align;\n \n // text\n const container = this.util.getParentElement(targetElement, this.util.isComponent);\n const cover = this.util.getParentElement(targetElement, 'FIGURE');\n const displayX = this.plugins.resizing._module_getSizeX.call(this, contextPlugin, targetElement, cover, container) || 'auto';\n const displayY = contextPlugin._onlyPercentage && plugin === 'image' ? '' : ', ' + (this.plugins.resizing._module_getSizeY.call(this, contextPlugin, targetElement, cover, container) || 'auto');\n this.util.changeTxt(contextResizing.resizeDisplay, this.lang.dialogBox[align] + ' (' + displayX + displayY + ')');\n \n // resizing display\n contextResizing.resizeButtonGroup.style.display = contextPlugin._resizing ? '' : 'none';\n const resizeDotShow = contextPlugin._resizing && !contextPlugin._resizeDotHide && !contextPlugin._onlyPercentage ? 'flex' : 'none';\n const resizeHandles = contextResizing.resizeHandles;\n for (let i = 0, len = resizeHandles.length; i < len; i++) {\n resizeHandles[i].style.display = resizeDotShow;\n }\n \n if (contextPlugin._resizing) {\n const rotations = contextResizing.rotationButtons;\n rotations[0].style.display = rotations[1].style.display = contextPlugin._rotation ? '' : 'none';\n }\n \n // align icon\n if (contextPlugin._alignHide) {\n contextResizing.alignButton.style.display = 'none';\n } else {\n contextResizing.alignButton.style.display = '';\n const alignList = contextResizing.alignMenuList;\n this.util.changeElement(contextResizing.alignButton.firstElementChild, contextResizing.alignIcons[align]);\n for (let i = 0, len = alignList.length; i < len; i++) {\n if (alignList[i].getAttribute('data-value') === align) this.util.addClass(alignList[i], 'on');\n else this.util.removeClass(alignList[i], 'on');\n }\n }\n \n // percentage active\n const pButtons = contextResizing.percentageButtons;\n const value = /%$/.test(targetElement.style.width) && /%$/.test(container.style.width) ? (this.util.getNumber(container.style.width, 0) / 100) + '' : '' ;\n for (let i = 0, len = pButtons.length; i < len; i++) {\n if (pButtons[i].getAttribute('data-value') === value) {\n this.util.addClass(pButtons[i], 'active');\n } else {\n this.util.removeClass(pButtons[i], 'active');\n }\n }\n \n // caption display, active\n if (!contextPlugin._captionShow) {\n contextResizing.captionButton.style.display = 'none';\n } else {\n contextResizing.captionButton.style.display = '';\n if (this.util.getChildElement(targetElement.parentNode, 'figcaption')) {\n this.util.addClass(contextResizing.captionButton, 'active');\n contextPlugin._captionChecked = true;\n } else {\n this.util.removeClass(contextResizing.captionButton, 'active');\n contextPlugin._captionChecked = false;\n }\n }\n\n resizeContainer.style.display = 'block';\n\n const addOffset = {left: 0, top: 50};\n if (this.options.iframe) {\n addOffset.left -= this.context.element.wysiwygFrame.parentElement.offsetLeft;\n addOffset.top -= this.context.element.wysiwygFrame.parentElement.offsetTop;\n }\n\n this.setControllerPosition(contextResizing.resizeButton, resizeContainer, 'bottom', addOffset);\n this.controllersOn(resizeContainer, contextResizing.resizeButton, this.util.setDisabledButtons.bind(this.util, false, this.resizingDisabledButtons), targetElement, plugin);\n this.util.setDisabledButtons(true, this.resizingDisabledButtons);\n \n contextResizing._resize_w = w;\n contextResizing._resize_h = h;\n \n const originSize = (targetElement.getAttribute('origin-size') || '').split(',');\n contextResizing._origin_w = originSize[0] || targetElement.naturalWidth;\n contextResizing._origin_h = originSize[1] || targetElement.naturalHeight;\n \n return {\n w: w,\n h: h,\n t: t,\n l: l\n };\n },\n \n _closeAlignMenu: null,\n\n /**\n * @description Open align submenu of module\n */\n openAlignMenu: function () {\n const alignButton = this.context.resizing.alignButton;\n this.util.addClass(alignButton, 'on');\n this.context.resizing.alignMenu.style.top = (alignButton.offsetTop + alignButton.offsetHeight) + 'px';\n this.context.resizing.alignMenu.style.left = (alignButton.offsetLeft - alignButton.offsetWidth / 2) + 'px';\n this.context.resizing.alignMenu.style.display = 'block';\n \n this.plugins.resizing._closeAlignMenu = function () {\n this.util.removeClass(this.context.resizing.alignButton, 'on');\n this.context.resizing.alignMenu.style.display = 'none';\n this.removeDocEvent('click', this.plugins.resizing._closeAlignMenu);\n this.plugins.resizing._closeAlignMenu = null;\n }.bind(this);\n \n this.addDocEvent('click', this.plugins.resizing._closeAlignMenu);\n },\n \n /**\n * @description Click event of resizing toolbar\n * Performs the action of the clicked toolbar button.\n * @param {MouseEvent} e Event object\n */\n onClick_resizeButton: function (e) {\n e.stopPropagation();\n \n const target = e.target;\n const command = target.getAttribute('data-command') || target.parentNode.getAttribute('data-command');\n \n if (!command) return;\n \n const value = target.getAttribute('data-value') || target.parentNode.getAttribute('data-value');\n \n const pluginName = this.context.resizing._resize_plugin;\n const currentContext = this.context[pluginName];\n const contextEl = currentContext._element;\n const currentModule = this.plugins[pluginName];\n \n e.preventDefault();\n \n if (typeof this.plugins.resizing._closeAlignMenu === 'function') {\n this.plugins.resizing._closeAlignMenu();\n if (command === 'onalign') return;\n }\n \n switch (command) {\n case 'auto':\n this.plugins.resizing.resetTransform.call(this, contextEl);\n currentModule.setAutoSize.call(this);\n this.selectComponent(contextEl, pluginName);\n break;\n case 'percent':\n let percentY = this.plugins.resizing._module_getSizeY.call(this, currentContext);\n if (this.context.resizing._rotateVertical) {\n const percentage = contextEl.getAttribute('data-percentage');\n if (percentage) percentY = percentage.split(',')[1];\n }\n \n this.plugins.resizing.resetTransform.call(this, contextEl);\n currentModule.setPercentSize.call(this, (value * 100), (this.util.getNumber(percentY, 0) === null || !/%$/.test(percentY)) ? '' : percentY);\n this.selectComponent(contextEl, pluginName);\n break;\n case 'mirror':\n const r = contextEl.getAttribute('data-rotate') || '0';\n let x = contextEl.getAttribute('data-rotateX') || '';\n let y = contextEl.getAttribute('data-rotateY') || '';\n \n if ((value === 'h' && !this.context.resizing._rotateVertical) || (value === 'v' && this.context.resizing._rotateVertical)) {\n y = y ? '' : '180';\n } else {\n x = x ? '' : '180';\n }\n \n contextEl.setAttribute('data-rotateX', x);\n contextEl.setAttribute('data-rotateY', y);\n \n this.plugins.resizing._setTransForm(contextEl, r, x, y);\n break;\n case 'rotate':\n const contextResizing = this.context.resizing;\n const slope = (contextEl.getAttribute('data-rotate') * 1) + (value * 1);\n const deg = this._w.Math.abs(slope) >= 360 ? 0 : slope;\n \n contextEl.setAttribute('data-rotate', deg);\n contextResizing._rotateVertical = /^(90|270)$/.test(this._w.Math.abs(deg).toString());\n this.plugins.resizing.setTransformSize.call(this, contextEl, null, null);\n \n this.selectComponent(contextEl, pluginName);\n break;\n case 'onalign':\n this.plugins.resizing.openAlignMenu.call(this);\n return;\n case 'align':\n const alignValue = value === 'basic' ? 'none' : value;\n currentModule.setAlign.call(this, alignValue, null, null, null);\n this.selectComponent(contextEl, pluginName);\n break;\n case 'caption':\n const caption = !currentContext._captionChecked;\n currentModule.openModify.call(this, true);\n currentContext._captionChecked = currentContext.captionCheckEl.checked = caption;\n \n currentModule.update_image.call(this, false, false, false);\n \n if (caption) {\n const captionText = this.util.getChildElement(currentContext._caption, function (current) {\n return current.nodeType === 3;\n });\n \n if (!captionText) {\n currentContext._caption.focus();\n } else {\n this.setRange(captionText, 0, captionText, captionText.textContent.length);\n }\n \n this.controllersOff();\n } else {\n this.selectComponent(contextEl, pluginName);\n currentModule.openModify.call(this, true);\n }\n \n break;\n case 'revert':\n currentModule.setOriginSize.call(this);\n this.selectComponent(contextEl, pluginName);\n break;\n case 'update':\n currentModule.openModify.call(this);\n this.controllersOff();\n break;\n case 'delete':\n currentModule.destroy.call(this);\n break;\n }\n \n // history stack\n this.history.push(false);\n },\n \n /**\n * @description Initialize the transform style (rotation) of the element.\n * @param {Element} element Target element\n */\n resetTransform: function (element) {\n const size = (element.getAttribute('data-size') || element.getAttribute('data-origin') || '').split(',');\n this.context.resizing._rotateVertical = false;\n \n element.style.maxWidth = '';\n element.style.transform = '';\n element.style.transformOrigin = '';\n element.setAttribute('data-rotate', '');\n element.setAttribute('data-rotateX', '');\n element.setAttribute('data-rotateY', '');\n \n this.plugins[this.context.resizing._resize_plugin].setSize.call(this, size[0] ? size[0] : 'auto', size[1] ? size[1] : '', true);\n },\n \n /**\n * @description Set the transform style (rotation) of the element.\n * @param {Element} element Target element\n * @param {Number|null} width Element's width size\n * @param {Number|null} height Element's height size\n */\n setTransformSize: function (element, width, height) {\n let percentage = element.getAttribute('data-percentage');\n const isVertical = this.context.resizing._rotateVertical;\n const deg = element.getAttribute('data-rotate') * 1;\n let transOrigin = '';\n \n if (percentage && !isVertical) {\n percentage = percentage.split(',');\n if (percentage[0] === 'auto' && percentage[1] === 'auto') {\n this.plugins[this.context.resizing._resize_plugin].setAutoSize.call(this);\n } else {\n this.plugins[this.context.resizing._resize_plugin].setPercentSize.call(this, percentage[0], percentage[1]);\n }\n } else {\n const cover = this.util.getParentElement(element, 'FIGURE');\n \n const offsetW = width || element.offsetWidth;\n const offsetH = height || element.offsetHeight;\n const w = (isVertical ? offsetH : offsetW) + 'px';\n const h = (isVertical ? offsetW : offsetH) + 'px';\n \n this.plugins[this.context.resizing._resize_plugin].cancelPercentAttr.call(this);\n this.plugins[this.context.resizing._resize_plugin].setSize.call(this, offsetW + 'px', offsetH + 'px', true);\n \n cover.style.width = w;\n cover.style.height = (!!this.context[this.context.resizing._resize_plugin]._caption ? '' : h);\n \n if (isVertical) {\n let transW = (offsetW/2) + 'px ' + (offsetW/2) + 'px 0';\n let transH = (offsetH/2) + 'px ' + (offsetH/2) + 'px 0';\n transOrigin = deg === 90 || deg === -270 ? transH : transW;\n }\n }\n \n element.style.transformOrigin = transOrigin;\n this.plugins.resizing._setTransForm(element, deg.toString(), element.getAttribute('data-rotateX') || '', element.getAttribute('data-rotateY') || '');\n \n if (isVertical) element.style.maxWidth = 'none';\n else element.style.maxWidth = '';\n \n this.plugins.resizing.setCaptionPosition.call(this, element);\n },\n \n _setTransForm: function (element, r, x, y) {\n let width = (element.offsetWidth - element.offsetHeight) * (/-/.test(r) ? 1 : -1);\n let translate = '';\n \n if (/[1-9]/.test(r) && (x || y)) {\n translate = x ? 'Y' : 'X';\n \n switch (r) {\n case '90':\n translate = x && y ? 'X' : y ? translate : '';\n break;\n case '270':\n width *= -1;\n translate = x && y ? 'Y' : x ? translate : '';\n break;\n case '-90':\n translate = x && y ? 'Y' : x ? translate : '';\n break;\n case '-270':\n width *= -1;\n translate = x && y ? 'X' : y ? translate : '';\n break;\n default:\n translate = '';\n }\n }\n \n if (r % 180 === 0) {\n element.style.maxWidth = '';\n }\n \n element.style.transform = 'rotate(' + r + 'deg)' + (x ? ' rotateX(' + x + 'deg)' : '') + (y ? ' rotateY(' + y + 'deg)' : '') + (translate ? ' translate' + translate + '(' + width + 'px)' : '');\n },\n \n /**\n * @description The position of the caption is set automatically.\n * @param {Element} element Target element (not caption element)\n */\n setCaptionPosition: function (element) {\n const figcaption = this.util.getChildElement(this.util.getParentElement(element, 'FIGURE'), 'FIGCAPTION');\n if (figcaption) {\n figcaption.style.marginTop = (this.context.resizing._rotateVertical ? element.offsetWidth - element.offsetHeight : 0) + 'px';\n }\n },\n \n /**\n * @description Mouse down event of resize handles\n * @param {MouseEvent} e Event object \n */\n onMouseDown_resize_handle: function (e) {\n e.stopPropagation();\n e.preventDefault();\n \n const contextResizing = this.context.resizing;\n const direction = contextResizing._resize_direction = e.target.classList[0];\n \n contextResizing._resizeClientX = e.clientX;\n contextResizing._resizeClientY = e.clientY;\n this.context.element.resizeBackground.style.display = 'block';\n contextResizing.resizeButton.style.display = 'none';\n contextResizing.resizeDiv.style.float = /l/.test(direction) ? 'right' : /r/.test(direction) ? 'left' : 'none';\n \n const closureFunc_bind = function closureFunc(e) {\n if (e.type === 'keydown' && e.keyCode !== 27) return;\n \n const change = contextResizing._isChange;\n contextResizing._isChange = false;\n \n this.removeDocEvent('mousemove', resizing_element_bind);\n this.removeDocEvent('mouseup', closureFunc_bind);\n this.removeDocEvent('keydown', closureFunc_bind);\n \n if (e.type === 'keydown') {\n this.controllersOff();\n this.context.element.resizeBackground.style.display = 'none';\n this.plugins[this.context.resizing._resize_plugin].init.call(this);\n } else {\n // element resize\n this.plugins.resizing.cancel_controller_resize.call(this, direction);\n // history stack\n if (change) this.history.push(false);\n }\n }.bind(this);\n \n const resizing_element_bind = this.plugins.resizing.resizing_element.bind(this, contextResizing, direction, this.context[contextResizing._resize_plugin]);\n this.addDocEvent('mousemove', resizing_element_bind);\n this.addDocEvent('mouseup', closureFunc_bind);\n this.addDocEvent('keydown', closureFunc_bind);\n },\n \n /**\n * @description Mouse move event after call \"onMouseDown_resize_handle\" of resize handles\n * The size of the module's \"div\" is adjusted according to the mouse move event.\n * @param {Object} contextResizing \"core.context.resizing\" object (binding argument)\n * @param {String} direction Direction (\"tl\", \"tr\", \"bl\", \"br\", \"lw\", \"th\", \"rw\", \"bh\") (binding argument)\n * @param {Object} plugin \"core.context[currentPlugin]\" object (binding argument)\n * @param {MouseEvent} e Event object\n */\n resizing_element: function (contextResizing, direction, plugin, e) {\n const clientX = e.clientX;\n const clientY = e.clientY;\n \n let resultW = plugin._element_w;\n let resultH = plugin._element_h;\n \n const w = plugin._element_w + (/r/.test(direction) ? clientX - contextResizing._resizeClientX : contextResizing._resizeClientX - clientX);\n const h = plugin._element_h + (/b/.test(direction) ? clientY - contextResizing._resizeClientY : contextResizing._resizeClientY - clientY);\n const wh = ((plugin._element_h / plugin._element_w) * w);\n \n if (/t/.test(direction)) contextResizing.resizeDiv.style.top = (plugin._element_h - (/h/.test(direction) ? h : wh)) + 'px';\n if (/l/.test(direction)) contextResizing.resizeDiv.style.left = (plugin._element_w - w) + 'px';\n \n if (/r|l/.test(direction)) {\n contextResizing.resizeDiv.style.width = w + 'px';\n resultW = w;\n }\n \n if (/^(t|b)[^h]$/.test(direction)) {\n contextResizing.resizeDiv.style.height = wh + 'px';\n resultH = wh;\n }\n else if (/^(t|b)h$/.test(direction)) {\n contextResizing.resizeDiv.style.height = h + 'px';\n resultH = h;\n }\n \n contextResizing._resize_w = resultW;\n contextResizing._resize_h = resultH;\n this.util.changeTxt(contextResizing.resizeDisplay, this._w.Math.round(resultW) + ' x ' + this._w.Math.round(resultH));\n contextResizing._isChange = true;\n },\n \n /**\n * @description Resize the element to the size of the \"div\" adjusted in the \"resizing_element\" method.\n * Called at the mouse-up event registered in \"onMouseDown_resize_handle\".\n * @param {String} direction Direction (\"tl\", \"tr\", \"bl\", \"br\", \"lw\", \"th\", \"rw\", \"bh\")\n */\n cancel_controller_resize: function (direction) {\n const isVertical = this.context.resizing._rotateVertical;\n this.controllersOff();\n this.context.element.resizeBackground.style.display = 'none';\n \n let w = this._w.Math.round(isVertical ? this.context.resizing._resize_h : this.context.resizing._resize_w);\n let h = this._w.Math.round(isVertical ? this.context.resizing._resize_w : this.context.resizing._resize_h);\n \n if (!isVertical && !/%$/.test(w)) {\n const padding = 16;\n const limit = this.context.element.wysiwygFrame.clientWidth - (padding * 2) - 2;\n \n if (this.util.getNumber(w, 0) > limit) {\n h = this._w.Math.round((h / w) * limit);\n w = limit;\n }\n }\n \n const pluginName = this.context.resizing._resize_plugin;\n this.plugins[pluginName].setSize.call(this, w, h, false, direction);\n if (isVertical) this.plugins.resizing.setTransformSize.call(this, this.context[this.context.resizing._resize_plugin]._element, w, h);\n\n this.selectComponent(this.context[pluginName]._element, pluginName);\n }\n };\n\n if (typeof noGlobal === typeof undefined) {\n if (!window.SUNEDITOR_MODULES) {\n Object.defineProperty(window, 'SUNEDITOR_MODULES', {\n enumerable: true,\n writable: false,\n configurable: false,\n value: {}\n });\n }\n\n Object.defineProperty(window.SUNEDITOR_MODULES, 'resizing', {\n enumerable: true,\n writable: false,\n configurable: false,\n value: resizing\n });\n }\n\n return resizing;\n}));","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n'use strict';\n\n(function (global, factory) {\n if (typeof module === 'object' && typeof module.exports === 'object') {\n module.exports = global.document ?\n factory(global, true) :\n function (w) {\n if (!w.document) {\n throw new Error('SUNEDITOR_MODULES a window with a document');\n }\n return factory(w);\n };\n } else {\n factory(global);\n }\n}(typeof window !== 'undefined' ? window : this, function (window, noGlobal) {\n const fileManager = {\n name: 'fileManager',\n _xmlHttp: null,\n\n _checkMediaComponent: function (tag) {\n if (/IMG/i.test(tag)) {\n return !/FIGURE/i.test(tag.parentElement.nodeName) || !/FIGURE/i.test(tag.parentElement.parentElement.nodeName);\n }\n return true;\n },\n\n /**\n * @description Upload the file to the server.\n * @param {String} uploadUrl Upload server url\n * @param {Object|null} uploadHeader Request header\n * @param {FormData} formData FormData in body\n * @param {Function|null} callBack Success call back function\n * @param {Function|null} errorCallBack Error call back function\n * @example this.plugins.fileManager.upload.call(this, imageUploadUrl, this.options.imageUploadHeader, formData, this.plugins.image.callBack_imgUpload.bind(this, info), this.functions.onImageUploadError);\n */\n upload: function (uploadUrl, uploadHeader, formData, callBack, errorCallBack) {\n this.showLoading();\n const filePlugin = this.plugins.fileManager;\n const xmlHttp = filePlugin._xmlHttp = this.util.getXMLHttpRequest();\n\n xmlHttp.onreadystatechange = filePlugin._callBackUpload.bind(this, xmlHttp, callBack, errorCallBack);\n xmlHttp.open('post', uploadUrl, true);\n if(uploadHeader !== null && typeof uploadHeader === 'object' && this._w.Object.keys(uploadHeader).length > 0){\n for(let key in uploadHeader){\n xmlHttp.setRequestHeader(key, uploadHeader[key]);\n }\n }\n xmlHttp.send(formData);\n },\n\n _callBackUpload: function (xmlHttp, callBack, errorCallBack) {\n if (xmlHttp.readyState === 4) {\n if (xmlHttp.status === 200) {\n try {\n callBack(xmlHttp);\n } catch (e) {\n throw Error('[SUNEDITOR.fileManager.upload.callBack.fail] cause : \"' + e.message + '\"');\n } finally {\n this.closeLoading();\n }\n } else { // exception\n this.closeLoading();\n const res = !xmlHttp.responseText ? xmlHttp : JSON.parse(xmlHttp.responseText);\n if (typeof errorCallBack !== 'function' || errorCallBack('', res, this)) {\n const err = '[SUNEDITOR.fileManager.upload.serverException] status: ' + xmlHttp.status + ', response: ' + (res.errorMessage || xmlHttp.responseText);\n this.functions.noticeOpen(err);\n throw Error(err);\n }\n }\n }\n },\n \n /**\n * @description Checke the file's information and modify the tag that does not fit the format.\n * @param {String} pluginName Plugin name\n * @param {Array} tagNames Tag array to check\n * @param {Function|null} uploadEventHandler Event handler to process updated file info after checking (used in \"setInfo\")\n * @param {Function} modifyHandler A function to modify a tag that does not fit the format (Argument value: Tag element)\n * @param {Boolean} resizing True if the plugin is using a resizing module\n * @example \n * const modifyHandler = function (tag) {\n * imagePlugin.onModifyMode.call(this, tag, null);\n * imagePlugin.openModify.call(this, true);\n * imagePlugin.update_image.call(this, true, false, true);\n * }.bind(this);\n * this.plugins.fileManager.checkInfo.call(this, 'image', ['img'], this.functions.onImageUpload, modifyHandler, true);\n */\n checkInfo: function (pluginName, tagNames, uploadEventHandler, modifyHandler, resizing) {\n let tags = [];\n for (let i = 0, len = tagNames.length; i < len; i++) {\n tags = tags.concat([].slice.call(this.context.element.wysiwyg.querySelectorAll(tagNames[i] + ':not([data-se-embed=\"true\"])')));\n }\n\n const fileManagerPlugin = this.plugins.fileManager;\n const context = this.context[pluginName];\n const infoList = context._infoList;\n const setFileInfo = fileManagerPlugin.setInfo.bind(this);\n\n if (tags.length === infoList.length) {\n // reset\n if (this._componentsInfoReset) {\n for (let i = 0, len = tags.length; i < len; i++) {\n setFileInfo(pluginName, tags[i], uploadEventHandler, null, resizing);\n }\n return ;\n } else {\n let infoUpdate = false;\n for (let i = 0, len = infoList.length, info; i < len; i++) {\n info = infoList[i];\n if (tags.filter(function (t) { return info.src === t.src && info.index.toString() === t.getAttribute('data-index'); }).length === 0) {\n infoUpdate = true;\n break;\n }\n }\n // pass\n if (!infoUpdate) return;\n }\n }\n\n // check\n const _resize_plugin = resizing ? this.context.resizing._resize_plugin : '';\n if (resizing) this.context.resizing._resize_plugin = pluginName;\n const currentTags = [];\n const infoIndex = [];\n for (let i = 0, len = infoList.length; i < len; i++) {\n infoIndex[i] = infoList[i].index;\n }\n context.__updateTags = tags;\n\n while (tags.length > 0) {\n const tag = tags.shift();\n if (!this.util.getParentElement(tag, this.util.isMediaComponent) || !fileManagerPlugin._checkMediaComponent(tag)) {\n currentTags.push(context._infoIndex);\n modifyHandler(tag);\n } else if (!tag.getAttribute('data-index') || infoIndex.indexOf(tag.getAttribute('data-index') * 1) < 0) {\n currentTags.push(context._infoIndex);\n tag.removeAttribute('data-index');\n setFileInfo(pluginName, tag, uploadEventHandler, null, resizing);\n } else {\n currentTags.push(tag.getAttribute('data-index') * 1);\n }\n }\n\n for (let i = 0, dataIndex; i < infoList.length; i++) {\n dataIndex = infoList[i].index;\n if (currentTags.indexOf(dataIndex) > -1) continue;\n\n infoList.splice(i, 1);\n if (typeof uploadEventHandler === 'function') uploadEventHandler(null, dataIndex, 'delete', null, 0, this);\n i--;\n }\n\n if (resizing) this.context.resizing._resize_plugin = _resize_plugin;\n },\n\n /**\n * @description Create info object of file and add it to \"_infoList\" (this.context[pluginName]._infoList[])\n * @param {String} pluginName Plugin name \n * @param {Element} element \n * @param {Function|null} uploadEventHandler Event handler to process updated file info (created in setInfo)\n * @param {Object|null} file \n * @param {Boolean} resizing True if the plugin is using a resizing module\n * @example \n * uploadCallBack {.. file = { name: fileList[i].name, size: fileList[i].size };\n * this.plugins.fileManager.setInfo.call(this, 'image', oImg, this.functions.onImageUpload, file, true);\n */\n setInfo: function (pluginName, element, uploadEventHandler, file, resizing) {\n const _resize_plugin = resizing ? this.context.resizing._resize_plugin : '';\n if (resizing) this.context.resizing._resize_plugin = pluginName;\n \n const plguin = this.plugins[pluginName];\n const context = this.context[pluginName];\n const infoList = context._infoList;\n let dataIndex = element.getAttribute('data-index');\n let info = null;\n let state = '';\n\n if (!file) {\n file = {\n 'name': element.getAttribute('data-file-name') || (typeof element.src === 'string' ? element.src.split('/').pop() : ''),\n 'size': element.getAttribute('data-file-size') || 0\n };\n }\n \n // create\n if (!dataIndex || this._componentsInfoInit) {\n state = 'create';\n dataIndex = context._infoIndex++;\n \n element.setAttribute('data-index', dataIndex);\n element.setAttribute('data-file-name', file.name);\n element.setAttribute('data-file-size', file.size);\n \n info = {\n src: element.src,\n index: dataIndex * 1,\n name: file.name,\n size: file.size\n };\n \n infoList.push(info);\n } else { // update\n state = 'update';\n dataIndex *= 1;\n \n for (let i = 0, len = infoList.length; i < len; i++) {\n if (dataIndex === infoList[i].index) {\n info = infoList[i];\n break;\n }\n }\n \n if (!info) {\n dataIndex = context._infoIndex++;\n info = { index: dataIndex };\n infoList.push(info);\n }\n \n info.src = element.src;\n info.name = element.getAttribute(\"data-file-name\");\n info.size = element.getAttribute(\"data-file-size\") * 1;\n }\n \n // method bind\n info.element = element;\n info.delete = plguin.destroy.bind(this, element);\n info.select = function (element) {\n element.scrollIntoView(true);\n this._w.setTimeout(plguin.select.bind(this, element));\n }.bind(this, element);\n \n if (resizing) {\n if (!element.getAttribute('origin-size') && element.naturalWidth) {\n element.setAttribute('origin-size', element.naturalWidth + ',' + element.naturalHeight);\n }\n \n if (!element.getAttribute('data-origin')) {\n const container = this.util.getParentElement(element, this.util.isMediaComponent);\n const cover = this.util.getParentElement(element, 'FIGURE');\n \n const w = this.plugins.resizing._module_getSizeX.call(this, context, element, cover, container);\n const h = this.plugins.resizing._module_getSizeY.call(this, context, element, cover, container);\n element.setAttribute('data-origin', w + ',' + h);\n element.setAttribute('data-size', w + ',' + h);\n }\n \n if (!element.style.width) {\n const size = (element.getAttribute('data-size') || element.getAttribute('data-origin') || '').split(',');\n plguin.onModifyMode.call(this, element, null);\n plguin.applySize.call(this, size[0], size[1]);\n }\n \n this.context.resizing._resize_plugin = _resize_plugin;\n }\n\n if (typeof uploadEventHandler === 'function') uploadEventHandler(element, dataIndex, state, info, --context._uploadFileLength < 0 ? 0 : context._uploadFileLength, this);\n },\n\n /**\n * @description Delete info object at \"_infoList\"\n * @param {String} pluginName Plugin name \n * @param {Number} index index of info object (this.context[pluginName]._infoList[].index)\n * @param {Function|null} uploadEventHandler Event handler to process updated file info (created in setInfo)\n */\n deleteInfo: function (pluginName, index, uploadEventHandler) {\n if (index >= 0) {\n const infoList = this.context[pluginName]._infoList;\n \n for (let i = 0, len = infoList.length; i < len; i++) {\n if (index === infoList[i].index) {\n infoList.splice(i, 1);\n if (typeof uploadEventHandler === 'function') uploadEventHandler(null, index, 'delete', null, 0, this);\n return;\n }\n }\n }\n },\n\n /**\n * @description Reset info object and \"_infoList = []\", \"_infoIndex = 0\"\n * @param {String} pluginName Plugin name \n * @param {Function|null} uploadEventHandler Event handler to process updated file info (created in setInfo)\n */\n resetInfo: function (pluginName, uploadEventHandler) {\n const context = this.context[pluginName];\n\n if (typeof uploadEventHandler === 'function') {\n const infoList = context._infoList;\n for (let i = 0, len = infoList.length; i < len; i++) {\n uploadEventHandler(null, infoList[i].index, 'delete', null, 0, this);\n }\n }\n\n context._infoList = [];\n context._infoIndex = 0;\n }\n };\n\n if (typeof noGlobal === typeof undefined) {\n if (!window.SUNEDITOR_MODULES) {\n Object.defineProperty(window, 'SUNEDITOR_MODULES', {\n enumerable: true,\n writable: false,\n configurable: false,\n value: {}\n });\n }\n\n Object.defineProperty(window.SUNEDITOR_MODULES, 'fileManager', {\n enumerable: true,\n writable: false,\n configurable: false,\n value: fileManager\n });\n }\n\n return fileManager;\n}));","/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2019 @Gundolf68\n * MIT license.\n */\n'use strict';\n\n(function (global, factory) {\n if (typeof module === 'object' && typeof module.exports === 'object') {\n module.exports = global.document ?\n factory(global, true) :\n function (w) {\n if (!w.document) {\n throw new Error('SUNEDITOR_LANG a window with a document');\n }\n return factory(w);\n };\n } else {\n factory(global);\n }\n}(typeof window !== 'undefined' ? window : this, function (window, noGlobal) {\n const lang = {\n code: 'de',\n toolbar: {\n default: 'Standard',\n save: 'Speichern',\n font: 'Schriftart',\n formats: 'Format',\n fontSize: 'Schriftgröße',\n bold: 'Fett',\n underline: 'Unterstrichen',\n italic: 'Kursiv',\n strike: 'Durchgestrichen',\n subscript: 'Tiefgestellt',\n superscript: 'Hochgestellt',\n removeFormat: 'Format entfernen',\n fontColor: 'Schriftfarbe',\n hiliteColor: 'Farbe für Hervorhebungen',\n indent: 'Einzug vergrößern',\n outdent: 'Einzug verkleinern',\n align: 'Ausrichtung',\n alignLeft: 'Links ausrichten',\n alignRight: 'Rechts ausrichten',\n alignCenter: 'Zentriert ausrichten',\n alignJustify: 'Blocksatz',\n list: 'Liste',\n orderList: 'Nummerierte Liste',\n unorderList: 'Aufzählung',\n horizontalRule: 'Horizontale Linie',\n hr_solid: 'Strich',\n hr_dotted: 'Gepunktet',\n hr_dashed: 'Gestrichelt',\n table: 'Tabelle',\n link: 'Link',\n math: 'Mathematik',\n image: 'Bild',\n video: 'Video',\n audio: 'Audio',\n fullScreen: 'Vollbild',\n showBlocks: 'Blockformatierungen anzeigen',\n codeView: 'Quelltext anzeigen',\n undo: 'Rückgängig',\n redo: 'Wiederholen',\n preview: 'Vorschau',\n print: 'Drucken',\n tag_p: 'Absatz',\n tag_div: 'Normal (DIV)',\n tag_h: 'Header',\n tag_blockquote: 'Zitat',\n tag_pre: 'Quellcode',\n template: 'Vorlage',\n lineHeight: 'Zeilenhöhe',\n paragraphStyle: 'Absatzstil',\n textStyle: 'Textstil',\n imageGallery: 'Bildergalerie',\n dir_ltr: 'Links nach rechts',\n dir_rtl: 'Rechts nach links',\n mention: 'Erwähnen'\n },\n dialogBox: {\n linkBox: {\n title: 'Link einfügen',\n url: 'Link-URL',\n text: 'Link-Text',\n newWindowCheck: 'In neuem Fenster anzeigen',\n downloadLinkCheck: 'Download-Link',\n bookmark: 'Lesezeichen'\n },\n mathBox: {\n title: 'Mathematik',\n inputLabel: 'Mathematische Notation',\n fontSizeLabel: 'Schriftgröße',\n previewLabel: 'Vorschau'\n },\n imageBox: {\n title: 'Bild einfügen',\n file: 'Datei auswählen',\n url: 'Bild-URL',\n altText: 'Alternativer Text'\n },\n videoBox: {\n title: 'Video einfügen',\n file: 'Datei auswählen',\n url: 'Video-URL, YouTube/Vimeo'\n },\n audioBox: {\n title: 'Audio einfügen',\n file: 'Datei auswählen',\n url: 'Audio-URL'\n },\n browser: {\n tags: 'Stichworte',\n search: 'Suche',\n },\n caption: 'Beschreibung eingeben',\n close: 'Schließen',\n submitButton: 'Übernehmen',\n revertButton: 'Rückgängig',\n proportion: 'Seitenverhältnis beibehalten',\n basic: 'Standard',\n left: 'Links',\n right: 'Rechts',\n center: 'Zentriert',\n width: 'Breite',\n height: 'Höhe',\n size: 'Größe',\n ratio: 'Verhältnis'\n },\n controller: {\n edit: 'Bearbeiten',\n unlink: 'Link entfernen',\n remove: 'Löschen',\n insertRowAbove: 'Zeile oberhalb einfügen',\n insertRowBelow: 'Zeile unterhalb einfügen',\n deleteRow: 'Zeile löschen',\n insertColumnBefore: 'Spalte links einfügen',\n insertColumnAfter: 'Spalte rechts einfügen',\n deleteColumn: 'Spalte löschen',\n fixedColumnWidth: 'Feste Spaltenbreite',\n resize100: 'Zoom 100%',\n resize75: 'Zoom 75%',\n resize50: 'Zoom 50%',\n resize25: 'Zoom 25%',\n autoSize: 'Automatische Größenanpassung',\n mirrorHorizontal: 'Horizontal spiegeln',\n mirrorVertical: 'Vertikal spiegeln',\n rotateLeft: 'Nach links drehen',\n rotateRight: 'Nach rechts drehen',\n maxSize: 'Maximale Größe',\n minSize: 'Mindestgröße',\n tableHeader: 'Tabellenüberschrift',\n mergeCells: 'Zellen verbinden',\n splitCells: 'Zellen teilen',\n HorizontalSplit: 'Horizontal teilen',\n VerticalSplit: 'Vertikal teilen'\n },\n menu: {\n spaced: 'Buchstabenabstand',\n bordered: 'Umrandet',\n neon: 'Neon',\n translucent: 'Durchscheinend',\n shadow: 'Schatten',\n code: 'Quellcode'\n }\n };\n\n if (typeof noGlobal === typeof undefined) {\n if (!window.SUNEDITOR_LANG) {\n Object.defineProperty(window, 'SUNEDITOR_LANG', {\n enumerable: true,\n writable: false,\n configurable: false,\n value: {}\n });\n }\n\n Object.defineProperty(window.SUNEDITOR_LANG, 'de', {\n enumerable: true,\n writable: true,\n configurable: true,\n value: lang\n });\n }\n\n return lang;\n}));\n"]}