{"version":3,"sources":["kendo.core.js"],"names":["f","define","$","window","undefined","Class","compilePart","part","stringPart","split","join","replace","first","charAt","rest","substring","pad","number","digits","end","length","zeros","getShadows","element","shadow","css","kendo","support","transitions","radius","match","boxShadowRegExp","blur","math","max","left","right","bottom","wrap","autosize","percentage","width","height","percentWidth","percentHeight","forceWidth","browser","outerWidth","_outerWidth","outerHeight","_outerHeight","parent","windowOuterWidth","removeClass","hasClass","wrapResize","style","percentRegExp","test","is","addClass","boxSizing","mozBoxSizing","webkitBoxSizing","msie","floor","version","zoom","children","wrapper","wrapperStyle","display","position","deepExtend","destination","i","arguments","deepExtendOne","source","property","propValue","propType","propInit","destProp","ObservableArray","data","LazyObservableArray","DataSource","HierarchicalDataSource","OBJECT","constructor","Array","RegExp","isFunction","ArrayBuffer","UNDEFINED","Date","getTime","clone","testRx","agent","rxs","dflt","rx","hasOwnProperty","toHyphens","str","g","toLowerCase","toCamelCase","strMatch","g1","toUpperCase","getComputedStyles","properties","computedStyle","styles","document","defaultView","getComputedStyle","each","idx","value","getPropertyValue","currentStyle","size","isScrollable","className","indexOf","overflow","scrollLeft","isRtl","webkit","mozila","mozilla","el","scrollWidth","clientWidth","Math","abs","obj","key","result","getOffset","type","positioned","offset","sign","top","pointers","msPointers","pageYOffset","documentElement","scrollTop","pageXOffset","parseEffects","input","effects","this","fx","Element","prepareAnimationOptions","options","duration","reverse","complete","STRING","BOOLEAN","extend","init","noop","teardown","hide","completeCallback","animate","instance","queue","promise","toggleClass","classes","add","htmlEncode","ampRegExp","ltRegExp","gtRegExp","quoteRegExp","aposRegExp","unescape","template","decodeURIComponent","error","_","m1","m2","String","fromCharCode","parseInt","parseOption","option","dashRegExp","getAttribute","ns","numberRegExp","parseFloat","jsonRegExp","jsonFormatRegExp","Function","parseOptions","role","templateRegExp","html","containmentComparer","a","b","contains","resizableWidget","widget","inArray","attr","focusable","isTabIndexNotNaN","nodeName","disabled","href","visible","expr","pseudos","parents","addBack","filter","kendoJQuery","selector","context","fn","Template","preventDefault","isDefaultPrevented","Observable","argumentNameRegExp","encodeRegExp","escapedCurlyRegExp","curlyRegExp","escapedSharpRegExp","sharpRegExp","directions","eventTarget","wrapExpression","localUrlRe","Widget","DataBoundWidget","ContainerNullObject","MobileWidget","MOUSE_EVENTS","EXCLUDE_BUST_CLICK_SELECTOR","MouseEventNormalizer","eventMap","getEventMap","eventRegEx","on","rootjQuery","animationFrame","animationQueue","cultures","isArray","proxy","JSON","formatRegExp","FUNCTION","NUMBER","NULL","getterCache","setterCache","slice","noDepricateExtend","src","copyIsArray","copy","name","target","deep","jQuery","isPlainObject","proto","member","base","that","subclass","apply","prototype","Object","_initOptions","_defaultPrevented","_events","bind","eventName","handlers","one","original","handler","events","eventNames","handlersIsFunction","unbind","push","unshift","trigger","e","sender","call","splice","paramName","useWithBlock","render","compile","parts","settings","argumentName","functionBody","_slotCount","Error","format","quote","string","escapable","lastIndex","c","meta","charCodeAt","toString","holder","k","v","partial","mind","gap","toJSON","rep","isFinite","indent","\b","\t","\n","\f","\r","\"","\\","valueOf","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","Number","Boolean","stringify","replacer","space","","findCulture","culture","numberFormat","getCulture","current","formatDate","date","calendar","calendars","standard","days","months","patterns","dateFormatRegExp","minutes","getDate","namesAbbr","getDay","names","getMonth","getFullYear","getHours","getMinutes","getSeconds","getMilliseconds","AM","PM","getTimezoneOffset","formatNumber","decimal","precision","pattern","literals","symbol","isCurrency","isPercent","customPrecision","formatAndPrecision","negative","integer","fraction","integerLength","fractionLength","replacement","ch","hasGroup","hasNegativeFormat","decimalIndex","sharpIndex","zeroIndex","hasZero","hasSharp","percentIndex","currencyIndex","startZeroIndex","start","exp","rounded","POINT","decimals","EMPTY","toLocaleString","standardFormatRegExp","exec","currency","percent","toExponential","round","groupInteger","literalRegExp","quoteChar","literal","PLACEHOLDER","SHARP","ZERO","COMMA","commaRegExp","lastIndexOf","EN","objectToString",",",".","groupSize","abbr","namesShort","d","D","F","G","m","M","s","t","T","u","y","Y","/",":","firstDay","twoDigitYearMax","cultureName","newGroupSize","groupSizes","shift","toFixed","min","fmt","values","index","placeholderFormat","_extractFormat","_activeElement","activeElement","_round","includeMargin","outOfRange","designatorPredicate","designator","mapDesignators","designators","map","adjustDST","hours","setHours","lowerArray","array","lowerLocalInfo","localInfo","newLocalInfo","parseExact","strict","count","pmHour","UTC","matches","amDesignators","pmDesignators","hoursOffset","minutesOffset","hasTime","lookAhead","getNumber","rg","substr","valueIdx","getIndexByName","lower","nameLength","subValue","matchLength","matchIdx","checkLiteral","year","month","day","seconds","milliseconds","defaultYear","_lowerDays","_lowerMonths","longTimeZoneRegExp","shortTimeZoneRegExp","isNaN","setFullYear","parseMicrosoftFormatOffset","getDefaultFormats","cultureFormats","formatIdx","FORMATS_SEQUENCE","STANDARD_FORMATS","formats","concat","internalParseDate","tzoffset","dateRegExp","offsetRegExp","timezone","convert","nonBreakingSpaceRegExp","exponentRegExp","2","3","4","parseDate","parseExactDate","percentSymbol","table","docStyle","transforms","elementProto","mobileOS","documentMode","chrome","mobileChrome","safari","_scrollbar","scrollbar","refresh","div","createElement","cssText","innerHTML","body","appendChild","offsetWidth","removeChild","closest","tbodyInnerHtml","touch","HTMLElement","hasHW3D","WebKitCSSMatrix","cssFlexbox","lowPrefix","prefix","hasTransitions","event","devicePixelRatio","screenWidth","screen","availWidth","innerWidth","screenHeight","availHeight","innerHeight","detectOS","ua","minorVersion","os","notAndroidPhone","agentRxs","wp","fire","android","iphone","ipad","meego","webos","blackberry","playbook","windows","tizen","sailfish","ffos","osRxs","ios","flat","formFactorRxs","tablet","browserRxs","omini","omobile","firefox","mobilesafari","ie","navigator","device","majorVersion","flatVersion","cordova","PhoneGap","appMode","standalone","location","protocol","userAgent","wpDevicePixelRatio","hasNativeScrolling","delayedClick","mouseAndTouchPresent","detectBrowser","edge","opera","detectClipboardAccess","commands","queryCommandSupported","cut","paste","clipboard","zoomLevel","ie11WidthCorrection","docEl","scrollHeight","clientHeight","cssBorderSpacing","borderSpacing","cssClass","docElement","eventCapture","addEventListener","placeholder","propertyChangeEvent","types","setAttribute","cssFloat","stableSort","threshold","sorted","field","sort","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","nodeList","querySelectorAll","parentNode","matchMedia","pushState","history","hashChange","customElements","crios","MSPointerEvent","PointerEvent","kineticScrollNeeded","down","up","in","out","enabled","dequeue","disable","promiseShim","enable","animatedPromise","kendoStop","clearQueue","gotoEnd","stop","kendoAnimate","kendoAddClass","kendoRemoveClass","kendoToggleClass","toggle","touches","originalEvent","changedTouches","elementFromPoint","clientX","clientY","callback","mousedown","mouseup","mousemove","mousecancel","click","resize","members","widgets","_widgetRegisteredCallbacks","ui","mobile","dataviz","drawing","spreadsheet","messages","keys","INSERT","DELETE","BACKSPACE","TAB","ENTER","ESC","LEFT","UP","RIGHT","DOWN","END","HOME","SPACEBAR","PAGEUP","PAGEDOWN","F2","F10","F12","NUMPAD_PLUS","NUMPAD_MINUS","NUMPAD_DOT","isLocalUrl","url","expression","safe","getter","setter","accessor","get","set","guid","random","id","roleSelector","directiveSelector","directives","selectors","triggeredByInput","tagName","onWidgetRegistered","len","logToConsole","message","console","suppressLog","log","dataSource","angular","defaults","_hasBindingTarget","kendoBindingTarget","_tabindex","TABINDEX","tabindex","removeAttr","setOptions","_setEvents","force","getSize","currentSize","_size","_resize","dimensions","setSize","destroy","removeData","_destroy","_muteAngularRebind","_muteRebind","dataItems","flatView","_angularItems","cmd","elements","items","dataItem","domElement","offsetHeight","notify","initWidget","roles","fullPath","widgetKeyRegExp","widgetKey","nodeType","isEmptyObject","rolesFromNamespaces","namespaces","find","widgetsArray","makeArray","widgetInstance","progress","container","leftRight","webkitCorrection","containerScrollLeft","mask","opacity","loading","prependTo","remove","plugin","register","widgetEntry","args","method","nullObject","autoApplyNS","kendoDestroy","view","viewElement","viewHasNativeScrolling","useNativeScrolling","eq","appLevelNativeScrolling","application","themes","views","touchScroller","useNative","Scroller","kendoMobileScroller","suites","editorToolbar","elementData","onResize","setTimeout","unbindResize","off","attrValue","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","kendoFocusable","setupMouseMute","mouseTrap","bustClick","captureMouse","stopPropagation","muteMouse","clearTimeout","mouseTrapTimeoutID","unMuteMouse","move","cancel","MSPointerEnter","MSPointerLeave","orig","fix","special","delegateType","bindType","handle","ret","related","relatedTarget","handleObj","origType","applyEventMap","keyDownHandler","kendoKeydown","preventKendoKeydown","keyDownCallBack","pop","search","touchstart","touchend","ruleToDate","rule","targetDay","ourDay","time","cache","getUTCDay","setUTCDate","findRule","utcTime","rules","zone","grep","from","to","findZone","zones","until","zoneRules","zoneAndRule","info","fromOffset","toOffset","diff","fromLocalOffset","toLocalOffset","tempToOffset","toLocalDate","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","Sun","Mon","Tue","Wed","Thu","Fri","Sat","setDayOfWeek","dir","setDate","dayOfWeek","firstDayOfMonth","lastDayOfMonth","last","timeOffset","moveDateToWeekStart","weekStartDay","addDays","calcWeekInYear","firstWeekInYear","newDate","diffInMS","MS_PER_DAY","weekInYear","prevWeekDate","nextWeekDate","weekNumber","toUtcTime","toInvariantTime","isInTimeRange","msValue","msMin","msMax","isInDateRange","setTime","ignoreDST","difference","MS_PER_MINUTE","today","isToday","staticDate","nextDay","previousDay","MS_PER_HOUR","stripWhitespace","iterator","child","createNodeIterator","NodeFilter","SHOW_TEXT","node","FILTER_ACCEPT","FILTER_REJECT","nextNode","referenceNode","textContent","trim","childNodes","nodeValue","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","queueAnimation","runNextAnimation","parseQueryStringParams","queryString","params","paramParts","elementUnderCursor","x","client","wheelDeltaY","jQueryEvent","delta","deltaY","wheelDelta","detail","axis","VERTICAL_AXIS","throttle","delay","timeout","throttled","lastExecTime","elapsed","caret","rangeElement","rangeDuplicated","selectionStart","selectionEnd","isPosition","focus","setSelectionRange","selection","createTextRange","collapse","moveStart","moveEnd","select","duplicate","moveToBookmark","createRange","getBookmark","setEndPoint","text","compileMobileDirective","scope","injector","invoke","$compile","$$phase","$digest","antiForgeryTokens","tokens","csrf_token","csrf_param","cycleForm","form","firstElement","lastElement","keyCode","shiftKey","focusElement","scrollTopPositions","scrollableParents","parentsUntil","setActive","focusNextElement","focussable","nextElement","matchesMedia","mediaQuery","media","_bootstrapToMedia","bootstrapMedia","xs","sm","md","lg","xl","fileGroupMap","audio","video","image","txt","presentation","programming","pdf","config","zip","disc-image","getFileGroup","extension","withPrefix","extensions","fileTypeMap","groups","getFileSizeMessage","sizes","pow","postToProxy","dataURI","fileName","proxyURL","proxyTarget","action","contentType","base64","appendTo","submit","saveAsBlob","blob","atob","Uint8Array","Blob","buffer","msSaveBlob","saveAsDataURI","URL","createObjectURL","fileSaver","download","createEvent","initMouseEvent","dispatchEvent","revokeObjectURL","downloadAttribute","saveAs","save","forceProxy","proxyModelSetters","observable","forEach","defineProperty","dirty","setDefaults","path","curr","amd","a1","a2","a3"],"mappings":"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t+B,GAAM6gC,aAAe,SAAUC,GAC3B,GAAIC,GAAQ/gC,GAAMghC,kBAAkBF,IAAeA,CACnD,OAAO7gC,IAAQioB,YAAczpB,EAAOypB,WAAW6Y,GAAO3jB,SAE1Dpd,GAAMghC,kBAAoB,SAAUC,GAChC,OACIC,GAAM,qBACNC,GAAM,qBACNC,GAAM,qBACNC,GAAM,qBACNC,GAAM,uBACRL,IAENjhC,GAAMuhC,cACFC,OACI,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,OACI,OACA,OACA,OACA,OACA,OACA,OACA,MACA,QACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,QAEJC,OACI,MACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,OACA,MACA,OACA,OACA,QACA,OACA,SAEJC,KACI,OACA,QACA,OACA,SACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,QAEJC,cACI,OACA,OACA,OACA,OACA,SAEJj+B,MACI,OACA,OACA,SAEJk+B,aACI,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,QACA,OACA,OACA,OACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,QACA,MACA,OACA,OACA,UAEJC,KAAM,QACNC,QACI,OACA,OACA,OACA,OACA,OACA,OACA,UACA,OACA,QAEJC,KACI,MACA,OACA,MACA,QACA,OACA,OACA,OACA,OACA,OACA,UACA,KACA,OACA,SAEJC,cACI,OACA,OACA,SACA,OACA,OACA,OACA,SAGRjiC,GAAMkiC,aAAe,SAAUC,EAAWC,GAArB,GAORn/B,GACDo/B,EAPJC,EAActiC,GAAMuhC,aACpBgB,EAAShyB,OAAO6a,KAAKkX,GACrBh7B,EAAO,MACX,IAAI66B,IAAczjC,IAAcyjC,EAAUziC,OACtC,MAAO4H,EAEX,KAASrE,EAAI,EAAGA,EAAIs/B,EAAO7iC,OAAQuD,GAAK,EAEpC,GADIo/B,EAAaC,EAAYC,EAAOt/B,IACh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","file":"kendo.core.min.js","sourcesContent":["/*!\n * Copyright 2020 Progress Software Corporation and/or one of its subsidiaries or affiliates. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n(function (f, define) {\n    define('kendo.core', ['jquery'], f);\n}(function () {\n    var __meta__ = {\n        id: 'core',\n        name: 'Core',\n        category: 'framework',\n        description: 'The core of the Kendo framework.'\n    };\n    (function ($, window, undefined) {\n        var kendo = window.kendo = window.kendo || { cultures: {} }, extend = $.extend, each = $.each, isArray = $.isArray, proxy = $.proxy, noop = $.noop, math = Math, Template, JSON = window.JSON || {}, support = {}, percentRegExp = /%/, formatRegExp = /\\{(\\d+)(:[^\\}]+)?\\}/g, boxShadowRegExp = /(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+)?/i, numberRegExp = /^(\\+|-?)\\d+(\\.?)\\d*$/, FUNCTION = 'function', STRING = 'string', NUMBER = 'number', OBJECT = 'object', NULL = 'null', BOOLEAN = 'boolean', UNDEFINED = 'undefined', getterCache = {}, setterCache = {}, slice = [].slice, noDepricateExtend = function () {\n                var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false;\n                if (typeof target === 'boolean') {\n                    deep = target;\n                    target = arguments[i] || {};\n                    i++;\n                }\n                if (typeof target !== 'object' && !jQuery.isFunction(target)) {\n                    target = {};\n                }\n                if (i === length) {\n                    target = this;\n                    i--;\n                }\n                for (; i < length; i++) {\n                    if ((options = arguments[i]) != null) {\n                        for (name in options) {\n                            if (name == 'filters' || name == 'concat' || name == ':') {\n                                continue;\n                            }\n                            src = target[name];\n                            copy = options[name];\n                            if (target === copy) {\n                                continue;\n                            }\n                            if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {\n                                if (copyIsArray) {\n                                    copyIsArray = false;\n                                    clone = src && jQuery.isArray(src) ? src : [];\n                                } else {\n                                    clone = src && jQuery.isPlainObject(src) ? src : {};\n                                }\n                                target[name] = noDepricateExtend(deep, clone, copy);\n                            } else if (copy !== undefined) {\n                                target[name] = copy;\n                            }\n                        }\n                    }\n                }\n                return target;\n            };\n        kendo.version = '2020.2.414'.replace(/^\\s+|\\s+$/g, '');\n        function Class() {\n        }\n        Class.extend = function (proto) {\n            var base = function () {\n                }, member, that = this, subclass = proto && proto.init ? proto.init : function () {\n                    that.apply(this, arguments);\n                }, fn;\n            base.prototype = that.prototype;\n            fn = subclass.fn = subclass.prototype = new base();\n            for (member in proto) {\n                if (proto[member] != null && proto[member].constructor === Object) {\n                    fn[member] = extend(true, {}, base.prototype[member], proto[member]);\n                } else {\n                    fn[member] = proto[member];\n                }\n            }\n            fn.constructor = subclass;\n            subclass.extend = that.extend;\n            return subclass;\n        };\n        Class.prototype._initOptions = function (options) {\n            this.options = deepExtend({}, this.options, options);\n        };\n        var isFunction = kendo.isFunction = function (fn) {\n            return typeof fn === 'function';\n        };\n        var preventDefault = function () {\n            this._defaultPrevented = true;\n        };\n        var isDefaultPrevented = function () {\n            return this._defaultPrevented === true;\n        };\n        var Observable = Class.extend({\n            init: function () {\n                this._events = {};\n            },\n            bind: function (eventName, handlers, one) {\n                var that = this, idx, eventNames = typeof eventName === STRING ? [eventName] : eventName, length, original, handler, handlersIsFunction = typeof handlers === FUNCTION, events;\n                if (handlers === undefined) {\n                    for (idx in eventName) {\n                        that.bind(idx, eventName[idx]);\n                    }\n                    return that;\n                }\n                for (idx = 0, length = eventNames.length; idx < length; idx++) {\n                    eventName = eventNames[idx];\n                    handler = handlersIsFunction ? handlers : handlers[eventName];\n                    if (handler) {\n                        if (one) {\n                            original = handler;\n                            handler = function () {\n                                that.unbind(eventName, handler);\n                                original.apply(that, arguments);\n                            };\n                            handler.original = original;\n                        }\n                        events = that._events[eventName] = that._events[eventName] || [];\n                        events.push(handler);\n                    }\n                }\n                return that;\n            },\n            one: function (eventNames, handlers) {\n                return this.bind(eventNames, handlers, true);\n            },\n            first: function (eventName, handlers) {\n                var that = this, idx, eventNames = typeof eventName === STRING ? [eventName] : eventName, length, handler, handlersIsFunction = typeof handlers === FUNCTION, events;\n                for (idx = 0, length = eventNames.length; idx < length; idx++) {\n                    eventName = eventNames[idx];\n                    handler = handlersIsFunction ? handlers : handlers[eventName];\n                    if (handler) {\n                        events = that._events[eventName] = that._events[eventName] || [];\n                        events.unshift(handler);\n                    }\n                }\n                return that;\n            },\n            trigger: function (eventName, e) {\n                var that = this, events = that._events[eventName], idx, length;\n                if (events) {\n                    e = e || {};\n                    e.sender = that;\n                    e._defaultPrevented = false;\n                    e.preventDefault = preventDefault;\n                    e.isDefaultPrevented = isDefaultPrevented;\n                    events = events.slice();\n                    for (idx = 0, length = events.length; idx < length; idx++) {\n                        events[idx].call(that, e);\n                    }\n                    return e._defaultPrevented === true;\n                }\n                return false;\n            },\n            unbind: function (eventName, handler) {\n                var that = this, events = that._events[eventName], idx;\n                if (eventName === undefined) {\n                    that._events = {};\n                } else if (events) {\n                    if (handler) {\n                        for (idx = events.length - 1; idx >= 0; idx--) {\n                            if (events[idx] === handler || events[idx].original === handler) {\n                                events.splice(idx, 1);\n                            }\n                        }\n                    } else {\n                        that._events[eventName] = [];\n                    }\n                }\n                return that;\n            }\n        });\n        function compilePart(part, stringPart) {\n            if (stringPart) {\n                return '\\'' + part.split('\\'').join('\\\\\\'').split('\\\\\"').join('\\\\\\\\\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r').replace(/\\t/g, '\\\\t') + '\\'';\n            } else {\n                var first = part.charAt(0), rest = part.substring(1);\n                if (first === '=') {\n                    return '+(' + rest + ')+';\n                } else if (first === ':') {\n                    return '+$kendoHtmlEncode(' + rest + ')+';\n                } else {\n                    return ';' + part + ';$kendoOutput+=';\n                }\n            }\n        }\n        var argumentNameRegExp = /^\\w+/, encodeRegExp = /\\$\\{([^}]*)\\}/g, escapedCurlyRegExp = /\\\\\\}/g, curlyRegExp = /__CURLY__/g, escapedSharpRegExp = /\\\\#/g, sharpRegExp = /__SHARP__/g, zeros = [\n                '',\n                '0',\n                '00',\n                '000',\n                '0000'\n            ];\n        Template = {\n            paramName: 'data',\n            useWithBlock: true,\n            render: function (template, data) {\n                var idx, length, html = '';\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    html += template(data[idx]);\n                }\n                return html;\n            },\n            compile: function (template, options) {\n                var settings = extend({}, this, options), paramName = settings.paramName, argumentName = paramName.match(argumentNameRegExp)[0], useWithBlock = settings.useWithBlock, functionBody = 'var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;', fn, parts, idx;\n                if (isFunction(template)) {\n                    return template;\n                }\n                functionBody += useWithBlock ? 'with(' + paramName + '){' : '';\n                functionBody += '$kendoOutput=';\n                parts = template.replace(escapedCurlyRegExp, '__CURLY__').replace(encodeRegExp, '#=$kendoHtmlEncode($1)#').replace(curlyRegExp, '}').replace(escapedSharpRegExp, '__SHARP__').split('#');\n                for (idx = 0; idx < parts.length; idx++) {\n                    functionBody += compilePart(parts[idx], idx % 2 === 0);\n                }\n                functionBody += useWithBlock ? ';}' : ';';\n                functionBody += 'return $kendoOutput;';\n                functionBody = functionBody.replace(sharpRegExp, '#');\n                try {\n                    fn = new Function(argumentName, functionBody);\n                    fn._slotCount = Math.floor(parts.length / 2);\n                    return fn;\n                } catch (e) {\n                    throw new Error(kendo.format('Invalid template:\\'{0}\\' Generated code:\\'{1}\\'', template, functionBody));\n                }\n            }\n        };\n        function pad(number, digits, end) {\n            number = number + '';\n            digits = digits || 2;\n            end = digits - number.length;\n            if (end) {\n                return zeros[digits].substring(0, end) + number;\n            }\n            return number;\n        }\n        (function () {\n            var escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g, gap, indent, meta = {\n                    '\\b': '\\\\b',\n                    '\\t': '\\\\t',\n                    '\\n': '\\\\n',\n                    '\\f': '\\\\f',\n                    '\\r': '\\\\r',\n                    '\"': '\\\\\"',\n                    '\\\\': '\\\\\\\\'\n                }, rep, toString = {}.toString;\n            if (typeof Date.prototype.toJSON !== FUNCTION) {\n                Date.prototype.toJSON = function () {\n                    var that = this;\n                    return isFinite(that.valueOf()) ? pad(that.getUTCFullYear(), 4) + '-' + pad(that.getUTCMonth() + 1) + '-' + pad(that.getUTCDate()) + 'T' + pad(that.getUTCHours()) + ':' + pad(that.getUTCMinutes()) + ':' + pad(that.getUTCSeconds()) + 'Z' : null;\n                };\n                String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function () {\n                    return this.valueOf();\n                };\n            }\n            function quote(string) {\n                escapable.lastIndex = 0;\n                return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n                    var c = meta[a];\n                    return typeof c === STRING ? c : '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n                }) + '\"' : '\"' + string + '\"';\n            }\n            function str(key, holder) {\n                var i, k, v, length, mind = gap, partial, value = holder[key], type;\n                if (value && typeof value === OBJECT && typeof value.toJSON === FUNCTION) {\n                    value = value.toJSON(key);\n                }\n                if (typeof rep === FUNCTION) {\n                    value = rep.call(holder, key, value);\n                }\n                type = typeof value;\n                if (type === STRING) {\n                    return quote(value);\n                } else if (type === NUMBER) {\n                    return isFinite(value) ? String(value) : NULL;\n                } else if (type === BOOLEAN || type === NULL) {\n                    return String(value);\n                } else if (type === OBJECT) {\n                    if (!value) {\n                        return NULL;\n                    }\n                    gap += indent;\n                    partial = [];\n                    if (toString.apply(value) === '[object Array]') {\n                        length = value.length;\n                        for (i = 0; i < length; i++) {\n                            partial[i] = str(i, value) || NULL;\n                        }\n                        v = partial.length === 0 ? '[]' : gap ? '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' : '[' + partial.join(',') + ']';\n                        gap = mind;\n                        return v;\n                    }\n                    if (rep && typeof rep === OBJECT) {\n                        length = rep.length;\n                        for (i = 0; i < length; i++) {\n                            if (typeof rep[i] === STRING) {\n                                k = rep[i];\n                                v = str(k, value);\n                                if (v) {\n                                    partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                                }\n                            }\n                        }\n                    } else {\n                        for (k in value) {\n                            if (Object.hasOwnProperty.call(value, k)) {\n                                v = str(k, value);\n                                if (v) {\n                                    partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                                }\n                            }\n                        }\n                    }\n                    v = partial.length === 0 ? '{}' : gap ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' : '{' + partial.join(',') + '}';\n                    gap = mind;\n                    return v;\n                }\n            }\n            if (typeof JSON.stringify !== FUNCTION) {\n                JSON.stringify = function (value, replacer, space) {\n                    var i;\n                    gap = '';\n                    indent = '';\n                    if (typeof space === NUMBER) {\n                        for (i = 0; i < space; i += 1) {\n                            indent += ' ';\n                        }\n                    } else if (typeof space === STRING) {\n                        indent = space;\n                    }\n                    rep = replacer;\n                    if (replacer && typeof replacer !== FUNCTION && (typeof replacer !== OBJECT || typeof replacer.length !== NUMBER)) {\n                        throw new Error('JSON.stringify');\n                    }\n                    return str('', { '': value });\n                };\n            }\n        }());\n        (function () {\n            var dateFormatRegExp = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|\"[^\"]*\"|'[^']*'/g, standardFormatRegExp = /^(n|c|p|e)(\\d*)$/i, literalRegExp = /(\\\\.)|(['][^']*[']?)|([\"][^\"]*[\"]?)/g, commaRegExp = /\\,/g, EMPTY = '', POINT = '.', COMMA = ',', SHARP = '#', ZERO = '0', PLACEHOLDER = '??', EN = 'en-US', objectToString = {}.toString;\n            kendo.cultures['en-US'] = {\n                name: EN,\n                numberFormat: {\n                    pattern: ['-n'],\n                    decimals: 2,\n                    ',': ',',\n                    '.': '.',\n                    groupSize: [3],\n                    percent: {\n                        pattern: [\n                            '-n %',\n                            'n %'\n                        ],\n                        decimals: 2,\n                        ',': ',',\n                        '.': '.',\n                        groupSize: [3],\n                        symbol: '%'\n                    },\n                    currency: {\n                        name: 'US Dollar',\n                        abbr: 'USD',\n                        pattern: [\n                            '($n)',\n                            '$n'\n                        ],\n                        decimals: 2,\n                        ',': ',',\n                        '.': '.',\n                        groupSize: [3],\n                        symbol: '$'\n                    }\n                },\n                calendars: {\n                    standard: {\n                        days: {\n                            names: [\n                                'Sunday',\n                                'Monday',\n                                'Tuesday',\n                                'Wednesday',\n                                'Thursday',\n                                'Friday',\n                                'Saturday'\n                            ],\n                            namesAbbr: [\n                                'Sun',\n                                'Mon',\n                                'Tue',\n                                'Wed',\n                                'Thu',\n                                'Fri',\n                                'Sat'\n                            ],\n                            namesShort: [\n                                'Su',\n                                'Mo',\n                                'Tu',\n                                'We',\n                                'Th',\n                                'Fr',\n                                'Sa'\n                            ]\n                        },\n                        months: {\n                            names: [\n                                'January',\n                                'February',\n                                'March',\n                                'April',\n                                'May',\n                                'June',\n                                'July',\n                                'August',\n                                'September',\n                                'October',\n                                'November',\n                                'December'\n                            ],\n                            namesAbbr: [\n                                'Jan',\n                                'Feb',\n                                'Mar',\n                                'Apr',\n                                'May',\n                                'Jun',\n                                'Jul',\n                                'Aug',\n                                'Sep',\n                                'Oct',\n                                'Nov',\n                                'Dec'\n                            ]\n                        },\n                        AM: [\n                            'AM',\n                            'am',\n                            'AM'\n                        ],\n                        PM: [\n                            'PM',\n                            'pm',\n                            'PM'\n                        ],\n                        patterns: {\n                            d: 'M/d/yyyy',\n                            D: 'dddd, MMMM dd, yyyy',\n                            F: 'dddd, MMMM dd, yyyy h:mm:ss tt',\n                            g: 'M/d/yyyy h:mm tt',\n                            G: 'M/d/yyyy h:mm:ss tt',\n                            m: 'MMMM dd',\n                            M: 'MMMM dd',\n                            s: 'yyyy\\'-\\'MM\\'-\\'ddTHH\\':\\'mm\\':\\'ss',\n                            t: 'h:mm tt',\n                            T: 'h:mm:ss tt',\n                            u: 'yyyy\\'-\\'MM\\'-\\'dd HH\\':\\'mm\\':\\'ss\\'Z\\'',\n                            y: 'MMMM, yyyy',\n                            Y: 'MMMM, yyyy'\n                        },\n                        '/': '/',\n                        ':': ':',\n                        firstDay: 0,\n                        twoDigitYearMax: 2029\n                    }\n                }\n            };\n            function findCulture(culture) {\n                if (culture) {\n                    if (culture.numberFormat) {\n                        return culture;\n                    }\n                    if (typeof culture === STRING) {\n                        var cultures = kendo.cultures;\n                        return cultures[culture] || cultures[culture.split('-')[0]] || null;\n                    }\n                    return null;\n                }\n                return null;\n            }\n            function getCulture(culture) {\n                if (culture) {\n                    culture = findCulture(culture);\n                }\n                return culture || kendo.cultures.current;\n            }\n            kendo.culture = function (cultureName) {\n                var cultures = kendo.cultures, culture;\n                if (cultureName !== undefined) {\n                    culture = findCulture(cultureName) || cultures[EN];\n                    culture.calendar = culture.calendars.standard;\n                    cultures.current = culture;\n                } else {\n                    return cultures.current;\n                }\n            };\n            kendo.findCulture = findCulture;\n            kendo.getCulture = getCulture;\n            kendo.culture(EN);\n            function formatDate(date, format, culture) {\n                culture = getCulture(culture);\n                var calendar = culture.calendars.standard, days = calendar.days, months = calendar.months;\n                format = calendar.patterns[format] || format;\n                return format.replace(dateFormatRegExp, function (match) {\n                    var minutes;\n                    var result;\n                    var sign;\n                    if (match === 'd') {\n                        result = date.getDate();\n                    } else if (match === 'dd') {\n                        result = pad(date.getDate());\n                    } else if (match === 'ddd') {\n                        result = days.namesAbbr[date.getDay()];\n                    } else if (match === 'dddd') {\n                        result = days.names[date.getDay()];\n                    } else if (match === 'M') {\n                        result = date.getMonth() + 1;\n                    } else if (match === 'MM') {\n                        result = pad(date.getMonth() + 1);\n                    } else if (match === 'MMM') {\n                        result = months.namesAbbr[date.getMonth()];\n                    } else if (match === 'MMMM') {\n                        result = months.names[date.getMonth()];\n                    } else if (match === 'yy') {\n                        result = pad(date.getFullYear() % 100);\n                    } else if (match === 'yyyy') {\n                        result = pad(date.getFullYear(), 4);\n                    } else if (match === 'h') {\n                        result = date.getHours() % 12 || 12;\n                    } else if (match === 'hh') {\n                        result = pad(date.getHours() % 12 || 12);\n                    } else if (match === 'H') {\n                        result = date.getHours();\n                    } else if (match === 'HH') {\n                        result = pad(date.getHours());\n                    } else if (match === 'm') {\n                        result = date.getMinutes();\n                    } else if (match === 'mm') {\n                        result = pad(date.getMinutes());\n                    } else if (match === 's') {\n                        result = date.getSeconds();\n                    } else if (match === 'ss') {\n                        result = pad(date.getSeconds());\n                    } else if (match === 'f') {\n                        result = math.floor(date.getMilliseconds() / 100);\n                    } else if (match === 'ff') {\n                        result = date.getMilliseconds();\n                        if (result > 99) {\n                            result = math.floor(result / 10);\n                        }\n                        result = pad(result);\n                    } else if (match === 'fff') {\n                        result = pad(date.getMilliseconds(), 3);\n                    } else if (match === 'tt') {\n                        result = date.getHours() < 12 ? calendar.AM[0] : calendar.PM[0];\n                    } else if (match === 'zzz') {\n                        minutes = date.getTimezoneOffset();\n                        sign = minutes < 0;\n                        result = math.abs(minutes / 60).toString().split('.')[0];\n                        minutes = math.abs(minutes) - result * 60;\n                        result = (sign ? '+' : '-') + pad(result);\n                        result += ':' + pad(minutes);\n                    } else if (match === 'zz' || match === 'z') {\n                        result = date.getTimezoneOffset() / 60;\n                        sign = result < 0;\n                        result = math.abs(result).toString().split('.')[0];\n                        result = (sign ? '+' : '-') + (match === 'zz' ? pad(result) : result);\n                    }\n                    return result !== undefined ? result : match.slice(1, match.length - 1);\n                });\n            }\n            function formatNumber(number, format, culture) {\n                culture = getCulture(culture);\n                var numberFormat = culture.numberFormat, decimal = numberFormat[POINT], precision = numberFormat.decimals, pattern = numberFormat.pattern[0], literals = [], symbol, isCurrency, isPercent, customPrecision, formatAndPrecision, negative = number < 0, integer, fraction, integerLength, fractionLength, replacement = EMPTY, value = EMPTY, idx, length, ch, hasGroup, hasNegativeFormat, decimalIndex, sharpIndex, zeroIndex, hasZero, hasSharp, percentIndex, currencyIndex, startZeroIndex, start = -1, end;\n                if (number === undefined) {\n                    return EMPTY;\n                }\n                if (!isFinite(number)) {\n                    return number;\n                }\n                if (!format) {\n                    return culture.name.length ? number.toLocaleString() : number.toString();\n                }\n                formatAndPrecision = standardFormatRegExp.exec(format);\n                if (formatAndPrecision) {\n                    format = formatAndPrecision[1].toLowerCase();\n                    isCurrency = format === 'c';\n                    isPercent = format === 'p';\n                    if (isCurrency || isPercent) {\n                        numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n                        decimal = numberFormat[POINT];\n                        precision = numberFormat.decimals;\n                        symbol = numberFormat.symbol;\n                        pattern = numberFormat.pattern[negative ? 0 : 1];\n                    }\n                    customPrecision = formatAndPrecision[2];\n                    if (customPrecision) {\n                        precision = +customPrecision;\n                    }\n                    if (format === 'e') {\n                        var exp = customPrecision ? number.toExponential(precision) : number.toExponential();\n                        return exp.replace(POINT, numberFormat[POINT]);\n                    }\n                    if (isPercent) {\n                        number *= 100;\n                    }\n                    number = round(number, precision);\n                    negative = number < 0;\n                    number = number.split(POINT);\n                    integer = number[0];\n                    fraction = number[1];\n                    if (negative) {\n                        integer = integer.substring(1);\n                    }\n                    value = groupInteger(integer, 0, integer.length, numberFormat);\n                    if (fraction) {\n                        value += decimal + fraction;\n                    }\n                    if (format === 'n' && !negative) {\n                        return value;\n                    }\n                    number = EMPTY;\n                    for (idx = 0, length = pattern.length; idx < length; idx++) {\n                        ch = pattern.charAt(idx);\n                        if (ch === 'n') {\n                            number += value;\n                        } else if (ch === '$' || ch === '%') {\n                            number += symbol;\n                        } else {\n                            number += ch;\n                        }\n                    }\n                    return number;\n                }\n                if (format.indexOf('\\'') > -1 || format.indexOf('\"') > -1 || format.indexOf('\\\\') > -1) {\n                    format = format.replace(literalRegExp, function (match) {\n                        var quoteChar = match.charAt(0).replace('\\\\', ''), literal = match.slice(1).replace(quoteChar, '');\n                        literals.push(literal);\n                        return PLACEHOLDER;\n                    });\n                }\n                format = format.split(';');\n                if (negative && format[1]) {\n                    format = format[1];\n                    hasNegativeFormat = true;\n                } else if (number === 0 && format[2]) {\n                    format = format[2];\n                    if (format.indexOf(SHARP) == -1 && format.indexOf(ZERO) == -1) {\n                        return format;\n                    }\n                } else {\n                    format = format[0];\n                }\n                percentIndex = format.indexOf('%');\n                currencyIndex = format.indexOf('$');\n                isPercent = percentIndex != -1;\n                isCurrency = currencyIndex != -1;\n                if (isPercent) {\n                    number *= 100;\n                }\n                if (isCurrency && format[currencyIndex - 1] === '\\\\') {\n                    format = format.split('\\\\').join('');\n                    isCurrency = false;\n                }\n                if (isCurrency || isPercent) {\n                    numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n                    decimal = numberFormat[POINT];\n                    precision = numberFormat.decimals;\n                    symbol = numberFormat.symbol;\n                }\n                hasGroup = format.indexOf(COMMA) > -1;\n                if (hasGroup) {\n                    format = format.replace(commaRegExp, EMPTY);\n                }\n                decimalIndex = format.indexOf(POINT);\n                length = format.length;\n                if (decimalIndex != -1) {\n                    fraction = number.toString().split('e');\n                    if (fraction[1]) {\n                        fraction = round(number, Math.abs(fraction[1]));\n                    } else {\n                        fraction = fraction[0];\n                    }\n                    fraction = fraction.split(POINT)[1] || EMPTY;\n                    zeroIndex = format.lastIndexOf(ZERO) - decimalIndex;\n                    sharpIndex = format.lastIndexOf(SHARP) - decimalIndex;\n                    hasZero = zeroIndex > -1;\n                    hasSharp = sharpIndex > -1;\n                    idx = fraction.length;\n                    if (!hasZero && !hasSharp) {\n                        format = format.substring(0, decimalIndex) + format.substring(decimalIndex + 1);\n                        length = format.length;\n                        decimalIndex = -1;\n                        idx = 0;\n                    }\n                    if (hasZero && zeroIndex > sharpIndex) {\n                        idx = zeroIndex;\n                    } else if (sharpIndex > zeroIndex) {\n                        if (hasSharp && idx > sharpIndex) {\n                            var rounded = round(number, sharpIndex, negative);\n                            while (rounded.charAt(rounded.length - 1) === ZERO && sharpIndex > 0 && sharpIndex > zeroIndex) {\n                                sharpIndex--;\n                                rounded = round(number, sharpIndex, negative);\n                            }\n                            idx = sharpIndex;\n                        } else if (hasZero && idx < zeroIndex) {\n                            idx = zeroIndex;\n                        }\n                    }\n                }\n                number = round(number, idx, negative);\n                sharpIndex = format.indexOf(SHARP);\n                startZeroIndex = zeroIndex = format.indexOf(ZERO);\n                if (sharpIndex == -1 && zeroIndex != -1) {\n                    start = zeroIndex;\n                } else if (sharpIndex != -1 && zeroIndex == -1) {\n                    start = sharpIndex;\n                } else {\n                    start = sharpIndex > zeroIndex ? zeroIndex : sharpIndex;\n                }\n                sharpIndex = format.lastIndexOf(SHARP);\n                zeroIndex = format.lastIndexOf(ZERO);\n                if (sharpIndex == -1 && zeroIndex != -1) {\n                    end = zeroIndex;\n                } else if (sharpIndex != -1 && zeroIndex == -1) {\n                    end = sharpIndex;\n                } else {\n                    end = sharpIndex > zeroIndex ? sharpIndex : zeroIndex;\n                }\n                if (start == length) {\n                    end = start;\n                }\n                if (start != -1) {\n                    value = number.toString().split(POINT);\n                    integer = value[0];\n                    fraction = value[1] || EMPTY;\n                    integerLength = integer.length;\n                    fractionLength = fraction.length;\n                    if (negative && number * -1 >= 0) {\n                        negative = false;\n                    }\n                    number = format.substring(0, start);\n                    if (negative && !hasNegativeFormat) {\n                        number += '-';\n                    }\n                    for (idx = start; idx < length; idx++) {\n                        ch = format.charAt(idx);\n                        if (decimalIndex == -1) {\n                            if (end - idx < integerLength) {\n                                number += integer;\n                                break;\n                            }\n                        } else {\n                            if (zeroIndex != -1 && zeroIndex < idx) {\n                                replacement = EMPTY;\n                            }\n                            if (decimalIndex - idx <= integerLength && decimalIndex - idx > -1) {\n                                number += integer;\n                                idx = decimalIndex;\n                            }\n                            if (decimalIndex === idx) {\n                                number += (fraction ? decimal : EMPTY) + fraction;\n                                idx += end - decimalIndex + 1;\n                                continue;\n                            }\n                        }\n                        if (ch === ZERO) {\n                            number += ch;\n                            replacement = ch;\n                        } else if (ch === SHARP) {\n                            number += replacement;\n                        }\n                    }\n                    if (hasGroup) {\n                        number = groupInteger(number, start + (negative && !hasNegativeFormat ? 1 : 0), Math.max(end, integerLength + start), numberFormat);\n                    }\n                    if (end >= start) {\n                        number += format.substring(end + 1);\n                    }\n                    if (isCurrency || isPercent) {\n                        value = EMPTY;\n                        for (idx = 0, length = number.length; idx < length; idx++) {\n                            ch = number.charAt(idx);\n                            value += ch === '$' || ch === '%' ? symbol : ch;\n                        }\n                        number = value;\n                    }\n                    length = literals.length;\n                    if (length) {\n                        for (idx = 0; idx < length; idx++) {\n                            number = number.replace(PLACEHOLDER, literals[idx]);\n                        }\n                    }\n                }\n                return number;\n            }\n            var groupInteger = function (number, start, end, numberFormat) {\n                var decimalIndex = number.indexOf(numberFormat[POINT]);\n                var groupSizes = numberFormat.groupSize.slice();\n                var groupSize = groupSizes.shift();\n                var integer, integerLength;\n                var idx, parts, value;\n                var newGroupSize;\n                end = decimalIndex !== -1 ? decimalIndex : end + 1;\n                integer = number.substring(start, end);\n                integerLength = integer.length;\n                if (integerLength >= groupSize) {\n                    idx = integerLength;\n                    parts = [];\n                    while (idx > -1) {\n                        value = integer.substring(idx - groupSize, idx);\n                        if (value) {\n                            parts.push(value);\n                        }\n                        idx -= groupSize;\n                        newGroupSize = groupSizes.shift();\n                        groupSize = newGroupSize !== undefined ? newGroupSize : groupSize;\n                        if (groupSize === 0) {\n                            if (idx > 0) {\n                                parts.push(integer.substring(0, idx));\n                            }\n                            break;\n                        }\n                    }\n                    integer = parts.reverse().join(numberFormat[COMMA]);\n                    number = number.substring(0, start) + integer + number.substring(end);\n                }\n                return number;\n            };\n            var round = function (value, precision, negative) {\n                precision = precision || 0;\n                value = value.toString().split('e');\n                value = Math.round(+(value[0] + 'e' + (value[1] ? +value[1] + precision : precision)));\n                if (negative) {\n                    value = -value;\n                }\n                value = value.toString().split('e');\n                value = +(value[0] + 'e' + (value[1] ? +value[1] - precision : -precision));\n                return value.toFixed(Math.min(precision, 20));\n            };\n            var toString = function (value, fmt, culture) {\n                if (fmt) {\n                    if (objectToString.call(value) === '[object Date]') {\n                        return formatDate(value, fmt, culture);\n                    } else if (typeof value === NUMBER) {\n                        return formatNumber(value, fmt, culture);\n                    }\n                }\n                return value !== undefined ? value : '';\n            };\n            kendo.format = function (fmt) {\n                var values = arguments;\n                return fmt.replace(formatRegExp, function (match, index, placeholderFormat) {\n                    var value = values[parseInt(index, 10) + 1];\n                    return toString(value, placeholderFormat ? placeholderFormat.substring(1) : '');\n                });\n            };\n            kendo._extractFormat = function (format) {\n                if (format.slice(0, 3) === '{0:') {\n                    format = format.slice(3, format.length - 1);\n                }\n                return format;\n            };\n            kendo._activeElement = function () {\n                try {\n                    return document.activeElement;\n                } catch (e) {\n                    return document.documentElement.activeElement;\n                }\n            };\n            kendo._round = round;\n            kendo._outerWidth = function (element, includeMargin) {\n                return $(element).outerWidth(includeMargin || false) || 0;\n            };\n            kendo._outerHeight = function (element, includeMargin) {\n                return $(element).outerHeight(includeMargin || false) || 0;\n            };\n            kendo.toString = toString;\n        }());\n        (function () {\n            var nonBreakingSpaceRegExp = /\\u00A0/g, exponentRegExp = /[eE][\\-+]?[0-9]+/, shortTimeZoneRegExp = /[+|\\-]\\d{1,2}/, longTimeZoneRegExp = /[+|\\-]\\d{1,2}:?\\d{2}/, dateRegExp = /^\\/Date\\((.*?)\\)\\/$/, offsetRegExp = /[+-]\\d*/, FORMATS_SEQUENCE = [\n                    [],\n                    [\n                        'G',\n                        'g',\n                        'F'\n                    ],\n                    [\n                        'D',\n                        'd',\n                        'y',\n                        'm',\n                        'T',\n                        't'\n                    ]\n                ], STANDARD_FORMATS = [\n                    [\n                        'yyyy-MM-ddTHH:mm:ss.fffffffzzz',\n                        'yyyy-MM-ddTHH:mm:ss.fffffff',\n                        'yyyy-MM-ddTHH:mm:ss.fffzzz',\n                        'yyyy-MM-ddTHH:mm:ss.fff',\n                        'ddd MMM dd yyyy HH:mm:ss',\n                        'yyyy-MM-ddTHH:mm:sszzz',\n                        'yyyy-MM-ddTHH:mmzzz',\n                        'yyyy-MM-ddTHH:mmzz',\n                        'yyyy-MM-ddTHH:mm:ss',\n                        'yyyy-MM-dd HH:mm:ss',\n                        'yyyy/MM/dd HH:mm:ss'\n                    ],\n                    [\n                        'yyyy-MM-ddTHH:mm',\n                        'yyyy-MM-dd HH:mm',\n                        'yyyy/MM/dd HH:mm'\n                    ],\n                    [\n                        'yyyy/MM/dd',\n                        'yyyy-MM-dd',\n                        'HH:mm:ss',\n                        'HH:mm'\n                    ]\n                ], numberRegExp = {\n                    2: /^\\d{1,2}/,\n                    3: /^\\d{1,3}/,\n                    4: /^\\d{4}/\n                }, objectToString = {}.toString;\n            function outOfRange(value, start, end) {\n                return !(value >= start && value <= end);\n            }\n            function designatorPredicate(designator) {\n                return designator.charAt(0);\n            }\n            function mapDesignators(designators) {\n                return $.map(designators, designatorPredicate);\n            }\n            function adjustDST(date, hours) {\n                if (!hours && date.getHours() === 23) {\n                    date.setHours(date.getHours() + 2);\n                }\n            }\n            function lowerArray(data) {\n                var idx = 0, length = data.length, array = [];\n                for (; idx < length; idx++) {\n                    array[idx] = (data[idx] + '').toLowerCase();\n                }\n                return array;\n            }\n            function lowerLocalInfo(localInfo) {\n                var newLocalInfo = {}, property;\n                for (property in localInfo) {\n                    newLocalInfo[property] = lowerArray(localInfo[property]);\n                }\n                return newLocalInfo;\n            }\n            function parseExact(value, format, culture, strict) {\n                if (!value) {\n                    return null;\n                }\n                var lookAhead = function (match) {\n                        var i = 0;\n                        while (format[idx] === match) {\n                            i++;\n                            idx++;\n                        }\n                        if (i > 0) {\n                            idx -= 1;\n                        }\n                        return i;\n                    }, getNumber = function (size) {\n                        var rg = numberRegExp[size] || new RegExp('^\\\\d{1,' + size + '}'), match = value.substr(valueIdx, size).match(rg);\n                        if (match) {\n                            match = match[0];\n                            valueIdx += match.length;\n                            return parseInt(match, 10);\n                        }\n                        return null;\n                    }, getIndexByName = function (names, lower) {\n                        var i = 0, length = names.length, name, nameLength, matchLength = 0, matchIdx = 0, subValue;\n                        for (; i < length; i++) {\n                            name = names[i];\n                            nameLength = name.length;\n                            subValue = value.substr(valueIdx, nameLength);\n                            if (lower) {\n                                subValue = subValue.toLowerCase();\n                            }\n                            if (subValue == name && nameLength > matchLength) {\n                                matchLength = nameLength;\n                                matchIdx = i;\n                            }\n                        }\n                        if (matchLength) {\n                            valueIdx += matchLength;\n                            return matchIdx + 1;\n                        }\n                        return null;\n                    }, checkLiteral = function () {\n                        var result = false;\n                        if (value.charAt(valueIdx) === format[idx]) {\n                            valueIdx++;\n                            result = true;\n                        }\n                        return result;\n                    }, calendar = culture.calendars.standard, year = null, month = null, day = null, hours = null, minutes = null, seconds = null, milliseconds = null, idx = 0, valueIdx = 0, literal = false, date = new Date(), twoDigitYearMax = calendar.twoDigitYearMax || 2029, defaultYear = date.getFullYear(), ch, count, length, pattern, pmHour, UTC, matches, amDesignators, pmDesignators, hoursOffset, minutesOffset, hasTime, match;\n                if (!format) {\n                    format = 'd';\n                }\n                pattern = calendar.patterns[format];\n                if (pattern) {\n                    format = pattern;\n                }\n                format = format.split('');\n                length = format.length;\n                for (; idx < length; idx++) {\n                    ch = format[idx];\n                    if (literal) {\n                        if (ch === '\\'') {\n                            literal = false;\n                        } else {\n                            checkLiteral();\n                        }\n                    } else {\n                        if (ch === 'd') {\n                            count = lookAhead('d');\n                            if (!calendar._lowerDays) {\n                                calendar._lowerDays = lowerLocalInfo(calendar.days);\n                            }\n                            if (day !== null && count > 2) {\n                                continue;\n                            }\n                            day = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerDays[count == 3 ? 'namesAbbr' : 'names'], true);\n                            if (day === null || outOfRange(day, 1, 31)) {\n                                return null;\n                            }\n                        } else if (ch === 'M') {\n                            count = lookAhead('M');\n                            if (!calendar._lowerMonths) {\n                                calendar._lowerMonths = lowerLocalInfo(calendar.months);\n                            }\n                            month = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerMonths[count == 3 ? 'namesAbbr' : 'names'], true);\n                            if (month === null || outOfRange(month, 1, 12)) {\n                                return null;\n                            }\n                            month -= 1;\n                        } else if (ch === 'y') {\n                            count = lookAhead('y');\n                            year = getNumber(count);\n                            if (year === null) {\n                                return null;\n                            }\n                            if (count == 2) {\n                                if (typeof twoDigitYearMax === 'string') {\n                                    twoDigitYearMax = defaultYear + parseInt(twoDigitYearMax, 10);\n                                }\n                                year = defaultYear - defaultYear % 100 + year;\n                                if (year > twoDigitYearMax) {\n                                    year -= 100;\n                                }\n                            }\n                        } else if (ch === 'h') {\n                            lookAhead('h');\n                            hours = getNumber(2);\n                            if (hours == 12) {\n                                hours = 0;\n                            }\n                            if (hours === null || outOfRange(hours, 0, 11)) {\n                                return null;\n                            }\n                        } else if (ch === 'H') {\n                            lookAhead('H');\n                            hours = getNumber(2);\n                            if (hours === null || outOfRange(hours, 0, 23)) {\n                                return null;\n                            }\n                        } else if (ch === 'm') {\n                            lookAhead('m');\n                            minutes = getNumber(2);\n                            if (minutes === null || outOfRange(minutes, 0, 59)) {\n                                return null;\n                            }\n                        } else if (ch === 's') {\n                            lookAhead('s');\n                            seconds = getNumber(2);\n                            if (seconds === null || outOfRange(seconds, 0, 59)) {\n                                return null;\n                            }\n                        } else if (ch === 'f') {\n                            count = lookAhead('f');\n                            match = value.substr(valueIdx, count).match(numberRegExp[3]);\n                            milliseconds = getNumber(count);\n                            if (milliseconds !== null) {\n                                milliseconds = parseFloat('0.' + match[0], 10);\n                                milliseconds = kendo._round(milliseconds, 3);\n                                milliseconds *= 1000;\n                            }\n                            if (milliseconds === null || outOfRange(milliseconds, 0, 999)) {\n                                return null;\n                            }\n                        } else if (ch === 't') {\n                            count = lookAhead('t');\n                            amDesignators = calendar.AM;\n                            pmDesignators = calendar.PM;\n                            if (count === 1) {\n                                amDesignators = mapDesignators(amDesignators);\n                                pmDesignators = mapDesignators(pmDesignators);\n                            }\n                            pmHour = getIndexByName(pmDesignators);\n                            if (!pmHour && !getIndexByName(amDesignators)) {\n                                return null;\n                            }\n                        } else if (ch === 'z') {\n                            UTC = true;\n                            count = lookAhead('z');\n                            if (value.substr(valueIdx, 1) === 'Z') {\n                                checkLiteral();\n                                continue;\n                            }\n                            matches = value.substr(valueIdx, 6).match(count > 2 ? longTimeZoneRegExp : shortTimeZoneRegExp);\n                            if (!matches) {\n                                return null;\n                            }\n                            matches = matches[0].split(':');\n                            hoursOffset = matches[0];\n                            minutesOffset = matches[1];\n                            if (!minutesOffset && hoursOffset.length > 3) {\n                                valueIdx = hoursOffset.length - 2;\n                                minutesOffset = hoursOffset.substring(valueIdx);\n                                hoursOffset = hoursOffset.substring(0, valueIdx);\n                            }\n                            hoursOffset = parseInt(hoursOffset, 10);\n                            if (outOfRange(hoursOffset, -12, 13)) {\n                                return null;\n                            }\n                            if (count > 2) {\n                                minutesOffset = matches[0][0] + minutesOffset;\n                                minutesOffset = parseInt(minutesOffset, 10);\n                                if (isNaN(minutesOffset) || outOfRange(minutesOffset, -59, 59)) {\n                                    return null;\n                                }\n                            }\n                        } else if (ch === '\\'') {\n                            literal = true;\n                            checkLiteral();\n                        } else if (!checkLiteral()) {\n                            return null;\n                        }\n                    }\n                }\n                if (strict && !/^\\s*$/.test(value.substr(valueIdx))) {\n                    return null;\n                }\n                hasTime = hours !== null || minutes !== null || seconds || null;\n                if (year === null && month === null && day === null && hasTime) {\n                    year = defaultYear;\n                    month = date.getMonth();\n                    day = date.getDate();\n                } else {\n                    if (year === null) {\n                        year = defaultYear;\n                    }\n                    if (day === null) {\n                        day = 1;\n                    }\n                }\n                if (pmHour && hours < 12) {\n                    hours += 12;\n                }\n                if (UTC) {\n                    if (hoursOffset) {\n                        hours += -hoursOffset;\n                    }\n                    if (minutesOffset) {\n                        minutes += -minutesOffset;\n                    }\n                    value = new Date(Date.UTC(year, month, day, hours, minutes, seconds, milliseconds));\n                } else {\n                    value = new Date(year, month, day, hours, minutes, seconds, milliseconds);\n                    adjustDST(value, hours);\n                }\n                if (year < 100) {\n                    value.setFullYear(year);\n                }\n                if (value.getDate() !== day && UTC === undefined) {\n                    return null;\n                }\n                return value;\n            }\n            function parseMicrosoftFormatOffset(offset) {\n                var sign = offset.substr(0, 1) === '-' ? -1 : 1;\n                offset = offset.substring(1);\n                offset = parseInt(offset.substr(0, 2), 10) * 60 + parseInt(offset.substring(2), 10);\n                return sign * offset;\n            }\n            function getDefaultFormats(culture) {\n                var length = math.max(FORMATS_SEQUENCE.length, STANDARD_FORMATS.length);\n                var calendar = culture.calendar || culture.calendars.standard;\n                var patterns = calendar.patterns;\n                var cultureFormats, formatIdx, idx;\n                var formats = [];\n                for (idx = 0; idx < length; idx++) {\n                    cultureFormats = FORMATS_SEQUENCE[idx];\n                    for (formatIdx = 0; formatIdx < cultureFormats.length; formatIdx++) {\n                        formats.push(patterns[cultureFormats[formatIdx]]);\n                    }\n                    formats = formats.concat(STANDARD_FORMATS[idx]);\n                }\n                return formats;\n            }\n            function internalParseDate(value, formats, culture, strict) {\n                if (objectToString.call(value) === '[object Date]') {\n                    return value;\n                }\n                var idx = 0;\n                var date = null;\n                var length;\n                var tzoffset;\n                if (value && value.indexOf('/D') === 0) {\n                    date = dateRegExp.exec(value);\n                    if (date) {\n                        date = date[1];\n                        tzoffset = offsetRegExp.exec(date.substring(1));\n                        date = new Date(parseInt(date, 10));\n                        if (tzoffset) {\n                            tzoffset = parseMicrosoftFormatOffset(tzoffset[0]);\n                            date = kendo.timezone.apply(date, 0);\n                            date = kendo.timezone.convert(date, 0, -1 * tzoffset);\n                        }\n                        return date;\n                    }\n                }\n                culture = kendo.getCulture(culture);\n                if (!formats) {\n                    formats = getDefaultFormats(culture);\n                }\n                formats = isArray(formats) ? formats : [formats];\n                length = formats.length;\n                for (; idx < length; idx++) {\n                    date = parseExact(value, formats[idx], culture, strict);\n                    if (date) {\n                        return date;\n                    }\n                }\n                return date;\n            }\n            kendo.parseDate = function (value, formats, culture) {\n                return internalParseDate(value, formats, culture, false);\n            };\n            kendo.parseExactDate = function (value, formats, culture) {\n                return internalParseDate(value, formats, culture, true);\n            };\n            kendo.parseInt = function (value, culture) {\n                var result = kendo.parseFloat(value, culture);\n                if (result) {\n                    result = result | 0;\n                }\n                return result;\n            };\n            kendo.parseFloat = function (value, culture, format) {\n                if (!value && value !== 0) {\n                    return null;\n                }\n                if (typeof value === NUMBER) {\n                    return value;\n                }\n                value = value.toString();\n                culture = kendo.getCulture(culture);\n                var number = culture.numberFormat, percent = number.percent, currency = number.currency, symbol = currency.symbol, percentSymbol = percent.symbol, negative = value.indexOf('-'), parts, isPercent;\n                if (exponentRegExp.test(value)) {\n                    value = parseFloat(value.replace(number['.'], '.'));\n                    if (isNaN(value)) {\n                        value = null;\n                    }\n                    return value;\n                }\n                if (negative > 0) {\n                    return null;\n                } else {\n                    negative = negative > -1;\n                }\n                if (value.indexOf(symbol) > -1 || format && format.toLowerCase().indexOf('c') > -1) {\n                    number = currency;\n                    parts = number.pattern[0].replace('$', symbol).split('n');\n                    if (value.indexOf(parts[0]) > -1 && value.indexOf(parts[1]) > -1) {\n                        value = value.replace(parts[0], '').replace(parts[1], '');\n                        negative = true;\n                    }\n                } else if (value.indexOf(percentSymbol) > -1) {\n                    isPercent = true;\n                    number = percent;\n                    symbol = percentSymbol;\n                }\n                value = value.replace('-', '').replace(symbol, '').replace(nonBreakingSpaceRegExp, ' ').split(number[','].replace(nonBreakingSpaceRegExp, ' ')).join('').replace(number['.'], '.');\n                value = parseFloat(value);\n                if (isNaN(value)) {\n                    value = null;\n                } else if (negative) {\n                    value *= -1;\n                }\n                if (value && isPercent) {\n                    value /= 100;\n                }\n                return value;\n            };\n        }());\n        function getShadows(element) {\n            var shadow = element.css(kendo.support.transitions.css + 'box-shadow') || element.css('box-shadow'), radius = shadow ? shadow.match(boxShadowRegExp) || [\n                    0,\n                    0,\n                    0,\n                    0,\n                    0\n                ] : [\n                    0,\n                    0,\n                    0,\n                    0,\n                    0\n                ], blur = math.max(+radius[3], +(radius[4] || 0));\n            return {\n                left: -radius[1] + blur,\n                right: +radius[1] + blur,\n                bottom: +radius[2] + blur\n            };\n        }\n        function wrap(element, autosize) {\n            var browser = support.browser, percentage, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, parent = element.parent(), windowOuterWidth = outerWidth(window);\n            parent.removeClass('k-animation-container-sm');\n            if (!parent.hasClass('k-animation-container')) {\n                var width = element[0].style.width, height = element[0].style.height, percentWidth = percentRegExp.test(width), percentHeight = percentRegExp.test(height), forceWidth = element.hasClass('k-tooltip') || element.is('.k-menu-horizontal.k-context-menu');\n                percentage = percentWidth || percentHeight;\n                if (!percentWidth && (!autosize || autosize && width || forceWidth)) {\n                    width = autosize ? outerWidth(element) + 1 : outerWidth(element);\n                }\n                if (!percentHeight && (!autosize || autosize && height) || element.is('.k-menu-horizontal.k-context-menu')) {\n                    height = outerHeight(element);\n                }\n                element.wrap($('<div/>').addClass('k-animation-container').css({\n                    width: width,\n                    height: height\n                }));\n                parent = element.parent();\n                if (percentage) {\n                    element.css({\n                        width: '100%',\n                        height: '100%',\n                        boxSizing: 'border-box',\n                        mozBoxSizing: 'border-box',\n                        webkitBoxSizing: 'border-box'\n                    });\n                }\n            } else {\n                wrapResize(element, autosize);\n            }\n            if (windowOuterWidth < outerWidth(parent)) {\n                parent.addClass('k-animation-container-sm');\n                wrapResize(element, autosize);\n            }\n            if (browser.msie && math.floor(browser.version) <= 7) {\n                element.css({ zoom: 1 });\n                element.children('.k-menu').width(element.width());\n            }\n            return parent;\n        }\n        function wrapResize(element, autosize) {\n            var percentage, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, wrapper = element.parent('.k-animation-container'), wrapperStyle = wrapper[0].style;\n            if (wrapper.is(':hidden')) {\n                wrapper.css({\n                    display: '',\n                    position: ''\n                });\n            }\n            percentage = percentRegExp.test(wrapperStyle.width) || percentRegExp.test(wrapperStyle.height);\n            if (!percentage) {\n                wrapper.css({\n                    width: autosize ? outerWidth(element) + 1 : outerWidth(element),\n                    height: outerHeight(element),\n                    boxSizing: 'content-box',\n                    mozBoxSizing: 'content-box',\n                    webkitBoxSizing: 'content-box'\n                });\n            }\n        }\n        function deepExtend(destination) {\n            var i = 1, length = arguments.length;\n            for (i = 1; i < length; i++) {\n                deepExtendOne(destination, arguments[i]);\n            }\n            return destination;\n        }\n        function deepExtendOne(destination, source) {\n            var ObservableArray = kendo.data.ObservableArray, LazyObservableArray = kendo.data.LazyObservableArray, DataSource = kendo.data.DataSource, HierarchicalDataSource = kendo.data.HierarchicalDataSource, property, propValue, propType, propInit, destProp;\n            for (property in source) {\n                propValue = source[property];\n                propType = typeof propValue;\n                if (propType === OBJECT && propValue !== null) {\n                    propInit = propValue.constructor;\n                } else {\n                    propInit = null;\n                }\n                if (propInit && propInit !== Array && propInit !== ObservableArray && propInit !== LazyObservableArray && propInit !== DataSource && propInit !== HierarchicalDataSource && propInit !== RegExp && (!kendo.isFunction(window.ArrayBuffer) || propInit !== ArrayBuffer)) {\n                    if (propValue instanceof Date) {\n                        destination[property] = new Date(propValue.getTime());\n                    } else if (isFunction(propValue.clone)) {\n                        destination[property] = propValue.clone();\n                    } else {\n                        destProp = destination[property];\n                        if (typeof destProp === OBJECT) {\n                            destination[property] = destProp || {};\n                        } else {\n                            destination[property] = {};\n                        }\n                        deepExtendOne(destination[property], propValue);\n                    }\n                } else if (propType !== UNDEFINED) {\n                    destination[property] = propValue;\n                }\n            }\n            return destination;\n        }\n        function testRx(agent, rxs, dflt) {\n            for (var rx in rxs) {\n                if (rxs.hasOwnProperty(rx) && rxs[rx].test(agent)) {\n                    return rx;\n                }\n            }\n            return dflt !== undefined ? dflt : agent;\n        }\n        function toHyphens(str) {\n            return str.replace(/([a-z][A-Z])/g, function (g) {\n                return g.charAt(0) + '-' + g.charAt(1).toLowerCase();\n            });\n        }\n        function toCamelCase(str) {\n            return str.replace(/\\-(\\w)/g, function (strMatch, g1) {\n                return g1.toUpperCase();\n            });\n        }\n        function getComputedStyles(element, properties) {\n            var styles = {}, computedStyle;\n            if (document.defaultView && document.defaultView.getComputedStyle) {\n                computedStyle = document.defaultView.getComputedStyle(element, '');\n                if (properties) {\n                    $.each(properties, function (idx, value) {\n                        styles[value] = computedStyle.getPropertyValue(value);\n                    });\n                }\n            } else {\n                computedStyle = element.currentStyle;\n                if (properties) {\n                    $.each(properties, function (idx, value) {\n                        styles[value] = computedStyle[toCamelCase(value)];\n                    });\n                }\n            }\n            if (!kendo.size(styles)) {\n                styles = computedStyle;\n            }\n            return styles;\n        }\n        function isScrollable(element) {\n            if (element && element.className && typeof element.className === 'string' && element.className.indexOf('k-auto-scrollable') > -1) {\n                return true;\n            }\n            var overflow = getComputedStyles(element, ['overflow']).overflow;\n            return overflow == 'auto' || overflow == 'scroll';\n        }\n        function scrollLeft(element, value) {\n            var webkit = support.browser.webkit;\n            var mozila = support.browser.mozilla;\n            var el = element instanceof $ ? element[0] : element;\n            var isRtl;\n            if (!element) {\n                return;\n            }\n            isRtl = support.isRtl(element);\n            if (value !== undefined) {\n                if (isRtl && webkit) {\n                    el.scrollLeft = el.scrollWidth - el.clientWidth - value;\n                } else if (isRtl && mozila) {\n                    el.scrollLeft = -value;\n                } else {\n                    el.scrollLeft = value;\n                }\n            } else {\n                if (isRtl && webkit) {\n                    return el.scrollWidth - el.clientWidth - el.scrollLeft;\n                } else {\n                    return Math.abs(el.scrollLeft);\n                }\n            }\n        }\n        (function () {\n            support._scrollbar = undefined;\n            support.scrollbar = function (refresh) {\n                if (!isNaN(support._scrollbar) && !refresh) {\n                    return support._scrollbar;\n                } else {\n                    var div = document.createElement('div'), result;\n                    div.style.cssText = 'overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block';\n                    div.innerHTML = '&nbsp;';\n                    document.body.appendChild(div);\n                    support._scrollbar = result = div.offsetWidth - div.scrollWidth;\n                    document.body.removeChild(div);\n                    return result;\n                }\n            };\n            support.isRtl = function (element) {\n                return $(element).closest('.k-rtl').length > 0;\n            };\n            var table = document.createElement('table');\n            try {\n                table.innerHTML = '<tr><td></td></tr>';\n                support.tbodyInnerHtml = true;\n            } catch (e) {\n                support.tbodyInnerHtml = false;\n            }\n            support.touch = 'ontouchstart' in window;\n            var docStyle = document.documentElement.style;\n            var transitions = support.transitions = false, transforms = support.transforms = false, elementProto = 'HTMLElement' in window ? HTMLElement.prototype : [];\n            support.hasHW3D = 'WebKitCSSMatrix' in window && 'm11' in new window.WebKitCSSMatrix() || 'MozPerspective' in docStyle || 'msPerspective' in docStyle;\n            support.cssFlexbox = 'flexWrap' in docStyle || 'WebkitFlexWrap' in docStyle || 'msFlexWrap' in docStyle;\n            each([\n                'Moz',\n                'webkit',\n                'O',\n                'ms'\n            ], function () {\n                var prefix = this.toString(), hasTransitions = typeof table.style[prefix + 'Transition'] === STRING;\n                if (hasTransitions || typeof table.style[prefix + 'Transform'] === STRING) {\n                    var lowPrefix = prefix.toLowerCase();\n                    transforms = {\n                        css: lowPrefix != 'ms' ? '-' + lowPrefix + '-' : '',\n                        prefix: prefix,\n                        event: lowPrefix === 'o' || lowPrefix === 'webkit' ? lowPrefix : ''\n                    };\n                    if (hasTransitions) {\n                        transitions = transforms;\n                        transitions.event = transitions.event ? transitions.event + 'TransitionEnd' : 'transitionend';\n                    }\n                    return false;\n                }\n            });\n            table = null;\n            support.transforms = transforms;\n            support.transitions = transitions;\n            support.devicePixelRatio = window.devicePixelRatio === undefined ? 1 : window.devicePixelRatio;\n            try {\n                support.screenWidth = window.outerWidth || window.screen ? window.screen.availWidth : window.innerWidth;\n                support.screenHeight = window.outerHeight || window.screen ? window.screen.availHeight : window.innerHeight;\n            } catch (e) {\n                support.screenWidth = window.screen.availWidth;\n                support.screenHeight = window.screen.availHeight;\n            }\n            support.detectOS = function (ua) {\n                var os = false, minorVersion, match = [], notAndroidPhone = !/mobile safari/i.test(ua), agentRxs = {\n                        wp: /(Windows Phone(?: OS)?)\\s(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        fire: /(Silk)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        android: /(Android|Android.*(?:Opera|Firefox).*?\\/)\\s*(\\d+)\\.?(\\d+(\\.\\d+)?)?/,\n                        iphone: /(iPhone|iPod).*OS\\s+(\\d+)[\\._]([\\d\\._]+)/,\n                        ipad: /(iPad).*OS\\s+(\\d+)[\\._]([\\d_]+)/,\n                        meego: /(MeeGo).+NokiaBrowser\\/(\\d+)\\.([\\d\\._]+)/,\n                        webos: /(webOS)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        blackberry: /(BlackBerry|BB10).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        playbook: /(PlayBook).*?Tablet\\s*OS\\s*(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        windows: /(MSIE)\\s+(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        tizen: /(tizen).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/i,\n                        sailfish: /(sailfish).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*firefox/i,\n                        ffos: /(Mobile).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*Firefox/\n                    }, osRxs = {\n                        ios: /^i(phone|pad|pod)$/i,\n                        android: /^android|fire$/i,\n                        blackberry: /^blackberry|playbook/i,\n                        windows: /windows/,\n                        wp: /wp/,\n                        flat: /sailfish|ffos|tizen/i,\n                        meego: /meego/\n                    }, formFactorRxs = { tablet: /playbook|ipad|fire/i }, browserRxs = {\n                        omini: /Opera\\sMini/i,\n                        omobile: /Opera\\sMobi/i,\n                        firefox: /Firefox|Fennec/i,\n                        mobilesafari: /version\\/.*safari/i,\n                        ie: /MSIE|Windows\\sPhone/i,\n                        chrome: /chrome|crios/i,\n                        webkit: /webkit/i\n                    };\n                for (var agent in agentRxs) {\n                    if (agentRxs.hasOwnProperty(agent)) {\n                        match = ua.match(agentRxs[agent]);\n                        if (match) {\n                            if (agent == 'windows' && 'plugins' in navigator) {\n                                return false;\n                            }\n                            os = {};\n                            os.device = agent;\n                            os.tablet = testRx(agent, formFactorRxs, false);\n                            os.browser = testRx(ua, browserRxs, 'default');\n                            os.name = testRx(agent, osRxs);\n                            os[os.name] = true;\n                            os.majorVersion = match[2];\n                            os.minorVersion = (match[3] || '0').replace('_', '.');\n                            minorVersion = os.minorVersion.replace('.', '').substr(0, 2);\n                            os.flatVersion = os.majorVersion + minorVersion + new Array(3 - (minorVersion.length < 3 ? minorVersion.length : 2)).join('0');\n                            os.cordova = typeof window.PhoneGap !== UNDEFINED || typeof window.cordova !== UNDEFINED;\n                            os.appMode = window.navigator.standalone || /file|local|wmapp/.test(window.location.protocol) || os.cordova;\n                            if (os.android && (support.devicePixelRatio < 1.5 && os.flatVersion < 400 || notAndroidPhone) && (support.screenWidth > 800 || support.screenHeight > 800)) {\n                                os.tablet = agent;\n                            }\n                            break;\n                        }\n                    }\n                }\n                return os;\n            };\n            var mobileOS = support.mobileOS = support.detectOS(navigator.userAgent);\n            support.wpDevicePixelRatio = mobileOS.wp ? screen.width / 320 : 0;\n            support.hasNativeScrolling = false;\n            if (mobileOS.ios || mobileOS.android && mobileOS.majorVersion > 2 || mobileOS.wp) {\n                support.hasNativeScrolling = mobileOS;\n            }\n            support.delayedClick = function () {\n                if (support.touch) {\n                    if (mobileOS.ios) {\n                        return true;\n                    }\n                    if (mobileOS.android) {\n                        if (!support.browser.chrome) {\n                            return true;\n                        }\n                        if (support.browser.version < 32) {\n                            return false;\n                        }\n                        return !($('meta[name=viewport]').attr('content') || '').match(/user-scalable=no/i);\n                    }\n                }\n                return false;\n            };\n            support.mouseAndTouchPresent = support.touch && !(support.mobileOS.ios || support.mobileOS.android);\n            support.detectBrowser = function (ua) {\n                var browser = false, match = [], browserRxs = {\n                        edge: /(edge)[ \\/]([\\w.]+)/i,\n                        webkit: /(chrome|crios)[ \\/]([\\w.]+)/i,\n                        safari: /(webkit)[ \\/]([\\w.]+)/i,\n                        opera: /(opera)(?:.*version|)[ \\/]([\\w.]+)/i,\n                        msie: /(msie\\s|trident.*? rv:)([\\w.]+)/i,\n                        mozilla: /(mozilla)(?:.*? rv:([\\w.]+)|)/i\n                    };\n                for (var agent in browserRxs) {\n                    if (browserRxs.hasOwnProperty(agent)) {\n                        match = ua.match(browserRxs[agent]);\n                        if (match) {\n                            browser = {};\n                            browser[agent] = true;\n                            browser[match[1].toLowerCase().split(' ')[0].split('/')[0]] = true;\n                            browser.version = parseInt(document.documentMode || match[2], 10);\n                            break;\n                        }\n                    }\n                }\n                return browser;\n            };\n            support.browser = support.detectBrowser(navigator.userAgent);\n            support.detectClipboardAccess = function () {\n                var commands = {\n                    copy: document.queryCommandSupported ? document.queryCommandSupported('copy') : false,\n                    cut: document.queryCommandSupported ? document.queryCommandSupported('cut') : false,\n                    paste: document.queryCommandSupported ? document.queryCommandSupported('paste') : false\n                };\n                if (support.browser.chrome) {\n                    commands.paste = false;\n                    if (support.browser.version >= 43) {\n                        commands.copy = true;\n                        commands.cut = true;\n                    }\n                }\n                return commands;\n            };\n            support.clipboard = support.detectClipboardAccess();\n            support.zoomLevel = function () {\n                try {\n                    var browser = support.browser;\n                    var ie11WidthCorrection = 0;\n                    var docEl = document.documentElement;\n                    if (browser.msie && browser.version == 11 && docEl.scrollHeight > docEl.clientHeight && !support.touch) {\n                        ie11WidthCorrection = support.scrollbar();\n                    }\n                    return support.touch ? docEl.clientWidth / window.innerWidth : browser.msie && browser.version >= 10 ? ((top || window).document.documentElement.offsetWidth + ie11WidthCorrection) / (top || window).innerWidth : 1;\n                } catch (e) {\n                    return 1;\n                }\n            };\n            support.cssBorderSpacing = typeof docStyle.borderSpacing != 'undefined' && !(support.browser.msie && support.browser.version < 8);\n            (function (browser) {\n                var cssClass = '', docElement = $(document.documentElement), majorVersion = parseInt(browser.version, 10);\n                if (browser.msie) {\n                    cssClass = 'ie';\n                } else if (browser.mozilla) {\n                    cssClass = 'ff';\n                } else if (browser.safari) {\n                    cssClass = 'safari';\n                } else if (browser.webkit) {\n                    cssClass = 'webkit';\n                } else if (browser.opera) {\n                    cssClass = 'opera';\n                } else if (browser.edge) {\n                    cssClass = 'edge';\n                }\n                if (cssClass) {\n                    cssClass = 'k-' + cssClass + ' k-' + cssClass + majorVersion;\n                }\n                if (support.mobileOS) {\n                    cssClass += ' k-mobile';\n                }\n                if (!support.cssFlexbox) {\n                    cssClass += ' k-no-flexbox';\n                }\n                docElement.addClass(cssClass);\n            }(support.browser));\n            support.eventCapture = document.documentElement.addEventListener;\n            var input = document.createElement('input');\n            support.placeholder = 'placeholder' in input;\n            support.propertyChangeEvent = 'onpropertychange' in input;\n            support.input = function () {\n                var types = [\n                    'number',\n                    'date',\n                    'time',\n                    'month',\n                    'week',\n                    'datetime',\n                    'datetime-local'\n                ];\n                var length = types.length;\n                var value = 'test';\n                var result = {};\n                var idx = 0;\n                var type;\n                for (; idx < length; idx++) {\n                    type = types[idx];\n                    input.setAttribute('type', type);\n                    input.value = value;\n                    result[type.replace('-', '')] = input.type !== 'text' && input.value !== value;\n                }\n                return result;\n            }();\n            input.style.cssText = 'float:left;';\n            support.cssFloat = !!input.style.cssFloat;\n            input = null;\n            support.stableSort = function () {\n                var threshold = 513;\n                var sorted = [{\n                        index: 0,\n                        field: 'b'\n                    }];\n                for (var i = 1; i < threshold; i++) {\n                    sorted.push({\n                        index: i,\n                        field: 'a'\n                    });\n                }\n                sorted.sort(function (a, b) {\n                    return a.field > b.field ? 1 : a.field < b.field ? -1 : 0;\n                });\n                return sorted[0].index === 1;\n            }();\n            support.matchesSelector = elementProto.webkitMatchesSelector || elementProto.mozMatchesSelector || elementProto.msMatchesSelector || elementProto.oMatchesSelector || elementProto.matchesSelector || elementProto.matches || function (selector) {\n                var nodeList = document.querySelectorAll ? (this.parentNode || document).querySelectorAll(selector) || [] : $(selector), i = nodeList.length;\n                while (i--) {\n                    if (nodeList[i] == this) {\n                        return true;\n                    }\n                }\n                return false;\n            };\n            support.matchMedia = 'matchMedia' in window;\n            support.pushState = window.history && window.history.pushState;\n            var documentMode = document.documentMode;\n            support.hashChange = 'onhashchange' in window && !(support.browser.msie && (!documentMode || documentMode <= 8));\n            support.customElements = 'registerElement' in window.document;\n            var chrome = support.browser.chrome, mobileChrome = support.browser.crios, mozilla = support.browser.mozilla, safari = support.browser.safari;\n            support.msPointers = !chrome && window.MSPointerEvent;\n            support.pointers = !chrome && !mobileChrome && !mozilla && !safari && window.PointerEvent;\n            support.kineticScrollNeeded = mobileOS && (support.touch || support.msPointers || support.pointers);\n        }());\n        function size(obj) {\n            var result = 0, key;\n            for (key in obj) {\n                if (obj.hasOwnProperty(key) && key != 'toJSON') {\n                    result++;\n                }\n            }\n            return result;\n        }\n        function getOffset(element, type, positioned) {\n            if (!type) {\n                type = 'offset';\n            }\n            var offset = element[type]();\n            var result = {\n                top: offset.top,\n                right: offset.right,\n                bottom: offset.bottom,\n                left: offset.left\n            };\n            if (support.browser.msie && (support.pointers || support.msPointers) && !positioned) {\n                var sign = support.isRtl(element) ? 1 : -1;\n                result.top -= window.pageYOffset - document.documentElement.scrollTop;\n                result.left -= window.pageXOffset + sign * document.documentElement.scrollLeft;\n            }\n            return result;\n        }\n        var directions = {\n            left: { reverse: 'right' },\n            right: { reverse: 'left' },\n            down: { reverse: 'up' },\n            up: { reverse: 'down' },\n            top: { reverse: 'bottom' },\n            bottom: { reverse: 'top' },\n            'in': { reverse: 'out' },\n            out: { reverse: 'in' }\n        };\n        function parseEffects(input) {\n            var effects = {};\n            each(typeof input === 'string' ? input.split(' ') : input, function (idx) {\n                effects[idx] = this;\n            });\n            return effects;\n        }\n        function fx(element) {\n            return new kendo.effects.Element(element);\n        }\n        var effects = {};\n        $.extend(effects, {\n            enabled: true,\n            Element: function (element) {\n                this.element = $(element);\n            },\n            promise: function (element, options) {\n                if (!element.is(':visible')) {\n                    element.css({ display: element.data('olddisplay') || 'block' }).css('display');\n                }\n                if (options.hide) {\n                    element.data('olddisplay', element.css('display')).hide();\n                }\n                if (options.init) {\n                    options.init();\n                }\n                if (options.completeCallback) {\n                    options.completeCallback(element);\n                }\n                element.dequeue();\n            },\n            disable: function () {\n                this.enabled = false;\n                this.promise = this.promiseShim;\n            },\n            enable: function () {\n                this.enabled = true;\n                this.promise = this.animatedPromise;\n            }\n        });\n        effects.promiseShim = effects.promise;\n        function prepareAnimationOptions(options, duration, reverse, complete) {\n            if (typeof options === STRING) {\n                if (isFunction(duration)) {\n                    complete = duration;\n                    duration = 400;\n                    reverse = false;\n                }\n                if (isFunction(reverse)) {\n                    complete = reverse;\n                    reverse = false;\n                }\n                if (typeof duration === BOOLEAN) {\n                    reverse = duration;\n                    duration = 400;\n                }\n                options = {\n                    effects: options,\n                    duration: duration,\n                    reverse: reverse,\n                    complete: complete\n                };\n            }\n            return extend({\n                effects: {},\n                duration: 400,\n                reverse: false,\n                init: noop,\n                teardown: noop,\n                hide: false\n            }, options, {\n                completeCallback: options.complete,\n                complete: noop\n            });\n        }\n        function animate(element, options, duration, reverse, complete) {\n            var idx = 0, length = element.length, instance;\n            for (; idx < length; idx++) {\n                instance = $(element[idx]);\n                instance.queue(function () {\n                    effects.promise(instance, prepareAnimationOptions(options, duration, reverse, complete));\n                });\n            }\n            return element;\n        }\n        function toggleClass(element, classes, options, add) {\n            if (classes) {\n                classes = classes.split(' ');\n                each(classes, function (idx, value) {\n                    element.toggleClass(value, add);\n                });\n            }\n            return element;\n        }\n        if (!('kendoAnimate' in $.fn)) {\n            extend($.fn, {\n                kendoStop: function (clearQueue, gotoEnd) {\n                    return this.stop(clearQueue, gotoEnd);\n                },\n                kendoAnimate: function (options, duration, reverse, complete) {\n                    return animate(this, options, duration, reverse, complete);\n                },\n                kendoAddClass: function (classes, options) {\n                    return kendo.toggleClass(this, classes, options, true);\n                },\n                kendoRemoveClass: function (classes, options) {\n                    return kendo.toggleClass(this, classes, options, false);\n                },\n                kendoToggleClass: function (classes, options, toggle) {\n                    return kendo.toggleClass(this, classes, options, toggle);\n                }\n            });\n        }\n        var ampRegExp = /&/g, ltRegExp = /</g, quoteRegExp = /\"/g, aposRegExp = /'/g, gtRegExp = />/g;\n        function htmlEncode(value) {\n            return ('' + value).replace(ampRegExp, '&amp;').replace(ltRegExp, '&lt;').replace(gtRegExp, '&gt;').replace(quoteRegExp, '&quot;').replace(aposRegExp, '&#39;');\n        }\n        function unescape(value) {\n            var template;\n            try {\n                template = window.decodeURIComponent(value);\n            } catch (error) {\n                template = value.replace(/%u([\\dA-F]{4})|%([\\dA-F]{2})/gi, function (_, m1, m2) {\n                    return String.fromCharCode(parseInt('0x' + (m1 || m2), 16));\n                });\n            }\n            return template;\n        }\n        var eventTarget = function (e) {\n            return e.target;\n        };\n        if (support.touch) {\n            eventTarget = function (e) {\n                var touches = 'originalEvent' in e ? e.originalEvent.changedTouches : 'changedTouches' in e ? e.changedTouches : null;\n                return touches ? document.elementFromPoint(touches[0].clientX, touches[0].clientY) : e.target;\n            };\n            each([\n                'swipe',\n                'swipeLeft',\n                'swipeRight',\n                'swipeUp',\n                'swipeDown',\n                'doubleTap',\n                'tap'\n            ], function (m, value) {\n                $.fn[value] = function (callback) {\n                    return this.bind(value, callback);\n                };\n            });\n        }\n        if (support.touch) {\n            if (!support.mobileOS) {\n                support.mousedown = 'mousedown touchstart';\n                support.mouseup = 'mouseup touchend';\n                support.mousemove = 'mousemove touchmove';\n                support.mousecancel = 'mouseleave touchcancel';\n                support.click = 'click';\n                support.resize = 'resize';\n            } else {\n                support.mousedown = 'touchstart';\n                support.mouseup = 'touchend';\n                support.mousemove = 'touchmove';\n                support.mousecancel = 'touchcancel';\n                support.click = 'touchend';\n                support.resize = 'orientationchange';\n            }\n        } else if (support.pointers) {\n            support.mousemove = 'pointermove';\n            support.mousedown = 'pointerdown';\n            support.mouseup = 'pointerup';\n            support.mousecancel = 'pointercancel';\n            support.click = 'pointerup';\n            support.resize = 'orientationchange resize';\n        } else if (support.msPointers) {\n            support.mousemove = 'MSPointerMove';\n            support.mousedown = 'MSPointerDown';\n            support.mouseup = 'MSPointerUp';\n            support.mousecancel = 'MSPointerCancel';\n            support.click = 'MSPointerUp';\n            support.resize = 'orientationchange resize';\n        } else {\n            support.mousemove = 'mousemove';\n            support.mousedown = 'mousedown';\n            support.mouseup = 'mouseup';\n            support.mousecancel = 'mouseleave';\n            support.click = 'click';\n            support.resize = 'resize';\n        }\n        var wrapExpression = function (members, paramName) {\n                var result = paramName || 'd', index, idx, length, member, count = 1;\n                for (idx = 0, length = members.length; idx < length; idx++) {\n                    member = members[idx];\n                    if (member !== '') {\n                        index = member.indexOf('[');\n                        if (index !== 0) {\n                            if (index == -1) {\n                                member = '.' + member;\n                            } else {\n                                count++;\n                                member = '.' + member.substring(0, index) + ' || {})' + member.substring(index);\n                            }\n                        }\n                        count++;\n                        result += member + (idx < length - 1 ? ' || {})' : ')');\n                    }\n                }\n                return new Array(count).join('(') + result;\n            }, localUrlRe = /^([a-z]+:)?\\/\\//i;\n        extend(kendo, {\n            widgets: [],\n            _widgetRegisteredCallbacks: [],\n            ui: kendo.ui || {},\n            fx: kendo.fx || fx,\n            effects: kendo.effects || effects,\n            mobile: kendo.mobile || {},\n            data: kendo.data || {},\n            dataviz: kendo.dataviz || {},\n            drawing: kendo.drawing || {},\n            spreadsheet: { messages: {} },\n            keys: {\n                INSERT: 45,\n                DELETE: 46,\n                BACKSPACE: 8,\n                TAB: 9,\n                ENTER: 13,\n                ESC: 27,\n                LEFT: 37,\n                UP: 38,\n                RIGHT: 39,\n                DOWN: 40,\n                END: 35,\n                HOME: 36,\n                SPACEBAR: 32,\n                PAGEUP: 33,\n                PAGEDOWN: 34,\n                F2: 113,\n                F10: 121,\n                F12: 123,\n                NUMPAD_PLUS: 107,\n                NUMPAD_MINUS: 109,\n                NUMPAD_DOT: 110\n            },\n            support: kendo.support || support,\n            animate: kendo.animate || animate,\n            ns: '',\n            attr: function (value) {\n                return 'data-' + kendo.ns + value;\n            },\n            getShadows: getShadows,\n            wrap: wrap,\n            deepExtend: deepExtend,\n            getComputedStyles: getComputedStyles,\n            isScrollable: isScrollable,\n            scrollLeft: scrollLeft,\n            size: size,\n            toCamelCase: toCamelCase,\n            toHyphens: toHyphens,\n            getOffset: kendo.getOffset || getOffset,\n            parseEffects: kendo.parseEffects || parseEffects,\n            toggleClass: kendo.toggleClass || toggleClass,\n            directions: kendo.directions || directions,\n            Observable: Observable,\n            Class: Class,\n            Template: Template,\n            template: proxy(Template.compile, Template),\n            render: proxy(Template.render, Template),\n            stringify: proxy(JSON.stringify, JSON),\n            eventTarget: eventTarget,\n            htmlEncode: htmlEncode,\n            unescape: unescape,\n            isLocalUrl: function (url) {\n                return url && !localUrlRe.test(url);\n            },\n            expr: function (expression, safe, paramName) {\n                expression = expression || '';\n                if (typeof safe == STRING) {\n                    paramName = safe;\n                    safe = false;\n                }\n                paramName = paramName || 'd';\n                if (expression && expression.charAt(0) !== '[') {\n                    expression = '.' + expression;\n                }\n                if (safe) {\n                    expression = expression.replace(/\"([^.]*)\\.([^\"]*)\"/g, '\"$1_$DOT$_$2\"');\n                    expression = expression.replace(/'([^.]*)\\.([^']*)'/g, '\\'$1_$DOT$_$2\\'');\n                    expression = wrapExpression(expression.split('.'), paramName);\n                    expression = expression.replace(/_\\$DOT\\$_/g, '.');\n                } else {\n                    expression = paramName + expression;\n                }\n                return expression;\n            },\n            getter: function (expression, safe) {\n                var key = expression + safe;\n                return getterCache[key] = getterCache[key] || new Function('d', 'return ' + kendo.expr(expression, safe));\n            },\n            setter: function (expression) {\n                return setterCache[expression] = setterCache[expression] || new Function('d,value', kendo.expr(expression) + '=value');\n            },\n            accessor: function (expression) {\n                return {\n                    get: kendo.getter(expression),\n                    set: kendo.setter(expression)\n                };\n            },\n            guid: function () {\n                var id = '', i, random;\n                for (i = 0; i < 32; i++) {\n                    random = math.random() * 16 | 0;\n                    if (i == 8 || i == 12 || i == 16 || i == 20) {\n                        id += '-';\n                    }\n                    id += (i == 12 ? 4 : i == 16 ? random & 3 | 8 : random).toString(16);\n                }\n                return id;\n            },\n            roleSelector: function (role) {\n                return role.replace(/(\\S+)/g, '[' + kendo.attr('role') + '=$1],').slice(0, -1);\n            },\n            directiveSelector: function (directives) {\n                var selectors = directives.split(' ');\n                if (selectors) {\n                    for (var i = 0; i < selectors.length; i++) {\n                        if (selectors[i] != 'view') {\n                            selectors[i] = selectors[i].replace(/(\\w*)(view|bar|strip|over)$/, '$1-$2');\n                        }\n                    }\n                }\n                return selectors.join(' ').replace(/(\\S+)/g, 'kendo-mobile-$1,').slice(0, -1);\n            },\n            triggeredByInput: function (e) {\n                return /^(label|input|textarea|select)$/i.test(e.target.tagName);\n            },\n            onWidgetRegistered: function (callback) {\n                for (var i = 0, len = kendo.widgets.length; i < len; i++) {\n                    callback(kendo.widgets[i]);\n                }\n                kendo._widgetRegisteredCallbacks.push(callback);\n            },\n            logToConsole: function (message, type) {\n                var console = window.console;\n                if (!kendo.suppressLog && typeof console != 'undefined' && console.log) {\n                    console[type || 'log'](message);\n                }\n            }\n        });\n        var Widget = Observable.extend({\n            init: function (element, options) {\n                var that = this;\n                that.element = kendo.jQuery(element).handler(that);\n                that.angular('init', options);\n                Observable.fn.init.call(that);\n                var dataSource = options ? options.dataSource : null;\n                if (dataSource) {\n                    options = extend({}, options, { dataSource: {} });\n                }\n                options = that.options = extend(true, {}, that.options, that.defaults, options);\n                if (dataSource) {\n                    options.dataSource = dataSource;\n                }\n                if (!that.element.attr(kendo.attr('role'))) {\n                    that.element.attr(kendo.attr('role'), (options.name || '').toLowerCase());\n                }\n                that.element.data('kendo' + options.prefix + options.name, that);\n                that.bind(that.events, options);\n            },\n            events: [],\n            options: { prefix: '' },\n            _hasBindingTarget: function () {\n                return !!this.element[0].kendoBindingTarget;\n            },\n            _tabindex: function (target) {\n                target = target || this.wrapper;\n                var element = this.element, TABINDEX = 'tabindex', tabindex = target.attr(TABINDEX) || element.attr(TABINDEX);\n                element.removeAttr(TABINDEX);\n                target.attr(TABINDEX, !isNaN(tabindex) ? tabindex : 0);\n            },\n            setOptions: function (options) {\n                this._setEvents(options);\n                $.extend(this.options, options);\n            },\n            _setEvents: function (options) {\n                var that = this, idx = 0, length = that.events.length, e;\n                for (; idx < length; idx++) {\n                    e = that.events[idx];\n                    if (that.options[e] && options[e]) {\n                        that.unbind(e, that.options[e]);\n                        if (that._events && that._events[e]) {\n                            delete that._events[e];\n                        }\n                    }\n                }\n                that.bind(that.events, options);\n            },\n            resize: function (force) {\n                var size = this.getSize(), currentSize = this._size;\n                if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n                    this._size = size;\n                    this._resize(size, force);\n                    this.trigger('resize', size);\n                }\n            },\n            getSize: function () {\n                return kendo.dimensions(this.element);\n            },\n            size: function (size) {\n                if (!size) {\n                    return this.getSize();\n                } else {\n                    this.setSize(size);\n                }\n            },\n            setSize: $.noop,\n            _resize: $.noop,\n            destroy: function () {\n                var that = this;\n                that.element.removeData('kendo' + that.options.prefix + that.options.name);\n                that.element.removeData('handler');\n                that.unbind();\n            },\n            _destroy: function () {\n                this.destroy();\n            },\n            angular: function () {\n            },\n            _muteAngularRebind: function (callback) {\n                this._muteRebind = true;\n                callback.call(this);\n                this._muteRebind = false;\n            }\n        });\n        var DataBoundWidget = Widget.extend({\n            dataItems: function () {\n                return this.dataSource.flatView();\n            },\n            _angularItems: function (cmd) {\n                var that = this;\n                that.angular(cmd, function () {\n                    return {\n                        elements: that.items(),\n                        data: $.map(that.dataItems(), function (dataItem) {\n                            return { dataItem: dataItem };\n                        })\n                    };\n                });\n            }\n        });\n        kendo.dimensions = function (element, dimensions) {\n            var domElement = element[0];\n            if (dimensions) {\n                element.css(dimensions);\n            }\n            return {\n                width: domElement.offsetWidth,\n                height: domElement.offsetHeight\n            };\n        };\n        kendo.notify = noop;\n        var templateRegExp = /template$/i, jsonRegExp = /^\\s*(?:\\{(?:.|\\r\\n|\\n)*\\}|\\[(?:.|\\r\\n|\\n)*\\])\\s*$/, jsonFormatRegExp = /^\\{(\\d+)(:[^\\}]+)?\\}|^\\[[A-Za-z_]+\\]$/, dashRegExp = /([A-Z])/g;\n        function parseOption(element, option) {\n            var value;\n            if (option.indexOf('data') === 0) {\n                option = option.substring(4);\n                option = option.charAt(0).toLowerCase() + option.substring(1);\n            }\n            option = option.replace(dashRegExp, '-$1');\n            value = element.getAttribute('data-' + kendo.ns + option);\n            if (value === null) {\n                value = undefined;\n            } else if (value === 'null') {\n                value = null;\n            } else if (value === 'true') {\n                value = true;\n            } else if (value === 'false') {\n                value = false;\n            } else if (numberRegExp.test(value) && option != 'mask') {\n                value = parseFloat(value);\n            } else if (jsonRegExp.test(value) && !jsonFormatRegExp.test(value)) {\n                value = new Function('return (' + value + ')')();\n            }\n            return value;\n        }\n        function parseOptions(element, options, source) {\n            var result = {}, option, value, role = element.getAttribute('data-' + kendo.ns + 'role');\n            for (option in options) {\n                value = parseOption(element, option);\n                if (value !== undefined) {\n                    if (templateRegExp.test(option) && role != 'drawer') {\n                        if (typeof value === 'string') {\n                            if ($('#' + value).length) {\n                                value = kendo.template($('#' + value).html());\n                            } else if (source) {\n                                value = kendo.template(source[value]);\n                            }\n                        } else {\n                            value = element.getAttribute(option);\n                        }\n                    }\n                    result[option] = value;\n                }\n            }\n            return result;\n        }\n        kendo.initWidget = function (element, options, roles) {\n            var result, option, widget, idx, length, role, value, dataSource, fullPath, widgetKeyRegExp;\n            if (!roles) {\n                roles = kendo.ui.roles;\n            } else if (roles.roles) {\n                roles = roles.roles;\n            }\n            element = element.nodeType ? element : element[0];\n            role = element.getAttribute('data-' + kendo.ns + 'role');\n            if (!role) {\n                return;\n            }\n            fullPath = role.indexOf('.') === -1;\n            if (fullPath) {\n                widget = roles[role];\n            } else {\n                widget = kendo.getter(role)(window);\n            }\n            var data = $(element).data(), widgetKey = widget ? 'kendo' + widget.fn.options.prefix + widget.fn.options.name : '';\n            if (fullPath) {\n                widgetKeyRegExp = new RegExp('^kendo.*' + role + '$', 'i');\n            } else {\n                widgetKeyRegExp = new RegExp('^' + widgetKey + '$', 'i');\n            }\n            for (var key in data) {\n                if (key.match(widgetKeyRegExp)) {\n                    if (key === widgetKey) {\n                        result = data[key];\n                    } else {\n                        return data[key];\n                    }\n                }\n            }\n            if (!widget) {\n                return;\n            }\n            dataSource = parseOption(element, 'dataSource');\n            options = $.extend({}, parseOptions(element, widget.fn.options), options);\n            if (dataSource) {\n                if (typeof dataSource === STRING) {\n                    options.dataSource = kendo.getter(dataSource)(window);\n                } else {\n                    options.dataSource = dataSource;\n                }\n            }\n            for (idx = 0, length = widget.fn.events.length; idx < length; idx++) {\n                option = widget.fn.events[idx];\n                value = parseOption(element, option);\n                if (value !== undefined) {\n                    options[option] = kendo.getter(value)(window);\n                }\n            }\n            if (!result) {\n                result = new widget(element, options);\n            } else if (!$.isEmptyObject(options)) {\n                result.setOptions(options);\n            }\n            return result;\n        };\n        kendo.rolesFromNamespaces = function (namespaces) {\n            var roles = [], idx, length;\n            if (!namespaces[0]) {\n                namespaces = [\n                    kendo.ui,\n                    kendo.dataviz.ui\n                ];\n            }\n            for (idx = 0, length = namespaces.length; idx < length; idx++) {\n                roles[idx] = namespaces[idx].roles;\n            }\n            return extend.apply(null, [{}].concat(roles.reverse()));\n        };\n        kendo.init = function (element) {\n            var roles = kendo.rolesFromNamespaces(slice.call(arguments, 1));\n            $(element).find('[data-' + kendo.ns + 'role]').addBack().each(function () {\n                kendo.initWidget(this, {}, roles);\n            });\n        };\n        kendo.destroy = function (element) {\n            $(element).find('[data-' + kendo.ns + 'role]').addBack().each(function () {\n                var data = $(this).data();\n                for (var key in data) {\n                    if (key.indexOf('kendo') === 0 && typeof data[key].destroy === FUNCTION) {\n                        data[key].destroy();\n                    }\n                }\n            });\n        };\n        function containmentComparer(a, b) {\n            return $.contains(a, b) ? -1 : 1;\n        }\n        function resizableWidget() {\n            var widget = $(this);\n            return $.inArray(widget.attr('data-' + kendo.ns + 'role'), [\n                'slider',\n                'rangeslider',\n                'breadcrumb'\n            ]) > -1 || widget.is(':visible');\n        }\n        kendo.resize = function (element, force) {\n            var widgets = $(element).find('[data-' + kendo.ns + 'role]').addBack().filter(resizableWidget);\n            if (!widgets.length) {\n                return;\n            }\n            var widgetsArray = $.makeArray(widgets);\n            widgetsArray.sort(containmentComparer);\n            $.each(widgetsArray, function () {\n                var widget = kendo.widgetInstance($(this));\n                if (widget) {\n                    widget.resize(force);\n                }\n            });\n        };\n        kendo.parseOptions = parseOptions;\n        extend(kendo.ui, {\n            Widget: Widget,\n            DataBoundWidget: DataBoundWidget,\n            roles: {},\n            progress: function (container, toggle, options) {\n                var mask = container.find('.k-loading-mask'), support = kendo.support, browser = support.browser, isRtl, leftRight, webkitCorrection, containerScrollLeft, cssClass;\n                options = $.extend({}, {\n                    width: '100%',\n                    height: '100%',\n                    top: container.scrollTop(),\n                    opacity: false\n                }, options);\n                cssClass = options.opacity ? 'k-loading-mask k-opaque' : 'k-loading-mask';\n                if (toggle) {\n                    if (!mask.length) {\n                        isRtl = support.isRtl(container);\n                        leftRight = isRtl ? 'right' : 'left';\n                        containerScrollLeft = container.scrollLeft();\n                        webkitCorrection = browser.webkit ? !isRtl ? 0 : container[0].scrollWidth - container.width() - 2 * containerScrollLeft : 0;\n                        mask = $(kendo.format('<div class=\\'{0}\\'><span class=\\'k-loading-text\\'>{1}</span><div class=\\'k-loading-image\\'/><div class=\\'k-loading-color\\'/></div>', cssClass, kendo.ui.progress.messages.loading)).width(options.width).height(options.height).css('top', options.top).css(leftRight, Math.abs(containerScrollLeft) + webkitCorrection).prependTo(container);\n                    }\n                } else if (mask) {\n                    mask.remove();\n                }\n            },\n            plugin: function (widget, register, prefix) {\n                var name = widget.fn.options.name, getter;\n                register = register || kendo.ui;\n                prefix = prefix || '';\n                register[name] = widget;\n                register.roles[name.toLowerCase()] = widget;\n                getter = 'getKendo' + prefix + name;\n                name = 'kendo' + prefix + name;\n                var widgetEntry = {\n                    name: name,\n                    widget: widget,\n                    prefix: prefix || ''\n                };\n                kendo.widgets.push(widgetEntry);\n                for (var i = 0, len = kendo._widgetRegisteredCallbacks.length; i < len; i++) {\n                    kendo._widgetRegisteredCallbacks[i](widgetEntry);\n                }\n                $.fn[name] = function (options) {\n                    var value = this, args;\n                    if (typeof options === STRING) {\n                        args = slice.call(arguments, 1);\n                        this.each(function () {\n                            var widget = $.data(this, name), method, result;\n                            if (!widget) {\n                                throw new Error(kendo.format('Cannot call method \\'{0}\\' of {1} before it is initialized', options, name));\n                            }\n                            method = widget[options];\n                            if (typeof method !== FUNCTION) {\n                                throw new Error(kendo.format('Cannot find method \\'{0}\\' of {1}', options, name));\n                            }\n                            result = method.apply(widget, args);\n                            if (result !== undefined) {\n                                value = result;\n                                return false;\n                            }\n                        });\n                    } else {\n                        this.each(function () {\n                            return new widget(this, options);\n                        });\n                    }\n                    return value;\n                };\n                $.fn[name].widget = widget;\n                $.fn[getter] = function () {\n                    return this.data(name);\n                };\n            }\n        });\n        kendo.ui.progress.messages = { loading: 'Loading...' };\n        var ContainerNullObject = {\n            bind: function () {\n                return this;\n            },\n            nullObject: true,\n            options: {}\n        };\n        var MobileWidget = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.element.autoApplyNS();\n                this.wrapper = this.element;\n                this.element.addClass('km-widget');\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.element.kendoDestroy();\n            },\n            options: { prefix: 'Mobile' },\n            events: [],\n            view: function () {\n                var viewElement = this.element.closest(kendo.roleSelector('view splitview modalview drawer'));\n                return kendo.widgetInstance(viewElement, kendo.mobile.ui) || ContainerNullObject;\n            },\n            viewHasNativeScrolling: function () {\n                var view = this.view();\n                return view && view.options.useNativeScrolling;\n            },\n            container: function () {\n                var element = this.element.closest(kendo.roleSelector('view layout modalview drawer splitview'));\n                return kendo.widgetInstance(element.eq(0), kendo.mobile.ui) || ContainerNullObject;\n            }\n        });\n        extend(kendo.mobile, {\n            init: function (element) {\n                kendo.init(element, kendo.mobile.ui, kendo.ui, kendo.dataviz.ui);\n            },\n            appLevelNativeScrolling: function () {\n                return kendo.mobile.application && kendo.mobile.application.options && kendo.mobile.application.options.useNativeScrolling;\n            },\n            roles: {},\n            ui: {\n                Widget: MobileWidget,\n                DataBoundWidget: DataBoundWidget.extend(MobileWidget.prototype),\n                roles: {},\n                plugin: function (widget) {\n                    kendo.ui.plugin(widget, kendo.mobile.ui, 'Mobile');\n                }\n            }\n        });\n        deepExtend(kendo.dataviz, {\n            init: function (element) {\n                kendo.init(element, kendo.dataviz.ui);\n            },\n            ui: {\n                roles: {},\n                themes: {},\n                views: [],\n                plugin: function (widget) {\n                    kendo.ui.plugin(widget, kendo.dataviz.ui);\n                }\n            },\n            roles: {}\n        });\n        kendo.touchScroller = function (elements, options) {\n            if (!options) {\n                options = {};\n            }\n            options.useNative = true;\n            return $(elements).map(function (idx, element) {\n                element = $(element);\n                if (support.kineticScrollNeeded && kendo.mobile.ui.Scroller && !element.data('kendoMobileScroller')) {\n                    element.kendoMobileScroller(options);\n                    return element.data('kendoMobileScroller');\n                } else {\n                    return false;\n                }\n            })[0];\n        };\n        kendo.preventDefault = function (e) {\n            e.preventDefault();\n        };\n        kendo.widgetInstance = function (element, suites) {\n            var role = element.data(kendo.ns + 'role'), widgets = [], i, length, elementData = element.data('kendoView');\n            if (role) {\n                if (role === 'content') {\n                    role = 'scroller';\n                }\n                if (role === 'editortoolbar') {\n                    var editorToolbar = element.data('kendoEditorToolbar');\n                    if (editorToolbar) {\n                        return editorToolbar;\n                    }\n                }\n                if (role === 'view' && elementData) {\n                    return elementData;\n                }\n                if (suites) {\n                    if (suites[0]) {\n                        for (i = 0, length = suites.length; i < length; i++) {\n                            widgets.push(suites[i].roles[role]);\n                        }\n                    } else {\n                        widgets.push(suites.roles[role]);\n                    }\n                } else {\n                    widgets = [\n                        kendo.ui.roles[role],\n                        kendo.dataviz.ui.roles[role],\n                        kendo.mobile.ui.roles[role]\n                    ];\n                }\n                if (role.indexOf('.') >= 0) {\n                    widgets = [kendo.getter(role)(window)];\n                }\n                for (i = 0, length = widgets.length; i < length; i++) {\n                    var widget = widgets[i];\n                    if (widget) {\n                        var instance = element.data('kendo' + widget.fn.options.prefix + widget.fn.options.name);\n                        if (instance) {\n                            return instance;\n                        }\n                    }\n                }\n            }\n        };\n        kendo.onResize = function (callback) {\n            var handler = callback;\n            if (support.mobileOS.android) {\n                handler = function () {\n                    setTimeout(callback, 600);\n                };\n            }\n            $(window).on(support.resize, handler);\n            return handler;\n        };\n        kendo.unbindResize = function (callback) {\n            $(window).off(support.resize, callback);\n        };\n        kendo.attrValue = function (element, key) {\n            return element.data(kendo.ns + key);\n        };\n        kendo.days = {\n            Sunday: 0,\n            Monday: 1,\n            Tuesday: 2,\n            Wednesday: 3,\n            Thursday: 4,\n            Friday: 5,\n            Saturday: 6\n        };\n        function focusable(element, isTabIndexNotNaN) {\n            var nodeName = element.nodeName.toLowerCase();\n            return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : 'a' === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && visible(element);\n        }\n        function visible(element) {\n            return $.expr.pseudos.visible(element) && !$(element).parents().addBack().filter(function () {\n                return $.css(this, 'visibility') === 'hidden';\n            }).length;\n        }\n        $.extend($.expr.pseudos, {\n            kendoFocusable: function (element) {\n                var idx = $.attr(element, 'tabindex');\n                return focusable(element, !isNaN(idx) && idx > -1);\n            }\n        });\n        var MOUSE_EVENTS = [\n            'mousedown',\n            'mousemove',\n            'mouseenter',\n            'mouseleave',\n            'mouseover',\n            'mouseout',\n            'mouseup',\n            'click'\n        ];\n        var EXCLUDE_BUST_CLICK_SELECTOR = 'label, input, [data-rel=external]';\n        var MouseEventNormalizer = {\n            setupMouseMute: function () {\n                var idx = 0, length = MOUSE_EVENTS.length, element = document.documentElement;\n                if (MouseEventNormalizer.mouseTrap || !support.eventCapture) {\n                    return;\n                }\n                MouseEventNormalizer.mouseTrap = true;\n                MouseEventNormalizer.bustClick = false;\n                MouseEventNormalizer.captureMouse = false;\n                var handler = function (e) {\n                    if (MouseEventNormalizer.captureMouse) {\n                        if (e.type === 'click') {\n                            if (MouseEventNormalizer.bustClick && !$(e.target).is(EXCLUDE_BUST_CLICK_SELECTOR)) {\n                                e.preventDefault();\n                                e.stopPropagation();\n                            }\n                        } else {\n                            e.stopPropagation();\n                        }\n                    }\n                };\n                for (; idx < length; idx++) {\n                    element.addEventListener(MOUSE_EVENTS[idx], handler, true);\n                }\n            },\n            muteMouse: function (e) {\n                MouseEventNormalizer.captureMouse = true;\n                if (e.data.bustClick) {\n                    MouseEventNormalizer.bustClick = true;\n                }\n                clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n            },\n            unMuteMouse: function () {\n                clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n                MouseEventNormalizer.mouseTrapTimeoutID = setTimeout(function () {\n                    MouseEventNormalizer.captureMouse = false;\n                    MouseEventNormalizer.bustClick = false;\n                }, 400);\n            }\n        };\n        var eventMap = {\n            down: 'touchstart mousedown',\n            move: 'mousemove touchmove',\n            up: 'mouseup touchend touchcancel',\n            cancel: 'mouseleave touchcancel'\n        };\n        if (support.touch && (support.mobileOS.ios || support.mobileOS.android)) {\n            eventMap = {\n                down: 'touchstart',\n                move: 'touchmove',\n                up: 'touchend touchcancel',\n                cancel: 'touchcancel'\n            };\n        } else if (support.pointers) {\n            eventMap = {\n                down: 'pointerdown',\n                move: 'pointermove',\n                up: 'pointerup',\n                cancel: 'pointercancel pointerleave'\n            };\n        } else if (support.msPointers) {\n            eventMap = {\n                down: 'MSPointerDown',\n                move: 'MSPointerMove',\n                up: 'MSPointerUp',\n                cancel: 'MSPointerCancel MSPointerLeave'\n            };\n        }\n        if (support.msPointers && !('onmspointerenter' in window)) {\n            $.each({\n                MSPointerEnter: 'MSPointerOver',\n                MSPointerLeave: 'MSPointerOut'\n            }, function (orig, fix) {\n                $.event.special[orig] = {\n                    delegateType: fix,\n                    bindType: fix,\n                    handle: function (event) {\n                        var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj;\n                        if (!related || related !== target && !$.contains(target, related)) {\n                            event.type = handleObj.origType;\n                            ret = handleObj.handler.apply(this, arguments);\n                            event.type = fix;\n                        }\n                        return ret;\n                    }\n                };\n            });\n        }\n        var getEventMap = function (e) {\n                return eventMap[e] || e;\n            }, eventRegEx = /([^ ]+)/g;\n        kendo.applyEventMap = function (events, ns) {\n            events = events.replace(eventRegEx, getEventMap);\n            if (ns) {\n                events = events.replace(eventRegEx, '$1.' + ns);\n            }\n            return events;\n        };\n        kendo.keyDownHandler = function (e, widget) {\n            var events = widget._events.kendoKeydown;\n            if (!events) {\n                return true;\n            }\n            events = events.slice();\n            e.sender = widget;\n            e.preventKendoKeydown = false;\n            for (var idx = 0, length = events.length; idx < length; idx++) {\n                events[idx].call(widget, e);\n            }\n            return !e.preventKendoKeydown;\n        };\n        var on = $.fn.on;\n        function kendoJQuery(selector, context) {\n            return new kendoJQuery.fn.init(selector, context);\n        }\n        noDepricateExtend(true, kendoJQuery, $);\n        kendoJQuery.fn = kendoJQuery.prototype = new $();\n        kendoJQuery.fn.constructor = kendoJQuery;\n        kendoJQuery.fn.init = function (selector, context) {\n            if (context && context instanceof $ && !(context instanceof kendoJQuery)) {\n                context = kendoJQuery(context);\n            }\n            return $.fn.init.call(this, selector, context, rootjQuery);\n        };\n        kendoJQuery.fn.init.prototype = kendoJQuery.fn;\n        var rootjQuery = kendoJQuery(document);\n        extend(kendoJQuery.fn, {\n            handler: function (handler) {\n                this.data('handler', handler);\n                return this;\n            },\n            autoApplyNS: function (ns) {\n                this.data('kendoNS', ns || kendo.guid());\n                return this;\n            },\n            on: function () {\n                var that = this, ns = that.data('kendoNS');\n                if (arguments.length === 1) {\n                    return on.call(that, arguments[0]);\n                }\n                var context = that, args = slice.call(arguments);\n                if (typeof args[args.length - 1] === UNDEFINED) {\n                    args.pop();\n                }\n                var callback = args[args.length - 1], events = kendo.applyEventMap(args[0], ns);\n                if (support.mouseAndTouchPresent && events.search(/mouse|click/) > -1 && this[0] !== document.documentElement) {\n                    MouseEventNormalizer.setupMouseMute();\n                    var selector = args.length === 2 ? null : args[1], bustClick = events.indexOf('click') > -1 && events.indexOf('touchend') > -1;\n                    on.call(this, {\n                        touchstart: MouseEventNormalizer.muteMouse,\n                        touchend: MouseEventNormalizer.unMuteMouse\n                    }, selector, { bustClick: bustClick });\n                }\n                if (arguments[0].indexOf('keydown') !== -1 && args[1] && args[1].options) {\n                    args[0] = events;\n                    var widget = args[1];\n                    var keyDownCallBack = args[args.length - 1];\n                    args[args.length - 1] = function (e) {\n                        if (kendo.keyDownHandler(e, widget)) {\n                            return keyDownCallBack.apply(this, [e]);\n                        }\n                    };\n                    on.apply(that, args);\n                    return that;\n                }\n                if (typeof callback === STRING) {\n                    context = that.data('handler');\n                    callback = context[callback];\n                    args[args.length - 1] = function (e) {\n                        callback.call(context, e);\n                    };\n                }\n                args[0] = events;\n                on.apply(that, args);\n                return that;\n            },\n            kendoDestroy: function (ns) {\n                ns = ns || this.data('kendoNS');\n                if (ns) {\n                    this.off('.' + ns);\n                }\n                return this;\n            }\n        });\n        kendo.jQuery = kendoJQuery;\n        kendo.eventMap = eventMap;\n        kendo.timezone = function () {\n            var months = {\n                Jan: 0,\n                Feb: 1,\n                Mar: 2,\n                Apr: 3,\n                May: 4,\n                Jun: 5,\n                Jul: 6,\n                Aug: 7,\n                Sep: 8,\n                Oct: 9,\n                Nov: 10,\n                Dec: 11\n            };\n            var days = {\n                Sun: 0,\n                Mon: 1,\n                Tue: 2,\n                Wed: 3,\n                Thu: 4,\n                Fri: 5,\n                Sat: 6\n            };\n            function ruleToDate(year, rule) {\n                var date;\n                var targetDay;\n                var ourDay;\n                var month = rule[3];\n                var on = rule[4];\n                var time = rule[5];\n                var cache = rule[8];\n                if (!cache) {\n                    rule[8] = cache = {};\n                }\n                if (cache[year]) {\n                    return cache[year];\n                }\n                if (!isNaN(on)) {\n                    date = new Date(Date.UTC(year, months[month], on, time[0], time[1], time[2], 0));\n                } else if (on.indexOf('last') === 0) {\n                    date = new Date(Date.UTC(year, months[month] + 1, 1, time[0] - 24, time[1], time[2], 0));\n                    targetDay = days[on.substr(4, 3)];\n                    ourDay = date.getUTCDay();\n                    date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n                } else if (on.indexOf('>=') >= 0) {\n                    date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n                    targetDay = days[on.substr(0, 3)];\n                    ourDay = date.getUTCDay();\n                    date.setUTCDate(date.getUTCDate() + targetDay - ourDay + (targetDay < ourDay ? 7 : 0));\n                } else if (on.indexOf('<=') >= 0) {\n                    date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n                    targetDay = days[on.substr(0, 3)];\n                    ourDay = date.getUTCDay();\n                    date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n                }\n                return cache[year] = date;\n            }\n            function findRule(utcTime, rules, zone) {\n                rules = rules[zone];\n                if (!rules) {\n                    var time = zone.split(':');\n                    var offset = 0;\n                    if (time.length > 1) {\n                        offset = time[0] * 60 + Number(time[1]);\n                    }\n                    return [\n                        -1000000,\n                        'max',\n                        '-',\n                        'Jan',\n                        1,\n                        [\n                            0,\n                            0,\n                            0\n                        ],\n                        offset,\n                        '-'\n                    ];\n                }\n                var year = new Date(utcTime).getUTCFullYear();\n                rules = jQuery.grep(rules, function (rule) {\n                    var from = rule[0];\n                    var to = rule[1];\n                    return from <= year && (to >= year || from == year && to == 'only' || to == 'max');\n                });\n                rules.push(utcTime);\n                rules.sort(function (a, b) {\n                    if (typeof a != 'number') {\n                        a = Number(ruleToDate(year, a));\n                    }\n                    if (typeof b != 'number') {\n                        b = Number(ruleToDate(year, b));\n                    }\n                    return a - b;\n                });\n                var rule = rules[jQuery.inArray(utcTime, rules) - 1] || rules[rules.length - 1];\n                return isNaN(rule) ? rule : null;\n            }\n            function findZone(utcTime, zones, timezone) {\n                var zoneRules = zones[timezone];\n                if (typeof zoneRules === 'string') {\n                    zoneRules = zones[zoneRules];\n                }\n                if (!zoneRules) {\n                    throw new Error('Timezone \"' + timezone + '\" is either incorrect, or kendo.timezones.min.js is not included.');\n                }\n                for (var idx = zoneRules.length - 1; idx >= 0; idx--) {\n                    var until = zoneRules[idx][3];\n                    if (until && utcTime > until) {\n                        break;\n                    }\n                }\n                var zone = zoneRules[idx + 1];\n                if (!zone) {\n                    throw new Error('Timezone \"' + timezone + '\" not found on ' + utcTime + '.');\n                }\n                return zone;\n            }\n            function zoneAndRule(utcTime, zones, rules, timezone) {\n                if (typeof utcTime != NUMBER) {\n                    utcTime = Date.UTC(utcTime.getFullYear(), utcTime.getMonth(), utcTime.getDate(), utcTime.getHours(), utcTime.getMinutes(), utcTime.getSeconds(), utcTime.getMilliseconds());\n                }\n                var zone = findZone(utcTime, zones, timezone);\n                return {\n                    zone: zone,\n                    rule: findRule(utcTime, rules, zone[1])\n                };\n            }\n            function offset(utcTime, timezone) {\n                if (timezone == 'Etc/UTC' || timezone == 'Etc/GMT') {\n                    return 0;\n                }\n                var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n                var zone = info.zone;\n                var rule = info.rule;\n                return kendo.parseFloat(rule ? zone[0] - rule[6] : zone[0]);\n            }\n            function abbr(utcTime, timezone) {\n                var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n                var zone = info.zone;\n                var rule = info.rule;\n                var base = zone[2];\n                if (base.indexOf('/') >= 0) {\n                    return base.split('/')[rule && +rule[6] ? 1 : 0];\n                } else if (base.indexOf('%s') >= 0) {\n                    return base.replace('%s', !rule || rule[7] == '-' ? '' : rule[7]);\n                }\n                return base;\n            }\n            function convert(date, fromOffset, toOffset) {\n                var tempToOffset = toOffset;\n                var diff;\n                if (typeof fromOffset == STRING) {\n                    fromOffset = this.offset(date, fromOffset);\n                }\n                if (typeof toOffset == STRING) {\n                    toOffset = this.offset(date, toOffset);\n                }\n                var fromLocalOffset = date.getTimezoneOffset();\n                date = new Date(date.getTime() + (fromOffset - toOffset) * 60000);\n                var toLocalOffset = date.getTimezoneOffset();\n                if (typeof tempToOffset == STRING) {\n                    tempToOffset = this.offset(date, tempToOffset);\n                }\n                diff = toLocalOffset - fromLocalOffset + (toOffset - tempToOffset);\n                return new Date(date.getTime() + diff * 60000);\n            }\n            function apply(date, timezone) {\n                return this.convert(date, date.getTimezoneOffset(), timezone);\n            }\n            function remove(date, timezone) {\n                return this.convert(date, timezone, date.getTimezoneOffset());\n            }\n            function toLocalDate(time) {\n                return this.apply(new Date(time), 'Etc/UTC');\n            }\n            return {\n                zones: {},\n                rules: {},\n                offset: offset,\n                convert: convert,\n                apply: apply,\n                remove: remove,\n                abbr: abbr,\n                toLocalDate: toLocalDate\n            };\n        }();\n        kendo.date = function () {\n            var MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000;\n            function adjustDST(date, hours) {\n                if (hours === 0 && date.getHours() === 23) {\n                    date.setHours(date.getHours() + 2);\n                    return true;\n                }\n                return false;\n            }\n            function setDayOfWeek(date, day, dir) {\n                var hours = date.getHours();\n                dir = dir || 1;\n                day = (day - date.getDay() + 7 * dir) % 7;\n                date.setDate(date.getDate() + day);\n                adjustDST(date, hours);\n            }\n            function dayOfWeek(date, day, dir) {\n                date = new Date(date);\n                setDayOfWeek(date, day, dir);\n                return date;\n            }\n            function firstDayOfMonth(date) {\n                return new Date(date.getFullYear(), date.getMonth(), 1);\n            }\n            function lastDayOfMonth(date) {\n                var last = new Date(date.getFullYear(), date.getMonth() + 1, 0), first = firstDayOfMonth(date), timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n                if (timeOffset) {\n                    last.setHours(first.getHours() + timeOffset / 60);\n                }\n                return last;\n            }\n            function moveDateToWeekStart(date, weekStartDay) {\n                if (weekStartDay !== 1) {\n                    return addDays(dayOfWeek(date, weekStartDay, -1), 4);\n                }\n                return addDays(date, 4 - (date.getDay() || 7));\n            }\n            function calcWeekInYear(date, weekStartDay) {\n                var firstWeekInYear = new Date(date.getFullYear(), 0, 1, -6);\n                var newDate = moveDateToWeekStart(date, weekStartDay);\n                var diffInMS = newDate.getTime() - firstWeekInYear.getTime();\n                var days = Math.floor(diffInMS / MS_PER_DAY);\n                return 1 + Math.floor(days / 7);\n            }\n            function weekInYear(date, weekStartDay) {\n                if (weekStartDay === undefined) {\n                    weekStartDay = kendo.culture().calendar.firstDay;\n                }\n                var prevWeekDate = addDays(date, -7);\n                var nextWeekDate = addDays(date, 7);\n                var weekNumber = calcWeekInYear(date, weekStartDay);\n                if (weekNumber === 0) {\n                    return calcWeekInYear(prevWeekDate, weekStartDay) + 1;\n                }\n                if (weekNumber === 53 && calcWeekInYear(nextWeekDate, weekStartDay) > 1) {\n                    return 1;\n                }\n                return weekNumber;\n            }\n            function getDate(date) {\n                date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n                adjustDST(date, 0);\n                return date;\n            }\n            function toUtcTime(date) {\n                return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n            }\n            function getMilliseconds(date) {\n                return toInvariantTime(date).getTime() - getDate(toInvariantTime(date));\n            }\n            function isInTimeRange(value, min, max) {\n                var msMin = getMilliseconds(min), msMax = getMilliseconds(max), msValue;\n                if (!value || msMin == msMax) {\n                    return true;\n                }\n                if (min >= max) {\n                    max += MS_PER_DAY;\n                }\n                msValue = getMilliseconds(value);\n                if (msMin > msValue) {\n                    msValue += MS_PER_DAY;\n                }\n                if (msMax < msMin) {\n                    msMax += MS_PER_DAY;\n                }\n                return msValue >= msMin && msValue <= msMax;\n            }\n            function isInDateRange(value, min, max) {\n                var msMin = min.getTime(), msMax = max.getTime(), msValue;\n                if (msMin >= msMax) {\n                    msMax += MS_PER_DAY;\n                }\n                msValue = value.getTime();\n                return msValue >= msMin && msValue <= msMax;\n            }\n            function addDays(date, offset) {\n                var hours = date.getHours();\n                date = new Date(date);\n                setTime(date, offset * MS_PER_DAY);\n                adjustDST(date, hours);\n                return date;\n            }\n            function setTime(date, milliseconds, ignoreDST) {\n                var offset = date.getTimezoneOffset();\n                var difference;\n                date.setTime(date.getTime() + milliseconds);\n                if (!ignoreDST) {\n                    difference = date.getTimezoneOffset() - offset;\n                    date.setTime(date.getTime() + difference * MS_PER_MINUTE);\n                }\n            }\n            function setHours(date, time) {\n                date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());\n                adjustDST(date, time.getHours());\n                return date;\n            }\n            function today() {\n                return getDate(new Date());\n            }\n            function isToday(date) {\n                return getDate(date).getTime() == today().getTime();\n            }\n            function toInvariantTime(date) {\n                var staticDate = new Date(1980, 1, 1, 0, 0, 0);\n                if (date) {\n                    staticDate.setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n                }\n                return staticDate;\n            }\n            return {\n                adjustDST: adjustDST,\n                dayOfWeek: dayOfWeek,\n                setDayOfWeek: setDayOfWeek,\n                getDate: getDate,\n                isInDateRange: isInDateRange,\n                isInTimeRange: isInTimeRange,\n                isToday: isToday,\n                nextDay: function (date) {\n                    return addDays(date, 1);\n                },\n                previousDay: function (date) {\n                    return addDays(date, -1);\n                },\n                toUtcTime: toUtcTime,\n                MS_PER_DAY: MS_PER_DAY,\n                MS_PER_HOUR: 60 * MS_PER_MINUTE,\n                MS_PER_MINUTE: MS_PER_MINUTE,\n                setTime: setTime,\n                setHours: setHours,\n                addDays: addDays,\n                today: today,\n                toInvariantTime: toInvariantTime,\n                firstDayOfMonth: firstDayOfMonth,\n                lastDayOfMonth: lastDayOfMonth,\n                weekInYear: weekInYear,\n                getMilliseconds: getMilliseconds\n            };\n        }();\n        kendo.stripWhitespace = function (element) {\n            if (document.createNodeIterator) {\n                var iterator = document.createNodeIterator(element, NodeFilter.SHOW_TEXT, function (node) {\n                    return node.parentNode == element ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n                }, false);\n                while (iterator.nextNode()) {\n                    if (iterator.referenceNode && !iterator.referenceNode.textContent.trim()) {\n                        iterator.referenceNode.parentNode.removeChild(iterator.referenceNode);\n                    }\n                }\n            } else {\n                for (var i = 0; i < element.childNodes.length; i++) {\n                    var child = element.childNodes[i];\n                    if (child.nodeType == 3 && !/\\S/.test(child.nodeValue)) {\n                        element.removeChild(child);\n                        i--;\n                    }\n                    if (child.nodeType == 1) {\n                        kendo.stripWhitespace(child);\n                    }\n                }\n            }\n        };\n        var animationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {\n            setTimeout(callback, 1000 / 60);\n        };\n        kendo.animationFrame = function (callback) {\n            animationFrame.call(window, callback);\n        };\n        var animationQueue = [];\n        kendo.queueAnimation = function (callback) {\n            animationQueue[animationQueue.length] = callback;\n            if (animationQueue.length === 1) {\n                kendo.runNextAnimation();\n            }\n        };\n        kendo.runNextAnimation = function () {\n            kendo.animationFrame(function () {\n                if (animationQueue[0]) {\n                    animationQueue.shift()();\n                    if (animationQueue[0]) {\n                        kendo.runNextAnimation();\n                    }\n                }\n            });\n        };\n        kendo.parseQueryStringParams = function (url) {\n            var queryString = url.split('?')[1] || '', params = {}, paramParts = queryString.split(/&|=/), length = paramParts.length, idx = 0;\n            for (; idx < length; idx += 2) {\n                if (paramParts[idx] !== '') {\n                    params[decodeURIComponent(paramParts[idx])] = decodeURIComponent(paramParts[idx + 1]);\n                }\n            }\n            return params;\n        };\n        kendo.elementUnderCursor = function (e) {\n            if (typeof e.x.client != 'undefined') {\n                return document.elementFromPoint(e.x.client, e.y.client);\n            }\n        };\n        kendo.wheelDeltaY = function (jQueryEvent) {\n            var e = jQueryEvent.originalEvent, deltaY = e.wheelDeltaY, delta;\n            if (e.wheelDelta) {\n                if (deltaY === undefined || deltaY) {\n                    delta = e.wheelDelta;\n                }\n            } else if (e.detail && e.axis === e.VERTICAL_AXIS) {\n                delta = -e.detail * 10;\n            }\n            return delta;\n        };\n        kendo.throttle = function (fn, delay) {\n            var timeout;\n            var lastExecTime = 0;\n            if (!delay || delay <= 0) {\n                return fn;\n            }\n            var throttled = function () {\n                var that = this;\n                var elapsed = +new Date() - lastExecTime;\n                var args = arguments;\n                function exec() {\n                    fn.apply(that, args);\n                    lastExecTime = +new Date();\n                }\n                if (!lastExecTime) {\n                    return exec();\n                }\n                if (timeout) {\n                    clearTimeout(timeout);\n                }\n                if (elapsed > delay) {\n                    exec();\n                } else {\n                    timeout = setTimeout(exec, delay - elapsed);\n                }\n            };\n            throttled.cancel = function () {\n                clearTimeout(timeout);\n            };\n            return throttled;\n        };\n        kendo.caret = function (element, start, end) {\n            var rangeElement;\n            var isPosition = start !== undefined;\n            if (end === undefined) {\n                end = start;\n            }\n            if (element[0]) {\n                element = element[0];\n            }\n            if (isPosition && element.disabled) {\n                return;\n            }\n            try {\n                if (element.selectionStart !== undefined) {\n                    if (isPosition) {\n                        element.focus();\n                        var mobile = support.mobileOS;\n                        if (mobile.wp || mobile.android) {\n                            setTimeout(function () {\n                                element.setSelectionRange(start, end);\n                            }, 0);\n                        } else {\n                            element.setSelectionRange(start, end);\n                        }\n                    } else {\n                        start = [\n                            element.selectionStart,\n                            element.selectionEnd\n                        ];\n                    }\n                } else if (document.selection) {\n                    if ($(element).is(':visible')) {\n                        element.focus();\n                    }\n                    rangeElement = element.createTextRange();\n                    if (isPosition) {\n                        rangeElement.collapse(true);\n                        rangeElement.moveStart('character', start);\n                        rangeElement.moveEnd('character', end - start);\n                        rangeElement.select();\n                    } else {\n                        var rangeDuplicated = rangeElement.duplicate(), selectionStart, selectionEnd;\n                        rangeElement.moveToBookmark(document.selection.createRange().getBookmark());\n                        rangeDuplicated.setEndPoint('EndToStart', rangeElement);\n                        selectionStart = rangeDuplicated.text.length;\n                        selectionEnd = selectionStart + rangeElement.text.length;\n                        start = [\n                            selectionStart,\n                            selectionEnd\n                        ];\n                    }\n                }\n            } catch (e) {\n                start = [];\n            }\n            return start;\n        };\n        kendo.compileMobileDirective = function (element, scope) {\n            var angular = window.angular;\n            element.attr('data-' + kendo.ns + 'role', element[0].tagName.toLowerCase().replace('kendo-mobile-', '').replace('-', ''));\n            angular.element(element).injector().invoke([\n                '$compile',\n                function ($compile) {\n                    $compile(element)(scope);\n                    if (!/^\\$(digest|apply)$/.test(scope.$$phase)) {\n                        scope.$digest();\n                    }\n                }\n            ]);\n            return kendo.widgetInstance(element, kendo.mobile.ui);\n        };\n        kendo.antiForgeryTokens = function () {\n            var tokens = {}, csrf_token = $('meta[name=csrf-token],meta[name=_csrf]').attr('content'), csrf_param = $('meta[name=csrf-param],meta[name=_csrf_header]').attr('content');\n            $('input[name^=\\'__RequestVerificationToken\\']').each(function () {\n                tokens[this.name] = this.value;\n            });\n            if (csrf_param !== undefined && csrf_token !== undefined) {\n                tokens[csrf_param] = csrf_token;\n            }\n            return tokens;\n        };\n        kendo.cycleForm = function (form) {\n            var firstElement = form.find('input, .k-widget').first();\n            var lastElement = form.find('button, .k-button').last();\n            function focus(el) {\n                var widget = kendo.widgetInstance(el);\n                if (widget && widget.focus) {\n                    widget.focus();\n                } else {\n                    el.focus();\n                }\n            }\n            lastElement.on('keydown', function (e) {\n                if (e.keyCode == kendo.keys.TAB && !e.shiftKey) {\n                    e.preventDefault();\n                    focus(firstElement);\n                }\n            });\n            firstElement.on('keydown', function (e) {\n                if (e.keyCode == kendo.keys.TAB && e.shiftKey) {\n                    e.preventDefault();\n                    focus(lastElement);\n                }\n            });\n        };\n        kendo.focusElement = function (element) {\n            var scrollTopPositions = [];\n            var scrollableParents = element.parentsUntil('body').filter(function (index, element) {\n                var computedStyle = kendo.getComputedStyles(element, ['overflow']);\n                return computedStyle.overflow !== 'visible';\n            }).add(window);\n            scrollableParents.each(function (index, parent) {\n                scrollTopPositions[index] = $(parent).scrollTop();\n            });\n            try {\n                element[0].setActive();\n            } catch (e) {\n                element[0].focus();\n            }\n            scrollableParents.each(function (index, parent) {\n                $(parent).scrollTop(scrollTopPositions[index]);\n            });\n        };\n        kendo.focusNextElement = function () {\n            if (document.activeElement) {\n                var focussable = $(':kendoFocusable');\n                var index = focussable.index(document.activeElement);\n                if (index > -1) {\n                    var nextElement = focussable[index + 1] || focussable[0];\n                    nextElement.focus();\n                }\n            }\n        };\n        kendo.matchesMedia = function (mediaQuery) {\n            var media = kendo._bootstrapToMedia(mediaQuery) || mediaQuery;\n            return support.matchMedia && window.matchMedia(media).matches;\n        };\n        kendo._bootstrapToMedia = function (bootstrapMedia) {\n            return {\n                'xs': '(max-width: 576px)',\n                'sm': '(min-width: 576px)',\n                'md': '(min-width: 768px)',\n                'lg': '(min-width: 992px)',\n                'xl': '(min-width: 1200px)'\n            }[bootstrapMedia];\n        };\n        kendo.fileGroupMap = {\n            audio: [\n                '.aif',\n                '.iff',\n                '.m3u',\n                '.m4a',\n                '.mid',\n                '.mp3',\n                '.mpa',\n                '.wav',\n                '.wma',\n                '.ogg',\n                '.wav',\n                '.wma',\n                '.wpl'\n            ],\n            video: [\n                '.3g2',\n                '.3gp',\n                '.avi',\n                '.asf',\n                '.flv',\n                '.m4u',\n                '.rm',\n                '.h264',\n                '.m4v',\n                '.mkv',\n                '.mov',\n                '.mp4',\n                '.mpg',\n                '.rm',\n                '.swf',\n                '.vob',\n                '.wmv'\n            ],\n            image: [\n                '.ai',\n                '.dds',\n                '.heic',\n                '.jpe',\n                'jfif',\n                '.jif',\n                '.jp2',\n                '.jps',\n                '.eps',\n                '.bmp',\n                '.gif',\n                '.jpeg',\n                '.jpg',\n                '.png',\n                '.ps',\n                '.psd',\n                '.svg',\n                '.svgz',\n                '.tif',\n                '.tiff'\n            ],\n            txt: [\n                '.doc',\n                '.docx',\n                '.log',\n                '.pages',\n                '.tex',\n                '.wpd',\n                '.wps',\n                '.odt',\n                '.rtf',\n                '.text',\n                '.txt',\n                '.wks'\n            ],\n            presentation: [\n                '.key',\n                '.odp',\n                '.pps',\n                '.ppt',\n                '.pptx'\n            ],\n            data: [\n                '.xlr',\n                '.xls',\n                '.xlsx'\n            ],\n            programming: [\n                '.tmp',\n                '.bak',\n                '.msi',\n                '.cab',\n                '.cpl',\n                '.cur',\n                '.dll',\n                '.dmp',\n                '.drv',\n                '.icns',\n                '.ico',\n                '.link',\n                '.sys',\n                '.cfg',\n                '.ini',\n                '.asp',\n                '.aspx',\n                '.cer',\n                '.csr',\n                '.css',\n                '.dcr',\n                '.htm',\n                '.html',\n                '.js',\n                '.php',\n                '.rss',\n                '.xhtml'\n            ],\n            pdf: ['.pdf'],\n            config: [\n                '.apk',\n                '.app',\n                '.bat',\n                '.cgi',\n                '.com',\n                '.exe',\n                '.gadget',\n                '.jar',\n                '.wsf'\n            ],\n            zip: [\n                '.7z',\n                '.cbr',\n                '.gz',\n                '.sitx',\n                '.arj',\n                '.deb',\n                '.pkg',\n                '.rar',\n                '.rpm',\n                '.tar.gz',\n                '.z',\n                '.zip',\n                '.zipx'\n            ],\n            'disc-image': [\n                '.dmg',\n                '.iso',\n                '.toast',\n                '.vcd',\n                '.bin',\n                '.cue',\n                '.mdf'\n            ]\n        };\n        kendo.getFileGroup = function (extension, withPrefix) {\n            var fileTypeMap = kendo.fileGroupMap;\n            var groups = Object.keys(fileTypeMap);\n            var type = 'file';\n            if (extension === undefined || !extension.length) {\n                return type;\n            }\n            for (var i = 0; i < groups.length; i += 1) {\n                var extensions = fileTypeMap[groups[i]];\n                if (extensions.indexOf(extension.toLowerCase()) > -1) {\n                    return withPrefix ? 'file-' + groups[i] : groups[i];\n                }\n            }\n            return type;\n        };\n        kendo.getFileSizeMessage = function (size) {\n            var sizes = [\n                'Bytes',\n                'KB',\n                'MB',\n                'GB',\n                'TB'\n            ];\n            if (size === 0) {\n                return '0 Byte';\n            }\n            var i = parseInt(Math.floor(Math.log(size) / Math.log(1024)), 10);\n            return Math.round(size / Math.pow(1024, i), 2) + ' ' + sizes[i];\n        };\n        (function () {\n            function postToProxy(dataURI, fileName, proxyURL, proxyTarget) {\n                var form = $('<form>').attr({\n                    action: proxyURL,\n                    method: 'POST',\n                    target: proxyTarget\n                });\n                var data = kendo.antiForgeryTokens();\n                data.fileName = fileName;\n                var parts = dataURI.split(';base64,');\n                data.contentType = parts[0].replace('data:', '');\n                data.base64 = parts[1];\n                for (var name in data) {\n                    if (data.hasOwnProperty(name)) {\n                        $('<input>').attr({\n                            value: data[name],\n                            name: name,\n                            type: 'hidden'\n                        }).appendTo(form);\n                    }\n                }\n                form.appendTo('body').submit().remove();\n            }\n            var fileSaver = document.createElement('a');\n            var downloadAttribute = 'download' in fileSaver && !kendo.support.browser.edge;\n            function saveAsBlob(dataURI, fileName) {\n                var blob = dataURI;\n                if (typeof dataURI == 'string') {\n                    var parts = dataURI.split(';base64,');\n                    var contentType = parts[0];\n                    var base64 = atob(parts[1]);\n                    var array = new Uint8Array(base64.length);\n                    for (var idx = 0; idx < base64.length; idx++) {\n                        array[idx] = base64.charCodeAt(idx);\n                    }\n                    blob = new Blob([array.buffer], { type: contentType });\n                }\n                navigator.msSaveBlob(blob, fileName);\n            }\n            function saveAsDataURI(dataURI, fileName) {\n                if (window.Blob && dataURI instanceof Blob) {\n                    dataURI = URL.createObjectURL(dataURI);\n                }\n                fileSaver.download = fileName;\n                fileSaver.href = dataURI;\n                var e = document.createEvent('MouseEvents');\n                e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n                fileSaver.dispatchEvent(e);\n                setTimeout(function () {\n                    URL.revokeObjectURL(dataURI);\n                });\n            }\n            kendo.saveAs = function (options) {\n                var save = postToProxy;\n                if (!options.forceProxy) {\n                    if (downloadAttribute) {\n                        save = saveAsDataURI;\n                    } else if (navigator.msSaveBlob) {\n                        save = saveAsBlob;\n                    }\n                }\n                save(options.dataURI, options.fileName, options.proxyURL, options.proxyTarget);\n            };\n        }());\n        kendo.proxyModelSetters = function proxyModelSetters(data) {\n            var observable = {};\n            Object.keys(data || {}).forEach(function (property) {\n                Object.defineProperty(observable, property, {\n                    get: function () {\n                        return data[property];\n                    },\n                    set: function (value) {\n                        data[property] = value;\n                        data.dirty = true;\n                    }\n                });\n            });\n            return observable;\n        };\n        (function () {\n            kendo.defaults = kendo.defaults || {};\n            kendo.setDefaults = function (key, value) {\n                var path = key.split('.');\n                var curr = kendo.defaults;\n                key = path.pop();\n                path.forEach(function (part) {\n                    if (curr[part] === undefined) {\n                        curr[part] = {};\n                    }\n                    curr = curr[part];\n                });\n                if (value.constructor === Object) {\n                    curr[key] = deepExtend({}, curr[key], value);\n                } else {\n                    curr[key] = value;\n                }\n            };\n        }());\n    }(jQuery, window));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));"]}