{"version":3,"file":"kendo.virtuallist.min.js","names":["factory","define","amd","$","undefined$1","kendo","window","ui","Widget","DataBoundWidget","percentageUnitsRegex","LIST_ITEM","TABLE_ITEM","GROUPITEM","SELECTED","FOCUSED","HOVER","CHANGE","CLICK","LISTBOUND","ITEMCHANGE","ACTIVATE","DEACTIVATE","GROUP_ROW_SEL","VIRTUAL_LIST_NS","lastFrom","array","length","toArray","value","Array","isPrimitive","dataItem","appendChild","parent","className","tagName","element","document","createElement","render","data","templates","itemTemplate","template","hasColumns","this","options","columns","altRow","index","item","placeholderTemplate","header","group","html","fixedGroupTemplate","angular","elements","attr","uid","addClass","removeClass","i","currentWidth","width","currentWidthInt","parseInt","widthStyle","test","renderColumns","find","remove","toggleClass","current","selected","newGroup","isLastGroupedItem","groupTemplate","appendTo","append","top","y","style","webkitTransform","transform","position","isActivePromise","promise","state","VirtualList","extend","init","listSize","lineHeight","mockList","that","contentClasses","bound","_fetching","fn","call","itemHeight","css","left","visibility","body","parseFloat","getComputedStyles","height","content","wrapper","wrap","thead","closest","row","TABLE_LIST","before","prev","ariaLabel","ariaLabelledBy","on","_values","_selectedDataItems","_selectedIndexes","_rangesList","_promisesList","_optionID","guid","_templates","setDataSource","dataSource","throttle","_renderItems","_triggerListBound","delay","_selectable","name","autoBind","listScreens","threshold","oppositeBuffer","type","selectable","dataValueField","mapValueTo","valueMapper","events","setOptions","itemClass","_selectProxy","off","refresh","items","_items","destroy","unbind","_refreshHandler","source","isArray","DataSource","create","_clean","_deferValueSet","mute","bind","setDSFilter","filter","view","fetch","skip","currentRangeStart","_selectingValue","_skip","trigger","_getValues","dataItems","getter","_valueGetter","map","_highlightSelectedItems","_getElementByDataItem","e","result","action","isItemChange","filtered","isFiltered","_mute","focus","_createList","skipUpdateOnBind","_emptySearch","done","itemsToMatch","found","j","itemsLength","selectedLength","changed","unchanged","push","mapChangedItems","removeAt","splice","_removeSelectedDataItem","valueGetter","idx","setValue","_forcePrefetch","slice","_valueDeferred","Deferred","select","_prefetchByValue","_checkValuesOrder","_removedAddedIndexes","newValue","dataView","_dataView","forSelection","success","response","mapValueToIndex","mapValueToDataItem","indexes","removed","_deselect","_triggerChange","added","_getIndecies","resolve","deferredRange","take","itemCount","ranges","defs","low","Math","floor","high","ceil","pages","each","_","deferred","end","existingRange","_multiplePrefetch","when","apply","then","prefetch","isEmptyList","_activeDeferred","_getSkip","_findDataItem","_getRange","_findRange","min","total","dataItemByIndex","progress","range","selectedDataItems","scrollWith","scrollTop","scrollTo","scrollToIndex","candidate","id","triggerEvent","flatView","isNaN","_getElementByIndex","_focusedIndex","hasClass","removeAttr","_getElementLocation","_screenHeight","focusIndex","focusFirst","focusLast","lastIndex","heightContainer","offsetHeight","focusPrev","focusNext","indices","initialIndices","isAlreadySelected","singleSelection","prefetchStarted","_selectDeferred","_deselectCurrentValues","_select","_listCreated","callback","_lastDSFilter","Query","compareFilters","skipUpdate","noop","_lastScrollTop","empty","_height","hasData","setScreenHeight","screenHeight","yPosition","yDownPostion","screenEnd","currentColumn","templateText","field","toString","key","_generateItems","count","text","tabIndex","setAttribute","minHeight","_saveInitialRanges","_ranges","start","reorder","get","_buildValueGetter","_setHeight","hide","show","_getter","_onScroll","force","getList","_listItems","_fixedHeader","_whenChanged","_reorderList","list","_calculateGroupPadding","_calculateColumnsHeaderPadding","currentHeight","innerHTML","padHeight","lastRequestedRange","lastRangeStart","pageSize","flatGroups","rangeStart","inRange","flatGroup","groups","len","groupLength","_getterDeferred","reject","firstItemIndex","_indexConstraint","currentVisibleGroup","firstVisibleDataItemIndex","firstVisibleDataItem","firstVisibleGroup","fixedGroupText","_itemMapper","listType","currentIndex","_currentGroup","_range","_view","_getDataItemsCollection","lastScrollTop","_listIndex","theValidator","downThreshold","upThreshold","listValidator","theNew","currentOffset","Infinity","arr1","arr2","ns","list2","offset","range2","diff","abs","unshift","reshift","_bufferSizes","opposite","down","up","max","buffers","_clickHandler","getElementIndex","jQuery","elementIndex","selectedIndex","selectedIndexes","removedindexesCounter","inArray","_deselectSingleItem","children","values","oldSkip","currentTarget","isDefaultPrevented","firstItem","first","groupHeader","padding","display","support","scrollbar","isRtl","columnsHeader","plugin"],"sources":["kendo.virtuallist.js"],"mappings":"CAAA,SAAWA,GACW,mBAAXC,QAAyBA,OAAOC,IAAMD,OAAO,CAAC,kBAAmBD,GACxEA,IAFJ,EAGG,YASC,SAAUG,EAAGC,GACT,IAAIC,EAAQC,OAAOD,MACfE,EAAKF,EAAME,GACXC,EAASD,EAAGC,OACZC,EAAkBF,EAAGE,gBACrBC,EAAuB,kBAIvBC,EAAY,cACZC,EAAa,cAEbC,EAAY,0BAIZC,EAAW,aACXC,EAAU,UACVC,EAAQ,UACRC,EAAS,SACTC,EAAQ,QACRC,EAAY,YACZC,EAAa,aAEbC,EAAW,WACXC,EAAa,aAEbC,EAAgB,qBAEhBC,EAAkB,eAEtB,SAASC,EAASC,GACd,OAAOA,EAAMA,EAAMC,OAAS,GAGhC,SAASC,EAAQC,GACb,OAAOA,aAAiBC,MAAQD,EAAQ,CAACA,GAG7C,SAASE,EAAYC,GACjB,MAA2B,iBAAbA,GAA6C,iBAAbA,GAA6C,kBAAbA,EAOlF,SAASC,EAAYC,EAAQC,EAAWC,GACpC,IAAIC,EAAUC,SAASC,cAAcH,GAAW,OAMhD,OALID,IACAE,EAAQF,UAAYA,GAExBD,EAAOD,YAAYI,GAEZA,EA0FX,SAASG,EAAOH,EAASI,EAAMC,GAC3B,IAAIC,EAAeD,EAAUE,SACzBC,EAAaC,KAAKC,QAAQC,SAAWF,KAAKC,QAAQC,QAAQrB,OAC1DsB,EAASR,EAAKS,MAAQ,GAAM,EAAI,kBAAoB,GAExDb,EAAUlC,EAAEkC,GAEPI,EAAKU,OACNR,EAAeD,EAAUU,qBAGV,IAAfX,EAAKS,OAAeJ,KAAKO,QAAUZ,EAAKa,OACxCR,KAAKO,OAAOE,KAAKb,EAAUc,mBAAmBf,EAAKa,QAGvDR,KAAKW,QAAQ,WAAW,WACpB,MAAO,CAAEC,SAAU,CAAErB,OAGzBA,EACKsB,KAAK,WAAYlB,EAAKU,KAAOV,EAAKU,KAAKS,IAAM,IAC7CD,KAAK,oBAAqBlB,EAAKS,OAEhCL,GAAcJ,EAAKU,MACfF,EAAOtB,OAAS,EAChBU,EAAQwB,SAASZ,GAEjBZ,EAAQyB,YAAY,mBAExBzB,EAAQkB,KAkChB,SAAuBR,EAASf,EAAUU,GAGtC,IAFA,IAAIS,EAAO,GAEFY,EAAI,EAAGA,EAAIhB,EAAQC,QAAQrB,OAAQoC,IAAK,CAC7C,IAAIC,EAAejB,EAAQC,QAAQe,GAAGE,MAClCC,EAAkBC,SAASH,EAAc,IACzCI,EAAa,GAEbJ,IACAI,GAAc,gBACdA,GAAcF,EACdE,GAAc1D,EAAqB2D,KAAKL,GAAgB,IAAM,KAC9DI,GAAc,MAElBjB,GAAQ,4BAA8BiB,EAAa,IACnDjB,GAAQT,EAAU,SAAWqB,GAAG/B,GAChCmB,GAAQ,UAGZ,OAAOA,EArDUmB,CAAcxB,KAAKC,QAASN,EAAKU,KAAMT,MAEpDL,EAAQkC,KAAK,IAAM1D,GAAW2D,SAC9BnC,EAAQkC,KAAK,qBAAqBhB,KAAKZ,EAAaF,EAAKU,MAAQ,MAGrEd,EAAQoC,YAAY1D,EAAS0B,EAAKiC,SAClCrC,EAAQoC,YAAY3D,EAAU2B,EAAKkC,UACnCtC,EAAQoC,YAAY,UAAWhC,EAAKmC,UACpCvC,EAAQoC,YAAY,SAAUhC,EAAKoC,mBACnCxC,EAAQoC,YAAY,kBAAmBhC,EAAKU,MAEzB,IAAfV,EAAKS,OAAeT,EAAKmC,SACrB/B,EACA1C,EAAE,mDAAqDuC,EAAUoC,cAAcrC,EAAKa,OAAS,kBACxFyB,SAAS1C,GAEdlC,EAAE,cAAgBU,EAAY,WACzBkE,SAAS1C,GACTkB,KAAKb,EAAUoC,cAAcrC,EAAKa,QAEpCb,EAAKa,OAAST,GACrBR,EAAQ2C,OAAO7E,EAAE,uDAGjBsC,EAAKwC,MAAQ7E,GApFrB,SAAkBiC,EAAS6C,GACvB7C,EAAQ8C,MAAMC,gBAAkB,cAAgBF,EAAI,MACpD7C,EAAQ8C,MAAME,UAAY,cAAgBH,EAAI,MAmF1CI,CAASjD,EAAQ,GAAII,EAAKwC,KAG9BnC,KAAKW,QAAQ,WAAW,WACpB,MAAO,CAAEC,SAAU,CAAErB,GAAWI,KAAM,CAAE,CAAET,SAAUS,EAAKU,KAAMG,MAAOb,EAAKa,MAAOsB,SAAUnC,EAAKmC,eA6DzG,SAASW,EAAgBC,GACrB,OAAOA,GAA+B,aAApBA,EAAQC,QAG9B,IAAIC,EAAcjF,EAAgBkF,OAAO,CACrCC,KAAM,SAASvD,EAASU,GACpB,IArNsB8C,EAUtBC,EATAC,EAoNIC,EAAOlD,KACPmD,EAAiBlD,EAAQC,SAAWD,EAAQC,QAAQrB,OAxQ5C,gCADD,mCA0RX,GAfAqE,EAAKE,OAAM,GACXF,EAAKG,WAAY,EAEjB3F,EAAO4F,GAAGR,KAAKS,KAAKL,EAAM3D,EAASU,GAE9BiD,EAAKjD,QAAQuD,aACdN,EAAKjD,QAAQuD,YA9NKT,EA8N6B9C,EAAQ8C,UA7N3DE,EAAW5F,EAAE,sBAAwB0F,EAAxB,kLAWRU,IAAI,CACTjB,SAAU,WACVkB,KAAM,YACNC,WAAY,WAEhBV,EAAShB,SAASzC,SAASoE,MAC3BZ,EAAaa,WAAWtG,EAAMuG,kBAAkBb,EAASxB,KAAK,gBAAgB,GAAI,CAAC,WAAWsC,QAC9Fd,EAASvB,SAEFsB,IA4MH/C,EAAUiD,EAAKjD,QAEfiD,EAAK3D,QAAQsB,KAAK,OAAQ,WAE1BqC,EAAKc,QAAUd,EAAKe,QAAUf,EAAK3D,QAAQ2E,KAAK,iCAAmCf,EAAiB,YAAY/D,SAE5G8D,EAAKjD,QAAQC,SAAWgD,EAAKjD,QAAQC,QAAQrB,OAAQ,CACrD,IAAIsF,EAAQjB,EAAK3D,QAAQ6E,QAAQ,iBAAiB3C,KAAK,kBACnD4C,EAAMhH,EAAE,iEAC6B6F,EAAKjD,QAAQC,QAAQrB,OADlD,gBAIZsF,EAAMjC,OAAOmC,GAEbnB,EAAK3C,OAAS8D,EAAI5C,KAAK,eACvByB,EAAK3D,QAAQwB,SAASuD,qCAEtBpB,EAAK3C,OAAS2C,EAAKc,QAAQO,OAAO,kDAAsCC,OACxEtB,EAAK3D,QAAQwB,SA/RX,aAkSFd,EAAQwE,UACRzE,KAAKT,QAAQsB,KAAK,aAAcZ,EAAQwE,WACjCxE,EAAQyE,gBACf1E,KAAKT,QAAQsB,KAAK,kBAAmBZ,EAAQyE,gBAGjDxB,EAAK3D,QAAQoF,GAAG,yBAAgC,2BAA2B,WAAatH,EAAE2C,MAAMe,SAAS7C,MAC5FyG,GAAG,yBAAgC,MAAM,WAAatH,EAAE2C,MAAMgB,YAAY9C,MAEvFgF,EAAK0B,QAAU9F,EAAQoE,EAAKjD,QAAQlB,OACpCmE,EAAK2B,mBAAqB,GAC1B3B,EAAK4B,iBAAmB,GACxB5B,EAAK6B,YAAc,GACnB7B,EAAK8B,cAAgB,GACrB9B,EAAK+B,UAAY1H,EAAM2H,OAEvBhC,EAAKiC,aAELjC,EAAKkC,cAAcnF,EAAQoF,YAE3BnC,EAAKc,QAAQW,GAAG,qBAA4BpH,EAAM+H,UAAS,WACvDpC,EAAKqC,eACLrC,EAAKsC,sBACNvF,EAAQwF,QAEXvC,EAAKwC,eAGTzF,QAAS,CACL0F,KAAM,cACNC,UAAU,EACVH,MAAO,IACP1B,OAAQ,KACR8B,YAAa,EACbC,UAAW,GACXtC,WAAY,KACZuC,eAAgB,EAChBC,KAAM,OACNC,YAAY,EACZlH,MAAO,GACPmH,eAAgB,KAChBpG,SAAU,UACVQ,oBAAqB,aACrB0B,cAAe,UACftB,mBAAoB,UACpByF,WAAY,QACZC,YAAa,KACb3B,UAAW,KACXC,eAAgB,MAGpB2B,OAAQ,CACJlI,EACAC,EACAC,EACAC,EACAC,EACAC,GAGJ8H,WAAY,SAASrG,GACjB,IAAIsG,EAAYvG,KAAKC,QAAQC,SAAWF,KAAKC,QAAQC,QAAQrB,OAASf,EAAaD,EAEnFH,EAAO4F,GAAGgD,WAAW/C,KAAKvD,KAAMC,GAE5BD,KAAKwG,eAA4C,IAA5BxG,KAAKC,QAAQgG,WAClCjG,KAAKT,QAAQkH,IAAIrI,EAAO,IAAMmI,EAAWvG,KAAKwG,eACtCxG,KAAKwG,cAAgBxG,KAAKC,QAAQgG,YAC1CjG,KAAK0F,cAGT1F,KAAKmF,aACLnF,KAAK0G,WAGTC,MAAO,WACH,OAAOtJ,EAAE2C,KAAK4G,SAGlBC,QAAS,WACL7G,KAAKiE,QAAQwC,IAAI/H,GACjBsB,KAAKqF,WAAWyB,OAAO3I,EAAQ6B,KAAK+G,iBACpCrJ,EAAO4F,GAAGuD,QAAQtD,KAAKvD,OAG3BoF,cAAe,SAAS4B,GACpB,IAEIjI,EAFAmE,EAAOlD,KACPqF,EAAa2B,GAAU,GAG3B3B,EAAarG,MAAMiI,QAAQ5B,GAAc,CAAE1F,KAAM0F,GAAeA,EAChEA,EAAa9H,EAAMoC,KAAKuH,WAAWC,OAAO9B,GAEtCnC,EAAKmC,YACLnC,EAAKmC,WAAWyB,OAAO3I,EAAQ+E,EAAK6D,iBAEpC7D,EAAKkE,SACLlE,EAAKE,OAAM,GAEXF,EAAKmE,gBAAiB,EACtBtI,EAAQmE,EAAKnE,QAEbmE,EAAKnE,MAAM,IACXmE,EAAKoE,MAAK,WACNpE,EAAKnE,MAAMA,OAGfmE,EAAK6D,gBAAkB7D,EAAKwD,QAAQa,KAAKrE,GAG7CA,EAAKmC,WAAaA,EAAWkC,KAAKpJ,EAAQ+E,EAAK6D,iBAE/C7D,EAAKsE,YAAYnC,EAAWoC,UAEK,IAA7BpC,EAAWqC,OAAO7I,OAClBqE,EAAKwD,UACExD,EAAKjD,QAAQ2F,UACpBP,EAAWsC,SAInBC,KAAM,WACF,OAAO5H,KAAKqF,WAAWwC,qBAG3BrC,kBAAmB,WACf,IAAItC,EAAOlD,KACP4H,EAAO1E,EAAK0E,OAEZ1E,EAAKE,UAAYF,EAAK4E,iBAAmB5E,EAAK6E,QAAUH,IACxD1E,EAAK6E,MAAQH,EACb1E,EAAK8E,QAAQ3J,KAIrB4J,WAAY,SAASC,GACjB,IAAIC,EAASnI,KAAKoI,aAElB,OAAO/K,EAAEgL,IAAIH,GAAW,SAAShJ,GAC7B,OAAOiJ,EAAOjJ,OAItBoJ,wBAAyB,WACrB,IAAK,IAAIrH,EAAI,EAAGA,EAAIjB,KAAK6E,mBAAmBhG,OAAQoC,IAAK,CACrD,IAAIZ,EAAOL,KAAKuI,sBAAsBvI,KAAK6E,mBAAmB5D,IAC1DZ,EAAKxB,QACLwB,EAAKU,SAAS/C,KAK1B0I,QAAS,SAAS8B,GACd,IAIIC,EAJAvF,EAAOlD,KACP0I,EAASF,GAAKA,EAAEE,OAChBC,EAA0B,eAAXD,EACfE,EAAW5I,KAAK6I,aAGhB3F,EAAK4F,QAET5F,EAAKmE,gBAAiB,EAEjBnE,EAAKG,WAqBFH,EAAKqC,cACLrC,EAAKqC,cAAa,GAGtBrC,EAAKsC,sBAxBDoD,GACA1F,EAAK6F,MAAM,GAGf7F,EAAK8F,cACAN,IAAUxF,EAAK0B,QAAQ/F,QAAW+J,GACjC1F,EAAKjD,QAAQgJ,kBAAqB/F,EAAKgG,cASzChG,EAAKE,OAAM,GACXF,EAAKoF,0BACLpF,EAAKsC,sBAVLtC,EAAK4E,iBAAkB,EAEvB5E,EAAKE,OAAM,GACXF,EAAKnE,MAAMmE,EAAK0B,SAAS,GAAMuE,MAAK,WAChCjG,EAAK4E,iBAAkB,EACvB5E,EAAKsC,0BAebmD,GAA2B,WAAXD,KAChBD,EA1QZ,SAAyB5G,EAAUuH,GAC/B,IAEIlK,EACAmK,EACApI,EAAGqI,EAJHC,EAAcH,EAAavK,OAC3B2K,EAAiB3H,EAAShD,OAK1B4K,EAAU,GACVC,EAAY,GAEhB,GAAIF,EACA,IAAKvI,EAAI,EAAGA,EAAIuI,EAAgBvI,IAAK,CAIjC,IAHA/B,EAAW2C,EAASZ,GACpBoI,GAAQ,EAEHC,EAAI,EAAGA,EAAIC,EAAaD,IACzB,GAAIpK,IAAakK,EAAaE,GAAI,CAC9BD,GAAQ,EACRI,EAAQE,KAAK,CAAEvJ,MAAOa,EAAGZ,KAAMnB,IAC/B,MAIHmK,GACDK,EAAUC,KAAKzK,GAK3B,MAAO,CACHuK,QAASA,EACTC,UAAWA,GA2OEE,CAAgB1G,EAAK2B,mBAAoB2D,EAAE7B,QACzC8C,QAAQ5K,SACX8J,EACAzF,EAAK8E,QAAQ,qBAAsB,CAC/BrB,MAAO8B,EAAOgB,UAGlBvG,EAAKnE,MAAMmE,EAAK+E,WAAWQ,EAAOiB,aAK9CxG,EAAKG,WAAY,IAGrBwG,SAAU,SAASrH,GACf,IAAIzD,EAAQiB,KAAK4E,QAAQkF,OAAOtH,EAAU,GAAG,GAE7C,MAAO,CACHA,SAAUA,EACVtD,SAAUc,KAAK+J,wBAAwBhL,KAI/CgL,wBAAyB,SAAShL,GAC9B,IAAImE,EAAOlD,KACPgK,EAAc9G,EAAKkF,aAEvB,IAAK,IAAI6B,KAAO/G,EAAK2B,mBACjB,GAAImF,EAAY9G,EAAK2B,mBAAmBoF,MAAUlL,EAE9C,OADAmE,EAAK4B,iBAAiBgF,OAAOG,EAAK,GAC3B/G,EAAK2B,mBAAmBiF,OAAOG,EAAK,GAAG,IAK1DC,SAAU,SAASnL,GACfiB,KAAK4E,QAAU9F,EAAQC,IAG3BA,MAAO,SAASA,EAAOoL,GACnB,IAAIjH,EAAOlD,KAEX,OAAIjB,IAAUzB,EACH4F,EAAK0B,QAAQwF,SAGV,OAAVrL,IACAA,EAAQ,IAGZA,EAAQD,EAAQC,GAEXmE,EAAKmH,gBAAkD,aAAhCnH,EAAKmH,eAAe1H,UAC5CO,EAAKmH,eAAiBhN,EAAEiN,cAGkB,aAA5BpH,EAAKjD,QAAQgG,YAA6B/C,EAAKqH,SAAS1L,QAAUE,EAAMF,SAEtEE,EAAMF,QACtBqE,EAAKqH,QAAQ,GAGjBrH,EAAK0B,QAAU7F,GAEVmE,EAAKE,UAAYF,EAAK4F,QAAU5F,EAAKmE,gBAAmB8C,IACzDjH,EAAKsH,iBAAiBzL,GAGnBmE,EAAKmH,iBAGhBI,kBAAmB,SAAS1L,GACxB,GAAIiB,KAAK0K,sBACL1K,KAAK0K,qBAAqB7L,SAAWE,EAAMF,OAAQ,CAC/C,IAAI8L,EAAW3K,KAAK0K,qBAAqBN,QAE7C,OADIpK,KAAK0K,qBAAuB,KACzBC,EAGX,OAAO5L,GAGXyL,iBAAkB,SAASzL,GASvB,IARA,IAIIsB,EAJA6C,EAAOlD,KACP4K,EAAW1H,EAAK2H,UAChBb,EAAc9G,EAAKkF,aACnBjC,EAAajD,EAAKjD,QAAQkG,WAE1B2E,EAAe,GAGV7J,EAAI,EAAGA,EAAIlC,EAAMF,OAAQoC,IAC9B,IAAK,IAAIgJ,EAAM,EAAGA,EAAMW,EAAS/L,OAAQoL,KACrC5J,EAAOuK,EAASX,GAAK5J,QAETpB,EAAYoB,GAAQtB,EAAMkC,KAAOZ,EAAOtB,EAAMkC,KAAO+I,EAAY3J,KAGrEyK,EAAanB,KAAKiB,EAASX,GAAK7J,OAMhD,GAAI0K,EAAajM,SAAWE,EAAMF,OAG9B,OAFAqE,EAAK0B,QAAU,QACf1B,EAAKqH,OAAOO,GAKwB,mBAA7B5H,EAAKjD,QAAQmG,YACpBlD,EAAKjD,QAAQmG,YAAY,CACrBrH,MAAoC,aAA5BiB,KAAKC,QAAQgG,WAA6BlH,EAAQA,EAAM,GAChEgM,QAAS,SAASC,GACK,UAAf7E,EACAjD,EAAK+H,gBAAgBD,GACC,aAAf7E,GACPjD,EAAKgI,mBAAmBF,MAK9B9H,EAAKnE,QAAQ,IAGfmE,EAAK4E,iBAAkB,EACvB5E,EAAKsC,qBAHJtC,EAAKqH,OAAO,EAAE,KAQ3BU,gBAAiB,SAASE,GAOtB,IALIA,EADAA,IAAY7N,IAA4B,IAAb6N,GAA8B,OAAZA,EACnC,GAEArM,EAAQqM,IAGTtM,OAEN,CACH,IAAIuM,EAAUpL,KAAKqL,UAAU,IAAID,QAC7BA,EAAQvM,QACRmB,KAAKsL,eAAeF,EAAS,SAJjCD,EAAU,EAAE,GAQhBnL,KAAKuK,OAAOY,IAGhBD,mBAAoB,SAAShD,GACzB,IAAIkD,EAASG,EAQb,IALIrD,EADAA,IAAc5K,GAA6B,OAAd4K,EACjB,GAEApJ,EAAQoJ,IAGTrJ,OAER,CACHuM,EAAU/N,EAAEgL,IAAIrI,KAAK6E,oBAAoB,SAASxE,EAAMD,GACpD,MAAO,CAAEA,MAAOA,EAAOlB,SAAUmB,MAGrCkL,EAAQlO,EAAEgL,IAAIH,GAAW,SAAS7H,EAAMD,GACpC,MAAO,CAAEA,MAAOA,EAAOlB,SAAUmB,MAGrCL,KAAK6E,mBAAqBqD,EAE1BlI,KAAK8E,iBAAmB,GAExB,IAAK,IAAI7D,EAAI,EAAGA,EAAIjB,KAAK6E,mBAAmBhG,OAAQoC,IAAK,CACrD,IAAIZ,EAAOL,KAAKuI,sBAAsBvI,KAAK6E,mBAAmB5D,IAC9DjB,KAAK8E,iBAAiB6E,KAAK3J,KAAKwL,aAAanL,GAAM,IACnDA,EAAKU,SAAS/C,GAGlBgC,KAAKsL,eAAeF,EAASG,GAEzBvL,KAAKqK,gBACLrK,KAAKqK,eAAeoB,eAvBxBzL,KAAKuK,OAAO,EAAE,KA4BtBmB,cAAe,SAAStL,GACpB,IAAIiF,EAAarF,KAAKqF,WAClBsG,EAAO3L,KAAK4L,UACZC,EAAS7L,KAAK+E,YACd0D,EAASpL,EAAEiN,WACXwB,EAAO,GAEPC,EAAMC,KAAKC,MAAM7L,EAAQuL,GAAQA,EACjCO,EAAOF,KAAKG,KAAK/L,EAAQuL,GAAQA,EAEjCS,EAAQF,IAASH,EAAM,CAAEG,GAAS,CAAEH,EAAKG,GAyB7C,OAvBA7O,EAAEgP,KAAKD,GAAO,SAASE,EAAG1E,GACtB,IAEI2E,EAFAC,EAAM5E,EAAO+D,EACbc,EAAgBZ,EAAOjE,GAGtB6E,GAAkBA,EAAcD,MAAQA,EAQzCD,EAAWE,EAAcF,UAPzBA,EAAWlP,EAAEiN,WACbuB,EAAOjE,GAAQ,CAAE4E,IAAKA,EAAKD,SAAUA,GAErClH,EAAWqH,kBAAkB9E,EAAM+D,GAAM,WACrCY,EAASd,cAMjBK,EAAKnC,KAAK4C,MAGdlP,EAAEsP,KAAKC,MAAMvP,EAAGyO,GAAMe,MAAK,WACvBpE,EAAOgD,aAGJhD,GAGXqE,SAAU,SAAS3B,GACf,IAAIjI,EAAOlD,KACP2L,EAAO3L,KAAK4L,UACZmB,GAAe7J,EAAK8B,cAAcnG,OAkBtC,OAhBK4D,EAAgBS,EAAK8J,mBACtB9J,EAAK8J,gBAAkB3P,EAAEiN,WACzBpH,EAAK8B,cAAgB,IAGzB3H,EAAEgP,KAAKlB,GAAS,SAASmB,EAAGlM,GACxB8C,EAAK8B,cAAc2E,KAAKzG,EAAKwI,cAAcxI,EAAK+J,SAAS7M,EAAOuL,QAGhEoB,GACA1P,EAAEsP,KAAKC,MAAMvP,EAAG6F,EAAK8B,eAAemE,MAAK,WACrCjG,EAAK8B,cAAgB,GACrB9B,EAAK8J,gBAAgBvB,aAItBvI,EAAK8J,iBAGhBE,cAAe,SAASxF,EAAMtH,GAC1B,IAAII,EAGJ,GAA0B,UAAtBR,KAAKC,QAAQ+F,KACb,IAAK,IAAI/E,EAAI,EAAGA,EAAIyG,EAAK7I,OAAQoC,IAAK,CAElC,MADAT,EAAQkH,EAAKzG,GAAG0F,OACN9H,QAAUuB,GAGhB,OAAOI,EAAMJ,GAFbA,GAAgBI,EAAM3B,OAQlC,OAAO6I,EAAKtH,IAGhB+M,UAAW,SAASvF,EAAM+D,GACtB,OAAO3L,KAAKqF,WAAW+H,WAAWxF,EAAMoE,KAAKqB,IAAIzF,EAAO+D,EAAM3L,KAAKqF,WAAWiI,WAGlFC,gBAAiB,SAASnN,GACtB,IAAI8C,EAAOlD,KACP2L,EAAOzI,EAAK0I,UACZhE,EAAO1E,EAAK+J,SAAS7M,EAAOuL,GAC5BjE,EAAO1H,KAAKmN,UAAUvF,EAAM+D,GAGhC,OAAKzI,EAAKiK,UAAUvF,EAAM+D,GAAM9M,QAIN,UAAtBqE,EAAKjD,QAAQ+F,OACbzI,EAAME,GAAG+P,SAASnQ,EAAE6F,EAAKe,UAAU,GACnCf,EAAKoE,MAAK,WACNpE,EAAKmC,WAAWoI,MAAM7F,EAAM+D,GAAM,WAC9BpO,EAAME,GAAG+P,SAASnQ,EAAE6F,EAAKe,UAAU,MAEvCyD,EAAOxE,EAAKmC,WAAWqC,WAIxBxE,EAAKgK,cAAcxF,EAAM,CAACtH,EAAQwH,KAb9B,MAgBf8F,kBAAmB,WACf,OAAO1N,KAAK6E,mBAAmBuF,SAGnCuD,WAAY,SAAS5O,GACjBiB,KAAKgE,QAAQ4J,UAAU5N,KAAKgE,QAAQ4J,YAAc7O,IAGtD8O,SAAU,SAASzL,GACfpC,KAAKgE,QAAQ4J,UAAUxL,IAG3B0L,cAAe,SAAS1N,GACpBJ,KAAK6N,SAASzN,EAAQJ,KAAKC,QAAQuD,aAGvCuF,MAAO,SAASgF,GACZ,IAAIxO,EACAa,EACAT,EACAiC,EACA4B,EAAaxD,KAAKC,QAAQuD,WAC1BwK,EAAKhO,KAAKiF,UACVgJ,GAAe,EAEnB,GAAIF,IAAczQ,EAEd,OADAsE,EAAU5B,KAAKT,QAAQkC,KAAK,aACb5C,OAAS+C,EAAU,KAGtC,GAAyB,mBAAdmM,EAA0B,CACjCpO,EAAOK,KAAKqF,WAAW6I,WACvB,IAAK,IAAIjE,EAAM,EAAGA,EAAMtK,EAAKd,OAAQoL,IACjC,GAAI8D,EAAUpO,EAAKsK,IAAO,CACtB8D,EAAY9D,EACZ,OAiBZ,GAZI8D,aAAqB/O,QACrB+O,EAAYpP,EAASoP,IAGrBI,MAAMJ,IACNxO,EAAUlC,EAAE0Q,GACZ3N,EAAQiB,SAAShE,EAAEkC,GAASsB,KAAK,qBAAsB,MAEvDT,EAAQ2N,EACRxO,EAAUS,KAAKoO,mBAAmBhO,KAGvB,IAAXA,EAGA,OAFAJ,KAAKT,QAAQkC,KAAK,YAAeT,YAAY/C,QAC7C+B,KAAKqO,cAAgB/Q,GAIzB,GAAIiC,EAAQV,OAAQ,CACZU,EAAQ+O,SAASrQ,KACjBgQ,GAAe,GAEfjO,KAAKqO,gBAAkB/Q,KACvBsE,EAAU5B,KAAKoO,mBAAmBpO,KAAKqO,gBAElCrN,YAAY/C,GACZsQ,WAAW,MAEZN,GACAjO,KAAKgI,QAAQxJ,IAIrBwB,KAAKqO,cAAgBjO,EAErBb,EACKwB,SAAS9C,GACT4C,KAAK,KAAMmN,GAEhB,IAAIxL,EAAWxC,KAAKwO,oBAAoBpO,GAEvB,QAAboC,EACAxC,KAAK6N,SAASzN,EAAQoD,GACF,WAAbhB,EACPxC,KAAK6N,SAAUzN,EAAQoD,EAAaA,EAAcxD,KAAKyO,eACnC,cAAbjM,GACPxC,KAAK6N,SAASzN,EAAQoD,GAGtByK,GACAjO,KAAKgI,QAAQzJ,QAGjByB,KAAKqO,cAAgBjO,EACrBJ,KAAK2G,QAAQ3F,YAAY/C,GACzB+B,KAAK8N,cAAc1N,IAI3BsO,WAAY,WACR,OAAO1O,KAAKqO,eAGhBM,WAAY,WACR3O,KAAK6N,SAAS,GACd7N,KAAK+I,MAAM,IAGf6F,UAAW,WACP,IAAIC,EAAY7O,KAAKqF,WAAWiI,QAChCtN,KAAK6N,SAAS7N,KAAK8O,gBAAgBC,cACnC/O,KAAK+I,MAAM8F,EAAY,IAG3BG,UAAW,WACP,IACIpN,EADAxB,EAAQJ,KAAKqO,cAGjB,OAAKF,MAAM/N,IAAUA,EAAQ,GACzBA,GAAS,EACTJ,KAAK+I,MAAM3I,IAEXwB,EAAU5B,KAAK+I,UACAnH,EAAQ0M,SAAS,oBAC5BlO,GAAS,EACTJ,KAAK+I,MAAM3I,IAGRA,IAEPA,EAAQJ,KAAKqF,WAAWiI,QAAU,EAClCtN,KAAK+I,MAAM3I,GACJA,IAIf6O,UAAW,WACP,IAEIrN,EAFAxB,EAAQJ,KAAKqO,cACbQ,EAAY7O,KAAKqF,WAAWiI,QAAU,EAG1C,OAAKa,MAAM/N,IAAUA,EAAQyO,GACzBzO,GAAS,EACTJ,KAAK+I,MAAM3I,IAEXwB,EAAU5B,KAAK+I,UACAnH,EAAQ0M,SAAS,oBAC5BlO,GAAS,EACTJ,KAAK+I,MAAM3I,IAGRA,IAEPA,EAAQ,EACRJ,KAAK+I,MAAM3I,GACJA,IAIfkL,eAAgB,SAASF,EAASG,GAE9BA,EAAQA,GAAS,KADjBH,EAAUA,GAAW,IAGTvM,QAAU0M,EAAM1M,SACvBmB,KAAKgI,QAAQ7J,EAAQ,CAClBiN,QAASA,EACTG,MAAOA,KAKnBhB,OAAQ,SAASwD,GACb,IACImB,EACAC,EAIAC,EACA7C,EACA9D,EARAvF,EAAOlD,KAGPqP,EAA8C,aAA5BnM,EAAKjD,QAAQgG,WAC/BqJ,EAAkB7M,EAAgBS,EAAK8J,iBACvCpE,EAAW5I,KAAK6I,aAIhBuC,EAAU,GAEd,GAAI2C,IAAczQ,EACd,OAAO4F,EAAK4B,iBAAiBsF,QAWjC,GARKlH,EAAKqM,iBAAoD,aAAjCrM,EAAKqM,gBAAgB5M,UAC9CO,EAAKqM,gBAAkBlS,EAAEiN,YAG7B4E,EAAUhM,EAAKsI,aAAauC,GAC5BqB,EAAoBC,IAAoBzG,GAAYjK,EAASuQ,KAAavQ,EAASqB,KAAK8E,mBACxFsG,EAAUlI,EAAKsM,uBAAuBN,IAE1BrQ,SAAWqQ,EAAQrQ,QAAUuQ,EAOrC,OANAlM,EAAKoI,eAAeF,GAEhBlI,EAAKmH,gBACLnH,EAAKmH,eAAeoB,UAAU/I,UAG3BQ,EAAKqM,gBAAgB9D,UAAU/I,UAGnB,IAAnBwM,EAAQrQ,SAAgC,IAAhBqQ,EAAQ,KAChCA,EAAU,IAGdC,EAAiBD,EACjBzG,EAASvF,EAAKmI,UAAU6D,GACxB9D,EAAU3C,EAAO2C,QACjB8D,EAAUzG,EAAOyG,QAEbG,IACAC,GAAkB,EACdJ,EAAQrQ,SACRqQ,EAAU,CAACvQ,EAASuQ,MAI5B,IAAI/F,EAAO,WACP,IAAIoC,EAAQrI,EAAKuM,QAAQP,IAErBC,EAAetQ,SAAWqQ,EAAQrQ,QAAUwQ,IAC5CnM,EAAK6F,MAAMmG,GAGfhM,EAAKoI,eAAeF,EAASG,GAEzBrI,EAAKmH,gBACLnH,EAAKmH,eAAeoB,UAGxBvI,EAAKqM,gBAAgB9D,WAazB,OAVAc,EAAWrJ,EAAK4J,SAASoC,GAEpBI,IACG/C,EACAA,EAASpD,KAAKA,GAEdA,KAIDjG,EAAKqM,gBAAgB7M,WAGhCU,MAAO,SAASA,GACZ,GAAIA,IAAU9F,EACV,OAAO0C,KAAK0P,aAGhB1P,KAAK0P,aAAetM,GAGxBkE,KAAM,SAASqI,GACX3P,KAAK8I,OAAQ,EACb6G,IACA3P,KAAK8I,OAAQ,GAGjBtB,YAAa,SAASC,GAClBzH,KAAK4P,cAAgBvS,EAAEwF,OAAO,GAAI4E,IAGtCoB,WAAY,WAKR,OAJK7I,KAAK4P,eACN5P,KAAKwH,YAAYxH,KAAKqF,WAAWoC,WAG7BlK,EAAMoC,KAAKkQ,MAAMC,eAAe9P,KAAKqF,WAAWoC,SAAUzH,KAAK4P,gBAG3EG,WAAY1S,EAAE2S,KAEd5B,mBAAoB,SAAShO,GACzB,OAAOJ,KAAK2G,QAAQc,QAAO,SAASwC,EAAK1K,GACrC,OAAOa,IAAUiB,SAAShE,EAAEkC,GAASsB,KAAK,qBAAsB,QAIxE0H,sBAAuB,SAASrJ,GAK5B,IAJA,IAEIK,EAFAqL,EAAW5K,KAAK6K,UACpBb,EAAchK,KAAKoI,aAGVnH,EAAI,EAAGA,EAAI2J,EAAS/L,OAAQoC,IAEjC,GADQ2J,EAAS3J,GAAGZ,MAAQpB,EAAY2L,EAAS3J,GAAGZ,MAAQuK,EAAS3J,GAAGZ,OAASnB,EAAW0L,EAAS3J,GAAGZ,MAAQnB,GAAY8K,EAAYY,EAAS3J,GAAGZ,OAAS2J,EAAY9K,GAC9J,CACPK,EAAUqL,EAAS3J,GACnB,MAIR,OAAO1B,EAAUS,KAAKoO,mBAAmB7O,EAAQa,OAAS/C,KAG9D+J,OAAQ,WACJpH,KAAKyI,OAASnL,EACd0C,KAAKiQ,eAAiB3S,EACtB0C,KAAK+H,MAAQzK,EACbD,EAAE2C,KAAK8O,iBAAiBpN,SACxB1B,KAAK8O,gBAAkBxR,EACvB0C,KAAKT,QAAQ2Q,SAGjBC,QAAS,WACL,IAAIC,IAAYpQ,KAAKqF,WAAWqC,OAAO7I,OACnCkF,EAAS/D,KAAKC,QAAQ8D,OACtBP,EAAaxD,KAAKC,QAAQuD,WAC1B8J,EAAQtN,KAAKqF,WAAWiI,QAQ5B,OANK8C,EAEMrM,EAASP,EAAa8J,IAC7BvJ,EAASuJ,EAAQ9J,GAFjBO,EAAS,EAKNA,GAGXsM,gBAAiB,WACb,IAAItM,EAAS/D,KAAKmQ,UAElBnQ,KAAKgE,QAAQD,OAAOA,GACpB/D,KAAKyO,cAAgB1K,GAGzBuM,aAAc,WACV,OAAOtQ,KAAKyO,eAGhBD,oBAAqB,SAASpO,GAC1B,IAAIwN,EAAY5N,KAAKgE,QAAQ4J,YACzB0C,EAAetQ,KAAKyO,cACpBjL,EAAaxD,KAAKC,QAAQuD,WAC1B+M,EAAYnQ,EAAQoD,EACpBgN,EAAeD,EAAY/M,EAC3BiN,EAAY7C,EAAY0C,EAa5B,OAVIC,IAAe3C,EAAYpK,GAAgBgN,EAAe5C,GAAa2C,EAAY3C,EACxE,MACJ2C,IAAcE,GAAcF,EAAYE,GAAaA,EAAYD,EAC7D,SACHD,GAAa3C,GAAe2C,GAAa3C,GAAa0C,EAAe9M,GAClE,WAEA,aAMnB2B,WAAY,WACR,IAAIlF,EAAUD,KAAKC,QACfL,EAAY,CACZE,SAAUG,EAAQH,SAClBQ,oBAAqBL,EAAQK,oBAC7B0B,cAAe/B,EAAQ+B,cACvBtB,mBAAoBT,EAAQS,oBAGhC,GAAIT,EAAQC,QACR,IAAK,IAAIe,EAAI,EAAGA,EAAIhB,EAAQC,QAAQrB,OAAQoC,IAAK,CAC7C,IAAIyP,EAAgBzQ,EAAQC,QAAQe,GAChC0P,EAAeD,EAAcE,MAAQF,EAAcE,MAAMC,WAAa,OAE1EjR,EAAU,SAAWqB,GAAKyP,EAAc5Q,UAAY,MAAQ6Q,EAAe,IAInF,IAAK,IAAIG,KAAOlR,EACkB,mBAAnBA,EAAUkR,KACjBlR,EAAUkR,GAAOvT,EAAMuC,SAASF,EAAUkR,IAAQ,KAI1D9Q,KAAKJ,UAAYA,GAGrBmR,eAAgB,SAASxR,EAASyR,GAM9B,IALA,IACI3Q,EAAM4Q,EADNtK,EAAQ,GAERnD,EAAaxD,KAAKC,QAAQuD,WAAa,KACvC+C,EAAYvG,KAAKC,QAAQC,SAAWF,KAAKC,QAAQC,QAAQrB,OAASf,EAAaD,EAE5EmT,KAAU,IACbC,EAAOzR,SAASC,cAAc,SACzBJ,UAAY,oBAEjBgB,EAAOb,SAASC,cAAc,OACzByR,UAAY,EACjB7Q,EAAKhB,UAAYkH,EACjBlG,EAAK8Q,aAAa,OAAQ,UAC1B9Q,EAAKgC,MAAM0B,OAASP,EACpBnD,EAAKgC,MAAM+O,UAAY5N,EACvBnD,EAAKlB,YAAY8R,GAEjB1R,EAAQJ,YAAYkB,GAEpBsG,EAAMgD,KAAKtJ,GAGf,OAAOsG,GAGX0K,mBAAoB,WAChB,IAAIxF,EAAS7L,KAAKqF,WAAWiM,QACzB/E,EAAWlP,EAAEiN,WACjBiC,EAASd,UAETzL,KAAK+E,YAAc,GACnB,IAAK,IAAI9D,EAAI,EAAGA,EAAI4K,EAAOhN,OAAQoC,IAC/BjB,KAAK+E,YAAY8G,EAAO5K,GAAGsQ,OAAS,CAAE/E,IAAKX,EAAO5K,GAAGuL,IAAKD,SAAUA,IAI5EvD,YAAa,WACT,IArpCcsH,EAAczK,EAAarC,EAgE/BgO,EANMjS,EAASoQ,EA2lCrBzM,EAAOlD,KACPgE,EAAUd,EAAKc,QAAQyN,IAAI,GAC3BxR,EAAUiD,EAAKjD,QACfoF,EAAanC,EAAKmC,WAElBnC,EAAKE,SACLF,EAAKkE,SAGTlE,EAAKmO,qBACLnO,EAAKwO,oBACLxO,EAAKmN,kBACLnN,EAAK0I,WAjqCS0E,EAiqCgBpN,EAAKuL,cAjqCP5I,EAiqCsB5F,EAAQ4F,YAjqCjBrC,EAiqC8BvD,EAAQuD,WAhqC5EwI,KAAKG,KAAKmE,EAAezK,EAAcrC,IAkqCtCN,EAAK0I,UAAYvG,EAAWiI,UAC5BpK,EAAK0I,UAAYvG,EAAWiI,SAGhCpK,EAAK0D,OAAS1D,EAAK6N,eAAe7N,EAAK3D,QAAQ,GAAI2D,EAAK0I,WAExD1I,EAAKyO,WAAW1R,EAAQuD,WAAa6B,EAAWiI,SAChDpK,EAAKjD,QAAQ+F,MAAQX,EAAW7E,SAAW,IAAI3B,OAAS,QAAU,OAExC,SAAtBqE,EAAKjD,QAAQ+F,KACT9C,EAAK3C,OAAO6D,QAAQ3F,GAAeI,OACnCqE,EAAK3C,OAAO6D,QAAQ3F,GAAemT,OAEnC1O,EAAK3C,OAAOqR,OAGZ1O,EAAK3C,OAAO6D,QAAQ3F,GAAeI,OACnCqE,EAAK3C,OAAO6D,QAAQ3F,GAAeoT,OAEnC3O,EAAK3C,OAAOsR,OAIpB3O,EAAKiF,OAASjF,EAAK4O,SAAQ,WACvB5O,EAAKqC,cAAa,MAGtBrC,EAAK6O,UAAY,SAASnE,EAAWoE,GACjC,IAAIC,EAAU/O,EAAKgP,WAAWhP,EAAKiF,QACnC,OAAOjF,EAAKiP,aAAavE,EAAWqE,EAAQrE,EAAWoE,KAG3D9O,EAAKqC,aAAerC,EAAKkP,cAzoCT7S,EA0oCGyE,EA1oCM2L,EA0oCGzM,EAAK6O,UAzoC9B,SAASC,GACZ,OAAOrC,EAASpQ,EAAQqO,UAAWoE,MAIzBR,EAqoCGtO,EAAKmP,aAAanP,EAAK0D,OAAQlH,EAAO6H,KAAKrE,IApoCrD,SAASoP,EAAMN,GAElB,OADAR,EAAQc,EAAK3L,MAAO2L,EAAKlS,MAAO4R,GACzBM,KAqoCPpP,EAAKqC,eACLrC,EAAKqP,uBAAuBrP,EAAKuL,eACjCvL,EAAKsP,kCAGTb,WAAY,SAAS5N,GACjB,IAAI0O,EACA3D,EAAkB9O,KAAK8O,gBAQ3B,GANKA,EAGD2D,EAAgB3D,EAAgBC,aAFhCD,EAAkB9O,KAAK8O,gBAAkB3P,EAAYa,KAAKgE,QAAQ,GAlvCxD,sBAuvCVD,IAAW0O,EAGX,IAFA3D,EAAgB4D,UAAY,GAErB3O,EAAS,GAAG,CACf,IAAI4O,EAAY3G,KAAKqB,IAAItJ,EAAQ,MACjC5E,EAAY2P,GAAiBzM,MAAM0B,OAAS4O,EAAY,KACxD5O,GAAU4O,IAKtBb,QAAS,WACL,IAAIc,EAAqB,KACrBvN,EAAarF,KAAKqF,WAClBwN,EAAiBxN,EAAWuC,OAC5B5B,EAAOhG,KAAKC,QAAQ+F,KACpB8M,EAAW9S,KAAK4L,UAChBmH,EAAa,GAQjB,OANI1N,EAAWyN,WAAaA,GACxB9S,KAAKsH,MAAK,WACNjC,EAAWyN,SAASA,MAIrB,SAAS1S,EAAO4S,GACnB,IAAI9P,EAAOlD,KACX,GAAKqF,EAAW4N,QAAQD,EAAYF,GAuB7B,CAQH,IAAIrK,EACJ,GARIoK,IAAmBG,GACnBhT,KAAKsH,MAAK,WACNjC,EAAWoI,MAAMuF,EAAYF,GAC7BD,EAAiBG,KAKZ,UAAThN,EAAkB,CAClB,IAAK+M,EAAWC,GAGZ,IAFA,IAAIE,EAAYH,EAAWC,GAAc,GACrCG,EAAS9N,EAAWqC,OACfzG,EAAI,EAAGmS,EAAMD,EAAOtU,OAAQoC,EAAImS,EAAKnS,IAE1C,IADA,IAAIT,EAAQ2S,EAAOlS,GACVqI,EAAI,EAAG+J,EAAc7S,EAAMmG,MAAM9H,OAAQyK,EAAI+J,EAAa/J,IAC/D4J,EAAUvJ,KAAK,CAAEtJ,KAAMG,EAAMmG,MAAM2C,GAAI9I,MAAOA,EAAMzB,QAKhE0J,EAASsK,EAAWC,GAAY5S,EAAQ4S,QAExCvK,EAASpD,EAAWqC,OAAOtH,EAAQ4S,GAGvC,OAAOvK,EA3BP,OArBImK,IAAuBI,IACvBJ,EAAqBI,EACrBH,EAAiBG,EAEb9P,EAAKoQ,iBACLpQ,EAAKoQ,gBAAgBC,SAGzBrQ,EAAKoQ,gBAAkBpQ,EAAKwI,cAAcsH,GAC1C9P,EAAKoQ,gBAAgBzG,MAAK,WACtB,IAAI2G,EAAiBtQ,EAAKuQ,iBAAiBvQ,EAAKc,QAAQ,GAAG4J,WAE3D1K,EAAKoQ,gBAAkB,KAEnBN,GAAcQ,GAAkBA,GAAmBR,EAAaF,IAChE5P,EAAKG,WAAY,EACjBgC,EAAWoI,MAAMuF,EAAYF,QAKlC,OAgCnBX,aAAc,SAASvE,EAAW0E,GAC9B,IAAI9R,EAAQR,KAAK0T,oBACblQ,EAAaxD,KAAKC,QAAQuD,WAC1BmQ,EAA4B3H,KAAKC,OAAO2B,EAAY0E,EAAKnQ,KAAOqB,GAChEoQ,EAAuBtB,EAAK3L,MAAMgN,GAEtC,GAAIC,GAAwBA,EAAqBvT,KAAM,CACnD,IAAIwT,EAAoBD,EAAqBpT,MAE7C,GAAIqT,IAAsBrT,EAAO,CAC7B,IAAIsT,EAAiBD,GAAqB,GAC1C7T,KAAKO,OAAOE,KAAKT,KAAKJ,UAAUc,mBAAmBoT,IACnD9T,KAAK0T,oBAAsBG,GAInC,OAAOvB,GAGXyB,YAAa,SAAS1T,EAAMD,EAAOrB,GAC/B,IAAIiV,EAAWhU,KAAKC,QAAQ+F,KACxBxC,EAAaxD,KAAKC,QAAQuD,WAC1ByQ,EAAejU,KAAKqO,cACpBxM,GAAW,EACXD,GAAU,EACVE,GAAW,EACXtB,EAAQ,KAERwJ,EAAchK,KAAKoI,aAYvB,GAViB,UAAb4L,IACI3T,IACAyB,EAAqB,IAAV1B,IAAuC,IAAvBJ,KAAKkU,eAA2BlU,KAAKkU,gBAAkB7T,EAAKG,MACvFR,KAAKkU,cAAgB7T,EAAKG,OAG9BA,EAAQH,EAAOA,EAAKG,MAAQ,KAC5BH,EAAOA,EAAOA,EAAKA,KAAO,MAGE,aAA5BL,KAAKC,QAAQkG,YAA6BnG,KAAK6E,mBAAmBhG,QAAUwB,GAC5E,IAAK,IAAIY,EAAI,EAAGA,EAAIjB,KAAK6E,mBAAmBhG,OAAQoC,IAEhD,GADQ+I,EAAYhK,KAAK6E,mBAAmB5D,MAAQ+I,EAAY3J,GACrD,CACPwB,GAAW,EACX,YAGL,IAAK7B,KAAK6I,cAAgB9J,EAAMF,QAAUwB,EAC7C,IAAK,IAAIiJ,EAAI,EAAGA,EAAIvK,EAAMF,OAAQyK,IAE9B,GADQrK,EAAYoB,GAAQtB,EAAMuK,KAAOjJ,EAAOtB,EAAMuK,KAAOU,EAAY3J,GAC9D,CACPtB,EAAM+K,OAAOR,EAAI,GACjBzH,GAAW,EACX,MASZ,OAJIoS,IAAiB7T,IACjBwB,GAAU,GAGP,CACHvB,KAAMA,GAAc,KACpBG,MAAOA,EACPsB,SAAUA,EACVD,SAAUA,EACVD,QAASA,EACTxB,MAAOA,EACP+B,IAAK/B,EAAQoD,IAIrB2Q,OAAQ,SAAS/T,GACb,IAGIC,EAHAuL,EAAY5L,KAAK4L,UACjB7M,EAAQiB,KAAK4E,QAAQwF,QACrBzD,EAAQ,GAGZ3G,KAAKoU,MAAQ,GACbpU,KAAKkU,eAAgB,EAErB,IAAK,IAAIjT,EAAIb,EAAOvB,EAASuB,EAAQwL,EAAW3K,EAAIpC,EAAQoC,IACxDZ,EAAOL,KAAK+T,YAAY/T,KAAKmI,OAAOlH,EAAGb,GAAQa,EAAGlC,GAC9C4H,EAAMA,EAAM9H,OAAS,KACrB8H,EAAMA,EAAM9H,OAAS,GAAGkD,kBAAoB1B,EAAKyB,UAErD6E,EAAMgD,KAAKtJ,GACXL,KAAKoU,MAAM/T,EAAKD,OAASC,EAI7B,OADAL,KAAK6K,UAAYlE,EACVA,GAGX0N,wBAAyB,SAASzG,EAAW0G,GACzC,IAAI3N,EAAQ3G,KAAKmU,OAAOnU,KAAKuU,WAAW3G,EAAW0G,IACnD,MAAO,CACHlU,MAAOuG,EAAM9H,OAAS8H,EAAM,GAAGvG,MAAQ,EACvC+B,IAAKwE,EAAM9H,OAAS8H,EAAM,GAAGxE,IAAM,EACnCwE,MAAOA,IAIfuL,WAAY,WACR,IAAI5B,EAAetQ,KAAKyO,cAGpB+F,EAx2CZ,SAAuBvU,EAASqQ,GAC5B,IAAImE,GAAiBxU,EAAQ4F,YAAc,EAAI5F,EAAQ6F,WAAawK,EAChEoE,EAAczU,EAAQ6F,UAAYwK,EAEtC,OAAO,SAASgC,EAAM1E,EAAW0G,GAC7B,OAAI1G,EAAY0G,EACL1G,EAAY0E,EAAKnQ,IAAMsS,EAEV,IAAbnC,EAAKnQ,KAAayL,EAAY0E,EAAKnQ,IAAMuS,GAg2CjCC,CAFL3U,KAAKC,QAEuBqQ,GAE1C,OAAO,SAAUvR,EAAOiT,GACpB,IAAIvJ,EAASzI,KAAKyI,OACd6L,EAAgBtU,KAAKiQ,eASzB,OAPI+B,GAAUvJ,GAAW+L,EAAa/L,EAAQ1J,EAAOuV,KACjD7L,EAASzI,KAAKqU,wBAAwBtV,EAAOuV,IAGjDtU,KAAKiQ,eAAiBlR,EACtBiB,KAAKyI,OAASA,EAEPA,GACRlB,KAAKvH,OAGZoS,aAAc,SAASjK,EAAQwH,GAC3B,IAAI/N,EAEJ,OAAO,SAASoQ,GACZ,IAAI4C,EAASzM,EAAO6J,GAEhB4C,IAAWhT,IACXA,EAAUgT,EACVjF,EAASiF,EAAQ5C,MAK7BK,aAAc,SAASC,EAAMd,GACzB,IAx2CM7B,EAAU/P,EAw2CZsD,EAAOlD,KACPnB,EAASyT,EAAKzT,OACdgW,GAAiBC,IAGrB,OAFAtD,GA32CM7B,EA22CS6B,EA32CC5R,EA22CQI,KAAKJ,UA12C1B,SAASmV,EAAMC,GAClB,IAAK,IAAI/T,EAAI,EAAGmS,EAAM2B,EAAKlW,OAAQoC,EAAImS,EAAKnS,IACxC0O,EAASoF,EAAK9T,GAAI+T,EAAK/T,GAAIrB,GACvBoV,EAAK/T,GAAGZ,MACRL,KAAKgI,QAAQ1J,EAAY,CAAE+B,KAAMhD,EAAE0X,EAAK9T,IAAKtB,KAAMqV,EAAK/T,GAAGZ,KAAM4U,GAAI1X,EAAME,OAs2C3C8J,KAAKvH,MAEtC,SAASkV,EAAOC,EAAQnD,GAC3B,IACIvE,EAAO2H,EADPC,EAAOF,EAASN,EAGhB7C,GAAShG,KAAKsJ,IAAID,IAASxW,GAC3B4O,EAAQ6E,EACR8C,EAASF,IAETzH,EA12ChB,SAAiB9G,EAAO0O,GACpB,IAAI5H,EAUJ,OARI4H,EAAO,GACP5H,EAAQ9G,EAAMmD,OAAO,EAAGuL,GACxB1O,EAAMgD,KAAKiD,MAAMjG,EAAO8G,KAExBA,EAAQ9G,EAAMmD,OAAOuL,GAAOA,GAC5B1O,EAAM4O,QAAQ3I,MAAMjG,EAAO8G,IAGxBA,EA+1Ca+H,CAAQlD,EAAM+C,GACtBD,EAASC,EAAO,EAAIH,EAAM9K,OAAOiL,GAAQH,EAAM9K,MAAM,GAAIiL,IAG7D7D,EAAQ/D,EAAO2H,EAAQlS,EAAKE,SAE5ByR,EAAgBM,IAIxBM,aAAc,WACV,IAt6CanF,EAAczK,EAAa6P,EAs6CpCzV,EAAUD,KAAKC,QAEnB,OAx6CaqQ,EAw6CMtQ,KAAKyO,cAx6CG5I,EAw6CY5F,EAAQ4F,YAx6CP6P,EAw6CoBzV,EAAQ8F,eAv6CjE,CACH4P,KAAMrF,EAAeoF,EACrBE,GAAItF,GAAgBzK,EAAc,EAAI6P,KAw6C1CjC,iBAAkB,SAASjR,GACvB,IAAIoJ,EAAY5L,KAAK4L,UACjBpI,EAAaxD,KAAKC,QAAQuD,WAC1B8J,EAAQtN,KAAKqF,WAAWiI,QAE5B,OAAOtB,KAAKqB,IAAIrB,KAAK6J,IAAIvI,EAAQ1B,EAAW,GAAII,KAAK6J,IAAI,EAAG7J,KAAKC,MAAMzJ,EAAWgB,MAGtF+Q,WAAY,SAAS3G,EAAW0G,GAC5B,IACI9R,EADAsT,EAAU9V,KAAKyV,eAKnB,OAFAjT,EAAWoL,GAAcA,EAAY0G,EAAiBwB,EAAQH,KAAOG,EAAQF,IAEtE5V,KAAKyT,iBAAiBjR,IAGjCkD,YAAa,WACT,IAAIa,EAAYvG,KAAKC,QAAQC,SAAWF,KAAKC,QAAQC,QAAQrB,OAASf,EAAaD,EAE/EmC,KAAKC,QAAQgG,aACbjG,KAAKwG,aAAexG,KAAK+V,cAAcxO,KAAKvH,MAC5CA,KAAKT,QAAQoF,GAAGvG,oBAAyB,IAAMmI,EAAWvG,KAAKwG,gBAIvEwP,gBAAiB,SAASzW,GACtB,OAAMA,aAAmB0W,OAIlB5U,SAAS9B,EAAQsB,KAAK,qBAAsB,IAHxCvD,GAMfkO,aAAc,SAASuC,GACnB,IAAiBpO,EAAb8I,EAAS,GAEb,GAAyB,mBAAdsF,EAA0B,CACjCpO,EAAOK,KAAKqF,WAAW6I,WACvB,IAAK,IAAIjE,EAAM,EAAGA,EAAMtK,EAAKd,OAAQoL,IACjC,GAAI8D,EAAUpO,EAAKsK,IAAO,CACtBxB,EAAOkB,KAAKM,GACZ,OAKa,iBAAd8D,GACPtF,EAAOkB,KAAKoE,GAGhB,IAAImI,EAAelW,KAAKgW,gBAAgBjI,GASxC,OARKI,MAAM+H,IACPzN,EAAOkB,KAAKuM,GAGZnI,aAAqB/O,QACrByJ,EAASsF,GAGNtF,GAGX4C,UAAW,SAAS6D,GAChB,IACIiH,EACAjX,EAOAmB,EATA+K,EAAU,GAGVgL,EAAkBpW,KAAK8E,iBACvB4I,EAAoB1N,KAAK6E,mBACzBrC,EAAW,EACXyD,EAAajG,KAAKC,QAAQgG,WAC1BoQ,EAAwB,EACxBrM,EAAchK,KAAKoI,aAEnBK,EAAS,KAIb,GAFAyG,EAAUA,EAAQ9E,SAEC,IAAfnE,GAAwBiJ,EAAQrQ,QAkB7B,GAAmB,aAAfoH,EACP,IAAK,IAAIhF,EAAI,EAAGA,EAAIiO,EAAQrQ,OAAQoC,IAAK,CAKrC,GAJAwH,EAAS,KACTjG,EAAWnF,EAAEiZ,QAAQpH,EAAQjO,GAAImV,GACjClX,EAAWc,KAAKuN,gBAAgB2B,EAAQjO,KAEtB,IAAduB,GAAmBtD,EACnB,IAAK,IAAIoK,EAAI,EAAGA,EAAIoE,EAAkB7O,OAAQyK,KAClCrK,EAAYC,GAAYwO,EAAkBpE,KAAOpK,EAAW8K,EAAY0D,EAAkBpE,MAAQU,EAAY9K,MAElHmB,EAAOL,KAAKoO,mBAAmBc,EAAQjO,IACvCwH,EAASzI,KAAKuW,oBAAoBlW,EAAMiJ,EAAG4F,EAAQjO,GAAIoV,SAI/DF,EAAgBC,EAAgB5T,MAEVlF,IAClB+C,EAAOL,KAAKoO,mBAAmB+H,GAC/B1N,EAASzI,KAAKuW,oBAAoBlW,EAAMmC,EAAU2T,EAAeE,IAIrE5N,IACAyG,EAAQpF,OAAO7I,EAAG,GAClBmK,EAAQzB,KAAKlB,GAEb4N,IACApV,UA9CgC,CACxC,IAAK,IAAIgJ,EAAM,EAAGA,EAAMmM,EAAgBvX,OAAQoL,IACxCmM,EAAgBnM,KAAS3M,EACzB0C,KAAKoO,mBAAmBgI,EAAgBnM,IAAMjJ,YAAYhD,GACnD0P,EAAkBzD,IACzBjK,KAAKuI,sBAAsBmF,EAAkBzD,IAAMjJ,YAAYhD,GAGnEoN,EAAQzB,KAAK,CACTvJ,MAAOgW,EAAgBnM,GACvBzH,SAAUyH,EACV/K,SAAUwO,EAAkBzD,KAIpCjK,KAAK4E,QAAU,GACf5E,KAAK6E,mBAAqB,GAC1B7E,KAAK8E,iBAAmB,GAkC5B,MAAO,CACHoK,QAASA,EACT9D,QAASA,IAIjBmL,oBAAqB,SAASlW,EAAMmC,EAAU2T,EAAeE,GAGzD,GAAKhW,EAAKiO,SAAStQ,GASnB,OALAqC,EAAKW,YAAYhD,GACjBgC,KAAK4E,QAAQkF,OAAOtH,EAAU,GAC9BxC,KAAK8E,iBAAiBgF,OAAOtH,EAAU,GAGhC,CACHpC,MAAO+V,EACP3T,SAAUA,EAAW6T,EACrBnX,SALOc,KAAK6E,mBAAmBiF,OAAOtH,EAAU,GAAG,KAS3DgN,uBAAwB,SAASN,GAC7B,IACInQ,EAAOqB,EAAOoC,EAId8G,EALAkN,EAAWxW,KAAKT,QAAQ,GAAGiX,SAE3BC,EAASzW,KAAK4E,QACdwG,EAAU,GACVnB,EAAM,EAGV,GAAgC,aAA5BjK,KAAKC,QAAQgG,aAA8BjG,KAAK6I,aAChD,MAAO,GAGX,IAAoB,IAAhBqG,EAAQ,GAWR,OAVA7R,EAAEmZ,GAAUxV,YAAYhD,GACxBoN,EAAU/N,EAAEgL,IAAIrI,KAAK6E,mBAAmBuF,MAAM,IAAI,SAASlL,EAAU+K,GAClE,MAAO,CACJ/K,SAAUA,EACVsD,SAAUyH,MAGhBjK,KAAK8E,iBAAmB,GACxB9E,KAAK6E,mBAAqB,GAC1B7E,KAAK4E,QAAU,GACRwG,EAGX,KAAOnB,EAAMiF,EAAQrQ,OAAQoL,IAAO,CAOhC,IANAzH,GAAY,EACZpC,EAAQ8O,EAAQjF,GACZjK,KAAKuN,gBAAgBnN,KACrBrB,EAAQiB,KAAKoI,aAAapI,KAAKuN,gBAAgBnN,KAG9CkJ,EAAI,EAAGA,EAAImN,EAAO5X,OAAQyK,IAC3B,GAAIvK,GAAS0X,EAAOnN,GAAI,CACpB9G,EAAW8G,EACX,MAIJ9G,GAAY,IACZ4I,EAAQzB,KAAK3J,KAAK6J,SAASrH,IAC3BnF,EAAEmZ,EAASpW,IAAQY,YAAYhD,IAIvC,OAAOoN,GAGX6B,SAAU,SAAS7M,EAAOuL,GAGtB,QAFWvL,EAAQuL,EAAO,EAAIK,KAAKC,MAAM7L,EAAQuL,GAAQ,GAE1C,GAAKA,GAGxB8D,QAAS,SAAStE,GACd,IAGIjM,EAAUwX,EAHVxT,EAAOlD,KACPqP,EAA8C,aAA5BrP,KAAKC,QAAQgG,WAC/BZ,EAAarF,KAAKqF,WAElBsG,EAAO3L,KAAK4L,UACZ5B,EAAchK,KAAKoI,aACnBmD,EAAQ,GAkCZ,OAhCI8D,IACAnM,EAAK4B,iBAAmB,GACxB5B,EAAK2B,mBAAqB,GAC1B3B,EAAK0B,QAAU,IAGnB8R,EAAUrR,EAAWuC,OAErBvK,EAAEgP,KAAKlB,GAAS,SAASmB,EAAGlM,GACxB,IAAIwH,EAAO1E,EAAK+J,SAAS7M,EAAOuL,GAEhCzI,EAAKoE,MAAK,WACNjC,EAAWoI,MAAM7F,EAAM+D,GAEvBzM,EAAWgE,EAAKgK,cAAc7H,EAAWqC,OAAQ,CAACtH,EAAQwH,IAC1D1E,EAAK4B,iBAAiB6E,KAAKvJ,GAC3B8C,EAAK2B,mBAAmB8E,KAAKzK,GAC7BgE,EAAK0B,QAAQ+E,KAAK1K,EAAYC,GAAYA,EAAW8K,EAAY9K,IAEjEqM,EAAM5B,KAAK,CACPvJ,MAAOA,EACPlB,SAAUA,IAGdgE,EAAKkL,mBAAmBhO,GAAOW,SAAS/C,GAExCqH,EAAWoI,MAAMiJ,EAAS/K,SAIlCzI,EAAK0B,QAAU1B,EAAKuH,kBAAkBvH,EAAK0B,SAEpC2G,GAGXwK,cAAe,SAASvN,GACpB,IAAInI,EAAOhD,EAAEmL,EAAEmO,gBAEVnO,EAAEoO,sBAAwBvW,EAAKQ,KAAK,aACrCb,KAAKgI,QAAQ5J,EAAO,CAAEiC,KAAMA,KAIpCqR,kBAAmB,WACf1R,KAAKoI,aAAe7K,EAAM4K,OAAOnI,KAAKC,QAAQiG,iBAGlDqM,uBAAwB,SAASxO,GAC7B,IAAI8S,EAAY7W,KAAK2G,QAAQmQ,QACzBC,EAAc/W,KAAKO,OACnByW,EAAU,EAEVD,EAAY,IAAuC,SAAjCA,EAAY,GAAG1U,MAAM4U,UACxB,SAAXlT,IACAiT,EAAUzZ,EAAM2Z,QAAQC,aAG5BH,GAAWnT,WAAWgT,EAAUpT,IAAI,sBAAuB,IAAMI,WAAWgT,EAAUL,SAAS,YAAY/S,IAAI,SAAU,IAEzHsT,EAAYtT,IAAI,gBAAiBuT,KAIzCxE,+BAAgC,WAC5B,GAAIxS,KAAKC,QAAQC,SAAWF,KAAKC,QAAQC,QAAQrB,OAAQ,CACrD,IAAIuY,EAAQ7Z,EAAM2Z,QAAQE,MAAMpX,KAAKiE,SACjCkT,EAAY5Z,EAAM2Z,QAAQC,YAC1BE,EAAgBrX,KAAKgE,QAAQ5E,SAASA,SAASqC,KAAK,mBACpD6L,EAAQtN,KAAKqF,WAAWiI,QAE5B+J,EAAc5T,IAAK2T,EAAQ,eAAiB,gBAAkB9J,EAAQ6J,EAAY,OAM9F5Z,EAAME,GAAGmF,YAAcA,EACvBrF,EAAME,GAAG6Z,OAAO1U,GAnyDpB,CAqyDGpF,OAAOD,MAAM0Y","sourcesContent":["(function (factory) {\n typeof define === 'function' && define.amd ? define(['kendo.data'], factory) :\n factory();\n})((function () {\n var __meta__ = {\n id: \"virtuallist\",\n name: \"VirtualList\",\n category: \"framework\",\n depends: [ \"data\" ],\n hidden: true\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n ui = kendo.ui,\n Widget = ui.Widget,\n DataBoundWidget = ui.DataBoundWidget,\n percentageUnitsRegex = /^\\d+(\\.\\d+)?%$/i,\n LIST_CONTENT = \"k-list-content k-virtual-content\",\n TABLE_CONTENT = \"k-table-body k-table-scroller\",\n HEADER = \"k-list-group-sticky-header\",\n LIST_ITEM = \"k-list-item\",\n TABLE_ITEM = \"k-table-row\",\n HEIGHTCONTAINER = \"k-height-container\",\n GROUPITEM = \"k-list-item-group-label\",\n LIST_UL = \"k-list-ul\",\n TABLE_LIST = \"k-table-list\",\n\n SELECTED = \"k-selected\",\n FOCUSED = \"k-focus\",\n HOVER = \"k-hover\",\n CHANGE = \"change\",\n CLICK = \"click\",\n LISTBOUND = \"listBound\",\n ITEMCHANGE = \"itemChange\",\n\n ACTIVATE = \"activate\",\n DEACTIVATE = \"deactivate\",\n\n GROUP_ROW_SEL = \".k-table-group-row\",\n\n VIRTUAL_LIST_NS = \".VirtualList\";\n\n function lastFrom(array) {\n return array[array.length - 1];\n }\n\n function toArray(value) {\n return value instanceof Array ? value : [value];\n }\n\n function isPrimitive(dataItem) {\n return typeof dataItem === \"string\" || typeof dataItem === \"number\" || typeof dataItem === \"boolean\";\n }\n\n function getItemCount(screenHeight, listScreens, itemHeight) {\n return Math.ceil(screenHeight * listScreens / itemHeight);\n }\n\n function appendChild(parent, className, tagName) {\n var element = document.createElement(tagName || \"div\");\n if (className) {\n element.className = className;\n }\n parent.appendChild(element);\n\n return element;\n }\n\n function getDefaultItemHeight(listSize) {\n var mockList = $('
' +\n '
' +\n '' +\n '
' +\n '
');\n var lineHeight;\n\n mockList.css({\n position: \"absolute\",\n left: \"-200000px\",\n visibility: \"hidden\"\n });\n mockList.appendTo(document.body);\n lineHeight = parseFloat(kendo.getComputedStyles(mockList.find(\".k-list-item\")[0], [\"height\"]).height);\n mockList.remove();\n\n return lineHeight;\n }\n\n function bufferSizes(screenHeight, listScreens, opposite) { //in pixels\n return {\n down: screenHeight * opposite,\n up: screenHeight * (listScreens - 1 - opposite)\n };\n }\n\n function listValidator(options, screenHeight) {\n var downThreshold = (options.listScreens - 1 - options.threshold) * screenHeight;\n var upThreshold = options.threshold * screenHeight;\n\n return function(list, scrollTop, lastScrollTop) {\n if (scrollTop > lastScrollTop) {\n return scrollTop - list.top < downThreshold;\n } else {\n return list.top === 0 || scrollTop - list.top > upThreshold;\n }\n };\n }\n\n function scrollCallback(element, callback) {\n return function(force) {\n return callback(element.scrollTop, force);\n };\n }\n\n function syncList(reorder) {\n return function(list, force) {\n reorder(list.items, list.index, force);\n return list;\n };\n }\n\n function position(element, y) {\n element.style.webkitTransform = 'translateY(' + y + \"px)\";\n element.style.transform = 'translateY(' + y + \"px)\";\n }\n\n function map2(callback, templates) {\n return function(arr1, arr2) {\n for (var i = 0, len = arr1.length; i < len; i++) {\n callback(arr1[i], arr2[i], templates);\n if (arr2[i].item) {\n this.trigger(ITEMCHANGE, { item: $(arr1[i]), data: arr2[i].item, ns: kendo.ui });\n }\n }\n };\n }\n\n function reshift(items, diff) {\n var range;\n\n if (diff > 0) { // down\n range = items.splice(0, diff);\n items.push.apply(items, range);\n } else { // up\n range = items.splice(diff, -diff);\n items.unshift.apply(items, range);\n }\n\n return range;\n }\n\n function render(element, data, templates) {\n var itemTemplate = templates.template,\n hasColumns = this.options.columns && this.options.columns.length,\n altRow = data.index % 2 === 1 ? \"k-table-alt-row\" : \"\";\n\n element = $(element);\n\n if (!data.item) {\n itemTemplate = templates.placeholderTemplate;\n }\n\n if (data.index === 0 && this.header && data.group) {\n this.header.html(templates.fixedGroupTemplate(data.group));\n }\n\n this.angular(\"cleanup\", function() {\n return { elements: [ element ] };\n });\n\n element\n .attr(\"data-uid\", data.item ? data.item.uid : \"\")\n .attr(\"data-offset-index\", data.index);\n\n if (hasColumns && data.item) {\n if (altRow.length > 0) {\n element.addClass(altRow);\n } else {\n element.removeClass(\"k-table-alt-row\");\n }\n element.html(renderColumns(this.options, data.item, templates));\n } else {\n element.find(\".\" + GROUPITEM).remove();\n element.find(\".k-list-item-text\").html(itemTemplate(data.item || {}));\n }\n\n element.toggleClass(FOCUSED, data.current);\n element.toggleClass(SELECTED, data.selected);\n element.toggleClass(\"k-first\", data.newGroup);\n element.toggleClass(\"k-last\", data.isLastGroupedItem);\n element.toggleClass(\"k-loading-item\", !data.item);\n\n if (data.index !== 0 && data.newGroup) {\n if (hasColumns) {\n $('' + templates.groupTemplate(data.group) + '')\n .appendTo(element);\n } else {\n $(\"
\")\n .appendTo(element)\n .html(templates.groupTemplate(data.group));\n }\n } else if (data.group && hasColumns) {\n element.append($(''));\n }\n\n if (data.top !== undefined$1) {\n position(element[0], data.top);\n }\n\n this.angular(\"compile\", function() {\n return { elements: [ element ], data: [ { dataItem: data.item, group: data.group, newGroup: data.newGroup } ] };\n });\n }\n\n function renderColumns(options, dataItem, templates) {\n var item = \"\";\n\n for (var i = 0; i < options.columns.length; i++) {\n var currentWidth = options.columns[i].width;\n var currentWidthInt = parseInt(currentWidth, 10);\n var widthStyle = '';\n\n if (currentWidth) {\n widthStyle += \"style='width:\";\n widthStyle += currentWidthInt;\n widthStyle += percentageUnitsRegex.test(currentWidth) ? \"%\" : \"px\";\n widthStyle += \";'\";\n }\n item += \"\";\n item += templates[\"column\" + i](dataItem);\n item += \"\";\n }\n\n return item;\n }\n\n function mapChangedItems(selected, itemsToMatch) {\n var itemsLength = itemsToMatch.length;\n var selectedLength = selected.length;\n var dataItem;\n var found;\n var i, j;\n\n var changed = [];\n var unchanged = [];\n\n if (selectedLength) {\n for (i = 0; i < selectedLength; i++) {\n dataItem = selected[i];\n found = false;\n\n for (j = 0; j < itemsLength; j++) {\n if (dataItem === itemsToMatch[j]) {\n found = true;\n changed.push({ index: i, item: dataItem });\n break;\n }\n }\n\n if (!found) {\n unchanged.push(dataItem);\n }\n }\n }\n\n return {\n changed: changed,\n unchanged: unchanged\n };\n }\n\n function isActivePromise(promise) {\n return promise && promise.state() !== \"resolved\";\n }\n\n var VirtualList = DataBoundWidget.extend({\n init: function(element, options) {\n var that = this,\n contentClasses = options.columns && options.columns.length ? TABLE_CONTENT : LIST_CONTENT;\n\n that.bound(false);\n that._fetching = false;\n\n Widget.fn.init.call(that, element, options);\n\n if (!that.options.itemHeight) {\n that.options.itemHeight = getDefaultItemHeight(options.listSize);\n }\n\n options = that.options;\n\n that.element.attr(\"role\", \"listbox\");\n\n that.content = that.wrapper = that.element.wrap(\"
\").parent();\n\n if (that.options.columns && that.options.columns.length) {\n var thead = that.element.closest(\".k-data-table\").find('.k-table-thead');\n var row = $('' +\n '' +\n '');\n\n thead.append(row);\n\n that.header = row.find(\".k-table-th\");\n that.element.addClass(TABLE_LIST + \" k-virtual-table\");\n } else {\n that.header = that.content.before(\"
\").prev();\n that.element.addClass(LIST_UL);\n }\n\n if (options.ariaLabel) {\n this.element.attr(\"aria-label\", options.ariaLabel);\n } else if (options.ariaLabelledBy) {\n this.element.attr(\"aria-labelledby\", options.ariaLabelledBy);\n }\n\n that.element.on(\"mouseenter\" + VIRTUAL_LIST_NS, \"li:not(.k-loading-item)\", function() { $(this).addClass(HOVER); })\n .on(\"mouseleave\" + VIRTUAL_LIST_NS, \"li\", function() { $(this).removeClass(HOVER); });\n\n that._values = toArray(that.options.value);\n that._selectedDataItems = [];\n that._selectedIndexes = [];\n that._rangesList = {};\n that._promisesList = [];\n that._optionID = kendo.guid();\n\n that._templates();\n\n that.setDataSource(options.dataSource);\n\n that.content.on(\"scroll\" + VIRTUAL_LIST_NS, kendo.throttle(function() {\n that._renderItems();\n that._triggerListBound();\n }, options.delay));\n\n that._selectable();\n },\n\n options: {\n name: \"VirtualList\",\n autoBind: true,\n delay: 100,\n height: null,\n listScreens: 4,\n threshold: 0.5,\n itemHeight: null,\n oppositeBuffer: 1,\n type: \"flat\",\n selectable: false,\n value: [],\n dataValueField: null,\n template: \"#:data#\",\n placeholderTemplate: \"loading...\",\n groupTemplate: \"#:data#\",\n fixedGroupTemplate: \"#:data#\",\n mapValueTo: \"index\",\n valueMapper: null,\n ariaLabel: null,\n ariaLabelledBy: null\n },\n\n events: [\n CHANGE,\n CLICK,\n LISTBOUND,\n ITEMCHANGE,\n ACTIVATE,\n DEACTIVATE\n ],\n\n setOptions: function(options) {\n var itemClass = this.options.columns && this.options.columns.length ? TABLE_ITEM : LIST_ITEM;\n\n Widget.fn.setOptions.call(this, options);\n\n if (this._selectProxy && this.options.selectable === false) {\n this.element.off(CLICK, \".\" + itemClass, this._selectProxy);\n } else if (!this._selectProxy && this.options.selectable) {\n this._selectable();\n }\n\n this._templates();\n this.refresh();\n },\n\n items: function() {\n return $(this._items);\n },\n\n destroy: function() {\n this.wrapper.off(VIRTUAL_LIST_NS);\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n Widget.fn.destroy.call(this);\n },\n\n setDataSource: function(source) {\n var that = this;\n var dataSource = source || {};\n var value;\n\n dataSource = Array.isArray(dataSource) ? { data: dataSource } : dataSource;\n dataSource = kendo.data.DataSource.create(dataSource);\n\n if (that.dataSource) {\n that.dataSource.unbind(CHANGE, that._refreshHandler);\n\n that._clean();\n that.bound(false);\n\n that._deferValueSet = true;\n value = that.value();\n\n that.value([]);\n that.mute(function() {\n that.value(value);\n });\n } else {\n that._refreshHandler = that.refresh.bind(that);\n }\n\n that.dataSource = dataSource.bind(CHANGE, that._refreshHandler);\n\n that.setDSFilter(dataSource.filter());\n\n if (dataSource.view().length !== 0) {\n that.refresh();\n } else if (that.options.autoBind) {\n dataSource.fetch();\n }\n },\n\n skip: function() {\n return this.dataSource.currentRangeStart();\n },\n\n _triggerListBound: function() {\n var that = this;\n var skip = that.skip();\n\n if (that.bound() && !that._selectingValue && that._skip !== skip) {\n that._skip = skip;\n that.trigger(LISTBOUND);\n }\n },\n\n _getValues: function(dataItems) {\n var getter = this._valueGetter;\n\n return $.map(dataItems, function(dataItem) {\n return getter(dataItem);\n });\n },\n\n _highlightSelectedItems: function() {\n for (var i = 0; i < this._selectedDataItems.length; i++) {\n var item = this._getElementByDataItem(this._selectedDataItems[i]);\n if (item.length) {\n item.addClass(SELECTED);\n }\n }\n },\n\n refresh: function(e) {\n var that = this;\n var action = e && e.action;\n var isItemChange = action === \"itemchange\";\n var filtered = this.isFiltered();\n var result;\n\n if (that._mute) { return; }\n\n that._deferValueSet = false;\n\n if (!that._fetching) {\n if (filtered) {\n that.focus(0);\n }\n\n that._createList();\n if (!action && that._values.length && !filtered &&\n !that.options.skipUpdateOnBind && !that._emptySearch) {\n that._selectingValue = true;\n\n that.bound(true);\n that.value(that._values, true).done(function() {\n that._selectingValue = false;\n that._triggerListBound();\n });\n } else {\n that.bound(true);\n that._highlightSelectedItems();\n that._triggerListBound();\n }\n } else {\n if (that._renderItems) {\n that._renderItems(true);\n }\n\n that._triggerListBound();\n }\n\n if (isItemChange || action === \"remove\") {\n result = mapChangedItems(that._selectedDataItems, e.items);\n if (result.changed.length) {\n if (isItemChange) {\n that.trigger(\"selectedItemChange\", {\n items: result.changed\n });\n } else {\n that.value(that._getValues(result.unchanged));\n }\n }\n }\n\n that._fetching = false;\n },\n\n removeAt: function(position) {\n var value = this._values.splice(position, 1)[0];\n\n return {\n position: position,\n dataItem: this._removeSelectedDataItem(value)\n };\n },\n\n _removeSelectedDataItem: function(value) {\n var that = this,\n valueGetter = that._valueGetter;\n\n for (var idx in that._selectedDataItems) {\n if (valueGetter(that._selectedDataItems[idx]) === value) {\n that._selectedIndexes.splice(idx, 1);\n return that._selectedDataItems.splice(idx, 1)[0];\n }\n }\n },\n\n setValue: function(value) {\n this._values = toArray(value);\n },\n\n value: function(value, _forcePrefetch) {\n var that = this;\n\n if (value === undefined$1) {\n return that._values.slice();\n }\n\n if (value === null) {\n value = [];\n }\n\n value = toArray(value);\n\n if (!that._valueDeferred || that._valueDeferred.state() === \"resolved\") {\n that._valueDeferred = $.Deferred();\n }\n\n var shouldClear = that.options.selectable === \"multiple\" && that.select().length && value.length;\n\n if (shouldClear || !value.length) {\n that.select(-1);\n }\n\n that._values = value;\n\n if ((that.bound() && !that._mute && !that._deferValueSet) || _forcePrefetch) {\n that._prefetchByValue(value);\n }\n\n return that._valueDeferred;\n },\n\n _checkValuesOrder: function(value) {\n if (this._removedAddedIndexes &&\n this._removedAddedIndexes.length === value.length) {\n var newValue = this._removedAddedIndexes.slice();\n this._removedAddedIndexes = null;\n return newValue;\n }\n\n return value;\n },\n\n _prefetchByValue: function(value) {\n var that = this,\n dataView = that._dataView,\n valueGetter = that._valueGetter,\n mapValueTo = that.options.mapValueTo,\n item, match = false,\n forSelection = [];\n\n //try to find the items in the loaded data\n for (var i = 0; i < value.length; i++) {\n for (var idx = 0; idx < dataView.length; idx++) {\n item = dataView[idx].item;\n if (item) {\n match = isPrimitive(item) ? value[i] === item : value[i] === valueGetter(item);\n\n if (match) {\n forSelection.push(dataView[idx].index);\n }\n }\n }\n }\n\n if (forSelection.length === value.length) {\n that._values = [];\n that.select(forSelection);\n return;\n }\n\n //prefetch the items\n if (typeof that.options.valueMapper === \"function\") {\n that.options.valueMapper({\n value: (this.options.selectable === \"multiple\") ? value : value[0],\n success: function(response) {\n if (mapValueTo === \"index\") {\n that.mapValueToIndex(response);\n } else if (mapValueTo === \"dataItem\") {\n that.mapValueToDataItem(response);\n }\n }\n });\n } else {\n if (!that.value()[0]) {\n that.select([-1]);\n } else {\n that._selectingValue = false;\n that._triggerListBound();\n }\n }\n },\n\n mapValueToIndex: function(indexes) {\n if (indexes === undefined$1 || indexes === -1 || indexes === null) {\n indexes = [];\n } else {\n indexes = toArray(indexes);\n }\n\n if (!indexes.length) {\n indexes = [-1];\n } else {\n var removed = this._deselect([]).removed;\n if (removed.length) {\n this._triggerChange(removed, []);\n }\n }\n\n this.select(indexes);\n },\n\n mapValueToDataItem: function(dataItems) {\n var removed, added;\n\n if (dataItems === undefined$1 || dataItems === null) {\n dataItems = [];\n } else {\n dataItems = toArray(dataItems);\n }\n\n if (!dataItems.length) {\n this.select([-1]);\n } else {\n removed = $.map(this._selectedDataItems, function(item, index) {\n return { index: index, dataItem: item };\n });\n\n added = $.map(dataItems, function(item, index) {\n return { index: index, dataItem: item };\n });\n\n this._selectedDataItems = dataItems;\n\n this._selectedIndexes = [];\n\n for (var i = 0; i < this._selectedDataItems.length; i++) {\n var item = this._getElementByDataItem(this._selectedDataItems[i]);\n this._selectedIndexes.push(this._getIndecies(item)[0]);\n item.addClass(SELECTED);\n }\n\n this._triggerChange(removed, added);\n\n if (this._valueDeferred) {\n this._valueDeferred.resolve();\n }\n }\n },\n\n deferredRange: function(index) {\n var dataSource = this.dataSource;\n var take = this.itemCount;\n var ranges = this._rangesList;\n var result = $.Deferred();\n var defs = [];\n\n var low = Math.floor(index / take) * take;\n var high = Math.ceil(index / take) * take;\n\n var pages = high === low ? [ high ] : [ low, high ];\n\n $.each(pages, function(_, skip) {\n var end = skip + take;\n var existingRange = ranges[skip];\n var deferred;\n\n if (!existingRange || (existingRange.end !== end)) {\n deferred = $.Deferred();\n ranges[skip] = { end: end, deferred: deferred };\n\n dataSource._multiplePrefetch(skip, take, function() {\n deferred.resolve();\n });\n } else {\n deferred = existingRange.deferred;\n }\n\n defs.push(deferred);\n });\n\n $.when.apply($, defs).then(function() {\n result.resolve();\n });\n\n return result;\n },\n\n prefetch: function(indexes) {\n var that = this,\n take = this.itemCount,\n isEmptyList = !that._promisesList.length;\n\n if (!isActivePromise(that._activeDeferred)) {\n that._activeDeferred = $.Deferred();\n that._promisesList = [];\n }\n\n $.each(indexes, function(_, index) {\n that._promisesList.push(that.deferredRange(that._getSkip(index, take)));\n });\n\n if (isEmptyList) {\n $.when.apply($, that._promisesList).done(function() {\n that._promisesList = [];\n that._activeDeferred.resolve();\n });\n }\n\n return that._activeDeferred;\n },\n\n _findDataItem: function(view, index) {\n var group;\n\n //find in grouped view\n if (this.options.type === \"group\") {\n for (var i = 0; i < view.length; i++) {\n group = view[i].items;\n if (group.length <= index) {\n index = index - group.length;\n } else {\n return group[index];\n }\n }\n }\n\n //find in flat view\n return view[index];\n },\n\n _getRange: function(skip, take) {\n return this.dataSource._findRange(skip, Math.min(skip + take, this.dataSource.total()));\n },\n\n dataItemByIndex: function(index) {\n var that = this;\n var take = that.itemCount;\n var skip = that._getSkip(index, take);\n var view = this._getRange(skip, take);\n\n //should not return item if data is not loaded\n if (!that._getRange(skip, take).length) {\n return null;\n }\n\n if (that.options.type === \"group\") {\n kendo.ui.progress($(that.wrapper), true);\n that.mute(function() {\n that.dataSource.range(skip, take, function() {\n kendo.ui.progress($(that.wrapper), false);\n });\n view = that.dataSource.view();\n });\n }\n\n return that._findDataItem(view, [index - skip]);\n },\n\n selectedDataItems: function() {\n return this._selectedDataItems.slice();\n },\n\n scrollWith: function(value) {\n this.content.scrollTop(this.content.scrollTop() + value);\n },\n\n scrollTo: function(y) {\n this.content.scrollTop(y); //works only if the element is visible\n },\n\n scrollToIndex: function(index) {\n this.scrollTo(index * this.options.itemHeight);\n },\n\n focus: function(candidate) {\n var element,\n index,\n data,\n current,\n itemHeight = this.options.itemHeight,\n id = this._optionID,\n triggerEvent = true;\n\n if (candidate === undefined$1) {\n current = this.element.find(\".\" + FOCUSED);\n return current.length ? current : null;\n }\n\n if (typeof candidate === \"function\") {\n data = this.dataSource.flatView();\n for (var idx = 0; idx < data.length; idx++) {\n if (candidate(data[idx])) {\n candidate = idx;\n break;\n }\n }\n }\n\n if (candidate instanceof Array) {\n candidate = lastFrom(candidate);\n }\n\n if (isNaN(candidate)) {\n element = $(candidate);\n index = parseInt($(element).attr(\"data-offset-index\"), 10);\n } else {\n index = candidate;\n element = this._getElementByIndex(index);\n }\n\n if (index === -1) {\n this.element.find(\".\" + FOCUSED).removeClass(FOCUSED);\n this._focusedIndex = undefined$1;\n return;\n }\n\n if (element.length) { /*focus rendered item*/\n if (element.hasClass(FOCUSED)) {\n triggerEvent = false;\n }\n if (this._focusedIndex !== undefined$1) {\n current = this._getElementByIndex(this._focusedIndex);\n current\n .removeClass(FOCUSED)\n .removeAttr(\"id\");\n\n if (triggerEvent) {\n this.trigger(DEACTIVATE);\n }\n }\n\n this._focusedIndex = index;\n\n element\n .addClass(FOCUSED)\n .attr(\"id\", id);\n\n var position = this._getElementLocation(index);\n\n if (position === \"top\") {\n this.scrollTo(index * itemHeight);\n } else if (position === \"bottom\") {\n this.scrollTo((index * itemHeight + itemHeight) - this._screenHeight);\n } else if (position === \"outScreen\") {\n this.scrollTo(index * itemHeight);\n }\n\n if (triggerEvent) {\n this.trigger(ACTIVATE);\n }\n } else { /*focus non rendered item*/\n this._focusedIndex = index;\n this.items().removeClass(FOCUSED);\n this.scrollToIndex(index);\n }\n },\n\n focusIndex: function() {\n return this._focusedIndex;\n },\n\n focusFirst: function() {\n this.scrollTo(0);\n this.focus(0);\n },\n\n focusLast: function() {\n var lastIndex = this.dataSource.total();\n this.scrollTo(this.heightContainer.offsetHeight);\n this.focus(lastIndex - 1);\n },\n\n focusPrev: function() {\n var index = this._focusedIndex;\n var current;\n\n if (!isNaN(index) && index > 0) {\n index -= 1;\n this.focus(index);\n\n current = this.focus();\n if (current && current.hasClass(\"k-loading-item\")) {\n index += 1;\n this.focus(index);\n }\n\n return index;\n } else {\n index = this.dataSource.total() - 1;\n this.focus(index);\n return index;\n }\n },\n\n focusNext: function() {\n var index = this._focusedIndex;\n var lastIndex = this.dataSource.total() - 1;\n var current;\n\n if (!isNaN(index) && index < lastIndex) {\n index += 1;\n this.focus(index);\n\n current = this.focus();\n if (current && current.hasClass(\"k-loading-item\")) {\n index -= 1;\n this.focus(index);\n }\n\n return index;\n } else {\n index = 0;\n this.focus(index);\n return index;\n }\n },\n\n _triggerChange: function(removed, added) {\n removed = removed || [];\n added = added || [];\n\n if (removed.length || added.length) {\n this.trigger(CHANGE, {\n removed: removed,\n added: added\n });\n }\n },\n\n select: function(candidate) {\n var that = this,\n indices,\n initialIndices,\n singleSelection = that.options.selectable !== \"multiple\",\n prefetchStarted = isActivePromise(that._activeDeferred),\n filtered = this.isFiltered(),\n isAlreadySelected,\n deferred,\n result,\n removed = [];\n\n if (candidate === undefined$1) {\n return that._selectedIndexes.slice();\n }\n\n if (!that._selectDeferred || that._selectDeferred.state() === \"resolved\") {\n that._selectDeferred = $.Deferred();\n }\n\n indices = that._getIndecies(candidate);\n isAlreadySelected = singleSelection && !filtered && lastFrom(indices) === lastFrom(this._selectedIndexes);\n removed = that._deselectCurrentValues(indices);\n\n if (removed.length || !indices.length || isAlreadySelected) {\n that._triggerChange(removed);\n\n if (that._valueDeferred) {\n that._valueDeferred.resolve().promise();\n }\n\n return that._selectDeferred.resolve().promise();\n }\n\n if (indices.length === 1 && indices[0] === -1) {\n indices = [];\n }\n\n initialIndices = indices;\n result = that._deselect(indices);\n removed = result.removed;\n indices = result.indices;\n\n if (singleSelection) {\n prefetchStarted = false;\n if (indices.length) {\n indices = [lastFrom(indices)];\n }\n }\n\n var done = function() {\n var added = that._select(indices);\n\n if (initialIndices.length === indices.length || singleSelection) {\n that.focus(indices);\n }\n\n that._triggerChange(removed, added);\n\n if (that._valueDeferred) {\n that._valueDeferred.resolve();\n }\n\n that._selectDeferred.resolve();\n };\n\n deferred = that.prefetch(indices);\n\n if (!prefetchStarted) {\n if (deferred) {\n deferred.done(done);\n } else {\n done();\n }\n }\n\n return that._selectDeferred.promise();\n },\n\n bound: function(bound) {\n if (bound === undefined$1) {\n return this._listCreated;\n }\n\n this._listCreated = bound;\n },\n\n mute: function(callback) {\n this._mute = true;\n callback();\n this._mute = false;\n },\n\n setDSFilter: function(filter) {\n this._lastDSFilter = $.extend({}, filter);\n },\n\n isFiltered: function() {\n if (!this._lastDSFilter) {\n this.setDSFilter(this.dataSource.filter());\n }\n\n return !kendo.data.Query.compareFilters(this.dataSource.filter(), this._lastDSFilter);\n },\n\n skipUpdate: $.noop,\n\n _getElementByIndex: function(index) {\n return this.items().filter(function(idx, element) {\n return index === parseInt($(element).attr(\"data-offset-index\"), 10);\n });\n },\n\n _getElementByDataItem: function(dataItem) {\n var dataView = this._dataView,\n valueGetter = this._valueGetter,\n element, match;\n\n for (var i = 0; i < dataView.length; i++) {\n match = dataView[i].item && isPrimitive(dataView[i].item) ? dataView[i].item === dataItem : dataView[i].item && dataItem && valueGetter(dataView[i].item) == valueGetter(dataItem);\n if (match) {\n element = dataView[i];\n break;\n }\n }\n\n return element ? this._getElementByIndex(element.index) : $();\n },\n\n _clean: function() {\n this.result = undefined$1;\n this._lastScrollTop = undefined$1;\n this._skip = undefined$1;\n $(this.heightContainer).remove();\n this.heightContainer = undefined$1;\n this.element.empty();\n },\n\n _height: function() {\n var hasData = !!this.dataSource.view().length,\n height = this.options.height,\n itemHeight = this.options.itemHeight,\n total = this.dataSource.total();\n\n if (!hasData) {\n height = 0;\n } else if (height / itemHeight > total) {\n height = total * itemHeight;\n }\n\n return height;\n },\n\n setScreenHeight: function() {\n var height = this._height();\n\n this.content.height(height);\n this._screenHeight = height;\n },\n\n screenHeight: function() {\n return this._screenHeight;\n },\n\n _getElementLocation: function(index) {\n var scrollTop = this.content.scrollTop(),\n screenHeight = this._screenHeight,\n itemHeight = this.options.itemHeight,\n yPosition = index * itemHeight,\n yDownPostion = yPosition + itemHeight,\n screenEnd = scrollTop + screenHeight,\n position;\n\n if (yPosition === (scrollTop - itemHeight) || (yDownPostion > scrollTop && yPosition < scrollTop)) {\n position = \"top\";\n } else if (yPosition === screenEnd || (yPosition < screenEnd && screenEnd < yDownPostion)) {\n position = \"bottom\";\n } else if ((yPosition >= scrollTop) && (yPosition <= scrollTop + (screenHeight - itemHeight))) {\n position = \"inScreen\";\n } else {\n position = \"outScreen\";\n }\n\n return position;\n },\n\n _templates: function() {\n var options = this.options;\n var templates = {\n template: options.template,\n placeholderTemplate: options.placeholderTemplate,\n groupTemplate: options.groupTemplate,\n fixedGroupTemplate: options.fixedGroupTemplate\n };\n\n if (options.columns) {\n for (var i = 0; i < options.columns.length; i++) {\n var currentColumn = options.columns[i];\n var templateText = currentColumn.field ? currentColumn.field.toString() : \"text\";\n\n templates[\"column\" + i] = currentColumn.template || \"#: \" + templateText + \"#\";\n }\n }\n\n for (var key in templates) {\n if (typeof templates[key] !== \"function\") {\n templates[key] = kendo.template(templates[key] || \"\");\n }\n }\n\n this.templates = templates;\n },\n\n _generateItems: function(element, count) {\n var items = [],\n item, text,\n itemHeight = this.options.itemHeight + \"px\",\n itemClass = this.options.columns && this.options.columns.length ? TABLE_ITEM : LIST_ITEM;\n\n while (count-- > 0) {\n text = document.createElement(\"span\");\n text.className = \"k-list-item-text\";\n\n item = document.createElement(\"li\");\n item.tabIndex = -1;\n item.className = itemClass;\n item.setAttribute(\"role\", \"option\");\n item.style.height = itemHeight;\n item.style.minHeight = itemHeight;\n item.appendChild(text);\n\n element.appendChild(item);\n\n items.push(item);\n }\n\n return items;\n },\n\n _saveInitialRanges: function() {\n var ranges = this.dataSource._ranges;\n var deferred = $.Deferred();\n deferred.resolve();\n\n this._rangesList = {};\n for (var i = 0; i < ranges.length; i++) {\n this._rangesList[ranges[i].start] = { end: ranges[i].end, deferred: deferred };\n }\n },\n\n _createList: function() {\n var that = this,\n content = that.content.get(0),\n options = that.options,\n dataSource = that.dataSource;\n\n if (that.bound()) {\n that._clean();\n }\n\n that._saveInitialRanges();\n that._buildValueGetter();\n that.setScreenHeight();\n that.itemCount = getItemCount(that._screenHeight, options.listScreens, options.itemHeight);\n\n if (that.itemCount > dataSource.total()) {\n that.itemCount = dataSource.total();\n }\n\n that._items = that._generateItems(that.element[0], that.itemCount);\n\n that._setHeight(options.itemHeight * dataSource.total());\n that.options.type = (dataSource.group() || []).length ? \"group\" : \"flat\";\n\n if (that.options.type === \"flat\") {\n if (that.header.closest(GROUP_ROW_SEL).length) {\n that.header.closest(GROUP_ROW_SEL).hide();\n } else {\n that.header.hide();\n }\n } else {\n if (that.header.closest(GROUP_ROW_SEL).length) {\n that.header.closest(GROUP_ROW_SEL).show();\n } else {\n that.header.show();\n }\n }\n\n that.getter = that._getter(function() {\n that._renderItems(true);\n });\n\n that._onScroll = function(scrollTop, force) {\n var getList = that._listItems(that.getter);\n return that._fixedHeader(scrollTop, getList(scrollTop, force));\n };\n\n that._renderItems = that._whenChanged(\n scrollCallback(content, that._onScroll),\n syncList(that._reorderList(that._items, render.bind(that)))\n );\n\n that._renderItems();\n that._calculateGroupPadding(that._screenHeight);\n that._calculateColumnsHeaderPadding();\n },\n\n _setHeight: function(height) {\n var currentHeight,\n heightContainer = this.heightContainer;\n\n if (!heightContainer) {\n heightContainer = this.heightContainer = appendChild(this.content[0], HEIGHTCONTAINER);\n } else {\n currentHeight = heightContainer.offsetHeight;\n }\n\n if (height !== currentHeight) {\n heightContainer.innerHTML = \"\";\n\n while (height > 0) {\n var padHeight = Math.min(height, 250000); //IE workaround, should not create elements with height larger than 250000px\n appendChild(heightContainer).style.height = padHeight + \"px\";\n height -= padHeight;\n }\n }\n },\n\n _getter: function() {\n var lastRequestedRange = null,\n dataSource = this.dataSource,\n lastRangeStart = dataSource.skip(),\n type = this.options.type,\n pageSize = this.itemCount,\n flatGroups = {};\n\n if (dataSource.pageSize() < pageSize) {\n this.mute(function() {\n dataSource.pageSize(pageSize);\n });\n }\n\n return function(index, rangeStart) {\n var that = this;\n if (!dataSource.inRange(rangeStart, pageSize)) {\n if (lastRequestedRange !== rangeStart) {\n lastRequestedRange = rangeStart;\n lastRangeStart = rangeStart;\n\n if (that._getterDeferred) {\n that._getterDeferred.reject();\n }\n\n that._getterDeferred = that.deferredRange(rangeStart);\n that._getterDeferred.then(function() {\n var firstItemIndex = that._indexConstraint(that.content[0].scrollTop);\n\n that._getterDeferred = null;\n\n if (rangeStart <= firstItemIndex && firstItemIndex <= (rangeStart + pageSize)) {\n that._fetching = true;\n dataSource.range(rangeStart, pageSize);\n }\n });\n }\n\n return null;\n } else {\n if (lastRangeStart !== rangeStart) {\n this.mute(function() {\n dataSource.range(rangeStart, pageSize);\n lastRangeStart = rangeStart;\n });\n }\n\n var result;\n if (type === \"group\") { //grouped list\n if (!flatGroups[rangeStart]) {\n var flatGroup = flatGroups[rangeStart] = [];\n var groups = dataSource.view();\n for (var i = 0, len = groups.length; i < len; i++) {\n var group = groups[i];\n for (var j = 0, groupLength = group.items.length; j < groupLength; j++) {\n flatGroup.push({ item: group.items[j], group: group.value });\n }\n }\n }\n\n result = flatGroups[rangeStart][index - rangeStart];\n } else { //flat list\n result = dataSource.view()[index - rangeStart];\n }\n\n return result;\n }\n };\n },\n\n _fixedHeader: function(scrollTop, list) {\n var group = this.currentVisibleGroup,\n itemHeight = this.options.itemHeight,\n firstVisibleDataItemIndex = Math.floor((scrollTop - list.top) / itemHeight),\n firstVisibleDataItem = list.items[firstVisibleDataItemIndex];\n\n if (firstVisibleDataItem && firstVisibleDataItem.item) {\n var firstVisibleGroup = firstVisibleDataItem.group;\n\n if (firstVisibleGroup !== group) {\n var fixedGroupText = firstVisibleGroup || \"\";\n this.header.html(this.templates.fixedGroupTemplate(fixedGroupText));\n this.currentVisibleGroup = firstVisibleGroup;\n }\n }\n\n return list;\n },\n\n _itemMapper: function(item, index, value) {\n var listType = this.options.type,\n itemHeight = this.options.itemHeight,\n currentIndex = this._focusedIndex,\n selected = false,\n current = false,\n newGroup = false,\n group = null,\n match = false,\n valueGetter = this._valueGetter;\n\n if (listType === \"group\") {\n if (item) {\n newGroup = index === 0 || (this._currentGroup !== false && this._currentGroup !== item.group);\n this._currentGroup = item.group;\n }\n\n group = item ? item.group : null;\n item = item ? item.item : null;\n }\n\n if (this.options.mapValueTo === \"dataItem\" && this._selectedDataItems.length && item) {\n for (var i = 0; i < this._selectedDataItems.length; i++) {\n match = valueGetter(this._selectedDataItems[i]) === valueGetter(item);\n if (match) {\n selected = true;\n break;\n }\n }\n } else if (!this.isFiltered() && value.length && item) {\n for (var j = 0; j < value.length; j++) {\n match = isPrimitive(item) ? value[j] === item : value[j] === valueGetter(item);\n if (match) {\n value.splice(j , 1);\n selected = true;\n break;\n }\n }\n }\n\n if (currentIndex === index) {\n current = true;\n }\n\n return {\n item: item ? item : null,\n group: group,\n newGroup: newGroup,\n selected: selected,\n current: current,\n index: index,\n top: index * itemHeight\n };\n },\n\n _range: function(index) {\n var itemCount = this.itemCount,\n value = this._values.slice(),\n items = [],\n item;\n\n this._view = {};\n this._currentGroup = false;\n\n for (var i = index, length = index + itemCount; i < length; i++) {\n item = this._itemMapper(this.getter(i, index), i, value);\n if (items[items.length - 1]) {\n items[items.length - 1].isLastGroupedItem = item.newGroup;\n }\n items.push(item);\n this._view[item.index] = item;\n }\n\n this._dataView = items;\n return items;\n },\n\n _getDataItemsCollection: function(scrollTop, lastScrollTop) {\n var items = this._range(this._listIndex(scrollTop, lastScrollTop));\n return {\n index: items.length ? items[0].index : 0,\n top: items.length ? items[0].top : 0,\n items: items\n };\n },\n\n _listItems: function() {\n var screenHeight = this._screenHeight,\n options = this.options;\n\n var theValidator = listValidator(options, screenHeight);\n\n return (function(value, force) {\n var result = this.result,\n lastScrollTop = this._lastScrollTop;\n\n if (force || !result || !theValidator(result, value, lastScrollTop)) {\n result = this._getDataItemsCollection(value, lastScrollTop);\n }\n\n this._lastScrollTop = value;\n this.result = result;\n\n return result;\n }).bind(this);\n },\n\n _whenChanged: function(getter, callback) {\n var current;\n\n return function(force) {\n var theNew = getter(force);\n\n if (theNew !== current) {\n current = theNew;\n callback(theNew, force);\n }\n };\n },\n\n _reorderList: function(list, reorder) {\n var that = this;\n var length = list.length;\n var currentOffset = -Infinity;\n reorder = map2(reorder, this.templates).bind(this);\n\n return function(list2, offset, force) {\n var diff = offset - currentOffset;\n var range, range2;\n\n if (force || Math.abs(diff) >= length) { // full reorder\n range = list;\n range2 = list2;\n } else { // partial reorder\n range = reshift(list, diff);\n range2 = diff > 0 ? list2.slice(-diff) : list2.slice(0, -diff);\n }\n\n reorder(range, range2, that.bound());\n\n currentOffset = offset;\n };\n },\n\n _bufferSizes: function() {\n var options = this.options;\n\n return bufferSizes(this._screenHeight, options.listScreens, options.oppositeBuffer);\n },\n\n _indexConstraint: function(position) {\n var itemCount = this.itemCount,\n itemHeight = this.options.itemHeight,\n total = this.dataSource.total();\n\n return Math.min(Math.max(total - itemCount, 0), Math.max(0, Math.floor(position / itemHeight )));\n },\n\n _listIndex: function(scrollTop, lastScrollTop) {\n var buffers = this._bufferSizes(),\n position;\n\n position = scrollTop - ((scrollTop > lastScrollTop) ? buffers.down : buffers.up);\n\n return this._indexConstraint(position);\n },\n\n _selectable: function() {\n var itemClass = this.options.columns && this.options.columns.length ? TABLE_ITEM : LIST_ITEM;\n\n if (this.options.selectable) {\n this._selectProxy = this._clickHandler.bind(this);\n this.element.on(CLICK + VIRTUAL_LIST_NS, \".\" + itemClass, this._selectProxy);\n }\n },\n\n getElementIndex: function(element) {\n if (!(element instanceof jQuery)) {\n return undefined$1;\n }\n\n return parseInt(element.attr(\"data-offset-index\"), 10);\n },\n\n _getIndecies: function(candidate) {\n var result = [], data;\n\n if (typeof candidate === \"function\") {\n data = this.dataSource.flatView();\n for (var idx = 0; idx < data.length; idx++) {\n if (candidate(data[idx])) {\n result.push(idx);\n break;\n }\n }\n }\n\n if (typeof candidate === \"number\") {\n result.push(candidate);\n }\n\n var elementIndex = this.getElementIndex(candidate);\n if (!isNaN(elementIndex)) {\n result.push(elementIndex);\n }\n\n if (candidate instanceof Array) {\n result = candidate;\n }\n\n return result;\n },\n\n _deselect: function(indices) {\n var removed = [],\n selectedIndex,\n dataItem,\n selectedIndexes = this._selectedIndexes,\n selectedDataItems = this._selectedDataItems,\n position = 0,\n selectable = this.options.selectable,\n removedindexesCounter = 0,\n valueGetter = this._valueGetter,\n item, match,\n result = null;\n\n indices = indices.slice();\n\n if (selectable === true || !indices.length) { //deselect everything\n for (var idx = 0; idx < selectedIndexes.length; idx++) {\n if (selectedIndexes[idx] !== undefined$1) {\n this._getElementByIndex(selectedIndexes[idx]).removeClass(SELECTED);\n } else if (selectedDataItems[idx]) {\n this._getElementByDataItem(selectedDataItems[idx]).removeClass(SELECTED);\n }\n\n removed.push({\n index: selectedIndexes[idx],\n position: idx,\n dataItem: selectedDataItems[idx]\n });\n }\n\n this._values = [];\n this._selectedDataItems = [];\n this._selectedIndexes = [];\n } else if (selectable === \"multiple\") {\n for (var i = 0; i < indices.length; i++) {\n result = null;\n position = $.inArray(indices[i], selectedIndexes);\n dataItem = this.dataItemByIndex(indices[i]);\n\n if (position === -1 && dataItem) {\n for (var j = 0; j < selectedDataItems.length; j++) {\n match = isPrimitive(dataItem) ? selectedDataItems[j] === dataItem : valueGetter(selectedDataItems[j]) === valueGetter(dataItem);\n if (match) {\n item = this._getElementByIndex(indices[i]);\n result = this._deselectSingleItem(item, j, indices[i], removedindexesCounter);\n }\n }\n } else {\n selectedIndex = selectedIndexes[position];\n\n if (selectedIndex !== undefined$1) {\n item = this._getElementByIndex(selectedIndex);\n result = this._deselectSingleItem(item, position, selectedIndex, removedindexesCounter);\n }\n }\n\n if (result) {\n indices.splice(i, 1);\n removed.push(result);\n\n removedindexesCounter++;\n i--;\n }\n }\n }\n\n return {\n indices: indices,\n removed: removed\n };\n },\n\n _deselectSingleItem: function(item, position, selectedIndex, removedindexesCounter) {\n var dataItem;\n\n if (!item.hasClass(SELECTED)) {\n return;\n }\n\n item.removeClass(SELECTED);\n this._values.splice(position, 1);\n this._selectedIndexes.splice(position, 1);\n dataItem = this._selectedDataItems.splice(position, 1)[0];\n\n return {\n index: selectedIndex,\n position: position + removedindexesCounter,\n dataItem: dataItem\n };\n },\n\n _deselectCurrentValues: function(indices) {\n var children = this.element[0].children;\n var value, index, position;\n var values = this._values;\n var removed = [];\n var idx = 0;\n var j;\n\n if (this.options.selectable !== \"multiple\" || !this.isFiltered()) {\n return [];\n }\n\n if (indices[0] === -1) {\n $(children).removeClass(SELECTED);\n removed = $.map(this._selectedDataItems.slice(0), function(dataItem, idx) {\n return {\n dataItem: dataItem,\n position: idx\n };\n });\n this._selectedIndexes = [];\n this._selectedDataItems = [];\n this._values = [];\n return removed;\n }\n\n for (; idx < indices.length; idx++) {\n position = -1;\n index = indices[idx];\n if (this.dataItemByIndex(index)) {\n value = this._valueGetter(this.dataItemByIndex(index));\n }\n\n for (j = 0; j < values.length; j++) {\n if (value == values[j]) {\n position = j;\n break;\n }\n }\n\n if (position > -1) {\n removed.push(this.removeAt(position));\n $(children[index]).removeClass(SELECTED);\n }\n }\n\n return removed;\n },\n\n _getSkip: function(index, take) {\n var page = index < take ? 1 : Math.floor(index / take) + 1;\n\n return (page - 1) * take;\n },\n\n _select: function(indexes) {\n var that = this,\n singleSelection = this.options.selectable !== \"multiple\",\n dataSource = this.dataSource,\n dataItem, oldSkip,\n take = this.itemCount,\n valueGetter = this._valueGetter,\n added = [];\n\n if (singleSelection) {\n that._selectedIndexes = [];\n that._selectedDataItems = [];\n that._values = [];\n }\n\n oldSkip = dataSource.skip();\n\n $.each(indexes, function(_, index) {\n var skip = that._getSkip(index, take);\n\n that.mute(function() {\n dataSource.range(skip, take); //switch the range to get the dataItem\n\n dataItem = that._findDataItem(dataSource.view(), [index - skip]);\n that._selectedIndexes.push(index);\n that._selectedDataItems.push(dataItem);\n that._values.push(isPrimitive(dataItem) ? dataItem : valueGetter(dataItem));\n\n added.push({\n index: index,\n dataItem: dataItem\n });\n\n that._getElementByIndex(index).addClass(SELECTED);\n\n dataSource.range(oldSkip, take); //switch back the range\n });\n });\n\n that._values = that._checkValuesOrder(that._values);\n\n return added;\n },\n\n _clickHandler: function(e) {\n var item = $(e.currentTarget);\n\n if (!e.isDefaultPrevented() && item.attr(\"data-uid\")) {\n this.trigger(CLICK, { item: item });\n }\n },\n\n _buildValueGetter: function() {\n this._valueGetter = kendo.getter(this.options.dataValueField);\n },\n\n _calculateGroupPadding: function(height) {\n var firstItem = this.items().first(),\n groupHeader = this.header,\n padding = 0;\n\n if (groupHeader[0] && groupHeader[0].style.display !== \"none\") {\n if (height !== \"auto\") {\n padding = kendo.support.scrollbar();\n }\n\n padding += parseFloat(firstItem.css(\"border-right-width\"), 10) + parseFloat(firstItem.children(\".k-group\").css(\"right\"), 10);\n\n groupHeader.css(\"padding-right\", padding);\n }\n },\n\n _calculateColumnsHeaderPadding: function() {\n if (this.options.columns && this.options.columns.length) {\n var isRtl = kendo.support.isRtl(this.wrapper);\n var scrollbar = kendo.support.scrollbar();\n var columnsHeader = this.content.parent().parent().find(\".k-table-header\");\n var total = this.dataSource.total();\n\n columnsHeader.css((isRtl ? \"padding-left\" : \"padding-right\"), total ? scrollbar : 0);\n }\n }\n\n });\n\n kendo.ui.VirtualList = VirtualList;\n kendo.ui.plugin(VirtualList);\n\n })(window.kendo.jQuery);\n\n}));\n"]}