{"version":3,"sources":["node_modules/sortablejs/modular/sortable.esm.js","src/utils/sortable-drag.ts"],"names":["ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread2","target","i","arguments","length","source","forEach","key","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_typeof","obj","Symbol","iterator","constructor","prototype","value","configurable","writable","_extends","assign","hasOwnProperty","call","this","_objectWithoutPropertiesLoose","excluded","sourceKeys","indexOf","_objectWithoutProperties","sourceSymbolKeys","propertyIsEnumerable","_toConsumableArray","arr","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","Array","isArray","_arrayLikeToArray","iter","from","o","minLen","n","toString","slice","name","test","len","arr2","TypeError","version","userAgent","pattern","window","navigator","match","IE11OrLess","Edge","FireFox","Safari","IOS","ChromeForAndroid","captureMode","capture","passive","on","el","event","fn","addEventListener","off","removeEventListener","matches","selector","substring","msMatchesSelector","webkitMatchesSelector","_","getParentOrHost","host","document","nodeType","parentNode","closest","ctx","includeCTX","R_SPACE","toggleClass","state","classList","className","replace","css","prop","val","style","defaultView","getComputedStyle","currentStyle","matrix","selfOnly","appliedTransforms","transform","matrixFn","DOMMatrix","WebKitCSSMatrix","CSSMatrix","MSCSSMatrix","find","tagName","list","getElementsByTagName","getWindowScrollingElement","scrollingElement","documentElement","getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","container","getBoundingClientRect","elRect","top","left","bottom","right","height","width","innerHeight","innerWidth","containerRect","parseInt","elMatrix","scaleX","a","scaleY","d","isScrolledPast","elSide","parentSide","parent","getParentAutoScrollElement","elSideVal","parentSideVal","visible","getChild","childNum","options","includeDragEl","currentChild","children","display","Sortable","ghost","dragged","draggable","lastChild","last","lastElementChild","previousElementSibling","index","nodeName","toUpperCase","clone","getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","scrollLeft","scrollTop","indexOfObject","Number","includeSelf","elem","gotSelf","clientWidth","scrollWidth","clientHeight","scrollHeight","elemCSS","overflowX","overflowY","body","extend","dst","src","isRectEqual","rect1","rect2","Math","round","_throttleTimeout","throttle","callback","ms","args","_this","setTimeout","cancelThrottle","clearTimeout","scrollBy","x","y","Polymer","$","jQuery","Zepto","dom","cloneNode","setRect","rect","unsetRect","expando","Date","getTime","AnimationStateManager","animationStates","animationCallbackId","captureAnimationState","animation","child","fromRect","thisAnimationDuration","childMatrix","f","e","addAnimationState","removeAnimationState","splice","animateAll","animating","animationTime","time","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","calculateRealTime","animate","max","animationResetTimer","currentRect","duration","translateX","translateY","animatingX","animatingY","forRepaintDummy","repaint","easing","animated","offsetWidth","sqrt","pow","plugins","defaults","initializeByDefault","PluginManager","mount","plugin","option","p","pluginName","concat","pluginEvent","eventName","sortable","evt","eventCanceled","cancel","eventNameGlobal","initializePlugins","initialized","modified","modifyOption","getEventProperties","eventProperties","modifiedValue","optionListeners","dispatchEvent","_ref","rootEl","targetEl","cloneEl","toEl","fromEl","oldIndex","newIndex","oldDraggableIndex","newDraggableIndex","originalEvent","putSortable","extraEventProperties","onName","charAt","substr","CustomEvent","bubbles","cancelable","createEvent","initEvent","to","item","pullMode","lastPutMode","undefined","allEventProperties","_excluded","data","bind","dragEl","parentEl","ghostEl","nextEl","lastDownEl","cloneHidden","dragStarted","moved","activeSortable","active","hideGhostForTarget","_hideGhostForTarget","unhideGhostForTarget","_unhideGhostForTarget","cloneNowHidden","cloneNowShown","dispatchSortableEvent","_dispatchEvent","info","activeGroup","awaitingDragStarted","ignoreNextClick","sortables","tapEvt","touchEvt","lastDx","lastDy","tapDistanceLeft","tapDistanceTop","lastTarget","lastDirection","pastFirstInvertThresh","isCircumstantialInvert","targetMoveDistance","ghostRelativeParent","ghostRelativeParentInitialScroll","_silent","savedInputChecked","documentExists","PositionGhostAbsolutely","CSSFloatProperty","supportDraggable","createElement","supportCssPointerEvents","cssText","pointerEvents","_detectDirection","elCSS","elWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","marginLeft","marginRight","secondChildWidth","flexDirection","gridTemplateColumns","split","touchingSideChild2","clear","_dragElInRowColumn","dragRect","targetRect","vertical","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","_detectNearestEmptySortable","ret","some","threshold","emptyInsertThreshold","insideHorizontally","insideVertically","_prepareGroup","toFn","pull","sameGroup","group","otherGroup","join","originalGroup","checkPull","checkPut","put","revertClone","preventDefault","stopPropagation","stopImmediatePropagation","nearestEmptyInsertDetectEvent","touches","nearest","clientX","clientY","_onDragOver","_checkOutsideTargetEl","_isOutsideThisEl","sort","disabled","store","handle","swapThreshold","invertSwap","invertedSwapThreshold","removeCloneOnHide","direction","ghostClass","chosenClass","dragClass","ignore","preventOnFilter","setData","dataTransfer","textContent","dropBubble","dragoverBubble","dataIdAttr","delay","delayOnTouchOnly","touchStartThreshold","devicePixelRatio","forceFallback","fallbackClass","fallbackOnBody","fallbackTolerance","fallbackOffset","supportPointer","nativeDraggable","_onTapStart","get","contains","_getDirection","type","touch","pointerType","originalTarget","shadowRoot","path","composedPath","_saveInputCheckedState","button","isContentEditable","criteria","trim","_prepareDragStart","ownerDocument","dragStartFn","nextSibling","_lastX","_lastY","_onDrop","_disableDelayedDragEvents","_triggerDragStart","_disableDraggable","_disableDelayedDrag","_delayedDragTouchMoveHandler","_dragStartTimer","abs","floor","_onTouchMove","_onDragStart","selection","_nextTick","empty","getSelection","removeAllRanges","err","_dragStarted","fallback","_appendGhost","_nulling","_emulateDragOver","elementFromPoint","inserted","ghostMatrix","relativeScrollOffset","dx","dy","b","c","cssMatrix","appendChild","removeAttribute","_hideClone","cloneId","insertBefore","_loopId","setInterval","effectAllowed","_dragStartId","revert","isOwner","canSort","fromSortable","completedFired","dragOverEvent","extra","axis","completed","onMove","after","_onMove","changed","insertion","_showClone","_ignoreWhileAnimating","elLastChild","_ghostIsLast","_ghostIsFirst","firstChild","targetBeforeFirstSwap","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","_getSwapDirection","sibling","dragIndex","nextElementSibling","moveVector","_unsilent","_offMoveEvents","_offUpEvents","clearInterval","_cancelNextTick","removeChild","save","checked","handleEvent","_globalDragOver","toArray","order","getAttribute","_generateId","useAnimation","items","id","set","closest$1","destroy","querySelectorAll","dropEffect","willInsertAfter","onMoveFn","retVal","draggedRect","related","relatedRect","spacer","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","_getInsertDirection","str","href","sum","charCodeAt","root","inputs","idx","utils","is","nextTick","cancelNextTick","detectDirection","element","_len","_key","create","autoScrolls","scrollEl","scrollRootEl","scrolling","lastAutoScrollX","lastAutoScrollY","touchEvt$1","pointerElemChangedInterval","AutoScrollPlugin","AutoScroll","scroll","forceAutoScrollFallback","scrollSensitivity","scrollSpeed","bubbleScroll","_handleAutoScroll","_handleFallbackAutoScroll","dragOverCompleted","_ref2","dragOverBubble","drop","clearPointerElemChangedInterval","clearAutoScrolls","nulling","autoScroll","ogElemScroller","newElem","pid","isFallback","sens","speed","scrollThisInstance","scrollCustomFn","scrollFn","layersOut","currentParent","canScrollX","canScrollY","scrollPosX","scrollPosY","vx","vy","layer","scrollOffsetY","scrollOffsetX","toSortable","changedTouches","onSpill","Revert","startIndex","dragStart","_ref3","Remove","_ref4","parentSortable","lastSwapEl","SwapPlugin","Swap","swapClass","dragOverValid","swap","prevSwapEl","swapNodes","swapItem","n1","n2","p1","p2","i1","i2","isEqualNode","multiDragElements","multiDragClones","lastMultiDragSelect","multiDragSortable","initialFolding","folding","dragEl$1","clonesFromRect","clonesHidden","MultiDragPlugin","MultiDrag","avoidImplicitDeselect","_deselectMultiDrag","_checkKeyDown","_checkKeyUp","selectedClass","multiDragKey","multiDragElement","multiDragKeyDown","isMultiDrag","delayStartGlobal","delayEnded","setupClone","sortableIndex","insertMultiDragClones","showClone","hideClone","_ref5","dragStartGlobal","_ref6","multiDrag","_ref7","_this2","removeMultiDragElements","dragOver","_ref8","_ref9","insertMultiDragElements","_ref10","dragRectAbsolute","clonesHiddenBefore","dragOverAnimationCapture","_ref11","dragMatrix","dragOverAnimationComplete","_ref12","shiftKey","lastIndex","currentIndex","multiDragIndex","update","nullingGlobal","destroyGlobal","shift","select","deselect","_this3","oldIndicies","newIndicies","clones","toLowerCase","clonesInserted","elementsInserted","createSortableDrag","defaultOptions","DURATION_SHORT_3","config"],"mappings":"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","sourcesContent":["/**!\n * Sortable 1.15.0\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.15.0\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\n\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\n\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\n\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\n\nfunction matches(\n/**HTMLElement*/\nel,\n/**String*/\nselector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n\n return false;\n}\n\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\n\nfunction closest(\n/**HTMLElement*/\nel,\n/**String*/\nselector,\n/**HTMLElement*/\nctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n\n return null;\n}\n\nvar R_SPACE = /\\s+/g;\n\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\n\nfunction css(el, prop, val) {\n var style = el && el.style;\n\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\n\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n\n } while (!selfOnly && (el = el.parentNode));\n }\n\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n\n return matrixFn && new matrixFn(appliedTransforms);\n}\n\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n\n return list;\n }\n\n return [];\n}\n\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n/**\n * Returns the \"bounding client rect\" of given element\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\n * @param {[HTMLElement]} container The parent the element will be placed in\n * @return {Object} The boundingClientRect of el, with specified adjustments\n */\n\n\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container\n\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n\n } while (container = container.parentNode);\n }\n }\n\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n/**\n * Checks if a side of an element is scrolled past a side of its parents\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\n */\n\n\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n /* jshint boss:true */\n\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n\n return false;\n}\n/**\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\n * and non-draggable elements\n * @param {HTMLElement} el The parent element\n * @param {Number} childNum The index of the child\n * @param {Object} options Parent Sortable's options\n * @return {HTMLElement} The child at index childNum, or null if not found\n */\n\n\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n\n currentChild++;\n }\n\n i++;\n }\n\n return null;\n}\n/**\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\n * @param {HTMLElement} el Parent element\n * @param {selector} selector Any other elements that should be ignored\n * @return {HTMLElement} The last child, ignoring ghostEl\n */\n\n\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n\n return last || null;\n}\n/**\n * Returns the index of an element within its parent for a selected set of\n * elements\n * @param {HTMLElement} el\n * @param {selector} selector\n * @return {number}\n */\n\n\nfunction index(el, selector) {\n var index = 0;\n\n if (!el || !el.parentNode) {\n return -1;\n }\n /* jshint boss:true */\n\n\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n\n return index;\n}\n/**\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\n * The value is returned in real pixels.\n * @param {HTMLElement} el\n * @return {Array} Offsets in the format of [left, top]\n */\n\n\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n\n return [offsetLeft, offsetTop];\n}\n/**\n * Returns the index of the object within the given array\n * @param {Array} arr Array that may or may not hold the object\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\n * @return {Number} The index of the object in the array, or -1\n */\n\n\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n\n return -1;\n}\n\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n\n } while (elem = elem.parentNode);\n\n return getWindowScrollingElement();\n}\n\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n\n return dst;\n}\n\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\n\nvar _throttleTimeout;\n\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\n\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\n\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\n\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\n\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\n\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\n\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation\n\n\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n\n target.toRect = toRect;\n\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n } // if fromRect != toRect: animate\n\n\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n\n if (!time) {\n time = _this.options.animation;\n }\n\n _this.animate(target, animatingRect, toRect, time);\n }\n\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\n\nfunction repaint(target) {\n return target.offsetWidth;\n}\n\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n\n this.eventCanceled = false;\n\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable\n\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n } // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n\n\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized; // Add default options from plugin\n\n _extends(defaults, initialized.defaults);\n });\n\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature\n\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\n\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\n\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\n\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\nghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n_silent = false,\n savedInputChecked = [];\n/** @const */\n\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\nsupportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return; // false when <= IE11\n\n if (IE11OrLess) {\n return false;\n }\n\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n}(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n},\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n},\n\n/**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n},\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n\n var group = {};\n var originalGroup = options.group;\n\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n},\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n},\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n}; // #1184 fix - Prevent click event on fallback if dragged but item not changed position\n\n\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\n\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n\n if (nearest) {\n // Create imitation event\n var event = {};\n\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n\n nearest[expando]._onDragOver(event);\n }\n }\n};\n\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\n\n\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n\n this.el = el; // root element\n\n this.options = options = _extends({}, options); // Export instance\n\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults); // Set default options\n\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n\n _prepareGroup(options); // Bind all private methods\n\n\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n } // Setup drag mode\n\n\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n } // Bind events\n\n\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n\n sortables.push(this.el); // Restore sorting\n\n options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager\n\n _extends(this, AnimationStateManager());\n}\n\nSortable.prototype =\n/** @lends Sortable.prototype */\n{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart(\n /** Event|TouchEvent */\n evt) {\n if (!evt.cancelable) return;\n\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n\n _saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n\n\n if (dragEl) {\n return;\n }\n\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n } // cancel dnd if original target is content editable\n\n\n if (originalTarget.isContentEditable) {\n return;\n } // Safari ignores further event handling after mousedown\n\n\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n\n target = closest(target, options.draggable, el, false);\n\n if (target && target.animated) {\n return;\n }\n\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n } // Get the index of the dragged element within its parent\n\n\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable); // Check filter\n\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n } // Prepare `dragstart`\n\n\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart(\n /** Event */\n evt,\n /** Touch */\n touch,\n /** HTMLElement */\n target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n\n if (Sortable.eventCanceled) {\n _this._onDrop();\n\n return;\n } // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n\n\n _this._disableDelayedDragEvents();\n\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n } // Bind the events: dragstart/dragend\n\n\n _this._triggerDragStart(evt, touch); // Drag start event\n\n\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n }); // Chosen item\n\n\n toggleClass(dragEl, options.chosenClass, true);\n }; // Disable \"draggable\"\n\n\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox)\n\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n\n pluginEvent('delayStart', this, {\n evt: evt\n }); // Delay is impossible for native DnD in Edge or IE\n\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n\n return;\n } // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n\n\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(\n /** TouchEvent|PointerEvent **/\n e) {\n var touch = e.touches ? e.touches[0] : e;\n\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart(\n /** Event */\n evt,\n /** Touch */\n touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n\n try {\n if (document.selection) {\n // Timeout neccessary for IE9\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n\n awaitingDragStarted = false;\n\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n\n var options = this.options; // Apply effect\n\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost(); // Drag start event\n\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n\n _hideGhostForTarget();\n\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n\n target = parent; // store last element\n }\n /* jshint boss:true */\n while (parent = parent.parentNode);\n }\n\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove(\n /**TouchEvent*/\n evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging\n\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n\n this._onDragStart(evt, true);\n }\n\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options; // Position absolutely\n\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl); // Set transform-origin\n\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart(\n /**Event*/\n evt,\n /**boolean*/\n fallback) {\n var _this = this;\n\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n\n if (Sortable.eventCanceled) {\n this._onDrop();\n\n return;\n }\n\n pluginEvent('setupClone', this);\n\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n\n this._hideClone();\n\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n } // #1143: IFrame support workaround\n\n\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n\n _this._hideClone();\n\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events\n\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n\n on(document, 'drop', _this); // #1276 fix:\n\n css(dragEl, 'transform', 'translateZ(0)');\n }\n\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver(\n /**Event*/\n evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n\n if (_silent) return;\n\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n } // Capture animation state\n\n\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n\n _this.captureAnimationState();\n\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n } // Return invocation when dragEl is inserted (or completed)\n\n\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n } // Animation\n\n\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n } // Null lastTarget if it is not inside a previously swapped element\n\n\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n } // no bubbling and not fallback\n\n\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted\n\n\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n } // Call when dragEl has been inserted\n\n\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n\n ignoreNextClick = false;\n\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n\n if (revert) {\n parentEl = rootEl; // actualization\n\n capture();\n\n this._hideClone();\n\n dragOverEvent('revert');\n\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n\n return completed(true);\n }\n\n var elLastChild = lastChild(el, options.draggable);\n\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n } // if there is a last element, it is the target\n\n\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n\n if (target) {\n targetRect = getRect(target);\n }\n\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n\n if (firstChild === dragEl) {\n return completed(false);\n }\n\n target = firstChild;\n targetRect = getRect(target);\n\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n } // If dragEl is already beside target: Do not insert\n\n\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n } // Undo chrome's scroll adjustment (has no effect on other browsers)\n\n\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n\n parentEl = dragEl.parentNode; // actualization\n // must be done before animation\n\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n\n changed();\n return completed(true);\n }\n }\n\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop(\n /**Event*/\n evt) {\n var el = this.el,\n options = this.options; // Get the index of the dragged element within its parent\n\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode; // Get again after plugin event\n\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n\n if (Sortable.eventCanceled) {\n this._nulling();\n\n return;\n }\n\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n\n _cancelNextTick(this.cloneId);\n\n _cancelNextTick(this._dragStartId); // Unbind events\n\n\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n\n this._offMoveEvents();\n\n this._offUpEvents();\n\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n\n css(dragEl, 'transform', '');\n\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n\n _disableDraggable(dragEl);\n\n dragEl.style['will-change'] = ''; // Remove classes\n // ghostClass is added in dragStarted\n\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n\n toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event\n\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n }); // Remove event\n\n\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n }); // drag from one list and drop into another\n\n\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n }); // Save sorting\n\n\n this.save();\n }\n }\n }\n\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent(\n /**Event*/\n evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n\n break;\n\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n\n _globalDragOver(evt);\n }\n\n break;\n\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n\n for (; i < n; i++) {\n el = children[i];\n\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n\n return order;\n },\n\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n } // Remove draggable attributes\n\n\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n\n this._onDrop();\n\n this._disableDelayedDragEvents();\n\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n\n return;\n }\n\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return; // show clone at dragEl or original position\n\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\n\nfunction _globalDragOver(\n/**Event*/\nevt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n\n evt.cancelable && evt.preventDefault();\n}\n\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal; // Support for new CustomEvent feature\n\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n\n return retVal;\n}\n\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\n\nfunction _unsilent() {\n _silent = false;\n}\n\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var rect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var spacer = 10;\n return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left;\n}\n\nfunction _ghostIsLast(evt, vertical, sortable) {\n var rect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var spacer = 10;\n return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer;\n}\n\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n\n invert = invert || invertSwap;\n\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n\n return 0;\n}\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\n\n\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\n\n\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n\n while (i--) {\n sum += str.charCodeAt(i);\n }\n\n return sum.toString(36);\n}\n\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\n\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\n\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n} // Fixed #973:\n\n\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n} // Export utils\n\n\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild\n};\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\n\nSortable.get = function (element) {\n return element[expando];\n};\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\n\n\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\n\n\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n}; // Export\n\n\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\n\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n }; // Bind all private methods\n\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt; // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change\n\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour\n\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\n\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\n\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\n\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn; // New scroll root, set scrollEl\n\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n\n var layersOut = 0;\n var currentParent = scrollEl;\n\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n\n }\n\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\n\nfunction Revert() {}\n\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n\n this.sortable.animateAll();\n\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\n\nfunction Remove() {}\n\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\n\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\n\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\nmultiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\nfolding = false,\n // Folding any other time\ndragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\n\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n\n dataTransfer.setData('Text', data);\n }\n };\n }\n\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n\n sortable._hideClone();\n\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n }); // Sort multi-drag elements\n\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n sortable.captureAnimationState();\n\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n } // Remove all auxiliary multidrag items from el, if sorting enabled\n\n\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n\n initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location\n\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n } // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n\n\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n\n activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden\n\n\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children; // Multi-drag selection\n\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n }); // Modifier activated, select from last to dragEl\n\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n } // Multi-drag drop\n\n\n if (dragStarted && this.isMultiDrag) {\n folding = false; // Do not \"unfold\" after around dragEl if reverted\n\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect; // Prepare unfold animation\n\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n } // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n\n\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n\n multiDragIndex++;\n }); // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n\n if (update) {\n dispatchSortableEvent('update');\n }\n }\n } // Must be done after capturing individual rects (scroll bar)\n\n\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n\n multiDragSortable = toSortable;\n } // Remove clones if necessary\n\n\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return; // Only deselect if selection is in this sortable\n\n if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable\n\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click\n\n if (evt && evt.button !== 0) return;\n\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n\n multiDragSortable = sortable;\n }\n\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n }); // multiDragElements will already be sorted if folding\n\n var newIndex;\n\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n\n return key;\n }\n }\n });\n}\n\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\n\n\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\n\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","import { Sortable, Swap, MultiDrag } from 'sortablejs';\nimport { DURATION_SHORT_3 } from './animations';\n\nexport function createSortableDrag(el: HTMLElement, options?: any): any {\n if (options?.swap) {\n Sortable.mount(new Swap());\n }\n if (options?.multiDrag) {\n Sortable.mount(new MultiDrag());\n }\n const defaultOptions = {\n group: null,\n sort: true,\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: 0,\n disabled: false,\n store: null,\n animation: DURATION_SHORT_3,\n handle: '.sy-drag-handle',\n filter: '.sy-drag-disabled',\n preventOnFilter: true,\n draggable: '.sy-drag-item',\n\n ghostClass: 'sy-drag-ghost',\n chosenClass: 'sy-drag-chosen',\n dragClass: 'sy-drag-dragging',\n\n direction: 'horizontal',\n };\n\n const config = {\n ...defaultOptions,\n ...options,\n };\n\n const sortable = new Sortable(el, config);\n\n return sortable;\n}\n"]}