{"version":3,"sources":["oojs-ui-widgets.js"],"names":["OO","ui","mixin","DraggableElement","config","this","index","$handle","$element","wasHandleUsed","addClass","attr","on","mousedown","onDragMouseDown","bind","dragstart","onDragStart","dragover","onDragOver","dragend","onDragEnd","drop","onDrop","initClass","cancelButtonMouseDownEvents","prototype","e","contains","target","element","dataTransfer","originalEvent","dropEffect","effectAllowed","setData","getIndex","err","setTimeout","removeClass","emit","preventDefault","setIndex","data","DraggableGroupElement","GroupElement","call","orientation","dragItem","itemKeys","dir","itemsOrder","aggregate","connect","itemDragStart","itemDrop","itemDragEnd","Array","isArray","items","addItems","append","$status","toggleClass","mixinClass","onItemDragStart","item","slice","updateIndexes","css","setDragItem","i","len","length","onItemDropOrDragEnd","targetIndex","originalIndex","getDragItem","indexOf","reorder","unsetDragItem","dragOverObj","$optionWidget","itemOffset","itemMidpoint","itemBoundingRect","itemSize","cssOutput","dragPosition","overIndex","itemPosition","after","dragItemIndex","clientX","clientY","getElementDocument","elementFromPoint","$","closest","offset","getBoundingClientRect","position","width","left","top","height","$group","children","eq","prepend","splice","newIndex","off","RequestManager","requestCache","requestQuery","requestRequest","getRequestData","ourRequest","widget","value","getRequestQuery","deferred","Deferred","abortRequest","Object","hasOwnProperty","resolve","pushPending","getRequest","always","popPending","done","response","getRequestCacheDataFromResponse","fail","reject","promise","oldRequest","abort","LookupElement","extend","highlightFirst","$overlay","lookupMenu","FloatingMenuSelectWidget","input","$container","allowSuggestionsWhenEmpty","lookupsDisabled","lookupInputFocused","lookupHighlightFirstItem","$input","focus","onLookupInputFocus","blur","onLookupInputBlur","onLookupInputMouseDown","change","toggle","choose","populateLookupMenu","closeLookupMenu","isVisible","onLookupInputChange","onLookupMenuToggle","visible","abortLookupRequest","clearItems","onLookupMenuItemChoose","setValue","getData","getLookupMenu","setLookupsDisabled","disabled","openLookupMenu","isEmpty","getValue","isReadOnly","lookupQuery","getLookupMenuItems","initializeLookupMenuSelection","getSelectedItem","highlightItem","getFirstSelectableItem","then","getLookupMenuOptionsFromData","getLookupRequest","getLookupCacheDataFromResponse","setReadOnly","readOnly","TextInputWidget","CardLayout","name","isPlainObject","undefined","scrollable","parent","label","tabItem","active","inheritClass","PanelLayout","getName","isActive","getTabItem","setTabItem","setupTabItem","setLabel","setActive","PageLayout","outlineItem","getOutlineItem","setOutlineItem","setupOutlineItem","StackLayout","currentItem","continuous","debounce","onScroll","getRect","rect","bottom","containerRect","currentRect","currentIndex","getCurrentItem","unsetCurrentItem","prevItem","updateHiddenState","setItem","removeItems","selectedItem","MenuLayout","showMenu","menuPosition","$menu","$content","setMenuPosition","toggleMenu","Layout","isMenuVisible","getMenuPosition","BookletLayout","currentPageName","pages","ignoreFocus","stackLayout","autoFocus","outlineVisible","outlined","editable","outlineControlsWidget","outlineSelectWidget","OutlineSelectWidget","outlinePanel","OutlineControlsWidget","set","select","scrolling","visibleItemChange","onStackLayoutFocus","$target","setPage","onStackLayoutVisibleItemChange","page","selectItemByData","onStackLayoutSet","layout","scrollElementIntoView","complete","itemIndex","getItems","selectFirstSelectablePage","activeElement","focusFirstFocusable","findFocusable","onOutlineSelectWidgetSelect","isOutlined","isEditable","isOutlineVisible","toggleOutline","show","getClosestPage","next","prev","level","getItemFromData","getLevel","getOutline","getOutlineControls","getPage","getCurrentPage","getCurrentPageName","addPages","stackLayoutPages","remove","push","removePages","OutlineOptionWidget","clearPages","$focused","previousPage","find","selectItem","IndexLayout","currentCardName","cards","expanded","tabSelectWidget","TabSelectWidget","tabPanel","setCard","card","selectFirstSelectableCard","onTabSelectWidgetSelect","getClosestCard","getTabs","getCard","getCurrentCard","getCurrentCardName","addCards","stackLayoutCards","removeCards","TabOptionWidget","clearCards","previousCard","ToggleWidget","Widget","toString","ToggleButtonWidget","ButtonElement","IconElement","IndicatorElement","LabelElement","TitledElement","$titled","$button","FlaggedElement","TabIndexedElement","$tabIndexed","click","$icon","$label","$indicator","onAction","setButtonElement","removeAttr","ToggleSwitchWidget","dragging","dragStart","sliding","$glow","$grip","onClick","keypress","onKeyPress","isDisabled","which","MouseButtons","LEFT","Keys","SPACE","ENTER","outline","icon","$movers","upButton","ButtonWidget","framed","title","msg","downButton","removeButton","abilities","move","add","setAbilities","ability","onOutlineChange","firstMovable","lastMovable","movable","isMovable","removable","isRemovable","setDisabled","setLevel","DecoratedOptionWidget","highlightable","scrollIntoViewOnSelect","levelClass","levels","setMovable","updateThemeClasses","setRemovable","constructor","Math","max","min","bindKeyDownListener","unbindKeyDownListener","SelectWidget","ButtonOptionWidget","tabIndex","contents","setSelected","state","selectable","ButtonSelectWidget","OptionWidget","CapsuleItemWidget","ItemWidget","closeButton","indicator","onCloseClick","keydown","onKeyDown","getElementGroup","isFunction","editItem","keyCode","BACKSPACE","DELETE","getPreviousItem","RIGHT","getNextItem","CapsuleMultiSelectWidget","$tabFocus","allowArbitrary","popup","align","anchor","PopupElement","menu","filterFromInput","onFocusForPopup","onPopupFocusOut","$autoCloseIgnore","onInputFocus","onInputBlur","propertychange change click mouseup keydown keyup input cut paste select focus","updateInputSize","onMouseDown","prop","role","aria-autocomplete","setItemsFromData","onMenuItemsChange","createItemWidget","getItemsData","map","datas","each","j","String","addItemsFromData","addItemFromLabel","getItemFromLabel","val","trim","removeItemsFromData","same","l","oldItems","getMenu","clearInput","setSize","filter","isFocusableElement","first","document","has","ESCAPE","metaKey","ctrlKey","$lastItem","direction","contentWidth","currentWidth","bestWidth","last","Element","getDir","scrollWidth","innerWidth","outerWidth","floor","onMenuChoose","updateDisabled","SelectFileWidget","dragHandler","accept","placeholder","notsupported","droppable","showDropTarget","thumbnailSizeLimit","PendingElement","$pending","$info","isSupported","currentFile","onFileSelectedHandler","onFileSelected","selectButton","classes","clearButton","onDragEnterOrOver","dragenter","dragleave","onDragLeave","addInput","setIcon","$thumbnail","setPendingElement","$dropTarget","onDropTargetClick","text","updateUI","isSupportedCache","files","file","type","loadAndGetImageUrl","url","IconWidget","empty","reader","FileReader","getProp","size","onload","event","img","createElement","addEventListener","naturalWidth","naturalHeight","result","src","readAsDataURL","stopPropagation","tabindex","join","isAllowedType","mimeType","mimeTest","substr","onClearClick","itemOrFile","droppableFile","dt","ProgressBarWidget","$bar","progress","setProgress","aria-valuemin","aria-valuemax","tagName","getProgress","SearchWidget","query","results","$query","$results","enter","onQueryKeydown","highlightedItem","nextItem","DOWN","UP","getHighlightedItem","getRelativeSelectableItem","onQueryChange","onQueryEnter","chooseItem","getQuery","getResults","NumberInputWidget","isInteger","Infinity","step","pageStep","minusButton","plusButton","wheel mousewheel DOMMouseScroll","onWheel","setIsInteger","setRange","setStep","$field","setValidation","validateNumber","flag","setValidityFlag","getIsInteger","Error","getRange","getStep","getNumericValue","adjustValue","delta","n","v","isNaN","isFinite","round","onButtonClick","deltaMode","sawWheelEvent","deltaY","deltaX","wheelDeltaX","wheelDeltaY","wheelDelta","detail","PAGEUP","PAGEDOWN"],"mappings":";CAUE,SAAWA,GAEb,YAeAA,GAAGC,GAAGC,MAAMC,iBAAmB,SAAoCC,GAClEA,EAASA,MAGTC,KAAKC,MAAQ,KACbD,KAAKE,QAAUH,EAAOG,SAAWF,KAAKG,SACtCH,KAAKI,cAAgB,KAGrBJ,KAAKG,SAASE,SAAU,0BAItBC,KAAM,aAAa,GACnBC,IACAC,UAAWR,KAAKS,gBAAgBC,KAAMV,MACtCW,UAAWX,KAAKY,YAAYF,KAAMV,MAClCa,SAAUb,KAAKc,WAAWJ,KAAMV,MAChCe,QAASf,KAAKgB,UAAUN,KAAMV,MAC9BiB,KAAMjB,KAAKkB,OAAOR,KAAMV,QAE1BA,KAAKE,QAAQG,SAAU,kCAGxBV,EAAGwB,UAAWxB,EAAGC,GAAGC,MAAMC,kBA4B1BH,EAAGC,GAAGC,MAAMC,iBAAZH,UAAoCyB,6BAA8B,EAUlEzB,EAAGC,GAAGC,MAAMC,iBAAiBuB,UAAUZ,gBAAkB,SAAWa,GACnEtB,KAAKI,cAEJJ,KAAKE,QAAS,KAAQF,KAAKG,SAAU,IAErCR,EAAGC,GAAG2B,SAAUvB,KAAKE,QAAS,GAAKoB,EAAEE,QAAQ,IAU/C7B,EAAGC,GAAGC,MAAMC,iBAAiBuB,UAAUT,YAAc,SAAWU,GAC/D,GAAIG,GAAUzB,KACb0B,EAAeJ,EAAEK,cAAcD,YAEhC,KAAM1B,KAAKI,cACV,OAAO,CAIRsB,GAAaE,WAAa,OAC1BF,EAAaG,cAAgB,MAI7B,KACCH,EAAaI,QAAS,kCAAmC9B,KAAK+B,YAC7D,MAAQC,IAaV,MATAhC,MAAKG,SAASE,SAAU,gCAExB4B,WAAY,WACXR,EAAQtB,SACN+B,YAAa,gCACb7B,SAAU,wCAGbL,KAAKmC,KAAM,YAAanC,OACjB,GASRL,EAAGC,GAAGC,MAAMC,iBAAiBuB,UAAUL,UAAY,WAClDhB,KAAKG,SAAS+B,YAAa,sCAC3BlC,KAAKmC,KAAM,YAUZxC,EAAGC,GAAGC,MAAMC,iBAAiBuB,UAAUH,OAAS,SAAWI,GAC1DA,EAAEc,iBACFpC,KAAKmC,KAAM,OAAQb,IASpB3B,EAAGC,GAAGC,MAAMC,iBAAiBuB,UAAUP,WAAa,SAAWQ,GAC9DA,EAAEc,kBAUHzC,EAAGC,GAAGC,MAAMC,iBAAiBuB,UAAUgB,SAAW,SAAWpC,GACvDD,KAAKC,QAAUA,IACnBD,KAAKC,MAAQA,EACbD,KAAKG,SAASmC,KAAM,QAASrC,KAU/BN,EAAGC,GAAGC,MAAMC,iBAAiBuB,UAAUU,SAAW,WACjD,MAAO/B,MAAKC,OAmBbN,EAAGC,GAAGC,MAAM0C,sBAAwB,SAAyCxC,GAE5EA,EAASA,MAGTJ,EAAGC,GAAGC,MAAM2C,aAAaC,KAAMzC,KAAMD,GAGrCC,KAAK0C,YAAc3C,EAAO2C,aAAe,WACzC1C,KAAK2C,SAAW,KAChB3C,KAAK4C,YACL5C,KAAK6C,IAAM,KACX7C,KAAK8C,WAAa,KAGlB9C,KAAK+C,WACJpC,UAAW,gBACXI,QAAS,cACTE,KAAM,aAEPjB,KAAKgD,QAAShD,MACbiD,cAAe,kBACfC,SAAU,sBACVC,YAAa,wBAITC,MAAMC,QAAStD,EAAOuD,QAC1BtD,KAAKuD,SAAUxD,EAAOuD,OAEvBtD,KAAKG,SACHE,SAAU,+BACVmD,OAAQxD,KAAKyD,SACbC,YAAa,yCAA+D,eAArB1D,KAAK0C,cAI/D/C,EAAGgE,WAAYhE,EAAGC,GAAGC,MAAM0C,sBAAuB5C,EAAGC,GAAGC,MAAM2C,cA4B9D7C,EAAGC,GAAGC,MAAM0C,sBAAsBlB,UAAUuC,gBAAkB,SAAWC,GAGxE7D,KAAK8C,WAAa9C,KAAKsD,MAAMQ,QAC7B9D,KAAK+D,gBACqB,eAArB/D,KAAK0C,cAGT1C,KAAK6C,IAAM7C,KAAKG,SAAS6D,IAAK,cAE/BhE,KAAKiE,YAAaJ,IAMnBlE,EAAGC,GAAGC,MAAM0C,sBAAsBlB,UAAU0C,cAAgB,WAC3D,GAAIG,GAAGC,CAGP,KAAMD,EAAI,EAAGC,EAAMnE,KAAK8C,WAAWsB,OAAYD,EAAJD,EAASA,IACnDlE,KAAK8C,WAAYoB,GAAI7B,SAAU6B,IAUjCvE,EAAGC,GAAGC,MAAM0C,sBAAsBlB,UAAUgD,oBAAsB,WACjE,GAAIC,GAAaC,EAChBV,EAAO7D,KAAKwE,aAgBb,OAZKX,KACJU,EAAgBvE,KAAKsD,MAAMmB,QAASZ,GAEpCS,EAAcT,EAAK9B,YAAe8B,EAAK9B,WAAawC,EAAgB,EAAI,GACnED,IAAgBC,IACpBvE,KAAK0E,QAAS1E,KAAKwE,cAAeF,GAClCtE,KAAKmC,KAAM,UAAWnC,KAAKwE,cAAeF,IAE3CtE,KAAK+D,iBAEN/D,KAAK2E,iBAEE,GAURhF,EAAGC,GAAGC,MAAM0C,sBAAsBlB,UAAUP,WAAa,SAAWQ,GACnE,GAAIsD,GAAaC,EAAeC,EAAYC,EAAcC,EACzDC,EAAUC,EAAWC,EAAcC,EAAWC,EAAcC,EAC5DhB,EAAc,KACdT,EAAO7D,KAAKwE,cACZe,EAAgB1B,EAAK9B,WACrByD,EAAUlE,EAAEK,cAAc6D,QAC1BC,EAAUnE,EAAEK,cAAc8D,OAG3Bb,GAAc5E,KAAK0F,qBAAqBC,iBAAkBH,EAASC,GACnEZ,EAAgBe,EAAGhB,GAAciB,QAAS,2BACrChB,EAAe,KACnBC,EAAaD,EAAciB,SAC3Bd,EAAmBH,EAAe,GAAIkB,wBACtCV,EAAeR,EAAcmB,WAC7BZ,EAAYP,EAAcvC,KAAM,UAIhCwC,GACAM,IAAcG,IAEY,eAArBvF,KAAK0C,aAETuC,EAAWD,EAAiBiB,MAC5BlB,EAAeC,EAAiBkB,KAAOjB,EAAW,EAClDE,EAAeK,EAIfN,GACCgB,KAAqBnB,EAAfI,EAA8BE,EAAaa,KAAOb,EAAaa,KAAOjB,EAC5EkB,IAAKd,EAAac,OAInBlB,EAAWD,EAAiBoB,OAC5BrB,EAAeC,EAAiBmB,IAAMlB,EAAW,EACjDE,EAAeM,EAIfP,GACCiB,IAAoBpB,EAAfI,EAA8BE,EAAac,IAAMd,EAAac,IAAMlB,EACzEiB,KAAMb,EAAaa,OAMpBZ,EADyB,eAArBtF,KAAK0C,aAA6C,QAAb1C,KAAK6C,IACvBkC,EAAfI,EAEAA,EAAeJ,EAExBT,EAAcc,GAAcE,EAAQ,EAAI,IAEnChB,IAAgBiB,GAAiBjB,IAAgBiB,EAAgB,KACrEjB,EAAc,OAGK,OAAhBA,IACCA,EAAc,EAClBtE,KAAKqG,OAAOC,WAAWC,GAAIjC,EAAc,GAAIgB,MAAOzB,EAAK1D,UAEzDH,KAAKqG,OAAOG,QAAS3C,EAAK1D,UAG3BH,KAAK8C,WAAW2D,OAAQnC,GAAgBA,EAAciB,EAAgB,EAAI,GAAK,EAC9EvF,KAAK8C,WAAW2D,OAAQlB,EAAe,GAAK,IAE7CvF,KAAK+D,gBACL/D,KAAKmC,KAAM,OAAQ0B,EAAMS,IAG1BhD,EAAEc,kBASHzC,EAAGC,GAAGC,MAAM0C,sBAAsBlB,UAAUqD,QAAU,SAAWb,EAAM6C,GACtE1G,KAAKuD,UAAYM,GAAQ6C,IAQ1B/G,EAAGC,GAAGC,MAAM0C,sBAAsBlB,UAAU4C,YAAc,SAAWJ,GACpE7D,KAAK2C,SAAWkB,EAChB7D,KAAKG,SAASI,GAAI,WAAYP,KAAKc,WAAWJ,KAAMV,OACpDA,KAAKG,SAASE,SAAU,yCAMzBV,EAAGC,GAAGC,MAAM0C,sBAAsBlB,UAAUsD,cAAgB,WAC3D3E,KAAK2C,SAAW,KAChB3C,KAAKG,SAASwG,IAAK,YACnB3G,KAAKG,SAAS+B,YAAa,yCAQ5BvC,EAAGC,GAAGC,MAAM0C,sBAAsBlB,UAAUmD,YAAc,WACzD,MAAOxE,MAAK2C,UAYbhD,EAAGC,GAAGC,MAAM+G,eAAiB,WAC5B5G,KAAK6G,gBACL7G,KAAK8G,aAAe,KACpB9G,KAAK+G,eAAiB,MAKvBpH,EAAGwB,UAAWxB,EAAGC,GAAGC,MAAM+G,gBAS1BjH,EAAGC,GAAGC,MAAM+G,eAAevF,UAAU2F,eAAiB,WACrD,GAGCC,GAHGC,EAASlH,KACZmH,EAAQnH,KAAKoH,kBACbC,EAAWzB,EAAE0B,UA4Cd,OAzCAtH,MAAKuH,eACAC,OAAOnG,UAAUoG,eAAehF,KAAMzC,KAAK6G,aAAcM,GAC7DE,EAASK,QAAS1H,KAAK6G,aAAcM,KAEhCnH,KAAK2H,aACT3H,KAAK2H,cAEN3H,KAAK8G,aAAeK,EACpBF,EAAajH,KAAK+G,eAAiB/G,KAAK4H,aACxCX,EACEY,OAAQ,WAOHX,EAAOY,YACXZ,EAAOY,eAGRC,KAAM,SAAWC,GAGZf,IAAeC,EAAOH,iBAC1BG,EAAOJ,aAAe,KACtBI,EAAOH,eAAiB,KACxBG,EAAOL,aAAcM,GAAUD,EAAOe,gCAAiCD,GACvEX,EAASK,QAASR,EAAOL,aAAcM,OAGxCe,KAAM,WAGDjB,IAAeC,EAAOH,iBAC1BG,EAAOJ,aAAe,KACtBI,EAAOH,eAAiB,KACxBM,EAASc,aAINd,EAASe,WAQjBzI,EAAGC,GAAGC,MAAM+G,eAAevF,UAAUkG,aAAe,WACnD,GAAIc,GAAarI,KAAK+G,cACjBsB,KAGJrI,KAAK+G,eAAiB,KACtB/G,KAAK8G,aAAe,KACpBuB,EAAWC,UAYb3I,EAAGC,GAAGC,MAAM+G,eAAevF,UAAU+F,gBAAkB,KAUvDzH,EAAGC,GAAGC,MAAM+G,eAAevF,UAAUuG,WAAa,KAclDjI,EAAGC,GAAGC,MAAM+G,eAAevF,UAAU4G,gCAAkC,KA4BvEtI,EAAGC,GAAGC,MAAM0I,cAAgB,SAAiCxI,GAE5DA,EAAS6F,EAAE4C,QAAUC,gBAAgB,GAAQ1I,GAG7CJ,EAAGC,GAAGC,MAAM+G,eAAenE,KAAMzC,KAAMD,GAGvCC,KAAK0I,SAAW3I,EAAO2I,UAAY1I,KAAKG,SACxCH,KAAK2I,WAAa,GAAIhJ,GAAGC,GAAGgJ,0BAC3B1B,OAAQlH,KACR6I,MAAO7I,KACP8I,WAAY/I,EAAO+I,YAAc9I,KAAKG,WAGvCH,KAAK+I,0BAA4BhJ,EAAOgJ,4BAA6B,EAErE/I,KAAKgJ,iBAAkB,EACvBhJ,KAAKiJ,oBAAqB,EAC1BjJ,KAAKkJ,yBAA2BnJ,EAAO0I,eAGvCzI,KAAKmJ,OAAO5I,IACX6I,MAAOpJ,KAAKqJ,mBAAmB3I,KAAMV,MACrCsJ,KAAMtJ,KAAKuJ,kBAAkB7I,KAAMV,MACnCQ,UAAWR,KAAKwJ,uBAAuB9I,KAAMV,QAE9CA,KAAKgD,QAAShD,MAAQyJ,OAAQ,wBAC9BzJ,KAAK2I,WAAW3F,QAAShD,MACxB0J,OAAQ,qBACRC,OAAQ,2BAIT3J,KAAKG,SAASE,SAAU,uBACxBL,KAAK2I,WAAWxI,SAASE,SAAU,4BACnCL,KAAK0I,SAASlF,OAAQxD,KAAK2I,WAAWxI,WAKvCR,EAAGgE,WAAYhE,EAAGC,GAAGC,MAAM0I,cAAe5I,EAAGC,GAAGC,MAAM+G,gBAUtDjH,EAAGC,GAAGC,MAAM0I,cAAclH,UAAUgI,mBAAqB,WACxDrJ,KAAKiJ,oBAAqB,EAC1BjJ,KAAK4J,sBASNjK,EAAGC,GAAGC,MAAM0I,cAAclH,UAAUkI,kBAAoB,WACvDvJ,KAAK6J,kBACL7J,KAAKiJ,oBAAqB,GAS3BtJ,EAAGC,GAAGC,MAAM0I,cAAclH,UAAUmI,uBAAyB,WAKvDxJ,KAAKiJ,qBAAuBjJ,KAAK2I,WAAWmB,aAChD9J,KAAK4J,sBAUPjK,EAAGC,GAAGC,MAAM0I,cAAclH,UAAU0I,oBAAsB,WACpD/J,KAAKiJ,oBACTjJ,KAAK4J,sBAUPjK,EAAGC,GAAGC,MAAM0I,cAAclH,UAAU2I,mBAAqB,SAAWC,GAC7DA,IAILjK,KAAKkK,qBACLlK,KAAK2I,WAAWwB,eAUlBxK,EAAGC,GAAGC,MAAM0I,cAAclH,UAAU+I,uBAAyB,SAAWvG,GACvE7D,KAAKqK,SAAUxG,EAAKyG,YASrB3K,EAAGC,GAAGC,MAAM0I,cAAclH,UAAUkJ,cAAgB,WACnD,MAAOvK,MAAK2I,YAUbhJ,EAAGC,GAAGC,MAAM0I,cAAclH,UAAUmJ,mBAAqB,SAAWC,GACnEzK,KAAKgJ,kBAAoByB,GAS1B9K,EAAGC,GAAGC,MAAM0I,cAAclH,UAAUqJ,eAAiB,WAIpD,MAHM1K,MAAK2I,WAAWgC,WACrB3K,KAAK2I,WAAWe,QAAQ,GAElB1J,MASRL,EAAGC,GAAGC,MAAM0I,cAAclH,UAAUwI,gBAAkB,WAIrD,MAHA7J,MAAK2I,WAAWe,QAAQ,GACxB1J,KAAKkK,qBACLlK,KAAK2I,WAAWwB,aACTnK,MAYRL,EAAGC,GAAGC,MAAM0I,cAAclH,UAAUuI,mBAAqB,WACxD,GAAI1C,GAASlH,KACZmH,EAAQnH,KAAK4K,UAEd,KAAK5K,KAAKgJ,kBAAmBhJ,KAAK6K,aA0BlC,MArBM7K,MAAK+I,2BAAuC,KAAV5B,EAG5BA,IAAUnH,KAAK8K,aAC1B9K,KAAK+K,qBACHhD,KAAM,SAAWzE,GACjB4D,EAAOyB,WAAWwB,aACb7G,EAAMc,QACV8C,EAAOyB,WACLpF,SAAUD,GACVoG,QAAQ,GACVxC,EAAO8D,iCAEP9D,EAAOyB,WAAWe,QAAQ,KAG3BxB,KAAM,WACNhB,EAAOyB,WAAWwB,eAhBpBnK,KAAK6J,kBAoBC7J,MASRL,EAAGC,GAAGC,MAAM0I,cAAclH,UAAU2J,8BAAgC,WAC9DhL,KAAKkJ,2BAA6BlJ,KAAK2I,WAAWsC,mBACtDjL,KAAK2I,WAAWuC,cAAelL,KAAK2I,WAAWwC,2BAYjDxL,EAAGC,GAAGC,MAAM0I,cAAclH,UAAU0J,mBAAqB,WACxD,MAAO/K,MAAKgH,iBAAiBoE,KAAM,SAAW9I,GAC7C,MAAOtC,MAAKqL,6BAA8B/I,IACzC5B,KAAMV,QAQTL,EAAGC,GAAGC,MAAM0I,cAAclH,UAAU6I,mBAAqB,WACxDlK,KAAKuH,gBAWN5H,EAAGC,GAAGC,MAAM0I,cAAclH,UAAUiK,iBAAmB,KAcvD3L,EAAGC,GAAGC,MAAM0I,cAAclH,UAAUkK,+BAAiC,KAYrE5L,EAAGC,GAAGC,MAAM0I,cAAclH,UAAUgK,6BAA+B,KAUnE1L,EAAGC,GAAGC,MAAM0I,cAAclH,UAAUmK,YAAc,SAAWC,GAU5D,MAPA9L,GAAGC,GAAG8L,gBAAgBrK,UAAUmK,YAAY/I,KAAMzC,KAAMyL,GAGnDzL,KAAK6K,cAAgB7K,KAAK2I,YAC9B3I,KAAK6J,kBAGC7J,MAMRL,EAAGC,GAAGC,MAAM0I,cAAclH,UAAU+F,gBAAkB,WACrD,MAAOpH,MAAK4K,YAMbjL,EAAGC,GAAGC,MAAM0I,cAAclH,UAAUuG,WAAa,WAChD,MAAO5H,MAAKsL,oBAMb3L,EAAGC,GAAGC,MAAM0I,cAAclH,UAAU4G,gCAAkC,SAAWD,GAChF,MAAOhI,MAAKuL,+BAAgCvD,IAoB7CrI,EAAGC,GAAG+L,WAAa,SAAyBC,EAAM7L,GAE5CJ,EAAGkM,cAAeD,IAAqBE,SAAX/L,IAChCA,EAAS6L,EACTA,EAAO7L,EAAO6L,MAIf7L,EAAS6F,EAAE4C,QAAUuD,YAAY,GAAQhM,GAGzCJ,EAAGC,GAAG+L,WAAWK,OAAOvJ,KAAMzC,KAAMD,GAGpCC,KAAK4L,KAAOA,EACZ5L,KAAKiM,MAAQlM,EAAOkM,MACpBjM,KAAKkM,QAAU,KACflM,KAAKmM,QAAS,EAGdnM,KAAKG,SAASE,SAAU,qBAKzBV,EAAGyM,aAAczM,EAAGC,GAAG+L,WAAYhM,EAAGC,GAAGyM,aAmBzC1M,EAAGC,GAAG+L,WAAWtK,UAAUiL,QAAU,WACpC,MAAOtM,MAAK4L,MAWbjM,EAAGC,GAAG+L,WAAWtK,UAAUkL,SAAW,WACrC,MAAOvM,MAAKmM,QAWbxM,EAAGC,GAAG+L,WAAWtK,UAAUmL,WAAa,WACvC,MAAOxM,MAAKkM,SAabvM,EAAGC,GAAG+L,WAAWtK,UAAUoL,WAAa,SAAWP,GAKlD,MAJAlM,MAAKkM,QAAUA,GAAW,KACrBA,GACJlM,KAAK0M,eAEC1M,MAaRL,EAAGC,GAAG+L,WAAWtK,UAAUqL,aAAe,WAIzC,MAHK1M,MAAKiM,OACTjM,KAAKkM,QAAQS,SAAU3M,KAAKiM,OAEtBjM,MAaRL,EAAGC,GAAG+L,WAAWtK,UAAUuL,UAAY,SAAWT,GACjDA,IAAWA,EAENA,IAAWnM,KAAKmM,SACpBnM,KAAKmM,OAASA,EACdnM,KAAKG,SAASuD,YAAa,0BAA2B1D,KAAKmM,QAC3DnM,KAAKmC,KAAM,SAAUnC,KAAKmM,UAoB5BxM,EAAGC,GAAGiN,WAAa,SAAyBjB,EAAM7L,GAE5CJ,EAAGkM,cAAeD,IAAqBE,SAAX/L,IAChCA,EAAS6L,EACTA,EAAO7L,EAAO6L,MAIf7L,EAAS6F,EAAE4C,QAAUuD,YAAY,GAAQhM,GAGzCJ,EAAGC,GAAGiN,WAAWb,OAAOvJ,KAAMzC,KAAMD,GAGpCC,KAAK4L,KAAOA,EACZ5L,KAAK8M,YAAc,KACnB9M,KAAKmM,QAAS,EAGdnM,KAAKG,SAASE,SAAU,qBAKzBV,EAAGyM,aAAczM,EAAGC,GAAGiN,WAAYlN,EAAGC,GAAGyM,aAmBzC1M,EAAGC,GAAGiN,WAAWxL,UAAUiL,QAAU,WACpC,MAAOtM,MAAK4L,MAWbjM,EAAGC,GAAGiN,WAAWxL,UAAUkL,SAAW,WACrC,MAAOvM,MAAKmM,QAWbxM,EAAGC,GAAGiN,WAAWxL,UAAU0L,eAAiB,WAC3C,MAAO/M,MAAK8M,aAabnN,EAAGC,GAAGiN,WAAWxL,UAAU2L,eAAiB,SAAWF,GAKtD,MAJA9M,MAAK8M,YAAcA,GAAe,KAC7BA,GACJ9M,KAAKiN,mBAECjN,MAaRL,EAAGC,GAAGiN,WAAWxL,UAAU4L,iBAAmB,WAC7C,MAAOjN,OAaRL,EAAGC,GAAGiN,WAAWxL,UAAUuL,UAAY,SAAWT,GACjDA,IAAWA,EAENA,IAAWnM,KAAKmM,SACpBnM,KAAKmM,OAASA,EACdnM,KAAKG,SAASuD,YAAa,0BAA2ByI,GACtDnM,KAAKmC,KAAM,SAAUnC,KAAKmM,UAqC5BxM,EAAGC,GAAGsN,YAAc,SAA0BnN,GAE7CA,EAAS6F,EAAE4C,QAAUuD,YAAY,GAAQhM,GAGzCJ,EAAGC,GAAGsN,YAAYlB,OAAOvJ,KAAMzC,KAAMD,GAGrCJ,EAAGC,GAAGC,MAAM2C,aAAaC,KAAMzC,KAAM4F,EAAE4C,UAAYzI,GAAUsG,OAAQrG,KAAKG,YAG1EH,KAAKmN,YAAc,KACnBnN,KAAKoN,aAAerN,EAAOqN,WAG3BpN,KAAKG,SAASE,SAAU,qBACnBL,KAAKoN,aACTpN,KAAKG,SAASE,SAAU,gCACxBL,KAAKG,SAASI,GAAI,SAAUZ,EAAGC,GAAGyN,SAAUrN,KAAKsN,SAAS5M,KAAMV,MAAQ,OAEpEoD,MAAMC,QAAStD,EAAOuD,QAC1BtD,KAAKuD,SAAUxD,EAAOuD,QAMxB3D,EAAGyM,aAAczM,EAAGC,GAAGsN,YAAavN,EAAGC,GAAGyM,aAC1C1M,EAAGgE,WAAYhE,EAAGC,GAAGsN,YAAavN,EAAGC,GAAGC,MAAM2C,cA4B9C7C,EAAGC,GAAGsN,YAAY7L,UAAUiM,SAAW,WAYtC,QAASC,GAAS1J,GACjB,MAAOA,GAAK1D,SAAU,GAAI4F,wBAG3B,QAAS+D,GAAWjG,GACnB,GAAI2J,GAAOD,EAAS1J,EACpB,OAAO2J,GAAKC,OAASC,EAAcvH,KAAOqH,EAAKrH,IAAMuH,EAAcD,OAjBpE,GAAIE,GACHxJ,EAAMnE,KAAKsD,MAAMc,OACjBwJ,EAAe5N,KAAKsD,MAAMmB,QAASzE,KAAKmN,aACxCzG,EAAWkH,EACXF,EAAgB1N,KAAKG,SAAU,GAAI4F,uBAEpC,IAAM2H,IAAoBA,EAAcvH,KAAQuH,EAAcD,QAA9D,CAgBA,GAFAE,EAAcJ,EAASvN,KAAKmN,aAEvBQ,EAAYF,OAASC,EAAcvH,IAEvC,OAAUO,EAAWvC,IACf2F,EAAW9J,KAAKsD,MAAOoD,UAIvB,IAAKiH,EAAYxH,IAAMuH,EAAcD,OAE3C,OAAU/G,GAAY,IAChBoD,EAAW9J,KAAKsD,MAAOoD,MAMzBA,IAAakH,GACjB5N,KAAKmC,KAAM,oBAAqBnC,KAAKsD,MAAOoD,MAS9C/G,EAAGC,GAAGsN,YAAY7L,UAAUwM,eAAiB,WAC5C,MAAO7N,MAAKmN,aAUbxN,EAAGC,GAAGsN,YAAY7L,UAAUyM,iBAAmB,WAC9C,GAAIC,GAAW/N,KAAKmN,WACF,QAAbY,IAIL/N,KAAKmN,YAAc,KACnBnN,KAAKmC,KAAM,MAAO,QAcnBxC,EAAGC,GAAGsN,YAAY7L,UAAUkC,SAAW,SAAWD,EAAOrD,GAWxD,MATAD,MAAKgO,kBAAmB1K,EAAOtD,KAAKmN,aAGpCxN,EAAGC,GAAGC,MAAM2C,aAAanB,UAAUkC,SAASd,KAAMzC,KAAMsD,EAAOrD,IAEzDD,KAAKmN,aAAe7J,EAAMc,QAC/BpE,KAAKiO,QAAS3K,EAAO,IAGftD,MAaRL,EAAGC,GAAGsN,YAAY7L,UAAU6M,YAAc,SAAW5K,GAYpD,MAVA3D,GAAGC,GAAGC,MAAM2C,aAAanB,UAAU6M,YAAYzL,KAAMzC,KAAMsD,GAEhB,KAAtCA,EAAMmB,QAASzE,KAAKmN,eACnBnN,KAAKsD,MAAMc,OACfpE,KAAKiO,QAASjO,KAAKsD,MAAO,IAE1BtD,KAAK8N,oBAIA9N,MAYRL,EAAGC,GAAGsN,YAAY7L,UAAU8I,WAAa,WAIxC,MAHAnK,MAAK8N,mBACLnO,EAAGC,GAAGC,MAAM2C,aAAanB,UAAU8I,WAAW1H,KAAMzC,MAE7CA,MAYRL,EAAGC,GAAGsN,YAAY7L,UAAU4M,QAAU,SAAWpK,GAYhD,MAXKA,KAAS7D,KAAKmN,cAClBnN,KAAKgO,kBAAmBhO,KAAKsD,MAAOO,GAEA,KAA/B7D,KAAKsD,MAAMmB,QAASZ,IACxB7D,KAAKmN,YAActJ,EACnB7D,KAAKmC,KAAM,MAAO0B,IAElB7D,KAAK8N,oBAIA9N,MAaRL,EAAGC,GAAGsN,YAAY7L,UAAU2M,kBAAoB,SAAW1K,EAAO6K,GACjE,GAAIjK,GAAGC,CAEP,KAAMnE,KAAKoN,WAAa,CACvB,IAAMlJ,EAAI,EAAGC,EAAMb,EAAMc,OAAYD,EAAJD,EAASA,IACnCiK,GAAgBA,IAAiB7K,EAAOY,IAC7CZ,EAAOY,GAAI/D,SAASE,SAAU,uBAG3B8N,IACJA,EAAahO,SAAS+B,YAAa,0BAsEtCvC,EAAGC,GAAGwO,WAAa,SAAyBrO,GAE3CA,EAAS6F,EAAE4C,QACV6F,UAAU,EACVC,aAAc,UACZvO,GAGHJ,EAAGC,GAAGwO,WAAWpC,OAAOvJ,KAAMzC,KAAMD,GAOpCC,KAAKuO,MAAQ3I,EAAG,SAMhB5F,KAAKwO,SAAW5I,EAAG,SAGnB5F,KAAKuO,MACHlO,SAAU,yBACZL,KAAKwO,SAASnO,SAAU,4BACxBL,KAAKG,SACHE,SAAU,oBACVmD,OAAQxD,KAAKwO,SAAUxO,KAAKuO,OAC9BvO,KAAKyO,gBAAiB1O,EAAOuO,cAC7BtO,KAAK0O,WAAY3O,EAAOsO,WAKzB1O,EAAGyM,aAAczM,EAAGC,GAAGwO,WAAYzO,EAAGC,GAAG+O,QAUzChP,EAAGC,GAAGwO,WAAW/M,UAAUqN,WAAa,SAAWL,GAUlD,MATAA,GAAwBvC,SAAbuC,GAA0BrO,KAAKqO,WAAaA,EAElDrO,KAAKqO,WAAaA,IACtBrO,KAAKqO,SAAWA,EAChBrO,KAAKG,SACHuD,YAAa,4BAA6B1D,KAAKqO,UAC/C3K,YAAa,6BAA8B1D,KAAKqO,WAG5CrO,MAQRL,EAAGC,GAAGwO,WAAW/M,UAAUuN,cAAgB,WAC1C,MAAO5O,MAAKqO,UAUb1O,EAAGC,GAAGwO,WAAW/M,UAAUoN,gBAAkB,SAAWzI,GAKvD,MAJAhG,MAAKG,SAAS+B,YAAa,oBAAsBlC,KAAKsO,cACtDtO,KAAKsO,aAAetI,EACpBhG,KAAKG,SAASE,SAAU,oBAAsB2F,GAEvChG,MAQRL,EAAGC,GAAGwO,WAAW/M,UAAUwN,gBAAkB,WAC5C,MAAO7O,MAAKsO,cAqDb3O,EAAGC,GAAGkP,cAAgB,SAA4B/O,GAEjDA,EAASA,MAGTJ,EAAGC,GAAGkP,cAAc9C,OAAOvJ,KAAMzC,KAAMD,GAGvCC,KAAK+O,gBAAkB,KACvB/O,KAAKgP,SACLhP,KAAKiP,aAAc,EACnBjP,KAAKkP,YAAc,GAAIvP,GAAGC,GAAGsN,aAAeE,aAAcrN,EAAOqN,aACjEpN,KAAKwO,SAAShL,OAAQxD,KAAKkP,YAAY/O,UACvCH,KAAKmP,UAAiCrD,SAArB/L,EAAOoP,aAA6BpP,EAAOoP,UAC5DnP,KAAKoP,gBAAiB,EACtBpP,KAAKqP,WAAatP,EAAOsP,SACpBrP,KAAKqP,WACTrP,KAAKsP,WAAavP,EAAOuP,SACzBtP,KAAKuP,sBAAwB,KAC7BvP,KAAKwP,oBAAsB,GAAI7P,GAAGC,GAAG6P,oBACrCzP,KAAK0P,aAAe,GAAI/P,GAAGC,GAAGyM,aAAeN,YAAY,IACzD/L,KAAKuO,MAAM/K,OAAQxD,KAAK0P,aAAavP,UACrCH,KAAKoP,gBAAiB,EACjBpP,KAAKsP,WACTtP,KAAKuP,sBAAwB,GAAI5P,GAAGC,GAAG+P,sBACtC3P,KAAKwP,uBAIRxP,KAAK0O,WAAY1O,KAAKqP,UAGtBrP,KAAKkP,YAAYlM,QAAShD,MAAQ4P,IAAK,qBAClC5P,KAAKqP,WACTrP,KAAKwP,oBAAoBxM,QAAShD,MAAQ6P,OAAQ,gCAClD7P,KAAK8P,WAAY,EACjB9P,KAAKkP,YAAYlM,QAAShD,MAAQ+P,kBAAmB,oCAEjD/P,KAAKmP,WAETnP,KAAKkP,YAAY/O,SAASI,GAAI,UAAWP,KAAKgQ,mBAAmBtP,KAAMV,OAIxEA,KAAKG,SAASE,SAAU,uBACxBL,KAAKkP,YAAY/O,SAASE,SAAU,mCAC/BL,KAAKqP,WACTrP,KAAK0P,aAAavP,SAChBE,SAAU,oCACVmD,OAAQxD,KAAKwP,oBAAoBrP,UAC9BH,KAAKsP,UACTtP,KAAK0P,aAAavP,SAChBE,SAAU,6CACVmD,OAAQxD,KAAKuP,sBAAsBpP,YAOxCR,EAAGyM,aAAczM,EAAGC,GAAGkP,cAAenP,EAAGC,GAAGwO,YAkC5CzO,EAAGC,GAAGkP,cAAczN,UAAU2O,mBAAqB,SAAW1O,GAC7D,GAAIsK,GAAMqE,CAGVA,GAAUrK,EAAGtE,EAAEE,QAASqE,QAAS,oBACjC,KAAM+F,IAAQ5L,MAAKgP,MAElB,GAAKhP,KAAKgP,MAAOpD,GAAOzL,SAAU,KAAQ8P,EAAS,IAAOrE,IAAS5L,KAAK+O,gBAAkB,CACzF/O,KAAKkQ,QAAStE,EACd,SAaHjM,EAAGC,GAAGkP,cAAczN,UAAU8O,+BAAiC,SAAWC,GAGzEpQ,KAAK8P,WAAY,EACjB9P,KAAKwP,oBAAoBa,iBAAkBD,EAAK9D,WAChDtM,KAAK8P,WAAY,GASlBnQ,EAAGC,GAAGkP,cAAczN,UAAUiP,iBAAmB,SAAWF,GAC3D,GAAIG,GAASvQ,MACPA,KAAK8P,WAAaM,GACvBA,EAAKI,uBAAyBC,SAAU,WAClCF,EAAOpB,WACXoB,EAAOnH,YAcXzJ,EAAGC,GAAGkP,cAAczN,UAAU+H,MAAQ,SAAWsH,GAChD,GAAIN,GACH9M,EAAQtD,KAAKkP,YAAYyB,UAGzBP,GADkBtE,SAAd4E,GAA2BpN,EAAOoN,GAC/BpN,EAAOoN,GAEP1Q,KAAKkP,YAAYrB,kBAGnBuC,GAAQpQ,KAAKqP,WAClBrP,KAAK4Q,4BACLR,EAAOpQ,KAAKkP,YAAYrB,kBAEnBuC,IAIAzQ,EAAGC,GAAG2B,SAAU6O,EAAKjQ,SAAU,GAAKH,KAAK0F,qBAAqBmL,eAAe,IAClFT,EAAKhH,UAQPzJ,EAAGC,GAAGkP,cAAczN,UAAUyP,oBAAsB,WACnDnR,EAAGC,GAAGmR,cAAe/Q,KAAKkP,YAAY/O,UAAWiJ,SASlDzJ,EAAGC,GAAGkP,cAAczN,UAAU2P,4BAA8B,SAAWnN,GACjEA,GACJ7D,KAAKkQ,QAASrM,EAAKyG,YASrB3K,EAAGC,GAAGkP,cAAczN,UAAU4P,WAAa,WAC1C,MAAOjR,MAAKqP,UAQb1P,EAAGC,GAAGkP,cAAczN,UAAU6P,WAAa,WAC1C,MAAOlR,MAAKsP,UAQb3P,EAAGC,GAAGkP,cAAczN,UAAU8P,iBAAmB,WAChD,MAAOnR,MAAKqP,UAAYrP,KAAKoP,gBAS9BzP,EAAGC,GAAGkP,cAAczN,UAAU+P,cAAgB,SAAWC,GAOxD,MANKrR,MAAKqP,WACTgC,EAAgBvF,SAATuF,GAAsBrR,KAAKoP,iBAAmBiC,EACrDrR,KAAKoP,eAAiBiC,EACtBrR,KAAK0O,WAAY2C,IAGXrR,MASRL,EAAGC,GAAGkP,cAAczN,UAAUiQ,eAAiB,SAAWlB,GACzD,GAAImB,GAAMC,EAAMC,EACfzC,EAAQhP,KAAKkP,YAAYyB,WACzB1Q,EAAQ+O,EAAMvK,QAAS2L,EAExB,IAAe,KAAVnQ,IACJsR,EAAOvC,EAAO/O,EAAQ,GACtBuR,EAAOxC,EAAO/O,EAAQ,GAEjBD,KAAKqP,UAAW,CAEpB,GADAoC,EAAQzR,KAAKwP,oBAAoBkC,gBAAiBtB,EAAK9D,WAAYqF,WAElEH,GACAC,IAAUzR,KAAKwP,oBAAoBkC,gBAAiBF,EAAKlF,WAAYqF,WAErE,MAAOH,EAER,IACCD,GACAE,IAAUzR,KAAKwP,oBAAoBkC,gBAAiBH,EAAKjF,WAAYqF,WAErE,MAAOJ,GAIV,MAAOC,IAAQD,GAAQ,MAUxB5R,EAAGC,GAAGkP,cAAczN,UAAUuQ,WAAa,WAC1C,MAAO5R,MAAKwP,qBAUb7P,EAAGC,GAAGkP,cAAczN,UAAUwQ,mBAAqB,WAClD,MAAO7R,MAAKuP,uBASb5P,EAAGC,GAAGkP,cAAczN,UAAUyQ,QAAU,SAAWlG,GAClD,MAAO5L,MAAKgP,MAAOpD,IAQpBjM,EAAGC,GAAGkP,cAAczN,UAAU0Q,eAAiB,WAC9C,GAAInG,GAAO5L,KAAKgS,oBAChB,OAAOpG,GAAO5L,KAAK8R,QAASlG,GAASE,QAQtCnM,EAAGC,GAAGkP,cAAczN,UAAU2Q,mBAAqB,WAClD,MAAOhS,MAAK+O,iBAcbpP,EAAGC,GAAGkP,cAAczN,UAAU4Q,SAAW,SAAWjD,EAAO/O,GAC1D,GAAIiE,GAAGC,EAAKyH,EAAMwE,EAAMvM,EAAM+J,EAC7BsE,EAAmBlS,KAAKkP,YAAYyB,WACpCwB,KACA7O,IAGD,KAAMY,EAAI,EAAGC,EAAM6K,EAAM5K,OAAYD,EAAJD,EAASA,IACzCkM,EAAOpB,EAAO9K,GACd0H,EAAOwE,EAAK9D,UAEP9E,OAAOnG,UAAUoG,eAAehF,KAAMzC,KAAKgP,MAAOpD,KAEtDgC,EAAesE,EAAiBzN,QAASzE,KAAKgP,MAAOpD,IAC/B,KAAjBgC,GAA0C3N,EAAnB2N,EAAe,GAC1C3N,IAEDkS,EAAOC,KAAMpS,KAAKgP,MAAOpD,IAQ3B,KALKuG,EAAO/N,QACXpE,KAAKqS,YAAaF,GAIbjO,EAAI,EAAGC,EAAM6K,EAAM5K,OAAYD,EAAJD,EAASA,IACzCkM,EAAOpB,EAAO9K,GACd0H,EAAOwE,EAAK9D,UACZtM,KAAKgP,MAAOoB,EAAK9D,WAAc8D,EAC1BpQ,KAAKqP,WACTxL,EAAO,GAAIlE,GAAGC,GAAG0S,qBAAuBhQ,KAAMsJ,IAC9CwE,EAAKpD,eAAgBnJ,GACrBP,EAAM8O,KAAMvO,GAWd,OAPK7D,MAAKqP,UAAY/L,EAAMc,SAC3BpE,KAAKwP,oBAAoBjM,SAAUD,EAAOrD,GAC1CD,KAAK4Q,6BAEN5Q,KAAKkP,YAAY3L,SAAUyL,EAAO/O,GAClCD,KAAKmC,KAAM,MAAO6M,EAAO/O,GAElBD,MAYRL,EAAGC,GAAGkP,cAAczN,UAAUgR,YAAc,SAAWrD,GACtD,GAAI9K,GAAGC,EAAKyH,EAAMwE,EACjB9M,IAED,KAAMY,EAAI,EAAGC,EAAM6K,EAAM5K,OAAYD,EAAJD,EAASA,IACzCkM,EAAOpB,EAAO9K,GACd0H,EAAOwE,EAAK9D,gBACLtM,MAAKgP,MAAOpD,GACd5L,KAAKqP,WACT/L,EAAM8O,KAAMpS,KAAKwP,oBAAoBkC,gBAAiB9F,IACtDwE,EAAKpD,eAAgB,MAUvB,OAPKhN,MAAKqP,UAAY/L,EAAMc,SAC3BpE,KAAKwP,oBAAoBtB,YAAa5K,GACtCtD,KAAK4Q,6BAEN5Q,KAAKkP,YAAYhB,YAAac,GAC9BhP,KAAKmC,KAAM,SAAU6M,GAEdhP,MAWRL,EAAGC,GAAGkP,cAAczN,UAAUkR,WAAa,WAC1C,GAAIrO,GAAGC,EACN6K,EAAQhP,KAAKkP,YAAYyB,UAI1B,IAFA3Q,KAAKgP,SACLhP,KAAK+O,gBAAkB,KAClB/O,KAAKqP,SAET,IADArP,KAAKwP,oBAAoBrF,aACnBjG,EAAI,EAAGC,EAAM6K,EAAM5K,OAAYD,EAAJD,EAASA,IACzC8K,EAAO9K,GAAI8I,eAAgB,KAO7B,OAJAhN,MAAKkP,YAAY/E,aAEjBnK,KAAKmC,KAAM,SAAU6M,GAEdhP,MASRL,EAAGC,GAAGkP,cAAczN,UAAU6O,QAAU,SAAWtE,GAClD,GAAIuC,GACHqE,EACApC,EAAOpQ,KAAKgP,MAAOpD,GACnB6G,EAAezS,KAAK+O,iBAAmB/O,KAAKgP,MAAOhP,KAAK+O,gBAEpDnD,KAAS5L,KAAK+O,kBACb/O,KAAKqP,WACTlB,EAAenO,KAAKwP,oBAAoBvE,kBACnCkD,GAAgBA,EAAa7D,YAAcsB,GAC/C5L,KAAKwP,oBAAoBa,iBAAkBzE,IAGxCwE,IACCqC,IACJA,EAAa7F,WAAW,GAMvB5M,KAAKmP,WACLnP,KAAKkP,YAAY9B,YAC+B,IAAhDzN,EAAGC,GAAGmR,cAAeX,EAAKjQ,UAAWiE,SAErCoO,EAAWC,EAAatS,SAASuS,KAAM,UAClCF,EAASpO,QACboO,EAAU,GAAIlJ,SAIjBtJ,KAAK+O,gBAAkBnD,EACvBwE,EAAKxD,WAAW,GAChB5M,KAAKkP,YAAYjB,QAASmC,IACpBpQ,KAAKkP,YAAY9B,YAAcqF,IAGpCD,EAAWC,EAAatS,SAASuS,KAAM,UAClCF,EAASpO,QACboO,EAAU,GAAIlJ,QAGhBtJ,KAAKmC,KAAM,MAAOiO,MAUrBzQ,EAAGC,GAAGkP,cAAczN,UAAUuP,0BAA4B,WAKzD,MAJM5Q,MAAKwP,oBAAoBvE,mBAC9BjL,KAAKwP,oBAAoBmD,WAAY3S,KAAKwP,oBAAoBrE,0BAGxDnL,MA2CRL,EAAGC,GAAGgT,YAAc,SAA0B7S,GAE7CA,EAAS6F,EAAE4C,UAAYzI,GAAUuO,aAAc,QAG/C3O,EAAGC,GAAGgT,YAAY5G,OAAOvJ,KAAMzC,KAAMD,GAGrCC,KAAK6S,gBAAkB,KACvB7S,KAAK8S,SACL9S,KAAKiP,aAAc,EACnBjP,KAAKkP,YAAc,GAAIvP,GAAGC,GAAGsN,aAC5BE,aAAcrN,EAAOqN,WACrB2F,SAAUhT,EAAOgT,WAElB/S,KAAKwO,SAAShL,OAAQxD,KAAKkP,YAAY/O,UACvCH,KAAKmP,UAAiCrD,SAArB/L,EAAOoP,aAA6BpP,EAAOoP,UAE5DnP,KAAKgT,gBAAkB,GAAIrT,GAAGC,GAAGqT,gBACjCjT,KAAKkT,SAAW,GAAIvT,GAAGC,GAAGyM,YAC1BrM,KAAKuO,MAAM/K,OAAQxD,KAAKkT,SAAS/S,UAEjCH,KAAK0O,YAAY,GAGjB1O,KAAKkP,YAAYlM,QAAShD,MAAQ4P,IAAK,qBACvC5P,KAAKgT,gBAAgBhQ,QAAShD,MAAQ6P,OAAQ,4BACzC7P,KAAKmP,WAETnP,KAAKkP,YAAY/O,SAASI,GAAI,UAAWP,KAAKgQ,mBAAmBtP,KAAMV,OAIxEA,KAAKG,SAASE,SAAU,qBACxBL,KAAKkP,YAAY/O,SAASE,SAAU,iCACpCL,KAAKkT,SAAS/S,SACZE,SAAU,8BACVmD,OAAQxD,KAAKgT,gBAAgB7S,WAKhCR,EAAGyM,aAAczM,EAAGC,GAAGgT,YAAajT,EAAGC,GAAGwO,YAkC1CzO,EAAGC,GAAGgT,YAAYvR,UAAU2O,mBAAqB,SAAW1O,GAC3D,GAAIsK,GAAMqE,CAGVA,GAAUrK,EAAGtE,EAAEE,QAASqE,QAAS,oBACjC,KAAM+F,IAAQ5L,MAAK8S,MAElB,GAAK9S,KAAK8S,MAAOlH,GAAOzL,SAAU,KAAQ8P,EAAS,IAAOrE,IAAS5L,KAAK6S,gBAAkB,CACzF7S,KAAKmT,QAASvH,EACd,SAWHjM,EAAGC,GAAGgT,YAAYvR,UAAUiP,iBAAmB,SAAW8C,GACzD,GAAI7C,GAASvQ,IACRoT,IACJA,EAAK5C,uBAAyBC,SAAU,WAClCF,EAAOpB,WACXoB,EAAOnH,YAcXzJ,EAAGC,GAAGgT,YAAYvR,UAAU+H,MAAQ,SAAWsH,GAC9C,GAAI0C,GACH9P,EAAQtD,KAAKkP,YAAYyB,UAGzByC,GADkBtH,SAAd4E,GAA2BpN,EAAOoN,GAC/BpN,EAAOoN,GAEP1Q,KAAKkP,YAAYrB,iBAGnBuF,IACLpT,KAAKqT,4BACLD,EAAOpT,KAAKkP,YAAYrB,kBAEnBuF,IAIAzT,EAAGC,GAAG2B,SAAU6R,EAAKjT,SAAU,GAAKH,KAAK0F,qBAAqBmL,eAAe,IAClFuC,EAAKhK,UAQPzJ,EAAGC,GAAGgT,YAAYvR,UAAUyP,oBAAsB,WACjDnR,EAAGC,GAAGmR,cAAe/Q,KAAKkP,YAAY/O,UAAWiJ,SASlDzJ,EAAGC,GAAGgT,YAAYvR,UAAUiS,wBAA0B,SAAWzP,GAC3DA,GACJ7D,KAAKmT,QAAStP,EAAKyG,YAUrB3K,EAAGC,GAAGgT,YAAYvR,UAAUkS,eAAiB,SAAWH,GACvD,GAAI7B,GAAMC,EAAMC,EACfqB,EAAQ9S,KAAKkP,YAAYyB,WACzB1Q,EAAQ6S,EAAMrO,QAAS2O,EAExB,IAAe,KAAVnT,EAAe,CAKnB,GAJAsR,EAAOuB,EAAO7S,EAAQ,GACtBuR,EAAOsB,EAAO7S,EAAQ,GAEtBwR,EAAQzR,KAAKgT,gBAAgBtB,gBAAiB0B,EAAK9G,WAAYqF,WAE9DH,GACAC,IAAUzR,KAAKgT,gBAAgBtB,gBAAiBF,EAAKlF,WAAYqF,WAEjE,MAAOH,EAER,IACCD,GACAE,IAAUzR,KAAKgT,gBAAgBtB,gBAAiBH,EAAKjF,WAAYqF,WAEjE,MAAOJ,GAGT,MAAOC,IAAQD,GAAQ,MAQxB5R,EAAGC,GAAGgT,YAAYvR,UAAUmS,QAAU,WACrC,MAAOxT,MAAKgT,iBASbrT,EAAGC,GAAGgT,YAAYvR,UAAUoS,QAAU,SAAW7H,GAChD,MAAO5L,MAAK8S,MAAOlH,IAQpBjM,EAAGC,GAAGgT,YAAYvR,UAAUqS,eAAiB,WAC5C,GAAI9H,GAAO5L,KAAK2T,oBAChB,OAAO/H,GAAO5L,KAAKyT,QAAS7H,GAASE,QAQtCnM,EAAGC,GAAGgT,YAAYvR,UAAUsS,mBAAqB,WAChD,MAAO3T,MAAK6S,iBAcblT,EAAGC,GAAGgT,YAAYvR,UAAUuS,SAAW,SAAWd,EAAO7S,GACxD,GAAIiE,GAAGC,EAAKyH,EAAMwH,EAAMvP,EAAM+J,EAC7BiG,EAAmB7T,KAAKkP,YAAYyB,WACpCwB,KACA7O,IAGD,KAAMY,EAAI,EAAGC,EAAM2O,EAAM1O,OAAYD,EAAJD,EAASA,IACzCkP,EAAON,EAAO5O,GACd0H,EAAOwH,EAAK9G,UAEP9E,OAAOnG,UAAUoG,eAAehF,KAAMzC,KAAK8S,MAAOlH,KAEtDgC,EAAeiG,EAAiBpP,QAASzE,KAAK8S,MAAOlH,IAC/B,KAAjBgC,GAA0C3N,EAAnB2N,EAAe,GAC1C3N,IAEDkS,EAAOC,KAAMpS,KAAK8S,MAAOlH,IAQ3B,KALKuG,EAAO/N,QACXpE,KAAK8T,YAAa3B,GAIbjO,EAAI,EAAGC,EAAM2O,EAAM1O,OAAYD,EAAJD,EAASA,IACzCkP,EAAON,EAAO5O,GACd0H,EAAOwH,EAAK9G,UACZtM,KAAK8S,MAAOM,EAAK9G,WAAc8G,EAC/BvP,EAAO,GAAIlE,GAAGC,GAAGmU,iBAAmBzR,KAAMsJ,IAC1CwH,EAAK3G,WAAY5I,GACjBP,EAAM8O,KAAMvO,EAUb,OAPKP,GAAMc,SACVpE,KAAKgT,gBAAgBzP,SAAUD,EAAOrD,GACtCD,KAAKqT,6BAENrT,KAAKkP,YAAY3L,SAAUuP,EAAO7S,GAClCD,KAAKmC,KAAM,MAAO2Q,EAAO7S,GAElBD,MAYRL,EAAGC,GAAGgT,YAAYvR,UAAUyS,YAAc,SAAWhB,GACpD,GAAI5O,GAAGC,EAAKyH,EAAMwH,EACjB9P,IAED,KAAMY,EAAI,EAAGC,EAAM2O,EAAM1O,OAAYD,EAAJD,EAASA,IACzCkP,EAAON,EAAO5O,GACd0H,EAAOwH,EAAK9G,gBACLtM,MAAK8S,MAAOlH,GACnBtI,EAAM8O,KAAMpS,KAAKgT,gBAAgBtB,gBAAiB9F,IAClDwH,EAAK3G,WAAY,KASlB,OAPKnJ,GAAMc,SACVpE,KAAKgT,gBAAgB9E,YAAa5K,GAClCtD,KAAKqT,6BAENrT,KAAKkP,YAAYhB,YAAa4E,GAC9B9S,KAAKmC,KAAM,SAAU2Q,GAEd9S,MAWRL,EAAGC,GAAGgT,YAAYvR,UAAU2S,WAAa,WACxC,GAAI9P,GAAGC,EACN2O,EAAQ9S,KAAKkP,YAAYyB,UAK1B,KAHA3Q,KAAK8S,SACL9S,KAAK6S,gBAAkB,KACvB7S,KAAKgT,gBAAgB7I,aACfjG,EAAI,EAAGC,EAAM2O,EAAM1O,OAAYD,EAAJD,EAASA,IACzC4O,EAAO5O,GAAIuI,WAAY,KAMxB,OAJAzM,MAAKkP,YAAY/E,aAEjBnK,KAAKmC,KAAM,SAAU2Q,GAEd9S,MASRL,EAAGC,GAAGgT,YAAYvR,UAAU8R,QAAU,SAAWvH,GAChD,GAAIuC,GACHqE,EACAY,EAAOpT,KAAK8S,MAAOlH,GACnBqI,EAAejU,KAAK6S,iBAAmB7S,KAAK8S,MAAO9S,KAAK6S,gBAEpDjH,KAAS5L,KAAK6S,kBAClB1E,EAAenO,KAAKgT,gBAAgB/H,kBAC/BkD,GAAgBA,EAAa7D,YAAcsB,GAC/C5L,KAAKgT,gBAAgB3C,iBAAkBzE,GAEnCwH,IACCa,IACJA,EAAarH,WAAW,GAMvB5M,KAAKmP,WACLnP,KAAKkP,YAAY9B,YAC+B,IAAhDzN,EAAGC,GAAGmR,cAAeqC,EAAKjT,UAAWiE,SAErCoO,EAAWyB,EAAa9T,SAASuS,KAAM,UAClCF,EAASpO,QACboO,EAAU,GAAIlJ,SAIjBtJ,KAAK6S,gBAAkBjH,EACvBwH,EAAKxG,WAAW,GAChB5M,KAAKkP,YAAYjB,QAASmF,IACpBpT,KAAKkP,YAAY9B,YAAc6G,IAGpCzB,EAAWyB,EAAa9T,SAASuS,KAAM,UAClCF,EAASpO,QACboO,EAAU,GAAIlJ,QAGhBtJ,KAAKmC,KAAM,MAAOiR,MAUrBzT,EAAGC,GAAGgT,YAAYvR,UAAUgS,0BAA4B,WAKvD,MAJMrT,MAAKgT,gBAAgB/H,mBAC1BjL,KAAKgT,gBAAgBL,WAAY3S,KAAKgT,gBAAgB7H,0BAGhDnL,MAgBRL,EAAGC,GAAGsU,aAAe,SAA2BnU,GAE/CA,EAASA,MAGTJ,EAAGC,GAAGsU,aAAalI,OAAOvJ,KAAMzC,KAAMD,GAGtCC,KAAKmH,MAAQ,KAGbnH,KAAKG,SAASE,SAAU,sBACxBL,KAAKqK,WAAYtK,EAAOoH,QAKzBxH,EAAGyM,aAAczM,EAAGC,GAAGsU,aAAcvU,EAAGC,GAAGuU,QAmB3CxU,EAAGC,GAAGsU,aAAa7S,UAAUuJ,SAAW,WACvC,MAAO5K,MAAKmH,OAUbxH,EAAGC,GAAGsU,aAAa7S,UAAUgJ,SAAW,SAAWlD,GASlD,MARAA,KAAUA,EACLnH,KAAKmH,QAAUA,IACnBnH,KAAKmH,MAAQA,EACbnH,KAAKmC,KAAM,SAAUgF,GACrBnH,KAAKG,SAASuD,YAAa,wBAAyByD,GACpDnH,KAAKG,SAASuD,YAAa,0BAA2ByD,GACtDnH,KAAKG,SAASG,KAAM,eAAgB6G,EAAMiN,aAEpCpU,MAwCRL,EAAGC,GAAGyU,mBAAqB,SAAiCtU,GAE3DA,EAASA,MAGTJ,EAAGC,GAAGyU,mBAAmBrI,OAAOvJ,KAAMzC,KAAMD,GAG5CJ,EAAGC,GAAGC,MAAMyU,cAAc7R,KAAMzC,KAAMD,GACtCJ,EAAGC,GAAGC,MAAM0U,YAAY9R,KAAMzC,KAAMD,GACpCJ,EAAGC,GAAGC,MAAM2U,iBAAiB/R,KAAMzC,KAAMD,GACzCJ,EAAGC,GAAGC,MAAM4U,aAAahS,KAAMzC,KAAMD,GACrCJ,EAAGC,GAAGC,MAAM6U,cAAcjS,KAAMzC,KAAM4F,EAAE4C,UAAYzI,GAAU4U,QAAS3U,KAAK4U,WAC5EjV,EAAGC,GAAGC,MAAMgV,eAAepS,KAAMzC,KAAMD,GACvCJ,EAAGC,GAAGC,MAAMiV,kBAAkBrS,KAAMzC,KAAM4F,EAAE4C,UAAYzI,GAAUgV,YAAa/U,KAAK4U,WAGpF5U,KAAKgD,QAAShD,MAAQgV,MAAO,aAG7BhV,KAAK4U,QAAQpR,OAAQxD,KAAKiV,MAAOjV,KAAKkV,OAAQlV,KAAKmV,YACnDnV,KAAKG,SACHE,SAAU,4BACVmD,OAAQxD,KAAK4U,UAKhBjV,EAAGyM,aAAczM,EAAGC,GAAGyU,mBAAoB1U,EAAGC,GAAGsU,cACjDvU,EAAGgE,WAAYhE,EAAGC,GAAGyU,mBAAoB1U,EAAGC,GAAGC,MAAMyU,eACrD3U,EAAGgE,WAAYhE,EAAGC,GAAGyU,mBAAoB1U,EAAGC,GAAGC,MAAM0U,aACrD5U,EAAGgE,WAAYhE,EAAGC,GAAGyU,mBAAoB1U,EAAGC,GAAGC,MAAM2U,kBACrD7U,EAAGgE,WAAYhE,EAAGC,GAAGyU,mBAAoB1U,EAAGC,GAAGC,MAAM4U,cACrD9U,EAAGgE,WAAYhE,EAAGC,GAAGyU,mBAAoB1U,EAAGC,GAAGC,MAAM6U,eACrD/U,EAAGgE,WAAYhE,EAAGC,GAAGyU,mBAAoB1U,EAAGC,GAAGC,MAAMgV,gBACrDlV,EAAGgE,WAAYhE,EAAGC,GAAGyU,mBAAoB1U,EAAGC,GAAGC,MAAMiV,mBASrDnV,EAAGC,GAAGyU,mBAAmBhT,UAAU+T,SAAW,WAC7CpV,KAAKqK,UAAWrK,KAAKmH,QAMtBxH,EAAGC,GAAGyU,mBAAmBhT,UAAUgJ,SAAW,SAAWlD,GAaxD,MAZAA,KAAUA,EACLA,IAAUnH,KAAKmH,QAEdnH,KAAK4U,SACT5U,KAAK4U,QAAQtU,KAAM,eAAgB6G,EAAMiN,YAE1CpU,KAAK4M,UAAWzF,IAIjBxH,EAAGC,GAAGyU,mBAAmBrI,OAAO3K,UAAUgJ,SAAS5H,KAAMzC,KAAMmH,GAExDnH,MAMRL,EAAGC,GAAGyU,mBAAmBhT,UAAUgU,iBAAmB,SAAWT,GAC3D5U,KAAK4U,SACT5U,KAAK4U,QAAQU,WAAY,gBAE1B3V,EAAGC,GAAGC,MAAMyU,cAAcjT,UAAUgU,iBAAiB5S,KAAMzC,KAAM4U,GACjE5U,KAAK4U,QAAQtU,KAAM,eAAgBN,KAAKmH,MAAMiN,aAkC/CzU,EAAGC,GAAG2V,mBAAqB,SAAiCxV,GAE3DJ,EAAGC,GAAG2V,mBAAmBvJ,OAAOvJ,KAAMzC,KAAMD,GAG5CJ,EAAGC,GAAGC,MAAMiV,kBAAkBrS,KAAMzC,KAAMD,GAG1CC,KAAKwV,UAAW,EAChBxV,KAAKyV,UAAY,KACjBzV,KAAK0V,SAAU,EACf1V,KAAK2V,MAAQ/P,EAAG,UAChB5F,KAAK4V,MAAQhQ,EAAG,UAGhB5F,KAAKG,SAASI,IACbyU,MAAOhV,KAAK6V,QAAQnV,KAAMV,MAC1B8V,SAAU9V,KAAK+V,WAAWrV,KAAMV,QAIjCA,KAAK2V,MAAMtV,SAAU,iCACrBL,KAAK4V,MAAMvV,SAAU,iCACrBL,KAAKG,SACHE,SAAU,4BACVC,KAAM,OAAQ,YACdkD,OAAQxD,KAAK2V,MAAO3V,KAAK4V,QAK5BjW,EAAGyM,aAAczM,EAAGC,GAAG2V,mBAAoB5V,EAAGC,GAAGsU,cACjDvU,EAAGgE,WAAYhE,EAAGC,GAAG2V,mBAAoB5V,EAAGC,GAAGC,MAAMiV,mBAUrDnV,EAAGC,GAAG2V,mBAAmBlU,UAAUwU,QAAU,SAAWvU,GAIvD,MAHMtB,MAAKgW,cAAgB1U,EAAE2U,QAAUtW,EAAGC,GAAGsW,aAAaC,MACzDnW,KAAKqK,UAAWrK,KAAKmH,QAEf,GASRxH,EAAGC,GAAG2V,mBAAmBlU,UAAU0U,WAAa,SAAWzU,GAC1D,MAAMtB,MAAKgW,cAAkB1U,EAAE2U,QAAUtW,EAAGC,GAAGwW,KAAKC,OAAS/U,EAAE2U,QAAUtW,EAAGC,GAAGwW,KAAKE,MAApF,QACCtW,KAAKqK,UAAWrK,KAAKmH,QACd,IAsBTxH,EAAGC,GAAG+P,sBAAwB,SAAoC4G,EAASxW,GAErEJ,EAAGkM,cAAe0K,IAAwBzK,SAAX/L,IACnCA,EAASwW,EACTA,EAAUxW,EAAOwW,SAIlBxW,EAAS6F,EAAE4C,QAAUgO,KAAM,OAASzW,GAGpCJ,EAAGC,GAAG+P,sBAAsB3D,OAAOvJ,KAAMzC,KAAMD,GAG/CJ,EAAGC,GAAGC,MAAM2C,aAAaC,KAAMzC,KAAMD,GACrCJ,EAAGC,GAAGC,MAAM0U,YAAY9R,KAAMzC,KAAMD,GAGpCC,KAAKuW,QAAUA,EACfvW,KAAKyW,QAAU7Q,EAAG,SAClB5F,KAAK0W,SAAW,GAAI/W,GAAGC,GAAG+W,cACzBC,QAAQ,EACRJ,KAAM,WACNK,MAAOlX,EAAGC,GAAGkX,IAAK,kCAEnB9W,KAAK+W,WAAa,GAAIpX,GAAGC,GAAG+W,cAC3BC,QAAQ,EACRJ,KAAM,SACNK,MAAOlX,EAAGC,GAAGkX,IAAK,oCAEnB9W,KAAKgX,aAAe,GAAIrX,GAAGC,GAAG+W,cAC7BC,QAAQ,EACRJ,KAAM,SACNK,MAAOlX,EAAGC,GAAGkX,IAAK,iCAEnB9W,KAAKiX,WAAcC,MAAM,EAAM/E,QAAQ,GAGvCoE,EAAQvT,QAAShD,MAChB6P,OAAQ,kBACRsH,IAAK,kBACLhF,OAAQ,oBAETnS,KAAK0W,SAAS1T,QAAShD,MAAQgV,OAAS,OAAQ,OAAQ,MACxDhV,KAAK+W,WAAW/T,QAAShD,MAAQgV,OAAS,OAAQ,OAAQ,KAC1DhV,KAAKgX,aAAahU,QAAShD,MAAQgV,OAAS,OAAQ,YAGpDhV,KAAKG,SAASE,SAAU,+BACxBL,KAAKqG,OAAOhG,SAAU,qCACtBL,KAAKyW,QACHpW,SAAU,sCACVmD,OAAQxD,KAAKgX,aAAa7W,SAAUH,KAAK0W,SAASvW,SAAUH,KAAK+W,WAAW5W,UAC9EH,KAAKG,SAASqD,OAAQxD,KAAKiV,MAAOjV,KAAKqG,OAAQrG,KAAKyW,SACpDzW,KAAKoX,aAAcrX,EAAOkX,gBAK3BtX,EAAGyM,aAAczM,EAAGC,GAAG+P,sBAAuBhQ,EAAGC,GAAGuU,QACpDxU,EAAGgE,WAAYhE,EAAGC,GAAG+P,sBAAuBhQ,EAAGC,GAAGC,MAAM2C,cACxD7C,EAAGgE,WAAYhE,EAAGC,GAAG+P,sBAAuBhQ,EAAGC,GAAGC,MAAM0U,aAsBxD5U,EAAGC,GAAG+P,sBAAsBtO,UAAU+V,aAAe,SAAWH,GAC/D,GAAII,EAEJ,KAAMA,IAAWrX,MAAKiX,UACSnL,SAAzBmL,EAAWI,KACfrX,KAAKiX,UAAWI,KAAcJ,EAAWI,GAI3CrX,MAAKsX,mBAQN3X,EAAGC,GAAG+P,sBAAsBtO,UAAUiW,gBAAkB,WACvD,GAAIpT,GAAGC,EAAKoT,EAAcC,EACzBlU,EAAQtD,KAAKuW,QAAQ5F,WACrBxC,EAAenO,KAAKuW,QAAQtL,kBAC5BwM,EAAUzX,KAAKiX,UAAUC,MAAQ/I,GAAgBA,EAAauJ,YAC9DC,EAAY3X,KAAKiX,UAAU9E,QAAUhE,GAAgBA,EAAayJ,aAEnE,IAAKH,EAAU,CAGd,IAFAvT,EAAI,GACJC,EAAMb,EAAMc,SACFF,EAAIC,GACb,GAAKb,EAAOY,GAAIwT,YAAc,CAC7BH,EAAejU,EAAOY,EACtB,OAIF,IADAA,EAAIC,EACID,KACP,GAAKZ,EAAOY,GAAIwT,YAAc,CAC7BF,EAAclU,EAAOY,EACrB,QAIHlE,KAAK0W,SAASmB,aAAcJ,GAAWtJ,IAAiBoJ,GACxDvX,KAAK+W,WAAWc,aAAcJ,GAAWtJ,IAAiBqJ,GAC1DxX,KAAKgX,aAAaa,aAAcF,IAkBjChY,EAAGC,GAAG0S,oBAAsB,SAAkCvS,GAE7DA,EAASA,MAGTJ,EAAGC,GAAG0S,oBAAoBtG,OAAOvJ,KAAMzC,KAAMD,GAG7CC,KAAKyR,MAAQ,EACbzR,KAAKyX,UAAY1X,EAAO0X,QACxBzX,KAAK2X,YAAc5X,EAAO4X,UAG1B3X,KAAKG,SAASE,SAAU,6BACxBL,KAAK8X,SAAU/X,EAAO0R,QAKvB9R,EAAGyM,aAAczM,EAAGC,GAAG0S,oBAAqB3S,EAAGC,GAAGmY,uBAIlDpY,EAAGC,GAAG0S,oBAAN3S,UAAiCqY,eAAgB,EAEjDrY,EAAGC,GAAG0S,oBAAN3S,UAAiCsY,wBAAyB,EAE1DtY,EAAGC,GAAG0S,oBAAN3S,UAAiCuY,WAAa,mCAE9CvY,EAAGC,GAAG0S,oBAAN3S,UAAiCwY,OAAS,EAW1CxY,EAAGC,GAAG0S,oBAAoBjR,UAAUqW,UAAY,WAC/C,MAAO1X,MAAKyX,SAUb9X,EAAGC,GAAG0S,oBAAoBjR,UAAUuW,YAAc,WACjD,MAAO5X,MAAK2X,WAQbhY,EAAGC,GAAG0S,oBAAoBjR,UAAUsQ,SAAW,WAC9C,MAAO3R,MAAKyR,OAWb9R,EAAGC,GAAG0S,oBAAoBjR,UAAU+W,WAAa,SAAWX,GAG3D,MAFAzX,MAAKyX,UAAYA,EACjBzX,KAAKqY,qBACErY,MAWRL,EAAGC,GAAG0S,oBAAoBjR,UAAUiX,aAAe,SAAWX,GAG7D,MAFA3X,MAAK2X,YAAcA,EACnB3X,KAAKqY,qBACErY,MASRL,EAAGC,GAAG0S,oBAAoBjR,UAAUyW,SAAW,SAAWrG,GACzD,GAAI0G,GAASnY,KAAKuY,YAALvY,UAAwBmY,OACpCD,EAAalY,KAAKuY,YAALvY,UAAwBkY,WACrChU,EAAIiU,CAGL,KADAnY,KAAKyR,MAAQA,EAAQ+G,KAAKC,IAAK,EAAGD,KAAKE,IAAKP,EAAS,EAAG1G,IAAY,EAC5DvN,KACFlE,KAAKyR,QAAUvN,EACnBlE,KAAKG,SAASE,SAAU6X,EAAahU,GAErClE,KAAKG,SAAS+B,YAAagW,EAAahU,EAK1C,OAFAlE,MAAKqY,qBAEErY,MAgBRL,EAAGC,GAAG6P,oBAAsB,SAAkC1P,GAE7DJ,EAAGC,GAAG6P,oBAAoBzD,OAAOvJ,KAAMzC,KAAMD,GAG7CJ,EAAGC,GAAGC,MAAMiV,kBAAkBrS,KAAMzC,KAAMD,GAG1CC,KAAKG,SAASI,IACb6I,MAAOpJ,KAAK2Y,oBAAoBjY,KAAMV,MACtCsJ,KAAMtJ,KAAK4Y,sBAAsBlY,KAAMV,QAIxCA,KAAKG,SAASE,SAAU,8BAKzBV,EAAGyM,aAAczM,EAAGC,GAAG6P,oBAAqB9P,EAAGC,GAAGiZ,cAClDlZ,EAAGgE,WAAYhE,EAAGC,GAAG6P,oBAAqB9P,EAAGC,GAAGC,MAAMiV;AAmBtDnV,EAAGC,GAAGkZ,mBAAqB,SAAiC/Y,GAE3DA,EAASA,MAGTJ,EAAGC,GAAGkZ,mBAAmB9M,OAAOvJ,KAAMzC,KAAMD,GAG5CJ,EAAGC,GAAGC,MAAMyU,cAAc7R,KAAMzC,KAAMD,GACtCJ,EAAGC,GAAGC,MAAM6U,cAAcjS,KAAMzC,KAAM4F,EAAE4C,UAAYzI,GAAU4U,QAAS3U,KAAK4U,WAC5EjV,EAAGC,GAAGC,MAAMiV,kBAAkBrS,KAAMzC,KAAM4F,EAAE4C,UAAYzI,GACvDgV,YAAa/U,KAAK4U,QAClBmE,SAAU,MAIX/Y,KAAKG,SAASE,SAAU,4BACxBL,KAAK4U,QAAQpR,OAAQxD,KAAKG,SAAS6Y,YACnChZ,KAAKG,SAASqD,OAAQxD,KAAK4U,UAK5BjV,EAAGyM,aAAczM,EAAGC,GAAGkZ,mBAAoBnZ,EAAGC,GAAGmY,uBACjDpY,EAAGgE,WAAYhE,EAAGC,GAAGkZ,mBAAoBnZ,EAAGC,GAAGC,MAAMyU,eACrD3U,EAAGgE,WAAYhE,EAAGC,GAAGkZ,mBAAoBnZ,EAAGC,GAAGC,MAAM6U,eACrD/U,EAAGgE,WAAYhE,EAAGC,GAAGkZ,mBAAoBnZ,EAAGC,GAAGC,MAAMiV,mBAKrDnV,EAAGC,GAAGkZ,mBAANnZ,UAAgCyB,6BAA8B,EAE9DzB,EAAGC,GAAGkZ,mBAANnZ,UAAgCqY,eAAgB,EAOhDrY,EAAGC,GAAGkZ,mBAAmBzX,UAAU4X,YAAc,SAAWC,GAO3D,MANAvZ,GAAGC,GAAGkZ,mBAAmB9M,OAAO3K,UAAU4X,YAAYxW,KAAMzC,KAAMkZ,GAE7DlZ,KAAKuY,YAALvY,UAAwBmZ,YAC5BnZ,KAAK4M,UAAWsM,GAGVlZ,MA4CRL,EAAGC,GAAGwZ,mBAAqB,SAAiCrZ,GAE3DJ,EAAGC,GAAGwZ,mBAAmBpN,OAAOvJ,KAAMzC,KAAMD,GAG5CJ,EAAGC,GAAGC,MAAMiV,kBAAkBrS,KAAMzC,KAAMD,GAG1CC,KAAKG,SAASI,IACb6I,MAAOpJ,KAAK2Y,oBAAoBjY,KAAMV,MACtCsJ,KAAMtJ,KAAK4Y,sBAAsBlY,KAAMV,QAIxCA,KAAKG,SAASE,SAAU,6BAKzBV,EAAGyM,aAAczM,EAAGC,GAAGwZ,mBAAoBzZ,EAAGC,GAAGiZ,cACjDlZ,EAAGgE,WAAYhE,EAAGC,GAAGwZ,mBAAoBzZ,EAAGC,GAAGC,MAAMiV,mBAerDnV,EAAGC,GAAGmU,gBAAkB,SAA8BhU,GAErDA,EAASA,MAGTJ,EAAGC,GAAGmU,gBAAgB/H,OAAOvJ,KAAMzC,KAAMD,GAGzCC,KAAKG,SAASE,SAAU,0BAKzBV,EAAGyM,aAAczM,EAAGC,GAAGmU,gBAAiBpU,EAAGC,GAAGyZ,cAI9C1Z,EAAGC,GAAGmU,gBAANpU,UAA6BqY,eAAgB,EAc7CrY,EAAGC,GAAGqT,gBAAkB,SAA8BlT,GAErDJ,EAAGC,GAAGqT,gBAAgBjH,OAAOvJ,KAAMzC,KAAMD,GAGzCJ,EAAGC,GAAGC,MAAMiV,kBAAkBrS,KAAMzC,KAAMD,GAG1CC,KAAKG,SAASI,IACb6I,MAAOpJ,KAAK2Y,oBAAoBjY,KAAMV,MACtCsJ,KAAMtJ,KAAK4Y,sBAAsBlY,KAAMV,QAIxCA,KAAKG,SAASE,SAAU,0BAKzBV,EAAGyM,aAAczM,EAAGC,GAAGqT,gBAAiBtT,EAAGC,GAAGiZ,cAC9ClZ,EAAGgE,WAAYhE,EAAGC,GAAGqT,gBAAiBtT,EAAGC,GAAGC,MAAMiV,mBAgBlDnV,EAAGC,GAAG0Z,kBAAoB,SAAgCvZ,GAEzDA,EAASA,MAGTJ,EAAGC,GAAG0Z,kBAAkBtN,OAAOvJ,KAAMzC,KAAMD,GAG3CJ,EAAGC,GAAGC,MAAM0Z,WAAW9W,KAAMzC,MAC7BL,EAAGC,GAAGC,MAAM4U,aAAahS,KAAMzC,KAAMD,GACrCJ,EAAGC,GAAGC,MAAMgV,eAAepS,KAAMzC,KAAMD,GACvCJ,EAAGC,GAAGC,MAAMiV,kBAAkBrS,KAAMzC,KAAMD,GAG1CC,KAAKwZ,YAAc,GAAI7Z,GAAGC,GAAG+W,cAC5BC,QAAQ,EACR6C,UAAW,QACXV,SAAU,KACPxY,GAAI,QAASP,KAAK0Z,aAAahZ,KAAMV,OAEzCA,KAAKO,GAAI,UAAW,SAAWkK,GAC9BzK,KAAKwZ,YAAY3B,YAAapN,IAC7B/J,KAAMV,OAGRA,KAAKG,SACHI,IACAyU,MAAOhV,KAAK6V,QAAQnV,KAAMV,MAC1B2Z,QAAS3Z,KAAK4Z,UAAUlZ,KAAMV,QAE9BK,SAAU,2BACVmD,OAAQxD,KAAKkV,OAAQlV,KAAKwZ,YAAYrZ,WAKzCR,EAAGyM,aAAczM,EAAGC,GAAG0Z,kBAAmB3Z,EAAGC,GAAGuU,QAChDxU,EAAGgE,WAAYhE,EAAGC,GAAG0Z,kBAAmB3Z,EAAGC,GAAGC,MAAM0Z,YACpD5Z,EAAGgE,WAAYhE,EAAGC,GAAG0Z,kBAAmB3Z,EAAGC,GAAGC,MAAM4U,cACpD9U,EAAGgE,WAAYhE,EAAGC,GAAG0Z,kBAAmB3Z,EAAGC,GAAGC,MAAMgV,gBACpDlV,EAAGgE,WAAYhE,EAAGC,GAAG0Z,kBAAmB3Z,EAAGC,GAAGC,MAAMiV,mBAOpDnV,EAAGC,GAAG0Z,kBAAkBjY,UAAUqY,aAAe,WAChD,GAAIjY,GAAUzB,KAAK6Z,iBAEdpY,IAAWmE,EAAEkU,WAAYrY,EAAQyM,eACrCzM,EAAQyM,aAAelO,OACvByB,EAAQ2H,UAOVzJ,EAAGC,GAAG0Z,kBAAkBjY,UAAUwU,QAAU,WAC3C,GAAIpU,GAAUzB,KAAK6Z,mBAEb7Z,KAAKgW,cAAgBvU,GAAWmE,EAAEkU,WAAYrY,EAAQsY,WAC3DtY,EAAQsY,SAAU/Z,OAOpBL,EAAGC,GAAG0Z,kBAAkBjY,UAAUuY,UAAY,SAAWtY,GACxD,GAAIG,GAAUzB,KAAK6Z,iBAEnB,OAAKvY,GAAE0Y,UAAYra,EAAGC,GAAGwW,KAAK6D,WAAa3Y,EAAE0Y,UAAYra,EAAGC,GAAGwW,KAAK8D,QACnEzY,EAAQyM,aAAelO,OACvByB,EAAQ2H,SACD,GACI9H,EAAE0Y,UAAYra,EAAGC,GAAGwW,KAAKE,OACpC7U,EAAQsY,SAAU/Z,OACX,QACIsB,EAAE0Y,UAAYra,EAAGC,GAAGwW,KAAKD,KACpC1U,EAAQ0Y,gBAAiBna,MAAOoJ,QACrB9H,EAAE0Y,UAAYra,EAAGC,GAAGwW,KAAKgE,OACpC3Y,EAAQ4Y,YAAara,MAAOoJ,UAO9BzJ,EAAGC,GAAG0Z,kBAAkBjY,UAAU+H,MAAQ,WACzCpJ,KAAKG,SAASiJ,SAiEfzJ,EAAGC,GAAG0a,yBAA2B,SAAuCva,GACvE,GAAIwa,EAGJ5a,GAAGC,GAAG0a,yBAAyBtO,OAAOvJ,KAAMzC,KAAMD,GAGlDA,EAAS6F,EAAE4C,QACVgS,gBAAgB,EAChB9R,SAAU1I,KAAKG,UACbJ,GAGHC,KAAKmJ,OAASpJ,EAAO0a,MAAQ,KAAO7U,EAAG,WACvC5F,KAAKE,QAAU0F,EAAG,SAGlBjG,EAAGC,GAAGC,MAAM2C,aAAaC,KAAMzC,KAAMD,GAChCA,EAAO0a,OACX1a,EAAO0a,MAAQ7U,EAAE4C,UAAYzI,EAAO0a,OACnCC,MAAO,WACPC,QAAQ,IAEThb,EAAGC,GAAGC,MAAM+a,aAAanY,KAAMzC,KAAMD,GACrCwa,EAAY3U,EAAG,UACfjG,EAAGC,GAAGC,MAAMiV,kBAAkBrS,KAAMzC,KAAM4F,EAAE4C,UAAYzI,GAAUgV,YAAawF,OAE/Eva,KAAKya,MAAQ,KACbF,EAAY,KACZ5a,EAAGC,GAAGC,MAAMiV,kBAAkBrS,KAAMzC,KAAM4F,EAAE4C,UAAYzI,GAAUgV,YAAa/U,KAAKmJ,WAErFxJ,EAAGC,GAAGC,MAAM2U,iBAAiB/R,KAAMzC,KAAMD,GACzCJ,EAAGC,GAAGC,MAAM0U,YAAY9R,KAAMzC,KAAMD,GAGpCC,KAAKwO,SAAW5I,EAAG,SACnB5F,KAAKwa,eAAiBza,EAAOya,eAC7Bxa,KAAK0I,SAAW3I,EAAO2I,SACvB1I,KAAK6a,KAAO,GAAIlb,GAAGC,GAAGgJ,yBAA0BhD,EAAE4C,QAEhDtB,OAAQlH,KACRmJ,OAAQnJ,KAAKmJ,OACbL,WAAY9I,KAAKG,SACjB2a,iBAAiB,EACjBrQ,SAAUzK,KAAKgW,cAEhBjW,EAAO8a,OAIH7a,KAAKya,OACTF,EAAUha,IACT6I,MAAOpJ,KAAK+a,gBAAgBra,KAAMV,QAEnCA,KAAKya,MAAMta,SAASI,GAAI,WAAYP,KAAKgb,gBAAgBta,KAAMV,OAC1DA,KAAKya,MAAMQ,kBACfjb,KAAKya,MAAMQ,iBAAiB1a,GAAI,WAAYP,KAAKgb,gBAAgBta,KAAMV,OAExEA,KAAKya,MAAMzX,QAAShD,MACnB0J,OAAQ,SAAWO,GAClBsQ,EAAU7Q,QAASO,OAIrBjK,KAAKmJ,OAAO5I,IACX6I,MAAOpJ,KAAKkb,aAAaxa,KAAMV,MAC/BsJ,KAAMtJ,KAAKmb,YAAYza,KAAMV,MAC7Bob,iFACCzb,EAAGC,GAAGyN,SAAUrN,KAAKqb,gBAAgB3a,KAAMV,OAC5C2Z,QAAS3Z,KAAK4Z,UAAUlZ,KAAMV,MAC9B8V,SAAU9V,KAAK+V,WAAWrV,KAAMV,QAGlCA,KAAK6a,KAAK7X,QAAShD,MAClB2J,OAAQ,eACRwN,IAAK,oBACLhF,OAAQ,sBAETnS,KAAKE,QAAQK,IACZC,UAAWR,KAAKsb,YAAY5a,KAAMV,QAI9BA,KAAKmJ,SACTnJ,KAAKmJ,OAAOoS,KAAM,WAAYvb,KAAKgW,cACnChW,KAAKmJ,OAAO7I,MACXkb,KAAM,WACNC,oBAAqB,SAEtBzb,KAAKqb,mBAEDtb,EAAOuC,MACXtC,KAAK0b,iBAAkB3b,EAAOuC,MAE/BtC,KAAKwO,SAASnO,SAAU,0CACtBmD,OAAQxD,KAAKqG,QACfrG,KAAKqG,OAAOhG,SAAU,wCACtBL,KAAKE,QAAQG,SAAU,yCACrBmD,OAAQxD,KAAKmV,WAAYnV,KAAKiV,MAAOjV,KAAKwO,UAC5CxO,KAAKG,SAASE,SAAU,kCACtBmD,OAAQxD,KAAKE,SACVF,KAAKya,OACTza,KAAKwO,SAAShL,OAAQ+W,GACtBva,KAAK0I,SAASlF,OAAQxD,KAAKya,MAAMta,YAEjCH,KAAKwO,SAAShL,OAAQxD,KAAKmJ,QAC3BnJ,KAAK0I,SAASlF,OAAQxD,KAAK6a,KAAK1a,WAEjCH,KAAK2b,qBAKNhc,EAAGyM,aAAczM,EAAGC,GAAG0a,yBAA0B3a,EAAGC,GAAGuU,QACvDxU,EAAGgE,WAAYhE,EAAGC,GAAG0a,yBAA0B3a,EAAGC,GAAGC,MAAM2C,cAC3D7C,EAAGgE,WAAYhE,EAAGC,GAAG0a,yBAA0B3a,EAAGC,GAAGC,MAAM+a,cAC3Djb,EAAGgE,WAAYhE,EAAGC,GAAG0a,yBAA0B3a,EAAGC,GAAGC,MAAMiV,mBAC3DnV,EAAGgE,WAAYhE,EAAGC,GAAG0a,yBAA0B3a,EAAGC,GAAGC,MAAM2U,kBAC3D7U,EAAGgE,WAAYhE,EAAGC,GAAG0a,yBAA0B3a,EAAGC,GAAGC,MAAM0U,aAsB3D5U,EAAGC,GAAG0a,yBAAyBjZ,UAAUua,iBAAmB,SAAWtZ,EAAM2J,GAC5E,MAAO,IAAItM,GAAGC,GAAG0Z,mBAAqBhX,KAAMA,EAAM2J,MAAOA,KAQ1DtM,EAAGC,GAAG0a,yBAAyBjZ,UAAUwa,aAAe,WACvD,MAAOjW,GAAEkW,IAAK9b,KAAK2Q,WAAY,SAAWrP,GAAM,MAAOA,GAAEgB,QAU1D3C,EAAGC,GAAG0a,yBAAyBjZ,UAAUqa,iBAAmB,SAAWK,GACtE,GAAI7U,GAASlH,KACZ6a,EAAO7a,KAAK6a,KACZvX,EAAQtD,KAAK2Q,UAgCd,OA9BA/K,GAAEoW,KAAMD,EAAO,SAAW7X,EAAG5B,GAC5B,GAAI2Z,GAAGhQ,EACNpI,EAAOgX,EAAKnJ,gBAAiBpP,EAE9B,IAAKuB,EACJoI,EAAQpI,EAAKoI,UACP,CAAA,IAAK/E,EAAOsT,eAGlB,MAFAvO,GAAQiQ,OAAQ5Z,GAMjB,IADAuB,EAAO,KACDoY,EAAI,EAAGA,EAAI3Y,EAAMc,OAAQ6X,IAC9B,GAAK3Y,EAAO2Y,GAAI3Z,OAASA,GAAQgB,EAAO2Y,GAAIhQ,QAAUA,EAAQ,CAC7DpI,EAAOP,EAAO2Y,GACd3Y,EAAMmD,OAAQwV,EAAG,EACjB,OAGIpY,IACLA,EAAOqD,EAAO0U,iBAAkBtZ,EAAM2J,IAEvC/E,EAAO3D,UAAYM,GAAQK,KAGvBZ,EAAMc,QACV8C,EAAOgH,YAAa5K,GAGdtD,MAURL,EAAGC,GAAG0a,yBAAyBjZ,UAAU8a,iBAAmB,SAAWJ,GACtE,GAAI7U,GAASlH,KACZ6a,EAAO7a,KAAK6a,KACZvX,IAmBD,OAjBAsC,GAAEoW,KAAMD,EAAO,SAAW7X,EAAG5B,GAC5B,GAAIuB,EAEEqD,GAAOwK,gBAAiBpP,KAC7BuB,EAAOgX,EAAKnJ,gBAAiBpP,GACxBuB,EACJP,EAAM8O,KAAMlL,EAAO0U,iBAAkBtZ,EAAMuB,EAAKoI,QACrC/E,EAAOsT,gBAClBlX,EAAM8O,KAAMlL,EAAO0U,iBAAkBtZ,EAAM4Z,OAAQ5Z,QAKjDgB,EAAMc,QACVpE,KAAKuD,SAAUD,GAGTtD,MASRL,EAAGC,GAAG0a,yBAAyBjZ,UAAU+a,iBAAmB,SAAWnQ,GACtE,GAAIpI,GAAO7D,KAAK6a,KAAKwB,iBAAkBpQ,GAAO,EAC9C,OAAKpI,IACJ7D,KAAKmc,kBAAoBtY,EAAKvB,QACvB,GACItC,KAAKwa,gBAA+C,KAA7Bxa,KAAKmJ,OAAOmT,MAAMC,QACpDvc,KAAKmc,kBAAoBlQ,KAClB,IAED,GAURtM,EAAGC,GAAG0a,yBAAyBjZ,UAAUmb,oBAAsB,SAAWT,GACzE,GAAI7U,GAASlH,KACZsD,IAaD,OAXAsC,GAAEoW,KAAMD,EAAO,SAAW7X,EAAG5B,GAC5B,GAAIuB,GAAOqD,EAAOwK,gBAAiBpP,EAC9BuB,IACJP,EAAM8O,KAAMvO,KAITP,EAAMc,QACVpE,KAAKkO,YAAa5K,GAGZtD,MAMRL,EAAGC,GAAG0a,yBAAyBjZ,UAAUkC,SAAW,SAAWD,GAC9D,GAAImZ,GAAMvY,EAAGwY,EACZC,EAAW3c,KAAKsD,MAAMQ,OAIvB,IAFAnE,EAAGC,GAAGC,MAAM2C,aAAanB,UAAUkC,SAASd,KAAMzC,KAAMsD,GAEnDtD,KAAKsD,MAAMc,SAAWuY,EAASvY,OACnCqY,GAAO,MAGP,KADAA,GAAO,EACDvY,EAAI,EAAGwY,EAAIC,EAASvY,OAAQqY,GAAYC,EAAJxY,EAAOA,IAChDuY,EAAOA,GAAQzc,KAAKsD,MAAOY,KAAQyY,EAAUzY,EAQ/C,OALMuY,KACLzc,KAAKmC,KAAM,SAAUnC,KAAK6b,gBAC1B7b,KAAK6a,KAAK7U,YAGJhG,MAQRL,EAAGC,GAAG0a,yBAAyBjZ,UAAU0Y,SAAW,SAAWlW,GAC9D7D,KAAKmJ,OAAOmT,IAAKzY,EAAKoI,OACtBjM,KAAKqb,kBACLrb,KAAKoJ,QACLpJ,KAAKkO,aAAerK,KAMrBlE,EAAGC,GAAG0a,yBAAyBjZ,UAAU6M,YAAc,SAAW5K,GACjE,GAAImZ,GAAMvY,EAAGwY,EACZC,EAAW3c,KAAKsD,MAAMQ,OAIvB,IAFAnE,EAAGC,GAAGC,MAAM2C,aAAanB,UAAU6M,YAAYzL,KAAMzC,KAAMsD,GAEtDtD,KAAKsD,MAAMc,SAAWuY,EAASvY,OACnCqY,GAAO,MAGP,KADAA,GAAO,EACDvY,EAAI,EAAGwY,EAAIC,EAASvY,OAAQqY,GAAYC,EAAJxY,EAAOA,IAChDuY,EAAOA,GAAQzc,KAAKsD,MAAOY,KAAQyY,EAAUzY,EAQ/C,OALMuY,KACLzc,KAAKmC,KAAM,SAAUnC,KAAK6b,gBAC1B7b,KAAK6a,KAAK7U,YAGJhG,MAMRL,EAAGC,GAAG0a,yBAAyBjZ,UAAU8I,WAAa,WAMrD,MALKnK,MAAKsD,MAAMc,SACfzE,EAAGC,GAAGC,MAAM2C,aAAanB,UAAU8I,WAAW1H,KAAMzC,MACpDA,KAAKmC,KAAM,SAAUnC,KAAK6b,gBAC1B7b,KAAK6a,KAAK7U,YAEJhG,MAWRL,EAAGC,GAAG0a,yBAAyBjZ,UAAUgZ,YAAc,SAAWxW,GACjE,GAAI6M,EAEJ,OAAc5E,UAATjI,EACG7D,KAAKsD,MAAO,IAGpBoN,EAAY1Q,KAAKsD,MAAMmB,QAASZ,GACf,EAAZ6M,GACG,EACIA,IAAc1Q,KAAKsD,MAAMc,OAAS,EACtCpE,KAAKmJ,OAELnJ,KAAKsD,MAAOoN,EAAY,KAYjC/Q,EAAGC,GAAG0a,yBAAyBjZ,UAAU8Y,gBAAkB,SAAWtW,GACrE,GAAI6M,EAEJ,OAAc5E,UAATjI,EACG7D,KAAKsD,MAAOtD,KAAKsD,MAAMc,OAAS,IAGxCsM,EAAY1Q,KAAKsD,MAAMmB,QAASZ,GACf,EAAZ6M,GACG,EACkB,IAAdA,EACJ1Q,KAAKmJ,OAELnJ,KAAKsD,MAAOoN,EAAY,KASjC/Q,EAAGC,GAAG0a,yBAAyBjZ,UAAUub,QAAU,WAClD,MAAO5c,MAAK6a,MASblb,EAAGC,GAAG0a,yBAAyBjZ,UAAU6Z,aAAe,WACjDlb,KAAKgW,cACVhW,KAAK6a,KAAKnR,QAAQ,IAUpB/J,EAAGC,GAAG0a,yBAAyBjZ,UAAU8Z,YAAc,WACtDnb,KAAKoc,iBAAkBpc,KAAKmJ,OAAOmT,OACnCtc,KAAK6c,cASNld,EAAGC,GAAG0a,yBAAyBjZ,UAAU0Z,gBAAkB,WACpD/a,KAAKgW,eACVhW,KAAKya,MAAMqC,QAAS9c,KAAKE,QAAQ+F,SACjCjG,KAAKya,MAAM/Q,QAAQ,GACnB1J,KAAKya,MAAMta,SAASuS,KAAM,KACxBqK,OAAQ,WAAc,MAAOpd,GAAGC,GAAGod,mBAAoBpX,EAAG5F,OAAQ,KAClEid,QACA7T,UAUJzJ,EAAGC,GAAG0a,yBAAyBjZ,UAAU2Z,gBAAkB,WAC1D,GAAI9T,GAASlH,KAAKya,KAElBxY,YAAY,YAEViF,EAAO4C,aACNnK,EAAGC,GAAG2B,SAAU2F,EAAO/G,SAAU,GAAK+c,SAASrM,eAAe,IAC5D3J,EAAO+T,kBAAqB/T,EAAO+T,iBAAiBkC,IAAKD,SAASrM,eAAgBzM,QAErF8C,EAAOwC,QAAQ,MAWlB/J,EAAGC,GAAG0a,yBAAyBjZ,UAAUia,YAAc,SAAWha,GACjE,MAAKA,GAAE2U,QAAUtW,EAAGC,GAAGsW,aAAaC,MACnCnW,KAAKoJ,SACE,OAEPpJ,MAAKqb,mBAUP1b,EAAGC,GAAG0a,yBAAyBjZ,UAAU0U,WAAa,SAAWzU,GAChE,IAAMtB,KAAKgW,aAAe,CACzB,GAAK1U,EAAE2U,QAAUtW,EAAGC,GAAGwW,KAAKgH,OAE3B,MADApd,MAAK6c,cACE,CAGR,KAAM7c,KAAKya,MAAQ,CAElB,GADAza,KAAK6a,KAAKnR,QAAQ,GACbpI,EAAE2U,QAAUtW,EAAGC,GAAGwW,KAAKE,MAI3B,MAHKtW,MAAKoc,iBAAkBpc,KAAKmJ,OAAOmT,QACvCtc,KAAK6c,cAEC,CAIR5a,YAAYjC,KAAKqb,gBAAgB3a,KAAMV,MAAQ,MAWlDL,EAAGC,GAAG0a,yBAAyBjZ,UAAUuY,UAAY,SAAWtY,GAC/D,IACEtB,KAAKgW,cACgB,KAAtBhW,KAAKmJ,OAAOmT,OACZtc,KAAKsD,MAAMc,OACV,CAED,GAAK9C,EAAE0Y,UAAYra,EAAGC,GAAGwW,KAAK6D,UAM7B,MALK3Y,GAAE+b,SAAW/b,EAAEgc,QACnBtd,KAAKkO,YAAalO,KAAKsD,MAAMQ,MAAO,KAEpC9D,KAAK+Z,SAAU/Z,KAAKsD,MAAOtD,KAAKsD,MAAMc,OAAS,KAEzC,CACI9C,GAAE0Y,UAAYra,EAAGC,GAAGwW,KAAKD,KACpCnW,KAAKma,kBAAkB/Q,QACZ9H,EAAE0Y,UAAYra,EAAGC,GAAGwW,KAAKgE,OACpCpa,KAAKqa,cAAcjR,UAWtBzJ,EAAGC,GAAG0a,yBAAyBjZ,UAAUga,gBAAkB,WAC1D,GAAIkC,GAAWC,EAAWC,EAAcC,EAAcC,CACtD,KAAM3d,KAAKgW,aAAe,CAOzB,GANAhW,KAAKmJ,OAAOnF,IAAK,QAAS,OAC1BuZ,EAAYvd,KAAKqG,OAAOC,WAAWsX,OACnCJ,EAAY7d,EAAGC,GAAGie,QAANle,UAAqBme,OAAQ9d,KAAKE,SAC9Cud,EAAezd,KAAKmJ,OAAQ,GAAI4U,YAChCL,EAAe1d,KAAKmJ,OAAOlD,QAEPyX,EAAfD,EAEJ,MAMAE,GAHKJ,EAAUnZ,OAGW,QAAdoZ,EACXxd,KAAKwO,SAASwP,aAAeT,EAAUvX,WAAWE,KAAOqX,EAAUU,aACnEV,EAAUvX,WAAWE,KAJVlG,KAAKwO,SAASwP,aAQ3BL,GAAa,GACRF,EAAeE,IAEnBA,EAAY3d,KAAKwO,SAASwP,aAAe,IAE1Che,KAAKmJ,OAAOlD,MAAOuS,KAAK0F,MAAOP,IAE/B3d,KAAK6a,KAAK7U,aAUZrG,EAAGC,GAAG0a,yBAAyBjZ,UAAU8c,aAAe,SAAWta,GAC7DA,GAAQA,EAAKiG,cACjB9J,KAAKmc,kBAAoBtY,EAAKyG,YAC9BtK,KAAK6c,eASPld,EAAGC,GAAG0a,yBAAyBjZ,UAAUsa,kBAAoB,WAC5D3b,KAAK0b,iBAAkB1b,KAAK6b,gBAC5B7b,KAAKG,SAASuD,YAAa,uCAAwC1D,KAAK6a,KAAKlQ,YAQ9EhL,EAAGC,GAAG0a,yBAAyBjZ,UAAUwb,WAAa,WAChD7c,KAAKmJ,SACTnJ,KAAKmJ,OAAOmT,IAAK,IACjBtc,KAAKqb,mBAEDrb,KAAKya,OACTza,KAAKya,MAAM/Q,QAAQ,GAEpB1J,KAAK6a,KAAKnR,QAAQ,GAClB1J,KAAK6a,KAAKlI,aACV3S,KAAK6a,KAAK3P,iBAMXvL,EAAGC,GAAG0a,yBAAyBjZ,UAAUwW,YAAc,SAAWpN,GACjE,GAAIvG,GAAGC,CAeP,IAZAxE,EAAGC,GAAG0a,yBAAyBtO,OAAO3K,UAAUwW,YAAYpV,KAAMzC,KAAMyK,GAEnEzK,KAAKmJ,QACTnJ,KAAKmJ,OAAOoS,KAAM,WAAYvb,KAAKgW,cAE/BhW,KAAK6a,MACT7a,KAAK6a,KAAKhD,YAAa7X,KAAKgW,cAExBhW,KAAKya,OACTza,KAAKya,MAAM5C,YAAa7X,KAAKgW,cAGzBhW,KAAKsD,MACT,IAAMY,EAAI,EAAGC,EAAMnE,KAAKsD,MAAMc,OAAYD,EAAJD,EAASA,IAC9ClE,KAAKsD,MAAOY,GAAIka,gBAIlB,OAAOpe,OASRL,EAAGC,GAAG0a,yBAAyBjZ,UAAU+H,MAAQ,WAehD,MAdMpJ,MAAKgW,eACLhW,KAAKya,OACTza,KAAKya,MAAMqC,QAAS9c,KAAKE,QAAQ+F,SACjCjG,KAAKya,MAAM/Q,QAAQ,GACnB1J,KAAKya,MAAMta,SAASuS,KAAM,KACxBqK,OAAQ,WAAc,MAAOpd,GAAGC,GAAGod,mBAAoBpX,EAAG5F,OAAQ,KAClEid,QACA7T,UAEFpJ,KAAKqb,kBACLrb,KAAK6a,KAAKnR,QAAQ,GAClB1J,KAAKmJ,OAAOC,UAGPpJ,MAiCRL,EAAGC,GAAGye,iBAAmB,SAA+Bte,GACvD,GAAIue,EAGJve,GAAS6F,EAAE4C,QACV+V,OAAQ,KACRC,YAAa7e,EAAGC,GAAGkX,IAAK,+BACxB2H,aAAc9e,EAAGC,GAAGkX,IAAK,iCACzB4H,WAAW,EACXC,gBAAgB,EAChBC,mBAAoB,IAClB7e,GAGHJ,EAAGC,GAAGye,iBAAiBrS,OAAOvJ,KAAMzC,KAAMD,GAG1CJ,EAAGC,GAAGC,MAAM0U,YAAY9R,KAAMzC,KAAMD,GACpCJ,EAAGC,GAAGC,MAAM2U,iBAAiB/R,KAAMzC,KAAMD,GACzCJ,EAAGC,GAAGC,MAAMgf,eAAepc,KAAMzC,KAAM4F,EAAE4C,UAAYzI,GAAU+e,SAAU9e,KAAK+e,SAC9Epf,EAAGC,GAAGC,MAAM4U,aAAahS,KAAMzC,KAAMD,GAGrCC,KAAK+e,MAAQnZ,EAAG,UAChB5F,KAAK2e,eAAiB5e,EAAO4e,eAC7B3e,KAAK4e,mBAAqB7e,EAAO6e,mBACjC5e,KAAKgf,YAAchf,KAAKuY,YAALvY,UAAwBgf,cAC3Chf,KAAKif,YAAc,KACd7b,MAAMC,QAAStD,EAAOwe,QAC1Bve,KAAKue,OAASxe,EAAOwe,OAErBve,KAAKue,OAAS,KAEfve,KAAKwe,YAAcze,EAAOye,YAC1Bxe,KAAKye,aAAe1e,EAAO0e,aAC3Bze,KAAKkf,sBAAwBlf,KAAKmf,eAAeze,KAAMV,MAEvDA,KAAKof,aAAe,GAAIzf,GAAGC,GAAG+W,cAC7B0I,SAAW,uCACXpT,MAAOtM,EAAGC,GAAGkX,IAAK,iCAClBrM,SAAUzK,KAAKyK,WAAazK,KAAKgf,cAGlChf,KAAKsf,YAAc,GAAI3f,GAAGC,GAAG+W,cAC5B0I,SAAW,sCACXzI,QAAQ,EACRJ,KAAM,QACN/L,SAAUzK,KAAKyK,WAIhBzK,KAAKof,aAAaxK,QAAQrU,IACzBuV,SAAU9V,KAAK+V,WAAWrV,KAAMV,QAEjCA,KAAKsf,YAAYtc,QAAShD,MACzBgV,MAAO,iBAEHjV,EAAO2e,YACXJ,EAActe,KAAKuf,kBAAkB7e,KAAMV,MAC3CA,KAAKG,SAASI,IACbif,UAAWlB,EACXzd,SAAUyd,EACVmB,UAAWzf,KAAK0f,YAAYhf,KAAMV,MAClCiB,KAAMjB,KAAKkB,OAAOR,KAAMV,SAK1BA,KAAK2f,WACL3f,KAAKkV,OAAO7U,SAAU,gCACtBL,KAAK+e,MACH1e,SAAU,+BACVmD,OAAQxD,KAAKiV,MAAOjV,KAAKkV,OAAQlV,KAAKsf,YAAYnf,SAAUH,KAAKmV,YAE9DpV,EAAO2e,WAAa3e,EAAO4e,gBAC/B3e,KAAKof,aAAaQ,QAAS,UAC3B5f,KAAK6f,WAAaja,EAAG,SAAUvF,SAAU,oCACzCL,KAAK8f,kBAAmB9f,KAAK6f,YAC7B7f,KAAK+f,YAAcna,EAAG,SACpBvF,SAAU,qCACVE,IACAyU,MAAOhV,KAAKggB,kBAAkBtf,KAAMV,QAEpCwD,OACAxD,KAAK6f,WACL7f,KAAK+e,MACL/e,KAAKof,aAAajf,SAClByF,EAAG,UACDvF,SAAU,oCACV4f,KAAMtgB,EAAGC,GAAGkX,IAAK,0CAErB9W,KAAKG,SAASqD,OAAQxD,KAAK+f,cAE3B/f,KAAKG,SACHE,SAAU,0BACVmD,OAAQxD,KAAK+e,MAAO/e,KAAKof,aAAajf,UAEzCH,KAAKkgB,YAKNvgB,EAAGyM,aAAczM,EAAGC,GAAGye,iBAAkB1e,EAAGC,GAAGuU,QAC/CxU,EAAGgE,WAAYhE,EAAGC,GAAGye,iBAAkB1e,EAAGC,GAAGC,MAAM0U,aACnD5U,EAAGgE,WAAYhE,EAAGC,GAAGye,iBAAkB1e,EAAGC,GAAGC,MAAM2U,kBACnD7U,EAAGgE,WAAYhE,EAAGC,GAAGye,iBAAkB1e,EAAGC,GAAGC,MAAMgf,gBACnDlf,EAAGgE,WAAYhE,EAAGC,GAAGye,iBAAkB1e,EAAGC,GAAGC,MAAM4U,cAUnD9U,EAAGC,GAAGye,iBAAN1e,UAA8Bqf,YAAc,WAC3C,GAAI7V,EAKJ,OAJwD,QAAnDxJ,EAAGC,GAAGye,iBAAN1e,UAA8BwgB,mBAClChX,EAASvD,EAAG,WAAYtF,KAAM,OAAQ,QACtCX,EAAGC,GAAGye,iBAAN1e,UAA8BwgB,iBAAyCrU,SAAtB3C,EAAQ,GAAIiX,OAEvDzgB,EAAGC,GAAGye,iBAAN1e,UAA8BwgB,kBAGtCxgB,EAAGC,GAAGye,iBAAN1e,UAA8BwgB,iBAAmB,KAmBjDxgB,EAAGC,GAAGye,iBAAiBhd,UAAUuJ,SAAW,WAC3C,MAAO5K,MAAKif,aAQbtf,EAAGC,GAAGye,iBAAiBhd,UAAUgJ,SAAW,SAAWgW,GACjDrgB,KAAKif,cAAgBoB,IACzBrgB,KAAKif,YAAcoB,EACnBrgB,KAAKkgB,WACLlgB,KAAKmC,KAAM,SAAUnC,KAAKif,eAW5Btf,EAAGC,GAAGye,iBAAiBhd,UAAU+H,MAAQ,WAExC,MADApJ,MAAKof,aAAaxK,QAAS,GAAIxL,QACxBpJ,MAQRL,EAAGC,GAAGye,iBAAiBhd,UAAU6e,SAAW,WAC3C,GAAIhL,EACElV,MAAKgf,aAKVhf,KAAKG,SAASE,SAAU,oCACnBL,KAAKif,aACTjf,KAAKG,SAAS+B,YAAa,gCAC3BgT,EAAStP,MACTsP,EAASA,EAAOiC,IACfvR,EAAG,UACDvF,SAAU,mCACV4f,KAAMjgB,KAAKif,YAAYrT,OAEK,KAA1B5L,KAAKif,YAAYqB,OACrBpL,EAASA,EAAOiC,IACfvR,EAAG,UACDvF,SAAU,mCACV4f,KAAMjgB,KAAKif,YAAYqB,QAG3BtgB,KAAK2M,SAAUuI,GAEVlV,KAAK2e,iBACT3e,KAAK2H,cACL3H,KAAKugB,qBAAqBxY,KAAM,SAAWyY,GAC1CxgB,KAAK6f,WAAW7b,IAAK,mBAAoB,QAAUwc,EAAM,OACxD9f,KAAMV,OAASkI,KAAM,WACtBlI,KAAK6f,WAAWrc,OACf,GAAI7D,GAAGC,GAAG6gB,YACTjK,KAAM,aACN6I,SAAW,6CACRlf,WAEJO,KAAMV,OAAS6H,OAAQ,WACxB7H,KAAK8H,cACJpH,KAAMV,OACRA,KAAK+f,YAAYpZ,IAAK,YAGlB3G,KAAK2e,iBACT3e,KAAK+f,YAAYpZ,IAAK,SACtB3G,KAAK+f,YAAYxf,IAChByU,MAAOhV,KAAKggB,kBAAkBtf,KAAMV,QAErCA,KAAK6f,WACHa,QACA1c,IAAK,mBAAoB,KAE5BhE,KAAKG,SAASE,SAAU,gCACxBL,KAAK2M,SAAU3M,KAAKwe,gBAjDrBxe,KAAKG,SAASE,SAAU,uCACxBL,KAAKG,SAAS+B,YAAa,gCAC3BlC,KAAK2M,SAAU3M,KAAKye,gBAyDtB9e,EAAGC,GAAGye,iBAAiBhd,UAAUkf,mBAAqB,WACrD,GAAIlZ,GAAWzB,EAAE0B,WAChB+Y,EAAOrgB,KAAKif,YACZ0B,EAAS,GAAIC,WA2Bd,OAxBCP,IAC6D,KAA3D1gB,EAAGkhB,QAASR,EAAM,SAAY,IAAK5b,QAAS,WAC9C4b,EAAKS,KAAiC,KAA1B9gB,KAAK4e,mBAA4B,MAE7C+B,EAAOI,OAAS,SAAWC,GAC1B,GAAIC,GAAM/D,SAASgE,cAAe,MAClCD,GAAIE,iBAAkB,OAAQ,WAEP,IAArBF,EAAIG,cACkB,IAAtBH,EAAII,eACJJ,EAAIxQ,YAAa,EAEjBpJ,EAASc,SAETd,EAASK,QAASsZ,EAAMxf,OAAO8f,UAGjCL,EAAIM,IAAMP,EAAMxf,OAAO8f,QAExBX,EAAOa,cAAenB,IAEtBhZ,EAASc,SAGHd,EAASe,WAQjBzI,EAAGC,GAAGye,iBAAiBhd,UAAUse,SAAW,WAK3C,MAJK3f,MAAKmJ,QACTnJ,KAAKmJ,OAAOgJ,SAGPnS,KAAKgf,aAKXhf,KAAKmJ,OAASvD,EAAG,WAAYtF,KAAM,OAAQ,QAC3CN,KAAKmJ,OAAO5I,GAAI,SAAUP,KAAKkf,uBAC/Blf,KAAKmJ,OAAO5I,GAAI,QAAS,SAAWe,GAGnCA,EAAEmgB,oBAEHzhB,KAAKmJ,OAAO7I,MACXohB,SAAU,KAEN1hB,KAAKue,QACTve,KAAKmJ,OAAO7I,KAAM,SAAUN,KAAKue,OAAOoD,KAAM,WAE/C3hB,MAAKof,aAAaxK,QAAQpR,OAAQxD,KAAKmJ,cAjBtCnJ,KAAKmJ,OAAS,OA2BhBxJ,EAAGC,GAAGye,iBAAiBhd,UAAUugB,cAAgB,SAAWC,GAC3D,GAAI3d,GAAG4d,CAEP,KAAM9hB,KAAKue,SAAWsD,EACrB,OAAO,CAGR,KAAM3d,EAAI,EAAGA,EAAIlE,KAAKue,OAAOna,OAAQF,IAAM,CAE1C,GADA4d,EAAW9hB,KAAKue,OAAQra,GACnB4d,IAAaD,EACjB,OAAO,CACD,IAA+B,OAA1BC,EAASC,OAAQ,MAC5BD,EAAWA,EAASC,OAAQ,EAAGD,EAAS1d,OAAS,GAC5Cyd,EAASE,OAAQ,EAAGD,EAAS1d,UAAa0d,GAC9C,OAAO,EAKV,OAAO,GASRniB,EAAGC,GAAGye,iBAAiBhd,UAAU8d,eAAiB,SAAW7d,GAC5D,GAAI+e,GAAO1gB,EAAGkhB,QAASvf,EAAEE,OAAQ,QAAS,IAAO,IAE5C6e,KAASrgB,KAAK4hB,cAAevB,EAAKC,QACtCD,EAAO,MAGRrgB,KAAKqK,SAAUgW,GACfrgB,KAAK2f,YAQNhgB,EAAGC,GAAGye,iBAAiBhd,UAAU2gB,aAAe,WAE/C,MADAhiB,MAAKqK,SAAU,OACR,GASR1K,EAAGC,GAAGye,iBAAiBhd,UAAU0U,WAAa,SAAWzU,GACxD,OAAKtB,KAAKgf,aAAgBhf,KAAKgW,eAAgBhW,KAAKmJ,QACjD7H,EAAE2U,QAAUtW,EAAGC,GAAGwW,KAAKC,OAAS/U,EAAE2U,QAAUtW,EAAGC,GAAGwW,KAAKE,MAD1D,QAGCtW,KAAKmJ,OAAO6L,SACL,IAUTrV,EAAGC,GAAGye,iBAAiBhd,UAAU2e,kBAAoB,WACpD,MAAKhgB,MAAKgf,cAAgBhf,KAAKgW,cAAgBhW,KAAKmJ,QACnDnJ,KAAKmJ,OAAO6L,SACL,GAFR,QAYDrV,EAAGC,GAAGye,iBAAiBhd,UAAUke,kBAAoB,SAAWje,GAC/D,GAAI2gB,GACHC,GAAgB,EAChBC,EAAK7gB,EAAEK,cAAcD,YAKtB,OAHAJ,GAAEc,iBACFd,EAAEmgB,kBAEGzhB,KAAKgW,eAAiBhW,KAAKgf,aAC/Bhf,KAAKG,SAAS+B,YAAa,kCAC3BigB,EAAGvgB,WAAa,QACT,IAKRqgB,EAAatiB,EAAGkhB,QAASsB,EAAI,QAAS,IAAOxiB,EAAGkhB,QAASsB,EAAI,QAAS,GACjEF,EACCjiB,KAAK4hB,cAAeK,EAAW3B,QACnC4B,GAAgB,GAGuE,KAA7E9e,MAAM/B,UAAUoD,QAAQhC,KAAM9C,EAAGkhB,QAASsB,EAAI,aAAiB,WAI1ED,GAAgB,GAGjBliB,KAAKG,SAASuD,YAAa,iCAAkCwe,GACvDA,IACLC,EAAGvgB,WAAa,SAGV,IASRjC,EAAGC,GAAGye,iBAAiBhd,UAAUqe,YAAc,WAC9C1f,KAAKG,SAAS+B,YAAa,mCAS5BvC,EAAGC,GAAGye,iBAAiBhd,UAAUH,OAAS,SAAWI,GACpD,GAAI+e,GAAO,KACV8B,EAAK7gB,EAAEK,cAAcD,YAMtB,OAJAJ,GAAEc,iBACFd,EAAEmgB,kBACFzhB,KAAKG,SAAS+B,YAAa,kCAEtBlC,KAAKgW,eAAiBhW,KAAKgf,aACxB,GAGRqB,EAAO1gB,EAAGkhB,QAASsB,EAAI,QAAS,GAC3B9B,IAASrgB,KAAK4hB,cAAevB,EAAKC,QACtCD,EAAO,MAEHA,GACJrgB,KAAKqK,SAAUgW,IAGT,IAMR1gB,EAAGC,GAAGye,iBAAiBhd,UAAUwW,YAAc,SAAWpN,GAQzD,MAPA9K,GAAGC,GAAGye,iBAAiBrS,OAAO3K,UAAUwW,YAAYpV,KAAMzC,KAAMyK,GAC3DzK,KAAKof,cACTpf,KAAKof,aAAavH,YAAapN,GAE3BzK,KAAKsf,aACTtf,KAAKsf,YAAYzH,YAAapN,GAExBzK,MAuCRL,EAAGC,GAAGwiB,kBAAoB,SAAgCriB,GAEzDA,EAASA,MAGTJ,EAAGC,GAAGwiB,kBAAkBpW,OAAOvJ,KAAMzC,KAAMD,GAG3CC,KAAKqiB,KAAOzc,EAAG,SACf5F,KAAKsiB,SAAW,KAGhBtiB,KAAKuiB,YAAiCzW,SAApB/L,EAAOuiB,SAAyBviB,EAAOuiB,UAAW,GACpEtiB,KAAKqiB,KAAKhiB,SAAU,+BACpBL,KAAKG,SACHG,MACAkb,KAAM,cACNgH,gBAAiB,EACjBC,gBAAiB,MAEjBpiB,SAAU,2BACVmD,OAAQxD,KAAKqiB,OAKhB1iB,EAAGyM,aAAczM,EAAGC,GAAGwiB,kBAAmBziB,EAAGC,GAAGuU,QAIhDxU,EAAGC,GAAGwiB,kBAANziB,UAA+B+iB,QAAU,MASzC/iB,EAAGC,GAAGwiB,kBAAkB/gB,UAAUshB,YAAc,WAC/C,MAAO3iB,MAAKsiB,UAQb3iB,EAAGC,GAAGwiB,kBAAkB/gB,UAAUkhB,YAAc,SAAWD,GAC1DtiB,KAAKsiB,SAAWA,EAEXA,KAAa,GACjBtiB,KAAKqiB,KAAKre,IAAK,QAAShE,KAAKsiB,SAAW,KACxCtiB,KAAKG,SAASG,KAAM,gBAAiBN,KAAKsiB,YAE1CtiB,KAAKqiB,KAAKre,IAAK,QAAS,IACxBhE,KAAKG,SAASmV,WAAY,kBAE3BtV,KAAKG,SAASuD,YAAa,yCAA0C4e,IAuBtE3iB,EAAGC,GAAGgjB,aAAe,SAA2B7iB,GAE/CA,EAASA,MAGTJ,EAAGC,GAAGgjB,aAAa5W,OAAOvJ,KAAMzC,KAAMD,GAGtCC,KAAK6iB,MAAQ,GAAIljB,GAAGC,GAAG8L,iBACtB8K,KAAM,SACNgI,YAAaze,EAAOye,YACpBrX,MAAOpH,EAAOoH,QAEfnH,KAAK8iB,QAAU,GAAInjB,GAAGC,GAAGiZ,aACzB7Y,KAAK+iB,OAASnd,EAAG,SACjB5F,KAAKgjB,SAAWpd,EAAG,SAGnB5F,KAAK6iB,MAAM7f,QAAShD,MACnByJ,OAAQ,gBACRwZ,MAAO,iBAERjjB,KAAK6iB,MAAM1Z,OAAO5I,GAAI,UAAWP,KAAKkjB,eAAexiB,KAAMV,OAG3DA,KAAK+iB,OACH1iB,SAAU,4BACVmD,OAAQxD,KAAK6iB,MAAM1iB,UACrBH,KAAKgjB,SACH3iB,SAAU,8BACVmD,OAAQxD,KAAK8iB,QAAQ3iB,UACvBH,KAAKG,SACHE,SAAU,sBACVmD,OAAQxD,KAAKgjB,SAAUhjB,KAAK+iB,SAK/BpjB,EAAGyM,aAAczM,EAAGC,GAAGgjB,aAAcjjB,EAAGC,GAAGuU,QAU3CxU,EAAGC,GAAGgjB,aAAavhB,UAAU6hB,eAAiB,SAAW5hB,GACxD,GAAI6hB,GAAiBC,EACpBvgB,EAAMvB,EAAE2U,QAAUtW,EAAGC,GAAGwW,KAAKiN,KAAO,EAAM/hB,EAAE2U,QAAUtW,EAAGC,GAAGwW,KAAKkN,GAAK,GAAK,CAEvEzgB,KACJsgB,EAAkBnjB,KAAK8iB,QAAQS,qBACzBJ,IACLA,EAAkBnjB,KAAK8iB,QAAQ7X,mBAEhCmY,EAAWpjB,KAAK8iB,QAAQU,0BAA2BL,EAAiBtgB,GACpE7C,KAAK8iB,QAAQ5X,cAAekY,GAC5BA,EAAS5S,0BAYX7Q,EAAGC,GAAGgjB,aAAavhB,UAAUoiB,cAAgB,WAE5CzjB,KAAK8iB,QAAQ3Y,cAWdxK,EAAGC,GAAGgjB,aAAavhB,UAAUqiB,aAAe,WAC3C,GAAIP,GAAkBnjB,KAAK8iB,QAAQS,oBAC9BJ,IACJnjB,KAAK8iB,QAAQa,WAAYR,IAS3BxjB,EAAGC,GAAGgjB,aAAavhB,UAAUuiB,SAAW,WACvC,MAAO5jB,MAAK6iB,OAQbljB,EAAGC,GAAGgjB,aAAavhB,UAAUwiB,WAAa,WACzC,MAAO7jB,MAAK8iB,SAgCbnjB,EAAGC,GAAGkkB,kBAAoB,SAAgC/jB,GAEzDA,EAAS6F,EAAE4C,QACVub,WAAW,EACXrL,MAAMsL,EAAAA,GACNvL,IAAKuL,EAAAA,EACLC,KAAM,EACNC,SAAU,MACRnkB,GAGHJ,EAAGC,GAAGkkB,kBAAkB9X,OAAOvJ,KAAMzC,KAAMD,GAG3CC,KAAK6I,MAAQ,GAAIlJ,GAAGC,GAAG8L,gBAAiB9F,EAAE4C,QAExCiC,SAAUzK,KAAKgW,cAEhBjW,EAAO8I,QAER7I,KAAKmkB,YAAc,GAAIxkB,GAAGC,GAAG+W,aAAc/Q,EAAE4C,QAE3CiC,SAAUzK,KAAKgW,aACf+C,SAAU,IAEXhZ,EAAOokB,aAEN9E,SAAW,uCACXpT,MAAO,OAGTjM,KAAKokB,WAAa,GAAIzkB,GAAGC,GAAG+W,aAAc/Q,EAAE4C,QAE1CiC,SAAUzK,KAAKgW,aACf+C,SAAU,IAEXhZ,EAAOqkB,YAEN/E,SAAW,sCACXpT,MAAO,OAKTjM,KAAK6I,MAAM7F,QAAShD,MACnByJ,OAAQzJ,KAAKmC,KAAKzB,KAAMV,KAAM,UAC9BijB,MAAOjjB,KAAKmC,KAAKzB,KAAMV,KAAM,WAE9BA,KAAK6I,MAAMM,OAAO5I,IACjBoZ,QAAS3Z,KAAK4Z,UAAUlZ,KAAMV,MAC9BqkB,kCAAmCrkB,KAAKskB,QAAQ5jB,KAAMV,QAEvDA,KAAKokB,WAAWphB,QAAShD,MACxBgV,OAAS,gBAAiB,KAE3BhV,KAAKmkB,YAAYnhB,QAAShD,MACzBgV,OAAS,gBAAiB,MAI3BhV,KAAKukB,eAAgBxkB,EAAOgkB,WAC5B/jB,KAAKwkB,SAAUzkB,EAAO2Y,IAAK3Y,EAAO0Y,KAClCzY,KAAKykB,QAAS1kB,EAAOkkB,KAAMlkB,EAAOmkB,UAElClkB,KAAK0kB,OAAS9e,EAAG,SAAUvF,SAAU,iCACnCmD,OACAxD,KAAKmkB,YAAYhkB,SACjBH,KAAK6I,MAAM1I,SACXH,KAAKokB,WAAWjkB,UAElBH,KAAKG,SAASE,SAAU,2BAA4BmD,OAAQxD,KAAK0kB,QACjE1kB,KAAK6I,MAAM8b,cAAe3kB,KAAK4kB,eAAelkB,KAAMV,QAKrDL,EAAGyM,aAAczM,EAAGC,GAAGkkB,kBAAmBnkB,EAAGC,GAAGuU,QAuBhDxU,EAAGC,GAAGkkB,kBAAkBziB,UAAUkjB,aAAe,SAAWM,GAC3D7kB,KAAK+jB,YAAcc,EACnB7kB,KAAK6I,MAAMic,mBAQZnlB,EAAGC,GAAGkkB,kBAAkBziB,UAAU0jB,aAAe,WAChD,MAAO/kB,MAAK+jB,WASbpkB,EAAGC,GAAGkkB,kBAAkBziB,UAAUmjB,SAAW,SAAW9L,EAAKD,GAC5D,GAAKC,EAAMD,EACV,KAAM,IAAIuM,OAAO,YAActM,EAAM,uCAAyCD,EAAM,IAErFzY,MAAK0Y,IAAMA,EACX1Y,KAAKyY,IAAMA,EACXzY,KAAK6I,MAAMic,mBAQZnlB,EAAGC,GAAGkkB,kBAAkBziB,UAAU4jB,SAAW,WAC5C,OAASjlB,KAAK0Y,IAAK1Y,KAAKyY,MASzB9Y,EAAGC,GAAGkkB,kBAAkBziB,UAAUojB,QAAU,SAAWR,EAAMC,GAC5D,GAAa,GAARD,EACJ,KAAM,IAAIe,OAAO,8BAElB,IAAkB,OAAbd,EACJA,EAAkB,GAAPD,MACL,IAAiB,GAAZC,EACX,KAAM,IAAIc,OAAO,mCAElBhlB,MAAKikB,KAAOA,EACZjkB,KAAKkkB,SAAWA,GAQjBvkB,EAAGC,GAAGkkB,kBAAkBziB,UAAU6jB,QAAU,WAC3C,OAASllB,KAAKikB,KAAMjkB,KAAKkkB,WAQ1BvkB,EAAGC,GAAGkkB,kBAAkBziB,UAAUuJ,SAAW,WAC5C,MAAO5K,MAAK6I,MAAM+B,YAQnBjL,EAAGC,GAAGkkB,kBAAkBziB,UAAU8jB,gBAAkB,WACnD,OAAQnlB,KAAK6I,MAAM+B,YAQpBjL,EAAGC,GAAGkkB,kBAAkBziB,UAAUgJ,SAAW,SAAWlD,GACvDnH,KAAK6I,MAAMwB,SAAUlD,IAQtBxH,EAAGC,GAAGkkB,kBAAkBziB,UAAU+jB,YAAc,SAAWC,GAC1D,GAAIC,GAAGC,EAAIvlB,KAAKmlB,iBAGhB,IADAE,GAASA,EACJG,MAAOH,KAAYI,SAAUJ,GACjC,KAAM,IAAIL,OAAO,gCAGbQ,OAAOD,GACXD,EAAI,GAEJA,EAAIC,EAAIF,EACRC,EAAI9M,KAAKC,IAAKD,KAAKE,IAAK4M,EAAGtlB,KAAKyY,KAAOzY,KAAK0Y,KACvC1Y,KAAK+jB,YACTuB,EAAI9M,KAAKkN,MAAOJ,KAIbA,IAAMC,GACVvlB,KAAKqK,SAAUib,IAWjB3lB,EAAGC,GAAGkkB,kBAAkBziB,UAAUujB,eAAiB,SAAWzd,GAC7D,GAAIme,IAAKne,CACT,OAAKqe,OAAOF,KAAQG,SAAUH,IACtB,EAIHtlB,KAAK+jB,YAAmB,EAAJuB,KAAYA,GAC7B,EAIHA,EAAItlB,KAAK0Y,KAAO4M,EAAItlB,KAAKyY,KACtB,GAGD,GASR9Y,EAAGC,GAAGkkB,kBAAkBziB,UAAUskB,cAAgB,SAAW9iB,GAC5D7C,KAAKolB,YAAaviB,EAAM7C,KAAKikB,OAS9BtkB,EAAGC,GAAGkkB,kBAAkBziB,UAAUijB,QAAU,SAAWtD,GACtD,GAAIqE,GAAQ,CA8BZ,OA3BuCvZ,UAAlCkV,EAAMrf,cAAcikB,YACxB5lB,KAAK6lB,eAAgB,GAEjB7E,EAAMrf,cAAcmkB,OACxBT,GAASrE,EAAMrf,cAAcmkB,OAClB9E,EAAMrf,cAAcokB,SAC/BV,EAAQrE,EAAMrf,cAAcokB,QAIvB/lB,KAAK6lB,gBACL7E,EAAMrf,cAAcqkB,YACxBX,GAASrE,EAAMrf,cAAcqkB,YAClBhF,EAAMrf,cAAcskB,YAC/BZ,EAAQrE,EAAMrf,cAAcskB,YACjBjF,EAAMrf,cAAcukB,WAC/Bb,EAAQrE,EAAMrf,cAAcukB,WACjBlF,EAAMrf,cAAcwkB,SAC/Bd,GAASrE,EAAMrf,cAAcwkB,SAI1Bd,IACJA,EAAgB,EAARA,EAAY,GAAK,EACzBrlB,KAAKolB,YAAaC,EAAQrlB,KAAKikB,QAGzB,GASRtkB,EAAGC,GAAGkkB,kBAAkBziB,UAAUuY,UAAY,SAAWtY,GACxD,IAAMtB,KAAKgW,aACV,OAAS1U,EAAE2U,OACV,IAAKtW,GAAGC,GAAGwW,KAAKkN,GAEf,MADAtjB,MAAKolB,YAAaplB,KAAKikB,OAChB,CACR,KAAKtkB,GAAGC,GAAGwW,KAAKiN,KAEf,MADArjB,MAAKolB,aAAcplB,KAAKikB,OACjB,CACR,KAAKtkB,GAAGC,GAAGwW,KAAKgQ,OAEf,MADApmB,MAAKolB,YAAaplB,KAAKkkB,WAChB,CACR,KAAKvkB,GAAGC,GAAGwW,KAAKiQ,SAEf,MADArmB,MAAKolB,aAAcplB,KAAKkkB,WACjB,IAQXvkB,EAAGC,GAAGkkB,kBAAkBziB,UAAUwW,YAAc,SAAWpN,GAc1D,MAZA9K,GAAGC,GAAGkkB,kBAAkB9X,OAAO3K,UAAUwW,YAAYpV,KAAMzC,KAAMyK,GAE5DzK,KAAK6I,OACT7I,KAAK6I,MAAMgP,YAAa7X,KAAKgW,cAEzBhW,KAAKmkB,aACTnkB,KAAKmkB,YAAYtM,YAAa7X,KAAKgW,cAE/BhW,KAAKokB,YACTpkB,KAAKokB,WAAWvM,YAAa7X,KAAKgW,cAG5BhW,OAGLL","file":"oojs-ui-widgets.min.js","sourcesContent":["/*!\n * OOjs UI v0.16.1\n * https://www.mediawiki.org/wiki/OOjs_UI\n *\n * Copyright 2011–2016 OOjs UI Team and other contributors.\n * Released under the MIT license\n * http://oojs.mit-license.org\n *\n * Date: 2016-03-01T21:50:12Z\n */\n( function ( OO ) {\n\n'use strict';\n\n/**\n * DraggableElement is a mixin class used to create elements that can be clicked\n * and dragged by a mouse to a new position within a group. This class must be used\n * in conjunction with OO.ui.mixin.DraggableGroupElement, which provides a container for\n * the draggable elements.\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$handle] The part of the element which can be used for dragging, defaults to the whole element\n */\nOO.ui.mixin.DraggableElement = function OoUiMixinDraggableElement( config ) {\n\tconfig = config || {};\n\n\t// Properties\n\tthis.index = null;\n\tthis.$handle = config.$handle || this.$element;\n\tthis.wasHandleUsed = null;\n\n\t// Initialize and events\n\tthis.$element.addClass( 'oo-ui-draggableElement' )\n\t\t// We make the entire element draggable, not just the handle, so that\n\t\t// the whole element appears to move. wasHandleUsed prevents drags from\n\t\t// starting outside the handle\n\t\t.attr( 'draggable', true )\n\t\t.on( {\n\t\t\tmousedown: this.onDragMouseDown.bind( this ),\n\t\t\tdragstart: this.onDragStart.bind( this ),\n\t\t\tdragover: this.onDragOver.bind( this ),\n\t\t\tdragend: this.onDragEnd.bind( this ),\n\t\t\tdrop: this.onDrop.bind( this )\n\t\t} );\n\tthis.$handle.addClass( 'oo-ui-draggableElement-handle' );\n};\n\nOO.initClass( OO.ui.mixin.DraggableElement );\n\n/* Events */\n\n/**\n * @event dragstart\n *\n * A dragstart event is emitted when the user clicks and begins dragging an item.\n * @param {OO.ui.mixin.DraggableElement} item The item the user has clicked and is dragging with the mouse.\n */\n\n/**\n * @event dragend\n * A dragend event is emitted when the user drags an item and releases the mouse,\n * thus terminating the drag operation.\n */\n\n/**\n * @event drop\n * A drop event is emitted when the user drags an item and then releases the mouse button\n * over a valid target.\n */\n\n/* Static Properties */\n\n/**\n * @inheritdoc OO.ui.mixin.ButtonElement\n */\nOO.ui.mixin.DraggableElement.static.cancelButtonMouseDownEvents = false;\n\n/* Methods */\n\n/**\n * Respond to mousedown event.\n *\n * @private\n * @param {jQuery.Event} e jQuery event\n */\nOO.ui.mixin.DraggableElement.prototype.onDragMouseDown = function ( e ) {\n\tthis.wasHandleUsed =\n\t\t// Optimization: if the handle is the whole element this is always true\n\t\tthis.$handle[ 0 ] === this.$element[ 0 ] ||\n\t\t// Check the mousedown occurred inside the handle\n\t\tOO.ui.contains( this.$handle[ 0 ], e.target, true );\n};\n\n/**\n * Respond to dragstart event.\n *\n * @private\n * @param {jQuery.Event} e jQuery event\n * @fires dragstart\n */\nOO.ui.mixin.DraggableElement.prototype.onDragStart = function ( e ) {\n\tvar element = this,\n\t\tdataTransfer = e.originalEvent.dataTransfer;\n\n\tif ( !this.wasHandleUsed ) {\n\t\treturn false;\n\t}\n\n\t// Define drop effect\n\tdataTransfer.dropEffect = 'none';\n\tdataTransfer.effectAllowed = 'move';\n\t// Support: Firefox\n\t// We must set up a dataTransfer data property or Firefox seems to\n\t// ignore the fact the element is draggable.\n\ttry {\n\t\tdataTransfer.setData( 'application-x/OOjs-UI-draggable', this.getIndex() );\n\t} catch ( err ) {\n\t\t// The above is only for Firefox. Move on if it fails.\n\t}\n\t// Briefly add a 'clone' class to style the browser's native drag image\n\tthis.$element.addClass( 'oo-ui-draggableElement-clone' );\n\t// Add placeholder class after the browser has rendered the clone\n\tsetTimeout( function () {\n\t\telement.$element\n\t\t\t.removeClass( 'oo-ui-draggableElement-clone' )\n\t\t\t.addClass( 'oo-ui-draggableElement-placeholder' );\n\t} );\n\t// Emit event\n\tthis.emit( 'dragstart', this );\n\treturn true;\n};\n\n/**\n * Respond to dragend event.\n *\n * @private\n * @fires dragend\n */\nOO.ui.mixin.DraggableElement.prototype.onDragEnd = function () {\n\tthis.$element.removeClass( 'oo-ui-draggableElement-placeholder' );\n\tthis.emit( 'dragend' );\n};\n\n/**\n * Handle drop event.\n *\n * @private\n * @param {jQuery.Event} e jQuery event\n * @fires drop\n */\nOO.ui.mixin.DraggableElement.prototype.onDrop = function ( e ) {\n\te.preventDefault();\n\tthis.emit( 'drop', e );\n};\n\n/**\n * In order for drag/drop to work, the dragover event must\n * return false and stop propogation.\n *\n * @private\n */\nOO.ui.mixin.DraggableElement.prototype.onDragOver = function ( e ) {\n\te.preventDefault();\n};\n\n/**\n * Set item index.\n * Store it in the DOM so we can access from the widget drag event\n *\n * @private\n * @param {number} index Item index\n */\nOO.ui.mixin.DraggableElement.prototype.setIndex = function ( index ) {\n\tif ( this.index !== index ) {\n\t\tthis.index = index;\n\t\tthis.$element.data( 'index', index );\n\t}\n};\n\n/**\n * Get item index\n *\n * @private\n * @return {number} Item index\n */\nOO.ui.mixin.DraggableElement.prototype.getIndex = function () {\n\treturn this.index;\n};\n\n/**\n * DraggableGroupElement is a mixin class used to create a group element to\n * contain draggable elements, which are items that can be clicked and dragged by a mouse.\n * The class is used with OO.ui.mixin.DraggableElement.\n *\n * @abstract\n * @class\n * @mixins OO.ui.mixin.GroupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string} [orientation] Item orientation: 'horizontal' or 'vertical'. The orientation\n * should match the layout of the items. Items displayed in a single row\n * or in several rows should use horizontal orientation. The vertical orientation should only be\n * used when the items are displayed in a single column. Defaults to 'vertical'\n */\nOO.ui.mixin.DraggableGroupElement = function OoUiMixinDraggableGroupElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.mixin.GroupElement.call( this, config );\n\n\t// Properties\n\tthis.orientation = config.orientation || 'vertical';\n\tthis.dragItem = null;\n\tthis.itemKeys = {};\n\tthis.dir = null;\n\tthis.itemsOrder = null;\n\n\t// Events\n\tthis.aggregate( {\n\t\tdragstart: 'itemDragStart',\n\t\tdragend: 'itemDragEnd',\n\t\tdrop: 'itemDrop'\n\t} );\n\tthis.connect( this, {\n\t\titemDragStart: 'onItemDragStart',\n\t\titemDrop: 'onItemDropOrDragEnd',\n\t\titemDragEnd: 'onItemDropOrDragEnd'\n\t} );\n\n\t// Initialize\n\tif ( Array.isArray( config.items ) ) {\n\t\tthis.addItems( config.items );\n\t}\n\tthis.$element\n\t\t.addClass( 'oo-ui-draggableGroupElement' )\n\t\t.append( this.$status )\n\t\t.toggleClass( 'oo-ui-draggableGroupElement-horizontal', this.orientation === 'horizontal' );\n};\n\n/* Setup */\nOO.mixinClass( OO.ui.mixin.DraggableGroupElement, OO.ui.mixin.GroupElement );\n\n/* Events */\n\n/**\n * An item has been dragged to a new position, but not yet dropped.\n *\n * @event drag\n * @param {OO.ui.mixin.DraggableElement} item Dragged item\n * @param {number} [newIndex] New index for the item\n */\n\n/**\n * And item has been dropped at a new position.\n *\n * @event reorder\n * @param {OO.ui.mixin.DraggableElement} item Reordered item\n * @param {number} [newIndex] New index for the item\n */\n\n/* Methods */\n\n/**\n * Respond to item drag start event\n *\n * @private\n * @param {OO.ui.mixin.DraggableElement} item Dragged item\n */\nOO.ui.mixin.DraggableGroupElement.prototype.onItemDragStart = function ( item ) {\n\t// Make a shallow copy of this.items so we can re-order it during previews\n\t// without affecting the original array.\n\tthis.itemsOrder = this.items.slice();\n\tthis.updateIndexes();\n\tif ( this.orientation === 'horizontal' ) {\n\t\t// Calculate and cache directionality on drag start - it's a little\n\t\t// expensive and it shouldn't change while dragging.\n\t\tthis.dir = this.$element.css( 'direction' );\n\t}\n\tthis.setDragItem( item );\n};\n\n/**\n * Update the index properties of the items\n */\nOO.ui.mixin.DraggableGroupElement.prototype.updateIndexes = function () {\n\tvar i, len;\n\n\t// Map the index of each object\n\tfor ( i = 0, len = this.itemsOrder.length; i < len; i++ ) {\n\t\tthis.itemsOrder[ i ].setIndex( i );\n\t}\n};\n\n/**\n * Handle drop or dragend event and switch the order of the items accordingly\n *\n * @private\n * @param {OO.ui.mixin.DraggableElement} item Dropped item\n */\nOO.ui.mixin.DraggableGroupElement.prototype.onItemDropOrDragEnd = function () {\n\tvar targetIndex, originalIndex,\n\t\titem = this.getDragItem();\n\n\t// TODO: Figure out a way to configure a list of legally droppable\n\t// elements even if they are not yet in the list\n\tif ( item ) {\n\t\toriginalIndex = this.items.indexOf( item );\n\t\t// If the item has moved forward, add one to the index to account for the left shift\n\t\ttargetIndex = item.getIndex() + ( item.getIndex() > originalIndex ? 1 : 0 );\n\t\tif ( targetIndex !== originalIndex ) {\n\t\t\tthis.reorder( this.getDragItem(), targetIndex );\n\t\t\tthis.emit( 'reorder', this.getDragItem(), targetIndex );\n\t\t}\n\t\tthis.updateIndexes();\n\t}\n\tthis.unsetDragItem();\n\t// Return false to prevent propogation\n\treturn false;\n};\n\n/**\n * Respond to dragover event\n *\n * @private\n * @param {jQuery.Event} e Dragover event\n * @fires reorder\n */\nOO.ui.mixin.DraggableGroupElement.prototype.onDragOver = function ( e ) {\n\tvar dragOverObj, $optionWidget, itemOffset, itemMidpoint, itemBoundingRect,\n\t\titemSize, cssOutput, dragPosition, overIndex, itemPosition, after,\n\t\ttargetIndex = null,\n\t\titem = this.getDragItem(),\n\t\tdragItemIndex = item.getIndex(),\n\t\tclientX = e.originalEvent.clientX,\n\t\tclientY = e.originalEvent.clientY;\n\n\t// Get the OptionWidget item we are dragging over\n\tdragOverObj = this.getElementDocument().elementFromPoint( clientX, clientY );\n\t$optionWidget = $( dragOverObj ).closest( '.oo-ui-draggableElement' );\n\tif ( $optionWidget[ 0 ] ) {\n\t\titemOffset = $optionWidget.offset();\n\t\titemBoundingRect = $optionWidget[ 0 ].getBoundingClientRect();\n\t\titemPosition = $optionWidget.position();\n\t\toverIndex = $optionWidget.data( 'index' );\n\t}\n\n\tif (\n\t\titemOffset &&\n\t\toverIndex !== dragItemIndex\n\t) {\n\t\tif ( this.orientation === 'horizontal' ) {\n\t\t\t// Calculate where the mouse is relative to the item width\n\t\t\titemSize = itemBoundingRect.width;\n\t\t\titemMidpoint = itemBoundingRect.left + itemSize / 2;\n\t\t\tdragPosition = clientX;\n\t\t\t// Which side of the item we hover over will dictate\n\t\t\t// where to drop the selected item, on the left or\n\t\t\t// on the right\n\t\t\tcssOutput = {\n\t\t\t\tleft: dragPosition < itemMidpoint ? itemPosition.left : itemPosition.left + itemSize,\n\t\t\t\ttop: itemPosition.top\n\t\t\t};\n\t\t} else {\n\t\t\t// Calculate where the mouse is relative to the item height\n\t\t\titemSize = itemBoundingRect.height;\n\t\t\titemMidpoint = itemBoundingRect.top + itemSize / 2;\n\t\t\tdragPosition = clientY;\n\t\t\t// Which side of the item we hover over will dictate\n\t\t\t// where to drop the selected item, on the top or\n\t\t\t// on the bottom\n\t\t\tcssOutput = {\n\t\t\t\ttop: dragPosition < itemMidpoint ? itemPosition.top : itemPosition.top + itemSize,\n\t\t\t\tleft: itemPosition.left\n\t\t\t};\n\t\t}\n\t\t// Store whether we are before or after an item to rearrange\n\t\t// For horizontal layout, we need to account for RTL, as this is flipped\n\t\tif ( this.orientation === 'horizontal' && this.dir === 'rtl' ) {\n\t\t\tafter = dragPosition < itemMidpoint;\n\t\t} else {\n\t\t\tafter = dragPosition > itemMidpoint;\n\t\t}\n\t\ttargetIndex = overIndex + ( after ? 1 : 0 );\n\t\t// Check the targetIndex isn't immediately to the left or right of the current item (a no-op)\n\t\tif ( targetIndex === dragItemIndex || targetIndex === dragItemIndex + 1 ) {\n\t\t\ttargetIndex = null;\n\t\t}\n\t}\n\tif ( targetIndex !== null ) {\n\t\tif ( targetIndex > 0 ) {\n\t\t\tthis.$group.children().eq( targetIndex - 1 ).after( item.$element );\n\t\t} else {\n\t\t\tthis.$group.prepend( item.$element );\n\t\t}\n\t\t// Move item in itemsOrder array. Needs to account for left shift if the item is moved forward.\n\t\tthis.itemsOrder.splice( targetIndex - ( targetIndex > dragItemIndex ? 1 : 0 ), 0,\n\t\t\tthis.itemsOrder.splice( dragItemIndex, 1 )[ 0 ]\n\t\t);\n\t\tthis.updateIndexes();\n\t\tthis.emit( 'drag', item, targetIndex );\n\t}\n\t// Prevent default\n\te.preventDefault();\n};\n\n/**\n * Reorder the items in the group\n *\n * @param {OO.ui.mixin.DraggableElement} item Reordered item\n * @param {number} newIndex New index\n */\nOO.ui.mixin.DraggableGroupElement.prototype.reorder = function ( item, newIndex ) {\n\tthis.addItems( [ item ], newIndex );\n};\n\n/**\n * Set a dragged item\n *\n * @param {OO.ui.mixin.DraggableElement} item Dragged item\n */\nOO.ui.mixin.DraggableGroupElement.prototype.setDragItem = function ( item ) {\n\tthis.dragItem = item;\n\tthis.$element.on( 'dragover', this.onDragOver.bind( this ) );\n\tthis.$element.addClass( 'oo-ui-draggableGroupElement-dragging' );\n};\n\n/**\n * Unset the current dragged item\n */\nOO.ui.mixin.DraggableGroupElement.prototype.unsetDragItem = function () {\n\tthis.dragItem = null;\n\tthis.$element.off( 'dragover' );\n\tthis.$element.removeClass( 'oo-ui-draggableGroupElement-dragging' );\n};\n\n/**\n * Get the item that is currently being dragged.\n *\n * @return {OO.ui.mixin.DraggableElement|null} The currently dragged item, or `null` if no item is being dragged\n */\nOO.ui.mixin.DraggableGroupElement.prototype.getDragItem = function () {\n\treturn this.dragItem;\n};\n\n/**\n * RequestManager is a mixin that manages the lifecycle of a promise-backed request for a widget, such as\n * the {@link OO.ui.mixin.LookupElement}.\n *\n * @class\n * @abstract\n *\n * @constructor\n */\nOO.ui.mixin.RequestManager = function OoUiMixinRequestManager() {\n\tthis.requestCache = {};\n\tthis.requestQuery = null;\n\tthis.requestRequest = null;\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.mixin.RequestManager );\n\n/**\n * Get request results for the current query.\n *\n * @return {jQuery.Promise} Promise object which will be passed response data as the first argument of\n * the done event. If the request was aborted to make way for a subsequent request, this promise\n * may not be rejected, depending on what jQuery feels like doing.\n */\nOO.ui.mixin.RequestManager.prototype.getRequestData = function () {\n\tvar widget = this,\n\t\tvalue = this.getRequestQuery(),\n\t\tdeferred = $.Deferred(),\n\t\tourRequest;\n\n\tthis.abortRequest();\n\tif ( Object.prototype.hasOwnProperty.call( this.requestCache, value ) ) {\n\t\tdeferred.resolve( this.requestCache[ value ] );\n\t} else {\n\t\tif ( this.pushPending ) {\n\t\t\tthis.pushPending();\n\t\t}\n\t\tthis.requestQuery = value;\n\t\tourRequest = this.requestRequest = this.getRequest();\n\t\tourRequest\n\t\t\t.always( function () {\n\t\t\t\t// We need to pop pending even if this is an old request, otherwise\n\t\t\t\t// the widget will remain pending forever.\n\t\t\t\t// TODO: this assumes that an aborted request will fail or succeed soon after\n\t\t\t\t// being aborted, or at least eventually. It would be nice if we could popPending()\n\t\t\t\t// at abort time, but only if we knew that we hadn't already called popPending()\n\t\t\t\t// for that request.\n\t\t\t\tif ( widget.popPending ) {\n\t\t\t\t\twidget.popPending();\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.done( function ( response ) {\n\t\t\t\t// If this is an old request (and aborting it somehow caused it to still succeed),\n\t\t\t\t// ignore its success completely\n\t\t\t\tif ( ourRequest === widget.requestRequest ) {\n\t\t\t\t\twidget.requestQuery = null;\n\t\t\t\t\twidget.requestRequest = null;\n\t\t\t\t\twidget.requestCache[ value ] = widget.getRequestCacheDataFromResponse( response );\n\t\t\t\t\tdeferred.resolve( widget.requestCache[ value ] );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.fail( function () {\n\t\t\t\t// If this is an old request (or a request failing because it's being aborted),\n\t\t\t\t// ignore its failure completely\n\t\t\t\tif ( ourRequest === widget.requestRequest ) {\n\t\t\t\t\twidget.requestQuery = null;\n\t\t\t\t\twidget.requestRequest = null;\n\t\t\t\t\tdeferred.reject();\n\t\t\t\t}\n\t\t\t} );\n\t}\n\treturn deferred.promise();\n};\n\n/**\n * Abort the currently pending request, if any.\n *\n * @private\n */\nOO.ui.mixin.RequestManager.prototype.abortRequest = function () {\n\tvar oldRequest = this.requestRequest;\n\tif ( oldRequest ) {\n\t\t// First unset this.requestRequest to the fail handler will notice\n\t\t// that the request is no longer current\n\t\tthis.requestRequest = null;\n\t\tthis.requestQuery = null;\n\t\toldRequest.abort();\n\t}\n};\n\n/**\n * Get the query to be made.\n *\n * @protected\n * @method\n * @abstract\n * @return {string} query to be used\n */\nOO.ui.mixin.RequestManager.prototype.getRequestQuery = null;\n\n/**\n * Get a new request object of the current query value.\n *\n * @protected\n * @method\n * @abstract\n * @return {jQuery.Promise} jQuery AJAX object, or promise object with an .abort() method\n */\nOO.ui.mixin.RequestManager.prototype.getRequest = null;\n\n/**\n * Pre-process data returned by the request from #getRequest.\n *\n * The return value of this function will be cached, and any further queries for the given value\n * will use the cache rather than doing API requests.\n *\n * @protected\n * @method\n * @abstract\n * @param {Mixed} response Response from server\n * @return {Mixed} Cached result data\n */\nOO.ui.mixin.RequestManager.prototype.getRequestCacheDataFromResponse = null;\n\n/**\n * LookupElement is a mixin that creates a {@link OO.ui.FloatingMenuSelectWidget menu} of suggested values for\n * a {@link OO.ui.TextInputWidget text input widget}. Suggested values are based on the characters the user types\n * into the text input field and, in general, the menu is only displayed when the user types. If a suggested value is chosen\n * from the lookup menu, that value becomes the value of the input field.\n *\n * Note that a new menu of suggested items is displayed when a value is chosen from the lookup menu. If this is\n * not the desired behavior, disable lookup menus with the #setLookupsDisabled method, then set the value, then\n * re-enable lookups.\n *\n * See the [OOjs UI demos][1] for an example.\n *\n * [1]: https://tools.wmflabs.org/oojs-ui/oojs-ui/demos/index.html#widgets-apex-vector-ltr\n *\n * @class\n * @abstract\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$overlay] Overlay for the lookup menu; defaults to relative positioning\n * @cfg {jQuery} [$container=this.$element] The container element. The lookup menu is rendered beneath the specified element.\n * @cfg {boolean} [allowSuggestionsWhenEmpty=false] Request and display a lookup menu when the text input is empty.\n * By default, the lookup menu is not generated and displayed until the user begins to type.\n * @cfg {boolean} [highlightFirst=true] Whether the first lookup result should be highlighted (so, that the user can\n * take it over into the input with simply pressing return) automatically or not.\n */\nOO.ui.mixin.LookupElement = function OoUiMixinLookupElement( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( { highlightFirst: true }, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.RequestManager.call( this, config );\n\n\t// Properties\n\tthis.$overlay = config.$overlay || this.$element;\n\tthis.lookupMenu = new OO.ui.FloatingMenuSelectWidget( {\n\t\twidget: this,\n\t\tinput: this,\n\t\t$container: config.$container || this.$element\n\t} );\n\n\tthis.allowSuggestionsWhenEmpty = config.allowSuggestionsWhenEmpty || false;\n\n\tthis.lookupsDisabled = false;\n\tthis.lookupInputFocused = false;\n\tthis.lookupHighlightFirstItem = config.highlightFirst;\n\n\t// Events\n\tthis.$input.on( {\n\t\tfocus: this.onLookupInputFocus.bind( this ),\n\t\tblur: this.onLookupInputBlur.bind( this ),\n\t\tmousedown: this.onLookupInputMouseDown.bind( this )\n\t} );\n\tthis.connect( this, { change: 'onLookupInputChange' } );\n\tthis.lookupMenu.connect( this, {\n\t\ttoggle: 'onLookupMenuToggle',\n\t\tchoose: 'onLookupMenuItemChoose'\n\t} );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-lookupElement' );\n\tthis.lookupMenu.$element.addClass( 'oo-ui-lookupElement-menu' );\n\tthis.$overlay.append( this.lookupMenu.$element );\n};\n\n/* Setup */\n\nOO.mixinClass( OO.ui.mixin.LookupElement, OO.ui.mixin.RequestManager );\n\n/* Methods */\n\n/**\n * Handle input focus event.\n *\n * @protected\n * @param {jQuery.Event} e Input focus event\n */\nOO.ui.mixin.LookupElement.prototype.onLookupInputFocus = function () {\n\tthis.lookupInputFocused = true;\n\tthis.populateLookupMenu();\n};\n\n/**\n * Handle input blur event.\n *\n * @protected\n * @param {jQuery.Event} e Input blur event\n */\nOO.ui.mixin.LookupElement.prototype.onLookupInputBlur = function () {\n\tthis.closeLookupMenu();\n\tthis.lookupInputFocused = false;\n};\n\n/**\n * Handle input mouse down event.\n *\n * @protected\n * @param {jQuery.Event} e Input mouse down event\n */\nOO.ui.mixin.LookupElement.prototype.onLookupInputMouseDown = function () {\n\t// Only open the menu if the input was already focused.\n\t// This way we allow the user to open the menu again after closing it with Esc\n\t// by clicking in the input. Opening (and populating) the menu when initially\n\t// clicking into the input is handled by the focus handler.\n\tif ( this.lookupInputFocused && !this.lookupMenu.isVisible() ) {\n\t\tthis.populateLookupMenu();\n\t}\n};\n\n/**\n * Handle input change event.\n *\n * @protected\n * @param {string} value New input value\n */\nOO.ui.mixin.LookupElement.prototype.onLookupInputChange = function () {\n\tif ( this.lookupInputFocused ) {\n\t\tthis.populateLookupMenu();\n\t}\n};\n\n/**\n * Handle the lookup menu being shown/hidden.\n *\n * @protected\n * @param {boolean} visible Whether the lookup menu is now visible.\n */\nOO.ui.mixin.LookupElement.prototype.onLookupMenuToggle = function ( visible ) {\n\tif ( !visible ) {\n\t\t// When the menu is hidden, abort any active request and clear the menu.\n\t\t// This has to be done here in addition to closeLookupMenu(), because\n\t\t// MenuSelectWidget will close itself when the user presses Esc.\n\t\tthis.abortLookupRequest();\n\t\tthis.lookupMenu.clearItems();\n\t}\n};\n\n/**\n * Handle menu item 'choose' event, updating the text input value to the value of the clicked item.\n *\n * @protected\n * @param {OO.ui.MenuOptionWidget} item Selected item\n */\nOO.ui.mixin.LookupElement.prototype.onLookupMenuItemChoose = function ( item ) {\n\tthis.setValue( item.getData() );\n};\n\n/**\n * Get lookup menu.\n *\n * @private\n * @return {OO.ui.FloatingMenuSelectWidget}\n */\nOO.ui.mixin.LookupElement.prototype.getLookupMenu = function () {\n\treturn this.lookupMenu;\n};\n\n/**\n * Disable or re-enable lookups.\n *\n * When lookups are disabled, calls to #populateLookupMenu will be ignored.\n *\n * @param {boolean} disabled Disable lookups\n */\nOO.ui.mixin.LookupElement.prototype.setLookupsDisabled = function ( disabled ) {\n\tthis.lookupsDisabled = !!disabled;\n};\n\n/**\n * Open the menu. If there are no entries in the menu, this does nothing.\n *\n * @private\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.openLookupMenu = function () {\n\tif ( !this.lookupMenu.isEmpty() ) {\n\t\tthis.lookupMenu.toggle( true );\n\t}\n\treturn this;\n};\n\n/**\n * Close the menu, empty it, and abort any pending request.\n *\n * @private\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.closeLookupMenu = function () {\n\tthis.lookupMenu.toggle( false );\n\tthis.abortLookupRequest();\n\tthis.lookupMenu.clearItems();\n\treturn this;\n};\n\n/**\n * Request menu items based on the input's current value, and when they arrive,\n * populate the menu with these items and show the menu.\n *\n * If lookups have been disabled with #setLookupsDisabled, this function does nothing.\n *\n * @private\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.populateLookupMenu = function () {\n\tvar widget = this,\n\t\tvalue = this.getValue();\n\n\tif ( this.lookupsDisabled || this.isReadOnly() ) {\n\t\treturn;\n\t}\n\n\t// If the input is empty, clear the menu, unless suggestions when empty are allowed.\n\tif ( !this.allowSuggestionsWhenEmpty && value === '' ) {\n\t\tthis.closeLookupMenu();\n\t// Skip population if there is already a request pending for the current value\n\t} else if ( value !== this.lookupQuery ) {\n\t\tthis.getLookupMenuItems()\n\t\t\t.done( function ( items ) {\n\t\t\t\twidget.lookupMenu.clearItems();\n\t\t\t\tif ( items.length ) {\n\t\t\t\t\twidget.lookupMenu\n\t\t\t\t\t\t.addItems( items )\n\t\t\t\t\t\t.toggle( true );\n\t\t\t\t\twidget.initializeLookupMenuSelection();\n\t\t\t\t} else {\n\t\t\t\t\twidget.lookupMenu.toggle( false );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.fail( function () {\n\t\t\t\twidget.lookupMenu.clearItems();\n\t\t\t} );\n\t}\n\n\treturn this;\n};\n\n/**\n * Highlight the first selectable item in the menu, if configured.\n *\n * @private\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.initializeLookupMenuSelection = function () {\n\tif ( this.lookupHighlightFirstItem && !this.lookupMenu.getSelectedItem() ) {\n\t\tthis.lookupMenu.highlightItem( this.lookupMenu.getFirstSelectableItem() );\n\t}\n};\n\n/**\n * Get lookup menu items for the current query.\n *\n * @private\n * @return {jQuery.Promise} Promise object which will be passed menu items as the first argument of\n * the done event. If the request was aborted to make way for a subsequent request, this promise\n * will not be rejected: it will remain pending forever.\n */\nOO.ui.mixin.LookupElement.prototype.getLookupMenuItems = function () {\n\treturn this.getRequestData().then( function ( data ) {\n\t\treturn this.getLookupMenuOptionsFromData( data );\n\t}.bind( this ) );\n};\n\n/**\n * Abort the currently pending lookup request, if any.\n *\n * @private\n */\nOO.ui.mixin.LookupElement.prototype.abortLookupRequest = function () {\n\tthis.abortRequest();\n};\n\n/**\n * Get a new request object of the current lookup query value.\n *\n * @protected\n * @method\n * @abstract\n * @return {jQuery.Promise} jQuery AJAX object, or promise object with an .abort() method\n */\nOO.ui.mixin.LookupElement.prototype.getLookupRequest = null;\n\n/**\n * Pre-process data returned by the request from #getLookupRequest.\n *\n * The return value of this function will be cached, and any further queries for the given value\n * will use the cache rather than doing API requests.\n *\n * @protected\n * @method\n * @abstract\n * @param {Mixed} response Response from server\n * @return {Mixed} Cached result data\n */\nOO.ui.mixin.LookupElement.prototype.getLookupCacheDataFromResponse = null;\n\n/**\n * Get a list of menu option widgets from the (possibly cached) data returned by\n * #getLookupCacheDataFromResponse.\n *\n * @protected\n * @method\n * @abstract\n * @param {Mixed} data Cached result data, usually an array\n * @return {OO.ui.MenuOptionWidget[]} Menu items\n */\nOO.ui.mixin.LookupElement.prototype.getLookupMenuOptionsFromData = null;\n\n/**\n * Set the read-only state of the widget.\n *\n * This will also disable/enable the lookups functionality.\n *\n * @param {boolean} readOnly Make input read-only\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.setReadOnly = function ( readOnly ) {\n\t// Parent method\n\t// Note: Calling #setReadOnly this way assumes this is mixed into an OO.ui.TextInputWidget\n\tOO.ui.TextInputWidget.prototype.setReadOnly.call( this, readOnly );\n\n\t// During construction, #setReadOnly is called before the OO.ui.mixin.LookupElement constructor\n\tif ( this.isReadOnly() && this.lookupMenu ) {\n\t\tthis.closeLookupMenu();\n\t}\n\n\treturn this;\n};\n\n/**\n * @inheritdoc OO.ui.mixin.RequestManager\n */\nOO.ui.mixin.LookupElement.prototype.getRequestQuery = function () {\n\treturn this.getValue();\n};\n\n/**\n * @inheritdoc OO.ui.mixin.RequestManager\n */\nOO.ui.mixin.LookupElement.prototype.getRequest = function () {\n\treturn this.getLookupRequest();\n};\n\n/**\n * @inheritdoc OO.ui.mixin.RequestManager\n */\nOO.ui.mixin.LookupElement.prototype.getRequestCacheDataFromResponse = function ( response ) {\n\treturn this.getLookupCacheDataFromResponse( response );\n};\n\n/**\n * CardLayouts are used within {@link OO.ui.IndexLayout index layouts} to create cards that users can select and display\n * from the index's optional {@link OO.ui.TabSelectWidget tab} navigation. Cards are usually not instantiated directly,\n * rather extended to include the required content and functionality.\n *\n * Each card must have a unique symbolic name, which is passed to the constructor. In addition, the card's tab\n * item is customized (with a label) using the #setupTabItem method. See\n * {@link OO.ui.IndexLayout IndexLayout} for an example.\n *\n * @class\n * @extends OO.ui.PanelLayout\n *\n * @constructor\n * @param {string} name Unique symbolic name of card\n * @param {Object} [config] Configuration options\n * @cfg {jQuery|string|Function|OO.ui.HtmlSnippet} [label] Label for card's tab\n */\nOO.ui.CardLayout = function OoUiCardLayout( name, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( name ) && config === undefined ) {\n\t\tconfig = name;\n\t\tname = config.name;\n\t}\n\n\t// Configuration initialization\n\tconfig = $.extend( { scrollable: true }, config );\n\n\t// Parent constructor\n\tOO.ui.CardLayout.parent.call( this, config );\n\n\t// Properties\n\tthis.name = name;\n\tthis.label = config.label;\n\tthis.tabItem = null;\n\tthis.active = false;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-cardLayout' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.CardLayout, OO.ui.PanelLayout );\n\n/* Events */\n\n/**\n * An 'active' event is emitted when the card becomes active. Cards become active when they are\n * shown in a index layout that is configured to display only one card at a time.\n *\n * @event active\n * @param {boolean} active Card is active\n */\n\n/* Methods */\n\n/**\n * Get the symbolic name of the card.\n *\n * @return {string} Symbolic name of card\n */\nOO.ui.CardLayout.prototype.getName = function () {\n\treturn this.name;\n};\n\n/**\n * Check if card is active.\n *\n * Cards become active when they are shown in a {@link OO.ui.IndexLayout index layout} that is configured to display\n * only one card at a time. Additional CSS is applied to the card's tab item to reflect the active state.\n *\n * @return {boolean} Card is active\n */\nOO.ui.CardLayout.prototype.isActive = function () {\n\treturn this.active;\n};\n\n/**\n * Get tab item.\n *\n * The tab item allows users to access the card from the index's tab\n * navigation. The tab item itself can be customized (with a label, level, etc.) using the #setupTabItem method.\n *\n * @return {OO.ui.TabOptionWidget|null} Tab option widget\n */\nOO.ui.CardLayout.prototype.getTabItem = function () {\n\treturn this.tabItem;\n};\n\n/**\n * Set or unset the tab item.\n *\n * Specify a {@link OO.ui.TabOptionWidget tab option} to set it,\n * or `null` to clear the tab item. To customize the tab item itself (e.g., to set a label or tab\n * level), use #setupTabItem instead of this method.\n *\n * @param {OO.ui.TabOptionWidget|null} tabItem Tab option widget, null to clear\n * @chainable\n */\nOO.ui.CardLayout.prototype.setTabItem = function ( tabItem ) {\n\tthis.tabItem = tabItem || null;\n\tif ( tabItem ) {\n\t\tthis.setupTabItem();\n\t}\n\treturn this;\n};\n\n/**\n * Set up the tab item.\n *\n * Use this method to customize the tab item (e.g., to add a label or tab level). To set or unset\n * the tab item itself (with a {@link OO.ui.TabOptionWidget tab option} or `null`), use\n * the #setTabItem method instead.\n *\n * @param {OO.ui.TabOptionWidget} tabItem Tab option widget to set up\n * @chainable\n */\nOO.ui.CardLayout.prototype.setupTabItem = function () {\n\tif ( this.label ) {\n\t\tthis.tabItem.setLabel( this.label );\n\t}\n\treturn this;\n};\n\n/**\n * Set the card to its 'active' state.\n *\n * Cards become active when they are shown in a index layout that is configured to display only one card at a time. Additional\n * CSS is applied to the tab item to reflect the card's active state. Outside of the index\n * context, setting the active state on a card does nothing.\n *\n * @param {boolean} active Card is active\n * @fires active\n */\nOO.ui.CardLayout.prototype.setActive = function ( active ) {\n\tactive = !!active;\n\n\tif ( active !== this.active ) {\n\t\tthis.active = active;\n\t\tthis.$element.toggleClass( 'oo-ui-cardLayout-active', this.active );\n\t\tthis.emit( 'active', this.active );\n\t}\n};\n\n/**\n * PageLayouts are used within {@link OO.ui.BookletLayout booklet layouts} to create pages that users can select and display\n * from the booklet's optional {@link OO.ui.OutlineSelectWidget outline} navigation. Pages are usually not instantiated directly,\n * rather extended to include the required content and functionality.\n *\n * Each page must have a unique symbolic name, which is passed to the constructor. In addition, the page's outline\n * item is customized (with a label, outline level, etc.) using the #setupOutlineItem method. See\n * {@link OO.ui.BookletLayout BookletLayout} for an example.\n *\n * @class\n * @extends OO.ui.PanelLayout\n *\n * @constructor\n * @param {string} name Unique symbolic name of page\n * @param {Object} [config] Configuration options\n */\nOO.ui.PageLayout = function OoUiPageLayout( name, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( name ) && config === undefined ) {\n\t\tconfig = name;\n\t\tname = config.name;\n\t}\n\n\t// Configuration initialization\n\tconfig = $.extend( { scrollable: true }, config );\n\n\t// Parent constructor\n\tOO.ui.PageLayout.parent.call( this, config );\n\n\t// Properties\n\tthis.name = name;\n\tthis.outlineItem = null;\n\tthis.active = false;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-pageLayout' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.PageLayout, OO.ui.PanelLayout );\n\n/* Events */\n\n/**\n * An 'active' event is emitted when the page becomes active. Pages become active when they are\n * shown in a booklet layout that is configured to display only one page at a time.\n *\n * @event active\n * @param {boolean} active Page is active\n */\n\n/* Methods */\n\n/**\n * Get the symbolic name of the page.\n *\n * @return {string} Symbolic name of page\n */\nOO.ui.PageLayout.prototype.getName = function () {\n\treturn this.name;\n};\n\n/**\n * Check if page is active.\n *\n * Pages become active when they are shown in a {@link OO.ui.BookletLayout booklet layout} that is configured to display\n * only one page at a time. Additional CSS is applied to the page's outline item to reflect the active state.\n *\n * @return {boolean} Page is active\n */\nOO.ui.PageLayout.prototype.isActive = function () {\n\treturn this.active;\n};\n\n/**\n * Get outline item.\n *\n * The outline item allows users to access the page from the booklet's outline\n * navigation. The outline item itself can be customized (with a label, level, etc.) using the #setupOutlineItem method.\n *\n * @return {OO.ui.OutlineOptionWidget|null} Outline option widget\n */\nOO.ui.PageLayout.prototype.getOutlineItem = function () {\n\treturn this.outlineItem;\n};\n\n/**\n * Set or unset the outline item.\n *\n * Specify an {@link OO.ui.OutlineOptionWidget outline option} to set it,\n * or `null` to clear the outline item. To customize the outline item itself (e.g., to set a label or outline\n * level), use #setupOutlineItem instead of this method.\n *\n * @param {OO.ui.OutlineOptionWidget|null} outlineItem Outline option widget, null to clear\n * @chainable\n */\nOO.ui.PageLayout.prototype.setOutlineItem = function ( outlineItem ) {\n\tthis.outlineItem = outlineItem || null;\n\tif ( outlineItem ) {\n\t\tthis.setupOutlineItem();\n\t}\n\treturn this;\n};\n\n/**\n * Set up the outline item.\n *\n * Use this method to customize the outline item (e.g., to add a label or outline level). To set or unset\n * the outline item itself (with an {@link OO.ui.OutlineOptionWidget outline option} or `null`), use\n * the #setOutlineItem method instead.\n *\n * @param {OO.ui.OutlineOptionWidget} outlineItem Outline option widget to set up\n * @chainable\n */\nOO.ui.PageLayout.prototype.setupOutlineItem = function () {\n\treturn this;\n};\n\n/**\n * Set the page to its 'active' state.\n *\n * Pages become active when they are shown in a booklet layout that is configured to display only one page at a time. Additional\n * CSS is applied to the outline item to reflect the page's active state. Outside of the booklet\n * context, setting the active state on a page does nothing.\n *\n * @param {boolean} active Page is active\n * @fires active\n */\nOO.ui.PageLayout.prototype.setActive = function ( active ) {\n\tactive = !!active;\n\n\tif ( active !== this.active ) {\n\t\tthis.active = active;\n\t\tthis.$element.toggleClass( 'oo-ui-pageLayout-active', active );\n\t\tthis.emit( 'active', this.active );\n\t}\n};\n\n/**\n * StackLayouts contain a series of {@link OO.ui.PanelLayout panel layouts}. By default, only one panel is displayed\n * at a time, though the stack layout can also be configured to show all contained panels, one after another,\n * by setting the #continuous option to 'true'.\n *\n * @example\n * // A stack layout with two panels, configured to be displayed continously\n * var myStack = new OO.ui.StackLayout( {\n * items: [\n * new OO.ui.PanelLayout( {\n * $content: $( '
Panel One
' ),\n * padded: true,\n * framed: true\n * } ),\n * new OO.ui.PanelLayout( {\n * $content: $( 'Panel Two
' ),\n * padded: true,\n * framed: true\n * } )\n * ],\n * continuous: true\n * } );\n * $( 'body' ).append( myStack.$element );\n *\n * @class\n * @extends OO.ui.PanelLayout\n * @mixins OO.ui.mixin.GroupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [continuous=false] Show all panels, one after another. By default, only one panel is displayed at a time.\n * @cfg {OO.ui.Layout[]} [items] Panel layouts to add to the stack layout.\n */\nOO.ui.StackLayout = function OoUiStackLayout( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( { scrollable: true }, config );\n\n\t// Parent constructor\n\tOO.ui.StackLayout.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, $.extend( {}, config, { $group: this.$element } ) );\n\n\t// Properties\n\tthis.currentItem = null;\n\tthis.continuous = !!config.continuous;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-stackLayout' );\n\tif ( this.continuous ) {\n\t\tthis.$element.addClass( 'oo-ui-stackLayout-continuous' );\n\t\tthis.$element.on( 'scroll', OO.ui.debounce( this.onScroll.bind( this ), 250 ) );\n\t}\n\tif ( Array.isArray( config.items ) ) {\n\t\tthis.addItems( config.items );\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.StackLayout, OO.ui.PanelLayout );\nOO.mixinClass( OO.ui.StackLayout, OO.ui.mixin.GroupElement );\n\n/* Events */\n\n/**\n * A 'set' event is emitted when panels are {@link #addItems added}, {@link #removeItems removed},\n * {@link #clearItems cleared} or {@link #setItem displayed}.\n *\n * @event set\n * @param {OO.ui.Layout|null} item Current panel or `null` if no panel is shown\n */\n\n/**\n * When used in continuous mode, this event is emitted when the user scrolls down\n * far enough such that currentItem is no longer visible.\n *\n * @event visibleItemChange\n * @param {OO.ui.PanelLayout} panel The next visible item in the layout\n */\n\n/* Methods */\n\n/**\n * Handle scroll events from the layout element\n *\n * @param {jQuery.Event} e\n * @fires visibleItemChange\n */\nOO.ui.StackLayout.prototype.onScroll = function () {\n\tvar currentRect,\n\t\tlen = this.items.length,\n\t\tcurrentIndex = this.items.indexOf( this.currentItem ),\n\t\tnewIndex = currentIndex,\n\t\tcontainerRect = this.$element[ 0 ].getBoundingClientRect();\n\n\tif ( !containerRect || ( !containerRect.top && !containerRect.bottom ) ) {\n\t\t// Can't get bounding rect, possibly not attached.\n\t\treturn;\n\t}\n\n\tfunction getRect( item ) {\n\t\treturn item.$element[ 0 ].getBoundingClientRect();\n\t}\n\n\tfunction isVisible( item ) {\n\t\tvar rect = getRect( item );\n\t\treturn rect.bottom > containerRect.top && rect.top < containerRect.bottom;\n\t}\n\n\tcurrentRect = getRect( this.currentItem );\n\n\tif ( currentRect.bottom < containerRect.top ) {\n\t\t// Scrolled down past current item\n\t\twhile ( ++newIndex < len ) {\n\t\t\tif ( isVisible( this.items[ newIndex ] ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else if ( currentRect.top > containerRect.bottom ) {\n\t\t// Scrolled up past current item\n\t\twhile ( --newIndex >= 0 ) {\n\t\t\tif ( isVisible( this.items[ newIndex ] ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( newIndex !== currentIndex ) {\n\t\tthis.emit( 'visibleItemChange', this.items[ newIndex ] );\n\t}\n};\n\n/**\n * Get the current panel.\n *\n * @return {OO.ui.Layout|null}\n */\nOO.ui.StackLayout.prototype.getCurrentItem = function () {\n\treturn this.currentItem;\n};\n\n/**\n * Unset the current item.\n *\n * @private\n * @param {OO.ui.StackLayout} layout\n * @fires set\n */\nOO.ui.StackLayout.prototype.unsetCurrentItem = function () {\n\tvar prevItem = this.currentItem;\n\tif ( prevItem === null ) {\n\t\treturn;\n\t}\n\n\tthis.currentItem = null;\n\tthis.emit( 'set', null );\n};\n\n/**\n * Add panel layouts to the stack layout.\n *\n * Panels will be added to the end of the stack layout array unless the optional index parameter specifies a different\n * insertion point. Adding a panel that is already in the stack will move it to the end of the array or the point specified\n * by the index.\n *\n * @param {OO.ui.Layout[]} items Panels to add\n * @param {number} [index] Index of the insertion point\n * @chainable\n */\nOO.ui.StackLayout.prototype.addItems = function ( items, index ) {\n\t// Update the visibility\n\tthis.updateHiddenState( items, this.currentItem );\n\n\t// Mixin method\n\tOO.ui.mixin.GroupElement.prototype.addItems.call( this, items, index );\n\n\tif ( !this.currentItem && items.length ) {\n\t\tthis.setItem( items[ 0 ] );\n\t}\n\n\treturn this;\n};\n\n/**\n * Remove the specified panels from the stack layout.\n *\n * Removed panels are detached from the DOM, not removed, so that they may be reused. To remove all panels,\n * you may wish to use the #clearItems method instead.\n *\n * @param {OO.ui.Layout[]} items Panels to remove\n * @chainable\n * @fires set\n */\nOO.ui.StackLayout.prototype.removeItems = function ( items ) {\n\t// Mixin method\n\tOO.ui.mixin.GroupElement.prototype.removeItems.call( this, items );\n\n\tif ( items.indexOf( this.currentItem ) !== -1 ) {\n\t\tif ( this.items.length ) {\n\t\t\tthis.setItem( this.items[ 0 ] );\n\t\t} else {\n\t\t\tthis.unsetCurrentItem();\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Clear all panels from the stack layout.\n *\n * Cleared panels are detached from the DOM, not removed, so that they may be reused. To remove only\n * a subset of panels, use the #removeItems method.\n *\n * @chainable\n * @fires set\n */\nOO.ui.StackLayout.prototype.clearItems = function () {\n\tthis.unsetCurrentItem();\n\tOO.ui.mixin.GroupElement.prototype.clearItems.call( this );\n\n\treturn this;\n};\n\n/**\n * Show the specified panel.\n *\n * If another panel is currently displayed, it will be hidden.\n *\n * @param {OO.ui.Layout} item Panel to show\n * @chainable\n * @fires set\n */\nOO.ui.StackLayout.prototype.setItem = function ( item ) {\n\tif ( item !== this.currentItem ) {\n\t\tthis.updateHiddenState( this.items, item );\n\n\t\tif ( this.items.indexOf( item ) !== -1 ) {\n\t\t\tthis.currentItem = item;\n\t\t\tthis.emit( 'set', item );\n\t\t} else {\n\t\t\tthis.unsetCurrentItem();\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Update the visibility of all items in case of non-continuous view.\n *\n * Ensure all items are hidden except for the selected one.\n * This method does nothing when the stack is continuous.\n *\n * @private\n * @param {OO.ui.Layout[]} items Item list iterate over\n * @param {OO.ui.Layout} [selectedItem] Selected item to show\n */\nOO.ui.StackLayout.prototype.updateHiddenState = function ( items, selectedItem ) {\n\tvar i, len;\n\n\tif ( !this.continuous ) {\n\t\tfor ( i = 0, len = items.length; i < len; i++ ) {\n\t\t\tif ( !selectedItem || selectedItem !== items[ i ] ) {\n\t\t\t\titems[ i ].$element.addClass( 'oo-ui-element-hidden' );\n\t\t\t}\n\t\t}\n\t\tif ( selectedItem ) {\n\t\t\tselectedItem.$element.removeClass( 'oo-ui-element-hidden' );\n\t\t}\n\t}\n};\n\n/**\n * MenuLayouts combine a menu and a content {@link OO.ui.PanelLayout panel}. The menu is positioned relative to the content (after, before, top, or bottom)\n * and its size is customized with the #menuSize config. The content area will fill all remaining space.\n *\n * @example\n * var menuLayout = new OO.ui.MenuLayout( {\n * position: 'top'\n * } ),\n * menuPanel = new OO.ui.PanelLayout( { padded: true, expanded: true, scrollable: true } ),\n * contentPanel = new OO.ui.PanelLayout( { padded: true, expanded: true, scrollable: true } ),\n * select = new OO.ui.SelectWidget( {\n * items: [\n * new OO.ui.OptionWidget( {\n * data: 'before',\n * label: 'Before',\n * } ),\n * new OO.ui.OptionWidget( {\n * data: 'after',\n * label: 'After',\n * } ),\n * new OO.ui.OptionWidget( {\n * data: 'top',\n * label: 'Top',\n * } ),\n * new OO.ui.OptionWidget( {\n * data: 'bottom',\n * label: 'Bottom',\n * } )\n * ]\n * } ).on( 'select', function ( item ) {\n * menuLayout.setMenuPosition( item.getData() );\n * } );\n *\n * menuLayout.$menu.append(\n * menuPanel.$element.append( 'Menu panel', select.$element )\n * );\n * menuLayout.$content.append(\n * contentPanel.$element.append( 'Content panel', 'Note that the menu is positioned relative to the content panel: top, bottom, after, before.
')\n * );\n * $( 'body' ).append( menuLayout.$element );\n *\n * If menu size needs to be overridden, it can be accomplished using CSS similar to the snippet\n * below. MenuLayout's CSS will override the appropriate values with 'auto' or '0' to display the\n * menu correctly. If `menuPosition` is known beforehand, CSS rules corresponding to other positions\n * may be omitted.\n *\n * .oo-ui-menuLayout-menu {\n * height: 200px;\n * width: 200px;\n * }\n * .oo-ui-menuLayout-content {\n * top: 200px;\n * left: 200px;\n * right: 200px;\n * bottom: 200px;\n * }\n *\n * @class\n * @extends OO.ui.Layout\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [showMenu=true] Show menu\n * @cfg {string} [menuPosition='before'] Position of menu: `top`, `after`, `bottom` or `before`\n */\nOO.ui.MenuLayout = function OoUiMenuLayout( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( {\n\t\tshowMenu: true,\n\t\tmenuPosition: 'before'\n\t}, config );\n\n\t// Parent constructor\n\tOO.ui.MenuLayout.parent.call( this, config );\n\n\t/**\n\t * Menu DOM node\n\t *\n\t * @property {jQuery}\n\t */\n\tthis.$menu = $( 'First page
(This booklet has an outline, displayed on the left)
' );\n * }\n * OO.inheritClass( PageOneLayout, OO.ui.PageLayout );\n * PageOneLayout.prototype.setupOutlineItem = function () {\n * this.outlineItem.setLabel( 'Page One' );\n * };\n *\n * function PageTwoLayout( name, config ) {\n * PageTwoLayout.parent.call( this, name, config );\n * this.$element.append( 'Second page
' );\n * }\n * OO.inheritClass( PageTwoLayout, OO.ui.PageLayout );\n * PageTwoLayout.prototype.setupOutlineItem = function () {\n * this.outlineItem.setLabel( 'Page Two' );\n * };\n *\n * var page1 = new PageOneLayout( 'one' ),\n * page2 = new PageTwoLayout( 'two' );\n *\n * var booklet = new OO.ui.BookletLayout( {\n * outlined: true\n * } );\n *\n * booklet.addPages ( [ page1, page2 ] );\n * $( 'body' ).append( booklet.$element );\n *\n * @class\n * @extends OO.ui.MenuLayout\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [continuous=false] Show all pages, one after another\n * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new page is displayed.\n * @cfg {boolean} [outlined=false] Show the outline. The outline is used to navigate through the pages of the booklet.\n * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages\n */\nOO.ui.BookletLayout = function OoUiBookletLayout( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.BookletLayout.parent.call( this, config );\n\n\t// Properties\n\tthis.currentPageName = null;\n\tthis.pages = {};\n\tthis.ignoreFocus = false;\n\tthis.stackLayout = new OO.ui.StackLayout( { continuous: !!config.continuous } );\n\tthis.$content.append( this.stackLayout.$element );\n\tthis.autoFocus = config.autoFocus === undefined || !!config.autoFocus;\n\tthis.outlineVisible = false;\n\tthis.outlined = !!config.outlined;\n\tif ( this.outlined ) {\n\t\tthis.editable = !!config.editable;\n\t\tthis.outlineControlsWidget = null;\n\t\tthis.outlineSelectWidget = new OO.ui.OutlineSelectWidget();\n\t\tthis.outlinePanel = new OO.ui.PanelLayout( { scrollable: true } );\n\t\tthis.$menu.append( this.outlinePanel.$element );\n\t\tthis.outlineVisible = true;\n\t\tif ( this.editable ) {\n\t\t\tthis.outlineControlsWidget = new OO.ui.OutlineControlsWidget(\n\t\t\t\tthis.outlineSelectWidget\n\t\t\t);\n\t\t}\n\t}\n\tthis.toggleMenu( this.outlined );\n\n\t// Events\n\tthis.stackLayout.connect( this, { set: 'onStackLayoutSet' } );\n\tif ( this.outlined ) {\n\t\tthis.outlineSelectWidget.connect( this, { select: 'onOutlineSelectWidgetSelect' } );\n\t\tthis.scrolling = false;\n\t\tthis.stackLayout.connect( this, { visibleItemChange: 'onStackLayoutVisibleItemChange' } );\n\t}\n\tif ( this.autoFocus ) {\n\t\t// Event 'focus' does not bubble, but 'focusin' does\n\t\tthis.stackLayout.$element.on( 'focusin', this.onStackLayoutFocus.bind( this ) );\n\t}\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-bookletLayout' );\n\tthis.stackLayout.$element.addClass( 'oo-ui-bookletLayout-stackLayout' );\n\tif ( this.outlined ) {\n\t\tthis.outlinePanel.$element\n\t\t\t.addClass( 'oo-ui-bookletLayout-outlinePanel' )\n\t\t\t.append( this.outlineSelectWidget.$element );\n\t\tif ( this.editable ) {\n\t\t\tthis.outlinePanel.$element\n\t\t\t\t.addClass( 'oo-ui-bookletLayout-outlinePanel-editable' )\n\t\t\t\t.append( this.outlineControlsWidget.$element );\n\t\t}\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.BookletLayout, OO.ui.MenuLayout );\n\n/* Events */\n\n/**\n * A 'set' event is emitted when a page is {@link #setPage set} to be displayed by the booklet layout.\n * @event set\n * @param {OO.ui.PageLayout} page Current page\n */\n\n/**\n * An 'add' event is emitted when pages are {@link #addPages added} to the booklet layout.\n *\n * @event add\n * @param {OO.ui.PageLayout[]} page Added pages\n * @param {number} index Index pages were added at\n */\n\n/**\n * A 'remove' event is emitted when pages are {@link #clearPages cleared} or\n * {@link #removePages removed} from the booklet.\n *\n * @event remove\n * @param {OO.ui.PageLayout[]} pages Removed pages\n */\n\n/* Methods */\n\n/**\n * Handle stack layout focus.\n *\n * @private\n * @param {jQuery.Event} e Focusin event\n */\nOO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {\n\tvar name, $target;\n\n\t// Find the page that an element was focused within\n\t$target = $( e.target ).closest( '.oo-ui-pageLayout' );\n\tfor ( name in this.pages ) {\n\t\t// Check for page match, exclude current page to find only page changes\n\t\tif ( this.pages[ name ].$element[ 0 ] === $target[ 0 ] && name !== this.currentPageName ) {\n\t\t\tthis.setPage( name );\n\t\t\tbreak;\n\t\t}\n\t}\n};\n\n/**\n * Handle visibleItemChange events from the stackLayout\n *\n * The next visible page is set as the current page by selecting it\n * in the outline\n *\n * @param {OO.ui.PageLayout} page The next visible page in the layout\n */\nOO.ui.BookletLayout.prototype.onStackLayoutVisibleItemChange = function ( page ) {\n\t// Set a flag to so that the resulting call to #onStackLayoutSet doesn't\n\t// try and scroll the item into view again.\n\tthis.scrolling = true;\n\tthis.outlineSelectWidget.selectItemByData( page.getName() );\n\tthis.scrolling = false;\n};\n\n/**\n * Handle stack layout set events.\n *\n * @private\n * @param {OO.ui.PanelLayout|null} page The page panel that is now the current panel\n */\nOO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {\n\tvar layout = this;\n\tif ( !this.scrolling && page ) {\n\t\tpage.scrollElementIntoView( { complete: function () {\n\t\t\tif ( layout.autoFocus ) {\n\t\t\t\tlayout.focus();\n\t\t\t}\n\t\t} } );\n\t}\n};\n\n/**\n * Focus the first input in the current page.\n *\n * If no page is selected, the first selectable page will be selected.\n * If the focus is already in an element on the current page, nothing will happen.\n *\n * @param {number} [itemIndex] A specific item to focus on\n */\nOO.ui.BookletLayout.prototype.focus = function ( itemIndex ) {\n\tvar page,\n\t\titems = this.stackLayout.getItems();\n\n\tif ( itemIndex !== undefined && items[ itemIndex ] ) {\n\t\tpage = items[ itemIndex ];\n\t} else {\n\t\tpage = this.stackLayout.getCurrentItem();\n\t}\n\n\tif ( !page && this.outlined ) {\n\t\tthis.selectFirstSelectablePage();\n\t\tpage = this.stackLayout.getCurrentItem();\n\t}\n\tif ( !page ) {\n\t\treturn;\n\t}\n\t// Only change the focus if is not already in the current page\n\tif ( !OO.ui.contains( page.$element[ 0 ], this.getElementDocument().activeElement, true ) ) {\n\t\tpage.focus();\n\t}\n};\n\n/**\n * Find the first focusable input in the booklet layout and focus\n * on it.\n */\nOO.ui.BookletLayout.prototype.focusFirstFocusable = function () {\n\tOO.ui.findFocusable( this.stackLayout.$element ).focus();\n};\n\n/**\n * Handle outline widget select events.\n *\n * @private\n * @param {OO.ui.OptionWidget|null} item Selected item\n */\nOO.ui.BookletLayout.prototype.onOutlineSelectWidgetSelect = function ( item ) {\n\tif ( item ) {\n\t\tthis.setPage( item.getData() );\n\t}\n};\n\n/**\n * Check if booklet has an outline.\n *\n * @return {boolean} Booklet has an outline\n */\nOO.ui.BookletLayout.prototype.isOutlined = function () {\n\treturn this.outlined;\n};\n\n/**\n * Check if booklet has editing controls.\n *\n * @return {boolean} Booklet is editable\n */\nOO.ui.BookletLayout.prototype.isEditable = function () {\n\treturn this.editable;\n};\n\n/**\n * Check if booklet has a visible outline.\n *\n * @return {boolean} Outline is visible\n */\nOO.ui.BookletLayout.prototype.isOutlineVisible = function () {\n\treturn this.outlined && this.outlineVisible;\n};\n\n/**\n * Hide or show the outline.\n *\n * @param {boolean} [show] Show outline, omit to invert current state\n * @chainable\n */\nOO.ui.BookletLayout.prototype.toggleOutline = function ( show ) {\n\tif ( this.outlined ) {\n\t\tshow = show === undefined ? !this.outlineVisible : !!show;\n\t\tthis.outlineVisible = show;\n\t\tthis.toggleMenu( show );\n\t}\n\n\treturn this;\n};\n\n/**\n * Get the page closest to the specified page.\n *\n * @param {OO.ui.PageLayout} page Page to use as a reference point\n * @return {OO.ui.PageLayout|null} Page closest to the specified page\n */\nOO.ui.BookletLayout.prototype.getClosestPage = function ( page ) {\n\tvar next, prev, level,\n\t\tpages = this.stackLayout.getItems(),\n\t\tindex = pages.indexOf( page );\n\n\tif ( index !== -1 ) {\n\t\tnext = pages[ index + 1 ];\n\t\tprev = pages[ index - 1 ];\n\t\t// Prefer adjacent pages at the same level\n\t\tif ( this.outlined ) {\n\t\t\tlevel = this.outlineSelectWidget.getItemFromData( page.getName() ).getLevel();\n\t\t\tif (\n\t\t\t\tprev &&\n\t\t\t\tlevel === this.outlineSelectWidget.getItemFromData( prev.getName() ).getLevel()\n\t\t\t) {\n\t\t\t\treturn prev;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tnext &&\n\t\t\t\tlevel === this.outlineSelectWidget.getItemFromData( next.getName() ).getLevel()\n\t\t\t) {\n\t\t\t\treturn next;\n\t\t\t}\n\t\t}\n\t}\n\treturn prev || next || null;\n};\n\n/**\n * Get the outline widget.\n *\n * If the booklet is not outlined, the method will return `null`.\n *\n * @return {OO.ui.OutlineSelectWidget|null} Outline widget, or null if the booklet is not outlined\n */\nOO.ui.BookletLayout.prototype.getOutline = function () {\n\treturn this.outlineSelectWidget;\n};\n\n/**\n * Get the outline controls widget.\n *\n * If the outline is not editable, the method will return `null`.\n *\n * @return {OO.ui.OutlineControlsWidget|null} The outline controls widget.\n */\nOO.ui.BookletLayout.prototype.getOutlineControls = function () {\n\treturn this.outlineControlsWidget;\n};\n\n/**\n * Get a page by its symbolic name.\n *\n * @param {string} name Symbolic name of page\n * @return {OO.ui.PageLayout|undefined} Page, if found\n */\nOO.ui.BookletLayout.prototype.getPage = function ( name ) {\n\treturn this.pages[ name ];\n};\n\n/**\n * Get the current page.\n *\n * @return {OO.ui.PageLayout|undefined} Current page, if found\n */\nOO.ui.BookletLayout.prototype.getCurrentPage = function () {\n\tvar name = this.getCurrentPageName();\n\treturn name ? this.getPage( name ) : undefined;\n};\n\n/**\n * Get the symbolic name of the current page.\n *\n * @return {string|null} Symbolic name of the current page\n */\nOO.ui.BookletLayout.prototype.getCurrentPageName = function () {\n\treturn this.currentPageName;\n};\n\n/**\n * Add pages to the booklet layout\n *\n * When pages are added with the same names as existing pages, the existing pages will be\n * automatically removed before the new pages are added.\n *\n * @param {OO.ui.PageLayout[]} pages Pages to add\n * @param {number} index Index of the insertion point\n * @fires add\n * @chainable\n */\nOO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {\n\tvar i, len, name, page, item, currentIndex,\n\t\tstackLayoutPages = this.stackLayout.getItems(),\n\t\tremove = [],\n\t\titems = [];\n\n\t// Remove pages with same names\n\tfor ( i = 0, len = pages.length; i < len; i++ ) {\n\t\tpage = pages[ i ];\n\t\tname = page.getName();\n\n\t\tif ( Object.prototype.hasOwnProperty.call( this.pages, name ) ) {\n\t\t\t// Correct the insertion index\n\t\t\tcurrentIndex = stackLayoutPages.indexOf( this.pages[ name ] );\n\t\t\tif ( currentIndex !== -1 && currentIndex + 1 < index ) {\n\t\t\t\tindex--;\n\t\t\t}\n\t\t\tremove.push( this.pages[ name ] );\n\t\t}\n\t}\n\tif ( remove.length ) {\n\t\tthis.removePages( remove );\n\t}\n\n\t// Add new pages\n\tfor ( i = 0, len = pages.length; i < len; i++ ) {\n\t\tpage = pages[ i ];\n\t\tname = page.getName();\n\t\tthis.pages[ page.getName() ] = page;\n\t\tif ( this.outlined ) {\n\t\t\titem = new OO.ui.OutlineOptionWidget( { data: name } );\n\t\t\tpage.setOutlineItem( item );\n\t\t\titems.push( item );\n\t\t}\n\t}\n\n\tif ( this.outlined && items.length ) {\n\t\tthis.outlineSelectWidget.addItems( items, index );\n\t\tthis.selectFirstSelectablePage();\n\t}\n\tthis.stackLayout.addItems( pages, index );\n\tthis.emit( 'add', pages, index );\n\n\treturn this;\n};\n\n/**\n * Remove the specified pages from the booklet layout.\n *\n * To remove all pages from the booklet, you may wish to use the #clearPages method instead.\n *\n * @param {OO.ui.PageLayout[]} pages An array of pages to remove\n * @fires remove\n * @chainable\n */\nOO.ui.BookletLayout.prototype.removePages = function ( pages ) {\n\tvar i, len, name, page,\n\t\titems = [];\n\n\tfor ( i = 0, len = pages.length; i < len; i++ ) {\n\t\tpage = pages[ i ];\n\t\tname = page.getName();\n\t\tdelete this.pages[ name ];\n\t\tif ( this.outlined ) {\n\t\t\titems.push( this.outlineSelectWidget.getItemFromData( name ) );\n\t\t\tpage.setOutlineItem( null );\n\t\t}\n\t}\n\tif ( this.outlined && items.length ) {\n\t\tthis.outlineSelectWidget.removeItems( items );\n\t\tthis.selectFirstSelectablePage();\n\t}\n\tthis.stackLayout.removeItems( pages );\n\tthis.emit( 'remove', pages );\n\n\treturn this;\n};\n\n/**\n * Clear all pages from the booklet layout.\n *\n * To remove only a subset of pages from the booklet, use the #removePages method.\n *\n * @fires remove\n * @chainable\n */\nOO.ui.BookletLayout.prototype.clearPages = function () {\n\tvar i, len,\n\t\tpages = this.stackLayout.getItems();\n\n\tthis.pages = {};\n\tthis.currentPageName = null;\n\tif ( this.outlined ) {\n\t\tthis.outlineSelectWidget.clearItems();\n\t\tfor ( i = 0, len = pages.length; i < len; i++ ) {\n\t\t\tpages[ i ].setOutlineItem( null );\n\t\t}\n\t}\n\tthis.stackLayout.clearItems();\n\n\tthis.emit( 'remove', pages );\n\n\treturn this;\n};\n\n/**\n * Set the current page by symbolic name.\n *\n * @fires set\n * @param {string} name Symbolic name of page\n */\nOO.ui.BookletLayout.prototype.setPage = function ( name ) {\n\tvar selectedItem,\n\t\t$focused,\n\t\tpage = this.pages[ name ],\n\t\tpreviousPage = this.currentPageName && this.pages[ this.currentPageName ];\n\n\tif ( name !== this.currentPageName ) {\n\t\tif ( this.outlined ) {\n\t\t\tselectedItem = this.outlineSelectWidget.getSelectedItem();\n\t\t\tif ( selectedItem && selectedItem.getData() !== name ) {\n\t\t\t\tthis.outlineSelectWidget.selectItemByData( name );\n\t\t\t}\n\t\t}\n\t\tif ( page ) {\n\t\t\tif ( previousPage ) {\n\t\t\t\tpreviousPage.setActive( false );\n\t\t\t\t// Blur anything focused if the next page doesn't have anything focusable.\n\t\t\t\t// This is not needed if the next page has something focusable (because once it is focused\n\t\t\t\t// this blur happens automatically). If the layout is non-continuous, this check is\n\t\t\t\t// meaningless because the next page is not visible yet and thus can't hold focus.\n\t\t\t\tif (\n\t\t\t\t\tthis.autoFocus &&\n\t\t\t\t\tthis.stackLayout.continuous &&\n\t\t\t\t\tOO.ui.findFocusable( page.$element ).length !== 0\n\t\t\t\t) {\n\t\t\t\t\t$focused = previousPage.$element.find( ':focus' );\n\t\t\t\t\tif ( $focused.length ) {\n\t\t\t\t\t\t$focused[ 0 ].blur();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentPageName = name;\n\t\t\tpage.setActive( true );\n\t\t\tthis.stackLayout.setItem( page );\n\t\t\tif ( !this.stackLayout.continuous && previousPage ) {\n\t\t\t\t// This should not be necessary, since any inputs on the previous page should have been\n\t\t\t\t// blurred when it was hidden, but browsers are not very consistent about this.\n\t\t\t\t$focused = previousPage.$element.find( ':focus' );\n\t\t\t\tif ( $focused.length ) {\n\t\t\t\t\t$focused[ 0 ].blur();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.emit( 'set', page );\n\t\t}\n\t}\n};\n\n/**\n * Select the first selectable page.\n *\n * @chainable\n */\nOO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {\n\tif ( !this.outlineSelectWidget.getSelectedItem() ) {\n\t\tthis.outlineSelectWidget.selectItem( this.outlineSelectWidget.getFirstSelectableItem() );\n\t}\n\n\treturn this;\n};\n\n/**\n * IndexLayouts contain {@link OO.ui.CardLayout card layouts} as well as\n * {@link OO.ui.TabSelectWidget tabs} that allow users to easily navigate through the cards and\n * select which one to display. By default, only one card is displayed at a time. When a user\n * navigates to a new card, the index layout automatically focuses on the first focusable element,\n * unless the default setting is changed.\n *\n * TODO: This class is similar to BookletLayout, we may want to refactor to reduce duplication\n *\n * @example\n * // Example of a IndexLayout that contains two CardLayouts.\n *\n * function CardOneLayout( name, config ) {\n * CardOneLayout.parent.call( this, name, config );\n * this.$element.append( 'First card
' );\n * }\n * OO.inheritClass( CardOneLayout, OO.ui.CardLayout );\n * CardOneLayout.prototype.setupTabItem = function () {\n * this.tabItem.setLabel( 'Card one' );\n * };\n *\n * var card1 = new CardOneLayout( 'one' ),\n * card2 = new CardLayout( 'two', { label: 'Card two' } );\n *\n * card2.$element.append( 'Second card
' );\n *\n * var index = new OO.ui.IndexLayout();\n *\n * index.addCards ( [ card1, card2 ] );\n * $( 'body' ).append( index.$element );\n *\n * @class\n * @extends OO.ui.MenuLayout\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [continuous=false] Show all cards, one after another\n * @cfg {boolean} [expanded=true] Expand the content panel to fill the entire parent element.\n * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new card is displayed.\n */\nOO.ui.IndexLayout = function OoUiIndexLayout( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( {}, config, { menuPosition: 'top' } );\n\n\t// Parent constructor\n\tOO.ui.IndexLayout.parent.call( this, config );\n\n\t// Properties\n\tthis.currentCardName = null;\n\tthis.cards = {};\n\tthis.ignoreFocus = false;\n\tthis.stackLayout = new OO.ui.StackLayout( {\n\t\tcontinuous: !!config.continuous,\n\t\texpanded: config.expanded\n\t} );\n\tthis.$content.append( this.stackLayout.$element );\n\tthis.autoFocus = config.autoFocus === undefined || !!config.autoFocus;\n\n\tthis.tabSelectWidget = new OO.ui.TabSelectWidget();\n\tthis.tabPanel = new OO.ui.PanelLayout();\n\tthis.$menu.append( this.tabPanel.$element );\n\n\tthis.toggleMenu( true );\n\n\t// Events\n\tthis.stackLayout.connect( this, { set: 'onStackLayoutSet' } );\n\tthis.tabSelectWidget.connect( this, { select: 'onTabSelectWidgetSelect' } );\n\tif ( this.autoFocus ) {\n\t\t// Event 'focus' does not bubble, but 'focusin' does\n\t\tthis.stackLayout.$element.on( 'focusin', this.onStackLayoutFocus.bind( this ) );\n\t}\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-indexLayout' );\n\tthis.stackLayout.$element.addClass( 'oo-ui-indexLayout-stackLayout' );\n\tthis.tabPanel.$element\n\t\t.addClass( 'oo-ui-indexLayout-tabPanel' )\n\t\t.append( this.tabSelectWidget.$element );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.IndexLayout, OO.ui.MenuLayout );\n\n/* Events */\n\n/**\n * A 'set' event is emitted when a card is {@link #setCard set} to be displayed by the index layout.\n * @event set\n * @param {OO.ui.CardLayout} card Current card\n */\n\n/**\n * An 'add' event is emitted when cards are {@link #addCards added} to the index layout.\n *\n * @event add\n * @param {OO.ui.CardLayout[]} card Added cards\n * @param {number} index Index cards were added at\n */\n\n/**\n * A 'remove' event is emitted when cards are {@link #clearCards cleared} or\n * {@link #removeCards removed} from the index.\n *\n * @event remove\n * @param {OO.ui.CardLayout[]} cards Removed cards\n */\n\n/* Methods */\n\n/**\n * Handle stack layout focus.\n *\n * @private\n * @param {jQuery.Event} e Focusin event\n */\nOO.ui.IndexLayout.prototype.onStackLayoutFocus = function ( e ) {\n\tvar name, $target;\n\n\t// Find the card that an element was focused within\n\t$target = $( e.target ).closest( '.oo-ui-cardLayout' );\n\tfor ( name in this.cards ) {\n\t\t// Check for card match, exclude current card to find only card changes\n\t\tif ( this.cards[ name ].$element[ 0 ] === $target[ 0 ] && name !== this.currentCardName ) {\n\t\t\tthis.setCard( name );\n\t\t\tbreak;\n\t\t}\n\t}\n};\n\n/**\n * Handle stack layout set events.\n *\n * @private\n * @param {OO.ui.PanelLayout|null} card The card panel that is now the current panel\n */\nOO.ui.IndexLayout.prototype.onStackLayoutSet = function ( card ) {\n\tvar layout = this;\n\tif ( card ) {\n\t\tcard.scrollElementIntoView( { complete: function () {\n\t\t\tif ( layout.autoFocus ) {\n\t\t\t\tlayout.focus();\n\t\t\t}\n\t\t} } );\n\t}\n};\n\n/**\n * Focus the first input in the current card.\n *\n * If no card is selected, the first selectable card will be selected.\n * If the focus is already in an element on the current card, nothing will happen.\n *\n * @param {number} [itemIndex] A specific item to focus on\n */\nOO.ui.IndexLayout.prototype.focus = function ( itemIndex ) {\n\tvar card,\n\t\titems = this.stackLayout.getItems();\n\n\tif ( itemIndex !== undefined && items[ itemIndex ] ) {\n\t\tcard = items[ itemIndex ];\n\t} else {\n\t\tcard = this.stackLayout.getCurrentItem();\n\t}\n\n\tif ( !card ) {\n\t\tthis.selectFirstSelectableCard();\n\t\tcard = this.stackLayout.getCurrentItem();\n\t}\n\tif ( !card ) {\n\t\treturn;\n\t}\n\t// Only change the focus if is not already in the current page\n\tif ( !OO.ui.contains( card.$element[ 0 ], this.getElementDocument().activeElement, true ) ) {\n\t\tcard.focus();\n\t}\n};\n\n/**\n * Find the first focusable input in the index layout and focus\n * on it.\n */\nOO.ui.IndexLayout.prototype.focusFirstFocusable = function () {\n\tOO.ui.findFocusable( this.stackLayout.$element ).focus();\n};\n\n/**\n * Handle tab widget select events.\n *\n * @private\n * @param {OO.ui.OptionWidget|null} item Selected item\n */\nOO.ui.IndexLayout.prototype.onTabSelectWidgetSelect = function ( item ) {\n\tif ( item ) {\n\t\tthis.setCard( item.getData() );\n\t}\n};\n\n/**\n * Get the card closest to the specified card.\n *\n * @param {OO.ui.CardLayout} card Card to use as a reference point\n * @return {OO.ui.CardLayout|null} Card closest to the specified card\n */\nOO.ui.IndexLayout.prototype.getClosestCard = function ( card ) {\n\tvar next, prev, level,\n\t\tcards = this.stackLayout.getItems(),\n\t\tindex = cards.indexOf( card );\n\n\tif ( index !== -1 ) {\n\t\tnext = cards[ index + 1 ];\n\t\tprev = cards[ index - 1 ];\n\t\t// Prefer adjacent cards at the same level\n\t\tlevel = this.tabSelectWidget.getItemFromData( card.getName() ).getLevel();\n\t\tif (\n\t\t\tprev &&\n\t\t\tlevel === this.tabSelectWidget.getItemFromData( prev.getName() ).getLevel()\n\t\t) {\n\t\t\treturn prev;\n\t\t}\n\t\tif (\n\t\t\tnext &&\n\t\t\tlevel === this.tabSelectWidget.getItemFromData( next.getName() ).getLevel()\n\t\t) {\n\t\t\treturn next;\n\t\t}\n\t}\n\treturn prev || next || null;\n};\n\n/**\n * Get the tabs widget.\n *\n * @return {OO.ui.TabSelectWidget} Tabs widget\n */\nOO.ui.IndexLayout.prototype.getTabs = function () {\n\treturn this.tabSelectWidget;\n};\n\n/**\n * Get a card by its symbolic name.\n *\n * @param {string} name Symbolic name of card\n * @return {OO.ui.CardLayout|undefined} Card, if found\n */\nOO.ui.IndexLayout.prototype.getCard = function ( name ) {\n\treturn this.cards[ name ];\n};\n\n/**\n * Get the current card.\n *\n * @return {OO.ui.CardLayout|undefined} Current card, if found\n */\nOO.ui.IndexLayout.prototype.getCurrentCard = function () {\n\tvar name = this.getCurrentCardName();\n\treturn name ? this.getCard( name ) : undefined;\n};\n\n/**\n * Get the symbolic name of the current card.\n *\n * @return {string|null} Symbolic name of the current card\n */\nOO.ui.IndexLayout.prototype.getCurrentCardName = function () {\n\treturn this.currentCardName;\n};\n\n/**\n * Add cards to the index layout\n *\n * When cards are added with the same names as existing cards, the existing cards will be\n * automatically removed before the new cards are added.\n *\n * @param {OO.ui.CardLayout[]} cards Cards to add\n * @param {number} index Index of the insertion point\n * @fires add\n * @chainable\n */\nOO.ui.IndexLayout.prototype.addCards = function ( cards, index ) {\n\tvar i, len, name, card, item, currentIndex,\n\t\tstackLayoutCards = this.stackLayout.getItems(),\n\t\tremove = [],\n\t\titems = [];\n\n\t// Remove cards with same names\n\tfor ( i = 0, len = cards.length; i < len; i++ ) {\n\t\tcard = cards[ i ];\n\t\tname = card.getName();\n\n\t\tif ( Object.prototype.hasOwnProperty.call( this.cards, name ) ) {\n\t\t\t// Correct the insertion index\n\t\t\tcurrentIndex = stackLayoutCards.indexOf( this.cards[ name ] );\n\t\t\tif ( currentIndex !== -1 && currentIndex + 1 < index ) {\n\t\t\t\tindex--;\n\t\t\t}\n\t\t\tremove.push( this.cards[ name ] );\n\t\t}\n\t}\n\tif ( remove.length ) {\n\t\tthis.removeCards( remove );\n\t}\n\n\t// Add new cards\n\tfor ( i = 0, len = cards.length; i < len; i++ ) {\n\t\tcard = cards[ i ];\n\t\tname = card.getName();\n\t\tthis.cards[ card.getName() ] = card;\n\t\titem = new OO.ui.TabOptionWidget( { data: name } );\n\t\tcard.setTabItem( item );\n\t\titems.push( item );\n\t}\n\n\tif ( items.length ) {\n\t\tthis.tabSelectWidget.addItems( items, index );\n\t\tthis.selectFirstSelectableCard();\n\t}\n\tthis.stackLayout.addItems( cards, index );\n\tthis.emit( 'add', cards, index );\n\n\treturn this;\n};\n\n/**\n * Remove the specified cards from the index layout.\n *\n * To remove all cards from the index, you may wish to use the #clearCards method instead.\n *\n * @param {OO.ui.CardLayout[]} cards An array of cards to remove\n * @fires remove\n * @chainable\n */\nOO.ui.IndexLayout.prototype.removeCards = function ( cards ) {\n\tvar i, len, name, card,\n\t\titems = [];\n\n\tfor ( i = 0, len = cards.length; i < len; i++ ) {\n\t\tcard = cards[ i ];\n\t\tname = card.getName();\n\t\tdelete this.cards[ name ];\n\t\titems.push( this.tabSelectWidget.getItemFromData( name ) );\n\t\tcard.setTabItem( null );\n\t}\n\tif ( items.length ) {\n\t\tthis.tabSelectWidget.removeItems( items );\n\t\tthis.selectFirstSelectableCard();\n\t}\n\tthis.stackLayout.removeItems( cards );\n\tthis.emit( 'remove', cards );\n\n\treturn this;\n};\n\n/**\n * Clear all cards from the index layout.\n *\n * To remove only a subset of cards from the index, use the #removeCards method.\n *\n * @fires remove\n * @chainable\n */\nOO.ui.IndexLayout.prototype.clearCards = function () {\n\tvar i, len,\n\t\tcards = this.stackLayout.getItems();\n\n\tthis.cards = {};\n\tthis.currentCardName = null;\n\tthis.tabSelectWidget.clearItems();\n\tfor ( i = 0, len = cards.length; i < len; i++ ) {\n\t\tcards[ i ].setTabItem( null );\n\t}\n\tthis.stackLayout.clearItems();\n\n\tthis.emit( 'remove', cards );\n\n\treturn this;\n};\n\n/**\n * Set the current card by symbolic name.\n *\n * @fires set\n * @param {string} name Symbolic name of card\n */\nOO.ui.IndexLayout.prototype.setCard = function ( name ) {\n\tvar selectedItem,\n\t\t$focused,\n\t\tcard = this.cards[ name ],\n\t\tpreviousCard = this.currentCardName && this.cards[ this.currentCardName ];\n\n\tif ( name !== this.currentCardName ) {\n\t\tselectedItem = this.tabSelectWidget.getSelectedItem();\n\t\tif ( selectedItem && selectedItem.getData() !== name ) {\n\t\t\tthis.tabSelectWidget.selectItemByData( name );\n\t\t}\n\t\tif ( card ) {\n\t\t\tif ( previousCard ) {\n\t\t\t\tpreviousCard.setActive( false );\n\t\t\t\t// Blur anything focused if the next card doesn't have anything focusable.\n\t\t\t\t// This is not needed if the next card has something focusable (because once it is focused\n\t\t\t\t// this blur happens automatically). If the layout is non-continuous, this check is\n\t\t\t\t// meaningless because the next card is not visible yet and thus can't hold focus.\n\t\t\t\tif (\n\t\t\t\t\tthis.autoFocus &&\n\t\t\t\t\tthis.stackLayout.continuous &&\n\t\t\t\t\tOO.ui.findFocusable( card.$element ).length !== 0\n\t\t\t\t) {\n\t\t\t\t\t$focused = previousCard.$element.find( ':focus' );\n\t\t\t\t\tif ( $focused.length ) {\n\t\t\t\t\t\t$focused[ 0 ].blur();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentCardName = name;\n\t\t\tcard.setActive( true );\n\t\t\tthis.stackLayout.setItem( card );\n\t\t\tif ( !this.stackLayout.continuous && previousCard ) {\n\t\t\t\t// This should not be necessary, since any inputs on the previous card should have been\n\t\t\t\t// blurred when it was hidden, but browsers are not very consistent about this.\n\t\t\t\t$focused = previousCard.$element.find( ':focus' );\n\t\t\t\tif ( $focused.length ) {\n\t\t\t\t\t$focused[ 0 ].blur();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.emit( 'set', card );\n\t\t}\n\t}\n};\n\n/**\n * Select the first selectable card.\n *\n * @chainable\n */\nOO.ui.IndexLayout.prototype.selectFirstSelectableCard = function () {\n\tif ( !this.tabSelectWidget.getSelectedItem() ) {\n\t\tthis.tabSelectWidget.selectItem( this.tabSelectWidget.getFirstSelectableItem() );\n\t}\n\n\treturn this;\n};\n\n/**\n * ToggleWidget implements basic behavior of widgets with an on/off state.\n * Please see OO.ui.ToggleButtonWidget and OO.ui.ToggleSwitchWidget for examples.\n *\n * @abstract\n * @class\n * @extends OO.ui.Widget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [value=false] The toggle’s initial on/off state.\n * By default, the toggle is in the 'off' state.\n */\nOO.ui.ToggleWidget = function OoUiToggleWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.ToggleWidget.parent.call( this, config );\n\n\t// Properties\n\tthis.value = null;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-toggleWidget' );\n\tthis.setValue( !!config.value );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ToggleWidget, OO.ui.Widget );\n\n/* Events */\n\n/**\n * @event change\n *\n * A change event is emitted when the on/off state of the toggle changes.\n *\n * @param {boolean} value Value representing the new state of the toggle\n */\n\n/* Methods */\n\n/**\n * Get the value representing the toggle’s state.\n *\n * @return {boolean} The on/off state of the toggle\n */\nOO.ui.ToggleWidget.prototype.getValue = function () {\n\treturn this.value;\n};\n\n/**\n * Set the state of the toggle: `true` for 'on', `false' for 'off'.\n *\n * @param {boolean} value The state of the toggle\n * @fires change\n * @chainable\n */\nOO.ui.ToggleWidget.prototype.setValue = function ( value ) {\n\tvalue = !!value;\n\tif ( this.value !== value ) {\n\t\tthis.value = value;\n\t\tthis.emit( 'change', value );\n\t\tthis.$element.toggleClass( 'oo-ui-toggleWidget-on', value );\n\t\tthis.$element.toggleClass( 'oo-ui-toggleWidget-off', !value );\n\t\tthis.$element.attr( 'aria-checked', value.toString() );\n\t}\n\treturn this;\n};\n\n/**\n * ToggleButtons are buttons that have a state (‘on’ or ‘off’) that is represented by a\n * Boolean value. Like other {@link OO.ui.ButtonWidget buttons}, toggle buttons can be\n * configured with {@link OO.ui.mixin.IconElement icons}, {@link OO.ui.mixin.IndicatorElement indicators},\n * {@link OO.ui.mixin.TitledElement titles}, {@link OO.ui.mixin.FlaggedElement styling flags},\n * and {@link OO.ui.mixin.LabelElement labels}. Please see\n * the [OOjs UI documentation][1] on MediaWiki for more information.\n *\n * @example\n * // Toggle buttons in the 'off' and 'on' state.\n * var toggleButton1 = new OO.ui.ToggleButtonWidget( {\n * label: 'Toggle Button off'\n * } );\n * var toggleButton2 = new OO.ui.ToggleButtonWidget( {\n * label: 'Toggle Button on',\n * value: true\n * } );\n * // Append the buttons to the DOM.\n * $( 'body' ).append( toggleButton1.$element, toggleButton2.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Buttons_and_Switches#Toggle_buttons\n *\n * @class\n * @extends OO.ui.ToggleWidget\n * @mixins OO.ui.mixin.ButtonElement\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.IndicatorElement\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.TitledElement\n * @mixins OO.ui.mixin.FlaggedElement\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [value=false] The toggle button’s initial on/off\n * state. By default, the button is in the 'off' state.\n */\nOO.ui.ToggleButtonWidget = function OoUiToggleButtonWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.ToggleButtonWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.ButtonElement.call( this, config );\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.IndicatorElement.call( this, config );\n\tOO.ui.mixin.LabelElement.call( this, config );\n\tOO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$button } ) );\n\tOO.ui.mixin.FlaggedElement.call( this, config );\n\tOO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$button } ) );\n\n\t// Events\n\tthis.connect( this, { click: 'onAction' } );\n\n\t// Initialization\n\tthis.$button.append( this.$icon, this.$label, this.$indicator );\n\tthis.$element\n\t\t.addClass( 'oo-ui-toggleButtonWidget' )\n\t\t.append( this.$button );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ToggleButtonWidget, OO.ui.ToggleWidget );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.ButtonElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.IndicatorElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.TitledElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.FlaggedElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.TabIndexedElement );\n\n/* Methods */\n\n/**\n * Handle the button action being triggered.\n *\n * @private\n */\nOO.ui.ToggleButtonWidget.prototype.onAction = function () {\n\tthis.setValue( !this.value );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {\n\tvalue = !!value;\n\tif ( value !== this.value ) {\n\t\t// Might be called from parent constructor before ButtonElement constructor\n\t\tif ( this.$button ) {\n\t\t\tthis.$button.attr( 'aria-pressed', value.toString() );\n\t\t}\n\t\tthis.setActive( value );\n\t}\n\n\t// Parent method\n\tOO.ui.ToggleButtonWidget.parent.prototype.setValue.call( this, value );\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ToggleButtonWidget.prototype.setButtonElement = function ( $button ) {\n\tif ( this.$button ) {\n\t\tthis.$button.removeAttr( 'aria-pressed' );\n\t}\n\tOO.ui.mixin.ButtonElement.prototype.setButtonElement.call( this, $button );\n\tthis.$button.attr( 'aria-pressed', this.value.toString() );\n};\n\n/**\n * ToggleSwitches are switches that slide on and off. Their state is represented by a Boolean\n * value (`true` for ‘on’, and `false` otherwise, the default). The ‘off’ state is represented\n * visually by a slider in the leftmost position.\n *\n * @example\n * // Toggle switches in the 'off' and 'on' position.\n * var toggleSwitch1 = new OO.ui.ToggleSwitchWidget();\n * var toggleSwitch2 = new OO.ui.ToggleSwitchWidget( {\n * value: true\n * } );\n *\n * // Create a FieldsetLayout to layout and label switches\n * var fieldset = new OO.ui.FieldsetLayout( {\n * label: 'Toggle switches'\n * } );\n * fieldset.addItems( [\n * new OO.ui.FieldLayout( toggleSwitch1, { label: 'Off', align: 'top' } ),\n * new OO.ui.FieldLayout( toggleSwitch2, { label: 'On', align: 'top' } )\n * ] );\n * $( 'body' ).append( fieldset.$element );\n *\n * @class\n * @extends OO.ui.ToggleWidget\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [value=false] The toggle switch’s initial on/off state.\n * By default, the toggle switch is in the 'off' position.\n */\nOO.ui.ToggleSwitchWidget = function OoUiToggleSwitchWidget( config ) {\n\t// Parent constructor\n\tOO.ui.ToggleSwitchWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.TabIndexedElement.call( this, config );\n\n\t// Properties\n\tthis.dragging = false;\n\tthis.dragStart = null;\n\tthis.sliding = false;\n\tthis.$glow = $( '' );\n\tthis.$grip = $( '' );\n\n\t// Events\n\tthis.$element.on( {\n\t\tclick: this.onClick.bind( this ),\n\t\tkeypress: this.onKeyPress.bind( this )\n\t} );\n\n\t// Initialization\n\tthis.$glow.addClass( 'oo-ui-toggleSwitchWidget-glow' );\n\tthis.$grip.addClass( 'oo-ui-toggleSwitchWidget-grip' );\n\tthis.$element\n\t\t.addClass( 'oo-ui-toggleSwitchWidget' )\n\t\t.attr( 'role', 'checkbox' )\n\t\t.append( this.$glow, this.$grip );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ToggleSwitchWidget, OO.ui.ToggleWidget );\nOO.mixinClass( OO.ui.ToggleSwitchWidget, OO.ui.mixin.TabIndexedElement );\n\n/* Methods */\n\n/**\n * Handle mouse click events.\n *\n * @private\n * @param {jQuery.Event} e Mouse click event\n */\nOO.ui.ToggleSwitchWidget.prototype.onClick = function ( e ) {\n\tif ( !this.isDisabled() && e.which === OO.ui.MouseButtons.LEFT ) {\n\t\tthis.setValue( !this.value );\n\t}\n\treturn false;\n};\n\n/**\n * Handle key press events.\n *\n * @private\n * @param {jQuery.Event} e Key press event\n */\nOO.ui.ToggleSwitchWidget.prototype.onKeyPress = function ( e ) {\n\tif ( !this.isDisabled() && ( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) ) {\n\t\tthis.setValue( !this.value );\n\t\treturn false;\n\t}\n};\n\n/**\n * OutlineControlsWidget is a set of controls for an {@link OO.ui.OutlineSelectWidget outline select widget}.\n * Controls include moving items up and down, removing items, and adding different kinds of items.\n *\n * **Currently, this class is only used by {@link OO.ui.BookletLayout booklet layouts}.**\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.GroupElement\n * @mixins OO.ui.mixin.IconElement\n *\n * @constructor\n * @param {OO.ui.OutlineSelectWidget} outline Outline to control\n * @param {Object} [config] Configuration options\n * @cfg {Object} [abilities] List of abilties\n * @cfg {boolean} [abilities.move=true] Allow moving movable items\n * @cfg {boolean} [abilities.remove=true] Allow removing removable items\n */\nOO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( outline ) && config === undefined ) {\n\t\tconfig = outline;\n\t\toutline = config.outline;\n\t}\n\n\t// Configuration initialization\n\tconfig = $.extend( { icon: 'add' }, config );\n\n\t// Parent constructor\n\tOO.ui.OutlineControlsWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, config );\n\tOO.ui.mixin.IconElement.call( this, config );\n\n\t// Properties\n\tthis.outline = outline;\n\tthis.$movers = $( '